@mdxui/auth 1.1.1 → 1.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +223 -0
- package/dist/{auth-Ba2f778e.d.ts → auth-maeYSYU_.d.ts} +4 -1
- package/dist/hooks/index.d.ts +1 -1
- package/dist/{index-DGthQxCM.d.ts → index-BOMpMKyG.d.ts} +1 -1
- package/dist/index.d.ts +5 -2
- package/dist/index.js +794 -4
- package/dist/index.js.map +1 -1
- package/dist/providers/index.d.ts +2 -2
- package/dist/providers/index.js +16 -1
- package/dist/providers/index.js.map +1 -1
- package/dist/schemas/index.d.ts +5 -0
- package/dist/schemas/index.js +1 -1
- package/dist/schemas/index.js.map +1 -1
- package/dist/shell/index.d.ts +675 -0
- package/dist/shell/index.js +1025 -0
- package/dist/shell/index.js.map +1 -0
- package/dist/types/index.d.ts +1 -1
- package/dist/widgets/index.d.ts +1 -1
- package/package.json +21 -14
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/shell/config-context.tsx","../../src/shell/route-presets.ts","../../src/widgets/user-profile.tsx","../../src/hooks/use-auth.ts","../../src/shell/components/breadcrumbs.tsx","../../src/components/team-switcher.tsx","../../src/shell/components/sidebar-org-switcher.tsx","../../src/shell/components/widget-error-boundary.tsx","../../src/shell/pages/profile-page.tsx","../../src/widgets/user-security.tsx","../../src/shell/pages/security-page.tsx","../../src/widgets/user-sessions.tsx","../../src/shell/pages/sessions-page.tsx","../../src/widgets/api-keys.tsx","../../src/shell/pages/api-keys-page.tsx","../../src/widgets/users-management.tsx","../../src/shell/pages/team-page.tsx","../../src/widgets/pipes.tsx","../../src/shell/pages/integrations-page.tsx","../../src/shell/auth-shell.tsx","../../src/providers/auth-gate.tsx","../../src/shell/auth-shell-nav.tsx","../../src/shell/auth-app.tsx","../../src/providers/identity-provider.tsx","../../src/providers/widgets-provider.tsx","../../src/shell/env-config.ts"],"sourcesContent":["'use client'\n\n/**\n * Auth Shell Configuration Context\n *\n * Provides configuration and route information to shell components.\n * Use the hooks to access config, routes, and branding.\n */\n\nimport { createContext, useContext, useMemo, type ReactNode } from 'react'\nimport type { AuthAppConfig, AuthAppRoute, AuthShellBranding, RouteGroup } from './types'\nimport { defaultGroups, defaultRoutes } from './route-presets'\n\n/**\n * Context value shape\n */\ninterface AuthShellConfigContextValue {\n /** Full configuration */\n config: AuthAppConfig\n /** All enabled routes */\n routes: AuthAppRoute[]\n /** Routes organized by group */\n routesByGroup: Map<string, AuthAppRoute[]>\n /** Route groups sorted by order */\n groups: RouteGroup[]\n /** Branding configuration */\n branding: AuthShellBranding\n /** Base path for routes */\n basePath: string\n}\n\nconst AuthShellConfigContext = createContext<AuthShellConfigContextValue | null>(null)\n\n/**\n * Props for AuthShellConfigProvider\n */\ninterface AuthShellConfigProviderProps {\n /** Shell configuration */\n config: AuthAppConfig\n /** Children to render */\n children: ReactNode\n}\n\n/**\n * Provides shell configuration context to children\n *\n * @example\n * ```tsx\n * <AuthShellConfigProvider config={config}>\n * <AuthShell>\n * <Outlet />\n * </AuthShell>\n * </AuthShellConfigProvider>\n * ```\n */\nexport function AuthShellConfigProvider({ config, children }: AuthShellConfigProviderProps) {\n const value = useMemo<AuthShellConfigContextValue>(() => {\n // Filter to enabled routes only\n const routes = config.routes ?? defaultRoutes\n const enabledRoutes = routes.filter((route) => route.enabled !== false)\n\n // Sort groups by order\n const groups = [...(config.groups ?? defaultGroups)].sort((a, b) => (a.order ?? 0) - (b.order ?? 0))\n\n // Organize routes by group\n const routesByGroup = new Map<string, AuthAppRoute[]>()\n\n // Initialize groups\n for (const group of groups) {\n routesByGroup.set(group.id, [])\n }\n\n // Sort routes into groups\n for (const route of enabledRoutes) {\n const groupId = route.group ?? 'main'\n const groupRoutes = routesByGroup.get(groupId) ?? []\n groupRoutes.push(route)\n routesByGroup.set(groupId, groupRoutes)\n }\n\n // Sort routes within each group by order\n for (const [groupId, routes] of routesByGroup) {\n routesByGroup.set(\n groupId,\n routes.sort((a, b) => (a.order ?? 0) - (b.order ?? 0))\n )\n }\n\n return {\n config,\n routes: enabledRoutes,\n routesByGroup,\n groups,\n branding: config.branding,\n basePath: config.basePath ?? '',\n }\n }, [config])\n\n return (\n <AuthShellConfigContext.Provider value={value}>\n {children}\n </AuthShellConfigContext.Provider>\n )\n}\n\n/**\n * Access the full shell configuration context\n *\n * @throws Error if used outside AuthShellConfigProvider\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { config, routes, branding } = useAuthShellConfig()\n * return <div>{branding.name}</div>\n * }\n * ```\n */\nexport function useAuthShellConfig(): AuthShellConfigContextValue {\n const context = useContext(AuthShellConfigContext)\n if (!context) {\n throw new Error('useAuthShellConfig must be used within AuthShellConfigProvider')\n }\n return context\n}\n\n/**\n * Access enabled routes array\n *\n * @example\n * ```tsx\n * function RouteList() {\n * const routes = useAuthShellRoutes()\n * return routes.map(r => <Link key={r.key} to={r.path}>{r.label}</Link>)\n * }\n * ```\n */\nexport function useAuthShellRoutes(): AuthAppRoute[] {\n const { routes } = useAuthShellConfig()\n return routes\n}\n\n/**\n * Access routes organized by group\n *\n * @example\n * ```tsx\n * function GroupedNav() {\n * const { routesByGroup, groups } = useAuthShellRoutesByGroup()\n * return groups.map(g => (\n * <div key={g.id}>\n * {g.label && <h3>{g.label}</h3>}\n * {routesByGroup.get(g.id)?.map(r => <Link to={r.path}>{r.label}</Link>)}\n * </div>\n * ))\n * }\n * ```\n */\nexport function useAuthShellRoutesByGroup(): {\n routesByGroup: Map<string, AuthAppRoute[]>\n groups: RouteGroup[]\n} {\n const { routesByGroup, groups } = useAuthShellConfig()\n return { routesByGroup, groups }\n}\n\n/**\n * Access branding configuration\n *\n * @example\n * ```tsx\n * function Header() {\n * const branding = useAuthShellBranding()\n * return (\n * <header>\n * {branding.logo}\n * <span>{branding.name}</span>\n * </header>\n * )\n * }\n * ```\n */\nexport function useAuthShellBranding(): AuthShellBranding {\n const { branding } = useAuthShellConfig()\n return branding\n}\n\n/**\n * Get full path with base path prefix\n *\n * @example\n * ```tsx\n * function NavLink({ route }: { route: AuthAppRoute }) {\n * const getFullPath = useAuthShellFullPath()\n * return <Link to={getFullPath(route.path)}>{route.label}</Link>\n * }\n * ```\n */\nexport function useAuthShellFullPath(): (path: string) => string {\n const { basePath } = useAuthShellConfig()\n return useMemo(() => {\n return (path: string) => {\n if (!basePath) return path\n // Handle root path\n if (path === '/') return basePath || '/'\n // Combine base path and route path\n return `${basePath}${path}`\n }\n }, [basePath])\n}\n","/**\n * Route Presets\n *\n * Default route configurations for AuthApp. These provide a zero-config\n * experience - just provide branding and identity config to get started.\n */\n\nimport { Key, Monitor, Plug, Shield, User, Users } from \"lucide-react\";\nimport {\n\tApiKeysPage,\n\tIntegrationsPage,\n\tProfilePage,\n\tSecurityPage,\n\tSessionsPage,\n\tTeamPage,\n} from \"./pages\";\nimport type { AuthAppRoute, RouteGroup } from \"./types\";\n\n/**\n * Default route groups for organizing navigation\n */\nexport const defaultGroups: RouteGroup[] = [\n\t{ id: \"main\", order: 0 },\n\t{ id: \"account\", label: \"Account\", order: 10 },\n\t{ id: \"developer\", label: \"Developer\", order: 20 },\n\t{ id: \"admin\", label: \"Admin\", order: 30 },\n];\n\n/**\n * Account management routes\n */\nexport const accountRoutes: AuthAppRoute[] = [\n\t{\n\t\tkey: \"profile\",\n\t\tpath: \"/profile\",\n\t\tlabel: \"Profile\",\n\t\tgroup: \"account\",\n\t\ticon: User,\n\t\tcomponent: ProfilePage,\n\t\tenabled: true,\n\t\tpublic: false,\n\t},\n\t{\n\t\tkey: \"security\",\n\t\tpath: \"/security\",\n\t\tlabel: \"Security\",\n\t\tgroup: \"account\",\n\t\ticon: Shield,\n\t\tcomponent: SecurityPage,\n\t\tenabled: true,\n\t\tpublic: false,\n\t},\n\t{\n\t\tkey: \"sessions\",\n\t\tpath: \"/sessions\",\n\t\tlabel: \"Sessions\",\n\t\tgroup: \"account\",\n\t\ticon: Monitor,\n\t\tcomponent: SessionsPage,\n\t\tenabled: true,\n\t\tpublic: false,\n\t},\n];\n\n/**\n * Developer-focused routes\n */\nexport const developerRoutes: AuthAppRoute[] = [\n\t{\n\t\tkey: \"api-keys\",\n\t\tpath: \"/api-keys\",\n\t\tlabel: \"API Keys\",\n\t\tgroup: \"developer\",\n\t\ticon: Key,\n\t\tcomponent: ApiKeysPage,\n\t\tenabled: true,\n\t\tpublic: false,\n\t},\n];\n\n/**\n * Admin/team management routes\n */\nexport const adminRoutes: AuthAppRoute[] = [\n\t{\n\t\tkey: \"team\",\n\t\tpath: \"/team\",\n\t\tlabel: \"Team\",\n\t\tgroup: \"admin\",\n\t\ticon: Users,\n\t\tcomponent: TeamPage,\n\t\tenabled: true,\n\t\tpublic: false,\n\t},\n];\n\n/**\n * Integration routes (optional, not included in defaults)\n */\nexport const integrationRoutes: AuthAppRoute[] = [\n\t{\n\t\tkey: \"integrations\",\n\t\tpath: \"/integrations\",\n\t\tlabel: \"Integrations\",\n\t\tgroup: \"developer\",\n\t\ticon: Plug,\n\t\tcomponent: IntegrationsPage,\n\t\tenabled: true,\n\t\tpublic: false,\n\t},\n];\n\n/**\n * Default routes - all standard routes combined\n *\n * Includes: account, developer, and admin routes\n * Does NOT include: integrationRoutes (opt-in)\n */\nexport const defaultRoutes: AuthAppRoute[] = [\n\t...accountRoutes,\n\t...developerRoutes,\n\t...adminRoutes,\n];\n","'use client'\n\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\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\n/**\n * Breadcrumbs Component\n *\n * Router-agnostic breadcrumbs that can work with any Link component.\n * Defaults to @mdxui/navigation/web WebLink for TanStack Router.\n * Uses @mdxui/primitives breadcrumb components under the hood.\n */\n\nimport { WebLink } from '@mdxui/navigation/web'\nimport {\n Breadcrumb,\n BreadcrumbEllipsis,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbList,\n BreadcrumbPage,\n BreadcrumbSeparator,\n} from '@mdxui/primitives/breadcrumb'\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '@mdxui/primitives/dropdown-menu'\nimport * as React from 'react'\n\n/**\n * Props for the Link component\n */\nexport interface BreadcrumbLinkProps {\n href: string\n children: React.ReactNode\n className?: string\n onClick?: () => void\n}\n\n/**\n * Single breadcrumb item configuration\n */\nexport interface BreadcrumbItemConfig {\n /** Display label */\n label: string\n /** Route path - last item should not have href */\n href?: string\n}\n\n/**\n * Props for the Breadcrumbs component\n */\nexport interface BreadcrumbsProps {\n /** Array of breadcrumb items */\n items: BreadcrumbItemConfig[]\n /** Custom link component (e.g., Next.js Link, TanStack Link). Defaults to WebLink */\n LinkComponent?: React.ComponentType<BreadcrumbLinkProps>\n /** Additional class names */\n className?: string\n /** Maximum items to show before collapsing */\n maxItems?: number\n /** Custom separator element */\n separator?: React.ReactNode\n}\n\n/**\n * Default link component using @mdxui/navigation/web WebLink\n */\nfunction DefaultLink({ href, children, className }: BreadcrumbLinkProps) {\n return (\n <WebLink to={href} className={className}>\n {children}\n </WebLink>\n )\n}\n\n/**\n * Breadcrumbs provides navigation context showing the user's location.\n *\n * Features:\n * - Router-agnostic - works with any Link component\n * - Defaults to @mdxui/navigation/web WebLink for TanStack Router\n * - Automatic collapse with dropdown for long paths\n * - Accessible breadcrumb semantics\n * - Custom separator support\n *\n * @example\n * ```tsx\n * // With default WebLink (TanStack Router)\n * <Breadcrumbs\n * items={[\n * { label: 'Home', href: '/' },\n * { label: 'Users', href: '/users' },\n * { label: 'John Doe' },\n * ]}\n * />\n *\n * // With Next.js Link\n * import NextLink from 'next/link'\n *\n * <Breadcrumbs\n * items={breadcrumbItems}\n * LinkComponent={NextLink}\n * />\n *\n * // With custom Link wrapper\n * <Breadcrumbs\n * items={breadcrumbItems}\n * LinkComponent={({ href, children, className }) => (\n * <MyCustomLink to={href} className={className}>{children}</MyCustomLink>\n * )}\n * />\n * ```\n */\nexport function Breadcrumbs({\n items,\n LinkComponent = DefaultLink,\n className,\n maxItems = 4,\n separator,\n}: BreadcrumbsProps) {\n // Handle empty items\n if (!items || items.length === 0) {\n return null\n }\n\n // Determine if we need to collapse items\n const shouldCollapse = items.length > maxItems\n const visibleItems = shouldCollapse\n ? [items[0], ...items.slice(-(maxItems - 1))]\n : items\n const hiddenItems = shouldCollapse\n ? items.slice(1, -(maxItems - 1))\n : []\n\n return (\n <Breadcrumb className={className}>\n <BreadcrumbList>\n {visibleItems.map((item, index) => {\n const isLast = index === visibleItems.length - 1\n const isFirst = index === 0\n\n // Insert ellipsis after first item if collapsing\n if (shouldCollapse && isFirst) {\n return (\n <React.Fragment key={item.label}>\n <BreadcrumbItem>\n {item.href ? (\n <BreadcrumbLink asChild>\n <LinkComponent href={item.href}>{item.label}</LinkComponent>\n </BreadcrumbLink>\n ) : (\n <BreadcrumbPage>{item.label}</BreadcrumbPage>\n )}\n </BreadcrumbItem>\n <BreadcrumbSeparator>{separator}</BreadcrumbSeparator>\n <BreadcrumbItem>\n <DropdownMenu>\n <DropdownMenuTrigger\n className=\"flex items-center gap-1 hover:text-foreground\"\n aria-label=\"Show hidden breadcrumbs\"\n >\n <BreadcrumbEllipsis className=\"size-4\" />\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\">\n {hiddenItems.map((hiddenItem) => (\n <DropdownMenuItem key={hiddenItem.label} asChild>\n <LinkComponent href={hiddenItem.href || '#'}>\n {hiddenItem.label}\n </LinkComponent>\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n </BreadcrumbItem>\n <BreadcrumbSeparator>{separator}</BreadcrumbSeparator>\n </React.Fragment>\n )\n }\n\n return (\n <React.Fragment key={item.label}>\n <BreadcrumbItem>\n {isLast ? (\n <BreadcrumbPage>{item.label}</BreadcrumbPage>\n ) : item.href ? (\n <BreadcrumbLink asChild>\n <LinkComponent href={item.href}>{item.label}</LinkComponent>\n </BreadcrumbLink>\n ) : (\n <BreadcrumbPage>{item.label}</BreadcrumbPage>\n )}\n </BreadcrumbItem>\n {!isLast && <BreadcrumbSeparator>{separator}</BreadcrumbSeparator>}\n </React.Fragment>\n )\n })}\n </BreadcrumbList>\n </Breadcrumb>\n )\n}\n\nBreadcrumbs.displayName = 'Breadcrumbs'\n","'use client'\n\nimport { 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\nimport { TeamSwitcher } from '../../components/team-switcher'\nimport { useAuthShellBranding } from '../config-context'\n\n/**\n * Pre-wired OrganizationSwitcher for sidebar header.\n *\n * Automatically uses shell branding context - when the user belongs to an\n * organization, shows the OrganizationSwitcher widget. When not in an\n * organization, falls back to displaying the app branding (logo + name).\n *\n * This component is used by default in AuthApp and AuthAppWithChildren.\n * You only need to explicitly pass it if using AuthShell directly or\n * if you want to override the default with a custom component.\n *\n * @example\n * ```tsx\n * // AuthApp uses SidebarOrgSwitcher by default - no config needed!\n * import { AuthApp } from '@mdxui/auth/shell'\n *\n * <AuthApp config={config} />\n * ```\n *\n * @example\n * ```tsx\n * // With AuthShell directly (manual setup)\n * import { AuthShell, SidebarOrgSwitcher } from '@mdxui/auth/shell'\n *\n * <AuthShell sidebarHeaderContent={<SidebarOrgSwitcher />}>\n * <Outlet />\n * </AuthShell>\n * ```\n */\nexport function SidebarOrgSwitcher() {\n const branding = useAuthShellBranding()\n\n return (\n <TeamSwitcher\n renderNoOrganization={() => (\n <div className=\"flex items-center gap-2 px-2\">\n {branding.logo && <div className=\"flex-shrink-0\">{branding.logo}</div>}\n <div className=\"flex flex-col gap-0.5 leading-none\">\n <span className=\"font-semibold\">{branding.name}</span>\n {branding.tagline && (\n <span className=\"text-xs text-muted-foreground\">{branding.tagline}</span>\n )}\n </div>\n </div>\n )}\n />\n )\n}\n","'use client'\n\nimport { Component, type ReactNode } from 'react'\n\n/** Known widget names with custom error messages */\ntype KnownWidgetName = 'profile' | 'security' | 'sessions' | 'api-keys' | 'team' | 'integrations'\n\ninterface WidgetErrorBoundaryProps {\n children: ReactNode\n /** Widget name for contextual error messages (known names get fun messages, others get a friendly default) */\n widgetName?: KnownWidgetName | (string & {})\n /** Custom fallback UI (overrides default error message) */\n fallback?: ReactNode\n}\n\ninterface WidgetErrorBoundaryState {\n hasError: boolean\n error?: Error\n}\n\n/** Friendly, contextual error messages for known widget types */\nconst widgetErrorMessages: Record<KnownWidgetName, string> = {\n profile: \"Your profile is camera shy right now...\",\n security: \"Security settings are being extra secure (maybe too secure)...\",\n sessions: \"Your sessions are having a session of their own...\",\n 'api-keys': \"Your API keys are playing hide and seek...\",\n team: \"Your team members wandered off for a moment...\",\n integrations: \"Your integrations are having connection issues (ironic, we know)...\",\n}\n\n/** Words that should be fully uppercased */\nconst uppercaseWords = new Set(['api', 'sso', 'mfa', 'oauth', 'jwt', 'url', 'id'])\n\n/** Formats a widget name for display: \"api-keys\" -> \"API Keys\" */\nfunction formatWidgetName(widgetName: string): string {\n return widgetName\n .split('-')\n .map(word => {\n const lower = word.toLowerCase()\n if (uppercaseWords.has(lower)) {\n return word.toUpperCase()\n }\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()\n })\n .join(' ')\n}\n\n/** Generates a friendly error message - fun message for known widgets, friendly default for others */\nfunction getErrorMessage(widgetName?: string): string {\n if (!widgetName) {\n return \"Something went wrong loading this widget.\"\n }\n\n const knownMessage = widgetErrorMessages[widgetName as KnownWidgetName]\n if (knownMessage) {\n return knownMessage\n }\n\n // Friendly fallback: \"Something went wrong loading your API Keys...\"\n return `Something went wrong loading your ${formatWidgetName(widgetName)}...`\n}\n\n/**\n * Error boundary for WorkOS widgets.\n * Catches rendering errors and displays a friendly, contextual fallback UI.\n */\nexport class WidgetErrorBoundary extends Component<\n WidgetErrorBoundaryProps,\n WidgetErrorBoundaryState\n> {\n constructor(props: WidgetErrorBoundaryProps) {\n super(props)\n this.state = { hasError: false }\n }\n\n static getDerivedStateFromError(error: Error): WidgetErrorBoundaryState {\n return { hasError: true, error }\n }\n\n componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {\n console.error('[WidgetErrorBoundary] Widget error:', error, errorInfo)\n }\n\n render() {\n if (this.state.hasError) {\n if (this.props.fallback) {\n return this.props.fallback\n }\n\n const message = getErrorMessage(this.props.widgetName)\n\n return (\n <div className=\"flex flex-col items-center justify-center gap-2 rounded-[var(--radius-md)] border border-dashed py-12\">\n <p className=\"text-muted-foreground text-sm\">{message}</p>\n <p className=\"text-muted-foreground/60 text-xs\">\n Try refreshing the page.\n </p>\n </div>\n )\n }\n\n return this.props.children\n }\n}\n","'use client'\n\nimport { UserProfile } from '../../widgets/user-profile'\nimport { useAuth } from '../../hooks/use-auth'\nimport { WidgetErrorBoundary } from '../components'\n\n/**\n * Profile page that renders the UserProfile widget\n *\n * Displays user account information including name, email, and profile picture.\n */\nexport function ProfilePage() {\n const { user, getAccessToken, isLoading } = useAuth()\n\n if (isLoading) {\n return (\n <div className=\"flex items-center justify-center py-12 text-muted-foreground\">\n Loading...\n </div>\n )\n }\n\n if (!user) {\n return (\n <div className=\"container max-w-4xl py-8\">\n <div className=\"mb-8\">\n <h1 className=\"text-2xl font-semibold tracking-tight\">Profile</h1>\n <p className=\"text-muted-foreground\">Manage your account information</p>\n </div>\n <div className=\"flex items-center justify-center rounded-[var(--radius-md)] border border-dashed py-24\">\n <p className=\"text-muted-foreground text-sm\">\n Please sign in to view your profile.\n </p>\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"container max-w-4xl py-8\">\n <div className=\"mb-8\">\n <h1 className=\"text-2xl font-semibold tracking-tight\">Profile</h1>\n <p className=\"text-muted-foreground\">Manage your account information</p>\n </div>\n <WidgetErrorBoundary widgetName=\"profile\">\n <UserProfile authToken={getAccessToken} />\n </WidgetErrorBoundary>\n </div>\n )\n}\n","'use client'\n\nimport { UserSecurity 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 { UserSecurity } from '../../widgets/user-security'\nimport { useAuth } from '../../hooks/use-auth'\nimport { WidgetErrorBoundary } from '../components'\n\n/**\n * Security page that renders the UserSecurity widget\n *\n * Allows users to manage password and MFA settings.\n */\nexport function SecurityPage() {\n const { user, getAccessToken, isLoading } = useAuth()\n\n if (isLoading) {\n return (\n <div className=\"flex items-center justify-center py-12 text-muted-foreground\">\n Loading...\n </div>\n )\n }\n\n if (!user) {\n return (\n <div className=\"container max-w-4xl py-8\">\n <div className=\"mb-8\">\n <h1 className=\"text-2xl font-semibold tracking-tight\">Security</h1>\n <p className=\"text-muted-foreground\">Manage your password and authentication settings</p>\n </div>\n <div className=\"flex items-center justify-center rounded-[var(--radius-md)] border border-dashed py-24\">\n <p className=\"text-muted-foreground text-sm\">\n Please sign in to manage your security settings.\n </p>\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"container max-w-4xl py-8\">\n <div className=\"mb-8\">\n <h1 className=\"text-2xl font-semibold tracking-tight\">Security</h1>\n <p className=\"text-muted-foreground\">Manage your password and authentication settings</p>\n </div>\n <WidgetErrorBoundary widgetName=\"security\">\n <UserSecurity authToken={getAccessToken} />\n </WidgetErrorBoundary>\n </div>\n )\n}\n","'use client'\n\nimport { UserSessions 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 { UserSessions } from '../../widgets/user-sessions'\nimport { useAuth } from '../../hooks/use-auth'\nimport { WidgetErrorBoundary } from '../components'\n\n/**\n * Sessions page that renders the UserSessions widget\n *\n * Displays active sessions and allows users to revoke them.\n */\nexport function SessionsPage() {\n const { user, getAccessToken, isLoading } = useAuth()\n\n if (isLoading) {\n return (\n <div className=\"flex items-center justify-center py-12 text-muted-foreground\">\n Loading...\n </div>\n )\n }\n\n if (!user) {\n return (\n <div className=\"container max-w-4xl py-8\">\n <div className=\"mb-8\">\n <h1 className=\"text-2xl font-semibold tracking-tight\">Sessions</h1>\n <p className=\"text-muted-foreground\">View and manage your active sessions</p>\n </div>\n <div className=\"flex items-center justify-center rounded-[var(--radius-md)] border border-dashed py-24\">\n <p className=\"text-muted-foreground text-sm\">\n Please sign in to view your sessions.\n </p>\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"container max-w-4xl py-8\">\n <div className=\"mb-8\">\n <h1 className=\"text-2xl font-semibold tracking-tight\">Sessions</h1>\n <p className=\"text-muted-foreground\">View and manage your active sessions</p>\n </div>\n <WidgetErrorBoundary widgetName=\"sessions\">\n <UserSessions authToken={getAccessToken} />\n </WidgetErrorBoundary>\n </div>\n )\n}\n","'use client'\n\nimport { ApiKeys 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 { ApiKeys } from '../../widgets/api-keys'\nimport { useAuth } from '../../hooks/use-auth'\nimport { WidgetErrorBoundary } from '../components'\n\n/**\n * API Keys page that renders the ApiKeys widget\n *\n * Allows users to create and manage their API keys.\n */\nexport function ApiKeysPage() {\n const { user, getAccessToken, isLoading } = useAuth()\n\n if (isLoading) {\n return (\n <div className=\"flex items-center justify-center py-12 text-muted-foreground\">\n Loading...\n </div>\n )\n }\n\n if (!user) {\n return (\n <div className=\"container max-w-4xl py-8\">\n <div className=\"mb-8\">\n <h1 className=\"text-2xl font-semibold tracking-tight\">API Keys</h1>\n <p className=\"text-muted-foreground\">Create and manage your API keys</p>\n </div>\n <div className=\"flex items-center justify-center rounded-[var(--radius-md)] border border-dashed py-24\">\n <p className=\"text-muted-foreground text-sm\">\n Please sign in to manage your API keys.\n </p>\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"container max-w-4xl py-8\">\n <div className=\"mb-8\">\n <h1 className=\"text-2xl font-semibold tracking-tight\">API Keys</h1>\n <p className=\"text-muted-foreground\">Create and manage your API keys</p>\n </div>\n <WidgetErrorBoundary widgetName=\"api-keys\">\n <ApiKeys authToken={getAccessToken} />\n </WidgetErrorBoundary>\n </div>\n )\n}\n","'use client'\n\nimport { UsersManagement 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 { UsersManagement } from '../../widgets/users-management'\nimport { useAuth } from '../../hooks/use-auth'\nimport { WidgetErrorBoundary } from '../components'\n\n/**\n * Team page that renders the UsersManagement widget\n *\n * Requires organization membership and admin permissions to view.\n */\nexport function TeamPage() {\n const { user, getAccessToken, isLoading, organizationId, permissions } = useAuth()\n\n const hasOrganization = !!organizationId\n const canManageTeam = hasOrganization && permissions?.includes('widgets:users-table:manage')\n\n if (isLoading) {\n return (\n <div className=\"flex items-center justify-center py-12 text-muted-foreground\">\n Loading...\n </div>\n )\n }\n\n if (!user) {\n return (\n <div className=\"container max-w-4xl py-8\">\n <div className=\"mb-8\">\n <h1 className=\"text-2xl font-semibold tracking-tight\">Team</h1>\n <p className=\"text-muted-foreground\">Manage your team members and invitations</p>\n </div>\n <div className=\"flex items-center justify-center rounded-[var(--radius-md)] border border-dashed py-24\">\n <p className=\"text-muted-foreground text-sm\">\n Please sign in to manage your team.\n </p>\n </div>\n </div>\n )\n }\n\n if (!hasOrganization) {\n return (\n <div className=\"container max-w-4xl py-8\">\n <div className=\"mb-8\">\n <h1 className=\"text-2xl font-semibold tracking-tight\">Team</h1>\n <p className=\"text-muted-foreground\">Manage your team members and invitations</p>\n </div>\n <div className=\"flex items-center justify-center rounded-[var(--radius-md)] border border-dashed py-24\">\n <p className=\"text-muted-foreground text-sm\">\n You need to be part of an organization to manage team members.\n </p>\n </div>\n </div>\n )\n }\n\n if (!canManageTeam) {\n return (\n <div className=\"container max-w-4xl py-8\">\n <div className=\"mb-8\">\n <h1 className=\"text-2xl font-semibold tracking-tight\">Team</h1>\n <p className=\"text-muted-foreground\">Manage your team members and invitations</p>\n </div>\n <div className=\"flex items-center justify-center rounded-[var(--radius-md)] border border-dashed py-24\">\n <p className=\"text-muted-foreground text-sm\">\n You need admin permissions to manage team members.\n </p>\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"container max-w-4xl py-8\">\n <div className=\"mb-8\">\n <h1 className=\"text-2xl font-semibold tracking-tight\">Team</h1>\n <p className=\"text-muted-foreground\">Manage your team members and invitations</p>\n </div>\n <WidgetErrorBoundary widgetName=\"team\">\n <UsersManagement authToken={getAccessToken} />\n </WidgetErrorBoundary>\n </div>\n )\n}\n","'use client'\n\nimport { Pipes 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 { Pipes } from '../../widgets/pipes'\nimport { useAuth } from '../../hooks/use-auth'\nimport { WidgetErrorBoundary } from '../components'\n\n/**\n * Integrations page that renders the Pipes widget\n *\n * Allows users to connect and manage third-party integrations.\n */\nexport function IntegrationsPage() {\n const { user, getAccessToken, isLoading } = useAuth()\n\n if (isLoading) {\n return (\n <div className=\"flex items-center justify-center py-12 text-muted-foreground\">\n Loading...\n </div>\n )\n }\n\n if (!user) {\n return (\n <div className=\"container max-w-4xl py-8\">\n <div className=\"mb-8\">\n <h1 className=\"text-2xl font-semibold tracking-tight\">Integrations</h1>\n <p className=\"text-muted-foreground\">Connect and manage third-party services</p>\n </div>\n <div className=\"flex items-center justify-center rounded-[var(--radius-md)] border border-dashed py-24\">\n <p className=\"text-muted-foreground text-sm\">\n Please sign in to manage your integrations.\n </p>\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"container max-w-4xl py-8\">\n <div className=\"mb-8\">\n <h1 className=\"text-2xl font-semibold tracking-tight\">Integrations</h1>\n <p className=\"text-muted-foreground\">Connect and manage third-party services</p>\n </div>\n <WidgetErrorBoundary widgetName=\"integrations\">\n <Pipes authToken={getAccessToken} />\n </WidgetErrorBoundary>\n </div>\n )\n}\n","'use client'\n\n/**\n * AuthShell Component\n *\n * Main layout wrapper for authenticated applications.\n * Provides sidebar, header, and main content area with\n * authentication gating.\n */\n\nimport { Separator } from '@mdxui/primitives/separator'\nimport {\n SidebarInset,\n SidebarProvider,\n SidebarTrigger,\n} from '@mdxui/primitives/sidebar'\nimport { Toaster } from '@mdxui/primitives/sonner'\nimport type { ReactNode } from 'react'\n\nimport { AuthGate } from '../providers/auth-gate'\nimport { AuthShellNav } from './auth-shell-nav'\nimport { type BreadcrumbItemConfig, Breadcrumbs } from './components'\nimport { useAuthShellConfig } from './config-context'\nimport type { AuthShellProps } from './types'\n\n/**\n * Default header component with sidebar trigger and breadcrumbs\n */\nfunction DefaultHeader({\n breadcrumbs,\n headerContent,\n}: {\n breadcrumbs?: BreadcrumbItemConfig[]\n headerContent?: ReactNode\n}) {\n return (\n <header className=\"relative flex h-16 shrink-0 items-center gap-2 border-b bg-background transition-[width,height] ease-linear group-has-data-[collapsible=icon]/sidebar-wrapper:h-12\">\n <div className=\"z-10 flex shrink-0 items-center gap-2 bg-background px-4\">\n <SidebarTrigger className=\"-ml-1\" />\n <Separator orientation=\"vertical\" className=\"mr-2 h-4\" />\n {breadcrumbs && breadcrumbs.length > 0 && (\n <Breadcrumbs items={breadcrumbs} />\n )}\n </div>\n {headerContent && (\n <div className=\"flex flex-1 items-center px-4 xl:absolute xl:inset-0 xl:justify-center\">\n <div className=\"w-full max-w-md\">{headerContent}</div>\n </div>\n )}\n </header>\n )\n}\n\n/**\n * AuthShell - Main application shell layout\n *\n * Wraps content in authentication gate and provides\n * sidebar navigation with header and main content area.\n *\n * @example\n * ```tsx\n * <AuthShellConfigProvider config={config}>\n * <IdentityProvider clientId={config.identity.clientId}>\n * <AuthShell breadcrumbs={[{ label: 'Dashboard' }]}>\n * <Outlet />\n * </AuthShell>\n * </IdentityProvider>\n * </AuthShellConfigProvider>\n * ```\n */\nexport function AuthShell({\n children,\n sidebarHeaderContent,\n headerContent,\n breadcrumbs,\n}: AuthShellProps) {\n const { config } = useAuthShellConfig()\n const { identity, auth } = config\n\n return (\n <AuthGate\n required={identity.required ?? auth?.requireAuth ?? true}\n onUnauthenticated={identity.onUnauthenticated ?? auth?.onUnauthenticated ?? 'landing'}\n loadingComponent={identity.loadingComponent}\n landingComponent={identity.landingComponent}\n >\n <SidebarProvider>\n <AuthShellNav headerContent={sidebarHeaderContent} />\n <SidebarInset>\n <DefaultHeader breadcrumbs={breadcrumbs} headerContent={headerContent} />\n <main className=\"flex-1 overflow-auto p-4\">\n {children}\n </main>\n </SidebarInset>\n </SidebarProvider>\n <Toaster />\n </AuthGate>\n )\n}\n","'use client'\n\nimport { useEffect, useRef } from 'react'\nimport { useAuth } from '@workos-inc/authkit-react'\nimport type { AuthGateProps } from '../types/auth'\n\n/**\n * Default loading component shown while checking authentication\n */\nfunction DefaultLoadingComponent() {\n return (\n <div className=\"min-h-screen bg-background flex items-center justify-center\">\n <div className=\"flex flex-col items-center gap-4\">\n <div className=\"h-8 w-8 animate-spin rounded-full border-4 border-primary border-t-transparent\" />\n <p className=\"text-sm text-muted-foreground\">Loading...</p>\n </div>\n </div>\n )\n}\n\n/**\n * Default landing page component shown when user is not authenticated\n */\nfunction DefaultLandingPage() {\n const { signIn } = useAuth()\n\n return (\n <div className=\"min-h-screen bg-background flex flex-col items-center justify-center p-4\">\n <div className=\"text-center max-w-md\">\n <h1 className=\"text-3xl font-bold tracking-tight mb-4\">Welcome</h1>\n <p className=\"text-muted-foreground mb-8\">\n Sign in to access your dashboard.\n </p>\n <button\n type=\"button\"\n onClick={() => signIn()}\n className=\"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-[var(--radius-md)] text-sm font-medium transition-colors bg-primary text-primary-foreground hover:bg-primary/90 h-10 px-6\"\n >\n Sign In\n </button>\n </div>\n </div>\n )\n}\n\n/**\n * AuthGate handles authentication state and shows appropriate UI:\n * - Loading state while checking auth\n * - Landing page or redirect when not authenticated\n * - Children (protected content) when authenticated\n *\n * @example\n * ```tsx\n * import { AuthGate } from '@mdxui/auth'\n *\n * function App() {\n * return (\n * <AuthGate>\n * <ProtectedDashboard />\n * </AuthGate>\n * )\n * }\n * ```\n *\n * @example\n * ```tsx\n * // With custom components\n * <AuthGate\n * loadingComponent={<CustomSpinner />}\n * landingComponent={<CustomLandingPage />}\n * >\n * <Dashboard />\n * </AuthGate>\n * ```\n *\n * @example\n * ```tsx\n * // Allow unauthenticated access\n * <AuthGate required={false}>\n * <PublicContent />\n * </AuthGate>\n * ```\n *\n * @example\n * ```tsx\n * // Redirect to external URL when not authenticated\n * <AuthGate\n * onUnauthenticated=\"redirect\"\n * redirectUrl=\"https://marketing.example.com\"\n * >\n * <Dashboard />\n * </AuthGate>\n * ```\n */\nexport function AuthGate({\n children,\n required = true,\n loadingComponent,\n landingComponent,\n onUnauthenticated = 'landing',\n redirectUrl,\n}: AuthGateProps) {\n const { user, isLoading, signIn } = useAuth()\n const signInCalled = useRef(false)\n\n // Auto sign-in effect for 'signIn' mode\n useEffect(() => {\n if (onUnauthenticated === 'signIn' && !isLoading && !user && !signInCalled.current) {\n signInCalled.current = true\n signIn()\n }\n }, [onUnauthenticated, isLoading, user, signIn])\n\n // Reset flag when user logs in\n useEffect(() => {\n if (user) {\n signInCalled.current = false\n }\n }, [user])\n\n // If auth is not required, always show children\n if (!required) {\n return <>{children}</>\n }\n\n // Show loading state while checking authentication\n if (isLoading) {\n return <>{loadingComponent ?? <DefaultLoadingComponent />}</>\n }\n\n // User is authenticated, show protected content\n if (user) {\n return <>{children}</>\n }\n\n // User is not authenticated - handle based on config\n switch (onUnauthenticated) {\n case 'signIn':\n // Auto sign-in mode - show loading while redirecting to auth\n return <>{loadingComponent ?? <DefaultLoadingComponent />}</>\n\n case 'redirect':\n // Redirect to external URL\n if (redirectUrl && typeof window !== 'undefined') {\n window.location.href = redirectUrl\n return (\n <div className=\"min-h-screen bg-background flex items-center justify-center\">\n <p className=\"text-sm text-muted-foreground\">Redirecting...</p>\n </div>\n )\n }\n // Fall through to landing if no redirect URL\n return <>{landingComponent ?? <DefaultLandingPage />}</>\n\n case 'allow':\n // Allow access even without auth (shows children)\n return <>{children}</>\n\n case 'landing':\n default:\n // Show landing page (custom or default)\n return <>{landingComponent ?? <DefaultLandingPage />}</>\n }\n}\n","'use client'\n\n/**\n * AuthShellNav Component\n *\n * Sidebar navigation component that renders routes organized by group.\n * Includes branding header and user menu footer.\n */\n\nimport type { ReactNode } from 'react'\nimport { useAuth } from '@workos-inc/authkit-react'\nimport { useIsActive, WebLink } from '@mdxui/navigation/web'\nimport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarMenu,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarRail,\n} from '@mdxui/primitives/sidebar'\nimport { SidebarUser } from '@mdxui/primitives/sidebar-user'\n\nimport { useAuthShellBranding, useAuthShellRoutesByGroup, useAuthShellFullPath } from './config-context'\nimport type { AuthShellNavProps, AuthAppRoute } from './types'\n\n/**\n * Navigation item component\n */\nfunction NavItem({ route, getFullPath }: { route: AuthAppRoute; getFullPath: (path: string) => string }) {\n const fullPath = getFullPath(route.path)\n // For root path use exact match, for others use partial match\n const isActive = useIsActive(fullPath, { partial: fullPath !== '/' })\n const Icon = route.icon\n\n return (\n <SidebarMenuItem>\n <SidebarMenuButton asChild isActive={isActive} tooltip={route.label}>\n <WebLink to={fullPath}>\n {Icon && <Icon className=\"size-4\" />}\n <span>{route.label}</span>\n </WebLink>\n </SidebarMenuButton>\n </SidebarMenuItem>\n )\n}\n\n/**\n * Default branding header component\n */\nfunction BrandingHeader({ headerContent }: { headerContent?: ReactNode }) {\n const branding = useAuthShellBranding()\n\n if (headerContent) {\n return <>{headerContent}</>\n }\n\n return (\n <div className=\"flex items-center gap-2 px-2\">\n {branding.logo && <div className=\"flex-shrink-0\">{branding.logo}</div>}\n <div className=\"flex flex-col gap-0.5 leading-none\">\n <span className=\"font-semibold\">{branding.name}</span>\n {branding.tagline && (\n <span className=\"text-xs text-muted-foreground\">{branding.tagline}</span>\n )}\n </div>\n </div>\n )\n}\n\n/**\n * Default user menu component\n */\nfunction DefaultUserMenu() {\n const { user, signOut } = useAuth()\n\n if (!user) return null\n\n const displayName = user.firstName\n ? `${user.firstName}${user.lastName ? ` ${user.lastName}` : ''}`\n : user.email ?? 'User'\n\n return (\n <SidebarUser\n user={{\n name: displayName,\n email: user.email ?? '',\n avatar: user.profilePictureUrl ?? undefined,\n }}\n onSignOut={() => signOut()}\n />\n )\n}\n\n/**\n * AuthShellNav - Sidebar navigation component\n *\n * Renders navigation routes organized by group with branding\n * header and user menu footer.\n *\n * @example\n * ```tsx\n * <AuthShellNav\n * headerContent={<TeamSwitcher />}\n * userMenu={<CustomUserMenu />}\n * />\n * ```\n */\nexport function AuthShellNav({ headerContent, userMenu, className }: AuthShellNavProps) {\n const { routesByGroup, groups } = useAuthShellRoutesByGroup()\n const getFullPath = useAuthShellFullPath()\n\n return (\n <Sidebar collapsible=\"icon\" className={className}>\n <SidebarHeader>\n <BrandingHeader headerContent={headerContent} />\n </SidebarHeader>\n <SidebarContent>\n {groups.map((group) => {\n const routes = routesByGroup.get(group.id)\n if (!routes || routes.length === 0) return null\n\n return (\n <SidebarGroup key={group.id}>\n {group.label && <SidebarGroupLabel>{group.label}</SidebarGroupLabel>}\n <SidebarGroupContent>\n <SidebarMenu>\n {routes.map((route) => (\n <NavItem key={route.key} route={route} getFullPath={getFullPath} />\n ))}\n </SidebarMenu>\n </SidebarGroupContent>\n </SidebarGroup>\n )\n })}\n </SidebarContent>\n <SidebarFooter>\n {userMenu ?? <DefaultUserMenu />}\n </SidebarFooter>\n <SidebarRail />\n </Sidebar>\n )\n}\n","'use client'\n\n/**\n * AuthApp Component\n *\n * Complete application wrapper that sets up all required providers,\n * shell structure, and routing for an authenticated application.\n *\n * Now includes built-in routing via @mdxui/navigation - just define\n * routes in your config and AuthApp handles the rest.\n */\n\nimport React, { useMemo, type ReactNode } from 'react'\nimport { ThemeProvider } from 'next-themes'\nimport type { RouteConfig } from '@mdxui/navigation'\nimport { createWebRouter, RouterProvider, WebOutlet } from '@mdxui/navigation/web'\n\nimport { IdentityProvider } from '../providers/identity-provider'\nimport { AuthShellConfigProvider } from './config-context'\nimport { AuthShell } from './auth-shell'\nimport { SidebarOrgSwitcher } from './components'\nimport { defaultRoutes, defaultGroups } from './route-presets'\nimport { mergeWithEnvConfig } from './env-config'\nimport type { AuthAppConfig, AuthAppProps, AuthAppRoute } from './types'\n\n/**\n * Props for AuthAppProvider (providers only, no shell or routing)\n */\ninterface AuthAppProviderProps {\n /**\n * Application configuration\n *\n * Optional when VITE_WORKOS_CLIENT_ID environment variable is set.\n */\n config?: Partial<AuthAppConfig>\n /** Children to render */\n children: ReactNode\n}\n\n/**\n * AuthAppProvider - Providers only wrapper\n *\n * Use this when you need to customize the shell layout or\n * integrate with an existing routing setup.\n *\n * Provider hierarchy:\n * - ThemeProvider (next-themes)\n * - AuthShellConfigProvider\n * - IdentityProvider (WorkOS AuthKit)\n *\n * @example\n * ```tsx\n * <AuthAppProvider config={config}>\n * <RouterProvider router={router}>\n * <AuthShell>\n * <Outlet />\n * </AuthShell>\n * </RouterProvider>\n * </AuthAppProvider>\n * ```\n *\n * @example\n * ```tsx\n * // Zero-config with environment variables\n * <AuthAppProvider>\n * <MyApp />\n * </AuthAppProvider>\n * ```\n */\nexport function AuthAppProvider({ config, children }: AuthAppProviderProps) {\n // Merge explicit config with environment variables\n const resolvedConfig = useMemo(() => mergeWithEnvConfig(config), [config])\n const { identity, theme } = resolvedConfig\n\n return (\n <ThemeProvider\n attribute=\"class\"\n defaultTheme={theme?.mode ?? 'system'}\n enableSystem\n disableTransitionOnChange\n >\n <AuthShellConfigProvider config={resolvedConfig}>\n <IdentityProvider\n clientId={identity.clientId}\n apiHostname={identity.apiHostname}\n devMode={identity.devMode}\n redirectUri={identity.redirectUri}\n >\n {children}\n </IdentityProvider>\n </AuthShellConfigProvider>\n </ThemeProvider>\n )\n}\n\n/**\n * Convert AuthAppRoute[] to RouteConfig for @mdxui/navigation\n */\nfunction convertRoutesToConfig(routes: AuthAppRoute[], basePath?: string): RouteConfig {\n const config: RouteConfig = {}\n\n for (const route of routes) {\n if (route.enabled === false) continue\n\n const fullPath = basePath ? `${basePath}${route.path}` : route.path\n config[route.key] = {\n path: fullPath,\n component: route.component as React.ComponentType<unknown>,\n meta: {\n label: route.label,\n icon: route.icon,\n group: route.group,\n public: route.public,\n requiredRoles: route.requiredRoles,\n requiredPermissions: route.requiredPermissions,\n },\n }\n }\n\n return config\n}\n\n/**\n * Root layout component that wraps all routes with AuthShell\n */\nfunction createRootLayout(headerContent?: ReactNode, sidebarHeaderContent?: ReactNode) {\n // Default to SidebarOrgSwitcher if no custom header content provided\n const resolvedSidebarContent = sidebarHeaderContent ?? <SidebarOrgSwitcher />\n\n return function RootLayout() {\n return (\n <AuthShell headerContent={headerContent} sidebarHeaderContent={resolvedSidebarContent}>\n <WebOutlet />\n </AuthShell>\n )\n }\n}\n\n/**\n * AuthApp - Complete app with built-in routing\n *\n * This is the recommended way to use AuthApp. Define your routes\n * in the config and AuthApp handles routing automatically.\n *\n * @example\n * ```tsx\n * // Zero-config with environment variables\n * // Set VITE_WORKOS_CLIENT_ID, VITE_APP_NAME in .env\n * function App() {\n * return <AuthApp />\n * }\n * ```\n *\n * @example\n * ```tsx\n * import { AuthApp, type AuthAppConfig } from '@mdxui/auth/shell'\n * import { Home, Settings, Users } from 'lucide-react'\n *\n * const config: AuthAppConfig = {\n * branding: { name: 'My App' },\n * identity: { clientId: 'client_xxx' },\n * routes: [\n * { key: 'home', label: 'Home', path: '/', icon: Home, component: HomePage },\n * { key: 'settings', label: 'Settings', path: '/settings', icon: Settings, component: SettingsPage },\n * { key: 'users', label: 'Users', path: '/users', icon: Users, component: UsersPage },\n * ],\n * }\n *\n * function App() {\n * return <AuthApp config={config} />\n * }\n * ```\n *\n * @example\n * ```tsx\n * // With custom header content (sidebar defaults to SidebarOrgSwitcher)\n * <AuthApp\n * config={config}\n * headerContent={<ThemeSwitcher />}\n * />\n * ```\n *\n * @example\n * ```tsx\n * // Override sidebar header with custom content\n * <AuthApp\n * config={config}\n * sidebarHeaderContent={<MyCustomSwitcher />}\n * />\n * ```\n */\nexport function AuthApp({ config, headerContent, sidebarHeaderContent }: AuthAppProps) {\n // Merge with env config first\n const mergedConfig = useMemo(() => mergeWithEnvConfig(config), [config])\n\n // Resolve routes and groups with defaults\n const routes = mergedConfig.routes ?? defaultRoutes\n const groups = mergedConfig.groups ?? defaultGroups\n const resolvedConfig = useMemo(\n () => ({ ...mergedConfig, routes, groups }),\n [mergedConfig, routes, groups]\n )\n\n // Convert routes and create router - memoized to prevent recreation\n const router = useMemo(() => {\n const routeConfig = convertRoutesToConfig(routes, mergedConfig.basePath)\n const RootLayout = createRootLayout(headerContent, sidebarHeaderContent)\n\n return createWebRouter(routeConfig, {\n rootComponent: RootLayout,\n basepath: mergedConfig.basePath || undefined,\n })\n }, [routes, mergedConfig.basePath, headerContent, sidebarHeaderContent])\n\n return (\n <AuthAppProvider config={resolvedConfig}>\n <RouterProvider router={router} />\n </AuthAppProvider>\n )\n}\n\n/**\n * AuthAppWithChildren - App wrapper with shell but no routing\n *\n * Use this when you want the shell but handle routing yourself,\n * or when you have simple static content.\n *\n * @example\n * ```tsx\n * // Zero-config with environment variables\n * <AuthAppWithChildren>\n * <Dashboard />\n * </AuthAppWithChildren>\n * ```\n *\n * @example\n * ```tsx\n * // With your own router\n * <AuthAppWithChildren config={config}>\n * <Routes>\n * <Route path=\"/\" element={<Home />} />\n * <Route path=\"/settings\" element={<Settings />} />\n * </Routes>\n * </AuthAppWithChildren>\n * ```\n *\n * @example\n * ```tsx\n * // With static content\n * <AuthAppWithChildren config={config}>\n * <Dashboard />\n * </AuthAppWithChildren>\n * ```\n */\nexport function AuthAppWithChildren({\n config,\n headerContent,\n sidebarHeaderContent,\n children,\n}: AuthAppProps & { children: ReactNode }) {\n // Merge with env config first\n const mergedConfig = useMemo(() => mergeWithEnvConfig(config), [config])\n\n // Resolve routes and groups with defaults\n const routes = mergedConfig.routes ?? defaultRoutes\n const groups = mergedConfig.groups ?? defaultGroups\n const resolvedConfig = useMemo(\n () => ({ ...mergedConfig, routes, groups }),\n [mergedConfig, routes, groups]\n )\n\n // Default to SidebarOrgSwitcher if no custom header content provided\n const resolvedSidebarContent = sidebarHeaderContent ?? <SidebarOrgSwitcher />\n\n return (\n <AuthAppProvider config={resolvedConfig}>\n <AuthShell headerContent={headerContent} sidebarHeaderContent={resolvedSidebarContent}>\n {children}\n </AuthShell>\n </AuthAppProvider>\n )\n}\n\n/**\n * Create route definitions from config for use with routers\n *\n * Helper function to generate route objects compatible with\n * React Router, TanStack Router, etc.\n *\n * @example\n * ```tsx\n * // React Router\n * const routes = createRouteDefinitions(config)\n * const router = createBrowserRouter(\n * routes.map(r => ({ path: r.path, element: <r.component /> }))\n * )\n * ```\n *\n * @example\n * ```tsx\n * // TanStack Router\n * const routes = createRouteDefinitions(config)\n * const routeTree = rootRoute.addChildren(\n * routes.map(r => createRoute({\n * getParentRoute: () => rootRoute,\n * path: r.path,\n * component: r.component,\n * }))\n * )\n * ```\n */\nexport function createRouteDefinitions(config?: Partial<AuthAppConfig>) {\n const mergedConfig = mergeWithEnvConfig(config)\n const basePath = mergedConfig.basePath ?? ''\n const routes = mergedConfig.routes ?? defaultRoutes\n\n return routes\n .filter((route) => route.enabled !== false)\n .map((route) => ({\n key: route.key,\n path: basePath ? `${basePath}${route.path}` : route.path,\n label: route.label,\n component: route.component,\n icon: route.icon,\n group: route.group,\n public: route.public,\n requiredRoles: route.requiredRoles,\n requiredPermissions: route.requiredPermissions,\n }))\n}\n","'use client'\n\nimport { AuthKitProvider } from '@workos-inc/authkit-react'\nimport type { IdentityProviderProps } from '../types/auth'\nimport { WidgetsProvider } from './widgets-provider'\n\n/**\n * Identity provider that wraps your app with WorkOS AuthKit authentication.\n *\n * This provider sets up authentication context for your application and\n * automatically includes the WidgetsProvider for WorkOS widgets.\n *\n * @example\n * ```tsx\n * import { IdentityProvider } from '@mdxui/auth'\n *\n * function App() {\n * return (\n * <IdentityProvider\n * clientId=\"client_xxx\"\n * devMode={process.env.NODE_ENV === 'development'}\n * >\n * <YourApp />\n * </IdentityProvider>\n * )\n * }\n * ```\n *\n * @example\n * ```tsx\n * // With custom redirect URI\n * <IdentityProvider\n * clientId=\"client_xxx\"\n * redirectUri=\"https://app.example.com/dashboard\"\n * onRedirectCallback={() => {\n * // Custom callback after auth redirect\n * }}\n * >\n * <YourApp />\n * </IdentityProvider>\n * ```\n */\nexport function IdentityProvider({\n clientId,\n apiHostname,\n devMode,\n redirectUri,\n onRedirectCallback,\n children,\n}: IdentityProviderProps) {\n // Build redirect URI - defaults to current origin (no trailing slash)\n // Note: WorkOS AuthKit internally appends a trailing slash, so register\n // \"https://yourdomain.com/\" (with slash) in WorkOS dashboard\n const resolvedRedirectUri =\n redirectUri ??\n (typeof window !== 'undefined' ? window.location.origin : undefined)\n\n // Default redirect callback - clear auth params from URL\n const handleRedirectCallback =\n onRedirectCallback ??\n (() => {\n if (typeof window !== 'undefined') {\n const url = new URL(window.location.href)\n url.searchParams.delete('code')\n url.searchParams.delete('state')\n window.history.replaceState({}, '', url.pathname)\n }\n })\n\n return (\n <AuthKitProvider\n clientId={clientId}\n apiHostname={apiHostname}\n devMode={devMode}\n redirectUri={resolvedRedirectUri}\n onRedirectCallback={handleRedirectCallback}\n >\n <WidgetsProvider>{children}</WidgetsProvider>\n </AuthKitProvider>\n )\n}\n\n/**\n * Minimal identity provider without WidgetsProvider\n *\n * Use this if you want to set up widgets separately or don't need them.\n *\n * @example\n * ```tsx\n * import { IdentityProviderMinimal, WidgetsProvider } from '@mdxui/auth'\n *\n * function App() {\n * return (\n * <IdentityProviderMinimal clientId=\"client_xxx\">\n * <WidgetsProvider appearance=\"dark\">\n * <YourApp />\n * </WidgetsProvider>\n * </IdentityProviderMinimal>\n * )\n * }\n * ```\n */\nexport function IdentityProviderMinimal({\n clientId,\n apiHostname,\n devMode,\n redirectUri,\n onRedirectCallback,\n children,\n}: IdentityProviderProps) {\n const resolvedRedirectUri =\n redirectUri ??\n (typeof window !== 'undefined' ? window.location.origin : undefined)\n\n const handleRedirectCallback =\n onRedirectCallback ??\n (() => {\n if (typeof window !== 'undefined') {\n const url = new URL(window.location.href)\n url.searchParams.delete('code')\n url.searchParams.delete('state')\n window.history.replaceState({}, '', url.pathname)\n }\n })\n\n return (\n <AuthKitProvider\n clientId={clientId}\n apiHostname={apiHostname}\n devMode={devMode}\n redirectUri={resolvedRedirectUri}\n onRedirectCallback={handleRedirectCallback}\n >\n {children}\n </AuthKitProvider>\n )\n}\n","'use client'\n\nimport { WorkOsWidgets } from '@workos-inc/widgets'\nimport { useEffect, useState } from 'react'\nimport type { WidgetsProviderProps } from '../types/auth'\n\n/**\n * Hook to detect dark mode from document class or system preference\n *\n * @returns Object with isDark state and mounted flag\n *\n * @example\n * ```tsx\n * const { isDark, mounted } = useThemeDetection()\n * const appearance = mounted ? (isDark ? 'dark' : 'light') : 'inherit'\n * ```\n */\nexport function useThemeDetection() {\n const [mounted, setMounted] = useState(false)\n const [isDark, setIsDark] = useState(false)\n\n useEffect(() => {\n setMounted(true)\n\n const checkDarkMode = () => {\n const isDarkClass = document.documentElement.classList.contains('dark')\n const prefersDark = window.matchMedia(\n '(prefers-color-scheme: dark)'\n ).matches\n setIsDark(\n isDarkClass ||\n (!document.documentElement.classList.contains('light') && prefersDark)\n )\n }\n\n checkDarkMode()\n\n // Watch for class changes on html element\n const observer = new MutationObserver(checkDarkMode)\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class'],\n })\n\n // Watch for system preference changes\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)')\n mediaQuery.addEventListener('change', checkDarkMode)\n\n return () => {\n observer.disconnect()\n mediaQuery.removeEventListener('change', checkDarkMode)\n }\n }, [])\n\n return { isDark, mounted }\n}\n\n/**\n * Provider for WorkOS widgets with automatic theme detection\n *\n * Wraps children with WorkOsWidgets context and automatically detects\n * light/dark mode from document classes or system preference.\n *\n * @example\n * ```tsx\n * import { WidgetsProvider } from '@mdxui/auth'\n * import { UserProfile } from '@mdxui/auth/widgets'\n *\n * function App() {\n * return (\n * <WidgetsProvider>\n * <UserProfile authToken={getAccessToken} />\n * </WidgetsProvider>\n * )\n * }\n * ```\n *\n * @example\n * ```tsx\n * // With explicit theme\n * <WidgetsProvider appearance=\"dark\" radius=\"large\">\n * <UserProfile authToken={token} />\n * </WidgetsProvider>\n * ```\n */\nexport function WidgetsProvider({\n children,\n appearance,\n radius = 'medium',\n scaling = '100%',\n}: WidgetsProviderProps) {\n const { isDark, mounted } = useThemeDetection()\n\n // Use provided appearance, or auto-detect from theme\n // Use \"inherit\" until mounted to avoid hydration mismatch\n const resolvedAppearance =\n appearance ?? (mounted ? (isDark ? 'dark' : 'light') : 'inherit')\n\n // Note: Widgets always use api.workos.com - custom Authentication API domains\n // do NOT support widget endpoints. Only authentication uses custom domains.\n return (\n <WorkOsWidgets\n theme={{\n appearance: resolvedAppearance,\n radius,\n scaling,\n }}\n elements={{\n primaryButton: {\n variant: 'solid',\n },\n secondaryButton: {\n variant: 'outline',\n },\n }}\n >\n {children}\n </WorkOsWidgets>\n )\n}\n","/**\n * Environment Variable Configuration\n *\n * Reads configuration from environment variables for zero-config setup.\n * Supports Vite's import.meta.env pattern for Cloudflare Workers Static Assets.\n *\n * Environment variables:\n * - VITE_WORKOS_CLIENT_ID - WorkOS client ID (required for zero-config)\n * - VITE_WORKOS_REDIRECT_URI - OAuth redirect URI\n * - VITE_WORKOS_API_HOSTNAME - WorkOS API hostname override\n * - VITE_WORKOS_DEV_MODE - Enable dev mode (\"true\" or \"false\")\n * - VITE_APP_NAME - Application name for branding\n * - VITE_APP_TAGLINE - Application tagline\n *\n * @example\n * ```bash\n * # .env file\n * VITE_WORKOS_CLIENT_ID=client_01JQYTRXK9ZPD8JPJTKDCRB656\n * VITE_WORKOS_REDIRECT_URI=https://oauth.do/callback\n * VITE_APP_NAME=OAuth.do\n * ```\n */\n\nimport type { AuthAppConfig } from './types'\n\n/** Check if we're in a Vite environment */\nfunction getEnvVar(key: string): string | undefined {\n // Vite injects import.meta.env at build time\n if (typeof import.meta !== 'undefined' && import.meta.env) {\n return import.meta.env[key] as string | undefined\n }\n // Fallback to process.env for Node.js environments\n if (typeof process !== 'undefined' && process.env) {\n return process.env[key]\n }\n return undefined\n}\n\n/**\n * Get configuration from environment variables\n *\n * Returns a partial config that can be merged with explicit config.\n * Missing required fields will cause runtime errors if not provided elsewhere.\n */\nexport function getEnvConfig(): Partial<AuthAppConfig> {\n const clientId = getEnvVar('VITE_WORKOS_CLIENT_ID')\n const redirectUri = getEnvVar('VITE_WORKOS_REDIRECT_URI')\n const apiHostname = getEnvVar('VITE_WORKOS_API_HOSTNAME')\n const devModeStr = getEnvVar('VITE_WORKOS_DEV_MODE')\n const appName = getEnvVar('VITE_APP_NAME')\n const appTagline = getEnvVar('VITE_APP_TAGLINE')\n\n // Only include identity if clientId is available\n const identity = clientId\n ? {\n clientId,\n ...(redirectUri && { redirectUri }),\n ...(apiHostname && { apiHostname }),\n ...(devModeStr && { devMode: devModeStr === 'true' }),\n }\n : undefined\n\n // Only include branding if appName is available\n const branding = appName\n ? {\n name: appName,\n ...(appTagline && { tagline: appTagline }),\n }\n : undefined\n\n return {\n ...(identity && { identity }),\n ...(branding && { branding }),\n }\n}\n\n/**\n * Merge explicit config with environment config\n *\n * Explicit config takes precedence over environment variables.\n */\nexport function mergeWithEnvConfig(config?: Partial<AuthAppConfig>): AuthAppConfig {\n const envConfig = getEnvConfig()\n\n // Deep merge branding\n const branding = {\n name: config?.branding?.name ?? envConfig.branding?.name ?? 'App',\n ...(config?.branding?.logo && { logo: config.branding.logo }),\n ...(config?.branding?.logoCollapsed && { logoCollapsed: config.branding.logoCollapsed }),\n tagline: config?.branding?.tagline ?? envConfig.branding?.tagline,\n }\n\n // Deep merge identity\n const envIdentity = envConfig.identity\n const configIdentity = config?.identity\n\n if (!envIdentity?.clientId && !configIdentity?.clientId) {\n throw new Error(\n 'AuthApp: Missing clientId. Either provide config.identity.clientId or set VITE_WORKOS_CLIENT_ID environment variable.'\n )\n }\n\n const identity = {\n clientId: configIdentity?.clientId ?? envIdentity?.clientId ?? '',\n ...(configIdentity?.redirectUri ?? envIdentity?.redirectUri\n ? { redirectUri: configIdentity?.redirectUri ?? envIdentity?.redirectUri }\n : {}),\n ...(configIdentity?.apiHostname ?? envIdentity?.apiHostname\n ? { apiHostname: configIdentity?.apiHostname ?? envIdentity?.apiHostname }\n : {}),\n ...(configIdentity?.devMode ?? envIdentity?.devMode\n ? { devMode: configIdentity?.devMode ?? envIdentity?.devMode }\n : {}),\n ...(configIdentity?.required !== undefined ? { required: configIdentity.required } : {}),\n ...(configIdentity?.onUnauthenticated ? { onUnauthenticated: configIdentity.onUnauthenticated } : {}),\n ...(configIdentity?.landingComponent ? { landingComponent: configIdentity.landingComponent } : {}),\n ...(configIdentity?.loadingComponent ? { loadingComponent: configIdentity.loadingComponent } : {}),\n }\n\n return {\n branding,\n identity,\n ...(config?.basePath && { basePath: config.basePath }),\n ...(config?.theme && { theme: config.theme }),\n ...(config?.auth && { auth: config.auth }),\n ...(config?.groups && { groups: config.groups }),\n ...(config?.routes && { routes: config.routes }),\n }\n}\n"],"mappings":"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","names":["jsx","useAuth","jsx","organizationId","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsx","jsxs","jsx","jsx","jsxs","jsx","jsx","jsxs","jsx","jsx","jsxs","jsx","jsx","jsxs","jsx","routes","useAuth","Fragment","jsx","jsxs","useAuth","WebLink","Fragment","jsx","jsxs","WebLink","useAuth","jsx","jsxs","useMemo","useEffect","jsx","jsx","jsx","useMemo"]}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { A as AuthGateProps, a as AuthToken, B as BaseWidgetProps, I as IdentityProviderProps, O as OrganizationWidgetProps, U as UseWidgetTokenOptions, b as UseWidgetTokenResult, W as WidgetsProviderProps } from '../auth-
|
|
1
|
+
export { A as AuthGateProps, a as AuthToken, B as BaseWidgetProps, I as IdentityProviderProps, O as OrganizationWidgetProps, U as UseWidgetTokenOptions, b as UseWidgetTokenResult, W as WidgetsProviderProps } from '../auth-maeYSYU_.js';
|
|
2
2
|
export { a as AuthOrganization, b as AuthSession, A as AuthUser, I as Impersonator } from '../auth-organization-CN1WpGnL.js';
|
|
3
3
|
import 'react';
|
|
4
4
|
import 'zod/v4/core';
|
package/dist/widgets/index.d.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mdxui/auth",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.1",
|
|
4
4
|
"description": "Authentication components and WorkOS AuthKit wrappers for mdxui",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -59,13 +59,26 @@
|
|
|
59
59
|
"./vault": {
|
|
60
60
|
"types": "./dist/vault/index.d.ts",
|
|
61
61
|
"import": "./dist/vault/index.js"
|
|
62
|
+
},
|
|
63
|
+
"./shell": {
|
|
64
|
+
"types": "./dist/shell/index.d.ts",
|
|
65
|
+
"import": "./dist/shell/index.js"
|
|
62
66
|
}
|
|
63
67
|
},
|
|
64
68
|
"files": [
|
|
65
69
|
"dist",
|
|
66
70
|
"README.md"
|
|
67
71
|
],
|
|
72
|
+
"scripts": {
|
|
73
|
+
"build": "tsup",
|
|
74
|
+
"test": "vitest",
|
|
75
|
+
"test:run": "vitest run",
|
|
76
|
+
"typecheck": "tsc --noEmit",
|
|
77
|
+
"clean": "rm -rf dist .turbo node_modules",
|
|
78
|
+
"prepublishOnly": "pnpm build"
|
|
79
|
+
},
|
|
68
80
|
"devDependencies": {
|
|
81
|
+
"@mdxui/typescript-config": "workspace:*",
|
|
69
82
|
"@testing-library/jest-dom": "^6.6.3",
|
|
70
83
|
"@testing-library/react": "^16.3.0",
|
|
71
84
|
"@types/react": "^19.2.7",
|
|
@@ -74,17 +87,18 @@
|
|
|
74
87
|
"jsdom": "^26.1.0",
|
|
75
88
|
"tsup": "^8.0.0",
|
|
76
89
|
"typescript": "5.9.3",
|
|
77
|
-
"vitest": "^3.2.4"
|
|
78
|
-
"@mdxui/typescript-config": "6.0.0"
|
|
90
|
+
"vitest": "^3.2.4"
|
|
79
91
|
},
|
|
80
92
|
"dependencies": {
|
|
93
|
+
"@mdxui/navigation": "workspace:*",
|
|
94
|
+
"@mdxui/primitives": "workspace:*",
|
|
81
95
|
"@workos-inc/authkit-react": "^0.16.0",
|
|
82
96
|
"@workos-inc/widgets": "^1.7.2",
|
|
83
97
|
"lucide-react": "^0.511.0",
|
|
98
|
+
"mdxui": "workspace:*",
|
|
99
|
+
"next-themes": "^0.4.4",
|
|
84
100
|
"sonner": "^1.5.0",
|
|
85
|
-
"zod": "^4.3.5"
|
|
86
|
-
"mdxui": "6.0.0",
|
|
87
|
-
"@mdxui/primitives": "6.0.0"
|
|
101
|
+
"zod": "^4.3.5"
|
|
88
102
|
},
|
|
89
103
|
"peerDependencies": {
|
|
90
104
|
"react": "^18.0.0 || ^19.0.0",
|
|
@@ -92,12 +106,5 @@
|
|
|
92
106
|
},
|
|
93
107
|
"publishConfig": {
|
|
94
108
|
"access": "public"
|
|
95
|
-
},
|
|
96
|
-
"scripts": {
|
|
97
|
-
"build": "tsup",
|
|
98
|
-
"test": "vitest",
|
|
99
|
-
"test:run": "vitest run",
|
|
100
|
-
"typecheck": "tsc --noEmit",
|
|
101
|
-
"clean": "rm -rf dist .turbo node_modules"
|
|
102
109
|
}
|
|
103
|
-
}
|
|
110
|
+
}
|