@mdxui/auth 1.1.0 → 1.1.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/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/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/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 { 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 { 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","/**\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","useAuth","jsx","useAuth","jsx","useAuth","jsx","jsxs","useAuth","OrganizationSwitcher","jsx","organizationId","useAuth","useEffect","useState","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"],"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,4 +1,5 @@
1
- export { A as AuthGate, I as IdentityProvider, W as WidgetsProvider, u as useThemeDetection } from '../index-Bl4BwORF.js';
1
+ export { A as AuthGate, I as IdentityProvider, d as VaultClient, e as VaultContextState, V as VaultProvider, f as VaultProviderProps, W as WidgetsProvider, u as useThemeDetection, b as useVaultContext, c as useVaultContextOptional } from '../index-DGthQxCM.js';
2
2
  import 'react/jsx-runtime';
3
3
  import '../auth-Ba2f778e.js';
4
4
  import 'react';
5
+ import '../types-8tixck1H.js';
@@ -152,10 +152,78 @@ function AuthGate({
152
152
  return /* @__PURE__ */ jsx3(Fragment, { children: landingComponent ?? /* @__PURE__ */ jsx3(DefaultLandingPage, {}) });
153
153
  }
154
154
  }
155
+
156
+ // src/providers/vault-provider.tsx
157
+ import { createContext, useContext, useMemo } from "react";
158
+ import { jsx as jsx4 } from "react/jsx-runtime";
159
+ var VaultContext = createContext(null);
160
+ var defaultFields = [
161
+ { key: "api_key", label: "API Key", type: "password", required: true }
162
+ ];
163
+ function VaultProvider({
164
+ children,
165
+ client,
166
+ initialItems = []
167
+ }) {
168
+ const contextValue = useMemo(() => {
169
+ const getIntegrationFields = (integrationId) => {
170
+ if (client?.getIntegrationFields) {
171
+ return client.getIntegrationFields(integrationId);
172
+ }
173
+ return defaultFields;
174
+ };
175
+ return {
176
+ client: client ?? null,
177
+ items: initialItems,
178
+ loading: false,
179
+ error: null,
180
+ reload: async () => {
181
+ if (!client) {
182
+ console.warn("VaultProvider: No client provided, cannot reload");
183
+ return;
184
+ }
185
+ await client.list();
186
+ },
187
+ createItem: async (integrationId, credentials) => {
188
+ if (!client) {
189
+ throw new Error("VaultProvider: No client provided");
190
+ }
191
+ await client.create(integrationId, credentials);
192
+ },
193
+ rotateItem: async (id, credentials) => {
194
+ if (!client) {
195
+ throw new Error("VaultProvider: No client provided");
196
+ }
197
+ await client.rotate(id, credentials);
198
+ },
199
+ deleteItem: async (id) => {
200
+ if (!client) {
201
+ throw new Error("VaultProvider: No client provided");
202
+ }
203
+ await client.delete(id);
204
+ },
205
+ getIntegrationFields
206
+ };
207
+ }, [client, initialItems]);
208
+ return /* @__PURE__ */ jsx4(VaultContext.Provider, { value: contextValue, children });
209
+ }
210
+ function useVaultContext() {
211
+ const context = useContext(VaultContext);
212
+ if (!context) {
213
+ throw new Error("useVaultContext must be used within a VaultProvider");
214
+ }
215
+ return context;
216
+ }
217
+ function useVaultContextOptional() {
218
+ return useContext(VaultContext);
219
+ }
155
220
  export {
156
221
  AuthGate,
157
222
  IdentityProvider,
223
+ VaultProvider,
158
224
  WidgetsProvider,
159
- useThemeDetection
225
+ useThemeDetection,
226
+ useVaultContext,
227
+ useVaultContextOptional
160
228
  };
161
229
  //# sourceMappingURL=index.js.map