ui-auth/dist/useAuthPanel.d.ts
autocommit 55daa6ed6a chore: initial package split from monorepo
Package: @lilith/ui-auth
Split from: lilith/ui.git or lilith/build.git
Publish workflow: calls lilith/workflows/.forgejo/workflows/publish-npm.yml@main
2026-04-20 01:10:50 -07:00

172 lines
No EOL
5.7 KiB
TypeScript

/**
* useAuthPanel Hook
*
* Convenience hook for managing rich auth panel state.
* Supports all three panel types: Split, Slide, and Fullscreen.
* Handles open/close, mode switching, theming, and info panel content.
*/
import type { AuthModalMode, User, AuthHandler } from './types';
import type { AuthPanelThemeVariant, AuthPanelTheme } from './themes';
import type { InfoPanelContent } from './panels/InfoPanel';
export type AuthPanelType = 'split' | 'slide' | 'fullscreen';
export type SlideDirection = 'left' | 'right';
export interface UseAuthPanelOptions {
/** SSO server URL - for direct SSO mode */
ssoUrl?: string;
/** Auth handler for provider-based integration - alternative to ssoUrl */
authHandler?: AuthHandler;
/** Initial mode when panel opens */
initialMode?: AuthModalMode;
/** Default role for registration */
defaultRole?: 'user' | 'provider' | 'client';
/** Show role selector in registration */
showRoleSelector?: boolean;
/** Panel type to use */
panelType?: AuthPanelType;
/** Theme variant */
theme?: AuthPanelThemeVariant;
/** Custom theme override */
customTheme?: AuthPanelTheme;
/** Slide direction (for slide panel) */
slideDirection?: SlideDirection;
/** Panel width (for slide panel) */
slideWidth?: number;
/** Background image URL (for fullscreen panel) */
backgroundImage?: string;
/** Info panel content */
infoPanelContent?: InfoPanelContent;
/** Allow mode switching between login/register */
allowModeSwitch?: boolean;
/** Show close button */
showCloseButton?: boolean;
/** Enable glass effect */
glassEffect?: boolean;
/** Blur overlay/background */
overlayBlur?: boolean;
/** Called after successful auth */
onSuccess?: (user: User) => void;
/** Called on auth error */
onError?: (error: Error) => void;
}
export interface UseAuthPanelReturn {
/** Whether panel is open */
isOpen: boolean;
/** Current mode (login or register) */
mode: AuthModalMode;
/** Current panel type */
panelType: AuthPanelType;
/** Current theme variant */
themeVariant: AuthPanelThemeVariant;
/** Resolved theme object */
theme: AuthPanelTheme;
/** SSO URL */
ssoUrl: string | undefined;
/** Auth handler */
authHandler: AuthHandler | undefined;
/** Default role for registration */
defaultRole: 'user' | 'provider' | 'client' | undefined;
/** Show role selector */
showRoleSelector: boolean;
/** Slide direction */
slideDirection: SlideDirection;
/** Slide panel width */
slideWidth: number;
/** Background image URL */
backgroundImage: string | undefined;
/** Info panel content */
infoPanelContent: InfoPanelContent | undefined;
/** Allow mode switching */
allowModeSwitch: boolean;
/** Show close button */
showCloseButton: boolean;
/** Glass effect enabled */
glassEffect: boolean;
/** Overlay blur enabled */
overlayBlur: boolean;
/** Open panel in login mode */
openLogin: () => void;
/** Open panel in register mode */
openRegister: (role?: 'user' | 'provider' | 'client') => void;
/** Open panel with specific config */
open: (config?: {
mode?: AuthModalMode;
role?: 'user' | 'provider' | 'client';
panelType?: AuthPanelType;
theme?: AuthPanelThemeVariant;
}) => void;
/** Close panel */
close: () => void;
/** Toggle panel */
toggle: () => void;
/** Switch mode */
setMode: (mode: AuthModalMode) => void;
/** Switch panel type */
setPanelType: (type: AuthPanelType) => void;
/** Switch theme */
setTheme: (theme: AuthPanelThemeVariant) => void;
/** Update info panel content */
setInfoContent: (content: InfoPanelContent) => void;
/** Handle auth success */
handleSuccess: (user: User) => void;
/** Handle auth error */
handleError: (error: Error) => void;
/** Get props for AuthSplitPanel */
getSplitPanelProps: () => SplitPanelProps;
/** Get props for AuthSlidePanel */
getSlidePanelProps: () => SlidePanelProps;
/** Get props for AuthFullscreenPanel */
getFullscreenPanelProps: () => FullscreenPanelProps;
}
interface SplitPanelProps {
mode: AuthModalMode;
theme: AuthPanelThemeVariant;
customTheme?: AuthPanelTheme;
infoPanel?: InfoPanelContent;
authHandler?: AuthHandler;
ssoUrl?: string;
defaultRole?: 'user' | 'provider' | 'client';
showRoleSelector: boolean;
onSuccess: (user: User) => void;
onClose: () => void;
onError: (error: Error) => void;
showCloseButton: boolean;
allowModeSwitch: boolean;
}
interface SlidePanelProps {
isOpen: boolean;
mode: AuthModalMode;
direction: SlideDirection;
theme: AuthPanelThemeVariant;
customTheme?: AuthPanelTheme;
authHandler?: AuthHandler;
ssoUrl?: string;
defaultRole?: 'user' | 'provider' | 'client';
showRoleSelector: boolean;
overlayBlur: boolean;
width: number;
onSuccess: (user: User) => void;
onClose: () => void;
onError: (error: Error) => void;
allowModeSwitch: boolean;
}
interface FullscreenPanelProps {
isOpen: boolean;
mode: AuthModalMode;
theme: AuthPanelThemeVariant;
customTheme?: AuthPanelTheme;
backgroundImage?: string;
authHandler?: AuthHandler;
ssoUrl?: string;
defaultRole?: 'user' | 'provider' | 'client';
showRoleSelector: boolean;
glassEffect: boolean;
backgroundBlur: boolean;
onSuccess: (user: User) => void;
onClose: () => void;
onError: (error: Error) => void;
allowModeSwitch: boolean;
showCloseButton: boolean;
}
export declare function useAuthPanel(options?: UseAuthPanelOptions): UseAuthPanelReturn;
export {};
//# sourceMappingURL=useAuthPanel.d.ts.map