A reference set of 2FA-page patterns that mirror what users actually encounter on real sites, plus a small group of synthetic isolation pages used to reproduce specific detection-logic edge cases. Each page documents its inspiration, the attribute shape, and the expected extension behavior with and without the page-load TOTP setting.
Each page reflects the attribute shape of a recognizable real-world 2FA flow.
autocomplete="one-time-code" + name="totp". The well-behaved baseline. GitHub, Cloudflare, modern fintech.
name="otc", type="tel", autocomplete="off", aria-label="Code". Captured from the public Microsoft 2FA flow.
No name attribute; only aria-label="One-time passcode" carries semantic meaning. Typical React-controlled-component shape.
name="mfaCode". Hits the strict vocabulary list. AWS, GCP, similar enterprise IAM challenge steps.
Six adjacent inputs named code1..code6. All six hit the ambiguous vocabulary via the "code" substring.
Six boxes named otp[0]..otp[5]. React/Vue array-binding convention.
Six boxes with IDs only, no name. State managed in JS, not via form submission. Common React 2FA shape.
TOTP form embedded in a same-origin <iframe>. Enterprise SSO portals (e.g. Okta-hosted widgets).
2FA challenge appears in a modal overlay without any URL change. Notion, Linear, modern SPAs.
Page-load trigger never fires; manual trigger worksTOTP and recovery-code inputs on the same page. GitHub-style fallback flow.
Fills TOTP, skips recovery field (exclusion guard)TOTP input inside a custom element's open shadow root. Stencil / Lit / Web Component design systems.
Works — deep shadow query finds the inputTOTP input doesn't exist in the initial DOM. Appears after the user clicks "Send code". Banking, telco, government portals.
Page-load doesn't re-fire on mutation; manual trigger worksConstructed test fixtures that expose specific detection-logic edge cases. Not representative of any real-world site.
Numeric maxlength + inputmode + pattern, no name/aria/label vocabulary anywhere. Tests whether structural cues could be promoted in a future fix.
Both detector and qualifier missFive boxes hit the vocabulary, one is deliberately outside. Triggers the split-digit consolidation collapse where the full 6-digit code is written into each of the 5 matched boxes.
Form ends up broken — known bug, awaiting structural-detector fix