+ {/* Surface 2 — Brand Slot (above the login card, in the flow) */} + + + {/* Surface 3 — Login Card */} +
+

+ Sign in +

+ + {/* Surface 4 — Username field */} +
+ + setUsername(e.target.value)} + onKeyDown={handleUsernameKeyDown} + aria-describedby={loginError ? 'login-error' : undefined} + style={inputStyle(inputHasError)} + /> +
+ + {/* Surface 5 — Password field with show/hide toggle */} +
+ +
+ setPassword(e.target.value)} + onKeyDown={handlePasswordKeyDown} + onBlur={() => setShowPassword(false)} + aria-describedby={loginError ? 'login-error' : undefined} + style={{ ...inputStyle(inputHasError), paddingRight: '44px' }} + /> + {/* Show/hide toggle button — 44px tap target (UI-SPEC Surface 5) */} + +
+
+ + {/* Surface 6 — Error / lockout banner */} + {loginError && ( +
+ {loginError === 'invalid' && ( +
+
+ )} + + {loginError === 'rate-limit' && ( +
+
+ )} + + {loginError === 'locked' && ( +
+
+ )} + + {loginError === 'server' && ( +
+
+ )} +
+ )} + + {/* Surface 7 — Primary submit button */} + + + {/* Surface 10 — Forgot password helper (informational only, not interactive) */} +

+ Forgot your password? Ask your admin. +

+
+ + {/* Surfaces 8 & 9 — Method divider + OIDC button (only when oidcEnabled) */} + {oidcEnabled && ( + <> + {/* Surface 8 — Method divider */} + + ); +}