Presentational, controlled login form component for the OpenFrame authentication UI. It renders an email input and SSO provider buttons, delegating all state, validation, and tenant discovery logic to the consumer. ## Key Components ### `LoginForm` The primary export. A fully controlled React component that renders: - A header with "Login to OpenFrame" branding - An email `Input` field with deferred error display (shown on blur or after a typing pause via `useDeferredError`) - `SsoProviderButtons` rendered below the email field, independently gated via `ssoDisabled` / `ssoEnabledProviders` ### `LoginFormProps` Interface defining the full API surface: - `email` / `onEmailChange` — controlled email field - `errors.email` / `emailStatus` — error and informational status messages (errors take precedence) - `ssoProviders` / `onSsoClick` — SSO provider list and click handler - `ssoDisabled` / `ssoEnabledProviders` — fine-grained SSO button gating (all vs. selective) - `ssoActionLabel` — verb prefix for provider buttons (default: `"Continue with"`) - `onSubmit` — triggered on Enter key press ## Usage Example ```typescript import { LoginForm } from './login-form' import type { AuthSsoProvider } from './sso-providers' const providers: AuthSsoProvider[] = ['google', 'microsoft'] ``` > **Source:** [`auth/login-form.tsx`](https://github.com/flamingo-stack/openframe-oss-lib/blob/main/auth/login-form.tsx)