<div class="wrapper">
  <form>
    <div class="field-container bankAccountName-container">
      <label for="account-name-field" class="required">Account Name</label>
      <div id="account-name-field" class="hosted-field"></div>
      <div class="error"></div>
    </div>
    <div class="field-columns">
      <div class="field-container bankRoutingNumber-container">
        <label for="routing-number-field" class="required">Routing Number (BSB)</label>
        <div id="routing-number-field" class="hosted-field"></div>
        <div class="error"></div>
      </div>
      <div class="field-container bankAccountNumber-container">
        <label for="account-number-field" class="required">Account Number</label>
        <div id="account-number-field" class="hosted-field"></div>
        <div class="error"></div>
      </div>
    </div>
    <div class="field-container">
      <label for="bank-name-field" class="required">Bank Name</label>
      <input id="bank-name-field" type="text" class="demo-field" />
    </div>
    <div class="field-columns">
      <div class="field-container">
        <label for="account-type-field" class="required">Account Type</label>
        <select id="account-type-field" name="account-type" class="demo-field select">
          <option value="savings" selected>Savings</option>
          <option value="checking">Checking</option>
        </select>
      </div>
      <div class="field-container">
        <label for="holder-type-field" class="required">Holder Type</label>
        <select id="holder-type-field" name="holder-type" class="demo-field select">
          <option value="personal" selected>Personal</option>
          <option value="business">Business</option>
        </select>
      </div>
    </div>
    <div class="field-container">
      <label for="country-field" class="required">Country</label>
      <select id="country-field" name="country" class="demo-field select">
        <option value="AUS" selected>AUS</option>
        <option value="USA">USA</option>
      </select>
    </div>
    <div class="field-columns">
      <div class="field-container">
        <label for="payout-currency-field">Payout Currency</label>
        <select id="payout-currency-field" name="payout-currency" class="demo-field select">
          <option value="AUD" selected>AUD</option>
          <option value="USD">USD</option>
        </select>
      </div>
      <div class="field-container">
        <label for="currency-field">Currency</label>
        <select id="currency-field" name="currency" class="demo-field select">
          <option value="AUD" selected>AUD</option>
          <option value="USD">USD</option>
        </select>
      </div>
    </div>
    <button class="button">Create Bank Account</button>
    <div class="response"></div>
    <div class="disclaimer">
      Payment securely processed by Assembly Payments.
    </div>
  </form>
</div>
*,
:after,
:before {
  box-sizing: border-box;
}
body {
  font-family: system-ui, -apple-system, BlinkMacSystemFont, sans-serif;
  padding: 20px;
  letter-spacing: 0.02em;
}
.wrapper {
  max-width: 460px;
  margin: 0 auto;
}
form {
  margin-bottom: 30px;
  background: #fff;
  border: 1px solid #e0e0e0;
  box-sizing: border-box;
  border-radius: 12px;
  padding: 20px;
}
@media (min-width: 600px) {
  form {
    padding: 40px;
  }
}
.button {
  display: block;
  position: relative;
  align-items: center;
  appearance: none;
  display: inline-flex;
  justify-content: center;
  line-height: 1;
  padding: 0 20px;
  height: 60px;
  text-decoration: none;
  background-color: #000645;
  border: none;
  color: #fff;
  border-radius: 3px;
  font-size: 16px;
  margin-top: 16px;
  width: 100%;
  cursor: pointer;
}
.button:hover {
  box-shadow: 0px 1px 12px rgba(33, 0, 150, 0.25);
}
.button:disabled {
  cursor: not-allowed;
}
.button-loading::before {
  content: "";
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background-color: #000645;
}
.button-loading::after {
  content: "";
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  margin: auto;
  width: 24px;
  height: 24px;
  border-color: currentColor;
  border-style: solid;
  border-radius: 99999px;
  border-width: 2px;
  border-left-color: transparent;
  color: #fff;
  animation: rotate 450ms linear 0ms infinite;
}
label {
  display: block;
  margin-bottom: 4px;
  font-size: 14px;
  color: #000645;
}
.required::after {
  content: "*";
  color: red;
}
.field-container {
  margin-bottom: 20px;
}
.field-columns {
  display: flex;
  justify-content: space-between;
}
.field-columns > * {
  flex: 0 1 46%;
}
.hosted-field,
.demo-field {
  height: 40px;
  padding: 0 12px;
  border: 1px solid #e0e0e0;
  border-radius: 3px;
}
.demo-field {
  appearance: none;
  width: 100%;
  font-size: 16px;
  letter-spacing: 0.02em;
  color: #000645;
}

.select {
  background-image: url("data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='%23727590' d='M6.34315 7.75734L4.92894 9.17155L12 16.2426L19.0711 9.17158L17.6568 7.75737L12 13.4142L6.34315 7.75734Z' /%3E%3C/svg%3E%0A");
  background-repeat: no-repeat, repeat;
  background-position: right 0.7em top 50%;
  background-size: 1.5em auto;
}
.hosted-field-invalid {
  border-color: #cc0001;
}
.hosted-field-valid {
  border-color: #10b981;
}
.hosted-field-focus,
.demo-field:focus {
  border-color: #210096;
  box-shadow: 0px 1px 12px rgba(33, 0, 150, 0.25);
  outline: none;
}
.error {
  color: #cc0001;
  background-color: #ffe6e6;
  padding: 2px 8px;
  margin-top: 12px;
  font-size: 14px;
  border-radius: 3px;
  display: none;
}
.error.visible {
  display: inline-block;
}
.disclaimer {
  color: #828282;
  font-size: 14px;
  margin-top: 24px;
  text-align: center;
}
.response {
  display: none;
  margin-top: 16px;
  color: #fff;
  padding: 10px 20px;
  text-align: center;
  font-size: 14px;
}
.response-success {
  display: block;
  background-color: #dff9ec;
  color: #1b643a;
}
.response-error {
  display: block;
  background-color: #ffe6e6;
  color: #cc0000;
}
@keyframes rotate {
  0% {
    transform: rotate(0deg);
  }
  100% {
    transform: rotate(360deg);
  }
}
var styles = {
  input: {
    color: "#000645",
    "font-family": "system-ui, -apple-system, BlinkMacSystemFont",
    "letter-spacing": "0.02em"
  },
  ".invalid": {
    color: "#cc0001"
  },
  "::placeholder": {
    color: "#757575"
  }
};

var hostedFields = assembly.hostedFields({
  environment: "pre-live"
});
var accountName = hostedFields.create("bankAccountName", {
  styles: styles,
  placeholder: "Account Holder Full Name"
});
var routingNumber = hostedFields.create("bankRoutingNumber", {
  styles: styles
});
var accountNumber = hostedFields.create("bankAccountNumber", {
  styles: styles
});
accountName.mount("#account-name-field");
routingNumber.mount("#routing-number-field");
accountNumber.mount("#account-number-field");

var fields = [accountName, routingNumber, accountNumber];
fields.forEach((field) => {
  field.on("change", function (event) {
    var errorElement = document.querySelector(
      "." + event.fieldType + "-container .error"
    );
    toggleError(errorElement, event);
  });
});

var form = document.querySelector("form");
var submitButton = form.querySelector(".button");
var responseContainer = document.querySelector(".response");

function toggleError(element, event) {
  if (event.error) {
    element.innerText = event.error.message;
    element.classList.add("visible");
  } else {
    element.innerText = "";
    element.classList.remove("visible");
  }
}

form.addEventListener("submit", function (event) {
  event.preventDefault();
  submitButton.disabled = true;
  submitButton.classList.add("button-loading");

  hostedFields
    .createBankAccount({
      token: "YOUR_AUTH_TOKEN",
      user_id: "YOUR_USER_ID",
      bank_name: form.querySelector("#bank-name-field").value,
      account_type: form.querySelector("#account-type-field").value,
      holder_type: form.querySelector("#holder-type-field").value,
      country: form.querySelector("#country-field").value,
      payout_currency:
        form.querySelector("#payout-currency-field").value || undefined,
      currency: form.querySelector("#currency-field").value || undefined
    })
    .then(function (response) {
      resetSubmitButton();
      // handle create card account succeeded
      responseContainer.classList.add("response-success");
      responseContainer.innerText = "Bank account successfully created.";
    })
    .catch(function (response) {
      resetSubmitButton();
      // handle errors
      responseContainer.classList.add("response-error");
      if (response.errors && response.errors.token) {
        responseContainer.innerText = "Your token is not authorized.";
      } else {
        responseContainer.innerText =
          "There was an error creating your bank account.";
      }
    });
});

function resetSubmitButton() {
  submitButton.disabled = false;
  submitButton.classList.remove("button-loading");
}

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

  1. https://cdnjs.cloudflare.com/ajax/libs/classlist/1.2.20180112/classList.min.js
  2. https://hosted-fields.assemblypay.com/assembly.js