@cboxdk/cbox-ui 0.6.0 → 0.8.0

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/context/cbox-id.tsx","../src/utils/cn.ts","../src/layout/app-content.tsx","../src/layout/app-shell.tsx","../src/layout/cbox-brand.tsx","../src/layout/cbox-app-sidebar.tsx","../src/layout/cbox-mobile-nav-drawer.tsx","../src/components/app-switcher.tsx","../src/primitives/empty-state.tsx","../src/primitives/status-pill.tsx","../src/surfaces/surface-modal.tsx","../src/surfaces/inbox-surface.tsx","../src/surfaces/surface-state.tsx","../src/components/notifications-bell.tsx","../src/components/search-trigger.tsx","../src/components/user-menu.tsx","../src/layout/cbox-app-shell.tsx","../src/primitives/context-bar.tsx","../src/layout/cbox-org-context-bar.tsx","../src/components/org-switcher.tsx","../src/layout/top-bar.tsx","../src/components/app-launcher.tsx","../src/primitives/combobox.tsx","../src/primitives/data-panel.tsx","../src/primitives/heading.tsx","../src/primitives/key-value.tsx","../src/primitives/page-header.tsx","../src/primitives/page-shell.tsx","../src/primitives/page-tabs.tsx","../src/primitives/row-link.tsx","../src/primitives/stat-tile.tsx","../src/utils/url-state.ts"],"names":["jsx","jsxs","useEffect","useRef","X","useState","Fragment","createContext","useMemo","useCallback","useContext","SearchIcon","Chevron","deriveInitials","AppRow","buildOrgUrl","Lock","useId","id","Check","Plus","DefaultLink","toneStyles"],"mappings":"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","file":"index.js","sourcesContent":["import {\n createContext,\n useContext,\n type ReactNode,\n} from 'react';\n\n/**\n * Identity contract every Cbox-family app must populate.\n *\n * Shape mirrors what the future `@cboxdk/cbox-id-client` SDK returns\n * from id's `/api/v1/me` endpoint plus a small set of platform-level\n * URLs that each app needs to construct deep-links into id.\n *\n * In the id app itself, populate this from Inertia shared props\n * (id IS the source of truth — no API call needed).\n *\n * In cortex / atlas / track / future apps, populate from the\n * id-client SDK — typically once per session, then refreshed when\n * the user switches org or updates their profile.\n *\n * Components in this package read from the context but never write —\n * mutations always round-trip through id's API via the id-client.\n */\n\nexport type CboxAppKey = string;\n\nexport type CboxUser = {\n id: number;\n name: string;\n email: string;\n avatar_url?: string | null;\n /** ISO 639-1 (e.g. \"en\", \"da\"). Used by formatters that want a locale. */\n locale?: string | null;\n /** IANA tz identifier (e.g. \"Europe/Copenhagen\"). */\n timezone?: string | null;\n};\n\nexport type CboxOrganization = {\n id: number;\n slug: string;\n name: string;\n /**\n * Role of the current user within this org as resolved by id.\n * Apps should honour this for permission gating in the chrome\n * (eg \"Manage team\" link is hidden for members).\n */\n role?: 'owner' | 'admin' | 'member' | string;\n};\n\nexport type CboxAppLink = {\n /** Stable key — e.g. \"id\", \"cortex\", \"atlas\", \"track\". */\n key: CboxAppKey;\n /** Display name as shown in the launcher. */\n name: string;\n /** Absolute URL the launcher tile links to. */\n url: string;\n /**\n * Short tagline shown under the name. Keep to ~5–8 words —\n * the launcher truncates after one line.\n */\n description?: string;\n /**\n * One-letter monogram fallback when no icon is provided.\n * Defaults to the first letter of `name`.\n */\n monogram?: string;\n /** Optional inline SVG path or URL for the launcher tile icon. */\n iconUrl?: string;\n /**\n * Accent colour for the monogram tile (and current-app highlight).\n * Hex string or any CSS colour the browser accepts. Falls back to\n * the neutral chip when missing.\n */\n accentColor?: string;\n /** Tag the user's currently-active app so the launcher highlights it. */\n current?: boolean;\n /**\n * Whether the current org has access to this app. Defaults to\n * `true` so existing payloads render unchanged. `false` renders\n * the tile as locked: greyed out, no nav, and (if the host app\n * passes `onLockedAppClick`) opens an upgrade affordance.\n */\n entitled?: boolean;\n /**\n * Mark the app as not-yet-released. Renders as a disabled tile\n * with a \"soon\" badge — distinct from `entitled: false` which\n * implies \"available, but not in your plan\".\n */\n comingSoon?: boolean;\n};\n\nexport type CboxNotificationPreviewItem = {\n id: string;\n title: string;\n body?: string | null;\n severity: 'info' | 'warning' | 'critical';\n /** ISO-8601 timestamp from the notifications service. */\n createdAt: string;\n /** Null when the user hasn't opened the notification yet. */\n readAt?: string | null;\n /** Optional deep-link — typically into the app that originated\n * the notification (id/billing/invoice/123, webhooks/deliveries/x).\n * Null when the notification is informational with no follow-up. */\n ctaUrl?: string | null;\n ctaLabel?: string | null;\n};\n\nexport type CboxNotificationsState = {\n unreadCount: number;\n /**\n * \"See all\" target — typically the central notifications service\n * inbox (notifications.cbox.systems/inbox). The bell's POPOVER\n * shows the preview items inline; only this URL navigates the\n * user out of the current app.\n */\n inboxUrl: string;\n /**\n * Last 5 items (mixed read/unread) for the bell-popover preview.\n * Empty when the host hasn't fetched a preview yet — the bell\n * still renders the badge from `unreadCount`. Falsy on\n * pre-auth pages where the chrome shouldn't render the bell at all.\n */\n previewItems?: CboxNotificationPreviewItem[];\n /**\n * Endpoint pattern for marking a single notification read. The\n * popover POSTs to `markReadUrl.replace('{id}', notification.id)`\n * — a host-local route that forwards to the service via M2M.\n */\n markReadUrl?: string;\n};\n\nexport type CboxIdContextValue = {\n user: CboxUser;\n /**\n * Org the current app context is scoped to. Null on user-only\n * surfaces (eg the id account-settings landing page).\n */\n currentOrganization: CboxOrganization | null;\n /**\n * All orgs the user belongs to — feeds the org switcher.\n * Should be small (≤ a few dozen). For users in many orgs,\n * the switcher swaps in a search field.\n */\n organizations: CboxOrganization[];\n /**\n * Sister apps in the Cbox family the user can launch into.\n * Static-ish — doesn't need to refresh per request.\n */\n apps: CboxAppLink[];\n /**\n * Deep-links into id used by chrome controls. Each app\n * constructs these via the id-client SDK; the package\n * doesn't hardcode URLs because id may live on different\n * hosts in dev / staging / prod.\n */\n urls: {\n /** Base of the id app — for the \"manage account\" link. */\n idBaseUrl: string;\n /** Absolute URL of the user's id profile page. */\n accountUrl: string;\n /** Absolute URL of the current org's settings page in id. */\n orgSettingsUrl: string | null;\n /** POST endpoint that signs the user out. */\n signOutUrl: string;\n /**\n * POST endpoint in id that switches the user's active org.\n * Used by OrgSwitcher as a fallback when `onSwitchOrganization`\n * is not provided — covers apps that can't do a pure URL swap.\n */\n switchOrgUrl?: string;\n };\n /**\n * Notification feed state, or null/undefined when the user has no\n * inbox configured. id's wire shape sets `null` explicitly; the\n * type accepts both shapes so apps can pass the payload straight\n * through without a null→undefined adapter.\n */\n notifications?: CboxNotificationsState | null;\n /**\n * True when the host app's cached payload is known to be out of\n * date — id has emitted a domain event (membership/role/sub\n * change) since the cache was populated. Apps should refetch\n * via the SDK before rendering anything that depends on the\n * cached membership / entitlement state. Soft-TTL covers the\n * case where the event was missed.\n *\n * Default: false (treated as fresh).\n */\n stale?: boolean;\n /**\n * Called when the user picks a different org from the switcher.\n * Apps own this — typically a same-app URL navigation that\n * swaps the slug in the current path (`/org/{slug}/...`). The\n * server validates membership at the destination via\n * EnsureOrganizationMembership, so this is a pure URL change with\n * no mutable state to update.\n */\n onSwitchOrganization?: (org: CboxOrganization) => void;\n};\n\nconst CboxIdContext = createContext<CboxIdContextValue | null>(null);\n\nexport function CboxIdProvider({\n value,\n children,\n}: {\n value: CboxIdContextValue;\n children: ReactNode;\n}) {\n return <CboxIdContext.Provider value={value}>{children}</CboxIdContext.Provider>;\n}\n\nexport function useCboxId(): CboxIdContextValue {\n const ctx = useContext(CboxIdContext);\n if (ctx === null) {\n throw new Error(\n '@cboxdk/cbox-ui: useCboxId() must be called inside <CboxIdProvider>. ' +\n 'Wrap your app root and populate it from the id-client SDK (or, ' +\n 'in id itself, from Inertia shared props).',\n );\n }\n return ctx;\n}\n\n/**\n * Soft variant — returns null instead of throwing. Useful for\n * components that gracefully degrade on auth-pre pages.\n */\nexport function useCboxIdOptional(): CboxIdContextValue | null {\n return useContext(CboxIdContext);\n}\n","import clsx, { type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","import type { ComponentProps, ReactNode } from 'react';\nimport { cn } from '../utils/cn';\n\ntype Props = ComponentProps<'main'> & {\n children: ReactNode;\n};\n\n/**\n * Scrolling main column inside an <AppShell>. Wears the soft blue-\n * tinted gradient canvas so every Cbox app sits on the same\n * background.\n */\nexport function AppContent({ children, className, ...props }: Props) {\n return (\n <main\n {...props}\n className={cn(\n 'canvas-gradient relative flex h-svh flex-1 flex-col overflow-y-auto',\n className,\n )}\n >\n {children}\n </main>\n );\n}\n","import type { ReactNode } from 'react';\n\n/**\n * Top-level chrome. Hosts the desktop sidebar (left) and the\n * scrollable content column (right) side-by-side. Fits the full\n * viewport height; only the content column scrolls.\n *\n * Pair with <AppContent> inside. Per-app sidebars compose alongside\n * — cbox-ui doesn't ship one because the nav items are app-specific.\n */\nexport function AppShell({ children }: { children: ReactNode }) {\n return (\n <div className=\"flex h-svh w-full bg-canvas text-foreground\">\n {children}\n </div>\n );\n}\n","import type { ComponentProps } from 'react';\nimport { cn } from '../utils/cn';\n\nexport type CboxBrandProps = {\n /**\n * App key — drives the small mono submark beside the wordmark.\n * Convention: lowercase single word matching the `cbox_apps.key`\n * row in id (`notifications`, `webhooks`, `id`, `cortex`, …).\n */\n appKey: string;\n /**\n * Override the submark text. Defaults to `appKey`. Hide it\n * entirely with `submark={null}`.\n */\n submark?: string | null;\n /** Asset base path. Default `/brand` — apps drop the standard\n * png set (`cbox-icon.png`, `cbox-logo.png`, plus `@2x` retina)\n * into `public/brand/` and they Just Work. */\n assetBase?: string;\n /** Tone of the wordmark. `dark` on light surfaces (default),\n * `light` on dark / coloured surfaces. */\n tone?: 'dark' | 'light';\n /** Collapsed mode renders only the square icon — used in the\n * collapsed-sidebar state. */\n collapsed?: boolean;\n className?: string;\n};\n\n/**\n * Canonical Cbox brand mark. Every app wears this — the only\n * variable bit is the `appKey` submark beside the wordmark\n * (\"notifications\", \"webhooks\", …).\n *\n * No app should ship its own brand component. If a product needs\n * a materially different mark, that's a cbox-ui PR (extend this\n * component), not a per-app fork.\n */\nexport function CboxBrand({\n appKey,\n submark,\n assetBase = '/brand',\n tone = 'dark',\n collapsed = false,\n className,\n}: CboxBrandProps) {\n if (collapsed) {\n return (\n <img\n src={`${assetBase}/cbox-icon.png`}\n srcSet={`${assetBase}/cbox-icon.png 1x, ${assetBase}/cbox-icon@2x.png 2x`}\n alt=\"Cbox\"\n width={36}\n height={36}\n className={cn('h-9 w-9 rounded-md', className)}\n />\n );\n }\n\n const wordmark =\n tone === 'light'\n ? `${assetBase}/cbox-logo-white.png`\n : `${assetBase}/cbox-logo.png`;\n const wordmarkRetina =\n tone === 'light'\n ? `${assetBase}/cbox-logo-white@2x.png`\n : `${assetBase}/cbox-logo@2x.png`;\n\n const submarkText = submark === undefined ? appKey : submark;\n\n return (\n <div\n className={cn('inline-flex items-center gap-2', className)}\n aria-label={`Cbox · ${appKey}`}\n >\n <img\n src={wordmark}\n srcSet={`${wordmark} 1x, ${wordmarkRetina} 2x`}\n alt=\"Cbox\"\n height={22}\n className=\"h-[22px] w-auto select-none\"\n draggable={false}\n />\n {submarkText !== null && submarkText !== '' ? (\n <span\n className={cn(\n 'text-mono text-[10px] font-semibold tracking-[0.22em] uppercase',\n tone === 'light'\n ? 'text-white/60'\n : 'text-muted-foreground/80',\n )}\n >\n {submarkText}\n </span>\n ) : null}\n </div>\n );\n}\n\n/**\n * Re-export shape kept in case a host app needs to pass\n * additional <img> attrs (`loading`, `fetchPriority`, …).\n */\nexport type CboxBrandImageProps = ComponentProps<'img'>;\n","import type { ComponentType, ReactNode } from 'react';\nimport { CboxBrand } from './cbox-brand';\nimport { cn } from '../utils/cn';\n\nexport type CboxNavItem = {\n label: string;\n /**\n * Absolute path the host's router can navigate to. Apps that\n * scope nav by org slug should compose the path themselves\n * (`/org/${slug}/endpoints`) before passing it in — cbox-ui\n * stays unaware of routing conventions.\n */\n href: string;\n icon: ComponentType<{ className?: string; strokeWidth?: number }>;\n /** Highlight the row for child routes too (`/endpoints/123`\n * matches the `Endpoints` row when this is true). */\n matchPrefix?: boolean;\n};\n\nexport type CboxNavSection = {\n label: string;\n items: CboxNavItem[];\n};\n\n/**\n * Generic Link contract — apps inject their own (Inertia's `Link`,\n * Wouter, React Router, plain `<a>`). cbox-ui doesn't depend on\n * any router so the same chrome works everywhere.\n */\nexport type LinkComponent = ComponentType<{\n href: string;\n prefetch?: boolean;\n children: ReactNode;\n className?: string;\n title?: string;\n 'aria-label'?: string;\n}>;\n\nexport type CboxAppSidebarProps = {\n /** App key for the brand submark (and aria labels). */\n appKey: string;\n /** Optional override for the submark — defaults to `appKey`. */\n brandSubmark?: string | null;\n /** Where brand assets live. Default `/brand`. */\n assetBase?: string;\n /** Where the brand row links to (typically the app's home). */\n brandHref?: string;\n\n /** Nav sections — top to bottom. */\n sections: CboxNavSection[];\n /** Active path — used to highlight the current row. */\n currentPath: string;\n\n /** Apps inject their router's Link primitive. */\n LinkComponent: LinkComponent;\n\n /** Persisted \"is the desktop sidebar collapsed?\" state. */\n collapsed?: boolean;\n\n className?: string;\n};\n\n/**\n * Standard Cbox sidebar. Every app wears this — the only variable\n * bits are `sections` (per-app nav) and `appKey` (drives the brand\n * submark).\n *\n * Hidden below `lg` — apps render a separate mobile drawer that\n * shares the same `sections` config.\n *\n * No app should ship its own sidebar component. The chrome is the\n * shape; nav items are the data.\n */\nexport function CboxAppSidebar({\n appKey,\n brandSubmark,\n assetBase,\n brandHref = '/',\n sections,\n currentPath,\n LinkComponent,\n collapsed = false,\n className,\n}: CboxAppSidebarProps) {\n return (\n <aside\n data-slot=\"cbox-app-sidebar\"\n data-collapsed={collapsed ? 'true' : 'false'}\n className={cn(\n 'hidden h-svh shrink-0 flex-col border-r border-sidebar-border bg-sidebar transition-[width] duration-150 ease-out lg:flex',\n collapsed ? 'w-[60px]' : 'w-[240px]',\n className,\n )}\n >\n <LinkComponent\n href={brandHref}\n aria-label=\"Home\"\n className={cn(\n 'flex h-14 shrink-0 items-center border-b border-sidebar-border/70',\n collapsed ? 'justify-center px-0' : 'px-4',\n )}\n >\n <CboxBrand\n appKey={appKey}\n submark={brandSubmark}\n assetBase={assetBase}\n collapsed={collapsed}\n />\n </LinkComponent>\n\n <nav\n className={cn(\n 'flex-1 overflow-y-auto pt-5 pb-3',\n collapsed ? 'space-y-3 px-2' : 'space-y-5 px-3',\n )}\n >\n {sections.map((section) => (\n <div key={section.label} className=\"space-y-1\">\n {collapsed ? null : (\n <p className=\"text-eyebrow px-3 pb-1\">\n {section.label}\n </p>\n )}\n <ul className=\"space-y-0.5\">\n {section.items.map((item) => {\n const active = item.matchPrefix === true\n ? currentPath === item.href ||\n currentPath.startsWith(item.href + '/')\n : currentPath === item.href;\n const Icon = item.icon;\n\n return (\n <li key={item.label}>\n <LinkComponent\n href={item.href}\n prefetch\n aria-label={\n collapsed\n ? item.label\n : undefined\n }\n title={\n collapsed\n ? item.label\n : undefined\n }\n className={cn(\n collapsed\n ? 'group mx-auto flex h-9 w-9 items-center justify-center rounded-md transition-colors'\n : 'group flex items-center gap-2.5 rounded-md px-3 py-1.5 text-[13px] transition-colors',\n active\n ? 'bg-sidebar-accent font-semibold text-sidebar-accent-foreground'\n : 'text-sidebar-foreground/80 hover:bg-sidebar-accent hover:text-foreground',\n )}\n >\n <Icon\n className={cn(\n 'h-4 w-4 shrink-0',\n active\n ? 'text-foreground'\n : 'text-sidebar-muted',\n )}\n strokeWidth={1.7}\n />\n {collapsed ? null : (\n <span className=\"flex-1 truncate\">\n {item.label}\n </span>\n )}\n </LinkComponent>\n </li>\n );\n })}\n </ul>\n </div>\n ))}\n </nav>\n </aside>\n );\n}\n","import { X } from 'lucide-react';\nimport { useEffect } from 'react';\nimport { CboxBrand } from './cbox-brand';\nimport type {\n CboxNavSection,\n LinkComponent,\n} from './cbox-app-sidebar';\nimport { cn } from '../utils/cn';\n\nexport type CboxMobileNavDrawerProps = {\n open: boolean;\n onClose: () => void;\n appKey: string;\n brandSubmark?: string | null;\n assetBase?: string;\n brandHref?: string;\n sections: CboxNavSection[];\n currentPath: string;\n LinkComponent: LinkComponent;\n};\n\n/**\n * Mobile-only slide-in sidebar. Hidden on `lg` and up — there the\n * desktop `CboxAppSidebar` is always visible. Shares the same\n * `sections` shape as the desktop sidebar so apps don't have to\n * maintain two nav configs.\n *\n * State (open/close) lives in `CboxAppShell` so it can wire the\n * hamburger button + auto-close on `currentPath` change. The drawer\n * itself just renders; it doesn't track anything.\n *\n * Closes on: Escape, scrim click, navigation (parent unsets `open`\n * when `currentPath` changes). Locks body scroll while open so the\n * page underneath doesn't scroll on touch.\n */\nexport function CboxMobileNavDrawer({\n open,\n onClose,\n appKey,\n brandSubmark,\n assetBase,\n brandHref = '/',\n sections,\n currentPath,\n LinkComponent,\n}: CboxMobileNavDrawerProps) {\n useEffect(() => {\n if (!open) {\n return;\n }\n\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose();\n }\n };\n document.addEventListener('keydown', onKey);\n\n const prevOverflow = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n\n return () => {\n document.removeEventListener('keydown', onKey);\n document.body.style.overflow = prevOverflow;\n };\n }, [open, onClose]);\n\n return (\n <div\n className={cn(\n 'fixed inset-0 z-40 lg:hidden',\n open ? '' : 'pointer-events-none',\n )}\n aria-hidden={open ? 'false' : 'true'}\n >\n <div\n onClick={onClose}\n className={cn(\n 'absolute inset-0 bg-black/40 transition-opacity duration-200',\n open ? 'opacity-100' : 'opacity-0',\n )}\n />\n <aside\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Navigation\"\n className={cn(\n 'absolute inset-y-0 left-0 flex w-[280px] max-w-[80vw] flex-col border-r border-sidebar-border bg-sidebar shadow-xl transition-transform duration-200 ease-out',\n open ? 'translate-x-0' : '-translate-x-full',\n )}\n >\n <div className=\"flex h-14 shrink-0 items-center justify-between gap-2 border-b border-sidebar-border/70 px-4\">\n <LinkComponent\n href={brandHref}\n aria-label=\"Home\"\n className=\"flex items-center\"\n >\n <CboxBrand\n appKey={appKey}\n submark={brandSubmark}\n assetBase={assetBase}\n collapsed={false}\n />\n </LinkComponent>\n <button\n type=\"button\"\n onClick={onClose}\n aria-label=\"Close navigation\"\n className=\"inline-flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-secondary hover:text-foreground\"\n >\n <X className=\"h-4 w-4\" strokeWidth={1.8} />\n </button>\n </div>\n <nav className=\"flex-1 space-y-5 overflow-y-auto px-3 pt-5 pb-3\">\n {sections.map((section) => (\n <div key={section.label} className=\"space-y-1\">\n <p className=\"text-eyebrow px-3 pb-1\">\n {section.label}\n </p>\n <ul className=\"space-y-0.5\">\n {section.items.map((item) => {\n const active =\n item.matchPrefix === true\n ? currentPath === item.href ||\n currentPath.startsWith(\n item.href + '/',\n )\n : currentPath === item.href;\n const Icon = item.icon;\n\n return (\n <li key={item.label}>\n <LinkComponent\n href={item.href}\n prefetch\n className={cn(\n 'group flex items-center gap-2.5 rounded-md px-3 py-2 text-[14px] transition-colors',\n active\n ? 'bg-sidebar-accent font-semibold text-sidebar-accent-foreground'\n : 'text-sidebar-foreground/80 hover:bg-sidebar-accent hover:text-foreground',\n )}\n >\n <Icon\n className={cn(\n 'h-4 w-4 shrink-0',\n active\n ? 'text-foreground'\n : 'text-sidebar-muted',\n )}\n strokeWidth={1.7}\n />\n <span className=\"flex-1 truncate\">\n {item.label}\n </span>\n </LinkComponent>\n </li>\n );\n })}\n </ul>\n </div>\n ))}\n </nav>\n </aside>\n </div>\n );\n}\n","import {\n useEffect,\n useMemo,\n useRef,\n useState,\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactNode,\n} from 'react';\nimport { useCboxIdOptional, type CboxAppLink } from '../context/cbox-id';\nimport { cn } from '../utils/cn';\n\ntype AppSwitcherProps = {\n className?: string;\n /**\n * Called when the user clicks an app they're not entitled to. Use\n * this to open an upgrade flow / Stripe checkout / Intercom message.\n * If unset, locked rows fall through to a static \"Add to plan\"\n * affordance — the click is a no-op so we never silently ship the\n * user to a broken paywall.\n */\n onLockedAppClick?: (app: CboxAppLink) => void;\n};\n\n/**\n * Left-cluster app picker — the dropdown button that sits beside OrgSwitcher.\n *\n * Shows the current app's monogram + name as the trigger so both context\n * dimensions (which app, which org) are immediately visible in the left\n * cluster without needing to open anything.\n *\n * The dropdown preserves the full AppLauncher row richness: monogram tile\n * with per-app accent, name, description, and entitlement badges. Entitled\n * apps are grouped first; locked / coming-soon land in an \"Available\" section.\n *\n * Includes typeahead — auto-focus on open, filters name/description/key as\n * the user types, arrow-key navigation, Enter to activate, Escape to close.\n *\n * Soft-reads via useCboxIdOptional — renders null when no provider is\n * mounted above (admin shells, pre-auth pages).\n */\nexport function AppSwitcher({ className, onLockedAppClick }: AppSwitcherProps) {\n const cboxId = useCboxIdOptional();\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n const [activeIndex, setActiveIndex] = useState(0);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const searchRef = useRef<HTMLInputElement | null>(null);\n\n // Reset transient state every time the dropdown opens so we don't\n // leak the previous session's query/highlight into a fresh open.\n useEffect(() => {\n if (open) {\n setQuery('');\n setActiveIndex(0);\n // Focus on next tick — the input isn't mounted on the same\n // frame that flips `open=true`. requestAnimationFrame is the\n // simplest cross-browser way to wait for that mount.\n const id = requestAnimationFrame(() => searchRef.current?.focus());\n return () => cancelAnimationFrame(id);\n }\n }, [open]);\n\n // Click-outside + Escape — mirrors every other Cbox top-bar control.\n useEffect(() => {\n if (!open) {\n return;\n }\n\n function onPointerDown(event: PointerEvent): void {\n if (\n containerRef.current !== null &&\n !containerRef.current.contains(event.target as Node)\n ) {\n setOpen(false);\n }\n }\n\n function onKey(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n setOpen(false);\n }\n }\n\n window.addEventListener('pointerdown', onPointerDown);\n window.addEventListener('keydown', onKey);\n\n return () => {\n window.removeEventListener('pointerdown', onPointerDown);\n window.removeEventListener('keydown', onKey);\n };\n }, [open]);\n\n // No provider, or nothing to show — render nothing. The chrome stays clean.\n if (cboxId === null || cboxId.apps.length === 0) {\n return null;\n }\n\n const apps = cboxId.apps;\n const orgSlug = cboxId.currentOrganization?.slug;\n\n // The host/current app — used to build the trigger label.\n const currentApp = apps.find((a) => a.current === true) ?? null;\n\n // Filter + partition together so the activeIndex below maps cleanly\n // onto the rendered order: entitled rows first, then locked rows.\n const { entitled, locked, navigableHrefs } = useMemo(() => {\n const q = query.trim().toLowerCase();\n const matches = (app: CboxAppLink) => {\n if (q === '') {\n return true;\n }\n return (\n app.name.toLowerCase().includes(q) ||\n app.key.toLowerCase().includes(q) ||\n (app.description?.toLowerCase().includes(q) ?? false)\n );\n };\n\n const entitledList: CboxAppLink[] = [];\n const lockedList: CboxAppLink[] = [];\n for (const app of apps) {\n if (!matches(app)) {\n continue;\n }\n const isEntitled = app.entitled !== false && app.comingSoon !== true;\n (isEntitled ? entitledList : lockedList).push(app);\n }\n\n // Flat list of navigable hrefs in render order — used by Enter on\n // the search input to \"activate\" the highlighted row. Coming-soon\n // rows are skipped (they're not actionable).\n const navigable: Array<{ app: CboxAppLink; isLocked: boolean }> = [];\n for (const app of entitledList) {\n if (app.current !== true) {\n navigable.push({ app, isLocked: false });\n }\n }\n for (const app of lockedList) {\n if (app.comingSoon !== true) {\n navigable.push({ app, isLocked: true });\n }\n }\n\n return {\n entitled: entitledList,\n locked: lockedList,\n navigableHrefs: navigable,\n };\n }, [apps, query]);\n\n const totalMatches = entitled.length + locked.length;\n\n // Clamp activeIndex into the navigable range whenever the filter changes\n // so a query that shrinks the list doesn't leave the highlight pointing\n // past the end.\n useEffect(() => {\n if (activeIndex >= navigableHrefs.length) {\n setActiveIndex(0);\n }\n }, [navigableHrefs.length, activeIndex]);\n\n const triggerMonogram =\n currentApp?.monogram ?? currentApp?.name.slice(0, 1).toUpperCase() ?? '⬛';\n const triggerName = currentApp?.name ?? 'Apps';\n const triggerAccent = currentApp?.accentColor;\n\n function onSearchKeyDown(event: ReactKeyboardEvent<HTMLInputElement>): void {\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n if (navigableHrefs.length === 0) {\n return;\n }\n setActiveIndex((i) => (i + 1) % navigableHrefs.length);\n return;\n }\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n if (navigableHrefs.length === 0) {\n return;\n }\n setActiveIndex((i) => (i - 1 + navigableHrefs.length) % navigableHrefs.length);\n return;\n }\n if (event.key === 'Enter') {\n event.preventDefault();\n const target = navigableHrefs[activeIndex];\n if (target === undefined) {\n return;\n }\n if (target.isLocked) {\n onLockedAppClick?.(target.app);\n setOpen(false);\n return;\n }\n const href =\n orgSlug !== undefined && target.app.current !== true\n ? buildOrgUrl(target.app.url, orgSlug)\n : target.app.url;\n window.location.href = href;\n setOpen(false);\n }\n }\n\n return (\n <div ref={containerRef} className={cn('relative', className)}>\n <button\n type=\"button\"\n aria-haspopup=\"true\"\n aria-expanded={open}\n onClick={() => setOpen((v) => !v)}\n className=\"flex items-center gap-2 rounded-md border border-border bg-card px-2.5 py-1.5 text-sm font-medium text-foreground hover:bg-secondary\"\n >\n {/* Monogram chip matching the AppLauncher tile style */}\n <span\n style={\n triggerAccent !== undefined\n ? {\n backgroundColor: triggerAccent,\n color: '#fff',\n borderColor: triggerAccent,\n }\n : undefined\n }\n className=\"flex h-5 w-5 shrink-0 items-center justify-center rounded-sm border border-border bg-secondary text-[10px] font-bold\"\n >\n {currentApp?.iconUrl ? (\n <img\n src={currentApp.iconUrl}\n alt=\"\"\n className=\"h-3.5 w-3.5\"\n loading=\"eager\"\n />\n ) : (\n triggerMonogram\n )}\n </span>\n <span className=\"max-w-[140px] truncate\">{triggerName}</span>\n <Chevron />\n </button>\n\n {open ? (\n <div\n role=\"dialog\"\n aria-label=\"Switch app\"\n // 22rem wide — enough for monogram + name + description in one line\n // without wrapping. Clamps to viewport-minus-gutter on narrow screens.\n className=\"absolute left-0 top-full z-50 mt-1 w-[min(22rem,calc(100vw-1.5rem))] overflow-hidden rounded-lg border border-border bg-popover shadow-lg\"\n >\n <div className=\"border-b border-border/70 px-3 pt-2.5 pb-1.5\">\n <p className=\"text-mono text-[10px] font-semibold tracking-[0.18em] text-muted-foreground uppercase\">\n Switch app\n </p>\n </div>\n\n <div className=\"border-b border-border/70 px-2 py-1.5\">\n <div className=\"flex items-center gap-2 rounded-md px-2 py-1 focus-within:bg-secondary\">\n <SearchIcon />\n <input\n ref={searchRef}\n type=\"text\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n onKeyDown={onSearchKeyDown}\n placeholder=\"Filter apps…\"\n aria-label=\"Filter apps\"\n autoComplete=\"off\"\n spellCheck={false}\n className=\"w-full bg-transparent text-sm text-foreground placeholder:text-muted-foreground/60 focus:outline-none\"\n />\n </div>\n </div>\n\n <div className=\"max-h-[60vh] overflow-y-auto py-1\">\n {totalMatches === 0 ? (\n <p className=\"px-3 py-6 text-center text-[12px] text-muted-foreground\">\n No apps match{' '}\n <span className=\"text-mono text-foreground\">\n “{query}”\n </span>\n </p>\n ) : null}\n\n {entitled.length > 0 ? (\n <ul className=\"space-y-0.5 p-1\">\n {entitled.map((app) => {\n const navIndex = findNavIndex(navigableHrefs, app);\n return (\n <AppRow\n key={app.key}\n app={app}\n orgSlug={orgSlug}\n highlighted={navIndex === activeIndex}\n onMouseEnter={() => {\n if (navIndex !== -1) {\n setActiveIndex(navIndex);\n }\n }}\n onLockedAppClick={onLockedAppClick}\n onNavigate={() => setOpen(false)}\n />\n );\n })}\n </ul>\n ) : null}\n\n {locked.length > 0 ? (\n <>\n {entitled.length > 0 ? (\n <div className=\"my-1 border-t border-border/50\" />\n ) : null}\n <p className=\"text-mono px-3 py-1.5 text-[10px] font-semibold tracking-[0.18em] text-muted-foreground/70 uppercase\">\n Available\n </p>\n <ul className=\"space-y-0.5 p-1 pt-0\">\n {locked.map((app) => {\n const navIndex = findNavIndex(navigableHrefs, app);\n return (\n <AppRow\n key={app.key}\n app={app}\n orgSlug={orgSlug}\n highlighted={navIndex === activeIndex}\n onMouseEnter={() => {\n if (navIndex !== -1) {\n setActiveIndex(navIndex);\n }\n }}\n onLockedAppClick={onLockedAppClick}\n onNavigate={() => setOpen(false)}\n />\n );\n })}\n </ul>\n </>\n ) : null}\n </div>\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction findNavIndex(\n navigable: Array<{ app: CboxAppLink; isLocked: boolean }>,\n app: CboxAppLink,\n): number {\n return navigable.findIndex((n) => n.app.key === app.key);\n}\n\ntype AppRowProps = {\n app: CboxAppLink;\n orgSlug: string | undefined;\n highlighted: boolean;\n onMouseEnter: () => void;\n onLockedAppClick: AppSwitcherProps['onLockedAppClick'];\n onNavigate: () => void;\n};\n\nfunction AppRow({\n app,\n orgSlug,\n highlighted,\n onMouseEnter,\n onLockedAppClick,\n onNavigate,\n}: AppRowProps): ReactNode {\n const isComingSoon = app.comingSoon === true;\n const isLocked = app.entitled === false || isComingSoon;\n\n const monogram = app.monogram ?? app.name.slice(0, 1).toUpperCase();\n const accent = app.accentColor;\n const tileStyle =\n accent !== undefined && app.iconUrl === undefined\n ? { backgroundColor: accent, color: '#fff', borderColor: accent }\n : undefined;\n\n // Land directly on `<app>/org/<slug>` — same convention as AppLauncher.\n // Skip the URL transform for the current app: the user is already there.\n const href =\n orgSlug !== undefined && app.current !== true\n ? buildOrgUrl(app.url, orgSlug)\n : app.url;\n\n const tile = (\n <div\n style={tileStyle}\n className={cn(\n 'flex h-9 w-9 shrink-0 items-center justify-center rounded-md border border-border bg-card text-[13px] font-semibold text-foreground',\n app.current && 'ring-2 ring-accent-edge ring-offset-1 ring-offset-popover',\n isLocked && 'opacity-60 grayscale',\n )}\n >\n {app.iconUrl ? (\n <img src={app.iconUrl} alt=\"\" className=\"h-5 w-5\" loading=\"lazy\" />\n ) : (\n <span>{monogram}</span>\n )}\n </div>\n );\n\n const body = (\n <div className=\"flex min-w-0 flex-1 flex-col leading-tight\">\n <div className=\"flex items-center gap-2\">\n <span\n className={cn(\n 'truncate text-sm font-medium text-foreground',\n isLocked && 'text-muted-foreground',\n )}\n >\n {app.name}\n </span>\n {app.current ? (\n <span className=\"text-mono shrink-0 rounded-sm border border-accent-edge/40 bg-accent-soft px-1 text-[9px] font-semibold tracking-[0.14em] text-accent uppercase\">\n current\n </span>\n ) : null}\n </div>\n {app.description ? (\n <span\n className={cn(\n 'truncate text-[11px]',\n isLocked ? 'text-muted-foreground/70' : 'text-muted-foreground',\n )}\n >\n {app.description}\n </span>\n ) : null}\n </div>\n );\n\n const trailing = isComingSoon ? (\n <span className=\"text-mono shrink-0 rounded-sm border border-border bg-secondary px-1.5 py-0.5 text-[9px] font-semibold tracking-[0.14em] text-muted-foreground uppercase\">\n soon\n </span>\n ) : isLocked ? (\n <span className=\"flex shrink-0 items-center gap-1 text-[10px] font-medium text-muted-foreground\">\n <Lock />\n Add\n </span>\n ) : null;\n\n if (isComingSoon) {\n return (\n <li>\n <div\n aria-disabled\n className=\"flex w-full cursor-not-allowed items-center gap-3 rounded-md px-2.5 py-2\"\n title={`${app.name} — coming soon`}\n >\n {tile}\n {body}\n {trailing}\n </div>\n </li>\n );\n }\n\n if (isLocked) {\n return (\n <li>\n <button\n type=\"button\"\n onMouseEnter={onMouseEnter}\n onClick={() => {\n onLockedAppClick?.(app);\n onNavigate();\n }}\n className={cn(\n 'group flex w-full items-center gap-3 rounded-md px-2.5 py-2 text-left transition-colors',\n highlighted && 'bg-secondary',\n onLockedAppClick !== undefined\n ? 'hover:bg-secondary'\n : 'cursor-default',\n )}\n title={`Add ${app.name} to your plan`}\n >\n {tile}\n {body}\n {trailing}\n </button>\n </li>\n );\n }\n\n // Current app: render as a div (no navigation needed — user is already here).\n if (app.current === true) {\n return (\n <li>\n <div\n onMouseEnter={onMouseEnter}\n className=\"flex w-full items-center gap-3 rounded-md bg-accent-soft px-2.5 py-2\"\n >\n {tile}\n {body}\n {trailing}\n </div>\n </li>\n );\n }\n\n return (\n <li>\n <a\n href={href}\n onMouseEnter={onMouseEnter}\n onClick={onNavigate}\n className={cn(\n 'group flex w-full items-center gap-3 rounded-md px-2.5 py-2 transition-colors hover:bg-secondary',\n highlighted && 'bg-secondary',\n )}\n >\n {tile}\n {body}\n {trailing}\n </a>\n </li>\n );\n}\n\nfunction buildOrgUrl(url: string, orgSlug: string): string {\n if (url === '' || orgSlug === '') {\n return url;\n }\n try {\n const u = new URL(url);\n u.pathname = `/org/${encodeURIComponent(orgSlug)}`;\n return u.toString();\n } catch {\n return `${url.replace(/\\/$/, '')}/org/${encodeURIComponent(orgSlug)}`;\n }\n}\n\nfunction Chevron(): ReactNode {\n return (\n <svg\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 10 10\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden\n >\n <path\n d=\"M2 4l3 3 3-3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction SearchIcon(): ReactNode {\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n className=\"shrink-0 text-muted-foreground\"\n >\n <circle cx=\"5.25\" cy=\"5.25\" r=\"3.25\" />\n <path d=\"M8 8l2 2\" />\n </svg>\n );\n}\n\nfunction Lock(): ReactNode {\n return (\n <svg\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n >\n <rect x=\"2.5\" y=\"5\" width=\"7\" height=\"5\" rx=\"1\" />\n <path d=\"M4 5V3.5a2 2 0 1 1 4 0V5\" />\n </svg>\n );\n}\n","import type { LucideIcon } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport { cn } from '../utils/cn';\n\ntype EmptyStateProps = {\n icon?: LucideIcon;\n title: ReactNode;\n description?: ReactNode;\n action?: ReactNode;\n className?: string;\n};\n\n/**\n * Centered empty state with an optional icon block, title, body\n * lede, and a single CTA slot.\n */\nexport function EmptyState({\n icon: Icon,\n title,\n description,\n action,\n className,\n}: EmptyStateProps) {\n return (\n <div\n className={cn(\n 'flex flex-col items-center justify-center gap-3 px-6 py-12 text-center',\n className,\n )}\n >\n {Icon ? (\n <div className=\"flex h-10 w-10 items-center justify-center rounded-md bg-secondary text-muted-foreground\">\n <Icon className=\"h-4 w-4\" strokeWidth={1.6} />\n </div>\n ) : null}\n <div className=\"space-y-1\">\n <h3 className=\"text-base font-semibold text-foreground\">\n {title}\n </h3>\n {description ? (\n <p className=\"max-w-sm text-sm text-muted-foreground\">\n {description}\n </p>\n ) : null}\n </div>\n {action ? <div className=\"pt-1\">{action}</div> : null}\n </div>\n );\n}\n","import { cn } from '../utils/cn';\n\ntype Tone =\n | 'neutral'\n | 'info'\n | 'success'\n | 'warning'\n | 'destructive'\n | 'muted';\n\nconst toneStyles: Record<Tone, string> = {\n neutral: 'border-border bg-secondary text-secondary-foreground',\n info: 'border-info/20 bg-info-soft text-info',\n success: 'border-success/20 bg-success-soft text-success',\n warning: 'border-warning/20 bg-warning-soft text-warning',\n destructive: 'border-destructive/20 bg-destructive-soft text-destructive',\n muted: 'border-border bg-card text-muted-foreground',\n};\n\nconst dotStyles: Record<Tone, string> = {\n neutral: 'bg-muted-foreground',\n info: 'bg-info',\n success: 'bg-success',\n warning: 'bg-warning',\n destructive: 'bg-destructive',\n muted: 'bg-muted-foreground/60',\n};\n\ntype StatusPillProps = {\n children: React.ReactNode;\n tone?: Tone;\n className?: string;\n /** Show a small dot before the label for \"live status\" feel. */\n dot?: boolean;\n};\n\n/**\n * Compact pill for plan tier, role, status, etc. Rounded-full like\n * Cortex's \"Running\"/\"Production\" tags. Sized for tabular density,\n * not editorial impact.\n */\nexport function StatusPill({\n children,\n tone = 'neutral',\n className,\n dot = false,\n}: StatusPillProps) {\n return (\n <span\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-full border px-2 py-0.5 text-[11px] leading-none font-medium',\n toneStyles[tone],\n className,\n )}\n >\n {dot ? (\n <span\n className={cn('h-1.5 w-1.5 rounded-full', dotStyles[tone])}\n />\n ) : null}\n {children}\n </span>\n );\n}\n","import { X } from 'lucide-react';\nimport {\n useCallback,\n useEffect,\n useRef,\n type ReactNode,\n} from 'react';\nimport { cn } from '../utils/cn';\n\ntype Props = {\n open: boolean;\n onClose: () => void;\n /** Title rendered in the modal header. */\n title: ReactNode;\n /** Optional eyebrow above the title. */\n eyebrow?: ReactNode;\n /** Right-side header slot — typically a small action cluster\n * (filters, \"open in new tab\", search input). */\n headerActions?: ReactNode;\n /** Optional bottom bar — e.g. \"showing 50 of 312\" + pagination. */\n footer?: ReactNode;\n /** Modal width. Default `wide` (~960px) suits inbox-style lists.\n * `spotlight` is the search-modal width, narrower + top-aligned. */\n size?: 'wide' | 'spotlight';\n children: ReactNode;\n};\n\n/**\n * Cbox cross-app surface modal. Identical chrome across every\n * surface — only `title`, `headerActions`, `children`, `footer`\n * vary. Surfaces compose this; hosts never instantiate it\n * directly.\n *\n * Behaviour:\n * - ESC key dismisses\n * - click on the backdrop dismisses\n * - focus is trapped inside the dialog while open\n * - body scroll locks while open (page underneath stays put)\n * - first focusable element inside auto-focuses on open\n *\n * The modal mounts a sibling portal-style div that's a direct\n * child of `<body>` (via fixed positioning + z-index) so it\n * escapes any positioned ancestor in the host page tree.\n */\nexport function SurfaceModal({\n open,\n onClose,\n title,\n eyebrow,\n headerActions,\n footer,\n size = 'wide',\n children,\n}: Props) {\n const dialogRef = useRef<HTMLDivElement | null>(null);\n const previousFocusRef = useRef<HTMLElement | null>(null);\n\n // Lock body scroll while open. Restore the page's previous\n // scrollbar gutter to avoid layout shift.\n useEffect(() => {\n if (!open) return;\n const original = document.body.style.overflow;\n const gutter = window.innerWidth - document.documentElement.clientWidth;\n document.body.style.overflow = 'hidden';\n if (gutter > 0) {\n document.body.style.paddingRight = `${gutter}px`;\n }\n return () => {\n document.body.style.overflow = original;\n document.body.style.paddingRight = '';\n };\n }, [open]);\n\n // ESC dismiss + focus trap.\n useEffect(() => {\n if (!open) return;\n previousFocusRef.current = document.activeElement as HTMLElement | null;\n\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n onClose();\n return;\n }\n if (e.key === 'Tab' && dialogRef.current !== null) {\n const focusable = dialogRef.current.querySelectorAll<HTMLElement>(\n 'a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex=\"-1\"])',\n );\n if (focusable.length === 0) return;\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n if (first === undefined || last === undefined) return;\n if (e.shiftKey && document.activeElement === first) {\n e.preventDefault();\n last.focus();\n } else if (!e.shiftKey && document.activeElement === last) {\n e.preventDefault();\n first.focus();\n }\n }\n };\n document.addEventListener('keydown', onKey);\n\n // Auto-focus the first focusable element so keyboard users\n // land inside the dialog without an extra Tab.\n const id = window.setTimeout(() => {\n const focusable = dialogRef.current?.querySelector<HTMLElement>(\n 'input, button, [tabindex]:not([tabindex=\"-1\"])',\n );\n focusable?.focus();\n }, 50);\n\n return () => {\n document.removeEventListener('keydown', onKey);\n window.clearTimeout(id);\n previousFocusRef.current?.focus?.();\n };\n }, [open, onClose]);\n\n const onBackdrop = useCallback(\n (e: React.MouseEvent) => {\n if (e.target === e.currentTarget) onClose();\n },\n [onClose],\n );\n\n if (!open) return null;\n\n return (\n <div\n role=\"presentation\"\n onMouseDown={onBackdrop}\n className={cn(\n 'fixed inset-0 z-50 flex animate-in fade-in duration-150',\n size === 'spotlight'\n ? 'items-start justify-center pt-[10vh]'\n : 'items-center justify-center px-4 py-[5vh]',\n 'bg-foreground/40 backdrop-blur-sm',\n )}\n >\n <div\n ref={dialogRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={typeof title === 'string' ? title : undefined}\n className={cn(\n 'flex max-h-full w-full flex-col overflow-hidden rounded-lg border border-border bg-background text-foreground shadow-2xl',\n 'animate-in zoom-in-95 slide-in-from-bottom-2 duration-150',\n size === 'spotlight'\n ? 'max-w-[640px]'\n : 'max-w-[960px]',\n )}\n >\n <header className=\"flex shrink-0 items-start gap-3 border-b border-border/70 bg-background/80 px-5 py-4 backdrop-blur-md\">\n <div className=\"min-w-0 flex-1\">\n {eyebrow !== undefined ? (\n <p className=\"text-mono text-[10px] font-semibold tracking-[0.18em] uppercase text-muted-foreground\">\n {eyebrow}\n </p>\n ) : null}\n <h2 className=\"text-base font-semibold tracking-tight text-foreground\">\n {title}\n </h2>\n </div>\n {headerActions !== undefined ? (\n <div className=\"flex shrink-0 items-center gap-2\">\n {headerActions}\n </div>\n ) : null}\n <button\n type=\"button\"\n onClick={onClose}\n className=\"ml-1 inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-secondary hover:text-foreground\"\n aria-label=\"Close\"\n >\n <X className=\"h-4 w-4\" strokeWidth={1.8} />\n </button>\n </header>\n\n <div className=\"flex-1 overflow-y-auto\">{children}</div>\n\n {footer !== undefined ? (\n <footer className=\"flex shrink-0 items-center justify-between gap-3 border-t border-border/70 bg-background/80 px-5 py-3 text-xs text-muted-foreground backdrop-blur-md\">\n {footer}\n </footer>\n ) : null}\n </div>\n </div>\n );\n}\n","import { useEffect, useState } from 'react';\nimport { useCboxIdOptional } from '../context/cbox-id';\nimport { EmptyState } from '../primitives/empty-state';\nimport { StatusPill } from '../primitives/status-pill';\nimport { useTransport } from './surface-state';\nimport { SurfaceModal } from './surface-modal';\nimport type { Transport } from './types';\n\ntype InboxItem = {\n id: string;\n event_type: string;\n severity: 'info' | 'warning' | 'critical';\n data: Record<string, unknown> | null;\n subject_type: string | null;\n subject_id: string | null;\n created_at: string;\n read_at: string | null;\n};\n\ntype Inbox = {\n recipient: { external_id: string; display_name: string | null } | null;\n items: InboxItem[];\n unread_count: number;\n};\n\ntype Props = {\n open: boolean;\n onClose: () => void;\n};\n\nconst TONES: Record<\n InboxItem['severity'],\n 'info' | 'warning' | 'destructive'\n> = {\n info: 'info',\n warning: 'warning',\n critical: 'destructive',\n};\n\n/**\n * Full inbox modal — opened from the bell popover's \"See all\"\n * affordance. Renders inline over the host page so the user\n * never leaves their app context to read or manage notifications.\n *\n * Data flows:\n * - Initial load: GET /api/v1/recipients/{id_user_id}/inbox via\n * transport.getToken('notifications')\n * - Mark-read: POST /api/v1/recipients/{id}/notifications/{nid}/read\n * (optimistic; reverts on failure)\n * - Realtime hooks land in a follow-up session\n * (notifications.user.{id}.created topic)\n */\nexport function InboxSurface({ open, onClose }: Props) {\n const transport = useTransport();\n const cboxId = useCboxIdOptional();\n const [inbox, setInbox] = useState<Inbox | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [filter, setFilter] = useState<'all' | 'unread'>('all');\n\n const userId = cboxId?.user.id ?? null;\n const baseUrl = transport.urls.notifications ?? null;\n\n useEffect(() => {\n if (!open || userId === null || baseUrl === null) return;\n let cancelled = false;\n const load = async () => {\n setLoading(true);\n setError(null);\n try {\n const headers = await authHeaders(transport, 'notifications');\n const response = await fetch(\n `${baseUrl}/api/v1/recipients/${userId}/inbox?limit=100`,\n { headers, credentials: 'include' },\n );\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n const body = (await response.json()) as Inbox;\n if (!cancelled) setInbox(body);\n } catch (e) {\n if (!cancelled) {\n setError(e instanceof Error ? e.message : 'Load failed');\n }\n } finally {\n if (!cancelled) setLoading(false);\n }\n };\n void load();\n return () => {\n cancelled = true;\n };\n }, [open, userId, baseUrl, transport]);\n\n const markRead = async (id: string) => {\n if (inbox === null || userId === null || baseUrl === null) return;\n // Optimistic\n const prev = inbox;\n setInbox({\n ...inbox,\n items: inbox.items.map((it) =>\n it.id === id\n ? { ...it, read_at: new Date().toISOString() }\n : it,\n ),\n unread_count: Math.max(0, inbox.unread_count - 1),\n });\n try {\n const headers = await authHeaders(transport, 'notifications');\n const csrf = transport.csrfToken?.();\n if (csrf !== undefined && csrf !== '') {\n headers['X-CSRF-TOKEN'] = csrf;\n headers['X-Requested-With'] = 'XMLHttpRequest';\n }\n const response = await fetch(\n `${baseUrl}/api/v1/recipients/${userId}/notifications/${id}/read`,\n {\n method: 'POST',\n headers,\n credentials: 'include',\n },\n );\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n } catch {\n setInbox(prev);\n }\n };\n\n const items = inbox?.items ?? [];\n const filtered =\n filter === 'unread' ? items.filter((i) => i.read_at === null) : items;\n\n const unread = inbox?.unread_count ?? 0;\n\n return (\n <SurfaceModal\n open={open}\n onClose={onClose}\n eyebrow=\"Notifications\"\n title={\n unread > 0 ? `Inbox · ${unread} unread` : 'Inbox · all caught up'\n }\n headerActions={\n <div className=\"flex items-center gap-2\">\n <FilterTab\n active={filter === 'all'}\n onClick={() => setFilter('all')}\n >\n All\n </FilterTab>\n <FilterTab\n active={filter === 'unread'}\n onClick={() => setFilter('unread')}\n >\n Unread\n </FilterTab>\n </div>\n }\n footer={\n inbox !== null && baseUrl !== null ? (\n <>\n <span>\n Showing {filtered.length} of {items.length}.\n </span>\n <a\n href={`${baseUrl}/inbox`}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"font-medium text-foreground hover:underline\"\n >\n Open in new tab ↗\n </a>\n </>\n ) : (\n <span>—</span>\n )\n }\n >\n {error !== null ? (\n <div className=\"px-5 py-8 text-center\">\n <p className=\"text-sm font-medium text-destructive\">\n Couldn't load inbox\n </p>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n {error}\n </p>\n </div>\n ) : loading && inbox === null ? (\n <div className=\"px-5 py-12 text-center text-sm text-muted-foreground\">\n Loading…\n </div>\n ) : filtered.length === 0 ? (\n <div className=\"px-5 py-12\">\n <EmptyState\n title={\n filter === 'unread'\n ? 'No unread notifications'\n : 'No notifications yet'\n }\n description=\"When a Cbox app sends you something — invitation accepted, billing event, security alert — it lands here.\"\n />\n </div>\n ) : (\n <ul className=\"divide-y divide-border/70\">\n {filtered.map((item) => {\n const data = (item.data ?? {}) as Record<\n string,\n string | undefined\n >;\n const ctaUrl = data.cta_url;\n const InnerWrapper = ({\n children,\n }: {\n children: React.ReactNode;\n }) =>\n ctaUrl !== undefined && ctaUrl !== '' ? (\n <a\n href={ctaUrl}\n className=\"block transition-colors hover:bg-secondary/40\"\n >\n {children}\n </a>\n ) : (\n <div>{children}</div>\n );\n\n return (\n <li\n key={item.id}\n className={\n item.read_at === null\n ? 'bg-secondary/20'\n : ''\n }\n >\n <InnerWrapper>\n <div className=\"flex items-start gap-3 px-5 py-3\">\n <StatusPill\n tone={TONES[item.severity]}\n dot\n >\n {item.severity}\n </StatusPill>\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium text-foreground\">\n {data.title ??\n item.event_type}\n </p>\n {(data.body ?? '') !== '' ? (\n <p className=\"mt-0.5 line-clamp-2 text-xs text-muted-foreground\">\n {data.body}\n </p>\n ) : null}\n <p className=\"text-mono mt-1 text-[10px] text-muted-foreground\">\n {item.event_type}\n {' · '}\n {new Date(\n item.created_at,\n ).toLocaleString()}\n </p>\n </div>\n {item.read_at === null ? (\n <button\n type=\"button\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n void markRead(item.id);\n }}\n className=\"shrink-0 rounded-md border border-border bg-card px-2 py-1 text-xs font-medium text-foreground transition-colors hover:border-border-strong\"\n aria-label=\"Mark as read\"\n >\n Mark read\n </button>\n ) : null}\n </div>\n </InnerWrapper>\n </li>\n );\n })}\n </ul>\n )}\n </SurfaceModal>\n );\n}\n\n/**\n * Build request headers for a transport call. If the host's\n * `getToken` returns a non-empty bearer, it's attached. If it\n * returns an empty string, the surface assumes same-origin cookie\n * auth — the host is proxying the request through its own session.\n *\n * Either model is supported because hosts pick their security\n * trade-off: same-origin proxy keeps M2M tokens server-side; direct\n * CORS to notifications.cbox.systems is faster but exposes the\n * audience-bound bearer to the page.\n */\nasync function authHeaders(\n transport: Transport,\n audience: string,\n): Promise<Record<string, string>> {\n const headers: Record<string, string> = {\n Accept: 'application/json',\n };\n try {\n const { token } = await transport.getToken(audience);\n if (token !== '') {\n headers.Authorization = `Bearer ${token}`;\n }\n } catch {\n // Empty token / failure → fall back to cookie auth.\n }\n return headers;\n}\n\nfunction FilterTab({\n active,\n onClick,\n children,\n}: {\n active: boolean;\n onClick: () => void;\n children: React.ReactNode;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={\n active\n ? 'rounded-md bg-secondary px-2 py-1 text-xs font-medium text-foreground'\n : 'rounded-md px-2 py-1 text-xs font-medium text-muted-foreground hover:bg-secondary/60 hover:text-foreground'\n }\n aria-pressed={active}\n >\n {children}\n </button>\n );\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useState,\n type ReactNode,\n} from 'react';\nimport { InboxSurface } from './inbox-surface';\nimport type {\n CboxSurfacesProps,\n SurfaceArgs,\n SurfaceController,\n SurfaceId,\n Transport,\n} from './types';\n\nconst TransportContext = createContext<Transport | null>(null);\nconst SurfaceContext = createContext<SurfaceController | null>(null);\n\n/**\n * Mount the cbox-ui surface runtime once per app, alongside the\n * page tree. The host's chrome (bell, search trigger) reads\n * `useCboxSurfaces()` to open surfaces; cbox-ui renders the\n * active one as a modal/drawer over the page.\n *\n * Exactly one CboxSurfaces should be in the tree — typically right\n * inside CboxAppShell. Multiple instances would race their state\n * machines.\n */\nexport function CboxSurfaces({\n transport,\n surfaces,\n config,\n children,\n}: CboxSurfacesProps) {\n void config; // reserved for per-surface customisation; unused in v1\n const enabled = useMemo(() => new Set(surfaces), [surfaces]);\n const [active, setActive] = useState<{\n id: SurfaceId;\n args?: SurfaceArgs[SurfaceId];\n } | null>(null);\n\n const open = useCallback(\n <K extends SurfaceId>(id: K, args?: SurfaceArgs[K]) => {\n if (!enabled.has(id)) {\n console.warn(\n `[cbox-ui] surface \"${id}\" is not enabled in this host. Add it to <CboxSurfaces surfaces={[…]}>.`,\n );\n return;\n }\n setActive({ id, args });\n },\n [enabled],\n );\n\n const close = useCallback(() => setActive(null), []);\n\n const controller = useMemo<SurfaceController>(\n () => ({\n activeSurface: active?.id ?? null,\n open,\n close,\n }),\n [active, open, close],\n );\n\n return (\n <TransportContext.Provider value={transport}>\n <SurfaceContext.Provider value={controller}>\n {children}\n\n {/*\n * Active surface renders as a sibling of the page\n * tree. Each surface owns its own portal-style fixed\n * positioning so it escapes any positioned ancestor.\n * Only one surface is mounted at a time.\n */}\n <InboxSurface\n open={active?.id === 'inbox'}\n onClose={close}\n />\n {/* Search / activity / help surfaces will render here\n * as additional `<Surface open={…} onClose={…} />`\n * lines once shipped. They're additive — adding a\n * new surface doesn't change anything in hosts. */}\n </SurfaceContext.Provider>\n </TransportContext.Provider>\n );\n}\n\n/**\n * Imperative API for triggering surfaces from anywhere in the\n * host page. The bell-popover's \"See all\" calls\n * `useCboxSurfaces().open('inbox')` instead of navigating.\n */\nexport function useCboxSurfaces(): SurfaceController {\n const ctx = useContext(SurfaceContext);\n if (ctx === null) {\n throw new Error(\n '[cbox-ui] useCboxSurfaces must be used inside <CboxSurfaces>. Did the host forget to mount it?',\n );\n }\n return ctx;\n}\n\n/**\n * Optional variant — returns `null` when no `<CboxSurfaces>` host is\n * mounted. Chrome controls (bell, search trigger) use this to\n * degrade gracefully to cross-app navigation when the host hasn't\n * opted into the surface runtime yet.\n */\nexport function useCboxSurfacesOptional(): SurfaceController | null {\n return useContext(SurfaceContext);\n}\n\n/**\n * Read-only access to the host-supplied transport. Internal —\n * surface implementations call this; host code shouldn't need it.\n */\nexport function useTransport(): Transport {\n const t = useContext(TransportContext);\n if (t === null) {\n throw new Error(\n '[cbox-ui] useTransport must be used inside <CboxSurfaces>.',\n );\n }\n return t;\n}\n","import { useEffect, useRef, useState, type ReactNode } from 'react';\nimport { useCboxIdOptional } from '../context/cbox-id';\nimport type { CboxNotificationPreviewItem } from '../context/cbox-id';\nimport { useCboxSurfacesOptional } from '../surfaces/surface-state';\nimport { cn } from '../utils/cn';\n\n/**\n * Bell with unread-count badge + popover preview. Click opens a\n * dropdown with the last 5 items inline (no navigation), each with\n * an inline mark-read action and an optional deep-link to the page\n * that originated the notification. \"See all\" at the bottom links\n * to the central notifications service inbox — the only navigation\n * away from the host app.\n *\n * Pattern matches Linear / GitHub / Stripe: glance + mark-read\n * without leaving context; cross-app jump only when the user\n * explicitly wants the full list.\n *\n * Renders nothing if the context is missing or notifications\n * aren't configured (eg pre-auth pages).\n */\nexport function NotificationsBell({ className }: { className?: string }) {\n const ctx = useCboxIdOptional();\n const surfaces = useCboxSurfacesOptional();\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement | null>(null);\n\n useEffect(() => {\n if (!open) return;\n const onDocClick = (e: MouseEvent) => {\n const target = e.target;\n if (\n target instanceof Node &&\n ref.current !== null &&\n !ref.current.contains(target)\n ) {\n setOpen(false);\n }\n };\n const onEsc = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setOpen(false);\n };\n document.addEventListener('mousedown', onDocClick);\n document.addEventListener('keydown', onEsc);\n return () => {\n document.removeEventListener('mousedown', onDocClick);\n document.removeEventListener('keydown', onEsc);\n };\n }, [open]);\n\n // Render the bell even when notifications aren't wired up (null/undefined)\n // so the chrome is visually identical across all apps. The button is\n // inert (no popover opens) when there's no data.\n const notificationsData = ctx === null ? null : (ctx.notifications ?? null);\n\n if (ctx === null) {\n return null;\n }\n\n // Render a static bell icon when there's no notifications data yet.\n if (notificationsData === null) {\n return (\n <div className={cn('relative', className)}>\n <button\n type=\"button\"\n aria-label=\"Notifications\"\n disabled\n className=\"relative flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground opacity-60 cursor-default\"\n >\n <Bell />\n </button>\n </div>\n );\n }\n\n const { unreadCount, inboxUrl, previewItems, markReadUrl } =\n notificationsData;\n const display = unreadCount > 99 ? '99+' : unreadCount.toString();\n\n return (\n <div ref={ref} className={cn('relative', className)}>\n <button\n type=\"button\"\n onClick={() => setOpen((v) => !v)}\n aria-label={\n unreadCount > 0\n ? `${unreadCount} unread notifications`\n : 'Notifications'\n }\n aria-expanded={open}\n aria-haspopup=\"menu\"\n className=\"relative flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-secondary hover:text-foreground data-[open=true]:bg-secondary data-[open=true]:text-foreground\"\n data-open={open ? 'true' : 'false'}\n >\n <Bell />\n {unreadCount > 0 ? (\n <span className=\"absolute -right-0.5 -top-0.5 flex min-w-[16px] items-center justify-center rounded-full bg-destructive px-1 text-[9px] font-semibold leading-4 text-destructive-foreground\">\n {display}\n </span>\n ) : null}\n </button>\n\n {open ? (\n <div\n role=\"menu\"\n className=\"absolute right-0 z-30 mt-2 w-[360px] origin-top-right rounded-md border border-border bg-popover text-popover-foreground shadow-lg\"\n >\n <header className=\"flex items-center justify-between border-b border-border/70 px-3 py-2\">\n <span className=\"text-mono text-[10px] font-semibold tracking-[0.18em] uppercase text-muted-foreground\">\n Notifications\n </span>\n {unreadCount > 0 ? (\n <span className=\"text-mono text-[10px] tabular-nums text-muted-foreground\">\n {unreadCount} unread\n </span>\n ) : null}\n </header>\n\n <div className=\"max-h-[420px] overflow-y-auto\">\n {previewItems === undefined ||\n previewItems.length === 0 ? (\n <div className=\"px-3 py-8 text-center\">\n <p className=\"text-sm font-medium text-foreground\">\n All caught up\n </p>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n No recent notifications.\n </p>\n </div>\n ) : (\n <ul className=\"divide-y divide-border/70\">\n {previewItems.map((item) => (\n <PreviewRow\n key={item.id}\n item={item}\n markReadUrl={markReadUrl}\n onMarkedRead={() => setOpen(false)}\n />\n ))}\n </ul>\n )}\n </div>\n\n {surfaces !== null ? (\n <button\n type=\"button\"\n onClick={() => {\n setOpen(false);\n surfaces.open('inbox');\n }}\n className=\"flex w-full items-center justify-center border-t border-border/70 px-3 py-2 text-xs font-medium text-foreground transition-colors hover:bg-secondary\"\n >\n See all notifications →\n </button>\n ) : (\n <a\n href={inboxUrl}\n className=\"flex items-center justify-center border-t border-border/70 px-3 py-2 text-xs font-medium text-foreground transition-colors hover:bg-secondary\"\n >\n See all notifications →\n </a>\n )}\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction PreviewRow({\n item,\n markReadUrl,\n onMarkedRead,\n}: {\n item: CboxNotificationPreviewItem;\n markReadUrl?: string;\n onMarkedRead: () => void;\n}) {\n const tone =\n item.severity === 'critical'\n ? 'bg-destructive'\n : item.severity === 'warning'\n ? 'bg-warning'\n : 'bg-info';\n\n const ts = (() => {\n try {\n return new Date(item.createdAt).toLocaleString();\n } catch {\n return item.createdAt;\n }\n })();\n\n const markRead = async (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (markReadUrl === undefined || markReadUrl === '') return;\n const url = markReadUrl.replace('{id}', item.id);\n const csrf =\n document\n .querySelector<HTMLMetaElement>('meta[name=\"csrf-token\"]')\n ?.content ?? '';\n try {\n await fetch(url, {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n 'X-CSRF-TOKEN': csrf,\n 'X-Requested-With': 'XMLHttpRequest',\n },\n });\n } catch {\n // Non-fatal — the user can re-open the dropdown.\n }\n onMarkedRead();\n };\n\n const Wrapper = ({ children }: { children: ReactNode }) =>\n item.ctaUrl !== null && item.ctaUrl !== undefined && item.ctaUrl !== ''\n ? (\n <a\n href={item.ctaUrl}\n className=\"block transition-colors hover:bg-secondary/50\"\n >\n {children}\n </a>\n )\n : <div>{children}</div>;\n\n return (\n <li className={item.readAt === null ? 'bg-secondary/20' : ''}>\n <Wrapper>\n <div className=\"flex items-start gap-2 px-3 py-2.5\">\n <span\n aria-hidden\n className={cn(\n 'mt-1.5 h-1.5 w-1.5 shrink-0 rounded-full',\n tone,\n )}\n />\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-[13px] font-medium text-foreground\">\n {item.title}\n </p>\n {item.body !== undefined && item.body !== null && item.body !== '' ? (\n <p className=\"mt-0.5 line-clamp-2 text-xs text-muted-foreground\">\n {item.body}\n </p>\n ) : null}\n <p className=\"text-mono mt-1 text-[10px] text-muted-foreground\">\n {ts}\n </p>\n </div>\n {item.readAt === null ? (\n <button\n type=\"button\"\n onClick={markRead}\n className=\"shrink-0 rounded-md px-2 py-1 text-[10px] font-medium text-muted-foreground transition-colors hover:bg-secondary hover:text-foreground\"\n aria-label=\"Mark as read\"\n title=\"Mark as read\"\n >\n ✓\n </button>\n ) : null}\n </div>\n </Wrapper>\n </li>\n );\n}\n\nfunction Bell(): ReactNode {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n aria-hidden\n >\n <path\n d=\"M4 6.5a4 4 0 1 1 8 0v2.4l1.2 2H2.8l1.2-2V6.5z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M6.5 12.5a1.5 1.5 0 0 0 3 0\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n","import { useEffect, useState } from 'react';\nimport { cn } from '../utils/cn';\n\ntype Props = {\n /** Click handler — typically dispatches the app's command-palette\n * open shortcut. Apps that don't have a palette yet pass a no-op\n * so the chrome stays visually consistent across the suite. */\n onOpen?: () => void;\n className?: string;\n label?: string;\n};\n\n/**\n * Topbar Search trigger — a visual-only command-palette button.\n *\n * Hosted in cbox-ui because every Cbox app's chrome must show the\n * same search affordance in the same spot, with the same width and\n * the same shortcut hint. Drift across apps means users see layout\n * shifts when tabbing between id / webhooks / cortex; that's a UX\n * tax we don't want to charge them.\n *\n * The actual palette stays per-app (commands differ); this primitive\n * just renders the trigger and dispatches `onOpen`.\n */\nexport function SearchTrigger({ onOpen, className, label = 'Search' }: Props) {\n const [shortcut, setShortcut] = useState('⌘K');\n useEffect(() => {\n if (typeof navigator === 'undefined') return;\n setShortcut(/Mac/.test(navigator.platform) ? '⌘K' : 'Ctrl K');\n }, []);\n\n return (\n <button\n type=\"button\"\n onClick={onOpen}\n className={cn(\n 'hidden h-8 w-[180px] items-center gap-2 rounded-md border border-border bg-card pr-1.5 pl-2.5 text-xs text-muted-foreground transition-colors hover:border-border-strong hover:text-foreground sm:inline-flex',\n className,\n )}\n aria-label=\"Open command palette\"\n >\n <SearchIcon />\n <span className=\"flex-1 text-left\">{label}</span>\n <kbd className=\"text-mono ml-1 rounded-sm border border-border bg-secondary px-1 py-0.5 text-[10px] font-medium tracking-tight text-muted-foreground\">\n {shortcut}\n </kbd>\n </button>\n );\n}\n\nfunction SearchIcon() {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n >\n <circle cx=\"11\" cy=\"11\" r=\"7\" />\n <path d=\"m21 21-4.3-4.3\" />\n </svg>\n );\n}\n","import { useState, type ReactNode } from 'react';\nimport { useCboxId } from '../context/cbox-id';\nimport { cn } from '../utils/cn';\n\ntype Props = {\n /**\n * App-specific menu items rendered above the standard\n * \"Manage account\" / \"Sign out\" set. Use sparingly — the goal\n * is consistency across apps.\n */\n extras?: ReactNode;\n className?: string;\n};\n\n/**\n * User-menu dropdown. Always exposes:\n * - Manage account ↗ (deep-link into id)\n * - Team & billing ↗ (deep-link into id, current org scope)\n * - Sign out\n *\n * The arrows signal cross-app navigation — id is canonical.\n */\nexport function UserMenu({ extras, className }: Props) {\n const { user, currentOrganization, urls } = useCboxId();\n const [open, setOpen] = useState(false);\n\n const initials = user.name\n .split(/\\s+/)\n .filter(Boolean)\n .slice(0, 2)\n .map((n) => n[0]?.toUpperCase() ?? '')\n .join('');\n\n return (\n <div className={cn('relative', className)}>\n <button\n type=\"button\"\n onClick={() => setOpen((v) => !v)}\n className=\"flex h-9 items-center gap-2 rounded-md px-1.5 hover:bg-secondary\"\n aria-label=\"Open user menu\"\n >\n {user.avatar_url ? (\n <img\n src={user.avatar_url}\n alt=\"\"\n className=\"h-7 w-7 rounded-full object-cover\"\n />\n ) : (\n <span className=\"flex h-7 w-7 items-center justify-center rounded-full bg-accent-soft text-[11px] font-semibold text-foreground\">\n {initials || '?'}\n </span>\n )}\n </button>\n {open ? (\n <div className=\"absolute right-0 top-full z-50 mt-1 w-64 rounded-md border border-border bg-popover p-1 shadow-md\">\n <div className=\"px-2 py-2\">\n <p className=\"truncate text-sm font-medium text-foreground\">\n {user.name}\n </p>\n <p className=\"truncate text-xs text-muted-foreground\">\n {user.email}\n </p>\n </div>\n {extras ? (\n <>\n <div className=\"my-1 border-t border-border\" />\n {extras}\n </>\n ) : null}\n <div className=\"my-1 border-t border-border\" />\n <a\n href={urls.accountUrl}\n className=\"flex items-center justify-between rounded-sm px-2 py-1.5 text-sm hover:bg-secondary\"\n >\n <span>Manage account</span>\n <CrossAppArrow />\n </a>\n {urls.orgSettingsUrl && currentOrganization ? (\n <a\n href={urls.orgSettingsUrl}\n className=\"flex items-center justify-between rounded-sm px-2 py-1.5 text-sm hover:bg-secondary\"\n >\n <span className=\"truncate\">\n Team & billing\n <span className=\"text-muted-foreground\"> · {currentOrganization.name}</span>\n </span>\n <CrossAppArrow />\n </a>\n ) : null}\n <div className=\"my-1 border-t border-border\" />\n <form action={urls.signOutUrl} method=\"POST\">\n <SignOutCsrf />\n <button\n type=\"submit\"\n className=\"flex w-full items-center rounded-sm px-2 py-1.5 text-left text-sm hover:bg-secondary\"\n >\n Sign out\n </button>\n </form>\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction CrossAppArrow(): ReactNode {\n return (\n <svg\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 10 10\"\n fill=\"none\"\n aria-hidden\n >\n <path\n d=\"M3 7l4-4M3 3h4v4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction SignOutCsrf(): ReactNode {\n if (typeof document === 'undefined') return null;\n const csrf = document\n .querySelector<HTMLMetaElement>('meta[name=\"csrf-token\"]')\n ?.content;\n if (!csrf) return null;\n return <input type=\"hidden\" name=\"_token\" value={csrf} />;\n}\n","import { Menu, PanelLeftClose, PanelLeftOpen } from 'lucide-react';\nimport { useEffect, useState, type ReactNode } from 'react';\nimport { AppContent } from './app-content';\nimport { AppShell } from './app-shell';\nimport {\n CboxAppSidebar,\n type CboxNavSection,\n type LinkComponent,\n} from './cbox-app-sidebar';\nimport { CboxMobileNavDrawer } from './cbox-mobile-nav-drawer';\nimport { AppSwitcher } from '../components/app-switcher';\nimport { NotificationsBell } from '../components/notifications-bell';\nimport { SearchTrigger } from '../components/search-trigger';\nimport { UserMenu } from '../components/user-menu';\n\nexport type CboxAppShellProps = {\n /** App key — drives the brand submark + aria labels. */\n appKey: string;\n /** Override the submark text (defaults to appKey). */\n brandSubmark?: string | null;\n /** Asset base for brand pngs. Default `/brand`. */\n assetBase?: string;\n /** Brand row href (typically the app's home). */\n brandHref?: string;\n\n /** Sidebar nav config. */\n sections: CboxNavSection[];\n /** Active path — used by both sidebar (highlight) and topbar\n * (sidebar-collapse toggle aria state). */\n currentPath: string;\n /** Apps inject their router's Link primitive. */\n LinkComponent: LinkComponent;\n\n /** Persisted \"sidebar collapsed?\" state — owned by the host\n * (the cookie hook lives there). */\n sidebarCollapsed?: boolean;\n /** Click handler for the topbar collapse toggle. Hide the\n * toggle entirely by omitting this prop. */\n onToggleSidebar?: () => void;\n\n /**\n * Topbar centre slot — typically the org switcher / context\n * bar. Apps that aren't org-scoped (notifications, account\n * pages) leave this off.\n */\n topbarCentre?: ReactNode;\n\n /**\n * Handler to open the in-app command palette / search UI.\n * Always rendered — when omitted the trigger is a no-op so the\n * chrome stays visually identical across all apps regardless of\n * whether a palette has been wired up yet.\n */\n onSearchOpen?: () => void;\n\n /**\n * Override the right cluster on the topbar. Default:\n * `[<SearchTrigger>?] <AppLauncher /> <NotificationsBell /> <UserMenu />`.\n * Override only when an app needs a completely different mix.\n */\n topbarRightCluster?: ReactNode;\n\n children: ReactNode;\n};\n\n/**\n * Top-level Cbox application shell. Composes sidebar + topbar +\n * content into the single chrome shape every Cbox app wears.\n *\n * Apps reduce to ~30 lines of layout: define nav, render\n * `<CboxAppShell>{children}</CboxAppShell>`. No app should\n * compose `<AppShell>`/`<AppContent>`/sidebar/topbar manually —\n * drift is the whole reason this component exists.\n */\nexport function CboxAppShell({\n appKey,\n brandSubmark,\n assetBase,\n brandHref,\n sections,\n currentPath,\n LinkComponent,\n sidebarCollapsed = false,\n onToggleSidebar,\n topbarCentre,\n onSearchOpen,\n topbarRightCluster,\n children,\n}: CboxAppShellProps) {\n const ToggleIcon = sidebarCollapsed ? PanelLeftOpen : PanelLeftClose;\n const [mobileNavOpen, setMobileNavOpen] = useState(false);\n\n // Auto-close the mobile drawer on route change so the in-app\n // navigation feels native — apps don't need to wire this.\n useEffect(() => {\n setMobileNavOpen(false);\n }, [currentPath]);\n\n return (\n <AppShell>\n <CboxAppSidebar\n appKey={appKey}\n brandSubmark={brandSubmark}\n assetBase={assetBase}\n brandHref={brandHref}\n sections={sections}\n currentPath={currentPath}\n LinkComponent={LinkComponent}\n collapsed={sidebarCollapsed}\n />\n <CboxMobileNavDrawer\n open={mobileNavOpen}\n onClose={() => setMobileNavOpen(false)}\n appKey={appKey}\n brandSubmark={brandSubmark}\n assetBase={assetBase}\n brandHref={brandHref}\n sections={sections}\n currentPath={currentPath}\n LinkComponent={LinkComponent}\n />\n <AppContent>\n <header className=\"sticky top-0 z-20 flex h-14 shrink-0 items-center justify-between gap-3 border-b border-border/70 bg-background/80 px-4 backdrop-blur-md\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <button\n type=\"button\"\n onClick={() => setMobileNavOpen(true)}\n className=\"inline-flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-secondary hover:text-foreground lg:hidden\"\n aria-label=\"Open navigation\"\n title=\"Open navigation\"\n >\n <Menu className=\"h-4 w-4\" strokeWidth={1.8} />\n </button>\n {onToggleSidebar !== undefined ? (\n <button\n type=\"button\"\n onClick={onToggleSidebar}\n className=\"hidden h-8 w-8 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-secondary hover:text-foreground lg:inline-flex\"\n aria-label={\n sidebarCollapsed\n ? 'Expand sidebar'\n : 'Collapse sidebar'\n }\n title={\n sidebarCollapsed\n ? 'Expand sidebar'\n : 'Collapse sidebar'\n }\n >\n <ToggleIcon\n className=\"h-4 w-4\"\n strokeWidth={1.8}\n />\n </button>\n ) : null}\n <AppSwitcher />\n {topbarCentre !== undefined ? topbarCentre : null}\n </div>\n <div className=\"flex shrink-0 items-center gap-2\">\n {topbarRightCluster !== undefined ? (\n topbarRightCluster\n ) : (\n <>\n <SearchTrigger onOpen={onSearchOpen ?? (() => {})} />\n <NotificationsBell />\n <UserMenu />\n </>\n )}\n </div>\n </header>\n {children}\n </AppContent>\n </AppShell>\n );\n}\n","import {\n useEffect,\n useId,\n useRef,\n useState,\n type ComponentType,\n type ReactNode,\n} from 'react';\nimport { cn } from '../utils/cn';\n\n/**\n * ContextBar — the topbar breadcrumb-style context selector. One\n * crumb per level of context (org / project / environment / branch /\n * deployment). Each crumb renders as a chip (avatar + label +\n * chevron) and opens a dropdown with the items at that level plus\n * an optional \"+ New X\" footer.\n *\n * The pattern is the cloud-platform default — Vercel, Render, Forge,\n * GitHub, Stripe, Cortex all use it. Topbar carries identity and\n * context; sidebar carries navigation. The two never overlap.\n *\n * URL-driven by default — clicking a dropdown item navigates via the\n * supplied `LinkComponent`. Apps that need a non-navigational select\n * (post a form, mutate session state) pass `onSelect` instead.\n *\n * Separator between crumbs is a muted slash — same as Forge / Cortex.\n */\n\nexport type ContextAvatar = {\n /** 1–2 character monogram. Defaults to first letter of the label. */\n initials?: string;\n /**\n * Hex / CSS colour applied as the avatar's bg. Falls back to the\n * neutral chip when missing. Per-item override of the default.\n */\n accent?: string;\n /** Optional avatar image URL — overrides initials when set. */\n src?: string;\n};\n\nexport type ContextItem = {\n /** Stable identity for the item (slug, id). */\n id: string;\n /** Primary display label. */\n label: string;\n /** Optional secondary line — slug, role, env name. Mono-tracked. */\n secondary?: string;\n /** Avatar specification. Same shape as the crumb's own avatar. */\n avatar?: ContextAvatar;\n /** Navigation target — clicking the item navigates here. */\n href?: string;\n /** Mark the item as the active selection (gets a check on the right). */\n current?: boolean;\n /**\n * Optional href to a settings page for this item. When set, a\n * cogwheel button appears on the right of the row on hover/focus\n * — clicking it navigates straight to settings without going\n * through the item's normal selection. Cortex-style shortcut.\n */\n settingsHref?: string;\n /**\n * Aria-label for the optional settings cogwheel. Defaults to\n * `Settings for <label>`. Override when the label alone isn't\n * enough context (eg multiple items with the same name).\n */\n settingsAriaLabel?: string;\n};\n\nexport type ContextCrumb = {\n /** Stable identity for the crumb (used as React key). */\n id: string;\n /** The chip's visible label — typically the active item's name. */\n label: string;\n /** The chip's avatar — typically the active item's avatar. */\n avatar?: ContextAvatar;\n /** Items shown in the dropdown. Empty array = chip with no menu. */\n items: ContextItem[];\n /**\n * Optional footer link below the items — typically \"+ New X\" or\n * \"Manage Y\". Renders with a + icon and an accent text colour.\n */\n footerLink?: {\n label: string;\n href: string;\n };\n /**\n * Override per-item navigation. When set, item clicks call this\n * with the item's id instead of navigating to `item.href`. Useful\n * for posting a form (eg an org switcher that POSTs to a server-side\n * endpoint).\n */\n onSelect?: (itemId: string) => void;\n /** Optional aria-label for the chip's button (defaults to \"Switch <label>\"). */\n ariaLabel?: string;\n};\n\ntype LinkComp = ComponentType<{\n href: string;\n prefetch?: boolean;\n className?: string;\n children: ReactNode;\n}>;\n\ntype Props = {\n crumbs: ContextCrumb[];\n /**\n * The framework's link component. Inertia consumers pass the\n * Inertia Link; TanStack Router consumers pass their typed Link.\n * Plain `<a>` is the fallback.\n */\n LinkComponent?: LinkComp;\n className?: string;\n};\n\nconst DefaultLink: LinkComp = ({ href, className, children }) => (\n <a href={href} className={className}>\n {children}\n </a>\n);\n\nexport function ContextBar({\n crumbs,\n LinkComponent = DefaultLink,\n className,\n}: Props) {\n if (crumbs.length === 0) {\n return null;\n }\n\n return (\n <nav\n data-component=\"context-bar\"\n aria-label=\"Context\"\n // No `overflow-x-auto` on the nav — it would clip the\n // dropdown panel that opens below each chip. If we need\n // horizontal scroll for 5+ crumbs later (cortex with\n // org/project/env/branch/region), the dropdown moves to a\n // portal so the nav can clip without affecting popovers.\n className={cn('flex min-w-0 items-center gap-1', className)}\n >\n {crumbs.map((crumb, index) => (\n <div\n key={crumb.id}\n className=\"flex min-w-0 items-center gap-1\"\n >\n {index > 0 ? <Separator /> : null}\n <ContextCrumbChip\n crumb={crumb}\n LinkComponent={LinkComponent}\n />\n </div>\n ))}\n </nav>\n );\n}\n\nfunction Separator() {\n return (\n <span\n aria-hidden\n className=\"text-mono shrink-0 text-[14px] font-light text-muted-foreground/50 select-none\"\n >\n /\n </span>\n );\n}\n\nfunction ContextCrumbChip({\n crumb,\n LinkComponent,\n}: {\n crumb: ContextCrumb;\n LinkComponent: LinkComp;\n}) {\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement | null>(null);\n const listId = useId();\n\n // Click-outside + Escape close.\n useEffect(() => {\n if (! open) return;\n\n function onPointerDown(event: PointerEvent): void {\n if (\n ref.current !== null &&\n ! ref.current.contains(event.target as Node)\n ) {\n setOpen(false);\n }\n }\n\n function onKey(event: KeyboardEvent): void {\n if (event.key === 'Escape') setOpen(false);\n }\n\n window.addEventListener('pointerdown', onPointerDown);\n window.addEventListener('keydown', onKey);\n\n return () => {\n window.removeEventListener('pointerdown', onPointerDown);\n window.removeEventListener('keydown', onKey);\n };\n }, [open]);\n\n const hasMenu = crumb.items.length > 0 || crumb.footerLink !== undefined;\n\n return (\n <div ref={ref} className=\"relative\">\n <button\n type=\"button\"\n onClick={() => setOpen((v) => ! v)}\n aria-expanded={hasMenu ? open : undefined}\n aria-haspopup={hasMenu ? 'listbox' : undefined}\n aria-controls={hasMenu ? listId : undefined}\n aria-label={crumb.ariaLabel ?? `Switch ${crumb.label}`}\n disabled={! hasMenu}\n className={cn(\n 'flex h-8 min-w-0 items-center gap-2 rounded-md border border-transparent px-2 text-[13px] text-foreground transition-colors',\n hasMenu &&\n 'hover:border-border hover:bg-secondary/60 focus-visible:ring-2 focus-visible:ring-ring focus-visible:outline-none',\n open && 'border-border bg-secondary/60',\n )}\n >\n {crumb.avatar !== undefined ? (\n <ContextAvatarChip\n avatar={crumb.avatar}\n fallbackLabel={crumb.label}\n size=\"sm\"\n />\n ) : null}\n <span className=\"truncate font-medium\">{crumb.label}</span>\n {hasMenu ? <Chevron open={open} /> : null}\n </button>\n\n {open && hasMenu ? (\n <div\n id={listId}\n role=\"listbox\"\n aria-label={crumb.ariaLabel ?? crumb.label}\n className=\"absolute left-0 top-full z-30 mt-1 w-64 overflow-hidden rounded-md border border-border bg-popover shadow-lg\"\n >\n {crumb.items.length > 0 ? (\n <ul className=\"max-h-72 overflow-y-auto py-1\">\n {crumb.items.map((item) => (\n <ContextItemRow\n key={item.id}\n item={item}\n onSelect={crumb.onSelect}\n LinkComponent={LinkComponent}\n onAfterClick={() => setOpen(false)}\n />\n ))}\n </ul>\n ) : null}\n\n {crumb.footerLink !== undefined ? (\n <>\n {crumb.items.length > 0 ? (\n <div className=\"border-t border-border/60\" />\n ) : null}\n <div\n // Close the dropdown when the footer\n // link is clicked. SPA navigations\n // don't unmount this menu (it's a\n // sibling subtree), so without this\n // the dropdown stays open on the next\n // page.\n onClickCapture={() => setOpen(false)}\n >\n <LinkComponent\n href={crumb.footerLink.href}\n prefetch\n className=\"flex items-center gap-2 px-3 py-2.5 text-[13px] font-medium text-info transition-colors hover:bg-info-soft\"\n >\n <Plus />\n <span>{crumb.footerLink.label}</span>\n </LinkComponent>\n </div>\n </>\n ) : null}\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction ContextItemRow({\n item,\n onSelect,\n LinkComponent,\n onAfterClick,\n}: {\n item: ContextItem;\n onSelect: ContextCrumb['onSelect'];\n LinkComponent: LinkComp;\n onAfterClick: () => void;\n}) {\n const body = (\n <div className=\"flex w-full min-w-0 items-center gap-2.5 px-2.5 py-2\">\n {item.avatar !== undefined ? (\n <ContextAvatarChip\n avatar={item.avatar}\n fallbackLabel={item.label}\n size=\"md\"\n />\n ) : null}\n <div className=\"flex min-w-0 flex-1 flex-col leading-tight\">\n <span className=\"truncate text-[13px] font-medium text-foreground\">\n {item.label}\n </span>\n {item.secondary !== undefined ? (\n <span className=\"text-mono truncate text-[10px] text-muted-foreground\">\n {item.secondary}\n </span>\n ) : null}\n </div>\n {item.current === true && item.settingsHref === undefined ? (\n <Check />\n ) : null}\n </div>\n );\n\n const baseClassName = cn(\n 'group/item block w-full rounded-sm transition-colors',\n item.current === true\n ? 'bg-accent-soft hover:bg-accent-soft/80'\n : 'hover:bg-secondary',\n );\n\n // The settings cogwheel sits at the right of the row. It's a\n // separate Link / button — clicking it should NOT trigger the\n // item's main selection. We render it as a sibling of the body\n // and stop click propagation on the cogwheel itself.\n const settingsCog =\n item.settingsHref !== undefined ? (\n <LinkComponent\n href={item.settingsHref}\n prefetch\n className=\"invisible absolute right-1 top-1/2 inline-flex h-7 w-7 -translate-y-1/2 items-center justify-center rounded-sm text-muted-foreground transition-colors group-hover/item:visible hover:bg-card hover:text-foreground focus-visible:visible focus-visible:bg-card focus-visible:text-foreground focus-visible:outline-none\"\n >\n <span\n aria-label={\n item.settingsAriaLabel ?? `Settings for ${item.label}`\n }\n onClickCapture={(event) => {\n event.stopPropagation();\n onAfterClick();\n }}\n className=\"contents\"\n >\n <SettingsIcon />\n </span>\n </LinkComponent>\n ) : null;\n\n if (onSelect !== undefined) {\n return (\n <li className=\"relative\">\n <button\n type=\"button\"\n onClick={() => {\n onSelect(item.id);\n onAfterClick();\n }}\n className={cn(baseClassName, 'text-left')}\n >\n {body}\n </button>\n {settingsCog}\n </li>\n );\n }\n\n if (item.href !== undefined) {\n return (\n <li className=\"relative\">\n <LinkComponent\n href={item.href}\n prefetch\n className={baseClassName}\n >\n {body}\n </LinkComponent>\n {settingsCog}\n </li>\n );\n }\n\n return (\n <li className=\"relative\">\n <div className={baseClassName}>{body}</div>\n {settingsCog}\n </li>\n );\n}\n\nfunction SettingsIcon() {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n >\n <circle cx=\"7\" cy=\"7\" r=\"2\" />\n <path d=\"M11.66 8.42a.79.79 0 0 0 .16.86l.03.03a.96.96 0 1 1-1.36 1.36l-.03-.03a.79.79 0 0 0-.86-.16.79.79 0 0 0-.48.72v.08a.96.96 0 1 1-1.92 0v-.04a.79.79 0 0 0-.52-.72.79.79 0 0 0-.86.16l-.03.03a.96.96 0 1 1-1.36-1.36l.03-.03a.79.79 0 0 0 .16-.86.79.79 0 0 0-.72-.48h-.08a.96.96 0 1 1 0-1.92h.04a.79.79 0 0 0 .72-.52.79.79 0 0 0-.16-.86l-.03-.03a.96.96 0 1 1 1.36-1.36l.03.03a.79.79 0 0 0 .86.16h.04a.79.79 0 0 0 .48-.72v-.08a.96.96 0 1 1 1.92 0v.04a.79.79 0 0 0 .48.72.79.79 0 0 0 .86-.16l.03-.03a.96.96 0 1 1 1.36 1.36l-.03.03a.79.79 0 0 0-.16.86v.04a.79.79 0 0 0 .72.48h.08a.96.96 0 1 1 0 1.92h-.04a.79.79 0 0 0-.72.48Z\" />\n </svg>\n );\n}\n\nexport function ContextAvatarChip({\n avatar,\n fallbackLabel,\n size = 'md',\n}: {\n avatar: ContextAvatar;\n fallbackLabel: string;\n size?: 'sm' | 'md';\n}) {\n const initials =\n avatar.initials ?? deriveInitials(fallbackLabel);\n const sizeClass =\n size === 'sm' ? 'h-5 w-5 text-[9px]' : 'h-7 w-7 text-[11px]';\n const style =\n avatar.src === undefined && avatar.accent !== undefined\n ? {\n backgroundColor: avatar.accent,\n color: '#fff',\n }\n : undefined;\n\n if (avatar.src !== undefined) {\n return (\n <img\n src={avatar.src}\n alt=\"\"\n className={cn(\n 'shrink-0 rounded-sm bg-secondary object-cover',\n sizeClass,\n )}\n loading=\"lazy\"\n />\n );\n }\n\n return (\n <span\n style={style}\n className={cn(\n 'flex shrink-0 items-center justify-center rounded-sm font-semibold tracking-tight',\n avatar.accent === undefined && 'bg-info-soft text-info',\n sizeClass,\n )}\n >\n {initials}\n </span>\n );\n}\n\nfunction deriveInitials(label: string): string {\n const parts = label.trim().split(/\\s+/);\n if (parts.length >= 2) {\n return ((parts[0]?.[0] ?? '') + (parts[1]?.[0] ?? '')).toUpperCase();\n }\n return (label.slice(0, 2) || '?').toUpperCase();\n}\n\nfunction Chevron({ open }: { open: boolean }) {\n return (\n <svg\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 10 10\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={cn(\n 'shrink-0 text-muted-foreground transition-transform duration-150',\n open && 'rotate-180',\n )}\n aria-hidden\n >\n <path d=\"m2.5 4 2.5 2.5L7.5 4\" />\n </svg>\n );\n}\n\nfunction Check() {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"shrink-0 text-accent\"\n aria-hidden\n >\n <path d=\"m3 7.5 2.5 2.5L11 4.5\" />\n </svg>\n );\n}\n\nfunction Plus() {\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"shrink-0\"\n aria-hidden\n >\n <path d=\"M6 2v8M2 6h8\" />\n </svg>\n );\n}\n","import { useCboxIdOptional } from '../context/cbox-id';\nimport { ContextBar, type ContextItem } from '../primitives/context-bar';\nimport type { LinkComponent } from './cbox-app-sidebar';\n\nexport type CboxOrgContextBarProps = {\n /**\n * Apps inject their router's Link primitive — used for the\n * crumb's brand-side anchor. The dropdown's onSelect calls\n * `onNavigate(href)` so apps can either `router.visit(href)`\n * (Inertia) or `<Link>`-style navigate.\n */\n LinkComponent: LinkComponent;\n\n /**\n * Called when the user picks a different org from the dropdown.\n * Receives an absolute path with the slug substituted in. Apps\n * trigger their router.\n *\n * Path-rewrite rule (Cbox suite convention):\n * /org/<old-slug>/foo/bar → /org/<new-slug>/foo/bar\n * /something-else → /org/<new-slug>\n *\n * Apps that aren't org-scoped (notifications) typically don't\n * render this component at all — but if they do, switching\n * lands on the new org's `/org/<slug>` root and lets the host\n * sort the rest out.\n */\n onNavigate: (href: string) => void;\n};\n\n/**\n * Standard Cbox topbar org switcher. One crumb, one dropdown,\n * URL-driven (no POST, no session pin). Mirrors id's pattern 1:1\n * so the chrome reads identically across the suite — that's the\n * whole reason it's here, not in each app.\n *\n * Apps render this in the `topbarCentre` slot of `CboxAppShell`.\n * Hides itself when there's no current org (eg pre-auth, or\n * non-org-scoped surfaces).\n */\nexport function CboxOrgContextBar({\n LinkComponent,\n onNavigate,\n}: CboxOrgContextBarProps) {\n const cboxId = useCboxIdOptional();\n\n if (cboxId === null) {\n return null;\n }\n\n const { currentOrganization, organizations, urls } = cboxId;\n const activeOrg = currentOrganization ?? organizations[0] ?? null;\n\n if (activeOrg === null) {\n return null;\n }\n\n const idBase = urls.idBaseUrl.replace(/\\/$/, '');\n\n const items: ContextItem[] = organizations.map((org) => ({\n id: org.slug,\n label: org.name,\n avatar: { initials: deriveInitials(org.name) },\n current: org.slug === activeOrg.slug,\n // Cogwheel shortcut → id's org-settings page. Cross-app\n // deep link; id handles the auth and rendering.\n settingsHref: `${idBase}/org/${org.slug}/settings`,\n settingsAriaLabel: `Settings for ${org.name}`,\n }));\n\n const onSelect = (slug: string) => {\n const org = organizations.find((o) => o.slug === slug);\n if (org === undefined) return;\n\n const path = typeof window !== 'undefined' ? window.location.pathname : '/';\n const next = path.startsWith('/org/')\n ? path.replace(/^\\/org\\/[^/]+/, `/org/${org.slug}`)\n : `/org/${org.slug}`;\n const search =\n typeof window !== 'undefined' ? window.location.search : '';\n\n onNavigate(next + search);\n };\n\n return (\n <ContextBar\n LinkComponent={LinkComponent}\n crumbs={[\n {\n id: 'org',\n label: activeOrg.name,\n avatar: { initials: deriveInitials(activeOrg.name) },\n items,\n onSelect,\n footerLink: {\n label: 'Manage organizations',\n href: `${idBase}/settings/organizations`,\n },\n ariaLabel: 'Switch organization',\n },\n ]}\n />\n );\n}\n\nfunction deriveInitials(label: string): string {\n const parts = label.trim().split(/\\s+/);\n if (parts.length >= 2) {\n return ((parts[0]?.[0] ?? '') + (parts[1]?.[0] ?? '')).toUpperCase();\n }\n\n return (label.slice(0, 2) || '?').toUpperCase();\n}\n","import {\n useEffect,\n useMemo,\n useRef,\n useState,\n type ComponentType,\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactNode,\n} from 'react';\nimport { useCboxId, type CboxOrganization } from '../context/cbox-id';\nimport { cn } from '../utils/cn';\n\ntype Props = {\n /**\n * Optional renderer override for the trigger so apps can match\n * their topbar style (filled button vs ghost vs icon-only).\n */\n Trigger?: ComponentType<{\n organization: CboxOrganization | null;\n onClick: () => void;\n open: boolean;\n }>;\n className?: string;\n};\n\n/**\n * Dropdown that surfaces the user's orgs and dispatches the picked\n * one through `onSwitchOrganization`. Reads everything else from\n * CboxIdProvider so the same component works in id, cortex, atlas —\n * no per-app data wiring.\n *\n * Includes typeahead — auto-focus on open, filters by name as the\n * user types, arrow-key navigation, Enter to switch, Escape to close.\n */\nexport function OrgSwitcher({ Trigger = DefaultTrigger, className }: Props) {\n const { currentOrganization, organizations, onSwitchOrganization } = useCboxId();\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n const [activeIndex, setActiveIndex] = useState(0);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const searchRef = useRef<HTMLInputElement | null>(null);\n\n // Reset transient state every open. requestAnimationFrame waits\n // for the input to mount before focusing it.\n useEffect(() => {\n if (open) {\n setQuery('');\n setActiveIndex(0);\n const id = requestAnimationFrame(() => searchRef.current?.focus());\n return () => cancelAnimationFrame(id);\n }\n }, [open]);\n\n // Click-outside + Escape. Matches AppSwitcher / every other Cbox\n // top-bar control.\n useEffect(() => {\n if (!open) {\n return;\n }\n\n function onPointerDown(event: PointerEvent): void {\n if (\n containerRef.current !== null &&\n !containerRef.current.contains(event.target as Node)\n ) {\n setOpen(false);\n }\n }\n\n function onKey(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n setOpen(false);\n }\n }\n\n window.addEventListener('pointerdown', onPointerDown);\n window.addEventListener('keydown', onKey);\n\n return () => {\n window.removeEventListener('pointerdown', onPointerDown);\n window.removeEventListener('keydown', onKey);\n };\n }, [open]);\n\n const filtered = useMemo(() => {\n const q = query.trim().toLowerCase();\n if (q === '') {\n return organizations;\n }\n return organizations.filter(\n (org) =>\n org.name.toLowerCase().includes(q) ||\n org.slug.toLowerCase().includes(q),\n );\n }, [organizations, query]);\n\n // Clamp activeIndex when the filter shrinks the list.\n useEffect(() => {\n if (activeIndex >= filtered.length) {\n setActiveIndex(0);\n }\n }, [filtered.length, activeIndex]);\n\n const onPick = (org: CboxOrganization) => {\n setOpen(false);\n if (onSwitchOrganization) {\n onSwitchOrganization(org);\n return;\n }\n // No fallback. Org switching is a URL navigation — apps own\n // the destination path because it's per-app (id has /dashboard,\n // webhooks has /endpoints, etc.). Failing loud here is better\n // than silently doing nothing.\n if (typeof console !== 'undefined') {\n console.warn(\n '[cbox-ui] OrgSwitcher: no onSwitchOrganization handler provided. Apps must wire one (router.visit) — there is no server endpoint to fall back to.',\n );\n }\n };\n\n function onSearchKeyDown(event: ReactKeyboardEvent<HTMLInputElement>): void {\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n if (filtered.length === 0) {\n return;\n }\n setActiveIndex((i) => (i + 1) % filtered.length);\n return;\n }\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n if (filtered.length === 0) {\n return;\n }\n setActiveIndex((i) => (i - 1 + filtered.length) % filtered.length);\n return;\n }\n if (event.key === 'Enter') {\n event.preventDefault();\n const target = filtered[activeIndex];\n if (target !== undefined) {\n onPick(target);\n }\n }\n }\n\n return (\n <div ref={containerRef} className={cn('relative', className)}>\n <Trigger\n organization={currentOrganization}\n onClick={() => setOpen((v) => !v)}\n open={open}\n />\n {open ? (\n <div\n role=\"dialog\"\n aria-label=\"Switch organization\"\n className=\"absolute left-0 top-full z-50 mt-1 w-64 overflow-hidden rounded-md border border-border bg-popover shadow-md\"\n >\n <div className=\"border-b border-border/70 px-3 pt-2 pb-1\">\n <p className=\"text-mono text-[10px] font-semibold tracking-[0.18em] text-muted-foreground uppercase\">\n Switch organization\n </p>\n </div>\n\n <div className=\"border-b border-border/70 px-2 py-1.5\">\n <div className=\"flex items-center gap-2 rounded-md px-2 py-1 focus-within:bg-secondary\">\n <SearchIcon />\n <input\n ref={searchRef}\n type=\"text\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n onKeyDown={onSearchKeyDown}\n placeholder=\"Filter…\"\n aria-label=\"Filter organizations\"\n autoComplete=\"off\"\n spellCheck={false}\n className=\"w-full bg-transparent text-sm text-foreground placeholder:text-muted-foreground/60 focus:outline-none\"\n />\n </div>\n </div>\n\n <div className=\"max-h-[50vh] overflow-y-auto p-1\">\n {filtered.length === 0 ? (\n <p className=\"px-3 py-6 text-center text-[12px] text-muted-foreground\">\n No organizations match{' '}\n <span className=\"text-mono text-foreground\">\n “{query}”\n </span>\n </p>\n ) : (\n <ul className=\"space-y-0.5\">\n {filtered.map((org, index) => {\n const active = currentOrganization?.id === org.id;\n const highlighted = index === activeIndex;\n return (\n <li key={org.id}>\n <button\n type=\"button\"\n onMouseEnter={() => setActiveIndex(index)}\n onClick={() => onPick(org)}\n className={cn(\n 'flex w-full items-center justify-between rounded-sm px-2 py-1.5 text-left text-sm transition-colors',\n active\n ? 'bg-accent-soft text-foreground'\n : highlighted\n ? 'bg-secondary'\n : 'hover:bg-secondary',\n )}\n >\n <span className=\"truncate\">{org.name}</span>\n {active ? (\n <span className=\"text-mono text-[10px] text-muted-foreground\">\n current\n </span>\n ) : null}\n </button>\n </li>\n );\n })}\n </ul>\n )}\n </div>\n </div>\n ) : null}\n </div>\n );\n}\n\nconst DefaultTrigger: ComponentType<{\n organization: CboxOrganization | null;\n onClick: () => void;\n open: boolean;\n}> = ({ organization, onClick }) => (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"flex items-center gap-2 rounded-md border border-border bg-card px-3 py-1.5 text-sm font-medium text-foreground hover:bg-secondary\"\n >\n <span className=\"truncate max-w-[180px]\">\n {organization?.name ?? 'Pick an organization'}\n </span>\n <Chevron />\n </button>\n);\n\nfunction Chevron(): ReactNode {\n return (\n <svg\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 10 10\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden\n >\n <path\n d=\"M2 4l3 3 3-3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction SearchIcon(): ReactNode {\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n className=\"shrink-0 text-muted-foreground\"\n >\n <circle cx=\"5.25\" cy=\"5.25\" r=\"3.25\" />\n <path d=\"M8 8l2 2\" />\n </svg>\n );\n}\n","import type { ReactNode } from 'react';\nimport { AppSwitcher } from '../components/app-switcher';\nimport { NotificationsBell } from '../components/notifications-bell';\nimport { OrgSwitcher } from '../components/org-switcher';\nimport { UserMenu } from '../components/user-menu';\nimport { cn } from '../utils/cn';\n\ntype Props = {\n /**\n * App branding rendered on the left — typically a small logo +\n * the app name. Rendered inside a fixed-height bar so keep it\n * visually compact (24-32px tall content).\n */\n brand: ReactNode;\n /** Anything between brand and the right cluster — search, breadcrumbs, etc. */\n centre?: ReactNode;\n /**\n * Override slots if an app needs a different control mix in the\n * right cluster. Default: AppLauncher → NotificationsBell → UserMenu.\n */\n rightCluster?: ReactNode;\n /**\n * Whether to show the org switcher next to the brand. Hide on\n * non-org-scoped surfaces (eg id account-settings).\n */\n showOrgSwitcher?: boolean;\n className?: string;\n};\n\n/**\n * Standard Cbox top bar. Same shell across every app — keeps cross-app\n * navigation (launcher, account, notifications) muscle-memory-stable.\n */\nexport function TopBar({\n brand,\n centre,\n rightCluster,\n showOrgSwitcher = true,\n className,\n}: Props) {\n return (\n <header\n className={cn(\n 'flex h-14 shrink-0 items-center gap-3 border-b border-border bg-background px-4',\n className,\n )}\n >\n <div className=\"flex items-center gap-3\">\n {brand}\n <AppSwitcher />\n {showOrgSwitcher ? <OrgSwitcher /> : null}\n </div>\n <div className=\"min-w-0 flex-1\">{centre}</div>\n <div className=\"flex shrink-0 items-center gap-1\">\n {rightCluster ?? (\n <>\n <NotificationsBell />\n <UserMenu />\n </>\n )}\n </div>\n </header>\n );\n}\n","import { useEffect, useRef, useState, type ReactNode } from 'react';\nimport { useCboxIdOptional, type CboxAppLink } from '../context/cbox-id';\nimport { cn } from '../utils/cn';\n\ntype AppLauncherProps = {\n className?: string;\n /**\n * Called when the user clicks an app they're not entitled to. Use\n * this to open an upgrade flow / Stripe checkout / Intercom message.\n * If unset, locked tiles fall through to a static \"Add to plan\"\n * affordance — the click is a no-op so we never silently ship the\n * user to a broken paywall.\n */\n onLockedAppClick?: (app: CboxAppLink) => void;\n};\n\n/**\n * Cross-app launcher — the 9-dot button in the top bar.\n *\n * Renders the Cbox suite as a vertical list with status per app:\n * - entitled apps → full-colour tile, click navigates with ?org=<slug>\n * - locked apps → greyed out + lock badge, opens upgrade flow if the\n * host app provides one (otherwise inert click)\n * - coming-soon → greyed out + \"soon\" badge, never clickable\n * - the current app → highlighted ring on its monogram tile\n *\n * Row layout (vs. the old 3-col grid) gives us room for descriptions\n * and status badges, which makes the entitlement signal readable at a\n * glance instead of needing a tooltip.\n */\nexport function AppLauncher({ className, onLockedAppClick }: AppLauncherProps) {\n // Soft-read: if a layout above us forgot to mount <CboxIdProvider>\n // (e.g. an admin shell that doesn't expose cross-app context yet),\n // render nothing instead of crashing the chrome. Throwing here used\n // to take the whole top bar down for any single missing-provider\n // bug downstream.\n const cboxId = useCboxIdOptional();\n const [open, setOpen] = useState(false);\n const containerRef = useRef<HTMLDivElement | null>(null);\n\n // Click-outside + Escape close. Mirrors the standard popover\n // contract every other Cbox top-bar control follows.\n useEffect(() => {\n if (! open) {\n return;\n }\n\n function onPointerDown(event: PointerEvent): void {\n if (\n containerRef.current !== null &&\n ! containerRef.current.contains(event.target as Node)\n ) {\n setOpen(false);\n }\n }\n\n function onKey(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n setOpen(false);\n }\n }\n\n window.addEventListener('pointerdown', onPointerDown);\n window.addEventListener('keydown', onKey);\n\n return () => {\n window.removeEventListener('pointerdown', onPointerDown);\n window.removeEventListener('keydown', onKey);\n };\n }, [open]);\n\n // No provider above us, or no apps to render — just don't show the\n // launcher button at all. The chrome stays clean.\n if (cboxId === null || cboxId.apps.length === 0) {\n return null;\n }\n\n const apps = cboxId.apps;\n\n // Carry the active org slug across apps so users don't have to\n // re-pick after switching. The destination URL embeds the slug\n // directly (`<app>/org/<slug>`) — every Cbox app exposes a\n // canonical `GET /org/{slug}` route that redirects to its own\n // default landing sub-page. URL is the source of truth.\n const orgSlug = cboxId.currentOrganization?.slug;\n\n // Split entitled vs. locked so the \"available\" set lands at the\n // top of the list and the upgrade-able set sits in its own section\n // below. Coming-soon apps go with the locked set — they share the\n // \"not actionable now\" visual treatment.\n const entitled: CboxAppLink[] = [];\n const locked: CboxAppLink[] = [];\n for (const app of apps) {\n const isEntitled = app.entitled !== false && app.comingSoon !== true;\n (isEntitled ? entitled : locked).push(app);\n }\n\n return (\n <div ref={containerRef} className={cn('relative', className)}>\n <button\n type=\"button\"\n aria-label=\"Open app launcher\"\n aria-expanded={open}\n onClick={() => setOpen((v) => !v)}\n className={cn(\n 'flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-secondary hover:text-foreground',\n open && 'bg-secondary text-foreground',\n )}\n >\n <Grid />\n </button>\n {open ? (\n <div\n role=\"dialog\"\n aria-label=\"Cbox app launcher\"\n // Cap width at viewport-minus-gutter on narrow\n // screens so the panel stays inside the visible\n // area on mobile (390px viewport, 320px panel\n // would overflow). `right-0` anchors at the\n // launcher button.\n className=\"absolute right-0 top-full z-50 mt-1.5 w-[min(20rem,calc(100vw-1.5rem))] overflow-hidden rounded-lg border border-border bg-popover shadow-lg\"\n >\n <div className=\"border-b border-border/70 px-3 py-2.5\">\n <p className=\"text-mono text-[10px] font-semibold tracking-[0.18em] text-muted-foreground uppercase\">\n Cbox suite\n </p>\n </div>\n\n <div className=\"max-h-[60vh] overflow-y-auto py-1\">\n {entitled.length > 0 ? (\n <ul className=\"space-y-0.5 p-1\">\n {entitled.map((app) => (\n <AppRow\n key={app.key}\n app={app}\n orgSlug={orgSlug}\n onLockedAppClick={onLockedAppClick}\n />\n ))}\n </ul>\n ) : null}\n\n {locked.length > 0 ? (\n <>\n {entitled.length > 0 ? (\n <div className=\"my-1 border-t border-border/50\" />\n ) : null}\n <p className=\"text-mono px-3 py-1.5 text-[10px] font-semibold tracking-[0.18em] text-muted-foreground/70 uppercase\">\n Available\n </p>\n <ul className=\"space-y-0.5 p-1 pt-0\">\n {locked.map((app) => (\n <AppRow\n key={app.key}\n app={app}\n orgSlug={orgSlug}\n onLockedAppClick={onLockedAppClick}\n />\n ))}\n </ul>\n </>\n ) : null}\n </div>\n </div>\n ) : null}\n </div>\n );\n}\n\ntype AppRowProps = {\n app: CboxAppLink;\n orgSlug: string | undefined;\n onLockedAppClick: AppLauncherProps['onLockedAppClick'];\n};\n\nfunction AppRow({ app, orgSlug, onLockedAppClick }: AppRowProps): ReactNode {\n const isComingSoon = app.comingSoon === true;\n const isLocked = app.entitled === false || isComingSoon;\n\n const monogram = app.monogram ?? app.name.slice(0, 1).toUpperCase();\n const accent = app.accentColor;\n // Apply the per-app accent colour to the monogram chip so each\n // app keeps its visual identity. Skip when an iconUrl is set —\n // the icon supplies its own colour.\n const tileStyle =\n accent !== undefined && app.iconUrl === undefined\n ? { backgroundColor: accent, color: '#fff', borderColor: accent }\n : undefined;\n\n // Land directly on `<app>/org/<slug>` so the destination URL is\n // canonical from the first hop — no `?org=` query, no extra\n // redirect. Each Cbox app's `/org/{slug}` route picks its default\n // landing within that org. Skip on the current-app tile (the\n // user is already there).\n const href =\n orgSlug !== undefined && app.current !== true\n ? buildOrgUrl(app.url, orgSlug)\n : app.url;\n\n const tile = (\n <div\n style={tileStyle}\n className={cn(\n 'flex h-9 w-9 shrink-0 items-center justify-center rounded-md border border-border bg-card text-[13px] font-semibold text-foreground',\n app.current && 'ring-2 ring-accent-edge ring-offset-1 ring-offset-popover',\n isLocked && 'opacity-60 grayscale',\n )}\n >\n {app.iconUrl ? (\n <img src={app.iconUrl} alt=\"\" className=\"h-5 w-5\" loading=\"lazy\" />\n ) : (\n <span>{monogram}</span>\n )}\n </div>\n );\n\n const body = (\n <div className=\"flex min-w-0 flex-1 flex-col leading-tight\">\n <div className=\"flex items-center gap-2\">\n <span\n className={cn(\n 'truncate text-sm font-medium text-foreground',\n isLocked && 'text-muted-foreground',\n )}\n >\n {app.name}\n </span>\n {app.current ? (\n <span className=\"text-mono shrink-0 rounded-sm border border-accent-edge/40 bg-accent-soft px-1 text-[9px] font-semibold tracking-[0.14em] text-accent uppercase\">\n current\n </span>\n ) : null}\n </div>\n {app.description ? (\n <span\n className={cn(\n 'truncate text-[11px]',\n isLocked\n ? 'text-muted-foreground/70'\n : 'text-muted-foreground',\n )}\n >\n {app.description}\n </span>\n ) : null}\n </div>\n );\n\n const trailing = isComingSoon ? (\n <span className=\"text-mono shrink-0 rounded-sm border border-border bg-secondary px-1.5 py-0.5 text-[9px] font-semibold tracking-[0.14em] text-muted-foreground uppercase\">\n soon\n </span>\n ) : isLocked ? (\n <span className=\"flex shrink-0 items-center gap-1 text-[10px] font-medium text-muted-foreground\">\n <Lock />\n Add\n </span>\n ) : null;\n\n if (isComingSoon) {\n return (\n <li>\n <div\n aria-disabled\n className=\"flex w-full cursor-not-allowed items-center gap-3 rounded-md px-2.5 py-2\"\n title={`${app.name} — coming soon`}\n >\n {tile}\n {body}\n {trailing}\n </div>\n </li>\n );\n }\n\n if (isLocked) {\n return (\n <li>\n <button\n type=\"button\"\n onClick={() => onLockedAppClick?.(app)}\n className={cn(\n 'group flex w-full items-center gap-3 rounded-md px-2.5 py-2 text-left transition-colors',\n onLockedAppClick !== undefined\n ? 'hover:bg-secondary'\n : 'cursor-default',\n )}\n title={`Add ${app.name} to your plan`}\n >\n {tile}\n {body}\n {trailing}\n </button>\n </li>\n );\n }\n\n return (\n <li>\n <a\n href={href}\n className={cn(\n 'group flex w-full items-center gap-3 rounded-md px-2.5 py-2 transition-colors hover:bg-secondary',\n app.current && 'bg-accent-soft hover:bg-accent-soft',\n )}\n >\n {tile}\n {body}\n {trailing}\n </a>\n </li>\n );\n}\n\nfunction buildOrgUrl(url: string, orgSlug: string): string {\n if (url === '' || orgSlug === '') {\n return url;\n }\n try {\n // URL constructor strips trailing slash on origin assembly,\n // preserving any existing path/query/fragment from the app's\n // configured base. We override the path to `/org/<slug>` so\n // every app lands on its canonical org-scoped entry point.\n const u = new URL(url);\n u.pathname = `/org/${encodeURIComponent(orgSlug)}`;\n return u.toString();\n } catch {\n return `${url.replace(/\\/$/, '')}/org/${encodeURIComponent(orgSlug)}`;\n }\n}\n\nfunction Grid(): ReactNode {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\" aria-hidden>\n {[1, 8, 15].flatMap((y) =>\n [1, 8, 15].map((x) => (\n <rect\n key={`${x}-${y}`}\n x={x}\n y={y}\n width=\"2.5\"\n height=\"2.5\"\n rx=\"0.6\"\n fill=\"currentColor\"\n />\n )),\n )}\n </svg>\n );\n}\n\nfunction Lock(): ReactNode {\n return (\n <svg\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n >\n <rect x=\"2.5\" y=\"5\" width=\"7\" height=\"5\" rx=\"1\" />\n <path d=\"M4 5V3.5a2 2 0 1 1 4 0V5\" />\n </svg>\n );\n}\n","import {\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type ComponentType,\n type KeyboardEvent,\n type ReactNode,\n} from 'react';\nimport { cn } from '../utils/cn';\n\n/**\n * Combobox — the canonical select replacement for the Cbox suite.\n *\n * **Native `<select>` is forbidden.** It can't host avatars, can't\n * be searched, can't be styled into the design system, and on mobile\n * it pops the OS picker which breaks the visual contract. Combobox\n * solves all of that with a single primitive:\n *\n * - Type-ahead filter on the search input (case-insensitive,\n * matches label + secondary).\n * - Keyboard contract: ArrowDown / ArrowUp move highlight, Enter\n * selects, Escape closes, Home/End jump to bounds, Tab exits.\n * - Optional avatar per option, optional secondary line.\n * - Optional grouped sections with mono-tracked headers.\n * - Optional footer link (eg \"+ New environment\").\n * - Empty-state copy when the filter excludes everything.\n *\n * Two modes:\n * - Value mode (default): `value` + `onChange` — Combobox manages\n * selection state, host treats it like a controlled input.\n * - Navigation mode: items carry `href` and `LinkComponent` is\n * supplied — clicking an item is a Link visit, not a state mutation.\n *\n * Both modes are URL/router-friendly. Value mode is for filter\n * controls; navigation mode is for context switchers (the Combobox\n * inside a ContextBar crumb is exactly this).\n */\n\nexport type ComboboxOption = {\n /** Stable key. Used as React key and for active-state matching. */\n value: string;\n /** Visible label — primary line. */\n label: string;\n /** Optional secondary line — slug, role, environment, hint. */\n secondary?: string;\n /** Optional leading icon (lucide-style — h-3.5 w-3.5). */\n icon?: ComponentType<{ className?: string; strokeWidth?: number }>;\n /**\n * Optional avatar — image src OR `{initials,accent}` chip. When\n * the option carries an avatar, the trigger renders one too if\n * the option is the active selection.\n */\n avatar?: ComboboxAvatar;\n /** Disable selection of this option. */\n disabled?: boolean;\n /**\n * Hidden text added to the searchable haystack. Useful for\n * synonyms (\"United States\" should match \"USA\", \"us\"). Not\n * displayed.\n */\n keywords?: string[];\n /**\n * Optional href for navigation mode. When set + LinkComponent is\n * supplied, clicking the option navigates instead of mutating\n * value state.\n */\n href?: string;\n};\n\nexport type ComboboxGroup = {\n /** Group heading — uppercase mono-tracked. Empty string hides the heading. */\n label: string;\n options: ComboboxOption[];\n};\n\nexport type ComboboxAvatar = {\n initials?: string;\n accent?: string;\n src?: string;\n};\n\ntype LinkComp = ComponentType<{\n href: string;\n prefetch?: boolean;\n className?: string;\n children: ReactNode;\n}>;\n\ntype CommonProps = {\n /** Options or grouped options. Pass an array of either shape. */\n items: ComboboxOption[] | ComboboxGroup[];\n /** Placeholder shown in the trigger when no value is selected. */\n placeholder?: string;\n /** Search input placeholder. */\n searchPlaceholder?: string;\n /** Empty-state copy when the filter matches nothing. */\n emptyText?: string;\n /** Optional footer link below the option list (\"+ New X\"). */\n footerLink?: {\n label: string;\n href: string;\n };\n /** Disable the entire combobox (greyed-out trigger). */\n disabled?: boolean;\n /** Required-field marker on the trigger. */\n required?: boolean;\n /** Aria-label for the trigger. */\n ariaLabel?: string;\n /** Trigger className override. Doesn't change padding/height. */\n triggerClassName?: string;\n /** Dropdown panel className override. */\n panelClassName?: string;\n /** Width policy for the trigger. Defaults to `auto` (intrinsic). */\n triggerWidth?: 'auto' | 'full';\n /**\n * Framework Link adapter for navigation-mode items + footer link.\n * If unset, navigation falls back to plain `<a>`.\n */\n LinkComponent?: LinkComp;\n /** ID for the trigger button (associate with a <Label htmlFor>). */\n id?: string;\n /** className for the outer wrapper. */\n className?: string;\n};\n\ntype ValueModeProps = CommonProps & {\n /** Selected value or `null` when nothing is selected. */\n value: string | null;\n /** Called with the option's `value` when the user picks one. */\n onChange: (value: string) => void;\n};\n\ntype NavModeProps = CommonProps & {\n /** Active value for highlight purposes. Optional in nav mode. */\n value?: string | null;\n /**\n * Omitted in nav mode. Items must carry `href`, and a\n * LinkComponent must be supplied for SPA navigation.\n */\n onChange?: never;\n};\n\nexport type ComboboxProps = ValueModeProps | NavModeProps;\n\nexport function Combobox(props: ComboboxProps) {\n const {\n items,\n placeholder = 'Select…',\n searchPlaceholder = 'Search…',\n emptyText = 'Nothing matches.',\n footerLink,\n disabled = false,\n required = false,\n ariaLabel,\n triggerClassName,\n panelClassName,\n triggerWidth = 'auto',\n LinkComponent,\n id: idProp,\n className,\n value,\n } = props;\n\n const groups = useMemo(() => normaliseGroups(items), [items]);\n const flatOptions = useMemo(\n () => groups.flatMap((g) => g.options),\n [groups],\n );\n const activeOption = useMemo(\n () => (value !== null && value !== undefined\n ? flatOptions.find((opt) => opt.value === value)\n : null),\n [flatOptions, value],\n );\n\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n const [highlightIndex, setHighlightIndex] = useState(-1);\n\n const containerRef = useRef<HTMLDivElement | null>(null);\n const inputRef = useRef<HTMLInputElement | null>(null);\n const listRef = useRef<HTMLUListElement | null>(null);\n const reactId = useId();\n const id = idProp ?? reactId;\n const listId = `${id}-listbox`;\n\n // Filtered groups (preserves group structure for headings).\n const filteredGroups = useMemo(\n () => filterGroups(groups, query),\n [groups, query],\n );\n const filteredFlat = useMemo(\n () => filteredGroups.flatMap((g) => g.options),\n [filteredGroups],\n );\n\n // Reset highlight when filter changes — first non-disabled option.\n useEffect(() => {\n if (! open) return;\n const firstEnabled = filteredFlat.findIndex(\n (opt) => opt.disabled !== true,\n );\n setHighlightIndex(firstEnabled);\n }, [filteredFlat, open]);\n\n // Auto-focus the search input when the menu opens.\n useEffect(() => {\n if (open) {\n // Run on the next tick so the input is mounted.\n const id = window.setTimeout(() => inputRef.current?.focus(), 0);\n return () => window.clearTimeout(id);\n }\n setQuery('');\n\n return undefined;\n }, [open]);\n\n // Click-outside close.\n useEffect(() => {\n if (! open) return;\n\n function onPointerDown(event: PointerEvent): void {\n if (\n containerRef.current !== null &&\n ! containerRef.current.contains(event.target as Node)\n ) {\n setOpen(false);\n }\n }\n\n window.addEventListener('pointerdown', onPointerDown);\n return () => window.removeEventListener('pointerdown', onPointerDown);\n }, [open]);\n\n const onSelectOption = useCallback(\n (opt: ComboboxOption) => {\n if (opt.disabled === true) return;\n\n if (\n opt.href !== undefined &&\n LinkComponent !== undefined &&\n props.onChange === undefined\n ) {\n // Navigation mode — Link handles it; just close.\n setOpen(false);\n return;\n }\n\n if (props.onChange !== undefined) {\n props.onChange(opt.value);\n }\n setOpen(false);\n },\n [LinkComponent, props],\n );\n\n const onKeyDown = useCallback(\n (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n setHighlightIndex((current) =>\n nextEnabledIndex(filteredFlat, current, 1),\n );\n return;\n }\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n setHighlightIndex((current) =>\n nextEnabledIndex(filteredFlat, current, -1),\n );\n return;\n }\n if (event.key === 'Home') {\n event.preventDefault();\n setHighlightIndex(\n filteredFlat.findIndex((o) => o.disabled !== true),\n );\n return;\n }\n if (event.key === 'End') {\n event.preventDefault();\n let last = -1;\n for (let i = 0; i < filteredFlat.length; i++) {\n const opt = filteredFlat[i];\n if (opt !== undefined && opt.disabled !== true) {\n last = i;\n }\n }\n setHighlightIndex(last);\n return;\n }\n if (event.key === 'Enter') {\n if (highlightIndex >= 0) {\n event.preventDefault();\n const opt = filteredFlat[highlightIndex];\n if (opt !== undefined) {\n onSelectOption(opt);\n }\n }\n return;\n }\n if (event.key === 'Escape') {\n event.preventDefault();\n setOpen(false);\n return;\n }\n if (event.key === 'Tab') {\n setOpen(false);\n return;\n }\n },\n [filteredFlat, highlightIndex, onSelectOption],\n );\n\n return (\n <div\n ref={containerRef}\n className={cn('relative', triggerWidth === 'full' && 'w-full', className)}\n >\n <button\n id={id}\n type=\"button\"\n role=\"combobox\"\n disabled={disabled}\n aria-expanded={open}\n aria-haspopup=\"listbox\"\n aria-controls={listId}\n aria-required={required}\n aria-label={ariaLabel}\n onClick={() => setOpen((v) => ! v)}\n className={cn(\n 'flex h-9 items-center gap-2 rounded-md border border-input bg-card px-3 text-left text-[13px] text-foreground transition-colors',\n triggerWidth === 'full' && 'w-full',\n 'hover:border-border-strong focus-visible:ring-2 focus-visible:ring-ring focus-visible:outline-none',\n open && 'border-border-strong ring-2 ring-ring/30',\n disabled && 'cursor-not-allowed opacity-60',\n triggerClassName,\n )}\n >\n {activeOption?.avatar !== undefined ? (\n <ComboboxAvatarChip\n avatar={activeOption.avatar}\n fallbackLabel={activeOption.label}\n />\n ) : activeOption?.icon !== undefined ? (\n <activeOption.icon\n className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\"\n strokeWidth={1.7}\n />\n ) : null}\n <span\n className={cn(\n 'flex-1 truncate',\n activeOption === null || activeOption === undefined\n ? 'text-muted-foreground'\n : '',\n )}\n >\n {activeOption !== null && activeOption !== undefined\n ? activeOption.label\n : placeholder}\n </span>\n <Chevron open={open} />\n </button>\n\n {open ? (\n <div\n className={cn(\n 'absolute left-0 right-0 top-full z-30 mt-1 overflow-hidden rounded-md border border-border bg-popover shadow-lg',\n panelClassName,\n )}\n >\n <div className=\"border-b border-border/60 px-2 py-2\">\n <div className=\"relative\">\n <SearchIcon />\n <input\n ref={inputRef}\n type=\"text\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n onKeyDown={onKeyDown}\n placeholder={searchPlaceholder}\n className=\"h-8 w-full rounded-sm border-0 bg-transparent pl-7 pr-2 text-[13px] outline-none placeholder:text-muted-foreground/70\"\n aria-controls={listId}\n aria-autocomplete=\"list\"\n aria-activedescendant={\n highlightIndex >= 0\n ? `${listId}-${highlightIndex}`\n : undefined\n }\n />\n </div>\n </div>\n\n <ul\n id={listId}\n ref={listRef}\n role=\"listbox\"\n className=\"max-h-72 overflow-y-auto py-1\"\n >\n {filteredFlat.length === 0 ? (\n <li className=\"px-3 py-6 text-center text-[13px] text-muted-foreground\">\n {emptyText}\n </li>\n ) : (\n filteredGroups.map((group, groupIndex) => (\n <ComboboxGroupRows\n key={group.label || `group-${groupIndex}`}\n group={group}\n flatOptions={filteredFlat}\n listId={listId}\n highlightIndex={highlightIndex}\n activeValue={value ?? null}\n LinkComponent={LinkComponent}\n onSelect={onSelectOption}\n onHover={(idx) => setHighlightIndex(idx)}\n />\n ))\n )}\n </ul>\n\n {footerLink !== undefined ? (\n <FooterLink\n label={footerLink.label}\n href={footerLink.href}\n LinkComponent={LinkComponent}\n onAfterClick={() => setOpen(false)}\n />\n ) : null}\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction ComboboxGroupRows({\n group,\n flatOptions,\n listId,\n highlightIndex,\n activeValue,\n LinkComponent,\n onSelect,\n onHover,\n}: {\n group: ComboboxGroup;\n flatOptions: ComboboxOption[];\n listId: string;\n highlightIndex: number;\n activeValue: string | null;\n LinkComponent: LinkComp | undefined;\n onSelect: (opt: ComboboxOption) => void;\n onHover: (idx: number) => void;\n}) {\n if (group.options.length === 0) return null;\n\n return (\n <>\n {group.label !== '' ? (\n <li\n role=\"presentation\"\n className=\"text-mono px-3 pt-2 pb-1 text-[10px] font-semibold tracking-[0.18em] text-muted-foreground/70 uppercase\"\n >\n {group.label}\n </li>\n ) : null}\n {group.options.map((opt) => {\n const flatIndex = flatOptions.indexOf(opt);\n const isHighlighted = flatIndex === highlightIndex;\n const isActive = opt.value === activeValue;\n const inner = (\n <div className=\"flex w-full min-w-0 items-center gap-2.5 px-2.5 py-2\">\n {opt.avatar !== undefined ? (\n <ComboboxAvatarChip\n avatar={opt.avatar}\n fallbackLabel={opt.label}\n />\n ) : opt.icon !== undefined ? (\n <opt.icon\n className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\"\n strokeWidth={1.7}\n />\n ) : null}\n <div className=\"flex min-w-0 flex-1 flex-col leading-tight\">\n <span className=\"truncate text-[13px] font-medium text-foreground\">\n {opt.label}\n </span>\n {opt.secondary !== undefined ? (\n <span className=\"text-mono truncate text-[10px] text-muted-foreground\">\n {opt.secondary}\n </span>\n ) : null}\n </div>\n {isActive ? <Check /> : null}\n </div>\n );\n\n const className = cn(\n 'group block w-full rounded-sm transition-colors text-left',\n opt.disabled === true && 'cursor-not-allowed opacity-50',\n isHighlighted && opt.disabled !== true && 'bg-secondary',\n isActive && 'bg-accent-soft hover:bg-accent-soft/80',\n );\n\n if (\n opt.href !== undefined &&\n LinkComponent !== undefined\n ) {\n return (\n <li\n key={opt.value}\n id={`${listId}-${flatIndex}`}\n role=\"option\"\n aria-selected={isActive}\n aria-disabled={opt.disabled === true}\n onMouseEnter={() => onHover(flatIndex)}\n >\n <LinkComponent\n href={opt.href}\n prefetch\n className={className}\n >\n {inner}\n </LinkComponent>\n </li>\n );\n }\n\n return (\n <li\n key={opt.value}\n id={`${listId}-${flatIndex}`}\n role=\"option\"\n aria-selected={isActive}\n aria-disabled={opt.disabled === true}\n onMouseEnter={() => onHover(flatIndex)}\n >\n <button\n type=\"button\"\n disabled={opt.disabled === true}\n onClick={() => onSelect(opt)}\n className={className}\n >\n {inner}\n </button>\n </li>\n );\n })}\n </>\n );\n}\n\nfunction FooterLink({\n label,\n href,\n LinkComponent,\n onAfterClick,\n}: {\n label: string;\n href: string;\n LinkComponent: LinkComp | undefined;\n onAfterClick: () => void;\n}) {\n const className =\n 'flex items-center gap-2 border-t border-border/60 px-3 py-2.5 text-[13px] font-medium text-info transition-colors hover:bg-info-soft';\n\n if (LinkComponent !== undefined) {\n return (\n <LinkComponent\n href={href}\n prefetch\n className={className}\n >\n <Plus />\n <span>{label}</span>\n </LinkComponent>\n );\n }\n\n return (\n <a\n href={href}\n className={className}\n onClick={onAfterClick}\n >\n <Plus />\n <span>{label}</span>\n </a>\n );\n}\n\nfunction ComboboxAvatarChip({\n avatar,\n fallbackLabel,\n}: {\n avatar: ComboboxAvatar;\n fallbackLabel: string;\n}) {\n const initials = avatar.initials ?? deriveInitials(fallbackLabel);\n const style =\n avatar.src === undefined && avatar.accent !== undefined\n ? { backgroundColor: avatar.accent, color: '#fff' }\n : undefined;\n\n if (avatar.src !== undefined) {\n return (\n <img\n src={avatar.src}\n alt=\"\"\n className=\"h-5 w-5 shrink-0 rounded-sm bg-secondary object-cover\"\n loading=\"lazy\"\n />\n );\n }\n\n return (\n <span\n style={style}\n className={cn(\n 'flex h-5 w-5 shrink-0 items-center justify-center rounded-sm text-[9px] font-semibold tracking-tight',\n avatar.accent === undefined && 'bg-info-soft text-info',\n )}\n >\n {initials}\n </span>\n );\n}\n\nfunction deriveInitials(label: string): string {\n const parts = label.trim().split(/\\s+/);\n if (parts.length >= 2) {\n return ((parts[0]?.[0] ?? '') + (parts[1]?.[0] ?? '')).toUpperCase();\n }\n return (label.slice(0, 2) || '?').toUpperCase();\n}\n\nfunction normaliseGroups(\n items: ComboboxOption[] | ComboboxGroup[],\n): ComboboxGroup[] {\n if (items.length === 0) return [];\n const first = items[0];\n if (first !== undefined && 'options' in first) {\n return items as ComboboxGroup[];\n }\n return [{ label: '', options: items as ComboboxOption[] }];\n}\n\nfunction filterGroups(\n groups: ComboboxGroup[],\n query: string,\n): ComboboxGroup[] {\n const q = query.trim().toLowerCase();\n if (q === '') return groups;\n\n return groups\n .map((group) => ({\n label: group.label,\n options: group.options.filter((opt) => matchesQuery(opt, q)),\n }))\n .filter((group) => group.options.length > 0);\n}\n\nfunction matchesQuery(option: ComboboxOption, q: string): boolean {\n const haystack = [\n option.label,\n option.secondary ?? '',\n ...(option.keywords ?? []),\n ]\n .join(' ')\n .toLowerCase();\n\n return haystack.includes(q);\n}\n\nfunction nextEnabledIndex(\n options: ComboboxOption[],\n current: number,\n direction: 1 | -1,\n): number {\n const total = options.length;\n if (total === 0) return -1;\n\n let i = current;\n for (let step = 0; step < total; step++) {\n i = (i + direction + total) % total;\n const opt = options[i];\n if (opt !== undefined && opt.disabled !== true) {\n return i;\n }\n }\n return -1;\n}\n\nfunction Chevron({ open }: { open: boolean }) {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n className={cn(\n 'shrink-0 text-muted-foreground transition-transform duration-150',\n open && 'rotate-180',\n )}\n >\n <path d=\"m3.5 5.5 3.5 3.5 3.5-3.5\" />\n </svg>\n );\n}\n\nfunction Check() {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"shrink-0 text-accent\"\n aria-hidden\n >\n <path d=\"m3 7.5 2.5 2.5L11 4.5\" />\n </svg>\n );\n}\n\nfunction Plus() {\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"shrink-0\"\n aria-hidden\n >\n <path d=\"M6 2v8M2 6h8\" />\n </svg>\n );\n}\n\nfunction SearchIcon() {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"pointer-events-none absolute left-1.5 top-1/2 -translate-y-1/2 text-muted-foreground\"\n aria-hidden\n >\n <circle cx=\"6\" cy=\"6\" r=\"4.25\" />\n <path d=\"m11.5 11.5-2.5-2.5\" />\n </svg>\n );\n}\n","import type { ComponentProps, ReactNode } from 'react';\nimport { cn } from '../utils/cn';\n\n/**\n * Generic panel container — soft border, card surface, subtle shadow.\n * The default building block for every section on a page.\n */\nexport function DataPanel({\n className,\n children,\n ...rest\n}: ComponentProps<'section'>) {\n return (\n <section\n className={cn(\n 'rounded-lg border border-border bg-card text-card-foreground shadow-[0_1px_2px_rgba(0,0,0,0.02)]',\n className,\n )}\n {...rest}\n >\n {children}\n </section>\n );\n}\n\ntype SectionHeaderProps = {\n title: ReactNode;\n description?: ReactNode;\n actions?: ReactNode;\n className?: string;\n};\n\n/**\n * Section header that sits inside a DataPanel. Title in semibold sans,\n * optional muted lead, right-aligned actions slot.\n */\nexport function SectionHeader({\n title,\n description,\n actions,\n className,\n}: SectionHeaderProps) {\n return (\n <header\n className={cn(\n 'flex flex-col gap-3 border-b border-border px-5 py-4 sm:flex-row sm:items-center sm:justify-between',\n className,\n )}\n >\n <div className=\"space-y-1\">\n <h2 className=\"text-[15px] leading-none font-semibold text-foreground\">\n {title}\n </h2>\n {description ? (\n <p className=\"text-sm text-muted-foreground\">\n {description}\n </p>\n ) : null}\n </div>\n {actions ? (\n <div className=\"flex shrink-0 items-center gap-2\">\n {actions}\n </div>\n ) : null}\n </header>\n );\n}\n\n/**\n * Vertically padded content body for a DataPanel.\n */\nexport function PanelBody({\n className,\n children,\n ...rest\n}: ComponentProps<'div'>) {\n return (\n <div className={cn('px-5 py-4', className)} {...rest}>\n {children}\n </div>\n );\n}\n","export default function Heading({\n title,\n description,\n variant = 'default',\n}: {\n title: string;\n description?: string;\n variant?: 'default' | 'small';\n}) {\n return (\n <header className={variant === 'small' ? '' : 'mb-8 space-y-0.5'}>\n <h2\n className={\n variant === 'small'\n ? 'mb-0.5 text-base font-medium'\n : 'text-xl font-semibold tracking-tight'\n }\n >\n {title}\n </h2>\n {description && (\n <p className=\"text-sm text-muted-foreground\">{description}</p>\n )}\n </header>\n );\n}\n","import type { ReactNode } from 'react';\nimport { cn } from '../utils/cn';\n\ntype KeyValueProps = {\n label: string;\n children: ReactNode;\n /** Render the value in monospace. Default true — most values are technical. */\n mono?: boolean;\n className?: string;\n};\n\n/**\n * Two-column read-only field row. Label in mono caps, value in mono\n * by default (for slugs/IDs/dates) — pass `mono={false}` for prose.\n */\nexport function KeyValue({\n label,\n children,\n mono = true,\n className,\n}: KeyValueProps) {\n return (\n <div\n className={cn(\n 'grid grid-cols-[140px_1fr] items-baseline gap-x-6 border-b border-border py-3 last:border-b-0',\n className,\n )}\n >\n <dt className=\"text-eyebrow text-muted-foreground\">{label}</dt>\n <dd\n className={cn(\n 'text-sm break-all text-foreground',\n mono && 'text-mono text-[13px]',\n )}\n >\n {children}\n </dd>\n </div>\n );\n}\n\nexport function KeyValueList({\n children,\n className,\n}: {\n children: ReactNode;\n className?: string;\n}) {\n return <dl className={cn('px-6', className)}>{children}</dl>;\n}\n","import type { ReactNode } from 'react';\nimport { cn } from '../utils/cn';\n\ntype Props = {\n title: ReactNode;\n /**\n * Tiny uppercase lead-in above the title (sections, breadcrumb-light\n * disambiguation). Shown in mono-tracking caps so it reads as\n * meta, not as a competing heading.\n */\n eyebrow?: ReactNode;\n description?: ReactNode;\n actions?: ReactNode;\n className?: string;\n};\n\n/**\n * Title block at the top of every page. Big bold title, optional mono\n * eyebrow lead-in, muted lead, optional right-aligned actions slot.\n * Cortex-style — no italics, no brackets — so it carries across many\n * sibling apps cleanly.\n */\nexport function PageHeader({\n title,\n eyebrow,\n description,\n actions,\n className,\n}: Props) {\n return (\n <header\n className={cn(\n 'flex flex-col gap-3 sm:flex-row sm:items-end sm:justify-between',\n className,\n )}\n >\n <div className=\"space-y-1.5\">\n {eyebrow !== undefined ? (\n <p className=\"text-mono text-[10px] font-semibold tracking-[0.18em] text-muted-foreground uppercase\">\n {eyebrow}\n </p>\n ) : null}\n <h1 className=\"text-2xl leading-tight font-semibold tracking-tight text-foreground\">\n {title}\n </h1>\n {description ? (\n <p className=\"text-sm text-muted-foreground\">\n {description}\n </p>\n ) : null}\n </div>\n {actions ? (\n <div className=\"flex shrink-0 flex-wrap items-center gap-2\">\n {actions}\n </div>\n ) : null}\n </header>\n );\n}\n","import type { ReactNode } from 'react';\nimport { cn } from '../utils/cn';\n\n/**\n * Width policy for `<PageShell>` — the single horizontal-rhythm\n * primitive every Cbox-family app shares. Pick the policy that\n * matches the page's content density:\n *\n * comfortable max-w-6xl (~1152px) — the default. Reading-friendly\n * column for prose-heavy pages: profile, security,\n * billing forms, audit row detail.\n * wide max-w-7xl (~1280px) — for tables / lists / member\n * rosters where horizontal real estate matters more\n * than reading line length. Audit log, member roster,\n * plan comparison.\n * full no max-width, only the standard horizontal padding —\n * for canvas-heavy pages (flow diagrams, dashboards)\n * where every pixel of viewport should be usable. Use\n * sparingly: raw width without column rules feels\n * chaotic on monitors past 1600px.\n * bleed no max-width AND no horizontal padding. Strict edge\n * -to-edge for content that draws its own padding (a\n * flow canvas with its own pan/zoom region, a fullscreen\n * iframe, an embedded preview environment).\n */\nexport type PageWidth = 'comfortable' | 'wide' | 'full' | 'bleed';\n\nconst widthClass: Record<PageWidth, string> = {\n comfortable: 'max-w-6xl px-6 py-8 lg:px-10 lg:py-10',\n wide: 'max-w-7xl px-6 py-8 lg:px-10 lg:py-10',\n full: 'max-w-none px-6 py-8 lg:px-10 lg:py-10',\n bleed: 'max-w-none p-0',\n};\n\ntype Props = {\n children: ReactNode;\n width?: PageWidth;\n className?: string;\n};\n\n/**\n * The page-level container. Picks one of four width policies (see\n * PageWidth) and applies the canonical Cbox padding / vertical\n * rhythm. Every authenticated page in every Cbox app composes\n * through this — directly via `<PageShell>` or, more usually, via\n * the per-app `<Page>` wrapper that combines PageShell + PageHeader\n * + PageTabs.\n *\n * Width policy is the only knob exposed here. Padding, max-width,\n * gutter, vertical spacing between blocks — those are baked in so\n * the eye never has to track horizontal jitter between sibling\n * pages.\n */\nexport function PageShell({\n children,\n width = 'comfortable',\n className,\n}: Props) {\n return (\n <div\n className={cn(\n 'mx-auto w-full space-y-6',\n widthClass[width],\n className,\n )}\n >\n {children}\n </div>\n );\n}\n","import {\n useEffect,\n useId,\n useRef,\n useState,\n type ComponentType,\n type ReactNode,\n} from 'react';\nimport { cn } from '../utils/cn';\n\n/**\n * Section navigation: every \"tab\" is a real page with its own URL.\n * No internal active-state, no callbacks — the host's router is the\n * source of truth. This is what makes deep links and hard refreshes\n * lossless: paste any URL, the right tab is active and the right\n * panel renders, with no client-side coordination required.\n *\n * Layout:\n * ≥ sm horizontal underline strip + optional `actions` slot to\n * the right; sticky just under the TopBar with a hairline\n * border-bottom and a backdrop-blur for the scroll-into\n * effect.\n * < sm dropdown showing the active tab + chevron; opens a panel\n * with the full list. Actions reflow below the trigger.\n *\n * The same primitive runs the section nav across every Cbox app. It\n * lives here so that the visual contract is single-sourced — there's\n * no way for a feature page to invent its own slightly-different tab\n * strip.\n */\n\nexport type PageTabSpec = {\n /** Display label. Truncates inline if it overflows the strip. */\n label: string;\n /** Absolute or app-relative href. The host router renders this. */\n href: string;\n /**\n * Optional leading icon. Constrained to the icon shape we use\n * everywhere — this is how cbox-ui keeps icon weights aligned\n * across primitives without depending on `lucide-react`.\n */\n icon?: ComponentType<{ className?: string; strokeWidth?: number }>;\n /**\n * Optional badge — a count, status pill, or \"new\" indicator. Use\n * sparingly; one badge in a row is signal, three is noise.\n */\n badge?: ReactNode;\n /**\n * Numeric count rendered inline. Convenience for the common\n * \"Members 12\" pattern; mutually exclusive with `badge` (badge\n * wins if both are set).\n */\n count?: number;\n /**\n * Match the current path by prefix. Use for hub pages whose\n * nested routes should still highlight the parent tab — e.g.\n * `/org/<slug>/members` highlights when on\n * `/org/<slug>/members/<id>`.\n */\n matchPrefix?: boolean;\n};\n\nexport type PageTabsProps = {\n items: PageTabSpec[];\n /** Current pathname, host-supplied. Drives active-state matching. */\n currentPath: string;\n /**\n * The framework's link component. Inertia consumers pass the\n * Inertia `Link`; TanStack Router consumers pass their typed\n * `Link`; plain anchors are the fallback. We never invent\n * navigation here.\n */\n LinkComponent?: ComponentType<{\n href: string;\n prefetch?: boolean;\n className?: string;\n children: ReactNode;\n 'aria-current'?: 'page' | undefined;\n }>;\n /**\n * Right-aligned slot on desktop, reflowed under the dropdown on\n * mobile. Use for primary section actions (Invite, Add token,\n * Export…) that belong to the section as a whole rather than the\n * specific tab. The slot is always reserved on desktop so pages\n * with and without actions keep identical row geometry — no\n * layout shift between sibling tabs.\n */\n actions?: ReactNode;\n className?: string;\n};\n\nconst DefaultLink: ComponentType<{\n href: string;\n className?: string;\n children: ReactNode;\n 'aria-current'?: 'page' | undefined;\n}> = ({ href, className, children, 'aria-current': ariaCurrent }) => (\n <a href={href} className={className} aria-current={ariaCurrent}>\n {children}\n </a>\n);\n\nexport function PageTabs({\n items,\n currentPath,\n LinkComponent = DefaultLink,\n actions,\n className,\n}: PageTabsProps) {\n const activeHref = resolveActiveHref(items, currentPath);\n\n return (\n <div\n data-component=\"page-tabs\"\n className={cn(\n // Card-style chrome — same border, radius, bg as DataPanel\n // so the tab strip reads as a peer of the content panels\n // beneath it instead of floating on the page background.\n // Width matches PageShell content; no sticky positioning.\n 'rounded-lg border border-border bg-card',\n className,\n )}\n >\n {/* Desktop: strip + actions on the same baseline. The strip's\n active underline anchors the visual baseline of the row;\n the actions slot is always rendered (even when empty) so\n pages with and without actions stay byte-identical in\n width and content alignment. */}\n <div className=\"hidden items-end gap-3 px-3 sm:flex\">\n <DesktopStrip\n items={items}\n activeHref={activeHref}\n LinkComponent={LinkComponent}\n />\n <div className=\"flex min-h-12 shrink-0 items-center gap-2\">\n {actions}\n </div>\n </div>\n\n {/* Mobile: dropdown + actions stacked underneath. */}\n <div className=\"flex flex-col gap-2 p-3 sm:hidden\">\n <MobileDropdown\n items={items}\n activeHref={activeHref}\n LinkComponent={LinkComponent}\n />\n {actions !== undefined ? (\n <div className=\"flex flex-wrap items-center gap-2\">\n {actions}\n </div>\n ) : null}\n </div>\n </div>\n );\n}\n\ntype StripProps = {\n items: PageTabSpec[];\n activeHref: string | null;\n LinkComponent: NonNullable<PageTabsProps['LinkComponent']>;\n};\n\nfunction DesktopStrip({ items, activeHref, LinkComponent }: StripProps) {\n return (\n <nav\n // Pill-style tabs inside the card chrome read clearly as\n // switching controls: active gets a filled chip + ring,\n // inactive sits in plain text with a hover fill. The whole\n // strip is centered vertically inside the row so the actions\n // slot on the right shares the same baseline.\n className=\"flex min-h-12 flex-1 items-center gap-1 overflow-x-auto overflow-y-hidden py-1.5\"\n role=\"tablist\"\n aria-label=\"Section navigation\"\n >\n {items.map((item) => {\n const Icon = item.icon;\n const active = item.href === activeHref;\n\n return (\n <LinkComponent\n key={item.href}\n href={item.href}\n prefetch\n aria-current={active ? 'page' : undefined}\n className={cn(\n 'inline-flex items-center gap-2 rounded-md px-2.5 py-1.5 text-[13px] whitespace-nowrap transition-colors',\n active\n ? 'bg-secondary font-semibold text-foreground shadow-sm ring-1 ring-border-strong/60'\n : 'text-muted-foreground hover:bg-secondary/60 hover:text-foreground',\n )}\n >\n {Icon !== undefined ? (\n <Icon\n className={cn(\n 'h-3.5 w-3.5 shrink-0',\n active\n ? 'text-foreground'\n : 'text-muted-foreground',\n )}\n strokeWidth={1.7}\n />\n ) : null}\n <span>{item.label}</span>\n <ItemTrailing item={item} active={active} />\n </LinkComponent>\n );\n })}\n </nav>\n );\n}\n\nfunction MobileDropdown({ items, activeHref, LinkComponent }: StripProps) {\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement | null>(null);\n const listId = useId();\n\n const active = items.find((item) => item.href === activeHref) ?? items[0];\n\n // Click-outside + Escape close. Same popover contract every other\n // cbox-ui dropdown follows so it feels native to users navigating\n // by keyboard.\n useEffect(() => {\n if (! open) return;\n\n function onPointerDown(event: PointerEvent): void {\n if (\n ref.current !== null &&\n ! ref.current.contains(event.target as Node)\n ) {\n setOpen(false);\n }\n }\n\n function onKey(event: KeyboardEvent): void {\n if (event.key === 'Escape') setOpen(false);\n }\n\n window.addEventListener('pointerdown', onPointerDown);\n window.addEventListener('keydown', onKey);\n\n return () => {\n window.removeEventListener('pointerdown', onPointerDown);\n window.removeEventListener('keydown', onKey);\n };\n }, [open]);\n\n if (active === undefined) {\n return null;\n }\n\n const ActiveIcon = active.icon;\n\n return (\n <div ref={ref} className=\"relative\">\n <button\n type=\"button\"\n onClick={() => setOpen((v) => ! v)}\n aria-expanded={open}\n aria-haspopup=\"listbox\"\n aria-controls={listId}\n className={cn(\n 'flex w-full min-h-11 items-center justify-between gap-2 rounded-md border border-border bg-card px-3 text-left text-[13px] font-medium text-foreground transition-colors hover:border-border-strong',\n open && 'border-border-strong ring-2 ring-ring/30',\n )}\n >\n <span className=\"flex min-w-0 items-center gap-2\">\n {ActiveIcon !== undefined ? (\n <ActiveIcon\n className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\"\n strokeWidth={1.7}\n />\n ) : null}\n <span className=\"truncate\">{active.label}</span>\n <ItemTrailing item={active} active />\n </span>\n <Chevron open={open} />\n </button>\n\n {open ? (\n <ul\n id={listId}\n role=\"listbox\"\n aria-label=\"Section navigation\"\n className=\"absolute left-0 right-0 top-full z-30 mt-1 overflow-hidden rounded-md border border-border bg-popover shadow-lg\"\n >\n {items.map((item) => {\n const Icon = item.icon;\n const isActive = item.href === activeHref;\n\n return (\n <li key={item.href}>\n <LinkComponent\n href={item.href}\n prefetch\n aria-current={isActive ? 'page' : undefined}\n className={cn(\n 'flex w-full items-center gap-2 px-3 py-2.5 text-[13px] transition-colors',\n isActive\n ? 'bg-accent-soft font-semibold text-foreground'\n : 'text-muted-foreground hover:bg-secondary hover:text-foreground',\n )}\n >\n {Icon !== undefined ? (\n <Icon\n className={cn(\n 'h-3.5 w-3.5 shrink-0',\n isActive\n ? 'text-foreground'\n : 'text-muted-foreground',\n )}\n strokeWidth={1.7}\n />\n ) : null}\n <span className=\"flex-1 truncate\">\n {item.label}\n </span>\n <ItemTrailing\n item={item}\n active={isActive}\n />\n </LinkComponent>\n </li>\n );\n })}\n </ul>\n ) : null}\n </div>\n );\n}\n\nfunction ItemTrailing({\n item,\n active,\n}: {\n item: PageTabSpec;\n active: boolean;\n}): ReactNode {\n if (item.badge !== undefined) {\n return <span className=\"ml-1 shrink-0\">{item.badge}</span>;\n }\n\n if (item.count !== undefined) {\n return (\n <span\n className={cn(\n 'ml-1 shrink-0 rounded-sm border px-1 text-[10px] font-semibold tracking-tight tabular-nums',\n active\n ? 'border-border-strong bg-secondary text-foreground'\n : 'border-border bg-secondary/60 text-muted-foreground',\n )}\n >\n {item.count}\n </span>\n );\n }\n\n return null;\n}\n\nfunction Chevron({ open }: { open: boolean }): ReactNode {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={cn(\n 'shrink-0 text-muted-foreground transition-transform duration-150',\n open && 'rotate-180',\n )}\n aria-hidden\n >\n <path d=\"m3.5 5.5 3.5 3.5 3.5-3.5\" />\n </svg>\n );\n}\n\n/**\n * Strip query string and hash from a URL/href so active-state matching\n * compares paths only. Tab hrefs may carry `?org=<slug>` or other\n * adapter-injected params (id's withOrgContext, cortex's org pinning,\n * etc.); the user's current URL doesn't include those when the page\n * mounted via a path-only navigation. Without this strip, `/foo` and\n * `/foo?org=cbox` are not equal and no tab lights up.\n */\nfunction pathOnly(href: string): string {\n const queryIndex = href.indexOf('?');\n const hashIndex = href.indexOf('#');\n let end = href.length;\n if (queryIndex !== -1) end = Math.min(end, queryIndex);\n if (hashIndex !== -1) end = Math.min(end, hashIndex);\n\n return href.slice(0, end);\n}\n\n/**\n * Active-state resolver — picks the longest-matching href so a more\n * specific child wins over its parent. Without this rule, both\n * `/security` and `/security/passkeys` would match when the user is\n * on Passkeys and we'd light up two tabs.\n *\n * Matches paths only (query / hash stripped) so tab hrefs that carry\n * adapter-injected params still resolve.\n */\nfunction resolveActiveHref(\n items: PageTabSpec[],\n currentPath: string,\n): string | null {\n const current = pathOnly(currentPath);\n\n const candidates = items\n .map((item) => {\n const itemPath = pathOnly(item.href);\n const matched =\n item.matchPrefix === true\n ? current === itemPath ||\n current.startsWith(itemPath + '/')\n : current === itemPath;\n\n return matched ? item.href : null;\n })\n .filter((href): href is string => href !== null);\n\n if (candidates.length === 0) return null;\n\n return candidates.reduce((longest, href) =>\n href.length > longest.length ? href : longest,\n );\n}\n","import type { ComponentType, ReactNode } from 'react';\nimport { cn } from '../utils/cn';\n\n/**\n * A clickable list row — replaces the \"name on left + Manage button on\n * right\" pattern with a row that's clickable as a single Link, with a\n * visible hover state and a focus ring. Trailing content (badges,\n * action buttons) sits in the `trailing` slot, which renders alongside\n * the body but stops click-propagation on any nested interactive\n * control so action buttons there don't trigger row navigation.\n *\n * <RowLink href={editOrg(slug).url} LinkComponent={Link}>\n * <Avatar />\n * <div>\n * <p>Cbox Systems</p>\n * <p className=\"text-mono\">cbox-systems</p>\n * </div>\n * </RowLink>\n *\n * With trailing actions:\n *\n * <RowLink href={...} trailing={<StatusPill>owner</StatusPill>}>\n *\n * Hit target: the entire row. The Link wraps all content directly so\n * every pixel inside the row is clickable, including the trailing\n * area's whitespace. Interactive controls inside `trailing` (buttons,\n * inputs, anchors, role=\"button\") auto-stop the click via the\n * onClickCapture handler — no per-button stopPropagation boilerplate.\n */\n\nexport type RowLinkProps = {\n /** Destination URL — clicking anywhere on the row navigates here. */\n href: string;\n /** Row body. Compose freely; common pattern is avatar + text block. */\n children: ReactNode;\n /**\n * Right-aligned slot. Status pills, action buttons, kebab menus.\n * Interactive controls inside this slot auto-stop the row click\n * via DOM-traversal (button/a/input/select/textarea/[role=button]\n * /[data-stop-row-click]). No manual stopPropagation needed.\n */\n trailing?: ReactNode;\n /**\n * The framework's link component. Inertia consumers pass the\n * Inertia `Link`; TanStack Router consumers pass their typed\n * `Link`. Plain `<a>` is the fallback.\n */\n LinkComponent?: ComponentType<{\n href: string;\n prefetch?: boolean;\n className?: string;\n children: ReactNode;\n }>;\n /** Highlight as the active row (the user's current selection). */\n active?: boolean;\n /** Additional classes for the row container. */\n className?: string;\n};\n\nconst DefaultLink: ComponentType<{\n href: string;\n className?: string;\n children: ReactNode;\n}> = ({ href, className, children }) => (\n <a href={href} className={className}>\n {children}\n </a>\n);\n\nexport function RowLink({\n href,\n children,\n trailing,\n LinkComponent = DefaultLink,\n active = false,\n className,\n}: RowLinkProps) {\n return (\n <LinkComponent\n href={href}\n prefetch\n // The Link IS the row. Wrapping everything in the Link\n // means every pixel inside is clickable — no fiddly\n // overlay positioning or stretched-link hacks.\n className={cn(\n 'group flex w-full items-center gap-4 px-5 py-3.5 transition-colors focus-visible:bg-secondary/60 focus-visible:outline-none',\n active\n ? 'bg-accent-soft hover:bg-accent-soft/80'\n : 'hover:bg-secondary/60',\n className,\n )}\n >\n <span\n data-component=\"row-link\"\n data-active={active ? 'true' : undefined}\n // Body content. Captures clicks on `trailing`'s\n // interactive controls so they don't bubble up to the\n // Link and trigger the row navigation. The \"click\" on\n // a button inside trailing fires the button's handler\n // and stops there.\n onClickCapture={(event) => {\n const target = event.target as HTMLElement;\n if (\n target.closest(\n 'button, a, input, select, textarea, [role=\"button\"], [data-stop-row-click]',\n ) !== null &&\n target.closest('[data-row-body]') === null\n ) {\n event.stopPropagation();\n }\n }}\n className=\"flex w-full items-center gap-4\"\n >\n <span\n data-row-body\n className=\"flex min-w-0 flex-1 items-center gap-4\"\n >\n {children}\n </span>\n {trailing !== undefined ? (\n <span className=\"flex shrink-0 items-center gap-2\">\n {trailing}\n </span>\n ) : null}\n </span>\n </LinkComponent>\n );\n}\n","import type { LucideIcon } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport { cn } from '../utils/cn';\n\ntype Tone = 'info' | 'success' | 'warning' | 'destructive' | 'neutral';\n\nconst toneStyles: Record<Tone, { bg: string; fg: string }> = {\n info: { bg: 'bg-info-soft', fg: 'text-info' },\n success: { bg: 'bg-success-soft', fg: 'text-success' },\n warning: { bg: 'bg-warning-soft', fg: 'text-warning' },\n destructive: { bg: 'bg-destructive-soft', fg: 'text-destructive' },\n neutral: { bg: 'bg-secondary', fg: 'text-foreground' },\n};\n\ntype StatTileProps = {\n label: string;\n value: ReactNode;\n /** Small caption under the value. */\n suffix?: ReactNode;\n icon: LucideIcon;\n tone?: Tone;\n className?: string;\n};\n\n/**\n * Cortex-style metric tile. Coloured square icon block on the left,\n * label + value on the right, optional caption below the value.\n */\nexport function StatTile({\n label,\n value,\n suffix,\n icon: Icon,\n tone = 'info',\n className,\n}: StatTileProps) {\n const styles = toneStyles[tone];\n\n return (\n <div\n className={cn(\n 'flex items-center gap-3 rounded-lg border border-border bg-card p-4 shadow-[0_1px_2px_rgba(0,0,0,0.02)] transition-colors hover:border-border-strong',\n className,\n )}\n >\n <div\n className={cn(\n 'flex h-10 w-10 shrink-0 items-center justify-center rounded-md',\n styles.bg,\n )}\n >\n <Icon className={cn('h-5 w-5', styles.fg)} strokeWidth={1.8} />\n </div>\n <div className=\"min-w-0 flex-1 space-y-0.5\">\n <p className=\"tabular text-2xl leading-none font-semibold tracking-tight text-foreground\">\n {value}\n </p>\n <p className=\"truncate text-xs text-muted-foreground\">\n {label}\n </p>\n {suffix ? (\n <p className=\"text-mono truncate text-[10px] text-muted-foreground/80\">\n {suffix}\n </p>\n ) : null}\n </div>\n </div>\n );\n}\n","/**\n * URL-as-state — typed query-string parsing and serialization.\n *\n * The contract: anything that should survive a hard refresh, deep\n * link, or paste-share lives in the URL, not in React state. Tabs,\n * filters, search terms, pagination, sort order — every one of those\n * is a navigation, not a UI mutation. This module provides the typed\n * parsers and serializers; per-app adapters wire them to the host\n * router (Inertia's `router.get`, TanStack Router's `navigate`, etc.)\n * and shape the `[state, update]` ergonomics on top.\n *\n * Why not URLSearchParams directly? Because raw query strings throw\n * away types and have no notion of defaults. The schema declares both\n * once, and `buildUrlSearch` automatically elides values that match\n * their default so the URL stays human-readable. `?role=all&page=1`\n * collapses to `''` when `all` and `1` are the defaults. Going from\n * `state -> URL -> state` always round-trips.\n */\n\n/**\n * A single field in a URL schema. Encapsulates the three operations\n * that make typed URL state work:\n * - `parse(raw)` — string|null from the query string → typed value\n * - `serialize(v)` — typed value → string|null (null = drop the key)\n * - `isDefault(v)` — does this value equal the field's default? If\n * so, `buildUrlSearch` elides it to keep URLs short.\n */\nexport type UrlField<T> = {\n parse: (raw: string | null) => T;\n serialize: (value: T) => string | null;\n isDefault: (value: T) => boolean;\n};\n\n// `UrlField<unknown>` would block assignment from concrete fields\n// (variance: T appears in both contravariant and covariant positions).\n// `UrlField<any>` is the standard escape hatch; safety lives in\n// `InferUrlState` which keeps the value-side fully typed.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type UrlSchema = Record<string, UrlField<any>>;\n\n/**\n * Map a UrlSchema to its inferred state shape — `urlString('')` →\n * `string`, `urlEnum(['a', 'b'], 'a')` → `'a' | 'b'`, etc.\n */\nexport type InferUrlState<S extends UrlSchema> = {\n [K in keyof S]: S[K] extends UrlField<infer T> ? T : never;\n};\n\n/**\n * String field. The empty string is the conventional \"absent\" value\n * — it's what an HTML input gives you when the user clears it — so\n * we treat `'' === default` as \"drop the param\" by default. Pass an\n * explicit non-empty default if you genuinely want to persist `''`.\n */\nexport function urlString(defaultValue: string = ''): UrlField<string> {\n return {\n parse: (raw) => raw ?? defaultValue,\n serialize: (value) => (value === '' ? null : value),\n isDefault: (value) => value === defaultValue,\n };\n}\n\n/**\n * Integer field with optional clamping. Non-numeric input falls back\n * to the default rather than NaN; out-of-range input clamps to the\n * boundary. Both behaviours are belt-and-braces against URL tampering.\n */\nexport function urlNumber(\n defaultValue: number,\n options: { min?: number; max?: number } = {},\n): UrlField<number> {\n const clamp = (n: number): number => {\n if (options.min !== undefined && n < options.min) return options.min;\n if (options.max !== undefined && n > options.max) return options.max;\n\n return n;\n };\n\n return {\n parse: (raw) => {\n if (raw === null) return defaultValue;\n const parsed = Number.parseInt(raw, 10);\n if (Number.isNaN(parsed)) return defaultValue;\n\n return clamp(parsed);\n },\n serialize: (value) => String(value),\n isDefault: (value) => value === defaultValue,\n };\n}\n\n/**\n * Enum field — restrict to a fixed set of strings. Unknown values\n * fall back to the default rather than poisoning typed downstream\n * code with arbitrary user input. The `as const` on the values array\n * is what lets TS narrow the field type to the union.\n */\nexport function urlEnum<T extends string>(\n values: readonly T[],\n defaultValue: T,\n): UrlField<T> {\n const allowed = new Set<string>(values);\n\n return {\n parse: (raw) =>\n raw !== null && allowed.has(raw) ? (raw as T) : defaultValue,\n serialize: (value) => value,\n isDefault: (value) => value === defaultValue,\n };\n}\n\n/**\n * Boolean field. Only the literal string `'true'` parses to true so\n * we don't accidentally interpret `?flag=0` or `?flag=false` as truthy.\n */\nexport function urlBoolean(defaultValue: boolean = false): UrlField<boolean> {\n return {\n parse: (raw) => (raw === null ? defaultValue : raw === 'true'),\n serialize: (value) => (value ? 'true' : 'false'),\n isDefault: (value) => value === defaultValue,\n };\n}\n\n/**\n * Array-of-strings field — comma-joined in the URL. Useful for\n * multi-select filters (`?tags=foo,bar,baz`). Empty arrays drop the\n * param. Per-item parsing isn't customisable on purpose; if you need\n * a typed array of enums or numbers, build a thin wrapper.\n */\nexport function urlStringArray(\n defaultValue: readonly string[] = [],\n): UrlField<string[]> {\n const defaultKey = [...defaultValue].sort().join(',');\n\n return {\n parse: (raw) => {\n if (raw === null || raw === '') return [...defaultValue];\n\n return raw.split(',').filter((item) => item !== '');\n },\n serialize: (value) => (value.length === 0 ? null : value.join(',')),\n isDefault: (value) => [...value].sort().join(',') === defaultKey,\n };\n}\n\n/**\n * Convenience: declare a schema. Pure passthrough — exists to give\n * call sites a single, named import that reads like a definition\n * rather than a bare object literal.\n */\nexport function defineUrlSchema<S extends UrlSchema>(schema: S): S {\n return schema;\n}\n\n/**\n * Parse a query string into a typed state object. Accepts both\n * leading-`?` and bare forms. Unknown keys are silently dropped —\n * the schema is the closed allow-list, which keeps server- and\n * client-readable surface area bounded.\n */\nexport function parseUrlSearch<S extends UrlSchema>(\n search: string,\n schema: S,\n): InferUrlState<S> {\n const normalised = search.startsWith('?') ? search.slice(1) : search;\n const params = new URLSearchParams(normalised);\n const state = {} as InferUrlState<S>;\n\n for (const key of Object.keys(schema)) {\n const field = schema[key];\n if (field === undefined) continue;\n (state as Record<string, unknown>)[key] = field.parse(params.get(key));\n }\n\n return state;\n}\n\n/**\n * Serialize a typed state back to a query string. Default-valued\n * fields are elided so URLs stay short and bookmarks stay portable\n * across schema changes (a URL with `?page=1` keeps working when\n * `page` later stops being serialised because it's the default).\n *\n * Returns the serialised query without a leading `?`. The host\n * adapter is responsible for prepending or stitching it onto a path.\n */\nexport function buildUrlSearch<S extends UrlSchema>(\n state: InferUrlState<S>,\n schema: S,\n): string {\n const params = new URLSearchParams();\n\n for (const key of Object.keys(schema)) {\n const field = schema[key];\n if (field === undefined) continue;\n const value = (state as Record<string, unknown>)[key];\n\n if (field.isDefault(value)) continue;\n\n const serialized = field.serialize(value);\n if (serialized !== null) {\n params.set(key, serialized);\n }\n }\n\n return params.toString();\n}\n"]}
1
+ {"version":3,"sources":["../src/context/cbox-id.tsx","../src/layout/app-content.tsx","../src/layout/app-shell.tsx","../src/context/localization.tsx","../src/components/app-icon.tsx","../src/layout/cbox-brand.tsx","../src/layout/cbox-app-sidebar.tsx","../src/layout/cbox-mobile-nav-drawer.tsx","../src/components/app-switcher.tsx","../src/primitives/empty-state.tsx","../src/primitives/status-pill.tsx","../src/surfaces/surface-modal.tsx","../src/surfaces/inbox-surface.tsx","../src/surfaces/surface-state.tsx","../src/components/notifications-bell.tsx","../src/components/search-trigger.tsx","../src/components/user-menu.tsx","../src/layout/cbox-app-shell.tsx","../src/primitives/context-bar.tsx","../src/layout/cbox-org-context-bar.tsx","../src/components/org-switcher.tsx","../src/layout/top-bar.tsx","../src/components/app-launcher.tsx","../src/components/app-catalog.tsx","../src/primitives/combobox.tsx","../src/primitives/data-panel.tsx","../src/primitives/heading.tsx","../src/primitives/key-value.tsx","../src/primitives/page-header.tsx","../src/primitives/page-shell.tsx","../src/primitives/page-tabs.tsx","../src/primitives/row-link.tsx","../src/primitives/stat-tile.tsx","../src/utils/url-state.ts","../src/layout/cbox-workspace-shell.tsx","../src/charts/sparkline.tsx"],"names":["jsx","createContext","useContext","jsxs","useState","useEffect","useMemo","Fragment","useRef","X","useCallback","SearchIcon","initials","Chevron","deriveInitials","AppRow","buildOrgUrl","Lock","Grid","Check","useId","id","Plus","DefaultLink","toneStyles","Menu","PanelLeftOpen","PanelLeftClose"],"mappings":";;;;;;AA4MA,IAAM,aAAA,GAAgB,cAAyC,IAAI,CAAA;AAE5D,SAAS,cAAA,CAAe;AAAA,EAC3B,KAAA;AAAA,EACA;AACJ,CAAA,EAGG;AACC,EAAA,uBAAO,GAAA,CAAC,aAAA,CAAc,QAAA,EAAd,EAAuB,OAAe,QAAA,EAAS,CAAA;AAC3D;AAEO,SAAS,SAAA,GAAgC;AAC5C,EAAA,MAAM,GAAA,GAAM,WAAW,aAAa,CAAA;AACpC,EAAA,IAAI,QAAQ,IAAA,EAAM;AACd,IAAA,MAAM,IAAI,KAAA;AAAA,MACN;AAAA,KAGJ;AAAA,EACJ;AACA,EAAA,OAAO,GAAA;AACX;AAMO,SAAS,iBAAA,GAA+C;AAC3D,EAAA,OAAO,WAAW,aAAa,CAAA;AACnC;AC9NO,SAAS,WAAW,EAAE,QAAA,EAAU,SAAA,EAAW,GAAG,OAAM,EAAU;AACjE,EAAA,uBACIA,GAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACI,GAAG,KAAA;AAAA,MACJ,SAAA,EAAW,EAAA;AAAA,QACP,qEAAA;AAAA,QACA;AAAA,OACJ;AAAA,MAEC;AAAA;AAAA,GACL;AAER;ACdO,SAAS,QAAA,CAAS,EAAE,QAAA,EAAS,EAA4B;AAC5D,EAAA,uBACIA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+CACV,QAAA,EACL,CAAA;AAER;ACVA,IAAM,eAAeC,aAAAA,CAA4F;AAAA,EAC7G,MAAA,EAAQ,IAAA;AAAA,EACR,CAAA,EAAG,WAAA;AAAA,EACH,YAAY,CAAC,KAAA,KAAU,IAAI,IAAA,CAAK,KAAK,EAAE,cAAA;AAC3C,CAAC,CAAA;AAEM,SAAS,WAAA,CAAY,OAAA,EAAiB,MAAA,GAAgC,EAAC,EAAW;AACrF,EAAA,OAAO,OAAA,CAAQ,OAAA;AAAA,IAAQ,8BAAA;AAAA,IAAgC,CAAC,KAAA,EAAO,GAAA,KAC3D,MAAA,CAAO,UAAU,cAAA,CAAe,IAAA,CAAK,MAAA,EAAQ,GAAG,CAAA,GAAI,MAAA,CAAO,MAAA,CAAO,GAAG,CAAC,CAAA,GAAI;AAAA,GAC9E;AACJ;AAGO,SAAS,yBAAyB,EAAE,MAAA,EAAQ,WAAW,UAAA,GAAa,WAAA,EAAa,UAAS,EAK9F;AACC,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,OAAO,EAAE,MAAA,EAAQ,CAAA,EAAG,SAAA,EAAW,UAAA,EAAW,CAAA,EAAI,CAAC,MAAA,EAAQ,SAAA,EAAW,UAAU,CAAC,CAAA;AACnG,EAAA,uBAAOD,GAAAA,CAAC,YAAA,CAAa,QAAA,EAAb,EAAsB,OAAe,QAAA,EAAS,CAAA;AAC1D;AAEO,SAAS,mBAAA,GAAsB;AAClC,EAAA,OAAOE,WAAW,YAAY,CAAA;AAClC;AAEA,SAAS,YAAY,KAAA,EAAuB;AACxC,EAAA,OAAO,IAAI,IAAA,CAAK,KAAK,CAAA,CAAE,cAAA,EAAe;AAC1C;ACxBA,IAAM,IAAA,GAAO,kBAAA;AACb,IAAM,KAAA,GAAQ,kBAAA;AACd,IAAM,QAAwB,EAAC;AAC/B,IAAI,KAAA,GAAsD,EAAE,GAAA,EAAK,IAAA,EAAM,MAAM,KAAA,EAAM;AAEnF,SAAS,OAAA,GAA0B;AAC/B,EAAA,IAAI;AACA,IAAA,OAAO,OAAO,MAAA,KAAW,WAAA,GAAc,IAAA,GAAO,MAAA,CAAO,YAAA;AAAA,EACzD,CAAA,CAAA,MAAQ;AACJ,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;AAGO,SAAS,mBAAA,GAAsC;AAClD,EAAA,IAAI,GAAA,GAAqB,IAAA;AACzB,EAAA,IAAI;AACA,IAAA,GAAA,GAAM,OAAA,EAAQ,EAAG,OAAA,CAAQ,IAAI,CAAA,IAAK,IAAA;AAAA,EACtC,CAAA,CAAA,MAAQ;AACJ,IAAA,GAAA,GAAM,IAAA;AAAA,EACV;AACA,EAAA,IAAI,GAAA,KAAQ,KAAA,CAAM,GAAA,EAAK,OAAO,KAAA,CAAM,IAAA;AACpC,EAAA,IAAI,IAAA,GAAuB,KAAA;AAC3B,EAAA,IAAI;AACA,IAAA,MAAM,QAAiB,GAAA,KAAQ,IAAA,GAAO,EAAC,GAAI,IAAA,CAAK,MAAM,GAAG,CAAA;AACzD,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACtB,MAAA,IAAA,GAAO,KAAA,CAAM,OAAA,CAAQ,CAAC,KAAA,KAAmB;AACrC,QAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,SAAa,EAAC;AACzD,QAAA,MAAM,GAAA,GAAM,KAAA;AACZ,QAAA,IAAI,OAAO,IAAI,GAAA,KAAQ,QAAA,IAAY,OAAO,GAAA,CAAI,IAAA,KAAS,QAAA,EAAU,OAAO,EAAC;AACzE,QAAA,OAAO,CAAC,EAAE,GAAA,EAAK,IAAI,GAAA,EAAK,IAAA,EAAM,IAAI,IAAA,EAAM,QAAA,EAAU,aAAA,CAAc,GAAA,CAAI,QAAQ,CAAA,EAAG,aAAA,EAAe,cAAc,GAAA,CAAI,aAAa,GAAG,CAAA;AAAA,MACpI,CAAC,CAAA;AAAA,IACL;AAAA,EACJ,CAAA,CAAA,MAAQ;AACJ,IAAA,IAAA,GAAO,KAAA;AAAA,EACX;AACA,EAAA,KAAA,GAAQ,EAAE,KAAK,IAAA,EAAK;AAEpB,EAAA,OAAO,IAAA;AACX;AAEA,SAAS,UAAU,MAAA,EAAgC;AAC/C,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,MAAM,MAAA;AAChD,EAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,KAAwB;AAAE,IAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,IAAA,EAAM,MAAA,EAAO;AAAA,EAAG,CAAA;AACnF,EAAA,QAAA,CAAS,gBAAA,CAAiB,OAAO,MAAM,CAAA;AACvC,EAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,aAAa,CAAA;AAChD,EAAA,OAAO,MAAM;AACT,IAAA,QAAA,CAAS,mBAAA,CAAoB,OAAO,MAAM,CAAA;AAC1C,IAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,aAAa,CAAA;AAAA,EACvD,CAAA;AACJ;AAGO,SAAS,mBAAmB,IAAA,EAAmH;AAClJ,EAAA,MAAM,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,EAAE,GAAA,EAAK,MAAM,QAAA,EAAU,aAAA,QAAqB,EAAE,GAAA,EAAK,MAAM,QAAA,EAAU,QAAA,IAAY,MAAM,aAAA,EAAe,aAAA,IAAiB,MAAK,CAAE,CAAA;AACnJ,EAAA,IAAI;AACA,IAAA,OAAA,IAAW,OAAA,CAAQ,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA;AAAA,EACjD,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,IAAI,OAAO,aAAa,WAAA,EAAa,QAAA,CAAS,cAAc,IAAI,WAAA,CAAY,KAAK,CAAC,CAAA;AACtF;AAGO,SAAS,kBAAA,GAAqC;AACjD,EAAA,OAAO,oBAAA,CAAqB,SAAA,EAAW,mBAAA,EAAqB,MAAM,KAAK,CAAA;AAC3E;AAGO,SAAS,cAAc,GAAA,EAA6B;AACvD,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,KAAQ,IAAI,OAAO,IAAA;AAClD,EAAA,IAAI;AACA,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,GAAG,CAAA;AAC1B,IAAA,OAAO,MAAA,CAAO,QAAA,KAAa,QAAA,GAAW,MAAA,CAAO,IAAA,GAAO,IAAA;AAAA,EACxD,CAAA,CAAA,MAAQ;AACJ,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;AAEA,SAAS,SAAS,IAAA,EAAsB;AACpC,EAAA,OAAO,KAAK,OAAA,CAAQ,eAAA,EAAiB,EAAE,CAAA,CAAE,KAAA,CAAM,GAAG,CAAC,CAAA;AACvD;AAqBO,SAAS,WAAA,CAAY,EAAE,IAAA,EAAM,OAAA,EAAS,aAAa,SAAA,GAAY,SAAA,EAAW,UAAS,EAAqB;AAC3G,EAAA,MAAM,KAAA,GAAQ,cAAc,OAAO,CAAA;AACnC,EAAA,MAAM,IAAA,GAAO,cAAc,WAAW,CAAA;AACtC,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAwB,IAAI,CAAA;AACxD,EAAA,MAAM,MAAM,CAAA,EAAG,KAAA,IAAS,EAAE,CAAA,CAAA,EAAI,QAAQ,EAAE,CAAA,CAAA;AACxC,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,MAAA,KAAW,GAAA,EAAK;AAClC,IAAA,IAAI,aAAa,MAAA,EAAW,uBAAOF,GAAAA,CAAA,YAAG,QAAA,EAAA,QAAA,EAAS,CAAA;AAC/C,IAAA,uBAAOA,GAAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAW,IAAA,EAAC,SAAA,EAAW,EAAA,CAAG,iGAAA,EAAmG,SAAS,CAAA,EAAI,QAAA,EAAA,QAAA,CAAS,IAAI,CAAA,EAAE,CAAA;AAAA,EAC1K;AACA,EAAA,MAAM,IAAA,GAAO,MAAM,SAAA,CAAU,GAAG,CAAA;AAEhC,EAAA,uBACI,IAAA,CAAC,UAAK,aAAA,EAAW,IAAA,EAAC,WAAW,EAAA,CAAG,mEAAA,EAAqE,SAAS,CAAA,EAC1G,QAAA,EAAA;AAAA,oBAAAA,IAAC,KAAA,EAAA,EAAI,GAAA,EAAK,OAAO,GAAA,EAAI,EAAA,EAAG,UAAS,OAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,SAAA,EAAW,GAAG,cAAA,EAAgB,IAAA,KAAS,OAAO,qBAAA,GAAwB,oBAAA,EAAsB,eAAe,CAAA,EAAG,CAAA;AAAA,IACrK,IAAA,KAAS,IAAA,oBAAQA,GAAAA,CAAC,SAAI,GAAA,EAAK,IAAA,EAAM,GAAA,EAAI,EAAA,EAAG,QAAA,EAAS,OAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,WAAU,8CAAA,EAA+C;AAAA,GAAA,EACtI,CAAA;AAER;AAYO,SAAS,gBAAgB,EAAE,MAAA,EAAQ,YAAY,SAAA,EAAW,QAAA,GAAW,MAAK,EAAyB;AACtG,EAAA,MAAM,MAAM,kBAAA,EAAmB,CAAE,KAAK,CAAA,KAAA,KAAS,KAAA,CAAM,QAAQ,MAAM,CAAA;AACnE,EAAA,IAAI,GAAA,KAAQ,UAAa,GAAA,CAAI,QAAA,KAAa,MAAM,uBAAOA,GAAAA,CAAA,QAAA,EAAA,EAAG,QAAA,EAAA,QAAA,EAAS,CAAA;AAEnE,EAAA,uBAAOA,GAAAA,CAAC,WAAA,EAAA,EAAY,IAAA,EAAM,IAAI,IAAA,EAAM,OAAA,EAAS,GAAA,CAAI,QAAA,EAAU,aAAa,GAAA,CAAI,aAAA,EAAe,SAAA,EAAsB,QAAA,EAAU,YAAY,MAAA,EAAW,CAAA;AACtJ;AC3GO,SAAS,SAAA,CAAU;AAAA,EACtB,MAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA,GAAY,QAAA;AAAA,EACZ,IAAA,GAAO,MAAA;AAAA,EACP,SAAA,GAAY,KAAA;AAAA,EACZ;AACJ,CAAA,EAAmB;AACf,EAAA,IAAI,SAAA,EAAW;AACX,IAAA,MAAM,2BACFA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACG,GAAA,EAAK,GAAG,SAAS,CAAA,cAAA,CAAA;AAAA,QACjB,MAAA,EAAQ,CAAA,EAAG,SAAS,CAAA,mBAAA,EAAsB,SAAS,CAAA,oBAAA,CAAA;AAAA,QACnD,GAAA,EAAI,MAAA;AAAA,QACJ,KAAA,EAAO,EAAA;AAAA,QACP,MAAA,EAAQ,EAAA;AAAA,QACR,SAAA,EAAW,EAAA,CAAG,oBAAA,EAAsB,SAAS;AAAA;AAAA,KACjD;AAGJ,IAAA,uBAAOA,GAAAA,CAAC,eAAA,EAAA,EAAgB,MAAA,EAAgB,SAAA,EAAW,GAAG,SAAA,EAAW,SAAS,CAAA,EAAG,QAAA,EAAU,QAAA,EAAU,CAAA;AAAA,EACrG;AAEA,EAAA,MAAM,WACF,IAAA,KAAS,OAAA,GACH,GAAG,SAAS,CAAA,oBAAA,CAAA,GACZ,GAAG,SAAS,CAAA,cAAA,CAAA;AACtB,EAAA,MAAM,iBACF,IAAA,KAAS,OAAA,GACH,GAAG,SAAS,CAAA,uBAAA,CAAA,GACZ,GAAG,SAAS,CAAA,iBAAA,CAAA;AAEtB,EAAA,MAAM,WAAA,GAAc,OAAA,KAAY,MAAA,GAAY,MAAA,GAAS,OAAA;AAErD,EAAA,uBACIG,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,SAAA,EAAW,EAAA,CAAG,gCAAA,EAAkC,SAAS,CAAA;AAAA,MACzD,YAAA,EAAY,aAAU,MAAM,CAAA,CAAA;AAAA,MAE5B,QAAA,EAAA;AAAA,wBAAAH,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACG,GAAA,EAAK,QAAA;AAAA,YACL,MAAA,EAAQ,CAAA,EAAG,QAAQ,CAAA,KAAA,EAAQ,cAAc,CAAA,GAAA,CAAA;AAAA,YACzC,GAAA,EAAI,MAAA;AAAA,YACJ,MAAA,EAAQ,EAAA;AAAA,YACR,SAAA,EAAU,6BAAA;AAAA,YACV,SAAA,EAAW;AAAA;AAAA,SACf;AAAA,QACC,WAAA,KAAgB,IAAA,IAAQ,WAAA,KAAgB,EAAA,mBACrCG,IAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACG,SAAA,EAAW,EAAA;AAAA,cACP,6CAAA;AAAA,cACA,IAAA,KAAS,UACH,eAAA,GACA;AAAA,aACV;AAAA,YACH,QAAA,EAAA;AAAA,cAAA,OAAA;AAAA,cACM;AAAA;AAAA;AAAA,SACP,GACA;AAAA;AAAA;AAAA,GACR;AAER;ACzBO,SAAS,cAAA,CAAe;AAAA,EAC3B,MAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA,GAAY,GAAA;AAAA,EACZ,QAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA,GAAY,KAAA;AAAA,EACZ;AACJ,CAAA,EAAwB;AACpB,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,mBAAA,EAAoB;AAClC,EAAA,uBACIA,IAAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACG,WAAA,EAAU,kBAAA;AAAA,MACV,gBAAA,EAAgB,YAAY,MAAA,GAAS,OAAA;AAAA,MACrC,SAAA,EAAW,EAAA;AAAA,QACP,2HAAA;AAAA,QACA,YAAY,UAAA,GAAa,WAAA;AAAA,QACzB;AAAA,OACJ;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAH,GAAAA;AAAA,UAAC,aAAA;AAAA,UAAA;AAAA,YACG,IAAA,EAAM,SAAA;AAAA,YACN,YAAA,EAAY,EAAE,MAAM,CAAA;AAAA,YACpB,SAAA,EAAW,EAAA;AAAA,cACP,mEAAA;AAAA,cACA,YAAY,qBAAA,GAAwB;AAAA,aACxC;AAAA,YAEA,QAAA,kBAAAA,GAAAA;AAAA,cAAC,SAAA;AAAA,cAAA;AAAA,gBACG,MAAA;AAAA,gBACA,OAAA,EAAS,YAAA;AAAA,gBACT,SAAA;AAAA,gBACA;AAAA;AAAA;AACJ;AAAA,SACJ;AAAA,wBAEAA,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACG,SAAA,EAAW,EAAA;AAAA,cACP,kCAAA;AAAA,cACA,YAAY,gBAAA,GAAmB;AAAA,aACnC;AAAA,YAEC,QAAA,EAAA,QAAA,CAAS,IAAI,CAAC,OAAA,qBACXG,IAAAA,CAAC,KAAA,EAAA,EAAwB,WAAU,WAAA,EAC9B,QAAA,EAAA;AAAA,cAAA,SAAA,GAAY,uBACTH,GAAAA,CAAC,OAAE,SAAA,EAAU,wBAAA,EACR,kBAAQ,KAAA,EACb,CAAA;AAAA,8BAEJA,IAAC,IAAA,EAAA,EAAG,SAAA,EAAU,eACT,QAAA,EAAA,OAAA,CAAQ,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACzB,gBAAA,MAAM,MAAA,GAAS,IAAA,CAAK,WAAA,KAAgB,IAAA,GAC9B,gBAAgB,IAAA,CAAK,IAAA,IACrB,WAAA,CAAY,UAAA,CAAW,IAAA,CAAK,IAAA,GAAO,GAAG,CAAA,GACtC,gBAAgB,IAAA,CAAK,IAAA;AAC3B,gBAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAElB,gBAAA,uBACIA,GAAAA,CAAC,IAAA,EAAA,EACG,QAAA,kBAAAG,IAAAA;AAAA,kBAAC,aAAA;AAAA,kBAAA;AAAA,oBACG,MAAM,IAAA,CAAK,IAAA;AAAA,oBACX,QAAA,EAAQ,IAAA;AAAA,oBACR,YAAA,EACI,SAAA,GACM,IAAA,CAAK,KAAA,GACL,MAAA;AAAA,oBAEV,KAAA,EACI,SAAA,GACM,IAAA,CAAK,KAAA,GACL,MAAA;AAAA,oBAEV,SAAA,EAAW,EAAA;AAAA,sBACP,YACM,qFAAA,GACA,sFAAA;AAAA,sBACN,SACM,gEAAA,GACA;AAAA,qBACV;AAAA,oBAEA,QAAA,EAAA;AAAA,sCAAAH,GAAAA;AAAA,wBAAC,IAAA;AAAA,wBAAA;AAAA,0BACG,SAAA,EAAW,EAAA;AAAA,4BACP,kBAAA;AAAA,4BACA,SACM,iBAAA,GACA;AAAA,2BACV;AAAA,0BACA,WAAA,EAAa;AAAA;AAAA,uBACjB;AAAA,sBACC,SAAA,GAAY,uBACTA,GAAAA,CAAC,UAAK,SAAA,EAAU,iBAAA,EACX,eAAK,KAAA,EACV;AAAA;AAAA;AAAA,iBAER,EAAA,EArCK,KAAK,KAsCd,CAAA;AAAA,cAER,CAAC,CAAA,EACL;AAAA,aAAA,EAAA,EAxDM,OAAA,CAAQ,KAyDlB,CACH;AAAA;AAAA;AACL;AAAA;AAAA,GACJ;AAER;ACnJO,SAAS,mBAAA,CAAoB;AAAA,EAChC,IAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA,GAAY,GAAA;AAAA,EACZ,QAAA;AAAA,EACA,WAAA;AAAA,EACA;AACJ,CAAA,EAA6B;AACzB,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,mBAAA,EAAoB;AAClC,EAAA,SAAA,CAAU,MAAM;AACZ,IAAA,IAAI,CAAC,IAAA,EAAM;AACP,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAqB;AAChC,MAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACpB,QAAA,OAAA,EAAQ;AAAA,MACZ;AAAA,IACJ,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,KAAK,CAAA;AAE1C,IAAA,MAAM,YAAA,GAAe,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,QAAA;AACzC,IAAA,QAAA,CAAS,IAAA,CAAK,MAAM,QAAA,GAAW,QAAA;AAE/B,IAAA,OAAO,MAAM;AACT,MAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,KAAK,CAAA;AAC7C,MAAA,QAAA,CAAS,IAAA,CAAK,MAAM,QAAA,GAAW,YAAA;AAAA,IACnC,CAAA;AAAA,EACJ,CAAA,EAAG,CAAC,IAAA,EAAM,OAAO,CAAC,CAAA;AAElB,EAAA,uBACIG,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,SAAA,EAAW,EAAA;AAAA,QACP,8BAAA;AAAA,QACA,OAAO,EAAA,GAAK;AAAA,OAChB;AAAA,MACA,aAAA,EAAa,OAAO,OAAA,GAAU,MAAA;AAAA,MAE9B,QAAA,EAAA;AAAA,wBAAAH,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACG,OAAA,EAAS,OAAA;AAAA,YACT,SAAA,EAAW,EAAA;AAAA,cACP,8DAAA;AAAA,cACA,OAAO,aAAA,GAAgB;AAAA;AAC3B;AAAA,SACJ;AAAA,wBACAG,IAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACG,IAAA,EAAK,QAAA;AAAA,YACL,YAAA,EAAW,MAAA;AAAA,YACX,YAAA,EAAY,EAAE,YAAY,CAAA;AAAA,YAC1B,SAAA,EAAW,EAAA;AAAA,cACP,+JAAA;AAAA,cACA,OAAO,eAAA,GAAkB;AAAA,aAC7B;AAAA,YAEA,QAAA,EAAA;AAAA,8BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8FAAA,EACX,QAAA,EAAA;AAAA,gCAAAH,GAAAA;AAAA,kBAAC,aAAA;AAAA,kBAAA;AAAA,oBACG,IAAA,EAAM,SAAA;AAAA,oBACN,YAAA,EAAY,EAAE,MAAM,CAAA;AAAA,oBACpB,SAAA,EAAU,mBAAA;AAAA,oBAEV,QAAA,kBAAAA,GAAAA;AAAA,sBAAC,SAAA;AAAA,sBAAA;AAAA,wBACG,MAAA;AAAA,wBACA,OAAA,EAAS,YAAA;AAAA,wBACT,SAAA;AAAA,wBACA,SAAA,EAAW;AAAA;AAAA;AACf;AAAA,iBACJ;AAAA,gCACAA,GAAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBACG,IAAA,EAAK,QAAA;AAAA,oBACL,OAAA,EAAS,OAAA;AAAA,oBACT,YAAA,EAAY,EAAE,kBAAkB,CAAA;AAAA,oBAChC,SAAA,EAAU,6IAAA;AAAA,oBAEV,0BAAAA,GAAAA,CAAC,CAAA,EAAA,EAAE,SAAA,EAAU,SAAA,EAAU,aAAa,GAAA,EAAK;AAAA;AAAA;AAC7C,eAAA,EACJ,CAAA;AAAA,8BACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iDAAA,EACV,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,qBACXG,IAAAA,CAAC,KAAA,EAAA,EAAwB,WAAU,WAAA,EAC/B,QAAA,EAAA;AAAA,gCAAAH,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,wBAAA,EACR,kBAAQ,KAAA,EACb,CAAA;AAAA,gCACAA,IAAC,IAAA,EAAA,EAAG,SAAA,EAAU,eACT,QAAA,EAAA,OAAA,CAAQ,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACzB,kBAAA,MAAM,SACF,IAAA,CAAK,WAAA,KAAgB,OACf,WAAA,KAAgB,IAAA,CAAK,QACrB,WAAA,CAAY,UAAA;AAAA,oBACR,KAAK,IAAA,GAAO;AAAA,mBAChB,GACA,gBAAgB,IAAA,CAAK,IAAA;AAC/B,kBAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAElB,kBAAA,uBACIA,GAAAA,CAAC,IAAA,EAAA,EACG,QAAA,kBAAAG,IAAAA;AAAA,oBAAC,aAAA;AAAA,oBAAA;AAAA,sBACG,MAAM,IAAA,CAAK,IAAA;AAAA,sBACX,QAAA,EAAQ,IAAA;AAAA,sBACR,SAAA,EAAW,EAAA;AAAA,wBACP,oFAAA;AAAA,wBACA,SACM,gEAAA,GACA;AAAA,uBACV;AAAA,sBAEA,QAAA,EAAA;AAAA,wCAAAH,GAAAA;AAAA,0BAAC,IAAA;AAAA,0BAAA;AAAA,4BACG,SAAA,EAAW,EAAA;AAAA,8BACP,kBAAA;AAAA,8BACA,SACM,iBAAA,GACA;AAAA,6BACV;AAAA,4BACA,WAAA,EAAa;AAAA;AAAA,yBACjB;AAAA,wCACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAA,EACX,eAAK,KAAA,EACV;AAAA;AAAA;AAAA,mBACJ,EAAA,EAvBK,KAAK,KAwBd,CAAA;AAAA,gBAER,CAAC,CAAA,EACL;AAAA,eAAA,EAAA,EA3CM,OAAA,CAAQ,KA4ClB,CACH,CAAA,EACL;AAAA;AAAA;AAAA;AACJ;AAAA;AAAA,GACJ;AAER;AC7HO,SAAS,WAAA,CAAY,EAAE,SAAA,EAAW,gBAAA,EAAiB,EAAqB;AAC3E,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,mBAAA,EAAoB;AAClC,EAAA,MAAM,SAAS,iBAAA,EAAkB;AACjC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAII,SAAS,KAAK,CAAA;AACtC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAS,EAAE,CAAA;AACrC,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAAS,CAAC,CAAA;AAChD,EAAA,MAAM,YAAA,GAAe,OAA8B,IAAI,CAAA;AACvD,EAAA,MAAM,SAAA,GAAY,OAAgC,IAAI,CAAA;AAItD,EAAAC,UAAU,MAAM;AACZ,IAAA,IAAI,IAAA,EAAM;AACN,MAAA,QAAA,CAAS,EAAE,CAAA;AACX,MAAA,cAAA,CAAe,CAAC,CAAA;AAIhB,MAAA,MAAM,KAAK,qBAAA,CAAsB,MAAM,SAAA,CAAU,OAAA,EAAS,OAAO,CAAA;AACjE,MAAA,OAAO,MAAM,qBAAqB,EAAE,CAAA;AAAA,IACxC;AAAA,EACJ,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAGT,EAAAA,UAAU,MAAM;AACZ,IAAA,IAAI,CAAC,IAAA,EAAM;AACP,MAAA;AAAA,IACJ;AAEA,IAAA,SAAS,cAAc,KAAA,EAA2B;AAC9C,MAAA,IACI,YAAA,CAAa,YAAY,IAAA,IACzB,CAAC,aAAa,OAAA,CAAQ,QAAA,CAAS,KAAA,CAAM,MAAc,CAAA,EACrD;AACE,QAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,MACjB;AAAA,IACJ;AAEA,IAAA,SAAS,MAAM,KAAA,EAA4B;AACvC,MAAA,IAAI,KAAA,CAAM,QAAQ,QAAA,EAAU;AACxB,QAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,MACjB;AAAA,IACJ;AAEA,IAAA,MAAA,CAAO,gBAAA,CAAiB,eAAe,aAAa,CAAA;AACpD,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,KAAK,CAAA;AAExC,IAAA,OAAO,MAAM;AACT,MAAA,MAAA,CAAO,mBAAA,CAAoB,eAAe,aAAa,CAAA;AACvD,MAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,KAAK,CAAA;AAAA,IAC/C,CAAA;AAAA,EACJ,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAGT,EAAA,IAAI,MAAA,KAAW,IAAA,IAAQ,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA,EAAG;AAC7C,IAAA,OAAO,IAAA;AAAA,EACX;AAEA,EAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AACpB,EAAA,MAAM,OAAA,GAAU,OAAO,mBAAA,EAAqB,IAAA;AAG5C,EAAA,MAAM,UAAA,GAAa,KAAK,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,OAAA,KAAY,IAAI,CAAA,IAAK,IAAA;AAI3D,EAAA,MAAM,EAAE,QAAA,EAAU,MAAA,EAAQ,cAAA,EAAe,GAAIC,QAAQ,MAAM;AACvD,IAAA,MAAM,CAAA,GAAI,KAAA,CAAM,IAAA,EAAK,CAAE,WAAA,EAAY;AACnC,IAAA,MAAM,OAAA,GAAU,CAAC,GAAA,KAAqB;AAClC,MAAA,IAAI,MAAM,EAAA,EAAI;AACV,QAAA,OAAO,IAAA;AAAA,MACX;AACA,MAAA,OACI,GAAA,CAAI,KAAK,WAAA,EAAY,CAAE,SAAS,CAAC,CAAA,IACjC,IAAI,GAAA,CAAI,WAAA,GAAc,QAAA,CAAS,CAAC,MAC/B,GAAA,CAAI,WAAA,EAAa,aAAY,CAAE,QAAA,CAAS,CAAC,CAAA,IAAK,KAAA,CAAA;AAAA,IAEvD,CAAA;AAEA,IAAA,MAAM,eAA8B,EAAC;AACrC,IAAA,MAAM,aAA4B,EAAC;AACnC,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACpB,MAAA,IAAI,CAAC,OAAA,CAAQ,GAAG,CAAA,EAAG;AACf,QAAA;AAAA,MACJ;AACA,MAAA,MAAM,UAAA,GAAa,GAAA,CAAI,QAAA,KAAa,KAAA,IAAS,IAAI,UAAA,KAAe,IAAA;AAChE,MAAA,CAAC,UAAA,GAAa,YAAA,GAAe,UAAA,EAAY,IAAA,CAAK,GAAG,CAAA;AAAA,IACrD;AAKA,IAAA,MAAM,YAA4D,EAAC;AACnE,IAAA,KAAA,MAAW,OAAO,YAAA,EAAc;AAC5B,MAAA,IAAI,GAAA,CAAI,YAAY,IAAA,EAAM;AACtB,QAAA,SAAA,CAAU,IAAA,CAAK,EAAE,GAAA,EAAK,QAAA,EAAU,OAAO,CAAA;AAAA,MAC3C;AAAA,IACJ;AACA,IAAA,KAAA,MAAW,OAAO,UAAA,EAAY;AAC1B,MAAA,IAAI,GAAA,CAAI,eAAe,IAAA,EAAM;AACzB,QAAA,SAAA,CAAU,IAAA,CAAK,EAAE,GAAA,EAAK,QAAA,EAAU,MAAM,CAAA;AAAA,MAC1C;AAAA,IACJ;AAEA,IAAA,OAAO;AAAA,MACH,QAAA,EAAU,YAAA;AAAA,MACV,MAAA,EAAQ,UAAA;AAAA,MACR,cAAA,EAAgB;AAAA,KACpB;AAAA,EACJ,CAAA,EAAG,CAAC,IAAA,EAAM,KAAK,CAAC,CAAA;AAEhB,EAAA,MAAM,YAAA,GAAe,QAAA,CAAS,MAAA,GAAS,MAAA,CAAO,MAAA;AAK9C,EAAAD,UAAU,MAAM;AACZ,IAAA,IAAI,WAAA,IAAe,eAAe,MAAA,EAAQ;AACtC,MAAA,cAAA,CAAe,CAAC,CAAA;AAAA,IACpB;AAAA,EACJ,CAAA,EAAG,CAAC,cAAA,CAAe,MAAA,EAAQ,WAAW,CAAC,CAAA;AAEvC,EAAA,MAAM,eAAA,GACF,UAAA,EAAY,QAAA,IAAY,UAAA,EAAY,IAAA,CAAK,MAAM,CAAA,EAAG,CAAC,CAAA,CAAE,WAAA,EAAY,IAAK,QAAA;AAC1E,EAAA,MAAM,WAAA,GAAc,UAAA,EAAY,IAAA,IAAQ,CAAA,CAAE,MAAM,CAAA;AAChD,EAAA,MAAM,gBAAgB,UAAA,EAAY,WAAA;AAElC,EAAA,SAAS,gBAAgB,KAAA,EAAmD;AACxE,IAAA,IAAI,KAAA,CAAM,QAAQ,WAAA,EAAa;AAC3B,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,IAAI,cAAA,CAAe,WAAW,CAAA,EAAG;AAC7B,QAAA;AAAA,MACJ;AACA,MAAA,cAAA,CAAe,CAAC,CAAA,KAAA,CAAO,CAAA,GAAI,CAAA,IAAK,eAAe,MAAM,CAAA;AACrD,MAAA;AAAA,IACJ;AACA,IAAA,IAAI,KAAA,CAAM,QAAQ,SAAA,EAAW;AACzB,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,IAAI,cAAA,CAAe,WAAW,CAAA,EAAG;AAC7B,QAAA;AAAA,MACJ;AACA,MAAA,cAAA,CAAe,CAAC,CAAA,KAAA,CAAO,CAAA,GAAI,IAAI,cAAA,CAAe,MAAA,IAAU,eAAe,MAAM,CAAA;AAC7E,MAAA;AAAA,IACJ;AACA,IAAA,IAAI,KAAA,CAAM,QAAQ,OAAA,EAAS;AACvB,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,MAAM,MAAA,GAAS,eAAe,WAAW,CAAA;AACzC,MAAA,IAAI,WAAW,MAAA,EAAW;AACtB,QAAA;AAAA,MACJ;AACA,MAAA,IAAI,OAAO,QAAA,EAAU;AACjB,QAAA,gBAAA,GAAmB,OAAO,GAAG,CAAA;AAC7B,QAAA,OAAA,CAAQ,KAAK,CAAA;AACb,QAAA;AAAA,MACJ;AACA,MAAA,MAAM,IAAA,GACF,OAAA,KAAY,MAAA,IAAa,MAAA,CAAO,IAAI,OAAA,KAAY,IAAA,GAC1C,WAAA,CAAY,MAAA,CAAO,GAAA,CAAI,GAAA,EAAK,OAAO,CAAA,GACnC,OAAO,GAAA,CAAI,GAAA;AACrB,MAAA,MAAA,CAAO,SAAS,IAAA,GAAO,IAAA;AACvB,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,IACjB;AAAA,EACJ;AAEA,EAAA,uBACIF,KAAC,KAAA,EAAA,EAAI,GAAA,EAAK,cAAc,SAAA,EAAW,EAAA,CAAG,UAAA,EAAY,SAAS,CAAA,EACvD,QAAA,EAAA;AAAA,oBAAAA,IAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACG,IAAA,EAAK,QAAA;AAAA,QACL,eAAA,EAAc,MAAA;AAAA,QACd,eAAA,EAAe,IAAA;AAAA,QACf,SAAS,MAAM,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AAAA,QAChC,SAAA,EAAU,sIAAA;AAAA,QAGV,QAAA,EAAA;AAAA,0BAAAH,GAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACG,OACI,aAAA,KAAkB,MAAA,IAAa,cAAc,UAAA,EAAY,OAAO,MAAM,IAAA,GAChE;AAAA,gBACI,eAAA,EAAiB,aAAA;AAAA,gBACjB,KAAA,EAAO,MAAA;AAAA,gBACP,WAAA,EAAa;AAAA,eACjB,GACA,MAAA;AAAA,cAEV,SAAA,EAAU,sHAAA;AAAA,cAET,QAAA,EAAA,UAAA,mBACGA,GAAAA,CAAC,WAAA,EAAA,EAAY,MAAM,UAAA,CAAW,IAAA,EAAM,OAAA,EAAS,UAAA,CAAW,OAAA,EAAS,WAAA,EAAa,WAAW,WAAA,EAAa,SAAA,EAAU,eAAc,QAAA,kBAAUA,IAAAO,QAAAA,EAAA,EAAG,QAAA,EAAA,eAAA,EAAgB,CAAA,EAAK,CAAA,GAEhK;AAAA;AAAA,WAER;AAAA,0BACAP,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0BAA0B,QAAA,EAAA,WAAA,EAAY,CAAA;AAAA,0BACtDA,IAAC,OAAA,EAAA,EAAQ;AAAA;AAAA;AAAA,KACb;AAAA,IAEC,uBACGG,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACG,IAAA,EAAK,QAAA;AAAA,QACL,YAAA,EAAY,EAAE,YAAY,CAAA;AAAA,QAG1B,SAAA,EAAU,2IAAA;AAAA,QAEV,QAAA,EAAA;AAAA,0BAAAH,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8CAAA,EACX,QAAA,kBAAAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uFAAA,EACR,QAAA,EAAA,CAAA,CAAE,YAAY,CAAA,EAAE,CAAA,EACzB,CAAA;AAAA,0BAEAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yCACX,QAAA,kBAAAG,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wEAAA,EACX,QAAA,EAAA;AAAA,4BAAAH,IAAC,UAAA,EAAA,EAAW,CAAA;AAAA,4BACZA,GAAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBACG,GAAA,EAAK,SAAA;AAAA,gBACL,IAAA,EAAK,MAAA;AAAA,gBACL,KAAA,EAAO,KAAA;AAAA,gBACP,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,gBACxC,SAAA,EAAW,eAAA;AAAA,gBACX,WAAA,EAAa,EAAE,mBAAc,CAAA;AAAA,gBAC7B,YAAA,EAAY,EAAE,aAAa,CAAA;AAAA,gBAC3B,YAAA,EAAa,KAAA;AAAA,gBACb,UAAA,EAAY,KAAA;AAAA,gBACZ,SAAA,EAAU;AAAA;AAAA;AACd,WAAA,EACJ,CAAA,EACJ,CAAA;AAAA,0BAEAG,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACV,QAAA,EAAA;AAAA,YAAA,YAAA,KAAiB,CAAA,mBACdH,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,yDAAA,EACR,QAAA,EAAA,CAAA,CAAE,mCAAA,EAA2B,EAAC,KAAA,EAAM,CAAA,EACzC,CAAA,GACA,IAAA;AAAA,YAEH,QAAA,CAAS,MAAA,GAAS,CAAA,mBACfA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,iBAAA,EACT,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,CAAC,GAAA,KAAQ;AACnB,cAAA,MAAM,QAAA,GAAW,YAAA,CAAa,cAAA,EAAgB,GAAG,CAAA;AACjD,cAAA,uBACIA,GAAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBAEG,GAAA;AAAA,kBACA,OAAA;AAAA,kBACA,aAAa,QAAA,KAAa,WAAA;AAAA,kBAC1B,cAAc,MAAM;AAChB,oBAAA,IAAI,aAAa,EAAA,EAAI;AACjB,sBAAA,cAAA,CAAe,QAAQ,CAAA;AAAA,oBAC3B;AAAA,kBACJ,CAAA;AAAA,kBACA,gBAAA;AAAA,kBACA,UAAA,EAAY,MAAM,OAAA,CAAQ,KAAK;AAAA,iBAAA;AAAA,gBAV1B,GAAA,CAAI;AAAA,eAWb;AAAA,YAER,CAAC,GACL,CAAA,GACA,IAAA;AAAA,YAEH,OAAO,MAAA,GAAS,CAAA,mBACbG,IAAAA,CAAAI,UAAA,EACK,QAAA,EAAA;AAAA,cAAA,QAAA,CAAS,SAAS,CAAA,mBACfP,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAiC,CAAA,GAChD,IAAA;AAAA,8BACJA,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,sGAAA,EACR,QAAA,EAAA,CAAA,CAAE,WAAW,CAAA,EAAE,CAAA;AAAA,8BACpBA,IAAC,IAAA,EAAA,EAAG,SAAA,EAAU,wBACT,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,GAAA,KAAQ;AACjB,gBAAA,MAAM,QAAA,GAAW,YAAA,CAAa,cAAA,EAAgB,GAAG,CAAA;AACjD,gBAAA,uBACIA,GAAAA;AAAA,kBAAC,MAAA;AAAA,kBAAA;AAAA,oBAEG,GAAA;AAAA,oBACA,OAAA;AAAA,oBACA,aAAa,QAAA,KAAa,WAAA;AAAA,oBAC1B,cAAc,MAAM;AAChB,sBAAA,IAAI,aAAa,EAAA,EAAI;AACjB,wBAAA,cAAA,CAAe,QAAQ,CAAA;AAAA,sBAC3B;AAAA,oBACJ,CAAA;AAAA,oBACA,gBAAA;AAAA,oBACA,UAAA,EAAY,MAAM,OAAA,CAAQ,KAAK;AAAA,mBAAA;AAAA,kBAV1B,GAAA,CAAI;AAAA,iBAWb;AAAA,cAER,CAAC,CAAA,EACL;AAAA,aAAA,EACJ,CAAA,GACA;AAAA,WAAA,EACR;AAAA;AAAA;AAAA,KACJ,GACA;AAAA,GAAA,EACR,CAAA;AAER;AAEA,SAAS,YAAA,CACL,WACA,GAAA,EACM;AACN,EAAA,OAAO,SAAA,CAAU,UAAU,CAAC,CAAA,KAAM,EAAE,GAAA,CAAI,GAAA,KAAQ,IAAI,GAAG,CAAA;AAC3D;AAWA,SAAS,MAAA,CAAO;AAAA,EACZ,GAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,gBAAA;AAAA,EACA;AACJ,CAAA,EAA2B;AACvB,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,mBAAA,EAAoB;AAClC,EAAA,MAAM,YAAA,GAAe,IAAI,UAAA,KAAe,IAAA;AACxC,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,QAAA,KAAa,KAAA,IAAS,YAAA;AAE3C,EAAA,MAAM,QAAA,GAAW,IAAI,QAAA,IAAY,GAAA,CAAI,KAAK,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,WAAA,EAAY;AAClE,EAAA,MAAM,SAAS,GAAA,CAAI,WAAA;AACnB,EAAA,MAAM,SAAA,GACF,MAAA,KAAW,MAAA,IAAa,aAAA,CAAc,IAAI,OAAO,CAAA,KAAM,IAAA,GACjD,EAAE,iBAAiB,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,WAAA,EAAa,QAAO,GAC9D,MAAA;AAIV,EAAA,MAAM,IAAA,GACF,OAAA,KAAY,MAAA,IAAa,GAAA,CAAI,OAAA,KAAY,IAAA,GACnC,WAAA,CAAY,GAAA,CAAI,GAAA,EAAK,OAAO,CAAA,GAC5B,GAAA,CAAI,GAAA;AAEd,EAAA,MAAM,uBACFA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,KAAA,EAAO,SAAA;AAAA,MACP,SAAA,EAAW,EAAA;AAAA,QACP,qIAAA;AAAA,QACA,IAAI,OAAA,IAAW,2DAAA;AAAA,QACf,QAAA,IAAY;AAAA,OAChB;AAAA,MAEA,0BAAAA,GAAAA,CAAC,WAAA,EAAA,EAAY,MAAM,GAAA,CAAI,IAAA,EAAM,SAAS,GAAA,CAAI,OAAA,EAAS,aAAa,GAAA,CAAI,WAAA,EAAa,WAAU,SAAA,EAAU,QAAA,kBAAUA,GAAAA,CAAC,MAAA,EAAA,EAAM,oBAAS,CAAA,EAAS;AAAA;AAAA,GAC5I;AAGJ,EAAA,MAAM,IAAA,mBACFG,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,4CAAA,EACX,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACX,QAAA,EAAA;AAAA,sBAAAH,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACG,SAAA,EAAW,EAAA;AAAA,YACP,8CAAA;AAAA,YACA,QAAA,IAAY;AAAA,WAChB;AAAA,UAEC,QAAA,EAAA,GAAA,CAAI;AAAA;AAAA,OACT;AAAA,MACC,GAAA,CAAI,OAAA,mBACDA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,iJAAA,EACX,QAAA,EAAA,CAAA,CAAE,SAAS,CAAA,EAAE,CAAA,GAClB;AAAA,KAAA,EACR,CAAA;AAAA,IACC,GAAA,CAAI,8BACDA,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACG,SAAA,EAAW,EAAA;AAAA,UACP,sBAAA;AAAA,UACA,WAAW,0BAAA,GAA6B;AAAA,SAC5C;AAAA,QAEC,QAAA,EAAA,GAAA,CAAI;AAAA;AAAA,KACT,GACA;AAAA,GAAA,EACR,CAAA;AAGJ,EAAA,MAAM,WAAW,YAAA,mBACbA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,0JAAA,EACX,QAAA,EAAA,CAAA,CAAE,MAAM,CAAA,EAAE,IACf,QAAA,mBACAG,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,gFAAA,EACZ,QAAA,EAAA;AAAA,oBAAAH,IAAC,IAAA,EAAA,EAAK,CAAA;AAAA,IACL,EAAE,KAAK;AAAA,GAAA,EAAE,CAAA,GACd,IAAA;AAEJ,EAAA,IAAI,YAAA,EAAc;AACd,IAAA,uBACIA,GAAAA,CAAC,IAAA,EAAA,EACG,QAAA,kBAAAG,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACG,eAAA,EAAa,IAAA;AAAA,QACb,SAAA,EAAU,0EAAA;AAAA,QACV,OAAO,CAAA,CAAE,2BAAA,EAAwB,EAAC,IAAA,EAAM,GAAA,CAAI,MAAK,CAAA;AAAA,QAEhD,QAAA,EAAA;AAAA,UAAA,IAAA;AAAA,UACA,IAAA;AAAA,UACA;AAAA;AAAA;AAAA,KACL,EACJ,CAAA;AAAA,EAER;AAEA,EAAA,IAAI,QAAA,EAAU;AACV,IAAA,uBACIH,GAAAA,CAAC,IAAA,EAAA,EACG,QAAA,kBAAAG,IAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACG,IAAA,EAAK,QAAA;AAAA,QACL,YAAA;AAAA,QACA,SAAS,MAAM;AACX,UAAA,gBAAA,GAAmB,GAAG,CAAA;AACtB,UAAA,UAAA,EAAW;AAAA,QACf,CAAA;AAAA,QACA,SAAA,EAAW,EAAA;AAAA,UACP,yFAAA;AAAA,UACA,WAAA,IAAe,cAAA;AAAA,UACf,gBAAA,KAAqB,SACf,oBAAA,GACA;AAAA,SACV;AAAA,QACA,OAAO,CAAA,CAAE,yBAAA,EAA2B,EAAC,IAAA,EAAM,GAAA,CAAI,MAAK,CAAA;AAAA,QAEnD,QAAA,EAAA;AAAA,UAAA,IAAA;AAAA,UACA,IAAA;AAAA,UACA;AAAA;AAAA;AAAA,KACL,EACJ,CAAA;AAAA,EAER;AAGA,EAAA,IAAI,GAAA,CAAI,YAAY,IAAA,EAAM;AACtB,IAAA,uBACIH,GAAAA,CAAC,IAAA,EAAA,EACG,QAAA,kBAAAG,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACG,YAAA;AAAA,QACA,SAAA,EAAU,sEAAA;AAAA,QAET,QAAA,EAAA;AAAA,UAAA,IAAA;AAAA,UACA,IAAA;AAAA,UACA;AAAA;AAAA;AAAA,KACL,EACJ,CAAA;AAAA,EAER;AAEA,EAAA,uBACIH,GAAAA,CAAC,IAAA,EAAA,EACG,QAAA,kBAAAG,IAAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACG,IAAA;AAAA,MACA,YAAA;AAAA,MACA,OAAA,EAAS,UAAA;AAAA,MACT,SAAA,EAAW,EAAA;AAAA,QACP,kGAAA;AAAA,QACA,WAAA,IAAe;AAAA,OACnB;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,IAAA;AAAA,QACA,IAAA;AAAA,QACA;AAAA;AAAA;AAAA,GACL,EACJ,CAAA;AAER;AAEA,SAAS,WAAA,CAAY,KAAa,OAAA,EAAyB;AACvD,EAAA,IAAI,GAAA,KAAQ,EAAA,IAAM,OAAA,KAAY,EAAA,EAAI;AAC9B,IAAA,OAAO,GAAA;AAAA,EACX;AACA,EAAA,IAAI;AACA,IAAA,MAAM,CAAA,GAAI,IAAI,GAAA,CAAI,GAAG,CAAA;AACrB,IAAA,CAAA,CAAE,QAAA,GAAW,CAAA,KAAA,EAAQ,kBAAA,CAAmB,OAAO,CAAC,CAAA,CAAA;AAChD,IAAA,OAAO,EAAE,QAAA,EAAS;AAAA,EACtB,CAAA,CAAA,MAAQ;AACJ,IAAA,OAAO,CAAA,EAAG,IAAI,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAC,CAAA,KAAA,EAAQ,kBAAA,CAAmB,OAAO,CAAC,CAAA,CAAA;AAAA,EACvE;AACJ;AAEA,SAAS,OAAA,GAAqB;AAC1B,EAAA,uBACIH,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,KAAA,EAAM,IAAA;AAAA,MACN,MAAA,EAAO,IAAA;AAAA,MACP,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,KAAA,EAAM,4BAAA;AAAA,MACN,aAAA,EAAW,IAAA;AAAA,MAEX,QAAA,kBAAAA,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACG,CAAA,EAAE,cAAA;AAAA,UACF,MAAA,EAAO,cAAA;AAAA,UACP,WAAA,EAAY,KAAA;AAAA,UACZ,aAAA,EAAc,OAAA;AAAA,UACd,cAAA,EAAe;AAAA;AAAA;AACnB;AAAA,GACJ;AAER;AAEA,SAAS,UAAA,GAAwB;AAC7B,EAAA,uBACIG,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,KAAA,EAAM,IAAA;AAAA,MACN,MAAA,EAAO,IAAA;AAAA,MACP,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,MAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAY,KAAA;AAAA,MACZ,aAAA,EAAc,OAAA;AAAA,MACd,cAAA,EAAe,OAAA;AAAA,MACf,aAAA,EAAW,IAAA;AAAA,MACX,SAAA,EAAU,gCAAA;AAAA,MAEV,QAAA,EAAA;AAAA,wBAAAH,IAAC,QAAA,EAAA,EAAO,EAAA,EAAG,QAAO,EAAA,EAAG,MAAA,EAAO,GAAE,MAAA,EAAO,CAAA;AAAA,wBACrCA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,UAAA,EAAW;AAAA;AAAA;AAAA,GACvB;AAER;AAEA,SAAS,IAAA,GAAkB;AACvB,EAAA,uBACIG,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,KAAA,EAAM,IAAA;AAAA,MACN,MAAA,EAAO,IAAA;AAAA,MACP,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,MAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAY,KAAA;AAAA,MACZ,aAAA,EAAc,OAAA;AAAA,MACd,cAAA,EAAe,OAAA;AAAA,MACf,aAAA,EAAW,IAAA;AAAA,MAEX,QAAA,EAAA;AAAA,wBAAAH,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,KAAA,EAAM,CAAA,EAAE,GAAA,EAAI,KAAA,EAAM,GAAA,EAAI,MAAA,EAAO,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,CAAA;AAAA,wBAChDA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,0BAAA,EAA2B;AAAA;AAAA;AAAA,GACvC;AAER;ACjjBO,SAAS,UAAA,CAAW;AAAA,EACvB,IAAA,EAAM,IAAA;AAAA,EACN,KAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA;AACJ,CAAA,EAAoB;AAChB,EAAA,uBACIG,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,SAAA,EAAW,EAAA;AAAA,QACP,wEAAA;AAAA,QACA;AAAA,OACJ;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,IAAA,mBACGH,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0FAAA,EACX,QAAA,kBAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,WAAA,EAAa,GAAA,EAAK,GAChD,CAAA,GACA,IAAA;AAAA,wBACJG,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACX,QAAA,EAAA;AAAA,0BAAAH,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,yCAAA,EACT,QAAA,EAAA,KAAA,EACL,CAAA;AAAA,UACC,8BACGA,GAAAA,CAAC,OAAE,SAAA,EAAU,wCAAA,EACR,uBACL,CAAA,GACA;AAAA,SAAA,EACR,CAAA;AAAA,QACC,yBAASA,GAAAA,CAAC,SAAI,SAAA,EAAU,MAAA,EAAQ,kBAAO,CAAA,GAAS;AAAA;AAAA;AAAA,GACrD;AAER;ACtCA,IAAM,UAAA,GAAmC;AAAA,EACrC,OAAA,EAAS,sDAAA;AAAA,EACT,IAAA,EAAM,uCAAA;AAAA,EACN,OAAA,EAAS,gDAAA;AAAA,EACT,OAAA,EAAS,gDAAA;AAAA,EACT,WAAA,EAAa,4DAAA;AAAA,EACb,KAAA,EAAO;AACX,CAAA;AAEA,IAAM,SAAA,GAAkC;AAAA,EACpC,OAAA,EAAS,qBAAA;AAAA,EACT,IAAA,EAAM,SAAA;AAAA,EACN,OAAA,EAAS,YAAA;AAAA,EACT,OAAA,EAAS,YAAA;AAAA,EACT,WAAA,EAAa,gBAAA;AAAA,EACb,KAAA,EAAO;AACX,CAAA;AAeO,SAAS,UAAA,CAAW;AAAA,EACvB,QAAA;AAAA,EACA,IAAA,GAAO,SAAA;AAAA,EACP,SAAA;AAAA,EACA,GAAA,GAAM;AACV,CAAA,EAAoB;AAChB,EAAA,uBACIG,IAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACG,SAAA,EAAW,EAAA;AAAA,QACP,uGAAA;AAAA,QACA,WAAW,IAAI,CAAA;AAAA,QACf;AAAA,OACJ;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,GAAA,mBACGH,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACG,SAAA,EAAW,EAAA,CAAG,0BAAA,EAA4B,SAAA,CAAU,IAAI,CAAC;AAAA;AAAA,SAC7D,GACA,IAAA;AAAA,QACH;AAAA;AAAA;AAAA,GACL;AAER;AClBO,SAAS,YAAA,CAAa;AAAA,EACzB,IAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA,GAAO,MAAA;AAAA,EACP;AACJ,CAAA,EAAU;AACN,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,mBAAA,EAAoB;AAClC,EAAA,MAAM,SAAA,GAAYQ,OAA8B,IAAI,CAAA;AACpD,EAAA,MAAM,gBAAA,GAAmBA,OAA2B,IAAI,CAAA;AAIxD,EAAAH,UAAU,MAAM;AACZ,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,QAAA;AACrC,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,UAAA,GAAa,QAAA,CAAS,eAAA,CAAgB,WAAA;AAC5D,IAAA,QAAA,CAAS,IAAA,CAAK,MAAM,QAAA,GAAW,QAAA;AAC/B,IAAA,IAAI,SAAS,CAAA,EAAG;AACZ,MAAA,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,YAAA,GAAe,CAAA,EAAG,MAAM,CAAA,EAAA,CAAA;AAAA,IAChD;AACA,IAAA,OAAO,MAAM;AACT,MAAA,QAAA,CAAS,IAAA,CAAK,MAAM,QAAA,GAAW,QAAA;AAC/B,MAAA,QAAA,CAAS,IAAA,CAAK,MAAM,YAAA,GAAe,EAAA;AAAA,IACvC,CAAA;AAAA,EACJ,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAGT,EAAAA,UAAU,MAAM;AACZ,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,gBAAA,CAAiB,UAAU,QAAA,CAAS,aAAA;AAEpC,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAqB;AAChC,MAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACpB,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,OAAA,EAAQ;AACR,QAAA;AAAA,MACJ;AACA,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,KAAA,IAAS,SAAA,CAAU,YAAY,IAAA,EAAM;AAC/C,QAAA,MAAM,SAAA,GAAY,UAAU,OAAA,CAAQ,gBAAA;AAAA,UAChC;AAAA,SACJ;AACA,QAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC5B,QAAA,MAAM,KAAA,GAAQ,UAAU,CAAC,CAAA;AACzB,QAAA,MAAM,IAAA,GAAO,SAAA,CAAU,SAAA,CAAU,MAAA,GAAS,CAAC,CAAA;AAC3C,QAAA,IAAI,KAAA,KAAU,MAAA,IAAa,IAAA,KAAS,MAAA,EAAW;AAC/C,QAAA,IAAI,CAAA,CAAE,QAAA,IAAY,QAAA,CAAS,aAAA,KAAkB,KAAA,EAAO;AAChD,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,IAAA,CAAK,KAAA,EAAM;AAAA,QACf,WAAW,CAAC,CAAA,CAAE,QAAA,IAAY,QAAA,CAAS,kBAAkB,IAAA,EAAM;AACvD,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,KAAA,CAAM,KAAA,EAAM;AAAA,QAChB;AAAA,MACJ;AAAA,IACJ,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,KAAK,CAAA;AAI1C,IAAA,MAAM,EAAA,GAAK,MAAA,CAAO,UAAA,CAAW,MAAM;AAC/B,MAAA,MAAM,SAAA,GAAY,UAAU,OAAA,EAAS,aAAA;AAAA,QACjC;AAAA,OACJ;AACA,MAAA,SAAA,EAAW,KAAA,EAAM;AAAA,IACrB,GAAG,EAAE,CAAA;AAEL,IAAA,OAAO,MAAM;AACT,MAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,KAAK,CAAA;AAC7C,MAAA,MAAA,CAAO,aAAa,EAAE,CAAA;AACtB,MAAA,gBAAA,CAAiB,SAAS,KAAA,IAAQ;AAAA,IACtC,CAAA;AAAA,EACJ,CAAA,EAAG,CAAC,IAAA,EAAM,OAAO,CAAC,CAAA;AAElB,EAAA,MAAM,UAAA,GAAa,WAAA;AAAA,IACf,CAAC,CAAA,KAAwB;AACrB,MAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE,aAAA,EAAe,OAAA,EAAQ;AAAA,IAC9C,CAAA;AAAA,IACA,CAAC,OAAO;AAAA,GACZ;AAEA,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,EAAA,uBACIL,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,IAAA,EAAK,cAAA;AAAA,MACL,WAAA,EAAa,UAAA;AAAA,MACb,SAAA,EAAW,EAAA;AAAA,QACP,yDAAA;AAAA,QACA,IAAA,KAAS,cACH,sCAAA,GACA,2CAAA;AAAA,QACN;AAAA,OACJ;AAAA,MAEA,QAAA,kBAAAG,IAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACG,GAAA,EAAK,SAAA;AAAA,UACL,IAAA,EAAK,QAAA;AAAA,UACL,YAAA,EAAW,MAAA;AAAA,UACX,YAAA,EAAY,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,MAAA;AAAA,UAChD,SAAA,EAAW,EAAA;AAAA,YACP,0HAAA;AAAA,YACA,2DAAA;AAAA,YACA,IAAA,KAAS,cACH,eAAA,GACA;AAAA,WACV;AAAA,UAEA,QAAA,EAAA;AAAA,4BAAAA,IAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,uGAAA,EACd,QAAA,EAAA;AAAA,8BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACV,QAAA,EAAA;AAAA,gBAAA,OAAA,KAAY,yBACTH,GAAAA,CAAC,OAAE,SAAA,EAAU,uFAAA,EACR,mBACL,CAAA,GACA,IAAA;AAAA,gCACJA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,0DACT,QAAA,EAAA,KAAA,EACL;AAAA,eAAA,EACJ,CAAA;AAAA,cACC,aAAA,KAAkB,yBACfA,GAAAA,CAAC,SAAI,SAAA,EAAU,kCAAA,EACV,yBACL,CAAA,GACA,IAAA;AAAA,8BACJA,GAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACG,IAAA,EAAK,QAAA;AAAA,kBACL,OAAA,EAAS,OAAA;AAAA,kBACT,SAAA,EAAU,2JAAA;AAAA,kBACV,YAAA,EAAY,EAAE,OAAO,CAAA;AAAA,kBAErB,0BAAAA,GAAAA,CAACS,CAAAA,EAAA,EAAE,SAAA,EAAU,SAAA,EAAU,aAAa,GAAA,EAAK;AAAA;AAAA;AAC7C,aAAA,EACJ,CAAA;AAAA,4BAEAT,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAA0B,QAAA,EAAS,CAAA;AAAA,YAEjD,MAAA,KAAW,yBACRA,GAAAA,CAAC,YAAO,SAAA,EAAU,sJAAA,EACb,kBACL,CAAA,GACA;AAAA;AAAA;AAAA;AACR;AAAA,GACJ;AAER;AChKA,IAAM,KAAA,GAGF;AAAA,EACA,IAAA,EAAM,MAAA;AAAA,EACN,OAAA,EAAS,SAAA;AAAA,EACT,QAAA,EAAU;AACd,CAAA;AAeO,SAAS,YAAA,CAAa,EAAE,IAAA,EAAM,OAAA,EAAQ,EAAU;AACnD,EAAA,MAAM,EAAE,CAAA,EAAG,UAAA,EAAW,GAAI,mBAAA,EAAoB;AAC9C,EAAA,MAAM,YAAY,YAAA,EAAa;AAC/B,EAAA,MAAM,SAAS,iBAAA,EAAkB;AACjC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAII,SAAuB,IAAI,CAAA;AACrD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAwB,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,SAA2B,KAAK,CAAA;AAE5D,EAAA,MAAM,MAAA,GAAS,MAAA,EAAQ,IAAA,CAAK,EAAA,IAAM,IAAA;AAClC,EAAA,MAAM,OAAA,GAAU,SAAA,CAAU,IAAA,CAAK,aAAA,IAAiB,IAAA;AAEhD,EAAAC,UAAU,MAAM;AACZ,IAAA,IAAI,CAAC,IAAA,IAAQ,MAAA,KAAW,IAAA,IAAQ,YAAY,IAAA,EAAM;AAClD,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,MAAM,OAAO,YAAY;AACrB,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,IAAI;AACA,QAAA,MAAM,OAAA,GAAU,MAAM,WAAA,CAAY,SAAA,EAAW,eAAe,CAAA;AAC5D,QAAA,MAAM,WAAW,MAAM,KAAA;AAAA,UACnB,CAAA,EAAG,OAAO,CAAA,mBAAA,EAAsB,MAAM,CAAA,gBAAA,CAAA;AAAA,UACtC,EAAE,OAAA,EAAS,WAAA,EAAa,SAAA;AAAU,SACtC;AACA,QAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AACd,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,KAAA,EAAQ,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,QAC7C;AACA,QAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,QAAA,IAAI,CAAC,SAAA,EAAW,QAAA,CAAS,IAAI,CAAA;AAAA,MACjC,SAAS,CAAA,EAAG;AACR,QAAA,IAAI,CAAC,SAAA,EAAW;AACZ,UAAA,QAAA,CAAS,aAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,CAAA,CAAE,aAAa,CAAC,CAAA;AAAA,QAC9D;AAAA,MACJ,CAAA,SAAE;AACE,QAAA,IAAI,CAAC,SAAA,EAAW,UAAA,CAAW,KAAK,CAAA;AAAA,MACpC;AAAA,IACJ,CAAA;AACA,IAAA,KAAK,IAAA,EAAK;AACV,IAAA,OAAO,MAAM;AACT,MAAA,SAAA,GAAY,IAAA;AAAA,IAChB,CAAA;AAAA,EACJ,GAAG,CAAC,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,SAAS,CAAC,CAAA;AAErC,EAAA,MAAM,QAAA,GAAW,OAAO,EAAA,KAAe;AACnC,IAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,MAAA,KAAW,IAAA,IAAQ,YAAY,IAAA,EAAM;AAE3D,IAAA,MAAM,IAAA,GAAO,KAAA;AACb,IAAA,QAAA,CAAS;AAAA,MACL,GAAG,KAAA;AAAA,MACH,KAAA,EAAO,MAAM,KAAA,CAAM,GAAA;AAAA,QAAI,CAAC,EAAA,KACpB,EAAA,CAAG,EAAA,KAAO,KACJ,EAAE,GAAG,EAAA,EAAI,OAAA,EAAA,iBAAS,IAAI,IAAA,EAAK,EAAE,WAAA,IAAc,GAC3C;AAAA,OACV;AAAA,MACA,cAAc,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAA,CAAM,eAAe,CAAC;AAAA,KACnD,CAAA;AACD,IAAA,IAAI;AACA,MAAA,MAAM,OAAA,GAAU,MAAM,WAAA,CAAY,SAAA,EAAW,eAAe,CAAA;AAC5D,MAAA,MAAM,IAAA,GAAO,UAAU,SAAA,IAAY;AACnC,MAAA,IAAI,IAAA,KAAS,KAAA,CAAA,IAAa,IAAA,KAAS,EAAA,EAAI;AACnC,QAAA,OAAA,CAAQ,cAAc,CAAA,GAAI,IAAA;AAC1B,QAAA,OAAA,CAAQ,kBAAkB,CAAA,GAAI,gBAAA;AAAA,MAClC;AACA,MAAA,MAAM,WAAW,MAAM,KAAA;AAAA,QACnB,CAAA,EAAG,OAAO,CAAA,mBAAA,EAAsB,MAAM,kBAAkB,EAAE,CAAA,KAAA,CAAA;AAAA,QAC1D;AAAA,UACI,MAAA,EAAQ,MAAA;AAAA,UACR,OAAA;AAAA,UACA,WAAA,EAAa;AAAA;AACjB,OACJ;AACA,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AACd,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,KAAA,EAAQ,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,MAC7C;AAAA,IACJ,CAAA,CAAA,MAAQ;AACJ,MAAA,QAAA,CAAS,IAAI,CAAA;AAAA,IACjB;AAAA,EACJ,CAAA;AAEA,EAAA,MAAM,KAAA,GAAQ,KAAA,EAAO,KAAA,IAAS,EAAC;AAC/B,EAAA,MAAM,QAAA,GACF,MAAA,KAAW,QAAA,GAAW,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,OAAA,KAAY,IAAI,CAAA,GAAI,KAAA;AAEpE,EAAA,MAAM,MAAA,GAAS,OAAO,YAAA,IAAgB,CAAA;AAEtC,EAAA,uBACIL,GAAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACG,IAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA,EAAS,EAAE,eAAe,CAAA;AAAA,MAC1B,KAAA,EACI,MAAA,GAAS,CAAA,GAAI,CAAA,CAAE,2BAAA,EAA0B,EAAC,KAAA,EAAO,MAAA,EAAO,CAAA,GAAI,CAAA,CAAE,0BAAuB,CAAA;AAAA,MAEzF,aAAA,kBACIG,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EACX,QAAA,EAAA;AAAA,wBAAAH,GAAAA;AAAA,UAAC,SAAA;AAAA,UAAA;AAAA,YACG,QAAQ,MAAA,KAAW,KAAA;AAAA,YACnB,OAAA,EAAS,MAAM,SAAA,CAAU,KAAK,CAAA;AAAA,YAE7B,YAAE,KAAK;AAAA;AAAA,SAAE;AAAA,wBACdA,GAAAA;AAAA,UAAC,SAAA;AAAA,UAAA;AAAA,YACG,QAAQ,MAAA,KAAW,QAAA;AAAA,YACnB,OAAA,EAAS,MAAM,SAAA,CAAU,QAAQ,CAAA;AAAA,YAEhC,YAAE,QAAQ;AAAA;AAAA;AAAE,OAAA,EACrB,CAAA;AAAA,MAEJ,MAAA,EACI,UAAU,IAAA,IAAQ,OAAA,KAAY,uBAC1BG,IAAAA,CAAAI,UAAA,EACI,QAAA,EAAA;AAAA,wBAAAP,GAAAA,CAAC,MAAA,EAAA,EACI,QAAA,EAAA,CAAA,CAAE,6BAAA,EAA+B,EAAC,KAAA,EAAO,QAAA,CAAS,MAAA,EAAQ,KAAA,EAAO,KAAA,CAAM,MAAA,EAAO,CAAA,EACnF,CAAA;AAAA,wBACAA,GAAAA;AAAA,UAAC,GAAA;AAAA,UAAA;AAAA,YACG,IAAA,EAAM,GAAG,OAAO,CAAA,MAAA,CAAA;AAAA,YAChB,MAAA,EAAO,QAAA;AAAA,YACP,GAAA,EAAI,YAAA;AAAA,YACJ,SAAA,EAAU,6CAAA;AAAA,YAET,YAAE,wBAAmB;AAAA;AAAA;AAAE,OAAA,EAChC,CAAA,mBAEAA,GAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,MAId,oBAAU,IAAA,mBACPG,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uBAAA,EACX,QAAA,EAAA;AAAA,wBAAAH,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sCAAA,EACR,QAAA,EAAA,CAAA,CAAE,qBAAqB,CAAA,EAAE,CAAA;AAAA,wBAC9BA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sCACR,QAAA,EAAA,KAAA,EACL;AAAA,OAAA,EACJ,CAAA,GACA,WAAW,KAAA,KAAU,IAAA,mBACrBA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,sDAAA,EACV,QAAA,EAAA,CAAA,CAAE,eAAU,CAAA,EAAE,CAAA,GACnB,SAAS,MAAA,KAAW,CAAA,mBACpBA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EACX,QAAA,kBAAAA,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACG,OACI,MAAA,KAAW,QAAA,GACL,EAAE,yBAAyB,CAAA,GAC3B,EAAE,sBAAsB,CAAA;AAAA,UAElC,WAAA,EAAa,EAAE,qHAA2G;AAAA;AAAA,OAC9H,EACJ,CAAA,mBAEAA,GAAAA,CAAC,IAAA,EAAA,EAAG,WAAU,2BAAA,EACT,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,CAAC,IAAA,KAAS;AACpB,QAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,IAAA,IAAQ,EAAC;AAI5B,QAAA,MAAM,SAAS,IAAA,CAAK,OAAA;AACpB,QAAA,MAAM,eAAe,CAAC;AAAA,UAClB;AAAA,SACJ,KAGI,MAAA,KAAW,MAAA,IAAa,MAAA,KAAW,qBAC/BA,GAAAA;AAAA,UAAC,GAAA;AAAA,UAAA;AAAA,YACG,IAAA,EAAM,MAAA;AAAA,YACN,SAAA,EAAU,+CAAA;AAAA,YAET;AAAA;AAAA,SACL,mBAEAA,GAAAA,CAAC,KAAA,EAAA,EAAK,QAAA,EAAS,CAAA;AAGvB,QAAA,uBACIA,GAAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YAEG,SAAA,EACI,IAAA,CAAK,OAAA,KAAY,IAAA,GACX,iBAAA,GACA,EAAA;AAAA,YAGV,0BAAAA,GAAAA,CAAC,YAAA,EAAA,EACG,0BAAAG,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,kCAAA,EACX,QAAA,EAAA;AAAA,8BAAAH,GAAAA;AAAA,gBAAC,UAAA;AAAA,gBAAA;AAAA,kBACG,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA;AAAA,kBACzB,GAAA,EAAG,IAAA;AAAA,kBAEF,QAAA,EAAA,IAAA,CAAK;AAAA;AAAA,eACV;AAAA,8BACAG,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACX,QAAA,EAAA;AAAA,gCAAAH,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,gDACR,QAAA,EAAA,IAAA,CAAK,KAAA,IACF,KAAK,UAAA,EACb,CAAA;AAAA,gBAAA,CACE,IAAA,CAAK,IAAA,IAAQ,EAAA,MAAQ,EAAA,mBACnBA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,mDAAA,EACR,QAAA,EAAA,IAAA,CAAK,IAAA,EACV,CAAA,GACA,IAAA;AAAA,gCACJG,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,kDAAA,EACR,QAAA,EAAA;AAAA,kBAAA,IAAA,CAAK,UAAA;AAAA,kBACL,QAAA;AAAA,kBACA,UAAA,CAAW,KAAK,UAAU;AAAA,iBAAA,EAC/B;AAAA,eAAA,EACJ,CAAA;AAAA,cACC,IAAA,CAAK,OAAA,KAAY,IAAA,mBACdH,GAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACG,IAAA,EAAK,QAAA;AAAA,kBACL,OAAA,EAAS,CAAC,CAAA,KAAM;AACZ,oBAAA,CAAA,CAAE,cAAA,EAAe;AACjB,oBAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,oBAAA,KAAK,QAAA,CAAS,KAAK,EAAE,CAAA;AAAA,kBACzB,CAAA;AAAA,kBACA,SAAA,EAAU,6IAAA;AAAA,kBACV,YAAA,EAAY,EAAE,cAAc,CAAA;AAAA,kBAE3B,YAAE,WAAW;AAAA;AAAA,eAAE,GACpB;AAAA,aAAA,EACR,CAAA,EACJ;AAAA,WAAA;AAAA,UA7CK,IAAA,CAAK;AAAA,SA8Cd;AAAA,MAER,CAAC,CAAA,EACL;AAAA;AAAA,GAER;AAER;AAaA,eAAe,WAAA,CACX,WACA,QAAA,EAC+B;AAC/B,EAAA,MAAM,OAAA,GAAkC;AAAA,IACpC,MAAA,EAAQ;AAAA,GACZ;AACA,EAAA,IAAI;AACA,IAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,SAAA,CAAU,SAAS,QAAQ,CAAA;AACnD,IAAA,IAAI,UAAU,EAAA,EAAI;AACd,MAAA,OAAA,CAAQ,aAAA,GAAgB,UAAU,KAAK,CAAA,CAAA;AAAA,IAC3C;AAAA,EACJ,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,OAAA;AACX;AAEA,SAAS,SAAA,CAAU;AAAA,EACf,MAAA;AAAA,EACA,OAAA;AAAA,EACA;AACJ,CAAA,EAIG;AACC,EAAA,uBACIA,GAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACG,IAAA,EAAK,QAAA;AAAA,MACL,OAAA;AAAA,MACA,SAAA,EACI,SACM,uEAAA,GACA,4GAAA;AAAA,MAEV,cAAA,EAAc,MAAA;AAAA,MAEb;AAAA;AAAA,GACL;AAER;AC7TA,IAAM,gBAAA,GAAmBC,cAAgC,IAAI,CAAA;AAC7D,IAAM,cAAA,GAAiBA,cAAwC,IAAI,CAAA;AAY5D,SAAS,YAAA,CAAa;AAAA,EACzB,SAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA;AACJ,CAAA,EAAsB;AAElB,EAAA,MAAM,OAAA,GAAUK,QAAQ,MAAM,IAAI,IAAI,QAAQ,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAC3D,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIF,SAGlB,IAAI,CAAA;AAEd,EAAA,MAAM,IAAA,GAAOM,WAAAA;AAAA,IACT,CAAsB,IAAO,IAAA,KAA0B;AACnD,MAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA,EAAG;AAClB,QAAA,OAAA,CAAQ,IAAA;AAAA,UACJ,sBAAsB,EAAE,CAAA,4EAAA;AAAA,SAC5B;AACA,QAAA;AAAA,MACJ;AACA,MAAA,SAAA,CAAU,EAAE,EAAA,EAAI,IAAA,EAAM,CAAA;AAAA,IAC1B,CAAA;AAAA,IACA,CAAC,OAAO;AAAA,GACZ;AAEA,EAAA,MAAM,QAAQA,WAAAA,CAAY,MAAM,UAAU,IAAI,CAAA,EAAG,EAAE,CAAA;AAEnD,EAAA,MAAM,UAAA,GAAaJ,OAAAA;AAAA,IACf,OAAO;AAAA,MACH,aAAA,EAAe,QAAQ,EAAA,IAAM,IAAA;AAAA,MAC7B,IAAA;AAAA,MACA;AAAA,KACJ,CAAA;AAAA,IACA,CAAC,MAAA,EAAQ,IAAA,EAAM,KAAK;AAAA,GACxB;AAEA,EAAA,uBACIN,GAAAA,CAAC,gBAAA,CAAiB,QAAA,EAAjB,EAA0B,KAAA,EAAO,SAAA,EAC9B,QAAA,kBAAAG,IAAAA,CAAC,cAAA,CAAe,QAAA,EAAf,EAAwB,OAAO,UAAA,EAC3B,QAAA,EAAA;AAAA,IAAA,QAAA;AAAA,oBAQDH,GAAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACG,IAAA,EAAM,QAAQ,EAAA,KAAO,OAAA;AAAA,QACrB,OAAA,EAAS;AAAA;AAAA;AACb,GAAA,EAKJ,CAAA,EACJ,CAAA;AAER;AAOO,SAAS,eAAA,GAAqC;AACjD,EAAA,MAAM,GAAA,GAAME,WAAW,cAAc,CAAA;AACrC,EAAA,IAAI,QAAQ,IAAA,EAAM;AACd,IAAA,MAAM,IAAI,KAAA;AAAA,MACN;AAAA,KACJ;AAAA,EACJ;AACA,EAAA,OAAO,GAAA;AACX;AAQO,SAAS,uBAAA,GAAoD;AAChE,EAAA,OAAOA,WAAW,cAAc,CAAA;AACpC;AAMO,SAAS,YAAA,GAA0B;AACtC,EAAA,MAAM,CAAA,GAAIA,WAAW,gBAAgB,CAAA;AACrC,EAAA,IAAI,MAAM,IAAA,EAAM;AACZ,IAAA,MAAM,IAAI,KAAA;AAAA,MACN;AAAA,KACJ;AAAA,EACJ;AACA,EAAA,OAAO,CAAA;AACX;AC1GO,SAAS,iBAAA,CAAkB,EAAE,SAAA,EAAU,EAA2B;AACrE,EAAA,MAAM,EAAE,CAAA,EAAG,UAAA,EAAW,GAAI,mBAAA,EAAoB;AAC9C,EAAA,MAAM,MAAM,iBAAA,EAAkB;AAC9B,EAAA,MAAM,WAAW,uBAAA,EAAwB;AACzC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIE,SAAS,KAAK,CAAA;AACtC,EAAA,MAAM,GAAA,GAAMI,OAA8B,IAAI,CAAA;AAE9C,EAAAH,UAAU,MAAM;AACZ,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,UAAA,GAAa,CAAC,CAAA,KAAkB;AAClC,MAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AACjB,MAAA,IACI,MAAA,YAAkB,IAAA,IAClB,GAAA,CAAI,OAAA,KAAY,IAAA,IAChB,CAAC,GAAA,CAAI,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,EAC9B;AACE,QAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,MACjB;AAAA,IACJ,CAAA;AACA,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAqB;AAChC,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,QAAA,EAAU,OAAA,CAAQ,KAAK,CAAA;AAAA,IACzC,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,UAAU,CAAA;AACjD,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,KAAK,CAAA;AAC1C,IAAA,OAAO,MAAM;AACT,MAAA,QAAA,CAAS,mBAAA,CAAoB,aAAa,UAAU,CAAA;AACpD,MAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,KAAK,CAAA;AAAA,IACjD,CAAA;AAAA,EACJ,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAKT,EAAA,MAAM,iBAAA,GAAoB,GAAA,KAAQ,IAAA,GAAO,IAAA,GAAQ,IAAI,aAAA,IAAiB,IAAA;AAEtE,EAAA,IAAI,QAAQ,IAAA,EAAM;AACd,IAAA,OAAO,IAAA;AAAA,EACX;AAGA,EAAA,IAAI,sBAAsB,IAAA,EAAM;AAC5B,IAAA,uBACIL,IAAC,KAAA,EAAA,EAAI,SAAA,EAAW,GAAG,UAAA,EAAY,SAAS,GACpC,QAAA,kBAAAA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACG,IAAA,EAAK,QAAA;AAAA,QACL,YAAA,EAAY,EAAE,eAAe,CAAA;AAAA,QAC7B,QAAA,EAAQ,IAAA;AAAA,QACR,SAAA,EAAU,8GAAA;AAAA,QAEV,QAAA,kBAAAA,IAAC,IAAA,EAAA,EAAK;AAAA;AAAA,KACV,EACJ,CAAA;AAAA,EAER;AAEA,EAAA,MAAM,EAAE,WAAA,EAAa,QAAA,EAAU,YAAA,EAAc,aAAY,GACrD,iBAAA;AACJ,EAAA,MAAM,OAAA,GAAU,WAAA,GAAc,EAAA,GAAK,KAAA,GAAQ,YAAY,QAAA,EAAS;AAEhE,EAAA,uBACIG,KAAC,KAAA,EAAA,EAAI,GAAA,EAAU,WAAW,EAAA,CAAG,UAAA,EAAY,SAAS,CAAA,EAC9C,QAAA,EAAA;AAAA,oBAAAA,IAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACG,IAAA,EAAK,QAAA;AAAA,QACL,SAAS,MAAM,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AAAA,QAChC,YAAA,EACI,WAAA,GAAc,CAAA,GACR,CAAA,CAAE,8BAAA,EAAgC,EAAC,KAAA,EAAO,WAAA,EAAY,CAAA,GACtD,CAAA,CAAE,eAAe,CAAA;AAAA,QAE3B,eAAA,EAAe,IAAA;AAAA,QACf,eAAA,EAAc,MAAA;AAAA,QACd,SAAA,EAAU,8MAAA;AAAA,QACV,WAAA,EAAW,OAAO,MAAA,GAAS,OAAA;AAAA,QAE3B,QAAA,EAAA;AAAA,0BAAAH,IAAC,IAAA,EAAA,EAAK,CAAA;AAAA,UACL,WAAA,GAAc,oBACXA,GAAAA,CAAC,UAAK,SAAA,EAAU,4KAAA,EACX,mBACL,CAAA,GACA;AAAA;AAAA;AAAA,KACR;AAAA,IAEC,uBACGG,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACG,IAAA,EAAK,MAAA;AAAA,QACL,SAAA,EAAU,oIAAA;AAAA,QAEV,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,uEAAA,EACd,QAAA,EAAA;AAAA,4BAAAH,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uFAAA,EACX,QAAA,EAAA,CAAA,CAAE,eAAe,CAAA,EAAE,CAAA;AAAA,YACvB,WAAA,GAAc,CAAA,mBACXA,GAAAA,CAAC,UAAK,SAAA,EAAU,0DAAA,EACX,QAAA,EAAA,CAAA,CAAE,gBAAA,EAAkB,EAAC,KAAA,EAAO,WAAA,EAAY,GAAE,CAAA,GAC/C;AAAA,WAAA,EACR,CAAA;AAAA,0BAEAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCACV,QAAA,EAAA,YAAA,KAAiB,MAAA,IAClB,YAAA,CAAa,MAAA,KAAW,CAAA,mBACpBG,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uBAAA,EACX,QAAA,EAAA;AAAA,4BAAAH,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,qCAAA,EACR,QAAA,EAAA,CAAA,CAAE,eAAe,CAAA,EAAE,CAAA;AAAA,4BACxBA,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,oCAAA,EACR,QAAA,EAAA,CAAA,CAAE,0BAA0B,CAAA,EAAE;AAAA,WAAA,EACvC,CAAA,mBAEAA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,6BACT,QAAA,EAAA,YAAA,CAAa,GAAA,CAAI,CAAC,IAAA,qBACfA,GAAAA;AAAA,YAAC,UAAA;AAAA,YAAA;AAAA,cAEG,IAAA;AAAA,cACA,WAAA;AAAA,cACA,YAAA,EAAc,MAAM,OAAA,CAAQ,KAAK;AAAA,aAAA;AAAA,YAH5B,IAAA,CAAK;AAAA,WAKjB,GACL,CAAA,EAER,CAAA;AAAA,UAEC,QAAA,KAAa,uBACVA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACG,IAAA,EAAK,QAAA;AAAA,cACL,SAAS,MAAM;AACX,gBAAA,OAAA,CAAQ,KAAK,CAAA;AACb,gBAAA,QAAA,CAAS,KAAK,OAAO,CAAA;AAAA,cACzB,CAAA;AAAA,cACA,SAAA,EAAU,sJAAA;AAAA,cAET,YAAE,8BAAyB;AAAA;AAAA,8BAEhCA,GAAAA;AAAA,YAAC,GAAA;AAAA,YAAA;AAAA,cACG,IAAA,EAAM,QAAA;AAAA,cACN,SAAA,EAAU,+IAAA;AAAA,cAET,YAAE,8BAAyB;AAAA;AAAA;AAAE;AAAA;AAAA,KAE1C,GACA;AAAA,GAAA,EACR,CAAA;AAER;AAEA,SAAS,UAAA,CAAW;AAAA,EAChB,IAAA;AAAA,EACA,WAAA;AAAA,EACA;AACJ,CAAA,EAIG;AACC,EAAA,MAAM,EAAE,CAAA,EAAG,UAAA,EAAW,GAAI,mBAAA,EAAoB;AAC9C,EAAA,MAAM,IAAA,GACF,KAAK,QAAA,KAAa,UAAA,GACZ,mBACA,IAAA,CAAK,QAAA,KAAa,YAClB,YAAA,GACA,SAAA;AAEV,EAAA,MAAM,MAAM,MAAM;AACd,IAAA,IAAI;AACA,MAAA,OAAO,UAAA,CAAW,KAAK,SAAS,CAAA;AAAA,IACpC,CAAA,CAAA,MAAQ;AACJ,MAAA,OAAO,IAAA,CAAK,SAAA;AAAA,IAChB;AAAA,EACJ,CAAA,GAAG;AAEH,EAAA,MAAM,QAAA,GAAW,OAAO,CAAA,KAAwB;AAC5C,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,IAAA,IAAI,WAAA,KAAgB,MAAA,IAAa,WAAA,KAAgB,EAAA,EAAI;AACrD,IAAA,MAAM,GAAA,GAAM,WAAA,CAAY,OAAA,CAAQ,MAAA,EAAQ,KAAK,EAAE,CAAA;AAC/C,IAAA,MAAM,IAAA,GACF,QAAA,CACK,aAAA,CAA+B,yBAAyB,GACvD,OAAA,IAAW,EAAA;AACrB,IAAA,IAAI;AACA,MAAA,MAAM,MAAM,GAAA,EAAK;AAAA,QACb,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACL,MAAA,EAAQ,kBAAA;AAAA,UACR,cAAA,EAAgB,IAAA;AAAA,UAChB,kBAAA,EAAoB;AAAA;AACxB,OACH,CAAA;AAAA,IACL,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,YAAA,EAAa;AAAA,EACjB,CAAA;AAEA,EAAA,MAAM,OAAA,GAAU,CAAC,EAAE,QAAA,OACf,IAAA,CAAK,MAAA,KAAW,IAAA,IAAQ,IAAA,CAAK,MAAA,KAAW,MAAA,IAAa,IAAA,CAAK,MAAA,KAAW,qBAE7DA,GAAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACG,MAAM,IAAA,CAAK,MAAA;AAAA,MACX,SAAA,EAAU,+CAAA;AAAA,MAET;AAAA;AAAA,GACL,mBAEFA,GAAAA,CAAC,KAAA,EAAA,EAAK,QAAA,EAAS,CAAA;AAEzB,EAAA,uBACIA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAW,IAAA,CAAK,WAAW,IAAA,GAAO,iBAAA,GAAoB,EAAA,EACtD,QAAA,kBAAAA,IAAC,OAAA,EAAA,EACG,QAAA,kBAAAG,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,oCAAA,EACX,QAAA,EAAA;AAAA,oBAAAH,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACG,aAAA,EAAW,IAAA;AAAA,QACX,SAAA,EAAW,EAAA;AAAA,UACP,0CAAA;AAAA,UACA;AAAA;AACJ;AAAA,KACJ;AAAA,oBACAG,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACX,QAAA,EAAA;AAAA,sBAAAH,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,kDAAA,EACR,eAAK,KAAA,EACV,CAAA;AAAA,MACC,KAAK,IAAA,KAAS,MAAA,IAAa,IAAA,CAAK,IAAA,KAAS,QAAQ,IAAA,CAAK,IAAA,KAAS,EAAA,mBAC5DA,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,mDAAA,EACR,QAAA,EAAA,IAAA,CAAK,MACV,CAAA,GACA,IAAA;AAAA,sBACJA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,oDACR,QAAA,EAAA,EAAA,EACL;AAAA,KAAA,EACJ,CAAA;AAAA,IACC,IAAA,CAAK,MAAA,KAAW,IAAA,mBACbA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACG,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,QAAA;AAAA,QACT,SAAA,EAAU,wIAAA;AAAA,QACV,YAAA,EAAY,EAAE,cAAc,CAAA;AAAA,QAC5B,KAAA,EAAO,EAAE,cAAc,CAAA;AAAA,QAC1B,QAAA,EAAA;AAAA;AAAA,KAED,GACA;AAAA,GAAA,EACR,GACJ,CAAA,EACJ,CAAA;AAER;AAEA,SAAS,IAAA,GAAkB;AACvB,EAAA,uBACIG,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,KAAA,EAAM,IAAA;AAAA,MACN,MAAA,EAAO,IAAA;AAAA,MACP,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,aAAA,EAAW,IAAA;AAAA,MAEX,QAAA,EAAA;AAAA,wBAAAH,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACG,CAAA,EAAE,+CAAA;AAAA,YACF,MAAA,EAAO,cAAA;AAAA,YACP,WAAA,EAAY,KAAA;AAAA,YACZ,cAAA,EAAe;AAAA;AAAA,SACnB;AAAA,wBACAA,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACG,CAAA,EAAE,6BAAA;AAAA,YACF,MAAA,EAAO,cAAA;AAAA,YACP,WAAA,EAAY,KAAA;AAAA,YACZ,aAAA,EAAc;AAAA;AAAA;AAClB;AAAA;AAAA,GACJ;AAER;ACxQO,SAAS,aAAA,CAAc,EAAE,MAAA,EAAQ,SAAA,EAAW,OAAM,EAAU;AAC/D,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,mBAAA,EAAoB;AAClC,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAII,SAAS,SAAI,CAAA;AAC7C,EAAAC,UAAU,MAAM;AACZ,IAAA,IAAI,OAAO,cAAc,WAAA,EAAa;AACtC,IAAA,WAAA,CAAY,MAAM,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA,GAAI,YAAO,QAAQ,CAAA;AAAA,EAChE,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,uBACIF,IAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACG,IAAA,EAAK,QAAA;AAAA,MACL,OAAA,EAAS,MAAA;AAAA,MACT,SAAA,EAAW,EAAA;AAAA,QACP,+MAAA;AAAA,QACA;AAAA,OACJ;AAAA,MACA,YAAA,EAAY,EAAE,sBAAsB,CAAA;AAAA,MAEpC,QAAA,EAAA;AAAA,wBAAAH,GAAAA,CAACW,aAAA,EAAW,CAAA;AAAA,wBACZX,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oBAAoB,QAAA,EAAA,KAAA,IAAS,CAAA,CAAE,QAAQ,CAAA,EAAE,CAAA;AAAA,wBACzDA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wIACV,QAAA,EAAA,QAAA,EACL;AAAA;AAAA;AAAA,GACJ;AAER;AAEA,SAASW,WAAAA,GAAa;AAClB,EAAA,uBACIR,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,KAAA,EAAM,IAAA;AAAA,MACN,MAAA,EAAO,IAAA;AAAA,MACP,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,MAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAY,KAAA;AAAA,MACZ,aAAA,EAAc,OAAA;AAAA,MACd,cAAA,EAAe,OAAA;AAAA,MACf,aAAA,EAAW,IAAA;AAAA,MAEX,QAAA,EAAA;AAAA,wBAAAH,IAAC,QAAA,EAAA,EAAO,EAAA,EAAG,MAAK,EAAA,EAAG,IAAA,EAAK,GAAE,GAAA,EAAI,CAAA;AAAA,wBAC9BA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,gBAAA,EAAiB;AAAA;AAAA;AAAA,GAC7B;AAER;AC9CA,IAAM,MAAA,GAAwB,CAAC,EAAE,IAAA,EAAM,SAAA,EAAW,QAAA,EAAS,qBAAMA,GAAAA,CAAC,GAAA,EAAA,EAAE,IAAA,EAAY,SAAA,EAAuB,QAAA,EAAS,CAAA;AAUzG,SAAS,QAAA,CAAS,EAAE,MAAA,EAAQ,SAAA,EAAW,YAAY,YAAA,EAAc,aAAA,EAAe,IAAA,GAAO,MAAA,EAAO,EAAU;AAC3G,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,mBAAA,EAAoB;AAClC,EAAA,MAAM,EAAE,IAAA,EAAM,mBAAA,EAAqB,IAAA,KAAS,SAAA,EAAU;AACtD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAII,SAAS,KAAK,CAAA;AAEtC,EAAA,MAAMQ,SAAAA,GAAW,IAAA,CAAK,IAAA,CACjB,KAAA,CAAM,KAAK,EACX,MAAA,CAAO,OAAO,CAAA,CACd,KAAA,CAAM,CAAA,EAAG,CAAC,EACV,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,CAAC,CAAA,EAAG,aAAY,IAAK,EAAE,CAAA,CACpC,IAAA,CAAK,EAAE,CAAA;AAEZ,EAAA,uBACIT,KAAC,KAAA,EAAA,EAAI,SAAA,EAAW,GAAG,UAAA,EAAY,SAAS,CAAA,EAAG,SAAA,EAAW,CAAA,KAAA,KAAS;AAAE,IAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,QAAA,EAAU,OAAA,CAAQ,KAAK,CAAA;AAAA,EAAG,CAAA,EAAG,QAAQ,CAAA,KAAA,KAAS;AAAE,IAAA,IAAI,CAAC,MAAM,aAAA,CAAc,QAAA,CAAS,MAAM,aAAa,CAAA,UAAW,KAAK,CAAA;AAAA,EAAG,CAAA,EACvM,QAAA,EAAA;AAAA,oBAAAH,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACG,IAAA,EAAK,QAAA;AAAA,QACL,SAAS,MAAM,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AAAA,QAChC,SAAA,EAAU,kEAAA;AAAA,QACV,YAAA,EAAY,EAAE,gBAAgB,CAAA;AAAA,QAC9B,eAAA,EAAe,IAAA;AAAA,QACf,WAAW,CAAA,KAAA,KAAS;AAAE,UAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,QAAA,EAAU,OAAA,CAAQ,KAAK,CAAA;AAAA,QAAG,CAAA;AAAA,QAEjE,QAAA,EAAA,IAAA,CAAK,6BACFA,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACG,KAAK,IAAA,CAAK,UAAA;AAAA,YACV,GAAA,EAAI,EAAA;AAAA,YACJ,SAAA,EAAU;AAAA;AAAA,SACd,mBAEAA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,gHAAA,EACX,QAAA,EAAAY,aAAY,GAAA,EACjB;AAAA;AAAA,KAER;AAAA,IACC,IAAA,mBACGT,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,6EAAA,EAA+E,SAAA,KAAc,WAAA,GAAc,yBAAA,GAA4B,uBAAuB,CAAA,EAC7K,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACX,QAAA,EAAA;AAAA,wBAAAH,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,8CAAA,EACR,eAAK,IAAA,EACV,CAAA;AAAA,wBACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,wCAAA,EACR,eAAK,KAAA,EACV;AAAA,OAAA,EACJ,CAAA;AAAA,MACC,MAAA,mBACGG,IAAAA,CAAAI,QAAAA,EAAA,EACI,QAAA,EAAA;AAAA,wBAAAP,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EAA8B,CAAA;AAAA,QAC5C;AAAA,OAAA,EACL,CAAA,GACA,IAAA;AAAA,sBACJA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EAA8B,CAAA;AAAA,sBAC7CG,IAAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UACG,MAAM,IAAA,CAAK,UAAA;AAAA,UACX,SAAA,EAAU,qFAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAAH,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,CAAA,CAAE,gBAAgB,CAAA,EAAE,CAAA;AAAA,4BAC3BA,IAAC,aAAA,EAAA,EAAc;AAAA;AAAA;AAAA,OACnB;AAAA,MACC,IAAA,CAAK,cAAA,IAAkB,mBAAA,mBACpBG,IAAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UACG,MAAM,IAAA,CAAK,cAAA;AAAA,UACX,SAAA,EAAU,qFAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAAA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,UAAA,EACX,QAAA,EAAA;AAAA,cAAA,CAAA,CAAE,gBAAgB,CAAA;AAAA,8BAAEA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA;AAAA,gBAAA,QAAA;AAAA,gBAAI,mBAAA,CAAoB;AAAA,eAAA,EAAK;AAAA,aAAA,EAC9F,CAAA;AAAA,4BACAH,IAAC,aAAA,EAAA,EAAc;AAAA;AAAA;AAAA,OACnB,GACA,IAAA;AAAA,sBACJA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EAA8B,CAAA;AAAA,sBAC7CG,IAAAA,CAAC,MAAA,EAAA,EAAK,QAAQ,IAAA,CAAK,UAAA,EAAY,QAAO,MAAA,EAClC,QAAA,EAAA;AAAA,wBAAAH,IAAC,WAAA,EAAA,EAAY,CAAA;AAAA,wBACbA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACG,IAAA,EAAK,QAAA;AAAA,YACL,SAAA,EAAU,sFAAA;AAAA,YAET,YAAE,UAAU;AAAA;AAAA;AAAE,OAAA,EACvB;AAAA,KAAA,EACJ,CAAA,GACA;AAAA,GAAA,EACR,CAAA;AAER;AAEA,SAAS,aAAA,GAA2B;AAChC,EAAA,uBACIA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,KAAA,EAAM,IAAA;AAAA,MACN,MAAA,EAAO,IAAA;AAAA,MACP,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,aAAA,EAAW,IAAA;AAAA,MAEX,QAAA,kBAAAA,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACG,CAAA,EAAE,kBAAA;AAAA,UACF,MAAA,EAAO,cAAA;AAAA,UACP,WAAA,EAAY,KAAA;AAAA,UACZ,aAAA,EAAc,OAAA;AAAA,UACd,cAAA,EAAe;AAAA;AAAA;AACnB;AAAA,GACJ;AAER;AAEA,SAAS,WAAA,GAAyB;AAC9B,EAAA,IAAI,OAAO,QAAA,KAAa,WAAA,EAAa,OAAO,IAAA;AAC5C,EAAA,MAAM,IAAA,GAAO,QAAA,CACR,aAAA,CAA+B,yBAAyB,CAAA,EACvD,OAAA;AACN,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,EAAA,uBAAOA,IAAC,OAAA,EAAA,EAAM,IAAA,EAAK,UAAS,IAAA,EAAK,QAAA,EAAS,OAAO,IAAA,EAAM,CAAA;AAC3D;ACrEO,SAAS,YAAA,CAAa;AAAA,EACzB,MAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA,gBAAA,GAAmB,KAAA;AAAA,EACnB,eAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,kBAAA;AAAA,EACA;AACJ,CAAA,EAAsB;AAClB,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,mBAAA,EAAoB;AAClC,EAAA,MAAM,UAAA,GAAa,mBAAmB,aAAA,GAAgB,cAAA;AACtD,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAII,SAAS,KAAK,CAAA;AAIxD,EAAAC,UAAU,MAAM;AACZ,IAAA,gBAAA,CAAiB,KAAK,CAAA;AAAA,EAC1B,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAA,uBACIF,KAAC,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,oBAAAH,GAAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QACG,MAAA;AAAA,QACA,YAAA;AAAA,QACA,SAAA;AAAA,QACA,SAAA;AAAA,QACA,QAAA;AAAA,QACA,WAAA;AAAA,QACA,aAAA;AAAA,QACA,SAAA,EAAW;AAAA;AAAA,KACf;AAAA,oBACAA,GAAAA;AAAA,MAAC,mBAAA;AAAA,MAAA;AAAA,QACG,IAAA,EAAM,aAAA;AAAA,QACN,OAAA,EAAS,MAAM,gBAAA,CAAiB,KAAK,CAAA;AAAA,QACrC,MAAA;AAAA,QACA,YAAA;AAAA,QACA,SAAA;AAAA,QACA,SAAA;AAAA,QACA,QAAA;AAAA,QACA,WAAA;AAAA,QACA;AAAA;AAAA,KACJ;AAAA,oBACAG,KAAC,UAAA,EAAA,EACG,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,0IAAA,EACd,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCAAA,EACX,QAAA,EAAA;AAAA,0BAAAH,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACG,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAS,MAAM,gBAAA,CAAiB,IAAI,CAAA;AAAA,cACpC,SAAA,EAAU,uJAAA;AAAA,cACV,YAAA,EAAY,EAAE,iBAAiB,CAAA;AAAA,cAC/B,KAAA,EAAO,EAAE,iBAAiB,CAAA;AAAA,cAE1B,0BAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,aAAa,GAAA,EAAK;AAAA;AAAA,WAChD;AAAA,UACC,eAAA,KAAoB,yBACjBA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACG,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAS,eAAA;AAAA,cACT,SAAA,EAAU,uJAAA;AAAA,cACV,cACI,gBAAA,GACM,CAAA,CAAE,gBAAgB,CAAA,GAClB,EAAE,kBAAkB,CAAA;AAAA,cAE9B,OACI,gBAAA,GACM,CAAA,CAAE,gBAAgB,CAAA,GAClB,EAAE,kBAAkB,CAAA;AAAA,cAG9B,QAAA,kBAAAA,GAAAA;AAAA,gBAAC,UAAA;AAAA,gBAAA;AAAA,kBACG,SAAA,EAAU,SAAA;AAAA,kBACV,WAAA,EAAa;AAAA;AAAA;AACjB;AAAA,WACJ,GACA,IAAA;AAAA,0BACJA,IAAC,WAAA,EAAA,EAAY,CAAA;AAAA,UACZ,YAAA,KAAiB,SAAY,YAAA,GAAe;AAAA,SAAA,EACjD,CAAA;AAAA,wBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EACV,QAAA,EAAA,kBAAA,KAAuB,MAAA,GACpB,kBAAA,mBAEAG,IAAAA,CAAAI,QAAAA,EAAA,EACI,QAAA,EAAA;AAAA,0BAAAP,GAAAA,CAAC,aAAA,EAAA,EAAc,MAAA,EAAQ,YAAA,KAAiB,MAAM;AAAA,UAAC,CAAA,CAAA,EAAI,CAAA;AAAA,0BACnDA,IAAC,iBAAA,EAAA,EAAkB,CAAA;AAAA,0BACnBA,IAAC,QAAA,EAAA,EAAS;AAAA,SAAA,EACd,CAAA,EAER;AAAA,OAAA,EACJ,CAAA;AAAA,MACC;AAAA,KAAA,EACL;AAAA,GAAA,EACJ,CAAA;AAER;AC7DA,IAAM,WAAA,GAAwB,CAAC,EAAE,IAAA,EAAM,SAAA,EAAW,QAAA,EAAS,qBACvDA,GAAAA,CAAC,GAAA,EAAA,EAAE,IAAA,EAAY,SAAA,EACV,QAAA,EACL,CAAA;AAGG,SAAS,UAAA,CAAW;AAAA,EACvB,MAAA;AAAA,EACA,aAAA,GAAgB,WAAA;AAAA,EAChB;AACJ,CAAA,EAAU;AACN,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,mBAAA,EAAoB;AAClC,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACrB,IAAA,OAAO,IAAA;AAAA,EACX;AAEA,EAAA,uBACIA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,gBAAA,EAAe,aAAA;AAAA,MACf,YAAA,EAAY,EAAE,SAAS,CAAA;AAAA,MAMvB,SAAA,EAAW,EAAA,CAAG,iCAAA,EAAmC,SAAS,CAAA;AAAA,MAEzD,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,EAAO,0BAChBG,IAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UAEG,SAAA,EAAU,iCAAA;AAAA,UAET,QAAA,EAAA;AAAA,YAAA,KAAA,GAAQ,CAAA,mBAAIH,GAAAA,CAAC,SAAA,EAAA,EAAU,CAAA,GAAK,IAAA;AAAA,4BAC7BA,GAAAA;AAAA,cAAC,gBAAA;AAAA,cAAA;AAAA,gBACG,KAAA;AAAA,gBACA;AAAA;AAAA;AACJ;AAAA,SAAA;AAAA,QAPK,KAAA,CAAM;AAAA,OASlB;AAAA;AAAA,GACL;AAER;AAEA,SAAS,SAAA,GAAY;AACjB,EAAA,uBACIA,GAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACG,aAAA,EAAW,IAAA;AAAA,MACX,SAAA,EAAU,gFAAA;AAAA,MACb,QAAA,EAAA;AAAA;AAAA,GAED;AAER;AAEA,SAAS,gBAAA,CAAiB;AAAA,EACtB,KAAA;AAAA,EACA;AACJ,CAAA,EAGG;AACC,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,mBAAA,EAAoB;AAClC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAII,SAAS,KAAK,CAAA;AACtC,EAAA,MAAM,GAAA,GAAMI,OAA8B,IAAI,CAAA;AAC9C,EAAA,MAAM,SAAS,KAAA,EAAM;AAGrB,EAAAH,UAAU,MAAM;AACZ,IAAA,IAAI,CAAE,IAAA,EAAM;AAEZ,IAAA,SAAS,cAAc,KAAA,EAA2B;AAC9C,MAAA,IACI,GAAA,CAAI,YAAY,IAAA,IAChB,CAAE,IAAI,OAAA,CAAQ,QAAA,CAAS,KAAA,CAAM,MAAc,CAAA,EAC7C;AACE,QAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,MACjB;AAAA,IACJ;AAEA,IAAA,SAAS,MAAM,KAAA,EAA4B;AACvC,MAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,QAAA,EAAU,OAAA,CAAQ,KAAK,CAAA;AAAA,IAC7C;AAEA,IAAA,MAAA,CAAO,gBAAA,CAAiB,eAAe,aAAa,CAAA;AACpD,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,KAAK,CAAA;AAExC,IAAA,OAAO,MAAM;AACT,MAAA,MAAA,CAAO,mBAAA,CAAoB,eAAe,aAAa,CAAA;AACvD,MAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,KAAK,CAAA;AAAA,IAC/C,CAAA;AAAA,EACJ,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,MAAM,UAAU,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAA,IAAK,MAAM,UAAA,KAAe,MAAA;AAE/D,EAAA,uBACIF,IAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAU,WAAU,kBAAA,EACrB,QAAA,EAAA;AAAA,oBAAAA,IAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACG,IAAA,EAAK,QAAA;AAAA,QACL,SAAS,MAAM,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAE,CAAC,CAAA;AAAA,QACjC,eAAA,EAAe,UAAU,IAAA,GAAO,MAAA;AAAA,QAChC,eAAA,EAAe,UAAU,SAAA,GAAY,MAAA;AAAA,QACrC,eAAA,EAAe,UAAU,MAAA,GAAS,MAAA;AAAA,QAClC,YAAA,EAAY,MAAM,SAAA,IAAa,CAAA,CAAE,iBAAiB,EAAC,IAAA,EAAM,KAAA,CAAM,KAAA,EAAM,CAAA;AAAA,QACrE,UAAU,CAAE,OAAA;AAAA,QACZ,SAAA,EAAW,EAAA;AAAA,UACP,6HAAA;AAAA,UACA,OAAA,IACI,mHAAA;AAAA,UACJ,IAAA,IAAQ;AAAA,SACZ;AAAA,QAEC,QAAA,EAAA;AAAA,UAAA,KAAA,CAAM,MAAA,KAAW,yBACdH,GAAAA;AAAA,YAAC,iBAAA;AAAA,YAAA;AAAA,cACG,QAAQ,KAAA,CAAM,MAAA;AAAA,cACd,eAAe,KAAA,CAAM,KAAA;AAAA,cACrB,IAAA,EAAK;AAAA;AAAA,WACT,GACA,IAAA;AAAA,0BACJA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wBAAA,EAA0B,gBAAM,KAAA,EAAM,CAAA;AAAA,UACrD,0BAAUA,GAAAA,CAACa,QAAAA,EAAA,EAAQ,MAAY,CAAA,GAAK;AAAA;AAAA;AAAA,KACzC;AAAA,IAEC,IAAA,IAAQ,0BACLV,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACG,EAAA,EAAI,MAAA;AAAA,QACJ,IAAA,EAAK,SAAA;AAAA,QACL,YAAA,EAAY,KAAA,CAAM,SAAA,IAAa,KAAA,CAAM,KAAA;AAAA,QACrC,SAAA,EAAU,8GAAA;AAAA,QAET,QAAA,EAAA;AAAA,UAAA,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAA,mBAClBH,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,+BAAA,EACT,QAAA,EAAA,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,CAAC,yBACdA,GAAAA;AAAA,YAAC,cAAA;AAAA,YAAA;AAAA,cAEG,IAAA;AAAA,cACA,UAAU,KAAA,CAAM,QAAA;AAAA,cAChB,aAAA;AAAA,cACA,YAAA,EAAc,MAAM,OAAA,CAAQ,KAAK;AAAA,aAAA;AAAA,YAJ5B,IAAA,CAAK;AAAA,WAMjB,GACL,CAAA,GACA,IAAA;AAAA,UAEH,MAAM,UAAA,KAAe,MAAA,mBAClBG,IAAAA,CAAAI,UAAA,EACK,QAAA,EAAA;AAAA,YAAA,KAAA,CAAM,KAAA,CAAM,SAAS,CAAA,mBAClBP,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAA4B,CAAA,GAC3C,IAAA;AAAA,4BACJA,GAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBAOG,cAAA,EAAgB,MAAM,OAAA,CAAQ,KAAK,CAAA;AAAA,gBAEnC,QAAA,kBAAAG,IAAAA;AAAA,kBAAC,aAAA;AAAA,kBAAA;AAAA,oBACG,IAAA,EAAM,MAAM,UAAA,CAAW,IAAA;AAAA,oBACvB,QAAA,EAAQ,IAAA;AAAA,oBACR,SAAA,EAAU,4GAAA;AAAA,oBAEV,QAAA,EAAA;AAAA,sCAAAH,IAAC,IAAA,EAAA,EAAK,CAAA;AAAA,sCACNA,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,KAAA,CAAM,WAAW,KAAA,EAAM;AAAA;AAAA;AAAA;AAClC;AAAA;AACJ,WAAA,EACJ,CAAA,GACA;AAAA;AAAA;AAAA,KACR,GACA;AAAA,GAAA,EACR,CAAA;AAER;AAEA,SAAS,cAAA,CAAe;AAAA,EACpB,IAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA;AAAA,EACA;AACJ,CAAA,EAKG;AACC,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,mBAAA,EAAoB;AAClC,EAAA,MAAM,IAAA,mBACFG,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,sDAAA,EACV,QAAA,EAAA;AAAA,IAAA,IAAA,CAAK,MAAA,KAAW,yBACbH,GAAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QACG,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,eAAe,IAAA,CAAK,KAAA;AAAA,QACpB,IAAA,EAAK;AAAA;AAAA,KACT,GACA,IAAA;AAAA,oBACJG,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4CAAA,EACX,QAAA,EAAA;AAAA,sBAAAH,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kDAAA,EACX,eAAK,KAAA,EACV,CAAA;AAAA,MACC,IAAA,CAAK,SAAA,KAAc,MAAA,mBAChBA,GAAAA,CAAC,UAAK,SAAA,EAAU,sDAAA,EACX,QAAA,EAAA,IAAA,CAAK,SAAA,EACV,CAAA,GACA;AAAA,KAAA,EACR,CAAA;AAAA,IACC,IAAA,CAAK,YAAY,IAAA,IAAQ,IAAA,CAAK,iBAAiB,MAAA,mBAC5CA,GAAAA,CAAC,KAAA,EAAA,EAAM,CAAA,GACP;AAAA,GAAA,EACR,CAAA;AAGJ,EAAA,MAAM,aAAA,GAAgB,EAAA;AAAA,IAClB,sDAAA;AAAA,IACA,IAAA,CAAK,OAAA,KAAY,IAAA,GACX,wCAAA,GACA;AAAA,GACV;AAMA,EAAA,MAAM,WAAA,GACF,IAAA,CAAK,YAAA,KAAiB,MAAA,mBAClBA,GAAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACG,MAAM,IAAA,CAAK,YAAA;AAAA,MACX,QAAA,EAAQ,IAAA;AAAA,MACR,SAAA,EAAU,0TAAA;AAAA,MAEV,QAAA,kBAAAA,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACG,YAAA,EACI,KAAK,iBAAA,IAAqB,CAAA,CAAE,uBAAuB,EAAC,IAAA,EAAM,IAAA,CAAK,KAAA,EAAM,CAAA;AAAA,UAEzE,cAAA,EAAgB,CAAC,KAAA,KAAU;AACvB,YAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,YAAA,YAAA,EAAa;AAAA,UACjB,CAAA;AAAA,UACA,SAAA,EAAU,UAAA;AAAA,UAEV,QAAA,kBAAAA,IAAC,YAAA,EAAA,EAAa;AAAA;AAAA;AAClB;AAAA,GACJ,GACA,IAAA;AAER,EAAA,IAAI,aAAa,MAAA,EAAW;AACxB,IAAA,uBACIG,IAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,UAAA,EACV,QAAA,EAAA;AAAA,sBAAAH,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACG,IAAA,EAAK,QAAA;AAAA,UACL,SAAS,MAAM;AACX,YAAA,QAAA,CAAS,KAAK,EAAE,CAAA;AAChB,YAAA,YAAA,EAAa;AAAA,UACjB,CAAA;AAAA,UACA,SAAA,EAAW,EAAA,CAAG,aAAA,EAAe,WAAW,CAAA;AAAA,UAEvC,QAAA,EAAA;AAAA;AAAA,OACL;AAAA,MACC;AAAA,KAAA,EACL,CAAA;AAAA,EAER;AAEA,EAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAW;AACzB,IAAA,uBACIG,IAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,UAAA,EACV,QAAA,EAAA;AAAA,sBAAAH,GAAAA;AAAA,QAAC,aAAA;AAAA,QAAA;AAAA,UACG,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,QAAA,EAAQ,IAAA;AAAA,UACR,SAAA,EAAW,aAAA;AAAA,UAEV,QAAA,EAAA;AAAA;AAAA,OACL;AAAA,MACC;AAAA,KAAA,EACL,CAAA;AAAA,EAER;AAEA,EAAA,uBACIG,IAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,UAAA,EACV,QAAA,EAAA;AAAA,oBAAAH,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,aAAA,EAAgB,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,IACpC;AAAA,GAAA,EACL,CAAA;AAER;AAEA,SAAS,YAAA,GAAe;AACpB,EAAA,uBACIG,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,KAAA,EAAM,IAAA;AAAA,MACN,MAAA,EAAO,IAAA;AAAA,MACP,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,MAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAY,KAAA;AAAA,MACZ,aAAA,EAAc,OAAA;AAAA,MACd,cAAA,EAAe,OAAA;AAAA,MACf,aAAA,EAAW,IAAA;AAAA,MAEX,QAAA,EAAA;AAAA,wBAAAH,IAAC,QAAA,EAAA,EAAO,EAAA,EAAG,KAAI,EAAA,EAAG,GAAA,EAAI,GAAE,GAAA,EAAI,CAAA;AAAA,wBAC5BA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,ymBAAA,EAA0mB;AAAA;AAAA;AAAA,GACtnB;AAER;AAEO,SAAS,iBAAA,CAAkB;AAAA,EAC9B,MAAA;AAAA,EACA,aAAA;AAAA,EACA,IAAA,GAAO;AACX,CAAA,EAIG;AACC,EAAA,MAAMY,SAAAA,GACF,MAAA,CAAO,QAAA,IAAY,cAAA,CAAe,aAAa,CAAA;AACnD,EAAA,MAAM,SAAA,GACF,IAAA,KAAS,IAAA,GAAO,+BAAA,GAAkC,qBAAA;AACtD,EAAA,MAAM,QACF,MAAA,CAAO,GAAA,KAAQ,MAAA,IAAa,MAAA,CAAO,WAAW,MAAA,GACxC;AAAA,IACI,iBAAiB,MAAA,CAAO,MAAA;AAAA,IACxB,KAAA,EAAO;AAAA,GACX,GACA,MAAA;AAEV,EAAA,IAAI,MAAA,CAAO,QAAQ,MAAA,EAAW;AAC1B,IAAA,uBACIZ,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACG,KAAK,MAAA,CAAO,GAAA;AAAA,QACZ,GAAA,EAAI,EAAA;AAAA,QACJ,SAAA,EAAW,EAAA;AAAA,UACP,+CAAA;AAAA,UACA;AAAA,SACJ;AAAA,QACA,OAAA,EAAQ;AAAA;AAAA,KACZ;AAAA,EAER;AAEA,EAAA,uBACIA,GAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACG,KAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACP,mFAAA;AAAA,QACA,MAAA,CAAO,WAAW,MAAA,IAAa,wBAAA;AAAA,QAC/B;AAAA,OACJ;AAAA,MAEC,QAAA,EAAAY;AAAA;AAAA,GACL;AAER;AAEA,SAAS,eAAe,KAAA,EAAuB;AAC3C,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,EAAK,CAAE,MAAM,KAAK,CAAA;AACtC,EAAA,IAAI,KAAA,CAAM,UAAU,CAAA,EAAG;AACnB,IAAA,OAAA,CAAA,CAAS,KAAA,CAAM,CAAC,CAAA,GAAI,CAAC,CAAA,IAAK,EAAA,KAAO,KAAA,CAAM,CAAC,CAAA,GAAI,CAAC,CAAA,IAAK,EAAA,CAAA,EAAK,WAAA,EAAY;AAAA,EACvE;AACA,EAAA,OAAA,CAAQ,MAAM,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,IAAK,KAAK,WAAA,EAAY;AAClD;AAEA,SAASC,QAAAA,CAAQ,EAAE,IAAA,EAAK,EAAsB;AAC1C,EAAA,uBACIb,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,KAAA,EAAM,IAAA;AAAA,MACN,MAAA,EAAO,IAAA;AAAA,MACP,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,MAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAY,KAAA;AAAA,MACZ,aAAA,EAAc,OAAA;AAAA,MACd,cAAA,EAAe,OAAA;AAAA,MACf,SAAA,EAAW,EAAA;AAAA,QACP,kEAAA;AAAA,QACA,IAAA,IAAQ;AAAA,OACZ;AAAA,MACA,aAAA,EAAW,IAAA;AAAA,MAEX,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,sBAAA,EAAuB;AAAA;AAAA,GACnC;AAER;AAEA,SAAS,KAAA,GAAQ;AACb,EAAA,uBACIA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,KAAA,EAAM,IAAA;AAAA,MACN,MAAA,EAAO,IAAA;AAAA,MACP,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,MAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAY,KAAA;AAAA,MACZ,aAAA,EAAc,OAAA;AAAA,MACd,cAAA,EAAe,OAAA;AAAA,MACf,SAAA,EAAU,sBAAA;AAAA,MACV,aAAA,EAAW,IAAA;AAAA,MAEX,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,uBAAA,EAAwB;AAAA;AAAA,GACpC;AAER;AAEA,SAAS,IAAA,GAAO;AACZ,EAAA,uBACIA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,KAAA,EAAM,IAAA;AAAA,MACN,MAAA,EAAO,IAAA;AAAA,MACP,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,MAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAY,KAAA;AAAA,MACZ,aAAA,EAAc,OAAA;AAAA,MACd,cAAA,EAAe,OAAA;AAAA,MACf,SAAA,EAAU,UAAA;AAAA,MACV,aAAA,EAAW,IAAA;AAAA,MAEX,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,cAAA,EAAe;AAAA;AAAA,GAC3B;AAER;AC7eO,SAAS,iBAAA,CAAkB;AAAA,EAC9B,aAAA;AAAA,EACA;AACJ,CAAA,EAA2B;AACvB,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,mBAAA,EAAoB;AAClC,EAAA,MAAM,SAAS,iBAAA,EAAkB;AAEjC,EAAA,IAAI,WAAW,IAAA,EAAM;AACjB,IAAA,OAAO,IAAA;AAAA,EACX;AAEA,EAAA,MAAM,EAAE,mBAAA,EAAqB,aAAA,EAAe,IAAA,EAAK,GAAI,MAAA;AACrD,EAAA,MAAM,SAAA,GAAY,mBAAA,IAAuB,aAAA,CAAc,CAAC,CAAA,IAAK,IAAA;AAE7D,EAAA,IAAI,cAAc,IAAA,EAAM;AACpB,IAAA,OAAO,IAAA;AAAA,EACX;AAEA,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,OAAO,EAAE,CAAA;AAE/C,EAAA,MAAM,KAAA,GAAuB,aAAA,CAAc,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,IACrD,IAAI,GAAA,CAAI,IAAA;AAAA,IACR,OAAO,GAAA,CAAI,IAAA;AAAA,IACX,QAAQ,EAAE,QAAA,EAAUc,eAAAA,CAAe,GAAA,CAAI,IAAI,CAAA,EAAE;AAAA,IAC7C,OAAA,EAAS,GAAA,CAAI,IAAA,KAAS,SAAA,CAAU,IAAA;AAAA;AAAA;AAAA,IAGhC,YAAA,EAAc,CAAA,EAAG,MAAM,CAAA,KAAA,EAAQ,IAAI,IAAI,CAAA,SAAA,CAAA;AAAA,IACvC,mBAAmB,CAAA,CAAE,qBAAA,EAAuB,EAAC,IAAA,EAAM,GAAA,CAAI,MAAK;AAAA,GAChE,CAAE,CAAA;AAEF,EAAA,MAAM,QAAA,GAAW,CAAC,IAAA,KAAiB;AAC/B,IAAA,MAAM,MAAM,aAAA,CAAc,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,IAAI,CAAA;AACrD,IAAA,IAAI,QAAQ,MAAA,EAAW;AAEvB,IAAA,MAAM,OAAO,OAAO,MAAA,KAAW,WAAA,GAAc,MAAA,CAAO,SAAS,QAAA,GAAW,GAAA;AACxE,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,UAAA,CAAW,OAAO,IAC9B,IAAA,CAAK,OAAA,CAAQ,eAAA,EAAiB,CAAA,KAAA,EAAQ,IAAI,IAAI,CAAA,CAAE,CAAA,GAChD,CAAA,KAAA,EAAQ,IAAI,IAAI,CAAA,CAAA;AACtB,IAAA,MAAM,SACF,OAAO,MAAA,KAAW,WAAA,GAAc,MAAA,CAAO,SAAS,MAAA,GAAS,EAAA;AAE7D,IAAA,UAAA,CAAW,OAAO,MAAM,CAAA;AAAA,EAC5B,CAAA;AAEA,EAAA,uBACId,GAAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACG,aAAA;AAAA,MACA,MAAA,EAAQ;AAAA,QACJ;AAAA,UACI,EAAA,EAAI,KAAA;AAAA,UACJ,OAAO,SAAA,CAAU,IAAA;AAAA,UACjB,QAAQ,EAAE,QAAA,EAAUc,eAAAA,CAAe,SAAA,CAAU,IAAI,CAAA,EAAE;AAAA,UACnD,KAAA;AAAA,UACA,QAAA;AAAA,UACA,UAAA,EAAY;AAAA,YACR,KAAA,EAAO,EAAE,sBAAsB,CAAA;AAAA,YAC/B,IAAA,EAAM,GAAG,MAAM,CAAA,uBAAA;AAAA,WACnB;AAAA,UACA,SAAA,EAAW,EAAE,qBAAqB;AAAA;AACtC;AACJ;AAAA,GACJ;AAER;AAEA,SAASA,gBAAe,KAAA,EAAuB;AAC3C,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,EAAK,CAAE,MAAM,KAAK,CAAA;AACtC,EAAA,IAAI,KAAA,CAAM,UAAU,CAAA,EAAG;AACnB,IAAA,OAAA,CAAA,CAAS,KAAA,CAAM,CAAC,CAAA,GAAI,CAAC,CAAA,IAAK,EAAA,KAAO,KAAA,CAAM,CAAC,CAAA,GAAI,CAAC,CAAA,IAAK,EAAA,CAAA,EAAK,WAAA,EAAY;AAAA,EACvE;AAEA,EAAA,OAAA,CAAQ,MAAM,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,IAAK,KAAK,WAAA,EAAY;AAClD;AC/EO,SAAS,WAAA,CAAY,EAAE,OAAA,GAAU,cAAA,EAAgB,WAAU,EAAU;AACxE,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,mBAAA,EAAoB;AAClC,EAAA,MAAM,EAAE,mBAAA,EAAqB,aAAA,EAAe,oBAAA,KAAyB,SAAA,EAAU;AAC/E,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIV,SAAS,KAAK,CAAA;AACtC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAS,EAAE,CAAA;AACrC,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAAS,CAAC,CAAA;AAChD,EAAA,MAAM,YAAA,GAAeI,OAA8B,IAAI,CAAA;AACvD,EAAA,MAAM,SAAA,GAAYA,OAAgC,IAAI,CAAA;AAItD,EAAAH,UAAU,MAAM;AACZ,IAAA,IAAI,IAAA,EAAM;AACN,MAAA,QAAA,CAAS,EAAE,CAAA;AACX,MAAA,cAAA,CAAe,CAAC,CAAA;AAChB,MAAA,MAAM,KAAK,qBAAA,CAAsB,MAAM,SAAA,CAAU,OAAA,EAAS,OAAO,CAAA;AACjE,MAAA,OAAO,MAAM,qBAAqB,EAAE,CAAA;AAAA,IACxC;AAAA,EACJ,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAIT,EAAAA,UAAU,MAAM;AACZ,IAAA,IAAI,CAAC,IAAA,EAAM;AACP,MAAA;AAAA,IACJ;AAEA,IAAA,SAAS,cAAc,KAAA,EAA2B;AAC9C,MAAA,IACI,YAAA,CAAa,YAAY,IAAA,IACzB,CAAC,aAAa,OAAA,CAAQ,QAAA,CAAS,KAAA,CAAM,MAAc,CAAA,EACrD;AACE,QAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,MACjB;AAAA,IACJ;AAEA,IAAA,SAAS,MAAM,KAAA,EAA4B;AACvC,MAAA,IAAI,KAAA,CAAM,QAAQ,QAAA,EAAU;AACxB,QAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,MACjB;AAAA,IACJ;AAEA,IAAA,MAAA,CAAO,gBAAA,CAAiB,eAAe,aAAa,CAAA;AACpD,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,KAAK,CAAA;AAExC,IAAA,OAAO,MAAM;AACT,MAAA,MAAA,CAAO,mBAAA,CAAoB,eAAe,aAAa,CAAA;AACvD,MAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,KAAK,CAAA;AAAA,IAC/C,CAAA;AAAA,EACJ,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,MAAM,QAAA,GAAWC,QAAQ,MAAM;AAC3B,IAAA,MAAM,CAAA,GAAI,KAAA,CAAM,IAAA,EAAK,CAAE,WAAA,EAAY;AACnC,IAAA,IAAI,MAAM,EAAA,EAAI;AACV,MAAA,OAAO,aAAA;AAAA,IACX;AACA,IAAA,OAAO,aAAA,CAAc,MAAA;AAAA,MACjB,CAAC,GAAA,KACG,GAAA,CAAI,IAAA,CAAK,aAAY,CAAE,QAAA,CAAS,CAAC,CAAA,IACjC,GAAA,CAAI,IAAA,CAAK,WAAA,EAAY,CAAE,SAAS,CAAC;AAAA,KACzC;AAAA,EACJ,CAAA,EAAG,CAAC,aAAA,EAAe,KAAK,CAAC,CAAA;AAGzB,EAAAD,UAAU,MAAM;AACZ,IAAA,IAAI,WAAA,IAAe,SAAS,MAAA,EAAQ;AAChC,MAAA,cAAA,CAAe,CAAC,CAAA;AAAA,IACpB;AAAA,EACJ,CAAA,EAAG,CAAC,QAAA,CAAS,MAAA,EAAQ,WAAW,CAAC,CAAA;AAEjC,EAAA,MAAM,MAAA,GAAS,CAAC,GAAA,KAA0B;AACtC,IAAA,OAAA,CAAQ,KAAK,CAAA;AACb,IAAA,IAAI,oBAAA,EAAsB;AACtB,MAAA,oBAAA,CAAqB,GAAG,CAAA;AACxB,MAAA;AAAA,IACJ;AAKA,IAAA,IAAI,OAAO,YAAY,WAAA,EAAa;AAChC,MAAA,OAAA,CAAQ,IAAA;AAAA,QACJ;AAAA,OACJ;AAAA,IACJ;AAAA,EACJ,CAAA;AAEA,EAAA,SAAS,gBAAgB,KAAA,EAAmD;AACxE,IAAA,IAAI,KAAA,CAAM,QAAQ,WAAA,EAAa;AAC3B,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACvB,QAAA;AAAA,MACJ;AACA,MAAA,cAAA,CAAe,CAAC,CAAA,KAAA,CAAO,CAAA,GAAI,CAAA,IAAK,SAAS,MAAM,CAAA;AAC/C,MAAA;AAAA,IACJ;AACA,IAAA,IAAI,KAAA,CAAM,QAAQ,SAAA,EAAW;AACzB,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACvB,QAAA;AAAA,MACJ;AACA,MAAA,cAAA,CAAe,CAAC,CAAA,KAAA,CAAO,CAAA,GAAI,IAAI,QAAA,CAAS,MAAA,IAAU,SAAS,MAAM,CAAA;AACjE,MAAA;AAAA,IACJ;AACA,IAAA,IAAI,KAAA,CAAM,QAAQ,OAAA,EAAS;AACvB,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,MAAM,MAAA,GAAS,SAAS,WAAW,CAAA;AACnC,MAAA,IAAI,WAAW,MAAA,EAAW;AACtB,QAAA,MAAA,CAAO,MAAM,CAAA;AAAA,MACjB;AAAA,IACJ;AAAA,EACJ;AAEA,EAAA,uBACIF,KAAC,KAAA,EAAA,EAAI,GAAA,EAAK,cAAc,SAAA,EAAW,EAAA,CAAG,UAAA,EAAY,SAAS,CAAA,EACvD,QAAA,EAAA;AAAA,oBAAAH,GAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACG,YAAA,EAAc,mBAAA;AAAA,QACd,SAAS,MAAM,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AAAA,QAChC;AAAA;AAAA,KACJ;AAAA,IACC,uBACGG,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACG,IAAA,EAAK,QAAA;AAAA,QACL,YAAA,EAAY,EAAE,qBAAqB,CAAA;AAAA,QACnC,SAAA,EAAU,8GAAA;AAAA,QAEV,QAAA,EAAA;AAAA,0BAAAH,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0CAAA,EACX,QAAA,kBAAAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uFAAA,EACR,QAAA,EAAA,CAAA,CAAE,qBAAqB,CAAA,EAAE,CAAA,EAClC,CAAA;AAAA,0BAEAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yCACX,QAAA,kBAAAG,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wEAAA,EACX,QAAA,EAAA;AAAA,4BAAAH,GAAAA,CAACW,aAAA,EAAW,CAAA;AAAA,4BACZX,GAAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBACG,GAAA,EAAK,SAAA;AAAA,gBACL,IAAA,EAAK,MAAA;AAAA,gBACL,KAAA,EAAO,KAAA;AAAA,gBACP,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,gBACxC,SAAA,EAAW,eAAA;AAAA,gBACX,WAAA,EAAa,EAAE,cAAS,CAAA;AAAA,gBACxB,YAAA,EAAY,EAAE,sBAAsB,CAAA;AAAA,gBACpC,YAAA,EAAa,KAAA;AAAA,gBACb,UAAA,EAAY,KAAA;AAAA,gBACZ,SAAA,EAAU;AAAA;AAAA;AACd,WAAA,EACJ,CAAA,EACJ,CAAA;AAAA,0BAEAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EACV,QAAA,EAAA,QAAA,CAAS,MAAA,KAAW,CAAA,mBACjBA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,yDAAA,EACR,QAAA,EAAA,CAAA,CAAE,4CAAA,EAAoC,EAAC,KAAA,EAAM,CAAA,EAClD,CAAA,mBAEAA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,aAAA,EACT,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,CAAC,KAAK,KAAA,KAAU;AAC1B,YAAA,MAAM,MAAA,GAAS,mBAAA,EAAqB,EAAA,KAAO,GAAA,CAAI,EAAA;AAC/C,YAAA,MAAM,cAAc,KAAA,KAAU,WAAA;AAC9B,YAAA,uBACIA,GAAAA,CAAC,IAAA,EAAA,EACG,QAAA,kBAAAG,IAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACG,IAAA,EAAK,QAAA;AAAA,gBACL,YAAA,EAAc,MAAM,cAAA,CAAe,KAAK,CAAA;AAAA,gBACxC,OAAA,EAAS,MAAM,MAAA,CAAO,GAAG,CAAA;AAAA,gBACzB,SAAA,EAAW,EAAA;AAAA,kBACP,qGAAA;AAAA,kBACA,MAAA,GACM,gCAAA,GACA,WAAA,GACE,cAAA,GACA;AAAA,iBACZ;AAAA,gBAEA,QAAA,EAAA;AAAA,kCAAAH,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,UAAA,EAAY,cAAI,IAAA,EAAK,CAAA;AAAA,kBACpC,MAAA,mBACGA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,6CAAA,EACX,QAAA,EAAA,CAAA,CAAE,SAAS,CAAA,EAAE,CAAA,GAClB;AAAA;AAAA;AAAA,aACR,EAAA,EAnBK,IAAI,EAoBb,CAAA;AAAA,UAER,CAAC,GACL,CAAA,EAER;AAAA;AAAA;AAAA,KACJ,GACA;AAAA,GAAA,EACR,CAAA;AAER;AAEA,IAAM,iBAID,CAAC,EAAE,YAAA,EAAc,OAAA,uBAClBG,IAAAA;AAAA,EAAC,QAAA;AAAA,EAAA;AAAA,IACG,IAAA,EAAK,QAAA;AAAA,IACL,OAAA;AAAA,IACA,SAAA,EAAU,oIAAA;AAAA,IAEV,QAAA,EAAA;AAAA,sBAAAH,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wBAAA,EACX,QAAA,EAAA,YAAA,EAAc,QAAQ,sBAAA,EAC3B,CAAA;AAAA,sBACAA,GAAAA,CAACa,QAAAA,EAAA,EAAQ;AAAA;AAAA;AACb,CAAA;AAGJ,SAASA,QAAAA,GAAqB;AAC1B,EAAA,uBACIb,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,KAAA,EAAM,IAAA;AAAA,MACN,MAAA,EAAO,IAAA;AAAA,MACP,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,KAAA,EAAM,4BAAA;AAAA,MACN,aAAA,EAAW,IAAA;AAAA,MAEX,QAAA,kBAAAA,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACG,CAAA,EAAE,cAAA;AAAA,UACF,MAAA,EAAO,cAAA;AAAA,UACP,WAAA,EAAY,KAAA;AAAA,UACZ,aAAA,EAAc,OAAA;AAAA,UACd,cAAA,EAAe;AAAA;AAAA;AACnB;AAAA,GACJ;AAER;AAEA,SAASW,WAAAA,GAAwB;AAC7B,EAAA,uBACIR,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,KAAA,EAAM,IAAA;AAAA,MACN,MAAA,EAAO,IAAA;AAAA,MACP,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,MAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAY,KAAA;AAAA,MACZ,aAAA,EAAc,OAAA;AAAA,MACd,cAAA,EAAe,OAAA;AAAA,MACf,aAAA,EAAW,IAAA;AAAA,MACX,SAAA,EAAU,gCAAA;AAAA,MAEV,QAAA,EAAA;AAAA,wBAAAH,IAAC,QAAA,EAAA,EAAO,EAAA,EAAG,QAAO,EAAA,EAAG,MAAA,EAAO,GAAE,MAAA,EAAO,CAAA;AAAA,wBACrCA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,UAAA,EAAW;AAAA;AAAA;AAAA,GACvB;AAER;AC1PO,SAAS,MAAA,CAAO;AAAA,EACnB,KAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA,GAAkB,IAAA;AAAA,EAClB;AACJ,CAAA,EAAU;AACN,EAAA,uBACIG,IAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACG,SAAA,EAAW,EAAA;AAAA,QACP,iFAAA;AAAA,QACA;AAAA,OACJ;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACV,QAAA,EAAA;AAAA,UAAA,KAAA;AAAA,0BACDH,IAAC,WAAA,EAAA,EAAY,CAAA;AAAA,UACZ,eAAA,mBAAkBA,GAAAA,CAAC,WAAA,EAAA,EAAY,CAAA,GAAK;AAAA,SAAA,EACzC,CAAA;AAAA,wBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAkB,QAAA,EAAA,MAAA,EAAO,CAAA;AAAA,wBACxCA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oCACV,QAAA,EAAA,YAAA,oBACGG,IAAAA,CAAAI,QAAAA,EAAA,EACI,QAAA,EAAA;AAAA,0BAAAP,IAAC,iBAAA,EAAA,EAAkB,CAAA;AAAA,0BACnBA,IAAC,QAAA,EAAA,EAAS;AAAA,SAAA,EACd,CAAA,EAER;AAAA;AAAA;AAAA,GACJ;AAER;AC/BO,SAAS,WAAA,CAAY,EAAE,SAAA,EAAW,gBAAA,EAAiB,EAAqB;AAC3E,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,mBAAA,EAAoB;AAMlC,EAAA,MAAM,SAAS,iBAAA,EAAkB;AACjC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAII,SAAS,KAAK,CAAA;AACtC,EAAA,MAAM,YAAA,GAAeI,OAA8B,IAAI,CAAA;AAIvD,EAAAH,UAAU,MAAM;AACZ,IAAA,IAAI,CAAE,IAAA,EAAM;AACR,MAAA;AAAA,IACJ;AAEA,IAAA,SAAS,cAAc,KAAA,EAA2B;AAC9C,MAAA,IACI,YAAA,CAAa,YAAY,IAAA,IACzB,CAAE,aAAa,OAAA,CAAQ,QAAA,CAAS,KAAA,CAAM,MAAc,CAAA,EACtD;AACE,QAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,MACjB;AAAA,IACJ;AAEA,IAAA,SAAS,MAAM,KAAA,EAA4B;AACvC,MAAA,IAAI,KAAA,CAAM,QAAQ,QAAA,EAAU;AACxB,QAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,MACjB;AAAA,IACJ;AAEA,IAAA,MAAA,CAAO,gBAAA,CAAiB,eAAe,aAAa,CAAA;AACpD,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,KAAK,CAAA;AAExC,IAAA,OAAO,MAAM;AACT,MAAA,MAAA,CAAO,mBAAA,CAAoB,eAAe,aAAa,CAAA;AACvD,MAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,KAAK,CAAA;AAAA,IAC/C,CAAA;AAAA,EACJ,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAIT,EAAA,IAAI,MAAA,KAAW,IAAA,IAAQ,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA,EAAG;AAC7C,IAAA,OAAO,IAAA;AAAA,EACX;AAEA,EAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AAOpB,EAAA,MAAM,OAAA,GAAU,OAAO,mBAAA,EAAqB,IAAA;AAM5C,EAAA,MAAM,WAA0B,EAAC;AACjC,EAAA,MAAM,SAAwB,EAAC;AAC/B,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACpB,IAAA,MAAM,UAAA,GAAa,GAAA,CAAI,QAAA,KAAa,KAAA,IAAS,IAAI,UAAA,KAAe,IAAA;AAChE,IAAA,CAAC,UAAA,GAAa,QAAA,GAAW,MAAA,EAAQ,IAAA,CAAK,GAAG,CAAA;AAAA,EAC7C;AAEA,EAAA,uBACIF,KAAC,KAAA,EAAA,EAAI,GAAA,EAAK,cAAc,SAAA,EAAW,EAAA,CAAG,UAAA,EAAY,SAAS,CAAA,EACvD,QAAA,EAAA;AAAA,oBAAAH,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACG,IAAA,EAAK,QAAA;AAAA,QACL,YAAA,EAAY,EAAE,mBAAmB,CAAA;AAAA,QACjC,eAAA,EAAe,IAAA;AAAA,QACf,SAAS,MAAM,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AAAA,QAChC,SAAA,EAAW,EAAA;AAAA,UACP,sIAAA;AAAA,UACA,IAAA,IAAQ;AAAA,SACZ;AAAA,QAEA,QAAA,kBAAAA,IAAC,IAAA,EAAA,EAAK;AAAA;AAAA,KACV;AAAA,IACC,uBACGG,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACG,IAAA,EAAK,QAAA;AAAA,QACL,YAAA,EAAY,EAAE,mBAAmB,CAAA;AAAA,QAMjC,SAAA,EAAU,8IAAA;AAAA,QAEV,QAAA,EAAA;AAAA,0BAAAH,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uCAAA,EACX,QAAA,kBAAAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,uFAAA,EACR,QAAA,EAAA,CAAA,CAAE,YAAY,CAAA,EAAE,CAAA,EACzB,CAAA;AAAA,0BAEAG,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACV,QAAA,EAAA;AAAA,YAAA,QAAA,CAAS,MAAA,GAAS,CAAA,mBACfH,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,iBAAA,EACT,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,CAAC,GAAA,qBACXA,GAAAA;AAAA,cAACe,OAAAA;AAAA,cAAA;AAAA,gBAEG,GAAA;AAAA,gBACA,OAAA;AAAA,gBACA;AAAA,eAAA;AAAA,cAHK,GAAA,CAAI;AAAA,aAKhB,GACL,CAAA,GACA,IAAA;AAAA,YAEH,OAAO,MAAA,GAAS,CAAA,mBACbZ,IAAAA,CAAAI,UAAA,EACK,QAAA,EAAA;AAAA,cAAA,QAAA,CAAS,SAAS,CAAA,mBACfP,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAiC,CAAA,GAChD,IAAA;AAAA,8BACJA,GAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,sGAAA,EACR,QAAA,EAAA,CAAA,CAAE,WAAW,CAAA,EAAE,CAAA;AAAA,8BACpBA,IAAC,IAAA,EAAA,EAAG,SAAA,EAAU,wBACT,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,GAAA,qBACTA,GAAAA;AAAA,gBAACe,OAAAA;AAAA,gBAAA;AAAA,kBAEG,GAAA;AAAA,kBACA,OAAA;AAAA,kBACA;AAAA,iBAAA;AAAA,gBAHK,GAAA,CAAI;AAAA,eAKhB,CAAA,EACL;AAAA,aAAA,EACJ,CAAA,GACA;AAAA,WAAA,EACR;AAAA;AAAA;AAAA,KACJ,GACA;AAAA,GAAA,EACR,CAAA;AAER;AAQA,SAASA,OAAAA,CAAO,EAAE,GAAA,EAAK,OAAA,EAAS,kBAAiB,EAA2B;AACxE,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,mBAAA,EAAoB;AAClC,EAAA,MAAM,YAAA,GAAe,IAAI,UAAA,KAAe,IAAA;AACxC,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,QAAA,KAAa,KAAA,IAAS,YAAA;AAE3C,EAAA,MAAM,QAAA,GAAW,IAAI,QAAA,IAAY,GAAA,CAAI,KAAK,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,WAAA,EAAY;AAClE,EAAA,MAAM,SAAS,GAAA,CAAI,WAAA;AAInB,EAAA,MAAM,SAAA,GACF,MAAA,KAAW,MAAA,IAAa,aAAA,CAAc,IAAI,OAAO,CAAA,KAAM,IAAA,GACjD,EAAE,iBAAiB,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,WAAA,EAAa,QAAO,GAC9D,MAAA;AAOV,EAAA,MAAM,IAAA,GACF,OAAA,KAAY,MAAA,IAAa,GAAA,CAAI,OAAA,KAAY,IAAA,GACnCC,YAAAA,CAAY,GAAA,CAAI,GAAA,EAAK,OAAO,CAAA,GAC5B,GAAA,CAAI,GAAA;AAEd,EAAA,MAAM,uBACFhB,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,KAAA,EAAO,SAAA;AAAA,MACP,SAAA,EAAW,EAAA;AAAA,QACP,qIAAA;AAAA,QACA,IAAI,OAAA,IAAW,2DAAA;AAAA,QACf,QAAA,IAAY;AAAA,OAChB;AAAA,MAEA,0BAAAA,GAAAA,CAAC,WAAA,EAAA,EAAY,MAAM,GAAA,CAAI,IAAA,EAAM,SAAS,GAAA,CAAI,OAAA,EAAS,aAAa,GAAA,CAAI,WAAA,EAAa,WAAU,SAAA,EAAU,QAAA,kBAAUA,GAAAA,CAAC,MAAA,EAAA,EAAM,oBAAS,CAAA,EAAS;AAAA;AAAA,GAC5I;AAGJ,EAAA,MAAM,IAAA,mBACFG,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,4CAAA,EACX,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACX,QAAA,EAAA;AAAA,sBAAAH,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACG,SAAA,EAAW,EAAA;AAAA,YACP,8CAAA;AAAA,YACA,QAAA,IAAY;AAAA,WAChB;AAAA,UAEC,QAAA,EAAA,GAAA,CAAI;AAAA;AAAA,OACT;AAAA,MACC,GAAA,CAAI,OAAA,mBACDA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,iJAAA,EACX,QAAA,EAAA,CAAA,CAAE,SAAS,CAAA,EAAE,CAAA,GAClB;AAAA,KAAA,EACR,CAAA;AAAA,IACC,GAAA,CAAI,8BACDA,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACG,SAAA,EAAW,EAAA;AAAA,UACP,sBAAA;AAAA,UACA,WACM,0BAAA,GACA;AAAA,SACV;AAAA,QAEC,QAAA,EAAA,GAAA,CAAI;AAAA;AAAA,KACT,GACA;AAAA,GAAA,EACR,CAAA;AAGJ,EAAA,MAAM,WAAW,YAAA,mBACbA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,0JAAA,EACX,QAAA,EAAA,CAAA,CAAE,MAAM,CAAA,EAAE,IACf,QAAA,mBACAG,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,gFAAA,EACZ,QAAA,EAAA;AAAA,oBAAAH,GAAAA,CAACiB,OAAA,EAAK,CAAA;AAAA,IACL,EAAE,KAAK;AAAA,GAAA,EAAE,CAAA,GACd,IAAA;AAEJ,EAAA,IAAI,YAAA,EAAc;AACd,IAAA,uBACIjB,GAAAA,CAAC,IAAA,EAAA,EACG,QAAA,kBAAAG,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACG,eAAA,EAAa,IAAA;AAAA,QACb,SAAA,EAAU,0EAAA;AAAA,QACV,OAAO,CAAA,CAAE,2BAAA,EAAwB,EAAC,IAAA,EAAM,GAAA,CAAI,MAAK,CAAA;AAAA,QAEhD,QAAA,EAAA;AAAA,UAAA,IAAA;AAAA,UACA,IAAA;AAAA,UACA;AAAA;AAAA;AAAA,KACL,EACJ,CAAA;AAAA,EAER;AAEA,EAAA,IAAI,QAAA,EAAU;AACV,IAAA,uBACIH,GAAAA,CAAC,IAAA,EAAA,EACG,QAAA,kBAAAG,IAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACG,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,MAAM,gBAAA,GAAmB,GAAG,CAAA;AAAA,QACrC,SAAA,EAAW,EAAA;AAAA,UACP,yFAAA;AAAA,UACA,gBAAA,KAAqB,SACf,oBAAA,GACA;AAAA,SACV;AAAA,QACA,OAAO,CAAA,CAAE,yBAAA,EAA2B,EAAC,IAAA,EAAM,GAAA,CAAI,MAAK,CAAA;AAAA,QAEnD,QAAA,EAAA;AAAA,UAAA,IAAA;AAAA,UACA,IAAA;AAAA,UACA;AAAA;AAAA;AAAA,KACL,EACJ,CAAA;AAAA,EAER;AAEA,EAAA,uBACIH,GAAAA,CAAC,IAAA,EAAA,EACG,QAAA,kBAAAG,IAAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACG,IAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACP,kGAAA;AAAA,QACA,IAAI,OAAA,IAAW;AAAA,OACnB;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,IAAA;AAAA,QACA,IAAA;AAAA,QACA;AAAA;AAAA;AAAA,GACL,EACJ,CAAA;AAER;AAEA,SAASa,YAAAA,CAAY,KAAa,OAAA,EAAyB;AACvD,EAAA,IAAI,GAAA,KAAQ,EAAA,IAAM,OAAA,KAAY,EAAA,EAAI;AAC9B,IAAA,OAAO,GAAA;AAAA,EACX;AACA,EAAA,IAAI;AAKA,IAAA,MAAM,CAAA,GAAI,IAAI,GAAA,CAAI,GAAG,CAAA;AACrB,IAAA,CAAA,CAAE,QAAA,GAAW,CAAA,KAAA,EAAQ,kBAAA,CAAmB,OAAO,CAAC,CAAA,CAAA;AAChD,IAAA,OAAO,EAAE,QAAA,EAAS;AAAA,EACtB,CAAA,CAAA,MAAQ;AACJ,IAAA,OAAO,CAAA,EAAG,IAAI,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAC,CAAA,KAAA,EAAQ,kBAAA,CAAmB,OAAO,CAAC,CAAA,CAAA;AAAA,EACvE;AACJ;AAEA,SAAS,IAAA,GAAkB;AACvB,EAAA,uBACIhB,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,QAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,QAAO,aAAA,EAAW,IAAA,EAClE,WAAC,CAAA,EAAG,CAAA,EAAG,EAAE,CAAA,CAAE,OAAA;AAAA,IAAQ,CAAC,CAAA,KACjB,CAAC,CAAA,EAAG,CAAA,EAAG,EAAE,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,qBACZA,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QAEG,CAAA;AAAA,QACA,CAAA;AAAA,QACA,KAAA,EAAM,KAAA;AAAA,QACN,MAAA,EAAO,KAAA;AAAA,QACP,EAAA,EAAG,KAAA;AAAA,QACH,IAAA,EAAK;AAAA,OAAA;AAAA,MANA,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA;AAAA,KAQrB;AAAA,GACL,EACJ,CAAA;AAER;AAEA,SAASiB,KAAAA,GAAkB;AACvB,EAAA,uBACId,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,KAAA,EAAM,IAAA;AAAA,MACN,MAAA,EAAO,IAAA;AAAA,MACP,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,MAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAY,KAAA;AAAA,MACZ,aAAA,EAAc,OAAA;AAAA,MACd,cAAA,EAAe,OAAA;AAAA,MACf,aAAA,EAAW,IAAA;AAAA,MAEX,QAAA,EAAA;AAAA,wBAAAH,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,KAAA,EAAM,CAAA,EAAE,GAAA,EAAI,KAAA,EAAM,GAAA,EAAI,MAAA,EAAO,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,CAAA;AAAA,wBAChDA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,0BAAA,EAA2B;AAAA;AAAA;AAAA,GACvC;AAER;ACxUA,IAAM,uBAAA,GAA0B,EAAA;AAYzB,SAAS,eAAA,CAAgB,IAAa,IAAA,EAAoC;AAC7E,EAAA,MAAM,OAAO,OAAO,IAAA,KAAS,YAAY,IAAA,KAAS,IAAA,GAAQ,OAAmC,EAAC;AAC9F,EAAA,IAAI,CAAC,EAAA,EAAI;AACL,IAAA,MAAM,YAAY,OAAO,IAAA,CAAK,aAAA,KAAkB,QAAA,GAAW,KAAK,aAAA,GAAgB,IAAA;AAChF,IAAA,IAAI,SAAA,KAAc,IAAA,IAAQ,IAAA,CAAK,KAAA,KAAU,wBAAA,EAA0B;AAC/D,MAAA,OAAO,EAAE,MAAA,EAAQ,wBAAA,EAA0B,YAAA,EAAc,SAAA,EAAU;AAAA,IACvE;AAEA,IAAA,OAAO,EAAE,QAAQ,aAAA,EAAc;AAAA,EACnC;AACA,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,EAAG;AAC3B,IAAA,OAAO,EAAE,QAAQ,aAAA,EAAc;AAAA,EACnC;AACA,EAAA,MAAM,OAAyB,EAAC;AAChC,EAAA,KAAA,MAAW,KAAA,IAAS,KAAK,IAAA,EAAmB;AACxC,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,EAAM;AACjD,IAAA,MAAM,GAAA,GAAM,KAAA;AACZ,IAAA,IAAI,OAAO,GAAA,CAAI,GAAA,KAAQ,QAAA,IAAY,OAAO,GAAA,CAAI,IAAA,KAAS,QAAA,IAAY,OAAO,GAAA,CAAI,UAAA,KAAe,QAAA,EAAU;AACvG,IAAA,IAAI,CAAC,cAAA,CAAe,IAAA,CAAK,GAAA,CAAI,UAAU,CAAA,EAAG;AAC1C,IAAA,IAAA,CAAK,IAAA,CAAK;AAAA,MACN,KAAK,GAAA,CAAI,GAAA;AAAA,MACT,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,YAAY,GAAA,CAAI,UAAA;AAAA,MAChB,UAAU,OAAO,GAAA,CAAI,QAAA,KAAa,QAAA,GAAW,IAAI,QAAA,GAAW,IAAA;AAAA,MAC5D,eAAe,OAAO,GAAA,CAAI,aAAA,KAAkB,QAAA,GAAW,IAAI,aAAA,GAAgB,IAAA;AAAA,MAC3E,aAAa,OAAO,GAAA,CAAI,WAAA,KAAgB,QAAA,GAAW,IAAI,WAAA,GAAc;AAAA,KACxE,CAAA;AAAA,EACL;AACA,EAAA,MAAM,OAAA,GAAU,OAAO,IAAA,CAAK,aAAA,KAAkB,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,aAAa,CAAA,GAAI,IAAA,CAAK,aAAA,GAAgB,uBAAA;AAErH,EAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,YAAA,EAAc,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,uBAAA,EAAyB,OAAO,CAAC,CAAA,EAAE;AAC1G;AAGO,SAAS,aAAA,CAAc,cAA6B,QAAA,EAA+E;AACtI,EAAA,IAAI,YAAA,KAAiB,MAAM,OAAO,IAAA;AAClC,EAAA,IAAI;AACA,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,YAAA,EAAc,SAAS,MAAM,CAAA;AACjD,IAAA,IAAI,GAAA,CAAI,MAAA,KAAW,QAAA,CAAS,MAAA,EAAQ,OAAO,IAAA;AAC3C,IAAA,GAAA,CAAI,aAAa,GAAA,CAAI,WAAA,EAAa,QAAA,CAAS,QAAA,GAAW,SAAS,MAAM,CAAA;AAErE,IAAA,OAAO,GAAA,CAAI,WAAW,GAAA,CAAI,MAAA;AAAA,EAC9B,CAAA,CAAA,MAAQ;AACJ,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;AASO,SAAS,cAAA,CAAe,EAAE,QAAA,EAAU,aAAA,EAAe,WAAU,EAAwB;AACxF,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,mBAAA,EAAoB;AAClC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAII,SAAS,KAAK,CAAA;AACtC,EAAA,MAAM,CAAC,OAAO,QAAQ,CAAA,GAAIA,SAA8B,EAAE,MAAA,EAAQ,QAAQ,CAAA;AAC1E,EAAA,MAAM,SAAA,GAAYI,OAAuB,IAAI,CAAA;AAC7C,EAAA,MAAM,MAAA,GAASA,OAA+B,IAAI,CAAA;AAClD,EAAA,MAAM,OAAA,GAAUA,OAAO,CAAC,CAAA;AAExB,EAAA,MAAM,IAAA,GAAOE,YAAY,YAAY;AACjC,IAAA,IAAI,QAAA,KAAa,IAAA,IAAQ,MAAA,CAAO,OAAA,KAAY,IAAA,EAAM;AAClD,IAAA,MAAM,OAAA,GAAU,IAAI,eAAA,EAAgB;AACpC,IAAA,MAAA,CAAO,OAAA,GAAU,OAAA;AACjB,IAAA,QAAA,CAAS,CAAA,OAAA,KAAY,QAAQ,MAAA,KAAW,OAAA,GAAU,UAAU,EAAE,MAAA,EAAQ,WAAY,CAAA;AAClF,IAAA,IAAI;AACA,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,QAAA,EAAU;AAAA,QACnC,WAAA,EAAa,aAAA;AAAA,QACb,KAAA,EAAO,UAAA;AAAA,QACP,OAAA,EAAS,EAAE,MAAA,EAAQ,kBAAA,EAAoB,oBAAoB,gBAAA,EAAiB;AAAA,QAC5E,QAAQ,OAAA,CAAQ;AAAA,OACnB,CAAA;AACD,MAAA,MAAM,OAAgB,MAAM,QAAA,CAAS,MAAK,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA;AAC5D,MAAA,IAAI,OAAA,CAAQ,OAAO,OAAA,EAAS;AAC5B,MAAA,MAAM,IAAA,GAAO,eAAA,CAAgB,QAAA,CAAS,EAAA,EAAI,IAAI,CAAA;AAC9C,MAAA,OAAA,CAAQ,OAAA,GAAU,KAAK,MAAA,KAAW,OAAA,GAAU,KAAK,GAAA,EAAI,GAAI,IAAA,CAAK,YAAA,GAAe,GAAA,GAAO,CAAA;AACpF,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,IAAI,IAAA,CAAK,MAAA,KAAW,OAAA,EAAS,kBAAA,CAAmB,KAAK,IAAI,CAAA;AAAA,IAC7D,CAAA,CAAA,MAAQ;AACJ,MAAA,IAAI,CAAC,OAAA,CAAQ,MAAA,CAAO,OAAA,EAAS;AAAE,QAAA,OAAA,CAAQ,OAAA,GAAU,CAAA;AAAG,QAAA,QAAA,CAAS,EAAE,MAAA,EAAQ,aAAA,EAAe,CAAA;AAAA,MAAG;AAAA,IAC7F,CAAA,SAAE;AACE,MAAA,IAAI,MAAA,CAAO,OAAA,KAAY,OAAA,EAAS,MAAA,CAAO,OAAA,GAAU,IAAA;AAAA,IACrD;AAAA,EACJ,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,MAAM,OAAA,GAAUA,YAAY,MAAM;AAC9B,IAAA,IAAI,QAAA,CAAS,oBAAoB,SAAA,IAAa,IAAA,CAAK,KAAI,IAAK,OAAA,CAAQ,OAAA,EAAS,KAAK,IAAA,EAAK;AAAA,EAC3F,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAAL,UAAU,MAAM;AACZ,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,OAAA,EAAQ;AACR,IAAA,MAAM,OAAA,GAAU,CAAC,KAAA,KAAwB;AAAE,MAAA,IAAI,SAAA,CAAU,OAAA,KAAY,IAAA,IAAQ,CAAC,SAAA,CAAU,OAAA,CAAQ,QAAA,CAAS,KAAA,CAAM,MAAc,CAAA,EAAG,OAAA,CAAQ,KAAK,CAAA;AAAA,IAAG,CAAA;AAChJ,IAAA,MAAM,GAAA,GAAM,CAAC,KAAA,KAAyB;AAAE,MAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,QAAA,EAAU,OAAA,CAAQ,KAAK,CAAA;AAAA,IAAG,CAAA;AACpF,IAAA,MAAA,CAAO,gBAAA,CAAiB,eAAe,OAAO,CAAA;AAC9C,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,GAAG,CAAA;AACtC,IAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,OAAO,CAAA;AACxC,IAAA,QAAA,CAAS,gBAAA,CAAiB,oBAAoB,OAAO,CAAA;AACrD,IAAA,OAAO,MAAM;AACT,MAAA,MAAA,CAAO,mBAAA,CAAoB,eAAe,OAAO,CAAA;AACjD,MAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,GAAG,CAAA;AACzC,MAAA,MAAA,CAAO,mBAAA,CAAoB,SAAS,OAAO,CAAA;AAC3C,MAAA,QAAA,CAAS,mBAAA,CAAoB,oBAAoB,OAAO,CAAA;AAAA,IAC5D,CAAA;AAAA,EACJ,CAAA,EAAG,CAAC,IAAA,EAAM,OAAO,CAAC,CAAA;AAElB,EAAAA,UAAU,MAAM;AACZ,IAAA,IAAI,CAAC,IAAA,IAAQ,KAAA,CAAM,MAAA,KAAW,OAAA,EAAS;AACvC,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,UAAA,CAAW,OAAA,EAAS,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,OAAA,CAAQ,OAAA,GAAU,IAAA,CAAK,GAAA,EAAK,CAAC,CAAA;AACnF,IAAA,OAAO,MAAM,MAAA,CAAO,YAAA,CAAa,KAAK,CAAA;AAAA,EAC1C,CAAA,EAAG,CAAC,IAAA,EAAM,KAAA,EAAO,OAAO,CAAC,CAAA;AAEzB,EAAAA,SAAAA,CAAU,MAAM,MAAM,MAAA,CAAO,SAAS,KAAA,EAAM,EAAG,EAAE,CAAA;AACjD,EAAAA,UAAU,MAAM;AAAE,IAAA,OAAA,CAAQ,OAAA,GAAU,CAAA;AAAG,IAAA,QAAA,CAAS,EAAE,MAAA,EAAQ,MAAA,EAAQ,CAAA;AAAA,EAAG,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAElF,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,MAAA,KAAW,wBAAA,IAA4B,OAAO,MAAA,KAAW,WAAA,GAAc,aAAA,CAAc,KAAA,CAAM,YAAA,EAAc,MAAA,CAAO,QAAQ,CAAA,GAAI,IAAA;AAEpJ,EAAA,uBACIF,KAAC,KAAA,EAAA,EAAI,GAAA,EAAK,WAAW,SAAA,EAAW,EAAA,CAAG,UAAA,EAAY,SAAS,CAAA,EACpD,QAAA,EAAA;AAAA,oBAAAH,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACG,IAAA,EAAK,QAAA;AAAA,QACL,YAAA,EAAY,EAAE,YAAY,CAAA;AAAA,QAC1B,KAAA,EAAO,EAAE,YAAY,CAAA;AAAA,QACrB,eAAA,EAAc,QAAA;AAAA,QACd,eAAA,EAAe,IAAA;AAAA,QACf,UAAU,QAAA,KAAa,IAAA;AAAA,QACvB,OAAA,EAAS,MAAM,OAAA,CAAQ,CAAA,KAAA,KAAS,CAAC,KAAK,CAAA;AAAA,QACtC,SAAA,EAAW,EAAA;AAAA,UACP,gNAAA;AAAA,UACA,IAAA,IAAQ;AAAA,SACZ;AAAA,QAEA,QAAA,kBAAAA,GAAAA,CAACkB,KAAAA,EAAA,EAAK;AAAA;AAAA,KACV;AAAA,IACC,IAAA,mBACGf,IAAAA,CAAC,KAAA,EAAA,EAAI,IAAA,EAAK,QAAA,EAAS,YAAA,EAAY,CAAA,CAAE,YAAY,CAAA,EAAG,SAAA,EAAU,mJAAA,EACtD,QAAA,EAAA;AAAA,sBAAAH,IAAC,IAAA,EAAA,EAAG,SAAA,EAAU,4CAAA,EAA8C,QAAA,EAAA,CAAA,CAAE,YAAY,CAAA,EAAE,CAAA;AAAA,sBAC5EG,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAA,EAAU,QAAA,EACT,QAAA,EAAA;AAAA,QAAA,CAAA,KAAA,CAAM,MAAA,KAAW,MAAA,IAAU,KAAA,CAAM,MAAA,KAAW,SAAA,qBAAcH,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,yCAAA,EAA2C,QAAA,EAAA,CAAA,CAAE,oBAAe,CAAA,EAAE,CAAA;AAAA,QACtI,MAAM,MAAA,KAAW,aAAA,oBACdG,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,6BAAA,EACX,QAAA,EAAA;AAAA,0BAAAH,GAAAA,CAAC,OAAE,IAAA,EAAK,OAAA,EAAQ,WAAU,uBAAA,EAAyB,QAAA,EAAA,CAAA,CAAE,2BAA2B,CAAA,EAAE,CAAA;AAAA,0BAClFA,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,OAAA,EAAS,MAAM,KAAK,IAAA,EAAK,EAAG,SAAA,EAAU,uCAAA,EAAyC,QAAA,EAAA,CAAA,CAAE,WAAW,CAAA,EAAE;AAAA,SAAA,EACxH,CAAA;AAAA,QAEH,MAAM,MAAA,KAAW,wBAAA,oBACdG,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,6BAAA,EACX,QAAA,EAAA;AAAA,0BAAAH,GAAAA,CAAC,OAAE,IAAA,EAAK,OAAA,EAAQ,WAAU,uBAAA,EAAyB,QAAA,EAAA,CAAA,CAAE,2BAA2B,CAAA,EAAE,CAAA;AAAA,UACjF,SAAA,KAAc,IAAA,mBACTA,GAAAA,CAAC,GAAA,EAAA,EAAE,IAAA,EAAM,SAAA,EAAW,SAAA,EAAU,uCAAA,EAAyC,QAAA,EAAA,CAAA,CAAE,sBAAsB,CAAA,EAAE,CAAA,mBACjGA,GAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,OAAA,EAAS,MAAM,KAAK,IAAA,EAAK,EAAG,SAAA,EAAU,uCAAA,EAAyC,QAAA,EAAA,CAAA,CAAE,WAAW,CAAA,EAAE;AAAA,SAAA,EAC9H,CAAA;AAAA,QAEH,KAAA,CAAM,MAAA,KAAW,OAAA,KAAY,KAAA,CAAM,IAAA,CAAK,MAAA,KAAW,CAAA,mBAC9CA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,yCAAA,EAA2C,QAAA,EAAA,CAAA,CAAE,mBAAmB,CAAA,EAAE,CAAA,mBAE7EA,GAAAA,CAAC,KAAA,EAAA,EAAI,YAAA,EAAY,CAAA,CAAE,YAAY,CAAA,EAAG,SAAA,EAAU,wBAAA,EACvC,QAAA,EAAA,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO;AACnB,UAAA,MAAM,OAAA,GAAU,IAAI,GAAA,KAAQ,aAAA;AAC5B,UAAA,uBACIG,IAAAA;AAAA,YAAC,GAAA;AAAA,YAAA;AAAA,cAEG,MAAM,GAAA,CAAI,UAAA;AAAA,cACV,cAAA,EAAc,UAAU,MAAA,GAAS,MAAA;AAAA,cACjC,KAAA,EAAO,GAAA,CAAI,WAAA,IAAe,GAAA,CAAI,IAAA;AAAA,cAC9B,OAAA,EAAS,MAAM,OAAA,CAAQ,KAAK,CAAA;AAAA,cAC5B,SAAA,EAAW,EAAA,CAAG,qLAAA,EAAuL,OAAA,IAAW,gBAAgB,CAAA;AAAA,cAEhO,QAAA,EAAA;AAAA,gCAAAH,GAAAA,CAAC,WAAA,EAAA,EAAY,IAAA,EAAM,GAAA,CAAI,IAAA,EAAM,SAAS,GAAA,CAAI,QAAA,EAAU,WAAA,EAAa,GAAA,CAAI,aAAA,EAAe,CAAA;AAAA,gCACpFA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wBAAA,EAA0B,cAAI,IAAA,CAAK,OAAA,CAAQ,eAAA,EAAiB,EAAE,CAAA,EAAE,CAAA;AAAA,gBAC/E,OAAA,oBAAWA,GAAAA,CAACmB,MAAAA,EAAA,EAAM;AAAA;AAAA,aAAA;AAAA,YATd,GAAA,CAAI;AAAA,WAUb;AAAA,QAER,CAAC,CAAA,EACL,CAAA;AAAA,OAAA,EAEZ;AAAA,KAAA,EACJ,CAAA,GACA;AAAA,GAAA,EACR,CAAA;AAER;AAEA,SAASD,KAAAA,GAAkB;AACvB,EAAA,uBACIlB,GAAAA,CAAC,KAAA,EAAA,EAAI,OAAM,IAAA,EAAK,MAAA,EAAO,MAAK,OAAA,EAAQ,WAAA,EAAY,MAAK,cAAA,EAAe,aAAA,EAAW,MAC1E,QAAA,EAAA,CAAC,CAAA,EAAG,GAAG,EAAE,CAAA,CAAE,QAAQ,CAAA,CAAA,KAAK,CAAC,GAAG,CAAA,EAAG,EAAE,EAAE,GAAA,CAAI,CAAA,CAAA,qBAAKA,GAAAA,CAAC,QAAA,EAAA,EAAyB,IAAI,CAAA,EAAG,EAAA,EAAI,GAAG,CAAA,EAAE,MAAA,EAAA,EAA7B,GAAG,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAA2B,CAAE,CAAC,CAAA,EACrG,CAAA;AAER;AAEA,SAASmB,MAAAA,GAAmB;AACxB,EAAA,uBACInB,IAAC,KAAA,EAAA,EAAI,aAAA,EAAW,MAAC,OAAA,EAAQ,WAAA,EAAY,MAAK,MAAA,EAAO,MAAA,EAAO,gBAAe,WAAA,EAAY,KAAA,EAAM,WAAU,8CAAA,EAC/F,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,CAAA,EAAE,kBAAiB,CAAA,EAC7B,CAAA;AAER;AClGO,SAAS,SAAS,KAAA,EAAsB;AAC3C,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,mBAAA,EAAoB;AAClC,EAAA,MAAM;AAAA,IACF,KAAA;AAAA,IACA,WAAA,GAAc,EAAE,cAAS,CAAA;AAAA,IACzB,iBAAA,GAAoB,EAAE,cAAS,CAAA;AAAA,IAC/B,SAAA,GAAY,EAAE,kBAAkB,CAAA;AAAA,IAChC,UAAA;AAAA,IACA,QAAA,GAAW,KAAA;AAAA,IACX,QAAA,GAAW,KAAA;AAAA,IACX,SAAA;AAAA,IACA,gBAAA;AAAA,IACA,cAAA;AAAA,IACA,YAAA,GAAe,MAAA;AAAA,IACf,aAAA;AAAA,IACA,EAAA,EAAI,MAAA;AAAA,IACJ,SAAA;AAAA,IACA;AAAA,GACJ,GAAI,KAAA;AAEJ,EAAA,MAAM,MAAA,GAASM,QAAQ,MAAM,eAAA,CAAgB,KAAK,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAC5D,EAAA,MAAM,WAAA,GAAcA,OAAAA;AAAA,IAChB,MAAM,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,KAAM,EAAE,OAAO,CAAA;AAAA,IACrC,CAAC,MAAM;AAAA,GACX;AACA,EAAA,MAAM,YAAA,GAAeA,OAAAA;AAAA,IACjB,MAAO,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,GAC7B,WAAA,CAAY,IAAA,CAAK,CAAC,GAAA,KAAQ,GAAA,CAAI,KAAA,KAAU,KAAK,CAAA,GAC7C,IAAA;AAAA,IACN,CAAC,aAAa,KAAK;AAAA,GACvB;AAEA,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIF,SAAS,KAAK,CAAA;AACtC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAS,EAAE,CAAA;AACrC,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,SAAS,EAAE,CAAA;AAEvD,EAAA,MAAM,YAAA,GAAeI,OAA8B,IAAI,CAAA;AACvD,EAAA,MAAM,QAAA,GAAWA,OAAgC,IAAI,CAAA;AACrD,EAAA,MAAM,OAAA,GAAUA,OAAgC,IAAI,CAAA;AACpD,EAAA,MAAM,UAAUY,KAAAA,EAAM;AACtB,EAAA,MAAM,KAAK,MAAA,IAAU,OAAA;AACrB,EAAA,MAAM,MAAA,GAAS,GAAG,EAAE,CAAA,QAAA,CAAA;AAGpB,EAAA,MAAM,cAAA,GAAiBd,OAAAA;AAAA,IACnB,MAAM,YAAA,CAAa,MAAA,EAAQ,KAAK,CAAA;AAAA,IAChC,CAAC,QAAQ,KAAK;AAAA,GAClB;AACA,EAAA,MAAM,YAAA,GAAeA,OAAAA;AAAA,IACjB,MAAM,cAAA,CAAe,OAAA,CAAQ,CAAC,CAAA,KAAM,EAAE,OAAO,CAAA;AAAA,IAC7C,CAAC,cAAc;AAAA,GACnB;AAGA,EAAAD,UAAU,MAAM;AACZ,IAAA,IAAI,CAAE,IAAA,EAAM;AACZ,IAAA,MAAM,eAAe,YAAA,CAAa,SAAA;AAAA,MAC9B,CAAC,GAAA,KAAQ,GAAA,CAAI,QAAA,KAAa;AAAA,KAC9B;AACA,IAAA,iBAAA,CAAkB,YAAY,CAAA;AAAA,EAClC,CAAA,EAAG,CAAC,YAAA,EAAc,IAAI,CAAC,CAAA;AAGvB,EAAAA,UAAU,MAAM;AACZ,IAAA,IAAI,IAAA,EAAM;AAEN,MAAA,MAAMgB,GAAAA,GAAK,OAAO,UAAA,CAAW,MAAM,SAAS,OAAA,EAAS,KAAA,IAAS,CAAC,CAAA;AAC/D,MAAA,OAAO,MAAM,MAAA,CAAO,YAAA,CAAaA,GAAE,CAAA;AAAA,IACvC;AACA,IAAA,QAAA,CAAS,EAAE,CAAA;AAEX,IAAA,OAAO,MAAA;AAAA,EACX,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAGT,EAAAhB,UAAU,MAAM;AACZ,IAAA,IAAI,CAAE,IAAA,EAAM;AAEZ,IAAA,SAAS,cAAc,KAAA,EAA2B;AAC9C,MAAA,IACI,YAAA,CAAa,YAAY,IAAA,IACzB,CAAE,aAAa,OAAA,CAAQ,QAAA,CAAS,KAAA,CAAM,MAAc,CAAA,EACtD;AACE,QAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,MACjB;AAAA,IACJ;AAEA,IAAA,MAAA,CAAO,gBAAA,CAAiB,eAAe,aAAa,CAAA;AACpD,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,aAAA,EAAe,aAAa,CAAA;AAAA,EACxE,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,MAAM,cAAA,GAAiBK,WAAAA;AAAA,IACnB,CAAC,GAAA,KAAwB;AACrB,MAAA,IAAI,GAAA,CAAI,aAAa,IAAA,EAAM;AAE3B,MAAA,IACI,IAAI,IAAA,KAAS,MAAA,IACb,kBAAkB,MAAA,IAClB,KAAA,CAAM,aAAa,MAAA,EACrB;AAEE,QAAA,OAAA,CAAQ,KAAK,CAAA;AACb,QAAA;AAAA,MACJ;AAEA,MAAA,IAAI,KAAA,CAAM,aAAa,MAAA,EAAW;AAC9B,QAAA,KAAA,CAAM,QAAA,CAAS,IAAI,KAAK,CAAA;AAAA,MAC5B;AACA,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,IACjB,CAAA;AAAA,IACA,CAAC,eAAe,KAAK;AAAA,GACzB;AAEA,EAAA,MAAM,SAAA,GAAYA,WAAAA;AAAA,IACd,CAAC,KAAA,KAA2C;AACxC,MAAA,IAAI,KAAA,CAAM,QAAQ,WAAA,EAAa;AAC3B,QAAA,KAAA,CAAM,cAAA,EAAe;AACrB,QAAA,iBAAA;AAAA,UAAkB,CAAC,OAAA,KACf,gBAAA,CAAiB,YAAA,EAAc,SAAS,CAAC;AAAA,SAC7C;AACA,QAAA;AAAA,MACJ;AACA,MAAA,IAAI,KAAA,CAAM,QAAQ,SAAA,EAAW;AACzB,QAAA,KAAA,CAAM,cAAA,EAAe;AACrB,QAAA,iBAAA;AAAA,UAAkB,CAAC,OAAA,KACf,gBAAA,CAAiB,YAAA,EAAc,SAAS,EAAE;AAAA,SAC9C;AACA,QAAA;AAAA,MACJ;AACA,MAAA,IAAI,KAAA,CAAM,QAAQ,MAAA,EAAQ;AACtB,QAAA,KAAA,CAAM,cAAA,EAAe;AACrB,QAAA,iBAAA;AAAA,UACI,aAAa,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,aAAa,IAAI;AAAA,SACrD;AACA,QAAA;AAAA,MACJ;AACA,MAAA,IAAI,KAAA,CAAM,QAAQ,KAAA,EAAO;AACrB,QAAA,KAAA,CAAM,cAAA,EAAe;AACrB,QAAA,IAAI,IAAA,GAAO,EAAA;AACX,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,YAAA,CAAa,QAAQ,CAAA,EAAA,EAAK;AAC1C,UAAA,MAAM,GAAA,GAAM,aAAa,CAAC,CAAA;AAC1B,UAAA,IAAI,GAAA,KAAQ,MAAA,IAAa,GAAA,CAAI,QAAA,KAAa,IAAA,EAAM;AAC5C,YAAA,IAAA,GAAO,CAAA;AAAA,UACX;AAAA,QACJ;AACA,QAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,QAAA;AAAA,MACJ;AACA,MAAA,IAAI,KAAA,CAAM,QAAQ,OAAA,EAAS;AACvB,QAAA,IAAI,kBAAkB,CAAA,EAAG;AACrB,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,MAAM,GAAA,GAAM,aAAa,cAAc,CAAA;AACvC,UAAA,IAAI,QAAQ,MAAA,EAAW;AACnB,YAAA,cAAA,CAAe,GAAG,CAAA;AAAA,UACtB;AAAA,QACJ;AACA,QAAA;AAAA,MACJ;AACA,MAAA,IAAI,KAAA,CAAM,QAAQ,QAAA,EAAU;AACxB,QAAA,KAAA,CAAM,cAAA,EAAe;AACrB,QAAA,OAAA,CAAQ,KAAK,CAAA;AACb,QAAA;AAAA,MACJ;AACA,MAAA,IAAI,KAAA,CAAM,QAAQ,KAAA,EAAO;AACrB,QAAA,OAAA,CAAQ,KAAK,CAAA;AACb,QAAA;AAAA,MACJ;AAAA,IACJ,CAAA;AAAA,IACA,CAAC,YAAA,EAAc,cAAA,EAAgB,cAAc;AAAA,GACjD;AAEA,EAAA,uBACIP,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,GAAA,EAAK,YAAA;AAAA,MACL,WAAW,EAAA,CAAG,UAAA,EAAY,YAAA,KAAiB,MAAA,IAAU,UAAU,SAAS,CAAA;AAAA,MAExE,QAAA,EAAA;AAAA,wBAAAA,IAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACG,EAAA;AAAA,YACA,IAAA,EAAK,QAAA;AAAA,YACL,IAAA,EAAK,UAAA;AAAA,YACL,QAAA;AAAA,YACA,eAAA,EAAe,IAAA;AAAA,YACf,eAAA,EAAc,SAAA;AAAA,YACd,eAAA,EAAe,MAAA;AAAA,YACf,eAAA,EAAe,QAAA;AAAA,YACf,YAAA,EAAY,SAAA;AAAA,YACZ,SAAS,MAAM,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAE,CAAC,CAAA;AAAA,YACjC,SAAA,EAAW,EAAA;AAAA,cACP,iIAAA;AAAA,cACA,iBAAiB,MAAA,IAAU,QAAA;AAAA,cAC3B,oGAAA;AAAA,cACA,IAAA,IAAQ,0CAAA;AAAA,cACR,QAAA,IAAY,+BAAA;AAAA,cACZ;AAAA,aACJ;AAAA,YAEC,QAAA,EAAA;AAAA,cAAA,YAAA,EAAc,MAAA,KAAW,yBACtBH,GAAAA;AAAA,gBAAC,kBAAA;AAAA,gBAAA;AAAA,kBACG,QAAQ,YAAA,CAAa,MAAA;AAAA,kBACrB,eAAe,YAAA,CAAa;AAAA;AAAA,eAChC,GACA,YAAA,EAAc,IAAA,KAAS,MAAA,mBACvBA,GAAAA;AAAA,gBAAC,YAAA,CAAa,IAAA;AAAA,gBAAb;AAAA,kBACG,SAAA,EAAU,4CAAA;AAAA,kBACV,WAAA,EAAa;AAAA;AAAA,eACjB,GACA,IAAA;AAAA,8BACJA,GAAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACG,SAAA,EAAW,EAAA;AAAA,oBACP,iBAAA;AAAA,oBACA,YAAA,KAAiB,IAAA,IAAQ,YAAA,KAAiB,MAAA,GACpC,uBAAA,GACA;AAAA,mBACV;AAAA,kBAEC,QAAA,EAAA,YAAA,KAAiB,IAAA,IAAQ,YAAA,KAAiB,MAAA,GACrC,aAAa,KAAA,GACb;AAAA;AAAA,eACV;AAAA,8BACAA,GAAAA,CAACa,QAAAA,EAAA,EAAQ,IAAA,EAAY;AAAA;AAAA;AAAA,SACzB;AAAA,QAEC,uBACGV,IAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACG,SAAA,EAAW,EAAA;AAAA,cACP,iHAAA;AAAA,cACA;AAAA,aACJ;AAAA,YAEA,QAAA,EAAA;AAAA,8BAAAH,GAAAA,CAAC,SAAI,SAAA,EAAU,qCAAA,EACX,0BAAAG,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,UAAA,EACX,QAAA,EAAA;AAAA,gCAAAH,GAAAA,CAACW,aAAA,EAAW,CAAA;AAAA,gCACZX,GAAAA;AAAA,kBAAC,OAAA;AAAA,kBAAA;AAAA,oBACG,GAAA,EAAK,QAAA;AAAA,oBACL,IAAA,EAAK,MAAA;AAAA,oBACL,KAAA,EAAO,KAAA;AAAA,oBACP,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,oBACxC,SAAA;AAAA,oBACA,WAAA,EAAa,iBAAA;AAAA,oBACb,SAAA,EAAU,uHAAA;AAAA,oBACV,eAAA,EAAe,MAAA;AAAA,oBACf,mBAAA,EAAkB,MAAA;AAAA,oBAClB,yBACI,cAAA,IAAkB,CAAA,GACZ,GAAG,MAAM,CAAA,CAAA,EAAI,cAAc,CAAA,CAAA,GAC3B;AAAA;AAAA;AAEd,eAAA,EACJ,CAAA,EACJ,CAAA;AAAA,8BAEAA,GAAAA;AAAA,gBAAC,IAAA;AAAA,gBAAA;AAAA,kBACG,EAAA,EAAI,MAAA;AAAA,kBACJ,GAAA,EAAK,OAAA;AAAA,kBACL,IAAA,EAAK,SAAA;AAAA,kBACL,SAAA,EAAU,+BAAA;AAAA,kBAET,QAAA,EAAA,YAAA,CAAa,MAAA,KAAW,CAAA,mBACrBA,IAAC,IAAA,EAAA,EAAG,SAAA,EAAU,yDAAA,EACT,QAAA,EAAA,SAAA,EACL,IAEA,cAAA,CAAe,GAAA,CAAI,CAAC,KAAA,EAAO,+BACvBA,GAAAA;AAAA,oBAAC,iBAAA;AAAA,oBAAA;AAAA,sBAEG,KAAA;AAAA,sBACA,WAAA,EAAa,YAAA;AAAA,sBACb,MAAA;AAAA,sBACA,cAAA;AAAA,sBACA,aAAa,KAAA,IAAS,IAAA;AAAA,sBACtB,aAAA;AAAA,sBACA,QAAA,EAAU,cAAA;AAAA,sBACV,OAAA,EAAS,CAAC,GAAA,KAAQ,iBAAA,CAAkB,GAAG;AAAA,qBAAA;AAAA,oBARlC,KAAA,CAAM,KAAA,IAAS,CAAA,MAAA,EAAS,UAAU,CAAA;AAAA,mBAU9C;AAAA;AAAA,eAET;AAAA,cAEC,UAAA,KAAe,yBACZA,GAAAA;AAAA,gBAAC,UAAA;AAAA,gBAAA;AAAA,kBACG,OAAO,UAAA,CAAW,KAAA;AAAA,kBAClB,MAAM,UAAA,CAAW,IAAA;AAAA,kBACjB,aAAA;AAAA,kBACA,YAAA,EAAc,MAAM,OAAA,CAAQ,KAAK;AAAA;AAAA,eACrC,GACA;AAAA;AAAA;AAAA,SACR,GACA;AAAA;AAAA;AAAA,GACR;AAER;AAEA,SAAS,iBAAA,CAAkB;AAAA,EACvB,KAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA,cAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA;AACJ,CAAA,EASG;AACC,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAEvC,EAAA,uBACIG,IAAAA,CAAAI,QAAAA,EAAA,EACK,QAAA,EAAA;AAAA,IAAA,KAAA,CAAM,KAAA,KAAU,qBACbP,GAAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACG,IAAA,EAAK,cAAA;AAAA,QACL,SAAA,EAAU,yGAAA;AAAA,QAET,QAAA,EAAA,KAAA,CAAM;AAAA;AAAA,KACX,GACA,IAAA;AAAA,IACH,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,KAAQ;AACxB,MAAA,MAAM,SAAA,GAAY,WAAA,CAAY,OAAA,CAAQ,GAAG,CAAA;AACzC,MAAA,MAAM,gBAAgB,SAAA,KAAc,cAAA;AACpC,MAAA,MAAM,QAAA,GAAW,IAAI,KAAA,KAAU,WAAA;AAC/B,MAAA,MAAM,KAAA,mBACFG,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,sDAAA,EACV,QAAA,EAAA;AAAA,QAAA,GAAA,CAAI,MAAA,KAAW,yBACZH,GAAAA;AAAA,UAAC,kBAAA;AAAA,UAAA;AAAA,YACG,QAAQ,GAAA,CAAI,MAAA;AAAA,YACZ,eAAe,GAAA,CAAI;AAAA;AAAA,SACvB,GACA,GAAA,CAAI,IAAA,KAAS,MAAA,mBACbA,GAAAA;AAAA,UAAC,GAAA,CAAI,IAAA;AAAA,UAAJ;AAAA,YACG,SAAA,EAAU,4CAAA;AAAA,YACV,WAAA,EAAa;AAAA;AAAA,SACjB,GACA,IAAA;AAAA,wBACJG,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4CAAA,EACX,QAAA,EAAA;AAAA,0BAAAH,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kDAAA,EACX,cAAI,KAAA,EACT,CAAA;AAAA,UACC,GAAA,CAAI,SAAA,KAAc,MAAA,mBACfA,GAAAA,CAAC,UAAK,SAAA,EAAU,sDAAA,EACX,QAAA,EAAA,GAAA,CAAI,SAAA,EACT,CAAA,GACA;AAAA,SAAA,EACR,CAAA;AAAA,QACC,QAAA,mBAAWA,GAAAA,CAACmB,MAAAA,EAAA,EAAM,CAAA,GAAK;AAAA,OAAA,EAC5B,CAAA;AAGJ,MAAA,MAAM,SAAA,GAAY,EAAA;AAAA,QACd,2DAAA;AAAA,QACA,GAAA,CAAI,aAAa,IAAA,IAAQ,+BAAA;AAAA,QACzB,aAAA,IAAiB,GAAA,CAAI,QAAA,KAAa,IAAA,IAAQ,cAAA;AAAA,QAC1C,QAAA,IAAY;AAAA,OAChB;AAEA,MAAA,IACI,GAAA,CAAI,IAAA,KAAS,MAAA,IACb,aAAA,KAAkB,MAAA,EACpB;AACE,QAAA,uBACInB,GAAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YAEG,EAAA,EAAI,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA;AAAA,YAC1B,IAAA,EAAK,QAAA;AAAA,YACL,eAAA,EAAe,QAAA;AAAA,YACf,eAAA,EAAe,IAAI,QAAA,KAAa,IAAA;AAAA,YAChC,YAAA,EAAc,MAAM,OAAA,CAAQ,SAAS,CAAA;AAAA,YAErC,QAAA,kBAAAA,GAAAA;AAAA,cAAC,aAAA;AAAA,cAAA;AAAA,gBACG,MAAM,GAAA,CAAI,IAAA;AAAA,gBACV,QAAA,EAAQ,IAAA;AAAA,gBACR,SAAA;AAAA,gBAEC,QAAA,EAAA;AAAA;AAAA;AACL,WAAA;AAAA,UAbK,GAAA,CAAI;AAAA,SAcb;AAAA,MAER;AAEA,MAAA,uBACIA,GAAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UAEG,EAAA,EAAI,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA;AAAA,UAC1B,IAAA,EAAK,QAAA;AAAA,UACL,eAAA,EAAe,QAAA;AAAA,UACf,eAAA,EAAe,IAAI,QAAA,KAAa,IAAA;AAAA,UAChC,YAAA,EAAc,MAAM,OAAA,CAAQ,SAAS,CAAA;AAAA,UAErC,QAAA,kBAAAA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACG,IAAA,EAAK,QAAA;AAAA,cACL,QAAA,EAAU,IAAI,QAAA,KAAa,IAAA;AAAA,cAC3B,OAAA,EAAS,MAAM,QAAA,CAAS,GAAG,CAAA;AAAA,cAC3B,SAAA;AAAA,cAEC,QAAA,EAAA;AAAA;AAAA;AACL,SAAA;AAAA,QAdK,GAAA,CAAI;AAAA,OAeb;AAAA,IAER,CAAC;AAAA,GAAA,EACL,CAAA;AAER;AAEA,SAAS,UAAA,CAAW;AAAA,EAChB,KAAA;AAAA,EACA,IAAA;AAAA,EACA,aAAA;AAAA,EACA;AACJ,CAAA,EAKG;AACC,EAAA,MAAM,SAAA,GACF,sIAAA;AAEJ,EAAA,IAAI,kBAAkB,MAAA,EAAW;AAC7B,IAAA,uBACIG,IAAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QACG,IAAA;AAAA,QACA,QAAA,EAAQ,IAAA;AAAA,QACR,SAAA;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAAH,GAAAA,CAACsB,OAAA,EAAK,CAAA;AAAA,0BACNtB,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,KAAA,EAAM;AAAA;AAAA;AAAA,KACjB;AAAA,EAER;AAEA,EAAA,uBACIG,IAAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACG,IAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA,EAAS,YAAA;AAAA,MAET,QAAA,EAAA;AAAA,wBAAAH,GAAAA,CAACsB,OAAA,EAAK,CAAA;AAAA,wBACNtB,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,KAAA,EAAM;AAAA;AAAA;AAAA,GACjB;AAER;AAEA,SAAS,kBAAA,CAAmB;AAAA,EACxB,MAAA;AAAA,EACA;AACJ,CAAA,EAGG;AACC,EAAA,MAAMY,SAAAA,GAAW,MAAA,CAAO,QAAA,IAAYE,eAAAA,CAAe,aAAa,CAAA;AAChE,EAAA,MAAM,KAAA,GACF,MAAA,CAAO,GAAA,KAAQ,MAAA,IAAa,MAAA,CAAO,MAAA,KAAW,MAAA,GACxC,EAAE,eAAA,EAAiB,MAAA,CAAO,MAAA,EAAQ,KAAA,EAAO,QAAO,GAChD,MAAA;AAEV,EAAA,IAAI,MAAA,CAAO,QAAQ,MAAA,EAAW;AAC1B,IAAA,uBACId,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACG,KAAK,MAAA,CAAO,GAAA;AAAA,QACZ,GAAA,EAAI,EAAA;AAAA,QACJ,SAAA,EAAU,uDAAA;AAAA,QACV,OAAA,EAAQ;AAAA;AAAA,KACZ;AAAA,EAER;AAEA,EAAA,uBACIA,GAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACG,KAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACP,sGAAA;AAAA,QACA,MAAA,CAAO,WAAW,MAAA,IAAa;AAAA,OACnC;AAAA,MAEC,QAAA,EAAAY;AAAA;AAAA,GACL;AAER;AAEA,SAASE,gBAAe,KAAA,EAAuB;AAC3C,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,EAAK,CAAE,MAAM,KAAK,CAAA;AACtC,EAAA,IAAI,KAAA,CAAM,UAAU,CAAA,EAAG;AACnB,IAAA,OAAA,CAAA,CAAS,KAAA,CAAM,CAAC,CAAA,GAAI,CAAC,CAAA,IAAK,EAAA,KAAO,KAAA,CAAM,CAAC,CAAA,GAAI,CAAC,CAAA,IAAK,EAAA,CAAA,EAAK,WAAA,EAAY;AAAA,EACvE;AACA,EAAA,OAAA,CAAQ,MAAM,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,IAAK,KAAK,WAAA,EAAY;AAClD;AAEA,SAAS,gBACL,KAAA,EACe;AACf,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAChC,EAAA,MAAM,KAAA,GAAQ,MAAM,CAAC,CAAA;AACrB,EAAA,IAAI,KAAA,KAAU,MAAA,IAAa,SAAA,IAAa,KAAA,EAAO;AAC3C,IAAA,OAAO,KAAA;AAAA,EACX;AACA,EAAA,OAAO,CAAC,EAAE,KAAA,EAAO,EAAA,EAAI,OAAA,EAAS,OAA2B,CAAA;AAC7D;AAEA,SAAS,YAAA,CACL,QACA,KAAA,EACe;AACf,EAAA,MAAM,CAAA,GAAI,KAAA,CAAM,IAAA,EAAK,CAAE,WAAA,EAAY;AACnC,EAAA,IAAI,CAAA,KAAM,IAAI,OAAO,MAAA;AAErB,EAAA,OAAO,MAAA,CACF,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,IACb,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,OAAA,EAAS,MAAM,OAAA,CAAQ,MAAA,CAAO,CAAC,GAAA,KAAQ,YAAA,CAAa,GAAA,EAAK,CAAC,CAAC;AAAA,GAC/D,CAAE,EACD,MAAA,CAAO,CAAC,UAAU,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAC,CAAA;AACnD;AAEA,SAAS,YAAA,CAAa,QAAwB,CAAA,EAAoB;AAC9D,EAAA,MAAM,QAAA,GAAW;AAAA,IACb,MAAA,CAAO,KAAA;AAAA,IACP,OAAO,SAAA,IAAa,EAAA;AAAA,IACpB,GAAI,MAAA,CAAO,QAAA,IAAY;AAAC,GAC5B,CACK,IAAA,CAAK,GAAG,CAAA,CACR,WAAA,EAAY;AAEjB,EAAA,OAAO,QAAA,CAAS,SAAS,CAAC,CAAA;AAC9B;AAEA,SAAS,gBAAA,CACL,OAAA,EACA,OAAA,EACA,SAAA,EACM;AACN,EAAA,MAAM,QAAQ,OAAA,CAAQ,MAAA;AACtB,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,EAAA;AAExB,EAAA,IAAI,CAAA,GAAI,OAAA;AACR,EAAA,KAAA,IAAS,IAAA,GAAO,CAAA,EAAG,IAAA,GAAO,KAAA,EAAO,IAAA,EAAA,EAAQ;AACrC,IAAA,CAAA,GAAA,CAAK,CAAA,GAAI,YAAY,KAAA,IAAS,KAAA;AAC9B,IAAA,MAAM,GAAA,GAAM,QAAQ,CAAC,CAAA;AACrB,IAAA,IAAI,GAAA,KAAQ,MAAA,IAAa,GAAA,CAAI,QAAA,KAAa,IAAA,EAAM;AAC5C,MAAA,OAAO,CAAA;AAAA,IACX;AAAA,EACJ;AACA,EAAA,OAAO,EAAA;AACX;AAEA,SAASD,QAAAA,CAAQ,EAAE,IAAA,EAAK,EAAsB;AAC1C,EAAA,uBACIb,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,KAAA,EAAM,IAAA;AAAA,MACN,MAAA,EAAO,IAAA;AAAA,MACP,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,MAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAY,KAAA;AAAA,MACZ,aAAA,EAAc,OAAA;AAAA,MACd,cAAA,EAAe,OAAA;AAAA,MACf,aAAA,EAAW,IAAA;AAAA,MACX,SAAA,EAAW,EAAA;AAAA,QACP,kEAAA;AAAA,QACA,IAAA,IAAQ;AAAA,OACZ;AAAA,MAEA,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,0BAAA,EAA2B;AAAA;AAAA,GACvC;AAER;AAEA,SAASmB,MAAAA,GAAQ;AACb,EAAA,uBACInB,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,KAAA,EAAM,IAAA;AAAA,MACN,MAAA,EAAO,IAAA;AAAA,MACP,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,MAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAY,KAAA;AAAA,MACZ,aAAA,EAAc,OAAA;AAAA,MACd,cAAA,EAAe,OAAA;AAAA,MACf,SAAA,EAAU,sBAAA;AAAA,MACV,aAAA,EAAW,IAAA;AAAA,MAEX,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,uBAAA,EAAwB;AAAA;AAAA,GACpC;AAER;AAEA,SAASsB,KAAAA,GAAO;AACZ,EAAA,uBACItB,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,KAAA,EAAM,IAAA;AAAA,MACN,MAAA,EAAO,IAAA;AAAA,MACP,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,MAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAY,KAAA;AAAA,MACZ,aAAA,EAAc,OAAA;AAAA,MACd,cAAA,EAAe,OAAA;AAAA,MACf,SAAA,EAAU,UAAA;AAAA,MACV,aAAA,EAAW,IAAA;AAAA,MAEX,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,cAAA,EAAe;AAAA;AAAA,GAC3B;AAER;AAEA,SAASW,WAAAA,GAAa;AAClB,EAAA,uBACIR,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,KAAA,EAAM,IAAA;AAAA,MACN,MAAA,EAAO,IAAA;AAAA,MACP,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,MAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAY,KAAA;AAAA,MACZ,aAAA,EAAc,OAAA;AAAA,MACd,cAAA,EAAe,OAAA;AAAA,MACf,SAAA,EAAU,sFAAA;AAAA,MACV,aAAA,EAAW,IAAA;AAAA,MAEX,QAAA,EAAA;AAAA,wBAAAH,IAAC,QAAA,EAAA,EAAO,EAAA,EAAG,KAAI,EAAA,EAAG,GAAA,EAAI,GAAE,MAAA,EAAO,CAAA;AAAA,wBAC/BA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,oBAAA,EAAqB;AAAA;AAAA;AAAA,GACjC;AAER;ACjwBO,SAAS,SAAA,CAAU;AAAA,EACtB,SAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACP,CAAA,EAA8B;AAC1B,EAAA,uBACIA,GAAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACG,SAAA,EAAW,EAAA;AAAA,QACP,4HAAA;AAAA,QACA;AAAA,OACJ;AAAA,MACC,GAAG,IAAA;AAAA,MAEH;AAAA;AAAA,GACL;AAER;AAaO,SAAS,aAAA,CAAc;AAAA,EAC1B,KAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA;AACJ,CAAA,EAAuB;AACnB,EAAA,uBACIG,IAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACG,SAAA,EAAW,EAAA;AAAA,QACP,qGAAA;AAAA,QACA;AAAA,OACJ;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACX,QAAA,EAAA;AAAA,0BAAAH,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,wDAAA,EACT,QAAA,EAAA,KAAA,EACL,CAAA;AAAA,UACC,8BACGA,GAAAA,CAAC,OAAE,SAAA,EAAU,+BAAA,EACR,uBACL,CAAA,GACA;AAAA,SAAA,EACR,CAAA;AAAA,QACC,0BACGA,GAAAA,CAAC,SAAI,SAAA,EAAU,kCAAA,EACV,mBACL,CAAA,GACA;AAAA;AAAA;AAAA,GACR;AAER;AAKO,SAAS,SAAA,CAAU;AAAA,EACtB,SAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACP,CAAA,EAA0B;AACtB,EAAA,uBACIA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,aAAa,SAAS,CAAA,EAAI,GAAG,IAAA,EAC3C,QAAA,EACL,CAAA;AAER;ACjFe,SAAR,OAAA,CAAyB;AAAA,EAC5B,KAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA,GAAU;AACd,CAAA,EAIG;AACC,EAAA,uBACIG,IAAAA,CAAC,QAAA,EAAA,EAAO,WAAW,OAAA,KAAY,OAAA,GAAU,KAAK,kBAAA,EAC1C,QAAA,EAAA;AAAA,oBAAAH,GAAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACG,SAAA,EACI,OAAA,KAAY,OAAA,GACN,8BAAA,GACA,sCAAA;AAAA,QAGT,QAAA,EAAA;AAAA;AAAA,KACL;AAAA,IACC,+BACGA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iCAAiC,QAAA,EAAA,WAAA,EAAY;AAAA,GAAA,EAElE,CAAA;AAER;ACVO,SAAS,QAAA,CAAS;AAAA,EACrB,KAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA,GAAO,IAAA;AAAA,EACP;AACJ,CAAA,EAAkB;AACd,EAAA,uBACIG,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,SAAA,EAAW,EAAA;AAAA,QACP,+FAAA;AAAA,QACA;AAAA,OACJ;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAH,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,oCAAA,EAAsC,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,wBAC1DA,GAAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YACG,SAAA,EAAW,EAAA;AAAA,cACP,mCAAA;AAAA,cACA,IAAA,IAAQ;AAAA,aACZ;AAAA,YAEC;AAAA;AAAA;AACL;AAAA;AAAA,GACJ;AAER;AAEO,SAAS,YAAA,CAAa;AAAA,EACzB,QAAA;AAAA,EACA;AACJ,CAAA,EAGG;AACC,EAAA,uBAAOA,IAAC,IAAA,EAAA,EAAG,SAAA,EAAW,GAAG,MAAA,EAAQ,SAAS,GAAI,QAAA,EAAS,CAAA;AAC3D;AC3BO,SAAS,UAAA,CAAW;AAAA,EACvB,KAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA;AACJ,CAAA,EAAU;AACN,EAAA,uBACIG,IAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACG,SAAA,EAAW,EAAA;AAAA,QACP,iEAAA;AAAA,QACA;AAAA,OACJ;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACV,QAAA,EAAA;AAAA,UAAA,OAAA,KAAY,yBACTH,GAAAA,CAAC,OAAE,SAAA,EAAU,uFAAA,EACR,mBACL,CAAA,GACA,IAAA;AAAA,0BACJA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uEACT,QAAA,EAAA,KAAA,EACL,CAAA;AAAA,UACC,8BACGA,GAAAA,CAAC,OAAE,SAAA,EAAU,+BAAA,EACR,uBACL,CAAA,GACA;AAAA,SAAA,EACR,CAAA;AAAA,QACC,0BACGA,GAAAA,CAAC,SAAI,SAAA,EAAU,4CAAA,EACV,mBACL,CAAA,GACA;AAAA;AAAA;AAAA,GACR;AAER;AC/BA,IAAM,UAAA,GAAwC;AAAA,EAC1C,WAAA,EAAa,uCAAA;AAAA,EACb,IAAA,EAAM,uCAAA;AAAA,EACN,IAAA,EAAM,wCAAA;AAAA,EACN,KAAA,EAAO;AACX,CAAA;AAqBO,SAAS,SAAA,CAAU;AAAA,EACtB,QAAA;AAAA,EACA,KAAA,GAAQ,aAAA;AAAA,EACR;AACJ,CAAA,EAAU;AACN,EAAA,uBACIA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,SAAA,EAAW,EAAA;AAAA,QACP,0BAAA;AAAA,QACA,WAAW,KAAK,CAAA;AAAA,QAChB;AAAA,OACJ;AAAA,MAEC;AAAA;AAAA,GACL;AAER;ACuBA,IAAMuB,eAKD,CAAC,EAAE,IAAA,EAAM,SAAA,EAAW,UAAU,cAAA,EAAgB,WAAA,EAAY,qBAC3DvB,IAAC,GAAA,EAAA,EAAE,IAAA,EAAY,SAAA,EAAsB,cAAA,EAAc,aAC9C,QAAA,EACL,CAAA;AAGG,SAAS,QAAA,CAAS;AAAA,EACrB,KAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA,GAAgBuB,YAAAA;AAAA,EAChB,OAAA;AAAA,EACA;AACJ,CAAA,EAAkB;AACd,EAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,KAAA,EAAO,WAAW,CAAA;AAEvD,EAAA,uBACIpB,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,gBAAA,EAAe,WAAA;AAAA,MACf,SAAA,EAAW,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAKP,yCAAA;AAAA,QACA;AAAA,OACJ;AAAA,MAOA,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qCAAA,EACX,QAAA,EAAA;AAAA,0BAAAH,GAAAA;AAAA,YAAC,YAAA;AAAA,YAAA;AAAA,cACG,KAAA;AAAA,cACA,UAAA;AAAA,cACA;AAAA;AAAA,WACJ;AAAA,0BACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6CACV,QAAA,EAAA,OAAA,EACL;AAAA,SAAA,EACJ,CAAA;AAAA,wBAGAG,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACX,QAAA,EAAA;AAAA,0BAAAH,GAAAA;AAAA,YAAC,cAAA;AAAA,YAAA;AAAA,cACG,KAAA;AAAA,cACA,UAAA;AAAA,cACA;AAAA;AAAA,WACJ;AAAA,UACC,OAAA,KAAY,yBACTA,GAAAA,CAAC,SAAI,SAAA,EAAU,mCAAA,EACV,mBACL,CAAA,GACA;AAAA,SAAA,EACR;AAAA;AAAA;AAAA,GACJ;AAER;AAQA,SAAS,YAAA,CAAa,EAAE,KAAA,EAAO,UAAA,EAAY,eAAc,EAAe;AACpE,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,mBAAA,EAAoB;AAClC,EAAA,uBACIA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MAMG,SAAA,EAAU,kFAAA;AAAA,MACV,IAAA,EAAK,SAAA;AAAA,MACL,YAAA,EAAY,EAAE,oBAAoB,CAAA;AAAA,MAEjC,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACjB,QAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,QAAA,MAAM,MAAA,GAAS,KAAK,IAAA,KAAS,UAAA;AAE7B,QAAA,uBACIG,IAAAA;AAAA,UAAC,aAAA;AAAA,UAAA;AAAA,YAEG,MAAM,IAAA,CAAK,IAAA;AAAA,YACX,QAAA,EAAQ,IAAA;AAAA,YACR,cAAA,EAAc,SAAS,MAAA,GAAS,MAAA;AAAA,YAChC,SAAA,EAAW,EAAA;AAAA,cACP,yGAAA;AAAA,cACA,SACM,mFAAA,GACA;AAAA,aACV;AAAA,YAEC,QAAA,EAAA;AAAA,cAAA,IAAA,KAAS,yBACNH,GAAAA;AAAA,gBAAC,IAAA;AAAA,gBAAA;AAAA,kBACG,SAAA,EAAW,EAAA;AAAA,oBACP,sBAAA;AAAA,oBACA,SACM,iBAAA,GACA;AAAA,mBACV;AAAA,kBACA,WAAA,EAAa;AAAA;AAAA,eACjB,GACA,IAAA;AAAA,8BACJA,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,IAAA,CAAK,KAAA,EAAM,CAAA;AAAA,8BAClBA,GAAAA,CAAC,YAAA,EAAA,EAAa,IAAA,EAAY,MAAA,EAAgB;AAAA;AAAA,WAAA;AAAA,UAvBrC,IAAA,CAAK;AAAA,SAwBd;AAAA,MAER,CAAC;AAAA;AAAA,GACL;AAER;AAEA,SAAS,cAAA,CAAe,EAAE,KAAA,EAAO,UAAA,EAAY,eAAc,EAAe;AACtE,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,mBAAA,EAAoB;AAClC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAII,SAAS,KAAK,CAAA;AACtC,EAAA,MAAM,GAAA,GAAMI,OAA8B,IAAI,CAAA;AAC9C,EAAA,MAAM,SAASY,KAAAA,EAAM;AAErB,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,IAAA,CAAK,CAAC,IAAA,KAAS,KAAK,IAAA,KAAS,UAAU,CAAA,IAAK,KAAA,CAAM,CAAC,CAAA;AAKxE,EAAAf,UAAU,MAAM;AACZ,IAAA,IAAI,CAAE,IAAA,EAAM;AAEZ,IAAA,SAAS,cAAc,KAAA,EAA2B;AAC9C,MAAA,IACI,GAAA,CAAI,YAAY,IAAA,IAChB,CAAE,IAAI,OAAA,CAAQ,QAAA,CAAS,KAAA,CAAM,MAAc,CAAA,EAC7C;AACE,QAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,MACjB;AAAA,IACJ;AAEA,IAAA,SAAS,MAAM,KAAA,EAA4B;AACvC,MAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,QAAA,EAAU,OAAA,CAAQ,KAAK,CAAA;AAAA,IAC7C;AAEA,IAAA,MAAA,CAAO,gBAAA,CAAiB,eAAe,aAAa,CAAA;AACpD,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,KAAK,CAAA;AAExC,IAAA,OAAO,MAAM;AACT,MAAA,MAAA,CAAO,mBAAA,CAAoB,eAAe,aAAa,CAAA;AACvD,MAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,KAAK,CAAA;AAAA,IAC/C,CAAA;AAAA,EACJ,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,IAAI,WAAW,MAAA,EAAW;AACtB,IAAA,OAAO,IAAA;AAAA,EACX;AAEA,EAAA,MAAM,aAAa,MAAA,CAAO,IAAA;AAE1B,EAAA,uBACIF,IAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAU,WAAU,UAAA,EACrB,QAAA,EAAA;AAAA,oBAAAA,IAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACG,IAAA,EAAK,QAAA;AAAA,QACL,SAAS,MAAM,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAE,CAAC,CAAA;AAAA,QACjC,eAAA,EAAe,IAAA;AAAA,QACf,eAAA,EAAc,SAAA;AAAA,QACd,eAAA,EAAe,MAAA;AAAA,QACf,SAAA,EAAW,EAAA;AAAA,UACP,qMAAA;AAAA,UACA,IAAA,IAAQ;AAAA,SACZ;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iCAAA,EACX,QAAA,EAAA;AAAA,YAAA,UAAA,KAAe,yBACZH,GAAAA;AAAA,cAAC,UAAA;AAAA,cAAA;AAAA,gBACG,SAAA,EAAU,4CAAA;AAAA,gBACV,WAAA,EAAa;AAAA;AAAA,aACjB,GACA,IAAA;AAAA,4BACJA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,UAAA,EAAY,iBAAO,KAAA,EAAM,CAAA;AAAA,4BACzCA,GAAAA,CAAC,YAAA,EAAA,EAAa,IAAA,EAAM,MAAA,EAAQ,QAAM,IAAA,EAAC;AAAA,WAAA,EACvC,CAAA;AAAA,0BACAA,GAAAA,CAACa,QAAAA,EAAA,EAAQ,IAAA,EAAY;AAAA;AAAA;AAAA,KACzB;AAAA,IAEC,uBACGb,GAAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACG,EAAA,EAAI,MAAA;AAAA,QACJ,IAAA,EAAK,SAAA;AAAA,QACL,YAAA,EAAY,EAAE,oBAAoB,CAAA;AAAA,QAClC,SAAA,EAAU,iHAAA;AAAA,QAET,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACjB,UAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,UAAA,MAAM,QAAA,GAAW,KAAK,IAAA,KAAS,UAAA;AAE/B,UAAA,uBACIA,GAAAA,CAAC,IAAA,EAAA,EACG,QAAA,kBAAAG,IAAAA;AAAA,YAAC,aAAA;AAAA,YAAA;AAAA,cACG,MAAM,IAAA,CAAK,IAAA;AAAA,cACX,QAAA,EAAQ,IAAA;AAAA,cACR,cAAA,EAAc,WAAW,MAAA,GAAS,MAAA;AAAA,cAClC,SAAA,EAAW,EAAA;AAAA,gBACP,0EAAA;AAAA,gBACA,WACM,8CAAA,GACA;AAAA,eACV;AAAA,cAEC,QAAA,EAAA;AAAA,gBAAA,IAAA,KAAS,yBACNH,GAAAA;AAAA,kBAAC,IAAA;AAAA,kBAAA;AAAA,oBACG,SAAA,EAAW,EAAA;AAAA,sBACP,sBAAA;AAAA,sBACA,WACM,iBAAA,GACA;AAAA,qBACV;AAAA,oBACA,WAAA,EAAa;AAAA;AAAA,iBACjB,GACA,IAAA;AAAA,gCACJA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAA,EACX,eAAK,KAAA,EACV,CAAA;AAAA,gCACAA,GAAAA;AAAA,kBAAC,YAAA;AAAA,kBAAA;AAAA,oBACG,IAAA;AAAA,oBACA,MAAA,EAAQ;AAAA;AAAA;AACZ;AAAA;AAAA,WACJ,EAAA,EA9BK,KAAK,IA+Bd,CAAA;AAAA,QAER,CAAC;AAAA;AAAA,KACL,GACA;AAAA,GAAA,EACR,CAAA;AAER;AAEA,SAAS,YAAA,CAAa;AAAA,EAClB,IAAA;AAAA,EACA;AACJ,CAAA,EAGc;AACV,EAAA,IAAI,IAAA,CAAK,UAAU,MAAA,EAAW;AAC1B,IAAA,uBAAOA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,eAAA,EAAiB,eAAK,KAAA,EAAM,CAAA;AAAA,EACvD;AAEA,EAAA,IAAI,IAAA,CAAK,UAAU,MAAA,EAAW;AAC1B,IAAA,uBACIA,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACG,SAAA,EAAW,EAAA;AAAA,UACP,4FAAA;AAAA,UACA,SACM,mDAAA,GACA;AAAA,SACV;AAAA,QAEC,QAAA,EAAA,IAAA,CAAK;AAAA;AAAA,KACV;AAAA,EAER;AAEA,EAAA,OAAO,IAAA;AACX;AAEA,SAASa,QAAAA,CAAQ,EAAE,IAAA,EAAK,EAAiC;AACrD,EAAA,uBACIb,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,KAAA,EAAM,IAAA;AAAA,MACN,MAAA,EAAO,IAAA;AAAA,MACP,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,MAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAY,KAAA;AAAA,MACZ,aAAA,EAAc,OAAA;AAAA,MACd,cAAA,EAAe,OAAA;AAAA,MACf,SAAA,EAAW,EAAA;AAAA,QACP,kEAAA;AAAA,QACA,IAAA,IAAQ;AAAA,OACZ;AAAA,MACA,aAAA,EAAW,IAAA;AAAA,MAEX,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,0BAAA,EAA2B;AAAA;AAAA,GACvC;AAER;AAUA,SAAS,SAAS,IAAA,EAAsB;AACpC,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AACnC,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AAClC,EAAA,IAAI,MAAM,IAAA,CAAK,MAAA;AACf,EAAA,IAAI,eAAe,EAAA,EAAI,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,KAAK,UAAU,CAAA;AACrD,EAAA,IAAI,cAAc,EAAA,EAAI,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,KAAK,SAAS,CAAA;AAEnD,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AAC5B;AAWA,SAAS,iBAAA,CACL,OACA,WAAA,EACa;AACb,EAAA,MAAM,OAAA,GAAU,SAAS,WAAW,CAAA;AAEpC,EAAA,MAAM,UAAA,GAAa,KAAA,CACd,GAAA,CAAI,CAAC,IAAA,KAAS;AACX,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AACnC,IAAA,MAAM,OAAA,GACF,IAAA,CAAK,WAAA,KAAgB,IAAA,GACf,OAAA,KAAY,QAAA,IACZ,OAAA,CAAQ,UAAA,CAAW,QAAA,GAAW,GAAG,CAAA,GACjC,OAAA,KAAY,QAAA;AAEtB,IAAA,OAAO,OAAA,GAAU,KAAK,IAAA,GAAO,IAAA;AAAA,EACjC,CAAC,CAAA,CACA,MAAA,CAAO,CAAC,IAAA,KAAyB,SAAS,IAAI,CAAA;AAEnD,EAAA,IAAI,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAEpC,EAAA,OAAO,UAAA,CAAW,MAAA;AAAA,IAAO,CAAC,OAAA,EAAS,IAAA,KAC/B,KAAK,MAAA,GAAS,OAAA,CAAQ,SAAS,IAAA,GAAO;AAAA,GAC1C;AACJ;ACxXA,IAAMuB,YAAAA,GAID,CAAC,EAAE,IAAA,EAAM,SAAA,EAAW,QAAA,EAAS,qBAC9BvB,GAAAA,CAAC,GAAA,EAAA,EAAE,IAAA,EAAY,SAAA,EACV,QAAA,EACL,CAAA;AAGG,SAAS,OAAA,CAAQ;AAAA,EACpB,IAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA,GAAgBuB,YAAAA;AAAA,EAChB,MAAA,GAAS,KAAA;AAAA,EACT;AACJ,CAAA,EAAiB;AACb,EAAA,uBACIvB,GAAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACG,IAAA;AAAA,MACA,QAAA,EAAQ,IAAA;AAAA,MAIR,SAAA,EAAW,EAAA;AAAA,QACP,6HAAA;AAAA,QACA,SACM,wCAAA,GACA,uBAAA;AAAA,QACN;AAAA,OACJ;AAAA,MAEA,QAAA,kBAAAG,IAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACG,gBAAA,EAAe,UAAA;AAAA,UACf,aAAA,EAAa,SAAS,MAAA,GAAS,MAAA;AAAA,UAM/B,cAAA,EAAgB,CAAC,KAAA,KAAU;AACvB,YAAA,MAAM,SAAS,KAAA,CAAM,MAAA;AACrB,YAAA,IACI,MAAA,CAAO,OAAA;AAAA,cACH;AAAA,kBACE,IAAA,IACN,MAAA,CAAO,OAAA,CAAQ,iBAAiB,MAAM,IAAA,EACxC;AACE,cAAA,KAAA,CAAM,eAAA,EAAgB;AAAA,YAC1B;AAAA,UACJ,CAAA;AAAA,UACA,SAAA,EAAU,gCAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAAH,GAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACG,eAAA,EAAa,IAAA;AAAA,gBACb,SAAA,EAAU,wCAAA;AAAA,gBAET;AAAA;AAAA,aACL;AAAA,YACC,QAAA,KAAa,yBACVA,GAAAA,CAAC,UAAK,SAAA,EAAU,kCAAA,EACX,oBACL,CAAA,GACA;AAAA;AAAA;AAAA;AACR;AAAA,GACJ;AAER;ACzHA,IAAMwB,WAAAA,GAAuD;AAAA,EACzD,IAAA,EAAM,EAAE,EAAA,EAAI,cAAA,EAAgB,IAAI,WAAA,EAAY;AAAA,EAC5C,OAAA,EAAS,EAAE,EAAA,EAAI,iBAAA,EAAmB,IAAI,cAAA,EAAe;AAAA,EACrD,OAAA,EAAS,EAAE,EAAA,EAAI,iBAAA,EAAmB,IAAI,cAAA,EAAe;AAAA,EACrD,WAAA,EAAa,EAAE,EAAA,EAAI,qBAAA,EAAuB,IAAI,kBAAA,EAAmB;AAAA,EACjE,OAAA,EAAS,EAAE,EAAA,EAAI,cAAA,EAAgB,IAAI,iBAAA;AACvC,CAAA;AAgBO,SAAS,QAAA,CAAS;AAAA,EACrB,KAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA,EAAM,IAAA;AAAA,EACN,IAAA,GAAO,MAAA;AAAA,EACP;AACJ,CAAA,EAAkB;AACd,EAAA,MAAM,MAAA,GAASA,YAAW,IAAI,CAAA;AAE9B,EAAA,uBACIrB,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,SAAA,EAAW,EAAA;AAAA,QACP,sJAAA;AAAA,QACA;AAAA,OACJ;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAH,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACG,SAAA,EAAW,EAAA;AAAA,cACP,gEAAA;AAAA,cACA,MAAA,CAAO;AAAA,aACX;AAAA,YAEA,QAAA,kBAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAW,EAAA,CAAG,WAAW,MAAA,CAAO,EAAE,CAAA,EAAG,WAAA,EAAa,GAAA,EAAK;AAAA;AAAA,SACjE;AAAA,wBACAG,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EACX,QAAA,EAAA;AAAA,0BAAAH,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4EAAA,EACR,QAAA,EAAA,KAAA,EACL,CAAA;AAAA,0BACAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,0CACR,QAAA,EAAA,KAAA,EACL,CAAA;AAAA,UACC,yBACGA,GAAAA,CAAC,OAAE,SAAA,EAAU,yDAAA,EACR,kBACL,CAAA,GACA;AAAA,SAAA,EACR;AAAA;AAAA;AAAA,GACJ;AAER;;;ACdO,SAAS,SAAA,CAAU,eAAuB,EAAA,EAAsB;AACnE,EAAA,OAAO;AAAA,IACH,KAAA,EAAO,CAAC,GAAA,KAAQ,GAAA,IAAO,YAAA;AAAA,IACvB,SAAA,EAAW,CAAC,KAAA,KAAU,KAAA;AAAA,IACtB,SAAA,EAAW,CAAC,KAAA,KAAU,KAAA,KAAU;AAAA,GACpC;AACJ;AAOO,SAAS,SAAA,CACZ,YAAA,EACA,OAAA,GAA0C,EAAC,EAC3B;AAChB,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAsB;AACjC,IAAA,IAAI,QAAQ,GAAA,KAAQ,MAAA,IAAa,IAAI,OAAA,CAAQ,GAAA,SAAY,OAAA,CAAQ,GAAA;AACjE,IAAA,IAAI,QAAQ,GAAA,KAAQ,MAAA,IAAa,IAAI,OAAA,CAAQ,GAAA,SAAY,OAAA,CAAQ,GAAA;AAEjE,IAAA,OAAO,CAAA;AAAA,EACX,CAAA;AAEA,EAAA,OAAO;AAAA,IACH,KAAA,EAAO,CAAC,GAAA,KAAQ;AACZ,MAAA,IAAI,GAAA,KAAQ,MAAM,OAAO,YAAA;AACzB,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,QAAA,CAAS,GAAA,EAAK,EAAE,CAAA;AACtC,MAAA,IAAI,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA,EAAG,OAAO,YAAA;AAEjC,MAAA,OAAO,MAAM,MAAM,CAAA;AAAA,IACvB,CAAA;AAAA,IACA,SAAA,EAAW,CAAC,KAAA,KAAU,MAAA,CAAO,KAAK,CAAA;AAAA,IAClC,SAAA,EAAW,CAAC,KAAA,KAAU,KAAA,KAAU;AAAA,GACpC;AACJ;AAQO,SAAS,OAAA,CACZ,QACA,YAAA,EACW;AACX,EAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAY,MAAM,CAAA;AAEtC,EAAA,OAAO;AAAA,IACH,KAAA,EAAO,CAAC,GAAA,KACJ,GAAA,KAAQ,QAAQ,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA,GAAK,GAAA,GAAY,YAAA;AAAA,IACpD,SAAA,EAAW,CAAC,KAAA,KAAU,KAAA;AAAA,IACtB,SAAA,EAAW,CAAC,KAAA,KAAU,KAAA,KAAU;AAAA,GACpC;AACJ;AAMO,SAAS,UAAA,CAAW,eAAwB,KAAA,EAA0B;AACzE,EAAA,OAAO;AAAA,IACH,OAAO,CAAC,GAAA,KAAS,GAAA,KAAQ,IAAA,GAAO,eAAe,GAAA,KAAQ,MAAA;AAAA,IACvD,SAAA,EAAW,CAAC,KAAA,KAAW,KAAA,GAAQ,MAAA,GAAS,OAAA;AAAA,IACxC,SAAA,EAAW,CAAC,KAAA,KAAU,KAAA,KAAU;AAAA,GACpC;AACJ;AAQO,SAAS,cAAA,CACZ,YAAA,GAAkC,EAAC,EACjB;AAClB,EAAA,MAAM,UAAA,GAAa,CAAC,GAAG,YAAY,EAAE,IAAA,EAAK,CAAE,KAAK,GAAG,CAAA;AAEpD,EAAA,OAAO;AAAA,IACH,KAAA,EAAO,CAAC,GAAA,KAAQ;AACZ,MAAA,IAAI,QAAQ,IAAA,IAAQ,GAAA,KAAQ,IAAI,OAAO,CAAC,GAAG,YAAY,CAAA;AAEvD,MAAA,OAAO,GAAA,CAAI,MAAM,GAAG,CAAA,CAAE,OAAO,CAAC,IAAA,KAAS,SAAS,EAAE,CAAA;AAAA,IACtD,CAAA;AAAA,IACA,SAAA,EAAW,CAAC,KAAA,KAAW,KAAA,CAAM,WAAW,CAAA,GAAI,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA;AAAA,IACjE,SAAA,EAAW,CAAC,KAAA,KAAU,CAAC,GAAG,KAAK,CAAA,CAAE,IAAA,EAAK,CAAE,IAAA,CAAK,GAAG,CAAA,KAAM;AAAA,GAC1D;AACJ;AAOO,SAAS,gBAAqC,MAAA,EAAc;AAC/D,EAAA,OAAO,MAAA;AACX;AAQO,SAAS,cAAA,CACZ,QACA,MAAA,EACgB;AAChB,EAAA,MAAM,UAAA,GAAa,OAAO,UAAA,CAAW,GAAG,IAAI,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,GAAI,MAAA;AAC9D,EAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB,UAAU,CAAA;AAC7C,EAAA,MAAM,QAAQ,EAAC;AAEf,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,EAAG;AACnC,IAAA,MAAM,KAAA,GAAQ,OAAO,GAAG,CAAA;AACxB,IAAA,IAAI,UAAU,MAAA,EAAW;AACzB,IAAC,KAAA,CAAkC,GAAG,CAAA,GAAI,KAAA,CAAM,MAAM,MAAA,CAAO,GAAA,CAAI,GAAG,CAAC,CAAA;AAAA,EACzE;AAEA,EAAA,OAAO,KAAA;AACX;AAWO,SAAS,cAAA,CACZ,OACA,MAAA,EACM;AACN,EAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AAEnC,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,EAAG;AACnC,IAAA,MAAM,KAAA,GAAQ,OAAO,GAAG,CAAA;AACxB,IAAA,IAAI,UAAU,MAAA,EAAW;AACzB,IAAA,MAAM,KAAA,GAAS,MAAkC,GAAG,CAAA;AAEpD,IAAA,IAAI,KAAA,CAAM,SAAA,CAAU,KAAK,CAAA,EAAG;AAE5B,IAAA,MAAM,UAAA,GAAa,KAAA,CAAM,SAAA,CAAU,KAAK,CAAA;AACxC,IAAA,IAAI,eAAe,IAAA,EAAM;AACrB,MAAA,MAAA,CAAO,GAAA,CAAI,KAAK,UAAU,CAAA;AAAA,IAC9B;AAAA,EACJ;AAEA,EAAA,OAAO,OAAO,QAAA,EAAS;AAC3B;ACxKO,SAAS,cAAA,CAAe,MAAc,IAAA,EAAsB;AAC/D,EAAA,IAAI,SAAS,GAAA,EAAK;AACd,IAAA,OAAO,IAAA,KAAS,MAAM,CAAA,GAAI,EAAA;AAAA,EAC9B;AAEA,EAAA,OAAO,IAAA,KAAS,QAAQ,IAAA,CAAK,UAAA,CAAW,OAAO,GAAG,CAAA,GAAI,KAAK,MAAA,GAAS,EAAA;AACxE;AAGO,SAAS,aAAA,CAAqC,MAAc,KAAA,EAAoC;AACnG,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACtB,IAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,IAAA,EAAM,IAAA,CAAK,IAAI,CAAA;AAC5C,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAChB,MAAA,IAAA,GAAO,IAAA;AACP,MAAA,MAAA,GAAS,KAAA;AAAA,IACb;AAAA,EACJ;AAEA,EAAA,OAAO,IAAA;AACX;AAOO,SAAS,aAAA,CAAqC,MAAc,KAAA,EAAoC;AACnG,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACtB,IAAA,MAAM,UAAA,GAAa,CAAC,IAAA,CAAK,IAAA,EAAM,GAAA,CAAI,IAAA,CAAK,KAAA,IAAS,EAAC,EAAG,GAAA,CAAI,CAAA,IAAA,KAAQ,IAAA,CAAK,IAAI,CAAC,CAAA;AAC3E,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,GAAG,UAAA,CAAW,GAAA,CAAI,CAAA,IAAA,KAAQ,cAAA,CAAe,IAAA,EAAM,IAAI,CAAC,CAAC,CAAA;AAC5E,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAChB,MAAA,IAAA,GAAO,IAAA;AACP,MAAA,MAAA,GAAS,KAAA;AAAA,IACb;AAAA,EACJ;AAEA,EAAA,OAAO,IAAA;AACX;AAEA,SAAS,eAAA,CAAgB,KAAA,EAA4B,QAAA,EAAmB,QAAA,EAAuH;AAC3L,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAII,SAAS,QAAQ,CAAA;AACvC,EAAA,MAAM,UAAU,KAAA,IAAS,GAAA;AACzB,EAAA,MAAM,GAAA,GAAMI,OAAO,OAAO,CAAA;AAC1B,EAAA,GAAA,CAAI,OAAA,GAAU,OAAA;AACd,EAAA,MAAM,GAAA,GAAME,WAAAA,CAAY,CAAC,IAAA,KAAoD;AACzE,IAAA,MAAM,WAAW,OAAO,IAAA,KAAS,aAAa,IAAA,CAAK,GAAA,CAAI,OAAO,CAAA,GAAI,IAAA;AAClE,IAAA,IAAI,KAAA,KAAU,MAAA,EAAW,MAAA,CAAO,QAAQ,CAAA;AACxC,IAAA,QAAA,GAAW,QAAQ,CAAA;AAAA,EACvB,CAAA,EAAG,CAAC,KAAA,EAAO,QAAQ,CAAC,CAAA;AAEpB,EAAA,OAAO,CAAC,SAAS,GAAG,CAAA;AACxB;AAGO,SAAS,kBAAA,CAAmB,EAAE,MAAA,EAAQ,YAAA,EAAc,KAAA,EAAO,WAAA,EAAa,aAAA,EAAe,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,OAAA,EAAS,QAAA,EAAU,SAAA,GAAY,KAAK,MAAA,GAAS,cAAA,EAAgB,MAAA,EAAQ,UAAA,EAAY,aAAA,GAAgB,KAAA,EAAO,cAAA,EAAgB,SAAA,EAAW,aAAA,EAAe,gBAAA,GAAmB,KAAA,EAAO,iBAAA,EAAkB,EAA4B;AAC1U,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,mBAAA,EAAoB;AAClC,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,IAAI,eAAA,CAAgB,UAAA,EAAY,eAAe,cAAc,CAAA;AACrF,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,IAAI,eAAA,CAAgB,aAAA,EAAe,kBAAkB,iBAAiB,CAAA;AACpG,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIN,SAAS,KAAK,CAAA;AAC9C,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,MAAA,GAASI,OAA0B,IAAI,CAAA;AAC7C,EAAA,MAAM,OAAO,WAAA,CAAY,KAAA,CAAM,MAAM,CAAA,CAAE,CAAC,CAAA,IAAK,GAAA;AAC7C,EAAA,MAAM,IAAA,GAAO,aAAA,CAAc,IAAA,EAAM,KAAK,CAAA;AACtC,EAAA,MAAM,SAAS,IAAA,EAAM,KAAA,IAAS,KAAK,KAAA,CAAM,MAAA,GAAS,IAAI,IAAA,GAAO,MAAA;AAC7D,EAAAH,UAAU,MAAM;AAAE,IAAA,SAAA,CAAU,KAAK,CAAA;AAAA,EAAG,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AACpD,EAAAA,UAAU,MAAM;AACZ,IAAA,MAAM,KAAK,MAAA,CAAO,OAAA;AAClB,IAAA,IAAI,UAAU,EAAA,IAAM,CAAC,EAAA,CAAG,IAAA,KAAS,SAAA,EAAU;AAC3C,IAAA,IAAI,CAAC,MAAA,IAAU,EAAA,EAAI,IAAA,KAAS,KAAA,EAAM;AAAA,EACtC,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AACX,EAAAA,UAAU,MAAM;AACZ,IAAA,MAAM,GAAA,GAAM,CAAC,KAAA,KAAyB;AAClC,MAAA,IAAA,CAAK,MAAM,OAAA,IAAW,KAAA,CAAM,OAAA,KAAY,KAAA,CAAM,QAAQ,GAAA,EAAK;AACvD,QAAA,KAAA,CAAM,cAAA,EAAe;AAAG,QAAA,YAAA,CAAa,CAAA,KAAA,KAAS,CAAC,KAAK,CAAA;AAAA,MACxD;AAAA,IACJ,CAAA;AACA,IAAA,gBAAA,CAAiB,WAAW,GAAG,CAAA;AAC/B,IAAA,OAAO,MAAM,mBAAA,CAAoB,SAAA,EAAW,GAAG,CAAA;AAAA,EACnD,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AACjB,EAAA,MAAM,OAAO,MAAA,IAAU,QAAA;AACvB,EAAA,MAAM,KAAA,GAAQ,CAAC,KAAA,KAAyB;AACpC,IAAA,MAAM,MAAA,GAAS,aAAA,CAAc,IAAA,EAAM,KAAK,CAAA;AACxC,IAAA,OAAO,KAAA,CAAM,IAAI,CAAA,IAAA,qBAAQF,KAAC,IAAA,EAAA,EAAqB,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,SAAA,EAAW,CAAA,mBAAA,EAAsB,SAAS,MAAA,GAAS,WAAA,GAAc,EAAE,CAAA,CAAA,EAAI,YAAA,EAAY,IAAA,CAAK,OAAO,cAAA,EAAc,IAAA,KAAS,MAAA,GAAS,MAAA,GAAS,MAAA,EAAW,QAAA,EAAA;AAAA,sBAAAH,IAAC,IAAA,CAAK,IAAA,EAAL,EAAU,SAAA,EAAU,kBAAA,EAAmB,aAAa,GAAA,EAAK,CAAA;AAAA,sBAAEA,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,IAAA,CAAK,KAAA,EAAM;AAAA,KAAA,EAAA,EAA7P,IAAA,CAAK,IAA+P,CAAO,CAAA;AAAA,EACnT,CAAA;AACA,EAAA,uBAAOG,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EAClB,QAAA,EAAA;AAAA,oBAAAH,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EAAgB,aAAA,EAAa,MAAA,EACxC,QAAA,kBAAAG,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,UAAA,EAAW,WAAA,EAAW,IAAA,EAAM,YAAA,EAAc,MAAM,WAAA,CAAY,IAAI,CAAA,EAAG,YAAA,EAAc,MAAM,WAAA,CAAY,KAAK,CAAA,EAAG,cAAA,EAAgB,MAAM,WAAA,CAAY,IAAI,CAAA,EAAG,eAAe,CAAA,KAAA,KAAS;AAAE,MAAA,IAAI,CAAC,MAAM,aAAA,CAAc,QAAA,CAAS,MAAM,aAAa,CAAA,cAAe,KAAK,CAAA;AAAA,IAAG,CAAA,EACvQ,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EAAiB,QAAA,EAAA;AAAA,wBAAAA,KAAC,IAAA,EAAA,EAAK,IAAA,EAAM,WAAW,YAAA,EAAY,CAAA,CAAE,MAAM,CAAA,EAAG,QAAA,EAAA;AAAA,0BAAAH,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,aAAA,EAAc,QAAA,kBAAAA,GAAAA,CAAC,SAAA,EAAA,EAAU,MAAA,EAAgB,OAAA,EAAS,YAAA,EAAc,SAAA,EAAW,CAAC,MAAM,CAAA,EAAE,CAAA;AAAA,0BAAOA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mBAAA,EAAoB,0BAAAA,GAAAA,CAAC,SAAA,EAAA,EAAU,MAAA,EAAgB,OAAA,EAAS,cAAc,SAAA,EAAW,CAAC,IAAA,EAAM,IAAA,EAAK,SAAQ,CAAA,EAAE;AAAA,SAAA,EAAO,CAAA;AAAA,QAAQ,IAAA,oBAAQA,GAAAA,CAAC,QAAA,EAAA,EAAO,MAAK,QAAA,EAAS,OAAA,EAAS,MAAM,SAAA,CAAU,CAAA,KAAA,KAAS,CAAC,KAAK,CAAA,EAAG,cAAY,CAAA,CAAE,MAAA,GAAS,kBAAA,GAAqB,gBAAgB,CAAA,EAAG,cAAA,EAAc,MAAA,EAAS,QAAA,EAAA,MAAA,mBAASA,GAAAA,CAAC,MAAA,EAAA,EAAO,IAAA,EAAM,EAAA,EAAI,oBAAKA,GAAAA,CAAC,GAAA,EAAA,EAAI,IAAA,EAAM,IAAI,CAAA,EAAG;AAAA,OAAA,EAAU,CAAA;AAAA,sBAC1hBA,GAAAA,CAAC,KAAA,EAAA,EAAI,YAAA,EAAY,cAAe,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAA,IAAA,qBAAQG,IAAAA,CAAC,IAAA,EAAA,EAAqB,IAAA,EAAM,IAAA,CAAK,MAAM,YAAA,EAAY,IAAA,CAAK,KAAA,EAAO,cAAA,EAAc,IAAA,KAAS,IAAA,GAAO,MAAA,GAAS,MAAA,EAAW,OAAO,IAAA,GAAO,MAAA,GAAY,IAAA,CAAK,KAAA,EAAO,WAAW,CAAA,mBAAA,EAAsB,IAAA,KAAS,IAAA,GAAO,WAAA,GAAc,EAAE,CAAA,CAAA,EAAI,QAAA,EAAA;AAAA,wBAAAH,IAAC,IAAA,CAAK,IAAA,EAAL,EAAU,SAAA,EAAU,kBAAA,EAAmB,aAAa,GAAA,EAAK,CAAA;AAAA,QAAG,IAAA,oBAAQA,GAAAA,CAAC,MAAA,EAAA,EAAM,eAAK,KAAA,EAAM;AAAA,OAAA,EAAA,EAAxS,IAAA,CAAK,IAA2S,CAAO,CAAA,EAAE,CAAA;AAAA,sBACtXA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAoB,QAAA,EAAA,OAAA,EAAQ;AAAA,KAAA,EAC/C,CAAA,EACJ,CAAA;AAAA,oBACAG,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EACX,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,sBAAA,EAAuB,QAAA,EAAA;AAAA,wBAAAH,GAAAA,CAAC,YAAO,SAAA,EAAU,oBAAA,EAAqB,MAAK,QAAA,EAAS,OAAA,EAAS,MAAM,SAAA,CAAU,IAAI,GAAG,YAAA,EAAY,CAAA,CAAE,iBAAiB,CAAA,EAAG,QAAA,kBAAAA,IAACyB,IAAAA,EAAA,EAAK,IAAA,EAAM,EAAA,EAAI,CAAA,EAAE,CAAA;AAAA,wBAASzB,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAyB,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,wBAAMA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAuB,QAAA,EAAA,KAAA,EAAM;AAAA,OAAA,EAAM,CAAA;AAAA,sBACnSG,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EACV,QAAA,EAAA;AAAA,QAAA,MAAA,oBAAUH,IAAC,OAAA,EAAA,EAAM,SAAA,EAAU,cAAa,gBAAA,EAAgB,SAAA,EAAY,QAAA,EAAA,SAAA,mBAAYG,IAAAA,CAAC,QAAA,EAAA,EAAO,WAAU,kBAAA,EAAmB,IAAA,EAAK,QAAA,EAAS,OAAA,EAAS,MAAM,YAAA,CAAa,KAAK,CAAA,EAAG,YAAA,EAAY,CAAA,CAAE,gBAAgB,CAAA,EAAG,QAAA,EAAA;AAAA,0BAAAH,GAAAA,CAAC0B,aAAAA,EAAA,EAAc,IAAA,EAAM,EAAA,EAAI,CAAA;AAAA,0BAAE1B,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,MAAA,CAAO,KAAA,EAAM;AAAA,SAAA,EAAO,CAAA,mBAAYG,IAAAA,CAAAI,QAAAA,EAAA,EAAE,QAAA,EAAA;AAAA,0BAAAJ,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EAAoB,QAAA,EAAA;AAAA,4BAAAH,GAAAA,CAAC,QAAA,EAAA,EAAQ,QAAA,EAAA,MAAA,CAAO,KAAA,EAAM,CAAA;AAAA,4BAASA,IAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,OAAA,EAAS,MAAM,YAAA,CAAa,IAAI,CAAA,EAAG,YAAA,EAAY,EAAE,kBAAkB,CAAA,EAAG,OAAM,SAAA,EAAK,QAAA,kBAAAA,IAAC2B,cAAAA,EAAA,EAAe,IAAA,EAAM,EAAA,EAAI,CAAA,EAAE;AAAA,WAAA,EAAS,CAAA;AAAA,0BAAM3B,GAAAA,CAAC,KAAA,EAAA,EAAI,YAAA,EAAY,MAAA,CAAO,KAAA,EAAQ,QAAA,EAAA,KAAA,CAAM,MAAA,CAAO,KAAA,IAAS,EAAE,CAAA,EAAE;AAAA,SAAA,EAAM,CAAA,EAAI,CAAA;AAAA,wBACriBA,GAAAA,CAAC,MAAA,EAAA,EAAK,IAAI,MAAA,EAAQ,SAAA,EAAU,sCAAsC,QAAA,EAAS;AAAA,OAAA,EAC/E;AAAA,KAAA,EACJ,CAAA;AAAA,oBACAG,IAAAA,CAAC,QAAA,EAAA,EAAO,GAAA,EAAK,MAAA,EAAQ,SAAA,EAAU,sBAAA,EAAuB,OAAA,EAAS,MAAM,SAAA,CAAU,KAAK,CAAA,EAAG,SAAS,CAAA,KAAA,KAAS;AAAE,MAAA,IAAI,KAAA,CAAM,MAAA,KAAW,KAAA,CAAM,aAAA,YAAyB,KAAK,CAAA;AAAA,IAAG,CAAA,EAAG,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EAAoB,QAAA,EAAA;AAAA,wBAAAH,GAAAA,CAAC,YAAQ,QAAA,EAAA,YAAA,EAAa,CAAA;AAAA,wBAASA,IAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,OAAA,EAAS,MAAM,UAAU,KAAK,CAAA,EAAG,cAAY,CAAA,CAAE,kBAAkB,GAAG,QAAA,kBAAAA,GAAAA,CAACS,GAAA,EAAE,IAAA,EAAM,IAAI,CAAA,EAAE;AAAA,OAAA,EAAS,CAAA;AAAA,sBAAMT,GAAAA,CAAC,KAAA,EAAA,EAAI,YAAA,EAAY,CAAA,CAAE,YAAY,CAAA,EAAI,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAA,IAAA,qBAAQG,IAAAA,CAAC,SAAA,EAAA,EAAyB,QAAA,EAAA;AAAA,QAAA,KAAA,CAAM,CAAC,IAAI,CAAC,CAAA;AAAA,QAAG,IAAA,CAAK,KAAA,oBAASH,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,MAAA,EAAQ,QAAA,EAAA,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA,EAAE;AAAA,OAAA,EAAA,EAAlF,IAAA,CAAK,IAAoF,CAAU,CAAA,EAAE,CAAA;AAAA,sBAAMA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAoB,QAAA,EAAA,OAAA,EAAQ;AAAA,KAAA,EAAM;AAAA,GAAA,EACvkB,CAAA;AACJ;AC9IO,IAAM,gBAAgB,CAAC,gBAAA,EAAkB,gBAAA,EAAkB,gBAAA,EAAkB,kBAAkB,gBAAgB;AAG/G,SAAS,SAAA,CAAU,EAAE,MAAA,EAAQ,KAAA,GAAQ,kBAAkB,KAAA,GAAQ,EAAA,EAAI,MAAA,GAAS,EAAA,EAAG,EAA0E;AAC5J,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACrB,IAAA,OAAO,IAAA;AAAA,EACX;AAEA,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAW,OAAO,QAAA,CAAS,KAAK,CAAA,GAAI,KAAA,GAAQ,CAAE,CAAA;AACxE,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,GAAG,KAAK,CAAA;AACnC,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,GAAA,CAAI,CAAC,KAAA,EAAO,UAAU,CAAE,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAA,CAAM,SAAS,CAAC,CAAA,IAAM,KAAA,GAAQ,CAAA,CAAA,GAAK,CAAA,EAAG,MAAA,GAAS,IAAK,KAAA,GAAQ,GAAA,IAAQ,MAAA,GAAS,CAAA,CAAE,CAAU,CAAA;AAC1J,EAAA,MAAM,CAAA,GAAI,MAAA,CAAO,GAAA,CAAI,CAAC,CAAC,EAAA,EAAI,EAAE,CAAA,EAAG,KAAA,KAAU,CAAA,EAAG,KAAA,KAAU,CAAA,GAAI,GAAA,GAAM,GAAG,CAAA,EAAG,EAAA,CAAG,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,EAAI,EAAA,CAAG,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AAEhH,EAAA,uBACIG,IAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAc,MAAA,EAAgB,OAAA,EAAS,CAAA,IAAA,EAAO,KAAK,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,EAAI,aAAA,EAAY,MAAA,EAC9E,QAAA,EAAA;AAAA,oBAAAH,IAAC,MAAA,EAAA,EAAK,CAAA,EAAG,CAAA,EAAG,CAAC,IAAI,KAAA,GAAQ,CAAC,CAAA,CAAA,EAAI,MAAM,MAAM,MAAM,CAAA,CAAA,CAAA,EAAK,IAAA,EAAM,KAAA,EAAO,SAAS,IAAA,EAAM,CAAA;AAAA,oBACjFA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAM,IAAA,EAAK,MAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,WAAA,EAAa,GAAA,EAAK,cAAA,EAAe,OAAA,EAAQ,eAAc,OAAA,EAAQ;AAAA,GAAA,EAC1G,CAAA;AAER","file":"index.js","sourcesContent":["import {\n createContext,\n useContext,\n type ReactNode,\n} from 'react';\n\n/**\n * Identity contract every Cbox-family app must populate.\n *\n * Shape mirrors what the future `@cboxdk/cbox-id-client` SDK returns\n * from id's `/api/v1/me` endpoint plus a small set of platform-level\n * URLs that each app needs to construct deep-links into id.\n *\n * In the id app itself, populate this from Inertia shared props\n * (id IS the source of truth — no API call needed).\n *\n * In cortex / atlas / track / future apps, populate from the\n * id-client SDK — typically once per session, then refreshed when\n * the user switches org or updates their profile.\n *\n * Components in this package read from the context but never write —\n * mutations always round-trip through id's API via the id-client.\n */\n\nexport type CboxAppKey = string;\n\nexport type CboxUser = {\n /** Cbox ID's user id: numeric in id itself, a prefixed string (`usr_…`) in the apps that mirror it. */\n id: number | string;\n name: string;\n email: string;\n avatar_url?: string | null;\n /** ISO 639-1 (e.g. \"en\", \"da\"). Used by formatters that want a locale. */\n locale?: string | null;\n /** IANA tz identifier (e.g. \"Europe/Copenhagen\"). */\n timezone?: string | null;\n};\n\nexport type CboxOrganization = {\n /** Cbox ID's organization id: numeric in id itself, a prefixed string (`org_…`) in the apps that mirror it. */\n id: number | string;\n slug: string;\n name: string;\n /**\n * Role of the current user within this org as resolved by id.\n * Apps should honour this for permission gating in the chrome\n * (eg \"Manage team\" link is hidden for members).\n */\n role?: 'owner' | 'admin' | 'member' | string;\n};\n\nexport type CboxAppLink = {\n /** Stable key — e.g. \"id\", \"cortex\", \"atlas\", \"track\". */\n key: CboxAppKey;\n /** Display name as shown in the launcher. */\n name: string;\n /** Absolute URL the launcher tile links to. */\n url: string;\n /**\n * Short tagline shown under the name. Keep to ~5–8 words —\n * the launcher truncates after one line.\n */\n description?: string;\n /**\n * One-letter monogram fallback when no icon is provided.\n * Defaults to the first letter of `name`.\n */\n monogram?: string;\n /** Cbox ID's catalog `icon_url`: the app's icon for light surfaces (`https:` only). */\n iconUrl?: string | null;\n /** Cbox ID's catalog `icon_dark_url`: the app's icon for dark surfaces. */\n iconDarkUrl?: string | null;\n /**\n * Accent colour for the monogram tile (and current-app highlight).\n * Hex string or any CSS colour the browser accepts. Falls back to\n * the neutral chip when missing.\n */\n accentColor?: string;\n /** Tag the user's currently-active app so the launcher highlights it. */\n current?: boolean;\n /**\n * Whether the current org has access to this app. Defaults to\n * `true` so existing payloads render unchanged. `false` renders\n * the tile as locked: greyed out, no nav, and (if the host app\n * passes `onLockedAppClick`) opens an upgrade affordance.\n */\n entitled?: boolean;\n /**\n * Mark the app as not-yet-released. Renders as a disabled tile\n * with a \"soon\" badge — distinct from `entitled: false` which\n * implies \"available, but not in your plan\".\n */\n comingSoon?: boolean;\n};\n\nexport type CboxNotificationPreviewItem = {\n id: string;\n title: string;\n body?: string | null;\n severity: 'info' | 'warning' | 'critical';\n /** ISO-8601 timestamp from the notifications service. */\n createdAt: string;\n /** Null when the user hasn't opened the notification yet. */\n readAt?: string | null;\n /** Optional deep-link — typically into the app that originated\n * the notification (id/billing/invoice/123, webhooks/deliveries/x).\n * Null when the notification is informational with no follow-up. */\n ctaUrl?: string | null;\n ctaLabel?: string | null;\n};\n\nexport type CboxNotificationsState = {\n unreadCount: number;\n /**\n * \"See all\" target — typically the central notifications service\n * inbox (notifications.cbox.systems/inbox). The bell's POPOVER\n * shows the preview items inline; only this URL navigates the\n * user out of the current app.\n */\n inboxUrl: string;\n /**\n * Last 5 items (mixed read/unread) for the bell-popover preview.\n * Empty when the host hasn't fetched a preview yet — the bell\n * still renders the badge from `unreadCount`. Falsy on\n * pre-auth pages where the chrome shouldn't render the bell at all.\n */\n previewItems?: CboxNotificationPreviewItem[];\n /**\n * Endpoint pattern for marking a single notification read. The\n * popover POSTs to `markReadUrl.replace('{id}', notification.id)`\n * — a host-local route that forwards to the service via M2M.\n */\n markReadUrl?: string;\n};\n\nexport type CboxIdContextValue = {\n user: CboxUser;\n /**\n * Org the current app context is scoped to. Null on user-only\n * surfaces (eg the id account-settings landing page).\n */\n currentOrganization: CboxOrganization | null;\n /**\n * All orgs the user belongs to — feeds the org switcher.\n * Should be small (≤ a few dozen). For users in many orgs,\n * the switcher swaps in a search field.\n */\n organizations: CboxOrganization[];\n /**\n * Sister apps in the Cbox family the user can launch into.\n * Static-ish — doesn't need to refresh per request.\n */\n apps: CboxAppLink[];\n /**\n * Deep-links into id used by chrome controls. Each app\n * constructs these via the id-client SDK; the package\n * doesn't hardcode URLs because id may live on different\n * hosts in dev / staging / prod.\n */\n urls: {\n /** Base of the id app — for the \"manage account\" link. */\n idBaseUrl: string;\n /** Absolute URL of the user's id profile page. */\n accountUrl: string;\n /** Absolute URL of the current org's settings page in id. */\n orgSettingsUrl: string | null;\n /** POST endpoint that signs the user out. */\n signOutUrl: string;\n /**\n * POST endpoint in id that switches the user's active org.\n * Used by OrgSwitcher as a fallback when `onSwitchOrganization`\n * is not provided — covers apps that can't do a pure URL swap.\n */\n switchOrgUrl?: string;\n };\n /**\n * Notification feed state, or null/undefined when the user has no\n * inbox configured. id's wire shape sets `null` explicitly; the\n * type accepts both shapes so apps can pass the payload straight\n * through without a null→undefined adapter.\n */\n notifications?: CboxNotificationsState | null;\n /**\n * True when the host app's cached payload is known to be out of\n * date — id has emitted a domain event (membership/role/sub\n * change) since the cache was populated. Apps should refetch\n * via the SDK before rendering anything that depends on the\n * cached membership / entitlement state. Soft-TTL covers the\n * case where the event was missed.\n *\n * Default: false (treated as fresh).\n */\n stale?: boolean;\n /**\n * Called when the user picks a different org from the switcher.\n * Apps own this — typically a same-app URL navigation that\n * swaps the slug in the current path (`/org/{slug}/...`). The\n * server validates membership at the destination via\n * EnsureOrganizationMembership, so this is a pure URL change with\n * no mutable state to update.\n */\n onSwitchOrganization?: (org: CboxOrganization) => void;\n};\n\nconst CboxIdContext = createContext<CboxIdContextValue | null>(null);\n\nexport function CboxIdProvider({\n value,\n children,\n}: {\n value: CboxIdContextValue;\n children: ReactNode;\n}) {\n return <CboxIdContext.Provider value={value}>{children}</CboxIdContext.Provider>;\n}\n\nexport function useCboxId(): CboxIdContextValue {\n const ctx = useContext(CboxIdContext);\n if (ctx === null) {\n throw new Error(\n '@cboxdk/cbox-ui: useCboxId() must be called inside <CboxIdProvider>. ' +\n 'Wrap your app root and populate it from the id-client SDK (or, ' +\n 'in id itself, from Inertia shared props).',\n );\n }\n return ctx;\n}\n\n/**\n * Soft variant — returns null instead of throwing. Useful for\n * components that gracefully degrade on auth-pre pages.\n */\nexport function useCboxIdOptional(): CboxIdContextValue | null {\n return useContext(CboxIdContext);\n}\n","import type { ComponentProps, ReactNode } from 'react';\nimport { cn } from '../utils/cn';\n\ntype Props = ComponentProps<'main'> & {\n children: ReactNode;\n};\n\n/**\n * Scrolling main column inside an <AppShell>. Wears the soft blue-\n * tinted gradient canvas so every Cbox app sits on the same\n * background.\n */\nexport function AppContent({ children, className, ...props }: Props) {\n return (\n <main\n {...props}\n className={cn(\n 'canvas-gradient relative flex h-svh flex-1 flex-col overflow-y-auto',\n className,\n )}\n >\n {children}\n </main>\n );\n}\n","import type { ReactNode } from 'react';\n\n/**\n * Top-level chrome. Hosts the desktop sidebar (left) and the\n * scrollable content column (right) side-by-side. Fits the full\n * viewport height; only the content column scrolls.\n *\n * Pair with <AppContent> inside. Per-app sidebars compose alongside\n * — cbox-ui doesn't ship one because the nav items are app-specific.\n */\nexport function AppShell({ children }: { children: ReactNode }) {\n return (\n <div className=\"flex h-svh w-full bg-canvas text-foreground\">\n {children}\n </div>\n );\n}\n","import { createContext, useContext, useMemo, type ReactNode } from 'react';\n\nexport type CboxTranslationValues = Record<string, string | number>;\nexport type CboxTranslator = (message: string, values?: CboxTranslationValues) => string;\n\n/** Hosts own catalogs; the shared components never guess a person's language. */\nconst Localization = createContext<{ locale: string; t: CboxTranslator; formatDate: (value: string) => string }>({\n locale: 'en',\n t: interpolate,\n formatDate: (value) => new Date(value).toLocaleString(),\n});\n\nexport function interpolate(message: string, values: CboxTranslationValues = {}): string {\n return message.replace(/\\{([a-zA-Z][a-zA-Z0-9_]*)\\}/g, (match, key: string) =>\n Object.prototype.hasOwnProperty.call(values, key) ? String(values[key]) : match,\n );\n}\n\n/** Optional and additive: without a provider existing consumers retain English. */\nexport function CboxLocalizationProvider({ locale, translate, formatDate = defaultDate, children }: {\n locale: string;\n translate: CboxTranslator;\n formatDate?: (value: string) => string;\n children: ReactNode;\n}) {\n const value = useMemo(() => ({ locale, t: translate, formatDate }), [locale, translate, formatDate]);\n return <Localization.Provider value={value}>{children}</Localization.Provider>;\n}\n\nexport function useCboxLocalization() {\n return useContext(Localization);\n}\n\nfunction defaultDate(value: string): string {\n return new Date(value).toLocaleString();\n}\n","import { useState, useSyncExternalStore, type ReactNode } from 'react';\nimport { cn } from '../utils/cn';\n\n/**\n * Every Cbox app's icon comes from Cbox ID's catalog: one light and one dark upload per app\n * (`icon_url`, `icon_dark_url`). There is no local copy of the marks in this package or in an\n * app. The last catalog the browser saw is kept here so an app's own mark and the switcher\n * paint at once on the next page; the live answer replaces it when it arrives.\n */\nexport type CboxKnownApp = { key: string; name: string; icon_url: string | null; icon_dark_url: string | null };\n\nconst KEPT = 'cbox-app-catalog';\nconst EVENT = 'cbox-app-catalog';\nconst EMPTY: CboxKnownApp[] = [];\nlet cache: { raw: string | null; apps: CboxKnownApp[] } = { raw: null, apps: EMPTY };\n\nfunction storage(): Storage | null {\n try {\n return typeof window === 'undefined' ? null : window.localStorage;\n } catch {\n return null;\n }\n}\n\n/** The kept catalog, read outside React (the hook below is the way in for components). */\nexport function readKnownAppCatalog(): CboxKnownApp[] {\n let raw: string | null = null;\n try {\n raw = storage()?.getItem(KEPT) ?? null;\n } catch {\n raw = null;\n }\n if (raw === cache.raw) return cache.apps;\n let apps: CboxKnownApp[] = EMPTY;\n try {\n const value: unknown = raw === null ? [] : JSON.parse(raw);\n if (Array.isArray(value)) {\n apps = value.flatMap((entry: unknown) => {\n if (typeof entry !== 'object' || entry === null) return [];\n const app = entry as Record<string, unknown>;\n if (typeof app.key !== 'string' || typeof app.name !== 'string') return [];\n return [{ key: app.key, name: app.name, icon_url: secureIconUrl(app.icon_url), icon_dark_url: secureIconUrl(app.icon_dark_url) }];\n });\n }\n } catch {\n apps = EMPTY;\n }\n cache = { raw, apps };\n\n return apps;\n}\n\nfunction subscribe(change: () => void): () => void {\n if (typeof window === 'undefined') return () => undefined;\n const storageChange = (event: StorageEvent) => { if (event.key === KEPT) change(); };\n document.addEventListener(EVENT, change);\n window.addEventListener('storage', storageChange);\n return () => {\n document.removeEventListener(EVENT, change);\n window.removeEventListener('storage', storageChange);\n };\n}\n\n/** Keep the catalog the person just loaded, so every mark on this origin repaints from it. */\nexport function rememberAppCatalog(apps: ReadonlyArray<{ key: string; name: string; icon_url?: string | null; icon_dark_url?: string | null }>): void {\n const kept = apps.map(({ key, name, icon_url, icon_dark_url }) => ({ key, name, icon_url: icon_url ?? null, icon_dark_url: icon_dark_url ?? null }));\n try {\n storage()?.setItem(KEPT, JSON.stringify(kept));\n } catch {\n // A private window or blocked storage: the marks fall back until the next live answer.\n }\n if (typeof document !== 'undefined') document.dispatchEvent(new CustomEvent(EVENT));\n}\n\n/** The last catalog this browser kept; empty on the server and before the first answer. */\nexport function useKnownAppCatalog(): CboxKnownApp[] {\n return useSyncExternalStore(subscribe, readKnownAppCatalog, () => EMPTY);\n}\n\n/** Only `https:` icon URLs are rendered: the icons are hosted by Cbox ID. */\nexport function secureIconUrl(url: unknown): string | null {\n if (typeof url !== 'string' || url === '') return null;\n try {\n const parsed = new URL(url);\n return parsed.protocol === 'https:' ? parsed.href : null;\n } catch {\n return null;\n }\n}\n\nfunction initials(name: string): string {\n return name.replace(/^Cbox\\s*·\\s*/i, '').slice(0, 2);\n}\n\nexport type CboxAppIconProps = {\n /** The app's name; its first two letters stand in when it has no icon. */\n name: string;\n /** Catalog `icon_url`: the icon for light surfaces (or the only one). */\n iconUrl?: string | null;\n /** Catalog `icon_dark_url`: the icon for dark surfaces. */\n iconDarkUrl?: string | null;\n /** Size and shape of the icon box, e.g. `h-6 w-6`. */\n className?: string;\n /** Rendered instead of initials when the app has no usable icon. */\n fallback?: ReactNode;\n};\n\n/**\n * One app's icon from the catalog. With both uploads it renders two images and the token\n * stylesheet shows the one for the current theme (`.dark` or `[data-theme=\"dark\"]` on the\n * root, the same switch the tokens use). Without an icon, or when it fails to load, it shows\n * the app's initials.\n */\nexport function CboxAppIcon({ name, iconUrl, iconDarkUrl, className = 'h-6 w-6', fallback }: CboxAppIconProps) {\n const light = secureIconUrl(iconUrl);\n const dark = secureIconUrl(iconDarkUrl);\n const [failed, setFailed] = useState<string | null>(null);\n const key = `${light ?? ''}|${dark ?? ''}`;\n if (light === null || failed === key) {\n if (fallback !== undefined) return <>{fallback}</>;\n return <span aria-hidden className={cn('grid shrink-0 place-items-center rounded bg-secondary text-[11px] font-semibold text-foreground', className)}>{initials(name)}</span>;\n }\n const lost = () => setFailed(key);\n\n return (\n <span aria-hidden className={cn('cbx-app-icon-box inline-flex shrink-0 items-center justify-center', className)}>\n <img src={light} alt=\"\" decoding=\"async\" onError={lost} className={cn('cbx-app-icon', dark === null ? 'cbx-app-icon-single' : 'cbx-app-icon-light', 'h-full w-full')} />\n {dark !== null && <img src={dark} alt=\"\" decoding=\"async\" onError={lost} className=\"cbx-app-icon cbx-app-icon-dark h-full w-full\" />}\n </span>\n );\n}\n\nexport type CboxServiceMarkProps = {\n /** The app key in Cbox ID's catalog (`signals`, `infra`, …). */\n appKey: string;\n /** Size of the mark. Default `h-6 w-6`. */\n className?: string;\n /** Shown while the catalog has not told this browser the app's icon yet. Default nothing. */\n fallback?: ReactNode;\n};\n\n/** An app's own mark (its rail or brand icon), read from the catalog this browser last kept. */\nexport function CboxServiceMark({ appKey, className = 'h-6 w-6', fallback = null }: CboxServiceMarkProps) {\n const app = useKnownAppCatalog().find(entry => entry.key === appKey);\n if (app === undefined || app.icon_url === null) return <>{fallback}</>;\n\n return <CboxAppIcon name={app.name} iconUrl={app.icon_url} iconDarkUrl={app.icon_dark_url} className={className} fallback={fallback ?? undefined} />;\n}\n","import type { ComponentProps } from 'react';\nimport { cn } from '../utils/cn';\nimport { CboxServiceMark } from '../components/app-icon';\n\nexport type CboxBrandProps = {\n /**\n * App key — drives the small mono submark beside the wordmark.\n * Convention: lowercase single word matching the `cbox_apps.key`\n * row in id (`notifications`, `webhooks`, `id`, `cortex`, …).\n */\n appKey: string;\n /**\n * Override the submark text. Defaults to `appKey`. Hide it\n * entirely with `submark={null}`.\n */\n submark?: string | null;\n /** Asset base path. Default `/brand` — apps drop the standard\n * png set (`cbox-icon.png`, `cbox-logo.png`, plus `@2x` retina)\n * into `public/brand/` and they Just Work. */\n assetBase?: string;\n /** Tone of the wordmark. `dark` on light surfaces (default),\n * `light` on dark / coloured surfaces. */\n tone?: 'dark' | 'light';\n /** Collapsed mode renders only the square icon — used in the\n * collapsed-sidebar state. The icon is the app's own icon from\n * Cbox ID's catalog (light and dark) once this browser has seen\n * the catalog, and the Cbox icon until then. */\n collapsed?: boolean;\n className?: string;\n};\n\n/**\n * Canonical Cbox brand mark. Every app wears this — the only\n * variable bit is the `appKey` submark beside the wordmark\n * (\"notifications\", \"webhooks\", …).\n *\n * No app should ship its own brand component. If a product needs\n * a materially different mark, that's a cbox-ui PR (extend this\n * component), not a per-app fork.\n */\nexport function CboxBrand({\n appKey,\n submark,\n assetBase = '/brand',\n tone = 'dark',\n collapsed = false,\n className,\n}: CboxBrandProps) {\n if (collapsed) {\n const cboxIcon = (\n <img\n src={`${assetBase}/cbox-icon.png`}\n srcSet={`${assetBase}/cbox-icon.png 1x, ${assetBase}/cbox-icon@2x.png 2x`}\n alt=\"Cbox\"\n width={36}\n height={36}\n className={cn('h-9 w-9 rounded-md', className)}\n />\n );\n\n return <CboxServiceMark appKey={appKey} className={cn('h-9 w-9', className)} fallback={cboxIcon} />;\n }\n\n const wordmark =\n tone === 'light'\n ? `${assetBase}/cbox-logo-white.png`\n : `${assetBase}/cbox-logo.png`;\n const wordmarkRetina =\n tone === 'light'\n ? `${assetBase}/cbox-logo-white@2x.png`\n : `${assetBase}/cbox-logo@2x.png`;\n\n const submarkText = submark === undefined ? appKey : submark;\n\n return (\n <div\n className={cn('inline-flex items-center gap-2', className)}\n aria-label={`Cbox · ${appKey}`}\n >\n <img\n src={wordmark}\n srcSet={`${wordmark} 1x, ${wordmarkRetina} 2x`}\n alt=\"Cbox\"\n height={22}\n className=\"h-[22px] w-auto select-none\"\n draggable={false}\n />\n {submarkText !== null && submarkText !== '' ? (\n <span\n className={cn(\n 'text-[13px] font-semibold whitespace-nowrap',\n tone === 'light'\n ? 'text-white/60'\n : 'text-muted-foreground/80',\n )}\n >\n · {submarkText}\n </span>\n ) : null}\n </div>\n );\n}\n\n/**\n * Re-export shape kept in case a host app needs to pass\n * additional <img> attrs (`loading`, `fetchPriority`, …).\n */\nexport type CboxBrandImageProps = ComponentProps<'img'>;\n","import { useCboxLocalization } from '../context/localization';\nimport type { ComponentType, ReactNode } from 'react';\nimport { CboxBrand } from './cbox-brand';\nimport { cn } from '../utils/cn';\n\nexport type CboxNavItem = {\n label: string;\n /**\n * Absolute path the host's router can navigate to. Apps that\n * scope nav by org slug should compose the path themselves\n * (`/org/${slug}/endpoints`) before passing it in — cbox-ui\n * stays unaware of routing conventions.\n */\n href: string;\n icon: ComponentType<{ className?: string; strokeWidth?: number }>;\n /** Highlight the row for child routes too (`/endpoints/123`\n * matches the `Endpoints` row when this is true). */\n matchPrefix?: boolean;\n};\n\nexport type CboxNavSection = {\n label: string;\n items: CboxNavItem[];\n};\n\n/**\n * Generic Link contract — apps inject their own (Inertia's `Link`,\n * Wouter, React Router, plain `<a>`). cbox-ui doesn't depend on\n * any router so the same chrome works everywhere.\n */\nexport type LinkComponent = ComponentType<{\n href: string;\n prefetch?: boolean;\n children: ReactNode;\n className?: string;\n title?: string;\n 'aria-label'?: string;\n /** Set on the link of the page the person is on. */\n 'aria-current'?: 'page';\n}>;\n\nexport type CboxAppSidebarProps = {\n /** App key for the brand submark (and aria labels). */\n appKey: string;\n /** Optional override for the submark — defaults to `appKey`. */\n brandSubmark?: string | null;\n /** Where brand assets live. Default `/brand`. */\n assetBase?: string;\n /** Where the brand row links to (typically the app's home). */\n brandHref?: string;\n\n /** Nav sections — top to bottom. */\n sections: CboxNavSection[];\n /** Active path — used to highlight the current row. */\n currentPath: string;\n\n /** Apps inject their router's Link primitive. */\n LinkComponent: LinkComponent;\n\n /** Persisted \"is the desktop sidebar collapsed?\" state. */\n collapsed?: boolean;\n\n className?: string;\n};\n\n/**\n * Standard Cbox sidebar. Every app wears this — the only variable\n * bits are `sections` (per-app nav) and `appKey` (drives the brand\n * submark).\n *\n * Hidden below `lg` — apps render a separate mobile drawer that\n * shares the same `sections` config.\n *\n * No app should ship its own sidebar component. The chrome is the\n * shape; nav items are the data.\n */\nexport function CboxAppSidebar({\n appKey,\n brandSubmark,\n assetBase,\n brandHref = '/',\n sections,\n currentPath,\n LinkComponent,\n collapsed = false,\n className,\n}: CboxAppSidebarProps) {\n const { t } = useCboxLocalization();\n return (\n <aside\n data-slot=\"cbox-app-sidebar\"\n data-collapsed={collapsed ? 'true' : 'false'}\n className={cn(\n 'hidden h-svh shrink-0 flex-col border-r border-sidebar-border bg-sidebar transition-[width] duration-150 ease-out lg:flex',\n collapsed ? 'w-[60px]' : 'w-[240px]',\n className,\n )}\n >\n <LinkComponent\n href={brandHref}\n aria-label={t(\"Home\")}\n className={cn(\n 'flex h-14 shrink-0 items-center border-b border-sidebar-border/70',\n collapsed ? 'justify-center px-0' : 'px-4',\n )}\n >\n <CboxBrand\n appKey={appKey}\n submark={brandSubmark}\n assetBase={assetBase}\n collapsed={collapsed}\n />\n </LinkComponent>\n\n <nav\n className={cn(\n 'flex-1 overflow-y-auto pt-5 pb-3',\n collapsed ? 'space-y-3 px-2' : 'space-y-5 px-3',\n )}\n >\n {sections.map((section) => (\n <div key={section.label} className=\"space-y-1\">\n {collapsed ? null : (\n <p className=\"text-eyebrow px-3 pb-1\">\n {section.label}\n </p>\n )}\n <ul className=\"space-y-0.5\">\n {section.items.map((item) => {\n const active = item.matchPrefix === true\n ? currentPath === item.href ||\n currentPath.startsWith(item.href + '/')\n : currentPath === item.href;\n const Icon = item.icon;\n\n return (\n <li key={item.label}>\n <LinkComponent\n href={item.href}\n prefetch\n aria-label={\n collapsed\n ? item.label\n : undefined\n }\n title={\n collapsed\n ? item.label\n : undefined\n }\n className={cn(\n collapsed\n ? 'group mx-auto flex h-9 w-9 items-center justify-center rounded-md transition-colors'\n : 'group flex items-center gap-2.5 rounded-md px-3 py-1.5 text-[13px] transition-colors',\n active\n ? 'bg-sidebar-accent font-semibold text-sidebar-accent-foreground'\n : 'text-sidebar-foreground/80 hover:bg-sidebar-accent hover:text-foreground',\n )}\n >\n <Icon\n className={cn(\n 'h-4 w-4 shrink-0',\n active\n ? 'text-foreground'\n : 'text-sidebar-muted',\n )}\n strokeWidth={1.7}\n />\n {collapsed ? null : (\n <span className=\"flex-1 truncate\">\n {item.label}\n </span>\n )}\n </LinkComponent>\n </li>\n );\n })}\n </ul>\n </div>\n ))}\n </nav>\n </aside>\n );\n}\n","import { useCboxLocalization } from '../context/localization';\nimport { X } from 'lucide-react';\nimport { useEffect } from 'react';\nimport { CboxBrand } from './cbox-brand';\nimport type {\n CboxNavSection,\n LinkComponent,\n} from './cbox-app-sidebar';\nimport { cn } from '../utils/cn';\n\nexport type CboxMobileNavDrawerProps = {\n open: boolean;\n onClose: () => void;\n appKey: string;\n brandSubmark?: string | null;\n assetBase?: string;\n brandHref?: string;\n sections: CboxNavSection[];\n currentPath: string;\n LinkComponent: LinkComponent;\n};\n\n/**\n * Mobile-only slide-in sidebar. Hidden on `lg` and up — there the\n * desktop `CboxAppSidebar` is always visible. Shares the same\n * `sections` shape as the desktop sidebar so apps don't have to\n * maintain two nav configs.\n *\n * State (open/close) lives in `CboxAppShell` so it can wire the\n * hamburger button + auto-close on `currentPath` change. The drawer\n * itself just renders; it doesn't track anything.\n *\n * Closes on: Escape, scrim click, navigation (parent unsets `open`\n * when `currentPath` changes). Locks body scroll while open so the\n * page underneath doesn't scroll on touch.\n */\nexport function CboxMobileNavDrawer({\n open,\n onClose,\n appKey,\n brandSubmark,\n assetBase,\n brandHref = '/',\n sections,\n currentPath,\n LinkComponent,\n}: CboxMobileNavDrawerProps) {\n const { t } = useCboxLocalization();\n useEffect(() => {\n if (!open) {\n return;\n }\n\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose();\n }\n };\n document.addEventListener('keydown', onKey);\n\n const prevOverflow = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n\n return () => {\n document.removeEventListener('keydown', onKey);\n document.body.style.overflow = prevOverflow;\n };\n }, [open, onClose]);\n\n return (\n <div\n className={cn(\n 'fixed inset-0 z-40 lg:hidden',\n open ? '' : 'pointer-events-none',\n )}\n aria-hidden={open ? 'false' : 'true'}\n >\n <div\n onClick={onClose}\n className={cn(\n 'absolute inset-0 bg-black/40 transition-opacity duration-200',\n open ? 'opacity-100' : 'opacity-0',\n )}\n />\n <aside\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={t(\"Navigation\")}\n className={cn(\n 'absolute inset-y-0 left-0 flex w-[280px] max-w-[80vw] flex-col border-r border-sidebar-border bg-sidebar shadow-xl transition-transform duration-200 ease-out',\n open ? 'translate-x-0' : '-translate-x-full',\n )}\n >\n <div className=\"flex h-14 shrink-0 items-center justify-between gap-2 border-b border-sidebar-border/70 px-4\">\n <LinkComponent\n href={brandHref}\n aria-label={t(\"Home\")}\n className=\"flex items-center\"\n >\n <CboxBrand\n appKey={appKey}\n submark={brandSubmark}\n assetBase={assetBase}\n collapsed={false}\n />\n </LinkComponent>\n <button\n type=\"button\"\n onClick={onClose}\n aria-label={t(\"Close navigation\")}\n className=\"inline-flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-secondary hover:text-foreground\"\n >\n <X className=\"h-4 w-4\" strokeWidth={1.8} />\n </button>\n </div>\n <nav className=\"flex-1 space-y-5 overflow-y-auto px-3 pt-5 pb-3\">\n {sections.map((section) => (\n <div key={section.label} className=\"space-y-1\">\n <p className=\"text-eyebrow px-3 pb-1\">\n {section.label}\n </p>\n <ul className=\"space-y-0.5\">\n {section.items.map((item) => {\n const active =\n item.matchPrefix === true\n ? currentPath === item.href ||\n currentPath.startsWith(\n item.href + '/',\n )\n : currentPath === item.href;\n const Icon = item.icon;\n\n return (\n <li key={item.label}>\n <LinkComponent\n href={item.href}\n prefetch\n className={cn(\n 'group flex items-center gap-2.5 rounded-md px-3 py-2 text-[14px] transition-colors',\n active\n ? 'bg-sidebar-accent font-semibold text-sidebar-accent-foreground'\n : 'text-sidebar-foreground/80 hover:bg-sidebar-accent hover:text-foreground',\n )}\n >\n <Icon\n className={cn(\n 'h-4 w-4 shrink-0',\n active\n ? 'text-foreground'\n : 'text-sidebar-muted',\n )}\n strokeWidth={1.7}\n />\n <span className=\"flex-1 truncate\">\n {item.label}\n </span>\n </LinkComponent>\n </li>\n );\n })}\n </ul>\n </div>\n ))}\n </nav>\n </aside>\n </div>\n );\n}\n","import { useCboxLocalization } from '../context/localization';\nimport {\n useEffect,\n useMemo,\n useRef,\n useState,\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactNode,\n} from 'react';\nimport { useCboxIdOptional, type CboxAppLink } from '../context/cbox-id';\nimport { cn } from '../utils/cn';\nimport { CboxAppIcon, secureIconUrl } from './app-icon';\n\ntype AppSwitcherProps = {\n className?: string;\n /**\n * Called when the user clicks an app they're not entitled to. Use\n * this to open an upgrade flow / Stripe checkout / Intercom message.\n * If unset, locked rows fall through to a static \"Add to plan\"\n * affordance — the click is a no-op so we never silently ship the\n * user to a broken paywall.\n */\n onLockedAppClick?: (app: CboxAppLink) => void;\n};\n\n/**\n * Left-cluster app picker — the dropdown button that sits beside OrgSwitcher.\n *\n * Shows the current app's monogram + name as the trigger so both context\n * dimensions (which app, which org) are immediately visible in the left\n * cluster without needing to open anything.\n *\n * The dropdown preserves the full AppLauncher row richness: monogram tile\n * with per-app accent, name, description, and entitlement badges. Entitled\n * apps are grouped first; locked / coming-soon land in an \"Available\" section.\n *\n * Includes typeahead — auto-focus on open, filters name/description/key as\n * the user types, arrow-key navigation, Enter to activate, Escape to close.\n *\n * Soft-reads via useCboxIdOptional — renders null when no provider is\n * mounted above (admin shells, pre-auth pages).\n */\nexport function AppSwitcher({ className, onLockedAppClick }: AppSwitcherProps) {\n const { t } = useCboxLocalization();\n const cboxId = useCboxIdOptional();\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n const [activeIndex, setActiveIndex] = useState(0);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const searchRef = useRef<HTMLInputElement | null>(null);\n\n // Reset transient state every time the dropdown opens so we don't\n // leak the previous session's query/highlight into a fresh open.\n useEffect(() => {\n if (open) {\n setQuery('');\n setActiveIndex(0);\n // Focus on next tick — the input isn't mounted on the same\n // frame that flips `open=true`. requestAnimationFrame is the\n // simplest cross-browser way to wait for that mount.\n const id = requestAnimationFrame(() => searchRef.current?.focus());\n return () => cancelAnimationFrame(id);\n }\n }, [open]);\n\n // Click-outside + Escape — mirrors every other Cbox top-bar control.\n useEffect(() => {\n if (!open) {\n return;\n }\n\n function onPointerDown(event: PointerEvent): void {\n if (\n containerRef.current !== null &&\n !containerRef.current.contains(event.target as Node)\n ) {\n setOpen(false);\n }\n }\n\n function onKey(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n setOpen(false);\n }\n }\n\n window.addEventListener('pointerdown', onPointerDown);\n window.addEventListener('keydown', onKey);\n\n return () => {\n window.removeEventListener('pointerdown', onPointerDown);\n window.removeEventListener('keydown', onKey);\n };\n }, [open]);\n\n // No provider, or nothing to show — render nothing. The chrome stays clean.\n if (cboxId === null || cboxId.apps.length === 0) {\n return null;\n }\n\n const apps = cboxId.apps;\n const orgSlug = cboxId.currentOrganization?.slug;\n\n // The host/current app — used to build the trigger label.\n const currentApp = apps.find((a) => a.current === true) ?? null;\n\n // Filter + partition together so the activeIndex below maps cleanly\n // onto the rendered order: entitled rows first, then locked rows.\n const { entitled, locked, navigableHrefs } = useMemo(() => {\n const q = query.trim().toLowerCase();\n const matches = (app: CboxAppLink) => {\n if (q === '') {\n return true;\n }\n return (\n app.name.toLowerCase().includes(q) ||\n app.key.toLowerCase().includes(q) ||\n (app.description?.toLowerCase().includes(q) ?? false)\n );\n };\n\n const entitledList: CboxAppLink[] = [];\n const lockedList: CboxAppLink[] = [];\n for (const app of apps) {\n if (!matches(app)) {\n continue;\n }\n const isEntitled = app.entitled !== false && app.comingSoon !== true;\n (isEntitled ? entitledList : lockedList).push(app);\n }\n\n // Flat list of navigable hrefs in render order — used by Enter on\n // the search input to \"activate\" the highlighted row. Coming-soon\n // rows are skipped (they're not actionable).\n const navigable: Array<{ app: CboxAppLink; isLocked: boolean }> = [];\n for (const app of entitledList) {\n if (app.current !== true) {\n navigable.push({ app, isLocked: false });\n }\n }\n for (const app of lockedList) {\n if (app.comingSoon !== true) {\n navigable.push({ app, isLocked: true });\n }\n }\n\n return {\n entitled: entitledList,\n locked: lockedList,\n navigableHrefs: navigable,\n };\n }, [apps, query]);\n\n const totalMatches = entitled.length + locked.length;\n\n // Clamp activeIndex into the navigable range whenever the filter changes\n // so a query that shrinks the list doesn't leave the highlight pointing\n // past the end.\n useEffect(() => {\n if (activeIndex >= navigableHrefs.length) {\n setActiveIndex(0);\n }\n }, [navigableHrefs.length, activeIndex]);\n\n const triggerMonogram =\n currentApp?.monogram ?? currentApp?.name.slice(0, 1).toUpperCase() ?? '⬛';\n const triggerName = currentApp?.name ?? t('Apps');\n const triggerAccent = currentApp?.accentColor;\n\n function onSearchKeyDown(event: ReactKeyboardEvent<HTMLInputElement>): void {\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n if (navigableHrefs.length === 0) {\n return;\n }\n setActiveIndex((i) => (i + 1) % navigableHrefs.length);\n return;\n }\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n if (navigableHrefs.length === 0) {\n return;\n }\n setActiveIndex((i) => (i - 1 + navigableHrefs.length) % navigableHrefs.length);\n return;\n }\n if (event.key === 'Enter') {\n event.preventDefault();\n const target = navigableHrefs[activeIndex];\n if (target === undefined) {\n return;\n }\n if (target.isLocked) {\n onLockedAppClick?.(target.app);\n setOpen(false);\n return;\n }\n const href =\n orgSlug !== undefined && target.app.current !== true\n ? buildOrgUrl(target.app.url, orgSlug)\n : target.app.url;\n window.location.href = href;\n setOpen(false);\n }\n }\n\n return (\n <div ref={containerRef} className={cn('relative', className)}>\n <button\n type=\"button\"\n aria-haspopup=\"true\"\n aria-expanded={open}\n onClick={() => setOpen((v) => !v)}\n className=\"flex items-center gap-2 rounded-md border border-border bg-card px-2.5 py-1.5 text-sm font-medium text-foreground hover:bg-secondary\"\n >\n {/* Monogram chip matching the AppLauncher tile style */}\n <span\n style={\n triggerAccent !== undefined && secureIconUrl(currentApp?.iconUrl) === null\n ? {\n backgroundColor: triggerAccent,\n color: '#fff',\n borderColor: triggerAccent,\n }\n : undefined\n }\n className=\"flex h-5 w-5 shrink-0 items-center justify-center rounded-sm border border-border bg-secondary text-[10px] font-bold\"\n >\n {currentApp ? (\n <CboxAppIcon name={currentApp.name} iconUrl={currentApp.iconUrl} iconDarkUrl={currentApp.iconDarkUrl} className=\"h-3.5 w-3.5\" fallback={<>{triggerMonogram}</>} />\n ) : (\n triggerMonogram\n )}\n </span>\n <span className=\"max-w-[140px] truncate\">{triggerName}</span>\n <Chevron />\n </button>\n\n {open ? (\n <div\n role=\"dialog\"\n aria-label={t(\"Switch app\")}\n // 22rem wide — enough for monogram + name + description in one line\n // without wrapping. Clamps to viewport-minus-gutter on narrow screens.\n className=\"absolute left-0 top-full z-50 mt-1 w-[min(22rem,calc(100vw-1.5rem))] overflow-hidden rounded-lg border border-border bg-popover shadow-lg\"\n >\n <div className=\"border-b border-border/70 px-3 pt-2.5 pb-1.5\">\n <p className=\"text-mono text-[10px] font-semibold tracking-[0.18em] text-muted-foreground uppercase\">\n {t(\"Switch app\")}</p>\n </div>\n\n <div className=\"border-b border-border/70 px-2 py-1.5\">\n <div className=\"flex items-center gap-2 rounded-md px-2 py-1 focus-within:bg-secondary\">\n <SearchIcon />\n <input\n ref={searchRef}\n type=\"text\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n onKeyDown={onSearchKeyDown}\n placeholder={t(\"Filter apps…\")}\n aria-label={t(\"Filter apps\")}\n autoComplete=\"off\"\n spellCheck={false}\n className=\"w-full bg-transparent text-sm text-foreground placeholder:text-muted-foreground/60 focus:outline-none\"\n />\n </div>\n </div>\n\n <div className=\"max-h-[60vh] overflow-y-auto py-1\">\n {totalMatches === 0 ? (\n <p className=\"px-3 py-6 text-center text-[12px] text-muted-foreground\">\n {t('No apps match “{query}”', {query})}\n </p>\n ) : null}\n\n {entitled.length > 0 ? (\n <ul className=\"space-y-0.5 p-1\">\n {entitled.map((app) => {\n const navIndex = findNavIndex(navigableHrefs, app);\n return (\n <AppRow\n key={app.key}\n app={app}\n orgSlug={orgSlug}\n highlighted={navIndex === activeIndex}\n onMouseEnter={() => {\n if (navIndex !== -1) {\n setActiveIndex(navIndex);\n }\n }}\n onLockedAppClick={onLockedAppClick}\n onNavigate={() => setOpen(false)}\n />\n );\n })}\n </ul>\n ) : null}\n\n {locked.length > 0 ? (\n <>\n {entitled.length > 0 ? (\n <div className=\"my-1 border-t border-border/50\" />\n ) : null}\n <p className=\"text-mono px-3 py-1.5 text-[10px] font-semibold tracking-[0.18em] text-muted-foreground/70 uppercase\">\n {t(\"Available\")}</p>\n <ul className=\"space-y-0.5 p-1 pt-0\">\n {locked.map((app) => {\n const navIndex = findNavIndex(navigableHrefs, app);\n return (\n <AppRow\n key={app.key}\n app={app}\n orgSlug={orgSlug}\n highlighted={navIndex === activeIndex}\n onMouseEnter={() => {\n if (navIndex !== -1) {\n setActiveIndex(navIndex);\n }\n }}\n onLockedAppClick={onLockedAppClick}\n onNavigate={() => setOpen(false)}\n />\n );\n })}\n </ul>\n </>\n ) : null}\n </div>\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction findNavIndex(\n navigable: Array<{ app: CboxAppLink; isLocked: boolean }>,\n app: CboxAppLink,\n): number {\n return navigable.findIndex((n) => n.app.key === app.key);\n}\n\ntype AppRowProps = {\n app: CboxAppLink;\n orgSlug: string | undefined;\n highlighted: boolean;\n onMouseEnter: () => void;\n onLockedAppClick: AppSwitcherProps['onLockedAppClick'];\n onNavigate: () => void;\n};\n\nfunction AppRow({\n app,\n orgSlug,\n highlighted,\n onMouseEnter,\n onLockedAppClick,\n onNavigate,\n}: AppRowProps): ReactNode {\n const { t } = useCboxLocalization();\n const isComingSoon = app.comingSoon === true;\n const isLocked = app.entitled === false || isComingSoon;\n\n const monogram = app.monogram ?? app.name.slice(0, 1).toUpperCase();\n const accent = app.accentColor;\n const tileStyle =\n accent !== undefined && secureIconUrl(app.iconUrl) === null\n ? { backgroundColor: accent, color: '#fff', borderColor: accent }\n : undefined;\n\n // Land directly on `<app>/org/<slug>` — same convention as AppLauncher.\n // Skip the URL transform for the current app: the user is already there.\n const href =\n orgSlug !== undefined && app.current !== true\n ? buildOrgUrl(app.url, orgSlug)\n : app.url;\n\n const tile = (\n <div\n style={tileStyle}\n className={cn(\n 'flex h-9 w-9 shrink-0 items-center justify-center rounded-md border border-border bg-card text-[13px] font-semibold text-foreground',\n app.current && 'ring-2 ring-accent-edge ring-offset-1 ring-offset-popover',\n isLocked && 'opacity-60 grayscale',\n )}\n >\n <CboxAppIcon name={app.name} iconUrl={app.iconUrl} iconDarkUrl={app.iconDarkUrl} className=\"h-5 w-5\" fallback={<span>{monogram}</span>} />\n </div>\n );\n\n const body = (\n <div className=\"flex min-w-0 flex-1 flex-col leading-tight\">\n <div className=\"flex items-center gap-2\">\n <span\n className={cn(\n 'truncate text-sm font-medium text-foreground',\n isLocked && 'text-muted-foreground',\n )}\n >\n {app.name}\n </span>\n {app.current ? (\n <span className=\"text-mono shrink-0 rounded-sm border border-accent-edge/40 bg-accent-soft px-1 text-[9px] font-semibold tracking-[0.14em] text-accent uppercase\">\n {t(\"current\")}</span>\n ) : null}\n </div>\n {app.description ? (\n <span\n className={cn(\n 'truncate text-[11px]',\n isLocked ? 'text-muted-foreground/70' : 'text-muted-foreground',\n )}\n >\n {app.description}\n </span>\n ) : null}\n </div>\n );\n\n const trailing = isComingSoon ? (\n <span className=\"text-mono shrink-0 rounded-sm border border-border bg-secondary px-1.5 py-0.5 text-[9px] font-semibold tracking-[0.14em] text-muted-foreground uppercase\">\n {t(\"soon\")}</span>\n ) : isLocked ? (\n <span className=\"flex shrink-0 items-center gap-1 text-[10px] font-medium text-muted-foreground\">\n <Lock />\n {t(\"Add\")}</span>\n ) : null;\n\n if (isComingSoon) {\n return (\n <li>\n <div\n aria-disabled\n className=\"flex w-full cursor-not-allowed items-center gap-3 rounded-md px-2.5 py-2\"\n title={t('{name} — coming soon', {name: app.name})}\n >\n {tile}\n {body}\n {trailing}\n </div>\n </li>\n );\n }\n\n if (isLocked) {\n return (\n <li>\n <button\n type=\"button\"\n onMouseEnter={onMouseEnter}\n onClick={() => {\n onLockedAppClick?.(app);\n onNavigate();\n }}\n className={cn(\n 'group flex w-full items-center gap-3 rounded-md px-2.5 py-2 text-left transition-colors',\n highlighted && 'bg-secondary',\n onLockedAppClick !== undefined\n ? 'hover:bg-secondary'\n : 'cursor-default',\n )}\n title={t('Add {name} to your plan', {name: app.name})}\n >\n {tile}\n {body}\n {trailing}\n </button>\n </li>\n );\n }\n\n // Current app: render as a div (no navigation needed — user is already here).\n if (app.current === true) {\n return (\n <li>\n <div\n onMouseEnter={onMouseEnter}\n className=\"flex w-full items-center gap-3 rounded-md bg-accent-soft px-2.5 py-2\"\n >\n {tile}\n {body}\n {trailing}\n </div>\n </li>\n );\n }\n\n return (\n <li>\n <a\n href={href}\n onMouseEnter={onMouseEnter}\n onClick={onNavigate}\n className={cn(\n 'group flex w-full items-center gap-3 rounded-md px-2.5 py-2 transition-colors hover:bg-secondary',\n highlighted && 'bg-secondary',\n )}\n >\n {tile}\n {body}\n {trailing}\n </a>\n </li>\n );\n}\n\nfunction buildOrgUrl(url: string, orgSlug: string): string {\n if (url === '' || orgSlug === '') {\n return url;\n }\n try {\n const u = new URL(url);\n u.pathname = `/org/${encodeURIComponent(orgSlug)}`;\n return u.toString();\n } catch {\n return `${url.replace(/\\/$/, '')}/org/${encodeURIComponent(orgSlug)}`;\n }\n}\n\nfunction Chevron(): ReactNode {\n return (\n <svg\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 10 10\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden\n >\n <path\n d=\"M2 4l3 3 3-3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction SearchIcon(): ReactNode {\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n className=\"shrink-0 text-muted-foreground\"\n >\n <circle cx=\"5.25\" cy=\"5.25\" r=\"3.25\" />\n <path d=\"M8 8l2 2\" />\n </svg>\n );\n}\n\nfunction Lock(): ReactNode {\n return (\n <svg\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n >\n <rect x=\"2.5\" y=\"5\" width=\"7\" height=\"5\" rx=\"1\" />\n <path d=\"M4 5V3.5a2 2 0 1 1 4 0V5\" />\n </svg>\n );\n}\n","import type { LucideIcon } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport { cn } from '../utils/cn';\n\ntype EmptyStateProps = {\n icon?: LucideIcon;\n title: ReactNode;\n description?: ReactNode;\n action?: ReactNode;\n className?: string;\n};\n\n/**\n * Centered empty state with an optional icon block, title, body\n * lede, and a single CTA slot.\n */\nexport function EmptyState({\n icon: Icon,\n title,\n description,\n action,\n className,\n}: EmptyStateProps) {\n return (\n <div\n className={cn(\n 'flex flex-col items-center justify-center gap-3 px-6 py-12 text-center',\n className,\n )}\n >\n {Icon ? (\n <div className=\"flex h-10 w-10 items-center justify-center rounded-md bg-secondary text-muted-foreground\">\n <Icon className=\"h-4 w-4\" strokeWidth={1.6} />\n </div>\n ) : null}\n <div className=\"space-y-1\">\n <h3 className=\"text-base font-semibold text-foreground\">\n {title}\n </h3>\n {description ? (\n <p className=\"max-w-sm text-sm text-muted-foreground\">\n {description}\n </p>\n ) : null}\n </div>\n {action ? <div className=\"pt-1\">{action}</div> : null}\n </div>\n );\n}\n","import { cn } from '../utils/cn';\n\ntype Tone =\n | 'neutral'\n | 'info'\n | 'success'\n | 'warning'\n | 'destructive'\n | 'muted';\n\nconst toneStyles: Record<Tone, string> = {\n neutral: 'border-border bg-secondary text-secondary-foreground',\n info: 'border-info/20 bg-info-soft text-info',\n success: 'border-success/20 bg-success-soft text-success',\n warning: 'border-warning/20 bg-warning-soft text-warning',\n destructive: 'border-destructive/20 bg-destructive-soft text-destructive',\n muted: 'border-border bg-card text-muted-foreground',\n};\n\nconst dotStyles: Record<Tone, string> = {\n neutral: 'bg-muted-foreground',\n info: 'bg-info',\n success: 'bg-success',\n warning: 'bg-warning',\n destructive: 'bg-destructive',\n muted: 'bg-muted-foreground/60',\n};\n\ntype StatusPillProps = {\n children: React.ReactNode;\n tone?: Tone;\n className?: string;\n /** Show a small dot before the label for \"live status\" feel. */\n dot?: boolean;\n};\n\n/**\n * Compact pill for plan tier, role, status, etc. Rounded-full like\n * Cortex's \"Running\"/\"Production\" tags. Sized for tabular density,\n * not editorial impact.\n */\nexport function StatusPill({\n children,\n tone = 'neutral',\n className,\n dot = false,\n}: StatusPillProps) {\n return (\n <span\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-full border px-2 py-0.5 text-[11px] leading-none font-medium',\n toneStyles[tone],\n className,\n )}\n >\n {dot ? (\n <span\n className={cn('h-1.5 w-1.5 rounded-full', dotStyles[tone])}\n />\n ) : null}\n {children}\n </span>\n );\n}\n","import { useCboxLocalization } from '../context/localization';\nimport { X } from 'lucide-react';\nimport {\n useCallback,\n useEffect,\n useRef,\n type ReactNode,\n} from 'react';\nimport { cn } from '../utils/cn';\n\ntype Props = {\n open: boolean;\n onClose: () => void;\n /** Title rendered in the modal header. */\n title: ReactNode;\n /** Optional eyebrow above the title. */\n eyebrow?: ReactNode;\n /** Right-side header slot — typically a small action cluster\n * (filters, \"open in new tab\", search input). */\n headerActions?: ReactNode;\n /** Optional bottom bar — e.g. \"showing 50 of 312\" + pagination. */\n footer?: ReactNode;\n /** Modal width. Default `wide` (~960px) suits inbox-style lists.\n * `spotlight` is the search-modal width, narrower + top-aligned. */\n size?: 'wide' | 'spotlight';\n children: ReactNode;\n};\n\n/**\n * Cbox cross-app surface modal. Identical chrome across every\n * surface — only `title`, `headerActions`, `children`, `footer`\n * vary. Surfaces compose this; hosts never instantiate it\n * directly.\n *\n * Behaviour:\n * - ESC key dismisses\n * - click on the backdrop dismisses\n * - focus is trapped inside the dialog while open\n * - body scroll locks while open (page underneath stays put)\n * - first focusable element inside auto-focuses on open\n *\n * The modal mounts a sibling portal-style div that's a direct\n * child of `<body>` (via fixed positioning + z-index) so it\n * escapes any positioned ancestor in the host page tree.\n */\nexport function SurfaceModal({\n open,\n onClose,\n title,\n eyebrow,\n headerActions,\n footer,\n size = 'wide',\n children,\n}: Props) {\n const { t } = useCboxLocalization();\n const dialogRef = useRef<HTMLDivElement | null>(null);\n const previousFocusRef = useRef<HTMLElement | null>(null);\n\n // Lock body scroll while open. Restore the page's previous\n // scrollbar gutter to avoid layout shift.\n useEffect(() => {\n if (!open) return;\n const original = document.body.style.overflow;\n const gutter = window.innerWidth - document.documentElement.clientWidth;\n document.body.style.overflow = 'hidden';\n if (gutter > 0) {\n document.body.style.paddingRight = `${gutter}px`;\n }\n return () => {\n document.body.style.overflow = original;\n document.body.style.paddingRight = '';\n };\n }, [open]);\n\n // ESC dismiss + focus trap.\n useEffect(() => {\n if (!open) return;\n previousFocusRef.current = document.activeElement as HTMLElement | null;\n\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n onClose();\n return;\n }\n if (e.key === 'Tab' && dialogRef.current !== null) {\n const focusable = dialogRef.current.querySelectorAll<HTMLElement>(\n 'a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex=\"-1\"])',\n );\n if (focusable.length === 0) return;\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n if (first === undefined || last === undefined) return;\n if (e.shiftKey && document.activeElement === first) {\n e.preventDefault();\n last.focus();\n } else if (!e.shiftKey && document.activeElement === last) {\n e.preventDefault();\n first.focus();\n }\n }\n };\n document.addEventListener('keydown', onKey);\n\n // Auto-focus the first focusable element so keyboard users\n // land inside the dialog without an extra Tab.\n const id = window.setTimeout(() => {\n const focusable = dialogRef.current?.querySelector<HTMLElement>(\n 'input, button, [tabindex]:not([tabindex=\"-1\"])',\n );\n focusable?.focus();\n }, 50);\n\n return () => {\n document.removeEventListener('keydown', onKey);\n window.clearTimeout(id);\n previousFocusRef.current?.focus?.();\n };\n }, [open, onClose]);\n\n const onBackdrop = useCallback(\n (e: React.MouseEvent) => {\n if (e.target === e.currentTarget) onClose();\n },\n [onClose],\n );\n\n if (!open) return null;\n\n return (\n <div\n role=\"presentation\"\n onMouseDown={onBackdrop}\n className={cn(\n 'fixed inset-0 z-50 flex animate-in fade-in duration-150',\n size === 'spotlight'\n ? 'items-start justify-center pt-[10vh]'\n : 'items-center justify-center px-4 py-[5vh]',\n 'bg-foreground/40 backdrop-blur-sm',\n )}\n >\n <div\n ref={dialogRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={typeof title === 'string' ? title : undefined}\n className={cn(\n 'flex max-h-full w-full flex-col overflow-hidden rounded-lg border border-border bg-background text-foreground shadow-2xl',\n 'animate-in zoom-in-95 slide-in-from-bottom-2 duration-150',\n size === 'spotlight'\n ? 'max-w-[640px]'\n : 'max-w-[960px]',\n )}\n >\n <header className=\"flex shrink-0 items-start gap-3 border-b border-border/70 bg-background/80 px-5 py-4 backdrop-blur-md\">\n <div className=\"min-w-0 flex-1\">\n {eyebrow !== undefined ? (\n <p className=\"text-mono text-[10px] font-semibold tracking-[0.18em] uppercase text-muted-foreground\">\n {eyebrow}\n </p>\n ) : null}\n <h2 className=\"text-base font-semibold tracking-tight text-foreground\">\n {title}\n </h2>\n </div>\n {headerActions !== undefined ? (\n <div className=\"flex shrink-0 items-center gap-2\">\n {headerActions}\n </div>\n ) : null}\n <button\n type=\"button\"\n onClick={onClose}\n className=\"ml-1 inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-secondary hover:text-foreground\"\n aria-label={t(\"Close\")}\n >\n <X className=\"h-4 w-4\" strokeWidth={1.8} />\n </button>\n </header>\n\n <div className=\"flex-1 overflow-y-auto\">{children}</div>\n\n {footer !== undefined ? (\n <footer className=\"flex shrink-0 items-center justify-between gap-3 border-t border-border/70 bg-background/80 px-5 py-3 text-xs text-muted-foreground backdrop-blur-md\">\n {footer}\n </footer>\n ) : null}\n </div>\n </div>\n );\n}\n","import { useCboxLocalization } from '../context/localization';\nimport { useEffect, useState } from 'react';\nimport { useCboxIdOptional } from '../context/cbox-id';\nimport { EmptyState } from '../primitives/empty-state';\nimport { StatusPill } from '../primitives/status-pill';\nimport { useTransport } from './surface-state';\nimport { SurfaceModal } from './surface-modal';\nimport type { Transport } from './types';\n\ntype InboxItem = {\n id: string;\n event_type: string;\n severity: 'info' | 'warning' | 'critical';\n data: Record<string, unknown> | null;\n subject_type: string | null;\n subject_id: string | null;\n created_at: string;\n read_at: string | null;\n};\n\ntype Inbox = {\n recipient: { external_id: string; display_name: string | null } | null;\n items: InboxItem[];\n unread_count: number;\n};\n\ntype Props = {\n open: boolean;\n onClose: () => void;\n};\n\nconst TONES: Record<\n InboxItem['severity'],\n 'info' | 'warning' | 'destructive'\n> = {\n info: 'info',\n warning: 'warning',\n critical: 'destructive',\n};\n\n/**\n * Full inbox modal — opened from the bell popover's \"See all\"\n * affordance. Renders inline over the host page so the user\n * never leaves their app context to read or manage notifications.\n *\n * Data flows:\n * - Initial load: GET /api/v1/recipients/{id_user_id}/inbox via\n * transport.getToken('notifications')\n * - Mark-read: POST /api/v1/recipients/{id}/notifications/{nid}/read\n * (optimistic; reverts on failure)\n * - Realtime hooks land in a follow-up session\n * (notifications.user.{id}.created topic)\n */\nexport function InboxSurface({ open, onClose }: Props) {\n const { t, formatDate } = useCboxLocalization();\n const transport = useTransport();\n const cboxId = useCboxIdOptional();\n const [inbox, setInbox] = useState<Inbox | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [filter, setFilter] = useState<'all' | 'unread'>('all');\n\n const userId = cboxId?.user.id ?? null;\n const baseUrl = transport.urls.notifications ?? null;\n\n useEffect(() => {\n if (!open || userId === null || baseUrl === null) return;\n let cancelled = false;\n const load = async () => {\n setLoading(true);\n setError(null);\n try {\n const headers = await authHeaders(transport, 'notifications');\n const response = await fetch(\n `${baseUrl}/api/v1/recipients/${userId}/inbox?limit=100`,\n { headers, credentials: 'include' },\n );\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n const body = (await response.json()) as Inbox;\n if (!cancelled) setInbox(body);\n } catch (e) {\n if (!cancelled) {\n setError(e instanceof Error ? e.message : t('Load failed'));\n }\n } finally {\n if (!cancelled) setLoading(false);\n }\n };\n void load();\n return () => {\n cancelled = true;\n };\n }, [open, userId, baseUrl, transport]);\n\n const markRead = async (id: string) => {\n if (inbox === null || userId === null || baseUrl === null) return;\n // Optimistic\n const prev = inbox;\n setInbox({\n ...inbox,\n items: inbox.items.map((it) =>\n it.id === id\n ? { ...it, read_at: new Date().toISOString() }\n : it,\n ),\n unread_count: Math.max(0, inbox.unread_count - 1),\n });\n try {\n const headers = await authHeaders(transport, 'notifications');\n const csrf = transport.csrfToken?.();\n if (csrf !== undefined && csrf !== '') {\n headers['X-CSRF-TOKEN'] = csrf;\n headers['X-Requested-With'] = 'XMLHttpRequest';\n }\n const response = await fetch(\n `${baseUrl}/api/v1/recipients/${userId}/notifications/${id}/read`,\n {\n method: 'POST',\n headers,\n credentials: 'include',\n },\n );\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n } catch {\n setInbox(prev);\n }\n };\n\n const items = inbox?.items ?? [];\n const filtered =\n filter === 'unread' ? items.filter((i) => i.read_at === null) : items;\n\n const unread = inbox?.unread_count ?? 0;\n\n return (\n <SurfaceModal\n open={open}\n onClose={onClose}\n eyebrow={t(\"Notifications\")}\n title={\n unread > 0 ? t('Inbox · {count} unread', {count: unread}) : t('Inbox · all caught up')\n }\n headerActions={\n <div className=\"flex items-center gap-2\">\n <FilterTab\n active={filter === 'all'}\n onClick={() => setFilter('all')}\n >\n {t(\"All\")}</FilterTab>\n <FilterTab\n active={filter === 'unread'}\n onClick={() => setFilter('unread')}\n >\n {t(\"Unread\")}</FilterTab>\n </div>\n }\n footer={\n inbox !== null && baseUrl !== null ? (\n <>\n <span>\n {t('Showing {shown} of {total}.', {shown: filtered.length, total: items.length})}\n </span>\n <a\n href={`${baseUrl}/inbox`}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"font-medium text-foreground hover:underline\"\n >\n {t(\"Open in new tab ↗\")}</a>\n </>\n ) : (\n <span>—</span>\n )\n }\n >\n {error !== null ? (\n <div className=\"px-5 py-8 text-center\">\n <p className=\"text-sm font-medium text-destructive\">\n {t(\"Couldn't load inbox\")}</p>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n {error}\n </p>\n </div>\n ) : loading && inbox === null ? (\n <div className=\"px-5 py-12 text-center text-sm text-muted-foreground\">\n {t(\"Loading…\")}</div>\n ) : filtered.length === 0 ? (\n <div className=\"px-5 py-12\">\n <EmptyState\n title={\n filter === 'unread'\n ? t('No unread notifications')\n : t('No notifications yet')\n }\n description={t(\"When a Cbox app sends you something — invitation accepted, billing event, security alert — it lands here.\")}\n />\n </div>\n ) : (\n <ul className=\"divide-y divide-border/70\">\n {filtered.map((item) => {\n const data = (item.data ?? {}) as Record<\n string,\n string | undefined\n >;\n const ctaUrl = data.cta_url;\n const InnerWrapper = ({\n children,\n }: {\n children: React.ReactNode;\n }) =>\n ctaUrl !== undefined && ctaUrl !== '' ? (\n <a\n href={ctaUrl}\n className=\"block transition-colors hover:bg-secondary/40\"\n >\n {children}\n </a>\n ) : (\n <div>{children}</div>\n );\n\n return (\n <li\n key={item.id}\n className={\n item.read_at === null\n ? 'bg-secondary/20'\n : ''\n }\n >\n <InnerWrapper>\n <div className=\"flex items-start gap-3 px-5 py-3\">\n <StatusPill\n tone={TONES[item.severity]}\n dot\n >\n {item.severity}\n </StatusPill>\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium text-foreground\">\n {data.title ??\n item.event_type}\n </p>\n {(data.body ?? '') !== '' ? (\n <p className=\"mt-0.5 line-clamp-2 text-xs text-muted-foreground\">\n {data.body}\n </p>\n ) : null}\n <p className=\"text-mono mt-1 text-[10px] text-muted-foreground\">\n {item.event_type}\n {' · '}\n {formatDate(item.created_at)}\n </p>\n </div>\n {item.read_at === null ? (\n <button\n type=\"button\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n void markRead(item.id);\n }}\n className=\"shrink-0 rounded-md border border-border bg-card px-2 py-1 text-xs font-medium text-foreground transition-colors hover:border-border-strong\"\n aria-label={t(\"Mark as read\")}\n >\n {t(\"Mark read\")}</button>\n ) : null}\n </div>\n </InnerWrapper>\n </li>\n );\n })}\n </ul>\n )}\n </SurfaceModal>\n );\n}\n\n/**\n * Build request headers for a transport call. If the host's\n * `getToken` returns a non-empty bearer, it's attached. If it\n * returns an empty string, the surface assumes same-origin cookie\n * auth — the host is proxying the request through its own session.\n *\n * Either model is supported because hosts pick their security\n * trade-off: same-origin proxy keeps M2M tokens server-side; direct\n * CORS to notifications.cbox.systems is faster but exposes the\n * audience-bound bearer to the page.\n */\nasync function authHeaders(\n transport: Transport,\n audience: string,\n): Promise<Record<string, string>> {\n const headers: Record<string, string> = {\n Accept: 'application/json',\n };\n try {\n const { token } = await transport.getToken(audience);\n if (token !== '') {\n headers.Authorization = `Bearer ${token}`;\n }\n } catch {\n // Empty token / failure → fall back to cookie auth.\n }\n return headers;\n}\n\nfunction FilterTab({\n active,\n onClick,\n children,\n}: {\n active: boolean;\n onClick: () => void;\n children: React.ReactNode;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={\n active\n ? 'rounded-md bg-secondary px-2 py-1 text-xs font-medium text-foreground'\n : 'rounded-md px-2 py-1 text-xs font-medium text-muted-foreground hover:bg-secondary/60 hover:text-foreground'\n }\n aria-pressed={active}\n >\n {children}\n </button>\n );\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useState,\n type ReactNode,\n} from 'react';\nimport { InboxSurface } from './inbox-surface';\nimport type {\n CboxSurfacesProps,\n SurfaceArgs,\n SurfaceController,\n SurfaceId,\n Transport,\n} from './types';\n\nconst TransportContext = createContext<Transport | null>(null);\nconst SurfaceContext = createContext<SurfaceController | null>(null);\n\n/**\n * Mount the cbox-ui surface runtime once per app, alongside the\n * page tree. The host's chrome (bell, search trigger) reads\n * `useCboxSurfaces()` to open surfaces; cbox-ui renders the\n * active one as a modal/drawer over the page.\n *\n * Exactly one CboxSurfaces should be in the tree — typically right\n * inside CboxAppShell. Multiple instances would race their state\n * machines.\n */\nexport function CboxSurfaces({\n transport,\n surfaces,\n config,\n children,\n}: CboxSurfacesProps) {\n void config; // reserved for per-surface customisation; unused in v1\n const enabled = useMemo(() => new Set(surfaces), [surfaces]);\n const [active, setActive] = useState<{\n id: SurfaceId;\n args?: SurfaceArgs[SurfaceId];\n } | null>(null);\n\n const open = useCallback(\n <K extends SurfaceId>(id: K, args?: SurfaceArgs[K]) => {\n if (!enabled.has(id)) {\n console.warn(\n `[cbox-ui] surface \"${id}\" is not enabled in this host. Add it to <CboxSurfaces surfaces={[…]}>.`,\n );\n return;\n }\n setActive({ id, args });\n },\n [enabled],\n );\n\n const close = useCallback(() => setActive(null), []);\n\n const controller = useMemo<SurfaceController>(\n () => ({\n activeSurface: active?.id ?? null,\n open,\n close,\n }),\n [active, open, close],\n );\n\n return (\n <TransportContext.Provider value={transport}>\n <SurfaceContext.Provider value={controller}>\n {children}\n\n {/*\n * Active surface renders as a sibling of the page\n * tree. Each surface owns its own portal-style fixed\n * positioning so it escapes any positioned ancestor.\n * Only one surface is mounted at a time.\n */}\n <InboxSurface\n open={active?.id === 'inbox'}\n onClose={close}\n />\n {/* Search / activity / help surfaces will render here\n * as additional `<Surface open={…} onClose={…} />`\n * lines once shipped. They're additive — adding a\n * new surface doesn't change anything in hosts. */}\n </SurfaceContext.Provider>\n </TransportContext.Provider>\n );\n}\n\n/**\n * Imperative API for triggering surfaces from anywhere in the\n * host page. The bell-popover's \"See all\" calls\n * `useCboxSurfaces().open('inbox')` instead of navigating.\n */\nexport function useCboxSurfaces(): SurfaceController {\n const ctx = useContext(SurfaceContext);\n if (ctx === null) {\n throw new Error(\n '[cbox-ui] useCboxSurfaces must be used inside <CboxSurfaces>. Did the host forget to mount it?',\n );\n }\n return ctx;\n}\n\n/**\n * Optional variant — returns `null` when no `<CboxSurfaces>` host is\n * mounted. Chrome controls (bell, search trigger) use this to\n * degrade gracefully to cross-app navigation when the host hasn't\n * opted into the surface runtime yet.\n */\nexport function useCboxSurfacesOptional(): SurfaceController | null {\n return useContext(SurfaceContext);\n}\n\n/**\n * Read-only access to the host-supplied transport. Internal —\n * surface implementations call this; host code shouldn't need it.\n */\nexport function useTransport(): Transport {\n const t = useContext(TransportContext);\n if (t === null) {\n throw new Error(\n '[cbox-ui] useTransport must be used inside <CboxSurfaces>.',\n );\n }\n return t;\n}\n","import { useCboxLocalization } from '../context/localization';\nimport { useEffect, useRef, useState, type ReactNode } from 'react';\nimport { useCboxIdOptional } from '../context/cbox-id';\nimport type { CboxNotificationPreviewItem } from '../context/cbox-id';\nimport { useCboxSurfacesOptional } from '../surfaces/surface-state';\nimport { cn } from '../utils/cn';\n\n/**\n * Bell with unread-count badge + popover preview. Click opens a\n * dropdown with the last 5 items inline (no navigation), each with\n * an inline mark-read action and an optional deep-link to the page\n * that originated the notification. \"See all\" at the bottom links\n * to the central notifications service inbox — the only navigation\n * away from the host app.\n *\n * Pattern matches Linear / GitHub / Stripe: glance + mark-read\n * without leaving context; cross-app jump only when the user\n * explicitly wants the full list.\n *\n * Renders nothing if the context is missing or notifications\n * aren't configured (eg pre-auth pages).\n */\nexport function NotificationsBell({ className }: { className?: string }) {\n const { t, formatDate } = useCboxLocalization();\n const ctx = useCboxIdOptional();\n const surfaces = useCboxSurfacesOptional();\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement | null>(null);\n\n useEffect(() => {\n if (!open) return;\n const onDocClick = (e: MouseEvent) => {\n const target = e.target;\n if (\n target instanceof Node &&\n ref.current !== null &&\n !ref.current.contains(target)\n ) {\n setOpen(false);\n }\n };\n const onEsc = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setOpen(false);\n };\n document.addEventListener('mousedown', onDocClick);\n document.addEventListener('keydown', onEsc);\n return () => {\n document.removeEventListener('mousedown', onDocClick);\n document.removeEventListener('keydown', onEsc);\n };\n }, [open]);\n\n // Render the bell even when notifications aren't wired up (null/undefined)\n // so the chrome is visually identical across all apps. The button is\n // inert (no popover opens) when there's no data.\n const notificationsData = ctx === null ? null : (ctx.notifications ?? null);\n\n if (ctx === null) {\n return null;\n }\n\n // Render a static bell icon when there's no notifications data yet.\n if (notificationsData === null) {\n return (\n <div className={cn('relative', className)}>\n <button\n type=\"button\"\n aria-label={t(\"Notifications\")}\n disabled\n className=\"relative flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground opacity-60 cursor-default\"\n >\n <Bell />\n </button>\n </div>\n );\n }\n\n const { unreadCount, inboxUrl, previewItems, markReadUrl } =\n notificationsData;\n const display = unreadCount > 99 ? '99+' : unreadCount.toString();\n\n return (\n <div ref={ref} className={cn('relative', className)}>\n <button\n type=\"button\"\n onClick={() => setOpen((v) => !v)}\n aria-label={\n unreadCount > 0\n ? t('{count} unread notifications', {count: unreadCount})\n : t('Notifications')\n }\n aria-expanded={open}\n aria-haspopup=\"menu\"\n className=\"relative flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-secondary hover:text-foreground data-[open=true]:bg-secondary data-[open=true]:text-foreground\"\n data-open={open ? 'true' : 'false'}\n >\n <Bell />\n {unreadCount > 0 ? (\n <span className=\"absolute -right-0.5 -top-0.5 flex min-w-[16px] items-center justify-center rounded-full bg-destructive px-1 text-[9px] font-semibold leading-4 text-destructive-foreground\">\n {display}\n </span>\n ) : null}\n </button>\n\n {open ? (\n <div\n role=\"menu\"\n className=\"absolute right-0 z-30 mt-2 w-[360px] origin-top-right rounded-md border border-border bg-popover text-popover-foreground shadow-lg\"\n >\n <header className=\"flex items-center justify-between border-b border-border/70 px-3 py-2\">\n <span className=\"text-mono text-[10px] font-semibold tracking-[0.18em] uppercase text-muted-foreground\">\n {t(\"Notifications\")}</span>\n {unreadCount > 0 ? (\n <span className=\"text-mono text-[10px] tabular-nums text-muted-foreground\">\n {t('{count} unread', {count: unreadCount})}</span>\n ) : null}\n </header>\n\n <div className=\"max-h-[420px] overflow-y-auto\">\n {previewItems === undefined ||\n previewItems.length === 0 ? (\n <div className=\"px-3 py-8 text-center\">\n <p className=\"text-sm font-medium text-foreground\">\n {t(\"All caught up\")}</p>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n {t(\"No recent notifications.\")}</p>\n </div>\n ) : (\n <ul className=\"divide-y divide-border/70\">\n {previewItems.map((item) => (\n <PreviewRow\n key={item.id}\n item={item}\n markReadUrl={markReadUrl}\n onMarkedRead={() => setOpen(false)}\n />\n ))}\n </ul>\n )}\n </div>\n\n {surfaces !== null ? (\n <button\n type=\"button\"\n onClick={() => {\n setOpen(false);\n surfaces.open('inbox');\n }}\n className=\"flex w-full items-center justify-center border-t border-border/70 px-3 py-2 text-xs font-medium text-foreground transition-colors hover:bg-secondary\"\n >\n {t(\"See all notifications →\")}</button>\n ) : (\n <a\n href={inboxUrl}\n className=\"flex items-center justify-center border-t border-border/70 px-3 py-2 text-xs font-medium text-foreground transition-colors hover:bg-secondary\"\n >\n {t(\"See all notifications →\")}</a>\n )}\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction PreviewRow({\n item,\n markReadUrl,\n onMarkedRead,\n}: {\n item: CboxNotificationPreviewItem;\n markReadUrl?: string;\n onMarkedRead: () => void;\n}) {\n const { t, formatDate } = useCboxLocalization();\n const tone =\n item.severity === 'critical'\n ? 'bg-destructive'\n : item.severity === 'warning'\n ? 'bg-warning'\n : 'bg-info';\n\n const ts = (() => {\n try {\n return formatDate(item.createdAt);\n } catch {\n return item.createdAt;\n }\n })();\n\n const markRead = async (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (markReadUrl === undefined || markReadUrl === '') return;\n const url = markReadUrl.replace('{id}', item.id);\n const csrf =\n document\n .querySelector<HTMLMetaElement>('meta[name=\"csrf-token\"]')\n ?.content ?? '';\n try {\n await fetch(url, {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n 'X-CSRF-TOKEN': csrf,\n 'X-Requested-With': 'XMLHttpRequest',\n },\n });\n } catch {\n // Non-fatal — the user can re-open the dropdown.\n }\n onMarkedRead();\n };\n\n const Wrapper = ({ children }: { children: ReactNode }) =>\n item.ctaUrl !== null && item.ctaUrl !== undefined && item.ctaUrl !== ''\n ? (\n <a\n href={item.ctaUrl}\n className=\"block transition-colors hover:bg-secondary/50\"\n >\n {children}\n </a>\n )\n : <div>{children}</div>;\n\n return (\n <li className={item.readAt === null ? 'bg-secondary/20' : ''}>\n <Wrapper>\n <div className=\"flex items-start gap-2 px-3 py-2.5\">\n <span\n aria-hidden\n className={cn(\n 'mt-1.5 h-1.5 w-1.5 shrink-0 rounded-full',\n tone,\n )}\n />\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-[13px] font-medium text-foreground\">\n {item.title}\n </p>\n {item.body !== undefined && item.body !== null && item.body !== '' ? (\n <p className=\"mt-0.5 line-clamp-2 text-xs text-muted-foreground\">\n {item.body}\n </p>\n ) : null}\n <p className=\"text-mono mt-1 text-[10px] text-muted-foreground\">\n {ts}\n </p>\n </div>\n {item.readAt === null ? (\n <button\n type=\"button\"\n onClick={markRead}\n className=\"shrink-0 rounded-md px-2 py-1 text-[10px] font-medium text-muted-foreground transition-colors hover:bg-secondary hover:text-foreground\"\n aria-label={t(\"Mark as read\")}\n title={t(\"Mark as read\")}\n >\n ✓\n </button>\n ) : null}\n </div>\n </Wrapper>\n </li>\n );\n}\n\nfunction Bell(): ReactNode {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n aria-hidden\n >\n <path\n d=\"M4 6.5a4 4 0 1 1 8 0v2.4l1.2 2H2.8l1.2-2V6.5z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M6.5 12.5a1.5 1.5 0 0 0 3 0\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n","import { useCboxLocalization } from '../context/localization';\nimport { useEffect, useState } from 'react';\nimport { cn } from '../utils/cn';\n\ntype Props = {\n /** Click handler — typically dispatches the app's command-palette\n * open shortcut. Apps that don't have a palette yet pass a no-op\n * so the chrome stays visually consistent across the suite. */\n onOpen?: () => void;\n className?: string;\n label?: string;\n};\n\n/**\n * Topbar Search trigger — a visual-only command-palette button.\n *\n * Hosted in cbox-ui because every Cbox app's chrome must show the\n * same search affordance in the same spot, with the same width and\n * the same shortcut hint. Drift across apps means users see layout\n * shifts when tabbing between id / webhooks / cortex; that's a UX\n * tax we don't want to charge them.\n *\n * The actual palette stays per-app (commands differ); this primitive\n * just renders the trigger and dispatches `onOpen`.\n */\nexport function SearchTrigger({ onOpen, className, label }: Props) {\n const { t } = useCboxLocalization();\n const [shortcut, setShortcut] = useState('⌘K');\n useEffect(() => {\n if (typeof navigator === 'undefined') return;\n setShortcut(/Mac/.test(navigator.platform) ? '⌘K' : 'Ctrl K');\n }, []);\n\n return (\n <button\n type=\"button\"\n onClick={onOpen}\n className={cn(\n 'hidden h-8 w-[180px] items-center gap-2 rounded-md border border-border bg-card pr-1.5 pl-2.5 text-xs text-muted-foreground transition-colors hover:border-border-strong hover:text-foreground sm:inline-flex',\n className,\n )}\n aria-label={t(\"Open command palette\")}\n >\n <SearchIcon />\n <span className=\"flex-1 text-left\">{label ?? t('Search')}</span>\n <kbd className=\"text-mono ml-1 rounded-sm border border-border bg-secondary px-1 py-0.5 text-[10px] font-medium tracking-tight text-muted-foreground\">\n {shortcut}\n </kbd>\n </button>\n );\n}\n\nfunction SearchIcon() {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n >\n <circle cx=\"11\" cy=\"11\" r=\"7\" />\n <path d=\"m21 21-4.3-4.3\" />\n </svg>\n );\n}\n","import { useCboxLocalization } from '../context/localization';\nimport { useState, type ReactNode } from 'react';\nimport { useCboxId } from '../context/cbox-id';\nimport type { LinkComponent } from '../layout/cbox-app-sidebar';\nimport { cn } from '../utils/cn';\n\ntype Props = {\n /**\n * App-specific menu items rendered above the standard\n * \"Manage account\" / \"Sign out\" set. Use sparingly — the goal\n * is consistency across apps.\n */\n extras?: ReactNode;\n placement?: 'bottom-end' | 'top-start';\n className?: string;\n /**\n * The router's link for the account and organization rows, when they are pages of this\n * app (an Inertia `Link` keeps the visit client-side). Default: a plain anchor, which is\n * right when the rows deep-link into Cbox ID on another origin.\n */\n LinkComponent?: LinkComponent;\n};\n\nconst Anchor: LinkComponent = ({ href, className, children }) => <a href={href} className={className}>{children}</a>;\n\n/**\n * User-menu dropdown. Always exposes:\n * - Manage account ↗ (deep-link into id)\n * - Team & billing ↗ (deep-link into id, current org scope)\n * - Sign out\n *\n * The arrows signal cross-app navigation — id is canonical.\n */\nexport function UserMenu({ extras, className, placement = 'bottom-end', LinkComponent: Link = Anchor }: Props) {\n const { t } = useCboxLocalization();\n const { user, currentOrganization, urls } = useCboxId();\n const [open, setOpen] = useState(false);\n\n const initials = user.name\n .split(/\\s+/)\n .filter(Boolean)\n .slice(0, 2)\n .map((n) => n[0]?.toUpperCase() ?? '')\n .join('');\n\n return (\n <div className={cn('relative', className)} onKeyDown={event => { if (event.key === \"Escape\") setOpen(false); }} onBlur={event => { if (!event.currentTarget.contains(event.relatedTarget)) setOpen(false); }}>\n <button\n type=\"button\"\n onClick={() => setOpen((v) => !v)}\n className=\"flex h-9 items-center gap-2 rounded-md px-1.5 hover:bg-secondary\"\n aria-label={t(\"Open user menu\")}\n aria-expanded={open}\n onKeyDown={event => { if (event.key === \"Escape\") setOpen(false); }}\n >\n {user.avatar_url ? (\n <img\n src={user.avatar_url}\n alt=\"\"\n className=\"h-7 w-7 rounded-full object-cover\"\n />\n ) : (\n <span className=\"flex h-7 w-7 items-center justify-center rounded-full bg-accent-soft text-[11px] font-semibold text-foreground\">\n {initials || '?'}\n </span>\n )}\n </button>\n {open ? (\n <div className={cn(\"absolute z-50 w-64 rounded-lg border border-border bg-popover p-1 shadow-md\", placement === \"top-start\" ? \"bottom-full left-0 mb-2\" : \"right-0 top-full mt-1\")}>\n <div className=\"px-2 py-2\">\n <p className=\"truncate text-sm font-medium text-foreground\">\n {user.name}\n </p>\n <p className=\"truncate text-xs text-muted-foreground\">\n {user.email}\n </p>\n </div>\n {extras ? (\n <>\n <div className=\"my-1 border-t border-border\" />\n {extras}\n </>\n ) : null}\n <div className=\"my-1 border-t border-border\" />\n <Link\n href={urls.accountUrl}\n className=\"flex items-center justify-between rounded-sm px-2 py-1.5 text-sm hover:bg-secondary\"\n >\n <span>{t(\"Manage account\")}</span>\n <CrossAppArrow />\n </Link>\n {urls.orgSettingsUrl && currentOrganization ? (\n <Link\n href={urls.orgSettingsUrl}\n className=\"flex items-center justify-between rounded-sm px-2 py-1.5 text-sm hover:bg-secondary\"\n >\n <span className=\"truncate\">\n {t(\"Team & billing\")}<span className=\"text-muted-foreground\"> · {currentOrganization.name}</span>\n </span>\n <CrossAppArrow />\n </Link>\n ) : null}\n <div className=\"my-1 border-t border-border\" />\n <form action={urls.signOutUrl} method=\"POST\">\n <SignOutCsrf />\n <button\n type=\"submit\"\n className=\"flex w-full items-center rounded-sm px-2 py-1.5 text-left text-sm hover:bg-secondary\"\n >\n {t(\"Sign out\")}</button>\n </form>\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction CrossAppArrow(): ReactNode {\n return (\n <svg\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 10 10\"\n fill=\"none\"\n aria-hidden\n >\n <path\n d=\"M3 7l4-4M3 3h4v4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction SignOutCsrf(): ReactNode {\n if (typeof document === 'undefined') return null;\n const csrf = document\n .querySelector<HTMLMetaElement>('meta[name=\"csrf-token\"]')\n ?.content;\n if (!csrf) return null;\n return <input type=\"hidden\" name=\"_token\" value={csrf} />;\n}\n","import { useCboxLocalization } from '../context/localization';\nimport { Menu, PanelLeftClose, PanelLeftOpen } from 'lucide-react';\nimport { useEffect, useState, type ReactNode } from 'react';\nimport { AppContent } from './app-content';\nimport { AppShell } from './app-shell';\nimport {\n CboxAppSidebar,\n type CboxNavSection,\n type LinkComponent,\n} from './cbox-app-sidebar';\nimport { CboxMobileNavDrawer } from './cbox-mobile-nav-drawer';\nimport { AppSwitcher } from '../components/app-switcher';\nimport { NotificationsBell } from '../components/notifications-bell';\nimport { SearchTrigger } from '../components/search-trigger';\nimport { UserMenu } from '../components/user-menu';\n\nexport type CboxAppShellProps = {\n /** App key — drives the brand submark + aria labels. */\n appKey: string;\n /** Override the submark text (defaults to appKey). */\n brandSubmark?: string | null;\n /** Asset base for brand pngs. Default `/brand`. */\n assetBase?: string;\n /** Brand row href (typically the app's home). */\n brandHref?: string;\n\n /** Sidebar nav config. */\n sections: CboxNavSection[];\n /** Active path — used by both sidebar (highlight) and topbar\n * (sidebar-collapse toggle aria state). */\n currentPath: string;\n /** Apps inject their router's Link primitive. */\n LinkComponent: LinkComponent;\n\n /** Persisted \"sidebar collapsed?\" state — owned by the host\n * (the cookie hook lives there). */\n sidebarCollapsed?: boolean;\n /** Click handler for the topbar collapse toggle. Hide the\n * toggle entirely by omitting this prop. */\n onToggleSidebar?: () => void;\n\n /**\n * Topbar centre slot — typically the org switcher / context\n * bar. Apps that aren't org-scoped (notifications, account\n * pages) leave this off.\n */\n topbarCentre?: ReactNode;\n\n /**\n * Handler to open the in-app command palette / search UI.\n * Always rendered — when omitted the trigger is a no-op so the\n * chrome stays visually identical across all apps regardless of\n * whether a palette has been wired up yet.\n */\n onSearchOpen?: () => void;\n\n /**\n * Override the right cluster on the topbar. Default:\n * `[<SearchTrigger>?] <AppLauncher /> <NotificationsBell /> <UserMenu />`.\n * Override only when an app needs a completely different mix.\n */\n topbarRightCluster?: ReactNode;\n\n children: ReactNode;\n};\n\n/**\n * Top-level Cbox application shell. Composes sidebar + topbar +\n * content into the single chrome shape every Cbox app wears.\n *\n * Apps reduce to ~30 lines of layout: define nav, render\n * `<CboxAppShell>{children}</CboxAppShell>`. No app should\n * compose `<AppShell>`/`<AppContent>`/sidebar/topbar manually —\n * drift is the whole reason this component exists.\n */\nexport function CboxAppShell({\n appKey,\n brandSubmark,\n assetBase,\n brandHref,\n sections,\n currentPath,\n LinkComponent,\n sidebarCollapsed = false,\n onToggleSidebar,\n topbarCentre,\n onSearchOpen,\n topbarRightCluster,\n children,\n}: CboxAppShellProps) {\n const { t } = useCboxLocalization();\n const ToggleIcon = sidebarCollapsed ? PanelLeftOpen : PanelLeftClose;\n const [mobileNavOpen, setMobileNavOpen] = useState(false);\n\n // Auto-close the mobile drawer on route change so the in-app\n // navigation feels native — apps don't need to wire this.\n useEffect(() => {\n setMobileNavOpen(false);\n }, [currentPath]);\n\n return (\n <AppShell>\n <CboxAppSidebar\n appKey={appKey}\n brandSubmark={brandSubmark}\n assetBase={assetBase}\n brandHref={brandHref}\n sections={sections}\n currentPath={currentPath}\n LinkComponent={LinkComponent}\n collapsed={sidebarCollapsed}\n />\n <CboxMobileNavDrawer\n open={mobileNavOpen}\n onClose={() => setMobileNavOpen(false)}\n appKey={appKey}\n brandSubmark={brandSubmark}\n assetBase={assetBase}\n brandHref={brandHref}\n sections={sections}\n currentPath={currentPath}\n LinkComponent={LinkComponent}\n />\n <AppContent>\n <header className=\"sticky top-0 z-20 flex h-14 shrink-0 items-center justify-between gap-3 border-b border-border/70 bg-background/80 px-4 backdrop-blur-md\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <button\n type=\"button\"\n onClick={() => setMobileNavOpen(true)}\n className=\"inline-flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-secondary hover:text-foreground lg:hidden\"\n aria-label={t(\"Open navigation\")}\n title={t(\"Open navigation\")}\n >\n <Menu className=\"h-4 w-4\" strokeWidth={1.8} />\n </button>\n {onToggleSidebar !== undefined ? (\n <button\n type=\"button\"\n onClick={onToggleSidebar}\n className=\"hidden h-8 w-8 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-secondary hover:text-foreground lg:inline-flex\"\n aria-label={\n sidebarCollapsed\n ? t('Expand sidebar')\n : t('Collapse sidebar')\n }\n title={\n sidebarCollapsed\n ? t('Expand sidebar')\n : t('Collapse sidebar')\n }\n >\n <ToggleIcon\n className=\"h-4 w-4\"\n strokeWidth={1.8}\n />\n </button>\n ) : null}\n <AppSwitcher />\n {topbarCentre !== undefined ? topbarCentre : null}\n </div>\n <div className=\"flex shrink-0 items-center gap-2\">\n {topbarRightCluster !== undefined ? (\n topbarRightCluster\n ) : (\n <>\n <SearchTrigger onOpen={onSearchOpen ?? (() => {})} />\n <NotificationsBell />\n <UserMenu />\n </>\n )}\n </div>\n </header>\n {children}\n </AppContent>\n </AppShell>\n );\n}\n","import { useCboxLocalization } from '../context/localization';\nimport {\n useEffect,\n useId,\n useRef,\n useState,\n type ComponentType,\n type ReactNode,\n} from 'react';\nimport { cn } from '../utils/cn';\n\n/**\n * ContextBar — the topbar breadcrumb-style context selector. One\n * crumb per level of context (org / project / environment / branch /\n * deployment). Each crumb renders as a chip (avatar + label +\n * chevron) and opens a dropdown with the items at that level plus\n * an optional \"+ New X\" footer.\n *\n * The pattern is the cloud-platform default — Vercel, Render, Forge,\n * GitHub, Stripe, Cortex all use it. Topbar carries identity and\n * context; sidebar carries navigation. The two never overlap.\n *\n * URL-driven by default — clicking a dropdown item navigates via the\n * supplied `LinkComponent`. Apps that need a non-navigational select\n * (post a form, mutate session state) pass `onSelect` instead.\n *\n * Separator between crumbs is a muted slash — same as Forge / Cortex.\n */\n\nexport type ContextAvatar = {\n /** 1–2 character monogram. Defaults to first letter of the label. */\n initials?: string;\n /**\n * Hex / CSS colour applied as the avatar's bg. Falls back to the\n * neutral chip when missing. Per-item override of the default.\n */\n accent?: string;\n /** Optional avatar image URL — overrides initials when set. */\n src?: string;\n};\n\nexport type ContextItem = {\n /** Stable identity for the item (slug, id). */\n id: string;\n /** Primary display label. */\n label: string;\n /** Optional secondary line — slug, role, env name. Mono-tracked. */\n secondary?: string;\n /** Avatar specification. Same shape as the crumb's own avatar. */\n avatar?: ContextAvatar;\n /** Navigation target — clicking the item navigates here. */\n href?: string;\n /** Mark the item as the active selection (gets a check on the right). */\n current?: boolean;\n /**\n * Optional href to a settings page for this item. When set, a\n * cogwheel button appears on the right of the row on hover/focus\n * — clicking it navigates straight to settings without going\n * through the item's normal selection. Cortex-style shortcut.\n */\n settingsHref?: string;\n /**\n * Aria-label for the optional settings cogwheel. Defaults to\n * `Settings for <label>`. Override when the label alone isn't\n * enough context (eg multiple items with the same name).\n */\n settingsAriaLabel?: string;\n};\n\nexport type ContextCrumb = {\n /** Stable identity for the crumb (used as React key). */\n id: string;\n /** The chip's visible label — typically the active item's name. */\n label: string;\n /** The chip's avatar — typically the active item's avatar. */\n avatar?: ContextAvatar;\n /** Items shown in the dropdown. Empty array = chip with no menu. */\n items: ContextItem[];\n /**\n * Optional footer link below the items — typically \"+ New X\" or\n * \"Manage Y\". Renders with a + icon and an accent text colour.\n */\n footerLink?: {\n label: string;\n href: string;\n };\n /**\n * Override per-item navigation. When set, item clicks call this\n * with the item's id instead of navigating to `item.href`. Useful\n * for posting a form (eg an org switcher that POSTs to a server-side\n * endpoint).\n */\n onSelect?: (itemId: string) => void;\n /** Optional aria-label for the chip's button (defaults to \"Switch <label>\"). */\n ariaLabel?: string;\n};\n\ntype LinkComp = ComponentType<{\n href: string;\n prefetch?: boolean;\n className?: string;\n children: ReactNode;\n}>;\n\ntype Props = {\n crumbs: ContextCrumb[];\n /**\n * The framework's link component. Inertia consumers pass the\n * Inertia Link; TanStack Router consumers pass their typed Link.\n * Plain `<a>` is the fallback.\n */\n LinkComponent?: LinkComp;\n className?: string;\n};\n\nconst DefaultLink: LinkComp = ({ href, className, children }) => (\n <a href={href} className={className}>\n {children}\n </a>\n);\n\nexport function ContextBar({\n crumbs,\n LinkComponent = DefaultLink,\n className,\n}: Props) {\n const { t } = useCboxLocalization();\n if (crumbs.length === 0) {\n return null;\n }\n\n return (\n <nav\n data-component=\"context-bar\"\n aria-label={t(\"Context\")}\n // No `overflow-x-auto` on the nav — it would clip the\n // dropdown panel that opens below each chip. If we need\n // horizontal scroll for 5+ crumbs later (cortex with\n // org/project/env/branch/region), the dropdown moves to a\n // portal so the nav can clip without affecting popovers.\n className={cn('flex min-w-0 items-center gap-1', className)}\n >\n {crumbs.map((crumb, index) => (\n <div\n key={crumb.id}\n className=\"flex min-w-0 items-center gap-1\"\n >\n {index > 0 ? <Separator /> : null}\n <ContextCrumbChip\n crumb={crumb}\n LinkComponent={LinkComponent}\n />\n </div>\n ))}\n </nav>\n );\n}\n\nfunction Separator() {\n return (\n <span\n aria-hidden\n className=\"text-mono shrink-0 text-[14px] font-light text-muted-foreground/50 select-none\"\n >\n /\n </span>\n );\n}\n\nfunction ContextCrumbChip({\n crumb,\n LinkComponent,\n}: {\n crumb: ContextCrumb;\n LinkComponent: LinkComp;\n}) {\n const { t } = useCboxLocalization();\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement | null>(null);\n const listId = useId();\n\n // Click-outside + Escape close.\n useEffect(() => {\n if (! open) return;\n\n function onPointerDown(event: PointerEvent): void {\n if (\n ref.current !== null &&\n ! ref.current.contains(event.target as Node)\n ) {\n setOpen(false);\n }\n }\n\n function onKey(event: KeyboardEvent): void {\n if (event.key === 'Escape') setOpen(false);\n }\n\n window.addEventListener('pointerdown', onPointerDown);\n window.addEventListener('keydown', onKey);\n\n return () => {\n window.removeEventListener('pointerdown', onPointerDown);\n window.removeEventListener('keydown', onKey);\n };\n }, [open]);\n\n const hasMenu = crumb.items.length > 0 || crumb.footerLink !== undefined;\n\n return (\n <div ref={ref} className=\"relative min-w-0\">\n <button\n type=\"button\"\n onClick={() => setOpen((v) => ! v)}\n aria-expanded={hasMenu ? open : undefined}\n aria-haspopup={hasMenu ? 'listbox' : undefined}\n aria-controls={hasMenu ? listId : undefined}\n aria-label={crumb.ariaLabel ?? t('Switch {name}', {name: crumb.label})}\n disabled={! hasMenu}\n className={cn(\n 'flex h-8 min-w-0 items-center gap-2 rounded-md border border-transparent px-2 text-[13px] text-foreground transition-colors',\n hasMenu &&\n 'hover:border-border hover:bg-secondary/60 focus-visible:ring-2 focus-visible:ring-ring focus-visible:outline-none',\n open && 'border-border bg-secondary/60',\n )}\n >\n {crumb.avatar !== undefined ? (\n <ContextAvatarChip\n avatar={crumb.avatar}\n fallbackLabel={crumb.label}\n size=\"sm\"\n />\n ) : null}\n <span className=\"truncate font-semibold\">{crumb.label}</span>\n {hasMenu ? <Chevron open={open} /> : null}\n </button>\n\n {open && hasMenu ? (\n <div\n id={listId}\n role=\"listbox\"\n aria-label={crumb.ariaLabel ?? crumb.label}\n className=\"absolute left-0 top-full z-30 mt-1 w-64 overflow-hidden rounded-md border border-border bg-popover shadow-lg\"\n >\n {crumb.items.length > 0 ? (\n <ul className=\"max-h-72 overflow-y-auto py-1\">\n {crumb.items.map((item) => (\n <ContextItemRow\n key={item.id}\n item={item}\n onSelect={crumb.onSelect}\n LinkComponent={LinkComponent}\n onAfterClick={() => setOpen(false)}\n />\n ))}\n </ul>\n ) : null}\n\n {crumb.footerLink !== undefined ? (\n <>\n {crumb.items.length > 0 ? (\n <div className=\"border-t border-border/60\" />\n ) : null}\n <div\n // Close the dropdown when the footer\n // link is clicked. SPA navigations\n // don't unmount this menu (it's a\n // sibling subtree), so without this\n // the dropdown stays open on the next\n // page.\n onClickCapture={() => setOpen(false)}\n >\n <LinkComponent\n href={crumb.footerLink.href}\n prefetch\n className=\"flex items-center gap-2 px-3 py-2.5 text-[13px] font-medium text-info transition-colors hover:bg-info-soft\"\n >\n <Plus />\n <span>{crumb.footerLink.label}</span>\n </LinkComponent>\n </div>\n </>\n ) : null}\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction ContextItemRow({\n item,\n onSelect,\n LinkComponent,\n onAfterClick,\n}: {\n item: ContextItem;\n onSelect: ContextCrumb['onSelect'];\n LinkComponent: LinkComp;\n onAfterClick: () => void;\n}) {\n const { t } = useCboxLocalization();\n const body = (\n <div className=\"flex w-full min-w-0 items-center gap-2.5 px-2.5 py-2\">\n {item.avatar !== undefined ? (\n <ContextAvatarChip\n avatar={item.avatar}\n fallbackLabel={item.label}\n size=\"md\"\n />\n ) : null}\n <div className=\"flex min-w-0 flex-1 flex-col leading-tight\">\n <span className=\"truncate text-[13px] font-medium text-foreground\">\n {item.label}\n </span>\n {item.secondary !== undefined ? (\n <span className=\"text-mono truncate text-[10px] text-muted-foreground\">\n {item.secondary}\n </span>\n ) : null}\n </div>\n {item.current === true && item.settingsHref === undefined ? (\n <Check />\n ) : null}\n </div>\n );\n\n const baseClassName = cn(\n 'group/item block w-full rounded-sm transition-colors',\n item.current === true\n ? 'bg-accent-soft hover:bg-accent-soft/80'\n : 'hover:bg-secondary',\n );\n\n // The settings cogwheel sits at the right of the row. It's a\n // separate Link / button — clicking it should NOT trigger the\n // item's main selection. We render it as a sibling of the body\n // and stop click propagation on the cogwheel itself.\n const settingsCog =\n item.settingsHref !== undefined ? (\n <LinkComponent\n href={item.settingsHref}\n prefetch\n className=\"invisible absolute right-1 top-1/2 inline-flex h-7 w-7 -translate-y-1/2 items-center justify-center rounded-sm text-muted-foreground transition-colors group-hover/item:visible hover:bg-card hover:text-foreground focus-visible:visible focus-visible:bg-card focus-visible:text-foreground focus-visible:outline-none\"\n >\n <span\n aria-label={\n item.settingsAriaLabel ?? t('Settings for {name}', {name: item.label})\n }\n onClickCapture={(event) => {\n event.stopPropagation();\n onAfterClick();\n }}\n className=\"contents\"\n >\n <SettingsIcon />\n </span>\n </LinkComponent>\n ) : null;\n\n if (onSelect !== undefined) {\n return (\n <li className=\"relative\">\n <button\n type=\"button\"\n onClick={() => {\n onSelect(item.id);\n onAfterClick();\n }}\n className={cn(baseClassName, 'text-left')}\n >\n {body}\n </button>\n {settingsCog}\n </li>\n );\n }\n\n if (item.href !== undefined) {\n return (\n <li className=\"relative\">\n <LinkComponent\n href={item.href}\n prefetch\n className={baseClassName}\n >\n {body}\n </LinkComponent>\n {settingsCog}\n </li>\n );\n }\n\n return (\n <li className=\"relative\">\n <div className={baseClassName}>{body}</div>\n {settingsCog}\n </li>\n );\n}\n\nfunction SettingsIcon() {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n >\n <circle cx=\"7\" cy=\"7\" r=\"2\" />\n <path d=\"M11.66 8.42a.79.79 0 0 0 .16.86l.03.03a.96.96 0 1 1-1.36 1.36l-.03-.03a.79.79 0 0 0-.86-.16.79.79 0 0 0-.48.72v.08a.96.96 0 1 1-1.92 0v-.04a.79.79 0 0 0-.52-.72.79.79 0 0 0-.86.16l-.03.03a.96.96 0 1 1-1.36-1.36l.03-.03a.79.79 0 0 0 .16-.86.79.79 0 0 0-.72-.48h-.08a.96.96 0 1 1 0-1.92h.04a.79.79 0 0 0 .72-.52.79.79 0 0 0-.16-.86l-.03-.03a.96.96 0 1 1 1.36-1.36l.03.03a.79.79 0 0 0 .86.16h.04a.79.79 0 0 0 .48-.72v-.08a.96.96 0 1 1 1.92 0v.04a.79.79 0 0 0 .48.72.79.79 0 0 0 .86-.16l.03-.03a.96.96 0 1 1 1.36 1.36l-.03.03a.79.79 0 0 0-.16.86v.04a.79.79 0 0 0 .72.48h.08a.96.96 0 1 1 0 1.92h-.04a.79.79 0 0 0-.72.48Z\" />\n </svg>\n );\n}\n\nexport function ContextAvatarChip({\n avatar,\n fallbackLabel,\n size = 'md',\n}: {\n avatar: ContextAvatar;\n fallbackLabel: string;\n size?: 'sm' | 'md';\n}) {\n const initials =\n avatar.initials ?? deriveInitials(fallbackLabel);\n const sizeClass =\n size === 'sm' ? 'h-[26px] w-[26px] text-[10px]' : 'h-7 w-7 text-[11px]';\n const style =\n avatar.src === undefined && avatar.accent !== undefined\n ? {\n backgroundColor: avatar.accent,\n color: '#fff',\n }\n : undefined;\n\n if (avatar.src !== undefined) {\n return (\n <img\n src={avatar.src}\n alt=\"\"\n className={cn(\n 'shrink-0 rounded-sm bg-secondary object-cover',\n sizeClass,\n )}\n loading=\"lazy\"\n />\n );\n }\n\n return (\n <span\n style={style}\n className={cn(\n 'flex shrink-0 items-center justify-center rounded-sm font-semibold tracking-tight',\n avatar.accent === undefined && 'bg-info-soft text-info',\n sizeClass,\n )}\n >\n {initials}\n </span>\n );\n}\n\nfunction deriveInitials(label: string): string {\n const parts = label.trim().split(/\\s+/);\n if (parts.length >= 2) {\n return ((parts[0]?.[0] ?? '') + (parts[1]?.[0] ?? '')).toUpperCase();\n }\n return (label.slice(0, 2) || '?').toUpperCase();\n}\n\nfunction Chevron({ open }: { open: boolean }) {\n return (\n <svg\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 10 10\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={cn(\n 'shrink-0 text-muted-foreground transition-transform duration-150',\n open && 'rotate-180',\n )}\n aria-hidden\n >\n <path d=\"m2.5 4 2.5 2.5L7.5 4\" />\n </svg>\n );\n}\n\nfunction Check() {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"shrink-0 text-accent\"\n aria-hidden\n >\n <path d=\"m3 7.5 2.5 2.5L11 4.5\" />\n </svg>\n );\n}\n\nfunction Plus() {\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"shrink-0\"\n aria-hidden\n >\n <path d=\"M6 2v8M2 6h8\" />\n </svg>\n );\n}\n","import { useCboxLocalization } from '../context/localization';\nimport { useCboxIdOptional } from '../context/cbox-id';\nimport { ContextBar, type ContextItem } from '../primitives/context-bar';\nimport type { LinkComponent } from './cbox-app-sidebar';\n\nexport type CboxOrgContextBarProps = {\n /**\n * Apps inject their router's Link primitive — used for the\n * crumb's brand-side anchor. The dropdown's onSelect calls\n * `onNavigate(href)` so apps can either `router.visit(href)`\n * (Inertia) or `<Link>`-style navigate.\n */\n LinkComponent: LinkComponent;\n\n /**\n * Called when the user picks a different org from the dropdown.\n * Receives an absolute path with the slug substituted in. Apps\n * trigger their router.\n *\n * Path-rewrite rule (Cbox suite convention):\n * /org/<old-slug>/foo/bar → /org/<new-slug>/foo/bar\n * /something-else → /org/<new-slug>\n *\n * Apps that aren't org-scoped (notifications) typically don't\n * render this component at all — but if they do, switching\n * lands on the new org's `/org/<slug>` root and lets the host\n * sort the rest out.\n */\n onNavigate: (href: string) => void;\n};\n\n/**\n * Standard Cbox topbar org switcher. One crumb, one dropdown,\n * URL-driven (no POST, no session pin). Mirrors id's pattern 1:1\n * so the chrome reads identically across the suite — that's the\n * whole reason it's here, not in each app.\n *\n * Apps render this in the `topbarCentre` slot of `CboxAppShell`.\n * Hides itself when there's no current org (eg pre-auth, or\n * non-org-scoped surfaces).\n */\nexport function CboxOrgContextBar({\n LinkComponent,\n onNavigate,\n}: CboxOrgContextBarProps) {\n const { t } = useCboxLocalization();\n const cboxId = useCboxIdOptional();\n\n if (cboxId === null) {\n return null;\n }\n\n const { currentOrganization, organizations, urls } = cboxId;\n const activeOrg = currentOrganization ?? organizations[0] ?? null;\n\n if (activeOrg === null) {\n return null;\n }\n\n const idBase = urls.idBaseUrl.replace(/\\/$/, '');\n\n const items: ContextItem[] = organizations.map((org) => ({\n id: org.slug,\n label: org.name,\n avatar: { initials: deriveInitials(org.name) },\n current: org.slug === activeOrg.slug,\n // Cogwheel shortcut → id's org-settings page. Cross-app\n // deep link; id handles the auth and rendering.\n settingsHref: `${idBase}/org/${org.slug}/settings`,\n settingsAriaLabel: t('Settings for {name}', {name: org.name}),\n }));\n\n const onSelect = (slug: string) => {\n const org = organizations.find((o) => o.slug === slug);\n if (org === undefined) return;\n\n const path = typeof window !== 'undefined' ? window.location.pathname : '/';\n const next = path.startsWith('/org/')\n ? path.replace(/^\\/org\\/[^/]+/, `/org/${org.slug}`)\n : `/org/${org.slug}`;\n const search =\n typeof window !== 'undefined' ? window.location.search : '';\n\n onNavigate(next + search);\n };\n\n return (\n <ContextBar\n LinkComponent={LinkComponent}\n crumbs={[\n {\n id: 'org',\n label: activeOrg.name,\n avatar: { initials: deriveInitials(activeOrg.name) },\n items,\n onSelect,\n footerLink: {\n label: t('Manage organizations'),\n href: `${idBase}/settings/organizations`,\n },\n ariaLabel: t('Switch organization'),\n },\n ]}\n />\n );\n}\n\nfunction deriveInitials(label: string): string {\n const parts = label.trim().split(/\\s+/);\n if (parts.length >= 2) {\n return ((parts[0]?.[0] ?? '') + (parts[1]?.[0] ?? '')).toUpperCase();\n }\n\n return (label.slice(0, 2) || '?').toUpperCase();\n}\n","import { useCboxLocalization } from '../context/localization';\nimport {\n useEffect,\n useMemo,\n useRef,\n useState,\n type ComponentType,\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactNode,\n} from 'react';\nimport { useCboxId, type CboxOrganization } from '../context/cbox-id';\nimport { cn } from '../utils/cn';\n\ntype Props = {\n /**\n * Optional renderer override for the trigger so apps can match\n * their topbar style (filled button vs ghost vs icon-only).\n */\n Trigger?: ComponentType<{\n organization: CboxOrganization | null;\n onClick: () => void;\n open: boolean;\n }>;\n className?: string;\n};\n\n/**\n * Dropdown that surfaces the user's orgs and dispatches the picked\n * one through `onSwitchOrganization`. Reads everything else from\n * CboxIdProvider so the same component works in id, cortex, atlas —\n * no per-app data wiring.\n *\n * Includes typeahead — auto-focus on open, filters by name as the\n * user types, arrow-key navigation, Enter to switch, Escape to close.\n */\nexport function OrgSwitcher({ Trigger = DefaultTrigger, className }: Props) {\n const { t } = useCboxLocalization();\n const { currentOrganization, organizations, onSwitchOrganization } = useCboxId();\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n const [activeIndex, setActiveIndex] = useState(0);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const searchRef = useRef<HTMLInputElement | null>(null);\n\n // Reset transient state every open. requestAnimationFrame waits\n // for the input to mount before focusing it.\n useEffect(() => {\n if (open) {\n setQuery('');\n setActiveIndex(0);\n const id = requestAnimationFrame(() => searchRef.current?.focus());\n return () => cancelAnimationFrame(id);\n }\n }, [open]);\n\n // Click-outside + Escape. Matches AppSwitcher / every other Cbox\n // top-bar control.\n useEffect(() => {\n if (!open) {\n return;\n }\n\n function onPointerDown(event: PointerEvent): void {\n if (\n containerRef.current !== null &&\n !containerRef.current.contains(event.target as Node)\n ) {\n setOpen(false);\n }\n }\n\n function onKey(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n setOpen(false);\n }\n }\n\n window.addEventListener('pointerdown', onPointerDown);\n window.addEventListener('keydown', onKey);\n\n return () => {\n window.removeEventListener('pointerdown', onPointerDown);\n window.removeEventListener('keydown', onKey);\n };\n }, [open]);\n\n const filtered = useMemo(() => {\n const q = query.trim().toLowerCase();\n if (q === '') {\n return organizations;\n }\n return organizations.filter(\n (org) =>\n org.name.toLowerCase().includes(q) ||\n org.slug.toLowerCase().includes(q),\n );\n }, [organizations, query]);\n\n // Clamp activeIndex when the filter shrinks the list.\n useEffect(() => {\n if (activeIndex >= filtered.length) {\n setActiveIndex(0);\n }\n }, [filtered.length, activeIndex]);\n\n const onPick = (org: CboxOrganization) => {\n setOpen(false);\n if (onSwitchOrganization) {\n onSwitchOrganization(org);\n return;\n }\n // No fallback. Org switching is a URL navigation — apps own\n // the destination path because it's per-app (id has /dashboard,\n // webhooks has /endpoints, etc.). Failing loud here is better\n // than silently doing nothing.\n if (typeof console !== 'undefined') {\n console.warn(\n '[cbox-ui] OrgSwitcher: no onSwitchOrganization handler provided. Apps must wire one (router.visit) — there is no server endpoint to fall back to.',\n );\n }\n };\n\n function onSearchKeyDown(event: ReactKeyboardEvent<HTMLInputElement>): void {\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n if (filtered.length === 0) {\n return;\n }\n setActiveIndex((i) => (i + 1) % filtered.length);\n return;\n }\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n if (filtered.length === 0) {\n return;\n }\n setActiveIndex((i) => (i - 1 + filtered.length) % filtered.length);\n return;\n }\n if (event.key === 'Enter') {\n event.preventDefault();\n const target = filtered[activeIndex];\n if (target !== undefined) {\n onPick(target);\n }\n }\n }\n\n return (\n <div ref={containerRef} className={cn('relative', className)}>\n <Trigger\n organization={currentOrganization}\n onClick={() => setOpen((v) => !v)}\n open={open}\n />\n {open ? (\n <div\n role=\"dialog\"\n aria-label={t(\"Switch organization\")}\n className=\"absolute left-0 top-full z-50 mt-1 w-64 overflow-hidden rounded-md border border-border bg-popover shadow-md\"\n >\n <div className=\"border-b border-border/70 px-3 pt-2 pb-1\">\n <p className=\"text-mono text-[10px] font-semibold tracking-[0.18em] text-muted-foreground uppercase\">\n {t(\"Switch organization\")}</p>\n </div>\n\n <div className=\"border-b border-border/70 px-2 py-1.5\">\n <div className=\"flex items-center gap-2 rounded-md px-2 py-1 focus-within:bg-secondary\">\n <SearchIcon />\n <input\n ref={searchRef}\n type=\"text\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n onKeyDown={onSearchKeyDown}\n placeholder={t(\"Filter…\")}\n aria-label={t(\"Filter organizations\")}\n autoComplete=\"off\"\n spellCheck={false}\n className=\"w-full bg-transparent text-sm text-foreground placeholder:text-muted-foreground/60 focus:outline-none\"\n />\n </div>\n </div>\n\n <div className=\"max-h-[50vh] overflow-y-auto p-1\">\n {filtered.length === 0 ? (\n <p className=\"px-3 py-6 text-center text-[12px] text-muted-foreground\">\n {t('No organizations match “{query}”', {query})}\n </p>\n ) : (\n <ul className=\"space-y-0.5\">\n {filtered.map((org, index) => {\n const active = currentOrganization?.id === org.id;\n const highlighted = index === activeIndex;\n return (\n <li key={org.id}>\n <button\n type=\"button\"\n onMouseEnter={() => setActiveIndex(index)}\n onClick={() => onPick(org)}\n className={cn(\n 'flex w-full items-center justify-between rounded-sm px-2 py-1.5 text-left text-sm transition-colors',\n active\n ? 'bg-accent-soft text-foreground'\n : highlighted\n ? 'bg-secondary'\n : 'hover:bg-secondary',\n )}\n >\n <span className=\"truncate\">{org.name}</span>\n {active ? (\n <span className=\"text-mono text-[10px] text-muted-foreground\">\n {t(\"current\")}</span>\n ) : null}\n </button>\n </li>\n );\n })}\n </ul>\n )}\n </div>\n </div>\n ) : null}\n </div>\n );\n}\n\nconst DefaultTrigger: ComponentType<{\n organization: CboxOrganization | null;\n onClick: () => void;\n open: boolean;\n}> = ({ organization, onClick }) => (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"flex items-center gap-2 rounded-md border border-border bg-card px-3 py-1.5 text-sm font-medium text-foreground hover:bg-secondary\"\n >\n <span className=\"truncate max-w-[180px]\">\n {organization?.name ?? 'Pick an organization'}\n </span>\n <Chevron />\n </button>\n);\n\nfunction Chevron(): ReactNode {\n return (\n <svg\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 10 10\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden\n >\n <path\n d=\"M2 4l3 3 3-3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction SearchIcon(): ReactNode {\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n className=\"shrink-0 text-muted-foreground\"\n >\n <circle cx=\"5.25\" cy=\"5.25\" r=\"3.25\" />\n <path d=\"M8 8l2 2\" />\n </svg>\n );\n}\n","import type { ReactNode } from 'react';\nimport { AppSwitcher } from '../components/app-switcher';\nimport { NotificationsBell } from '../components/notifications-bell';\nimport { OrgSwitcher } from '../components/org-switcher';\nimport { UserMenu } from '../components/user-menu';\nimport { cn } from '../utils/cn';\n\ntype Props = {\n /**\n * App branding rendered on the left — typically a small logo +\n * the app name. Rendered inside a fixed-height bar so keep it\n * visually compact (24-32px tall content).\n */\n brand: ReactNode;\n /** Anything between brand and the right cluster — search, breadcrumbs, etc. */\n centre?: ReactNode;\n /**\n * Override slots if an app needs a different control mix in the\n * right cluster. Default: AppLauncher → NotificationsBell → UserMenu.\n */\n rightCluster?: ReactNode;\n /**\n * Whether to show the org switcher next to the brand. Hide on\n * non-org-scoped surfaces (eg id account-settings).\n */\n showOrgSwitcher?: boolean;\n className?: string;\n};\n\n/**\n * Standard Cbox top bar. Same shell across every app — keeps cross-app\n * navigation (launcher, account, notifications) muscle-memory-stable.\n */\nexport function TopBar({\n brand,\n centre,\n rightCluster,\n showOrgSwitcher = true,\n className,\n}: Props) {\n return (\n <header\n className={cn(\n 'flex h-14 shrink-0 items-center gap-3 border-b border-border bg-background px-4',\n className,\n )}\n >\n <div className=\"flex items-center gap-3\">\n {brand}\n <AppSwitcher />\n {showOrgSwitcher ? <OrgSwitcher /> : null}\n </div>\n <div className=\"min-w-0 flex-1\">{centre}</div>\n <div className=\"flex shrink-0 items-center gap-1\">\n {rightCluster ?? (\n <>\n <NotificationsBell />\n <UserMenu />\n </>\n )}\n </div>\n </header>\n );\n}\n","import { useCboxLocalization } from '../context/localization';\nimport { useEffect, useRef, useState, type ReactNode } from 'react';\nimport { useCboxIdOptional, type CboxAppLink } from '../context/cbox-id';\nimport { cn } from '../utils/cn';\nimport { CboxAppIcon, secureIconUrl } from './app-icon';\n\ntype AppLauncherProps = {\n className?: string;\n /**\n * Called when the user clicks an app they're not entitled to. Use\n * this to open an upgrade flow / Stripe checkout / Intercom message.\n * If unset, locked tiles fall through to a static \"Add to plan\"\n * affordance — the click is a no-op so we never silently ship the\n * user to a broken paywall.\n */\n onLockedAppClick?: (app: CboxAppLink) => void;\n};\n\n/**\n * Cross-app launcher — the 9-dot button in the top bar.\n *\n * Renders the Cbox suite as a vertical list with status per app:\n * - entitled apps → full-colour tile, click navigates with ?org=<slug>\n * - locked apps → greyed out + lock badge, opens upgrade flow if the\n * host app provides one (otherwise inert click)\n * - coming-soon → greyed out + \"soon\" badge, never clickable\n * - the current app → highlighted ring on its monogram tile\n *\n * Row layout (vs. the old 3-col grid) gives us room for descriptions\n * and status badges, which makes the entitlement signal readable at a\n * glance instead of needing a tooltip.\n */\nexport function AppLauncher({ className, onLockedAppClick }: AppLauncherProps) {\n const { t } = useCboxLocalization();\n // Soft-read: if a layout above us forgot to mount <CboxIdProvider>\n // (e.g. an admin shell that doesn't expose cross-app context yet),\n // render nothing instead of crashing the chrome. Throwing here used\n // to take the whole top bar down for any single missing-provider\n // bug downstream.\n const cboxId = useCboxIdOptional();\n const [open, setOpen] = useState(false);\n const containerRef = useRef<HTMLDivElement | null>(null);\n\n // Click-outside + Escape close. Mirrors the standard popover\n // contract every other Cbox top-bar control follows.\n useEffect(() => {\n if (! open) {\n return;\n }\n\n function onPointerDown(event: PointerEvent): void {\n if (\n containerRef.current !== null &&\n ! containerRef.current.contains(event.target as Node)\n ) {\n setOpen(false);\n }\n }\n\n function onKey(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n setOpen(false);\n }\n }\n\n window.addEventListener('pointerdown', onPointerDown);\n window.addEventListener('keydown', onKey);\n\n return () => {\n window.removeEventListener('pointerdown', onPointerDown);\n window.removeEventListener('keydown', onKey);\n };\n }, [open]);\n\n // No provider above us, or no apps to render — just don't show the\n // launcher button at all. The chrome stays clean.\n if (cboxId === null || cboxId.apps.length === 0) {\n return null;\n }\n\n const apps = cboxId.apps;\n\n // Carry the active org slug across apps so users don't have to\n // re-pick after switching. The destination URL embeds the slug\n // directly (`<app>/org/<slug>`) — every Cbox app exposes a\n // canonical `GET /org/{slug}` route that redirects to its own\n // default landing sub-page. URL is the source of truth.\n const orgSlug = cboxId.currentOrganization?.slug;\n\n // Split entitled vs. locked so the \"available\" set lands at the\n // top of the list and the upgrade-able set sits in its own section\n // below. Coming-soon apps go with the locked set — they share the\n // \"not actionable now\" visual treatment.\n const entitled: CboxAppLink[] = [];\n const locked: CboxAppLink[] = [];\n for (const app of apps) {\n const isEntitled = app.entitled !== false && app.comingSoon !== true;\n (isEntitled ? entitled : locked).push(app);\n }\n\n return (\n <div ref={containerRef} className={cn('relative', className)}>\n <button\n type=\"button\"\n aria-label={t(\"Open app launcher\")}\n aria-expanded={open}\n onClick={() => setOpen((v) => !v)}\n className={cn(\n 'flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-secondary hover:text-foreground',\n open && 'bg-secondary text-foreground',\n )}\n >\n <Grid />\n </button>\n {open ? (\n <div\n role=\"dialog\"\n aria-label={t(\"Cbox app launcher\")}\n // Cap width at viewport-minus-gutter on narrow\n // screens so the panel stays inside the visible\n // area on mobile (390px viewport, 320px panel\n // would overflow). `right-0` anchors at the\n // launcher button.\n className=\"absolute right-0 top-full z-50 mt-1.5 w-[min(20rem,calc(100vw-1.5rem))] overflow-hidden rounded-lg border border-border bg-popover shadow-lg\"\n >\n <div className=\"border-b border-border/70 px-3 py-2.5\">\n <p className=\"text-mono text-[10px] font-semibold tracking-[0.18em] text-muted-foreground uppercase\">\n {t(\"Cbox suite\")}</p>\n </div>\n\n <div className=\"max-h-[60vh] overflow-y-auto py-1\">\n {entitled.length > 0 ? (\n <ul className=\"space-y-0.5 p-1\">\n {entitled.map((app) => (\n <AppRow\n key={app.key}\n app={app}\n orgSlug={orgSlug}\n onLockedAppClick={onLockedAppClick}\n />\n ))}\n </ul>\n ) : null}\n\n {locked.length > 0 ? (\n <>\n {entitled.length > 0 ? (\n <div className=\"my-1 border-t border-border/50\" />\n ) : null}\n <p className=\"text-mono px-3 py-1.5 text-[10px] font-semibold tracking-[0.18em] text-muted-foreground/70 uppercase\">\n {t(\"Available\")}</p>\n <ul className=\"space-y-0.5 p-1 pt-0\">\n {locked.map((app) => (\n <AppRow\n key={app.key}\n app={app}\n orgSlug={orgSlug}\n onLockedAppClick={onLockedAppClick}\n />\n ))}\n </ul>\n </>\n ) : null}\n </div>\n </div>\n ) : null}\n </div>\n );\n}\n\ntype AppRowProps = {\n app: CboxAppLink;\n orgSlug: string | undefined;\n onLockedAppClick: AppLauncherProps['onLockedAppClick'];\n};\n\nfunction AppRow({ app, orgSlug, onLockedAppClick }: AppRowProps): ReactNode {\n const { t } = useCboxLocalization();\n const isComingSoon = app.comingSoon === true;\n const isLocked = app.entitled === false || isComingSoon;\n\n const monogram = app.monogram ?? app.name.slice(0, 1).toUpperCase();\n const accent = app.accentColor;\n // Apply the per-app accent colour to the monogram chip so each\n // app keeps its visual identity. Skip when an iconUrl is set —\n // the icon supplies its own colour.\n const tileStyle =\n accent !== undefined && secureIconUrl(app.iconUrl) === null\n ? { backgroundColor: accent, color: '#fff', borderColor: accent }\n : undefined;\n\n // Land directly on `<app>/org/<slug>` so the destination URL is\n // canonical from the first hop — no `?org=` query, no extra\n // redirect. Each Cbox app's `/org/{slug}` route picks its default\n // landing within that org. Skip on the current-app tile (the\n // user is already there).\n const href =\n orgSlug !== undefined && app.current !== true\n ? buildOrgUrl(app.url, orgSlug)\n : app.url;\n\n const tile = (\n <div\n style={tileStyle}\n className={cn(\n 'flex h-9 w-9 shrink-0 items-center justify-center rounded-md border border-border bg-card text-[13px] font-semibold text-foreground',\n app.current && 'ring-2 ring-accent-edge ring-offset-1 ring-offset-popover',\n isLocked && 'opacity-60 grayscale',\n )}\n >\n <CboxAppIcon name={app.name} iconUrl={app.iconUrl} iconDarkUrl={app.iconDarkUrl} className=\"h-5 w-5\" fallback={<span>{monogram}</span>} />\n </div>\n );\n\n const body = (\n <div className=\"flex min-w-0 flex-1 flex-col leading-tight\">\n <div className=\"flex items-center gap-2\">\n <span\n className={cn(\n 'truncate text-sm font-medium text-foreground',\n isLocked && 'text-muted-foreground',\n )}\n >\n {app.name}\n </span>\n {app.current ? (\n <span className=\"text-mono shrink-0 rounded-sm border border-accent-edge/40 bg-accent-soft px-1 text-[9px] font-semibold tracking-[0.14em] text-accent uppercase\">\n {t(\"current\")}</span>\n ) : null}\n </div>\n {app.description ? (\n <span\n className={cn(\n 'truncate text-[11px]',\n isLocked\n ? 'text-muted-foreground/70'\n : 'text-muted-foreground',\n )}\n >\n {app.description}\n </span>\n ) : null}\n </div>\n );\n\n const trailing = isComingSoon ? (\n <span className=\"text-mono shrink-0 rounded-sm border border-border bg-secondary px-1.5 py-0.5 text-[9px] font-semibold tracking-[0.14em] text-muted-foreground uppercase\">\n {t(\"soon\")}</span>\n ) : isLocked ? (\n <span className=\"flex shrink-0 items-center gap-1 text-[10px] font-medium text-muted-foreground\">\n <Lock />\n {t(\"Add\")}</span>\n ) : null;\n\n if (isComingSoon) {\n return (\n <li>\n <div\n aria-disabled\n className=\"flex w-full cursor-not-allowed items-center gap-3 rounded-md px-2.5 py-2\"\n title={t('{name} — coming soon', {name: app.name})}\n >\n {tile}\n {body}\n {trailing}\n </div>\n </li>\n );\n }\n\n if (isLocked) {\n return (\n <li>\n <button\n type=\"button\"\n onClick={() => onLockedAppClick?.(app)}\n className={cn(\n 'group flex w-full items-center gap-3 rounded-md px-2.5 py-2 text-left transition-colors',\n onLockedAppClick !== undefined\n ? 'hover:bg-secondary'\n : 'cursor-default',\n )}\n title={t('Add {name} to your plan', {name: app.name})}\n >\n {tile}\n {body}\n {trailing}\n </button>\n </li>\n );\n }\n\n return (\n <li>\n <a\n href={href}\n className={cn(\n 'group flex w-full items-center gap-3 rounded-md px-2.5 py-2 transition-colors hover:bg-secondary',\n app.current && 'bg-accent-soft hover:bg-accent-soft',\n )}\n >\n {tile}\n {body}\n {trailing}\n </a>\n </li>\n );\n}\n\nfunction buildOrgUrl(url: string, orgSlug: string): string {\n if (url === '' || orgSlug === '') {\n return url;\n }\n try {\n // URL constructor strips trailing slash on origin assembly,\n // preserving any existing path/query/fragment from the app's\n // configured base. We override the path to `/org/<slug>` so\n // every app lands on its canonical org-scoped entry point.\n const u = new URL(url);\n u.pathname = `/org/${encodeURIComponent(orgSlug)}`;\n return u.toString();\n } catch {\n return `${url.replace(/\\/$/, '')}/org/${encodeURIComponent(orgSlug)}`;\n }\n}\n\nfunction Grid(): ReactNode {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\" aria-hidden>\n {[1, 8, 15].flatMap((y) =>\n [1, 8, 15].map((x) => (\n <rect\n key={`${x}-${y}`}\n x={x}\n y={y}\n width=\"2.5\"\n height=\"2.5\"\n rx=\"0.6\"\n fill=\"currentColor\"\n />\n )),\n )}\n </svg>\n );\n}\n\nfunction Lock(): ReactNode {\n return (\n <svg\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n >\n <rect x=\"2.5\" y=\"5\" width=\"7\" height=\"5\" rx=\"1\" />\n <path d=\"M4 5V3.5a2 2 0 1 1 4 0V5\" />\n </svg>\n );\n}\n","import { useCallback, useEffect, useRef, useState, type ReactNode } from 'react';\nimport { useCboxLocalization } from '../context/localization';\nimport { cn } from '../utils/cn';\nimport { CboxAppIcon, rememberAppCatalog } from './app-icon';\n\n/** One app as the host's catalog endpoint lists it. */\nexport type CboxCatalogApp = {\n key: string;\n name: string;\n launch_url: string;\n /** Cbox ID's uploaded icon for light surfaces. */\n icon_url?: string | null;\n /** Cbox ID's uploaded icon for dark surfaces. */\n icon_dark_url?: string | null;\n description?: string | null;\n};\n\nexport type CboxAppCatalogState =\n | { status: 'idle' | 'loading' }\n | { status: 'ready'; apps: CboxCatalogApp[]; refreshAfter: number }\n | { status: 'authorization_required'; authorizeUrl: string | null }\n | { status: 'unavailable' };\n\nexport type CboxAppCatalogProps = {\n /**\n * Same-origin URL the host serves the person's app catalog from (a proxy of Cbox ID's\n * catalog, authorized for the signed-in person). `null` renders the control disabled, so the\n * chrome keeps its shape on pages without an organization.\n */\n endpoint: string | null;\n /** The app key of this app; its tile is marked current and does not navigate. */\n currentAppKey: string;\n className?: string;\n};\n\nconst DEFAULT_REFRESH_SECONDS = 60;\n\n/**\n * Interpret the catalog endpoint's answer. The contract every Cbox app serves:\n *\n * - `200 { apps: [{ key, name, launch_url, icon_url?, icon_dark_url?, description? }], refresh_after?: seconds }`\n * - `401`/`403 { authorize_url?: string }` or `{ state: 'authorization_required' }`: the\n * person has to (re)connect their catalog grant; `authorize_url` is where.\n * - anything else: unavailable right now.\n *\n * Only `http(s)` launch URLs are kept: the tiles are links the person will click.\n */\nexport function parseAppCatalog(ok: boolean, body: unknown): CboxAppCatalogState {\n const data = typeof body === 'object' && body !== null ? (body as Record<string, unknown>) : {};\n if (!ok) {\n const authorize = typeof data.authorize_url === 'string' ? data.authorize_url : null;\n if (authorize !== null || data.state === 'authorization_required') {\n return { status: 'authorization_required', authorizeUrl: authorize };\n }\n\n return { status: 'unavailable' };\n }\n if (!Array.isArray(data.apps)) {\n return { status: 'unavailable' };\n }\n const apps: CboxCatalogApp[] = [];\n for (const entry of data.apps as unknown[]) {\n if (typeof entry !== 'object' || entry === null) continue;\n const app = entry as Record<string, unknown>;\n if (typeof app.key !== 'string' || typeof app.name !== 'string' || typeof app.launch_url !== 'string') continue;\n if (!/^https?:\\/\\//.test(app.launch_url)) continue;\n apps.push({\n key: app.key,\n name: app.name,\n launch_url: app.launch_url,\n icon_url: typeof app.icon_url === 'string' ? app.icon_url : null,\n icon_dark_url: typeof app.icon_dark_url === 'string' ? app.icon_dark_url : null,\n description: typeof app.description === 'string' ? app.description : null,\n });\n }\n const refresh = typeof data.refresh_after === 'number' && Number.isFinite(data.refresh_after) ? data.refresh_after : DEFAULT_REFRESH_SECONDS;\n\n return { status: 'ready', apps, refreshAfter: Math.max(1, Math.min(DEFAULT_REFRESH_SECONDS, refresh)) };\n}\n\n/** The authorize link with `return_to` set to where the person is, when it is on this origin. */\nexport function authorizeHref(authorizeUrl: string | null, location: { origin: string; pathname: string; search: string }): string | null {\n if (authorizeUrl === null) return null;\n try {\n const url = new URL(authorizeUrl, location.origin);\n if (url.origin !== location.origin) return null;\n url.searchParams.set('return_to', location.pathname + location.search);\n\n return url.pathname + url.search;\n } catch {\n return null;\n }\n}\n\n/**\n * The Switch-app control: a grid of the Cbox apps this person can open, read live from the\n * host's catalog endpoint. The host owns the endpoint and the grant; this renders the answer,\n * refreshes it when it expires while the panel is open, and offers the way back to Cbox ID\n * when the grant is missing. Each tile shows the app's icon from the catalog (light and dark),\n * and the answer is kept so `CboxServiceMark` paints the app's own mark from it.\n */\nexport function CboxAppCatalog({ endpoint, currentAppKey, className }: CboxAppCatalogProps) {\n const { t } = useCboxLocalization();\n const [open, setOpen] = useState(false);\n const [state, setState] = useState<CboxAppCatalogState>({ status: 'idle' });\n const container = useRef<HTMLDivElement>(null);\n const flight = useRef<AbortController | null>(null);\n const expires = useRef(0);\n\n const load = useCallback(async () => {\n if (endpoint === null || flight.current !== null) return;\n const request = new AbortController();\n flight.current = request;\n setState(current => (current.status === 'ready' ? current : { status: 'loading' }));\n try {\n const response = await fetch(endpoint, {\n credentials: 'same-origin',\n cache: 'no-store',\n headers: { Accept: 'application/json', 'X-Requested-With': 'XMLHttpRequest' },\n signal: request.signal,\n });\n const body: unknown = await response.json().catch(() => null);\n if (request.signal.aborted) return;\n const next = parseAppCatalog(response.ok, body);\n expires.current = next.status === 'ready' ? Date.now() + next.refreshAfter * 1000 : 0;\n setState(next);\n if (next.status === 'ready') rememberAppCatalog(next.apps);\n } catch {\n if (!request.signal.aborted) { expires.current = 0; setState({ status: 'unavailable' }); }\n } finally {\n if (flight.current === request) flight.current = null;\n }\n }, [endpoint]);\n\n const refresh = useCallback(() => {\n if (document.visibilityState === 'visible' && Date.now() >= expires.current) void load();\n }, [load]);\n\n useEffect(() => {\n if (!open) return;\n refresh();\n const outside = (event: PointerEvent) => { if (container.current !== null && !container.current.contains(event.target as Node)) setOpen(false); };\n const key = (event: KeyboardEvent) => { if (event.key === 'Escape') setOpen(false); };\n window.addEventListener('pointerdown', outside);\n window.addEventListener('keydown', key);\n window.addEventListener('focus', refresh);\n document.addEventListener('visibilitychange', refresh);\n return () => {\n window.removeEventListener('pointerdown', outside);\n window.removeEventListener('keydown', key);\n window.removeEventListener('focus', refresh);\n document.removeEventListener('visibilitychange', refresh);\n };\n }, [open, refresh]);\n\n useEffect(() => {\n if (!open || state.status !== 'ready') return;\n const timer = window.setTimeout(refresh, Math.max(50, expires.current - Date.now()));\n return () => window.clearTimeout(timer);\n }, [open, state, refresh]);\n\n useEffect(() => () => flight.current?.abort(), []);\n useEffect(() => { expires.current = 0; setState({ status: 'idle' }); }, [endpoint]);\n\n const reconnect = state.status === 'authorization_required' && typeof window !== 'undefined' ? authorizeHref(state.authorizeUrl, window.location) : null;\n\n return (\n <div ref={container} className={cn('relative', className)}>\n <button\n type=\"button\"\n aria-label={t('Switch app')}\n title={t('Switch app')}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n disabled={endpoint === null}\n onClick={() => setOpen(value => !value)}\n className={cn(\n 'flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-secondary hover:text-foreground disabled:cursor-default disabled:opacity-60 disabled:hover:bg-transparent',\n open && 'bg-secondary text-foreground',\n )}\n >\n <Grid />\n </button>\n {open ? (\n <div role=\"dialog\" aria-label={t('Switch app')} className=\"absolute right-0 top-full z-50 mt-1.5 w-[min(18.25rem,calc(100vw-1rem))] overflow-hidden rounded-lg border border-border bg-popover p-3 shadow-lg\">\n <h2 className=\"mb-2 text-sm font-semibold text-foreground\">{t('Switch app')}</h2>\n <div aria-live=\"polite\">\n {(state.status === 'idle' || state.status === 'loading') && <p className=\"px-1 py-2 text-sm text-muted-foreground\">{t('Loading apps…')}</p>}\n {state.status === 'unavailable' && (\n <div className=\"space-y-2 px-1 py-2 text-sm\">\n <p role=\"alert\" className=\"text-muted-foreground\">{t('Apps could not be loaded.')}</p>\n <button type=\"button\" onClick={() => void load()} className=\"font-medium text-foreground underline\">{t('Try again')}</button>\n </div>\n )}\n {state.status === 'authorization_required' && (\n <div className=\"space-y-2 px-1 py-2 text-sm\">\n <p role=\"alert\" className=\"text-muted-foreground\">{t('Apps could not be loaded.')}</p>\n {reconnect !== null\n ? <a href={reconnect} className=\"font-medium text-foreground underline\">{t('Reconnect to Cbox ID')}</a>\n : <button type=\"button\" onClick={() => void load()} className=\"font-medium text-foreground underline\">{t('Try again')}</button>}\n </div>\n )}\n {state.status === 'ready' && (state.apps.length === 0\n ? <p className=\"px-1 py-2 text-sm text-muted-foreground\">{t('No apps available')}</p>\n : (\n <nav aria-label={t('Switch app')} className=\"grid grid-cols-3 gap-1\">\n {state.apps.map(app => {\n const current = app.key === currentAppKey;\n return (\n <a\n key={app.key}\n href={app.launch_url}\n aria-current={current ? 'true' : undefined}\n title={app.description ?? app.name}\n onClick={() => setOpen(false)}\n className={cn('relative flex min-h-[60px] min-w-0 flex-col items-center justify-center gap-1.5 rounded-md p-2 text-center text-[13px] font-medium leading-tight text-foreground hover:bg-secondary', current && 'bg-accent-soft')}\n >\n <CboxAppIcon name={app.name} iconUrl={app.icon_url} iconDarkUrl={app.icon_dark_url} />\n <span className=\"max-w-full break-words\">{app.name.replace(/^Cbox\\s*·\\s*/i, '')}</span>\n {current && <Check />}\n </a>\n );\n })}\n </nav>\n ))}\n </div>\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction Grid(): ReactNode {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"currentColor\" aria-hidden>\n {[3, 9, 15].flatMap(y => [3, 9, 15].map(x => <circle key={`${x}-${y}`} cx={x} cy={y} r=\"1.65\" />))}\n </svg>\n );\n}\n\nfunction Check(): ReactNode {\n return (\n <svg aria-hidden viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" className=\"absolute right-2 top-1.5 h-3 w-3 text-accent\">\n <path d=\"m5 12 4 4L19 6\" />\n </svg>\n );\n}\n","import { useCboxLocalization } from '../context/localization';\nimport {\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type ComponentType,\n type KeyboardEvent,\n type ReactNode,\n} from 'react';\nimport { cn } from '../utils/cn';\n\n/**\n * Combobox — the canonical select replacement for the Cbox suite.\n *\n * **Native `<select>` is forbidden.** It can't host avatars, can't\n * be searched, can't be styled into the design system, and on mobile\n * it pops the OS picker which breaks the visual contract. Combobox\n * solves all of that with a single primitive:\n *\n * - Type-ahead filter on the search input (case-insensitive,\n * matches label + secondary).\n * - Keyboard contract: ArrowDown / ArrowUp move highlight, Enter\n * selects, Escape closes, Home/End jump to bounds, Tab exits.\n * - Optional avatar per option, optional secondary line.\n * - Optional grouped sections with mono-tracked headers.\n * - Optional footer link (eg \"+ New environment\").\n * - Empty-state copy when the filter excludes everything.\n *\n * Two modes:\n * - Value mode (default): `value` + `onChange` — Combobox manages\n * selection state, host treats it like a controlled input.\n * - Navigation mode: items carry `href` and `LinkComponent` is\n * supplied — clicking an item is a Link visit, not a state mutation.\n *\n * Both modes are URL/router-friendly. Value mode is for filter\n * controls; navigation mode is for context switchers (the Combobox\n * inside a ContextBar crumb is exactly this).\n */\n\nexport type ComboboxOption = {\n /** Stable key. Used as React key and for active-state matching. */\n value: string;\n /** Visible label — primary line. */\n label: string;\n /** Optional secondary line — slug, role, environment, hint. */\n secondary?: string;\n /** Optional leading icon (lucide-style — h-3.5 w-3.5). */\n icon?: ComponentType<{ className?: string; strokeWidth?: number }>;\n /**\n * Optional avatar — image src OR `{initials,accent}` chip. When\n * the option carries an avatar, the trigger renders one too if\n * the option is the active selection.\n */\n avatar?: ComboboxAvatar;\n /** Disable selection of this option. */\n disabled?: boolean;\n /**\n * Hidden text added to the searchable haystack. Useful for\n * synonyms (\"United States\" should match \"USA\", \"us\"). Not\n * displayed.\n */\n keywords?: string[];\n /**\n * Optional href for navigation mode. When set + LinkComponent is\n * supplied, clicking the option navigates instead of mutating\n * value state.\n */\n href?: string;\n};\n\nexport type ComboboxGroup = {\n /** Group heading — uppercase mono-tracked. Empty string hides the heading. */\n label: string;\n options: ComboboxOption[];\n};\n\nexport type ComboboxAvatar = {\n initials?: string;\n accent?: string;\n src?: string;\n};\n\ntype LinkComp = ComponentType<{\n href: string;\n prefetch?: boolean;\n className?: string;\n children: ReactNode;\n}>;\n\ntype CommonProps = {\n /** Options or grouped options. Pass an array of either shape. */\n items: ComboboxOption[] | ComboboxGroup[];\n /** Placeholder shown in the trigger when no value is selected. */\n placeholder?: string;\n /** Search input placeholder. */\n searchPlaceholder?: string;\n /** Empty-state copy when the filter matches nothing. */\n emptyText?: string;\n /** Optional footer link below the option list (\"+ New X\"). */\n footerLink?: {\n label: string;\n href: string;\n };\n /** Disable the entire combobox (greyed-out trigger). */\n disabled?: boolean;\n /** Required-field marker on the trigger. */\n required?: boolean;\n /** Aria-label for the trigger. */\n ariaLabel?: string;\n /** Trigger className override. Doesn't change padding/height. */\n triggerClassName?: string;\n /** Dropdown panel className override. */\n panelClassName?: string;\n /** Width policy for the trigger. Defaults to `auto` (intrinsic). */\n triggerWidth?: 'auto' | 'full';\n /**\n * Framework Link adapter for navigation-mode items + footer link.\n * If unset, navigation falls back to plain `<a>`.\n */\n LinkComponent?: LinkComp;\n /** ID for the trigger button (associate with a <Label htmlFor>). */\n id?: string;\n /** className for the outer wrapper. */\n className?: string;\n};\n\ntype ValueModeProps = CommonProps & {\n /** Selected value or `null` when nothing is selected. */\n value: string | null;\n /** Called with the option's `value` when the user picks one. */\n onChange: (value: string) => void;\n};\n\ntype NavModeProps = CommonProps & {\n /** Active value for highlight purposes. Optional in nav mode. */\n value?: string | null;\n /**\n * Omitted in nav mode. Items must carry `href`, and a\n * LinkComponent must be supplied for SPA navigation.\n */\n onChange?: never;\n};\n\nexport type ComboboxProps = ValueModeProps | NavModeProps;\n\nexport function Combobox(props: ComboboxProps) {\n const { t } = useCboxLocalization();\n const {\n items,\n placeholder = t('Select…'),\n searchPlaceholder = t('Search…'),\n emptyText = t('Nothing matches.'),\n footerLink,\n disabled = false,\n required = false,\n ariaLabel,\n triggerClassName,\n panelClassName,\n triggerWidth = 'auto',\n LinkComponent,\n id: idProp,\n className,\n value,\n } = props;\n\n const groups = useMemo(() => normaliseGroups(items), [items]);\n const flatOptions = useMemo(\n () => groups.flatMap((g) => g.options),\n [groups],\n );\n const activeOption = useMemo(\n () => (value !== null && value !== undefined\n ? flatOptions.find((opt) => opt.value === value)\n : null),\n [flatOptions, value],\n );\n\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState('');\n const [highlightIndex, setHighlightIndex] = useState(-1);\n\n const containerRef = useRef<HTMLDivElement | null>(null);\n const inputRef = useRef<HTMLInputElement | null>(null);\n const listRef = useRef<HTMLUListElement | null>(null);\n const reactId = useId();\n const id = idProp ?? reactId;\n const listId = `${id}-listbox`;\n\n // Filtered groups (preserves group structure for headings).\n const filteredGroups = useMemo(\n () => filterGroups(groups, query),\n [groups, query],\n );\n const filteredFlat = useMemo(\n () => filteredGroups.flatMap((g) => g.options),\n [filteredGroups],\n );\n\n // Reset highlight when filter changes — first non-disabled option.\n useEffect(() => {\n if (! open) return;\n const firstEnabled = filteredFlat.findIndex(\n (opt) => opt.disabled !== true,\n );\n setHighlightIndex(firstEnabled);\n }, [filteredFlat, open]);\n\n // Auto-focus the search input when the menu opens.\n useEffect(() => {\n if (open) {\n // Run on the next tick so the input is mounted.\n const id = window.setTimeout(() => inputRef.current?.focus(), 0);\n return () => window.clearTimeout(id);\n }\n setQuery('');\n\n return undefined;\n }, [open]);\n\n // Click-outside close.\n useEffect(() => {\n if (! open) return;\n\n function onPointerDown(event: PointerEvent): void {\n if (\n containerRef.current !== null &&\n ! containerRef.current.contains(event.target as Node)\n ) {\n setOpen(false);\n }\n }\n\n window.addEventListener('pointerdown', onPointerDown);\n return () => window.removeEventListener('pointerdown', onPointerDown);\n }, [open]);\n\n const onSelectOption = useCallback(\n (opt: ComboboxOption) => {\n if (opt.disabled === true) return;\n\n if (\n opt.href !== undefined &&\n LinkComponent !== undefined &&\n props.onChange === undefined\n ) {\n // Navigation mode — Link handles it; just close.\n setOpen(false);\n return;\n }\n\n if (props.onChange !== undefined) {\n props.onChange(opt.value);\n }\n setOpen(false);\n },\n [LinkComponent, props],\n );\n\n const onKeyDown = useCallback(\n (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n setHighlightIndex((current) =>\n nextEnabledIndex(filteredFlat, current, 1),\n );\n return;\n }\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n setHighlightIndex((current) =>\n nextEnabledIndex(filteredFlat, current, -1),\n );\n return;\n }\n if (event.key === 'Home') {\n event.preventDefault();\n setHighlightIndex(\n filteredFlat.findIndex((o) => o.disabled !== true),\n );\n return;\n }\n if (event.key === 'End') {\n event.preventDefault();\n let last = -1;\n for (let i = 0; i < filteredFlat.length; i++) {\n const opt = filteredFlat[i];\n if (opt !== undefined && opt.disabled !== true) {\n last = i;\n }\n }\n setHighlightIndex(last);\n return;\n }\n if (event.key === 'Enter') {\n if (highlightIndex >= 0) {\n event.preventDefault();\n const opt = filteredFlat[highlightIndex];\n if (opt !== undefined) {\n onSelectOption(opt);\n }\n }\n return;\n }\n if (event.key === 'Escape') {\n event.preventDefault();\n setOpen(false);\n return;\n }\n if (event.key === 'Tab') {\n setOpen(false);\n return;\n }\n },\n [filteredFlat, highlightIndex, onSelectOption],\n );\n\n return (\n <div\n ref={containerRef}\n className={cn('relative', triggerWidth === 'full' && 'w-full', className)}\n >\n <button\n id={id}\n type=\"button\"\n role=\"combobox\"\n disabled={disabled}\n aria-expanded={open}\n aria-haspopup=\"listbox\"\n aria-controls={listId}\n aria-required={required}\n aria-label={ariaLabel}\n onClick={() => setOpen((v) => ! v)}\n className={cn(\n 'flex h-9 items-center gap-2 rounded-md border border-input bg-card px-3 text-left text-[13px] text-foreground transition-colors',\n triggerWidth === 'full' && 'w-full',\n 'hover:border-border-strong focus-visible:ring-2 focus-visible:ring-ring focus-visible:outline-none',\n open && 'border-border-strong ring-2 ring-ring/30',\n disabled && 'cursor-not-allowed opacity-60',\n triggerClassName,\n )}\n >\n {activeOption?.avatar !== undefined ? (\n <ComboboxAvatarChip\n avatar={activeOption.avatar}\n fallbackLabel={activeOption.label}\n />\n ) : activeOption?.icon !== undefined ? (\n <activeOption.icon\n className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\"\n strokeWidth={1.7}\n />\n ) : null}\n <span\n className={cn(\n 'flex-1 truncate',\n activeOption === null || activeOption === undefined\n ? 'text-muted-foreground'\n : '',\n )}\n >\n {activeOption !== null && activeOption !== undefined\n ? activeOption.label\n : placeholder}\n </span>\n <Chevron open={open} />\n </button>\n\n {open ? (\n <div\n className={cn(\n 'absolute left-0 right-0 top-full z-30 mt-1 overflow-hidden rounded-md border border-border bg-popover shadow-lg',\n panelClassName,\n )}\n >\n <div className=\"border-b border-border/60 px-2 py-2\">\n <div className=\"relative\">\n <SearchIcon />\n <input\n ref={inputRef}\n type=\"text\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n onKeyDown={onKeyDown}\n placeholder={searchPlaceholder}\n className=\"h-8 w-full rounded-sm border-0 bg-transparent pl-7 pr-2 text-[13px] outline-none placeholder:text-muted-foreground/70\"\n aria-controls={listId}\n aria-autocomplete=\"list\"\n aria-activedescendant={\n highlightIndex >= 0\n ? `${listId}-${highlightIndex}`\n : undefined\n }\n />\n </div>\n </div>\n\n <ul\n id={listId}\n ref={listRef}\n role=\"listbox\"\n className=\"max-h-72 overflow-y-auto py-1\"\n >\n {filteredFlat.length === 0 ? (\n <li className=\"px-3 py-6 text-center text-[13px] text-muted-foreground\">\n {emptyText}\n </li>\n ) : (\n filteredGroups.map((group, groupIndex) => (\n <ComboboxGroupRows\n key={group.label || `group-${groupIndex}`}\n group={group}\n flatOptions={filteredFlat}\n listId={listId}\n highlightIndex={highlightIndex}\n activeValue={value ?? null}\n LinkComponent={LinkComponent}\n onSelect={onSelectOption}\n onHover={(idx) => setHighlightIndex(idx)}\n />\n ))\n )}\n </ul>\n\n {footerLink !== undefined ? (\n <FooterLink\n label={footerLink.label}\n href={footerLink.href}\n LinkComponent={LinkComponent}\n onAfterClick={() => setOpen(false)}\n />\n ) : null}\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction ComboboxGroupRows({\n group,\n flatOptions,\n listId,\n highlightIndex,\n activeValue,\n LinkComponent,\n onSelect,\n onHover,\n}: {\n group: ComboboxGroup;\n flatOptions: ComboboxOption[];\n listId: string;\n highlightIndex: number;\n activeValue: string | null;\n LinkComponent: LinkComp | undefined;\n onSelect: (opt: ComboboxOption) => void;\n onHover: (idx: number) => void;\n}) {\n if (group.options.length === 0) return null;\n\n return (\n <>\n {group.label !== '' ? (\n <li\n role=\"presentation\"\n className=\"text-mono px-3 pt-2 pb-1 text-[10px] font-semibold tracking-[0.18em] text-muted-foreground/70 uppercase\"\n >\n {group.label}\n </li>\n ) : null}\n {group.options.map((opt) => {\n const flatIndex = flatOptions.indexOf(opt);\n const isHighlighted = flatIndex === highlightIndex;\n const isActive = opt.value === activeValue;\n const inner = (\n <div className=\"flex w-full min-w-0 items-center gap-2.5 px-2.5 py-2\">\n {opt.avatar !== undefined ? (\n <ComboboxAvatarChip\n avatar={opt.avatar}\n fallbackLabel={opt.label}\n />\n ) : opt.icon !== undefined ? (\n <opt.icon\n className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\"\n strokeWidth={1.7}\n />\n ) : null}\n <div className=\"flex min-w-0 flex-1 flex-col leading-tight\">\n <span className=\"truncate text-[13px] font-medium text-foreground\">\n {opt.label}\n </span>\n {opt.secondary !== undefined ? (\n <span className=\"text-mono truncate text-[10px] text-muted-foreground\">\n {opt.secondary}\n </span>\n ) : null}\n </div>\n {isActive ? <Check /> : null}\n </div>\n );\n\n const className = cn(\n 'group block w-full rounded-sm transition-colors text-left',\n opt.disabled === true && 'cursor-not-allowed opacity-50',\n isHighlighted && opt.disabled !== true && 'bg-secondary',\n isActive && 'bg-accent-soft hover:bg-accent-soft/80',\n );\n\n if (\n opt.href !== undefined &&\n LinkComponent !== undefined\n ) {\n return (\n <li\n key={opt.value}\n id={`${listId}-${flatIndex}`}\n role=\"option\"\n aria-selected={isActive}\n aria-disabled={opt.disabled === true}\n onMouseEnter={() => onHover(flatIndex)}\n >\n <LinkComponent\n href={opt.href}\n prefetch\n className={className}\n >\n {inner}\n </LinkComponent>\n </li>\n );\n }\n\n return (\n <li\n key={opt.value}\n id={`${listId}-${flatIndex}`}\n role=\"option\"\n aria-selected={isActive}\n aria-disabled={opt.disabled === true}\n onMouseEnter={() => onHover(flatIndex)}\n >\n <button\n type=\"button\"\n disabled={opt.disabled === true}\n onClick={() => onSelect(opt)}\n className={className}\n >\n {inner}\n </button>\n </li>\n );\n })}\n </>\n );\n}\n\nfunction FooterLink({\n label,\n href,\n LinkComponent,\n onAfterClick,\n}: {\n label: string;\n href: string;\n LinkComponent: LinkComp | undefined;\n onAfterClick: () => void;\n}) {\n const className =\n 'flex items-center gap-2 border-t border-border/60 px-3 py-2.5 text-[13px] font-medium text-info transition-colors hover:bg-info-soft';\n\n if (LinkComponent !== undefined) {\n return (\n <LinkComponent\n href={href}\n prefetch\n className={className}\n >\n <Plus />\n <span>{label}</span>\n </LinkComponent>\n );\n }\n\n return (\n <a\n href={href}\n className={className}\n onClick={onAfterClick}\n >\n <Plus />\n <span>{label}</span>\n </a>\n );\n}\n\nfunction ComboboxAvatarChip({\n avatar,\n fallbackLabel,\n}: {\n avatar: ComboboxAvatar;\n fallbackLabel: string;\n}) {\n const initials = avatar.initials ?? deriveInitials(fallbackLabel);\n const style =\n avatar.src === undefined && avatar.accent !== undefined\n ? { backgroundColor: avatar.accent, color: '#fff' }\n : undefined;\n\n if (avatar.src !== undefined) {\n return (\n <img\n src={avatar.src}\n alt=\"\"\n className=\"h-5 w-5 shrink-0 rounded-sm bg-secondary object-cover\"\n loading=\"lazy\"\n />\n );\n }\n\n return (\n <span\n style={style}\n className={cn(\n 'flex h-5 w-5 shrink-0 items-center justify-center rounded-sm text-[9px] font-semibold tracking-tight',\n avatar.accent === undefined && 'bg-info-soft text-info',\n )}\n >\n {initials}\n </span>\n );\n}\n\nfunction deriveInitials(label: string): string {\n const parts = label.trim().split(/\\s+/);\n if (parts.length >= 2) {\n return ((parts[0]?.[0] ?? '') + (parts[1]?.[0] ?? '')).toUpperCase();\n }\n return (label.slice(0, 2) || '?').toUpperCase();\n}\n\nfunction normaliseGroups(\n items: ComboboxOption[] | ComboboxGroup[],\n): ComboboxGroup[] {\n if (items.length === 0) return [];\n const first = items[0];\n if (first !== undefined && 'options' in first) {\n return items as ComboboxGroup[];\n }\n return [{ label: '', options: items as ComboboxOption[] }];\n}\n\nfunction filterGroups(\n groups: ComboboxGroup[],\n query: string,\n): ComboboxGroup[] {\n const q = query.trim().toLowerCase();\n if (q === '') return groups;\n\n return groups\n .map((group) => ({\n label: group.label,\n options: group.options.filter((opt) => matchesQuery(opt, q)),\n }))\n .filter((group) => group.options.length > 0);\n}\n\nfunction matchesQuery(option: ComboboxOption, q: string): boolean {\n const haystack = [\n option.label,\n option.secondary ?? '',\n ...(option.keywords ?? []),\n ]\n .join(' ')\n .toLowerCase();\n\n return haystack.includes(q);\n}\n\nfunction nextEnabledIndex(\n options: ComboboxOption[],\n current: number,\n direction: 1 | -1,\n): number {\n const total = options.length;\n if (total === 0) return -1;\n\n let i = current;\n for (let step = 0; step < total; step++) {\n i = (i + direction + total) % total;\n const opt = options[i];\n if (opt !== undefined && opt.disabled !== true) {\n return i;\n }\n }\n return -1;\n}\n\nfunction Chevron({ open }: { open: boolean }) {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n className={cn(\n 'shrink-0 text-muted-foreground transition-transform duration-150',\n open && 'rotate-180',\n )}\n >\n <path d=\"m3.5 5.5 3.5 3.5 3.5-3.5\" />\n </svg>\n );\n}\n\nfunction Check() {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"shrink-0 text-accent\"\n aria-hidden\n >\n <path d=\"m3 7.5 2.5 2.5L11 4.5\" />\n </svg>\n );\n}\n\nfunction Plus() {\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"shrink-0\"\n aria-hidden\n >\n <path d=\"M6 2v8M2 6h8\" />\n </svg>\n );\n}\n\nfunction SearchIcon() {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"pointer-events-none absolute left-1.5 top-1/2 -translate-y-1/2 text-muted-foreground\"\n aria-hidden\n >\n <circle cx=\"6\" cy=\"6\" r=\"4.25\" />\n <path d=\"m11.5 11.5-2.5-2.5\" />\n </svg>\n );\n}\n","import type { ComponentProps, ReactNode } from 'react';\nimport { cn } from '../utils/cn';\n\n/**\n * Generic panel container — soft border, card surface, subtle shadow.\n * The default building block for every section on a page.\n */\nexport function DataPanel({\n className,\n children,\n ...rest\n}: ComponentProps<'section'>) {\n return (\n <section\n className={cn(\n 'rounded-lg border border-border bg-card text-card-foreground shadow-[0_1px_2px_rgb(0_0_0/0.04),0_4px_12px_rgb(0_0_0/0.03)]',\n className,\n )}\n {...rest}\n >\n {children}\n </section>\n );\n}\n\ntype SectionHeaderProps = {\n title: ReactNode;\n description?: ReactNode;\n actions?: ReactNode;\n className?: string;\n};\n\n/**\n * Section header that sits inside a DataPanel. Title in semibold sans,\n * optional muted lead, right-aligned actions slot.\n */\nexport function SectionHeader({\n title,\n description,\n actions,\n className,\n}: SectionHeaderProps) {\n return (\n <header\n className={cn(\n 'flex flex-col gap-3 border-b border-border px-5 py-4 sm:flex-row sm:items-center sm:justify-between',\n className,\n )}\n >\n <div className=\"space-y-1\">\n <h2 className=\"text-[15px] leading-none font-semibold text-foreground\">\n {title}\n </h2>\n {description ? (\n <p className=\"text-sm text-muted-foreground\">\n {description}\n </p>\n ) : null}\n </div>\n {actions ? (\n <div className=\"flex shrink-0 items-center gap-2\">\n {actions}\n </div>\n ) : null}\n </header>\n );\n}\n\n/**\n * Vertically padded content body for a DataPanel.\n */\nexport function PanelBody({\n className,\n children,\n ...rest\n}: ComponentProps<'div'>) {\n return (\n <div className={cn('px-5 py-4', className)} {...rest}>\n {children}\n </div>\n );\n}\n","export default function Heading({\n title,\n description,\n variant = 'default',\n}: {\n title: string;\n description?: string;\n variant?: 'default' | 'small';\n}) {\n return (\n <header className={variant === 'small' ? '' : 'mb-8 space-y-0.5'}>\n <h2\n className={\n variant === 'small'\n ? 'mb-0.5 text-base font-medium'\n : 'text-xl font-semibold tracking-tight'\n }\n >\n {title}\n </h2>\n {description && (\n <p className=\"text-sm text-muted-foreground\">{description}</p>\n )}\n </header>\n );\n}\n","import type { ReactNode } from 'react';\nimport { cn } from '../utils/cn';\n\ntype KeyValueProps = {\n label: string;\n children: ReactNode;\n /** Render the value in monospace. Default true — most values are technical. */\n mono?: boolean;\n className?: string;\n};\n\n/**\n * Two-column read-only field row. Label in mono caps, value in mono\n * by default (for slugs/IDs/dates) — pass `mono={false}` for prose.\n */\nexport function KeyValue({\n label,\n children,\n mono = true,\n className,\n}: KeyValueProps) {\n return (\n <div\n className={cn(\n 'grid grid-cols-[140px_1fr] items-baseline gap-x-6 border-b border-border py-3 last:border-b-0',\n className,\n )}\n >\n <dt className=\"text-eyebrow text-muted-foreground\">{label}</dt>\n <dd\n className={cn(\n 'text-sm break-all text-foreground',\n mono && 'text-mono text-[13px]',\n )}\n >\n {children}\n </dd>\n </div>\n );\n}\n\nexport function KeyValueList({\n children,\n className,\n}: {\n children: ReactNode;\n className?: string;\n}) {\n return <dl className={cn('px-6', className)}>{children}</dl>;\n}\n","import type { ReactNode } from 'react';\nimport { cn } from '../utils/cn';\n\ntype Props = {\n title: ReactNode;\n /**\n * Tiny uppercase lead-in above the title (sections, breadcrumb-light\n * disambiguation). Shown in mono-tracking caps so it reads as\n * meta, not as a competing heading.\n */\n eyebrow?: ReactNode;\n description?: ReactNode;\n actions?: ReactNode;\n className?: string;\n};\n\n/**\n * Title block at the top of every page. Big bold title, optional mono\n * eyebrow lead-in, muted lead, optional right-aligned actions slot.\n * Cortex-style — no italics, no brackets — so it carries across many\n * sibling apps cleanly.\n */\nexport function PageHeader({\n title,\n eyebrow,\n description,\n actions,\n className,\n}: Props) {\n return (\n <header\n className={cn(\n 'flex flex-col gap-3 sm:flex-row sm:items-end sm:justify-between',\n className,\n )}\n >\n <div className=\"space-y-1.5\">\n {eyebrow !== undefined ? (\n <p className=\"text-mono text-[10px] font-semibold tracking-[0.18em] text-muted-foreground uppercase\">\n {eyebrow}\n </p>\n ) : null}\n <h1 className=\"text-2xl leading-tight font-semibold tracking-tight text-foreground\">\n {title}\n </h1>\n {description ? (\n <p className=\"text-sm text-muted-foreground\">\n {description}\n </p>\n ) : null}\n </div>\n {actions ? (\n <div className=\"flex shrink-0 flex-wrap items-center gap-2\">\n {actions}\n </div>\n ) : null}\n </header>\n );\n}\n","import type { ReactNode } from 'react';\nimport { cn } from '../utils/cn';\n\n/**\n * Width policy for `<PageShell>` — the single horizontal-rhythm\n * primitive every Cbox-family app shares. Pick the policy that\n * matches the page's content density:\n *\n * comfortable max-w-6xl (~1152px) — the default. Reading-friendly\n * column for prose-heavy pages: profile, security,\n * billing forms, audit row detail.\n * wide max-w-7xl (~1280px) — for tables / lists / member\n * rosters where horizontal real estate matters more\n * than reading line length. Audit log, member roster,\n * plan comparison.\n * full no max-width, only the standard horizontal padding —\n * for canvas-heavy pages (flow diagrams, dashboards)\n * where every pixel of viewport should be usable. Use\n * sparingly: raw width without column rules feels\n * chaotic on monitors past 1600px.\n * bleed no max-width AND no horizontal padding. Strict edge\n * -to-edge for content that draws its own padding (a\n * flow canvas with its own pan/zoom region, a fullscreen\n * iframe, an embedded preview environment).\n */\nexport type PageWidth = 'comfortable' | 'wide' | 'full' | 'bleed';\n\nconst widthClass: Record<PageWidth, string> = {\n comfortable: 'max-w-6xl px-6 py-8 lg:px-10 lg:py-10',\n wide: 'max-w-7xl px-6 py-8 lg:px-10 lg:py-10',\n full: 'max-w-none px-6 py-8 lg:px-10 lg:py-10',\n bleed: 'max-w-none p-0',\n};\n\ntype Props = {\n children: ReactNode;\n width?: PageWidth;\n className?: string;\n};\n\n/**\n * The page-level container. Picks one of four width policies (see\n * PageWidth) and applies the canonical Cbox padding / vertical\n * rhythm. Every authenticated page in every Cbox app composes\n * through this — directly via `<PageShell>` or, more usually, via\n * the per-app `<Page>` wrapper that combines PageShell + PageHeader\n * + PageTabs.\n *\n * Width policy is the only knob exposed here. Padding, max-width,\n * gutter, vertical spacing between blocks — those are baked in so\n * the eye never has to track horizontal jitter between sibling\n * pages.\n */\nexport function PageShell({\n children,\n width = 'comfortable',\n className,\n}: Props) {\n return (\n <div\n className={cn(\n 'mx-auto w-full space-y-6',\n widthClass[width],\n className,\n )}\n >\n {children}\n </div>\n );\n}\n","import { useCboxLocalization } from '../context/localization';\nimport {\n useEffect,\n useId,\n useRef,\n useState,\n type ComponentType,\n type ReactNode,\n} from 'react';\nimport { cn } from '../utils/cn';\n\n/**\n * Section navigation: every \"tab\" is a real page with its own URL.\n * No internal active-state, no callbacks — the host's router is the\n * source of truth. This is what makes deep links and hard refreshes\n * lossless: paste any URL, the right tab is active and the right\n * panel renders, with no client-side coordination required.\n *\n * Layout:\n * ≥ sm horizontal underline strip + optional `actions` slot to\n * the right; sticky just under the TopBar with a hairline\n * border-bottom and a backdrop-blur for the scroll-into\n * effect.\n * < sm dropdown showing the active tab + chevron; opens a panel\n * with the full list. Actions reflow below the trigger.\n *\n * The same primitive runs the section nav across every Cbox app. It\n * lives here so that the visual contract is single-sourced — there's\n * no way for a feature page to invent its own slightly-different tab\n * strip.\n */\n\nexport type PageTabSpec = {\n /** Display label. Truncates inline if it overflows the strip. */\n label: string;\n /** Absolute or app-relative href. The host router renders this. */\n href: string;\n /**\n * Optional leading icon. Constrained to the icon shape we use\n * everywhere — this is how cbox-ui keeps icon weights aligned\n * across primitives without depending on `lucide-react`.\n */\n icon?: ComponentType<{ className?: string; strokeWidth?: number }>;\n /**\n * Optional badge — a count, status pill, or \"new\" indicator. Use\n * sparingly; one badge in a row is signal, three is noise.\n */\n badge?: ReactNode;\n /**\n * Numeric count rendered inline. Convenience for the common\n * \"Members 12\" pattern; mutually exclusive with `badge` (badge\n * wins if both are set).\n */\n count?: number;\n /**\n * Match the current path by prefix. Use for hub pages whose\n * nested routes should still highlight the parent tab — e.g.\n * `/org/<slug>/members` highlights when on\n * `/org/<slug>/members/<id>`.\n */\n matchPrefix?: boolean;\n};\n\nexport type PageTabsProps = {\n items: PageTabSpec[];\n /** Current pathname, host-supplied. Drives active-state matching. */\n currentPath: string;\n /**\n * The framework's link component. Inertia consumers pass the\n * Inertia `Link`; TanStack Router consumers pass their typed\n * `Link`; plain anchors are the fallback. We never invent\n * navigation here.\n */\n LinkComponent?: ComponentType<{\n href: string;\n prefetch?: boolean;\n className?: string;\n children: ReactNode;\n 'aria-current'?: 'page' | undefined;\n }>;\n /**\n * Right-aligned slot on desktop, reflowed under the dropdown on\n * mobile. Use for primary section actions (Invite, Add token,\n * Export…) that belong to the section as a whole rather than the\n * specific tab. The slot is always reserved on desktop so pages\n * with and without actions keep identical row geometry — no\n * layout shift between sibling tabs.\n */\n actions?: ReactNode;\n className?: string;\n};\n\nconst DefaultLink: ComponentType<{\n href: string;\n className?: string;\n children: ReactNode;\n 'aria-current'?: 'page' | undefined;\n}> = ({ href, className, children, 'aria-current': ariaCurrent }) => (\n <a href={href} className={className} aria-current={ariaCurrent}>\n {children}\n </a>\n);\n\nexport function PageTabs({\n items,\n currentPath,\n LinkComponent = DefaultLink,\n actions,\n className,\n}: PageTabsProps) {\n const activeHref = resolveActiveHref(items, currentPath);\n\n return (\n <div\n data-component=\"page-tabs\"\n className={cn(\n // Card-style chrome — same border, radius, bg as DataPanel\n // so the tab strip reads as a peer of the content panels\n // beneath it instead of floating on the page background.\n // Width matches PageShell content; no sticky positioning.\n 'rounded-lg border border-border bg-card',\n className,\n )}\n >\n {/* Desktop: strip + actions on the same baseline. The strip's\n active underline anchors the visual baseline of the row;\n the actions slot is always rendered (even when empty) so\n pages with and without actions stay byte-identical in\n width and content alignment. */}\n <div className=\"hidden items-end gap-3 px-3 sm:flex\">\n <DesktopStrip\n items={items}\n activeHref={activeHref}\n LinkComponent={LinkComponent}\n />\n <div className=\"flex min-h-12 shrink-0 items-center gap-2\">\n {actions}\n </div>\n </div>\n\n {/* Mobile: dropdown + actions stacked underneath. */}\n <div className=\"flex flex-col gap-2 p-3 sm:hidden\">\n <MobileDropdown\n items={items}\n activeHref={activeHref}\n LinkComponent={LinkComponent}\n />\n {actions !== undefined ? (\n <div className=\"flex flex-wrap items-center gap-2\">\n {actions}\n </div>\n ) : null}\n </div>\n </div>\n );\n}\n\ntype StripProps = {\n items: PageTabSpec[];\n activeHref: string | null;\n LinkComponent: NonNullable<PageTabsProps['LinkComponent']>;\n};\n\nfunction DesktopStrip({ items, activeHref, LinkComponent }: StripProps) {\n const { t } = useCboxLocalization();\n return (\n <nav\n // Pill-style tabs inside the card chrome read clearly as\n // switching controls: active gets a filled chip + ring,\n // inactive sits in plain text with a hover fill. The whole\n // strip is centered vertically inside the row so the actions\n // slot on the right shares the same baseline.\n className=\"flex min-h-12 flex-1 items-center gap-1 overflow-x-auto overflow-y-hidden py-1.5\"\n role=\"tablist\"\n aria-label={t(\"Section navigation\")}\n >\n {items.map((item) => {\n const Icon = item.icon;\n const active = item.href === activeHref;\n\n return (\n <LinkComponent\n key={item.href}\n href={item.href}\n prefetch\n aria-current={active ? 'page' : undefined}\n className={cn(\n 'inline-flex items-center gap-2 rounded-md px-2.5 py-1.5 text-[13px] whitespace-nowrap transition-colors',\n active\n ? 'bg-secondary font-semibold text-foreground shadow-sm ring-1 ring-border-strong/60'\n : 'text-muted-foreground hover:bg-secondary/60 hover:text-foreground',\n )}\n >\n {Icon !== undefined ? (\n <Icon\n className={cn(\n 'h-3.5 w-3.5 shrink-0',\n active\n ? 'text-foreground'\n : 'text-muted-foreground',\n )}\n strokeWidth={1.7}\n />\n ) : null}\n <span>{item.label}</span>\n <ItemTrailing item={item} active={active} />\n </LinkComponent>\n );\n })}\n </nav>\n );\n}\n\nfunction MobileDropdown({ items, activeHref, LinkComponent }: StripProps) {\n const { t } = useCboxLocalization();\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement | null>(null);\n const listId = useId();\n\n const active = items.find((item) => item.href === activeHref) ?? items[0];\n\n // Click-outside + Escape close. Same popover contract every other\n // cbox-ui dropdown follows so it feels native to users navigating\n // by keyboard.\n useEffect(() => {\n if (! open) return;\n\n function onPointerDown(event: PointerEvent): void {\n if (\n ref.current !== null &&\n ! ref.current.contains(event.target as Node)\n ) {\n setOpen(false);\n }\n }\n\n function onKey(event: KeyboardEvent): void {\n if (event.key === 'Escape') setOpen(false);\n }\n\n window.addEventListener('pointerdown', onPointerDown);\n window.addEventListener('keydown', onKey);\n\n return () => {\n window.removeEventListener('pointerdown', onPointerDown);\n window.removeEventListener('keydown', onKey);\n };\n }, [open]);\n\n if (active === undefined) {\n return null;\n }\n\n const ActiveIcon = active.icon;\n\n return (\n <div ref={ref} className=\"relative\">\n <button\n type=\"button\"\n onClick={() => setOpen((v) => ! v)}\n aria-expanded={open}\n aria-haspopup=\"listbox\"\n aria-controls={listId}\n className={cn(\n 'flex w-full min-h-11 items-center justify-between gap-2 rounded-md border border-border bg-card px-3 text-left text-[13px] font-medium text-foreground transition-colors hover:border-border-strong',\n open && 'border-border-strong ring-2 ring-ring/30',\n )}\n >\n <span className=\"flex min-w-0 items-center gap-2\">\n {ActiveIcon !== undefined ? (\n <ActiveIcon\n className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\"\n strokeWidth={1.7}\n />\n ) : null}\n <span className=\"truncate\">{active.label}</span>\n <ItemTrailing item={active} active />\n </span>\n <Chevron open={open} />\n </button>\n\n {open ? (\n <ul\n id={listId}\n role=\"listbox\"\n aria-label={t(\"Section navigation\")}\n className=\"absolute left-0 right-0 top-full z-30 mt-1 overflow-hidden rounded-md border border-border bg-popover shadow-lg\"\n >\n {items.map((item) => {\n const Icon = item.icon;\n const isActive = item.href === activeHref;\n\n return (\n <li key={item.href}>\n <LinkComponent\n href={item.href}\n prefetch\n aria-current={isActive ? 'page' : undefined}\n className={cn(\n 'flex w-full items-center gap-2 px-3 py-2.5 text-[13px] transition-colors',\n isActive\n ? 'bg-accent-soft font-semibold text-foreground'\n : 'text-muted-foreground hover:bg-secondary hover:text-foreground',\n )}\n >\n {Icon !== undefined ? (\n <Icon\n className={cn(\n 'h-3.5 w-3.5 shrink-0',\n isActive\n ? 'text-foreground'\n : 'text-muted-foreground',\n )}\n strokeWidth={1.7}\n />\n ) : null}\n <span className=\"flex-1 truncate\">\n {item.label}\n </span>\n <ItemTrailing\n item={item}\n active={isActive}\n />\n </LinkComponent>\n </li>\n );\n })}\n </ul>\n ) : null}\n </div>\n );\n}\n\nfunction ItemTrailing({\n item,\n active,\n}: {\n item: PageTabSpec;\n active: boolean;\n}): ReactNode {\n if (item.badge !== undefined) {\n return <span className=\"ml-1 shrink-0\">{item.badge}</span>;\n }\n\n if (item.count !== undefined) {\n return (\n <span\n className={cn(\n 'ml-1 shrink-0 rounded-sm border px-1 text-[10px] font-semibold tracking-tight tabular-nums',\n active\n ? 'border-border-strong bg-secondary text-foreground'\n : 'border-border bg-secondary/60 text-muted-foreground',\n )}\n >\n {item.count}\n </span>\n );\n }\n\n return null;\n}\n\nfunction Chevron({ open }: { open: boolean }): ReactNode {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={cn(\n 'shrink-0 text-muted-foreground transition-transform duration-150',\n open && 'rotate-180',\n )}\n aria-hidden\n >\n <path d=\"m3.5 5.5 3.5 3.5 3.5-3.5\" />\n </svg>\n );\n}\n\n/**\n * Strip query string and hash from a URL/href so active-state matching\n * compares paths only. Tab hrefs may carry `?org=<slug>` or other\n * adapter-injected params (id's withOrgContext, cortex's org pinning,\n * etc.); the user's current URL doesn't include those when the page\n * mounted via a path-only navigation. Without this strip, `/foo` and\n * `/foo?org=cbox` are not equal and no tab lights up.\n */\nfunction pathOnly(href: string): string {\n const queryIndex = href.indexOf('?');\n const hashIndex = href.indexOf('#');\n let end = href.length;\n if (queryIndex !== -1) end = Math.min(end, queryIndex);\n if (hashIndex !== -1) end = Math.min(end, hashIndex);\n\n return href.slice(0, end);\n}\n\n/**\n * Active-state resolver — picks the longest-matching href so a more\n * specific child wins over its parent. Without this rule, both\n * `/security` and `/security/passkeys` would match when the user is\n * on Passkeys and we'd light up two tabs.\n *\n * Matches paths only (query / hash stripped) so tab hrefs that carry\n * adapter-injected params still resolve.\n */\nfunction resolveActiveHref(\n items: PageTabSpec[],\n currentPath: string,\n): string | null {\n const current = pathOnly(currentPath);\n\n const candidates = items\n .map((item) => {\n const itemPath = pathOnly(item.href);\n const matched =\n item.matchPrefix === true\n ? current === itemPath ||\n current.startsWith(itemPath + '/')\n : current === itemPath;\n\n return matched ? item.href : null;\n })\n .filter((href): href is string => href !== null);\n\n if (candidates.length === 0) return null;\n\n return candidates.reduce((longest, href) =>\n href.length > longest.length ? href : longest,\n );\n}\n","import type { ComponentType, ReactNode } from 'react';\nimport { cn } from '../utils/cn';\n\n/**\n * A clickable list row — replaces the \"name on left + Manage button on\n * right\" pattern with a row that's clickable as a single Link, with a\n * visible hover state and a focus ring. Trailing content (badges,\n * action buttons) sits in the `trailing` slot, which renders alongside\n * the body but stops click-propagation on any nested interactive\n * control so action buttons there don't trigger row navigation.\n *\n * <RowLink href={editOrg(slug).url} LinkComponent={Link}>\n * <Avatar />\n * <div>\n * <p>Cbox Systems</p>\n * <p className=\"text-mono\">cbox-systems</p>\n * </div>\n * </RowLink>\n *\n * With trailing actions:\n *\n * <RowLink href={...} trailing={<StatusPill>owner</StatusPill>}>\n *\n * Hit target: the entire row. The Link wraps all content directly so\n * every pixel inside the row is clickable, including the trailing\n * area's whitespace. Interactive controls inside `trailing` (buttons,\n * inputs, anchors, role=\"button\") auto-stop the click via the\n * onClickCapture handler — no per-button stopPropagation boilerplate.\n */\n\nexport type RowLinkProps = {\n /** Destination URL — clicking anywhere on the row navigates here. */\n href: string;\n /** Row body. Compose freely; common pattern is avatar + text block. */\n children: ReactNode;\n /**\n * Right-aligned slot. Status pills, action buttons, kebab menus.\n * Interactive controls inside this slot auto-stop the row click\n * via DOM-traversal (button/a/input/select/textarea/[role=button]\n * /[data-stop-row-click]). No manual stopPropagation needed.\n */\n trailing?: ReactNode;\n /**\n * The framework's link component. Inertia consumers pass the\n * Inertia `Link`; TanStack Router consumers pass their typed\n * `Link`. Plain `<a>` is the fallback.\n */\n LinkComponent?: ComponentType<{\n href: string;\n prefetch?: boolean;\n className?: string;\n children: ReactNode;\n }>;\n /** Highlight as the active row (the user's current selection). */\n active?: boolean;\n /** Additional classes for the row container. */\n className?: string;\n};\n\nconst DefaultLink: ComponentType<{\n href: string;\n className?: string;\n children: ReactNode;\n}> = ({ href, className, children }) => (\n <a href={href} className={className}>\n {children}\n </a>\n);\n\nexport function RowLink({\n href,\n children,\n trailing,\n LinkComponent = DefaultLink,\n active = false,\n className,\n}: RowLinkProps) {\n return (\n <LinkComponent\n href={href}\n prefetch\n // The Link IS the row. Wrapping everything in the Link\n // means every pixel inside is clickable — no fiddly\n // overlay positioning or stretched-link hacks.\n className={cn(\n 'group flex w-full items-center gap-4 px-5 py-3.5 transition-colors focus-visible:bg-secondary/60 focus-visible:outline-none',\n active\n ? 'bg-accent-soft hover:bg-accent-soft/80'\n : 'hover:bg-secondary/60',\n className,\n )}\n >\n <span\n data-component=\"row-link\"\n data-active={active ? 'true' : undefined}\n // Body content. Captures clicks on `trailing`'s\n // interactive controls so they don't bubble up to the\n // Link and trigger the row navigation. The \"click\" on\n // a button inside trailing fires the button's handler\n // and stops there.\n onClickCapture={(event) => {\n const target = event.target as HTMLElement;\n if (\n target.closest(\n 'button, a, input, select, textarea, [role=\"button\"], [data-stop-row-click]',\n ) !== null &&\n target.closest('[data-row-body]') === null\n ) {\n event.stopPropagation();\n }\n }}\n className=\"flex w-full items-center gap-4\"\n >\n <span\n data-row-body\n className=\"flex min-w-0 flex-1 items-center gap-4\"\n >\n {children}\n </span>\n {trailing !== undefined ? (\n <span className=\"flex shrink-0 items-center gap-2\">\n {trailing}\n </span>\n ) : null}\n </span>\n </LinkComponent>\n );\n}\n","import type { LucideIcon } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport { cn } from '../utils/cn';\n\ntype Tone = 'info' | 'success' | 'warning' | 'destructive' | 'neutral';\n\nconst toneStyles: Record<Tone, { bg: string; fg: string }> = {\n info: { bg: 'bg-info-soft', fg: 'text-info' },\n success: { bg: 'bg-success-soft', fg: 'text-success' },\n warning: { bg: 'bg-warning-soft', fg: 'text-warning' },\n destructive: { bg: 'bg-destructive-soft', fg: 'text-destructive' },\n neutral: { bg: 'bg-secondary', fg: 'text-foreground' },\n};\n\ntype StatTileProps = {\n label: string;\n value: ReactNode;\n /** Small caption under the value. */\n suffix?: ReactNode;\n icon: LucideIcon;\n tone?: Tone;\n className?: string;\n};\n\n/**\n * Cortex-style metric tile. Coloured square icon block on the left,\n * label + value on the right, optional caption below the value.\n */\nexport function StatTile({\n label,\n value,\n suffix,\n icon: Icon,\n tone = 'info',\n className,\n}: StatTileProps) {\n const styles = toneStyles[tone];\n\n return (\n <div\n className={cn(\n 'flex items-center gap-3 rounded-lg border border-border bg-card p-4 shadow-[0_1px_2px_rgba(0,0,0,0.02)] transition-colors hover:border-border-strong',\n className,\n )}\n >\n <div\n className={cn(\n 'flex h-10 w-10 shrink-0 items-center justify-center rounded-md',\n styles.bg,\n )}\n >\n <Icon className={cn('h-5 w-5', styles.fg)} strokeWidth={1.8} />\n </div>\n <div className=\"min-w-0 flex-1 space-y-0.5\">\n <p className=\"tabular text-2xl leading-none font-semibold tracking-tight text-foreground\">\n {value}\n </p>\n <p className=\"truncate text-xs text-muted-foreground\">\n {label}\n </p>\n {suffix ? (\n <p className=\"text-mono truncate text-[10px] text-muted-foreground/80\">\n {suffix}\n </p>\n ) : null}\n </div>\n </div>\n );\n}\n","/**\n * URL-as-state — typed query-string parsing and serialization.\n *\n * The contract: anything that should survive a hard refresh, deep\n * link, or paste-share lives in the URL, not in React state. Tabs,\n * filters, search terms, pagination, sort order — every one of those\n * is a navigation, not a UI mutation. This module provides the typed\n * parsers and serializers; per-app adapters wire them to the host\n * router (Inertia's `router.get`, TanStack Router's `navigate`, etc.)\n * and shape the `[state, update]` ergonomics on top.\n *\n * Why not URLSearchParams directly? Because raw query strings throw\n * away types and have no notion of defaults. The schema declares both\n * once, and `buildUrlSearch` automatically elides values that match\n * their default so the URL stays human-readable. `?role=all&page=1`\n * collapses to `''` when `all` and `1` are the defaults. Going from\n * `state -> URL -> state` always round-trips.\n */\n\n/**\n * A single field in a URL schema. Encapsulates the three operations\n * that make typed URL state work:\n * - `parse(raw)` — string|null from the query string → typed value\n * - `serialize(v)` — typed value → string|null (null = drop the key)\n * - `isDefault(v)` — does this value equal the field's default? If\n * so, `buildUrlSearch` elides it to keep URLs short.\n */\nexport type UrlField<T> = {\n parse: (raw: string | null) => T;\n serialize: (value: T) => string | null;\n isDefault: (value: T) => boolean;\n};\n\n// `UrlField<unknown>` would block assignment from concrete fields\n// (variance: T appears in both contravariant and covariant positions).\n// `UrlField<any>` is the standard escape hatch; safety lives in\n// `InferUrlState` which keeps the value-side fully typed.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type UrlSchema = Record<string, UrlField<any>>;\n\n/**\n * Map a UrlSchema to its inferred state shape — `urlString('')` →\n * `string`, `urlEnum(['a', 'b'], 'a')` → `'a' | 'b'`, etc.\n */\nexport type InferUrlState<S extends UrlSchema> = {\n [K in keyof S]: S[K] extends UrlField<infer T> ? T : never;\n};\n\n/**\n * String field. The empty string is the conventional \"absent\" value\n * — it's what an HTML input gives you when the user clears it — so\n * we treat `'' === default` as \"drop the param\" by default. Pass an\n * explicit non-empty default if you genuinely want to persist `''`.\n */\nexport function urlString(defaultValue: string = ''): UrlField<string> {\n return {\n parse: (raw) => raw ?? defaultValue,\n serialize: (value) => value,\n isDefault: (value) => value === defaultValue,\n };\n}\n\n/**\n * Integer field with optional clamping. Non-numeric input falls back\n * to the default rather than NaN; out-of-range input clamps to the\n * boundary. Both behaviours are belt-and-braces against URL tampering.\n */\nexport function urlNumber(\n defaultValue: number,\n options: { min?: number; max?: number } = {},\n): UrlField<number> {\n const clamp = (n: number): number => {\n if (options.min !== undefined && n < options.min) return options.min;\n if (options.max !== undefined && n > options.max) return options.max;\n\n return n;\n };\n\n return {\n parse: (raw) => {\n if (raw === null) return defaultValue;\n const parsed = Number.parseInt(raw, 10);\n if (Number.isNaN(parsed)) return defaultValue;\n\n return clamp(parsed);\n },\n serialize: (value) => String(value),\n isDefault: (value) => value === defaultValue,\n };\n}\n\n/**\n * Enum field — restrict to a fixed set of strings. Unknown values\n * fall back to the default rather than poisoning typed downstream\n * code with arbitrary user input. The `as const` on the values array\n * is what lets TS narrow the field type to the union.\n */\nexport function urlEnum<T extends string>(\n values: readonly T[],\n defaultValue: T,\n): UrlField<T> {\n const allowed = new Set<string>(values);\n\n return {\n parse: (raw) =>\n raw !== null && allowed.has(raw) ? (raw as T) : defaultValue,\n serialize: (value) => value,\n isDefault: (value) => value === defaultValue,\n };\n}\n\n/**\n * Boolean field. Only the literal string `'true'` parses to true so\n * we don't accidentally interpret `?flag=0` or `?flag=false` as truthy.\n */\nexport function urlBoolean(defaultValue: boolean = false): UrlField<boolean> {\n return {\n parse: (raw) => (raw === null ? defaultValue : raw === 'true'),\n serialize: (value) => (value ? 'true' : 'false'),\n isDefault: (value) => value === defaultValue,\n };\n}\n\n/**\n * Array-of-strings field — comma-joined in the URL. Useful for\n * multi-select filters (`?tags=foo,bar,baz`). Empty arrays drop the\n * param. Per-item parsing isn't customisable on purpose; if you need\n * a typed array of enums or numbers, build a thin wrapper.\n */\nexport function urlStringArray(\n defaultValue: readonly string[] = [],\n): UrlField<string[]> {\n const defaultKey = [...defaultValue].sort().join(',');\n\n return {\n parse: (raw) => {\n if (raw === null || raw === '') return [...defaultValue];\n\n return raw.split(',').filter((item) => item !== '');\n },\n serialize: (value) => (value.length === 0 ? null : value.join(',')),\n isDefault: (value) => [...value].sort().join(',') === defaultKey,\n };\n}\n\n/**\n * Convenience: declare a schema. Pure passthrough — exists to give\n * call sites a single, named import that reads like a definition\n * rather than a bare object literal.\n */\nexport function defineUrlSchema<S extends UrlSchema>(schema: S): S {\n return schema;\n}\n\n/**\n * Parse a query string into a typed state object. Accepts both\n * leading-`?` and bare forms. Unknown keys are silently dropped —\n * the schema is the closed allow-list, which keeps server- and\n * client-readable surface area bounded.\n */\nexport function parseUrlSearch<S extends UrlSchema>(\n search: string,\n schema: S,\n): InferUrlState<S> {\n const normalised = search.startsWith('?') ? search.slice(1) : search;\n const params = new URLSearchParams(normalised);\n const state = {} as InferUrlState<S>;\n\n for (const key of Object.keys(schema)) {\n const field = schema[key];\n if (field === undefined) continue;\n (state as Record<string, unknown>)[key] = field.parse(params.get(key));\n }\n\n return state;\n}\n\n/**\n * Serialize a typed state back to a query string. Default-valued\n * fields are elided so URLs stay short and bookmarks stay portable\n * across schema changes (a URL with `?page=1` keeps working when\n * `page` later stops being serialised because it's the default).\n *\n * Returns the serialised query without a leading `?`. The host\n * adapter is responsible for prepending or stitching it onto a path.\n */\nexport function buildUrlSearch<S extends UrlSchema>(\n state: InferUrlState<S>,\n schema: S,\n): string {\n const params = new URLSearchParams();\n\n for (const key of Object.keys(schema)) {\n const field = schema[key];\n if (field === undefined) continue;\n const value = (state as Record<string, unknown>)[key];\n\n if (field.isDefault(value)) continue;\n\n const serialized = field.serialize(value);\n if (serialized !== null) {\n params.set(key, serialized);\n }\n }\n\n return params.toString();\n}\n","import { useCallback, useEffect, useRef, useState, type ReactNode } from 'react';\nimport { Menu, Pin, PinOff, PanelLeftClose, PanelLeftOpen, X } from 'lucide-react';\nimport { CboxBrand } from './cbox-brand';\nimport type { CboxNavItem, LinkComponent } from './cbox-app-sidebar';\nimport { useCboxLocalization } from '../context/localization';\n\nexport type CboxNavArea = CboxNavItem & { items?: CboxNavItem[] };\nexport type CboxWorkspaceShellProps = {\n appKey: string;\n brandSubmark: string;\n areas: CboxNavArea[];\n currentPath: string;\n LinkComponent: LinkComponent;\n context: ReactNode;\n tools: ReactNode;\n account: ReactNode;\n children: ReactNode;\n /** Where the brand row links. Default `/`. */\n brandHref?: string;\n /** `id` of the `<main>` landmark, so a host's skip link can target it. Default `main-content`. */\n mainId?: string;\n /**\n * Rail pinned open. Pass `pinned` + `onPinnedChange` to control it (the host persists the\n * preference, in a cookie or Cbox ID), or `defaultPinned` to seed the shell's own state.\n */\n pinned?: boolean;\n defaultPinned?: boolean;\n onPinnedChange?: (pinned: boolean) => void;\n /** Contextual subnav collapsed to its strip. Controlled and uncontrolled as `pinned`. */\n collapsed?: boolean;\n defaultCollapsed?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n};\n\n/**\n * How well `href` matches `path`: the href's length when the path is the href or beneath it,\n * -1 otherwise. `/` matches only itself, so a home item never claims every page.\n */\nexport function navMatchLength(path: string, href: string): number {\n if (href === '/') {\n return path === '/' ? 1 : -1;\n }\n\n return path === href || path.startsWith(href + '/') ? href.length : -1;\n}\n\n/** The item whose href is the most specific match for `path`, or undefined. */\nexport function activeNavItem<T extends CboxNavItem>(path: string, items: readonly T[]): T | undefined {\n let best: T | undefined;\n let length = -1;\n for (const item of items) {\n const match = navMatchLength(path, item.href);\n if (match > length) {\n best = item;\n length = match;\n }\n }\n\n return best;\n}\n\n/**\n * The area `path` is in: the one holding the most specific match among its own href and its\n * items' hrefs. A first-match would put every page beneath an area at `/` (an overview, a\n * dashboard) under that area and never show another area's subnav.\n */\nexport function activeNavArea<T extends CboxNavArea>(path: string, areas: readonly T[]): T | undefined {\n let best: T | undefined;\n let length = -1;\n for (const area of areas) {\n const candidates = [area.href, ...(area.items ?? []).map(item => item.href)];\n const match = Math.max(...candidates.map(href => navMatchLength(path, href)));\n if (match > length) {\n best = area;\n length = match;\n }\n }\n\n return best;\n}\n\nfunction useControllable(value: boolean | undefined, fallback: boolean, onChange: ((next: boolean) => void) | undefined): [boolean, (next: boolean | ((current: boolean) => boolean)) => void] {\n const [own, setOwn] = useState(fallback);\n const current = value ?? own;\n const ref = useRef(current);\n ref.current = current;\n const set = useCallback((next: boolean | ((current: boolean) => boolean)) => {\n const resolved = typeof next === 'function' ? next(ref.current) : next;\n if (value === undefined) setOwn(resolved);\n onChange?.(resolved);\n }, [value, onChange]);\n\n return [current, set];\n}\n\n/** Two-tier workspace navigation. Route ownership and preference persistence stay with the host. */\nexport function CboxWorkspaceShell({ appKey, brandSubmark, areas, currentPath, LinkComponent: Link, context, tools, account, children, brandHref = '/', mainId = 'main-content', pinned: pinnedProp, defaultPinned = false, onPinnedChange, collapsed: collapsedProp, defaultCollapsed = false, onCollapsedChange }: CboxWorkspaceShellProps) {\n const { t } = useCboxLocalization();\n const [pinned, setPinned] = useControllable(pinnedProp, defaultPinned, onPinnedChange);\n const [collapsed, setCollapsed] = useControllable(collapsedProp, defaultCollapsed, onCollapsedChange);\n const [expanded, setExpanded] = useState(false);\n const [mobile, setMobile] = useState(false);\n const dialog = useRef<HTMLDialogElement>(null);\n const path = currentPath.split(/[?#]/)[0] ?? '/';\n const area = activeNavArea(path, areas);\n const subnav = area?.items && area.items.length > 1 ? area : undefined;\n useEffect(() => { setMobile(false); }, [currentPath]);\n useEffect(() => {\n const el = dialog.current;\n if (mobile && el && !el.open) el.showModal();\n if (!mobile && el?.open) el.close();\n }, [mobile]);\n useEffect(() => {\n const key = (event: KeyboardEvent) => {\n if ((event.metaKey || event.ctrlKey) && event.key === '.') {\n event.preventDefault(); setCollapsed(value => !value);\n }\n };\n addEventListener('keydown', key);\n return () => removeEventListener('keydown', key);\n }, [setCollapsed]);\n const open = pinned || expanded;\n const links = (items: CboxNavItem[]) => {\n const active = activeNavItem(path, items);\n return items.map(item => <Link key={item.href} href={item.href} className={`cbx-workspace-link ${item === active ? 'is-active' : ''}`} aria-label={item.label} aria-current={item === active ? 'page' : undefined}><item.icon className=\"h-4 w-4 shrink-0\" strokeWidth={1.7} /><span>{item.label}</span></Link>);\n };\n return <div className=\"cbx-workspace\">\n <div className=\"cbx-rail-slot\" data-pinned={pinned}>\n <aside className=\"cbx-rail\" data-open={open} onMouseEnter={() => setExpanded(true)} onMouseLeave={() => setExpanded(false)} onFocusCapture={() => setExpanded(true)} onBlurCapture={event => { if (!event.currentTarget.contains(event.relatedTarget)) setExpanded(false); }}>\n <div className=\"cbx-rail-brand\"><Link href={brandHref} aria-label={t('Home')}><span className=\"dark:hidden\"><CboxBrand appKey={appKey} submark={brandSubmark} collapsed={!open} /></span><span className=\"hidden dark:block\"><CboxBrand appKey={appKey} submark={brandSubmark} collapsed={!open} tone=\"light\" /></span></Link>{open && <button type=\"button\" onClick={() => setPinned(value => !value)} aria-label={t(pinned ? 'Unpin navigation' : 'Pin navigation')} aria-pressed={pinned}>{pinned ? <PinOff size={16} /> : <Pin size={16} />}</button>}</div>\n <nav aria-label={brandSubmark}>{areas.map(item => <Link key={item.href} href={item.href} aria-label={item.label} aria-current={area === item ? 'page' : undefined} title={open ? undefined : item.label} className={`cbx-workspace-link ${area === item ? 'is-active' : ''}`}><item.icon className=\"h-4 w-4 shrink-0\" strokeWidth={1.7} />{open && <span>{item.label}</span>}</Link>)}</nav>\n <div className=\"cbx-rail-account\">{account}</div>\n </aside>\n </div>\n <div className=\"cbx-workspace-column\">\n <header className=\"cbx-workspace-header\"><button className=\"cbx-mobile-trigger\" type=\"button\" onClick={() => setMobile(true)} aria-label={t('Open navigation')}><Menu size={18} /></button><div className=\"cbx-workspace-context\">{context}</div><div className=\"cbx-workspace-tools\">{tools}</div></header>\n <div className=\"cbx-workspace-body\">\n {subnav && <aside className=\"cbx-subnav\" data-collapsed={collapsed}>{collapsed ? <button className=\"cbx-subnav-strip\" type=\"button\" onClick={() => setCollapsed(false)} aria-label={t('Expand sidebar')}><PanelLeftOpen size={16} /><span>{subnav.label}</span></button> : <><div className=\"cbx-subnav-header\"><strong>{subnav.label}</strong><button type=\"button\" onClick={() => setCollapsed(true)} aria-label={t('Collapse sidebar')} title=\"⌘.\"><PanelLeftClose size={16} /></button></div><nav aria-label={subnav.label}>{links(subnav.items ?? [])}</nav></>}</aside>}\n <main id={mainId} className=\"canvas-gradient cbx-workspace-main\">{children}</main>\n </div>\n </div>\n <dialog ref={dialog} className=\"cbx-workspace-mobile\" onClose={() => setMobile(false)} onClick={event => { if (event.target === event.currentTarget) setMobile(false); }}><div className=\"cbx-subnav-header\"><strong>{brandSubmark}</strong><button type=\"button\" onClick={() => setMobile(false)} aria-label={t('Close navigation')}><X size={18} /></button></div><nav aria-label={t('Navigation')}>{areas.map(item => <section key={item.href}>{links([item])}{item.items && <div className=\"pl-4\">{links(item.items)}</div>}</section>)}</nav><div className=\"cbx-rail-account\">{account}</div></dialog>\n </div>;\n}\n","/** The chart tokens in order, for series that set their own colour. */\nexport const CHART_PALETTE = ['var(--chart-1)', 'var(--chart-2)', 'var(--chart-3)', 'var(--chart-4)', 'var(--chart-5)'];\n\n/** A row's shape over the window, small: a line with a faint area, zero at the bottom. Decorative. */\nexport function Sparkline({ values, color = 'var(--chart-1)', width = 90, height = 20 }: { values: number[]; color?: string; width?: number; height?: number }) {\n if (values.length === 0) {\n return null;\n }\n\n const clean = values.map((value) => (Number.isFinite(value) ? value : 0));\n const max = Math.max(1e-9, ...clean);\n const points = clean.map((value, index) => [(index / Math.max(1, clean.length - 1)) * (width - 2) + 1, height - 1 - (value / max) * (height - 3)] as const);\n const d = points.map(([px, py], index) => `${index === 0 ? 'M' : 'L'}${px.toFixed(1)} ${py.toFixed(1)}`).join('');\n\n return (\n <svg width={width} height={height} viewBox={`0 0 ${width} ${height}`} aria-hidden=\"true\">\n <path d={`${d}L${width - 1} ${height}L1 ${height}Z`} fill={color} opacity={0.14} />\n <path d={d} fill=\"none\" stroke={color} strokeWidth={1.5} strokeLinejoin=\"round\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n"]}