@mdxui/auth 1.1.1 → 1.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/providers/identity-provider.tsx","../src/providers/widgets-provider.tsx","../src/providers/auth-gate.tsx","../src/providers/vault-provider.tsx","../src/widgets/user-profile.tsx","../src/widgets/user-security.tsx","../src/widgets/user-sessions.tsx","../src/widgets/api-keys.tsx","../src/widgets/users-management.tsx","../src/widgets/pipes.tsx","../src/widgets/organization-switcher.tsx","../src/vault/secrets-manager/secrets-manager.tsx","../src/vault/secrets-manager/secret-form.tsx","../src/vault/vault-delete-dialog.tsx","../src/vault/vault-empty-state.tsx","../src/vault/vault-input-modal.tsx","../src/vault/vault-item-card.tsx","../src/vault/vault-list.tsx","../src/components/sign-in-button.tsx","../src/components/sign-out-button.tsx","../src/components/user-menu.tsx","../src/components/team-switcher.tsx","../src/hooks/use-auth.ts","../src/hooks/use-widget-token.ts","../src/hooks/use-vault.ts","../src/schemas/auth-user.ts","../src/schemas/auth-session.ts","../src/schemas/auth-organization.ts","../src/schemas/provider-props.ts","../src/schemas/widget-props.ts"],"sourcesContent":["'use client'\n\nimport { AuthKitProvider } from '@workos-inc/authkit-react'\nimport type { IdentityProviderProps } from '../types/auth'\nimport { WidgetsProvider } from './widgets-provider'\n\n/**\n * Identity provider that wraps your app with WorkOS AuthKit authentication.\n *\n * This provider sets up authentication context for your application and\n * automatically includes the WidgetsProvider for WorkOS widgets.\n *\n * @example\n * ```tsx\n * import { IdentityProvider } from '@mdxui/auth'\n *\n * function App() {\n * return (\n * <IdentityProvider\n * clientId=\"client_xxx\"\n * devMode={process.env.NODE_ENV === 'development'}\n * >\n * <YourApp />\n * </IdentityProvider>\n * )\n * }\n * ```\n *\n * @example\n * ```tsx\n * // With custom redirect URI\n * <IdentityProvider\n * clientId=\"client_xxx\"\n * redirectUri=\"https://app.example.com/dashboard\"\n * onRedirectCallback={() => {\n * // Custom callback after auth redirect\n * }}\n * >\n * <YourApp />\n * </IdentityProvider>\n * ```\n */\nexport function IdentityProvider({\n clientId,\n apiHostname,\n devMode,\n redirectUri,\n onRedirectCallback,\n children,\n}: IdentityProviderProps) {\n // Build redirect URI - defaults to current origin\n const resolvedRedirectUri =\n redirectUri ??\n (typeof window !== 'undefined' ? window.location.origin : undefined)\n\n // Default redirect callback - clear auth params from URL\n const handleRedirectCallback =\n onRedirectCallback ??\n (() => {\n if (typeof window !== 'undefined') {\n const url = new URL(window.location.href)\n url.searchParams.delete('code')\n url.searchParams.delete('state')\n window.history.replaceState({}, '', url.pathname)\n }\n })\n\n return (\n <AuthKitProvider\n clientId={clientId}\n apiHostname={apiHostname}\n devMode={devMode}\n redirectUri={resolvedRedirectUri}\n onRedirectCallback={handleRedirectCallback}\n >\n <WidgetsProvider>{children}</WidgetsProvider>\n </AuthKitProvider>\n )\n}\n\n/**\n * Minimal identity provider without WidgetsProvider\n *\n * Use this if you want to set up widgets separately or don't need them.\n *\n * @example\n * ```tsx\n * import { IdentityProviderMinimal, WidgetsProvider } from '@mdxui/auth'\n *\n * function App() {\n * return (\n * <IdentityProviderMinimal clientId=\"client_xxx\">\n * <WidgetsProvider appearance=\"dark\">\n * <YourApp />\n * </WidgetsProvider>\n * </IdentityProviderMinimal>\n * )\n * }\n * ```\n */\nexport function IdentityProviderMinimal({\n clientId,\n apiHostname,\n devMode,\n redirectUri,\n onRedirectCallback,\n children,\n}: IdentityProviderProps) {\n const resolvedRedirectUri =\n redirectUri ??\n (typeof window !== 'undefined' ? window.location.origin : undefined)\n\n const handleRedirectCallback =\n onRedirectCallback ??\n (() => {\n if (typeof window !== 'undefined') {\n const url = new URL(window.location.href)\n url.searchParams.delete('code')\n url.searchParams.delete('state')\n window.history.replaceState({}, '', url.pathname)\n }\n })\n\n return (\n <AuthKitProvider\n clientId={clientId}\n apiHostname={apiHostname}\n devMode={devMode}\n redirectUri={resolvedRedirectUri}\n onRedirectCallback={handleRedirectCallback}\n >\n {children}\n </AuthKitProvider>\n )\n}\n","'use client'\n\nimport { WorkOsWidgets } from '@workos-inc/widgets'\nimport { useEffect, useState } from 'react'\nimport type { WidgetsProviderProps } from '../types/auth'\n\n/**\n * Hook to detect dark mode from document class or system preference\n *\n * @returns Object with isDark state and mounted flag\n *\n * @example\n * ```tsx\n * const { isDark, mounted } = useThemeDetection()\n * const appearance = mounted ? (isDark ? 'dark' : 'light') : 'inherit'\n * ```\n */\nexport function useThemeDetection() {\n const [mounted, setMounted] = useState(false)\n const [isDark, setIsDark] = useState(false)\n\n useEffect(() => {\n setMounted(true)\n\n const checkDarkMode = () => {\n const isDarkClass = document.documentElement.classList.contains('dark')\n const prefersDark = window.matchMedia(\n '(prefers-color-scheme: dark)'\n ).matches\n setIsDark(\n isDarkClass ||\n (!document.documentElement.classList.contains('light') && prefersDark)\n )\n }\n\n checkDarkMode()\n\n // Watch for class changes on html element\n const observer = new MutationObserver(checkDarkMode)\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class'],\n })\n\n // Watch for system preference changes\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)')\n mediaQuery.addEventListener('change', checkDarkMode)\n\n return () => {\n observer.disconnect()\n mediaQuery.removeEventListener('change', checkDarkMode)\n }\n }, [])\n\n return { isDark, mounted }\n}\n\n/**\n * Provider for WorkOS widgets with automatic theme detection\n *\n * Wraps children with WorkOsWidgets context and automatically detects\n * light/dark mode from document classes or system preference.\n *\n * @example\n * ```tsx\n * import { WidgetsProvider } from '@mdxui/auth'\n * import { UserProfile } from '@mdxui/auth/widgets'\n *\n * function App() {\n * return (\n * <WidgetsProvider>\n * <UserProfile authToken={getAccessToken} />\n * </WidgetsProvider>\n * )\n * }\n * ```\n *\n * @example\n * ```tsx\n * // With explicit theme\n * <WidgetsProvider appearance=\"dark\" radius=\"large\">\n * <UserProfile authToken={token} />\n * </WidgetsProvider>\n * ```\n */\nexport function WidgetsProvider({\n children,\n appearance,\n radius = 'medium',\n scaling = '100%',\n}: WidgetsProviderProps) {\n const { isDark, mounted } = useThemeDetection()\n\n // Use provided appearance, or auto-detect from theme\n // Use \"inherit\" until mounted to avoid hydration mismatch\n const resolvedAppearance =\n appearance ?? (mounted ? (isDark ? 'dark' : 'light') : 'inherit')\n\n return (\n <WorkOsWidgets\n theme={{\n appearance: resolvedAppearance,\n radius,\n scaling,\n }}\n elements={{\n primaryButton: {\n variant: 'solid',\n },\n secondaryButton: {\n variant: 'outline',\n },\n }}\n >\n {children}\n </WorkOsWidgets>\n )\n}\n","'use client'\n\nimport { useAuth } from '@workos-inc/authkit-react'\nimport type { AuthGateProps } from '../types/auth'\n\n/**\n * Default loading component shown while checking authentication\n */\nfunction DefaultLoadingComponent() {\n return (\n <div className=\"min-h-screen bg-background flex items-center justify-center\">\n <div className=\"flex flex-col items-center gap-4\">\n <div className=\"h-8 w-8 animate-spin rounded-full border-4 border-primary border-t-transparent\" />\n <p className=\"text-sm text-muted-foreground\">Loading...</p>\n </div>\n </div>\n )\n}\n\n/**\n * Default landing page component shown when user is not authenticated\n */\nfunction DefaultLandingPage() {\n const { signIn } = useAuth()\n\n return (\n <div className=\"min-h-screen bg-background flex flex-col items-center justify-center p-4\">\n <div className=\"text-center max-w-md\">\n <h1 className=\"text-3xl font-bold tracking-tight mb-4\">Welcome</h1>\n <p className=\"text-muted-foreground mb-8\">\n Sign in to access your dashboard.\n </p>\n <button\n type=\"button\"\n onClick={() => signIn()}\n className=\"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-[var(--radius-md)] text-sm font-medium transition-colors bg-primary text-primary-foreground hover:bg-primary/90 h-10 px-6\"\n >\n Sign In\n </button>\n </div>\n </div>\n )\n}\n\n/**\n * AuthGate handles authentication state and shows appropriate UI:\n * - Loading state while checking auth\n * - Landing page or redirect when not authenticated\n * - Children (protected content) when authenticated\n *\n * @example\n * ```tsx\n * import { AuthGate } from '@mdxui/auth'\n *\n * function App() {\n * return (\n * <AuthGate>\n * <ProtectedDashboard />\n * </AuthGate>\n * )\n * }\n * ```\n *\n * @example\n * ```tsx\n * // With custom components\n * <AuthGate\n * loadingComponent={<CustomSpinner />}\n * landingComponent={<CustomLandingPage />}\n * >\n * <Dashboard />\n * </AuthGate>\n * ```\n *\n * @example\n * ```tsx\n * // Allow unauthenticated access\n * <AuthGate required={false}>\n * <PublicContent />\n * </AuthGate>\n * ```\n *\n * @example\n * ```tsx\n * // Redirect to external URL when not authenticated\n * <AuthGate\n * onUnauthenticated=\"redirect\"\n * redirectUrl=\"https://marketing.example.com\"\n * >\n * <Dashboard />\n * </AuthGate>\n * ```\n */\nexport function AuthGate({\n children,\n required = true,\n loadingComponent,\n landingComponent,\n onUnauthenticated = 'landing',\n redirectUrl,\n}: AuthGateProps) {\n const { user, isLoading } = useAuth()\n\n // If auth is not required, always show children\n if (!required) {\n return <>{children}</>\n }\n\n // Show loading state while checking authentication\n if (isLoading) {\n return <>{loadingComponent ?? <DefaultLoadingComponent />}</>\n }\n\n // User is authenticated, show protected content\n if (user) {\n return <>{children}</>\n }\n\n // User is not authenticated - handle based on config\n switch (onUnauthenticated) {\n case 'redirect':\n // Redirect to external URL\n if (redirectUrl && typeof window !== 'undefined') {\n window.location.href = redirectUrl\n return (\n <div className=\"min-h-screen bg-background flex items-center justify-center\">\n <p className=\"text-sm text-muted-foreground\">Redirecting...</p>\n </div>\n )\n }\n // Fall through to landing if no redirect URL\n return <>{landingComponent ?? <DefaultLandingPage />}</>\n\n case 'allow':\n // Allow access even without auth (shows children)\n return <>{children}</>\n\n case 'landing':\n default:\n // Show landing page (custom or default)\n return <>{landingComponent ?? <DefaultLandingPage />}</>\n }\n}\n","'use client'\n\nimport { createContext, useContext, useMemo, type ReactNode } from 'react'\nimport type { VaultItem, VaultField } from '../vault/types'\n\n/**\n * Vault client interface\n *\n * Defines the contract for a vault backend. The actual implementation\n * can be provided by vault.do SDK or any other vault service.\n */\nexport interface VaultClient {\n /** List all vault items */\n list: () => Promise<VaultItem[]>\n /** Create a new vault item */\n create: (integrationId: string, credentials: Record<string, string>) => Promise<VaultItem>\n /** Rotate credentials for an existing vault item */\n rotate: (id: string, credentials: Record<string, string>) => Promise<VaultItem>\n /** Delete a vault item */\n delete: (id: string) => Promise<void>\n /** Get field configuration for an integration */\n getIntegrationFields?: (integrationId: string) => VaultField[]\n}\n\n/**\n * Vault context state\n */\nexport interface VaultContextState {\n /** The vault client instance */\n client: VaultClient | null\n /** Vault items currently loaded */\n items: VaultItem[]\n /** Whether the vault is currently loading */\n loading: boolean\n /** Error message if vault operations failed */\n error: string | null\n /** Reload vault items */\n reload: () => Promise<void>\n /** Create a new vault item */\n createItem: (integrationId: string, credentials: Record<string, string>) => Promise<void>\n /** Rotate credentials for an existing item */\n rotateItem: (id: string, credentials: Record<string, string>) => Promise<void>\n /** Delete a vault item */\n deleteItem: (id: string) => Promise<void>\n /** Get field configuration for an integration */\n getIntegrationFields: (integrationId: string) => VaultField[]\n}\n\nconst VaultContext = createContext<VaultContextState | null>(null)\n\n/**\n * Props for VaultProvider\n */\nexport interface VaultProviderProps {\n /** Children to render */\n children: ReactNode\n /** Optional vault client implementation */\n client?: VaultClient\n /** Initial items to display (for SSR or static rendering) */\n initialItems?: VaultItem[]\n}\n\n/**\n * Default fields for unknown integrations\n */\nconst defaultFields: VaultField[] = [\n { key: 'api_key', label: 'API Key', type: 'password', required: true }\n]\n\n/**\n * Provider for vault state and operations\n *\n * Provides context for vault components to access the vault client\n * and perform CRUD operations on credentials.\n *\n * The actual vault.do SDK integration will be done in vault.do/react.\n * This provider is designed to be a generic wrapper that can work\n * with any vault backend implementation.\n *\n * @example\n * ```tsx\n * import { VaultProvider } from '@mdxui/auth'\n *\n * // Basic usage with a custom client\n * function App() {\n * return (\n * <VaultProvider client={myVaultClient}>\n * <VaultDashboard />\n * </VaultProvider>\n * )\n * }\n *\n * // Static/SSR usage with initial items\n * function App() {\n * return (\n * <VaultProvider initialItems={serverSideItems}>\n * <VaultDashboard />\n * </VaultProvider>\n * )\n * }\n * ```\n */\nexport function VaultProvider({\n children,\n client,\n initialItems = [],\n}: VaultProviderProps) {\n // Note: In a real implementation, this would use useState and useEffect\n // to manage state and load items from the client. For now, we provide\n // a basic structure that the vault.do SDK can extend.\n\n const contextValue = useMemo<VaultContextState>(() => {\n const getIntegrationFields = (integrationId: string): VaultField[] => {\n if (client?.getIntegrationFields) {\n return client.getIntegrationFields(integrationId)\n }\n return defaultFields\n }\n\n return {\n client: client ?? null,\n items: initialItems,\n loading: false,\n error: null,\n reload: async () => {\n if (!client) {\n console.warn('VaultProvider: No client provided, cannot reload')\n return\n }\n // Implementation would update state here\n await client.list()\n },\n createItem: async (integrationId, credentials) => {\n if (!client) {\n throw new Error('VaultProvider: No client provided')\n }\n await client.create(integrationId, credentials)\n },\n rotateItem: async (id, credentials) => {\n if (!client) {\n throw new Error('VaultProvider: No client provided')\n }\n await client.rotate(id, credentials)\n },\n deleteItem: async (id) => {\n if (!client) {\n throw new Error('VaultProvider: No client provided')\n }\n await client.delete(id)\n },\n getIntegrationFields,\n }\n }, [client, initialItems])\n\n return (\n <VaultContext.Provider value={contextValue}>\n {children}\n </VaultContext.Provider>\n )\n}\n\n/**\n * Hook to access vault context\n *\n * Must be used within a VaultProvider.\n *\n * @throws Error if used outside of VaultProvider\n */\nexport function useVaultContext(): VaultContextState {\n const context = useContext(VaultContext)\n if (!context) {\n throw new Error('useVaultContext must be used within a VaultProvider')\n }\n return context\n}\n\n/**\n * Hook to optionally access vault context\n *\n * Returns null if not within a VaultProvider.\n */\nexport function useVaultContextOptional(): VaultContextState | null {\n return useContext(VaultContext)\n}\n","'use client'\n\nimport { UserProfile as WorkOSUserProfile } from '@workos-inc/widgets'\nimport type { BaseWidgetProps } from '../types/auth'\n\n/**\n * User Profile Widget\n *\n * Displays and allows editing of user profile information:\n * - Profile picture\n * - Name and email\n * - Connected accounts (OAuth providers)\n *\n * @example\n * ```tsx\n * // With AuthKit (recommended)\n * import { useAuth } from '@mdxui/auth'\n * import { UserProfile } from '@mdxui/auth/widgets'\n *\n * function ProfilePage() {\n * const { getAccessToken } = useAuth()\n * return <UserProfile authToken={getAccessToken} />\n * }\n * ```\n *\n * @example\n * ```tsx\n * // With string token\n * <UserProfile authToken={myToken} />\n * ```\n */\nexport function UserProfile({ authToken, className }: BaseWidgetProps) {\n return (\n <div className={className}>\n <WorkOSUserProfile authToken={authToken} />\n </div>\n )\n}\n","'use client'\n\nimport { UserSecurity as WorkOSUserSecurity } from '@workos-inc/widgets'\nimport type { BaseWidgetProps } from '../types/auth'\n\n/**\n * User Security Widget\n *\n * Allows users to manage their security settings:\n * - Password management\n * - Multi-factor authentication (MFA)\n * - Connected authentication methods\n * - Security keys\n *\n * @example\n * ```tsx\n * // With AuthKit (recommended)\n * import { useAuth } from '@mdxui/auth'\n * import { UserSecurity } from '@mdxui/auth/widgets'\n *\n * function SecurityPage() {\n * const { getAccessToken } = useAuth()\n * return <UserSecurity authToken={getAccessToken} />\n * }\n * ```\n */\nexport function UserSecurity({ authToken, className }: BaseWidgetProps) {\n return (\n <div className={className}>\n <WorkOSUserSecurity authToken={authToken} />\n </div>\n )\n}\n","'use client'\n\nimport { UserSessions as WorkOSUserSessions } from '@workos-inc/widgets'\n\n/**\n * Props for UserSessions with function token (no currentSessionId needed)\n */\nexport interface UserSessionsWithFunctionTokenProps {\n /** Auth token getter function */\n authToken: () => Promise<string>\n /** CSS class name */\n className?: string\n}\n\n/**\n * Props for UserSessions with string token (currentSessionId required)\n */\nexport interface UserSessionsWithStringTokenProps {\n /** Auth token string */\n authToken: string\n /** Current session ID (required when using string token) */\n currentSessionId: string\n /** CSS class name */\n className?: string\n}\n\nexport type UserSessionsProps =\n | UserSessionsWithFunctionTokenProps\n | UserSessionsWithStringTokenProps\n\n/**\n * User Sessions Widget\n *\n * Displays and manages active user sessions:\n * - View all active sessions\n * - See session details (device, location, last active)\n * - Revoke sessions\n *\n * @example\n * ```tsx\n * // With AuthKit (recommended) - no currentSessionId needed\n * import { useAuth } from '@mdxui/auth'\n * import { UserSessions } from '@mdxui/auth/widgets'\n *\n * function SessionsPage() {\n * const { getAccessToken } = useAuth()\n * return <UserSessions authToken={getAccessToken} />\n * }\n * ```\n *\n * @example\n * ```tsx\n * // With string token - currentSessionId required\n * <UserSessions authToken={token} currentSessionId={sessionId} />\n * ```\n */\nexport function UserSessions(props: UserSessionsProps) {\n const { className, ...rest } = props\n\n return (\n <div className={className}>\n <WorkOSUserSessions {...rest} />\n </div>\n )\n}\n","'use client'\n\nimport { ApiKeys as WorkOSApiKeys } from '@workos-inc/widgets'\nimport type { BaseWidgetProps } from '../types/auth'\n\n/**\n * API Keys Widget\n *\n * Displays and manages API keys:\n * - Create new API keys with specific permissions\n * - View existing API keys\n * - Revoke API keys\n *\n * Requires the `widgets:api-keys:manage` permission.\n * Organization context is derived from the auth token.\n *\n * @example\n * ```tsx\n * // With AuthKit (recommended)\n * import { useAuth } from '@mdxui/auth'\n * import { ApiKeys } from '@mdxui/auth/widgets'\n *\n * function ApiKeysPage() {\n * const { getAccessToken } = useAuth()\n * return <ApiKeys authToken={getAccessToken} />\n * }\n * ```\n */\nexport function ApiKeys({ authToken, className }: BaseWidgetProps) {\n return (\n <div className={className}>\n <WorkOSApiKeys authToken={authToken} />\n </div>\n )\n}\n","'use client'\n\nimport { UsersManagement as WorkOSUsersManagement } from '@workos-inc/widgets'\nimport type { BaseWidgetProps } from '../types/auth'\n\nexport interface UsersManagementProps extends BaseWidgetProps {\n /**\n * Organization ID for scoping the user management.\n *\n * This is typically used to verify organization context in the parent component.\n * The actual organization scope comes from the auth token.\n */\n organizationId?: string\n}\n\n/**\n * Users Management Widget (Team Page)\n *\n * Allows organization admins to manage team members:\n * - View organization members\n * - Invite new members\n * - Update member roles\n * - Remove members\n *\n * Requires the `widgets:users-table:manage` permission and organization context.\n *\n * @example\n * ```tsx\n * // With AuthKit (recommended)\n * import { useAuth } from '@mdxui/auth'\n * import { UsersManagement } from '@mdxui/auth/widgets'\n *\n * function TeamPage() {\n * const { getAccessToken, organizationId, permissions } = useAuth()\n *\n * if (!organizationId) {\n * return <p>You need to be in an organization.</p>\n * }\n *\n * if (!permissions?.includes('widgets:users-table:manage')) {\n * return <p>You need admin permissions.</p>\n * }\n *\n * return (\n * <UsersManagement\n * authToken={getAccessToken}\n * organizationId={organizationId}\n * />\n * )\n * }\n * ```\n */\nexport function UsersManagement({\n authToken,\n organizationId: _organizationId,\n className,\n}: UsersManagementProps) {\n return (\n <div className={className}>\n <WorkOSUsersManagement authToken={authToken} />\n </div>\n )\n}\n","'use client'\n\nimport { Pipes as WorkOSPipes } from '@workos-inc/widgets'\nimport type { BaseWidgetProps } from '../types/auth'\n\n/**\n * Pipes Widget (Integrations)\n *\n * Allows users to manage third-party integrations:\n * - Connect external services\n * - View connected integrations\n * - Manage integration settings\n * - Disconnect integrations\n *\n * @example\n * ```tsx\n * // With AuthKit (recommended)\n * import { useAuth } from '@mdxui/auth'\n * import { Pipes } from '@mdxui/auth/widgets'\n *\n * function IntegrationsPage() {\n * const { getAccessToken } = useAuth()\n * return <Pipes authToken={getAccessToken} />\n * }\n * ```\n */\nexport function Pipes({ authToken, className }: BaseWidgetProps) {\n return (\n <div className={className}>\n <WorkOSPipes authToken={authToken} />\n </div>\n )\n}\n","'use client'\n\nimport { OrganizationSwitcher as WorkOSOrganizationSwitcher } from '@workos-inc/widgets'\n\nexport type OrganizationSwitcherVariant = 'ghost' | 'outline'\n\nexport interface OrganizationSwitcherProps {\n /** Auth token getter function */\n authToken: () => Promise<string>\n /**\n * Function to switch to a different organization.\n * Receives an object with organizationId.\n */\n switchToOrganization: (args: { organizationId: string }) => void | Promise<void>\n /** Visual variant of the switcher */\n variant?: OrganizationSwitcherVariant\n /** Custom organization label */\n organizationLabel?: string | null\n /** Where to truncate long organization names */\n truncateBehavior?: 'right' | 'middle'\n /** CSS class name */\n className?: string\n}\n\n/**\n * Organization Switcher Widget\n *\n * Allows users to switch between organizations they belong to.\n *\n * @example\n * ```tsx\n * import { useAuth } from '@mdxui/auth'\n * import { OrganizationSwitcher } from '@mdxui/auth/widgets'\n *\n * function OrgSwitcher() {\n * const { getAccessToken, switchToOrganization } = useAuth()\n *\n * // Adapt the function signature\n * const handleSwitch = ({ organizationId }: { organizationId: string }) => {\n * return switchToOrganization(organizationId)\n * }\n *\n * return (\n * <OrganizationSwitcher\n * authToken={getAccessToken}\n * switchToOrganization={handleSwitch}\n * />\n * )\n * }\n * ```\n */\nexport function OrganizationSwitcher({\n authToken,\n switchToOrganization,\n variant,\n organizationLabel,\n truncateBehavior,\n className,\n}: OrganizationSwitcherProps) {\n return (\n <div className={className}>\n <WorkOSOrganizationSwitcher\n authToken={authToken}\n switchToOrganization={switchToOrganization}\n variant={variant}\n organizationLabel={organizationLabel}\n truncateBehavior={truncateBehavior}\n />\n </div>\n )\n}\n","\"use client\";\n\nimport {\n\tBadge,\n\tButton,\n\tCard,\n\tCardContent,\n\tCardDescription,\n\tCardHeader,\n\tCardTitle,\n\tDialog,\n\tDialogContent,\n\tDialogHeader,\n\tDialogTitle,\n\tDialogTrigger,\n\tInput,\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n\tTable,\n\tTableBody,\n\tTableCell,\n\tTableHead,\n\tTableHeader,\n\tTableRow,\n} from \"@mdxui/primitives\";\nimport { cn } from \"@mdxui/primitives/lib/utils\";\nimport {\n\tCopy,\n\tEdit,\n\tEye,\n\tEyeOff,\n\tFilter,\n\tPlus,\n\tSearch,\n\tTrash2,\n} from \"lucide-react\";\nimport * as React from \"react\";\nimport { toast } from \"sonner\";\nimport { SecretForm } from \"./secret-form\";\nimport type { Secret, SecretsManagerProps } from \"./types\";\n\n/**\n * SecretsManager Component\n *\n * A comprehensive UI for managing application secrets and environment variables.\n * Provides features for creating, editing, deleting, and viewing secrets with\n * support for multiple environments.\n *\n * @example\n * ```tsx\n * import { SecretsManager } from '@mdxui/auth'\n *\n * function VaultPage() {\n * return (\n * <SecretsManager\n * secrets={secrets}\n * environments={['development', 'staging', 'production']}\n * onCreate={handleCreate}\n * onUpdate={handleUpdate}\n * onDelete={handleDelete}\n * />\n * )\n * }\n * ```\n */\nexport function SecretsManager({\n\tsecrets: externalSecrets = [],\n\tenvironments = [\"development\", \"staging\", \"production\"],\n\tcurrentEnvironment = \"development\",\n\tonEnvironmentChange,\n\tonCreate,\n\tonUpdate,\n\tonDelete,\n\thideValues: initialHideValues = true,\n\teditable = true,\n\tclassName,\n}: SecretsManagerProps) {\n\tconst [localSecrets, setLocalSecrets] = React.useState<Secret[]>([]);\n\tconst [hideValues, setHideValues] = React.useState(initialHideValues);\n\tconst [searchQuery, setSearchQuery] = React.useState(\"\");\n\tconst [environment, setEnvironment] = React.useState(currentEnvironment);\n\tconst [visibleSecrets, setVisibleSecrets] = React.useState<Set<string>>(\n\t\tnew Set(),\n\t);\n\tconst [editingSecret, setEditingSecret] = React.useState<Secret | null>(null);\n\tconst [isCreateDialogOpen, setIsCreateDialogOpen] = React.useState(false);\n\tconst [isEditDialogOpen, setIsEditDialogOpen] = React.useState(false);\n\n\tconst secrets = externalSecrets.length > 0 ? externalSecrets : localSecrets;\n\n\tReact.useEffect(() => {\n\t\tsetEnvironment(currentEnvironment);\n\t}, [currentEnvironment]);\n\n\tconst filteredSecrets = React.useMemo(() => {\n\t\treturn secrets.filter((secret) => {\n\t\t\tconst matchesSearch = searchQuery\n\t\t\t\t? secret.key.toLowerCase().includes(searchQuery.toLowerCase()) ||\n\t\t\t\t\tsecret.description?.toLowerCase().includes(searchQuery.toLowerCase())\n\t\t\t\t: true;\n\n\t\t\tconst matchesEnvironment =\n\t\t\t\tenvironment === \"all\" || secret.environment === environment;\n\n\t\t\treturn matchesSearch && matchesEnvironment;\n\t\t});\n\t}, [secrets, searchQuery, environment]);\n\n\tconst handleEnvironmentChange = (newEnvironment: string) => {\n\t\tsetEnvironment(newEnvironment);\n\t\tonEnvironmentChange?.(newEnvironment);\n\t};\n\n\tconst handleCreate = async (\n\t\tsecretData: Omit<Secret, \"id\" | \"createdAt\" | \"updatedAt\">,\n\t) => {\n\t\tconst newSecret: Secret = {\n\t\t\t...secretData,\n\t\t\tid: crypto.randomUUID(),\n\t\t\tcreatedAt: new Date(),\n\t\t\tupdatedAt: new Date(),\n\t\t};\n\n\t\ttry {\n\t\t\tawait onCreate?.(secretData);\n\n\t\t\tif (externalSecrets.length === 0) {\n\t\t\t\tsetLocalSecrets((prev) => [...prev, newSecret]);\n\t\t\t}\n\n\t\t\tsetIsCreateDialogOpen(false);\n\t\t\ttoast.success(\"Secret created successfully\");\n\t\t} catch (error) {\n\t\t\ttoast.error(\"Failed to create secret\");\n\t\t}\n\t};\n\n\tconst handleUpdate = async (id: string, updates: Partial<Secret>) => {\n\t\ttry {\n\t\t\tawait onUpdate?.(id, { ...updates, updatedAt: new Date() });\n\n\t\t\tif (externalSecrets.length === 0) {\n\t\t\t\tsetLocalSecrets((prev) =>\n\t\t\t\t\tprev.map((secret) =>\n\t\t\t\t\t\tsecret.id === id\n\t\t\t\t\t\t\t? { ...secret, ...updates, updatedAt: new Date() }\n\t\t\t\t\t\t\t: secret,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tsetIsEditDialogOpen(false);\n\t\t\tsetEditingSecret(null);\n\t\t\ttoast.success(\"Secret updated successfully\");\n\t\t} catch (error) {\n\t\t\ttoast.error(\"Failed to update secret\");\n\t\t}\n\t};\n\n\tconst handleDelete = async (id: string) => {\n\t\tif (!confirm(\"Are you sure you want to delete this secret?\")) return;\n\n\t\ttry {\n\t\t\tawait onDelete?.(id);\n\n\t\t\tif (externalSecrets.length === 0) {\n\t\t\t\tsetLocalSecrets((prev) => prev.filter((secret) => secret.id !== id));\n\t\t\t}\n\n\t\t\ttoast.success(\"Secret deleted\");\n\t\t} catch (error) {\n\t\t\ttoast.error(\"Failed to delete secret\");\n\t\t}\n\t};\n\n\tconst handleCopy = (value: string) => {\n\t\tnavigator.clipboard.writeText(value);\n\t\ttoast.success(\"Value copied to clipboard\");\n\t};\n\n\tconst toggleSecretVisibility = (id: string) => {\n\t\tsetVisibleSecrets((prev) => {\n\t\t\tconst next = new Set(prev);\n\t\t\tif (next.has(id)) {\n\t\t\t\tnext.delete(id);\n\t\t\t} else {\n\t\t\t\tnext.add(id);\n\t\t\t}\n\t\t\treturn next;\n\t\t});\n\t};\n\n\tconst toggleAllVisibility = () => {\n\t\tsetHideValues(!hideValues);\n\t\tif (!hideValues) {\n\t\t\tsetVisibleSecrets(new Set());\n\t\t}\n\t};\n\n\tconst isSecretVisible = (id: string) => {\n\t\treturn hideValues ? visibleSecrets.has(id) : true;\n\t};\n\n\treturn (\n\t\t<div className={cn(\"space-y-4\", className)}>\n\t\t\t<Card>\n\t\t\t\t<CardHeader>\n\t\t\t\t\t<div className=\"flex items-start justify-between\">\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<CardTitle>Environment Variables</CardTitle>\n\t\t\t\t\t\t\t<CardDescription>\n\t\t\t\t\t\t\t\tManage your application secrets and configuration\n\t\t\t\t\t\t\t</CardDescription>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{editable && (\n\t\t\t\t\t\t\t<Dialog\n\t\t\t\t\t\t\t\topen={isCreateDialogOpen}\n\t\t\t\t\t\t\t\tonOpenChange={setIsCreateDialogOpen}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<DialogTrigger asChild>\n\t\t\t\t\t\t\t\t\t<Button>\n\t\t\t\t\t\t\t\t\t\t<Plus className=\"mr-2 size-4\" />\n\t\t\t\t\t\t\t\t\t\tAdd Secret\n\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t</DialogTrigger>\n\t\t\t\t\t\t\t\t<DialogContent>\n\t\t\t\t\t\t\t\t\t<DialogHeader>\n\t\t\t\t\t\t\t\t\t\t<DialogTitle>Create New Secret</DialogTitle>\n\t\t\t\t\t\t\t\t\t</DialogHeader>\n\t\t\t\t\t\t\t\t\t<SecretForm\n\t\t\t\t\t\t\t\t\t\tenvironment={environment}\n\t\t\t\t\t\t\t\t\t\tenvironments={environments}\n\t\t\t\t\t\t\t\t\t\tonSubmit={handleCreate}\n\t\t\t\t\t\t\t\t\t\tonCancel={() => setIsCreateDialogOpen(false)}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</DialogContent>\n\t\t\t\t\t\t\t</Dialog>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t</CardHeader>\n\t\t\t\t<CardContent className=\"space-y-4\">\n\t\t\t\t\t<div className=\"flex flex-wrap items-center gap-2\">\n\t\t\t\t\t\t<div className=\"relative flex-1\">\n\t\t\t\t\t\t\t<Search className=\"absolute left-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground\" />\n\t\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\t\tplaceholder=\"Search secrets...\"\n\t\t\t\t\t\t\t\tvalue={searchQuery}\n\t\t\t\t\t\t\t\tonChange={(e) => setSearchQuery(e.target.value)}\n\t\t\t\t\t\t\t\tclassName=\"pl-9\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<Select value={environment} onValueChange={handleEnvironmentChange}>\n\t\t\t\t\t\t\t<SelectTrigger className=\"w-[180px]\">\n\t\t\t\t\t\t\t\t<Filter className=\"mr-2 size-4\" />\n\t\t\t\t\t\t\t\t<SelectValue />\n\t\t\t\t\t\t\t</SelectTrigger>\n\t\t\t\t\t\t\t<SelectContent>\n\t\t\t\t\t\t\t\t<SelectItem value=\"all\">All Environments</SelectItem>\n\t\t\t\t\t\t\t\t{environments.map((env) => (\n\t\t\t\t\t\t\t\t\t<SelectItem key={env} value={env}>\n\t\t\t\t\t\t\t\t\t\t{env.charAt(0).toUpperCase() + env.slice(1)}\n\t\t\t\t\t\t\t\t\t</SelectItem>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</SelectContent>\n\t\t\t\t\t\t</Select>\n\t\t\t\t\t\t<Button variant=\"outline\" size=\"icon\" onClick={toggleAllVisibility}>\n\t\t\t\t\t\t\t{hideValues ? (\n\t\t\t\t\t\t\t\t<Eye className=\"size-4\" />\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<EyeOff className=\"size-4\" />\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{filteredSecrets.length > 0 ? (\n\t\t\t\t\t\t<div className=\"rounded-md border\">\n\t\t\t\t\t\t\t<Table>\n\t\t\t\t\t\t\t\t<TableHeader>\n\t\t\t\t\t\t\t\t\t<TableRow>\n\t\t\t\t\t\t\t\t\t\t<TableHead>Key</TableHead>\n\t\t\t\t\t\t\t\t\t\t<TableHead>Value</TableHead>\n\t\t\t\t\t\t\t\t\t\t<TableHead>Environment</TableHead>\n\t\t\t\t\t\t\t\t\t\t<TableHead>Description</TableHead>\n\t\t\t\t\t\t\t\t\t\t<TableHead className=\"w-[100px]\">Actions</TableHead>\n\t\t\t\t\t\t\t\t\t</TableRow>\n\t\t\t\t\t\t\t\t</TableHeader>\n\t\t\t\t\t\t\t\t<TableBody>\n\t\t\t\t\t\t\t\t\t{filteredSecrets.map((secret) => (\n\t\t\t\t\t\t\t\t\t\t<TableRow key={secret.id}>\n\t\t\t\t\t\t\t\t\t\t\t<TableCell>\n\t\t\t\t\t\t\t\t\t\t\t\t<code className=\"rounded bg-muted px-2 py-1 font-mono text-sm\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{secret.key}\n\t\t\t\t\t\t\t\t\t\t\t\t</code>\n\t\t\t\t\t\t\t\t\t\t\t</TableCell>\n\t\t\t\t\t\t\t\t\t\t\t<TableCell>\n\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<code className=\"flex-1 rounded bg-muted px-2 py-1 font-mono text-sm\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{isSecretVisible(secret.id)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? secret.value\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: \"\\u2022\".repeat(Math.min(secret.value.length, 20))}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</code>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsize=\"icon-sm\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => toggleSecretVisibility(secret.id)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{isSecretVisible(secret.id) ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<EyeOff className=\"size-4\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Eye className=\"size-4\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsize=\"icon-sm\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => handleCopy(secret.value)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Copy className=\"size-4\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t</TableCell>\n\t\t\t\t\t\t\t\t\t\t\t<TableCell>\n\t\t\t\t\t\t\t\t\t\t\t\t<Badge variant=\"secondary\">{secret.environment}</Badge>\n\t\t\t\t\t\t\t\t\t\t\t</TableCell>\n\t\t\t\t\t\t\t\t\t\t\t<TableCell>\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{secret.description || \"-\"}\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t</TableCell>\n\t\t\t\t\t\t\t\t\t\t\t<TableCell>\n\t\t\t\t\t\t\t\t\t\t\t\t{editable && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-1\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsize=\"icon-sm\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsetEditingSecret(secret);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsetIsEditDialogOpen(true);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Edit className=\"size-4\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsize=\"icon-sm\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => handleDelete(secret.id)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Trash2 className=\"size-4 text-destructive\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t</TableCell>\n\t\t\t\t\t\t\t\t\t\t</TableRow>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</TableBody>\n\t\t\t\t\t\t\t</Table>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<div className=\"flex h-32 items-center justify-center rounded-md border-2 border-dashed\">\n\t\t\t\t\t\t\t<p className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\t{searchQuery\n\t\t\t\t\t\t\t\t\t? \"No secrets found matching your search\"\n\t\t\t\t\t\t\t\t\t: \"No secrets yet. Add your first secret to get started.\"}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</CardContent>\n\t\t\t</Card>\n\n\t\t\t{editingSecret && (\n\t\t\t\t<Dialog open={isEditDialogOpen} onOpenChange={setIsEditDialogOpen}>\n\t\t\t\t\t<DialogContent>\n\t\t\t\t\t\t<DialogHeader>\n\t\t\t\t\t\t\t<DialogTitle>Edit Secret</DialogTitle>\n\t\t\t\t\t\t</DialogHeader>\n\t\t\t\t\t\t<SecretForm\n\t\t\t\t\t\t\tsecret={editingSecret}\n\t\t\t\t\t\t\tenvironment={environment}\n\t\t\t\t\t\t\tenvironments={environments}\n\t\t\t\t\t\t\tonSubmit={(data) => handleUpdate(editingSecret.id, data)}\n\t\t\t\t\t\t\tonCancel={() => {\n\t\t\t\t\t\t\t\tsetIsEditDialogOpen(false);\n\t\t\t\t\t\t\t\tsetEditingSecret(null);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</DialogContent>\n\t\t\t\t</Dialog>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","\"use client\";\n\nimport {\n\tButton,\n\tInput,\n\tLabel,\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n\tTextarea,\n} from \"@mdxui/primitives\";\nimport * as React from \"react\";\nimport type { Secret } from \"./types\";\n\ninterface SecretFormProps {\n\tsecret?: Secret;\n\tenvironment: string;\n\tenvironments: string[];\n\tonSubmit: (secret: Omit<Secret, \"id\" | \"createdAt\" | \"updatedAt\">) => void;\n\tonCancel: () => void;\n}\n\nexport function SecretForm({\n\tsecret,\n\tenvironment: defaultEnvironment,\n\tenvironments,\n\tonSubmit,\n\tonCancel,\n}: SecretFormProps) {\n\tconst [key, setKey] = React.useState(secret?.key || \"\");\n\tconst [value, setValue] = React.useState(secret?.value || \"\");\n\tconst [description, setDescription] = React.useState(\n\t\tsecret?.description || \"\",\n\t);\n\tconst [environment, setEnvironment] = React.useState(\n\t\tsecret?.environment || defaultEnvironment,\n\t);\n\n\tconst handleSubmit = (e: React.FormEvent) => {\n\t\te.preventDefault();\n\n\t\tif (!key.trim() || !value.trim()) return;\n\n\t\tonSubmit({\n\t\t\tkey: key.trim(),\n\t\t\tvalue: value.trim(),\n\t\t\tdescription: description.trim() || undefined,\n\t\t\tenvironment,\n\t\t});\n\t};\n\n\treturn (\n\t\t<form onSubmit={handleSubmit} className=\"space-y-4\">\n\t\t\t<div className=\"space-y-2\">\n\t\t\t\t<Label htmlFor=\"key\">Key *</Label>\n\t\t\t\t<Input\n\t\t\t\t\tid=\"key\"\n\t\t\t\t\tplaceholder=\"DATABASE_URL\"\n\t\t\t\t\tvalue={key}\n\t\t\t\t\tonChange={(e) =>\n\t\t\t\t\t\tsetKey(e.target.value.toUpperCase().replace(/[^A-Z0-9_]/g, \"_\"))\n\t\t\t\t\t}\n\t\t\t\t\trequired\n\t\t\t\t\tautoFocus\n\t\t\t\t/>\n\t\t\t\t<p className=\"text-xs text-muted-foreground\">\n\t\t\t\t\tUse UPPER_CASE with underscores (e.g., API_KEY, DATABASE_URL)\n\t\t\t\t</p>\n\t\t\t</div>\n\n\t\t\t<div className=\"space-y-2\">\n\t\t\t\t<Label htmlFor=\"value\">Value *</Label>\n\t\t\t\t<Textarea\n\t\t\t\t\tid=\"value\"\n\t\t\t\t\tplaceholder=\"Enter secret value\"\n\t\t\t\t\tvalue={value}\n\t\t\t\t\tonChange={(e) => setValue(e.target.value)}\n\t\t\t\t\trows={3}\n\t\t\t\t\trequired\n\t\t\t\t\tclassName=\"font-mono\"\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t<div className=\"space-y-2\">\n\t\t\t\t<Label htmlFor=\"environment\">Environment *</Label>\n\t\t\t\t<Select value={environment} onValueChange={setEnvironment}>\n\t\t\t\t\t<SelectTrigger id=\"environment\">\n\t\t\t\t\t\t<SelectValue />\n\t\t\t\t\t</SelectTrigger>\n\t\t\t\t\t<SelectContent>\n\t\t\t\t\t\t{environments.map((env) => (\n\t\t\t\t\t\t\t<SelectItem key={env} value={env}>\n\t\t\t\t\t\t\t\t{env.charAt(0).toUpperCase() + env.slice(1)}\n\t\t\t\t\t\t\t</SelectItem>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</SelectContent>\n\t\t\t\t</Select>\n\t\t\t</div>\n\n\t\t\t<div className=\"space-y-2\">\n\t\t\t\t<Label htmlFor=\"description\">Description</Label>\n\t\t\t\t<Textarea\n\t\t\t\t\tid=\"description\"\n\t\t\t\t\tplaceholder=\"Optional description of this secret\"\n\t\t\t\t\tvalue={description}\n\t\t\t\t\tonChange={(e) => setDescription(e.target.value)}\n\t\t\t\t\trows={2}\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t<div className=\"flex justify-end gap-2\">\n\t\t\t\t<Button type=\"button\" variant=\"outline\" onClick={onCancel}>\n\t\t\t\t\tCancel\n\t\t\t\t</Button>\n\t\t\t\t<Button type=\"submit\" disabled={!key.trim() || !value.trim()}>\n\t\t\t\t\t{secret ? \"Update\" : \"Create\"} Secret\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t</form>\n\t);\n}\n","'use client'\n\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@mdxui/primitives'\nimport type { VaultDeleteDialogProps } from './types'\n\n/**\n * Confirmation dialog for deleting vault credentials\n *\n * @example\n * ```tsx\n * <VaultDeleteDialog\n * isOpen={deleteDialogOpen}\n * onClose={() => setDeleteDialogOpen(false)}\n * itemName=\"OpenAI\"\n * onConfirm={handleDelete}\n * />\n * ```\n */\nexport function VaultDeleteDialog({ isOpen, onClose, itemName, onConfirm }: VaultDeleteDialogProps) {\n return (\n <Dialog open={isOpen} onOpenChange={onClose}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Delete Credentials</DialogTitle>\n <DialogDescription>\n Are you sure you want to delete credentials for {itemName}? This action cannot be undone.\n </DialogDescription>\n </DialogHeader>\n <DialogFooter>\n <Button variant=\"outline\" onClick={onClose}>\n Cancel\n </Button>\n <Button variant=\"destructive\" onClick={onConfirm}>\n Delete\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\n","'use client'\n\nimport { Button } from '@mdxui/primitives'\nimport { Lock } from 'lucide-react'\nimport type { VaultEmptyStateProps } from './types'\n\n/**\n * Empty state component shown when the vault has no credentials\n *\n * @example\n * ```tsx\n * <VaultEmptyState onAddCredential={() => setAddModalOpen(true)} />\n * ```\n */\nexport function VaultEmptyState({ onAddCredential }: VaultEmptyStateProps) {\n return (\n <div className=\"flex flex-col items-center justify-center rounded-md border border-dashed py-24 px-4 text-center\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-muted mb-4\">\n <Lock className=\"h-6 w-6 text-muted-foreground\" />\n </div>\n <h3 className=\"text-lg font-semibold mb-2\">No saved credentials</h3>\n <p className=\"text-sm text-muted-foreground mb-6 max-w-md\">\n Add API keys and account credentials for your agents to use securely.\n </p>\n <Button onClick={onAddCredential}>Add Credential</Button>\n </div>\n )\n}\n","'use client'\n\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Input,\n Label,\n} from '@mdxui/primitives'\nimport { Key } from 'lucide-react'\nimport { useState } from 'react'\nimport type { VaultInputModalProps } from './types'\n\n/**\n * Modal for entering or rotating vault credentials\n *\n * Renders input fields based on the integration's field configuration.\n * Supports both creating new credentials and rotating existing ones.\n *\n * @example\n * ```tsx\n * <VaultInputModal\n * isOpen={modalOpen}\n * onClose={() => setModalOpen(false)}\n * mode=\"create\"\n * integration={{\n * id: 'openai',\n * name: 'OpenAI',\n * logoUrl: '...',\n * fields: [{ key: 'api_key', label: 'API Key', type: 'password', required: true }]\n * }}\n * onSave={(credentials) => saveCredentials(credentials)}\n * />\n * ```\n */\nexport function VaultInputModal({\n isOpen,\n onClose,\n mode,\n integration,\n onSave,\n}: VaultInputModalProps) {\n const [values, setValues] = useState<Record<string, string>>({})\n const [loading, setLoading] = useState(false)\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault()\n setLoading(true)\n try {\n await onSave(values)\n setValues({})\n onClose()\n } catch (error) {\n console.error('Failed to save credentials:', error)\n } finally {\n setLoading(false)\n }\n }\n\n const handleClose = () => {\n setValues({})\n onClose()\n }\n\n if (!integration) return null\n\n const isValid = integration.fields.filter((f) => f.required).every((f) => values[f.key]?.trim())\n\n return (\n <Dialog open={isOpen} onOpenChange={handleClose}>\n <DialogContent>\n <DialogHeader>\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-md bg-white overflow-hidden p-1 border border-border\">\n {integration.logoUrl ? (\n <img\n src={integration.logoUrl}\n alt={integration.name}\n width={32}\n height={32}\n className=\"h-full w-full object-contain rounded-sm\"\n />\n ) : (\n <Key className=\"h-5 w-5 text-muted-foreground\" />\n )}\n </div>\n <DialogTitle>\n {mode === 'create' ? 'Add' : 'Rotate'} {integration.name} Credentials\n </DialogTitle>\n </div>\n </DialogHeader>\n <form onSubmit={handleSubmit}>\n <div className=\"grid gap-4 py-4\">\n {integration.fields.map((field) => (\n <div key={field.key} className=\"grid gap-2\">\n <Label htmlFor={field.key}>\n {field.label}\n {field.required && <span className=\"text-destructive\">*</span>}\n </Label>\n <Input\n id={field.key}\n type={field.type}\n placeholder={field.placeholder}\n value={values[field.key] || ''}\n onChange={(e) =>\n setValues((prev) => ({\n ...prev,\n [field.key]: e.target.value,\n }))\n }\n required={field.required}\n />\n </div>\n ))}\n </div>\n <DialogFooter>\n <Button type=\"button\" variant=\"outline\" onClick={handleClose}>\n Cancel\n </Button>\n <Button type=\"submit\" disabled={loading || !isValid}>\n {loading ? 'Saving...' : 'Save'}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n )\n}\n","'use client'\n\nimport {\n Button,\n Card,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '@mdxui/primitives'\nimport { Key, MoreVertical } from 'lucide-react'\nimport type { VaultItemCardProps } from './types'\n\nfunction formatDate(date: Date): string {\n return date.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n })\n}\n\n/**\n * Card component displaying a single vault credential item\n *\n * Shows the integration logo/icon, name, and creation/rotation date.\n * Provides a dropdown menu with rotate and delete actions.\n *\n * @example\n * ```tsx\n * <VaultItemCard\n * id=\"1\"\n * name=\"OpenAI\"\n * logoUrl=\"https://...\"\n * createdAt={new Date('2024-01-01')}\n * updatedAt={new Date('2024-06-01')}\n * onRotate={(id) => console.log('Rotate', id)}\n * onDelete={(id) => console.log('Delete', id)}\n * />\n * ```\n */\nexport function VaultItemCard({\n id,\n name,\n logoUrl,\n createdAt,\n updatedAt,\n onRotate,\n onDelete,\n}: VaultItemCardProps) {\n const wasRotated = updatedAt.getTime() !== createdAt.getTime()\n\n return (\n <Card noPadding className=\"p-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-md bg-white overflow-hidden p-1 border border-border\">\n {logoUrl ? (\n <img\n src={logoUrl}\n alt={name}\n width={32}\n height={32}\n className=\"h-full w-full object-contain rounded-sm\"\n />\n ) : (\n <Key className=\"h-5 w-5 text-muted-foreground\" />\n )}\n </div>\n <div>\n <h4 className=\"text-sm font-medium\">{name}</h4>\n <p className=\"text-xs text-muted-foreground\">\n {wasRotated ? `Rotated: ${formatDate(updatedAt)}` : `Created: ${formatDate(createdAt)}`}\n </p>\n </div>\n </div>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"icon-sm\">\n <MoreVertical className=\"h-4 w-4\" />\n <span className=\"sr-only\">Open menu</span>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem onClick={() => onRotate(id)}>Rotate</DropdownMenuItem>\n <DropdownMenuItem\n className=\"text-destructive focus:text-destructive\"\n onClick={() => onDelete(id)}\n >\n Delete\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </Card>\n )\n}\n","'use client'\n\nimport { useState } from 'react'\nimport type { VaultItem, VaultListProps, VaultField } from './types'\nimport { VaultDeleteDialog } from './vault-delete-dialog'\nimport { VaultEmptyState } from './vault-empty-state'\nimport { VaultInputModal } from './vault-input-modal'\nimport { VaultItemCard } from './vault-item-card'\n\n/**\n * Default fields for unknown integrations\n */\nconst defaultFields: VaultField[] = [\n { key: 'api_key', label: 'API Key', type: 'password', required: true }\n]\n\n/**\n * Main vault list component that displays stored credentials\n *\n * Includes the list view, delete confirmation dialog, and credential\n * input modal for rotating credentials. Shows an empty state when\n * no credentials are stored.\n *\n * @example\n * ```tsx\n * <VaultList\n * items={vaultItems}\n * onRotate={async (id, creds) => await rotateCredentials(id, creds)}\n * onDelete={async (id) => await deleteCredentials(id)}\n * onOpenAddModal={() => setAddModalOpen(true)}\n * getIntegrationFields={(id) => integrationFields[id]}\n * />\n * ```\n */\nexport function VaultList({\n items,\n onRotate,\n onDelete,\n onOpenAddModal,\n getIntegrationFields,\n}: VaultListProps) {\n const [deleteDialogOpen, setDeleteDialogOpen] = useState(false)\n const [inputModalOpen, setInputModalOpen] = useState(false)\n const [selectedItem, setSelectedItem] = useState<VaultItem | null>(null)\n const [modalMode, setModalMode] = useState<'create' | 'rotate'>('create')\n\n const handleRotate = (id: string) => {\n const item = items.find((i) => i.id === id)\n if (!item) return\n\n setSelectedItem(item)\n setModalMode('rotate')\n setInputModalOpen(true)\n }\n\n const handleDeleteClick = (id: string) => {\n const item = items.find((i) => i.id === id)\n if (!item) return\n\n setSelectedItem(item)\n setDeleteDialogOpen(true)\n }\n\n const handleConfirmDelete = async () => {\n if (!selectedItem) return\n\n await onDelete(selectedItem.id)\n setDeleteDialogOpen(false)\n setSelectedItem(null)\n }\n\n const handleSave = async (credentials: Record<string, string>) => {\n if (modalMode === 'rotate' && selectedItem) {\n await onRotate(selectedItem.id, credentials)\n }\n setInputModalOpen(false)\n setSelectedItem(null)\n }\n\n const getIntegrationForModal = () => {\n if (!selectedItem) return undefined\n\n const fields = getIntegrationFields\n ? getIntegrationFields(selectedItem.integrationId)\n : defaultFields\n\n return {\n id: selectedItem.integrationId,\n name: selectedItem.name,\n logoUrl: selectedItem.logoUrl,\n fields,\n }\n }\n\n if (items.length === 0) {\n return <VaultEmptyState onAddCredential={onOpenAddModal} />\n }\n\n return (\n <>\n <div className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-3\">\n {items.map((item) => (\n <VaultItemCard\n key={item.id}\n id={item.id}\n name={item.name}\n logoUrl={item.logoUrl}\n createdAt={item.createdAt}\n updatedAt={item.updatedAt}\n onRotate={handleRotate}\n onDelete={handleDeleteClick}\n />\n ))}\n </div>\n\n <VaultDeleteDialog\n isOpen={deleteDialogOpen}\n onClose={() => {\n setDeleteDialogOpen(false)\n setSelectedItem(null)\n }}\n itemName={selectedItem?.name || ''}\n onConfirm={handleConfirmDelete}\n />\n\n <VaultInputModal\n isOpen={inputModalOpen}\n onClose={() => {\n setInputModalOpen(false)\n setSelectedItem(null)\n }}\n mode={modalMode}\n integration={getIntegrationForModal()}\n onSave={handleSave}\n />\n </>\n )\n}\n","'use client'\n\nimport { useAuth } from '@workos-inc/authkit-react'\nimport type { ReactNode, ButtonHTMLAttributes } from 'react'\n\nexport interface SignInButtonProps\n extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'onClick'> {\n /** Button content (defaults to \"Sign In\") */\n children?: ReactNode\n /** Custom onClick handler (in addition to signIn) */\n onSignIn?: () => void\n}\n\n/**\n * Sign In Button\n *\n * A simple button that triggers the WorkOS AuthKit sign-in flow.\n *\n * @example\n * ```tsx\n * import { SignInButton } from '@mdxui/auth'\n *\n * function Header() {\n * return (\n * <nav>\n * <SignInButton />\n * </nav>\n * )\n * }\n * ```\n *\n * @example\n * ```tsx\n * // With custom styling\n * <SignInButton className=\"bg-blue-500 text-white px-4 py-2 rounded\">\n * Get Started\n * </SignInButton>\n * ```\n */\nexport function SignInButton({\n children = 'Sign In',\n onSignIn,\n className,\n disabled,\n ...props\n}: SignInButtonProps) {\n const { signIn, isLoading } = useAuth()\n\n const handleClick = () => {\n onSignIn?.()\n signIn()\n }\n\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={disabled || isLoading}\n className={\n className ??\n 'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-[var(--radius-md)] text-sm font-medium transition-colors bg-primary text-primary-foreground hover:bg-primary/90 h-10 px-4 disabled:opacity-50 disabled:pointer-events-none'\n }\n {...props}\n >\n {children}\n </button>\n )\n}\n","'use client'\n\nimport { useAuth } from '@workos-inc/authkit-react'\nimport type { ReactNode, ButtonHTMLAttributes } from 'react'\n\nexport interface SignOutButtonProps\n extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'onClick'> {\n /** Button content (defaults to \"Sign Out\") */\n children?: ReactNode\n /** Custom onClick handler (in addition to signOut) */\n onSignOut?: () => void\n}\n\n/**\n * Sign Out Button\n *\n * A simple button that triggers the WorkOS AuthKit sign-out flow.\n *\n * @example\n * ```tsx\n * import { SignOutButton } from '@mdxui/auth'\n *\n * function Header() {\n * const { user } = useAuth()\n *\n * if (!user) return null\n *\n * return (\n * <nav>\n * <span>{user.email}</span>\n * <SignOutButton />\n * </nav>\n * )\n * }\n * ```\n *\n * @example\n * ```tsx\n * // With custom styling\n * <SignOutButton className=\"text-red-500 underline\">\n * Log out\n * </SignOutButton>\n * ```\n */\nexport function SignOutButton({\n children = 'Sign Out',\n onSignOut,\n className,\n disabled,\n ...props\n}: SignOutButtonProps) {\n const { signOut, isLoading } = useAuth()\n\n const handleClick = () => {\n onSignOut?.()\n signOut()\n }\n\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={disabled || isLoading}\n className={\n className ??\n 'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-[var(--radius-md)] text-sm font-medium transition-colors bg-secondary text-secondary-foreground hover:bg-secondary/80 h-10 px-4 disabled:opacity-50 disabled:pointer-events-none'\n }\n {...props}\n >\n {children}\n </button>\n )\n}\n","'use client'\n\nimport { useAuth } from '@workos-inc/authkit-react'\nimport type { ReactNode } from 'react'\n\nexport interface UserMenuProps {\n /** Custom render function for the trigger button */\n renderTrigger?: (props: {\n user: NonNullable<ReturnType<typeof useAuth>['user']>\n displayName: string\n initials: string\n }) => ReactNode\n /** Custom render function for the menu content */\n renderMenu?: (props: {\n user: NonNullable<ReturnType<typeof useAuth>['user']>\n displayName: string\n initials: string\n signOut: () => void\n }) => ReactNode\n /** Additional CSS class */\n className?: string\n}\n\n/**\n * Get initials from a name (first letter of first and last name)\n */\nfunction getInitials(name: string | undefined): string {\n if (!name) return '?'\n const parts = name.trim().split(/\\s+/)\n if (parts.length === 1) return parts[0].charAt(0).toUpperCase()\n return (\n parts[0].charAt(0) + parts[parts.length - 1].charAt(0)\n ).toUpperCase()\n}\n\n/**\n * User Menu Component\n *\n * A customizable user menu that displays user info and provides sign-out functionality.\n * This is a headless component - you provide the render functions to control the UI.\n *\n * For a pre-built menu with @mdxui/primitives, use the UserMenu from @mdxui/do or @mdxui/cockpit.\n *\n * @example\n * ```tsx\n * import { UserMenu } from '@mdxui/auth'\n *\n * function Header() {\n * return (\n * <UserMenu\n * renderTrigger={({ user, initials }) => (\n * <button className=\"flex items-center gap-2\">\n * <div className=\"w-8 h-8 rounded-full bg-gray-200 flex items-center justify-center\">\n * {user.profilePictureUrl ? (\n * <img src={user.profilePictureUrl} alt=\"\" className=\"rounded-full\" />\n * ) : (\n * initials\n * )}\n * </div>\n * <span>{user.firstName}</span>\n * </button>\n * )}\n * renderMenu={({ user, signOut }) => (\n * <div className=\"dropdown-menu\">\n * <div className=\"p-2\">\n * <p>{user.email}</p>\n * </div>\n * <button onClick={signOut}>Sign Out</button>\n * </div>\n * )}\n * />\n * )\n * }\n * ```\n *\n * @example\n * ```tsx\n * // Simple usage with just a sign-out button\n * <UserMenu\n * renderTrigger={({ displayName }) => <span>{displayName}</span>}\n * renderMenu={({ signOut }) => <button onClick={signOut}>Sign Out</button>}\n * />\n * ```\n */\nexport function UserMenu({ renderTrigger, renderMenu, className }: UserMenuProps) {\n const { user, signOut, isLoading } = useAuth()\n\n if (isLoading) {\n return (\n <div className={className}>\n <div className=\"flex items-center gap-2 p-2\">\n <div className=\"h-8 w-8 animate-pulse rounded-full bg-muted\" />\n </div>\n </div>\n )\n }\n\n if (!user) {\n return null\n }\n\n const displayName = user.firstName\n ? `${user.firstName}${user.lastName ? ` ${user.lastName}` : ''}`\n : user.email\n\n const initials = getInitials(\n user.firstName ? `${user.firstName} ${user.lastName ?? ''}` : user.email\n )\n\n const triggerProps = { user, displayName, initials }\n const menuProps = { user, displayName, initials, signOut }\n\n // If no render functions provided, render a basic menu\n if (!renderTrigger && !renderMenu) {\n return (\n <div className={className}>\n <div className=\"flex items-center gap-2 p-2\">\n <div className=\"h-8 w-8 rounded-full bg-muted flex items-center justify-center text-sm font-medium\">\n {user.profilePictureUrl ? (\n <img\n src={user.profilePictureUrl}\n alt={displayName}\n className=\"h-full w-full rounded-full object-cover\"\n />\n ) : (\n initials\n )}\n </div>\n <div className=\"text-sm\">\n <p className=\"font-medium\">{displayName}</p>\n <p className=\"text-muted-foreground text-xs\">{user.email}</p>\n </div>\n <button\n type=\"button\"\n onClick={() => signOut()}\n className=\"ml-auto text-sm text-muted-foreground hover:text-foreground\"\n >\n Sign out\n </button>\n </div>\n </div>\n )\n }\n\n return (\n <div className={className}>\n {renderTrigger?.(triggerProps)}\n {renderMenu?.(menuProps)}\n </div>\n )\n}\n","'use client'\n\nimport { useAuth } from '@workos-inc/authkit-react'\nimport { OrganizationSwitcher } from '@workos-inc/widgets'\nimport type { ReactNode } from 'react'\n\nexport interface TeamSwitcherProps {\n /**\n * Render function for the wrapper when in an organization.\n * The OrganizationSwitcher widget will be rendered inside this wrapper.\n */\n renderWrapper?: (children: ReactNode) => ReactNode\n /**\n * Render function for when there is no organization.\n * If not provided, returns null.\n */\n renderNoOrganization?: () => ReactNode\n /** CSS class name for the organization switcher wrapper */\n className?: string\n}\n\n/**\n * TeamSwitcher component that uses WorkOS authentication.\n *\n * Shows the WorkOS OrganizationSwitcher widget when authenticated with an organization,\n * or a custom \"no organization\" component when not.\n *\n * This is a headless component - you provide render functions for the UI.\n * For a pre-built sidebar menu version, use your design system's sidebar components.\n *\n * @example\n * ```tsx\n * import { TeamSwitcher } from '@mdxui/auth'\n * import { SidebarMenu, SidebarMenuItem } from '@mdxui/primitives/sidebar'\n * import { Building2 } from 'lucide-react'\n *\n * function MyTeamSwitcher() {\n * return (\n * <TeamSwitcher\n * renderWrapper={(children) => (\n * <SidebarMenu>\n * <SidebarMenuItem>\n * <div className=\"organization-switcher-wrapper\">\n * {children}\n * </div>\n * </SidebarMenuItem>\n * </SidebarMenu>\n * )}\n * renderNoOrganization={() => (\n * <SidebarMenu>\n * <SidebarMenuItem>\n * <div className=\"flex items-center gap-2\">\n * <Building2 className=\"size-4\" />\n * <span>No Organization</span>\n * </div>\n * </SidebarMenuItem>\n * </SidebarMenu>\n * )}\n * />\n * )\n * }\n * ```\n *\n * @example\n * ```tsx\n * // Simple usage without custom rendering\n * <TeamSwitcher className=\"my-org-switcher\" />\n * ```\n */\nexport function TeamSwitcher({\n renderWrapper,\n renderNoOrganization,\n className,\n}: TeamSwitcherProps) {\n const { getAccessToken, switchToOrganization, organizationId } = useAuth()\n\n // No organization - show custom component or null\n if (!organizationId) {\n return renderNoOrganization?.() ?? null\n }\n\n // Adapt switchToOrganization to the widget's expected signature\n const handleSwitchOrganization = ({\n organizationId,\n }: {\n organizationId: string\n }) => {\n return switchToOrganization({ organizationId })\n }\n\n // Render the OrganizationSwitcher widget with required wrapper class for styling\n const widget = (\n <div className={`organization-switcher-wrapper ${className ?? ''}`}>\n <OrganizationSwitcher\n authToken={getAccessToken}\n switchToOrganization={handleSwitchOrganization}\n />\n </div>\n )\n\n // Wrap in custom wrapper if provided\n return renderWrapper ? renderWrapper(widget) : widget\n}\n","'use client'\n\n/**\n * Re-export useAuth from WorkOS AuthKit\n *\n * This hook provides access to the authentication state and methods:\n * - user: The authenticated user object\n * - isLoading: Whether auth state is being loaded\n * - signIn: Function to initiate sign in\n * - signOut: Function to sign out\n * - getAccessToken: Function to get the current access token\n * - organizationId: Current organization ID (if in org context)\n * - permissions: User's permissions array\n *\n * @example\n * ```tsx\n * import { useAuth } from '@mdxui/auth'\n *\n * function MyComponent() {\n * const { user, isLoading, signIn, signOut, getAccessToken } = useAuth()\n *\n * if (isLoading) return <div>Loading...</div>\n * if (!user) return <button onClick={() => signIn()}>Sign In</button>\n *\n * return (\n * <div>\n * <p>Hello, {user.firstName}!</p>\n * <button onClick={() => signOut()}>Sign Out</button>\n * </div>\n * )\n * }\n * ```\n */\nexport { useAuth } from '@workos-inc/authkit-react'\n","'use client'\n\nimport { useCallback, useEffect, useState } from 'react'\nimport type { UseWidgetTokenOptions, UseWidgetTokenResult } from '../types/auth'\n\n/**\n * Hook to fetch authorization tokens for WorkOS widgets\n *\n * Use this hook when you need to fetch widget tokens from a backend endpoint,\n * typically for server-side auth scenarios. For client-side AuthKit usage,\n * you can use `getAccessToken` from `useAuth()` directly with widgets.\n *\n * @param options - Options for token fetching\n * @param options.widget - The widget type (user-profile, user-security, api-keys, etc.)\n * @param options.organizationId - Optional organization context\n * @param options.endpoint - Custom endpoint (default: /api/workos/widget-token)\n * @returns Token state and refetch function\n *\n * @example\n * ```tsx\n * // Server-side token fetching (via backend endpoint)\n * const { token, loading, error } = useWidgetToken({\n * widget: 'user-profile',\n * })\n *\n * if (loading) return <Spinner />\n * if (error) return <Error message={error} />\n * return <UserProfile authToken={token!} />\n * ```\n *\n * @example\n * ```tsx\n * // Client-side AuthKit (recommended - no backend needed)\n * import { useAuth } from '@mdxui/auth'\n * import { UserProfile } from '@mdxui/auth/widgets'\n *\n * const { getAccessToken } = useAuth()\n * return <UserProfile authToken={getAccessToken} />\n * ```\n */\nexport function useWidgetToken({\n widget,\n organizationId,\n endpoint = '/api/workos/widget-token',\n}: UseWidgetTokenOptions): UseWidgetTokenResult {\n const [token, setToken] = useState<string | null>(null)\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n\n const fetchToken = useCallback(async () => {\n try {\n setLoading(true)\n setError(null)\n\n const params = new URLSearchParams({ widget })\n if (organizationId) {\n params.set('organizationId', organizationId)\n }\n\n const response = await fetch(`${endpoint}?${params}`)\n const data = await response.json()\n\n if (!response.ok) {\n throw new Error(data.error || 'Failed to fetch token')\n }\n\n setToken(data.token)\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Token fetch failed')\n } finally {\n setLoading(false)\n }\n }, [widget, organizationId, endpoint])\n\n useEffect(() => {\n fetchToken()\n }, [fetchToken])\n\n return { token, loading, error, refetch: fetchToken }\n}\n","'use client'\n\nimport { useCallback, useMemo } from 'react'\nimport { useVaultContext, useVaultContextOptional } from '../providers/vault-provider'\nimport type { VaultItem, VaultField } from '../vault/types'\n\n/**\n * Result from useVault hook\n */\nexport interface UseVaultResult {\n /** List of vault items */\n items: VaultItem[]\n /** Whether the vault is loading */\n loading: boolean\n /** Error message if any */\n error: string | null\n /** Whether a vault client is connected */\n isConnected: boolean\n /** Reload vault items from the backend */\n reload: () => Promise<void>\n /** Create a new vault item */\n create: (integrationId: string, credentials: Record<string, string>) => Promise<void>\n /** Rotate credentials for an existing item */\n rotate: (id: string, credentials: Record<string, string>) => Promise<void>\n /** Delete a vault item */\n remove: (id: string) => Promise<void>\n /** Get field configuration for an integration */\n getIntegrationFields: (integrationId: string) => VaultField[]\n /** Find an item by ID */\n findItem: (id: string) => VaultItem | undefined\n /** Find items by integration ID */\n findByIntegration: (integrationId: string) => VaultItem[]\n}\n\n/**\n * Hook to access vault state and operations\n *\n * Provides access to the vault context with helper methods for\n * common operations like finding items and managing credentials.\n *\n * Must be used within a VaultProvider.\n *\n * @example\n * ```tsx\n * import { useVault } from '@mdxui/auth'\n *\n * function VaultDashboard() {\n * const {\n * items,\n * loading,\n * create,\n * rotate,\n * remove,\n * findByIntegration,\n * } = useVault()\n *\n * const openaiItems = findByIntegration('openai')\n *\n * const handleCreate = async () => {\n * await create('github', { personal_access_token: 'ghp_...' })\n * }\n *\n * if (loading) return <div>Loading...</div>\n *\n * return (\n * <ul>\n * {items.map(item => (\n * <li key={item.id}>{item.name}</li>\n * ))}\n * </ul>\n * )\n * }\n * ```\n */\nexport function useVault(): UseVaultResult {\n const context = useVaultContext()\n\n const findItem = useCallback(\n (id: string): VaultItem | undefined => {\n return context.items.find((item) => item.id === id)\n },\n [context.items]\n )\n\n const findByIntegration = useCallback(\n (integrationId: string): VaultItem[] => {\n return context.items.filter((item) => item.integrationId === integrationId)\n },\n [context.items]\n )\n\n return useMemo(\n () => ({\n items: context.items,\n loading: context.loading,\n error: context.error,\n isConnected: context.client !== null,\n reload: context.reload,\n create: context.createItem,\n rotate: context.rotateItem,\n remove: context.deleteItem,\n getIntegrationFields: context.getIntegrationFields,\n findItem,\n findByIntegration,\n }),\n [context, findItem, findByIntegration]\n )\n}\n\n/**\n * Optional vault hook that returns null if not within a VaultProvider\n *\n * Useful for components that can optionally integrate with the vault\n * when it's available.\n *\n * @example\n * ```tsx\n * function MaybeVaultComponent() {\n * const vault = useVaultOptional()\n *\n * if (!vault) {\n * return <div>Vault not available</div>\n * }\n *\n * return <VaultList items={vault.items} ... />\n * }\n * ```\n */\nexport function useVaultOptional(): UseVaultResult | null {\n const context = useVaultContextOptional()\n\n const findItem = useCallback(\n (id: string): VaultItem | undefined => {\n return context?.items.find((item) => item.id === id)\n },\n [context?.items]\n )\n\n const findByIntegration = useCallback(\n (integrationId: string): VaultItem[] => {\n return context?.items.filter((item) => item.integrationId === integrationId) ?? []\n },\n [context?.items]\n )\n\n if (!context) {\n return null\n }\n\n return {\n items: context.items,\n loading: context.loading,\n error: context.error,\n isConnected: context.client !== null,\n reload: context.reload,\n create: context.createItem,\n rotate: context.rotateItem,\n remove: context.deleteItem,\n getIntegrationFields: context.getIntegrationFields,\n findItem,\n findByIntegration,\n }\n}\n","/**\n * AuthUser Schema\n *\n * Extends mdxui's UserIdentitySchema with WorkOS-specific fields.\n * AuthUser is fully compatible with UserIdentity - it can be used\n * anywhere a UserIdentity is expected.\n */\n\nimport { z } from 'zod'\nimport { UserIdentitySchema } from 'mdxui/zod'\n\n/**\n * AuthUserSchema - Extended user identity for WorkOS AuthKit\n *\n * Extends UserIdentitySchema with WorkOS-specific fields like\n * verification status and timestamps.\n *\n * @example\n * ```tsx\n * import { AuthUserSchema } from '@mdxui/auth/schemas'\n *\n * const result = AuthUserSchema.safeParse(user)\n * if (result.success) {\n * console.log(result.data.emailVerified)\n * }\n * ```\n */\nexport const AuthUserSchema = UserIdentitySchema.extend({\n // Override to be more specific (WorkOS guarantees string ID)\n id: z.string().describe('User ID from WorkOS'),\n\n // WorkOS requires email (not optional like UserIdentity)\n email: z.string().email().describe('Email address'),\n\n // WorkOS-specific fields not in UserIdentity\n emailVerified: z.boolean().describe('Email verification status'),\n\n // Timestamps\n createdAt: z.string().datetime().describe('Account creation timestamp'),\n updatedAt: z.string().datetime().describe('Last update timestamp'),\n lastSignInAt: z\n .string()\n .datetime()\n .nullable()\n .optional()\n .describe('Last sign-in timestamp'),\n})\n\n/**\n * AuthUser type inferred from schema\n *\n * This type is compatible with UserIdentity - an AuthUser can be\n * assigned to a variable of type UserIdentity.\n */\nexport type AuthUser = z.infer<typeof AuthUserSchema>\n","/**\n * AuthSession Schema\n *\n * Extends mdxui's SessionSchema with WorkOS-specific fields.\n */\n\nimport { z } from 'zod'\nimport { SessionSchema } from 'mdxui/zod'\n\n/**\n * ImpersonatorSchema - Info about admin impersonating a user\n */\nexport const ImpersonatorSchema = z.object({\n /** Impersonator's email address */\n email: z.string().email().describe(\"Impersonator's email address\"),\n /** Reason for impersonation */\n reason: z.string().optional().describe('Reason for impersonation'),\n})\n\nexport type Impersonator = z.infer<typeof ImpersonatorSchema>\n\n/**\n * AuthSessionSchema - Extended session for WorkOS AuthKit\n *\n * Extends SessionSchema with WorkOS-specific fields like\n * impersonation support.\n *\n * @example\n * ```tsx\n * import { AuthSessionSchema } from '@mdxui/auth/schemas'\n *\n * const result = AuthSessionSchema.safeParse(session)\n * if (result.success && result.data.impersonator) {\n * console.log('Being impersonated by:', result.data.impersonator.email)\n * }\n * ```\n */\nexport const AuthSessionSchema = SessionSchema.extend({\n // Override userId to be string (WorkOS uses string IDs)\n userId: z.string().describe('User ID'),\n\n // WorkOS-specific: impersonation support\n impersonator: ImpersonatorSchema.optional().describe(\n 'Impersonator info (if being impersonated)',\n ),\n})\n\n/**\n * AuthSession type inferred from schema\n */\nexport type AuthSession = z.infer<typeof AuthSessionSchema>\n","/**\n * AuthOrganization Schema\n *\n * Organization type for WorkOS AuthKit.\n */\n\nimport { z } from 'zod'\n\n/**\n * AuthOrganizationSchema - WorkOS organization\n *\n * Represents an organization/workspace in WorkOS.\n *\n * @example\n * ```tsx\n * import { AuthOrganizationSchema } from '@mdxui/auth/schemas'\n *\n * const result = AuthOrganizationSchema.safeParse(org)\n * if (result.success) {\n * console.log('Organization:', result.data.name)\n * }\n * ```\n */\nexport const AuthOrganizationSchema = z.object({\n /** Organization ID */\n id: z.string().describe('Organization ID'),\n /** Organization display name */\n name: z.string().describe('Organization name'),\n /** Organization slug (URL-friendly identifier) */\n slug: z.string().optional().describe('Organization slug'),\n /** Organization logo URL */\n logoUrl: z.string().url().optional().describe('Organization logo URL'),\n /** Whether the organization is active */\n active: z.boolean().optional().describe('Whether organization is active'),\n /** Custom domains for the organization */\n domains: z\n .array(z.string())\n .optional()\n .describe('Custom domains for the organization'),\n /** Additional metadata */\n metadata: z\n .record(z.string(), z.unknown())\n .optional()\n .describe('Additional metadata'),\n})\n\n/**\n * AuthOrganization type inferred from schema\n */\nexport type AuthOrganization = z.infer<typeof AuthOrganizationSchema>\n","/**\n * Provider Props Schemas\n *\n * Zod schemas for authentication provider component props.\n */\n\nimport { z } from 'zod'\n\n/**\n * IdentityProviderPropsSchema - Props for IdentityProvider component\n */\nexport const IdentityProviderPropsSchema = z.object({\n /** WorkOS client ID */\n clientId: z.string().describe('WorkOS client ID'),\n /** Optional API hostname override */\n apiHostname: z.string().optional().describe('Optional API hostname override'),\n /** Enable dev mode for local development */\n devMode: z.boolean().optional().describe('Enable dev mode for local development'),\n /** Redirect URI after authentication */\n redirectUri: z.string().url().optional().describe('Redirect URI after authentication'),\n /** Note: onRedirectCallback and children are React-specific, not in schema */\n})\n\nexport type IdentityProviderPropsSchemaType = z.infer<typeof IdentityProviderPropsSchema>\n\n/**\n * UnauthenticatedActionSchema - What to do when unauthenticated\n */\nexport const UnauthenticatedActionSchema = z.enum(['landing', 'redirect', 'allow'])\n\nexport type UnauthenticatedAction = z.infer<typeof UnauthenticatedActionSchema>\n\n/**\n * AuthGatePropsSchema - Props for AuthGate component\n */\nexport const AuthGatePropsSchema = z.object({\n /** Whether authentication is required (default: true) */\n required: z.boolean().optional().describe('Whether authentication is required'),\n /** What to do when unauthenticated */\n onUnauthenticated: UnauthenticatedActionSchema.optional().describe(\n 'What to do when unauthenticated',\n ),\n /** URL to redirect to when unauthenticated (if onUnauthenticated is \"redirect\") */\n redirectUrl: z\n .string()\n .url()\n .optional()\n .describe('URL to redirect to when unauthenticated'),\n /** Note: children, loadingComponent, landingComponent are React-specific */\n})\n\nexport type AuthGatePropsSchemaType = z.infer<typeof AuthGatePropsSchema>\n\n/**\n * AppearanceSchema - Theme appearance mode\n */\nexport const AppearanceSchema = z.enum(['light', 'dark', 'inherit'])\n\nexport type Appearance = z.infer<typeof AppearanceSchema>\n\n/**\n * RadiusSchema - Border radius style\n */\nexport const RadiusSchema = z.enum(['none', 'small', 'medium', 'large', 'full'])\n\nexport type Radius = z.infer<typeof RadiusSchema>\n\n/**\n * ScalingSchema - Scaling factor\n */\nexport const ScalingSchema = z.enum(['90%', '95%', '100%', '105%', '110%'])\n\nexport type Scaling = z.infer<typeof ScalingSchema>\n\n/**\n * WidgetsProviderPropsSchema - Props for WidgetsProvider component\n */\nexport const WidgetsProviderPropsSchema = z.object({\n /** Theme appearance mode */\n appearance: AppearanceSchema.optional().describe('Theme appearance mode'),\n /** Border radius style */\n radius: RadiusSchema.optional().describe('Border radius style'),\n /** Scaling factor */\n scaling: ScalingSchema.optional().describe('Scaling factor'),\n /** Note: children is React-specific, not in schema */\n})\n\nexport type WidgetsProviderPropsSchemaType = z.infer<typeof WidgetsProviderPropsSchema>\n","/**\n * Widget Props Schemas\n *\n * Zod schemas for WorkOS widget component props.\n */\n\nimport { z } from 'zod'\n\n/**\n * AuthTokenSchema - Auth token type\n *\n * Can be a string or a function that returns a Promise<string>.\n * Functions are represented as 'function' string in schema validation\n * since Zod can't validate function signatures.\n */\nexport const AuthTokenSchema = z.union([\n z.string().describe('Static auth token'),\n z.literal('function').describe('Token getter function'),\n])\n\n// Note: The actual TypeScript type is more specific\nexport type AuthTokenSchemaType = z.infer<typeof AuthTokenSchema>\n\n/**\n * BaseWidgetPropsSchema - Common props for all widget wrappers\n */\nexport const BaseWidgetPropsSchema = z.object({\n /** Auth token for the widget (string or getter function) */\n authToken: z.string().describe('Auth token for the widget'),\n /** CSS class name */\n className: z.string().optional().describe('CSS class name'),\n})\n\nexport type BaseWidgetPropsSchemaType = z.infer<typeof BaseWidgetPropsSchema>\n\n/**\n * OrganizationWidgetPropsSchema - Props for widgets that support organization context\n */\nexport const OrganizationWidgetPropsSchema = BaseWidgetPropsSchema.extend({\n /** Organization ID for org-scoped widgets */\n organizationId: z\n .string()\n .optional()\n .describe('Organization ID for org-scoped widgets'),\n})\n\nexport type OrganizationWidgetPropsSchemaType = z.infer<\n typeof OrganizationWidgetPropsSchema\n>\n\n/**\n * UseWidgetTokenOptionsSchema - Props for useWidgetToken hook\n */\nexport const UseWidgetTokenOptionsSchema = z.object({\n /** Widget type to fetch token for */\n widget: z.string().describe('Widget type to fetch token for'),\n /** Organization ID for org-scoped widgets */\n organizationId: z\n .string()\n .optional()\n .describe('Organization ID for org-scoped widgets'),\n /** Custom endpoint for fetching widget token */\n endpoint: z\n .string()\n .url()\n .optional()\n .describe('Custom endpoint for fetching widget token'),\n})\n\nexport type UseWidgetTokenOptionsSchemaType = z.infer<typeof UseWidgetTokenOptionsSchema>\n\n/**\n * UseWidgetTokenResultSchema - Result from useWidgetToken hook\n */\nexport const UseWidgetTokenResultSchema = z.object({\n /** The fetched token */\n token: z.string().nullable().describe('The fetched token'),\n /** Whether token is being fetched */\n loading: z.boolean().describe('Whether token is being fetched'),\n /** Error message if fetch failed */\n error: z.string().nullable().describe('Error message if fetch failed'),\n /** Note: refetch function is React-specific, not in schema */\n})\n\nexport type UseWidgetTokenResultSchemaType = z.infer<typeof UseWidgetTokenResultSchema>\n"],"mappings":"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","names":["jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","Button","Input","Select","SelectContent","SelectItem","SelectTrigger","SelectValue","React","jsx","jsxs","jsx","jsxs","Button","Input","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","Button","Dialog","DialogContent","DialogHeader","DialogTitle","jsx","jsxs","Button","jsx","jsxs","Button","Dialog","DialogContent","DialogFooter","DialogHeader","DialogTitle","Input","Label","useState","jsx","jsxs","Button","Card","Key","jsx","jsxs","useState","Fragment","jsx","jsxs","defaultFields","useState","useAuth","jsx","useAuth","jsx","useAuth","jsx","jsxs","useAuth","OrganizationSwitcher","jsx","organizationId","useAuth","useEffect","useState","useCallback","useMemo","useCallback","useMemo","z","z","z","z"]}
1
+ {"version":3,"sources":["../src/providers/identity-provider.tsx","../src/providers/widgets-provider.tsx","../src/providers/auth-gate.tsx","../src/providers/vault-provider.tsx","../src/widgets/user-profile.tsx","../src/widgets/user-security.tsx","../src/widgets/user-sessions.tsx","../src/widgets/api-keys.tsx","../src/widgets/users-management.tsx","../src/widgets/pipes.tsx","../src/widgets/organization-switcher.tsx","../src/vault/secrets-manager/secrets-manager.tsx","../src/vault/secrets-manager/secret-form.tsx","../src/vault/vault-delete-dialog.tsx","../src/vault/vault-empty-state.tsx","../src/vault/vault-input-modal.tsx","../src/vault/vault-item-card.tsx","../src/vault/vault-list.tsx","../src/components/sign-in-button.tsx","../src/components/sign-out-button.tsx","../src/components/user-menu.tsx","../src/components/team-switcher.tsx","../src/hooks/use-auth.ts","../src/hooks/use-widget-token.ts","../src/hooks/use-vault.ts","../src/schemas/auth-user.ts","../src/schemas/auth-session.ts","../src/schemas/auth-organization.ts","../src/schemas/provider-props.ts","../src/schemas/widget-props.ts","../src/shell/config-context.tsx","../src/shell/route-presets.ts","../src/shell/components/breadcrumbs.tsx","../src/shell/components/sidebar-org-switcher.tsx","../src/shell/components/widget-error-boundary.tsx","../src/shell/pages/profile-page.tsx","../src/shell/pages/security-page.tsx","../src/shell/pages/sessions-page.tsx","../src/shell/pages/api-keys-page.tsx","../src/shell/pages/team-page.tsx","../src/shell/pages/integrations-page.tsx","../src/shell/auth-shell.tsx","../src/shell/auth-shell-nav.tsx","../src/shell/auth-app.tsx","../src/shell/env-config.ts"],"sourcesContent":["'use client'\n\nimport { AuthKitProvider } from '@workos-inc/authkit-react'\nimport type { IdentityProviderProps } from '../types/auth'\nimport { WidgetsProvider } from './widgets-provider'\n\n/**\n * Identity provider that wraps your app with WorkOS AuthKit authentication.\n *\n * This provider sets up authentication context for your application and\n * automatically includes the WidgetsProvider for WorkOS widgets.\n *\n * @example\n * ```tsx\n * import { IdentityProvider } from '@mdxui/auth'\n *\n * function App() {\n * return (\n * <IdentityProvider\n * clientId=\"client_xxx\"\n * devMode={process.env.NODE_ENV === 'development'}\n * >\n * <YourApp />\n * </IdentityProvider>\n * )\n * }\n * ```\n *\n * @example\n * ```tsx\n * // With custom redirect URI\n * <IdentityProvider\n * clientId=\"client_xxx\"\n * redirectUri=\"https://app.example.com/dashboard\"\n * onRedirectCallback={() => {\n * // Custom callback after auth redirect\n * }}\n * >\n * <YourApp />\n * </IdentityProvider>\n * ```\n */\nexport function IdentityProvider({\n clientId,\n apiHostname,\n devMode,\n redirectUri,\n onRedirectCallback,\n children,\n}: IdentityProviderProps) {\n // Build redirect URI - defaults to current origin (no trailing slash)\n // Note: WorkOS AuthKit internally appends a trailing slash, so register\n // \"https://yourdomain.com/\" (with slash) in WorkOS dashboard\n const resolvedRedirectUri =\n redirectUri ??\n (typeof window !== 'undefined' ? window.location.origin : undefined)\n\n // Default redirect callback - clear auth params from URL\n const handleRedirectCallback =\n onRedirectCallback ??\n (() => {\n if (typeof window !== 'undefined') {\n const url = new URL(window.location.href)\n url.searchParams.delete('code')\n url.searchParams.delete('state')\n window.history.replaceState({}, '', url.pathname)\n }\n })\n\n return (\n <AuthKitProvider\n clientId={clientId}\n apiHostname={apiHostname}\n devMode={devMode}\n redirectUri={resolvedRedirectUri}\n onRedirectCallback={handleRedirectCallback}\n >\n <WidgetsProvider>{children}</WidgetsProvider>\n </AuthKitProvider>\n )\n}\n\n/**\n * Minimal identity provider without WidgetsProvider\n *\n * Use this if you want to set up widgets separately or don't need them.\n *\n * @example\n * ```tsx\n * import { IdentityProviderMinimal, WidgetsProvider } from '@mdxui/auth'\n *\n * function App() {\n * return (\n * <IdentityProviderMinimal clientId=\"client_xxx\">\n * <WidgetsProvider appearance=\"dark\">\n * <YourApp />\n * </WidgetsProvider>\n * </IdentityProviderMinimal>\n * )\n * }\n * ```\n */\nexport function IdentityProviderMinimal({\n clientId,\n apiHostname,\n devMode,\n redirectUri,\n onRedirectCallback,\n children,\n}: IdentityProviderProps) {\n const resolvedRedirectUri =\n redirectUri ??\n (typeof window !== 'undefined' ? window.location.origin : undefined)\n\n const handleRedirectCallback =\n onRedirectCallback ??\n (() => {\n if (typeof window !== 'undefined') {\n const url = new URL(window.location.href)\n url.searchParams.delete('code')\n url.searchParams.delete('state')\n window.history.replaceState({}, '', url.pathname)\n }\n })\n\n return (\n <AuthKitProvider\n clientId={clientId}\n apiHostname={apiHostname}\n devMode={devMode}\n redirectUri={resolvedRedirectUri}\n onRedirectCallback={handleRedirectCallback}\n >\n {children}\n </AuthKitProvider>\n )\n}\n","'use client'\n\nimport { WorkOsWidgets } from '@workos-inc/widgets'\nimport { useEffect, useState } from 'react'\nimport type { WidgetsProviderProps } from '../types/auth'\n\n/**\n * Hook to detect dark mode from document class or system preference\n *\n * @returns Object with isDark state and mounted flag\n *\n * @example\n * ```tsx\n * const { isDark, mounted } = useThemeDetection()\n * const appearance = mounted ? (isDark ? 'dark' : 'light') : 'inherit'\n * ```\n */\nexport function useThemeDetection() {\n const [mounted, setMounted] = useState(false)\n const [isDark, setIsDark] = useState(false)\n\n useEffect(() => {\n setMounted(true)\n\n const checkDarkMode = () => {\n const isDarkClass = document.documentElement.classList.contains('dark')\n const prefersDark = window.matchMedia(\n '(prefers-color-scheme: dark)'\n ).matches\n setIsDark(\n isDarkClass ||\n (!document.documentElement.classList.contains('light') && prefersDark)\n )\n }\n\n checkDarkMode()\n\n // Watch for class changes on html element\n const observer = new MutationObserver(checkDarkMode)\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class'],\n })\n\n // Watch for system preference changes\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)')\n mediaQuery.addEventListener('change', checkDarkMode)\n\n return () => {\n observer.disconnect()\n mediaQuery.removeEventListener('change', checkDarkMode)\n }\n }, [])\n\n return { isDark, mounted }\n}\n\n/**\n * Provider for WorkOS widgets with automatic theme detection\n *\n * Wraps children with WorkOsWidgets context and automatically detects\n * light/dark mode from document classes or system preference.\n *\n * @example\n * ```tsx\n * import { WidgetsProvider } from '@mdxui/auth'\n * import { UserProfile } from '@mdxui/auth/widgets'\n *\n * function App() {\n * return (\n * <WidgetsProvider>\n * <UserProfile authToken={getAccessToken} />\n * </WidgetsProvider>\n * )\n * }\n * ```\n *\n * @example\n * ```tsx\n * // With explicit theme\n * <WidgetsProvider appearance=\"dark\" radius=\"large\">\n * <UserProfile authToken={token} />\n * </WidgetsProvider>\n * ```\n */\nexport function WidgetsProvider({\n children,\n appearance,\n radius = 'medium',\n scaling = '100%',\n}: WidgetsProviderProps) {\n const { isDark, mounted } = useThemeDetection()\n\n // Use provided appearance, or auto-detect from theme\n // Use \"inherit\" until mounted to avoid hydration mismatch\n const resolvedAppearance =\n appearance ?? (mounted ? (isDark ? 'dark' : 'light') : 'inherit')\n\n // Note: Widgets always use api.workos.com - custom Authentication API domains\n // do NOT support widget endpoints. Only authentication uses custom domains.\n return (\n <WorkOsWidgets\n theme={{\n appearance: resolvedAppearance,\n radius,\n scaling,\n }}\n elements={{\n primaryButton: {\n variant: 'solid',\n },\n secondaryButton: {\n variant: 'outline',\n },\n }}\n >\n {children}\n </WorkOsWidgets>\n )\n}\n","'use client'\n\nimport { useEffect, useRef } from 'react'\nimport { useAuth } from '@workos-inc/authkit-react'\nimport type { AuthGateProps } from '../types/auth'\n\n/**\n * Default loading component shown while checking authentication\n */\nfunction DefaultLoadingComponent() {\n return (\n <div className=\"min-h-screen bg-background flex items-center justify-center\">\n <div className=\"flex flex-col items-center gap-4\">\n <div className=\"h-8 w-8 animate-spin rounded-full border-4 border-primary border-t-transparent\" />\n <p className=\"text-sm text-muted-foreground\">Loading...</p>\n </div>\n </div>\n )\n}\n\n/**\n * Default landing page component shown when user is not authenticated\n */\nfunction DefaultLandingPage() {\n const { signIn } = useAuth()\n\n return (\n <div className=\"min-h-screen bg-background flex flex-col items-center justify-center p-4\">\n <div className=\"text-center max-w-md\">\n <h1 className=\"text-3xl font-bold tracking-tight mb-4\">Welcome</h1>\n <p className=\"text-muted-foreground mb-8\">\n Sign in to access your dashboard.\n </p>\n <button\n type=\"button\"\n onClick={() => signIn()}\n className=\"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-[var(--radius-md)] text-sm font-medium transition-colors bg-primary text-primary-foreground hover:bg-primary/90 h-10 px-6\"\n >\n Sign In\n </button>\n </div>\n </div>\n )\n}\n\n/**\n * AuthGate handles authentication state and shows appropriate UI:\n * - Loading state while checking auth\n * - Landing page or redirect when not authenticated\n * - Children (protected content) when authenticated\n *\n * @example\n * ```tsx\n * import { AuthGate } from '@mdxui/auth'\n *\n * function App() {\n * return (\n * <AuthGate>\n * <ProtectedDashboard />\n * </AuthGate>\n * )\n * }\n * ```\n *\n * @example\n * ```tsx\n * // With custom components\n * <AuthGate\n * loadingComponent={<CustomSpinner />}\n * landingComponent={<CustomLandingPage />}\n * >\n * <Dashboard />\n * </AuthGate>\n * ```\n *\n * @example\n * ```tsx\n * // Allow unauthenticated access\n * <AuthGate required={false}>\n * <PublicContent />\n * </AuthGate>\n * ```\n *\n * @example\n * ```tsx\n * // Redirect to external URL when not authenticated\n * <AuthGate\n * onUnauthenticated=\"redirect\"\n * redirectUrl=\"https://marketing.example.com\"\n * >\n * <Dashboard />\n * </AuthGate>\n * ```\n */\nexport function AuthGate({\n children,\n required = true,\n loadingComponent,\n landingComponent,\n onUnauthenticated = 'landing',\n redirectUrl,\n}: AuthGateProps) {\n const { user, isLoading, signIn } = useAuth()\n const signInCalled = useRef(false)\n\n // Auto sign-in effect for 'signIn' mode\n useEffect(() => {\n if (onUnauthenticated === 'signIn' && !isLoading && !user && !signInCalled.current) {\n signInCalled.current = true\n signIn()\n }\n }, [onUnauthenticated, isLoading, user, signIn])\n\n // Reset flag when user logs in\n useEffect(() => {\n if (user) {\n signInCalled.current = false\n }\n }, [user])\n\n // If auth is not required, always show children\n if (!required) {\n return <>{children}</>\n }\n\n // Show loading state while checking authentication\n if (isLoading) {\n return <>{loadingComponent ?? <DefaultLoadingComponent />}</>\n }\n\n // User is authenticated, show protected content\n if (user) {\n return <>{children}</>\n }\n\n // User is not authenticated - handle based on config\n switch (onUnauthenticated) {\n case 'signIn':\n // Auto sign-in mode - show loading while redirecting to auth\n return <>{loadingComponent ?? <DefaultLoadingComponent />}</>\n\n case 'redirect':\n // Redirect to external URL\n if (redirectUrl && typeof window !== 'undefined') {\n window.location.href = redirectUrl\n return (\n <div className=\"min-h-screen bg-background flex items-center justify-center\">\n <p className=\"text-sm text-muted-foreground\">Redirecting...</p>\n </div>\n )\n }\n // Fall through to landing if no redirect URL\n return <>{landingComponent ?? <DefaultLandingPage />}</>\n\n case 'allow':\n // Allow access even without auth (shows children)\n return <>{children}</>\n\n case 'landing':\n default:\n // Show landing page (custom or default)\n return <>{landingComponent ?? <DefaultLandingPage />}</>\n }\n}\n","'use client'\n\nimport { createContext, useContext, useMemo, type ReactNode } from 'react'\nimport type { VaultItem, VaultField } from '../vault/types'\n\n/**\n * Vault client interface\n *\n * Defines the contract for a vault backend. The actual implementation\n * can be provided by vault.do SDK or any other vault service.\n */\nexport interface VaultClient {\n /** List all vault items */\n list: () => Promise<VaultItem[]>\n /** Create a new vault item */\n create: (integrationId: string, credentials: Record<string, string>) => Promise<VaultItem>\n /** Rotate credentials for an existing vault item */\n rotate: (id: string, credentials: Record<string, string>) => Promise<VaultItem>\n /** Delete a vault item */\n delete: (id: string) => Promise<void>\n /** Get field configuration for an integration */\n getIntegrationFields?: (integrationId: string) => VaultField[]\n}\n\n/**\n * Vault context state\n */\nexport interface VaultContextState {\n /** The vault client instance */\n client: VaultClient | null\n /** Vault items currently loaded */\n items: VaultItem[]\n /** Whether the vault is currently loading */\n loading: boolean\n /** Error message if vault operations failed */\n error: string | null\n /** Reload vault items */\n reload: () => Promise<void>\n /** Create a new vault item */\n createItem: (integrationId: string, credentials: Record<string, string>) => Promise<void>\n /** Rotate credentials for an existing item */\n rotateItem: (id: string, credentials: Record<string, string>) => Promise<void>\n /** Delete a vault item */\n deleteItem: (id: string) => Promise<void>\n /** Get field configuration for an integration */\n getIntegrationFields: (integrationId: string) => VaultField[]\n}\n\nconst VaultContext = createContext<VaultContextState | null>(null)\n\n/**\n * Props for VaultProvider\n */\nexport interface VaultProviderProps {\n /** Children to render */\n children: ReactNode\n /** Optional vault client implementation */\n client?: VaultClient\n /** Initial items to display (for SSR or static rendering) */\n initialItems?: VaultItem[]\n}\n\n/**\n * Default fields for unknown integrations\n */\nconst defaultFields: VaultField[] = [\n { key: 'api_key', label: 'API Key', type: 'password', required: true }\n]\n\n/**\n * Provider for vault state and operations\n *\n * Provides context for vault components to access the vault client\n * and perform CRUD operations on credentials.\n *\n * The actual vault.do SDK integration will be done in vault.do/react.\n * This provider is designed to be a generic wrapper that can work\n * with any vault backend implementation.\n *\n * @example\n * ```tsx\n * import { VaultProvider } from '@mdxui/auth'\n *\n * // Basic usage with a custom client\n * function App() {\n * return (\n * <VaultProvider client={myVaultClient}>\n * <VaultDashboard />\n * </VaultProvider>\n * )\n * }\n *\n * // Static/SSR usage with initial items\n * function App() {\n * return (\n * <VaultProvider initialItems={serverSideItems}>\n * <VaultDashboard />\n * </VaultProvider>\n * )\n * }\n * ```\n */\nexport function VaultProvider({\n children,\n client,\n initialItems = [],\n}: VaultProviderProps) {\n // Note: In a real implementation, this would use useState and useEffect\n // to manage state and load items from the client. For now, we provide\n // a basic structure that the vault.do SDK can extend.\n\n const contextValue = useMemo<VaultContextState>(() => {\n const getIntegrationFields = (integrationId: string): VaultField[] => {\n if (client?.getIntegrationFields) {\n return client.getIntegrationFields(integrationId)\n }\n return defaultFields\n }\n\n return {\n client: client ?? null,\n items: initialItems,\n loading: false,\n error: null,\n reload: async () => {\n if (!client) {\n console.warn('VaultProvider: No client provided, cannot reload')\n return\n }\n // Implementation would update state here\n await client.list()\n },\n createItem: async (integrationId, credentials) => {\n if (!client) {\n throw new Error('VaultProvider: No client provided')\n }\n await client.create(integrationId, credentials)\n },\n rotateItem: async (id, credentials) => {\n if (!client) {\n throw new Error('VaultProvider: No client provided')\n }\n await client.rotate(id, credentials)\n },\n deleteItem: async (id) => {\n if (!client) {\n throw new Error('VaultProvider: No client provided')\n }\n await client.delete(id)\n },\n getIntegrationFields,\n }\n }, [client, initialItems])\n\n return (\n <VaultContext.Provider value={contextValue}>\n {children}\n </VaultContext.Provider>\n )\n}\n\n/**\n * Hook to access vault context\n *\n * Must be used within a VaultProvider.\n *\n * @throws Error if used outside of VaultProvider\n */\nexport function useVaultContext(): VaultContextState {\n const context = useContext(VaultContext)\n if (!context) {\n throw new Error('useVaultContext must be used within a VaultProvider')\n }\n return context\n}\n\n/**\n * Hook to optionally access vault context\n *\n * Returns null if not within a VaultProvider.\n */\nexport function useVaultContextOptional(): VaultContextState | null {\n return useContext(VaultContext)\n}\n","'use client'\n\nimport { UserProfile as WorkOSUserProfile } from '@workos-inc/widgets'\nimport type { BaseWidgetProps } from '../types/auth'\n\n/**\n * User Profile Widget\n *\n * Displays and allows editing of user profile information:\n * - Profile picture\n * - Name and email\n * - Connected accounts (OAuth providers)\n *\n * @example\n * ```tsx\n * // With AuthKit (recommended)\n * import { useAuth } from '@mdxui/auth'\n * import { UserProfile } from '@mdxui/auth/widgets'\n *\n * function ProfilePage() {\n * const { getAccessToken } = useAuth()\n * return <UserProfile authToken={getAccessToken} />\n * }\n * ```\n *\n * @example\n * ```tsx\n * // With string token\n * <UserProfile authToken={myToken} />\n * ```\n */\nexport function UserProfile({ authToken, className }: BaseWidgetProps) {\n return (\n <div className={className}>\n <WorkOSUserProfile authToken={authToken} />\n </div>\n )\n}\n","'use client'\n\nimport { UserSecurity as WorkOSUserSecurity } from '@workos-inc/widgets'\nimport type { BaseWidgetProps } from '../types/auth'\n\n/**\n * User Security Widget\n *\n * Allows users to manage their security settings:\n * - Password management\n * - Multi-factor authentication (MFA)\n * - Connected authentication methods\n * - Security keys\n *\n * @example\n * ```tsx\n * // With AuthKit (recommended)\n * import { useAuth } from '@mdxui/auth'\n * import { UserSecurity } from '@mdxui/auth/widgets'\n *\n * function SecurityPage() {\n * const { getAccessToken } = useAuth()\n * return <UserSecurity authToken={getAccessToken} />\n * }\n * ```\n */\nexport function UserSecurity({ authToken, className }: BaseWidgetProps) {\n return (\n <div className={className}>\n <WorkOSUserSecurity authToken={authToken} />\n </div>\n )\n}\n","'use client'\n\nimport { UserSessions as WorkOSUserSessions } from '@workos-inc/widgets'\n\n/**\n * Props for UserSessions with function token (no currentSessionId needed)\n */\nexport interface UserSessionsWithFunctionTokenProps {\n /** Auth token getter function */\n authToken: () => Promise<string>\n /** CSS class name */\n className?: string\n}\n\n/**\n * Props for UserSessions with string token (currentSessionId required)\n */\nexport interface UserSessionsWithStringTokenProps {\n /** Auth token string */\n authToken: string\n /** Current session ID (required when using string token) */\n currentSessionId: string\n /** CSS class name */\n className?: string\n}\n\nexport type UserSessionsProps =\n | UserSessionsWithFunctionTokenProps\n | UserSessionsWithStringTokenProps\n\n/**\n * User Sessions Widget\n *\n * Displays and manages active user sessions:\n * - View all active sessions\n * - See session details (device, location, last active)\n * - Revoke sessions\n *\n * @example\n * ```tsx\n * // With AuthKit (recommended) - no currentSessionId needed\n * import { useAuth } from '@mdxui/auth'\n * import { UserSessions } from '@mdxui/auth/widgets'\n *\n * function SessionsPage() {\n * const { getAccessToken } = useAuth()\n * return <UserSessions authToken={getAccessToken} />\n * }\n * ```\n *\n * @example\n * ```tsx\n * // With string token - currentSessionId required\n * <UserSessions authToken={token} currentSessionId={sessionId} />\n * ```\n */\nexport function UserSessions(props: UserSessionsProps) {\n const { className, ...rest } = props\n\n return (\n <div className={className}>\n <WorkOSUserSessions {...rest} />\n </div>\n )\n}\n","'use client'\n\nimport { ApiKeys as WorkOSApiKeys } from '@workos-inc/widgets'\nimport type { BaseWidgetProps } from '../types/auth'\n\n/**\n * API Keys Widget\n *\n * Displays and manages API keys:\n * - Create new API keys with specific permissions\n * - View existing API keys\n * - Revoke API keys\n *\n * Requires the `widgets:api-keys:manage` permission.\n * Organization context is derived from the auth token.\n *\n * @example\n * ```tsx\n * // With AuthKit (recommended)\n * import { useAuth } from '@mdxui/auth'\n * import { ApiKeys } from '@mdxui/auth/widgets'\n *\n * function ApiKeysPage() {\n * const { getAccessToken } = useAuth()\n * return <ApiKeys authToken={getAccessToken} />\n * }\n * ```\n */\nexport function ApiKeys({ authToken, className }: BaseWidgetProps) {\n return (\n <div className={className}>\n <WorkOSApiKeys authToken={authToken} />\n </div>\n )\n}\n","'use client'\n\nimport { UsersManagement as WorkOSUsersManagement } from '@workos-inc/widgets'\nimport type { BaseWidgetProps } from '../types/auth'\n\nexport interface UsersManagementProps extends BaseWidgetProps {\n /**\n * Organization ID for scoping the user management.\n *\n * This is typically used to verify organization context in the parent component.\n * The actual organization scope comes from the auth token.\n */\n organizationId?: string\n}\n\n/**\n * Users Management Widget (Team Page)\n *\n * Allows organization admins to manage team members:\n * - View organization members\n * - Invite new members\n * - Update member roles\n * - Remove members\n *\n * Requires the `widgets:users-table:manage` permission and organization context.\n *\n * @example\n * ```tsx\n * // With AuthKit (recommended)\n * import { useAuth } from '@mdxui/auth'\n * import { UsersManagement } from '@mdxui/auth/widgets'\n *\n * function TeamPage() {\n * const { getAccessToken, organizationId, permissions } = useAuth()\n *\n * if (!organizationId) {\n * return <p>You need to be in an organization.</p>\n * }\n *\n * if (!permissions?.includes('widgets:users-table:manage')) {\n * return <p>You need admin permissions.</p>\n * }\n *\n * return (\n * <UsersManagement\n * authToken={getAccessToken}\n * organizationId={organizationId}\n * />\n * )\n * }\n * ```\n */\nexport function UsersManagement({\n authToken,\n organizationId: _organizationId,\n className,\n}: UsersManagementProps) {\n return (\n <div className={className}>\n <WorkOSUsersManagement authToken={authToken} />\n </div>\n )\n}\n","'use client'\n\nimport { Pipes as WorkOSPipes } from '@workos-inc/widgets'\nimport type { BaseWidgetProps } from '../types/auth'\n\n/**\n * Pipes Widget (Integrations)\n *\n * Allows users to manage third-party integrations:\n * - Connect external services\n * - View connected integrations\n * - Manage integration settings\n * - Disconnect integrations\n *\n * @example\n * ```tsx\n * // With AuthKit (recommended)\n * import { useAuth } from '@mdxui/auth'\n * import { Pipes } from '@mdxui/auth/widgets'\n *\n * function IntegrationsPage() {\n * const { getAccessToken } = useAuth()\n * return <Pipes authToken={getAccessToken} />\n * }\n * ```\n */\nexport function Pipes({ authToken, className }: BaseWidgetProps) {\n return (\n <div className={className}>\n <WorkOSPipes authToken={authToken} />\n </div>\n )\n}\n","'use client'\n\nimport { OrganizationSwitcher as WorkOSOrganizationSwitcher } from '@workos-inc/widgets'\n\nexport type OrganizationSwitcherVariant = 'ghost' | 'outline'\n\nexport interface OrganizationSwitcherProps {\n /** Auth token getter function */\n authToken: () => Promise<string>\n /**\n * Function to switch to a different organization.\n * Receives an object with organizationId.\n */\n switchToOrganization: (args: { organizationId: string }) => void | Promise<void>\n /** Visual variant of the switcher */\n variant?: OrganizationSwitcherVariant\n /** Custom organization label */\n organizationLabel?: string | null\n /** Where to truncate long organization names */\n truncateBehavior?: 'right' | 'middle'\n /** CSS class name */\n className?: string\n}\n\n/**\n * Organization Switcher Widget\n *\n * Allows users to switch between organizations they belong to.\n *\n * @example\n * ```tsx\n * import { useAuth } from '@mdxui/auth'\n * import { OrganizationSwitcher } from '@mdxui/auth/widgets'\n *\n * function OrgSwitcher() {\n * const { getAccessToken, switchToOrganization } = useAuth()\n *\n * // Adapt the function signature\n * const handleSwitch = ({ organizationId }: { organizationId: string }) => {\n * return switchToOrganization(organizationId)\n * }\n *\n * return (\n * <OrganizationSwitcher\n * authToken={getAccessToken}\n * switchToOrganization={handleSwitch}\n * />\n * )\n * }\n * ```\n */\nexport function OrganizationSwitcher({\n authToken,\n switchToOrganization,\n variant,\n organizationLabel,\n truncateBehavior,\n className,\n}: OrganizationSwitcherProps) {\n return (\n <div className={className}>\n <WorkOSOrganizationSwitcher\n authToken={authToken}\n switchToOrganization={switchToOrganization}\n variant={variant}\n organizationLabel={organizationLabel}\n truncateBehavior={truncateBehavior}\n />\n </div>\n )\n}\n","\"use client\";\n\nimport {\n\tBadge,\n\tButton,\n\tCard,\n\tCardContent,\n\tCardDescription,\n\tCardHeader,\n\tCardTitle,\n\tDialog,\n\tDialogContent,\n\tDialogHeader,\n\tDialogTitle,\n\tDialogTrigger,\n\tInput,\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n\tTable,\n\tTableBody,\n\tTableCell,\n\tTableHead,\n\tTableHeader,\n\tTableRow,\n} from \"@mdxui/primitives\";\nimport { cn } from \"@mdxui/primitives/lib/utils\";\nimport {\n\tCopy,\n\tEdit,\n\tEye,\n\tEyeOff,\n\tFilter,\n\tPlus,\n\tSearch,\n\tTrash2,\n} from \"lucide-react\";\nimport * as React from \"react\";\nimport { toast } from \"sonner\";\nimport { SecretForm } from \"./secret-form\";\nimport type { Secret, SecretsManagerProps } from \"./types\";\n\n/**\n * SecretsManager Component\n *\n * A comprehensive UI for managing application secrets and environment variables.\n * Provides features for creating, editing, deleting, and viewing secrets with\n * support for multiple environments.\n *\n * @example\n * ```tsx\n * import { SecretsManager } from '@mdxui/auth'\n *\n * function VaultPage() {\n * return (\n * <SecretsManager\n * secrets={secrets}\n * environments={['development', 'staging', 'production']}\n * onCreate={handleCreate}\n * onUpdate={handleUpdate}\n * onDelete={handleDelete}\n * />\n * )\n * }\n * ```\n */\nexport function SecretsManager({\n\tsecrets: externalSecrets = [],\n\tenvironments = [\"development\", \"staging\", \"production\"],\n\tcurrentEnvironment = \"development\",\n\tonEnvironmentChange,\n\tonCreate,\n\tonUpdate,\n\tonDelete,\n\thideValues: initialHideValues = true,\n\teditable = true,\n\tclassName,\n}: SecretsManagerProps) {\n\tconst [localSecrets, setLocalSecrets] = React.useState<Secret[]>([]);\n\tconst [hideValues, setHideValues] = React.useState(initialHideValues);\n\tconst [searchQuery, setSearchQuery] = React.useState(\"\");\n\tconst [environment, setEnvironment] = React.useState(currentEnvironment);\n\tconst [visibleSecrets, setVisibleSecrets] = React.useState<Set<string>>(\n\t\tnew Set(),\n\t);\n\tconst [editingSecret, setEditingSecret] = React.useState<Secret | null>(null);\n\tconst [isCreateDialogOpen, setIsCreateDialogOpen] = React.useState(false);\n\tconst [isEditDialogOpen, setIsEditDialogOpen] = React.useState(false);\n\n\tconst secrets = externalSecrets.length > 0 ? externalSecrets : localSecrets;\n\n\tReact.useEffect(() => {\n\t\tsetEnvironment(currentEnvironment);\n\t}, [currentEnvironment]);\n\n\tconst filteredSecrets = React.useMemo(() => {\n\t\treturn secrets.filter((secret) => {\n\t\t\tconst matchesSearch = searchQuery\n\t\t\t\t? secret.key.toLowerCase().includes(searchQuery.toLowerCase()) ||\n\t\t\t\t\tsecret.description?.toLowerCase().includes(searchQuery.toLowerCase())\n\t\t\t\t: true;\n\n\t\t\tconst matchesEnvironment =\n\t\t\t\tenvironment === \"all\" || secret.environment === environment;\n\n\t\t\treturn matchesSearch && matchesEnvironment;\n\t\t});\n\t}, [secrets, searchQuery, environment]);\n\n\tconst handleEnvironmentChange = (newEnvironment: string) => {\n\t\tsetEnvironment(newEnvironment);\n\t\tonEnvironmentChange?.(newEnvironment);\n\t};\n\n\tconst handleCreate = async (\n\t\tsecretData: Omit<Secret, \"id\" | \"createdAt\" | \"updatedAt\">,\n\t) => {\n\t\tconst newSecret: Secret = {\n\t\t\t...secretData,\n\t\t\tid: crypto.randomUUID(),\n\t\t\tcreatedAt: new Date(),\n\t\t\tupdatedAt: new Date(),\n\t\t};\n\n\t\ttry {\n\t\t\tawait onCreate?.(secretData);\n\n\t\t\tif (externalSecrets.length === 0) {\n\t\t\t\tsetLocalSecrets((prev) => [...prev, newSecret]);\n\t\t\t}\n\n\t\t\tsetIsCreateDialogOpen(false);\n\t\t\ttoast.success(\"Secret created successfully\");\n\t\t} catch (error) {\n\t\t\ttoast.error(\"Failed to create secret\");\n\t\t}\n\t};\n\n\tconst handleUpdate = async (id: string, updates: Partial<Secret>) => {\n\t\ttry {\n\t\t\tawait onUpdate?.(id, { ...updates, updatedAt: new Date() });\n\n\t\t\tif (externalSecrets.length === 0) {\n\t\t\t\tsetLocalSecrets((prev) =>\n\t\t\t\t\tprev.map((secret) =>\n\t\t\t\t\t\tsecret.id === id\n\t\t\t\t\t\t\t? { ...secret, ...updates, updatedAt: new Date() }\n\t\t\t\t\t\t\t: secret,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tsetIsEditDialogOpen(false);\n\t\t\tsetEditingSecret(null);\n\t\t\ttoast.success(\"Secret updated successfully\");\n\t\t} catch (error) {\n\t\t\ttoast.error(\"Failed to update secret\");\n\t\t}\n\t};\n\n\tconst handleDelete = async (id: string) => {\n\t\tif (!confirm(\"Are you sure you want to delete this secret?\")) return;\n\n\t\ttry {\n\t\t\tawait onDelete?.(id);\n\n\t\t\tif (externalSecrets.length === 0) {\n\t\t\t\tsetLocalSecrets((prev) => prev.filter((secret) => secret.id !== id));\n\t\t\t}\n\n\t\t\ttoast.success(\"Secret deleted\");\n\t\t} catch (error) {\n\t\t\ttoast.error(\"Failed to delete secret\");\n\t\t}\n\t};\n\n\tconst handleCopy = (value: string) => {\n\t\tnavigator.clipboard.writeText(value);\n\t\ttoast.success(\"Value copied to clipboard\");\n\t};\n\n\tconst toggleSecretVisibility = (id: string) => {\n\t\tsetVisibleSecrets((prev) => {\n\t\t\tconst next = new Set(prev);\n\t\t\tif (next.has(id)) {\n\t\t\t\tnext.delete(id);\n\t\t\t} else {\n\t\t\t\tnext.add(id);\n\t\t\t}\n\t\t\treturn next;\n\t\t});\n\t};\n\n\tconst toggleAllVisibility = () => {\n\t\tsetHideValues(!hideValues);\n\t\tif (!hideValues) {\n\t\t\tsetVisibleSecrets(new Set());\n\t\t}\n\t};\n\n\tconst isSecretVisible = (id: string) => {\n\t\treturn hideValues ? visibleSecrets.has(id) : true;\n\t};\n\n\treturn (\n\t\t<div className={cn(\"space-y-4\", className)}>\n\t\t\t<Card>\n\t\t\t\t<CardHeader>\n\t\t\t\t\t<div className=\"flex items-start justify-between\">\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<CardTitle>Environment Variables</CardTitle>\n\t\t\t\t\t\t\t<CardDescription>\n\t\t\t\t\t\t\t\tManage your application secrets and configuration\n\t\t\t\t\t\t\t</CardDescription>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{editable && (\n\t\t\t\t\t\t\t<Dialog\n\t\t\t\t\t\t\t\topen={isCreateDialogOpen}\n\t\t\t\t\t\t\t\tonOpenChange={setIsCreateDialogOpen}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<DialogTrigger asChild>\n\t\t\t\t\t\t\t\t\t<Button>\n\t\t\t\t\t\t\t\t\t\t<Plus className=\"mr-2 size-4\" />\n\t\t\t\t\t\t\t\t\t\tAdd Secret\n\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t</DialogTrigger>\n\t\t\t\t\t\t\t\t<DialogContent>\n\t\t\t\t\t\t\t\t\t<DialogHeader>\n\t\t\t\t\t\t\t\t\t\t<DialogTitle>Create New Secret</DialogTitle>\n\t\t\t\t\t\t\t\t\t</DialogHeader>\n\t\t\t\t\t\t\t\t\t<SecretForm\n\t\t\t\t\t\t\t\t\t\tenvironment={environment}\n\t\t\t\t\t\t\t\t\t\tenvironments={environments}\n\t\t\t\t\t\t\t\t\t\tonSubmit={handleCreate}\n\t\t\t\t\t\t\t\t\t\tonCancel={() => setIsCreateDialogOpen(false)}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</DialogContent>\n\t\t\t\t\t\t\t</Dialog>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t</CardHeader>\n\t\t\t\t<CardContent className=\"space-y-4\">\n\t\t\t\t\t<div className=\"flex flex-wrap items-center gap-2\">\n\t\t\t\t\t\t<div className=\"relative flex-1\">\n\t\t\t\t\t\t\t<Search className=\"absolute left-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground\" />\n\t\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\t\tplaceholder=\"Search secrets...\"\n\t\t\t\t\t\t\t\tvalue={searchQuery}\n\t\t\t\t\t\t\t\tonChange={(e) => setSearchQuery(e.target.value)}\n\t\t\t\t\t\t\t\tclassName=\"pl-9\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<Select value={environment} onValueChange={handleEnvironmentChange}>\n\t\t\t\t\t\t\t<SelectTrigger className=\"w-[180px]\">\n\t\t\t\t\t\t\t\t<Filter className=\"mr-2 size-4\" />\n\t\t\t\t\t\t\t\t<SelectValue />\n\t\t\t\t\t\t\t</SelectTrigger>\n\t\t\t\t\t\t\t<SelectContent>\n\t\t\t\t\t\t\t\t<SelectItem value=\"all\">All Environments</SelectItem>\n\t\t\t\t\t\t\t\t{environments.map((env) => (\n\t\t\t\t\t\t\t\t\t<SelectItem key={env} value={env}>\n\t\t\t\t\t\t\t\t\t\t{env.charAt(0).toUpperCase() + env.slice(1)}\n\t\t\t\t\t\t\t\t\t</SelectItem>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</SelectContent>\n\t\t\t\t\t\t</Select>\n\t\t\t\t\t\t<Button variant=\"outline\" size=\"icon\" onClick={toggleAllVisibility}>\n\t\t\t\t\t\t\t{hideValues ? (\n\t\t\t\t\t\t\t\t<Eye className=\"size-4\" />\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<EyeOff className=\"size-4\" />\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{filteredSecrets.length > 0 ? (\n\t\t\t\t\t\t<div className=\"rounded-md border\">\n\t\t\t\t\t\t\t<Table>\n\t\t\t\t\t\t\t\t<TableHeader>\n\t\t\t\t\t\t\t\t\t<TableRow>\n\t\t\t\t\t\t\t\t\t\t<TableHead>Key</TableHead>\n\t\t\t\t\t\t\t\t\t\t<TableHead>Value</TableHead>\n\t\t\t\t\t\t\t\t\t\t<TableHead>Environment</TableHead>\n\t\t\t\t\t\t\t\t\t\t<TableHead>Description</TableHead>\n\t\t\t\t\t\t\t\t\t\t<TableHead className=\"w-[100px]\">Actions</TableHead>\n\t\t\t\t\t\t\t\t\t</TableRow>\n\t\t\t\t\t\t\t\t</TableHeader>\n\t\t\t\t\t\t\t\t<TableBody>\n\t\t\t\t\t\t\t\t\t{filteredSecrets.map((secret) => (\n\t\t\t\t\t\t\t\t\t\t<TableRow key={secret.id}>\n\t\t\t\t\t\t\t\t\t\t\t<TableCell>\n\t\t\t\t\t\t\t\t\t\t\t\t<code className=\"rounded bg-muted px-2 py-1 font-mono text-sm\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{secret.key}\n\t\t\t\t\t\t\t\t\t\t\t\t</code>\n\t\t\t\t\t\t\t\t\t\t\t</TableCell>\n\t\t\t\t\t\t\t\t\t\t\t<TableCell>\n\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<code className=\"flex-1 rounded bg-muted px-2 py-1 font-mono text-sm\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{isSecretVisible(secret.id)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? secret.value\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: \"\\u2022\".repeat(Math.min(secret.value.length, 20))}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</code>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsize=\"icon-sm\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => toggleSecretVisibility(secret.id)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{isSecretVisible(secret.id) ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<EyeOff className=\"size-4\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Eye className=\"size-4\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsize=\"icon-sm\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => handleCopy(secret.value)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Copy className=\"size-4\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t</TableCell>\n\t\t\t\t\t\t\t\t\t\t\t<TableCell>\n\t\t\t\t\t\t\t\t\t\t\t\t<Badge variant=\"secondary\">{secret.environment}</Badge>\n\t\t\t\t\t\t\t\t\t\t\t</TableCell>\n\t\t\t\t\t\t\t\t\t\t\t<TableCell>\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{secret.description || \"-\"}\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t</TableCell>\n\t\t\t\t\t\t\t\t\t\t\t<TableCell>\n\t\t\t\t\t\t\t\t\t\t\t\t{editable && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-1\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsize=\"icon-sm\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsetEditingSecret(secret);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsetIsEditDialogOpen(true);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Edit className=\"size-4\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsize=\"icon-sm\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => handleDelete(secret.id)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Trash2 className=\"size-4 text-destructive\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t</TableCell>\n\t\t\t\t\t\t\t\t\t\t</TableRow>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</TableBody>\n\t\t\t\t\t\t\t</Table>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<div className=\"flex h-32 items-center justify-center rounded-md border-2 border-dashed\">\n\t\t\t\t\t\t\t<p className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\t{searchQuery\n\t\t\t\t\t\t\t\t\t? \"No secrets found matching your search\"\n\t\t\t\t\t\t\t\t\t: \"No secrets yet. Add your first secret to get started.\"}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</CardContent>\n\t\t\t</Card>\n\n\t\t\t{editingSecret && (\n\t\t\t\t<Dialog open={isEditDialogOpen} onOpenChange={setIsEditDialogOpen}>\n\t\t\t\t\t<DialogContent>\n\t\t\t\t\t\t<DialogHeader>\n\t\t\t\t\t\t\t<DialogTitle>Edit Secret</DialogTitle>\n\t\t\t\t\t\t</DialogHeader>\n\t\t\t\t\t\t<SecretForm\n\t\t\t\t\t\t\tsecret={editingSecret}\n\t\t\t\t\t\t\tenvironment={environment}\n\t\t\t\t\t\t\tenvironments={environments}\n\t\t\t\t\t\t\tonSubmit={(data) => handleUpdate(editingSecret.id, data)}\n\t\t\t\t\t\t\tonCancel={() => {\n\t\t\t\t\t\t\t\tsetIsEditDialogOpen(false);\n\t\t\t\t\t\t\t\tsetEditingSecret(null);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</DialogContent>\n\t\t\t\t</Dialog>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","\"use client\";\n\nimport {\n\tButton,\n\tInput,\n\tLabel,\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n\tTextarea,\n} from \"@mdxui/primitives\";\nimport * as React from \"react\";\nimport type { Secret } from \"./types\";\n\ninterface SecretFormProps {\n\tsecret?: Secret;\n\tenvironment: string;\n\tenvironments: string[];\n\tonSubmit: (secret: Omit<Secret, \"id\" | \"createdAt\" | \"updatedAt\">) => void;\n\tonCancel: () => void;\n}\n\nexport function SecretForm({\n\tsecret,\n\tenvironment: defaultEnvironment,\n\tenvironments,\n\tonSubmit,\n\tonCancel,\n}: SecretFormProps) {\n\tconst [key, setKey] = React.useState(secret?.key || \"\");\n\tconst [value, setValue] = React.useState(secret?.value || \"\");\n\tconst [description, setDescription] = React.useState(\n\t\tsecret?.description || \"\",\n\t);\n\tconst [environment, setEnvironment] = React.useState(\n\t\tsecret?.environment || defaultEnvironment,\n\t);\n\n\tconst handleSubmit = (e: React.FormEvent) => {\n\t\te.preventDefault();\n\n\t\tif (!key.trim() || !value.trim()) return;\n\n\t\tonSubmit({\n\t\t\tkey: key.trim(),\n\t\t\tvalue: value.trim(),\n\t\t\tdescription: description.trim() || undefined,\n\t\t\tenvironment,\n\t\t});\n\t};\n\n\treturn (\n\t\t<form onSubmit={handleSubmit} className=\"space-y-4\">\n\t\t\t<div className=\"space-y-2\">\n\t\t\t\t<Label htmlFor=\"key\">Key *</Label>\n\t\t\t\t<Input\n\t\t\t\t\tid=\"key\"\n\t\t\t\t\tplaceholder=\"DATABASE_URL\"\n\t\t\t\t\tvalue={key}\n\t\t\t\t\tonChange={(e) =>\n\t\t\t\t\t\tsetKey(e.target.value.toUpperCase().replace(/[^A-Z0-9_]/g, \"_\"))\n\t\t\t\t\t}\n\t\t\t\t\trequired\n\t\t\t\t\tautoFocus\n\t\t\t\t/>\n\t\t\t\t<p className=\"text-xs text-muted-foreground\">\n\t\t\t\t\tUse UPPER_CASE with underscores (e.g., API_KEY, DATABASE_URL)\n\t\t\t\t</p>\n\t\t\t</div>\n\n\t\t\t<div className=\"space-y-2\">\n\t\t\t\t<Label htmlFor=\"value\">Value *</Label>\n\t\t\t\t<Textarea\n\t\t\t\t\tid=\"value\"\n\t\t\t\t\tplaceholder=\"Enter secret value\"\n\t\t\t\t\tvalue={value}\n\t\t\t\t\tonChange={(e) => setValue(e.target.value)}\n\t\t\t\t\trows={3}\n\t\t\t\t\trequired\n\t\t\t\t\tclassName=\"font-mono\"\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t<div className=\"space-y-2\">\n\t\t\t\t<Label htmlFor=\"environment\">Environment *</Label>\n\t\t\t\t<Select value={environment} onValueChange={setEnvironment}>\n\t\t\t\t\t<SelectTrigger id=\"environment\">\n\t\t\t\t\t\t<SelectValue />\n\t\t\t\t\t</SelectTrigger>\n\t\t\t\t\t<SelectContent>\n\t\t\t\t\t\t{environments.map((env) => (\n\t\t\t\t\t\t\t<SelectItem key={env} value={env}>\n\t\t\t\t\t\t\t\t{env.charAt(0).toUpperCase() + env.slice(1)}\n\t\t\t\t\t\t\t</SelectItem>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</SelectContent>\n\t\t\t\t</Select>\n\t\t\t</div>\n\n\t\t\t<div className=\"space-y-2\">\n\t\t\t\t<Label htmlFor=\"description\">Description</Label>\n\t\t\t\t<Textarea\n\t\t\t\t\tid=\"description\"\n\t\t\t\t\tplaceholder=\"Optional description of this secret\"\n\t\t\t\t\tvalue={description}\n\t\t\t\t\tonChange={(e) => setDescription(e.target.value)}\n\t\t\t\t\trows={2}\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t<div className=\"flex justify-end gap-2\">\n\t\t\t\t<Button type=\"button\" variant=\"outline\" onClick={onCancel}>\n\t\t\t\t\tCancel\n\t\t\t\t</Button>\n\t\t\t\t<Button type=\"submit\" disabled={!key.trim() || !value.trim()}>\n\t\t\t\t\t{secret ? \"Update\" : \"Create\"} Secret\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t</form>\n\t);\n}\n","'use client'\n\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@mdxui/primitives'\nimport type { VaultDeleteDialogProps } from './types'\n\n/**\n * Confirmation dialog for deleting vault credentials\n *\n * @example\n * ```tsx\n * <VaultDeleteDialog\n * isOpen={deleteDialogOpen}\n * onClose={() => setDeleteDialogOpen(false)}\n * itemName=\"OpenAI\"\n * onConfirm={handleDelete}\n * />\n * ```\n */\nexport function VaultDeleteDialog({ isOpen, onClose, itemName, onConfirm }: VaultDeleteDialogProps) {\n return (\n <Dialog open={isOpen} onOpenChange={onClose}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Delete Credentials</DialogTitle>\n <DialogDescription>\n Are you sure you want to delete credentials for {itemName}? This action cannot be undone.\n </DialogDescription>\n </DialogHeader>\n <DialogFooter>\n <Button variant=\"outline\" onClick={onClose}>\n Cancel\n </Button>\n <Button variant=\"destructive\" onClick={onConfirm}>\n Delete\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\n","'use client'\n\nimport { Button } from '@mdxui/primitives'\nimport { Lock } from 'lucide-react'\nimport type { VaultEmptyStateProps } from './types'\n\n/**\n * Empty state component shown when the vault has no credentials\n *\n * @example\n * ```tsx\n * <VaultEmptyState onAddCredential={() => setAddModalOpen(true)} />\n * ```\n */\nexport function VaultEmptyState({ onAddCredential }: VaultEmptyStateProps) {\n return (\n <div className=\"flex flex-col items-center justify-center rounded-md border border-dashed py-24 px-4 text-center\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-muted mb-4\">\n <Lock className=\"h-6 w-6 text-muted-foreground\" />\n </div>\n <h3 className=\"text-lg font-semibold mb-2\">No saved credentials</h3>\n <p className=\"text-sm text-muted-foreground mb-6 max-w-md\">\n Add API keys and account credentials for your agents to use securely.\n </p>\n <Button onClick={onAddCredential}>Add Credential</Button>\n </div>\n )\n}\n","'use client'\n\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Input,\n Label,\n} from '@mdxui/primitives'\nimport { Key } from 'lucide-react'\nimport { useState } from 'react'\nimport type { VaultInputModalProps } from './types'\n\n/**\n * Modal for entering or rotating vault credentials\n *\n * Renders input fields based on the integration's field configuration.\n * Supports both creating new credentials and rotating existing ones.\n *\n * @example\n * ```tsx\n * <VaultInputModal\n * isOpen={modalOpen}\n * onClose={() => setModalOpen(false)}\n * mode=\"create\"\n * integration={{\n * id: 'openai',\n * name: 'OpenAI',\n * logoUrl: '...',\n * fields: [{ key: 'api_key', label: 'API Key', type: 'password', required: true }]\n * }}\n * onSave={(credentials) => saveCredentials(credentials)}\n * />\n * ```\n */\nexport function VaultInputModal({\n isOpen,\n onClose,\n mode,\n integration,\n onSave,\n}: VaultInputModalProps) {\n const [values, setValues] = useState<Record<string, string>>({})\n const [loading, setLoading] = useState(false)\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault()\n setLoading(true)\n try {\n await onSave(values)\n setValues({})\n onClose()\n } catch (error) {\n console.error('Failed to save credentials:', error)\n } finally {\n setLoading(false)\n }\n }\n\n const handleClose = () => {\n setValues({})\n onClose()\n }\n\n if (!integration) return null\n\n const isValid = integration.fields.filter((f) => f.required).every((f) => values[f.key]?.trim())\n\n return (\n <Dialog open={isOpen} onOpenChange={handleClose}>\n <DialogContent>\n <DialogHeader>\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-md bg-white overflow-hidden p-1 border border-border\">\n {integration.logoUrl ? (\n <img\n src={integration.logoUrl}\n alt={integration.name}\n width={32}\n height={32}\n className=\"h-full w-full object-contain rounded-sm\"\n />\n ) : (\n <Key className=\"h-5 w-5 text-muted-foreground\" />\n )}\n </div>\n <DialogTitle>\n {mode === 'create' ? 'Add' : 'Rotate'} {integration.name} Credentials\n </DialogTitle>\n </div>\n </DialogHeader>\n <form onSubmit={handleSubmit}>\n <div className=\"grid gap-4 py-4\">\n {integration.fields.map((field) => (\n <div key={field.key} className=\"grid gap-2\">\n <Label htmlFor={field.key}>\n {field.label}\n {field.required && <span className=\"text-destructive\">*</span>}\n </Label>\n <Input\n id={field.key}\n type={field.type}\n placeholder={field.placeholder}\n value={values[field.key] || ''}\n onChange={(e) =>\n setValues((prev) => ({\n ...prev,\n [field.key]: e.target.value,\n }))\n }\n required={field.required}\n />\n </div>\n ))}\n </div>\n <DialogFooter>\n <Button type=\"button\" variant=\"outline\" onClick={handleClose}>\n Cancel\n </Button>\n <Button type=\"submit\" disabled={loading || !isValid}>\n {loading ? 'Saving...' : 'Save'}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n )\n}\n","'use client'\n\nimport {\n Button,\n Card,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '@mdxui/primitives'\nimport { Key, MoreVertical } from 'lucide-react'\nimport type { VaultItemCardProps } from './types'\n\nfunction formatDate(date: Date): string {\n return date.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n })\n}\n\n/**\n * Card component displaying a single vault credential item\n *\n * Shows the integration logo/icon, name, and creation/rotation date.\n * Provides a dropdown menu with rotate and delete actions.\n *\n * @example\n * ```tsx\n * <VaultItemCard\n * id=\"1\"\n * name=\"OpenAI\"\n * logoUrl=\"https://...\"\n * createdAt={new Date('2024-01-01')}\n * updatedAt={new Date('2024-06-01')}\n * onRotate={(id) => console.log('Rotate', id)}\n * onDelete={(id) => console.log('Delete', id)}\n * />\n * ```\n */\nexport function VaultItemCard({\n id,\n name,\n logoUrl,\n createdAt,\n updatedAt,\n onRotate,\n onDelete,\n}: VaultItemCardProps) {\n const wasRotated = updatedAt.getTime() !== createdAt.getTime()\n\n return (\n <Card noPadding className=\"p-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-md bg-white overflow-hidden p-1 border border-border\">\n {logoUrl ? (\n <img\n src={logoUrl}\n alt={name}\n width={32}\n height={32}\n className=\"h-full w-full object-contain rounded-sm\"\n />\n ) : (\n <Key className=\"h-5 w-5 text-muted-foreground\" />\n )}\n </div>\n <div>\n <h4 className=\"text-sm font-medium\">{name}</h4>\n <p className=\"text-xs text-muted-foreground\">\n {wasRotated ? `Rotated: ${formatDate(updatedAt)}` : `Created: ${formatDate(createdAt)}`}\n </p>\n </div>\n </div>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"icon-sm\">\n <MoreVertical className=\"h-4 w-4\" />\n <span className=\"sr-only\">Open menu</span>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem onClick={() => onRotate(id)}>Rotate</DropdownMenuItem>\n <DropdownMenuItem\n className=\"text-destructive focus:text-destructive\"\n onClick={() => onDelete(id)}\n >\n Delete\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </Card>\n )\n}\n","'use client'\n\nimport { useState } from 'react'\nimport type { VaultItem, VaultListProps, VaultField } from './types'\nimport { VaultDeleteDialog } from './vault-delete-dialog'\nimport { VaultEmptyState } from './vault-empty-state'\nimport { VaultInputModal } from './vault-input-modal'\nimport { VaultItemCard } from './vault-item-card'\n\n/**\n * Default fields for unknown integrations\n */\nconst defaultFields: VaultField[] = [\n { key: 'api_key', label: 'API Key', type: 'password', required: true }\n]\n\n/**\n * Main vault list component that displays stored credentials\n *\n * Includes the list view, delete confirmation dialog, and credential\n * input modal for rotating credentials. Shows an empty state when\n * no credentials are stored.\n *\n * @example\n * ```tsx\n * <VaultList\n * items={vaultItems}\n * onRotate={async (id, creds) => await rotateCredentials(id, creds)}\n * onDelete={async (id) => await deleteCredentials(id)}\n * onOpenAddModal={() => setAddModalOpen(true)}\n * getIntegrationFields={(id) => integrationFields[id]}\n * />\n * ```\n */\nexport function VaultList({\n items,\n onRotate,\n onDelete,\n onOpenAddModal,\n getIntegrationFields,\n}: VaultListProps) {\n const [deleteDialogOpen, setDeleteDialogOpen] = useState(false)\n const [inputModalOpen, setInputModalOpen] = useState(false)\n const [selectedItem, setSelectedItem] = useState<VaultItem | null>(null)\n const [modalMode, setModalMode] = useState<'create' | 'rotate'>('create')\n\n const handleRotate = (id: string) => {\n const item = items.find((i) => i.id === id)\n if (!item) return\n\n setSelectedItem(item)\n setModalMode('rotate')\n setInputModalOpen(true)\n }\n\n const handleDeleteClick = (id: string) => {\n const item = items.find((i) => i.id === id)\n if (!item) return\n\n setSelectedItem(item)\n setDeleteDialogOpen(true)\n }\n\n const handleConfirmDelete = async () => {\n if (!selectedItem) return\n\n await onDelete(selectedItem.id)\n setDeleteDialogOpen(false)\n setSelectedItem(null)\n }\n\n const handleSave = async (credentials: Record<string, string>) => {\n if (modalMode === 'rotate' && selectedItem) {\n await onRotate(selectedItem.id, credentials)\n }\n setInputModalOpen(false)\n setSelectedItem(null)\n }\n\n const getIntegrationForModal = () => {\n if (!selectedItem) return undefined\n\n const fields = getIntegrationFields\n ? getIntegrationFields(selectedItem.integrationId)\n : defaultFields\n\n return {\n id: selectedItem.integrationId,\n name: selectedItem.name,\n logoUrl: selectedItem.logoUrl,\n fields,\n }\n }\n\n if (items.length === 0) {\n return <VaultEmptyState onAddCredential={onOpenAddModal} />\n }\n\n return (\n <>\n <div className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-3\">\n {items.map((item) => (\n <VaultItemCard\n key={item.id}\n id={item.id}\n name={item.name}\n logoUrl={item.logoUrl}\n createdAt={item.createdAt}\n updatedAt={item.updatedAt}\n onRotate={handleRotate}\n onDelete={handleDeleteClick}\n />\n ))}\n </div>\n\n <VaultDeleteDialog\n isOpen={deleteDialogOpen}\n onClose={() => {\n setDeleteDialogOpen(false)\n setSelectedItem(null)\n }}\n itemName={selectedItem?.name || ''}\n onConfirm={handleConfirmDelete}\n />\n\n <VaultInputModal\n isOpen={inputModalOpen}\n onClose={() => {\n setInputModalOpen(false)\n setSelectedItem(null)\n }}\n mode={modalMode}\n integration={getIntegrationForModal()}\n onSave={handleSave}\n />\n </>\n )\n}\n","'use client'\n\nimport { useAuth } from '@workos-inc/authkit-react'\nimport type { ReactNode, ButtonHTMLAttributes } from 'react'\n\nexport interface SignInButtonProps\n extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'onClick'> {\n /** Button content (defaults to \"Sign In\") */\n children?: ReactNode\n /** Custom onClick handler (in addition to signIn) */\n onSignIn?: () => void\n}\n\n/**\n * Sign In Button\n *\n * A simple button that triggers the WorkOS AuthKit sign-in flow.\n *\n * @example\n * ```tsx\n * import { SignInButton } from '@mdxui/auth'\n *\n * function Header() {\n * return (\n * <nav>\n * <SignInButton />\n * </nav>\n * )\n * }\n * ```\n *\n * @example\n * ```tsx\n * // With custom styling\n * <SignInButton className=\"bg-blue-500 text-white px-4 py-2 rounded\">\n * Get Started\n * </SignInButton>\n * ```\n */\nexport function SignInButton({\n children = 'Sign In',\n onSignIn,\n className,\n disabled,\n ...props\n}: SignInButtonProps) {\n const { signIn, isLoading } = useAuth()\n\n const handleClick = () => {\n onSignIn?.()\n signIn()\n }\n\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={disabled || isLoading}\n className={\n className ??\n 'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-[var(--radius-md)] text-sm font-medium transition-colors bg-primary text-primary-foreground hover:bg-primary/90 h-10 px-4 disabled:opacity-50 disabled:pointer-events-none'\n }\n {...props}\n >\n {children}\n </button>\n )\n}\n","'use client'\n\nimport { useAuth } from '@workos-inc/authkit-react'\nimport type { ReactNode, ButtonHTMLAttributes } from 'react'\n\nexport interface SignOutButtonProps\n extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'onClick'> {\n /** Button content (defaults to \"Sign Out\") */\n children?: ReactNode\n /** Custom onClick handler (in addition to signOut) */\n onSignOut?: () => void\n}\n\n/**\n * Sign Out Button\n *\n * A simple button that triggers the WorkOS AuthKit sign-out flow.\n *\n * @example\n * ```tsx\n * import { SignOutButton } from '@mdxui/auth'\n *\n * function Header() {\n * const { user } = useAuth()\n *\n * if (!user) return null\n *\n * return (\n * <nav>\n * <span>{user.email}</span>\n * <SignOutButton />\n * </nav>\n * )\n * }\n * ```\n *\n * @example\n * ```tsx\n * // With custom styling\n * <SignOutButton className=\"text-red-500 underline\">\n * Log out\n * </SignOutButton>\n * ```\n */\nexport function SignOutButton({\n children = 'Sign Out',\n onSignOut,\n className,\n disabled,\n ...props\n}: SignOutButtonProps) {\n const { signOut, isLoading } = useAuth()\n\n const handleClick = () => {\n onSignOut?.()\n signOut()\n }\n\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={disabled || isLoading}\n className={\n className ??\n 'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-[var(--radius-md)] text-sm font-medium transition-colors bg-secondary text-secondary-foreground hover:bg-secondary/80 h-10 px-4 disabled:opacity-50 disabled:pointer-events-none'\n }\n {...props}\n >\n {children}\n </button>\n )\n}\n","'use client'\n\nimport { useAuth } from '@workos-inc/authkit-react'\nimport type { ReactNode } from 'react'\n\nexport interface UserMenuProps {\n /** Custom render function for the trigger button */\n renderTrigger?: (props: {\n user: NonNullable<ReturnType<typeof useAuth>['user']>\n displayName: string\n initials: string\n }) => ReactNode\n /** Custom render function for the menu content */\n renderMenu?: (props: {\n user: NonNullable<ReturnType<typeof useAuth>['user']>\n displayName: string\n initials: string\n signOut: () => void\n }) => ReactNode\n /** Additional CSS class */\n className?: string\n}\n\n/**\n * Get initials from a name (first letter of first and last name)\n */\nfunction getInitials(name: string | undefined): string {\n if (!name) return '?'\n const parts = name.trim().split(/\\s+/)\n if (parts.length === 1) return parts[0].charAt(0).toUpperCase()\n return (\n parts[0].charAt(0) + parts[parts.length - 1].charAt(0)\n ).toUpperCase()\n}\n\n/**\n * User Menu Component\n *\n * A customizable user menu that displays user info and provides sign-out functionality.\n * This is a headless component - you provide the render functions to control the UI.\n *\n * For a pre-built menu with @mdxui/primitives, use the UserMenu from @mdxui/do or @mdxui/cockpit.\n *\n * @example\n * ```tsx\n * import { UserMenu } from '@mdxui/auth'\n *\n * function Header() {\n * return (\n * <UserMenu\n * renderTrigger={({ user, initials }) => (\n * <button className=\"flex items-center gap-2\">\n * <div className=\"w-8 h-8 rounded-full bg-gray-200 flex items-center justify-center\">\n * {user.profilePictureUrl ? (\n * <img src={user.profilePictureUrl} alt=\"\" className=\"rounded-full\" />\n * ) : (\n * initials\n * )}\n * </div>\n * <span>{user.firstName}</span>\n * </button>\n * )}\n * renderMenu={({ user, signOut }) => (\n * <div className=\"dropdown-menu\">\n * <div className=\"p-2\">\n * <p>{user.email}</p>\n * </div>\n * <button onClick={signOut}>Sign Out</button>\n * </div>\n * )}\n * />\n * )\n * }\n * ```\n *\n * @example\n * ```tsx\n * // Simple usage with just a sign-out button\n * <UserMenu\n * renderTrigger={({ displayName }) => <span>{displayName}</span>}\n * renderMenu={({ signOut }) => <button onClick={signOut}>Sign Out</button>}\n * />\n * ```\n */\nexport function UserMenu({ renderTrigger, renderMenu, className }: UserMenuProps) {\n const { user, signOut, isLoading } = useAuth()\n\n if (isLoading) {\n return (\n <div className={className}>\n <div className=\"flex items-center gap-2 p-2\">\n <div className=\"h-8 w-8 animate-pulse rounded-full bg-muted\" />\n </div>\n </div>\n )\n }\n\n if (!user) {\n return null\n }\n\n const displayName = user.firstName\n ? `${user.firstName}${user.lastName ? ` ${user.lastName}` : ''}`\n : user.email\n\n const initials = getInitials(\n user.firstName ? `${user.firstName} ${user.lastName ?? ''}` : user.email\n )\n\n const triggerProps = { user, displayName, initials }\n const menuProps = { user, displayName, initials, signOut }\n\n // If no render functions provided, render a basic menu\n if (!renderTrigger && !renderMenu) {\n return (\n <div className={className}>\n <div className=\"flex items-center gap-2 p-2\">\n <div className=\"h-8 w-8 rounded-full bg-muted flex items-center justify-center text-sm font-medium\">\n {user.profilePictureUrl ? (\n <img\n src={user.profilePictureUrl}\n alt={displayName}\n className=\"h-full w-full rounded-full object-cover\"\n />\n ) : (\n initials\n )}\n </div>\n <div className=\"text-sm\">\n <p className=\"font-medium\">{displayName}</p>\n <p className=\"text-muted-foreground text-xs\">{user.email}</p>\n </div>\n <button\n type=\"button\"\n onClick={() => signOut()}\n className=\"ml-auto text-sm text-muted-foreground hover:text-foreground\"\n >\n Sign out\n </button>\n </div>\n </div>\n )\n }\n\n return (\n <div className={className}>\n {renderTrigger?.(triggerProps)}\n {renderMenu?.(menuProps)}\n </div>\n )\n}\n","'use client'\n\nimport { useAuth } from '@workos-inc/authkit-react'\nimport { OrganizationSwitcher } from '@workos-inc/widgets'\nimport type { ReactNode } from 'react'\n\nexport interface TeamSwitcherProps {\n /**\n * Render function for the wrapper when in an organization.\n * The OrganizationSwitcher widget will be rendered inside this wrapper.\n */\n renderWrapper?: (children: ReactNode) => ReactNode\n /**\n * Render function for when there is no organization.\n * If not provided, returns null.\n */\n renderNoOrganization?: () => ReactNode\n /** CSS class name for the organization switcher wrapper */\n className?: string\n}\n\n/**\n * TeamSwitcher component that uses WorkOS authentication.\n *\n * Shows the WorkOS OrganizationSwitcher widget when authenticated with an organization,\n * or a custom \"no organization\" component when not.\n *\n * This is a headless component - you provide render functions for the UI.\n * For a pre-built sidebar menu version, use your design system's sidebar components.\n *\n * @example\n * ```tsx\n * import { TeamSwitcher } from '@mdxui/auth'\n * import { SidebarMenu, SidebarMenuItem } from '@mdxui/primitives/sidebar'\n * import { Building2 } from 'lucide-react'\n *\n * function MyTeamSwitcher() {\n * return (\n * <TeamSwitcher\n * renderWrapper={(children) => (\n * <SidebarMenu>\n * <SidebarMenuItem>\n * <div className=\"organization-switcher-wrapper\">\n * {children}\n * </div>\n * </SidebarMenuItem>\n * </SidebarMenu>\n * )}\n * renderNoOrganization={() => (\n * <SidebarMenu>\n * <SidebarMenuItem>\n * <div className=\"flex items-center gap-2\">\n * <Building2 className=\"size-4\" />\n * <span>No Organization</span>\n * </div>\n * </SidebarMenuItem>\n * </SidebarMenu>\n * )}\n * />\n * )\n * }\n * ```\n *\n * @example\n * ```tsx\n * // Simple usage without custom rendering\n * <TeamSwitcher className=\"my-org-switcher\" />\n * ```\n */\nexport function TeamSwitcher({\n renderWrapper,\n renderNoOrganization,\n className,\n}: TeamSwitcherProps) {\n const { getAccessToken, switchToOrganization, organizationId } = useAuth()\n\n // No organization - show custom component or null\n if (!organizationId) {\n return renderNoOrganization?.() ?? null\n }\n\n // Adapt switchToOrganization to the widget's expected signature\n const handleSwitchOrganization = ({\n organizationId,\n }: {\n organizationId: string\n }) => {\n return switchToOrganization({ organizationId })\n }\n\n // Render the OrganizationSwitcher widget with required wrapper class for styling\n const widget = (\n <div className={`organization-switcher-wrapper ${className ?? ''}`}>\n <OrganizationSwitcher\n authToken={getAccessToken}\n switchToOrganization={handleSwitchOrganization}\n />\n </div>\n )\n\n // Wrap in custom wrapper if provided\n return renderWrapper ? renderWrapper(widget) : widget\n}\n","'use client'\n\n/**\n * Re-export useAuth from WorkOS AuthKit\n *\n * This hook provides access to the authentication state and methods:\n * - user: The authenticated user object\n * - isLoading: Whether auth state is being loaded\n * - signIn: Function to initiate sign in\n * - signOut: Function to sign out\n * - getAccessToken: Function to get the current access token\n * - organizationId: Current organization ID (if in org context)\n * - permissions: User's permissions array\n *\n * @example\n * ```tsx\n * import { useAuth } from '@mdxui/auth'\n *\n * function MyComponent() {\n * const { user, isLoading, signIn, signOut, getAccessToken } = useAuth()\n *\n * if (isLoading) return <div>Loading...</div>\n * if (!user) return <button onClick={() => signIn()}>Sign In</button>\n *\n * return (\n * <div>\n * <p>Hello, {user.firstName}!</p>\n * <button onClick={() => signOut()}>Sign Out</button>\n * </div>\n * )\n * }\n * ```\n */\nexport { useAuth } from '@workos-inc/authkit-react'\n","'use client'\n\nimport { useCallback, useEffect, useState } from 'react'\nimport type { UseWidgetTokenOptions, UseWidgetTokenResult } from '../types/auth'\n\n/**\n * Hook to fetch authorization tokens for WorkOS widgets\n *\n * Use this hook when you need to fetch widget tokens from a backend endpoint,\n * typically for server-side auth scenarios. For client-side AuthKit usage,\n * you can use `getAccessToken` from `useAuth()` directly with widgets.\n *\n * @param options - Options for token fetching\n * @param options.widget - The widget type (user-profile, user-security, api-keys, etc.)\n * @param options.organizationId - Optional organization context\n * @param options.endpoint - Custom endpoint (default: /api/workos/widget-token)\n * @returns Token state and refetch function\n *\n * @example\n * ```tsx\n * // Server-side token fetching (via backend endpoint)\n * const { token, loading, error } = useWidgetToken({\n * widget: 'user-profile',\n * })\n *\n * if (loading) return <Spinner />\n * if (error) return <Error message={error} />\n * return <UserProfile authToken={token!} />\n * ```\n *\n * @example\n * ```tsx\n * // Client-side AuthKit (recommended - no backend needed)\n * import { useAuth } from '@mdxui/auth'\n * import { UserProfile } from '@mdxui/auth/widgets'\n *\n * const { getAccessToken } = useAuth()\n * return <UserProfile authToken={getAccessToken} />\n * ```\n */\nexport function useWidgetToken({\n widget,\n organizationId,\n endpoint = '/api/workos/widget-token',\n}: UseWidgetTokenOptions): UseWidgetTokenResult {\n const [token, setToken] = useState<string | null>(null)\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n\n const fetchToken = useCallback(async () => {\n try {\n setLoading(true)\n setError(null)\n\n const params = new URLSearchParams({ widget })\n if (organizationId) {\n params.set('organizationId', organizationId)\n }\n\n const response = await fetch(`${endpoint}?${params}`)\n const data = await response.json()\n\n if (!response.ok) {\n throw new Error(data.error || 'Failed to fetch token')\n }\n\n setToken(data.token)\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Token fetch failed')\n } finally {\n setLoading(false)\n }\n }, [widget, organizationId, endpoint])\n\n useEffect(() => {\n fetchToken()\n }, [fetchToken])\n\n return { token, loading, error, refetch: fetchToken }\n}\n","'use client'\n\nimport { useCallback, useMemo } from 'react'\nimport { useVaultContext, useVaultContextOptional } from '../providers/vault-provider'\nimport type { VaultItem, VaultField } from '../vault/types'\n\n/**\n * Result from useVault hook\n */\nexport interface UseVaultResult {\n /** List of vault items */\n items: VaultItem[]\n /** Whether the vault is loading */\n loading: boolean\n /** Error message if any */\n error: string | null\n /** Whether a vault client is connected */\n isConnected: boolean\n /** Reload vault items from the backend */\n reload: () => Promise<void>\n /** Create a new vault item */\n create: (integrationId: string, credentials: Record<string, string>) => Promise<void>\n /** Rotate credentials for an existing item */\n rotate: (id: string, credentials: Record<string, string>) => Promise<void>\n /** Delete a vault item */\n remove: (id: string) => Promise<void>\n /** Get field configuration for an integration */\n getIntegrationFields: (integrationId: string) => VaultField[]\n /** Find an item by ID */\n findItem: (id: string) => VaultItem | undefined\n /** Find items by integration ID */\n findByIntegration: (integrationId: string) => VaultItem[]\n}\n\n/**\n * Hook to access vault state and operations\n *\n * Provides access to the vault context with helper methods for\n * common operations like finding items and managing credentials.\n *\n * Must be used within a VaultProvider.\n *\n * @example\n * ```tsx\n * import { useVault } from '@mdxui/auth'\n *\n * function VaultDashboard() {\n * const {\n * items,\n * loading,\n * create,\n * rotate,\n * remove,\n * findByIntegration,\n * } = useVault()\n *\n * const openaiItems = findByIntegration('openai')\n *\n * const handleCreate = async () => {\n * await create('github', { personal_access_token: 'ghp_...' })\n * }\n *\n * if (loading) return <div>Loading...</div>\n *\n * return (\n * <ul>\n * {items.map(item => (\n * <li key={item.id}>{item.name}</li>\n * ))}\n * </ul>\n * )\n * }\n * ```\n */\nexport function useVault(): UseVaultResult {\n const context = useVaultContext()\n\n const findItem = useCallback(\n (id: string): VaultItem | undefined => {\n return context.items.find((item) => item.id === id)\n },\n [context.items]\n )\n\n const findByIntegration = useCallback(\n (integrationId: string): VaultItem[] => {\n return context.items.filter((item) => item.integrationId === integrationId)\n },\n [context.items]\n )\n\n return useMemo(\n () => ({\n items: context.items,\n loading: context.loading,\n error: context.error,\n isConnected: context.client !== null,\n reload: context.reload,\n create: context.createItem,\n rotate: context.rotateItem,\n remove: context.deleteItem,\n getIntegrationFields: context.getIntegrationFields,\n findItem,\n findByIntegration,\n }),\n [context, findItem, findByIntegration]\n )\n}\n\n/**\n * Optional vault hook that returns null if not within a VaultProvider\n *\n * Useful for components that can optionally integrate with the vault\n * when it's available.\n *\n * @example\n * ```tsx\n * function MaybeVaultComponent() {\n * const vault = useVaultOptional()\n *\n * if (!vault) {\n * return <div>Vault not available</div>\n * }\n *\n * return <VaultList items={vault.items} ... />\n * }\n * ```\n */\nexport function useVaultOptional(): UseVaultResult | null {\n const context = useVaultContextOptional()\n\n const findItem = useCallback(\n (id: string): VaultItem | undefined => {\n return context?.items.find((item) => item.id === id)\n },\n [context?.items]\n )\n\n const findByIntegration = useCallback(\n (integrationId: string): VaultItem[] => {\n return context?.items.filter((item) => item.integrationId === integrationId) ?? []\n },\n [context?.items]\n )\n\n if (!context) {\n return null\n }\n\n return {\n items: context.items,\n loading: context.loading,\n error: context.error,\n isConnected: context.client !== null,\n reload: context.reload,\n create: context.createItem,\n rotate: context.rotateItem,\n remove: context.deleteItem,\n getIntegrationFields: context.getIntegrationFields,\n findItem,\n findByIntegration,\n }\n}\n","/**\n * AuthUser Schema\n *\n * Extends mdxui's UserIdentitySchema with WorkOS-specific fields.\n * AuthUser is fully compatible with UserIdentity - it can be used\n * anywhere a UserIdentity is expected.\n */\n\nimport { z } from 'zod'\nimport { UserIdentitySchema } from 'mdxui/zod'\n\n/**\n * AuthUserSchema - Extended user identity for WorkOS AuthKit\n *\n * Extends UserIdentitySchema with WorkOS-specific fields like\n * verification status and timestamps.\n *\n * @example\n * ```tsx\n * import { AuthUserSchema } from '@mdxui/auth/schemas'\n *\n * const result = AuthUserSchema.safeParse(user)\n * if (result.success) {\n * console.log(result.data.emailVerified)\n * }\n * ```\n */\nexport const AuthUserSchema = UserIdentitySchema.extend({\n // Override to be more specific (WorkOS guarantees string ID)\n id: z.string().describe('User ID from WorkOS'),\n\n // WorkOS requires email (not optional like UserIdentity)\n email: z.string().email().describe('Email address'),\n\n // WorkOS-specific fields not in UserIdentity\n emailVerified: z.boolean().describe('Email verification status'),\n\n // Timestamps\n createdAt: z.string().datetime().describe('Account creation timestamp'),\n updatedAt: z.string().datetime().describe('Last update timestamp'),\n lastSignInAt: z\n .string()\n .datetime()\n .nullable()\n .optional()\n .describe('Last sign-in timestamp'),\n})\n\n/**\n * AuthUser type inferred from schema\n *\n * This type is compatible with UserIdentity - an AuthUser can be\n * assigned to a variable of type UserIdentity.\n */\nexport type AuthUser = z.infer<typeof AuthUserSchema>\n","/**\n * AuthSession Schema\n *\n * Extends mdxui's SessionSchema with WorkOS-specific fields.\n */\n\nimport { z } from 'zod'\nimport { SessionSchema } from 'mdxui/zod'\n\n/**\n * ImpersonatorSchema - Info about admin impersonating a user\n */\nexport const ImpersonatorSchema = z.object({\n /** Impersonator's email address */\n email: z.string().email().describe(\"Impersonator's email address\"),\n /** Reason for impersonation */\n reason: z.string().optional().describe('Reason for impersonation'),\n})\n\nexport type Impersonator = z.infer<typeof ImpersonatorSchema>\n\n/**\n * AuthSessionSchema - Extended session for WorkOS AuthKit\n *\n * Extends SessionSchema with WorkOS-specific fields like\n * impersonation support.\n *\n * @example\n * ```tsx\n * import { AuthSessionSchema } from '@mdxui/auth/schemas'\n *\n * const result = AuthSessionSchema.safeParse(session)\n * if (result.success && result.data.impersonator) {\n * console.log('Being impersonated by:', result.data.impersonator.email)\n * }\n * ```\n */\nexport const AuthSessionSchema = SessionSchema.extend({\n // Override userId to be string (WorkOS uses string IDs)\n userId: z.string().describe('User ID'),\n\n // WorkOS-specific: impersonation support\n impersonator: ImpersonatorSchema.optional().describe(\n 'Impersonator info (if being impersonated)',\n ),\n})\n\n/**\n * AuthSession type inferred from schema\n */\nexport type AuthSession = z.infer<typeof AuthSessionSchema>\n","/**\n * AuthOrganization Schema\n *\n * Organization type for WorkOS AuthKit.\n */\n\nimport { z } from 'zod'\n\n/**\n * AuthOrganizationSchema - WorkOS organization\n *\n * Represents an organization/workspace in WorkOS.\n *\n * @example\n * ```tsx\n * import { AuthOrganizationSchema } from '@mdxui/auth/schemas'\n *\n * const result = AuthOrganizationSchema.safeParse(org)\n * if (result.success) {\n * console.log('Organization:', result.data.name)\n * }\n * ```\n */\nexport const AuthOrganizationSchema = z.object({\n /** Organization ID */\n id: z.string().describe('Organization ID'),\n /** Organization display name */\n name: z.string().describe('Organization name'),\n /** Organization slug (URL-friendly identifier) */\n slug: z.string().optional().describe('Organization slug'),\n /** Organization logo URL */\n logoUrl: z.string().url().optional().describe('Organization logo URL'),\n /** Whether the organization is active */\n active: z.boolean().optional().describe('Whether organization is active'),\n /** Custom domains for the organization */\n domains: z\n .array(z.string())\n .optional()\n .describe('Custom domains for the organization'),\n /** Additional metadata */\n metadata: z\n .record(z.string(), z.unknown())\n .optional()\n .describe('Additional metadata'),\n})\n\n/**\n * AuthOrganization type inferred from schema\n */\nexport type AuthOrganization = z.infer<typeof AuthOrganizationSchema>\n","/**\n * Provider Props Schemas\n *\n * Zod schemas for authentication provider component props.\n */\n\nimport { z } from 'zod'\n\n/**\n * IdentityProviderPropsSchema - Props for IdentityProvider component\n */\nexport const IdentityProviderPropsSchema = z.object({\n /** WorkOS client ID */\n clientId: z.string().describe('WorkOS client ID'),\n /** Optional API hostname override */\n apiHostname: z.string().optional().describe('Optional API hostname override'),\n /** Enable dev mode for local development */\n devMode: z.boolean().optional().describe('Enable dev mode for local development'),\n /** Redirect URI after authentication */\n redirectUri: z.string().url().optional().describe('Redirect URI after authentication'),\n /** Note: onRedirectCallback and children are React-specific, not in schema */\n})\n\nexport type IdentityProviderPropsSchemaType = z.infer<typeof IdentityProviderPropsSchema>\n\n/**\n * UnauthenticatedActionSchema - What to do when unauthenticated\n */\nexport const UnauthenticatedActionSchema = z.enum(['landing', 'redirect', 'allow', 'signIn'])\n\nexport type UnauthenticatedAction = z.infer<typeof UnauthenticatedActionSchema>\n\n/**\n * AuthGatePropsSchema - Props for AuthGate component\n */\nexport const AuthGatePropsSchema = z.object({\n /** Whether authentication is required (default: true) */\n required: z.boolean().optional().describe('Whether authentication is required'),\n /** What to do when unauthenticated */\n onUnauthenticated: UnauthenticatedActionSchema.optional().describe(\n 'What to do when unauthenticated',\n ),\n /** URL to redirect to when unauthenticated (if onUnauthenticated is \"redirect\") */\n redirectUrl: z\n .string()\n .url()\n .optional()\n .describe('URL to redirect to when unauthenticated'),\n /** Note: children, loadingComponent, landingComponent are React-specific */\n})\n\nexport type AuthGatePropsSchemaType = z.infer<typeof AuthGatePropsSchema>\n\n/**\n * AppearanceSchema - Theme appearance mode\n */\nexport const AppearanceSchema = z.enum(['light', 'dark', 'inherit'])\n\nexport type Appearance = z.infer<typeof AppearanceSchema>\n\n/**\n * RadiusSchema - Border radius style\n */\nexport const RadiusSchema = z.enum(['none', 'small', 'medium', 'large', 'full'])\n\nexport type Radius = z.infer<typeof RadiusSchema>\n\n/**\n * ScalingSchema - Scaling factor\n */\nexport const ScalingSchema = z.enum(['90%', '95%', '100%', '105%', '110%'])\n\nexport type Scaling = z.infer<typeof ScalingSchema>\n\n/**\n * WidgetsProviderPropsSchema - Props for WidgetsProvider component\n *\n * Note: Widgets always use api.workos.com - WorkOS custom domains do NOT\n * support widget endpoints. Only authentication uses custom domains.\n */\nexport const WidgetsProviderPropsSchema = z.object({\n /** Theme appearance mode */\n appearance: AppearanceSchema.optional().describe('Theme appearance mode'),\n /** Border radius style */\n radius: RadiusSchema.optional().describe('Border radius style'),\n /** Scaling factor */\n scaling: ScalingSchema.optional().describe('Scaling factor'),\n /** Note: children is React-specific, not in schema */\n})\n\nexport type WidgetsProviderPropsSchemaType = z.infer<typeof WidgetsProviderPropsSchema>\n","/**\n * Widget Props Schemas\n *\n * Zod schemas for WorkOS widget component props.\n */\n\nimport { z } from 'zod'\n\n/**\n * AuthTokenSchema - Auth token type\n *\n * Can be a string or a function that returns a Promise<string>.\n * Functions are represented as 'function' string in schema validation\n * since Zod can't validate function signatures.\n */\nexport const AuthTokenSchema = z.union([\n z.string().describe('Static auth token'),\n z.literal('function').describe('Token getter function'),\n])\n\n// Note: The actual TypeScript type is more specific\nexport type AuthTokenSchemaType = z.infer<typeof AuthTokenSchema>\n\n/**\n * BaseWidgetPropsSchema - Common props for all widget wrappers\n */\nexport const BaseWidgetPropsSchema = z.object({\n /** Auth token for the widget (string or getter function) */\n authToken: z.string().describe('Auth token for the widget'),\n /** CSS class name */\n className: z.string().optional().describe('CSS class name'),\n})\n\nexport type BaseWidgetPropsSchemaType = z.infer<typeof BaseWidgetPropsSchema>\n\n/**\n * OrganizationWidgetPropsSchema - Props for widgets that support organization context\n */\nexport const OrganizationWidgetPropsSchema = BaseWidgetPropsSchema.extend({\n /** Organization ID for org-scoped widgets */\n organizationId: z\n .string()\n .optional()\n .describe('Organization ID for org-scoped widgets'),\n})\n\nexport type OrganizationWidgetPropsSchemaType = z.infer<\n typeof OrganizationWidgetPropsSchema\n>\n\n/**\n * UseWidgetTokenOptionsSchema - Props for useWidgetToken hook\n */\nexport const UseWidgetTokenOptionsSchema = z.object({\n /** Widget type to fetch token for */\n widget: z.string().describe('Widget type to fetch token for'),\n /** Organization ID for org-scoped widgets */\n organizationId: z\n .string()\n .optional()\n .describe('Organization ID for org-scoped widgets'),\n /** Custom endpoint for fetching widget token */\n endpoint: z\n .string()\n .url()\n .optional()\n .describe('Custom endpoint for fetching widget token'),\n})\n\nexport type UseWidgetTokenOptionsSchemaType = z.infer<typeof UseWidgetTokenOptionsSchema>\n\n/**\n * UseWidgetTokenResultSchema - Result from useWidgetToken hook\n */\nexport const UseWidgetTokenResultSchema = z.object({\n /** The fetched token */\n token: z.string().nullable().describe('The fetched token'),\n /** Whether token is being fetched */\n loading: z.boolean().describe('Whether token is being fetched'),\n /** Error message if fetch failed */\n error: z.string().nullable().describe('Error message if fetch failed'),\n /** Note: refetch function is React-specific, not in schema */\n})\n\nexport type UseWidgetTokenResultSchemaType = z.infer<typeof UseWidgetTokenResultSchema>\n","'use client'\n\n/**\n * Auth Shell Configuration Context\n *\n * Provides configuration and route information to shell components.\n * Use the hooks to access config, routes, and branding.\n */\n\nimport { createContext, useContext, useMemo, type ReactNode } from 'react'\nimport type { AuthAppConfig, AuthAppRoute, AuthShellBranding, RouteGroup } from './types'\nimport { defaultGroups, defaultRoutes } from './route-presets'\n\n/**\n * Context value shape\n */\ninterface AuthShellConfigContextValue {\n /** Full configuration */\n config: AuthAppConfig\n /** All enabled routes */\n routes: AuthAppRoute[]\n /** Routes organized by group */\n routesByGroup: Map<string, AuthAppRoute[]>\n /** Route groups sorted by order */\n groups: RouteGroup[]\n /** Branding configuration */\n branding: AuthShellBranding\n /** Base path for routes */\n basePath: string\n}\n\nconst AuthShellConfigContext = createContext<AuthShellConfigContextValue | null>(null)\n\n/**\n * Props for AuthShellConfigProvider\n */\ninterface AuthShellConfigProviderProps {\n /** Shell configuration */\n config: AuthAppConfig\n /** Children to render */\n children: ReactNode\n}\n\n/**\n * Provides shell configuration context to children\n *\n * @example\n * ```tsx\n * <AuthShellConfigProvider config={config}>\n * <AuthShell>\n * <Outlet />\n * </AuthShell>\n * </AuthShellConfigProvider>\n * ```\n */\nexport function AuthShellConfigProvider({ config, children }: AuthShellConfigProviderProps) {\n const value = useMemo<AuthShellConfigContextValue>(() => {\n // Filter to enabled routes only\n const routes = config.routes ?? defaultRoutes\n const enabledRoutes = routes.filter((route) => route.enabled !== false)\n\n // Sort groups by order\n const groups = [...(config.groups ?? defaultGroups)].sort((a, b) => (a.order ?? 0) - (b.order ?? 0))\n\n // Organize routes by group\n const routesByGroup = new Map<string, AuthAppRoute[]>()\n\n // Initialize groups\n for (const group of groups) {\n routesByGroup.set(group.id, [])\n }\n\n // Sort routes into groups\n for (const route of enabledRoutes) {\n const groupId = route.group ?? 'main'\n const groupRoutes = routesByGroup.get(groupId) ?? []\n groupRoutes.push(route)\n routesByGroup.set(groupId, groupRoutes)\n }\n\n // Sort routes within each group by order\n for (const [groupId, routes] of routesByGroup) {\n routesByGroup.set(\n groupId,\n routes.sort((a, b) => (a.order ?? 0) - (b.order ?? 0))\n )\n }\n\n return {\n config,\n routes: enabledRoutes,\n routesByGroup,\n groups,\n branding: config.branding,\n basePath: config.basePath ?? '',\n }\n }, [config])\n\n return (\n <AuthShellConfigContext.Provider value={value}>\n {children}\n </AuthShellConfigContext.Provider>\n )\n}\n\n/**\n * Access the full shell configuration context\n *\n * @throws Error if used outside AuthShellConfigProvider\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { config, routes, branding } = useAuthShellConfig()\n * return <div>{branding.name}</div>\n * }\n * ```\n */\nexport function useAuthShellConfig(): AuthShellConfigContextValue {\n const context = useContext(AuthShellConfigContext)\n if (!context) {\n throw new Error('useAuthShellConfig must be used within AuthShellConfigProvider')\n }\n return context\n}\n\n/**\n * Access enabled routes array\n *\n * @example\n * ```tsx\n * function RouteList() {\n * const routes = useAuthShellRoutes()\n * return routes.map(r => <Link key={r.key} to={r.path}>{r.label}</Link>)\n * }\n * ```\n */\nexport function useAuthShellRoutes(): AuthAppRoute[] {\n const { routes } = useAuthShellConfig()\n return routes\n}\n\n/**\n * Access routes organized by group\n *\n * @example\n * ```tsx\n * function GroupedNav() {\n * const { routesByGroup, groups } = useAuthShellRoutesByGroup()\n * return groups.map(g => (\n * <div key={g.id}>\n * {g.label && <h3>{g.label}</h3>}\n * {routesByGroup.get(g.id)?.map(r => <Link to={r.path}>{r.label}</Link>)}\n * </div>\n * ))\n * }\n * ```\n */\nexport function useAuthShellRoutesByGroup(): {\n routesByGroup: Map<string, AuthAppRoute[]>\n groups: RouteGroup[]\n} {\n const { routesByGroup, groups } = useAuthShellConfig()\n return { routesByGroup, groups }\n}\n\n/**\n * Access branding configuration\n *\n * @example\n * ```tsx\n * function Header() {\n * const branding = useAuthShellBranding()\n * return (\n * <header>\n * {branding.logo}\n * <span>{branding.name}</span>\n * </header>\n * )\n * }\n * ```\n */\nexport function useAuthShellBranding(): AuthShellBranding {\n const { branding } = useAuthShellConfig()\n return branding\n}\n\n/**\n * Get full path with base path prefix\n *\n * @example\n * ```tsx\n * function NavLink({ route }: { route: AuthAppRoute }) {\n * const getFullPath = useAuthShellFullPath()\n * return <Link to={getFullPath(route.path)}>{route.label}</Link>\n * }\n * ```\n */\nexport function useAuthShellFullPath(): (path: string) => string {\n const { basePath } = useAuthShellConfig()\n return useMemo(() => {\n return (path: string) => {\n if (!basePath) return path\n // Handle root path\n if (path === '/') return basePath || '/'\n // Combine base path and route path\n return `${basePath}${path}`\n }\n }, [basePath])\n}\n","/**\n * Route Presets\n *\n * Default route configurations for AuthApp. These provide a zero-config\n * experience - just provide branding and identity config to get started.\n */\n\nimport { Key, Monitor, Plug, Shield, User, Users } from \"lucide-react\";\nimport {\n\tApiKeysPage,\n\tIntegrationsPage,\n\tProfilePage,\n\tSecurityPage,\n\tSessionsPage,\n\tTeamPage,\n} from \"./pages\";\nimport type { AuthAppRoute, RouteGroup } from \"./types\";\n\n/**\n * Default route groups for organizing navigation\n */\nexport const defaultGroups: RouteGroup[] = [\n\t{ id: \"main\", order: 0 },\n\t{ id: \"account\", label: \"Account\", order: 10 },\n\t{ id: \"developer\", label: \"Developer\", order: 20 },\n\t{ id: \"admin\", label: \"Admin\", order: 30 },\n];\n\n/**\n * Account management routes\n */\nexport const accountRoutes: AuthAppRoute[] = [\n\t{\n\t\tkey: \"profile\",\n\t\tpath: \"/profile\",\n\t\tlabel: \"Profile\",\n\t\tgroup: \"account\",\n\t\ticon: User,\n\t\tcomponent: ProfilePage,\n\t\tenabled: true,\n\t\tpublic: false,\n\t},\n\t{\n\t\tkey: \"security\",\n\t\tpath: \"/security\",\n\t\tlabel: \"Security\",\n\t\tgroup: \"account\",\n\t\ticon: Shield,\n\t\tcomponent: SecurityPage,\n\t\tenabled: true,\n\t\tpublic: false,\n\t},\n\t{\n\t\tkey: \"sessions\",\n\t\tpath: \"/sessions\",\n\t\tlabel: \"Sessions\",\n\t\tgroup: \"account\",\n\t\ticon: Monitor,\n\t\tcomponent: SessionsPage,\n\t\tenabled: true,\n\t\tpublic: false,\n\t},\n];\n\n/**\n * Developer-focused routes\n */\nexport const developerRoutes: AuthAppRoute[] = [\n\t{\n\t\tkey: \"api-keys\",\n\t\tpath: \"/api-keys\",\n\t\tlabel: \"API Keys\",\n\t\tgroup: \"developer\",\n\t\ticon: Key,\n\t\tcomponent: ApiKeysPage,\n\t\tenabled: true,\n\t\tpublic: false,\n\t},\n];\n\n/**\n * Admin/team management routes\n */\nexport const adminRoutes: AuthAppRoute[] = [\n\t{\n\t\tkey: \"team\",\n\t\tpath: \"/team\",\n\t\tlabel: \"Team\",\n\t\tgroup: \"admin\",\n\t\ticon: Users,\n\t\tcomponent: TeamPage,\n\t\tenabled: true,\n\t\tpublic: false,\n\t},\n];\n\n/**\n * Integration routes (optional, not included in defaults)\n */\nexport const integrationRoutes: AuthAppRoute[] = [\n\t{\n\t\tkey: \"integrations\",\n\t\tpath: \"/integrations\",\n\t\tlabel: \"Integrations\",\n\t\tgroup: \"developer\",\n\t\ticon: Plug,\n\t\tcomponent: IntegrationsPage,\n\t\tenabled: true,\n\t\tpublic: false,\n\t},\n];\n\n/**\n * Default routes - all standard routes combined\n *\n * Includes: account, developer, and admin routes\n * Does NOT include: integrationRoutes (opt-in)\n */\nexport const defaultRoutes: AuthAppRoute[] = [\n\t...accountRoutes,\n\t...developerRoutes,\n\t...adminRoutes,\n];\n","'use client'\n\n/**\n * Breadcrumbs Component\n *\n * Router-agnostic breadcrumbs that can work with any Link component.\n * Defaults to @mdxui/navigation/web WebLink for TanStack Router.\n * Uses @mdxui/primitives breadcrumb components under the hood.\n */\n\nimport { WebLink } from '@mdxui/navigation/web'\nimport {\n Breadcrumb,\n BreadcrumbEllipsis,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbList,\n BreadcrumbPage,\n BreadcrumbSeparator,\n} from '@mdxui/primitives/breadcrumb'\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '@mdxui/primitives/dropdown-menu'\nimport * as React from 'react'\n\n/**\n * Props for the Link component\n */\nexport interface BreadcrumbLinkProps {\n href: string\n children: React.ReactNode\n className?: string\n onClick?: () => void\n}\n\n/**\n * Single breadcrumb item configuration\n */\nexport interface BreadcrumbItemConfig {\n /** Display label */\n label: string\n /** Route path - last item should not have href */\n href?: string\n}\n\n/**\n * Props for the Breadcrumbs component\n */\nexport interface BreadcrumbsProps {\n /** Array of breadcrumb items */\n items: BreadcrumbItemConfig[]\n /** Custom link component (e.g., Next.js Link, TanStack Link). Defaults to WebLink */\n LinkComponent?: React.ComponentType<BreadcrumbLinkProps>\n /** Additional class names */\n className?: string\n /** Maximum items to show before collapsing */\n maxItems?: number\n /** Custom separator element */\n separator?: React.ReactNode\n}\n\n/**\n * Default link component using @mdxui/navigation/web WebLink\n */\nfunction DefaultLink({ href, children, className }: BreadcrumbLinkProps) {\n return (\n <WebLink to={href} className={className}>\n {children}\n </WebLink>\n )\n}\n\n/**\n * Breadcrumbs provides navigation context showing the user's location.\n *\n * Features:\n * - Router-agnostic - works with any Link component\n * - Defaults to @mdxui/navigation/web WebLink for TanStack Router\n * - Automatic collapse with dropdown for long paths\n * - Accessible breadcrumb semantics\n * - Custom separator support\n *\n * @example\n * ```tsx\n * // With default WebLink (TanStack Router)\n * <Breadcrumbs\n * items={[\n * { label: 'Home', href: '/' },\n * { label: 'Users', href: '/users' },\n * { label: 'John Doe' },\n * ]}\n * />\n *\n * // With Next.js Link\n * import NextLink from 'next/link'\n *\n * <Breadcrumbs\n * items={breadcrumbItems}\n * LinkComponent={NextLink}\n * />\n *\n * // With custom Link wrapper\n * <Breadcrumbs\n * items={breadcrumbItems}\n * LinkComponent={({ href, children, className }) => (\n * <MyCustomLink to={href} className={className}>{children}</MyCustomLink>\n * )}\n * />\n * ```\n */\nexport function Breadcrumbs({\n items,\n LinkComponent = DefaultLink,\n className,\n maxItems = 4,\n separator,\n}: BreadcrumbsProps) {\n // Handle empty items\n if (!items || items.length === 0) {\n return null\n }\n\n // Determine if we need to collapse items\n const shouldCollapse = items.length > maxItems\n const visibleItems = shouldCollapse\n ? [items[0], ...items.slice(-(maxItems - 1))]\n : items\n const hiddenItems = shouldCollapse\n ? items.slice(1, -(maxItems - 1))\n : []\n\n return (\n <Breadcrumb className={className}>\n <BreadcrumbList>\n {visibleItems.map((item, index) => {\n const isLast = index === visibleItems.length - 1\n const isFirst = index === 0\n\n // Insert ellipsis after first item if collapsing\n if (shouldCollapse && isFirst) {\n return (\n <React.Fragment key={item.label}>\n <BreadcrumbItem>\n {item.href ? (\n <BreadcrumbLink asChild>\n <LinkComponent href={item.href}>{item.label}</LinkComponent>\n </BreadcrumbLink>\n ) : (\n <BreadcrumbPage>{item.label}</BreadcrumbPage>\n )}\n </BreadcrumbItem>\n <BreadcrumbSeparator>{separator}</BreadcrumbSeparator>\n <BreadcrumbItem>\n <DropdownMenu>\n <DropdownMenuTrigger\n className=\"flex items-center gap-1 hover:text-foreground\"\n aria-label=\"Show hidden breadcrumbs\"\n >\n <BreadcrumbEllipsis className=\"size-4\" />\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\">\n {hiddenItems.map((hiddenItem) => (\n <DropdownMenuItem key={hiddenItem.label} asChild>\n <LinkComponent href={hiddenItem.href || '#'}>\n {hiddenItem.label}\n </LinkComponent>\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n </BreadcrumbItem>\n <BreadcrumbSeparator>{separator}</BreadcrumbSeparator>\n </React.Fragment>\n )\n }\n\n return (\n <React.Fragment key={item.label}>\n <BreadcrumbItem>\n {isLast ? (\n <BreadcrumbPage>{item.label}</BreadcrumbPage>\n ) : item.href ? (\n <BreadcrumbLink asChild>\n <LinkComponent href={item.href}>{item.label}</LinkComponent>\n </BreadcrumbLink>\n ) : (\n <BreadcrumbPage>{item.label}</BreadcrumbPage>\n )}\n </BreadcrumbItem>\n {!isLast && <BreadcrumbSeparator>{separator}</BreadcrumbSeparator>}\n </React.Fragment>\n )\n })}\n </BreadcrumbList>\n </Breadcrumb>\n )\n}\n\nBreadcrumbs.displayName = 'Breadcrumbs'\n","'use client'\n\nimport { TeamSwitcher } from '../../components/team-switcher'\nimport { useAuthShellBranding } from '../config-context'\n\n/**\n * Pre-wired OrganizationSwitcher for sidebar header.\n *\n * Automatically uses shell branding context - when the user belongs to an\n * organization, shows the OrganizationSwitcher widget. When not in an\n * organization, falls back to displaying the app branding (logo + name).\n *\n * This component is used by default in AuthApp and AuthAppWithChildren.\n * You only need to explicitly pass it if using AuthShell directly or\n * if you want to override the default with a custom component.\n *\n * @example\n * ```tsx\n * // AuthApp uses SidebarOrgSwitcher by default - no config needed!\n * import { AuthApp } from '@mdxui/auth/shell'\n *\n * <AuthApp config={config} />\n * ```\n *\n * @example\n * ```tsx\n * // With AuthShell directly (manual setup)\n * import { AuthShell, SidebarOrgSwitcher } from '@mdxui/auth/shell'\n *\n * <AuthShell sidebarHeaderContent={<SidebarOrgSwitcher />}>\n * <Outlet />\n * </AuthShell>\n * ```\n */\nexport function SidebarOrgSwitcher() {\n const branding = useAuthShellBranding()\n\n return (\n <TeamSwitcher\n renderNoOrganization={() => (\n <div className=\"flex items-center gap-2 px-2\">\n {branding.logo && <div className=\"flex-shrink-0\">{branding.logo}</div>}\n <div className=\"flex flex-col gap-0.5 leading-none\">\n <span className=\"font-semibold\">{branding.name}</span>\n {branding.tagline && (\n <span className=\"text-xs text-muted-foreground\">{branding.tagline}</span>\n )}\n </div>\n </div>\n )}\n />\n )\n}\n","'use client'\n\nimport { Component, type ReactNode } from 'react'\n\n/** Known widget names with custom error messages */\ntype KnownWidgetName = 'profile' | 'security' | 'sessions' | 'api-keys' | 'team' | 'integrations'\n\ninterface WidgetErrorBoundaryProps {\n children: ReactNode\n /** Widget name for contextual error messages (known names get fun messages, others get a friendly default) */\n widgetName?: KnownWidgetName | (string & {})\n /** Custom fallback UI (overrides default error message) */\n fallback?: ReactNode\n}\n\ninterface WidgetErrorBoundaryState {\n hasError: boolean\n error?: Error\n}\n\n/** Friendly, contextual error messages for known widget types */\nconst widgetErrorMessages: Record<KnownWidgetName, string> = {\n profile: \"Your profile is camera shy right now...\",\n security: \"Security settings are being extra secure (maybe too secure)...\",\n sessions: \"Your sessions are having a session of their own...\",\n 'api-keys': \"Your API keys are playing hide and seek...\",\n team: \"Your team members wandered off for a moment...\",\n integrations: \"Your integrations are having connection issues (ironic, we know)...\",\n}\n\n/** Words that should be fully uppercased */\nconst uppercaseWords = new Set(['api', 'sso', 'mfa', 'oauth', 'jwt', 'url', 'id'])\n\n/** Formats a widget name for display: \"api-keys\" -> \"API Keys\" */\nfunction formatWidgetName(widgetName: string): string {\n return widgetName\n .split('-')\n .map(word => {\n const lower = word.toLowerCase()\n if (uppercaseWords.has(lower)) {\n return word.toUpperCase()\n }\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()\n })\n .join(' ')\n}\n\n/** Generates a friendly error message - fun message for known widgets, friendly default for others */\nfunction getErrorMessage(widgetName?: string): string {\n if (!widgetName) {\n return \"Something went wrong loading this widget.\"\n }\n\n const knownMessage = widgetErrorMessages[widgetName as KnownWidgetName]\n if (knownMessage) {\n return knownMessage\n }\n\n // Friendly fallback: \"Something went wrong loading your API Keys...\"\n return `Something went wrong loading your ${formatWidgetName(widgetName)}...`\n}\n\n/**\n * Error boundary for WorkOS widgets.\n * Catches rendering errors and displays a friendly, contextual fallback UI.\n */\nexport class WidgetErrorBoundary extends Component<\n WidgetErrorBoundaryProps,\n WidgetErrorBoundaryState\n> {\n constructor(props: WidgetErrorBoundaryProps) {\n super(props)\n this.state = { hasError: false }\n }\n\n static getDerivedStateFromError(error: Error): WidgetErrorBoundaryState {\n return { hasError: true, error }\n }\n\n componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {\n console.error('[WidgetErrorBoundary] Widget error:', error, errorInfo)\n }\n\n render() {\n if (this.state.hasError) {\n if (this.props.fallback) {\n return this.props.fallback\n }\n\n const message = getErrorMessage(this.props.widgetName)\n\n return (\n <div className=\"flex flex-col items-center justify-center gap-2 rounded-[var(--radius-md)] border border-dashed py-12\">\n <p className=\"text-muted-foreground text-sm\">{message}</p>\n <p className=\"text-muted-foreground/60 text-xs\">\n Try refreshing the page.\n </p>\n </div>\n )\n }\n\n return this.props.children\n }\n}\n","'use client'\n\nimport { UserProfile } from '../../widgets/user-profile'\nimport { useAuth } from '../../hooks/use-auth'\nimport { WidgetErrorBoundary } from '../components'\n\n/**\n * Profile page that renders the UserProfile widget\n *\n * Displays user account information including name, email, and profile picture.\n */\nexport function ProfilePage() {\n const { user, getAccessToken, isLoading } = useAuth()\n\n if (isLoading) {\n return (\n <div className=\"flex items-center justify-center py-12 text-muted-foreground\">\n Loading...\n </div>\n )\n }\n\n if (!user) {\n return (\n <div className=\"container max-w-4xl py-8\">\n <div className=\"mb-8\">\n <h1 className=\"text-2xl font-semibold tracking-tight\">Profile</h1>\n <p className=\"text-muted-foreground\">Manage your account information</p>\n </div>\n <div className=\"flex items-center justify-center rounded-[var(--radius-md)] border border-dashed py-24\">\n <p className=\"text-muted-foreground text-sm\">\n Please sign in to view your profile.\n </p>\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"container max-w-4xl py-8\">\n <div className=\"mb-8\">\n <h1 className=\"text-2xl font-semibold tracking-tight\">Profile</h1>\n <p className=\"text-muted-foreground\">Manage your account information</p>\n </div>\n <WidgetErrorBoundary widgetName=\"profile\">\n <UserProfile authToken={getAccessToken} />\n </WidgetErrorBoundary>\n </div>\n )\n}\n","'use client'\n\nimport { UserSecurity } from '../../widgets/user-security'\nimport { useAuth } from '../../hooks/use-auth'\nimport { WidgetErrorBoundary } from '../components'\n\n/**\n * Security page that renders the UserSecurity widget\n *\n * Allows users to manage password and MFA settings.\n */\nexport function SecurityPage() {\n const { user, getAccessToken, isLoading } = useAuth()\n\n if (isLoading) {\n return (\n <div className=\"flex items-center justify-center py-12 text-muted-foreground\">\n Loading...\n </div>\n )\n }\n\n if (!user) {\n return (\n <div className=\"container max-w-4xl py-8\">\n <div className=\"mb-8\">\n <h1 className=\"text-2xl font-semibold tracking-tight\">Security</h1>\n <p className=\"text-muted-foreground\">Manage your password and authentication settings</p>\n </div>\n <div className=\"flex items-center justify-center rounded-[var(--radius-md)] border border-dashed py-24\">\n <p className=\"text-muted-foreground text-sm\">\n Please sign in to manage your security settings.\n </p>\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"container max-w-4xl py-8\">\n <div className=\"mb-8\">\n <h1 className=\"text-2xl font-semibold tracking-tight\">Security</h1>\n <p className=\"text-muted-foreground\">Manage your password and authentication settings</p>\n </div>\n <WidgetErrorBoundary widgetName=\"security\">\n <UserSecurity authToken={getAccessToken} />\n </WidgetErrorBoundary>\n </div>\n )\n}\n","'use client'\n\nimport { UserSessions } from '../../widgets/user-sessions'\nimport { useAuth } from '../../hooks/use-auth'\nimport { WidgetErrorBoundary } from '../components'\n\n/**\n * Sessions page that renders the UserSessions widget\n *\n * Displays active sessions and allows users to revoke them.\n */\nexport function SessionsPage() {\n const { user, getAccessToken, isLoading } = useAuth()\n\n if (isLoading) {\n return (\n <div className=\"flex items-center justify-center py-12 text-muted-foreground\">\n Loading...\n </div>\n )\n }\n\n if (!user) {\n return (\n <div className=\"container max-w-4xl py-8\">\n <div className=\"mb-8\">\n <h1 className=\"text-2xl font-semibold tracking-tight\">Sessions</h1>\n <p className=\"text-muted-foreground\">View and manage your active sessions</p>\n </div>\n <div className=\"flex items-center justify-center rounded-[var(--radius-md)] border border-dashed py-24\">\n <p className=\"text-muted-foreground text-sm\">\n Please sign in to view your sessions.\n </p>\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"container max-w-4xl py-8\">\n <div className=\"mb-8\">\n <h1 className=\"text-2xl font-semibold tracking-tight\">Sessions</h1>\n <p className=\"text-muted-foreground\">View and manage your active sessions</p>\n </div>\n <WidgetErrorBoundary widgetName=\"sessions\">\n <UserSessions authToken={getAccessToken} />\n </WidgetErrorBoundary>\n </div>\n )\n}\n","'use client'\n\nimport { ApiKeys } from '../../widgets/api-keys'\nimport { useAuth } from '../../hooks/use-auth'\nimport { WidgetErrorBoundary } from '../components'\n\n/**\n * API Keys page that renders the ApiKeys widget\n *\n * Allows users to create and manage their API keys.\n */\nexport function ApiKeysPage() {\n const { user, getAccessToken, isLoading } = useAuth()\n\n if (isLoading) {\n return (\n <div className=\"flex items-center justify-center py-12 text-muted-foreground\">\n Loading...\n </div>\n )\n }\n\n if (!user) {\n return (\n <div className=\"container max-w-4xl py-8\">\n <div className=\"mb-8\">\n <h1 className=\"text-2xl font-semibold tracking-tight\">API Keys</h1>\n <p className=\"text-muted-foreground\">Create and manage your API keys</p>\n </div>\n <div className=\"flex items-center justify-center rounded-[var(--radius-md)] border border-dashed py-24\">\n <p className=\"text-muted-foreground text-sm\">\n Please sign in to manage your API keys.\n </p>\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"container max-w-4xl py-8\">\n <div className=\"mb-8\">\n <h1 className=\"text-2xl font-semibold tracking-tight\">API Keys</h1>\n <p className=\"text-muted-foreground\">Create and manage your API keys</p>\n </div>\n <WidgetErrorBoundary widgetName=\"api-keys\">\n <ApiKeys authToken={getAccessToken} />\n </WidgetErrorBoundary>\n </div>\n )\n}\n","'use client'\n\nimport { UsersManagement } from '../../widgets/users-management'\nimport { useAuth } from '../../hooks/use-auth'\nimport { WidgetErrorBoundary } from '../components'\n\n/**\n * Team page that renders the UsersManagement widget\n *\n * Requires organization membership and admin permissions to view.\n */\nexport function TeamPage() {\n const { user, getAccessToken, isLoading, organizationId, permissions } = useAuth()\n\n const hasOrganization = !!organizationId\n const canManageTeam = hasOrganization && permissions?.includes('widgets:users-table:manage')\n\n if (isLoading) {\n return (\n <div className=\"flex items-center justify-center py-12 text-muted-foreground\">\n Loading...\n </div>\n )\n }\n\n if (!user) {\n return (\n <div className=\"container max-w-4xl py-8\">\n <div className=\"mb-8\">\n <h1 className=\"text-2xl font-semibold tracking-tight\">Team</h1>\n <p className=\"text-muted-foreground\">Manage your team members and invitations</p>\n </div>\n <div className=\"flex items-center justify-center rounded-[var(--radius-md)] border border-dashed py-24\">\n <p className=\"text-muted-foreground text-sm\">\n Please sign in to manage your team.\n </p>\n </div>\n </div>\n )\n }\n\n if (!hasOrganization) {\n return (\n <div className=\"container max-w-4xl py-8\">\n <div className=\"mb-8\">\n <h1 className=\"text-2xl font-semibold tracking-tight\">Team</h1>\n <p className=\"text-muted-foreground\">Manage your team members and invitations</p>\n </div>\n <div className=\"flex items-center justify-center rounded-[var(--radius-md)] border border-dashed py-24\">\n <p className=\"text-muted-foreground text-sm\">\n You need to be part of an organization to manage team members.\n </p>\n </div>\n </div>\n )\n }\n\n if (!canManageTeam) {\n return (\n <div className=\"container max-w-4xl py-8\">\n <div className=\"mb-8\">\n <h1 className=\"text-2xl font-semibold tracking-tight\">Team</h1>\n <p className=\"text-muted-foreground\">Manage your team members and invitations</p>\n </div>\n <div className=\"flex items-center justify-center rounded-[var(--radius-md)] border border-dashed py-24\">\n <p className=\"text-muted-foreground text-sm\">\n You need admin permissions to manage team members.\n </p>\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"container max-w-4xl py-8\">\n <div className=\"mb-8\">\n <h1 className=\"text-2xl font-semibold tracking-tight\">Team</h1>\n <p className=\"text-muted-foreground\">Manage your team members and invitations</p>\n </div>\n <WidgetErrorBoundary widgetName=\"team\">\n <UsersManagement authToken={getAccessToken} />\n </WidgetErrorBoundary>\n </div>\n )\n}\n","'use client'\n\nimport { Pipes } from '../../widgets/pipes'\nimport { useAuth } from '../../hooks/use-auth'\nimport { WidgetErrorBoundary } from '../components'\n\n/**\n * Integrations page that renders the Pipes widget\n *\n * Allows users to connect and manage third-party integrations.\n */\nexport function IntegrationsPage() {\n const { user, getAccessToken, isLoading } = useAuth()\n\n if (isLoading) {\n return (\n <div className=\"flex items-center justify-center py-12 text-muted-foreground\">\n Loading...\n </div>\n )\n }\n\n if (!user) {\n return (\n <div className=\"container max-w-4xl py-8\">\n <div className=\"mb-8\">\n <h1 className=\"text-2xl font-semibold tracking-tight\">Integrations</h1>\n <p className=\"text-muted-foreground\">Connect and manage third-party services</p>\n </div>\n <div className=\"flex items-center justify-center rounded-[var(--radius-md)] border border-dashed py-24\">\n <p className=\"text-muted-foreground text-sm\">\n Please sign in to manage your integrations.\n </p>\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"container max-w-4xl py-8\">\n <div className=\"mb-8\">\n <h1 className=\"text-2xl font-semibold tracking-tight\">Integrations</h1>\n <p className=\"text-muted-foreground\">Connect and manage third-party services</p>\n </div>\n <WidgetErrorBoundary widgetName=\"integrations\">\n <Pipes authToken={getAccessToken} />\n </WidgetErrorBoundary>\n </div>\n )\n}\n","'use client'\n\n/**\n * AuthShell Component\n *\n * Main layout wrapper for authenticated applications.\n * Provides sidebar, header, and main content area with\n * authentication gating.\n */\n\nimport { Separator } from '@mdxui/primitives/separator'\nimport {\n SidebarInset,\n SidebarProvider,\n SidebarTrigger,\n} from '@mdxui/primitives/sidebar'\nimport { Toaster } from '@mdxui/primitives/sonner'\nimport type { ReactNode } from 'react'\n\nimport { AuthGate } from '../providers/auth-gate'\nimport { AuthShellNav } from './auth-shell-nav'\nimport { type BreadcrumbItemConfig, Breadcrumbs } from './components'\nimport { useAuthShellConfig } from './config-context'\nimport type { AuthShellProps } from './types'\n\n/**\n * Default header component with sidebar trigger and breadcrumbs\n */\nfunction DefaultHeader({\n breadcrumbs,\n headerContent,\n}: {\n breadcrumbs?: BreadcrumbItemConfig[]\n headerContent?: ReactNode\n}) {\n return (\n <header className=\"relative flex h-16 shrink-0 items-center gap-2 border-b bg-background transition-[width,height] ease-linear group-has-data-[collapsible=icon]/sidebar-wrapper:h-12\">\n <div className=\"z-10 flex shrink-0 items-center gap-2 bg-background px-4\">\n <SidebarTrigger className=\"-ml-1\" />\n <Separator orientation=\"vertical\" className=\"mr-2 h-4\" />\n {breadcrumbs && breadcrumbs.length > 0 && (\n <Breadcrumbs items={breadcrumbs} />\n )}\n </div>\n {headerContent && (\n <div className=\"flex flex-1 items-center px-4 xl:absolute xl:inset-0 xl:justify-center\">\n <div className=\"w-full max-w-md\">{headerContent}</div>\n </div>\n )}\n </header>\n )\n}\n\n/**\n * AuthShell - Main application shell layout\n *\n * Wraps content in authentication gate and provides\n * sidebar navigation with header and main content area.\n *\n * @example\n * ```tsx\n * <AuthShellConfigProvider config={config}>\n * <IdentityProvider clientId={config.identity.clientId}>\n * <AuthShell breadcrumbs={[{ label: 'Dashboard' }]}>\n * <Outlet />\n * </AuthShell>\n * </IdentityProvider>\n * </AuthShellConfigProvider>\n * ```\n */\nexport function AuthShell({\n children,\n sidebarHeaderContent,\n headerContent,\n breadcrumbs,\n}: AuthShellProps) {\n const { config } = useAuthShellConfig()\n const { identity, auth } = config\n\n return (\n <AuthGate\n required={identity.required ?? auth?.requireAuth ?? true}\n onUnauthenticated={identity.onUnauthenticated ?? auth?.onUnauthenticated ?? 'landing'}\n loadingComponent={identity.loadingComponent}\n landingComponent={identity.landingComponent}\n >\n <SidebarProvider>\n <AuthShellNav headerContent={sidebarHeaderContent} />\n <SidebarInset>\n <DefaultHeader breadcrumbs={breadcrumbs} headerContent={headerContent} />\n <main className=\"flex-1 overflow-auto p-4\">\n {children}\n </main>\n </SidebarInset>\n </SidebarProvider>\n <Toaster />\n </AuthGate>\n )\n}\n","'use client'\n\n/**\n * AuthShellNav Component\n *\n * Sidebar navigation component that renders routes organized by group.\n * Includes branding header and user menu footer.\n */\n\nimport type { ReactNode } from 'react'\nimport { useAuth } from '@workos-inc/authkit-react'\nimport { useIsActive, WebLink } from '@mdxui/navigation/web'\nimport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarMenu,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarRail,\n} from '@mdxui/primitives/sidebar'\nimport { SidebarUser } from '@mdxui/primitives/sidebar-user'\n\nimport { useAuthShellBranding, useAuthShellRoutesByGroup, useAuthShellFullPath } from './config-context'\nimport type { AuthShellNavProps, AuthAppRoute } from './types'\n\n/**\n * Navigation item component\n */\nfunction NavItem({ route, getFullPath }: { route: AuthAppRoute; getFullPath: (path: string) => string }) {\n const fullPath = getFullPath(route.path)\n // For root path use exact match, for others use partial match\n const isActive = useIsActive(fullPath, { partial: fullPath !== '/' })\n const Icon = route.icon\n\n return (\n <SidebarMenuItem>\n <SidebarMenuButton asChild isActive={isActive} tooltip={route.label}>\n <WebLink to={fullPath}>\n {Icon && <Icon className=\"size-4\" />}\n <span>{route.label}</span>\n </WebLink>\n </SidebarMenuButton>\n </SidebarMenuItem>\n )\n}\n\n/**\n * Default branding header component\n */\nfunction BrandingHeader({ headerContent }: { headerContent?: ReactNode }) {\n const branding = useAuthShellBranding()\n\n if (headerContent) {\n return <>{headerContent}</>\n }\n\n return (\n <div className=\"flex items-center gap-2 px-2\">\n {branding.logo && <div className=\"flex-shrink-0\">{branding.logo}</div>}\n <div className=\"flex flex-col gap-0.5 leading-none\">\n <span className=\"font-semibold\">{branding.name}</span>\n {branding.tagline && (\n <span className=\"text-xs text-muted-foreground\">{branding.tagline}</span>\n )}\n </div>\n </div>\n )\n}\n\n/**\n * Default user menu component\n */\nfunction DefaultUserMenu() {\n const { user, signOut } = useAuth()\n\n if (!user) return null\n\n const displayName = user.firstName\n ? `${user.firstName}${user.lastName ? ` ${user.lastName}` : ''}`\n : user.email ?? 'User'\n\n return (\n <SidebarUser\n user={{\n name: displayName,\n email: user.email ?? '',\n avatar: user.profilePictureUrl ?? undefined,\n }}\n onSignOut={() => signOut()}\n />\n )\n}\n\n/**\n * AuthShellNav - Sidebar navigation component\n *\n * Renders navigation routes organized by group with branding\n * header and user menu footer.\n *\n * @example\n * ```tsx\n * <AuthShellNav\n * headerContent={<TeamSwitcher />}\n * userMenu={<CustomUserMenu />}\n * />\n * ```\n */\nexport function AuthShellNav({ headerContent, userMenu, className }: AuthShellNavProps) {\n const { routesByGroup, groups } = useAuthShellRoutesByGroup()\n const getFullPath = useAuthShellFullPath()\n\n return (\n <Sidebar collapsible=\"icon\" className={className}>\n <SidebarHeader>\n <BrandingHeader headerContent={headerContent} />\n </SidebarHeader>\n <SidebarContent>\n {groups.map((group) => {\n const routes = routesByGroup.get(group.id)\n if (!routes || routes.length === 0) return null\n\n return (\n <SidebarGroup key={group.id}>\n {group.label && <SidebarGroupLabel>{group.label}</SidebarGroupLabel>}\n <SidebarGroupContent>\n <SidebarMenu>\n {routes.map((route) => (\n <NavItem key={route.key} route={route} getFullPath={getFullPath} />\n ))}\n </SidebarMenu>\n </SidebarGroupContent>\n </SidebarGroup>\n )\n })}\n </SidebarContent>\n <SidebarFooter>\n {userMenu ?? <DefaultUserMenu />}\n </SidebarFooter>\n <SidebarRail />\n </Sidebar>\n )\n}\n","'use client'\n\n/**\n * AuthApp Component\n *\n * Complete application wrapper that sets up all required providers,\n * shell structure, and routing for an authenticated application.\n *\n * Now includes built-in routing via @mdxui/navigation - just define\n * routes in your config and AuthApp handles the rest.\n */\n\nimport React, { useMemo, type ReactNode } from 'react'\nimport { ThemeProvider } from 'next-themes'\nimport type { RouteConfig } from '@mdxui/navigation'\nimport { createWebRouter, RouterProvider, WebOutlet } from '@mdxui/navigation/web'\n\nimport { IdentityProvider } from '../providers/identity-provider'\nimport { AuthShellConfigProvider } from './config-context'\nimport { AuthShell } from './auth-shell'\nimport { SidebarOrgSwitcher } from './components'\nimport { defaultRoutes, defaultGroups } from './route-presets'\nimport { mergeWithEnvConfig } from './env-config'\nimport type { AuthAppConfig, AuthAppProps, AuthAppRoute } from './types'\n\n/**\n * Props for AuthAppProvider (providers only, no shell or routing)\n */\ninterface AuthAppProviderProps {\n /**\n * Application configuration\n *\n * Optional when VITE_WORKOS_CLIENT_ID environment variable is set.\n */\n config?: Partial<AuthAppConfig>\n /** Children to render */\n children: ReactNode\n}\n\n/**\n * AuthAppProvider - Providers only wrapper\n *\n * Use this when you need to customize the shell layout or\n * integrate with an existing routing setup.\n *\n * Provider hierarchy:\n * - ThemeProvider (next-themes)\n * - AuthShellConfigProvider\n * - IdentityProvider (WorkOS AuthKit)\n *\n * @example\n * ```tsx\n * <AuthAppProvider config={config}>\n * <RouterProvider router={router}>\n * <AuthShell>\n * <Outlet />\n * </AuthShell>\n * </RouterProvider>\n * </AuthAppProvider>\n * ```\n *\n * @example\n * ```tsx\n * // Zero-config with environment variables\n * <AuthAppProvider>\n * <MyApp />\n * </AuthAppProvider>\n * ```\n */\nexport function AuthAppProvider({ config, children }: AuthAppProviderProps) {\n // Merge explicit config with environment variables\n const resolvedConfig = useMemo(() => mergeWithEnvConfig(config), [config])\n const { identity, theme } = resolvedConfig\n\n return (\n <ThemeProvider\n attribute=\"class\"\n defaultTheme={theme?.mode ?? 'system'}\n enableSystem\n disableTransitionOnChange\n >\n <AuthShellConfigProvider config={resolvedConfig}>\n <IdentityProvider\n clientId={identity.clientId}\n apiHostname={identity.apiHostname}\n devMode={identity.devMode}\n redirectUri={identity.redirectUri}\n >\n {children}\n </IdentityProvider>\n </AuthShellConfigProvider>\n </ThemeProvider>\n )\n}\n\n/**\n * Convert AuthAppRoute[] to RouteConfig for @mdxui/navigation\n */\nfunction convertRoutesToConfig(routes: AuthAppRoute[], basePath?: string): RouteConfig {\n const config: RouteConfig = {}\n\n for (const route of routes) {\n if (route.enabled === false) continue\n\n const fullPath = basePath ? `${basePath}${route.path}` : route.path\n config[route.key] = {\n path: fullPath,\n component: route.component as React.ComponentType<unknown>,\n meta: {\n label: route.label,\n icon: route.icon,\n group: route.group,\n public: route.public,\n requiredRoles: route.requiredRoles,\n requiredPermissions: route.requiredPermissions,\n },\n }\n }\n\n return config\n}\n\n/**\n * Root layout component that wraps all routes with AuthShell\n */\nfunction createRootLayout(headerContent?: ReactNode, sidebarHeaderContent?: ReactNode) {\n // Default to SidebarOrgSwitcher if no custom header content provided\n const resolvedSidebarContent = sidebarHeaderContent ?? <SidebarOrgSwitcher />\n\n return function RootLayout() {\n return (\n <AuthShell headerContent={headerContent} sidebarHeaderContent={resolvedSidebarContent}>\n <WebOutlet />\n </AuthShell>\n )\n }\n}\n\n/**\n * AuthApp - Complete app with built-in routing\n *\n * This is the recommended way to use AuthApp. Define your routes\n * in the config and AuthApp handles routing automatically.\n *\n * @example\n * ```tsx\n * // Zero-config with environment variables\n * // Set VITE_WORKOS_CLIENT_ID, VITE_APP_NAME in .env\n * function App() {\n * return <AuthApp />\n * }\n * ```\n *\n * @example\n * ```tsx\n * import { AuthApp, type AuthAppConfig } from '@mdxui/auth/shell'\n * import { Home, Settings, Users } from 'lucide-react'\n *\n * const config: AuthAppConfig = {\n * branding: { name: 'My App' },\n * identity: { clientId: 'client_xxx' },\n * routes: [\n * { key: 'home', label: 'Home', path: '/', icon: Home, component: HomePage },\n * { key: 'settings', label: 'Settings', path: '/settings', icon: Settings, component: SettingsPage },\n * { key: 'users', label: 'Users', path: '/users', icon: Users, component: UsersPage },\n * ],\n * }\n *\n * function App() {\n * return <AuthApp config={config} />\n * }\n * ```\n *\n * @example\n * ```tsx\n * // With custom header content (sidebar defaults to SidebarOrgSwitcher)\n * <AuthApp\n * config={config}\n * headerContent={<ThemeSwitcher />}\n * />\n * ```\n *\n * @example\n * ```tsx\n * // Override sidebar header with custom content\n * <AuthApp\n * config={config}\n * sidebarHeaderContent={<MyCustomSwitcher />}\n * />\n * ```\n */\nexport function AuthApp({ config, headerContent, sidebarHeaderContent }: AuthAppProps) {\n // Merge with env config first\n const mergedConfig = useMemo(() => mergeWithEnvConfig(config), [config])\n\n // Resolve routes and groups with defaults\n const routes = mergedConfig.routes ?? defaultRoutes\n const groups = mergedConfig.groups ?? defaultGroups\n const resolvedConfig = useMemo(\n () => ({ ...mergedConfig, routes, groups }),\n [mergedConfig, routes, groups]\n )\n\n // Convert routes and create router - memoized to prevent recreation\n const router = useMemo(() => {\n const routeConfig = convertRoutesToConfig(routes, mergedConfig.basePath)\n const RootLayout = createRootLayout(headerContent, sidebarHeaderContent)\n\n return createWebRouter(routeConfig, {\n rootComponent: RootLayout,\n basepath: mergedConfig.basePath || undefined,\n })\n }, [routes, mergedConfig.basePath, headerContent, sidebarHeaderContent])\n\n return (\n <AuthAppProvider config={resolvedConfig}>\n <RouterProvider router={router} />\n </AuthAppProvider>\n )\n}\n\n/**\n * AuthAppWithChildren - App wrapper with shell but no routing\n *\n * Use this when you want the shell but handle routing yourself,\n * or when you have simple static content.\n *\n * @example\n * ```tsx\n * // Zero-config with environment variables\n * <AuthAppWithChildren>\n * <Dashboard />\n * </AuthAppWithChildren>\n * ```\n *\n * @example\n * ```tsx\n * // With your own router\n * <AuthAppWithChildren config={config}>\n * <Routes>\n * <Route path=\"/\" element={<Home />} />\n * <Route path=\"/settings\" element={<Settings />} />\n * </Routes>\n * </AuthAppWithChildren>\n * ```\n *\n * @example\n * ```tsx\n * // With static content\n * <AuthAppWithChildren config={config}>\n * <Dashboard />\n * </AuthAppWithChildren>\n * ```\n */\nexport function AuthAppWithChildren({\n config,\n headerContent,\n sidebarHeaderContent,\n children,\n}: AuthAppProps & { children: ReactNode }) {\n // Merge with env config first\n const mergedConfig = useMemo(() => mergeWithEnvConfig(config), [config])\n\n // Resolve routes and groups with defaults\n const routes = mergedConfig.routes ?? defaultRoutes\n const groups = mergedConfig.groups ?? defaultGroups\n const resolvedConfig = useMemo(\n () => ({ ...mergedConfig, routes, groups }),\n [mergedConfig, routes, groups]\n )\n\n // Default to SidebarOrgSwitcher if no custom header content provided\n const resolvedSidebarContent = sidebarHeaderContent ?? <SidebarOrgSwitcher />\n\n return (\n <AuthAppProvider config={resolvedConfig}>\n <AuthShell headerContent={headerContent} sidebarHeaderContent={resolvedSidebarContent}>\n {children}\n </AuthShell>\n </AuthAppProvider>\n )\n}\n\n/**\n * Create route definitions from config for use with routers\n *\n * Helper function to generate route objects compatible with\n * React Router, TanStack Router, etc.\n *\n * @example\n * ```tsx\n * // React Router\n * const routes = createRouteDefinitions(config)\n * const router = createBrowserRouter(\n * routes.map(r => ({ path: r.path, element: <r.component /> }))\n * )\n * ```\n *\n * @example\n * ```tsx\n * // TanStack Router\n * const routes = createRouteDefinitions(config)\n * const routeTree = rootRoute.addChildren(\n * routes.map(r => createRoute({\n * getParentRoute: () => rootRoute,\n * path: r.path,\n * component: r.component,\n * }))\n * )\n * ```\n */\nexport function createRouteDefinitions(config?: Partial<AuthAppConfig>) {\n const mergedConfig = mergeWithEnvConfig(config)\n const basePath = mergedConfig.basePath ?? ''\n const routes = mergedConfig.routes ?? defaultRoutes\n\n return routes\n .filter((route) => route.enabled !== false)\n .map((route) => ({\n key: route.key,\n path: basePath ? `${basePath}${route.path}` : route.path,\n label: route.label,\n component: route.component,\n icon: route.icon,\n group: route.group,\n public: route.public,\n requiredRoles: route.requiredRoles,\n requiredPermissions: route.requiredPermissions,\n }))\n}\n","/**\n * Environment Variable Configuration\n *\n * Reads configuration from environment variables for zero-config setup.\n * Supports Vite's import.meta.env pattern for Cloudflare Workers Static Assets.\n *\n * Environment variables:\n * - VITE_WORKOS_CLIENT_ID - WorkOS client ID (required for zero-config)\n * - VITE_WORKOS_REDIRECT_URI - OAuth redirect URI\n * - VITE_WORKOS_API_HOSTNAME - WorkOS API hostname override\n * - VITE_WORKOS_DEV_MODE - Enable dev mode (\"true\" or \"false\")\n * - VITE_APP_NAME - Application name for branding\n * - VITE_APP_TAGLINE - Application tagline\n *\n * @example\n * ```bash\n * # .env file\n * VITE_WORKOS_CLIENT_ID=client_01JQYTRXK9ZPD8JPJTKDCRB656\n * VITE_WORKOS_REDIRECT_URI=https://oauth.do/callback\n * VITE_APP_NAME=OAuth.do\n * ```\n */\n\nimport type { AuthAppConfig } from './types'\n\n/** Check if we're in a Vite environment */\nfunction getEnvVar(key: string): string | undefined {\n // Vite injects import.meta.env at build time\n if (typeof import.meta !== 'undefined' && import.meta.env) {\n return import.meta.env[key] as string | undefined\n }\n // Fallback to process.env for Node.js environments\n if (typeof process !== 'undefined' && process.env) {\n return process.env[key]\n }\n return undefined\n}\n\n/**\n * Get configuration from environment variables\n *\n * Returns a partial config that can be merged with explicit config.\n * Missing required fields will cause runtime errors if not provided elsewhere.\n */\nexport function getEnvConfig(): Partial<AuthAppConfig> {\n const clientId = getEnvVar('VITE_WORKOS_CLIENT_ID')\n const redirectUri = getEnvVar('VITE_WORKOS_REDIRECT_URI')\n const apiHostname = getEnvVar('VITE_WORKOS_API_HOSTNAME')\n const devModeStr = getEnvVar('VITE_WORKOS_DEV_MODE')\n const appName = getEnvVar('VITE_APP_NAME')\n const appTagline = getEnvVar('VITE_APP_TAGLINE')\n\n // Only include identity if clientId is available\n const identity = clientId\n ? {\n clientId,\n ...(redirectUri && { redirectUri }),\n ...(apiHostname && { apiHostname }),\n ...(devModeStr && { devMode: devModeStr === 'true' }),\n }\n : undefined\n\n // Only include branding if appName is available\n const branding = appName\n ? {\n name: appName,\n ...(appTagline && { tagline: appTagline }),\n }\n : undefined\n\n return {\n ...(identity && { identity }),\n ...(branding && { branding }),\n }\n}\n\n/**\n * Merge explicit config with environment config\n *\n * Explicit config takes precedence over environment variables.\n */\nexport function mergeWithEnvConfig(config?: Partial<AuthAppConfig>): AuthAppConfig {\n const envConfig = getEnvConfig()\n\n // Deep merge branding\n const branding = {\n name: config?.branding?.name ?? envConfig.branding?.name ?? 'App',\n ...(config?.branding?.logo && { logo: config.branding.logo }),\n ...(config?.branding?.logoCollapsed && { logoCollapsed: config.branding.logoCollapsed }),\n tagline: config?.branding?.tagline ?? envConfig.branding?.tagline,\n }\n\n // Deep merge identity\n const envIdentity = envConfig.identity\n const configIdentity = config?.identity\n\n if (!envIdentity?.clientId && !configIdentity?.clientId) {\n throw new Error(\n 'AuthApp: Missing clientId. Either provide config.identity.clientId or set VITE_WORKOS_CLIENT_ID environment variable.'\n )\n }\n\n const identity = {\n clientId: configIdentity?.clientId ?? envIdentity?.clientId ?? '',\n ...(configIdentity?.redirectUri ?? envIdentity?.redirectUri\n ? { redirectUri: configIdentity?.redirectUri ?? envIdentity?.redirectUri }\n : {}),\n ...(configIdentity?.apiHostname ?? envIdentity?.apiHostname\n ? { apiHostname: configIdentity?.apiHostname ?? envIdentity?.apiHostname }\n : {}),\n ...(configIdentity?.devMode ?? envIdentity?.devMode\n ? { devMode: configIdentity?.devMode ?? envIdentity?.devMode }\n : {}),\n ...(configIdentity?.required !== undefined ? { required: configIdentity.required } : {}),\n ...(configIdentity?.onUnauthenticated ? { onUnauthenticated: configIdentity.onUnauthenticated } : {}),\n ...(configIdentity?.landingComponent ? { landingComponent: configIdentity.landingComponent } : {}),\n ...(configIdentity?.loadingComponent ? { loadingComponent: configIdentity.loadingComponent } : {}),\n }\n\n return {\n branding,\n identity,\n ...(config?.basePath && { basePath: config.basePath }),\n ...(config?.theme && { theme: config.theme }),\n ...(config?.auth && { auth: config.auth }),\n ...(config?.groups && { groups: config.groups }),\n ...(config?.routes && { routes: config.routes }),\n }\n}\n"],"mappings":";AAEA,SAAS,uBAAuB;;;ACAhC,SAAS,qBAAqB;AAC9B,SAAS,WAAW,gBAAgB;AAkGhC;AApFG,SAAS,oBAAoB;AAClC,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAC5C,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,KAAK;AAE1C,YAAU,MAAM;AACd,eAAW,IAAI;AAEf,UAAM,gBAAgB,MAAM;AAC1B,YAAM,cAAc,SAAS,gBAAgB,UAAU,SAAS,MAAM;AACtE,YAAM,cAAc,OAAO;AAAA,QACzB;AAAA,MACF,EAAE;AACF;AAAA,QACE,eACG,CAAC,SAAS,gBAAgB,UAAU,SAAS,OAAO,KAAK;AAAA,MAC9D;AAAA,IACF;AAEA,kBAAc;AAGd,UAAM,WAAW,IAAI,iBAAiB,aAAa;AACnD,aAAS,QAAQ,SAAS,iBAAiB;AAAA,MACzC,YAAY;AAAA,MACZ,iBAAiB,CAAC,OAAO;AAAA,IAC3B,CAAC;AAGD,UAAM,aAAa,OAAO,WAAW,8BAA8B;AACnE,eAAW,iBAAiB,UAAU,aAAa;AAEnD,WAAO,MAAM;AACX,eAAS,WAAW;AACpB,iBAAW,oBAAoB,UAAU,aAAa;AAAA,IACxD;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,SAAO,EAAE,QAAQ,QAAQ;AAC3B;AA8BO,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT,UAAU;AACZ,GAAyB;AACvB,QAAM,EAAE,QAAQ,QAAQ,IAAI,kBAAkB;AAI9C,QAAM,qBACJ,eAAe,UAAW,SAAS,SAAS,UAAW;AAIzD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,YAAY;AAAA,QACZ;AAAA,QACA;AAAA,MACF;AAAA,MACA,UAAU;AAAA,QACR,eAAe;AAAA,UACb,SAAS;AAAA,QACX;AAAA,QACA,iBAAiB;AAAA,UACf,SAAS;AAAA,QACX;AAAA,MACF;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ;;;AD1CM,gBAAAA,YAAA;AAnCC,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA0B;AAIxB,QAAM,sBACJ,gBACC,OAAO,WAAW,cAAc,OAAO,SAAS,SAAS;AAG5D,QAAM,yBACJ,uBACC,MAAM;AACL,QAAI,OAAO,WAAW,aAAa;AACjC,YAAM,MAAM,IAAI,IAAI,OAAO,SAAS,IAAI;AACxC,UAAI,aAAa,OAAO,MAAM;AAC9B,UAAI,aAAa,OAAO,OAAO;AAC/B,aAAO,QAAQ,aAAa,CAAC,GAAG,IAAI,IAAI,QAAQ;AAAA,IAClD;AAAA,EACF;AAEF,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa;AAAA,MACb,oBAAoB;AAAA,MAEpB,0BAAAA,KAAC,mBAAiB,UAAS;AAAA;AAAA,EAC7B;AAEJ;AAsBO,SAAS,wBAAwB;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA0B;AACxB,QAAM,sBACJ,gBACC,OAAO,WAAW,cAAc,OAAO,SAAS,SAAS;AAE5D,QAAM,yBACJ,uBACC,MAAM;AACL,QAAI,OAAO,WAAW,aAAa;AACjC,YAAM,MAAM,IAAI,IAAI,OAAO,SAAS,IAAI;AACxC,UAAI,aAAa,OAAO,MAAM;AAC9B,UAAI,aAAa,OAAO,OAAO;AAC/B,aAAO,QAAQ,aAAa,CAAC,GAAG,IAAI,IAAI,QAAQ;AAAA,IAClD;AAAA,EACF;AAEF,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa;AAAA,MACb,oBAAoB;AAAA,MAEnB;AAAA;AAAA,EACH;AAEJ;;;AEtIA,SAAS,aAAAC,YAAW,cAAc;AAClC,SAAS,eAAe;AASlB,SA8GK,UA7GH,OAAAC,MADF;AAHN,SAAS,0BAA0B;AACjC,SACE,gBAAAA,KAAC,SAAI,WAAU,+DACb,+BAAC,SAAI,WAAU,oCACb;AAAA,oBAAAA,KAAC,SAAI,WAAU,kFAAiF;AAAA,IAChG,gBAAAA,KAAC,OAAE,WAAU,iCAAgC,wBAAU;AAAA,KACzD,GACF;AAEJ;AAKA,SAAS,qBAAqB;AAC5B,QAAM,EAAE,OAAO,IAAI,QAAQ;AAE3B,SACE,gBAAAA,KAAC,SAAI,WAAU,4EACb,+BAAC,SAAI,WAAU,wBACb;AAAA,oBAAAA,KAAC,QAAG,WAAU,0CAAyC,qBAAO;AAAA,IAC9D,gBAAAA,KAAC,OAAE,WAAU,8BAA6B,+CAE1C;AAAA,IACA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS,MAAM,OAAO;AAAA,QACtB,WAAU;AAAA,QACX;AAAA;AAAA,IAED;AAAA,KACF,GACF;AAEJ;AAmDO,SAAS,SAAS;AAAA,EACvB;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA,oBAAoB;AAAA,EACpB;AACF,GAAkB;AAChB,QAAM,EAAE,MAAM,WAAW,OAAO,IAAI,QAAQ;AAC5C,QAAM,eAAe,OAAO,KAAK;AAGjC,EAAAD,WAAU,MAAM;AACd,QAAI,sBAAsB,YAAY,CAAC,aAAa,CAAC,QAAQ,CAAC,aAAa,SAAS;AAClF,mBAAa,UAAU;AACvB,aAAO;AAAA,IACT;AAAA,EACF,GAAG,CAAC,mBAAmB,WAAW,MAAM,MAAM,CAAC;AAG/C,EAAAA,WAAU,MAAM;AACd,QAAI,MAAM;AACR,mBAAa,UAAU;AAAA,IACzB;AAAA,EACF,GAAG,CAAC,IAAI,CAAC;AAGT,MAAI,CAAC,UAAU;AACb,WAAO,gBAAAC,KAAA,YAAG,UAAS;AAAA,EACrB;AAGA,MAAI,WAAW;AACb,WAAO,gBAAAA,KAAA,YAAG,8BAAoB,gBAAAA,KAAC,2BAAwB,GAAG;AAAA,EAC5D;AAGA,MAAI,MAAM;AACR,WAAO,gBAAAA,KAAA,YAAG,UAAS;AAAA,EACrB;AAGA,UAAQ,mBAAmB;AAAA,IACzB,KAAK;AAEH,aAAO,gBAAAA,KAAA,YAAG,8BAAoB,gBAAAA,KAAC,2BAAwB,GAAG;AAAA,IAE5D,KAAK;AAEH,UAAI,eAAe,OAAO,WAAW,aAAa;AAChD,eAAO,SAAS,OAAO;AACvB,eACE,gBAAAA,KAAC,SAAI,WAAU,+DACb,0BAAAA,KAAC,OAAE,WAAU,iCAAgC,4BAAc,GAC7D;AAAA,MAEJ;AAEA,aAAO,gBAAAA,KAAA,YAAG,8BAAoB,gBAAAA,KAAC,sBAAmB,GAAG;AAAA,IAEvD,KAAK;AAEH,aAAO,gBAAAA,KAAA,YAAG,UAAS;AAAA,IAErB,KAAK;AAAA,IACL;AAEE,aAAO,gBAAAA,KAAA,YAAG,8BAAoB,gBAAAA,KAAC,sBAAmB,GAAG;AAAA,EACzD;AACF;;;ACjKA,SAAS,eAAe,YAAY,eAA+B;AAyJ/D,gBAAAC,YAAA;AA3GJ,IAAM,eAAe,cAAwC,IAAI;AAiBjE,IAAM,gBAA8B;AAAA,EAClC,EAAE,KAAK,WAAW,OAAO,WAAW,MAAM,YAAY,UAAU,KAAK;AACvE;AAmCO,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA,eAAe,CAAC;AAClB,GAAuB;AAKrB,QAAM,eAAe,QAA2B,MAAM;AACpD,UAAM,uBAAuB,CAAC,kBAAwC;AACpE,UAAI,QAAQ,sBAAsB;AAChC,eAAO,OAAO,qBAAqB,aAAa;AAAA,MAClD;AACA,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL,QAAQ,UAAU;AAAA,MAClB,OAAO;AAAA,MACP,SAAS;AAAA,MACT,OAAO;AAAA,MACP,QAAQ,YAAY;AAClB,YAAI,CAAC,QAAQ;AACX,kBAAQ,KAAK,kDAAkD;AAC/D;AAAA,QACF;AAEA,cAAM,OAAO,KAAK;AAAA,MACpB;AAAA,MACA,YAAY,OAAO,eAAe,gBAAgB;AAChD,YAAI,CAAC,QAAQ;AACX,gBAAM,IAAI,MAAM,mCAAmC;AAAA,QACrD;AACA,cAAM,OAAO,OAAO,eAAe,WAAW;AAAA,MAChD;AAAA,MACA,YAAY,OAAO,IAAI,gBAAgB;AACrC,YAAI,CAAC,QAAQ;AACX,gBAAM,IAAI,MAAM,mCAAmC;AAAA,QACrD;AACA,cAAM,OAAO,OAAO,IAAI,WAAW;AAAA,MACrC;AAAA,MACA,YAAY,OAAO,OAAO;AACxB,YAAI,CAAC,QAAQ;AACX,gBAAM,IAAI,MAAM,mCAAmC;AAAA,QACrD;AACA,cAAM,OAAO,OAAO,EAAE;AAAA,MACxB;AAAA,MACA;AAAA,IACF;AAAA,EACF,GAAG,CAAC,QAAQ,YAAY,CAAC;AAEzB,SACE,gBAAAA,KAAC,aAAa,UAAb,EAAsB,OAAO,cAC3B,UACH;AAEJ;AASO,SAAS,kBAAqC;AACnD,QAAM,UAAU,WAAW,YAAY;AACvC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,qDAAqD;AAAA,EACvE;AACA,SAAO;AACT;AAOO,SAAS,0BAAoD;AAClE,SAAO,WAAW,YAAY;AAChC;;;ACrLA,SAAS,eAAe,yBAAyB;AAgC3C,gBAAAC,YAAA;AAHC,SAAS,YAAY,EAAE,WAAW,UAAU,GAAoB;AACrE,SACE,gBAAAA,KAAC,SAAI,WACH,0BAAAA,KAAC,qBAAkB,WAAsB,GAC3C;AAEJ;;;ACnCA,SAAS,gBAAgB,0BAA0B;AA2B7C,gBAAAC,YAAA;AAHC,SAAS,aAAa,EAAE,WAAW,UAAU,GAAoB;AACtE,SACE,gBAAAA,KAAC,SAAI,WACH,0BAAAA,KAAC,sBAAmB,WAAsB,GAC5C;AAEJ;;;AC9BA,SAAS,gBAAgB,0BAA0B;AA2D7C,gBAAAC,YAAA;AALC,SAAS,aAAa,OAA0B;AACrD,QAAM,EAAE,WAAW,GAAG,KAAK,IAAI;AAE/B,SACE,gBAAAA,KAAC,SAAI,WACH,0BAAAA,KAAC,sBAAoB,GAAG,MAAM,GAChC;AAEJ;;;AC9DA,SAAS,WAAW,qBAAqB;AA6BnC,gBAAAC,YAAA;AAHC,SAAS,QAAQ,EAAE,WAAW,UAAU,GAAoB;AACjE,SACE,gBAAAA,KAAC,SAAI,WACH,0BAAAA,KAAC,iBAAc,WAAsB,GACvC;AAEJ;;;AChCA,SAAS,mBAAmB,6BAA6B;AAyDnD,gBAAAC,YAAA;AAPC,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA,gBAAgB;AAAA,EAChB;AACF,GAAyB;AACvB,SACE,gBAAAA,KAAC,SAAI,WACH,0BAAAA,KAAC,yBAAsB,WAAsB,GAC/C;AAEJ;;;AC5DA,SAAS,SAAS,mBAAmB;AA2B/B,gBAAAC,aAAA;AAHC,SAAS,MAAM,EAAE,WAAW,UAAU,GAAoB;AAC/D,SACE,gBAAAA,MAAC,SAAI,WACH,0BAAAA,MAAC,eAAY,WAAsB,GACrC;AAEJ;;;AC9BA,SAAS,wBAAwB,kCAAkC;AA2D7D,gBAAAC,aAAA;AAVC,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA8B;AAC5B,SACE,gBAAAA,MAAC,SAAI,WACH,0BAAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,EACF,GACF;AAEJ;;;ACpEA;AAAA,EACC;AAAA,EACA,UAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAAC;AAAA,EACA,UAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,cAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,eAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACM;AACP,SAAS,UAAU;AACnB;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACM;AACP,YAAYC,YAAW;AACvB,SAAS,aAAa;;;ACtCtB;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACM;AACP,YAAY,WAAW;AA0CpB,SACC,OAAAC,OADD,QAAAC,aAAA;AA/BI,SAAS,WAAW;AAAA,EAC1B;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA;AACD,GAAoB;AACnB,QAAM,CAAC,KAAK,MAAM,IAAU,eAAS,QAAQ,OAAO,EAAE;AACtD,QAAM,CAAC,OAAO,QAAQ,IAAU,eAAS,QAAQ,SAAS,EAAE;AAC5D,QAAM,CAAC,aAAa,cAAc,IAAU;AAAA,IAC3C,QAAQ,eAAe;AAAA,EACxB;AACA,QAAM,CAAC,aAAa,cAAc,IAAU;AAAA,IAC3C,QAAQ,eAAe;AAAA,EACxB;AAEA,QAAM,eAAe,CAAC,MAAuB;AAC5C,MAAE,eAAe;AAEjB,QAAI,CAAC,IAAI,KAAK,KAAK,CAAC,MAAM,KAAK,EAAG;AAElC,aAAS;AAAA,MACR,KAAK,IAAI,KAAK;AAAA,MACd,OAAO,MAAM,KAAK;AAAA,MAClB,aAAa,YAAY,KAAK,KAAK;AAAA,MACnC;AAAA,IACD,CAAC;AAAA,EACF;AAEA,SACC,gBAAAA,MAAC,UAAK,UAAU,cAAc,WAAU,aACvC;AAAA,oBAAAA,MAAC,SAAI,WAAU,aACd;AAAA,sBAAAD,MAAC,SAAM,SAAQ,OAAM,mBAAK;AAAA,MAC1B,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACA,IAAG;AAAA,UACH,aAAY;AAAA,UACZ,OAAO;AAAA,UACP,UAAU,CAAC,MACV,OAAO,EAAE,OAAO,MAAM,YAAY,EAAE,QAAQ,eAAe,GAAG,CAAC;AAAA,UAEhE,UAAQ;AAAA,UACR,WAAS;AAAA;AAAA,MACV;AAAA,MACA,gBAAAA,MAAC,OAAE,WAAU,iCAAgC,2EAE7C;AAAA,OACD;AAAA,IAEA,gBAAAC,MAAC,SAAI,WAAU,aACd;AAAA,sBAAAD,MAAC,SAAM,SAAQ,SAAQ,qBAAO;AAAA,MAC9B,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACA,IAAG;AAAA,UACH,aAAY;AAAA,UACZ;AAAA,UACA,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,UACxC,MAAM;AAAA,UACN,UAAQ;AAAA,UACR,WAAU;AAAA;AAAA,MACX;AAAA,OACD;AAAA,IAEA,gBAAAC,MAAC,SAAI,WAAU,aACd;AAAA,sBAAAD,MAAC,SAAM,SAAQ,eAAc,2BAAa;AAAA,MAC1C,gBAAAC,MAAC,UAAO,OAAO,aAAa,eAAe,gBAC1C;AAAA,wBAAAD,MAAC,iBAAc,IAAG,eACjB,0BAAAA,MAAC,eAAY,GACd;AAAA,QACA,gBAAAA,MAAC,iBACC,uBAAa,IAAI,CAAC,QAClB,gBAAAA,MAAC,cAAqB,OAAO,KAC3B,cAAI,OAAO,CAAC,EAAE,YAAY,IAAI,IAAI,MAAM,CAAC,KAD1B,GAEjB,CACA,GACF;AAAA,SACD;AAAA,OACD;AAAA,IAEA,gBAAAC,MAAC,SAAI,WAAU,aACd;AAAA,sBAAAD,MAAC,SAAM,SAAQ,eAAc,yBAAW;AAAA,MACxC,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACA,IAAG;AAAA,UACH,aAAY;AAAA,UACZ,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,eAAe,EAAE,OAAO,KAAK;AAAA,UAC9C,MAAM;AAAA;AAAA,MACP;AAAA,OACD;AAAA,IAEA,gBAAAC,MAAC,SAAI,WAAU,0BACd;AAAA,sBAAAD,MAAC,UAAO,MAAK,UAAS,SAAQ,WAAU,SAAS,UAAU,oBAE3D;AAAA,MACA,gBAAAC,MAAC,UAAO,MAAK,UAAS,UAAU,CAAC,IAAI,KAAK,KAAK,CAAC,MAAM,KAAK,GACzD;AAAA,iBAAS,WAAW;AAAA,QAAS;AAAA,SAC/B;AAAA,OACD;AAAA,KACD;AAEF;;;ADyFM,SACC,OAAAC,OADD,QAAAC,aAAA;AA/IC,SAAS,eAAe;AAAA,EAC9B,SAAS,kBAAkB,CAAC;AAAA,EAC5B,eAAe,CAAC,eAAe,WAAW,YAAY;AAAA,EACtD,qBAAqB;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY,oBAAoB;AAAA,EAChC,WAAW;AAAA,EACX;AACD,GAAwB;AACvB,QAAM,CAAC,cAAc,eAAe,IAAU,gBAAmB,CAAC,CAAC;AACnE,QAAM,CAAC,YAAY,aAAa,IAAU,gBAAS,iBAAiB;AACpE,QAAM,CAAC,aAAa,cAAc,IAAU,gBAAS,EAAE;AACvD,QAAM,CAAC,aAAa,cAAc,IAAU,gBAAS,kBAAkB;AACvE,QAAM,CAAC,gBAAgB,iBAAiB,IAAU;AAAA,IACjD,oBAAI,IAAI;AAAA,EACT;AACA,QAAM,CAAC,eAAe,gBAAgB,IAAU,gBAAwB,IAAI;AAC5E,QAAM,CAAC,oBAAoB,qBAAqB,IAAU,gBAAS,KAAK;AACxE,QAAM,CAAC,kBAAkB,mBAAmB,IAAU,gBAAS,KAAK;AAEpE,QAAM,UAAU,gBAAgB,SAAS,IAAI,kBAAkB;AAE/D,EAAM,iBAAU,MAAM;AACrB,mBAAe,kBAAkB;AAAA,EAClC,GAAG,CAAC,kBAAkB,CAAC;AAEvB,QAAM,kBAAwB,eAAQ,MAAM;AAC3C,WAAO,QAAQ,OAAO,CAAC,WAAW;AACjC,YAAM,gBAAgB,cACnB,OAAO,IAAI,YAAY,EAAE,SAAS,YAAY,YAAY,CAAC,KAC5D,OAAO,aAAa,YAAY,EAAE,SAAS,YAAY,YAAY,CAAC,IACnE;AAEH,YAAM,qBACL,gBAAgB,SAAS,OAAO,gBAAgB;AAEjD,aAAO,iBAAiB;AAAA,IACzB,CAAC;AAAA,EACF,GAAG,CAAC,SAAS,aAAa,WAAW,CAAC;AAEtC,QAAM,0BAA0B,CAAC,mBAA2B;AAC3D,mBAAe,cAAc;AAC7B,0BAAsB,cAAc;AAAA,EACrC;AAEA,QAAM,eAAe,OACpB,eACI;AACJ,UAAM,YAAoB;AAAA,MACzB,GAAG;AAAA,MACH,IAAI,OAAO,WAAW;AAAA,MACtB,WAAW,oBAAI,KAAK;AAAA,MACpB,WAAW,oBAAI,KAAK;AAAA,IACrB;AAEA,QAAI;AACH,YAAM,WAAW,UAAU;AAE3B,UAAI,gBAAgB,WAAW,GAAG;AACjC,wBAAgB,CAAC,SAAS,CAAC,GAAG,MAAM,SAAS,CAAC;AAAA,MAC/C;AAEA,4BAAsB,KAAK;AAC3B,YAAM,QAAQ,6BAA6B;AAAA,IAC5C,SAAS,OAAO;AACf,YAAM,MAAM,yBAAyB;AAAA,IACtC;AAAA,EACD;AAEA,QAAM,eAAe,OAAO,IAAY,YAA6B;AACpE,QAAI;AACH,YAAM,WAAW,IAAI,EAAE,GAAG,SAAS,WAAW,oBAAI,KAAK,EAAE,CAAC;AAE1D,UAAI,gBAAgB,WAAW,GAAG;AACjC;AAAA,UAAgB,CAAC,SAChB,KAAK;AAAA,YAAI,CAAC,WACT,OAAO,OAAO,KACX,EAAE,GAAG,QAAQ,GAAG,SAAS,WAAW,oBAAI,KAAK,EAAE,IAC/C;AAAA,UACJ;AAAA,QACD;AAAA,MACD;AAEA,0BAAoB,KAAK;AACzB,uBAAiB,IAAI;AACrB,YAAM,QAAQ,6BAA6B;AAAA,IAC5C,SAAS,OAAO;AACf,YAAM,MAAM,yBAAyB;AAAA,IACtC;AAAA,EACD;AAEA,QAAM,eAAe,OAAO,OAAe;AAC1C,QAAI,CAAC,QAAQ,8CAA8C,EAAG;AAE9D,QAAI;AACH,YAAM,WAAW,EAAE;AAEnB,UAAI,gBAAgB,WAAW,GAAG;AACjC,wBAAgB,CAAC,SAAS,KAAK,OAAO,CAAC,WAAW,OAAO,OAAO,EAAE,CAAC;AAAA,MACpE;AAEA,YAAM,QAAQ,gBAAgB;AAAA,IAC/B,SAAS,OAAO;AACf,YAAM,MAAM,yBAAyB;AAAA,IACtC;AAAA,EACD;AAEA,QAAM,aAAa,CAAC,UAAkB;AACrC,cAAU,UAAU,UAAU,KAAK;AACnC,UAAM,QAAQ,2BAA2B;AAAA,EAC1C;AAEA,QAAM,yBAAyB,CAAC,OAAe;AAC9C,sBAAkB,CAAC,SAAS;AAC3B,YAAM,OAAO,IAAI,IAAI,IAAI;AACzB,UAAI,KAAK,IAAI,EAAE,GAAG;AACjB,aAAK,OAAO,EAAE;AAAA,MACf,OAAO;AACN,aAAK,IAAI,EAAE;AAAA,MACZ;AACA,aAAO;AAAA,IACR,CAAC;AAAA,EACF;AAEA,QAAM,sBAAsB,MAAM;AACjC,kBAAc,CAAC,UAAU;AACzB,QAAI,CAAC,YAAY;AAChB,wBAAkB,oBAAI,IAAI,CAAC;AAAA,IAC5B;AAAA,EACD;AAEA,QAAM,kBAAkB,CAAC,OAAe;AACvC,WAAO,aAAa,eAAe,IAAI,EAAE,IAAI;AAAA,EAC9C;AAEA,SACC,gBAAAA,MAAC,SAAI,WAAW,GAAG,aAAa,SAAS,GACxC;AAAA,oBAAAA,MAAC,QACA;AAAA,sBAAAD,MAAC,cACA,0BAAAC,MAAC,SAAI,WAAU,oCACd;AAAA,wBAAAA,MAAC,SACA;AAAA,0BAAAD,MAAC,aAAU,mCAAqB;AAAA,UAChC,gBAAAA,MAAC,mBAAgB,+DAEjB;AAAA,WACD;AAAA,QACC,YACA,gBAAAC;AAAA,UAAC;AAAA;AAAA,YACA,MAAM;AAAA,YACN,cAAc;AAAA,YAEd;AAAA,8BAAAD,MAAC,iBAAc,SAAO,MACrB,0BAAAC,MAACC,SAAA,EACA;AAAA,gCAAAF,MAAC,QAAK,WAAU,eAAc;AAAA,gBAAE;AAAA,iBAEjC,GACD;AAAA,cACA,gBAAAC,MAAC,iBACA;AAAA,gCAAAD,MAAC,gBACA,0BAAAA,MAAC,eAAY,+BAAiB,GAC/B;AAAA,gBACA,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA,UAAU;AAAA,oBACV,UAAU,MAAM,sBAAsB,KAAK;AAAA;AAAA,gBAC5C;AAAA,iBACD;AAAA;AAAA;AAAA,QACD;AAAA,SAEF,GACD;AAAA,MACA,gBAAAC,MAAC,eAAY,WAAU,aACtB;AAAA,wBAAAA,MAAC,SAAI,WAAU,qCACd;AAAA,0BAAAA,MAAC,SAAI,WAAU,mBACd;AAAA,4BAAAD,MAAC,UAAO,WAAU,yEAAwE;AAAA,YAC1F,gBAAAA;AAAA,cAACG;AAAA,cAAA;AAAA,gBACA,aAAY;AAAA,gBACZ,OAAO;AAAA,gBACP,UAAU,CAAC,MAAM,eAAe,EAAE,OAAO,KAAK;AAAA,gBAC9C,WAAU;AAAA;AAAA,YACX;AAAA,aACD;AAAA,UACA,gBAAAF,MAACG,SAAA,EAAO,OAAO,aAAa,eAAe,yBAC1C;AAAA,4BAAAH,MAACI,gBAAA,EAAc,WAAU,aACxB;AAAA,8BAAAL,MAAC,UAAO,WAAU,eAAc;AAAA,cAChC,gBAAAA,MAACM,cAAA,EAAY;AAAA,eACd;AAAA,YACA,gBAAAL,MAACM,gBAAA,EACA;AAAA,8BAAAP,MAACQ,aAAA,EAAW,OAAM,OAAM,8BAAgB;AAAA,cACvC,aAAa,IAAI,CAAC,QAClB,gBAAAR,MAACQ,aAAA,EAAqB,OAAO,KAC3B,cAAI,OAAO,CAAC,EAAE,YAAY,IAAI,IAAI,MAAM,CAAC,KAD1B,GAEjB,CACA;AAAA,eACF;AAAA,aACD;AAAA,UACA,gBAAAR,MAACE,SAAA,EAAO,SAAQ,WAAU,MAAK,QAAO,SAAS,qBAC7C,uBACA,gBAAAF,MAAC,OAAI,WAAU,UAAS,IAExB,gBAAAA,MAAC,UAAO,WAAU,UAAS,GAE7B;AAAA,WACD;AAAA,QAEC,gBAAgB,SAAS,IACzB,gBAAAA,MAAC,SAAI,WAAU,qBACd,0BAAAC,MAAC,SACA;AAAA,0BAAAD,MAAC,eACA,0BAAAC,MAAC,YACA;AAAA,4BAAAD,MAAC,aAAU,iBAAG;AAAA,YACd,gBAAAA,MAAC,aAAU,mBAAK;AAAA,YAChB,gBAAAA,MAAC,aAAU,yBAAW;AAAA,YACtB,gBAAAA,MAAC,aAAU,yBAAW;AAAA,YACtB,gBAAAA,MAAC,aAAU,WAAU,aAAY,qBAAO;AAAA,aACzC,GACD;AAAA,UACA,gBAAAA,MAAC,aACC,0BAAgB,IAAI,CAAC,WACrB,gBAAAC,MAAC,YACA;AAAA,4BAAAD,MAAC,aACA,0BAAAA,MAAC,UAAK,WAAU,gDACd,iBAAO,KACT,GACD;AAAA,YACA,gBAAAA,MAAC,aACA,0BAAAC,MAAC,SAAI,WAAU,2BACd;AAAA,8BAAAD,MAAC,UAAK,WAAU,uDACd,0BAAgB,OAAO,EAAE,IACvB,OAAO,QACP,SAAS,OAAO,KAAK,IAAI,OAAO,MAAM,QAAQ,EAAE,CAAC,GACrD;AAAA,cACA,gBAAAA;AAAA,gBAACE;AAAA,gBAAA;AAAA,kBACA,SAAQ;AAAA,kBACR,MAAK;AAAA,kBACL,SAAS,MAAM,uBAAuB,OAAO,EAAE;AAAA,kBAE9C,0BAAgB,OAAO,EAAE,IACzB,gBAAAF,MAAC,UAAO,WAAU,UAAS,IAE3B,gBAAAA,MAAC,OAAI,WAAU,UAAS;AAAA;AAAA,cAE1B;AAAA,cACA,gBAAAA;AAAA,gBAACE;AAAA,gBAAA;AAAA,kBACA,SAAQ;AAAA,kBACR,MAAK;AAAA,kBACL,SAAS,MAAM,WAAW,OAAO,KAAK;AAAA,kBAEtC,0BAAAF,MAAC,QAAK,WAAU,UAAS;AAAA;AAAA,cAC1B;AAAA,eACD,GACD;AAAA,YACA,gBAAAA,MAAC,aACA,0BAAAA,MAAC,SAAM,SAAQ,aAAa,iBAAO,aAAY,GAChD;AAAA,YACA,gBAAAA,MAAC,aACA,0BAAAA,MAAC,UAAK,WAAU,iCACd,iBAAO,eAAe,KACxB,GACD;AAAA,YACA,gBAAAA,MAAC,aACC,sBACA,gBAAAC,MAAC,SAAI,WAAU,2BACd;AAAA,8BAAAD;AAAA,gBAACE;AAAA,gBAAA;AAAA,kBACA,SAAQ;AAAA,kBACR,MAAK;AAAA,kBACL,SAAS,MAAM;AACd,qCAAiB,MAAM;AACvB,wCAAoB,IAAI;AAAA,kBACzB;AAAA,kBAEA,0BAAAF,MAAC,QAAK,WAAU,UAAS;AAAA;AAAA,cAC1B;AAAA,cACA,gBAAAA;AAAA,gBAACE;AAAA,gBAAA;AAAA,kBACA,SAAQ;AAAA,kBACR,MAAK;AAAA,kBACL,SAAS,MAAM,aAAa,OAAO,EAAE;AAAA,kBAErC,0BAAAF,MAAC,UAAO,WAAU,2BAA0B;AAAA;AAAA,cAC7C;AAAA,eACD,GAEF;AAAA,eA/Dc,OAAO,EAgEtB,CACA,GACF;AAAA,WACD,GACD,IAEA,gBAAAA,MAAC,SAAI,WAAU,2EACd,0BAAAA,MAAC,OAAE,WAAU,iCACX,wBACE,0CACA,yDACJ,GACD;AAAA,SAEF;AAAA,OACD;AAAA,IAEC,iBACA,gBAAAA,MAAC,UAAO,MAAM,kBAAkB,cAAc,qBAC7C,0BAAAC,MAAC,iBACA;AAAA,sBAAAD,MAAC,gBACA,0BAAAA,MAAC,eAAY,yBAAW,GACzB;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACA,QAAQ;AAAA,UACR;AAAA,UACA;AAAA,UACA,UAAU,CAAC,SAAS,aAAa,cAAc,IAAI,IAAI;AAAA,UACvD,UAAU,MAAM;AACf,gCAAoB,KAAK;AACzB,6BAAiB,IAAI;AAAA,UACtB;AAAA;AAAA,MACD;AAAA,OACD,GACD;AAAA,KAEF;AAEF;;;AEvYA;AAAA,EACE,UAAAS;AAAA,EACA,UAAAC;AAAA,EACA,iBAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAAC;AAAA,EACA,eAAAC;AAAA,OACK;AAqBG,gBAAAC,OACA,QAAAC,aADA;AALH,SAAS,kBAAkB,EAAE,QAAQ,SAAS,UAAU,UAAU,GAA2B;AAClG,SACE,gBAAAD,MAACJ,SAAA,EAAO,MAAM,QAAQ,cAAc,SAClC,0BAAAK,MAACJ,gBAAA,EACC;AAAA,oBAAAI,MAACH,eAAA,EACC;AAAA,sBAAAE,MAACD,cAAA,EAAY,gCAAkB;AAAA,MAC/B,gBAAAE,MAAC,qBAAkB;AAAA;AAAA,QACgC;AAAA,QAAS;AAAA,SAC5D;AAAA,OACF;AAAA,IACA,gBAAAA,MAAC,gBACC;AAAA,sBAAAD,MAACL,SAAA,EAAO,SAAQ,WAAU,SAAS,SAAS,oBAE5C;AAAA,MACA,gBAAAK,MAACL,SAAA,EAAO,SAAQ,eAAc,SAAS,WAAW,oBAElD;AAAA,OACF;AAAA,KACF,GACF;AAEJ;;;AC7CA,SAAS,UAAAO,eAAc;AACvB,SAAS,YAAY;AAajB,SAEI,OAAAC,OAFJ,QAAAC,aAAA;AAFG,SAAS,gBAAgB,EAAE,gBAAgB,GAAyB;AACzE,SACE,gBAAAA,MAAC,SAAI,WAAU,oGACb;AAAA,oBAAAD,MAAC,SAAI,WAAU,yEACb,0BAAAA,MAAC,QAAK,WAAU,iCAAgC,GAClD;AAAA,IACA,gBAAAA,MAAC,QAAG,WAAU,8BAA6B,kCAAoB;AAAA,IAC/D,gBAAAA,MAAC,OAAE,WAAU,+CAA8C,mFAE3D;AAAA,IACA,gBAAAA,MAACD,SAAA,EAAO,SAAS,iBAAiB,4BAAc;AAAA,KAClD;AAEJ;;;ACzBA;AAAA,EACE,UAAAG;AAAA,EACA,UAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,eAAAC;AAAA,EACA,SAAAC;AAAA,EACA,SAAAC;AAAA,OACK;AACP,SAAS,WAAW;AACpB,SAAS,YAAAC,iBAAgB;AAiET,gBAAAC,OAWJ,QAAAC,aAXI;AAxCT,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAyB;AACvB,QAAM,CAAC,QAAQ,SAAS,IAAIF,UAAiC,CAAC,CAAC;AAC/D,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,KAAK;AAE5C,QAAM,eAAe,OAAO,MAAuB;AACjD,MAAE,eAAe;AACjB,eAAW,IAAI;AACf,QAAI;AACF,YAAM,OAAO,MAAM;AACnB,gBAAU,CAAC,CAAC;AACZ,cAAQ;AAAA,IACV,SAAS,OAAO;AACd,cAAQ,MAAM,+BAA+B,KAAK;AAAA,IACpD,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,cAAc,MAAM;AACxB,cAAU,CAAC,CAAC;AACZ,YAAQ;AAAA,EACV;AAEA,MAAI,CAAC,YAAa,QAAO;AAEzB,QAAM,UAAU,YAAY,OAAO,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,OAAO,EAAE,GAAG,GAAG,KAAK,CAAC;AAE/F,SACE,gBAAAC,MAACR,SAAA,EAAO,MAAM,QAAQ,cAAc,aAClC,0BAAAS,MAACR,gBAAA,EACC;AAAA,oBAAAO,MAACL,eAAA,EACC,0BAAAM,MAAC,SAAI,WAAU,2BACb;AAAA,sBAAAD,MAAC,SAAI,WAAU,2GACZ,sBAAY,UACX,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,KAAK,YAAY;AAAA,UACjB,KAAK,YAAY;AAAA,UACjB,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,WAAU;AAAA;AAAA,MACZ,IAEA,gBAAAA,MAAC,OAAI,WAAU,iCAAgC,GAEnD;AAAA,MACA,gBAAAC,MAACL,cAAA,EACE;AAAA,iBAAS,WAAW,QAAQ;AAAA,QAAS;AAAA,QAAE,YAAY;AAAA,QAAK;AAAA,SAC3D;AAAA,OACF,GACF;AAAA,IACA,gBAAAK,MAAC,UAAK,UAAU,cACd;AAAA,sBAAAD,MAAC,SAAI,WAAU,mBACZ,sBAAY,OAAO,IAAI,CAAC,UACvB,gBAAAC,MAAC,SAAoB,WAAU,cAC7B;AAAA,wBAAAA,MAACH,QAAA,EAAM,SAAS,MAAM,KACnB;AAAA,gBAAM;AAAA,UACN,MAAM,YAAY,gBAAAE,MAAC,UAAK,WAAU,oBAAmB,eAAC;AAAA,WACzD;AAAA,QACA,gBAAAA;AAAA,UAACH;AAAA,UAAA;AAAA,YACC,IAAI,MAAM;AAAA,YACV,MAAM,MAAM;AAAA,YACZ,aAAa,MAAM;AAAA,YACnB,OAAO,OAAO,MAAM,GAAG,KAAK;AAAA,YAC5B,UAAU,CAAC,MACT,UAAU,CAAC,UAAU;AAAA,cACnB,GAAG;AAAA,cACH,CAAC,MAAM,GAAG,GAAG,EAAE,OAAO;AAAA,YACxB,EAAE;AAAA,YAEJ,UAAU,MAAM;AAAA;AAAA,QAClB;AAAA,WAjBQ,MAAM,GAkBhB,CACD,GACH;AAAA,MACA,gBAAAI,MAACP,eAAA,EACC;AAAA,wBAAAM,MAACT,SAAA,EAAO,MAAK,UAAS,SAAQ,WAAU,SAAS,aAAa,oBAE9D;AAAA,QACA,gBAAAS,MAACT,SAAA,EAAO,MAAK,UAAS,UAAU,WAAW,CAAC,SACzC,oBAAU,cAAc,QAC3B;AAAA,SACF;AAAA,OACF;AAAA,KACF,GACF;AAEJ;;;AChIA;AAAA,EACE,UAAAW;AAAA,EACA,QAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,OAAAC,MAAK,oBAAoB;AA+CpB,gBAAAC,OAWJ,QAAAC,aAXI;AA5Cd,SAAS,WAAW,MAAoB;AACtC,SAAO,KAAK,mBAAmB,SAAS;AAAA,IACtC,OAAO;AAAA,IACP,KAAK;AAAA,IACL,MAAM;AAAA,EACR,CAAC;AACH;AAqBO,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAuB;AACrB,QAAM,aAAa,UAAU,QAAQ,MAAM,UAAU,QAAQ;AAE7D,SACE,gBAAAD,MAACF,OAAA,EAAK,WAAS,MAAC,WAAU,OACxB,0BAAAG,MAAC,SAAI,WAAU,qCACb;AAAA,oBAAAA,MAAC,SAAI,WAAU,2BACb;AAAA,sBAAAD,MAAC,SAAI,WAAU,2GACZ,oBACC,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,KAAK;AAAA,UACL,KAAK;AAAA,UACL,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,WAAU;AAAA;AAAA,MACZ,IAEA,gBAAAA,MAACD,MAAA,EAAI,WAAU,iCAAgC,GAEnD;AAAA,MACA,gBAAAE,MAAC,SACC;AAAA,wBAAAD,MAAC,QAAG,WAAU,uBAAuB,gBAAK;AAAA,QAC1C,gBAAAA,MAAC,OAAE,WAAU,iCACV,uBAAa,YAAY,WAAW,SAAS,CAAC,KAAK,YAAY,WAAW,SAAS,CAAC,IACvF;AAAA,SACF;AAAA,OACF;AAAA,IACA,gBAAAC,MAAC,gBACC;AAAA,sBAAAD,MAAC,uBAAoB,SAAO,MAC1B,0BAAAC,MAACJ,SAAA,EAAO,SAAQ,SAAQ,MAAK,WAC3B;AAAA,wBAAAG,MAAC,gBAAa,WAAU,WAAU;AAAA,QAClC,gBAAAA,MAAC,UAAK,WAAU,WAAU,uBAAS;AAAA,SACrC,GACF;AAAA,MACA,gBAAAC,MAAC,uBAAoB,OAAM,OACzB;AAAA,wBAAAD,MAAC,oBAAiB,SAAS,MAAM,SAAS,EAAE,GAAG,oBAAM;AAAA,QACrD,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,SAAS,MAAM,SAAS,EAAE;AAAA,YAC3B;AAAA;AAAA,QAED;AAAA,SACF;AAAA,OACF;AAAA,KACF,GACF;AAEJ;;;AC7FA,SAAS,YAAAE,iBAAgB;AA6Fd,SAIP,YAAAC,WAJO,OAAAC,OAIP,QAAAC,aAJO;AAnFX,IAAMC,iBAA8B;AAAA,EAClC,EAAE,KAAK,WAAW,OAAO,WAAW,MAAM,YAAY,UAAU,KAAK;AACvE;AAoBO,SAAS,UAAU;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAmB;AACjB,QAAM,CAAC,kBAAkB,mBAAmB,IAAIC,UAAS,KAAK;AAC9D,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,UAAS,KAAK;AAC1D,QAAM,CAAC,cAAc,eAAe,IAAIA,UAA2B,IAAI;AACvE,QAAM,CAAC,WAAW,YAAY,IAAIA,UAA8B,QAAQ;AAExE,QAAM,eAAe,CAAC,OAAe;AACnC,UAAM,OAAO,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAC1C,QAAI,CAAC,KAAM;AAEX,oBAAgB,IAAI;AACpB,iBAAa,QAAQ;AACrB,sBAAkB,IAAI;AAAA,EACxB;AAEA,QAAM,oBAAoB,CAAC,OAAe;AACxC,UAAM,OAAO,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAC1C,QAAI,CAAC,KAAM;AAEX,oBAAgB,IAAI;AACpB,wBAAoB,IAAI;AAAA,EAC1B;AAEA,QAAM,sBAAsB,YAAY;AACtC,QAAI,CAAC,aAAc;AAEnB,UAAM,SAAS,aAAa,EAAE;AAC9B,wBAAoB,KAAK;AACzB,oBAAgB,IAAI;AAAA,EACtB;AAEA,QAAM,aAAa,OAAO,gBAAwC;AAChE,QAAI,cAAc,YAAY,cAAc;AAC1C,YAAM,SAAS,aAAa,IAAI,WAAW;AAAA,IAC7C;AACA,sBAAkB,KAAK;AACvB,oBAAgB,IAAI;AAAA,EACtB;AAEA,QAAM,yBAAyB,MAAM;AACnC,QAAI,CAAC,aAAc,QAAO;AAE1B,UAAM,SAAS,uBACX,qBAAqB,aAAa,aAAa,IAC/CD;AAEJ,WAAO;AAAA,MACL,IAAI,aAAa;AAAA,MACjB,MAAM,aAAa;AAAA,MACnB,SAAS,aAAa;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAEA,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO,gBAAAF,MAAC,mBAAgB,iBAAiB,gBAAgB;AAAA,EAC3D;AAEA,SACE,gBAAAC,MAAAF,WAAA,EACE;AAAA,oBAAAC,MAAC,SAAI,WAAU,4CACZ,gBAAM,IAAI,CAAC,SACV,gBAAAA;AAAA,MAAC;AAAA;AAAA,QAEC,IAAI,KAAK;AAAA,QACT,MAAM,KAAK;AAAA,QACX,SAAS,KAAK;AAAA,QACd,WAAW,KAAK;AAAA,QAChB,WAAW,KAAK;AAAA,QAChB,UAAU;AAAA,QACV,UAAU;AAAA;AAAA,MAPL,KAAK;AAAA,IAQZ,CACD,GACH;AAAA,IAEA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ;AAAA,QACR,SAAS,MAAM;AACb,8BAAoB,KAAK;AACzB,0BAAgB,IAAI;AAAA,QACtB;AAAA,QACA,UAAU,cAAc,QAAQ;AAAA,QAChC,WAAW;AAAA;AAAA,IACb;AAAA,IAEA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ;AAAA,QACR,SAAS,MAAM;AACb,4BAAkB,KAAK;AACvB,0BAAgB,IAAI;AAAA,QACtB;AAAA,QACA,MAAM;AAAA,QACN,aAAa,uBAAuB;AAAA,QACpC,QAAQ;AAAA;AAAA,IACV;AAAA,KACF;AAEJ;;;ACvIA,SAAS,WAAAI,gBAAe;AAoDpB,gBAAAC,aAAA;AAfG,SAAS,aAAa;AAAA,EAC3B,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAsB;AACpB,QAAM,EAAE,QAAQ,UAAU,IAAID,SAAQ;AAEtC,QAAM,cAAc,MAAM;AACxB,eAAW;AACX,WAAO;AAAA,EACT;AAEA,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,SAAS;AAAA,MACT,UAAU,YAAY;AAAA,MACtB,WACE,aACA;AAAA,MAED,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAEJ;;;ACjEA,SAAS,WAAAC,gBAAe;AAyDpB,gBAAAC,aAAA;AAfG,SAAS,cAAc;AAAA,EAC5B,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAuB;AACrB,QAAM,EAAE,SAAS,UAAU,IAAID,SAAQ;AAEvC,QAAM,cAAc,MAAM;AACxB,gBAAY;AACZ,YAAQ;AAAA,EACV;AAEA,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,SAAS;AAAA,MACT,UAAU,YAAY;AAAA,MACtB,WACE,aACA;AAAA,MAED,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAEJ;;;ACtEA,SAAS,WAAAC,gBAAe;AAyFd,gBAAAC,OAqCA,QAAAC,aArCA;AAjEV,SAAS,YAAY,MAAkC;AACrD,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,QAAQ,KAAK,KAAK,EAAE,MAAM,KAAK;AACrC,MAAI,MAAM,WAAW,EAAG,QAAO,MAAM,CAAC,EAAE,OAAO,CAAC,EAAE,YAAY;AAC9D,UACE,MAAM,CAAC,EAAE,OAAO,CAAC,IAAI,MAAM,MAAM,SAAS,CAAC,EAAE,OAAO,CAAC,GACrD,YAAY;AAChB;AAmDO,SAAS,SAAS,EAAE,eAAe,YAAY,UAAU,GAAkB;AAChF,QAAM,EAAE,MAAM,SAAS,UAAU,IAAIF,SAAQ;AAE7C,MAAI,WAAW;AACb,WACE,gBAAAC,MAAC,SAAI,WACH,0BAAAA,MAAC,SAAI,WAAU,+BACb,0BAAAA,MAAC,SAAI,WAAU,+CAA8C,GAC/D,GACF;AAAA,EAEJ;AAEA,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,KAAK,YACrB,GAAG,KAAK,SAAS,GAAG,KAAK,WAAW,IAAI,KAAK,QAAQ,KAAK,EAAE,KAC5D,KAAK;AAET,QAAM,WAAW;AAAA,IACf,KAAK,YAAY,GAAG,KAAK,SAAS,IAAI,KAAK,YAAY,EAAE,KAAK,KAAK;AAAA,EACrE;AAEA,QAAM,eAAe,EAAE,MAAM,aAAa,SAAS;AACnD,QAAM,YAAY,EAAE,MAAM,aAAa,UAAU,QAAQ;AAGzD,MAAI,CAAC,iBAAiB,CAAC,YAAY;AACjC,WACE,gBAAAA,MAAC,SAAI,WACH,0BAAAC,MAAC,SAAI,WAAU,+BACb;AAAA,sBAAAD,MAAC,SAAI,WAAU,sFACZ,eAAK,oBACJ,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,KAAK,KAAK;AAAA,UACV,KAAK;AAAA,UACL,WAAU;AAAA;AAAA,MACZ,IAEA,UAEJ;AAAA,MACA,gBAAAC,MAAC,SAAI,WAAU,WACb;AAAA,wBAAAD,MAAC,OAAE,WAAU,eAAe,uBAAY;AAAA,QACxC,gBAAAA,MAAC,OAAE,WAAU,iCAAiC,eAAK,OAAM;AAAA,SAC3D;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS,MAAM,QAAQ;AAAA,UACvB,WAAU;AAAA,UACX;AAAA;AAAA,MAED;AAAA,OACF,GACF;AAAA,EAEJ;AAEA,SACE,gBAAAC,MAAC,SAAI,WACF;AAAA,oBAAgB,YAAY;AAAA,IAC5B,aAAa,SAAS;AAAA,KACzB;AAEJ;;;ACpJA,SAAS,WAAAC,gBAAe;AACxB,SAAS,wBAAAC,6BAA4B;AA0F/B,gBAAAC,aAAA;AAxBC,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AACF,GAAsB;AACpB,QAAM,EAAE,gBAAgB,sBAAsB,eAAe,IAAIF,SAAQ;AAGzE,MAAI,CAAC,gBAAgB;AACnB,WAAO,uBAAuB,KAAK;AAAA,EACrC;AAGA,QAAM,2BAA2B,CAAC;AAAA,IAChC,gBAAAG;AAAA,EACF,MAEM;AACJ,WAAO,qBAAqB,EAAE,gBAAAA,gBAAe,CAAC;AAAA,EAChD;AAGA,QAAM,SACJ,gBAAAD,MAAC,SAAI,WAAW,iCAAiC,aAAa,EAAE,IAC9D,0BAAAA;AAAA,IAACD;AAAA,IAAA;AAAA,MACC,WAAW;AAAA,MACX,sBAAsB;AAAA;AAAA,EACxB,GACF;AAIF,SAAO,gBAAgB,cAAc,MAAM,IAAI;AACjD;;;ACrEA,SAAS,WAAAG,gBAAe;;;AC/BxB,SAAS,aAAa,aAAAC,YAAW,YAAAC,iBAAgB;AAsC1C,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA,WAAW;AACb,GAAgD;AAC9C,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAwB,IAAI;AACtD,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,IAAI;AAC3C,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAwB,IAAI;AAEtD,QAAM,aAAa,YAAY,YAAY;AACzC,QAAI;AACF,iBAAW,IAAI;AACf,eAAS,IAAI;AAEb,YAAM,SAAS,IAAI,gBAAgB,EAAE,OAAO,CAAC;AAC7C,UAAI,gBAAgB;AAClB,eAAO,IAAI,kBAAkB,cAAc;AAAA,MAC7C;AAEA,YAAM,WAAW,MAAM,MAAM,GAAG,QAAQ,IAAI,MAAM,EAAE;AACpD,YAAM,OAAO,MAAM,SAAS,KAAK;AAEjC,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,IAAI,MAAM,KAAK,SAAS,uBAAuB;AAAA,MACvD;AAEA,eAAS,KAAK,KAAK;AAAA,IACrB,SAAS,KAAK;AACZ,eAAS,eAAe,QAAQ,IAAI,UAAU,oBAAoB;AAAA,IACpE,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,QAAQ,gBAAgB,QAAQ,CAAC;AAErC,EAAAD,WAAU,MAAM;AACd,eAAW;AAAA,EACb,GAAG,CAAC,UAAU,CAAC;AAEf,SAAO,EAAE,OAAO,SAAS,OAAO,SAAS,WAAW;AACtD;;;AC7EA,SAAS,eAAAE,cAAa,WAAAC,gBAAe;AAwE9B,SAAS,WAA2B;AACzC,QAAM,UAAU,gBAAgB;AAEhC,QAAM,WAAWC;AAAA,IACf,CAAC,OAAsC;AACrC,aAAO,QAAQ,MAAM,KAAK,CAAC,SAAS,KAAK,OAAO,EAAE;AAAA,IACpD;AAAA,IACA,CAAC,QAAQ,KAAK;AAAA,EAChB;AAEA,QAAM,oBAAoBA;AAAA,IACxB,CAAC,kBAAuC;AACtC,aAAO,QAAQ,MAAM,OAAO,CAAC,SAAS,KAAK,kBAAkB,aAAa;AAAA,IAC5E;AAAA,IACA,CAAC,QAAQ,KAAK;AAAA,EAChB;AAEA,SAAOC;AAAA,IACL,OAAO;AAAA,MACL,OAAO,QAAQ;AAAA,MACf,SAAS,QAAQ;AAAA,MACjB,OAAO,QAAQ;AAAA,MACf,aAAa,QAAQ,WAAW;AAAA,MAChC,QAAQ,QAAQ;AAAA,MAChB,QAAQ,QAAQ;AAAA,MAChB,QAAQ,QAAQ;AAAA,MAChB,QAAQ,QAAQ;AAAA,MAChB,sBAAsB,QAAQ;AAAA,MAC9B;AAAA,MACA;AAAA,IACF;AAAA,IACA,CAAC,SAAS,UAAU,iBAAiB;AAAA,EACvC;AACF;AAqBO,SAAS,mBAA0C;AACxD,QAAM,UAAU,wBAAwB;AAExC,QAAM,WAAWD;AAAA,IACf,CAAC,OAAsC;AACrC,aAAO,SAAS,MAAM,KAAK,CAAC,SAAS,KAAK,OAAO,EAAE;AAAA,IACrD;AAAA,IACA,CAAC,SAAS,KAAK;AAAA,EACjB;AAEA,QAAM,oBAAoBA;AAAA,IACxB,CAAC,kBAAuC;AACtC,aAAO,SAAS,MAAM,OAAO,CAAC,SAAS,KAAK,kBAAkB,aAAa,KAAK,CAAC;AAAA,IACnF;AAAA,IACA,CAAC,SAAS,KAAK;AAAA,EACjB;AAEA,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,OAAO,QAAQ;AAAA,IACf,SAAS,QAAQ;AAAA,IACjB,OAAO,QAAQ;AAAA,IACf,aAAa,QAAQ,WAAW;AAAA,IAChC,QAAQ,QAAQ;AAAA,IAChB,QAAQ,QAAQ;AAAA,IAChB,QAAQ,QAAQ;AAAA,IAChB,QAAQ,QAAQ;AAAA,IAChB,sBAAsB,QAAQ;AAAA,IAC9B;AAAA,IACA;AAAA,EACF;AACF;;;AC1JA,SAAS,SAAS;AAClB,SAAS,0BAA0B;AAkB5B,IAAM,iBAAiB,mBAAmB,OAAO;AAAA;AAAA,EAEtD,IAAI,EAAE,OAAO,EAAE,SAAS,qBAAqB;AAAA;AAAA,EAG7C,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,eAAe;AAAA;AAAA,EAGlD,eAAe,EAAE,QAAQ,EAAE,SAAS,2BAA2B;AAAA;AAAA,EAG/D,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,4BAA4B;AAAA,EACtE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,uBAAuB;AAAA,EACjE,cAAc,EACX,OAAO,EACP,SAAS,EACT,SAAS,EACT,SAAS,EACT,SAAS,wBAAwB;AACtC,CAAC;;;ACxCD,SAAS,KAAAE,UAAS;AAClB,SAAS,qBAAqB;AAKvB,IAAM,qBAAqBA,GAAE,OAAO;AAAA;AAAA,EAEzC,OAAOA,GAAE,OAAO,EAAE,MAAM,EAAE,SAAS,8BAA8B;AAAA;AAAA,EAEjE,QAAQA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,0BAA0B;AACnE,CAAC;AAoBM,IAAM,oBAAoB,cAAc,OAAO;AAAA;AAAA,EAEpD,QAAQA,GAAE,OAAO,EAAE,SAAS,SAAS;AAAA;AAAA,EAGrC,cAAc,mBAAmB,SAAS,EAAE;AAAA,IAC1C;AAAA,EACF;AACF,CAAC;;;ACvCD,SAAS,KAAAC,UAAS;AAiBX,IAAM,yBAAyBA,GAAE,OAAO;AAAA;AAAA,EAE7C,IAAIA,GAAE,OAAO,EAAE,SAAS,iBAAiB;AAAA;AAAA,EAEzC,MAAMA,GAAE,OAAO,EAAE,SAAS,mBAAmB;AAAA;AAAA,EAE7C,MAAMA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,mBAAmB;AAAA;AAAA,EAExD,SAASA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,uBAAuB;AAAA;AAAA,EAErE,QAAQA,GAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,gCAAgC;AAAA;AAAA,EAExE,SAASA,GACN,MAAMA,GAAE,OAAO,CAAC,EAChB,SAAS,EACT,SAAS,qCAAqC;AAAA;AAAA,EAEjD,UAAUA,GACP,OAAOA,GAAE,OAAO,GAAGA,GAAE,QAAQ,CAAC,EAC9B,SAAS,EACT,SAAS,qBAAqB;AACnC,CAAC;;;ACtCD,SAAS,KAAAC,UAAS;AAKX,IAAM,8BAA8BA,GAAE,OAAO;AAAA;AAAA,EAElD,UAAUA,GAAE,OAAO,EAAE,SAAS,kBAAkB;AAAA;AAAA,EAEhD,aAAaA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,gCAAgC;AAAA;AAAA,EAE5E,SAASA,GAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,uCAAuC;AAAA;AAAA,EAEhF,aAAaA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,mCAAmC;AAAA;AAEvF,CAAC;AAOM,IAAM,8BAA8BA,GAAE,KAAK,CAAC,WAAW,YAAY,SAAS,QAAQ,CAAC;AAOrF,IAAM,sBAAsBA,GAAE,OAAO;AAAA;AAAA,EAE1C,UAAUA,GAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,oCAAoC;AAAA;AAAA,EAE9E,mBAAmB,4BAA4B,SAAS,EAAE;AAAA,IACxD;AAAA,EACF;AAAA;AAAA,EAEA,aAAaA,GACV,OAAO,EACP,IAAI,EACJ,SAAS,EACT,SAAS,yCAAyC;AAAA;AAEvD,CAAC;AAOM,IAAM,mBAAmBA,GAAE,KAAK,CAAC,SAAS,QAAQ,SAAS,CAAC;AAO5D,IAAM,eAAeA,GAAE,KAAK,CAAC,QAAQ,SAAS,UAAU,SAAS,MAAM,CAAC;AAOxE,IAAM,gBAAgBA,GAAE,KAAK,CAAC,OAAO,OAAO,QAAQ,QAAQ,MAAM,CAAC;AAUnE,IAAM,6BAA6BA,GAAE,OAAO;AAAA;AAAA,EAEjD,YAAY,iBAAiB,SAAS,EAAE,SAAS,uBAAuB;AAAA;AAAA,EAExE,QAAQ,aAAa,SAAS,EAAE,SAAS,qBAAqB;AAAA;AAAA,EAE9D,SAAS,cAAc,SAAS,EAAE,SAAS,gBAAgB;AAAA;AAE7D,CAAC;;;AClFD,SAAS,KAAAC,UAAS;AASX,IAAM,kBAAkBA,GAAE,MAAM;AAAA,EACrCA,GAAE,OAAO,EAAE,SAAS,mBAAmB;AAAA,EACvCA,GAAE,QAAQ,UAAU,EAAE,SAAS,uBAAuB;AACxD,CAAC;AAQM,IAAM,wBAAwBA,GAAE,OAAO;AAAA;AAAA,EAE5C,WAAWA,GAAE,OAAO,EAAE,SAAS,2BAA2B;AAAA;AAAA,EAE1D,WAAWA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,gBAAgB;AAC5D,CAAC;AAOM,IAAM,gCAAgC,sBAAsB,OAAO;AAAA;AAAA,EAExE,gBAAgBA,GACb,OAAO,EACP,SAAS,EACT,SAAS,wCAAwC;AACtD,CAAC;AASM,IAAM,8BAA8BA,GAAE,OAAO;AAAA;AAAA,EAElD,QAAQA,GAAE,OAAO,EAAE,SAAS,gCAAgC;AAAA;AAAA,EAE5D,gBAAgBA,GACb,OAAO,EACP,SAAS,EACT,SAAS,wCAAwC;AAAA;AAAA,EAEpD,UAAUA,GACP,OAAO,EACP,IAAI,EACJ,SAAS,EACT,SAAS,2CAA2C;AACzD,CAAC;AAOM,IAAM,6BAA6BA,GAAE,OAAO;AAAA;AAAA,EAEjD,OAAOA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,mBAAmB;AAAA;AAAA,EAEzD,SAASA,GAAE,QAAQ,EAAE,SAAS,gCAAgC;AAAA;AAAA,EAE9D,OAAOA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,+BAA+B;AAAA;AAEvE,CAAC;;;ACzED,SAAS,iBAAAC,gBAAe,cAAAC,aAAY,WAAAC,gBAA+B;;;ACFnE,SAAS,OAAAC,MAAK,SAAS,MAAM,QAAQ,MAAM,aAAa;;;ACGxD,SAAS,eAAe;AACxB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE,gBAAAC;AAAA,EACA,uBAAAC;AAAA,EACA,oBAAAC;AAAA,EACA,uBAAAC;AAAA,OACK;AACP,YAAYC,YAAW;AA2CnB,gBAAAC,OAuFc,QAAAC,cAvFd;AAFJ,SAAS,YAAY,EAAE,MAAM,UAAU,UAAU,GAAwB;AACvE,SACE,gBAAAD,MAAC,WAAQ,IAAI,MAAM,WAChB,UACH;AAEJ;AAwCO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA,gBAAgB;AAAA,EAChB;AAAA,EACA,WAAW;AAAA,EACX;AACF,GAAqB;AAEnB,MAAI,CAAC,SAAS,MAAM,WAAW,GAAG;AAChC,WAAO;AAAA,EACT;AAGA,QAAM,iBAAiB,MAAM,SAAS;AACtC,QAAM,eAAe,iBACjB,CAAC,MAAM,CAAC,GAAG,GAAG,MAAM,MAAM,EAAE,WAAW,EAAE,CAAC,IAC1C;AACJ,QAAM,cAAc,iBAChB,MAAM,MAAM,GAAG,EAAE,WAAW,EAAE,IAC9B,CAAC;AAEL,SACE,gBAAAA,MAAC,cAAW,WACV,0BAAAA,MAAC,kBACE,uBAAa,IAAI,CAAC,MAAM,UAAU;AACjC,UAAM,SAAS,UAAU,aAAa,SAAS;AAC/C,UAAM,UAAU,UAAU;AAG1B,QAAI,kBAAkB,SAAS;AAC7B,aACE,gBAAAC,OAAO,iBAAN,EACC;AAAA,wBAAAD,MAAC,kBACE,eAAK,OACJ,gBAAAA,MAAC,kBAAe,SAAO,MACrB,0BAAAA,MAAC,iBAAc,MAAM,KAAK,MAAO,eAAK,OAAM,GAC9C,IAEA,gBAAAA,MAAC,kBAAgB,eAAK,OAAM,GAEhC;AAAA,QACA,gBAAAA,MAAC,uBAAqB,qBAAU;AAAA,QAChC,gBAAAA,MAAC,kBACC,0BAAAC,OAACN,eAAA,EACC;AAAA,0BAAAK;AAAA,YAACF;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,cAAW;AAAA,cAEX,0BAAAE,MAAC,sBAAmB,WAAU,UAAS;AAAA;AAAA,UACzC;AAAA,UACA,gBAAAA,MAACJ,sBAAA,EAAoB,OAAM,SACxB,sBAAY,IAAI,CAAC,eAChB,gBAAAI,MAACH,mBAAA,EAAwC,SAAO,MAC9C,0BAAAG,MAAC,iBAAc,MAAM,WAAW,QAAQ,KACrC,qBAAW,OACd,KAHqB,WAAW,KAIlC,CACD,GACH;AAAA,WACF,GACF;AAAA,QACA,gBAAAA,MAAC,uBAAqB,qBAAU;AAAA,WA9Bb,KAAK,KA+B1B;AAAA,IAEJ;AAEA,WACE,gBAAAC,OAAO,iBAAN,EACC;AAAA,sBAAAD,MAAC,kBACE,mBACC,gBAAAA,MAAC,kBAAgB,eAAK,OAAM,IAC1B,KAAK,OACP,gBAAAA,MAAC,kBAAe,SAAO,MACrB,0BAAAA,MAAC,iBAAc,MAAM,KAAK,MAAO,eAAK,OAAM,GAC9C,IAEA,gBAAAA,MAAC,kBAAgB,eAAK,OAAM,GAEhC;AAAA,MACC,CAAC,UAAU,gBAAAA,MAAC,uBAAqB,qBAAU;AAAA,SAZzB,KAAK,KAa1B;AAAA,EAEJ,CAAC,GACH,GACF;AAEJ;AAEA,YAAY,cAAc;;;AChKE,gBAAAE,OAClB,QAAAC,cADkB;AAPrB,SAAS,qBAAqB;AACnC,QAAM,WAAW,qBAAqB;AAEtC,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACC,sBAAsB,MACpB,gBAAAC,OAAC,SAAI,WAAU,gCACZ;AAAA,iBAAS,QAAQ,gBAAAD,MAAC,SAAI,WAAU,iBAAiB,mBAAS,MAAK;AAAA,QAChE,gBAAAC,OAAC,SAAI,WAAU,sCACb;AAAA,0BAAAD,MAAC,UAAK,WAAU,iBAAiB,mBAAS,MAAK;AAAA,UAC9C,SAAS,WACR,gBAAAA,MAAC,UAAK,WAAU,iCAAiC,mBAAS,SAAQ;AAAA,WAEtE;AAAA,SACF;AAAA;AAAA,EAEJ;AAEJ;;;AClDA,SAAS,iBAAiC;AA0FlC,SACE,OAAAE,OADF,QAAAC,cAAA;AAvER,IAAM,sBAAuD;AAAA,EAC3D,SAAS;AAAA,EACT,UAAU;AAAA,EACV,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,cAAc;AAChB;AAGA,IAAM,iBAAiB,oBAAI,IAAI,CAAC,OAAO,OAAO,OAAO,SAAS,OAAO,OAAO,IAAI,CAAC;AAGjF,SAAS,iBAAiB,YAA4B;AACpD,SAAO,WACJ,MAAM,GAAG,EACT,IAAI,UAAQ;AACX,UAAM,QAAQ,KAAK,YAAY;AAC/B,QAAI,eAAe,IAAI,KAAK,GAAG;AAC7B,aAAO,KAAK,YAAY;AAAA,IAC1B;AACA,WAAO,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC,EAAE,YAAY;AAAA,EAClE,CAAC,EACA,KAAK,GAAG;AACb;AAGA,SAAS,gBAAgB,YAA6B;AACpD,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,oBAAoB,UAA6B;AACtE,MAAI,cAAc;AAChB,WAAO;AAAA,EACT;AAGA,SAAO,qCAAqC,iBAAiB,UAAU,CAAC;AAC1E;AAMO,IAAM,sBAAN,cAAkC,UAGvC;AAAA,EACA,YAAY,OAAiC;AAC3C,UAAM,KAAK;AACX,SAAK,QAAQ,EAAE,UAAU,MAAM;AAAA,EACjC;AAAA,EAEA,OAAO,yBAAyB,OAAwC;AACtE,WAAO,EAAE,UAAU,MAAM,MAAM;AAAA,EACjC;AAAA,EAEA,kBAAkB,OAAc,WAA4B;AAC1D,YAAQ,MAAM,uCAAuC,OAAO,SAAS;AAAA,EACvE;AAAA,EAEA,SAAS;AACP,QAAI,KAAK,MAAM,UAAU;AACvB,UAAI,KAAK,MAAM,UAAU;AACvB,eAAO,KAAK,MAAM;AAAA,MACpB;AAEA,YAAM,UAAU,gBAAgB,KAAK,MAAM,UAAU;AAErD,aACE,gBAAAA,OAAC,SAAI,WAAU,yGACb;AAAA,wBAAAD,MAAC,OAAE,WAAU,iCAAiC,mBAAQ;AAAA,QACtD,gBAAAA,MAAC,OAAE,WAAU,oCAAmC,sCAEhD;AAAA,SACF;AAAA,IAEJ;AAEA,WAAO,KAAK,MAAM;AAAA,EACpB;AACF;;;ACvFM,gBAAAE,OASE,QAAAC,cATF;AALC,SAAS,cAAc;AAC5B,QAAM,EAAE,MAAM,gBAAgB,UAAU,IAAIC,SAAQ;AAEpD,MAAI,WAAW;AACb,WACE,gBAAAF,MAAC,SAAI,WAAU,gEAA+D,wBAE9E;AAAA,EAEJ;AAEA,MAAI,CAAC,MAAM;AACT,WACE,gBAAAC,OAAC,SAAI,WAAU,4BACb;AAAA,sBAAAA,OAAC,SAAI,WAAU,QACb;AAAA,wBAAAD,MAAC,QAAG,WAAU,yCAAwC,qBAAO;AAAA,QAC7D,gBAAAA,MAAC,OAAE,WAAU,yBAAwB,6CAA+B;AAAA,SACtE;AAAA,MACA,gBAAAA,MAAC,SAAI,WAAU,0FACb,0BAAAA,MAAC,OAAE,WAAU,iCAAgC,kDAE7C,GACF;AAAA,OACF;AAAA,EAEJ;AAEA,SACE,gBAAAC,OAAC,SAAI,WAAU,4BACb;AAAA,oBAAAA,OAAC,SAAI,WAAU,QACb;AAAA,sBAAAD,MAAC,QAAG,WAAU,yCAAwC,qBAAO;AAAA,MAC7D,gBAAAA,MAAC,OAAE,WAAU,yBAAwB,6CAA+B;AAAA,OACtE;AAAA,IACA,gBAAAA,MAAC,uBAAoB,YAAW,WAC9B,0BAAAA,MAAC,eAAY,WAAW,gBAAgB,GAC1C;AAAA,KACF;AAEJ;;;ACjCM,gBAAAG,OASE,QAAAC,cATF;AALC,SAAS,eAAe;AAC7B,QAAM,EAAE,MAAM,gBAAgB,UAAU,IAAIC,SAAQ;AAEpD,MAAI,WAAW;AACb,WACE,gBAAAF,MAAC,SAAI,WAAU,gEAA+D,wBAE9E;AAAA,EAEJ;AAEA,MAAI,CAAC,MAAM;AACT,WACE,gBAAAC,OAAC,SAAI,WAAU,4BACb;AAAA,sBAAAA,OAAC,SAAI,WAAU,QACb;AAAA,wBAAAD,MAAC,QAAG,WAAU,yCAAwC,sBAAQ;AAAA,QAC9D,gBAAAA,MAAC,OAAE,WAAU,yBAAwB,8DAAgD;AAAA,SACvF;AAAA,MACA,gBAAAA,MAAC,SAAI,WAAU,0FACb,0BAAAA,MAAC,OAAE,WAAU,iCAAgC,8DAE7C,GACF;AAAA,OACF;AAAA,EAEJ;AAEA,SACE,gBAAAC,OAAC,SAAI,WAAU,4BACb;AAAA,oBAAAA,OAAC,SAAI,WAAU,QACb;AAAA,sBAAAD,MAAC,QAAG,WAAU,yCAAwC,sBAAQ;AAAA,MAC9D,gBAAAA,MAAC,OAAE,WAAU,yBAAwB,8DAAgD;AAAA,OACvF;AAAA,IACA,gBAAAA,MAAC,uBAAoB,YAAW,YAC9B,0BAAAA,MAAC,gBAAa,WAAW,gBAAgB,GAC3C;AAAA,KACF;AAEJ;;;ACjCM,gBAAAG,OASE,QAAAC,cATF;AALC,SAAS,eAAe;AAC7B,QAAM,EAAE,MAAM,gBAAgB,UAAU,IAAIC,SAAQ;AAEpD,MAAI,WAAW;AACb,WACE,gBAAAF,MAAC,SAAI,WAAU,gEAA+D,wBAE9E;AAAA,EAEJ;AAEA,MAAI,CAAC,MAAM;AACT,WACE,gBAAAC,OAAC,SAAI,WAAU,4BACb;AAAA,sBAAAA,OAAC,SAAI,WAAU,QACb;AAAA,wBAAAD,MAAC,QAAG,WAAU,yCAAwC,sBAAQ;AAAA,QAC9D,gBAAAA,MAAC,OAAE,WAAU,yBAAwB,kDAAoC;AAAA,SAC3E;AAAA,MACA,gBAAAA,MAAC,SAAI,WAAU,0FACb,0BAAAA,MAAC,OAAE,WAAU,iCAAgC,mDAE7C,GACF;AAAA,OACF;AAAA,EAEJ;AAEA,SACE,gBAAAC,OAAC,SAAI,WAAU,4BACb;AAAA,oBAAAA,OAAC,SAAI,WAAU,QACb;AAAA,sBAAAD,MAAC,QAAG,WAAU,yCAAwC,sBAAQ;AAAA,MAC9D,gBAAAA,MAAC,OAAE,WAAU,yBAAwB,kDAAoC;AAAA,OAC3E;AAAA,IACA,gBAAAA,MAAC,uBAAoB,YAAW,YAC9B,0BAAAA,MAAC,gBAAa,WAAW,gBAAgB,GAC3C;AAAA,KACF;AAEJ;;;ACjCM,gBAAAG,OASE,QAAAC,cATF;AALC,SAAS,cAAc;AAC5B,QAAM,EAAE,MAAM,gBAAgB,UAAU,IAAIC,SAAQ;AAEpD,MAAI,WAAW;AACb,WACE,gBAAAF,MAAC,SAAI,WAAU,gEAA+D,wBAE9E;AAAA,EAEJ;AAEA,MAAI,CAAC,MAAM;AACT,WACE,gBAAAC,OAAC,SAAI,WAAU,4BACb;AAAA,sBAAAA,OAAC,SAAI,WAAU,QACb;AAAA,wBAAAD,MAAC,QAAG,WAAU,yCAAwC,sBAAQ;AAAA,QAC9D,gBAAAA,MAAC,OAAE,WAAU,yBAAwB,6CAA+B;AAAA,SACtE;AAAA,MACA,gBAAAA,MAAC,SAAI,WAAU,0FACb,0BAAAA,MAAC,OAAE,WAAU,iCAAgC,qDAE7C,GACF;AAAA,OACF;AAAA,EAEJ;AAEA,SACE,gBAAAC,OAAC,SAAI,WAAU,4BACb;AAAA,oBAAAA,OAAC,SAAI,WAAU,QACb;AAAA,sBAAAD,MAAC,QAAG,WAAU,yCAAwC,sBAAQ;AAAA,MAC9D,gBAAAA,MAAC,OAAE,WAAU,yBAAwB,6CAA+B;AAAA,OACtE;AAAA,IACA,gBAAAA,MAAC,uBAAoB,YAAW,YAC9B,0BAAAA,MAAC,WAAQ,WAAW,gBAAgB,GACtC;AAAA,KACF;AAEJ;;;AC9BM,gBAAAG,OASE,QAAAC,cATF;AARC,SAAS,WAAW;AACzB,QAAM,EAAE,MAAM,gBAAgB,WAAW,gBAAgB,YAAY,IAAIC,SAAQ;AAEjF,QAAM,kBAAkB,CAAC,CAAC;AAC1B,QAAM,gBAAgB,mBAAmB,aAAa,SAAS,4BAA4B;AAE3F,MAAI,WAAW;AACb,WACE,gBAAAF,MAAC,SAAI,WAAU,gEAA+D,wBAE9E;AAAA,EAEJ;AAEA,MAAI,CAAC,MAAM;AACT,WACE,gBAAAC,OAAC,SAAI,WAAU,4BACb;AAAA,sBAAAA,OAAC,SAAI,WAAU,QACb;AAAA,wBAAAD,MAAC,QAAG,WAAU,yCAAwC,kBAAI;AAAA,QAC1D,gBAAAA,MAAC,OAAE,WAAU,yBAAwB,sDAAwC;AAAA,SAC/E;AAAA,MACA,gBAAAA,MAAC,SAAI,WAAU,0FACb,0BAAAA,MAAC,OAAE,WAAU,iCAAgC,iDAE7C,GACF;AAAA,OACF;AAAA,EAEJ;AAEA,MAAI,CAAC,iBAAiB;AACpB,WACE,gBAAAC,OAAC,SAAI,WAAU,4BACb;AAAA,sBAAAA,OAAC,SAAI,WAAU,QACb;AAAA,wBAAAD,MAAC,QAAG,WAAU,yCAAwC,kBAAI;AAAA,QAC1D,gBAAAA,MAAC,OAAE,WAAU,yBAAwB,sDAAwC;AAAA,SAC/E;AAAA,MACA,gBAAAA,MAAC,SAAI,WAAU,0FACb,0BAAAA,MAAC,OAAE,WAAU,iCAAgC,4EAE7C,GACF;AAAA,OACF;AAAA,EAEJ;AAEA,MAAI,CAAC,eAAe;AAClB,WACE,gBAAAC,OAAC,SAAI,WAAU,4BACb;AAAA,sBAAAA,OAAC,SAAI,WAAU,QACb;AAAA,wBAAAD,MAAC,QAAG,WAAU,yCAAwC,kBAAI;AAAA,QAC1D,gBAAAA,MAAC,OAAE,WAAU,yBAAwB,sDAAwC;AAAA,SAC/E;AAAA,MACA,gBAAAA,MAAC,SAAI,WAAU,0FACb,0BAAAA,MAAC,OAAE,WAAU,iCAAgC,gEAE7C,GACF;AAAA,OACF;AAAA,EAEJ;AAEA,SACE,gBAAAC,OAAC,SAAI,WAAU,4BACb;AAAA,oBAAAA,OAAC,SAAI,WAAU,QACb;AAAA,sBAAAD,MAAC,QAAG,WAAU,yCAAwC,kBAAI;AAAA,MAC1D,gBAAAA,MAAC,OAAE,WAAU,yBAAwB,sDAAwC;AAAA,OAC/E;AAAA,IACA,gBAAAA,MAAC,uBAAoB,YAAW,QAC9B,0BAAAA,MAAC,mBAAgB,WAAW,gBAAgB,GAC9C;AAAA,KACF;AAEJ;;;ACpEM,gBAAAG,OASE,QAAAC,cATF;AALC,SAAS,mBAAmB;AACjC,QAAM,EAAE,MAAM,gBAAgB,UAAU,IAAIC,SAAQ;AAEpD,MAAI,WAAW;AACb,WACE,gBAAAF,MAAC,SAAI,WAAU,gEAA+D,wBAE9E;AAAA,EAEJ;AAEA,MAAI,CAAC,MAAM;AACT,WACE,gBAAAC,OAAC,SAAI,WAAU,4BACb;AAAA,sBAAAA,OAAC,SAAI,WAAU,QACb;AAAA,wBAAAD,MAAC,QAAG,WAAU,yCAAwC,0BAAY;AAAA,QAClE,gBAAAA,MAAC,OAAE,WAAU,yBAAwB,qDAAuC;AAAA,SAC9E;AAAA,MACA,gBAAAA,MAAC,SAAI,WAAU,0FACb,0BAAAA,MAAC,OAAE,WAAU,iCAAgC,yDAE7C,GACF;AAAA,OACF;AAAA,EAEJ;AAEA,SACE,gBAAAC,OAAC,SAAI,WAAU,4BACb;AAAA,oBAAAA,OAAC,SAAI,WAAU,QACb;AAAA,sBAAAD,MAAC,QAAG,WAAU,yCAAwC,0BAAY;AAAA,MAClE,gBAAAA,MAAC,OAAE,WAAU,yBAAwB,qDAAuC;AAAA,OAC9E;AAAA,IACA,gBAAAA,MAAC,uBAAoB,YAAW,gBAC9B,0BAAAA,MAAC,SAAM,WAAW,gBAAgB,GACpC;AAAA,KACF;AAEJ;;;AT5BO,IAAM,gBAA8B;AAAA,EAC1C,EAAE,IAAI,QAAQ,OAAO,EAAE;AAAA,EACvB,EAAE,IAAI,WAAW,OAAO,WAAW,OAAO,GAAG;AAAA,EAC7C,EAAE,IAAI,aAAa,OAAO,aAAa,OAAO,GAAG;AAAA,EACjD,EAAE,IAAI,SAAS,OAAO,SAAS,OAAO,GAAG;AAC1C;AAKO,IAAM,gBAAgC;AAAA,EAC5C;AAAA,IACC,KAAK;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM;AAAA,IACN,WAAW;AAAA,IACX,SAAS;AAAA,IACT,QAAQ;AAAA,EACT;AAAA,EACA;AAAA,IACC,KAAK;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM;AAAA,IACN,WAAW;AAAA,IACX,SAAS;AAAA,IACT,QAAQ;AAAA,EACT;AAAA,EACA;AAAA,IACC,KAAK;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM;AAAA,IACN,WAAW;AAAA,IACX,SAAS;AAAA,IACT,QAAQ;AAAA,EACT;AACD;AAKO,IAAM,kBAAkC;AAAA,EAC9C;AAAA,IACC,KAAK;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAMG;AAAA,IACN,WAAW;AAAA,IACX,SAAS;AAAA,IACT,QAAQ;AAAA,EACT;AACD;AAKO,IAAM,cAA8B;AAAA,EAC1C;AAAA,IACC,KAAK;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM;AAAA,IACN,WAAW;AAAA,IACX,SAAS;AAAA,IACT,QAAQ;AAAA,EACT;AACD;AAKO,IAAM,oBAAoC;AAAA,EAChD;AAAA,IACC,KAAK;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM;AAAA,IACN,WAAW;AAAA,IACX,SAAS;AAAA,IACT,QAAQ;AAAA,EACT;AACD;AAQO,IAAM,gBAAgC;AAAA,EAC5C,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACJ;;;ADvBI,gBAAAC,aAAA;AApEJ,IAAM,yBAAyBC,eAAkD,IAAI;AAwB9E,SAAS,wBAAwB,EAAE,QAAQ,SAAS,GAAiC;AAC1F,QAAM,QAAQC,SAAqC,MAAM;AAEvD,UAAM,SAAS,OAAO,UAAU;AAChC,UAAM,gBAAgB,OAAO,OAAO,CAAC,UAAU,MAAM,YAAY,KAAK;AAGtE,UAAM,SAAS,CAAC,GAAI,OAAO,UAAU,aAAc,EAAE,KAAK,CAAC,GAAG,OAAO,EAAE,SAAS,MAAM,EAAE,SAAS,EAAE;AAGnG,UAAM,gBAAgB,oBAAI,IAA4B;AAGtD,eAAW,SAAS,QAAQ;AAC1B,oBAAc,IAAI,MAAM,IAAI,CAAC,CAAC;AAAA,IAChC;AAGA,eAAW,SAAS,eAAe;AACjC,YAAM,UAAU,MAAM,SAAS;AAC/B,YAAM,cAAc,cAAc,IAAI,OAAO,KAAK,CAAC;AACnD,kBAAY,KAAK,KAAK;AACtB,oBAAc,IAAI,SAAS,WAAW;AAAA,IACxC;AAGA,eAAW,CAAC,SAASC,OAAM,KAAK,eAAe;AAC7C,oBAAc;AAAA,QACZ;AAAA,QACAA,QAAO,KAAK,CAAC,GAAG,OAAO,EAAE,SAAS,MAAM,EAAE,SAAS,EAAE;AAAA,MACvD;AAAA,IACF;AAEA,WAAO;AAAA,MACL;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA,UAAU,OAAO;AAAA,MACjB,UAAU,OAAO,YAAY;AAAA,IAC/B;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,SACE,gBAAAH,MAAC,uBAAuB,UAAvB,EAAgC,OAC9B,UACH;AAEJ;AAeO,SAAS,qBAAkD;AAChE,QAAM,UAAUI,YAAW,sBAAsB;AACjD,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,gEAAgE;AAAA,EAClF;AACA,SAAO;AACT;AAaO,SAAS,qBAAqC;AACnD,QAAM,EAAE,OAAO,IAAI,mBAAmB;AACtC,SAAO;AACT;AAkBO,SAAS,4BAGd;AACA,QAAM,EAAE,eAAe,OAAO,IAAI,mBAAmB;AACrD,SAAO,EAAE,eAAe,OAAO;AACjC;AAkBO,SAAS,uBAA0C;AACxD,QAAM,EAAE,SAAS,IAAI,mBAAmB;AACxC,SAAO;AACT;AAaO,SAAS,uBAAiD;AAC/D,QAAM,EAAE,SAAS,IAAI,mBAAmB;AACxC,SAAOF,SAAQ,MAAM;AACnB,WAAO,CAAC,SAAiB;AACvB,UAAI,CAAC,SAAU,QAAO;AAEtB,UAAI,SAAS,IAAK,QAAO,YAAY;AAErC,aAAO,GAAG,QAAQ,GAAG,IAAI;AAAA,IAC3B;AAAA,EACF,GAAG,CAAC,QAAQ,CAAC;AACf;;;AWvMA,SAAS,iBAAiB;AAC1B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,eAAe;;;ACNxB,SAAS,WAAAG,gBAAe;AACxB,SAAS,aAAa,WAAAC,gBAAe;AACrC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,mBAAmB;AAiBpB,SAgBG,YAAAC,WAfQ,OAAAC,OADX,QAAAC,cAAA;AATR,SAAS,QAAQ,EAAE,OAAO,YAAY,GAAmE;AACvG,QAAM,WAAW,YAAY,MAAM,IAAI;AAEvC,QAAM,WAAW,YAAY,UAAU,EAAE,SAAS,aAAa,IAAI,CAAC;AACpE,QAAM,OAAO,MAAM;AAEnB,SACE,gBAAAD,MAAC,mBACC,0BAAAA,MAAC,qBAAkB,SAAO,MAAC,UAAoB,SAAS,MAAM,OAC5D,0BAAAC,OAACC,UAAA,EAAQ,IAAI,UACV;AAAA,YAAQ,gBAAAF,MAAC,QAAK,WAAU,UAAS;AAAA,IAClC,gBAAAA,MAAC,UAAM,gBAAM,OAAM;AAAA,KACrB,GACF,GACF;AAEJ;AAKA,SAAS,eAAe,EAAE,cAAc,GAAkC;AACxE,QAAM,WAAW,qBAAqB;AAEtC,MAAI,eAAe;AACjB,WAAO,gBAAAA,MAAAD,WAAA,EAAG,yBAAc;AAAA,EAC1B;AAEA,SACE,gBAAAE,OAAC,SAAI,WAAU,gCACZ;AAAA,aAAS,QAAQ,gBAAAD,MAAC,SAAI,WAAU,iBAAiB,mBAAS,MAAK;AAAA,IAChE,gBAAAC,OAAC,SAAI,WAAU,sCACb;AAAA,sBAAAD,MAAC,UAAK,WAAU,iBAAiB,mBAAS,MAAK;AAAA,MAC9C,SAAS,WACR,gBAAAA,MAAC,UAAK,WAAU,iCAAiC,mBAAS,SAAQ;AAAA,OAEtE;AAAA,KACF;AAEJ;AAKA,SAAS,kBAAkB;AACzB,QAAM,EAAE,MAAM,QAAQ,IAAIG,SAAQ;AAElC,MAAI,CAAC,KAAM,QAAO;AAElB,QAAM,cAAc,KAAK,YACrB,GAAG,KAAK,SAAS,GAAG,KAAK,WAAW,IAAI,KAAK,QAAQ,KAAK,EAAE,KAC5D,KAAK,SAAS;AAElB,SACE,gBAAAH;AAAA,IAAC;AAAA;AAAA,MACC,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,OAAO,KAAK,SAAS;AAAA,QACrB,QAAQ,KAAK,qBAAqB;AAAA,MACpC;AAAA,MACA,WAAW,MAAM,QAAQ;AAAA;AAAA,EAC3B;AAEJ;AAgBO,SAAS,aAAa,EAAE,eAAe,UAAU,UAAU,GAAsB;AACtF,QAAM,EAAE,eAAe,OAAO,IAAI,0BAA0B;AAC5D,QAAM,cAAc,qBAAqB;AAEzC,SACE,gBAAAC,OAAC,WAAQ,aAAY,QAAO,WAC1B;AAAA,oBAAAD,MAAC,iBACC,0BAAAA,MAAC,kBAAe,eAA8B,GAChD;AAAA,IACA,gBAAAA,MAAC,kBACE,iBAAO,IAAI,CAAC,UAAU;AACrB,YAAM,SAAS,cAAc,IAAI,MAAM,EAAE;AACzC,UAAI,CAAC,UAAU,OAAO,WAAW,EAAG,QAAO;AAE3C,aACE,gBAAAC,OAAC,gBACE;AAAA,cAAM,SAAS,gBAAAD,MAAC,qBAAmB,gBAAM,OAAM;AAAA,QAChD,gBAAAA,MAAC,uBACC,0BAAAA,MAAC,eACE,iBAAO,IAAI,CAAC,UACX,gBAAAA,MAAC,WAAwB,OAAc,eAAzB,MAAM,GAA6C,CAClE,GACH,GACF;AAAA,WARiB,MAAM,EASzB;AAAA,IAEJ,CAAC,GACH;AAAA,IACA,gBAAAA,MAAC,iBACE,sBAAY,gBAAAA,MAAC,mBAAgB,GAChC;AAAA,IACA,gBAAAA,MAAC,eAAY;AAAA,KACf;AAEJ;;;AD7GM,SACE,OAAAI,OADF,QAAAC,cAAA;AATN,SAAS,cAAc;AAAA,EACrB;AAAA,EACA;AACF,GAGG;AACD,SACE,gBAAAA,OAAC,YAAO,WAAU,sKAChB;AAAA,oBAAAA,OAAC,SAAI,WAAU,4DACb;AAAA,sBAAAD,MAAC,kBAAe,WAAU,SAAQ;AAAA,MAClC,gBAAAA,MAAC,aAAU,aAAY,YAAW,WAAU,YAAW;AAAA,MACtD,eAAe,YAAY,SAAS,KACnC,gBAAAA,MAAC,eAAY,OAAO,aAAa;AAAA,OAErC;AAAA,IACC,iBACC,gBAAAA,MAAC,SAAI,WAAU,0EACb,0BAAAA,MAAC,SAAI,WAAU,mBAAmB,yBAAc,GAClD;AAAA,KAEJ;AAEJ;AAmBO,SAAS,UAAU;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAmB;AACjB,QAAM,EAAE,OAAO,IAAI,mBAAmB;AACtC,QAAM,EAAE,UAAU,KAAK,IAAI;AAE3B,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC,UAAU,SAAS,YAAY,MAAM,eAAe;AAAA,MACpD,mBAAmB,SAAS,qBAAqB,MAAM,qBAAqB;AAAA,MAC5E,kBAAkB,SAAS;AAAA,MAC3B,kBAAkB,SAAS;AAAA,MAE3B;AAAA,wBAAAA,OAAC,mBACC;AAAA,0BAAAD,MAAC,gBAAa,eAAe,sBAAsB;AAAA,UACnD,gBAAAC,OAAC,gBACC;AAAA,4BAAAD,MAAC,iBAAc,aAA0B,eAA8B;AAAA,YACvE,gBAAAA,MAAC,UAAK,WAAU,4BACb,UACH;AAAA,aACF;AAAA,WACF;AAAA,QACA,gBAAAA,MAAC,WAAQ;AAAA;AAAA;AAAA,EACX;AAEJ;;;AEtFA,SAAgB,WAAAE,gBAA+B;AAC/C,SAAS,qBAAqB;AAE9B,SAAS,iBAAiB,gBAAgB,iBAAiB;;;ACW3D,SAAS,UAAU,KAAiC;AAElD,MAAI,OAAO,gBAAgB,eAAe,YAAY,KAAK;AACzD,WAAO,YAAY,IAAI,GAAG;AAAA,EAC5B;AAEA,MAAI,OAAO,YAAY,eAAe,QAAQ,KAAK;AACjD,WAAO,QAAQ,IAAI,GAAG;AAAA,EACxB;AACA,SAAO;AACT;AAQO,SAAS,eAAuC;AACrD,QAAM,WAAW,UAAU,uBAAuB;AAClD,QAAM,cAAc,UAAU,0BAA0B;AACxD,QAAM,cAAc,UAAU,0BAA0B;AACxD,QAAM,aAAa,UAAU,sBAAsB;AACnD,QAAM,UAAU,UAAU,eAAe;AACzC,QAAM,aAAa,UAAU,kBAAkB;AAG/C,QAAM,WAAW,WACb;AAAA,IACE;AAAA,IACA,GAAI,eAAe,EAAE,YAAY;AAAA,IACjC,GAAI,eAAe,EAAE,YAAY;AAAA,IACjC,GAAI,cAAc,EAAE,SAAS,eAAe,OAAO;AAAA,EACrD,IACA;AAGJ,QAAM,WAAW,UACb;AAAA,IACE,MAAM;AAAA,IACN,GAAI,cAAc,EAAE,SAAS,WAAW;AAAA,EAC1C,IACA;AAEJ,SAAO;AAAA,IACL,GAAI,YAAY,EAAE,SAAS;AAAA,IAC3B,GAAI,YAAY,EAAE,SAAS;AAAA,EAC7B;AACF;AAOO,SAAS,mBAAmB,QAAgD;AACjF,QAAM,YAAY,aAAa;AAG/B,QAAM,WAAW;AAAA,IACf,MAAM,QAAQ,UAAU,QAAQ,UAAU,UAAU,QAAQ;AAAA,IAC5D,GAAI,QAAQ,UAAU,QAAQ,EAAE,MAAM,OAAO,SAAS,KAAK;AAAA,IAC3D,GAAI,QAAQ,UAAU,iBAAiB,EAAE,eAAe,OAAO,SAAS,cAAc;AAAA,IACtF,SAAS,QAAQ,UAAU,WAAW,UAAU,UAAU;AAAA,EAC5D;AAGA,QAAM,cAAc,UAAU;AAC9B,QAAM,iBAAiB,QAAQ;AAE/B,MAAI,CAAC,aAAa,YAAY,CAAC,gBAAgB,UAAU;AACvD,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,WAAW;AAAA,IACf,UAAU,gBAAgB,YAAY,aAAa,YAAY;AAAA,IAC/D,GAAI,gBAAgB,eAAe,aAAa,cAC5C,EAAE,aAAa,gBAAgB,eAAe,aAAa,YAAY,IACvE,CAAC;AAAA,IACL,GAAI,gBAAgB,eAAe,aAAa,cAC5C,EAAE,aAAa,gBAAgB,eAAe,aAAa,YAAY,IACvE,CAAC;AAAA,IACL,GAAI,gBAAgB,WAAW,aAAa,UACxC,EAAE,SAAS,gBAAgB,WAAW,aAAa,QAAQ,IAC3D,CAAC;AAAA,IACL,GAAI,gBAAgB,aAAa,SAAY,EAAE,UAAU,eAAe,SAAS,IAAI,CAAC;AAAA,IACtF,GAAI,gBAAgB,oBAAoB,EAAE,mBAAmB,eAAe,kBAAkB,IAAI,CAAC;AAAA,IACnG,GAAI,gBAAgB,mBAAmB,EAAE,kBAAkB,eAAe,iBAAiB,IAAI,CAAC;AAAA,IAChG,GAAI,gBAAgB,mBAAmB,EAAE,kBAAkB,eAAe,iBAAiB,IAAI,CAAC;AAAA,EAClG;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,GAAI,QAAQ,YAAY,EAAE,UAAU,OAAO,SAAS;AAAA,IACpD,GAAI,QAAQ,SAAS,EAAE,OAAO,OAAO,MAAM;AAAA,IAC3C,GAAI,QAAQ,QAAQ,EAAE,MAAM,OAAO,KAAK;AAAA,IACxC,GAAI,QAAQ,UAAU,EAAE,QAAQ,OAAO,OAAO;AAAA,IAC9C,GAAI,QAAQ,UAAU,EAAE,QAAQ,OAAO,OAAO;AAAA,EAChD;AACF;;;AD9CQ,gBAAAC,aAAA;AAbD,SAAS,gBAAgB,EAAE,QAAQ,SAAS,GAAyB;AAE1E,QAAM,iBAAiBC,SAAQ,MAAM,mBAAmB,MAAM,GAAG,CAAC,MAAM,CAAC;AACzE,QAAM,EAAE,UAAU,MAAM,IAAI;AAE5B,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,cAAc,OAAO,QAAQ;AAAA,MAC7B,cAAY;AAAA,MACZ,2BAAyB;AAAA,MAEzB,0BAAAA,MAAC,2BAAwB,QAAQ,gBAC/B,0BAAAA;AAAA,QAAC;AAAA;AAAA,UACC,UAAU,SAAS;AAAA,UACnB,aAAa,SAAS;AAAA,UACtB,SAAS,SAAS;AAAA,UAClB,aAAa,SAAS;AAAA,UAErB;AAAA;AAAA,MACH,GACF;AAAA;AAAA,EACF;AAEJ;AAKA,SAAS,sBAAsB,QAAwB,UAAgC;AACrF,QAAM,SAAsB,CAAC;AAE7B,aAAW,SAAS,QAAQ;AAC1B,QAAI,MAAM,YAAY,MAAO;AAE7B,UAAM,WAAW,WAAW,GAAG,QAAQ,GAAG,MAAM,IAAI,KAAK,MAAM;AAC/D,WAAO,MAAM,GAAG,IAAI;AAAA,MAClB,MAAM;AAAA,MACN,WAAW,MAAM;AAAA,MACjB,MAAM;AAAA,QACJ,OAAO,MAAM;AAAA,QACb,MAAM,MAAM;AAAA,QACZ,OAAO,MAAM;AAAA,QACb,QAAQ,MAAM;AAAA,QACd,eAAe,MAAM;AAAA,QACrB,qBAAqB,MAAM;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAKA,SAAS,iBAAiB,eAA2B,sBAAkC;AAErF,QAAM,yBAAyB,wBAAwB,gBAAAA,MAAC,sBAAmB;AAE3E,SAAO,SAAS,aAAa;AAC3B,WACE,gBAAAA,MAAC,aAAU,eAA8B,sBAAsB,wBAC7D,0BAAAA,MAAC,aAAU,GACb;AAAA,EAEJ;AACF;AAuDO,SAAS,QAAQ,EAAE,QAAQ,eAAe,qBAAqB,GAAiB;AAErF,QAAM,eAAeC,SAAQ,MAAM,mBAAmB,MAAM,GAAG,CAAC,MAAM,CAAC;AAGvE,QAAM,SAAS,aAAa,UAAU;AACtC,QAAM,SAAS,aAAa,UAAU;AACtC,QAAM,iBAAiBA;AAAA,IACrB,OAAO,EAAE,GAAG,cAAc,QAAQ,OAAO;AAAA,IACzC,CAAC,cAAc,QAAQ,MAAM;AAAA,EAC/B;AAGA,QAAM,SAASA,SAAQ,MAAM;AAC3B,UAAM,cAAc,sBAAsB,QAAQ,aAAa,QAAQ;AACvE,UAAM,aAAa,iBAAiB,eAAe,oBAAoB;AAEvE,WAAO,gBAAgB,aAAa;AAAA,MAClC,eAAe;AAAA,MACf,UAAU,aAAa,YAAY;AAAA,IACrC,CAAC;AAAA,EACH,GAAG,CAAC,QAAQ,aAAa,UAAU,eAAe,oBAAoB,CAAC;AAEvE,SACE,gBAAAD,MAAC,mBAAgB,QAAQ,gBACvB,0BAAAA,MAAC,kBAAe,QAAgB,GAClC;AAEJ;AAmCO,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA2C;AAEzC,QAAM,eAAeC,SAAQ,MAAM,mBAAmB,MAAM,GAAG,CAAC,MAAM,CAAC;AAGvE,QAAM,SAAS,aAAa,UAAU;AACtC,QAAM,SAAS,aAAa,UAAU;AACtC,QAAM,iBAAiBA;AAAA,IACrB,OAAO,EAAE,GAAG,cAAc,QAAQ,OAAO;AAAA,IACzC,CAAC,cAAc,QAAQ,MAAM;AAAA,EAC/B;AAGA,QAAM,yBAAyB,wBAAwB,gBAAAD,MAAC,sBAAmB;AAE3E,SACE,gBAAAA,MAAC,mBAAgB,QAAQ,gBACvB,0BAAAA,MAAC,aAAU,eAA8B,sBAAsB,wBAC5D,UACH,GACF;AAEJ;","names":["jsx","useEffect","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","Button","Input","Select","SelectContent","SelectItem","SelectTrigger","SelectValue","React","jsx","jsxs","jsx","jsxs","Button","Input","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","Button","Dialog","DialogContent","DialogHeader","DialogTitle","jsx","jsxs","Button","jsx","jsxs","Button","Dialog","DialogContent","DialogFooter","DialogHeader","DialogTitle","Input","Label","useState","jsx","jsxs","Button","Card","Key","jsx","jsxs","useState","Fragment","jsx","jsxs","defaultFields","useState","useAuth","jsx","useAuth","jsx","useAuth","jsx","jsxs","useAuth","OrganizationSwitcher","jsx","organizationId","useAuth","useEffect","useState","useCallback","useMemo","useCallback","useMemo","z","z","z","z","createContext","useContext","useMemo","Key","DropdownMenu","DropdownMenuContent","DropdownMenuItem","DropdownMenuTrigger","React","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","useAuth","jsx","jsxs","useAuth","jsx","jsxs","useAuth","jsx","jsxs","useAuth","jsx","jsxs","useAuth","jsx","jsxs","useAuth","Key","jsx","createContext","useMemo","routes","useContext","useAuth","WebLink","Fragment","jsx","jsxs","WebLink","useAuth","jsx","jsxs","useMemo","jsx","useMemo"]}