Controlled, presentational login form component for OpenFrame's SSO flow, rendering email/password fields with deferred validation and submit/forgot-password actions. ## Key Components ### `OpenFrameSsoLoginForm` A fully controlled React form component intended to be rendered inside `SsoAuthShell`. Manages no internal state — all field values, change handlers, and error messages are passed via props. ### `OpenFrameSsoLoginFormProps` The component's prop interface, covering: - **Field control:** `email`, `password`, `onEmailChange`, `onPasswordChange` - **Actions:** `onSubmit`, `onForgotPassword` - **State flags:** `loading`, `disabled`, `submitDisabled` - **Validation:** `errors.email`, `errors.password` (deferred via `useDeferredError`) - **Copy overrides:** `title`, `subtitle`, labels, placeholders, and button text ### `useDeferredError` Hook used internally to delay showing validation messages until the user blurs a field or pauses typing, reducing noise during active input. ## Usage Example ```typescript import { OpenFrameSsoLoginForm } from './openframe-sso-login-form' function LoginPage() { const [email, setEmail] = useState('') const [password, setPassword] = useState('') return ( console.log('Submit', email, password)} onForgotPassword={() => console.log('Forgot password')} loading={false} errors={{ email: 'Invalid email format' }} /> ) } ``` Enter triggers submission via `onKeyDown` on both inputs. The "Continue" button uses the `accent` variant; "Forgot Password?" uses `transparent`. **Source:** [`openframe-sso-login-form.tsx`](https://github.com/flamingo-stack/openframe-oss-lib/blob/main/openframe-sso-login-form.tsx)