Masked Input

Input constrained by a format.

html

<label class="mi" for="mi-1">
  <span class="mi__label">Card number <span class="mi__req">*</span></span>
  <input class="mi__input" id="mi-1" type="text" placeholder="0000 0000 0000 0000" inputmode="numeric" style="--accent:#D9C8F0;" aria-describedby="mi-hint-1" required>
  <span class="mi__hint" id="mi-hint-1">Format: 9999 9999 9999 9999</span>
</label>
<style>
.mi { display: block; font: 14px system-ui, sans-serif; color: #241430; max-width: 260px; }
.mi__label { display: block; margin-bottom: 6px; font-weight: 500; }
.mi__req { color: #241430; }
.mi__input { width: 100%; box-sizing: border-box; padding: 10px 12px; font: inherit; font-variant-numeric: tabular-nums; letter-spacing: 0.05em; color: #241430; background: #FAF7F2; border: 1.5px solid #24143040; border-radius: 8px; }
.mi__input:focus-visible { outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 35%, transparent); }
.mi__hint { display: block; margin-top: 6px; font-size: 11px; color: #24143080; }
</style>

tailwind

<label class="block max-w-[260px] font-sans text-sm text-[#241430]" for="mi-tw-1">
  <span class="block mb-1.5 font-medium">Card number <span>*</span></span>
  <input id="mi-tw-1" type="text" placeholder="0000 0000 0000 0000" inputmode="numeric" aria-describedby="mi-tw-hint-1" required
    class="w-full box-border px-3 py-2.5 tabular-nums tracking-wider bg-[#FAF7F2] border-[1.5px] border-[#24143040] rounded-lg focus-visible:outline-none" style="border-color:#D9C8F0;">
  <span id="mi-tw-hint-1" class="block mt-1.5 text-[11px] text-[#24143080]">Format: 9999 9999 9999 9999</span>
</label>

react

export function MaskedInput({
  label = "Card number",
  pattern = "9999 9999 9999 9999",
  placeholder = "0000 0000 0000 0000",
  accent = "#D9C8F0",
  required = true,
}) {
  return (
    <label style={{ display: "block", maxWidth: 260, fontFamily: "system-ui, sans-serif", fontSize: 14, color: "#241430" }}>
      <span style={{ display: "block", marginBottom: 6, fontWeight: 500 }}>{label}{required && " *"}</span>
      <input type="text" placeholder={placeholder} inputMode="numeric" required={required} aria-describedby="mi-react-hint-1" style={{
        width: "100%", boxSizing: "border-box", padding: "10px 12px", font: "inherit", fontVariantNumeric: "tabular-nums",
        letterSpacing: "0.05em", color: "#241430", background: "#FAF7F2", border: `1.5px solid ${accent}`, borderRadius: 8,
      }} />
      <span id="mi-react-hint-1" style={{ display: "block", marginTop: 6, fontSize: 11, color: "#24143080" }}>Format: {pattern}</span>
    </label>
  );
}