import type { ReactNode } from 'react'; import type { AuthSsoProvider } from './sso-providers'; export interface LoginFormProps { /** Controlled email value */ email: string; onEmailChange: (value: string) => void; emailPlaceholder?: string; loading?: boolean; disabled?: boolean; errors?: { email?: string; }; /** Informational status under the email field (e.g. live tenant discovery). `errors.email` wins. */ emailStatus?: { message: string; variant: 'error' | 'warning' | 'success' | 'muted'; }; /** * SSO providers, rendered ABOVE the email field with a divider between the two. Always visible; * gate clickability with `ssoDisabled` / `ssoEnabledProviders`. */ ssoProviders: AuthSsoProvider[]; onSsoClick?: (provider: AuthSsoProvider) => void; /** Disables every provider button (e.g. until the email passes discovery). */ ssoDisabled?: boolean; /** When set, only these providers are clickable; the rest stay disabled. */ ssoEnabledProviders?: AuthSsoProvider[]; /** Verb prefix for provider buttons, e.g. "Continue with". */ ssoActionLabel?: string; /** Label on the divider between the provider buttons and the email field. */ dividerLabel?: string; /** * The discovered tenant's own SSO options, rendered UNDER the email field — unlike `ssoProviders` * above, these depend on knowing the tenant, so they cannot be offered before an address is * typed. Shares `onSsoClick`. * * Three states, and the empty array is not the same as nothing: `undefined` means discovery has * not resolved a tenant yet and the slot stays empty, while `[]` means it resolved and the tenant * has none — which is an answer worth showing rather than silence. */ customSsoProviders?: AuthSsoProvider[]; /** Shown in place of the custom SSO buttons when the resolved tenant has none configured. */ noCustomSsoLabel?: string; /** Primary submit under the email field. Omit the handler to hide the button. */ onSubmitClick?: () => void; submitLabel?: string; /** Disables just the primary submit (fields stay editable). */ submitDisabled?: boolean; /** Overrides the default heading. */ title?: string; /** Overrides the default sub-heading. */ subtitle?: ReactNode; /** * Public legal pages, linked in a quiet "Terms of Service • Privacy Policy" row at the foot of * the card. Both are needed for the row to render: this screen has no consent checkbox to carry * the links, so the row is the only place they appear. */ termsUrl?: string; privacyPolicyUrl?: string; className?: string; } /** * Login form (Login tab). Presentational + controlled — the consumer owns * state, validation and discovery. Single-screen design: the provider buttons come first and need * nothing typed, then the email field below them. Whether the providers are gated is the * consumer's call via `ssoDisabled`; the identity-first flows leave them open, because the server * resolves the tenant from the identity the provider asserts. */ export declare function LoginForm({ email, onEmailChange, emailPlaceholder, loading, disabled, errors, emailStatus, ssoProviders, onSsoClick, ssoDisabled, ssoEnabledProviders, ssoActionLabel, dividerLabel, customSsoProviders, noCustomSsoLabel, onSubmitClick, submitLabel, submitDisabled, title, subtitle, termsUrl, privacyPolicyUrl, className, }: LoginFormProps): import("react").JSX.Element; //# sourceMappingURL=login-form.d.ts.map