@cboxdk/cbox-ui 0.10.0 → 0.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +25 -2
- package/dist/index.d.ts +36 -7
- package/dist/index.js +116 -28
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/tokens/shell.css +15 -0
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/context/cbox-id.tsx","../src/context/localization.tsx","../src/components/app-icon.tsx","../src/shell/context.tsx","../src/shell/media.ts","../src/shell/popover.tsx","../src/shell/option-list.tsx","../src/shell/account-menu.tsx","../src/shell/app-grid.tsx","../src/shell/data.ts","../src/shell/use-list.ts","../src/shell/context-menus.tsx","../src/shell/help-store.ts","../src/shell/help.tsx","../src/shell/icons.tsx","../src/shell/mobile.tsx","../src/shell/palette.tsx","../src/shell/shell.tsx","../src/layout/app-content.tsx","../src/layout/app-shell.tsx","../src/layout/cbox-brand.tsx","../src/components/app-catalog.tsx","../src/primitives/combobox.tsx","../src/primitives/data-panel.tsx","../src/primitives/empty-state.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/primitives/status-pill.tsx","../src/surfaces/surface-modal.tsx","../src/surfaces/inbox-surface.tsx","../src/surfaces/surface-state.tsx","../src/utils/url-state.ts","../src/charts/sparkline.tsx"],"names":["createContext","jsx","useContext","useSyncExternalStore","useState","useRef","useMemo","useEffect","jsxs","Fragment","ArrowUpRight","rows","query","kept","useCallback","useId","Search","Check","ChevronRight","script","useLayoutEffect","ArrowLeft","UserRound","BookOpen","Globe","LifeBuoy","MessageSquare","Settings","Sparkles","Users","X","LayoutGrid","Bell","q","FileText","Building2","Zap","createElement","id","Plus","initials","Chevron","DefaultLink","toneStyles","TONES"],"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 /** 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 { 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';\nimport { initials, readKnownAppCatalog, secureIconUrl, subscribeKnownAppCatalog, type CboxKnownApp } from '../app-switcher/catalog';\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 } from '../app-switcher/catalog';\nexport { readKnownAppCatalog, rememberAppCatalog, secureIconUrl } from '../app-switcher/catalog';\n\nconst EMPTY: CboxKnownApp[] = [];\n\n/** The last catalog this browser kept; empty on the server and before the first answer. */\nexport function useKnownAppCatalog(): CboxKnownApp[] {\n return useSyncExternalStore(subscribeKnownAppCatalog, readKnownAppCatalog, () => EMPTY);\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 { createContext, useContext, type AnchorHTMLAttributes, type ComponentType, type ReactNode } from 'react';\nimport type { CboxTranslator } from '../context/localization';\nimport type { HelpArticle, HelpStore } from './help-store';\nimport type { ShellIcon } from './icons';\nimport type { Shell, ShellNavigate, ShellPreferenceChange, ShellPreferences } from './types';\n\n/** A client-side link (Inertia's `Link`). Receives `href`, `className`, `children` and ARIA props. */\nexport type ShellLinkComponent = ComponentType<AnchorHTMLAttributes<HTMLAnchorElement> & { href: string; children?: ReactNode }>;\n\n/** Which overlay is open. Only one at a time, so two menus never stack. */\nexport type ShellOverlay =\n | 'org'\n | 'context'\n | 'apps'\n | 'account'\n | 'palette'\n | 'nav-sheet'\n | 'context-sheet'\n | null;\n\nexport type ShellApi = {\n shell: Shell;\n t: CboxTranslator;\n navigate: ShellNavigate;\n Link: ShellLinkComponent;\n icons: Readonly<Record<string, ShellIcon>>;\n preferences: ShellPreferences;\n setPreference: ShellPreferenceChange;\n overlay: ShellOverlay;\n setOverlay: (overlay: ShellOverlay) => void;\n help: HelpStore;\n /** Open or close Help. */\n toggleHelp: (open?: boolean) => void;\n /** Open Help on an article. */\n openArticle: (article: HelpArticle) => void;\n /** Open Help and send a question to the chat with the page as context. */\n ask: (question: string) => void;\n /** Switch context: `chosen` maps level keys to ids. */\n switchTo: (chosen: Record<string, string>) => void;\n};\n\nexport const ShellContext = createContext<ShellApi | null>(null);\n\nexport function useShell(): ShellApi {\n const api = useContext(ShellContext);\n if (api === null) throw new Error('[cbox-ui] Shell parts must be rendered inside <CboxShell>.');\n return api;\n}\n\n/** Help for a page's own `?` button, or `null` outside the shell. */\nexport function useShellHelp(): Pick<ShellApi, 'toggleHelp' | 'openArticle' | 'ask'> | null {\n const api = useContext(ShellContext);\n return api === null ? null : { toggleHelp: api.toggleHelp, openArticle: api.openArticle, ask: api.ask };\n}\n","import { useSyncExternalStore } from 'react';\n\n/** Fine pointer and hover: a desktop. Only there does a search field take focus by itself (§4.5). */\nexport const DESKTOP_POINTER = '(hover: hover) and (pointer: fine)';\n/** Help docks beside the page from here; below it is a full-screen overlay (§4.4). */\nexport const HELP_DOCKED = '(min-width: 1280px)';\n/** The phone layout (§4.5). */\nexport const MOBILE = '(max-width: 767px)';\n\nfunction query(media: string): MediaQueryList | null {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return null;\n return window.matchMedia(media);\n}\n\nexport function matches(media: string): boolean {\n return query(media)?.matches ?? false;\n}\n\n/** Whether a search field may focus itself: never on touch. */\nexport function canAutofocus(): boolean {\n return matches(DESKTOP_POINTER);\n}\n\n/** A live media query. `fallback` is what the server and the first client render assume. */\nexport function useMedia(media: string, fallback = false): boolean {\n return useSyncExternalStore(\n change => {\n const list = query(media);\n if (list === null) return () => undefined;\n list.addEventListener?.('change', change);\n return () => list.removeEventListener?.('change', change);\n },\n () => query(media)?.matches ?? fallback,\n () => fallback,\n );\n}\n","import { useEffect, useLayoutEffect, useRef, useState, type CSSProperties, type ReactNode, type RefObject } from 'react';\n\nexport type Placement = 'bottom-start' | 'bottom-end' | 'top-start';\n\nconst GAP = 6;\nconst MARGIN = 8;\n\ntype Position = { top?: number; bottom?: number; left: number; maxHeight: number };\n\nfunction place(anchor: DOMRect, size: { width: number }, placement: Placement): Position {\n const width = window.innerWidth;\n const height = window.innerHeight;\n let left = placement === 'bottom-end' ? anchor.right - size.width : anchor.left;\n left = Math.max(MARGIN, Math.min(left, width - size.width - MARGIN));\n if (placement === 'top-start') {\n const bottom = height - anchor.top + GAP;\n return { bottom, left, maxHeight: Math.max(160, height - bottom - MARGIN) };\n }\n const top = anchor.bottom + GAP;\n return { top, left, maxHeight: Math.max(160, height - top - MARGIN) };\n}\n\n/**\n * A menu surface anchored to its trigger. It is positioned `fixed` from the trigger's box before\n * the first paint (no jump, never clipped by a scrolling parent), closes on a pointer down outside\n * it and on Escape, and hands focus back to the trigger when it closes from the keyboard.\n */\nexport function Popover({\n open,\n anchor,\n placement = 'bottom-start',\n onClose,\n className,\n label,\n children,\n}: {\n open: boolean;\n anchor: RefObject<HTMLElement | null>;\n placement?: Placement;\n onClose: (reason: 'escape' | 'outside' | 'tab') => void;\n className?: string;\n label: string;\n children: ReactNode;\n}) {\n const surface = useRef<HTMLDivElement>(null);\n const [position, setPosition] = useState<Position | null>(null);\n\n useLayoutEffect(() => {\n if (!open) {\n setPosition(null);\n return;\n }\n const update = () => {\n const box = anchor.current?.getBoundingClientRect();\n const el = surface.current;\n if (box === undefined || el === null) return;\n setPosition(place(box, { width: el.offsetWidth }, placement));\n };\n update();\n window.addEventListener('resize', update);\n return () => window.removeEventListener('resize', update);\n }, [open, anchor, placement]);\n\n useEffect(() => {\n if (!open) return;\n const down = (event: PointerEvent) => {\n const target = event.target as Node | null;\n if (target === null) return;\n if (surface.current?.contains(target) || anchor.current?.contains(target)) return;\n onClose('outside');\n };\n document.addEventListener('pointerdown', down, true);\n return () => document.removeEventListener('pointerdown', down, true);\n }, [open, anchor, onClose]);\n\n if (!open) return null;\n\n const style: CSSProperties = position === null\n ? { position: 'fixed', top: 0, left: 0, visibility: 'hidden' }\n : { position: 'fixed', top: position.top, bottom: position.bottom, left: position.left, maxHeight: position.maxHeight };\n\n return (\n <div\n ref={surface}\n className={`cbx-popover ${className ?? ''}`}\n style={style}\n role=\"dialog\"\n aria-label={label}\n onKeyDown={event => {\n if (event.key === 'Escape' && !event.defaultPrevented) {\n event.preventDefault();\n event.stopPropagation();\n onClose('escape');\n anchor.current?.focus();\n }\n if (event.key === 'Tab' && !event.defaultPrevented) {\n // Tab leaves the menu: it closes and the trigger has focus, so the next Tab\n // goes on through the header.\n event.preventDefault();\n onClose('tab');\n anchor.current?.focus();\n }\n }}\n >\n {children}\n </div>\n );\n}\n\n/** Keep Tab inside `container` while it is modal (mobile sheets, the Help overlay, the palette). */\nexport function trapTab(event: { key: string; shiftKey: boolean; preventDefault: () => void }, container: HTMLElement | null): void {\n if (event.key !== 'Tab' || container === null) return;\n const focusable = Array.from(\n container.querySelectorAll<HTMLElement>('a[href], button:not([disabled]), input:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])'),\n ).filter(el => !el.hasAttribute('hidden') && el.getAttribute('aria-hidden') !== 'true');\n if (focusable.length === 0) {\n event.preventDefault();\n return;\n }\n const first = focusable[0]!;\n const last = focusable[focusable.length - 1]!;\n const active = document.activeElement;\n if (event.shiftKey && (active === first || !container.contains(active))) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && (active === last || !container.contains(active))) {\n event.preventDefault();\n first.focus();\n }\n}\n\n/**\n * Scroll `id`'s element into view inside its own scrolling list only. `scrollIntoView` would also\n * scroll every parent (a sheet, the page), which makes a menu jump when it opens.\n */\nexport function revealInList(id: string): void {\n if (typeof document === 'undefined') return;\n const option = document.getElementById(id);\n if (option === null) return;\n // The scroller is the listbox itself, or the `.cbx-list` around it (a pane keeps its status\n // notes outside the listbox, inside the same scroller).\n let list = option.closest<HTMLElement>('[role=\"listbox\"]');\n if (list !== null && list.scrollHeight <= list.clientHeight && list.parentElement?.classList.contains('cbx-list')) list = list.parentElement;\n if (list === null || list.scrollHeight <= list.clientHeight) return;\n const box = list.getBoundingClientRect();\n const item = option.getBoundingClientRect();\n if (item.top < box.top) list.scrollTop -= box.top - item.top + 8;\n else if (item.bottom > box.bottom) list.scrollTop += item.bottom - box.bottom + 8;\n}\n","import { Check, Search } from 'lucide-react';\nimport { useEffect, useId, useMemo, useRef, useState, type KeyboardEvent } from 'react';\nimport { canAutofocus } from './media';\nimport { revealInList } from './popover';\nimport { useShell } from './context';\nimport type { ShellOption } from './types';\n\n/**\n * Roving focus for a `role=\"menu\"`: ↑↓ (and ←→ inside a `role=\"group\"` row) move between the\n * items, Home and End jump. The items are the menu's `menuitem`, `menuitemradio` and links.\n */\nexport function rovingKeyDown(event: KeyboardEvent<HTMLElement>, container: HTMLElement | null): void {\n if (container === null) return;\n const items = Array.from(container.querySelectorAll<HTMLElement>('[role=\"menuitem\"],[role=\"menuitemradio\"]')).filter(el => !el.closest('[hidden]'));\n if (items.length === 0) return;\n const index = items.indexOf(document.activeElement as HTMLElement);\n const inGroup = (document.activeElement as HTMLElement | null)?.closest('[role=\"group\"]') !== null;\n let next = -1;\n switch (event.key) {\n case 'ArrowDown':\n next = index < 0 ? 0 : (index + 1) % items.length;\n if (inGroup) {\n // Leave the segmented row downwards in one step.\n const group = (document.activeElement as HTMLElement).closest('[role=\"group\"]')!;\n const after = items.findIndex((item, i) => i > index && !group.contains(item));\n next = after >= 0 ? after : 0;\n }\n break;\n case 'ArrowUp':\n next = index <= 0 ? items.length - 1 : index - 1;\n if (inGroup) {\n const group = (document.activeElement as HTMLElement).closest('[role=\"group\"]')!;\n const before = items.map((item, i) => (i < index && !group.contains(item) ? i : -1)).filter(i => i >= 0).pop();\n next = before ?? items.length - 1;\n }\n break;\n case 'ArrowRight':\n if (inGroup) next = Math.min(items.length - 1, index + 1);\n break;\n case 'ArrowLeft':\n if (inGroup) next = Math.max(0, index - 1);\n break;\n case 'Home':\n next = 0;\n break;\n case 'End':\n next = items.length - 1;\n break;\n }\n if (next >= 0) {\n event.preventDefault();\n items[next]!.focus();\n }\n}\n\n/**\n * A searchable list of choices (language, regional format, time zone): the same search, row\n * density and keys as the context menus.\n */\nexport function OptionList({ label, options, current, onPick, autoFocus = true }: { label: string; options: ShellOption[]; current?: string; onPick: (code: string) => void; autoFocus?: boolean }) {\n const { t } = useShell();\n const [q, setQ] = useState('');\n const id = useId();\n const input = useRef<HTMLInputElement>(null);\n const shown = useMemo(() => {\n const needle = q.trim().toLowerCase();\n return needle === '' ? options : options.filter(option => option.label.toLowerCase().includes(needle) || option.code.toLowerCase().includes(needle));\n }, [options, q]);\n const [active, setActive] = useState(() => Math.max(0, options.findIndex(option => option.code === current)));\n\n useEffect(() => {\n if (autoFocus && canAutofocus()) input.current?.focus();\n }, [autoFocus]);\n useEffect(() => {\n if (q !== '') setActive(0);\n }, [q]);\n useEffect(() => {\n revealInList(`${id}-${active}`);\n }, [active, id]);\n\n const onKeyDown = (event: KeyboardEvent) => {\n const last = shown.length - 1;\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n setActive(index => (index >= last ? 0 : index + 1));\n } else if (event.key === 'ArrowUp') {\n event.preventDefault();\n setActive(index => (index <= 0 ? last : index - 1));\n } else if (event.key === 'Home' && q === '') {\n event.preventDefault();\n setActive(0);\n } else if (event.key === 'End' && q === '') {\n event.preventDefault();\n setActive(last);\n } else if (event.key === 'Enter') {\n event.preventDefault();\n const option = shown[active];\n if (option !== undefined) onPick(option.code);\n }\n };\n\n return (\n <div className=\"cbx-pane\" onKeyDown={onKeyDown}>\n <div className=\"cbx-pane-search\">\n <Search size={16} strokeWidth={1.8} aria-hidden />\n <input\n ref={input}\n type=\"search\"\n role=\"combobox\"\n aria-expanded=\"true\"\n aria-controls={`${id}-list`}\n aria-activedescendant={shown[active] !== undefined ? `${id}-${active}` : undefined}\n aria-label={t('Search {things}', { things: label.toLowerCase() })}\n placeholder={t('Search…')}\n value={q}\n onChange={event => setQ(event.target.value)}\n autoComplete=\"off\"\n />\n </div>\n <div id={`${id}-list`} role=\"listbox\" aria-label={label} className=\"cbx-list cbx-list-tall\">\n {shown.map((option, index) => (\n <div key={option.code} className={`cbx-row ${index === active ? 'is-active' : ''}`} onMouseEnter={() => setActive(index)}>\n <div id={`${id}-${index}`} role=\"option\" aria-selected={index === active} aria-current={option.code === current ? 'true' : undefined} className=\"cbx-row-main\" onClick={() => onPick(option.code)}>\n <span className=\"cbx-row-name\" title={option.label}>{option.label}</span>\n {option.code === current && <Check className=\"cbx-row-check\" size={16} strokeWidth={2} aria-label={t('Current')} />}\n </div>\n </div>\n ))}\n {shown.length === 0 && <div className=\"cbx-list-note\">{t('Nothing matches “{query}”.', { query: q.trim() })}</div>}\n </div>\n </div>\n );\n}\n","import { ArrowLeft, ArrowUpRight, ChevronRight, Globe, LogOut, Monitor, Moon, Sun, UserRound, Users } from 'lucide-react';\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport { useShell } from './context';\nimport { OptionList, rovingKeyDown } from './option-list';\nimport type { ShellOption, ShellTheme } from './types';\n\nconst DEFAULT_LANGUAGES: ShellOption[] = [\n { code: 'en', label: 'English' },\n { code: 'da', label: 'Dansk' },\n];\n\nconst DEFAULT_FORMATS: ShellOption[] = [\n { code: 'en-GB', label: 'English (United Kingdom)' },\n { code: 'en-US', label: 'English (United States)' },\n { code: 'da-DK', label: 'Dansk (Danmark)' },\n { code: 'de-DE', label: 'Deutsch (Deutschland)' },\n { code: 'sv-SE', label: 'Svenska (Sverige)' },\n { code: 'nb-NO', label: 'Norsk bokmål (Norge)' },\n];\n\nconst FALLBACK_ZONES = ['UTC', 'Europe/Copenhagen', 'Europe/London', 'Europe/Berlin', 'Europe/Stockholm', 'Europe/Oslo', 'America/New_York', 'America/Los_Angeles', 'Asia/Tokyo'];\n\nfunction timeZones(): ShellOption[] {\n const supported = (Intl as unknown as { supportedValuesOf?: (key: string) => string[] }).supportedValuesOf;\n const zones = typeof supported === 'function' ? supported('timeZone') : FALLBACK_ZONES;\n return zones.map(zone => ({ code: zone, label: zone.replace(/_/g, ' ') }));\n}\n\nexport function Avatar({ size = 30 }: { size?: number }) {\n const { shell } = useShell();\n const { person } = shell;\n return (\n <span className=\"cbx-avatar\" style={{ width: size, height: size }} aria-hidden=\"true\">\n {person.avatarUrl !== undefined ? <img src={person.avatarUrl} alt=\"\" width={size} height={size} /> : person.initials}\n </span>\n );\n}\n\ntype View = 'main' | 'language' | 'format' | 'timeZone';\n\n/**\n * The account menu (§10): who is signed in, Profile and security in Cbox ID, language, regional\n * format and time zone (Cbox ID's shared preferences), theme, Switch account and Sign out.\n * `inline` renders it as a section of the mobile navigation sheet.\n */\nexport function AccountMenu({ inline = false, onDone }: { inline?: boolean; onDone?: () => void }) {\n const { shell, t, preferences, setPreference, navigate } = useShell();\n const { account, person } = shell;\n const [view, setView] = useState<View>('main');\n const menu = useRef<HTMLDivElement>(null);\n // In the mobile sheet the items are ordinary tab stops; as a popover they rove.\n const tab = inline ? 0 : -1;\n const languages = account.languages ?? DEFAULT_LANGUAGES;\n const formats = account.formats ?? DEFAULT_FORMATS;\n const zones = useMemo(() => (view === 'timeZone' ? timeZones() : []), [view]);\n\n useEffect(() => {\n if (view !== 'main' || inline) return;\n // The first item takes focus: it is a menu, not a text field, so no keyboard comes up on touch.\n menu.current?.querySelector<HTMLElement>('[role=\"menuitem\"]')?.focus();\n }, [view, inline]);\n\n const label = (options: ShellOption[], code: string | undefined, fallback: string) => options.find(option => option.code === code)?.label ?? code ?? fallback;\n const back = (\n <button type=\"button\" className=\"cbx-row cbx-row-action cbx-back\" onClick={() => setView('main')}>\n <ArrowLeft size={16} strokeWidth={1.8} aria-hidden />\n <span className=\"cbx-row-name\">{t('Account')}</span>\n </button>\n );\n const pick = <K extends 'locale' | 'regionalFormat' | 'timeZone'>(key: K) => (code: string) => {\n setPreference(key, code);\n setView('main');\n };\n\n if (view === 'language') return <div className=\"cbx-menu cbx-menu-account\">{back}<OptionList label={t('Language')} options={languages} current={preferences.locale} onPick={pick('locale')} /></div>;\n if (view === 'format') return <div className=\"cbx-menu cbx-menu-account\">{back}<OptionList label={t('Regional format')} options={formats} current={preferences.regionalFormat} onPick={pick('regionalFormat')} /></div>;\n if (view === 'timeZone') return <div className=\"cbx-menu cbx-menu-account\">{back}<OptionList label={t('Time zone')} options={zones} current={preferences.timeZone} onPick={pick('timeZone')} /></div>;\n\n const themes: Array<{ value: ShellTheme; label: string; icon: typeof Sun }> = [\n { value: 'system', label: t('System'), icon: Monitor },\n { value: 'light', label: t('Light'), icon: Sun },\n { value: 'dark', label: t('Dark'), icon: Moon },\n ];\n\n return (\n <div ref={menu} className={`cbx-menu cbx-menu-account ${inline ? 'is-inline' : ''}`} role=\"menu\" aria-label={t('Account')} onKeyDown={event => rovingKeyDown(event, menu.current)}>\n <div className=\"cbx-account-head\">\n <Avatar size={36} />\n <div className=\"cbx-account-who\">\n <span className=\"cbx-account-name cbx-truncate\" title={person.name}>{person.name}</span>\n <span className=\"cbx-account-sub cbx-truncate\">{account.signedInWith ?? t('Signed in with Cbox ID')}</span>\n </div>\n </div>\n <div className=\"cbx-list\" role=\"none\">\n <a role=\"menuitem\" tabIndex={tab} className=\"cbx-row cbx-row-action\" href={account.profileUrl} onClick={onDone}>\n <UserRound size={16} strokeWidth={1.8} aria-hidden />\n <span className=\"cbx-row-name\">{t('Profile and security')}</span>\n <ArrowUpRight className=\"cbx-row-trail\" size={14} strokeWidth={1.8} aria-hidden />\n </a>\n <button role=\"menuitem\" tabIndex={tab} type=\"button\" className=\"cbx-row cbx-row-action\" aria-haspopup=\"listbox\" onClick={() => setView('language')}>\n <Globe size={16} strokeWidth={1.8} aria-hidden />\n <span className=\"cbx-row-name\">{t('Language')}</span>\n <span className=\"cbx-row-value cbx-truncate\">{label(languages, preferences.locale, 'English')}</span>\n <ChevronRight className=\"cbx-row-trail\" size={16} strokeWidth={1.8} aria-hidden />\n </button>\n <button role=\"menuitem\" tabIndex={tab} type=\"button\" className=\"cbx-row cbx-row-action\" aria-haspopup=\"listbox\" onClick={() => setView('format')}>\n <span className=\"cbx-row-icon-gap\" aria-hidden=\"true\" />\n <span className=\"cbx-row-name\">{t('Regional format')}</span>\n <span className=\"cbx-row-value cbx-truncate\">{label(formats, preferences.regionalFormat, t('Automatic'))}</span>\n <ChevronRight className=\"cbx-row-trail\" size={16} strokeWidth={1.8} aria-hidden />\n </button>\n <button role=\"menuitem\" tabIndex={tab} type=\"button\" className=\"cbx-row cbx-row-action\" aria-haspopup=\"listbox\" onClick={() => setView('timeZone')}>\n <span className=\"cbx-row-icon-gap\" aria-hidden=\"true\" />\n <span className=\"cbx-row-name\">{t('Time zone')}</span>\n <span className=\"cbx-row-value cbx-truncate\">{(preferences.timeZone ?? t('Automatic')).replace(/_/g, ' ')}</span>\n <ChevronRight className=\"cbx-row-trail\" size={16} strokeWidth={1.8} aria-hidden />\n </button>\n <div className=\"cbx-theme\" role=\"group\" aria-label={t('Theme')}>\n <span className=\"cbx-theme-label\">{t('Theme')}</span>\n <div className=\"cbx-segmented\">\n {themes.map(theme => (\n <button\n key={theme.value}\n type=\"button\"\n role=\"menuitemradio\"\n tabIndex={tab}\n aria-checked={preferences.theme === theme.value}\n className={preferences.theme === theme.value ? 'is-on' : ''}\n onClick={() => setPreference('theme', theme.value)}\n >\n <theme.icon size={14} strokeWidth={1.8} aria-hidden />\n {theme.label}\n </button>\n ))}\n </div>\n </div>\n </div>\n <div className=\"cbx-list cbx-list-foot\" role=\"none\">\n {/* A plain link, so it is a full page load: switching account goes through Cbox ID,\n which an Inertia visit could not follow cross-origin. */}\n <a role=\"menuitem\" tabIndex={tab} className=\"cbx-row cbx-row-action\" href={account.switchAccountUrl} onClick={onDone}>\n <Users size={16} strokeWidth={1.8} aria-hidden />\n <span className=\"cbx-row-name\">{t('Switch account')}</span>\n </a>\n <button role=\"menuitem\" tabIndex={tab} type=\"button\" className=\"cbx-row cbx-row-action\" onClick={() => { onDone?.(); navigate(account.signOutUrl, { method: account.signOutMethod ?? 'post' }); }}>\n <LogOut size={16} strokeWidth={1.8} aria-hidden />\n <span className=\"cbx-row-name\">{t('Sign out')}</span>\n </button>\n </div>\n </div>\n );\n}\n","import { ArrowUpRight } from 'lucide-react';\nimport { useCallback, useEffect, useRef, useState, type KeyboardEvent } from 'react';\nimport { initials, parseAppCatalog, rememberAppCatalog, secureIconUrl, signInTarget } from '../app-switcher/catalog';\nimport { useShell } from './context';\n\n/** One app in the grid (§9). */\nexport type ShellApp = {\n key: string;\n name: string;\n /** One line: \"Identity and sign-in\". */\n purpose: string | null;\n /** Fixed per-app hue (0–360); the tile is drawn in it, in light and dark. */\n hue: number;\n iconUrl: string | null;\n iconDarkUrl: string | null;\n /** Where the tile goes: the app, or its admission page when the organization lacks it. */\n url: string;\n /** The organization has this app. False: \"More from Cbox\", dimmed. */\n inOrganization: boolean;\n};\n\n/** Each app's fixed hue when the catalog sends none. */\nexport const APP_HUES: Readonly<Record<string, number>> = {\n id: 258,\n billing: 145,\n engage: 25,\n telemetry: 300,\n work: 70,\n brain: 330,\n infra: 200,\n status: 160,\n assistant: 280,\n sites: 110,\n tax: 45,\n signals: 0,\n stache: 230,\n domains: 185,\n};\n\n/** A stable hue for an unknown key, so its tile keeps its colour between pages. */\nexport function hueFor(key: string, given?: unknown): number {\n if (typeof given === 'number' && Number.isFinite(given)) return ((given % 360) + 360) % 360;\n const known = APP_HUES[key];\n if (known !== undefined) return known;\n let hash = 0;\n for (const char of key) hash = (hash * 31 + char.charCodeAt(0)) % 360;\n return hash;\n}\n\nexport type ShellCatalogState =\n | { status: 'loading' }\n | { status: 'ready'; apps: ShellApp[] }\n | { status: 'signin_required'; href: string | null }\n | { status: 'unavailable' };\n\n/**\n * The catalog answer, with the shell's additions (§9.3): `in_organization` (default true),\n * `admission_url` for apps the organization does not have, `purpose` (falls back to\n * `description`) and `hue`. Only http(s) links are kept.\n */\nexport function parseShellCatalog(ok: boolean, body: unknown, here?: { origin: string; pathname: string; search: string }): ShellCatalogState {\n const base = parseAppCatalog(ok, body);\n if (base.status === 'signin_required') return { status: 'signin_required', href: here === undefined ? null : signInTarget(base, here) };\n if (!ok || typeof body !== 'object' || body === null || !Array.isArray((body as { apps?: unknown }).apps)) return { status: 'unavailable' };\n const apps: ShellApp[] = [];\n for (const entry of (body as { apps: unknown[] }).apps) {\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') continue;\n const inOrganization = app.in_organization !== false;\n const launch = typeof app.launch_url === 'string' && /^https?:\\/\\//i.test(app.launch_url) ? app.launch_url : null;\n const admission = typeof app.admission_url === 'string' && /^https?:\\/\\//i.test(app.admission_url) ? app.admission_url : null;\n const url = inOrganization ? launch : admission ?? launch;\n if (url === null) continue;\n const purpose = typeof app.purpose === 'string' ? app.purpose : typeof app.description === 'string' ? app.description : null;\n apps.push({\n key: app.key,\n name: app.name,\n purpose,\n hue: hueFor(app.key, app.hue),\n iconUrl: secureIconUrl(app.icon_url),\n iconDarkUrl: secureIconUrl(app.icon_dark_url),\n url,\n inOrganization,\n });\n }\n return { status: 'ready', apps };\n}\n\nlet kept: { url: string; state: ShellCatalogState; until: number } | null = null;\n\n/** The catalog, loaded when the grid first opens and kept for its `refresh_after`. */\nexport function useShellCatalog(url: string, enabled: boolean): [ShellCatalogState, () => void] {\n const [state, setState] = useState<ShellCatalogState>(() => (kept !== null && kept.url === url ? kept.state : { status: 'loading' }));\n const [attempt, setAttempt] = useState(0);\n useEffect(() => {\n if (!enabled) return;\n if (kept !== null && kept.url === url && kept.until > Date.now() && attempt === 0) {\n setState(kept.state);\n return;\n }\n const controller = new AbortController();\n if (kept === null || kept.url !== url) setState({ status: 'loading' });\n fetch(url, { credentials: 'same-origin', headers: { Accept: 'application/json' }, signal: controller.signal })\n .then(async response => {\n let body: unknown = null;\n try {\n body = await response.json();\n } catch {\n body = null;\n }\n const next = parseShellCatalog(response.ok, body, window.location);\n const refresh = typeof (body as { refresh_after?: unknown })?.refresh_after === 'number' ? Math.min(60, Math.max(1, (body as { refresh_after: number }).refresh_after)) : 60;\n if (next.status === 'ready') {\n kept = { url, state: next, until: Date.now() + refresh * 1000 };\n rememberAppCatalog(next.apps.map(app => ({ key: app.key, name: app.name, launch_url: app.url, icon_url: app.iconUrl, icon_dark_url: app.iconDarkUrl })));\n }\n setState(next);\n })\n .catch((error: unknown) => {\n if ((error as { name?: string })?.name !== 'AbortError') setState({ status: 'unavailable' });\n });\n return () => controller.abort();\n }, [url, enabled, attempt]);\n return [state, useCallback(() => setAttempt(value => value + 1), [])];\n}\n\nexport function AppTile({ app, current }: { app: ShellApp; current: boolean }) {\n const [failed, setFailed] = useState(false);\n const style = { '--cbx-hue': String(app.hue) } as Record<string, string>;\n return (\n <a\n href={app.url}\n className={`cbx-app ${current ? 'is-current' : ''} ${app.inOrganization ? '' : 'is-elsewhere'}`}\n aria-current={current ? 'page' : undefined}\n data-app={app.key}\n >\n <span className=\"cbx-app-tile\" style={style} aria-hidden=\"true\">\n {app.iconUrl !== null && !failed ? (\n <>\n <img src={app.iconUrl} alt=\"\" className={app.iconDarkUrl !== null ? 'cbx-app-icon-light' : ''} onError={() => setFailed(true)} />\n {app.iconDarkUrl !== null && <img src={app.iconDarkUrl} alt=\"\" className=\"cbx-app-icon-dark\" onError={() => setFailed(true)} />}\n </>\n ) : (\n initials(app.name.replace(/^Cbox\\s*·?\\s*/i, ''))\n )}\n </span>\n <span className=\"cbx-app-name cbx-truncate\" title={app.name}>{app.name.replace(/^Cbox\\s*·\\s*/i, '')}</span>\n {app.purpose !== null && <span className=\"cbx-app-purpose cbx-truncate\" title={app.purpose}>{app.purpose}</span>}\n </a>\n );\n}\n\n/**\n * Arrow keys across the 3-column grid; Home and End jump. \"All products\" is the last stop: ↓\n * from the bottom row and End reach it, ↑ from it goes back to the last tile.\n */\nfunction gridKeys(event: KeyboardEvent<HTMLElement>, container: HTMLElement | null): void {\n if (container === null) return;\n const tiles = Array.from(container.querySelectorAll<HTMLElement>('.cbx-app'));\n const all = container.querySelector<HTMLElement>('.cbx-apps-all');\n const stops = all === null ? tiles : [...tiles, all];\n const index = stops.indexOf(document.activeElement as HTMLElement);\n if (index < 0 || stops.length === 0) return;\n const onAll = all !== null && index === tiles.length;\n const moves: Record<string, number> = { ArrowRight: 1, ArrowLeft: -1, ArrowDown: 3, ArrowUp: -3 };\n let next = index;\n if (onAll) {\n if (event.key === 'ArrowUp' || event.key === 'ArrowLeft') next = tiles.length - 1;\n else if (event.key === 'Home') next = 0;\n else if (event.key === 'End' || event.key === 'ArrowDown' || event.key === 'ArrowRight') next = index;\n else return;\n } else if (event.key === 'ArrowDown' && index + 3 > tiles.length - 1 && all !== null) next = tiles.length;\n else if (event.key === 'ArrowRight' && index === tiles.length - 1 && all !== null) next = tiles.length;\n else if (event.key in moves) next = Math.max(0, Math.min(tiles.length - 1, index + moves[event.key]!));\n else if (event.key === 'Home') next = 0;\n else if (event.key === 'End') next = stops.length - 1;\n else return;\n event.preventDefault();\n stops[Math.max(0, next)]?.focus();\n}\n\n/**\n * The app grid (§9): \"In {organization}\" with the current app marked, \"More from Cbox\" dimmed\n * (each opens that app's admission page in the same organization), and \"All products ↗\".\n */\nexport function AppGrid({ autoFocus = true }: { autoFocus?: boolean }) {\n const { shell, t } = useShell();\n const [state, retry] = useShellCatalog(shell.apps.catalogUrl, true);\n const box = useRef<HTMLDivElement>(null);\n const organization = shell.context.levels[0]?.current.name;\n\n useEffect(() => {\n if (!autoFocus || state.status !== 'ready') return;\n const tiles = box.current?.querySelectorAll<HTMLElement>('.cbx-app');\n const current = box.current?.querySelector<HTMLElement>('.cbx-app.is-current');\n (current ?? tiles?.[0])?.focus();\n }, [state.status, autoFocus]);\n\n const mine = state.status === 'ready' ? state.apps.filter(app => app.inOrganization) : [];\n const more = state.status === 'ready' ? state.apps.filter(app => !app.inOrganization) : [];\n\n return (\n <div className=\"cbx-menu cbx-menu-apps\" ref={box} onKeyDown={event => gridKeys(event, box.current)}>\n {state.status === 'loading' && <p className=\"cbx-list-note\" aria-live=\"polite\">{t('Loading apps…')}</p>}\n {state.status === 'unavailable' && (\n <p className=\"cbx-list-note\" role=\"alert\">\n {t('Apps could not be loaded.')} <button type=\"button\" className=\"cbx-link\" onClick={retry}>{t('Try again')}</button>\n </p>\n )}\n {state.status === 'signin_required' && (\n <p className=\"cbx-list-note\" role=\"alert\">\n {t('Sign in again to see your apps.')} {state.href !== null && <a className=\"cbx-link\" href={state.href}>{t('Sign in')}</a>}\n </p>\n )}\n {state.status === 'ready' && (\n <>\n <section aria-label={organization !== undefined ? t('In {organization}', { organization }) : t('Your apps')}>\n <h3 className=\"cbx-pane-heading\">{organization !== undefined ? t('In {organization}', { organization }) : t('Your apps')}</h3>\n <div className=\"cbx-apps\">\n {mine.map(app => <AppTile key={app.key} app={app} current={app.key === shell.app.key} />)}\n </div>\n {mine.length === 0 && <p className=\"cbx-list-note\">{t('No apps available')}</p>}\n </section>\n {more.length > 0 && (\n <section aria-label={t('More from Cbox')}>\n <h3 className=\"cbx-pane-heading\">{t('More from Cbox')}</h3>\n <div className=\"cbx-apps\">\n {more.map(app => <AppTile key={app.key} app={app} current={false} />)}\n </div>\n </section>\n )}\n </>\n )}\n <div className=\"cbx-pane-foot\">\n <a className=\"cbx-row cbx-row-action cbx-apps-all\" href={shell.apps.productsUrl ?? 'https://cbox.dk'} target=\"_blank\" rel=\"noopener\">\n <span className=\"cbx-row-name\">{t('All products')}</span>\n <ArrowUpRight className=\"cbx-row-trail\" size={14} strokeWidth={1.8} aria-hidden />\n </a>\n </div>\n </div>\n );\n}\n\n/** Forget the kept catalog (tests, sign-out). */\nexport function forgetShellCatalog(): void {\n kept = null;\n}\n","import type { ContextItem, ContextLevel, ContextTone, ShellNavigate } from './types';\n\n/**\n * The shell's few network shapes and the pure rules around them: list pages, inline create,\n * the switch payload and settings links. Everything here is same-origin and JSON.\n */\n\nexport type ListPage = { items: ContextItem[]; hasMore: boolean; nextCursor: string | null };\n\nconst TONES: readonly ContextTone[] = ['production', 'sandbox', 'neutral'];\n\n/** First letters of the first two words, for a chip. */\nexport function initialsOf(name: string): string {\n const words = name.trim().split(/\\s+/).filter(Boolean);\n const letters = words.length > 1 ? (words[0]![0] ?? '') + (words[1]![0] ?? '') : name.trim().slice(0, 2);\n return letters.toUpperCase() || '?';\n}\n\nfunction toItem(value: unknown): ContextItem | null {\n if (typeof value !== 'object' || value === null) return null;\n const row = value as Record<string, unknown>;\n const id = typeof row.id === 'string' || typeof row.id === 'number' ? String(row.id) : null;\n if (id === null || typeof row.name !== 'string') return null;\n const item: ContextItem = { id, name: row.name };\n if (typeof row.initials === 'string' && row.initials !== '') item.initials = row.initials;\n if (typeof row.tone === 'string' && (TONES as readonly string[]).includes(row.tone)) item.tone = row.tone as ContextTone;\n if (typeof row.label === 'string' && row.label !== '') item.label = row.label;\n const test = row.testData ?? row.test_data;\n if (typeof test === 'boolean') item.testData = test;\n return item;\n}\n\n/**\n * A list answer. The URL standard's envelope (`{ object: 'list', data, has_more, next_cursor }`)\n * and a bare array are both accepted; rows without an id and a name are dropped.\n */\nexport function parseListPage(body: unknown): ListPage {\n const envelope = Array.isArray(body) ? { data: body } : typeof body === 'object' && body !== null ? (body as Record<string, unknown>) : {};\n const rows = Array.isArray(envelope.data) ? envelope.data : [];\n const items = rows.map(toItem).filter((item): item is ContextItem => item !== null);\n const cursor = envelope.next_cursor ?? envelope.nextCursor;\n const nextCursor = typeof cursor === 'string' && cursor !== '' ? cursor : null;\n const more = envelope.has_more ?? envelope.hasMore;\n return { items, hasMore: (more === true || more === undefined) && nextCursor !== null, nextCursor };\n}\n\n/**\n * A server-supplied link the shell may follow: http(s) or a same-origin path. Anything else\n * (`javascript:`, `data:`) is dropped, so a bad answer from a proxy can never run script.\n */\nexport function safeUrl(url: unknown): string | undefined {\n return typeof url === 'string' && /^(https?:\\/\\/|\\/)/i.test(url.trim()) ? url.trim() : undefined;\n}\n\n/** `url` with query parameters added; empty values are left out. Works for relative URLs. */\nexport function withQuery(url: string, params: Record<string, string | undefined | null>): string {\n const [path, hash = ''] = url.split('#') as [string, string?];\n const [base, query = ''] = path.split('?') as [string, string?];\n const search = new URLSearchParams(query);\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null && value !== '') search.set(key, value);\n }\n const qs = search.toString();\n return base + (qs ? `?${qs}` : '') + (hash ? `#${hash}` : '');\n}\n\n/** The settings link of one item, from the level's URL template. Null when the level has none. */\nexport function settingsHref(level: Pick<ContextLevel, 'settingsUrl'>, id: string): string | null {\n if (level.settingsUrl === undefined || level.settingsUrl === '') return null;\n return level.settingsUrl.split('{id}').join(encodeURIComponent(id));\n}\n\nexport function pluralOf(level: Pick<ContextLevel, 'label' | 'labelPlural'>): string {\n return level.labelPlural ?? `${level.label}s`;\n}\n\n/**\n * Which environment a project click lands on (§5.4): the one with the current environment's\n * name when the project has it, else its first. Undefined when the project has none.\n */\nexport function environmentFor(environments: readonly ContextItem[], currentName: string | undefined): ContextItem | undefined {\n if (currentName !== undefined) {\n const wanted = currentName.trim().toLowerCase();\n const same = environments.find(env => env.name.trim().toLowerCase() === wanted);\n if (same !== undefined) return same;\n }\n return environments[0];\n}\n\n/**\n * The switch payload (§5.6): every level above the chosen one keeps its current id, the chosen\n * levels get theirs, and levels below are left to the server (it lands on the last used one).\n * `return_to` is where the person is, so the server can stay on the same page.\n */\nexport function switchPayload(levels: readonly ContextLevel[], chosen: Record<string, string>, returnTo: string): Record<string, string> {\n const payload: Record<string, string> = {};\n const deepest = Math.max(-1, ...levels.map((level, index) => (chosen[level.key] !== undefined ? index : -1)));\n levels.forEach((level, index) => {\n const id = chosen[level.key];\n if (id !== undefined) payload[level.key] = id;\n else if (index < deepest) payload[level.key] = level.current.id;\n });\n payload.return_to = returnTo;\n return payload;\n}\n\nfunction cookie(name: string): string | null {\n if (typeof document === 'undefined') return null;\n const match = document.cookie.split('; ').find(part => part.startsWith(`${name}=`));\n return match === undefined ? null : decodeURIComponent(match.slice(name.length + 1));\n}\n\nfunction csrfToken(): string | null {\n if (typeof document === 'undefined') return null;\n return document.querySelector<HTMLMetaElement>('meta[name=\"csrf-token\"]')?.content ?? null;\n}\n\n/** Same-origin JSON with Laravel's CSRF headers. Throws `ShellRequestError` on a non-2xx. */\nexport async function requestJson<T = unknown>(url: string, init: { method?: string; body?: unknown; signal?: AbortSignal } = {}): Promise<T> {\n const headers: Record<string, string> = { Accept: 'application/json', 'X-Requested-With': 'XMLHttpRequest' };\n if (init.body !== undefined) headers['Content-Type'] = 'application/json';\n const xsrf = cookie('XSRF-TOKEN');\n const csrf = csrfToken();\n if (xsrf !== null) headers['X-XSRF-TOKEN'] = xsrf;\n else if (csrf !== null) headers['X-CSRF-TOKEN'] = csrf;\n const response = await fetch(url, {\n method: init.method ?? 'GET',\n credentials: 'same-origin',\n headers,\n body: init.body === undefined ? undefined : JSON.stringify(init.body),\n signal: init.signal,\n });\n const text = await response.text();\n let body: unknown = null;\n try {\n body = text === '' ? null : JSON.parse(text);\n } catch {\n body = null;\n }\n if (!response.ok) throw new ShellRequestError(response.status, body);\n return body as T;\n}\n\nexport class ShellRequestError extends Error {\n constructor(readonly status: number, readonly body: unknown) {\n super(`Request failed with ${status}`);\n }\n\n /** The first validation message (RFC 9457 `errors`, or Laravel's `errors`/`message`). */\n get detail(): string | null {\n const body = typeof this.body === 'object' && this.body !== null ? (this.body as Record<string, unknown>) : {};\n const errors = body.errors;\n if (typeof errors === 'object' && errors !== null) {\n for (const messages of Object.values(errors as Record<string, unknown>)) {\n if (Array.isArray(messages) && typeof messages[0] === 'string') return messages[0];\n if (typeof messages === 'string') return messages;\n }\n }\n if (typeof body.detail === 'string') return body.detail;\n if (typeof body.message === 'string') return body.message;\n return null;\n }\n}\n\n/** Inline create (§5.7): `POST createUrl { name, parent? }` → the details page to land on. */\nexport async function createItem(createUrl: string, name: string, parent?: string): Promise<{ id: string; detailsUrl: string }> {\n const body: Record<string, string> = { name };\n if (parent !== undefined) body.parent = parent;\n const answer = await requestJson<Record<string, unknown>>(createUrl, { method: 'POST', body });\n const id = answer?.id;\n const detailsUrl = safeUrl(answer?.detailsUrl ?? answer?.details_url);\n if ((typeof id !== 'string' && typeof id !== 'number') || detailsUrl === undefined) {\n throw new ShellRequestError(500, { message: 'The answer had no details page.' });\n }\n return { id: String(id), detailsUrl };\n}\n\n/**\n * The default navigation when the host passes none: a GET is a page load, a POST a real form\n * submit with Laravel's `_token`, so the server's redirect is followed like any form.\n */\nexport const defaultNavigate: ShellNavigate = (url, options = {}) => {\n if (typeof window === 'undefined' || safeUrl(url) === undefined) return;\n if (options.newTab) {\n window.open(url, '_blank', 'noopener');\n return;\n }\n if ((options.method ?? 'get') === 'get') {\n window.location.assign(url);\n return;\n }\n const form = document.createElement('form');\n form.method = 'POST';\n form.action = url;\n form.style.display = 'none';\n const fields: Record<string, unknown> = { ...(options.data ?? {}) };\n const token = csrfToken();\n if (token !== null) fields._token = token;\n for (const [name, value] of Object.entries(fields)) {\n const input = document.createElement('input');\n input.type = 'hidden';\n input.name = name;\n input.value = String(value);\n form.append(input);\n }\n document.body.append(form);\n form.submit();\n};\n\n/** Where the person is: path, query and hash. */\nexport function currentLocation(): string {\n if (typeof window === 'undefined') return '/';\n return window.location.pathname + window.location.search + window.location.hash;\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport { parseListPage, requestJson, withQuery } from './data';\nimport type { ContextItem } from './types';\n\nexport const DEBOUNCE_MS = 120;\nconst PAGE_SIZE = 25;\n\nexport type ListState = {\n items: ContextItem[];\n status: 'loading' | 'ready' | 'error';\n hasMore: boolean;\n loadingMore: boolean;\n loadMore: () => void;\n retry: () => void;\n};\n\n/** The page size, unless the app's list URL already names one. */\nfunction pageSize(url: string): string | undefined {\n return /[?&]limit=/.test(url) ? undefined : String(PAGE_SIZE);\n}\n\n/** Answers kept for this page, so hovering back to a project shows its environments at once. */\nconst kept = new Map<string, { items: ContextItem[]; hasMore: boolean; nextCursor: string | null }>();\n\n/** Forget kept answers (after a create, on a context switch, and between tests). */\nexport function forgetLists(): void {\n kept.clear();\n keptScope = null;\n}\n\n/** The context the kept answers belong to: every level's current id. */\nlet keptScope: string | null = null;\n\n/**\n * Tie the kept answers to a context. When the person has switched (an Inertia visit keeps this\n * module alive), answers from the previous context are dropped, even when an app's list URL is\n * not scoped by organization in its path. Returns true when something was dropped.\n */\nexport function scopeLists(scope: string): boolean {\n if (keptScope === scope) return false;\n const changed = keptScope !== null;\n kept.clear();\n keptScope = scope;\n return changed;\n}\n\n/**\n * A level's list, loaded lazily (§11.2): only while `enabled`, searched with `?q=` (debounced),\n * scoped with `?parent=`, paged with `?cursor=`. An empty search is kept for the page's lifetime.\n */\nexport function useContextList(url: string | undefined, { q = '', parent, enabled = true }: { q?: string; parent?: string; enabled?: boolean }): ListState {\n const [query, setQuery] = useState(q);\n const [state, setState] = useState<{ key: string; items: ContextItem[]; status: ListState['status']; hasMore: boolean; nextCursor: string | null; loadingMore: boolean }>({\n key: '',\n items: [],\n status: 'loading',\n hasMore: false,\n nextCursor: null,\n loadingMore: false,\n });\n const [attempt, setAttempt] = useState(0);\n const abort = useRef<AbortController | null>(null);\n\n useEffect(() => {\n if (q === query) return;\n const timer = setTimeout(() => setQuery(q), DEBOUNCE_MS);\n return () => clearTimeout(timer);\n }, [q, query]);\n\n const key = url === undefined ? '' : withQuery(url, { q: query.trim(), parent, limit: pageSize(url) });\n\n useEffect(() => {\n if (!enabled || url === undefined) return;\n const hit = kept.get(key);\n if (hit !== undefined) {\n setState({ key, items: hit.items, status: 'ready', hasMore: hit.hasMore, nextCursor: hit.nextCursor, loadingMore: false });\n return;\n }\n abort.current?.abort();\n const controller = new AbortController();\n abort.current = controller;\n setState(current => ({ ...current, key, status: 'loading', loadingMore: false }));\n requestJson(key, { signal: controller.signal })\n .then(body => {\n const page = parseListPage(body);\n if (query.trim() === '') kept.set(key, page);\n setState({ key, items: page.items, status: 'ready', hasMore: page.hasMore, nextCursor: page.nextCursor, loadingMore: false });\n })\n .catch((error: unknown) => {\n if ((error as { name?: string })?.name === 'AbortError') return;\n setState(current => ({ ...current, key, status: 'error', loadingMore: false }));\n });\n return () => controller.abort();\n }, [enabled, url, key, query, attempt]);\n\n const loadMore = useCallback(() => {\n setState(current => {\n if (!current.hasMore || current.loadingMore || current.nextCursor === null || url === undefined) return current;\n const cursor = current.nextCursor;\n requestJson(withQuery(current.key, { cursor }))\n .then(body => {\n const page = parseListPage(body);\n setState(now => {\n if (now.key !== current.key) return now;\n const items = [...now.items, ...page.items.filter(item => !now.items.some(have => have.id === item.id))];\n if (query.trim() === '') kept.set(now.key, { items, hasMore: page.hasMore, nextCursor: page.nextCursor });\n return { ...now, items, hasMore: page.hasMore, nextCursor: page.nextCursor, loadingMore: false };\n });\n })\n .catch(() => setState(now => ({ ...now, loadingMore: false })));\n return { ...current, loadingMore: true };\n });\n }, [url, query]);\n\n const retry = useCallback(() => {\n kept.delete(key);\n setAttempt(value => value + 1);\n }, [key]);\n\n const settled = state.key === key;\n // While a new search loads, the last answer stays (nothing jumps); a new parent starts empty.\n const sameParent = state.key !== '' && new URL(state.key, 'http://x').searchParams.get('parent') === (parent ?? null);\n return {\n items: settled || sameParent ? state.items : [],\n status: settled ? state.status : 'loading',\n hasMore: settled && state.hasMore,\n loadingMore: settled && state.loadingMore,\n loadMore,\n retry,\n };\n}\n\n/** Load a list once, outside a component (a project click needs its environments). */\nexport async function fetchList(url: string, parent?: string): Promise<ContextItem[]> {\n const key = withQuery(url, { parent, limit: pageSize(url) });\n const hit = kept.get(key);\n if (hit !== undefined) return hit.items;\n const page = parseListPage(await requestJson(key));\n kept.set(key, page);\n return page.items;\n}\n","import { Check, ChevronRight, Plus, Search, Settings } from 'lucide-react';\nimport { useCallback, useEffect, useId, useImperativeHandle, useRef, useState, type KeyboardEvent, type ReactNode, type Ref } from 'react';\nimport { createItem, environmentFor, initialsOf, pluralOf, settingsHref, ShellRequestError } from './data';\nimport { canAutofocus } from './media';\nimport { revealInList } from './popover';\nimport { useShell } from './context';\nimport { fetchList, forgetLists, useContextList } from './use-list';\nimport type { ContextItem, ContextLevel, ContextTone } from './types';\n\n/** The initials chip of an organization, project or site. */\nexport function Chip({ item, tone = 'soft' }: { item: Pick<ContextItem, 'name' | 'initials'>; tone?: 'solid' | 'soft' }) {\n return <span className={`cbx-chip cbx-chip-${tone}`} aria-hidden=\"true\">{item.initials ?? initialsOf(item.name)}</span>;\n}\n\n/** The coloured square of an environment (§5.4): production green, sandbox amber, neutral grey. */\nexport function ToneSquare({ tone }: { tone?: ContextTone }) {\n return <span className={`cbx-tone cbx-tone-${tone ?? 'neutral'}`} aria-hidden=\"true\" />;\n}\n\n/** True for the third level, whose rows carry a tone square instead of a chip. */\nexport function isEnvironmentLevel(level: ContextLevel): boolean {\n return level.key === 'environment';\n}\n\nexport type PaneHandle = { focus: () => void };\n\ntype PaneProps = {\n level: ContextLevel;\n /** Id of the item one level up, for `?parent=` and inline create. */\n parent?: string;\n /** The item marked with a check. */\n currentId?: string;\n heading: string;\n /** Show \"View all\". */\n viewAll?: boolean;\n /** A search field heads the pane. */\n searchable?: boolean;\n /** Take focus when the pane mounts (only on a desktop pointer). */\n autoFocus?: boolean;\n /** Rows show a chevron: the pane previews the next level. */\n chevron?: boolean;\n createLabel?: string;\n onPick: (item: ContextItem) => void;\n /** Hover or keyboard focus on a row, without switching anything. */\n onPreview?: (item: ContextItem) => void;\n /** → on a row. Return true when it was handled. */\n onArrowRight?: () => boolean;\n onArrowLeft?: () => void;\n handle?: Ref<PaneHandle>;\n /** Where the pane hands focus when it has no search (the cascade's right pane). */\n className?: string;\n};\n\ntype Option = { kind: 'item'; item: ContextItem } | { kind: 'more' };\n\n/**\n * One pane of a context menu: search, heading with View all, the lazily loaded rows, and\n * \"New …\". Keyboard: ↑↓ Home End move, Enter picks, → and ← cross panes, Esc closes (the\n * popover), Tab leaves. Focus stays in the search field and the active row is announced with\n * `aria-activedescendant`. A row's gear is an option of its own (named \"Settings\", described\n * by the row): → makes it active, ← goes back, Enter opens the settings page; in the cascade a\n * second → crosses to the environments. The pane's own actions sit on the same ring: ↓ past the last row\n * focuses \"New …\", ↑ above the first row focuses \"View all\", and ↑↓ from there go back into\n * the rows, so both work without a mouse (§12.2).\n */\nexport function LevelPane({ level, parent, currentId, heading, viewAll = true, searchable = true, autoFocus = false, chevron = false, createLabel, onPick, onPreview, onArrowRight, onArrowLeft, handle, className }: PaneProps) {\n const { t, Link, navigate } = useShell();\n const [q, setQ] = useState('');\n const [active, setActiveRow] = useState(-1);\n // → on a row with settings makes its gear the active option; any other move leaves it.\n const [gear, setGear] = useState(false);\n const setActive = useCallback((next: number | ((index: number) => number)) => {\n setGear(false);\n setActiveRow(next);\n }, []);\n const [creating, setCreating] = useState(false);\n const list = useContextList(level.listUrl, { q, parent });\n const id = useId();\n const input = useRef<HTMLInputElement>(null);\n const box = useRef<HTMLDivElement>(null);\n const createButton = useRef<HTMLButtonElement>(null);\n const plural = pluralOf(level);\n const environment = isEnvironmentLevel(level);\n\n const options: Option[] = list.items.map(item => ({ kind: 'item' as const, item }));\n if (list.hasMore) options.push({ kind: 'more' });\n\n // The current item is active when the rows arrive; a new search starts at the top.\n useEffect(() => {\n if (list.status !== 'ready') return;\n setActive(previous => {\n if (previous >= 0 && previous < options.length && q === '') return previous;\n const current = list.items.findIndex(item => item.id === currentId);\n return q === '' && current >= 0 ? current : options.length > 0 ? 0 : -1;\n });\n }, [list.status, list.items, q, currentId]);\n\n useEffect(() => {\n if (autoFocus && searchable && canAutofocus()) input.current?.focus();\n }, [autoFocus, searchable]);\n\n const focusSelf = useCallback(() => {\n if (searchable) input.current?.focus();\n else box.current?.focus();\n setActive(index => (index < 0 && options.length > 0 ? 0 : index));\n }, [searchable, options.length]);\n useImperativeHandle(handle, () => ({ focus: focusSelf }), [focusSelf]);\n\n const optionId = (index: number) => `${id}-option-${index}`;\n const allId = `${id}-all`;\n const canCreate = level.createUrl !== undefined && createLabel !== undefined;\n /** The pane's actions in ring order: View all above the rows, New … below them. */\n const viewAllLink = () => (viewAll ? document.getElementById(allId) : null);\n const createAction = () => (canCreate && !creating ? createButton.current : null);\n useEffect(() => {\n if (active < 0) return;\n revealInList(optionId(active));\n const option = options[active];\n if (option?.kind === 'item') onPreview?.(option.item);\n }, [active]);\n\n const choose = (option: Option | undefined) => {\n if (option === undefined) return;\n if (option.kind === 'more') list.loadMore();\n else onPick(option.item);\n };\n\n /** Back into the rows from an action, on the first or the last row. */\n const enterRows = (at: 'first' | 'last') => {\n focusSelf();\n setActive(options.length === 0 ? -1 : at === 'first' ? 0 : options.length - 1);\n };\n\n /** ↑↓ on View all or New …: the ring is View all, the rows, New …, and round again. */\n const onActionKeyDown = (event: KeyboardEvent, action: 'all' | 'create') => {\n if (event.key !== 'ArrowDown' && event.key !== 'ArrowUp') return;\n event.preventDefault();\n const rows = options.length > 0;\n const down = event.key === 'ArrowDown';\n const ring: Array<() => void> = [];\n const top = viewAllLink();\n const bottom = createAction();\n if (top !== null) ring.push(() => top.focus());\n if (rows) ring.push(() => enterRows(down ? 'first' : 'last'));\n if (bottom !== null) ring.push(() => bottom.focus());\n const here = action === 'all' ? 0 : ring.length - 1;\n const next = (here + (down ? 1 : -1) + ring.length) % ring.length;\n ring[next]?.();\n };\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.target instanceof HTMLElement && event.target.closest('.cbx-create')) return;\n if (event.target instanceof HTMLElement && event.target.closest('[data-pane-action]')) return;\n const last = options.length - 1;\n switch (event.key) {\n case 'ArrowDown': {\n event.preventDefault();\n const bottom = createAction();\n if (bottom !== null && active >= last) {\n bottom.focus();\n break;\n }\n setActive(index => (index >= last ? 0 : index + 1));\n break;\n }\n case 'ArrowUp': {\n event.preventDefault();\n const top = viewAllLink();\n if (top !== null && active <= 0) {\n top.focus();\n break;\n }\n setActive(index => (index <= 0 ? last : index - 1));\n break;\n }\n case 'Home':\n if (!searchable || q === '') {\n event.preventDefault();\n setActive(options.length > 0 ? 0 : -1);\n }\n break;\n case 'End':\n if (!searchable || q === '') {\n event.preventDefault();\n setActive(last);\n }\n break;\n case 'Enter': {\n event.preventDefault();\n const option = options[active];\n const settings = option?.kind === 'item' ? settingsHref(level, option.item.id) : null;\n if (gear && settings !== null) navigate(settings);\n else choose(option);\n break;\n }\n case 'ArrowRight': {\n if (searchable && input.current !== null && input.current.selectionStart !== q.length) break;\n const option = options[active];\n if (!gear && option?.kind === 'item' && settingsHref(level, option.item.id) !== null) {\n event.preventDefault();\n setGear(true);\n break;\n }\n if (onArrowRight?.()) {\n event.preventDefault();\n setGear(false);\n }\n break;\n }\n case 'ArrowLeft':\n if (gear) {\n event.preventDefault();\n setGear(false);\n break;\n }\n if (onArrowLeft !== undefined && (!searchable || input.current?.selectionStart === 0)) {\n event.preventDefault();\n onArrowLeft();\n }\n break;\n }\n };\n\n const listboxId = `${id}-listbox`;\n const activeId = active >= 0 && active < options.length ? (gear ? `${optionId(active)}-settings` : optionId(active)) : undefined;\n\n return (\n <div className={`cbx-pane ${className ?? ''}`} onKeyDown={onKeyDown}>\n {searchable && (\n <div className=\"cbx-pane-search\">\n <Search size={16} strokeWidth={1.8} aria-hidden />\n <input\n ref={input}\n type=\"search\"\n role=\"combobox\"\n aria-expanded=\"true\"\n aria-controls={listboxId}\n aria-activedescendant={activeId}\n aria-autocomplete=\"list\"\n aria-label={t('Search {things}', { things: plural.toLowerCase() })}\n placeholder={t('Search {things}…', { things: plural.toLowerCase() })}\n value={q}\n onChange={event => setQ(event.target.value)}\n autoComplete=\"off\"\n spellCheck={false}\n />\n </div>\n )}\n <div className=\"cbx-pane-heading\">\n <span className=\"cbx-truncate\" title={heading}>{heading}</span>\n {viewAll && (\n <Link href={level.allUrl} id={allId} className=\"cbx-pane-all\" tabIndex={-1} data-pane-action=\"all\" onKeyDown={event => onActionKeyDown(event, 'all')}>\n {t('View all')}\n </Link>\n )}\n </div>\n <div\n className=\"cbx-list\"\n onScroll={event => {\n const el = event.currentTarget;\n if (el.scrollHeight - el.scrollTop - el.clientHeight < 48) list.loadMore();\n }}\n >\n <div\n ref={box}\n id={listboxId}\n role=\"listbox\"\n aria-label={heading}\n tabIndex={searchable ? -1 : 0}\n aria-activedescendant={searchable ? undefined : activeId}\n className=\"cbx-listbox\"\n >\n {options.map((option, index) => {\n if (option.kind === 'more') {\n return (\n <div key=\"more\" id={optionId(index)} role=\"option\" aria-selected={index === active && !gear} className={`cbx-row cbx-row-more ${index === active ? 'is-active' : ''}`} onMouseEnter={() => setActive(index)} onClick={() => list.loadMore()}>\n <span className=\"cbx-row-name\">{list.loadingMore ? t('Loading…') : t('Show more')}</span>\n </div>\n );\n }\n const { item } = option;\n const current = item.id === currentId;\n const settings = settingsHref(level, item.id);\n return (\n <div key={item.id} className={`cbx-row ${index === active ? 'is-active' : ''} ${current ? 'is-current' : ''}`} onMouseEnter={() => setActive(index)}>\n <div id={optionId(index)} role=\"option\" aria-selected={index === active && !gear} aria-current={current ? 'true' : undefined} className=\"cbx-row-main\" onClick={() => onPick(item)}>\n {environment ? <ToneSquare tone={item.tone} /> : <Chip item={item} />}\n <span className=\"cbx-row-name\" title={item.name}>{item.name}</span>\n {item.label !== undefined && <span className=\"cbx-row-label\">{item.label}</span>}\n {current && <Check className=\"cbx-row-check\" size={16} strokeWidth={2} aria-label={t('Current')} />}\n </div>\n {settings !== null && (\n <Link\n href={settings}\n id={`${optionId(index)}-settings`}\n role=\"option\"\n aria-selected={index === active && gear}\n aria-describedby={optionId(index)}\n className={`cbx-row-gear ${index === active && gear ? 'is-active' : ''}`}\n tabIndex={-1}\n aria-label={t('Settings')}\n title={t('Settings for {name}', { name: item.name })}\n >\n <Settings size={15} strokeWidth={1.8} aria-hidden />\n </Link>\n )}\n {chevron && <ChevronRight className=\"cbx-row-chevron\" size={16} strokeWidth={1.8} aria-hidden />}\n </div>\n );\n })}\n </div>\n <ListStatus status={list.status} empty={options.length === 0} query={q} plural={plural} onRetry={list.retry} />\n </div>\n {canCreate && (\n <div className=\"cbx-pane-foot\">\n {creating ? (\n <InlineCreate level={level} parent={parent} label={createLabel} onCancel={() => { setCreating(false); focusSelf(); }} />\n ) : (\n <button ref={createButton} type=\"button\" className=\"cbx-row cbx-row-action\" data-pane-action=\"create\" onClick={() => setCreating(true)} onKeyDown={event => onActionKeyDown(event, 'create')}>\n <Plus size={16} strokeWidth={1.8} aria-hidden />\n <span className=\"cbx-row-name\">{createLabel}</span>\n </button>\n )}\n </div>\n )}\n </div>\n );\n}\n\nfunction ListStatus({ status, empty, query, plural, onRetry }: { status: 'loading' | 'ready' | 'error'; empty: boolean; query: string; plural: string; onRetry: () => void }) {\n const { t } = useShell();\n if (status === 'error') {\n return (\n <div className=\"cbx-list-note\" role=\"alert\">\n {t('{things} could not be loaded.', { things: plural })}{' '}\n <button type=\"button\" className=\"cbx-link\" onClick={onRetry}>{t('Try again')}</button>\n </div>\n );\n }\n if (status === 'loading' && empty) return <div className=\"cbx-list-note\" aria-live=\"polite\">{t('Loading…')}</div>;\n if (status === 'ready' && empty) {\n return <div className=\"cbx-list-note\" aria-live=\"polite\">{query.trim() === '' ? t('No {things} yet.', { things: plural.toLowerCase() }) : t('Nothing matches “{query}”.', { query: query.trim() })}</div>;\n }\n return null;\n}\n\n/**\n * \"New …\" (§5.7): a name, inline. Create makes it, and the person lands on its details page\n * where the rest is set up. Never a dead end: a refusal shows its reason under the field.\n */\nexport function InlineCreate({ level, parent, label, onCancel }: { level: ContextLevel; parent?: string; label: string; onCancel: () => void }) {\n const { t, navigate } = useShell();\n const [name, setName] = useState('');\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const field = useRef<HTMLInputElement>(null);\n const errorId = useId();\n\n useEffect(() => {\n field.current?.focus();\n }, []);\n\n const submit = async () => {\n const value = name.trim();\n if (value === '' || busy || level.createUrl === undefined) return;\n setBusy(true);\n setError(null);\n try {\n const created = await createItem(level.createUrl, value, parent);\n forgetLists();\n navigate(created.detailsUrl);\n } catch (failure) {\n setBusy(false);\n setError(failure instanceof ShellRequestError && failure.detail !== null ? failure.detail : t('It could not be created. Try again.'));\n }\n };\n\n return (\n <form\n className=\"cbx-create\"\n onSubmit={event => {\n event.preventDefault();\n void submit();\n }}\n onKeyDown={event => {\n if (event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n onCancel();\n }\n if (event.key === 'Tab') event.stopPropagation();\n }}\n >\n <label className=\"cbx-create-label\" htmlFor={`${errorId}-name`}>{label}</label>\n <div className=\"cbx-create-row\">\n <input\n ref={field}\n id={`${errorId}-name`}\n className=\"cbx-input\"\n value={name}\n onChange={event => setName(event.target.value)}\n placeholder={t('Name')}\n aria-invalid={error !== null}\n aria-describedby={error !== null ? errorId : undefined}\n disabled={busy}\n autoComplete=\"off\"\n />\n <button type=\"submit\" className=\"cbx-button cbx-button-primary\" disabled={busy || name.trim() === ''}>\n {busy ? t('Creating…') : t('Create')}\n </button>\n </div>\n {error !== null && <p id={errorId} className=\"cbx-create-error\" role=\"alert\">{error}</p>}\n </form>\n );\n}\n\n/**\n * A project click (§5.4): switch to it and keep the environment of the same name when it has\n * one, else its first. Its environments come from the kept list, or are loaded first.\n */\nexport async function pickKeepingEnvironment(outer: ContextLevel, inner: ContextLevel | undefined, item: ContextItem, switchTo: (chosen: Record<string, string>) => void): Promise<void> {\n if (inner === undefined) {\n switchTo({ [outer.key]: item.id });\n return;\n }\n let environment: ContextItem | undefined;\n try {\n environment = environmentFor(await fetchList(inner.listUrl, item.id), inner.current.name);\n } catch {\n environment = undefined;\n }\n switchTo(environment === undefined ? { [outer.key]: item.id } : { [outer.key]: item.id, [inner.key]: environment.id });\n}\n\n/** The organization menu (§5.3). */\nexport function OrganizationMenu({ level }: { level: ContextLevel }) {\n const { t, switchTo } = useShell();\n return (\n <div className=\"cbx-menu cbx-menu-org\">\n <LevelPane\n level={level}\n currentId={level.current.id}\n heading={pluralOf(level)}\n autoFocus\n createLabel={t('New {thing}', { thing: level.label.toLowerCase() })}\n onPick={item => switchTo({ [level.key]: item.id })}\n />\n </div>\n );\n}\n\n/**\n * The second trigger's menu (§5.4). With two levels it is the cascade: hovering or focusing a\n * project previews its environments on the right without switching; an environment switches\n * both; a project keeps the environment of the same name, else its first. With one level it\n * is a single pane. `parent` is the organization's id: every level below the first is listed\n * with `?parent=`, so an answer can never belong to another organization.\n */\nexport function CascadeMenu({ levels, parent }: { levels: ContextLevel[]; parent?: string }) {\n const { t, switchTo } = useShell();\n const [outer, inner] = levels as [ContextLevel, ContextLevel | undefined];\n const [preview, setPreview] = useState<ContextItem>(outer.current);\n const left = useRef<PaneHandle>(null);\n const right = useRef<PaneHandle>(null);\n\n if (inner === undefined) {\n return (\n <div className=\"cbx-menu cbx-menu-single\">\n <LevelPane\n level={outer}\n parent={parent}\n currentId={outer.current.id}\n heading={pluralOf(outer)}\n autoFocus\n createLabel={t('New {thing}', { thing: outer.label.toLowerCase() })}\n onPick={item => switchTo({ [outer.key]: item.id })}\n />\n </div>\n );\n }\n\n const pickOuter = (item: ContextItem) => pickKeepingEnvironment(outer, inner, item, switchTo);\n\n return (\n <div className=\"cbx-menu cbx-menu-cascade\">\n <LevelPane\n handle={left}\n level={outer}\n parent={parent}\n currentId={outer.current.id}\n heading={pluralOf(outer)}\n autoFocus\n chevron\n createLabel={t('New {thing}', { thing: outer.label.toLowerCase() })}\n onPick={item => void pickOuter(item)}\n onPreview={setPreview}\n onArrowRight={() => {\n right.current?.focus();\n return true;\n }}\n />\n <LevelPane\n key={preview.id}\n handle={right}\n className=\"cbx-pane-inner\"\n level={inner}\n parent={preview.id}\n currentId={preview.id === outer.current.id ? inner.current.id : undefined}\n heading={t('{things} in {name}', { things: pluralOf(inner), name: preview.name })}\n viewAll={false}\n searchable={false}\n createLabel={t('New {thing} in {name}', { thing: inner.label.toLowerCase(), name: preview.name })}\n onPick={item => switchTo({ [outer.key]: preview.id, [inner.key]: item.id })}\n onArrowLeft={() => left.current?.focus()}\n />\n </div>\n );\n}\n\n/** The trigger text of the second trigger: `Webshop · ■ Production`. */\nexport function CascadeLabel({ levels }: { levels: ContextLevel[] }): ReactNode {\n const [outer, inner] = levels as [ContextLevel, ContextLevel | undefined];\n const outerIsEnvironment = isEnvironmentLevel(outer);\n return (\n <>\n {outerIsEnvironment ? <ToneSquare tone={outer.current.tone} /> : <Chip item={outer.current} />}\n <span className=\"cbx-trigger-text\" title={outer.current.name}>{outer.current.name}</span>\n {inner !== undefined && (\n <>\n <span className=\"cbx-trigger-dot\" aria-hidden=\"true\">·</span>\n <span className=\"cbx-trigger-env\">\n <ToneSquare tone={inner.current.tone} />\n <span className=\"cbx-trigger-text\" title={inner.current.name}>{inner.current.name}</span>\n </span>\n </>\n )}\n </>\n );\n}\n","/**\n * Help's state lives outside React (§7.1): open or closed, what it shows, the search, the scroll\n * position and the support updates survive an Inertia visit and even a remount of the shell,\n * like a browser side panel. The conversation itself lives in the `<cbox-support>` element, which\n * survives as long as the shell sits in the host's persistent layout.\n */\n\nimport { safeUrl } from './data';\n\nexport type HelpArticle = { id: string; title: string; excerpt?: string; body?: string; url?: string; source?: string };\n\nexport type SupportUpdate = { id: string; kind: 'ticket' | 'chat'; title: string; excerpt?: string; at?: string; unread: boolean; url?: string };\n\nexport type HelpStatus = 'idle' | 'loading' | 'ready' | 'unavailable';\n\nexport type HelpState = {\n open: boolean;\n /** The article shown instead of the home view, or null. */\n article: HelpArticle | null;\n query: string;\n scrollTop: number;\n updates: SupportUpdate[];\n updatesStatus: HelpStatus;\n /** A question waiting for the chat to be ready (\"Ask Cbox: …\" from the palette). */\n pendingQuestion: string | null;\n /** Whether `open` was taken from the person's saved preference yet. */\n seeded: boolean;\n /**\n * `open` came from the saved preference, not from the person on this page. Help left open\n * shows docked from 1280px; below that it waits until the person opens it, so a phone or a\n * narrow window never lands under the full-screen overlay.\n */\n restored: boolean;\n /** Which list the support updates came from (URL and organization), so a switch reloads them. */\n updatesKey: string | null;\n};\n\nexport type HelpStore = {\n get(): HelpState;\n set(patch: Partial<HelpState> | ((state: HelpState) => Partial<HelpState>)): void;\n subscribe(listener: () => void): () => void;\n};\n\nexport const INITIAL_HELP_STATE: HelpState = {\n open: false,\n article: null,\n query: '',\n scrollTop: 0,\n updates: [],\n updatesStatus: 'idle',\n pendingQuestion: null,\n seeded: false,\n restored: false,\n updatesKey: null,\n};\n\n/** Whether Help is on screen: open, and either docked or opened by the person on this page. */\nexport function helpVisible(state: Pick<HelpState, 'open' | 'restored'>, docked: boolean): boolean {\n return state.open && (docked || !state.restored);\n}\n\nexport function createHelpStore(initial: Partial<HelpState> = {}): HelpStore {\n let state: HelpState = { ...INITIAL_HELP_STATE, ...initial };\n const listeners = new Set<() => void>();\n return {\n get: () => state,\n set(patch) {\n const next = typeof patch === 'function' ? patch(state) : patch;\n state = { ...state, ...next };\n listeners.forEach(listener => listener());\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n };\n}\n\nlet browserStore: HelpStore | null = null;\n\n/**\n * The page's one store. On the server every render gets a fresh one, so two people's requests\n * never share Help state.\n */\nexport function sharedHelpStore(): HelpStore {\n if (typeof window === 'undefined') return createHelpStore();\n browserStore ??= createHelpStore();\n return browserStore;\n}\n\nexport function parseUpdates(body: unknown): SupportUpdate[] {\n const rows = Array.isArray(body) ? body : typeof body === 'object' && body !== null && Array.isArray((body as { data?: unknown }).data) ? (body as { data: unknown[] }).data : [];\n return rows.flatMap((value: unknown) => {\n if (typeof value !== 'object' || value === null) return [];\n const row = value as Record<string, unknown>;\n if ((typeof row.id !== 'string' && typeof row.id !== 'number') || typeof row.title !== 'string') return [];\n const update: SupportUpdate = {\n id: String(row.id),\n kind: row.kind === 'chat' ? 'chat' : 'ticket',\n title: row.title,\n unread: row.unread === true || row.read === false || (row.read_at === null && row.unread !== false),\n };\n if (typeof row.excerpt === 'string') update.excerpt = row.excerpt;\n const at = row.at ?? row.updated_at ?? row.created_at;\n if (typeof at === 'string') update.at = at;\n const url = safeUrl(row.url);\n if (url !== undefined) update.url = url;\n return [update];\n });\n}\n\nexport function parseArticles(body: unknown): HelpArticle[] {\n const rows = Array.isArray(body) ? body : typeof body === 'object' && body !== null && Array.isArray((body as { data?: unknown }).data) ? (body as { data: unknown[] }).data : [];\n return rows.flatMap((value: unknown) => {\n if (typeof value !== 'object' || value === null) return [];\n const row = value as Record<string, unknown>;\n if ((typeof row.id !== 'string' && typeof row.id !== 'number') || typeof row.title !== 'string') return [];\n const article: HelpArticle = { id: String(row.id), title: row.title };\n if (typeof row.excerpt === 'string') article.excerpt = row.excerpt;\n if (typeof row.body === 'string') article.body = row.body;\n const url = safeUrl(row.url);\n if (url !== undefined) article.url = url;\n if (typeof row.source === 'string') article.source = row.source;\n return [article];\n });\n}\n","import { ArrowLeft, ArrowUpRight, BookOpen, CircleAlert, LifeBuoy, MessageSquare, Search, Sparkles, Ticket, UserRound, X } from 'lucide-react';\nimport { createElement, useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState, useSyncExternalStore, type FormEvent } from 'react';\nimport { requestJson, withQuery } from './data';\nimport { helpVisible, parseArticles, parseUpdates, type HelpArticle, type HelpState, type HelpStore, type SupportUpdate } from './help-store';\nimport { useShell } from './context';\nimport { canAutofocus } from './media';\nimport { trapTab } from './popover';\nimport { DEBOUNCE_MS } from './use-list';\nimport type { Shell } from './types';\n\nexport const DEFAULT_SUPPORT_SCRIPT = '/ai-assistant/support.js';\nconst SUPPORT_TAG = 'cbox-support';\n\nexport function useHelpState<T>(store: HelpStore, select: (state: HelpState) => T): T {\n return useSyncExternalStore(store.subscribe, () => select(store.get()), () => select(store.get()));\n}\n\n/** The page intent the chat is given (§7.2.4): route, title and context. */\nexport type PageIntent = { route?: string; title?: string; context: string; url?: string };\n\nexport function contextTrail(shell: Shell): string {\n return shell.context.levels.map(level => level.current.name).join(' / ');\n}\n\nexport function pageIntent(shell: Shell): PageIntent {\n const intent: PageIntent = { context: contextTrail(shell) };\n if (shell.page?.route !== undefined) intent.route = shell.page.route;\n if (shell.page?.title !== undefined) intent.title = shell.page.title;\n if (typeof window !== 'undefined') intent.url = window.location.pathname;\n return intent;\n}\n\n/** The Assistant SDK's element, with the methods a newer SDK may add. */\ntype SupportElement = HTMLElement & {\n open?: () => unknown;\n ask?: (question: string, intent?: PageIntent) => unknown;\n handover?: () => unknown;\n intent?: PageIntent;\n};\n\nfunction ensureScript(src: string): void {\n if (typeof document === 'undefined' || customElements.get(SUPPORT_TAG) !== undefined) return;\n if (Array.from(document.scripts).some(script => script.getAttribute('src') === src)) return;\n const script = document.createElement('script');\n script.src = src;\n script.defer = true;\n document.head.append(script);\n}\n\n/** Wait for the SDK's element to be defined and in place, up to `timeoutMs`. */\nfunction whenSupportReady(host: HTMLElement | null, timeoutMs = 6000): Promise<SupportElement | null> {\n return new Promise(resolve => {\n const started = Date.now();\n const attempt = () => {\n const element = host?.querySelector<SupportElement>(SUPPORT_TAG) ?? null;\n if (element !== null && typeof element.open === 'function') {\n resolve(element);\n return;\n }\n if (Date.now() - started >= timeoutMs) {\n resolve(null);\n return;\n }\n setTimeout(attempt, 150);\n };\n attempt();\n });\n}\n\n/**\n * The Help column (§7): support updates, docs search, articles for this page, Ask Cbox and a way\n * to a person. Docked beside the page from 1280px, a full-screen dialog below. It is always\n * mounted while the shell is, so its state and the conversation survive page changes.\n */\nexport function HelpColumn({ docked }: { docked: boolean }) {\n const { shell, t, help: store, toggleHelp, navigate, preferences } = useShell();\n const formatDate = useShortDate(preferences.regionalFormat ?? preferences.locale, preferences.timeZone);\n const open = useHelpState(store, state => helpVisible(state, docked));\n const restored = useHelpState(store, state => state.open && state.restored);\n const article = useHelpState(store, state => state.article);\n const query = useHelpState(store, state => state.query);\n const updates = useHelpState(store, state => state.updates);\n const updatesStatus = useHelpState(store, state => state.updatesStatus);\n const pendingQuestion = useHelpState(store, state => state.pendingQuestion);\n const [articles, setArticles] = useState<{ topic: string | undefined; items: HelpArticle[]; status: 'loading' | 'ready' | 'unavailable' }>({ topic: undefined, items: [], status: 'loading' });\n const [results, setResults] = useState<{ q: string; items: HelpArticle[]; status: 'loading' | 'ready' | 'unavailable' } | null>(null);\n const [question, setQuestion] = useState('');\n const [chatProblem, setChatProblem] = useState(false);\n const column = useRef<HTMLDivElement>(null);\n const body = useRef<HTMLDivElement>(null);\n const chatHost = useRef<HTMLDivElement>(null);\n const searchField = useRef<HTMLInputElement>(null);\n const opener = useRef<HTMLElement | null>(null);\n const { help } = shell;\n const portal = help.portalUrl;\n\n // Support updates are per person per organization (§7.3). They feed the button's count, so\n // they load after the first paint, open or not, and again when the URL or organization\n // changes: the store outlives Inertia visits, so an org switch must not keep the old count.\n const updatesKey = help.enabled && help.updatesUrl !== undefined ? `${help.updatesUrl}|${shell.context.levels[0]?.current.id ?? ''}` : null;\n const loadUpdates = useCallback(() => {\n if (updatesKey === null || help.updatesUrl === undefined) return;\n const current = () => store.get().updatesKey === updatesKey;\n store.set({ updatesStatus: 'loading', updatesKey });\n requestJson(help.updatesUrl)\n .then(answer => {\n if (current()) store.set({ updates: parseUpdates(answer), updatesStatus: 'ready' });\n })\n .catch(() => {\n if (current()) store.set({ updatesStatus: 'unavailable' });\n });\n }, [updatesKey, help.updatesUrl, store]);\n useEffect(() => {\n const state = store.get();\n if (state.updatesKey !== updatesKey) {\n store.set({ updates: [], updatesStatus: 'idle', updatesKey });\n loadUpdates();\n } else if (state.updatesStatus === 'idle') loadUpdates();\n }, [updatesKey, loadUpdates, store]);\n useEffect(() => {\n if (open && store.get().updatesStatus !== 'loading') loadUpdates();\n }, [open]);\n\n // Articles for this page's topic.\n useEffect(() => {\n if (!open || !help.enabled || help.articlesUrl === undefined || help.topic === undefined) return;\n if (articles.topic === help.topic && articles.status === 'ready') return;\n const controller = new AbortController();\n setArticles({ topic: help.topic, items: [], status: 'loading' });\n requestJson(help.articlesUrl.split('{topic}').join(encodeURIComponent(help.topic)), { signal: controller.signal })\n .then(answer => setArticles({ topic: help.topic, items: parseArticles(answer).slice(0, 3), status: 'ready' }))\n .catch((error: unknown) => {\n if ((error as { name?: string })?.name !== 'AbortError') setArticles({ topic: help.topic, items: [], status: 'unavailable' });\n });\n return () => controller.abort();\n }, [open, help.enabled, help.articlesUrl, help.topic]);\n\n // Docs search, debounced like the palette.\n useEffect(() => {\n const q = query.trim();\n if (!help.enabled || help.searchUrl === undefined || q === '') {\n setResults(null);\n return;\n }\n const controller = new AbortController();\n const timer = setTimeout(() => {\n setResults(current => ({ q, items: current?.items ?? [], status: 'loading' }));\n requestJson(withQuery(help.searchUrl!, { q, topic: help.topic }), { signal: controller.signal })\n .then(answer => setResults({ q, items: parseArticles(answer), status: 'ready' }))\n .catch((error: unknown) => {\n if ((error as { name?: string })?.name !== 'AbortError') setResults({ q, items: [], status: 'unavailable' });\n });\n }, DEBOUNCE_MS);\n return () => {\n clearTimeout(timer);\n controller.abort();\n };\n }, [query, help.enabled, help.searchUrl, help.topic]);\n\n // The SDK script loads once Help is first opened: never before the page has painted.\n useEffect(() => {\n if (open && help.enabled && help.sessionUrl !== undefined) ensureScript(help.scriptUrl ?? DEFAULT_SUPPORT_SCRIPT);\n }, [open, help.enabled, help.sessionUrl, help.scriptUrl]);\n\n // The page intent follows navigation.\n const intent = pageIntent(shell);\n const intentJson = JSON.stringify(intent);\n useEffect(() => {\n const element = chatHost.current?.querySelector<SupportElement>(SUPPORT_TAG);\n if (element !== null && element !== undefined) element.intent = JSON.parse(intentJson) as PageIntent;\n }, [intentJson]);\n\n const openChat = useCallback(\n async (ask?: string, handover = false) => {\n setChatProblem(false);\n if (help.sessionUrl === undefined) {\n setChatProblem(true);\n return;\n }\n ensureScript(help.scriptUrl ?? DEFAULT_SUPPORT_SCRIPT);\n const element = await whenSupportReady(chatHost.current);\n if (element === null) {\n setChatProblem(true);\n return;\n }\n element.intent = JSON.parse(intentJson) as PageIntent;\n if (handover && typeof element.handover === 'function') void element.handover();\n else if (ask !== undefined && ask !== '' && typeof element.ask === 'function') void element.ask(ask, element.intent);\n else void element.open?.();\n },\n [help.sessionUrl, help.scriptUrl, intentJson],\n );\n\n useEffect(() => {\n if (pendingQuestion === null || !open) return;\n store.set({ pendingQuestion: null });\n setQuestion(pendingQuestion);\n void openChat(pendingQuestion);\n }, [pendingQuestion, open, openChat, store]);\n\n // Scroll position survives page changes.\n useLayoutEffect(() => {\n if (open && body.current !== null) body.current.scrollTop = store.get().scrollTop;\n }, [open, article, store]);\n\n // When the person opens Help, its search takes focus on a desktop. Help that was simply left\n // open never takes focus on a page load, unless it is the modal overlay, which must hold it.\n // When it closes, focus goes back to what opened it (the Help button or a page's `?`).\n const wasOpen = useRef(open);\n useEffect(() => {\n const opened = open && !wasOpen.current;\n const closed = !open && wasOpen.current;\n wasOpen.current = open;\n if (closed) {\n const active = document.activeElement;\n if (active === null || active === document.body || column.current?.contains(active)) {\n const back = opener.current?.isConnected ? opener.current : document.querySelector<HTMLElement>('.cbx-tools [aria-controls=\"cbx-help\"]');\n back?.focus();\n }\n opener.current = null;\n return;\n }\n if (!open) return;\n if (opened) {\n const active = document.activeElement;\n opener.current = active instanceof HTMLElement && active !== document.body && !column.current?.contains(active) ? active : null;\n }\n if (opened && canAutofocus() && store.get().article === null) searchField.current?.focus();\n else if (!docked && !column.current?.contains(document.activeElement)) column.current?.focus();\n }, [open, docked, store]);\n\n const markRead = (update: SupportUpdate) => {\n if (!update.unread) return;\n store.set(state => ({ updates: state.updates.map(item => (item.id === update.id ? { ...item, unread: false } : item)) }));\n if (help.updatesUrl !== undefined) requestJson(`${help.updatesUrl.replace(/\\/$/, '')}/${encodeURIComponent(update.id)}/read`, { method: 'POST' }).catch(() => undefined);\n };\n const openUpdate = (update: SupportUpdate) => {\n markRead(update);\n if (update.kind === 'chat') void openChat();\n else if (update.url !== undefined) navigate(update.url, { newTab: true });\n else if (portal !== undefined) navigate(portal, { newTab: true });\n };\n\n const unread = updates.filter(update => update.unread);\n const unavailable = !help.enabled || updatesStatus === 'unavailable' || articles.status === 'unavailable' || results?.status === 'unavailable';\n const trail = contextTrail(shell);\n\n const submit = (event: FormEvent) => {\n event.preventDefault();\n void openChat(question.trim());\n };\n\n return (\n <div\n ref={column}\n id=\"cbx-help\"\n className={`cbx-help ${docked ? 'is-docked' : 'is-overlay'}`}\n hidden={!open}\n data-restored={restored ? 'true' : undefined}\n aria-label={t('Help')}\n role={docked ? 'complementary' : 'dialog'}\n aria-modal={docked ? undefined : true}\n tabIndex={-1}\n onKeyDown={event => {\n if (event.key === 'Escape' && !event.defaultPrevented) {\n event.preventDefault();\n toggleHelp(false);\n }\n if (!docked) trapTab(event, column.current);\n }}\n >\n <div className=\"cbx-help-head\">\n {article !== null ? (\n <button type=\"button\" className=\"cbx-icon-button\" onClick={() => store.set({ article: null })} aria-label={t('Back to Help')}>\n <ArrowLeft size={18} strokeWidth={1.8} aria-hidden />\n </button>\n ) : (\n <LifeBuoy className=\"cbx-help-mark\" size={18} strokeWidth={1.8} aria-hidden />\n )}\n <h2 className=\"cbx-help-title\">{t('Help')}</h2>\n {portal !== undefined && (\n <a className=\"cbx-icon-button\" href={portal} target=\"_blank\" rel=\"noopener\" aria-label={t('Support portal (opens in a new tab)')} title={t('Support portal')}>\n <ArrowUpRight size={18} strokeWidth={1.8} aria-hidden />\n </a>\n )}\n <button type=\"button\" className=\"cbx-icon-button\" onClick={() => toggleHelp(false)} aria-label={t('Close Help')}>\n <X size={18} strokeWidth={1.8} aria-hidden />\n </button>\n </div>\n <p className=\"cbx-help-page\">\n <span className=\"cbx-help-page-label\">{t('On this page')}</span>\n <span className=\"cbx-truncate\" title={[shell.page?.title, trail].filter(Boolean).join(' · ')}>\n {shell.page?.title !== undefined && <strong>{shell.page.title}</strong>}\n {shell.page?.title !== undefined && trail !== '' && ' · '}\n {trail}\n </span>\n </p>\n <div ref={body} className=\"cbx-help-body\" onScroll={event => store.set({ scrollTop: event.currentTarget.scrollTop })}>\n {article !== null ? (\n <article className=\"cbx-help-article\">\n <h3>{article.title}</h3>\n {(article.body ?? article.excerpt ?? '').split(/\\n{2,}/).filter(Boolean).map((paragraph, index) => <p key={index}>{paragraph}</p>)}\n {article.url !== undefined && (\n <a className=\"cbx-link\" href={article.url} target=\"_blank\" rel=\"noopener\">\n {t('Open the full article')} <ArrowUpRight size={14} strokeWidth={1.8} aria-hidden />\n </a>\n )}\n </article>\n ) : (\n <>\n {unavailable && (\n <div className=\"cbx-help-notice\" role=\"status\">\n <CircleAlert size={16} strokeWidth={1.8} aria-hidden />\n <span>{help.enabled ? t('Help is not available right now. The rest of the app works as usual.') : t('Help is not available here yet.')}</span>\n {help.enabled && <button type=\"button\" className=\"cbx-link\" onClick={() => { loadUpdates(); setArticles(current => ({ ...current, status: 'loading', topic: undefined })); }}>{t('Try again')}</button>}\n </div>\n )}\n {unread.length > 0 || updates.length > 0 ? (\n <section className=\"cbx-help-section\" aria-labelledby=\"cbx-help-updates\">\n <div className=\"cbx-pane-heading\">\n <span id=\"cbx-help-updates\">{t('Support updates')}</span>\n {unread.length > 0 && <button type=\"button\" className=\"cbx-pane-all\" onClick={() => unread.forEach(markRead)}>{t('Mark all read')}</button>}\n </div>\n <ul className=\"cbx-list\" role=\"list\">\n {updates.map(update => (\n <li key={update.id}>\n <button type=\"button\" className={`cbx-update ${update.unread ? 'is-unread' : ''}`} onClick={() => openUpdate(update)}>\n {update.kind === 'chat' ? <MessageSquare size={16} strokeWidth={1.8} aria-hidden /> : <Ticket size={16} strokeWidth={1.8} aria-hidden />}\n <span className=\"cbx-update-text\">\n <span className=\"cbx-update-title cbx-truncate\" title={update.title}>{update.title}</span>\n {update.excerpt !== undefined && <span className=\"cbx-update-excerpt\">{update.excerpt}</span>}\n </span>\n <span className=\"cbx-update-meta\">\n {update.at !== undefined && <time dateTime={update.at}>{formatDate(update.at)}</time>}\n {update.unread && <span className=\"cbx-unread-dot\" aria-label={t('Unread')} />}\n </span>\n </button>\n </li>\n ))}\n </ul>\n </section>\n ) : null}\n <section className=\"cbx-help-section\" aria-label={t('Search docs and knowledge base')}>\n <div className=\"cbx-help-search\">\n <Search size={16} strokeWidth={1.8} aria-hidden />\n <input\n ref={searchField}\n type=\"search\"\n value={query}\n onChange={event => store.set({ query: event.target.value })}\n placeholder={t('Search docs and knowledge base')}\n aria-label={t('Search docs and knowledge base')}\n disabled={!help.enabled || help.searchUrl === undefined}\n />\n </div>\n {results !== null && (\n <ul className=\"cbx-list\" role=\"list\" aria-live=\"polite\">\n {results.items.map(item => (\n <li key={item.id}><ArticleRow article={item} /></li>\n ))}\n {results.status === 'ready' && results.items.length === 0 && <li className=\"cbx-list-note\">{t('Nothing matches “{query}”.', { query: results.q })}</li>}\n {results.status === 'loading' && results.items.length === 0 && <li className=\"cbx-list-note\">{t('Searching…')}</li>}\n </ul>\n )}\n </section>\n {help.topic !== undefined && articles.items.length > 0 && (\n <section className=\"cbx-help-section\" aria-labelledby=\"cbx-help-topic\">\n <div className=\"cbx-pane-heading\"><span id=\"cbx-help-topic\">{t('For this page')}</span></div>\n <ul className=\"cbx-list\" role=\"list\">\n {articles.items.map(item => <li key={item.id}><ArticleRow article={item} /></li>)}\n </ul>\n </section>\n )}\n <section className=\"cbx-help-section\" aria-labelledby=\"cbx-help-ask\">\n <div className=\"cbx-pane-heading\"><span id=\"cbx-help-ask\">{t('Ask Cbox')}</span></div>\n <form className=\"cbx-ask\" onSubmit={submit}>\n <textarea\n className=\"cbx-input\"\n rows={3}\n value={question}\n onChange={event => setQuestion(event.target.value)}\n placeholder={t('Ask about this page…')}\n aria-label={t('Ask Cbox')}\n disabled={!help.enabled || help.sessionUrl === undefined}\n onKeyDown={event => {\n if (event.key === 'Enter' && (event.metaKey || event.ctrlKey)) submit(event);\n }}\n />\n <button type=\"submit\" className=\"cbx-button cbx-button-primary\" disabled={!help.enabled || help.sessionUrl === undefined}>\n <Sparkles size={15} strokeWidth={1.8} aria-hidden /> {t('Ask')}\n </button>\n </form>\n {chatProblem && <p className=\"cbx-create-error\" role=\"alert\">{t('The chat could not be opened. Try again, or use the support portal.')}</p>}\n </section>\n </>\n )}\n {/* The chat element sits outside the home/article switch, so opening an article\n (from the palette, \"For this page\" or a search) never unmounts it and the\n conversation survives (§7.1). */}\n {help.enabled && help.sessionUrl !== undefined && (\n <div ref={chatHost} className=\"cbx-chat-host\" data-view={article !== null ? 'article' : 'home'}>\n {createElement(SUPPORT_TAG, { 'session-url': help.sessionUrl, intent: intentJson })}\n </div>\n )}\n </div>\n <div className=\"cbx-help-foot\">\n <button type=\"button\" className=\"cbx-row cbx-row-action\" onClick={() => void openChat(t('I would like to talk to a person.'), true)} disabled={!help.enabled || help.sessionUrl === undefined}>\n <UserRound size={16} strokeWidth={1.8} aria-hidden />\n <span className=\"cbx-row-name\">{t('Talk to a person')}</span>\n </button>\n {portal !== undefined && (\n <a className=\"cbx-row cbx-row-action\" href={portal} target=\"_blank\" rel=\"noopener\">\n <BookOpen size={16} strokeWidth={1.8} aria-hidden />\n <span className=\"cbx-row-name\">{t('Support portal')}</span>\n <ArrowUpRight className=\"cbx-row-trail\" size={14} strokeWidth={1.8} aria-hidden />\n </a>\n )}\n </div>\n </div>\n );\n}\n\n/** \"10 Nov, 10:12\" in the person's regional format and time zone (Cbox ID's preferences). */\nexport function useShortDate(locale: string | undefined, timeZone: string | undefined): (iso: string) => string {\n const format = useMemo(() => {\n const options: Intl.DateTimeFormatOptions = { day: 'numeric', month: 'short', hour: '2-digit', minute: '2-digit' };\n try {\n return new Intl.DateTimeFormat(locale, { ...options, timeZone });\n } catch {\n return new Intl.DateTimeFormat(undefined, options);\n }\n }, [locale, timeZone]);\n return useCallback((iso: string) => {\n const date = new Date(iso);\n return Number.isNaN(date.getTime()) ? iso : format.format(date);\n }, [format]);\n}\n\nfunction ArticleRow({ article }: { article: HelpArticle }) {\n const { openArticle } = useShell();\n return (\n <button type=\"button\" className=\"cbx-update\" onClick={() => openArticle(article)}>\n <BookOpen size={16} strokeWidth={1.8} aria-hidden />\n <span className=\"cbx-update-text\">\n <span className=\"cbx-update-title cbx-truncate\" title={article.title}>{article.title}</span>\n {article.excerpt !== undefined && <span className=\"cbx-update-excerpt\">{article.excerpt}</span>}\n </span>\n </button>\n );\n}\n","import type { ComponentType } from 'react';\nimport {\n Activity,\n BarChart3,\n Bell,\n BookOpen,\n Boxes,\n Briefcase,\n Building2,\n Calendar,\n Circle,\n Clock,\n Cloud,\n Code,\n CreditCard,\n Database,\n FileText,\n Folder,\n GitBranch,\n Globe,\n HardDrive,\n Home,\n Inbox,\n Key,\n LayoutDashboard,\n LayoutGrid,\n Layers,\n LifeBuoy,\n List,\n Lock,\n Mail,\n MessageSquare,\n Network,\n Package,\n Percent,\n Plug,\n Receipt,\n Rocket,\n Search,\n Send,\n Server,\n Settings,\n Shield,\n ShieldCheck,\n Sparkles,\n Tag,\n Timer,\n Users,\n Wallet,\n Webhook,\n Zap,\n} from 'lucide-react';\n\nexport type ShellIcon = ComponentType<{ size?: number; strokeWidth?: number; className?: string; 'aria-hidden'?: boolean }>;\n\n/** Lucide names an app can use for areas, pages and actions without shipping its own map. */\nexport const SHELL_ICONS: Readonly<Record<string, ShellIcon>> = {\n activity: Activity,\n 'bar-chart': BarChart3,\n bell: Bell,\n 'book-open': BookOpen,\n boxes: Boxes,\n briefcase: Briefcase,\n building: Building2,\n calendar: Calendar,\n clock: Clock,\n cloud: Cloud,\n code: Code,\n 'credit-card': CreditCard,\n database: Database,\n 'file-text': FileText,\n folder: Folder,\n 'git-branch': GitBranch,\n globe: Globe,\n 'hard-drive': HardDrive,\n home: Home,\n inbox: Inbox,\n key: Key,\n 'layout-dashboard': LayoutDashboard,\n 'layout-grid': LayoutGrid,\n layers: Layers,\n 'life-buoy': LifeBuoy,\n list: List,\n lock: Lock,\n mail: Mail,\n 'message-square': MessageSquare,\n network: Network,\n package: Package,\n percent: Percent,\n plug: Plug,\n receipt: Receipt,\n rocket: Rocket,\n search: Search,\n send: Send,\n server: Server,\n settings: Settings,\n shield: Shield,\n 'shield-check': ShieldCheck,\n sparkles: Sparkles,\n tag: Tag,\n timer: Timer,\n users: Users,\n wallet: Wallet,\n webhook: Webhook,\n zap: Zap,\n};\n\n/** The icon for a name: the host's map first, then the built-in one, then a plain circle. */\nexport function resolveIcon(name: string | undefined, extra: Readonly<Record<string, ShellIcon>> = {}): ShellIcon {\n if (name === undefined) return Circle;\n return extra[name] ?? SHELL_ICONS[name] ?? Circle;\n}\n","import { ArrowLeft, Bell, LayoutGrid, X } from 'lucide-react';\nimport { useEffect, useRef, useState, type ReactNode } from 'react';\nimport { AccountMenu } from './account-menu';\nimport { AppGrid } from './app-grid';\nimport { LevelPane, pickKeepingEnvironment } from './context-menus';\nimport { useShell } from './context';\nimport { pluralOf } from './data';\nimport { resolveIcon } from './icons';\nimport { trapTab } from './popover';\n\n/**\n * A modal sheet for the phone layout (§4.5): it traps focus, closes on Escape and on the scrim,\n * and gives focus back to what opened it.\n */\nexport function Sheet({ label, side, onClose, children, head }: { label: string; side: 'left' | 'bottom'; onClose: () => void; children: ReactNode; head?: ReactNode }) {\n const { t } = useShell();\n const panel = useRef<HTMLDivElement>(null);\n const opener = useRef<Element | null>(typeof document !== 'undefined' ? document.activeElement : null);\n useEffect(() => {\n panel.current?.focus();\n const back = opener.current;\n return () => {\n if (back instanceof HTMLElement) back.focus();\n };\n }, []);\n return (\n <div className=\"cbx-overlay cbx-sheet-backdrop\" onPointerDown={event => { if (event.target === event.currentTarget) onClose(); }}>\n <div\n ref={panel}\n className={`cbx-sheet cbx-sheet-${side}`}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={label}\n tabIndex={-1}\n onKeyDown={event => {\n if (event.key === 'Escape' && !event.defaultPrevented) {\n event.preventDefault();\n onClose();\n }\n trapTab(event, panel.current);\n }}\n >\n <div className=\"cbx-sheet-head\">\n {head ?? <strong className=\"cbx-sheet-title\">{label}</strong>}\n <button type=\"button\" className=\"cbx-icon-button\" onClick={onClose} aria-label={t('Close')}>\n <X size={18} strokeWidth={1.8} aria-hidden />\n </button>\n </div>\n <div className=\"cbx-sheet-body\">{children}</div>\n </div>\n </div>\n );\n}\n\n/** ☰: areas with their pages, Switch app, notifications when the app has them, and the account. */\nexport function NavSheet({ onClose }: { onClose: () => void }) {\n const { shell, t, Link, icons } = useShell();\n const [view, setView] = useState<'nav' | 'apps'>('nav');\n if (view === 'apps') {\n return (\n <Sheet\n label={t('Switch app')}\n side=\"left\"\n onClose={onClose}\n head={\n <button type=\"button\" className=\"cbx-row cbx-row-action cbx-back\" onClick={() => setView('nav')}>\n <ArrowLeft size={16} strokeWidth={1.8} aria-hidden />\n <span className=\"cbx-row-name\">{t('Switch app')}</span>\n </button>\n }\n >\n <AppGrid autoFocus={false} />\n </Sheet>\n );\n }\n return (\n <Sheet label={shell.app.name} side=\"left\" onClose={onClose}>\n <nav aria-label={t('Navigation')} className=\"cbx-list\">\n {shell.nav.areas.map(area => {\n const Icon = resolveIcon(area.icon, icons);\n const activeArea = area.key === shell.nav.activeArea;\n return (\n <div key={area.key} className=\"cbx-sheet-area\">\n <Link href={area.url} className={`cbx-row cbx-row-action ${activeArea ? ((area.pages ?? []).length > 1 ? 'is-open' : 'is-current') : ''}`} aria-current={activeArea && (area.pages ?? []).length <= 1 ? 'page' : undefined} onClick={onClose}>\n <Icon size={16} strokeWidth={1.8} aria-hidden />\n <span className=\"cbx-row-name\">{area.label}</span>\n </Link>\n {(area.pages ?? []).length > 1 && (\n <div className=\"cbx-sheet-pages\">\n {(area.pages ?? []).map(page => {\n const on = activeArea && page.key === shell.nav.activePage;\n return (\n <Link key={page.key} href={page.url} className={`cbx-row cbx-row-action ${on ? 'is-current' : ''}`} aria-current={on ? 'page' : undefined} onClick={onClose}>\n <span className=\"cbx-row-name\">{page.label}</span>\n </Link>\n );\n })}\n </div>\n )}\n </div>\n );\n })}\n </nav>\n <div className=\"cbx-list cbx-list-foot\">\n <button type=\"button\" className=\"cbx-row cbx-row-action\" onClick={() => setView('apps')}>\n <LayoutGrid size={16} strokeWidth={1.8} aria-hidden />\n <span className=\"cbx-row-name\">{t('Switch app')}</span>\n </button>\n {shell.notifications.enabled && (\n <Link href={shell.notifications.url} className=\"cbx-row cbx-row-action\" onClick={onClose}>\n <Bell size={16} strokeWidth={1.8} aria-hidden />\n <span className=\"cbx-row-name\">{t('Notifications')}</span>\n {shell.notifications.unread > 0 && <span className=\"cbx-count is-inline\">{shell.notifications.unread}</span>}\n </Link>\n )}\n </div>\n <AccountMenu inline onDone={onClose} />\n </Sheet>\n );\n}\n\n/** The one context button's sheet: every level stacked, each with search and \"New …\" (§4.5). */\nexport function ContextSheet({ onClose }: { onClose: () => void }) {\n const { shell, t, switchTo } = useShell();\n const [organization, outer, inner] = shell.context.levels;\n return (\n <Sheet label={t('Where you are')} side=\"bottom\" onClose={onClose}>\n {organization !== undefined && (\n <section className=\"cbx-sheet-level\" aria-label={organization.label}>\n <LevelPane\n level={organization}\n currentId={organization.current.id}\n heading={pluralOf(organization)}\n createLabel={t('New {thing}', { thing: organization.label.toLowerCase() })}\n onPick={item => switchTo({ [organization.key]: item.id })}\n />\n </section>\n )}\n {outer !== undefined && (\n <section className=\"cbx-sheet-level\" aria-label={outer.label}>\n <LevelPane\n level={outer}\n parent={organization?.current.id}\n currentId={outer.current.id}\n heading={pluralOf(outer)}\n createLabel={t('New {thing}', { thing: outer.label.toLowerCase() })}\n onPick={item => void pickKeepingEnvironment(outer, inner, item, switchTo)}\n />\n </section>\n )}\n {outer !== undefined && inner !== undefined && (\n <section className=\"cbx-sheet-level\" aria-label={inner.label}>\n <LevelPane\n level={inner}\n parent={outer.current.id}\n currentId={inner.current.id}\n heading={t('{things} in {name}', { things: pluralOf(inner), name: outer.current.name })}\n createLabel={t('New {thing} in {name}', { thing: inner.label.toLowerCase(), name: outer.current.name })}\n onPick={item => switchTo({ [outer.key]: outer.current.id, [inner.key]: item.id })}\n />\n </section>\n )}\n </Sheet>\n );\n}\n","import { ArrowRight, BookOpen, Building2, CornerDownLeft, FileText, Search, Sparkles, Zap } from 'lucide-react';\nimport { useEffect, useId, useMemo, useRef, useState, type KeyboardEvent, type ReactNode } from 'react';\nimport { initialsOf, requestJson, safeUrl, withQuery } from './data';\nimport { parseArticles, type HelpArticle } from './help-store';\nimport { resolveIcon } from './icons';\nimport { canAutofocus } from './media';\nimport { revealInList, trapTab } from './popover';\nimport { useShell } from './context';\nimport { DEBOUNCE_MS } from './use-list';\nimport type { Shell } from './types';\n\nexport const GROUP_LIMIT = 5;\n\nexport type PaletteGroupKey = 'pages' | 'records' | 'actions' | 'goto' | 'docs' | 'ask';\n\n/** One result. `run` does what Enter does; `href` is what ⌘Enter opens in a new tab. */\nexport type PaletteItem = {\n id: string;\n title: string;\n subtitle?: string;\n icon?: ReactNode;\n href?: string;\n run: (newTab: boolean) => void;\n};\n\ntype GroupState = { status: 'idle' | 'loading' | 'ready' | 'error'; items: PaletteItem[] };\n\n/** Matches `query` against words: every term must be found. Ranks prefix matches first. */\nexport function matchScore(text: string, query: string): number {\n const haystack = text.toLowerCase();\n const terms = query.toLowerCase().trim().split(/\\s+/).filter(Boolean);\n if (terms.length === 0) return 1;\n let score = 0;\n for (const term of terms) {\n const at = haystack.indexOf(term);\n if (at < 0) return 0;\n score += at === 0 ? 3 : haystack[at - 1] === ' ' ? 2 : 1;\n }\n return score;\n}\n\nfunction localPages(shell: Shell, query: string, open: (url: string, newTab: boolean) => void): PaletteItem[] {\n const entries: Array<{ id: string; title: string; subtitle?: string; url: string; icon?: string }> = [];\n for (const area of shell.nav.areas) {\n entries.push({ id: `area:${area.key}`, title: area.label, url: area.url, icon: area.icon });\n for (const page of area.pages ?? []) {\n if (page.url === area.url) continue;\n entries.push({ id: `page:${area.key}:${page.key}`, title: page.label, subtitle: area.label, url: page.url, icon: page.icon ?? area.icon });\n }\n }\n return entries\n .map(entry => ({ entry, score: matchScore(`${entry.title} ${entry.subtitle ?? ''}`, query) }))\n .filter(({ score }) => score > 0)\n .sort((a, b) => b.score - a.score)\n .map(({ entry }) => {\n const Icon = resolveIcon(entry.icon);\n return { id: entry.id, title: entry.title, subtitle: entry.subtitle, href: entry.url, icon: <Icon size={16} strokeWidth={1.8} aria-hidden />, run: (newTab: boolean) => open(entry.url, newTab) };\n });\n}\n\nfunction rows(body: unknown): Array<Record<string, unknown>> {\n const data = Array.isArray(body) ? body : typeof body === 'object' && body !== null ? (body as { data?: unknown }).data : null;\n return Array.isArray(data) ? data.filter((row): row is Record<string, unknown> => typeof row === 'object' && row !== null) : [];\n}\n\n/**\n * ⌘K (§6): Pages, Records, Actions, Go to, Docs and Ask Cbox, in that order. Typing is\n * debounced 120 ms; the server groups load in parallel, each on its own, so a slow group never\n * holds up the others. ↑↓ move, Enter opens, ⌘Enter opens in a new tab, Esc closes.\n */\nexport function CommandPalette({ onClose }: { onClose: () => void }) {\n const { shell, t, navigate, switchTo, openArticle, ask } = useShell();\n const [input, setInput] = useState('');\n const [query, setQuery] = useState('');\n const [groups, setGroups] = useState<Partial<Record<PaletteGroupKey, GroupState>>>({});\n const [expanded, setExpanded] = useState<PaletteGroupKey | null>(null);\n // The active row is held by its id, not its place: a slow group arriving above it must not\n // move the highlight onto another result under a fast Enter (§12.1, nothing jumps).\n const [activeKey, setActiveKey] = useState<string | null>(null);\n const field = useRef<HTMLInputElement>(null);\n const dialog = useRef<HTMLDivElement>(null);\n const id = useId();\n const opener = useRef<Element | null>(typeof document !== 'undefined' ? document.activeElement : null);\n\n useEffect(() => {\n if (canAutofocus()) field.current?.focus();\n else dialog.current?.focus();\n const back = opener.current;\n return () => {\n if (back instanceof HTMLElement) back.focus();\n };\n }, []);\n\n useEffect(() => {\n const timer = setTimeout(() => setQuery(input), DEBOUNCE_MS);\n return () => clearTimeout(timer);\n }, [input]);\n\n // A new tab leaves the palette open, so the person can open several results.\n const open = (url: string, newTab: boolean) => {\n if (!newTab) onClose();\n navigate(url, { newTab });\n };\n\n // Server groups: each starts on its own and fills in when it answers.\n useEffect(() => {\n const q = query.trim();\n const controller = new AbortController();\n const run = (key: PaletteGroupKey, load: () => Promise<PaletteItem[]>) => {\n setGroups(current => ({ ...current, [key]: { status: 'loading', items: current[key]?.items ?? [] } }));\n load()\n .then(items => {\n if (!controller.signal.aborted) setGroups(current => ({ ...current, [key]: { status: 'ready', items } }));\n })\n .catch(() => {\n if (!controller.signal.aborted) setGroups(current => ({ ...current, [key]: { status: 'error', items: [] } }));\n });\n };\n const signal = controller.signal;\n if (q === '') {\n setGroups({});\n return () => controller.abort();\n }\n if (shell.palette.searchUrl !== undefined) {\n run('records', async () =>\n rows(await requestJson(withQuery(shell.palette.searchUrl!, { q }), { signal })).flatMap(row => {\n const url = safeUrl(row.url);\n if (typeof row.title !== 'string' || url === undefined) return [];\n return [{ id: `record:${String(row.id ?? url)}`, title: row.title, subtitle: typeof row.subtitle === 'string' ? row.subtitle : undefined, href: url, icon: <FileText size={16} strokeWidth={1.8} aria-hidden />, run: (newTab: boolean) => open(url, newTab) }];\n }),\n );\n }\n const organization = shell.context.levels[0];\n run('goto', async () => {\n const loads: Array<Promise<PaletteItem[]>> = [];\n if (organization !== undefined) {\n loads.push(\n requestJson(withQuery(organization.listUrl, { q, limit: '5' }), { signal }).then(body =>\n rows(body).flatMap(row => {\n if ((typeof row.id !== 'string' && typeof row.id !== 'number') || typeof row.name !== 'string') return [];\n const orgId = String(row.id);\n return [{ id: `org:${orgId}`, title: row.name, subtitle: organization.label, icon: <span className=\"cbx-chip cbx-chip-soft\" aria-hidden=\"true\">{typeof row.initials === 'string' ? row.initials : initialsOf(row.name)}</span>, run: () => { onClose(); switchTo({ [organization.key]: orgId }); } }];\n }),\n ),\n );\n }\n if (shell.palette.gotoUrl !== undefined) {\n loads.push(\n requestJson(withQuery(shell.palette.gotoUrl, { q }), { signal }).then(body =>\n rows(body).flatMap(row => {\n if (typeof row.title !== 'string') return [];\n const levels = typeof row.levels === 'object' && row.levels !== null ? (row.levels as Record<string, string>) : null;\n const url = safeUrl(row.url);\n if (levels === null && url === undefined) return [];\n return [{ id: `goto:${row.title}:${String(row.subtitle ?? '')}`, title: row.title, subtitle: typeof row.subtitle === 'string' ? row.subtitle : undefined, href: url, icon: <Building2 size={16} strokeWidth={1.8} aria-hidden />, run: (newTab: boolean) => { if (levels !== null && !newTab) { onClose(); switchTo(levels); } else if (url !== undefined) open(url, newTab); } }];\n }),\n ),\n );\n }\n const settled = await Promise.allSettled(loads);\n if (settled.every(result => result.status === 'rejected') && settled.length > 0) throw new Error('unavailable');\n return settled.flatMap(result => (result.status === 'fulfilled' ? result.value : []));\n });\n if (shell.help.enabled && shell.help.searchUrl !== undefined) {\n run('docs', async () =>\n parseArticles(await requestJson(withQuery(shell.help.searchUrl!, { q, topic: shell.help.topic }), { signal })).map((article: HelpArticle) => ({\n id: `doc:${article.id}`,\n title: article.title,\n subtitle: article.excerpt,\n href: article.url,\n icon: <BookOpen size={16} strokeWidth={1.8} aria-hidden />,\n run: (newTab: boolean) => {\n if (newTab && article.url !== undefined) {\n navigate(article.url, { newTab: true });\n return;\n }\n onClose();\n openArticle(article);\n },\n })),\n );\n }\n return () => controller.abort();\n }, [query, shell]);\n\n const q = input.trim();\n const pages = useMemo(() => localPages(shell, q, open), [shell, q]);\n const actions = useMemo<PaletteItem[]>(\n () =>\n shell.palette.actions\n .filter(action => matchScore(`${action.label} ${(action.keywords ?? []).join(' ')}`, q) > 0)\n .map(action => {\n const Icon = action.icon !== undefined ? resolveIcon(action.icon) : Zap;\n return {\n id: `action:${action.id}`,\n title: action.label,\n href: action.method === 'post' ? undefined : action.url,\n icon: <Icon size={16} strokeWidth={1.8} aria-hidden />,\n run: (newTab: boolean) => {\n if (!newTab) onClose();\n navigate(action.url, { method: action.method ?? 'get', newTab: newTab && action.method !== 'post' });\n },\n };\n }),\n [shell, q],\n );\n\n const sections: Array<{ key: PaletteGroupKey; label: string; state: GroupState }> = [\n { key: 'pages' as const, label: t('Pages'), state: { status: 'ready' as const, items: pages } },\n { key: 'records' as const, label: t('Records'), state: groups.records ?? { status: 'idle' as const, items: [] } },\n { key: 'actions' as const, label: t('Actions'), state: { status: 'ready' as const, items: actions } },\n { key: 'goto' as const, label: t('Go to'), state: groups.goto ?? { status: 'idle' as const, items: [] } },\n { key: 'docs' as const, label: t('Docs and help'), state: groups.docs ?? { status: 'idle' as const, items: [] } },\n ];\n if (q !== '') {\n sections.push({\n key: 'ask',\n label: t('Ask Cbox'),\n state: {\n status: 'ready',\n items: [{ id: 'ask', title: t('Ask Cbox: “{query}”', { query: q }), subtitle: t('About this page'), icon: <Sparkles size={16} strokeWidth={1.8} aria-hidden />, run: () => { onClose(); ask(q); } }],\n },\n });\n }\n\n // Flatten into options, with \"Show all in {group}\" after five.\n type Option = { kind: 'item'; item: PaletteItem; group: PaletteGroupKey } | { kind: 'all'; group: PaletteGroupKey; label: string };\n const options: Option[] = [];\n const rendered = sections.map(section => {\n const all = expanded === section.key;\n const items = all ? section.state.items : section.state.items.slice(0, GROUP_LIMIT);\n const start = options.length;\n items.forEach(item => options.push({ kind: 'item', item, group: section.key }));\n const more = !all && section.state.items.length > GROUP_LIMIT;\n if (more) options.push({ kind: 'all', group: section.key, label: t('Show all in {group}', { group: section.label }) });\n return { ...section, start, count: items.length + (more ? 1 : 0) };\n });\n\n const keyOf = (option: Option): string => (option.kind === 'item' ? `${option.group}:${option.item.id}` : `all:${option.group}`);\n const found = activeKey === null ? -1 : options.findIndex(option => keyOf(option) === activeKey);\n const active = found >= 0 ? found : 0;\n const setActive = (next: number | ((index: number) => number)) => {\n const index = typeof next === 'function' ? next(active) : next;\n const option = options[index];\n setActiveKey(option === undefined ? null : keyOf(option));\n };\n\n useEffect(() => {\n setActiveKey(null);\n }, [q]);\n // Pin the first result once there is one, so a group arriving above does not take its place.\n const firstKey = options[0] === undefined ? null : keyOf(options[0]);\n useEffect(() => {\n if (activeKey === null && firstKey !== null) setActiveKey(firstKey);\n }, [activeKey, firstKey]);\n useEffect(() => {\n revealInList(`${id}-${active}`);\n }, [active, id]);\n\n const choose = (option: Option | undefined, newTab: boolean) => {\n if (option === undefined) return;\n if (option.kind === 'all') {\n setExpanded(option.group);\n return;\n }\n if (newTab && option.item.href === undefined) return;\n option.item.run(newTab);\n };\n\n const onKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n const last = options.length - 1;\n if (event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n onClose();\n } else if (event.key === 'ArrowDown') {\n event.preventDefault();\n setActive(index => (index >= last ? 0 : index + 1));\n } else if (event.key === 'ArrowUp') {\n event.preventDefault();\n setActive(index => (index <= 0 ? last : index - 1));\n } else if (event.key === 'Enter') {\n event.preventDefault();\n choose(options[active], event.metaKey || event.ctrlKey);\n } else {\n trapTab(event, dialog.current);\n }\n };\n\n const activeOption = options[active];\n return (\n <div className=\"cbx-overlay cbx-palette-backdrop\" onPointerDown={event => { if (event.target === event.currentTarget) onClose(); }}>\n <div ref={dialog} className=\"cbx-palette\" role=\"dialog\" aria-modal=\"true\" aria-label={t('Search')} tabIndex={-1} onKeyDown={onKeyDown}>\n <div className=\"cbx-palette-search\">\n <Search size={18} strokeWidth={1.8} aria-hidden />\n <input\n ref={field}\n type=\"search\"\n role=\"combobox\"\n aria-expanded=\"true\"\n aria-controls={`${id}-list`}\n aria-activedescendant={activeOption !== undefined ? `${id}-${active}` : undefined}\n aria-autocomplete=\"list\"\n aria-label={t('Search or ask…')}\n placeholder={t('Search or ask…')}\n value={input}\n onChange={event => setInput(event.target.value)}\n autoComplete=\"off\"\n spellCheck={false}\n />\n <kbd className=\"cbx-kbd\">Esc</kbd>\n </div>\n <div id={`${id}-list`} role=\"listbox\" aria-label={t('Results')} className=\"cbx-palette-list\">\n {rendered.map(section => {\n const loading = section.state.status === 'loading' && section.state.items.length === 0;\n if (section.count === 0 && !loading) return null;\n return (\n <div key={section.key} role=\"group\" aria-labelledby={`${id}-${section.key}`} className=\"cbx-palette-group\">\n <div id={`${id}-${section.key}`} className=\"cbx-pane-heading\" role=\"presentation\">\n <span>{section.label}</span>\n {section.state.status === 'loading' && <span className=\"cbx-palette-busy\" aria-hidden=\"true\" />}\n </div>\n {loading && <div className=\"cbx-list-note\" aria-live=\"polite\">{t('Searching…')}</div>}\n {options.slice(section.start, section.start + section.count).map((option, offset) => {\n const index = section.start + offset;\n const on = index === active;\n return (\n <div\n key={option.kind === 'item' ? option.item.id : `all:${option.group}`}\n id={`${id}-${index}`}\n role=\"option\"\n aria-selected={on}\n className={`cbx-row ${on ? 'is-active' : ''} ${option.kind === 'all' ? 'cbx-row-more' : ''}`}\n onMouseMove={() => setActive(index)}\n onClick={event => choose(option, event.metaKey || event.ctrlKey)}\n >\n {option.kind === 'item' ? (\n <>\n <span className=\"cbx-row-icon\">{option.item.icon}</span>\n <span className=\"cbx-row-name\" title={option.item.title}>{option.item.title}</span>\n {option.item.subtitle !== undefined && <span className=\"cbx-row-label cbx-truncate\">{option.item.subtitle}</span>}\n {on && <CornerDownLeft className=\"cbx-row-trail\" size={14} strokeWidth={1.8} aria-hidden />}\n </>\n ) : (\n <>\n <span className=\"cbx-row-icon\"><ArrowRight size={16} strokeWidth={1.8} aria-hidden /></span>\n <span className=\"cbx-row-name\">{option.label}</span>\n </>\n )}\n </div>\n );\n })}\n </div>\n );\n })}\n {options.length === 0 && q !== '' && <div className=\"cbx-list-note\">{t('Nothing matches “{query}”.', { query: q })}</div>}\n </div>\n <div className=\"cbx-palette-foot\" aria-hidden=\"true\">\n <span><kbd className=\"cbx-kbd\">↑</kbd><kbd className=\"cbx-kbd\">↓</kbd> {t('move')}</span>\n <span><kbd className=\"cbx-kbd\">↵</kbd> {t('open')}</span>\n <span><kbd className=\"cbx-kbd\">⌘↵</kbd> {t('new tab')}</span>\n </div>\n </div>\n </div>\n );\n}\n","import { Bell, ChevronsUpDown, CircleHelp, LayoutGrid, Menu, PanelLeftClose, PanelLeftOpen, Pin, PinOff, Search } from 'lucide-react';\nimport { useCallback, useEffect, useMemo, useRef, useState, type AnchorHTMLAttributes, type ReactNode } from 'react';\nimport { useCboxLocalization } from '../context/localization';\nimport { useKnownAppCatalog } from '../components/app-icon';\nimport { AccountMenu, Avatar } from './account-menu';\nimport { AppGrid, forgetShellCatalog, hueFor } from './app-grid';\nimport { CascadeLabel, Chip, CascadeMenu, OrganizationMenu } from './context-menus';\nimport { ShellContext, useShell, type ShellApi, type ShellLinkComponent, type ShellOverlay } from './context';\nimport { initials } from '../app-switcher/catalog';\nimport { currentLocation, defaultNavigate, switchPayload } from './data';\nimport { HelpColumn, useHelpState } from './help';\nimport { helpVisible, sharedHelpStore, type HelpStore } from './help-store';\nimport { resolveIcon, type ShellIcon } from './icons';\nimport { HELP_DOCKED, MOBILE, matches, useMedia } from './media';\nimport { ContextSheet, NavSheet } from './mobile';\nimport { CommandPalette } from './palette';\nimport { Popover } from './popover';\nimport { scopeLists } from './use-list';\nimport type { Shell, ShellNavigate, ShellPreferenceChange, ShellPreferences, ShellTheme } from './types';\n\nexport type CboxShellProps = {\n /** The shared `shell` prop. */\n shell: Shell;\n /** The page. */\n children: ReactNode;\n /** How to move the person. Inertia: `(url, o) => router.visit(url, { method: o?.method, data: o?.data })`, plus `window.open` for `newTab`. Default: page loads and form posts. */\n navigate?: ShellNavigate;\n /** Client-side link for nav and settings links (Inertia's `Link`). Default `<a>`. */\n LinkComponent?: ShellLinkComponent;\n /** Extra icons by name, on top of the built-in Lucide set. */\n icons?: Readonly<Record<string, ShellIcon>>;\n /**\n * Called when the person changes a preference, for the host to persist (a cookie read before\n * first paint, and Cbox ID's preferences for theme, language, format and time zone). Without\n * it the shell writes a `cbox_shell_<key>` cookie.\n */\n onPreferenceChange?: ShellPreferenceChange;\n /** Help's state store. Default: one per page, so it outlives the shell's own remounts. */\n helpStore?: HelpStore;\n /** Where the Cbox wordmark is served. Default `/brand`. */\n brandAssetBase?: string;\n /** `id` of the `<main>` landmark for a skip link. Default `main-content`. */\n mainId?: string;\n};\n\nconst PlainLink: ShellLinkComponent = ({ href, children, ...props }: AnchorHTMLAttributes<HTMLAnchorElement> & { href: string; children?: ReactNode }) => <a href={href} {...props}>{children}</a>;\n\nfunction writeCookie(key: string, value: unknown): void {\n if (typeof document === 'undefined') return;\n const name = `cbox_shell_${key.replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`)}`;\n document.cookie = `${name}=${encodeURIComponent(String(value))}; path=/; max-age=31536000; SameSite=Lax`;\n}\n\n/**\n * Apply a theme choice to the document the way the tokens read it: `.dark` and `data-theme` on\n * the root, with `system` following the device. The saved choice stays `system`; the device's\n * scheme is never written back (cbox-design, shared preferences).\n */\nexport function applyTheme(theme: ShellTheme): void {\n if (typeof document === 'undefined') return;\n const dark = theme === 'dark' || (theme === 'system' && typeof window.matchMedia === 'function' && window.matchMedia('(prefers-color-scheme: dark)').matches);\n const root = document.documentElement;\n root.classList.toggle('dark', dark);\n root.dataset.theme = dark ? 'dark' : 'light';\n root.dataset.themePreference = theme;\n root.style.colorScheme = dark ? 'dark' : 'light';\n}\n\n/**\n * The inline script a host puts in `<head>` so the theme is right before the first paint\n * (§12.1). `theme` is the person's saved choice from the `shell` prop.\n */\nexport function themeBootScript(theme: ShellTheme): string {\n const safe = theme === 'dark' || theme === 'light' ? theme : 'system';\n return `(function(){var t='${safe}';var d=t==='dark'||(t==='system'&&window.matchMedia&&matchMedia('(prefers-color-scheme: dark)').matches);var r=document.documentElement;r.classList.toggle('dark',d);r.dataset.theme=d?'dark':'light';r.dataset.themePreference=t;r.style.colorScheme=d?'dark':'light';})();`;\n}\n\nfunction useIsMac(): boolean {\n const [mac, setMac] = useState(true);\n useEffect(() => {\n setMac(/Mac|iPhone|iPad/i.test(navigator.platform || navigator.userAgent));\n }, []);\n return mac;\n}\n\n/**\n * The one shell for every Cbox app (spec 2026-11-10 shell v1): rail with the account at the\n * bottom, subnav, header with the context selectors, Search, Help, the bell when the app has a\n * source, Switch app; the ⌘K palette; the Help column; and the phone layout.\n *\n * Render it in the host's persistent layout (Inertia `Page.layout`), so the rail, Help and the\n * chat survive page visits; only `shell` and `children` change.\n */\nexport function CboxShell({ shell, children, navigate = defaultNavigate, LinkComponent = PlainLink, icons = {}, onPreferenceChange, helpStore, brandAssetBase = '/brand', mainId = 'main-content' }: CboxShellProps) {\n const { t } = useCboxLocalization();\n const [store] = useState(() => helpStore ?? sharedHelpStore());\n const [preferences, setPreferences] = useState<ShellPreferences>(shell.preferences);\n const [overlay, setOverlay] = useState<ShellOverlay>(null);\n\n // Help starts as the person left it, once per page; later visits keep the live state. Left\n // open, it shows docked from 1280px; below that it waits for the person (see `restored`).\n if (!store.get().seeded) store.set({ open: shell.preferences.helpOpen, restored: shell.preferences.helpOpen, seeded: true });\n\n // A new `shell` prop from the server wins for the preferences it carries.\n const serverPreferences = JSON.stringify(shell.preferences);\n useEffect(() => {\n setPreferences(JSON.parse(serverPreferences) as ShellPreferences);\n }, [serverPreferences]);\n\n const setPreference = useCallback<ShellPreferenceChange>(\n (key, value) => {\n setPreferences(current => ({ ...current, [key]: value }));\n if (key === 'theme') applyTheme(value as ShellTheme);\n if (onPreferenceChange !== undefined) onPreferenceChange(key, value);\n else writeCookie(key, value);\n },\n [onPreferenceChange],\n );\n\n const toggleHelp = useCallback(\n (open?: boolean) => {\n const next = open ?? !helpVisible(store.get(), matches(HELP_DOCKED));\n store.set({ open: next, restored: false });\n setPreference('helpOpen', next);\n },\n [store, setPreference],\n );\n\n const levels = shell.context.levels;\n const switchUrl = shell.context.switchUrl;\n\n // Lists and the app catalog kept from another context are never shown in this one.\n const scope = levels.map(level => `${level.key}:${level.current.id}`).join('|');\n if (scopeLists(scope)) forgetShellCatalog();\n const api = useMemo<ShellApi>(\n () => ({\n shell,\n t,\n navigate,\n Link: LinkComponent,\n icons,\n preferences,\n setPreference,\n overlay,\n setOverlay,\n help: store,\n toggleHelp,\n openArticle: article => {\n store.set({ article, open: true, restored: false });\n setPreference('helpOpen', true);\n },\n ask: question => {\n store.set({ open: true, restored: false, article: null, pendingQuestion: question });\n setPreference('helpOpen', true);\n },\n switchTo: chosen => {\n setOverlay(null);\n navigate(switchUrl, { method: 'post', data: switchPayload(levels, chosen, currentLocation()) });\n },\n }),\n [shell, t, navigate, LinkComponent, icons, preferences, setPreference, overlay, store, toggleHelp, levels, switchUrl],\n );\n\n const preferencesRef = useRef(preferences);\n preferencesRef.current = preferences;\n\n // ⌘K / Ctrl+K anywhere; ⌘. collapses the subnav.\n useEffect(() => {\n const keydown = (event: KeyboardEvent) => {\n if (!(event.metaKey || event.ctrlKey) || event.altKey) return;\n if (event.key.toLowerCase() === 'k') {\n event.preventDefault();\n setOverlay(current => (current === 'palette' ? null : 'palette'));\n } else if (event.key === '.') {\n event.preventDefault();\n setPreference('subnavCollapsed', !(preferencesRef.current.subnavCollapsed ?? false));\n }\n };\n window.addEventListener('keydown', keydown);\n return () => window.removeEventListener('keydown', keydown);\n }, [setPreference]);\n\n // A visit closes any open menu.\n const page = `${shell.nav.activeArea}|${shell.nav.activePage ?? ''}|${shell.page?.title ?? ''}`;\n useEffect(() => {\n setOverlay(current => (current === 'palette' ? current : null));\n }, [page]);\n\n const docked = useMedia(HELP_DOCKED, true);\n const mobile = useMedia(MOBILE, false);\n const testData = levels.some(level => level.current.testData === true);\n const helpOpen = useHelpState(store, state => helpVisible(state, docked));\n const banner = shell.banner !== undefined && (shell.banner.kind !== 'sandbox' || testData) ? shell.banner : undefined;\n\n return (\n <ShellContext.Provider value={api}>\n <div className=\"cbx-shell\" data-help-open={helpOpen}>\n <Rail brandAssetBase={brandAssetBase} />\n <div className=\"cbx-shell-column\">\n <Header mobile={mobile} />\n {banner !== undefined && (\n <div className={`cbx-banner cbx-banner-${banner.kind}`} role=\"status\">\n <span className=\"cbx-banner-text\">{banner.text}</span>\n {banner.action !== undefined && <LinkComponent href={banner.action.url} className=\"cbx-banner-action\">{banner.action.label}</LinkComponent>}\n </div>\n )}\n <div className=\"cbx-shell-body\">\n <Subnav />\n <main id={mainId} className=\"cbx-shell-main canvas-gradient\">{children}</main>\n </div>\n </div>\n <HelpColumn docked={docked} />\n {overlay === 'palette' && <CommandPalette onClose={() => setOverlay(null)} />}\n {overlay === 'nav-sheet' && <NavSheet onClose={() => setOverlay(null)} />}\n {overlay === 'context-sheet' && <ContextSheet onClose={() => setOverlay(null)} />}\n </div>\n </ShellContext.Provider>\n );\n}\n\nfunction AppMark() {\n const { shell } = useShell();\n const known = useKnownAppCatalog().find(app => app.key === shell.app.key);\n const [failed, setFailed] = useState(false);\n const style = { '--cbx-hue': String(hueFor(shell.app.key)) } as Record<string, string>;\n if (known?.icon_url && !failed) {\n return (\n <span className=\"cbx-app-mark\" aria-hidden=\"true\">\n <img src={known.icon_url} alt=\"\" className={known.icon_dark_url ? 'cbx-app-icon-light' : ''} onError={() => setFailed(true)} />\n {known.icon_dark_url && <img src={known.icon_dark_url} alt=\"\" className=\"cbx-app-icon-dark\" onError={() => setFailed(true)} />}\n </span>\n );\n }\n return <span className=\"cbx-app-mark cbx-app-tile\" style={style} aria-hidden=\"true\">{initials(shell.app.name.replace(/^Cbox\\s*·?\\s*/i, ''))}</span>;\n}\n\nfunction Rail({ brandAssetBase }: { brandAssetBase: string }) {\n const { shell, t, Link, icons, preferences, setPreference, overlay, setOverlay } = useShell();\n const [hovered, setHovered] = useState(false);\n const account = useRef<HTMLButtonElement>(null);\n const pinned = preferences.railPinned;\n const open = pinned || hovered || overlay === 'account';\n const name = shell.app.name.replace(/^Cbox\\s*·?\\s*/i, '');\n return (\n <div className=\"cbx-rail-slot\" data-pinned={pinned}>\n <aside\n className=\"cbx-rail\"\n data-open={open}\n aria-label={t('Main navigation')}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n onFocusCapture={() => setHovered(true)}\n onBlurCapture={event => {\n if (!event.currentTarget.contains(event.relatedTarget as Node | null)) setHovered(false);\n }}\n >\n <div className=\"cbx-rail-top\">\n <Link href={shell.app.homeUrl} className=\"cbx-rail-home\" aria-label={t('{app} home', { app: shell.app.name })}>\n <AppMark />\n <span className=\"cbx-rail-brand\" aria-hidden=\"true\">\n <img className=\"cbx-wordmark cbx-wordmark-light\" src={`${brandAssetBase}/cbox-logo.png`} srcSet={`${brandAssetBase}/cbox-logo.png 1x, ${brandAssetBase}/cbox-logo@2x.png 2x`} alt=\"\" height={19} />\n <img className=\"cbx-wordmark cbx-wordmark-dark\" src={`${brandAssetBase}/cbox-logo-white.png`} srcSet={`${brandAssetBase}/cbox-logo-white.png 1x, ${brandAssetBase}/cbox-logo-white@2x.png 2x`} alt=\"\" height={19} />\n <span className=\"cbx-rail-app\">{name}</span>\n </span>\n </Link>\n <button type=\"button\" className=\"cbx-icon-button cbx-rail-pin\" onClick={() => setPreference('railPinned', !pinned)} aria-label={pinned ? t('Unpin navigation') : t('Pin navigation')} aria-pressed={pinned} tabIndex={open ? 0 : -1}>\n {pinned ? <PinOff size={16} strokeWidth={1.8} aria-hidden /> : <Pin size={16} strokeWidth={1.8} aria-hidden />}\n </button>\n </div>\n <nav className=\"cbx-rail-nav\" aria-label={name}>\n {shell.nav.areas.map(area => {\n const Icon = resolveIcon(area.icon, icons);\n const active = area.key === shell.nav.activeArea;\n return (\n <Link key={area.key} href={area.url} className={`cbx-rail-link ${active ? 'is-active' : ''}`} aria-current={active ? 'page' : undefined} title={open ? undefined : area.label} aria-label={area.label}>\n <Icon size={18} strokeWidth={1.7} aria-hidden />\n <span className=\"cbx-rail-label\">{area.label}</span>\n </Link>\n );\n })}\n </nav>\n <div className=\"cbx-rail-foot\">\n <button\n ref={account}\n type=\"button\"\n className={`cbx-rail-account ${overlay === 'account' ? 'is-open' : ''}`}\n aria-haspopup=\"menu\"\n aria-expanded={overlay === 'account'}\n aria-label={t('Account and preferences')}\n onClick={() => setOverlay(overlay === 'account' ? null : 'account')}\n >\n <Avatar />\n <span className=\"cbx-rail-who\">\n <span className=\"cbx-rail-name cbx-truncate\">{shell.person.name}</span>\n <span className=\"cbx-rail-sub cbx-truncate\">{t('Account and preferences')}</span>\n </span>\n </button>\n </div>\n </aside>\n <Popover open={overlay === 'account'} anchor={account} placement=\"top-start\" label={t('Account')} onClose={() => setOverlay(null)}>\n <AccountMenu onDone={() => setOverlay(null)} />\n </Popover>\n </div>\n );\n}\n\nfunction Subnav() {\n const { shell, t, Link, preferences, setPreference } = useShell();\n const area = shell.nav.areas.find(item => item.key === shell.nav.activeArea);\n const pages = area?.pages ?? [];\n if (area === undefined || pages.length < 2) return null;\n const collapsed = preferences.subnavCollapsed ?? false;\n if (collapsed) {\n return (\n <aside className=\"cbx-subnav\" data-collapsed=\"true\" aria-label={area.label}>\n <button type=\"button\" className=\"cbx-subnav-strip\" onClick={() => setPreference('subnavCollapsed', false)} aria-label={t('Expand {area}', { area: area.label })} title=\"⌘.\">\n <PanelLeftOpen size={16} strokeWidth={1.8} aria-hidden />\n <span>{area.label}</span>\n </button>\n </aside>\n );\n }\n return (\n <aside className=\"cbx-subnav\" aria-label={area.label}>\n <div className=\"cbx-subnav-head\">\n <strong className=\"cbx-truncate\">{area.label}</strong>\n <button type=\"button\" className=\"cbx-icon-button\" onClick={() => setPreference('subnavCollapsed', true)} aria-label={t('Collapse {area}', { area: area.label })} title=\"⌘.\">\n <PanelLeftClose size={16} strokeWidth={1.8} aria-hidden />\n </button>\n </div>\n <nav aria-label={area.label} className=\"cbx-subnav-list\">\n {pages.map(page => {\n const active = page.key === shell.nav.activePage;\n return (\n <Link key={page.key} href={page.url} className={`cbx-subnav-link ${active ? 'is-active' : ''}`} aria-current={active ? 'page' : undefined}>\n <span className=\"cbx-truncate\" title={page.label}>{page.label}</span>\n </Link>\n );\n })}\n </nav>\n </aside>\n );\n}\n\nfunction Header({ mobile }: { mobile: boolean }) {\n const { shell, t, overlay, setOverlay, help, toggleHelp, Link } = useShell();\n const mac = useIsMac();\n const org = useRef<HTMLButtonElement>(null);\n const second = useRef<HTMLButtonElement>(null);\n const apps = useRef<HTMLButtonElement>(null);\n const docked = useMedia(HELP_DOCKED, true);\n const helpOpen = useHelpState(help, state => helpVisible(state, docked));\n const unread = useHelpState(help, state => state.updates.filter(update => update.unread).length);\n const [organization, ...rest] = shell.context.levels;\n const trail = shell.context.levels.map(level => level.current.name).join(' / ');\n const close = useCallback(() => setOverlay(null), [setOverlay]);\n\n return (\n <header className=\"cbx-header\">\n <button type=\"button\" className=\"cbx-icon-button cbx-only-mobile\" onClick={() => setOverlay('nav-sheet')} aria-label={t('Open navigation')} aria-haspopup=\"dialog\">\n <Menu size={20} strokeWidth={1.8} aria-hidden />\n </button>\n {organization !== undefined && (\n <div className=\"cbx-context cbx-only-desktop\">\n <button ref={org} type=\"button\" className={`cbx-trigger ${overlay === 'org' ? 'is-open' : ''}`} aria-haspopup=\"dialog\" aria-expanded={overlay === 'org'} aria-label={t('{level}: {name}', { level: organization.label, name: organization.current.name })} onClick={() => setOverlay(overlay === 'org' ? null : 'org')}>\n <Chip item={organization.current} tone=\"solid\" />\n <span className=\"cbx-trigger-text\" title={organization.current.name}>{organization.current.name}</span>\n <ChevronsUpDown className=\"cbx-trigger-chevron\" size={14} strokeWidth={1.8} aria-hidden />\n </button>\n {!mobile && (\n <Popover open={overlay === 'org'} anchor={org} label={organization.label} onClose={close}>\n <OrganizationMenu level={organization} />\n </Popover>\n )}\n {rest.length > 0 && (\n <>\n <span className=\"cbx-separator\" aria-hidden=\"true\">/</span>\n <button ref={second} type=\"button\" className={`cbx-trigger ${overlay === 'context' ? 'is-open' : ''}`} aria-haspopup=\"dialog\" aria-expanded={overlay === 'context'} aria-label={rest.map(level => t('{level}: {name}', { level: level.label, name: level.current.name })).join(', ')} onClick={() => setOverlay(overlay === 'context' ? null : 'context')}>\n <CascadeLabel levels={rest} />\n <ChevronsUpDown className=\"cbx-trigger-chevron\" size={14} strokeWidth={1.8} aria-hidden />\n </button>\n {!mobile && (\n <Popover open={overlay === 'context'} anchor={second} label={rest.map(level => level.label).join(' / ')} onClose={close}>\n <CascadeMenu levels={rest} parent={organization.current.id} />\n </Popover>\n )}\n </>\n )}\n </div>\n )}\n {organization !== undefined && (\n <button type=\"button\" className=\"cbx-trigger cbx-context-mobile cbx-only-mobile\" onClick={() => setOverlay('context-sheet')} aria-haspopup=\"dialog\" aria-label={t('Where you are: {trail}', { trail })}>\n <Chip item={organization.current} tone=\"solid\" />\n <span className=\"cbx-trigger-text\">{trail}</span>\n <ChevronsUpDown className=\"cbx-trigger-chevron\" size={14} strokeWidth={1.8} aria-hidden />\n </button>\n )}\n <div className=\"cbx-tools\">\n <button type=\"button\" className=\"cbx-search-button\" onClick={() => setOverlay('palette')} aria-label={t('Search or ask…')} aria-keyshortcuts={mac ? 'Meta+K' : 'Control+K'}>\n <Search size={16} strokeWidth={1.8} aria-hidden />\n <span className=\"cbx-search-label\">{t('Search or ask…')}</span>\n <kbd className=\"cbx-kbd\">{mac ? '⌘K' : 'Ctrl K'}</kbd>\n </button>\n <button type=\"button\" className={`cbx-tool ${helpOpen ? 'is-on' : ''}`} onClick={() => toggleHelp()} aria-pressed={helpOpen} aria-controls=\"cbx-help\" aria-label={unread > 0 ? t('Help, {count} unread', { count: unread }) : t('Help')}>\n <CircleHelp size={16} strokeWidth={1.8} aria-hidden />\n <span className=\"cbx-tool-label\">{t('Help')}</span>\n {unread > 0 && <span className=\"cbx-count\" aria-hidden=\"true\">{unread}</span>}\n </button>\n {shell.notifications.enabled && (\n <Link href={shell.notifications.url} className=\"cbx-tool cbx-tool-icon cbx-only-desktop\" aria-label={shell.notifications.unread > 0 ? t('Notifications, {count} unread', { count: shell.notifications.unread }) : t('Notifications')}>\n <Bell size={16} strokeWidth={1.8} aria-hidden />\n {shell.notifications.unread > 0 && <span className=\"cbx-count\" aria-hidden=\"true\">{shell.notifications.unread}</span>}\n </Link>\n )}\n <button ref={apps} type=\"button\" className={`cbx-tool cbx-tool-icon cbx-only-desktop ${overlay === 'apps' ? 'is-on' : ''}`} onClick={() => setOverlay(overlay === 'apps' ? null : 'apps')} aria-haspopup=\"dialog\" aria-expanded={overlay === 'apps'} aria-label={t('Switch app')} title={t('Switch app')}>\n <LayoutGrid size={16} strokeWidth={1.8} aria-hidden />\n </button>\n {!mobile && (\n <Popover open={overlay === 'apps'} anchor={apps} placement=\"bottom-end\" label={t('Switch app')} onClose={close}>\n <AppGrid />\n </Popover>\n )}\n </div>\n </header>\n );\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';\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 { createElement } from 'react';\nimport { useCboxLocalization } from '../context/localization';\nimport { defineCboxAppSwitcher } from '../app-switcher/elements';\nimport type { CboxThemeMode } from '../app-switcher/theme';\n\nexport {\n authorizeHref,\n parseAppCatalog,\n signInTarget,\n type CboxAppCatalogState,\n type CboxCatalogApp,\n} from '../app-switcher/catalog';\n\ndefineCboxAppSwitcher();\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. */\n currentAppKey: string;\n /**\n * How the theme is read. Default `auto`: `.dark`/`[data-theme]` on the root, else the\n * system scheme. `class` for a host whose tokens only turn dark under `.dark`.\n */\n theme?: CboxThemeMode;\n className?: string;\n};\n\n/**\n * The Switch-app control. It renders `<cbox-app-switcher>` from `@cboxdk/cbox-ui/app-switcher`,\n * the same element every Blade app uses, so React and Blade apps draw one identical control:\n * the live catalog from the host's endpoint, Cbox ID's light and dark icons, a quiet retry when\n * the catalog cannot be loaded, and straight to sign-in when the host answers `401 { signin_url }`.\n */\nexport function CboxAppCatalog({ endpoint, currentAppKey, theme, className }: CboxAppCatalogProps) {\n const { t } = useCboxLocalization();\n const labels = JSON.stringify({\n title: t('Switch app'),\n loading: t('Loading apps…'),\n empty: t('No apps available'),\n unavailable: t('Apps could not be loaded.'),\n });\n\n return createElement('cbox-app-switcher', {\n endpoint: endpoint ?? '',\n current: currentAppKey,\n labels,\n theme,\n className,\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","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","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 { useCboxLocalization } from '../context/localization';\nimport { useShellHelp } from '../shell/context';\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 /**\n * Show the `?` beside the title that toggles the shell's Help column (spec §7.1). The page's\n * help topic travels in `shell.help.topic`, set on the server per route (console-kit's\n * `helpTopic`), so Help knows the topic on the first paint and for pages without a header.\n * Ignored outside `CboxShell`.\n */\n help?: boolean;\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 help = false,\n className,\n}: Props) {\n const { t } = useCboxLocalization();\n const shellHelp = useShellHelp();\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 <div className=\"flex items-center gap-2\">\n <h1 className=\"text-2xl leading-tight font-semibold tracking-tight text-foreground\">\n {title}\n </h1>\n {help && shellHelp !== null ? (\n <button\n type=\"button\"\n onClick={() => shellHelp.toggleHelp()}\n aria-label={t('Help for this page')}\n aria-controls=\"cbx-help\"\n className=\"group inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-full focus-visible:outline-2 focus-visible:outline-ring [@media(pointer:coarse)]:h-11 [@media(pointer:coarse)]:w-11\"\n >\n {/* The ring stays small beside the title; the hit area is 32px, 44px on touch (§12.2). */}\n <span\n aria-hidden=\"true\"\n className=\"inline-flex h-6 w-6 items-center justify-center rounded-full border border-border text-xs font-semibold text-muted-foreground group-hover:border-accent-edge group-hover:text-primary\"\n >\n ?\n </span>\n </button>\n ) : null}\n </div>\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","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 (the bell) 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 </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 (the bell) 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","/**\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","/** 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"]}
|
|
1
|
+
{"version":3,"sources":["../src/context/cbox-id.tsx","../src/context/localization.tsx","../src/components/app-icon.tsx","../src/shell/context.tsx","../src/shell/media.ts","../src/shell/popover.tsx","../src/shell/option-list.tsx","../src/shell/account-menu.tsx","../src/shell/app-grid.tsx","../src/shell/data.ts","../src/shell/use-list.ts","../src/shell/context-menus.tsx","../src/shell/help-store.ts","../src/shell/help.tsx","../src/shell/icons.tsx","../src/shell/nav-pages.tsx","../src/shell/mobile.tsx","../src/shell/palette.tsx","../src/shell/shell.tsx","../src/layout/app-content.tsx","../src/layout/app-shell.tsx","../src/layout/cbox-brand.tsx","../src/components/app-catalog.tsx","../src/primitives/combobox.tsx","../src/primitives/data-panel.tsx","../src/primitives/empty-state.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/primitives/status-pill.tsx","../src/surfaces/surface-modal.tsx","../src/surfaces/inbox-surface.tsx","../src/surfaces/surface-state.tsx","../src/utils/url-state.ts","../src/charts/sparkline.tsx"],"names":["createContext","jsx","useContext","useSyncExternalStore","useState","useRef","useMemo","useEffect","jsxs","Fragment","ArrowUpRight","rows","query","kept","useCallback","useId","Search","Check","ChevronRight","script","useLayoutEffect","ArrowLeft","UserRound","BookOpen","Globe","LifeBuoy","MessageSquare","Settings","Sparkles","Users","Lock","X","LayoutGrid","Bell","q","FileText","Building2","Zap","createElement","id","Plus","initials","Chevron","DefaultLink","toneStyles","TONES"],"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 /** 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 { 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';\nimport { initials, readKnownAppCatalog, secureIconUrl, subscribeKnownAppCatalog, type CboxKnownApp } from '../app-switcher/catalog';\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 } from '../app-switcher/catalog';\nexport { readKnownAppCatalog, rememberAppCatalog, secureIconUrl } from '../app-switcher/catalog';\n\nconst EMPTY: CboxKnownApp[] = [];\n\n/** The last catalog this browser kept; empty on the server and before the first answer. */\nexport function useKnownAppCatalog(): CboxKnownApp[] {\n return useSyncExternalStore(subscribeKnownAppCatalog, readKnownAppCatalog, () => EMPTY);\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 { createContext, useContext, type AnchorHTMLAttributes, type ComponentType, type ReactNode } from 'react';\nimport type { CboxTranslator } from '../context/localization';\nimport type { HelpArticle, HelpStore } from './help-store';\nimport type { ShellIcon } from './icons';\nimport type { Shell, ShellNavigate, ShellPreferenceChange, ShellPreferences } from './types';\n\n/** A client-side link (Inertia's `Link`). Receives `href`, `className`, `children` and ARIA props. */\nexport type ShellLinkComponent = ComponentType<AnchorHTMLAttributes<HTMLAnchorElement> & { href: string; children?: ReactNode }>;\n\n/** Which overlay is open. Only one at a time, so two menus never stack. */\nexport type ShellOverlay =\n | 'org'\n | 'context'\n | 'apps'\n | 'account'\n | 'palette'\n | 'nav-sheet'\n | 'context-sheet'\n | null;\n\nexport type ShellApi = {\n shell: Shell;\n t: CboxTranslator;\n navigate: ShellNavigate;\n Link: ShellLinkComponent;\n icons: Readonly<Record<string, ShellIcon>>;\n preferences: ShellPreferences;\n setPreference: ShellPreferenceChange;\n overlay: ShellOverlay;\n setOverlay: (overlay: ShellOverlay) => void;\n help: HelpStore;\n /** Open or close Help. */\n toggleHelp: (open?: boolean) => void;\n /** Open Help on an article. */\n openArticle: (article: HelpArticle) => void;\n /** Open Help and send a question to the chat with the page as context. */\n ask: (question: string) => void;\n /** Switch context: `chosen` maps level keys to ids. */\n switchTo: (chosen: Record<string, string>) => void;\n};\n\nexport const ShellContext = createContext<ShellApi | null>(null);\n\nexport function useShell(): ShellApi {\n const api = useContext(ShellContext);\n if (api === null) throw new Error('[cbox-ui] Shell parts must be rendered inside <CboxShell>.');\n return api;\n}\n\n/** Help for a page's own `?` button, or `null` outside the shell. */\nexport function useShellHelp(): Pick<ShellApi, 'toggleHelp' | 'openArticle' | 'ask'> | null {\n const api = useContext(ShellContext);\n return api === null ? null : { toggleHelp: api.toggleHelp, openArticle: api.openArticle, ask: api.ask };\n}\n","import { useSyncExternalStore } from 'react';\n\n/** Fine pointer and hover: a desktop. Only there does a search field take focus by itself (§4.5). */\nexport const DESKTOP_POINTER = '(hover: hover) and (pointer: fine)';\n/** Help docks beside the page from here; below it is a full-screen overlay (§4.4). */\nexport const HELP_DOCKED = '(min-width: 1280px)';\n/** The phone layout (§4.5). */\nexport const MOBILE = '(max-width: 767px)';\n\nfunction query(media: string): MediaQueryList | null {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return null;\n return window.matchMedia(media);\n}\n\nexport function matches(media: string): boolean {\n return query(media)?.matches ?? false;\n}\n\n/** Whether a search field may focus itself: never on touch. */\nexport function canAutofocus(): boolean {\n return matches(DESKTOP_POINTER);\n}\n\n/** A live media query. `fallback` is what the server and the first client render assume. */\nexport function useMedia(media: string, fallback = false): boolean {\n return useSyncExternalStore(\n change => {\n const list = query(media);\n if (list === null) return () => undefined;\n list.addEventListener?.('change', change);\n return () => list.removeEventListener?.('change', change);\n },\n () => query(media)?.matches ?? fallback,\n () => fallback,\n );\n}\n","import { useEffect, useLayoutEffect, useRef, useState, type CSSProperties, type ReactNode, type RefObject } from 'react';\n\nexport type Placement = 'bottom-start' | 'bottom-end' | 'top-start';\n\nconst GAP = 6;\nconst MARGIN = 8;\n\ntype Position = { top?: number; bottom?: number; left: number; maxHeight: number };\n\nfunction place(anchor: DOMRect, size: { width: number }, placement: Placement): Position {\n const width = window.innerWidth;\n const height = window.innerHeight;\n let left = placement === 'bottom-end' ? anchor.right - size.width : anchor.left;\n left = Math.max(MARGIN, Math.min(left, width - size.width - MARGIN));\n if (placement === 'top-start') {\n const bottom = height - anchor.top + GAP;\n return { bottom, left, maxHeight: Math.max(160, height - bottom - MARGIN) };\n }\n const top = anchor.bottom + GAP;\n return { top, left, maxHeight: Math.max(160, height - top - MARGIN) };\n}\n\n/**\n * A menu surface anchored to its trigger. It is positioned `fixed` from the trigger's box before\n * the first paint (no jump, never clipped by a scrolling parent), closes on a pointer down outside\n * it and on Escape, and hands focus back to the trigger when it closes from the keyboard.\n */\nexport function Popover({\n open,\n anchor,\n placement = 'bottom-start',\n onClose,\n className,\n label,\n children,\n}: {\n open: boolean;\n anchor: RefObject<HTMLElement | null>;\n placement?: Placement;\n onClose: (reason: 'escape' | 'outside' | 'tab') => void;\n className?: string;\n label: string;\n children: ReactNode;\n}) {\n const surface = useRef<HTMLDivElement>(null);\n const [position, setPosition] = useState<Position | null>(null);\n\n useLayoutEffect(() => {\n if (!open) {\n setPosition(null);\n return;\n }\n const update = () => {\n const box = anchor.current?.getBoundingClientRect();\n const el = surface.current;\n if (box === undefined || el === null) return;\n setPosition(place(box, { width: el.offsetWidth }, placement));\n };\n update();\n window.addEventListener('resize', update);\n return () => window.removeEventListener('resize', update);\n }, [open, anchor, placement]);\n\n useEffect(() => {\n if (!open) return;\n const down = (event: PointerEvent) => {\n const target = event.target as Node | null;\n if (target === null) return;\n if (surface.current?.contains(target) || anchor.current?.contains(target)) return;\n onClose('outside');\n };\n document.addEventListener('pointerdown', down, true);\n return () => document.removeEventListener('pointerdown', down, true);\n }, [open, anchor, onClose]);\n\n if (!open) return null;\n\n const style: CSSProperties = position === null\n ? { position: 'fixed', top: 0, left: 0, visibility: 'hidden' }\n : { position: 'fixed', top: position.top, bottom: position.bottom, left: position.left, maxHeight: position.maxHeight };\n\n return (\n <div\n ref={surface}\n className={`cbx-popover ${className ?? ''}`}\n style={style}\n role=\"dialog\"\n aria-label={label}\n onKeyDown={event => {\n if (event.key === 'Escape' && !event.defaultPrevented) {\n event.preventDefault();\n event.stopPropagation();\n onClose('escape');\n anchor.current?.focus();\n }\n if (event.key === 'Tab' && !event.defaultPrevented) {\n // Tab leaves the menu: it closes and the trigger has focus, so the next Tab\n // goes on through the header.\n event.preventDefault();\n onClose('tab');\n anchor.current?.focus();\n }\n }}\n >\n {children}\n </div>\n );\n}\n\n/** Keep Tab inside `container` while it is modal (mobile sheets, the Help overlay, the palette). */\nexport function trapTab(event: { key: string; shiftKey: boolean; preventDefault: () => void }, container: HTMLElement | null): void {\n if (event.key !== 'Tab' || container === null) return;\n const focusable = Array.from(\n container.querySelectorAll<HTMLElement>('a[href], button:not([disabled]), input:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])'),\n ).filter(el => !el.hasAttribute('hidden') && el.getAttribute('aria-hidden') !== 'true');\n if (focusable.length === 0) {\n event.preventDefault();\n return;\n }\n const first = focusable[0]!;\n const last = focusable[focusable.length - 1]!;\n const active = document.activeElement;\n if (event.shiftKey && (active === first || !container.contains(active))) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && (active === last || !container.contains(active))) {\n event.preventDefault();\n first.focus();\n }\n}\n\n/**\n * Scroll `id`'s element into view inside its own scrolling list only. `scrollIntoView` would also\n * scroll every parent (a sheet, the page), which makes a menu jump when it opens.\n */\nexport function revealInList(id: string): void {\n if (typeof document === 'undefined') return;\n const option = document.getElementById(id);\n if (option === null) return;\n // The scroller is the listbox itself, or the `.cbx-list` around it (a pane keeps its status\n // notes outside the listbox, inside the same scroller).\n let list = option.closest<HTMLElement>('[role=\"listbox\"]');\n if (list !== null && list.scrollHeight <= list.clientHeight && list.parentElement?.classList.contains('cbx-list')) list = list.parentElement;\n if (list === null || list.scrollHeight <= list.clientHeight) return;\n const box = list.getBoundingClientRect();\n const item = option.getBoundingClientRect();\n if (item.top < box.top) list.scrollTop -= box.top - item.top + 8;\n else if (item.bottom > box.bottom) list.scrollTop += item.bottom - box.bottom + 8;\n}\n","import { Check, Search } from 'lucide-react';\nimport { useEffect, useId, useMemo, useRef, useState, type KeyboardEvent } from 'react';\nimport { canAutofocus } from './media';\nimport { revealInList } from './popover';\nimport { useShell } from './context';\nimport type { ShellOption } from './types';\n\n/**\n * Roving focus for a `role=\"menu\"`: ↑↓ (and ←→ inside a `role=\"group\"` row) move between the\n * items, Home and End jump. The items are the menu's `menuitem`, `menuitemradio` and links.\n */\nexport function rovingKeyDown(event: KeyboardEvent<HTMLElement>, container: HTMLElement | null): void {\n if (container === null) return;\n const items = Array.from(container.querySelectorAll<HTMLElement>('[role=\"menuitem\"],[role=\"menuitemradio\"]')).filter(el => !el.closest('[hidden]'));\n if (items.length === 0) return;\n const index = items.indexOf(document.activeElement as HTMLElement);\n const inGroup = (document.activeElement as HTMLElement | null)?.closest('[role=\"group\"]') !== null;\n let next = -1;\n switch (event.key) {\n case 'ArrowDown':\n next = index < 0 ? 0 : (index + 1) % items.length;\n if (inGroup) {\n // Leave the segmented row downwards in one step.\n const group = (document.activeElement as HTMLElement).closest('[role=\"group\"]')!;\n const after = items.findIndex((item, i) => i > index && !group.contains(item));\n next = after >= 0 ? after : 0;\n }\n break;\n case 'ArrowUp':\n next = index <= 0 ? items.length - 1 : index - 1;\n if (inGroup) {\n const group = (document.activeElement as HTMLElement).closest('[role=\"group\"]')!;\n const before = items.map((item, i) => (i < index && !group.contains(item) ? i : -1)).filter(i => i >= 0).pop();\n next = before ?? items.length - 1;\n }\n break;\n case 'ArrowRight':\n if (inGroup) next = Math.min(items.length - 1, index + 1);\n break;\n case 'ArrowLeft':\n if (inGroup) next = Math.max(0, index - 1);\n break;\n case 'Home':\n next = 0;\n break;\n case 'End':\n next = items.length - 1;\n break;\n }\n if (next >= 0) {\n event.preventDefault();\n items[next]!.focus();\n }\n}\n\n/**\n * A searchable list of choices (language, regional format, time zone): the same search, row\n * density and keys as the context menus.\n */\nexport function OptionList({ label, options, current, onPick, autoFocus = true }: { label: string; options: ShellOption[]; current?: string; onPick: (code: string) => void; autoFocus?: boolean }) {\n const { t } = useShell();\n const [q, setQ] = useState('');\n const id = useId();\n const input = useRef<HTMLInputElement>(null);\n const shown = useMemo(() => {\n const needle = q.trim().toLowerCase();\n return needle === '' ? options : options.filter(option => option.label.toLowerCase().includes(needle) || option.code.toLowerCase().includes(needle));\n }, [options, q]);\n const [active, setActive] = useState(() => Math.max(0, options.findIndex(option => option.code === current)));\n\n useEffect(() => {\n if (autoFocus && canAutofocus()) input.current?.focus();\n }, [autoFocus]);\n useEffect(() => {\n if (q !== '') setActive(0);\n }, [q]);\n useEffect(() => {\n revealInList(`${id}-${active}`);\n }, [active, id]);\n\n const onKeyDown = (event: KeyboardEvent) => {\n const last = shown.length - 1;\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n setActive(index => (index >= last ? 0 : index + 1));\n } else if (event.key === 'ArrowUp') {\n event.preventDefault();\n setActive(index => (index <= 0 ? last : index - 1));\n } else if (event.key === 'Home' && q === '') {\n event.preventDefault();\n setActive(0);\n } else if (event.key === 'End' && q === '') {\n event.preventDefault();\n setActive(last);\n } else if (event.key === 'Enter') {\n event.preventDefault();\n const option = shown[active];\n if (option !== undefined) onPick(option.code);\n }\n };\n\n return (\n <div className=\"cbx-pane\" onKeyDown={onKeyDown}>\n <div className=\"cbx-pane-search\">\n <Search size={16} strokeWidth={1.8} aria-hidden />\n <input\n ref={input}\n type=\"search\"\n role=\"combobox\"\n aria-expanded=\"true\"\n aria-controls={`${id}-list`}\n aria-activedescendant={shown[active] !== undefined ? `${id}-${active}` : undefined}\n aria-label={t('Search {things}', { things: label.toLowerCase() })}\n placeholder={t('Search…')}\n value={q}\n onChange={event => setQ(event.target.value)}\n autoComplete=\"off\"\n />\n </div>\n <div id={`${id}-list`} role=\"listbox\" aria-label={label} className=\"cbx-list cbx-list-tall\">\n {shown.map((option, index) => (\n <div key={option.code} className={`cbx-row ${index === active ? 'is-active' : ''}`} onMouseEnter={() => setActive(index)}>\n <div id={`${id}-${index}`} role=\"option\" aria-selected={index === active} aria-current={option.code === current ? 'true' : undefined} className=\"cbx-row-main\" onClick={() => onPick(option.code)}>\n <span className=\"cbx-row-name\" title={option.label}>{option.label}</span>\n {option.code === current && <Check className=\"cbx-row-check\" size={16} strokeWidth={2} aria-label={t('Current')} />}\n </div>\n </div>\n ))}\n {shown.length === 0 && <div className=\"cbx-list-note\">{t('Nothing matches “{query}”.', { query: q.trim() })}</div>}\n </div>\n </div>\n );\n}\n","import { ArrowLeft, ArrowUpRight, ChevronRight, Globe, LogOut, Monitor, Moon, Sun, UserRound, Users } from 'lucide-react';\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport { useShell } from './context';\nimport { OptionList, rovingKeyDown } from './option-list';\nimport type { ShellOption, ShellTheme } from './types';\n\nconst DEFAULT_LANGUAGES: ShellOption[] = [\n { code: 'en', label: 'English' },\n { code: 'da', label: 'Dansk' },\n];\n\nconst DEFAULT_FORMATS: ShellOption[] = [\n { code: 'en-GB', label: 'English (United Kingdom)' },\n { code: 'en-US', label: 'English (United States)' },\n { code: 'da-DK', label: 'Dansk (Danmark)' },\n { code: 'de-DE', label: 'Deutsch (Deutschland)' },\n { code: 'sv-SE', label: 'Svenska (Sverige)' },\n { code: 'nb-NO', label: 'Norsk bokmål (Norge)' },\n];\n\nconst FALLBACK_ZONES = ['UTC', 'Europe/Copenhagen', 'Europe/London', 'Europe/Berlin', 'Europe/Stockholm', 'Europe/Oslo', 'America/New_York', 'America/Los_Angeles', 'Asia/Tokyo'];\n\nfunction timeZones(): ShellOption[] {\n const supported = (Intl as unknown as { supportedValuesOf?: (key: string) => string[] }).supportedValuesOf;\n const zones = typeof supported === 'function' ? supported('timeZone') : FALLBACK_ZONES;\n return zones.map(zone => ({ code: zone, label: zone.replace(/_/g, ' ') }));\n}\n\nexport function Avatar({ size = 30 }: { size?: number }) {\n const { shell } = useShell();\n const { person } = shell;\n return (\n <span className=\"cbx-avatar\" style={{ width: size, height: size }} aria-hidden=\"true\">\n {person.avatarUrl !== undefined ? <img src={person.avatarUrl} alt=\"\" width={size} height={size} /> : person.initials}\n </span>\n );\n}\n\ntype View = 'main' | 'language' | 'format' | 'timeZone';\n\n/**\n * The account menu (§10): who is signed in, Profile and security in Cbox ID, language, regional\n * format and time zone (Cbox ID's shared preferences), theme, Switch account and Sign out.\n * `inline` renders it as a section of the mobile navigation sheet.\n */\nexport function AccountMenu({ inline = false, onDone }: { inline?: boolean; onDone?: () => void }) {\n const { shell, t, preferences, setPreference, navigate } = useShell();\n const { person } = shell;\n const account = shell.account ?? {};\n const [view, setView] = useState<View>('main');\n const menu = useRef<HTMLDivElement>(null);\n // In the mobile sheet the items are ordinary tab stops; as a popover they rove.\n const tab = inline ? 0 : -1;\n const languages = account.languages ?? DEFAULT_LANGUAGES;\n const formats = account.formats ?? DEFAULT_FORMATS;\n const zones = useMemo(() => (view === 'timeZone' ? timeZones() : []), [view]);\n\n useEffect(() => {\n if (view !== 'main' || inline) return;\n // The first item takes focus: it is a menu, not a text field, so no keyboard comes up on touch.\n menu.current?.querySelector<HTMLElement>('[role=\"menuitem\"]')?.focus();\n }, [view, inline]);\n\n const label = (options: ShellOption[], code: string | undefined, fallback: string) => options.find(option => option.code === code)?.label ?? code ?? fallback;\n const back = (\n <button type=\"button\" className=\"cbx-row cbx-row-action cbx-back\" onClick={() => setView('main')}>\n <ArrowLeft size={16} strokeWidth={1.8} aria-hidden />\n <span className=\"cbx-row-name\">{t('Account')}</span>\n </button>\n );\n const pick = <K extends 'locale' | 'regionalFormat' | 'timeZone'>(key: K) => (code: string) => {\n setPreference(key, code);\n setView('main');\n };\n\n if (view === 'language') return <div className=\"cbx-menu cbx-menu-account\">{back}<OptionList label={t('Language')} options={languages} current={preferences.locale} onPick={pick('locale')} /></div>;\n if (view === 'format') return <div className=\"cbx-menu cbx-menu-account\">{back}<OptionList label={t('Regional format')} options={formats} current={preferences.regionalFormat} onPick={pick('regionalFormat')} /></div>;\n if (view === 'timeZone') return <div className=\"cbx-menu cbx-menu-account\">{back}<OptionList label={t('Time zone')} options={zones} current={preferences.timeZone} onPick={pick('timeZone')} /></div>;\n\n const themes: Array<{ value: ShellTheme; label: string; icon: typeof Sun }> = [\n { value: 'system', label: t('System'), icon: Monitor },\n { value: 'light', label: t('Light'), icon: Sun },\n { value: 'dark', label: t('Dark'), icon: Moon },\n ];\n\n return (\n <div ref={menu} className={`cbx-menu cbx-menu-account ${inline ? 'is-inline' : ''}`} role=\"menu\" aria-label={t('Account')} onKeyDown={event => rovingKeyDown(event, menu.current)}>\n <div className=\"cbx-account-head\">\n <Avatar size={36} />\n <div className=\"cbx-account-who\">\n <span className=\"cbx-account-name cbx-truncate\" title={person.name}>{person.name}</span>\n <span className=\"cbx-account-sub cbx-truncate\">{account.signedInWith ?? t('Signed in with Cbox ID')}</span>\n </div>\n </div>\n <div className=\"cbx-list\" role=\"none\">\n {account.profileUrl !== undefined && (\n <a role=\"menuitem\" tabIndex={tab} className=\"cbx-row cbx-row-action\" href={account.profileUrl} onClick={onDone}>\n <UserRound size={16} strokeWidth={1.8} aria-hidden />\n <span className=\"cbx-row-name\">{t('Profile and security')}</span>\n <ArrowUpRight className=\"cbx-row-trail\" size={14} strokeWidth={1.8} aria-hidden />\n </a>\n )}\n <button role=\"menuitem\" tabIndex={tab} type=\"button\" className=\"cbx-row cbx-row-action\" aria-haspopup=\"listbox\" onClick={() => setView('language')}>\n <Globe size={16} strokeWidth={1.8} aria-hidden />\n <span className=\"cbx-row-name\">{t('Language')}</span>\n <span className=\"cbx-row-value cbx-truncate\">{label(languages, preferences.locale, 'English')}</span>\n <ChevronRight className=\"cbx-row-trail\" size={16} strokeWidth={1.8} aria-hidden />\n </button>\n <button role=\"menuitem\" tabIndex={tab} type=\"button\" className=\"cbx-row cbx-row-action\" aria-haspopup=\"listbox\" onClick={() => setView('format')}>\n <span className=\"cbx-row-icon-gap\" aria-hidden=\"true\" />\n <span className=\"cbx-row-name\">{t('Regional format')}</span>\n <span className=\"cbx-row-value cbx-truncate\">{label(formats, preferences.regionalFormat, t('Automatic'))}</span>\n <ChevronRight className=\"cbx-row-trail\" size={16} strokeWidth={1.8} aria-hidden />\n </button>\n <button role=\"menuitem\" tabIndex={tab} type=\"button\" className=\"cbx-row cbx-row-action\" aria-haspopup=\"listbox\" onClick={() => setView('timeZone')}>\n <span className=\"cbx-row-icon-gap\" aria-hidden=\"true\" />\n <span className=\"cbx-row-name\">{t('Time zone')}</span>\n <span className=\"cbx-row-value cbx-truncate\">{(preferences.timeZone ?? t('Automatic')).replace(/_/g, ' ')}</span>\n <ChevronRight className=\"cbx-row-trail\" size={16} strokeWidth={1.8} aria-hidden />\n </button>\n <div className=\"cbx-theme\" role=\"group\" aria-label={t('Theme')}>\n <span className=\"cbx-theme-label\">{t('Theme')}</span>\n <div className=\"cbx-segmented\">\n {themes.map(theme => (\n <button\n key={theme.value}\n type=\"button\"\n role=\"menuitemradio\"\n tabIndex={tab}\n aria-checked={preferences.theme === theme.value}\n className={preferences.theme === theme.value ? 'is-on' : ''}\n onClick={() => setPreference('theme', theme.value)}\n >\n <theme.icon size={14} strokeWidth={1.8} aria-hidden />\n {theme.label}\n </button>\n ))}\n </div>\n </div>\n </div>\n {(account.switchAccountUrl !== undefined || account.signOutUrl !== undefined) && (\n <div className=\"cbx-list cbx-list-foot\" role=\"none\">\n {/* A plain link, so it is a full page load: switching account goes through Cbox ID,\n which an Inertia visit could not follow cross-origin. */}\n {account.switchAccountUrl !== undefined && (\n <a role=\"menuitem\" tabIndex={tab} className=\"cbx-row cbx-row-action\" href={account.switchAccountUrl} onClick={onDone}>\n <Users size={16} strokeWidth={1.8} aria-hidden />\n <span className=\"cbx-row-name\">{t('Switch account')}</span>\n </a>\n )}\n {account.signOutUrl !== undefined && (\n <button role=\"menuitem\" tabIndex={tab} type=\"button\" className=\"cbx-row cbx-row-action\" onClick={() => { onDone?.(); navigate(account.signOutUrl!, { method: account.signOutMethod ?? 'post' }); }}>\n <LogOut size={16} strokeWidth={1.8} aria-hidden />\n <span className=\"cbx-row-name\">{t('Sign out')}</span>\n </button>\n )}\n </div>\n )}\n </div>\n );\n}\n","import { ArrowUpRight } from 'lucide-react';\nimport { useCallback, useEffect, useRef, useState, type KeyboardEvent } from 'react';\nimport { initials, parseAppCatalog, rememberAppCatalog, secureIconUrl, signInTarget } from '../app-switcher/catalog';\nimport { useShell } from './context';\n\n/** One app in the grid (§9). */\nexport type ShellApp = {\n key: string;\n name: string;\n /** One line: \"Identity and sign-in\". */\n purpose: string | null;\n /** Fixed per-app hue (0–360); the tile is drawn in it, in light and dark. */\n hue: number;\n iconUrl: string | null;\n iconDarkUrl: string | null;\n /** Where the tile goes: the app, or its admission page when the organization lacks it. */\n url: string;\n /** The organization has this app. False: \"More from Cbox\", dimmed. */\n inOrganization: boolean;\n};\n\n/** Each app's fixed hue when the catalog sends none. */\nexport const APP_HUES: Readonly<Record<string, number>> = {\n id: 258,\n billing: 145,\n engage: 25,\n telemetry: 300,\n work: 70,\n brain: 330,\n infra: 200,\n status: 160,\n assistant: 280,\n sites: 110,\n tax: 45,\n signals: 0,\n stache: 230,\n domains: 185,\n};\n\n/** A stable hue for an unknown key, so its tile keeps its colour between pages. */\nexport function hueFor(key: string, given?: unknown): number {\n if (typeof given === 'number' && Number.isFinite(given)) return ((given % 360) + 360) % 360;\n const known = APP_HUES[key];\n if (known !== undefined) return known;\n let hash = 0;\n for (const char of key) hash = (hash * 31 + char.charCodeAt(0)) % 360;\n return hash;\n}\n\nexport type ShellCatalogState =\n | { status: 'loading' }\n | { status: 'ready'; apps: ShellApp[] }\n | { status: 'signin_required'; href: string | null }\n | { status: 'unavailable' };\n\n/**\n * The catalog answer, with the shell's additions (§9.3): `in_organization` (default true),\n * `admission_url` for apps the organization does not have, `purpose` (falls back to\n * `description`) and `hue`. Only http(s) links are kept.\n */\nexport function parseShellCatalog(ok: boolean, body: unknown, here?: { origin: string; pathname: string; search: string }): ShellCatalogState {\n const base = parseAppCatalog(ok, body);\n if (base.status === 'signin_required') return { status: 'signin_required', href: here === undefined ? null : signInTarget(base, here) };\n if (!ok || typeof body !== 'object' || body === null || !Array.isArray((body as { apps?: unknown }).apps)) return { status: 'unavailable' };\n const apps: ShellApp[] = [];\n for (const entry of (body as { apps: unknown[] }).apps) {\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') continue;\n const inOrganization = app.in_organization !== false;\n const launch = typeof app.launch_url === 'string' && /^https?:\\/\\//i.test(app.launch_url) ? app.launch_url : null;\n const admission = typeof app.admission_url === 'string' && /^https?:\\/\\//i.test(app.admission_url) ? app.admission_url : null;\n const url = inOrganization ? launch : admission ?? launch;\n if (url === null) continue;\n const purpose = typeof app.purpose === 'string' ? app.purpose : typeof app.description === 'string' ? app.description : null;\n apps.push({\n key: app.key,\n name: app.name,\n purpose,\n hue: hueFor(app.key, app.hue),\n iconUrl: secureIconUrl(app.icon_url),\n iconDarkUrl: secureIconUrl(app.icon_dark_url),\n url,\n inOrganization,\n });\n }\n return { status: 'ready', apps };\n}\n\nlet kept: { url: string; state: ShellCatalogState; until: number } | null = null;\n\n/** The catalog, loaded when the grid first opens and kept for its `refresh_after`. */\nexport function useShellCatalog(url: string, enabled: boolean): [ShellCatalogState, () => void] {\n const [state, setState] = useState<ShellCatalogState>(() => (kept !== null && kept.url === url ? kept.state : { status: 'loading' }));\n const [attempt, setAttempt] = useState(0);\n useEffect(() => {\n if (!enabled) return;\n if (kept !== null && kept.url === url && kept.until > Date.now() && attempt === 0) {\n setState(kept.state);\n return;\n }\n const controller = new AbortController();\n if (kept === null || kept.url !== url) setState({ status: 'loading' });\n fetch(url, { credentials: 'same-origin', headers: { Accept: 'application/json' }, signal: controller.signal })\n .then(async response => {\n let body: unknown = null;\n try {\n body = await response.json();\n } catch {\n body = null;\n }\n const next = parseShellCatalog(response.ok, body, window.location);\n const refresh = typeof (body as { refresh_after?: unknown })?.refresh_after === 'number' ? Math.min(60, Math.max(1, (body as { refresh_after: number }).refresh_after)) : 60;\n if (next.status === 'ready') {\n kept = { url, state: next, until: Date.now() + refresh * 1000 };\n rememberAppCatalog(next.apps.map(app => ({ key: app.key, name: app.name, launch_url: app.url, icon_url: app.iconUrl, icon_dark_url: app.iconDarkUrl })));\n }\n setState(next);\n })\n .catch((error: unknown) => {\n if ((error as { name?: string })?.name !== 'AbortError') setState({ status: 'unavailable' });\n });\n return () => controller.abort();\n }, [url, enabled, attempt]);\n return [state, useCallback(() => setAttempt(value => value + 1), [])];\n}\n\nexport function AppTile({ app, current }: { app: ShellApp; current: boolean }) {\n const [failed, setFailed] = useState(false);\n const style = { '--cbx-hue': String(app.hue) } as Record<string, string>;\n return (\n <a\n href={app.url}\n className={`cbx-app ${current ? 'is-current' : ''} ${app.inOrganization ? '' : 'is-elsewhere'}`}\n aria-current={current ? 'page' : undefined}\n data-app={app.key}\n >\n <span className=\"cbx-app-tile\" style={style} aria-hidden=\"true\">\n {app.iconUrl !== null && !failed ? (\n <>\n <img src={app.iconUrl} alt=\"\" className={app.iconDarkUrl !== null ? 'cbx-app-icon-light' : ''} onError={() => setFailed(true)} />\n {app.iconDarkUrl !== null && <img src={app.iconDarkUrl} alt=\"\" className=\"cbx-app-icon-dark\" onError={() => setFailed(true)} />}\n </>\n ) : (\n initials(app.name.replace(/^Cbox\\s*·?\\s*/i, ''))\n )}\n </span>\n <span className=\"cbx-app-name cbx-truncate\" title={app.name}>{app.name.replace(/^Cbox\\s*·\\s*/i, '')}</span>\n {app.purpose !== null && <span className=\"cbx-app-purpose cbx-truncate\" title={app.purpose}>{app.purpose}</span>}\n </a>\n );\n}\n\n/**\n * Arrow keys across the 3-column grid; Home and End jump. \"All products\" is the last stop: ↓\n * from the bottom row and End reach it, ↑ from it goes back to the last tile.\n */\nfunction gridKeys(event: KeyboardEvent<HTMLElement>, container: HTMLElement | null): void {\n if (container === null) return;\n const tiles = Array.from(container.querySelectorAll<HTMLElement>('.cbx-app'));\n const all = container.querySelector<HTMLElement>('.cbx-apps-all');\n const stops = all === null ? tiles : [...tiles, all];\n const index = stops.indexOf(document.activeElement as HTMLElement);\n if (index < 0 || stops.length === 0) return;\n const onAll = all !== null && index === tiles.length;\n const moves: Record<string, number> = { ArrowRight: 1, ArrowLeft: -1, ArrowDown: 3, ArrowUp: -3 };\n let next = index;\n if (onAll) {\n if (event.key === 'ArrowUp' || event.key === 'ArrowLeft') next = tiles.length - 1;\n else if (event.key === 'Home') next = 0;\n else if (event.key === 'End' || event.key === 'ArrowDown' || event.key === 'ArrowRight') next = index;\n else return;\n } else if (event.key === 'ArrowDown' && index + 3 > tiles.length - 1 && all !== null) next = tiles.length;\n else if (event.key === 'ArrowRight' && index === tiles.length - 1 && all !== null) next = tiles.length;\n else if (event.key in moves) next = Math.max(0, Math.min(tiles.length - 1, index + moves[event.key]!));\n else if (event.key === 'Home') next = 0;\n else if (event.key === 'End') next = stops.length - 1;\n else return;\n event.preventDefault();\n stops[Math.max(0, next)]?.focus();\n}\n\n/**\n * The app grid (§9): \"In {organization}\" with the current app marked, \"More from Cbox\" dimmed\n * (each opens that app's admission page in the same organization), and \"All products ↗\".\n */\nexport function AppGrid({ autoFocus = true }: { autoFocus?: boolean }) {\n const { shell, t } = useShell();\n const [state, retry] = useShellCatalog(shell.apps.catalogUrl, true);\n const box = useRef<HTMLDivElement>(null);\n const organization = shell.context.levels[0]?.current.name;\n\n useEffect(() => {\n if (!autoFocus || state.status !== 'ready') return;\n const tiles = box.current?.querySelectorAll<HTMLElement>('.cbx-app');\n const current = box.current?.querySelector<HTMLElement>('.cbx-app.is-current');\n (current ?? tiles?.[0])?.focus();\n }, [state.status, autoFocus]);\n\n const mine = state.status === 'ready' ? state.apps.filter(app => app.inOrganization) : [];\n const more = state.status === 'ready' ? state.apps.filter(app => !app.inOrganization) : [];\n\n return (\n <div className=\"cbx-menu cbx-menu-apps\" ref={box} onKeyDown={event => gridKeys(event, box.current)}>\n {state.status === 'loading' && <p className=\"cbx-list-note\" aria-live=\"polite\">{t('Loading apps…')}</p>}\n {state.status === 'unavailable' && (\n <p className=\"cbx-list-note\" role=\"alert\">\n {t('Apps could not be loaded.')} <button type=\"button\" className=\"cbx-link\" onClick={retry}>{t('Try again')}</button>\n </p>\n )}\n {state.status === 'signin_required' && (\n <p className=\"cbx-list-note\" role=\"alert\">\n {t('Sign in again to see your apps.')} {state.href !== null && <a className=\"cbx-link\" href={state.href}>{t('Sign in')}</a>}\n </p>\n )}\n {state.status === 'ready' && (\n <>\n <section aria-label={organization !== undefined ? t('In {organization}', { organization }) : t('Your apps')}>\n <h3 className=\"cbx-pane-heading\">{organization !== undefined ? t('In {organization}', { organization }) : t('Your apps')}</h3>\n <div className=\"cbx-apps\">\n {mine.map(app => <AppTile key={app.key} app={app} current={app.key === shell.app.key} />)}\n </div>\n {mine.length === 0 && <p className=\"cbx-list-note\">{t('No apps available')}</p>}\n </section>\n {more.length > 0 && (\n <section aria-label={t('More from Cbox')}>\n <h3 className=\"cbx-pane-heading\">{t('More from Cbox')}</h3>\n <div className=\"cbx-apps\">\n {more.map(app => <AppTile key={app.key} app={app} current={false} />)}\n </div>\n </section>\n )}\n </>\n )}\n <div className=\"cbx-pane-foot\">\n <a className=\"cbx-row cbx-row-action cbx-apps-all\" href={shell.apps.productsUrl ?? 'https://cbox.dk'} target=\"_blank\" rel=\"noopener\">\n <span className=\"cbx-row-name\">{t('All products')}</span>\n <ArrowUpRight className=\"cbx-row-trail\" size={14} strokeWidth={1.8} aria-hidden />\n </a>\n </div>\n </div>\n );\n}\n\n/** Forget the kept catalog (tests, sign-out). */\nexport function forgetShellCatalog(): void {\n kept = null;\n}\n","import type { ContextItem, ContextLevel, ContextTone, ShellNavigate } from './types';\n\n/**\n * The shell's few network shapes and the pure rules around them: list pages, inline create,\n * the switch payload and settings links. Everything here is same-origin and JSON.\n */\n\nexport type ListPage = { items: ContextItem[]; hasMore: boolean; nextCursor: string | null };\n\nconst TONES: readonly ContextTone[] = ['production', 'sandbox', 'neutral'];\n\n/** First letters of the first two words, for a chip. */\nexport function initialsOf(name: string): string {\n const words = name.trim().split(/\\s+/).filter(Boolean);\n const letters = words.length > 1 ? (words[0]![0] ?? '') + (words[1]![0] ?? '') : name.trim().slice(0, 2);\n return letters.toUpperCase() || '?';\n}\n\nfunction toItem(value: unknown): ContextItem | null {\n if (typeof value !== 'object' || value === null) return null;\n const row = value as Record<string, unknown>;\n const id = typeof row.id === 'string' || typeof row.id === 'number' ? String(row.id) : null;\n if (id === null || typeof row.name !== 'string') return null;\n const item: ContextItem = { id, name: row.name };\n if (typeof row.initials === 'string' && row.initials !== '') item.initials = row.initials;\n if (typeof row.tone === 'string' && (TONES as readonly string[]).includes(row.tone)) item.tone = row.tone as ContextTone;\n if (typeof row.label === 'string' && row.label !== '') item.label = row.label;\n const test = row.testData ?? row.test_data;\n if (typeof test === 'boolean') item.testData = test;\n return item;\n}\n\n/**\n * A list answer. The URL standard's envelope (`{ object: 'list', data, has_more, next_cursor }`)\n * and a bare array are both accepted; rows without an id and a name are dropped.\n */\nexport function parseListPage(body: unknown): ListPage {\n const envelope = Array.isArray(body) ? { data: body } : typeof body === 'object' && body !== null ? (body as Record<string, unknown>) : {};\n const rows = Array.isArray(envelope.data) ? envelope.data : [];\n const items = rows.map(toItem).filter((item): item is ContextItem => item !== null);\n const cursor = envelope.next_cursor ?? envelope.nextCursor;\n const nextCursor = typeof cursor === 'string' && cursor !== '' ? cursor : null;\n const more = envelope.has_more ?? envelope.hasMore;\n return { items, hasMore: (more === true || more === undefined) && nextCursor !== null, nextCursor };\n}\n\n/**\n * A server-supplied link the shell may follow: http(s) or a same-origin path. Anything else\n * (`javascript:`, `data:`) is dropped, so a bad answer from a proxy can never run script.\n */\nexport function safeUrl(url: unknown): string | undefined {\n return typeof url === 'string' && /^(https?:\\/\\/|\\/)/i.test(url.trim()) ? url.trim() : undefined;\n}\n\n/** `url` with query parameters added; empty values are left out. Works for relative URLs. */\nexport function withQuery(url: string, params: Record<string, string | undefined | null>): string {\n const [path, hash = ''] = url.split('#') as [string, string?];\n const [base, query = ''] = path.split('?') as [string, string?];\n const search = new URLSearchParams(query);\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null && value !== '') search.set(key, value);\n }\n const qs = search.toString();\n return base + (qs ? `?${qs}` : '') + (hash ? `#${hash}` : '');\n}\n\n/** The settings link of one item, from the level's URL template. Null when the level has none. */\nexport function settingsHref(level: Pick<ContextLevel, 'settingsUrl'>, id: string): string | null {\n if (level.settingsUrl === undefined || level.settingsUrl === '') return null;\n return level.settingsUrl.split('{id}').join(encodeURIComponent(id));\n}\n\nexport function pluralOf(level: Pick<ContextLevel, 'label' | 'labelPlural'>): string {\n return level.labelPlural ?? `${level.label}s`;\n}\n\n/**\n * Which environment a project click lands on (§5.4): the one with the current environment's\n * name when the project has it, else its first. Undefined when the project has none.\n */\nexport function environmentFor(environments: readonly ContextItem[], currentName: string | undefined): ContextItem | undefined {\n if (currentName !== undefined) {\n const wanted = currentName.trim().toLowerCase();\n const same = environments.find(env => env.name.trim().toLowerCase() === wanted);\n if (same !== undefined) return same;\n }\n return environments[0];\n}\n\n/**\n * The switch payload (§5.6): every level above the chosen one keeps its current id, the chosen\n * levels get theirs, and levels below are left to the server (it lands on the last used one).\n * `return_to` is where the person is, so the server can stay on the same page.\n */\nexport function switchPayload(levels: readonly ContextLevel[], chosen: Record<string, string>, returnTo: string): Record<string, string> {\n const payload: Record<string, string> = {};\n const deepest = Math.max(-1, ...levels.map((level, index) => (chosen[level.key] !== undefined ? index : -1)));\n levels.forEach((level, index) => {\n const id = chosen[level.key];\n if (id !== undefined) payload[level.key] = id;\n else if (index < deepest) payload[level.key] = level.current.id;\n });\n payload.return_to = returnTo;\n return payload;\n}\n\nfunction cookie(name: string): string | null {\n if (typeof document === 'undefined') return null;\n const match = document.cookie.split('; ').find(part => part.startsWith(`${name}=`));\n return match === undefined ? null : decodeURIComponent(match.slice(name.length + 1));\n}\n\nfunction csrfToken(): string | null {\n if (typeof document === 'undefined') return null;\n return document.querySelector<HTMLMetaElement>('meta[name=\"csrf-token\"]')?.content ?? null;\n}\n\n/** Same-origin JSON with Laravel's CSRF headers. Throws `ShellRequestError` on a non-2xx. */\nexport async function requestJson<T = unknown>(url: string, init: { method?: string; body?: unknown; signal?: AbortSignal } = {}): Promise<T> {\n const headers: Record<string, string> = { Accept: 'application/json', 'X-Requested-With': 'XMLHttpRequest' };\n if (init.body !== undefined) headers['Content-Type'] = 'application/json';\n const xsrf = cookie('XSRF-TOKEN');\n const csrf = csrfToken();\n if (xsrf !== null) headers['X-XSRF-TOKEN'] = xsrf;\n else if (csrf !== null) headers['X-CSRF-TOKEN'] = csrf;\n const response = await fetch(url, {\n method: init.method ?? 'GET',\n credentials: 'same-origin',\n headers,\n body: init.body === undefined ? undefined : JSON.stringify(init.body),\n signal: init.signal,\n });\n const text = await response.text();\n let body: unknown = null;\n try {\n body = text === '' ? null : JSON.parse(text);\n } catch {\n body = null;\n }\n if (!response.ok) throw new ShellRequestError(response.status, body);\n return body as T;\n}\n\nexport class ShellRequestError extends Error {\n constructor(readonly status: number, readonly body: unknown) {\n super(`Request failed with ${status}`);\n }\n\n /** The first validation message (RFC 9457 `errors`, or Laravel's `errors`/`message`). */\n get detail(): string | null {\n const body = typeof this.body === 'object' && this.body !== null ? (this.body as Record<string, unknown>) : {};\n const errors = body.errors;\n if (typeof errors === 'object' && errors !== null) {\n for (const messages of Object.values(errors as Record<string, unknown>)) {\n if (Array.isArray(messages) && typeof messages[0] === 'string') return messages[0];\n if (typeof messages === 'string') return messages;\n }\n }\n if (typeof body.detail === 'string') return body.detail;\n if (typeof body.message === 'string') return body.message;\n return null;\n }\n}\n\n/** Inline create (§5.7): `POST createUrl { name, parent? }` → the details page to land on. */\nexport async function createItem(createUrl: string, name: string, parent?: string): Promise<{ id: string; detailsUrl: string }> {\n const body: Record<string, string> = { name };\n if (parent !== undefined) body.parent = parent;\n const answer = await requestJson<Record<string, unknown>>(createUrl, { method: 'POST', body });\n const id = answer?.id;\n const detailsUrl = safeUrl(answer?.detailsUrl ?? answer?.details_url);\n if ((typeof id !== 'string' && typeof id !== 'number') || detailsUrl === undefined) {\n throw new ShellRequestError(500, { message: 'The answer had no details page.' });\n }\n return { id: String(id), detailsUrl };\n}\n\n/**\n * The default navigation when the host passes none: a GET is a page load, a POST a real form\n * submit with Laravel's `_token`, so the server's redirect is followed like any form.\n */\nexport const defaultNavigate: ShellNavigate = (url, options = {}) => {\n if (typeof window === 'undefined' || safeUrl(url) === undefined) return;\n if (options.newTab) {\n window.open(url, '_blank', 'noopener');\n return;\n }\n if ((options.method ?? 'get') === 'get') {\n window.location.assign(url);\n return;\n }\n const form = document.createElement('form');\n form.method = 'POST';\n form.action = url;\n form.style.display = 'none';\n const fields: Record<string, unknown> = { ...(options.data ?? {}) };\n const token = csrfToken();\n if (token !== null) fields._token = token;\n for (const [name, value] of Object.entries(fields)) {\n const input = document.createElement('input');\n input.type = 'hidden';\n input.name = name;\n input.value = String(value);\n form.append(input);\n }\n document.body.append(form);\n form.submit();\n};\n\n/** Where the person is: path, query and hash. */\nexport function currentLocation(): string {\n if (typeof window === 'undefined') return '/';\n return window.location.pathname + window.location.search + window.location.hash;\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport { parseListPage, requestJson, withQuery } from './data';\nimport type { ContextItem } from './types';\n\nexport const DEBOUNCE_MS = 120;\nconst PAGE_SIZE = 25;\n\nexport type ListState = {\n items: ContextItem[];\n status: 'loading' | 'ready' | 'error';\n hasMore: boolean;\n loadingMore: boolean;\n loadMore: () => void;\n retry: () => void;\n};\n\n/** The page size, unless the app's list URL already names one. */\nfunction pageSize(url: string): string | undefined {\n return /[?&]limit=/.test(url) ? undefined : String(PAGE_SIZE);\n}\n\n/** Answers kept for this page, so hovering back to a project shows its environments at once. */\nconst kept = new Map<string, { items: ContextItem[]; hasMore: boolean; nextCursor: string | null }>();\n\n/** Forget kept answers (after a create, on a context switch, and between tests). */\nexport function forgetLists(): void {\n kept.clear();\n keptScope = null;\n}\n\n/** The context the kept answers belong to: every level's current id. */\nlet keptScope: string | null = null;\n\n/**\n * Tie the kept answers to a context. When the person has switched (an Inertia visit keeps this\n * module alive), answers from the previous context are dropped, even when an app's list URL is\n * not scoped by organization in its path. Returns true when something was dropped.\n */\nexport function scopeLists(scope: string): boolean {\n if (keptScope === scope) return false;\n const changed = keptScope !== null;\n kept.clear();\n keptScope = scope;\n return changed;\n}\n\n/**\n * A level's list, loaded lazily (§11.2): only while `enabled`, searched with `?q=` (debounced),\n * scoped with `?parent=`, paged with `?cursor=`. An empty search is kept for the page's lifetime.\n */\nexport function useContextList(url: string | undefined, { q = '', parent, enabled = true }: { q?: string; parent?: string; enabled?: boolean }): ListState {\n const [query, setQuery] = useState(q);\n const [state, setState] = useState<{ key: string; items: ContextItem[]; status: ListState['status']; hasMore: boolean; nextCursor: string | null; loadingMore: boolean }>({\n key: '',\n items: [],\n status: 'loading',\n hasMore: false,\n nextCursor: null,\n loadingMore: false,\n });\n const [attempt, setAttempt] = useState(0);\n const abort = useRef<AbortController | null>(null);\n\n useEffect(() => {\n if (q === query) return;\n const timer = setTimeout(() => setQuery(q), DEBOUNCE_MS);\n return () => clearTimeout(timer);\n }, [q, query]);\n\n const key = url === undefined ? '' : withQuery(url, { q: query.trim(), parent, limit: pageSize(url) });\n\n useEffect(() => {\n if (!enabled || url === undefined) return;\n const hit = kept.get(key);\n if (hit !== undefined) {\n setState({ key, items: hit.items, status: 'ready', hasMore: hit.hasMore, nextCursor: hit.nextCursor, loadingMore: false });\n return;\n }\n abort.current?.abort();\n const controller = new AbortController();\n abort.current = controller;\n setState(current => ({ ...current, key, status: 'loading', loadingMore: false }));\n requestJson(key, { signal: controller.signal })\n .then(body => {\n const page = parseListPage(body);\n if (query.trim() === '') kept.set(key, page);\n setState({ key, items: page.items, status: 'ready', hasMore: page.hasMore, nextCursor: page.nextCursor, loadingMore: false });\n })\n .catch((error: unknown) => {\n if ((error as { name?: string })?.name === 'AbortError') return;\n setState(current => ({ ...current, key, status: 'error', loadingMore: false }));\n });\n return () => controller.abort();\n }, [enabled, url, key, query, attempt]);\n\n const loadMore = useCallback(() => {\n setState(current => {\n if (!current.hasMore || current.loadingMore || current.nextCursor === null || url === undefined) return current;\n const cursor = current.nextCursor;\n requestJson(withQuery(current.key, { cursor }))\n .then(body => {\n const page = parseListPage(body);\n setState(now => {\n if (now.key !== current.key) return now;\n const items = [...now.items, ...page.items.filter(item => !now.items.some(have => have.id === item.id))];\n if (query.trim() === '') kept.set(now.key, { items, hasMore: page.hasMore, nextCursor: page.nextCursor });\n return { ...now, items, hasMore: page.hasMore, nextCursor: page.nextCursor, loadingMore: false };\n });\n })\n .catch(() => setState(now => ({ ...now, loadingMore: false })));\n return { ...current, loadingMore: true };\n });\n }, [url, query]);\n\n const retry = useCallback(() => {\n kept.delete(key);\n setAttempt(value => value + 1);\n }, [key]);\n\n const settled = state.key === key;\n // While a new search loads, the last answer stays (nothing jumps); a new parent starts empty.\n const sameParent = state.key !== '' && new URL(state.key, 'http://x').searchParams.get('parent') === (parent ?? null);\n return {\n items: settled || sameParent ? state.items : [],\n status: settled ? state.status : 'loading',\n hasMore: settled && state.hasMore,\n loadingMore: settled && state.loadingMore,\n loadMore,\n retry,\n };\n}\n\n/** Load a list once, outside a component (a project click needs its environments). */\nexport async function fetchList(url: string, parent?: string): Promise<ContextItem[]> {\n const key = withQuery(url, { parent, limit: pageSize(url) });\n const hit = kept.get(key);\n if (hit !== undefined) return hit.items;\n const page = parseListPage(await requestJson(key));\n kept.set(key, page);\n return page.items;\n}\n","import { Check, ChevronRight, Plus, Search, Settings } from 'lucide-react';\nimport { useCallback, useEffect, useId, useImperativeHandle, useRef, useState, type KeyboardEvent, type ReactNode, type Ref } from 'react';\nimport { createItem, environmentFor, initialsOf, pluralOf, settingsHref, ShellRequestError } from './data';\nimport { canAutofocus } from './media';\nimport { revealInList } from './popover';\nimport { useShell } from './context';\nimport { fetchList, forgetLists, useContextList } from './use-list';\nimport type { ContextItem, ContextLevel, ContextTone } from './types';\n\n/** The initials chip of an organization, project or site. */\nexport function Chip({ item, tone = 'soft' }: { item: Pick<ContextItem, 'name' | 'initials'>; tone?: 'solid' | 'soft' }) {\n return <span className={`cbx-chip cbx-chip-${tone}`} aria-hidden=\"true\">{item.initials ?? initialsOf(item.name)}</span>;\n}\n\n/** The coloured square of an environment (§5.4): production green, sandbox amber, neutral grey. */\nexport function ToneSquare({ tone }: { tone?: ContextTone }) {\n return <span className={`cbx-tone cbx-tone-${tone ?? 'neutral'}`} aria-hidden=\"true\" />;\n}\n\n/** True for the third level, whose rows carry a tone square instead of a chip. */\nexport function isEnvironmentLevel(level: ContextLevel): boolean {\n return level.key === 'environment';\n}\n\nexport type PaneHandle = { focus: () => void };\n\ntype PaneProps = {\n level: ContextLevel;\n /** Id of the item one level up, for `?parent=` and inline create. */\n parent?: string;\n /** The item marked with a check. */\n currentId?: string;\n heading: string;\n /** Show \"View all\". */\n viewAll?: boolean;\n /** A search field heads the pane. */\n searchable?: boolean;\n /** Take focus when the pane mounts (only on a desktop pointer). */\n autoFocus?: boolean;\n /** Rows show a chevron: the pane previews the next level. */\n chevron?: boolean;\n createLabel?: string;\n onPick: (item: ContextItem) => void;\n /** Hover or keyboard focus on a row, without switching anything. */\n onPreview?: (item: ContextItem) => void;\n /** → on a row. Return true when it was handled. */\n onArrowRight?: () => boolean;\n onArrowLeft?: () => void;\n handle?: Ref<PaneHandle>;\n /** Where the pane hands focus when it has no search (the cascade's right pane). */\n className?: string;\n};\n\ntype Option = { kind: 'item'; item: ContextItem } | { kind: 'more' };\n\n/**\n * One pane of a context menu: search, heading with View all, the lazily loaded rows, and\n * \"New …\". Keyboard: ↑↓ Home End move, Enter picks, → and ← cross panes, Esc closes (the\n * popover), Tab leaves. Focus stays in the search field and the active row is announced with\n * `aria-activedescendant`. A row's gear is an option of its own (named \"Settings\", described\n * by the row): → makes it active, ← goes back, Enter opens the settings page; in the cascade a\n * second → crosses to the environments. The pane's own actions sit on the same ring: ↓ past the last row\n * focuses \"New …\", ↑ above the first row focuses \"View all\", and ↑↓ from there go back into\n * the rows, so both work without a mouse (§12.2).\n */\nexport function LevelPane({ level, parent, currentId, heading, viewAll = true, searchable = true, autoFocus = false, chevron = false, createLabel, onPick, onPreview, onArrowRight, onArrowLeft, handle, className }: PaneProps) {\n const { t, Link, navigate } = useShell();\n const [q, setQ] = useState('');\n const [active, setActiveRow] = useState(-1);\n // → on a row with settings makes its gear the active option; any other move leaves it.\n const [gear, setGear] = useState(false);\n const setActive = useCallback((next: number | ((index: number) => number)) => {\n setGear(false);\n setActiveRow(next);\n }, []);\n const [creating, setCreating] = useState(false);\n const list = useContextList(level.listUrl, { q, parent });\n const id = useId();\n const input = useRef<HTMLInputElement>(null);\n const box = useRef<HTMLDivElement>(null);\n const createButton = useRef<HTMLButtonElement>(null);\n const plural = pluralOf(level);\n const environment = isEnvironmentLevel(level);\n\n const options: Option[] = list.items.map(item => ({ kind: 'item' as const, item }));\n if (list.hasMore) options.push({ kind: 'more' });\n\n // The current item is active when the rows arrive; a new search starts at the top.\n useEffect(() => {\n if (list.status !== 'ready') return;\n setActive(previous => {\n if (previous >= 0 && previous < options.length && q === '') return previous;\n const current = list.items.findIndex(item => item.id === currentId);\n return q === '' && current >= 0 ? current : options.length > 0 ? 0 : -1;\n });\n }, [list.status, list.items, q, currentId]);\n\n useEffect(() => {\n if (autoFocus && searchable && canAutofocus()) input.current?.focus();\n }, [autoFocus, searchable]);\n\n const focusSelf = useCallback(() => {\n if (searchable) input.current?.focus();\n else box.current?.focus();\n setActive(index => (index < 0 && options.length > 0 ? 0 : index));\n }, [searchable, options.length]);\n useImperativeHandle(handle, () => ({ focus: focusSelf }), [focusSelf]);\n\n const optionId = (index: number) => `${id}-option-${index}`;\n const allId = `${id}-all`;\n const canCreate = level.createUrl !== undefined && createLabel !== undefined;\n /** The pane's actions in ring order: View all above the rows, New … below them. */\n const viewAllLink = () => (viewAll ? document.getElementById(allId) : null);\n const createAction = () => (canCreate && !creating ? createButton.current : null);\n useEffect(() => {\n if (active < 0) return;\n revealInList(optionId(active));\n const option = options[active];\n if (option?.kind === 'item') onPreview?.(option.item);\n }, [active]);\n\n const choose = (option: Option | undefined) => {\n if (option === undefined) return;\n if (option.kind === 'more') list.loadMore();\n else onPick(option.item);\n };\n\n /** Back into the rows from an action, on the first or the last row. */\n const enterRows = (at: 'first' | 'last') => {\n focusSelf();\n setActive(options.length === 0 ? -1 : at === 'first' ? 0 : options.length - 1);\n };\n\n /** ↑↓ on View all or New …: the ring is View all, the rows, New …, and round again. */\n const onActionKeyDown = (event: KeyboardEvent, action: 'all' | 'create') => {\n if (event.key !== 'ArrowDown' && event.key !== 'ArrowUp') return;\n event.preventDefault();\n const rows = options.length > 0;\n const down = event.key === 'ArrowDown';\n const ring: Array<() => void> = [];\n const top = viewAllLink();\n const bottom = createAction();\n if (top !== null) ring.push(() => top.focus());\n if (rows) ring.push(() => enterRows(down ? 'first' : 'last'));\n if (bottom !== null) ring.push(() => bottom.focus());\n const here = action === 'all' ? 0 : ring.length - 1;\n const next = (here + (down ? 1 : -1) + ring.length) % ring.length;\n ring[next]?.();\n };\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.target instanceof HTMLElement && event.target.closest('.cbx-create')) return;\n if (event.target instanceof HTMLElement && event.target.closest('[data-pane-action]')) return;\n const last = options.length - 1;\n switch (event.key) {\n case 'ArrowDown': {\n event.preventDefault();\n const bottom = createAction();\n if (bottom !== null && active >= last) {\n bottom.focus();\n break;\n }\n setActive(index => (index >= last ? 0 : index + 1));\n break;\n }\n case 'ArrowUp': {\n event.preventDefault();\n const top = viewAllLink();\n if (top !== null && active <= 0) {\n top.focus();\n break;\n }\n setActive(index => (index <= 0 ? last : index - 1));\n break;\n }\n case 'Home':\n if (!searchable || q === '') {\n event.preventDefault();\n setActive(options.length > 0 ? 0 : -1);\n }\n break;\n case 'End':\n if (!searchable || q === '') {\n event.preventDefault();\n setActive(last);\n }\n break;\n case 'Enter': {\n event.preventDefault();\n const option = options[active];\n const settings = option?.kind === 'item' ? settingsHref(level, option.item.id) : null;\n if (gear && settings !== null) navigate(settings);\n else choose(option);\n break;\n }\n case 'ArrowRight': {\n if (searchable && input.current !== null && input.current.selectionStart !== q.length) break;\n const option = options[active];\n if (!gear && option?.kind === 'item' && settingsHref(level, option.item.id) !== null) {\n event.preventDefault();\n setGear(true);\n break;\n }\n if (onArrowRight?.()) {\n event.preventDefault();\n setGear(false);\n }\n break;\n }\n case 'ArrowLeft':\n if (gear) {\n event.preventDefault();\n setGear(false);\n break;\n }\n if (onArrowLeft !== undefined && (!searchable || input.current?.selectionStart === 0)) {\n event.preventDefault();\n onArrowLeft();\n }\n break;\n }\n };\n\n const listboxId = `${id}-listbox`;\n const activeId = active >= 0 && active < options.length ? (gear ? `${optionId(active)}-settings` : optionId(active)) : undefined;\n\n return (\n <div className={`cbx-pane ${className ?? ''}`} onKeyDown={onKeyDown}>\n {searchable && (\n <div className=\"cbx-pane-search\">\n <Search size={16} strokeWidth={1.8} aria-hidden />\n <input\n ref={input}\n type=\"search\"\n role=\"combobox\"\n aria-expanded=\"true\"\n aria-controls={listboxId}\n aria-activedescendant={activeId}\n aria-autocomplete=\"list\"\n aria-label={t('Search {things}', { things: plural.toLowerCase() })}\n placeholder={t('Search {things}…', { things: plural.toLowerCase() })}\n value={q}\n onChange={event => setQ(event.target.value)}\n autoComplete=\"off\"\n spellCheck={false}\n />\n </div>\n )}\n <div className=\"cbx-pane-heading\">\n <span className=\"cbx-truncate\" title={heading}>{heading}</span>\n {viewAll && (\n <Link href={level.allUrl} id={allId} className=\"cbx-pane-all\" tabIndex={-1} data-pane-action=\"all\" onKeyDown={event => onActionKeyDown(event, 'all')}>\n {t('View all')}\n </Link>\n )}\n </div>\n <div\n className=\"cbx-list\"\n onScroll={event => {\n const el = event.currentTarget;\n if (el.scrollHeight - el.scrollTop - el.clientHeight < 48) list.loadMore();\n }}\n >\n <div\n ref={box}\n id={listboxId}\n role=\"listbox\"\n aria-label={heading}\n tabIndex={searchable ? -1 : 0}\n aria-activedescendant={searchable ? undefined : activeId}\n className=\"cbx-listbox\"\n >\n {options.map((option, index) => {\n if (option.kind === 'more') {\n return (\n <div key=\"more\" id={optionId(index)} role=\"option\" aria-selected={index === active && !gear} className={`cbx-row cbx-row-more ${index === active ? 'is-active' : ''}`} onMouseEnter={() => setActive(index)} onClick={() => list.loadMore()}>\n <span className=\"cbx-row-name\">{list.loadingMore ? t('Loading…') : t('Show more')}</span>\n </div>\n );\n }\n const { item } = option;\n const current = item.id === currentId;\n const settings = settingsHref(level, item.id);\n return (\n <div key={item.id} className={`cbx-row ${index === active ? 'is-active' : ''} ${current ? 'is-current' : ''}`} onMouseEnter={() => setActive(index)}>\n <div id={optionId(index)} role=\"option\" aria-selected={index === active && !gear} aria-current={current ? 'true' : undefined} className=\"cbx-row-main\" onClick={() => onPick(item)}>\n {environment ? <ToneSquare tone={item.tone} /> : <Chip item={item} />}\n <span className=\"cbx-row-name\" title={item.name}>{item.name}</span>\n {item.label !== undefined && <span className=\"cbx-row-label\">{item.label}</span>}\n {current && <Check className=\"cbx-row-check\" size={16} strokeWidth={2} aria-label={t('Current')} />}\n </div>\n {settings !== null && (\n <Link\n href={settings}\n id={`${optionId(index)}-settings`}\n role=\"option\"\n aria-selected={index === active && gear}\n aria-describedby={optionId(index)}\n className={`cbx-row-gear ${index === active && gear ? 'is-active' : ''}`}\n tabIndex={-1}\n aria-label={t('Settings')}\n title={t('Settings for {name}', { name: item.name })}\n >\n <Settings size={15} strokeWidth={1.8} aria-hidden />\n </Link>\n )}\n {chevron && <ChevronRight className=\"cbx-row-chevron\" size={16} strokeWidth={1.8} aria-hidden />}\n </div>\n );\n })}\n </div>\n <ListStatus status={list.status} empty={options.length === 0} query={q} plural={plural} onRetry={list.retry} />\n </div>\n {canCreate && (\n <div className=\"cbx-pane-foot\">\n {creating ? (\n <InlineCreate level={level} parent={parent} label={createLabel} onCancel={() => { setCreating(false); focusSelf(); }} />\n ) : (\n <button ref={createButton} type=\"button\" className=\"cbx-row cbx-row-action\" data-pane-action=\"create\" onClick={() => setCreating(true)} onKeyDown={event => onActionKeyDown(event, 'create')}>\n <Plus size={16} strokeWidth={1.8} aria-hidden />\n <span className=\"cbx-row-name\">{createLabel}</span>\n </button>\n )}\n </div>\n )}\n </div>\n );\n}\n\nfunction ListStatus({ status, empty, query, plural, onRetry }: { status: 'loading' | 'ready' | 'error'; empty: boolean; query: string; plural: string; onRetry: () => void }) {\n const { t } = useShell();\n if (status === 'error') {\n return (\n <div className=\"cbx-list-note\" role=\"alert\">\n {t('{things} could not be loaded.', { things: plural })}{' '}\n <button type=\"button\" className=\"cbx-link\" onClick={onRetry}>{t('Try again')}</button>\n </div>\n );\n }\n if (status === 'loading' && empty) return <div className=\"cbx-list-note\" aria-live=\"polite\">{t('Loading…')}</div>;\n if (status === 'ready' && empty) {\n return <div className=\"cbx-list-note\" aria-live=\"polite\">{query.trim() === '' ? t('No {things} yet.', { things: plural.toLowerCase() }) : t('Nothing matches “{query}”.', { query: query.trim() })}</div>;\n }\n return null;\n}\n\n/**\n * \"New …\" (§5.7): a name, inline. Create makes it, and the person lands on its details page\n * where the rest is set up. Never a dead end: a refusal shows its reason under the field.\n */\nexport function InlineCreate({ level, parent, label, onCancel }: { level: ContextLevel; parent?: string; label: string; onCancel: () => void }) {\n const { t, navigate } = useShell();\n const [name, setName] = useState('');\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const field = useRef<HTMLInputElement>(null);\n const errorId = useId();\n\n useEffect(() => {\n field.current?.focus();\n }, []);\n\n const submit = async () => {\n const value = name.trim();\n if (value === '' || busy || level.createUrl === undefined) return;\n setBusy(true);\n setError(null);\n try {\n const created = await createItem(level.createUrl, value, parent);\n forgetLists();\n navigate(created.detailsUrl);\n } catch (failure) {\n setBusy(false);\n setError(failure instanceof ShellRequestError && failure.detail !== null ? failure.detail : t('It could not be created. Try again.'));\n }\n };\n\n return (\n <form\n className=\"cbx-create\"\n onSubmit={event => {\n event.preventDefault();\n void submit();\n }}\n onKeyDown={event => {\n if (event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n onCancel();\n }\n if (event.key === 'Tab') event.stopPropagation();\n }}\n >\n <label className=\"cbx-create-label\" htmlFor={`${errorId}-name`}>{label}</label>\n <div className=\"cbx-create-row\">\n <input\n ref={field}\n id={`${errorId}-name`}\n className=\"cbx-input\"\n value={name}\n onChange={event => setName(event.target.value)}\n placeholder={t('Name')}\n aria-invalid={error !== null}\n aria-describedby={error !== null ? errorId : undefined}\n disabled={busy}\n autoComplete=\"off\"\n />\n <button type=\"submit\" className=\"cbx-button cbx-button-primary\" disabled={busy || name.trim() === ''}>\n {busy ? t('Creating…') : t('Create')}\n </button>\n </div>\n {error !== null && <p id={errorId} className=\"cbx-create-error\" role=\"alert\">{error}</p>}\n </form>\n );\n}\n\n/**\n * A project click (§5.4): switch to it and keep the environment of the same name when it has\n * one, else its first. Its environments come from the kept list, or are loaded first.\n */\nexport async function pickKeepingEnvironment(outer: ContextLevel, inner: ContextLevel | undefined, item: ContextItem, switchTo: (chosen: Record<string, string>) => void): Promise<void> {\n if (inner === undefined) {\n switchTo({ [outer.key]: item.id });\n return;\n }\n let environment: ContextItem | undefined;\n try {\n environment = environmentFor(await fetchList(inner.listUrl, item.id), inner.current.name);\n } catch {\n environment = undefined;\n }\n switchTo(environment === undefined ? { [outer.key]: item.id } : { [outer.key]: item.id, [inner.key]: environment.id });\n}\n\n/** The organization menu (§5.3). */\nexport function OrganizationMenu({ level }: { level: ContextLevel }) {\n const { t, switchTo } = useShell();\n return (\n <div className=\"cbx-menu cbx-menu-org\">\n <LevelPane\n level={level}\n currentId={level.current.id}\n heading={pluralOf(level)}\n autoFocus\n createLabel={t('New {thing}', { thing: level.label.toLowerCase() })}\n onPick={item => switchTo({ [level.key]: item.id })}\n />\n </div>\n );\n}\n\n/**\n * The second trigger's menu (§5.4). With two levels it is the cascade: hovering or focusing a\n * project previews its environments on the right without switching; an environment switches\n * both; a project keeps the environment of the same name, else its first. With one level it\n * is a single pane. `parent` is the organization's id: every level below the first is listed\n * with `?parent=`, so an answer can never belong to another organization.\n */\nexport function CascadeMenu({ levels, parent }: { levels: ContextLevel[]; parent?: string }) {\n const { t, switchTo } = useShell();\n const [outer, inner] = levels as [ContextLevel, ContextLevel | undefined];\n const [preview, setPreview] = useState<ContextItem>(outer.current);\n const left = useRef<PaneHandle>(null);\n const right = useRef<PaneHandle>(null);\n\n if (inner === undefined) {\n return (\n <div className=\"cbx-menu cbx-menu-single\">\n <LevelPane\n level={outer}\n parent={parent}\n currentId={outer.current.id}\n heading={pluralOf(outer)}\n autoFocus\n createLabel={t('New {thing}', { thing: outer.label.toLowerCase() })}\n onPick={item => switchTo({ [outer.key]: item.id })}\n />\n </div>\n );\n }\n\n const pickOuter = (item: ContextItem) => pickKeepingEnvironment(outer, inner, item, switchTo);\n\n return (\n <div className=\"cbx-menu cbx-menu-cascade\">\n <LevelPane\n handle={left}\n level={outer}\n parent={parent}\n currentId={outer.current.id}\n heading={pluralOf(outer)}\n autoFocus\n chevron\n createLabel={t('New {thing}', { thing: outer.label.toLowerCase() })}\n onPick={item => void pickOuter(item)}\n onPreview={setPreview}\n onArrowRight={() => {\n right.current?.focus();\n return true;\n }}\n />\n <LevelPane\n key={preview.id}\n handle={right}\n className=\"cbx-pane-inner\"\n level={inner}\n parent={preview.id}\n currentId={preview.id === outer.current.id ? inner.current.id : undefined}\n heading={t('{things} in {name}', { things: pluralOf(inner), name: preview.name })}\n viewAll={false}\n searchable={false}\n createLabel={t('New {thing} in {name}', { thing: inner.label.toLowerCase(), name: preview.name })}\n onPick={item => switchTo({ [outer.key]: preview.id, [inner.key]: item.id })}\n onArrowLeft={() => left.current?.focus()}\n />\n </div>\n );\n}\n\n/** The trigger text of the second trigger: `Webshop · ■ Production`. */\nexport function CascadeLabel({ levels }: { levels: ContextLevel[] }): ReactNode {\n const [outer, inner] = levels as [ContextLevel, ContextLevel | undefined];\n const outerIsEnvironment = isEnvironmentLevel(outer);\n return (\n <>\n {outerIsEnvironment ? <ToneSquare tone={outer.current.tone} /> : <Chip item={outer.current} />}\n <span className=\"cbx-trigger-text\" title={outer.current.name}>{outer.current.name}</span>\n {inner !== undefined && (\n <>\n <span className=\"cbx-trigger-dot\" aria-hidden=\"true\">·</span>\n <span className=\"cbx-trigger-env\">\n <ToneSquare tone={inner.current.tone} />\n <span className=\"cbx-trigger-text\" title={inner.current.name}>{inner.current.name}</span>\n </span>\n </>\n )}\n </>\n );\n}\n","/**\n * Help's state lives outside React (§7.1): open or closed, what it shows, the search, the scroll\n * position and the support updates survive an Inertia visit and even a remount of the shell,\n * like a browser side panel. The conversation itself lives in the `<cbox-support>` element, which\n * survives as long as the shell sits in the host's persistent layout.\n */\n\nimport { safeUrl } from './data';\n\nexport type HelpArticle = { id: string; title: string; excerpt?: string; body?: string; url?: string; source?: string };\n\nexport type SupportUpdate = { id: string; kind: 'ticket' | 'chat'; title: string; excerpt?: string; at?: string; unread: boolean; url?: string };\n\nexport type HelpStatus = 'idle' | 'loading' | 'ready' | 'unavailable';\n\nexport type HelpState = {\n open: boolean;\n /** The article shown instead of the home view, or null. */\n article: HelpArticle | null;\n query: string;\n scrollTop: number;\n updates: SupportUpdate[];\n updatesStatus: HelpStatus;\n /** A question waiting for the chat to be ready (\"Ask Cbox: …\" from the palette). */\n pendingQuestion: string | null;\n /** Whether `open` was taken from the person's saved preference yet. */\n seeded: boolean;\n /**\n * `open` came from the saved preference, not from the person on this page. Help left open\n * shows docked from 1280px; below that it waits until the person opens it, so a phone or a\n * narrow window never lands under the full-screen overlay.\n */\n restored: boolean;\n /** Which list the support updates came from (URL and organization), so a switch reloads them. */\n updatesKey: string | null;\n};\n\nexport type HelpStore = {\n get(): HelpState;\n set(patch: Partial<HelpState> | ((state: HelpState) => Partial<HelpState>)): void;\n subscribe(listener: () => void): () => void;\n};\n\nexport const INITIAL_HELP_STATE: HelpState = {\n open: false,\n article: null,\n query: '',\n scrollTop: 0,\n updates: [],\n updatesStatus: 'idle',\n pendingQuestion: null,\n seeded: false,\n restored: false,\n updatesKey: null,\n};\n\n/** Whether Help is on screen: open, and either docked or opened by the person on this page. */\nexport function helpVisible(state: Pick<HelpState, 'open' | 'restored'>, docked: boolean): boolean {\n return state.open && (docked || !state.restored);\n}\n\nexport function createHelpStore(initial: Partial<HelpState> = {}): HelpStore {\n let state: HelpState = { ...INITIAL_HELP_STATE, ...initial };\n const listeners = new Set<() => void>();\n return {\n get: () => state,\n set(patch) {\n const next = typeof patch === 'function' ? patch(state) : patch;\n state = { ...state, ...next };\n listeners.forEach(listener => listener());\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n };\n}\n\nlet browserStore: HelpStore | null = null;\n\n/**\n * The page's one store. On the server every render gets a fresh one, so two people's requests\n * never share Help state.\n */\nexport function sharedHelpStore(): HelpStore {\n if (typeof window === 'undefined') return createHelpStore();\n browserStore ??= createHelpStore();\n return browserStore;\n}\n\nexport function parseUpdates(body: unknown): SupportUpdate[] {\n const rows = Array.isArray(body) ? body : typeof body === 'object' && body !== null && Array.isArray((body as { data?: unknown }).data) ? (body as { data: unknown[] }).data : [];\n return rows.flatMap((value: unknown) => {\n if (typeof value !== 'object' || value === null) return [];\n const row = value as Record<string, unknown>;\n if ((typeof row.id !== 'string' && typeof row.id !== 'number') || typeof row.title !== 'string') return [];\n const update: SupportUpdate = {\n id: String(row.id),\n kind: row.kind === 'chat' ? 'chat' : 'ticket',\n title: row.title,\n unread: row.unread === true || row.read === false || (row.read_at === null && row.unread !== false),\n };\n if (typeof row.excerpt === 'string') update.excerpt = row.excerpt;\n const at = row.at ?? row.updated_at ?? row.created_at;\n if (typeof at === 'string') update.at = at;\n const url = safeUrl(row.url);\n if (url !== undefined) update.url = url;\n return [update];\n });\n}\n\nexport function parseArticles(body: unknown): HelpArticle[] {\n const rows = Array.isArray(body) ? body : typeof body === 'object' && body !== null && Array.isArray((body as { data?: unknown }).data) ? (body as { data: unknown[] }).data : [];\n return rows.flatMap((value: unknown) => {\n if (typeof value !== 'object' || value === null) return [];\n const row = value as Record<string, unknown>;\n if ((typeof row.id !== 'string' && typeof row.id !== 'number') || typeof row.title !== 'string') return [];\n const article: HelpArticle = { id: String(row.id), title: row.title };\n if (typeof row.excerpt === 'string') article.excerpt = row.excerpt;\n if (typeof row.body === 'string') article.body = row.body;\n const url = safeUrl(row.url);\n if (url !== undefined) article.url = url;\n if (typeof row.source === 'string') article.source = row.source;\n return [article];\n });\n}\n","import { ArrowLeft, ArrowUpRight, BookOpen, CircleAlert, LifeBuoy, MessageSquare, Search, Sparkles, Ticket, UserRound, X } from 'lucide-react';\nimport { createElement, useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState, useSyncExternalStore, type FormEvent } from 'react';\nimport { requestJson, withQuery } from './data';\nimport { helpVisible, parseArticles, parseUpdates, type HelpArticle, type HelpState, type HelpStore, type SupportUpdate } from './help-store';\nimport { useShell } from './context';\nimport { canAutofocus } from './media';\nimport { trapTab } from './popover';\nimport { DEBOUNCE_MS } from './use-list';\nimport type { Shell } from './types';\n\nexport const DEFAULT_SUPPORT_SCRIPT = '/ai-assistant/support.js';\nconst SUPPORT_TAG = 'cbox-support';\n\nexport function useHelpState<T>(store: HelpStore, select: (state: HelpState) => T): T {\n return useSyncExternalStore(store.subscribe, () => select(store.get()), () => select(store.get()));\n}\n\n/** The page intent the chat is given (§7.2.4): route, title and context. */\nexport type PageIntent = { route?: string; title?: string; context: string; url?: string };\n\nexport function contextTrail(shell: Shell): string {\n return shell.context.levels.map(level => level.current.name).join(' / ');\n}\n\nexport function pageIntent(shell: Shell): PageIntent {\n const intent: PageIntent = { context: contextTrail(shell) };\n if (shell.page?.route !== undefined) intent.route = shell.page.route;\n if (shell.page?.title !== undefined) intent.title = shell.page.title;\n if (typeof window !== 'undefined') intent.url = window.location.pathname;\n return intent;\n}\n\n/** The Assistant SDK's element, with the methods a newer SDK may add. */\ntype SupportElement = HTMLElement & {\n open?: () => unknown;\n ask?: (question: string, intent?: PageIntent) => unknown;\n handover?: () => unknown;\n intent?: PageIntent;\n};\n\nfunction ensureScript(src: string): void {\n if (typeof document === 'undefined' || customElements.get(SUPPORT_TAG) !== undefined) return;\n if (Array.from(document.scripts).some(script => script.getAttribute('src') === src)) return;\n const script = document.createElement('script');\n script.src = src;\n script.defer = true;\n document.head.append(script);\n}\n\n/** Wait for the SDK's element to be defined and in place, up to `timeoutMs`. */\nfunction whenSupportReady(host: HTMLElement | null, timeoutMs = 6000): Promise<SupportElement | null> {\n return new Promise(resolve => {\n const started = Date.now();\n const attempt = () => {\n const element = host?.querySelector<SupportElement>(SUPPORT_TAG) ?? null;\n if (element !== null && typeof element.open === 'function') {\n resolve(element);\n return;\n }\n if (Date.now() - started >= timeoutMs) {\n resolve(null);\n return;\n }\n setTimeout(attempt, 150);\n };\n attempt();\n });\n}\n\n/**\n * The Help column (§7): support updates, docs search, articles for this page, Ask Cbox and a way\n * to a person. Docked beside the page from 1280px, a full-screen dialog below. It is always\n * mounted while the shell is, so its state and the conversation survive page changes.\n */\nexport function HelpColumn({ docked }: { docked: boolean }) {\n const { shell, t, help: store, toggleHelp, navigate, preferences } = useShell();\n const formatDate = useShortDate(preferences.regionalFormat ?? preferences.locale, preferences.timeZone);\n const open = useHelpState(store, state => helpVisible(state, docked));\n const restored = useHelpState(store, state => state.open && state.restored);\n const article = useHelpState(store, state => state.article);\n const query = useHelpState(store, state => state.query);\n const updates = useHelpState(store, state => state.updates);\n const updatesStatus = useHelpState(store, state => state.updatesStatus);\n const pendingQuestion = useHelpState(store, state => state.pendingQuestion);\n const [articles, setArticles] = useState<{ topic: string | undefined; items: HelpArticle[]; status: 'loading' | 'ready' | 'unavailable' }>({ topic: undefined, items: [], status: 'loading' });\n const [results, setResults] = useState<{ q: string; items: HelpArticle[]; status: 'loading' | 'ready' | 'unavailable' } | null>(null);\n const [question, setQuestion] = useState('');\n const [chatProblem, setChatProblem] = useState(false);\n const column = useRef<HTMLDivElement>(null);\n const body = useRef<HTMLDivElement>(null);\n const chatHost = useRef<HTMLDivElement>(null);\n const searchField = useRef<HTMLInputElement>(null);\n const opener = useRef<HTMLElement | null>(null);\n const { help } = shell;\n const portal = help.portalUrl;\n\n // Support updates are per person per organization (§7.3). They feed the button's count, so\n // they load after the first paint, open or not, and again when the URL or organization\n // changes: the store outlives Inertia visits, so an org switch must not keep the old count.\n const updatesKey = help.enabled && help.updatesUrl !== undefined ? `${help.updatesUrl}|${shell.context.levels[0]?.current.id ?? ''}` : null;\n const loadUpdates = useCallback(() => {\n if (updatesKey === null || help.updatesUrl === undefined) return;\n const current = () => store.get().updatesKey === updatesKey;\n store.set({ updatesStatus: 'loading', updatesKey });\n requestJson(help.updatesUrl)\n .then(answer => {\n if (current()) store.set({ updates: parseUpdates(answer), updatesStatus: 'ready' });\n })\n .catch(() => {\n if (current()) store.set({ updatesStatus: 'unavailable' });\n });\n }, [updatesKey, help.updatesUrl, store]);\n useEffect(() => {\n const state = store.get();\n if (state.updatesKey !== updatesKey) {\n store.set({ updates: [], updatesStatus: 'idle', updatesKey });\n loadUpdates();\n } else if (state.updatesStatus === 'idle') loadUpdates();\n }, [updatesKey, loadUpdates, store]);\n useEffect(() => {\n if (open && store.get().updatesStatus !== 'loading') loadUpdates();\n }, [open]);\n\n // Articles for this page's topic.\n useEffect(() => {\n if (!open || !help.enabled || help.articlesUrl === undefined || help.topic === undefined) return;\n if (articles.topic === help.topic && articles.status === 'ready') return;\n const controller = new AbortController();\n setArticles({ topic: help.topic, items: [], status: 'loading' });\n requestJson(help.articlesUrl.split('{topic}').join(encodeURIComponent(help.topic)), { signal: controller.signal })\n .then(answer => setArticles({ topic: help.topic, items: parseArticles(answer).slice(0, 3), status: 'ready' }))\n .catch((error: unknown) => {\n if ((error as { name?: string })?.name !== 'AbortError') setArticles({ topic: help.topic, items: [], status: 'unavailable' });\n });\n return () => controller.abort();\n }, [open, help.enabled, help.articlesUrl, help.topic]);\n\n // Docs search, debounced like the palette.\n useEffect(() => {\n const q = query.trim();\n if (!help.enabled || help.searchUrl === undefined || q === '') {\n setResults(null);\n return;\n }\n const controller = new AbortController();\n const timer = setTimeout(() => {\n setResults(current => ({ q, items: current?.items ?? [], status: 'loading' }));\n requestJson(withQuery(help.searchUrl!, { q, topic: help.topic }), { signal: controller.signal })\n .then(answer => setResults({ q, items: parseArticles(answer), status: 'ready' }))\n .catch((error: unknown) => {\n if ((error as { name?: string })?.name !== 'AbortError') setResults({ q, items: [], status: 'unavailable' });\n });\n }, DEBOUNCE_MS);\n return () => {\n clearTimeout(timer);\n controller.abort();\n };\n }, [query, help.enabled, help.searchUrl, help.topic]);\n\n // The SDK script loads once Help is first opened: never before the page has painted.\n useEffect(() => {\n if (open && help.enabled && help.sessionUrl !== undefined) ensureScript(help.scriptUrl ?? DEFAULT_SUPPORT_SCRIPT);\n }, [open, help.enabled, help.sessionUrl, help.scriptUrl]);\n\n // The page intent follows navigation.\n const intent = pageIntent(shell);\n const intentJson = JSON.stringify(intent);\n useEffect(() => {\n const element = chatHost.current?.querySelector<SupportElement>(SUPPORT_TAG);\n if (element !== null && element !== undefined) element.intent = JSON.parse(intentJson) as PageIntent;\n }, [intentJson]);\n\n const openChat = useCallback(\n async (ask?: string, handover = false) => {\n setChatProblem(false);\n if (help.sessionUrl === undefined) {\n setChatProblem(true);\n return;\n }\n ensureScript(help.scriptUrl ?? DEFAULT_SUPPORT_SCRIPT);\n const element = await whenSupportReady(chatHost.current);\n if (element === null) {\n setChatProblem(true);\n return;\n }\n element.intent = JSON.parse(intentJson) as PageIntent;\n if (handover && typeof element.handover === 'function') void element.handover();\n else if (ask !== undefined && ask !== '' && typeof element.ask === 'function') void element.ask(ask, element.intent);\n else void element.open?.();\n },\n [help.sessionUrl, help.scriptUrl, intentJson],\n );\n\n useEffect(() => {\n if (pendingQuestion === null || !open) return;\n store.set({ pendingQuestion: null });\n setQuestion(pendingQuestion);\n void openChat(pendingQuestion);\n }, [pendingQuestion, open, openChat, store]);\n\n // Scroll position survives page changes.\n useLayoutEffect(() => {\n if (open && body.current !== null) body.current.scrollTop = store.get().scrollTop;\n }, [open, article, store]);\n\n // When the person opens Help, its search takes focus on a desktop. Help that was simply left\n // open never takes focus on a page load, unless it is the modal overlay, which must hold it.\n // When it closes, focus goes back to what opened it (the Help button or a page's `?`).\n const wasOpen = useRef(open);\n useEffect(() => {\n const opened = open && !wasOpen.current;\n const closed = !open && wasOpen.current;\n wasOpen.current = open;\n if (closed) {\n const active = document.activeElement;\n if (active === null || active === document.body || column.current?.contains(active)) {\n const back = opener.current?.isConnected ? opener.current : document.querySelector<HTMLElement>('.cbx-tools [aria-controls=\"cbx-help\"]');\n back?.focus();\n }\n opener.current = null;\n return;\n }\n if (!open) return;\n if (opened) {\n const active = document.activeElement;\n opener.current = active instanceof HTMLElement && active !== document.body && !column.current?.contains(active) ? active : null;\n }\n if (opened && canAutofocus() && store.get().article === null) searchField.current?.focus();\n else if (!docked && !column.current?.contains(document.activeElement)) column.current?.focus();\n }, [open, docked, store]);\n\n const markRead = (update: SupportUpdate) => {\n if (!update.unread) return;\n store.set(state => ({ updates: state.updates.map(item => (item.id === update.id ? { ...item, unread: false } : item)) }));\n if (help.updatesUrl !== undefined) requestJson(`${help.updatesUrl.replace(/\\/$/, '')}/${encodeURIComponent(update.id)}/read`, { method: 'POST' }).catch(() => undefined);\n };\n const openUpdate = (update: SupportUpdate) => {\n markRead(update);\n if (update.kind === 'chat') void openChat();\n else if (update.url !== undefined) navigate(update.url, { newTab: true });\n else if (portal !== undefined) navigate(portal, { newTab: true });\n };\n\n const unread = updates.filter(update => update.unread);\n const unavailable = !help.enabled || updatesStatus === 'unavailable' || articles.status === 'unavailable' || results?.status === 'unavailable';\n const trail = contextTrail(shell);\n\n const submit = (event: FormEvent) => {\n event.preventDefault();\n void openChat(question.trim());\n };\n\n return (\n <div\n ref={column}\n id=\"cbx-help\"\n className={`cbx-help ${docked ? 'is-docked' : 'is-overlay'}`}\n hidden={!open}\n data-restored={restored ? 'true' : undefined}\n aria-label={t('Help')}\n role={docked ? 'complementary' : 'dialog'}\n aria-modal={docked ? undefined : true}\n tabIndex={-1}\n onKeyDown={event => {\n if (event.key === 'Escape' && !event.defaultPrevented) {\n event.preventDefault();\n toggleHelp(false);\n }\n if (!docked) trapTab(event, column.current);\n }}\n >\n <div className=\"cbx-help-head\">\n {article !== null ? (\n <button type=\"button\" className=\"cbx-icon-button\" onClick={() => store.set({ article: null })} aria-label={t('Back to Help')}>\n <ArrowLeft size={18} strokeWidth={1.8} aria-hidden />\n </button>\n ) : (\n <LifeBuoy className=\"cbx-help-mark\" size={18} strokeWidth={1.8} aria-hidden />\n )}\n <h2 className=\"cbx-help-title\">{t('Help')}</h2>\n {portal !== undefined && (\n <a className=\"cbx-icon-button\" href={portal} target=\"_blank\" rel=\"noopener\" aria-label={t('Support portal (opens in a new tab)')} title={t('Support portal')}>\n <ArrowUpRight size={18} strokeWidth={1.8} aria-hidden />\n </a>\n )}\n <button type=\"button\" className=\"cbx-icon-button\" onClick={() => toggleHelp(false)} aria-label={t('Close Help')}>\n <X size={18} strokeWidth={1.8} aria-hidden />\n </button>\n </div>\n <p className=\"cbx-help-page\">\n <span className=\"cbx-help-page-label\">{t('On this page')}</span>\n <span className=\"cbx-truncate\" title={[shell.page?.title, trail].filter(Boolean).join(' · ')}>\n {shell.page?.title !== undefined && <strong>{shell.page.title}</strong>}\n {shell.page?.title !== undefined && trail !== '' && ' · '}\n {trail}\n </span>\n </p>\n <div ref={body} className=\"cbx-help-body\" onScroll={event => store.set({ scrollTop: event.currentTarget.scrollTop })}>\n {article !== null ? (\n <article className=\"cbx-help-article\">\n <h3>{article.title}</h3>\n {(article.body ?? article.excerpt ?? '').split(/\\n{2,}/).filter(Boolean).map((paragraph, index) => <p key={index}>{paragraph}</p>)}\n {article.url !== undefined && (\n <a className=\"cbx-link\" href={article.url} target=\"_blank\" rel=\"noopener\">\n {t('Open the full article')} <ArrowUpRight size={14} strokeWidth={1.8} aria-hidden />\n </a>\n )}\n </article>\n ) : (\n <>\n {unavailable && (\n <div className=\"cbx-help-notice\" role=\"status\">\n <CircleAlert size={16} strokeWidth={1.8} aria-hidden />\n <span>{help.enabled ? t('Help is not available right now. The rest of the app works as usual.') : t('Help is not available here yet.')}</span>\n {help.enabled && <button type=\"button\" className=\"cbx-link\" onClick={() => { loadUpdates(); setArticles(current => ({ ...current, status: 'loading', topic: undefined })); }}>{t('Try again')}</button>}\n </div>\n )}\n {unread.length > 0 || updates.length > 0 ? (\n <section className=\"cbx-help-section\" aria-labelledby=\"cbx-help-updates\">\n <div className=\"cbx-pane-heading\">\n <span id=\"cbx-help-updates\">{t('Support updates')}</span>\n {unread.length > 0 && <button type=\"button\" className=\"cbx-pane-all\" onClick={() => unread.forEach(markRead)}>{t('Mark all read')}</button>}\n </div>\n <ul className=\"cbx-list\" role=\"list\">\n {updates.map(update => (\n <li key={update.id}>\n <button type=\"button\" className={`cbx-update ${update.unread ? 'is-unread' : ''}`} onClick={() => openUpdate(update)}>\n {update.kind === 'chat' ? <MessageSquare size={16} strokeWidth={1.8} aria-hidden /> : <Ticket size={16} strokeWidth={1.8} aria-hidden />}\n <span className=\"cbx-update-text\">\n <span className=\"cbx-update-title cbx-truncate\" title={update.title}>{update.title}</span>\n {update.excerpt !== undefined && <span className=\"cbx-update-excerpt\">{update.excerpt}</span>}\n </span>\n <span className=\"cbx-update-meta\">\n {update.at !== undefined && <time dateTime={update.at}>{formatDate(update.at)}</time>}\n {update.unread && <span className=\"cbx-unread-dot\" aria-label={t('Unread')} />}\n </span>\n </button>\n </li>\n ))}\n </ul>\n </section>\n ) : null}\n <section className=\"cbx-help-section\" aria-label={t('Search docs and knowledge base')}>\n <div className=\"cbx-help-search\">\n <Search size={16} strokeWidth={1.8} aria-hidden />\n <input\n ref={searchField}\n type=\"search\"\n value={query}\n onChange={event => store.set({ query: event.target.value })}\n placeholder={t('Search docs and knowledge base')}\n aria-label={t('Search docs and knowledge base')}\n disabled={!help.enabled || help.searchUrl === undefined}\n />\n </div>\n {results !== null && (\n <ul className=\"cbx-list\" role=\"list\" aria-live=\"polite\">\n {results.items.map(item => (\n <li key={item.id}><ArticleRow article={item} /></li>\n ))}\n {results.status === 'ready' && results.items.length === 0 && <li className=\"cbx-list-note\">{t('Nothing matches “{query}”.', { query: results.q })}</li>}\n {results.status === 'loading' && results.items.length === 0 && <li className=\"cbx-list-note\">{t('Searching…')}</li>}\n </ul>\n )}\n </section>\n {help.topic !== undefined && articles.items.length > 0 && (\n <section className=\"cbx-help-section\" aria-labelledby=\"cbx-help-topic\">\n <div className=\"cbx-pane-heading\"><span id=\"cbx-help-topic\">{t('For this page')}</span></div>\n <ul className=\"cbx-list\" role=\"list\">\n {articles.items.map(item => <li key={item.id}><ArticleRow article={item} /></li>)}\n </ul>\n </section>\n )}\n <section className=\"cbx-help-section\" aria-labelledby=\"cbx-help-ask\">\n <div className=\"cbx-pane-heading\"><span id=\"cbx-help-ask\">{t('Ask Cbox')}</span></div>\n <form className=\"cbx-ask\" onSubmit={submit}>\n <textarea\n className=\"cbx-input\"\n rows={3}\n value={question}\n onChange={event => setQuestion(event.target.value)}\n placeholder={t('Ask about this page…')}\n aria-label={t('Ask Cbox')}\n disabled={!help.enabled || help.sessionUrl === undefined}\n onKeyDown={event => {\n if (event.key === 'Enter' && (event.metaKey || event.ctrlKey)) submit(event);\n }}\n />\n <button type=\"submit\" className=\"cbx-button cbx-button-primary\" disabled={!help.enabled || help.sessionUrl === undefined}>\n <Sparkles size={15} strokeWidth={1.8} aria-hidden /> {t('Ask')}\n </button>\n </form>\n {chatProblem && <p className=\"cbx-create-error\" role=\"alert\">{t('The chat could not be opened. Try again, or use the support portal.')}</p>}\n </section>\n </>\n )}\n {/* The chat element sits outside the home/article switch, so opening an article\n (from the palette, \"For this page\" or a search) never unmounts it and the\n conversation survives (§7.1). */}\n {help.enabled && help.sessionUrl !== undefined && (\n <div ref={chatHost} className=\"cbx-chat-host\" data-view={article !== null ? 'article' : 'home'}>\n {createElement(SUPPORT_TAG, { 'session-url': help.sessionUrl, intent: intentJson })}\n </div>\n )}\n </div>\n <div className=\"cbx-help-foot\">\n <button type=\"button\" className=\"cbx-row cbx-row-action\" onClick={() => void openChat(t('I would like to talk to a person.'), true)} disabled={!help.enabled || help.sessionUrl === undefined}>\n <UserRound size={16} strokeWidth={1.8} aria-hidden />\n <span className=\"cbx-row-name\">{t('Talk to a person')}</span>\n </button>\n {portal !== undefined && (\n <a className=\"cbx-row cbx-row-action\" href={portal} target=\"_blank\" rel=\"noopener\">\n <BookOpen size={16} strokeWidth={1.8} aria-hidden />\n <span className=\"cbx-row-name\">{t('Support portal')}</span>\n <ArrowUpRight className=\"cbx-row-trail\" size={14} strokeWidth={1.8} aria-hidden />\n </a>\n )}\n </div>\n </div>\n );\n}\n\n/** \"10 Nov, 10:12\" in the person's regional format and time zone (Cbox ID's preferences). */\nexport function useShortDate(locale: string | undefined, timeZone: string | undefined): (iso: string) => string {\n const format = useMemo(() => {\n const options: Intl.DateTimeFormatOptions = { day: 'numeric', month: 'short', hour: '2-digit', minute: '2-digit' };\n try {\n return new Intl.DateTimeFormat(locale, { ...options, timeZone });\n } catch {\n return new Intl.DateTimeFormat(undefined, options);\n }\n }, [locale, timeZone]);\n return useCallback((iso: string) => {\n const date = new Date(iso);\n return Number.isNaN(date.getTime()) ? iso : format.format(date);\n }, [format]);\n}\n\nfunction ArticleRow({ article }: { article: HelpArticle }) {\n const { openArticle } = useShell();\n return (\n <button type=\"button\" className=\"cbx-update\" onClick={() => openArticle(article)}>\n <BookOpen size={16} strokeWidth={1.8} aria-hidden />\n <span className=\"cbx-update-text\">\n <span className=\"cbx-update-title cbx-truncate\" title={article.title}>{article.title}</span>\n {article.excerpt !== undefined && <span className=\"cbx-update-excerpt\">{article.excerpt}</span>}\n </span>\n </button>\n );\n}\n","import type { ComponentType } from 'react';\nimport {\n Activity,\n BarChart3,\n Bell,\n BookOpen,\n Boxes,\n Briefcase,\n Building2,\n Calendar,\n Circle,\n Clock,\n Cloud,\n Code,\n CreditCard,\n Database,\n FileText,\n Folder,\n GitBranch,\n Globe,\n HardDrive,\n Home,\n Inbox,\n Key,\n LayoutDashboard,\n LayoutGrid,\n Layers,\n LifeBuoy,\n List,\n Lock,\n Mail,\n MessageSquare,\n Network,\n Package,\n Percent,\n Plug,\n Receipt,\n Rocket,\n Search,\n Send,\n Server,\n Settings,\n Shield,\n ShieldCheck,\n Sparkles,\n Tag,\n Timer,\n Users,\n Wallet,\n Webhook,\n Zap,\n} from 'lucide-react';\n\nexport type ShellIcon = ComponentType<{ size?: number; strokeWidth?: number; className?: string; 'aria-hidden'?: boolean }>;\n\n/** Lucide names an app can use for areas, pages and actions without shipping its own map. */\nexport const SHELL_ICONS: Readonly<Record<string, ShellIcon>> = {\n activity: Activity,\n 'bar-chart': BarChart3,\n bell: Bell,\n 'book-open': BookOpen,\n boxes: Boxes,\n briefcase: Briefcase,\n building: Building2,\n calendar: Calendar,\n clock: Clock,\n cloud: Cloud,\n code: Code,\n 'credit-card': CreditCard,\n database: Database,\n 'file-text': FileText,\n folder: Folder,\n 'git-branch': GitBranch,\n globe: Globe,\n 'hard-drive': HardDrive,\n home: Home,\n inbox: Inbox,\n key: Key,\n 'layout-dashboard': LayoutDashboard,\n 'layout-grid': LayoutGrid,\n layers: Layers,\n 'life-buoy': LifeBuoy,\n list: List,\n lock: Lock,\n mail: Mail,\n 'message-square': MessageSquare,\n network: Network,\n package: Package,\n percent: Percent,\n plug: Plug,\n receipt: Receipt,\n rocket: Rocket,\n search: Search,\n send: Send,\n server: Server,\n settings: Settings,\n shield: Shield,\n 'shield-check': ShieldCheck,\n sparkles: Sparkles,\n tag: Tag,\n timer: Timer,\n users: Users,\n wallet: Wallet,\n webhook: Webhook,\n zap: Zap,\n};\n\n/** The icon for a name: the host's map first, then the built-in one, then a plain circle. */\nexport function resolveIcon(name: string | undefined, extra: Readonly<Record<string, ShellIcon>> = {}): ShellIcon {\n if (name === undefined) return Circle;\n return extra[name] ?? SHELL_ICONS[name] ?? Circle;\n}\n","import { Lock } from 'lucide-react';\nimport { useId, type ReactNode } from 'react';\nimport { useShell } from './context';\nimport type { NavPage } from './types';\n\n/** A nav entry's URL: `url`, or `href` as laravel-console-kit 0.2 sends it. */\nexport function navUrl(entry: { url?: string; href?: string }): string {\n return entry.url ?? entry.href ?? '#';\n}\n\nexport type NavPageGroup = { group?: string; pages: NavPage[] };\n\n/**\n * An area's pages in runs under their group heading. Pages of one group are kept together,\n * in the order each group first appears; pages without a group form a run of their own.\n */\nexport function groupPages(pages: readonly NavPage[]): NavPageGroup[] {\n const runs = new Map<string, NavPageGroup>();\n for (const page of pages) {\n const key = page.group === undefined || page.group === '' ? '' : `g:${page.group}`;\n const run = runs.get(key) ?? { group: key === '' ? undefined : page.group, pages: [] };\n run.pages.push(page);\n runs.set(key, run);\n }\n return Array.from(runs.values());\n}\n\n/** The marks after a nav page's label: a lock (with \"(locked)\" for screen readers) and the count. */\nexport function NavPageMarks({ page }: { page: NavPage }) {\n const { t } = useShell();\n return (\n <>\n {page.locked === true && (\n <span className=\"cbx-nav-lock\" title={t('Not in your plan')}>\n <Lock size={13} strokeWidth={1.9} aria-hidden />\n <span className=\"cbx-sr-only\">{t('(locked)')}</span>\n </span>\n )}\n {page.locked !== true && page.count !== undefined && page.count > 0 && <span className=\"cbx-nav-count\">{page.count > 999 ? '999+' : page.count}</span>}\n </>\n );\n}\n\n/**\n * An area's pages, under their group headings when they have any. `renderPage` draws one link;\n * each group is an ARIA group named by its heading.\n */\nexport function NavPageList({ pages, renderPage }: { pages: readonly NavPage[]; renderPage: (page: NavPage) => ReactNode }) {\n const id = useId();\n const runs = groupPages(pages);\n if (runs.every(run => run.group === undefined)) return <>{pages.map(renderPage)}</>;\n return (\n <>\n {runs.map((run, index) =>\n run.group === undefined ? (\n <div key={`run-${index}`} className=\"cbx-nav-run\">{run.pages.map(renderPage)}</div>\n ) : (\n <div key={`run-${index}`} role=\"group\" aria-labelledby={`${id}-${index}`} className=\"cbx-nav-run\">\n <div id={`${id}-${index}`} className=\"cbx-nav-group\">{run.group}</div>\n {run.pages.map(renderPage)}\n </div>\n ),\n )}\n </>\n );\n}\n","import { ArrowLeft, Bell, LayoutGrid, X } from 'lucide-react';\nimport { useEffect, useRef, useState, type ReactNode } from 'react';\nimport { AccountMenu } from './account-menu';\nimport { AppGrid } from './app-grid';\nimport { LevelPane, pickKeepingEnvironment } from './context-menus';\nimport { useShell } from './context';\nimport { pluralOf } from './data';\nimport { resolveIcon } from './icons';\nimport { NavPageList, NavPageMarks, navUrl } from './nav-pages';\nimport { trapTab } from './popover';\n\n/**\n * A modal sheet for the phone layout (§4.5): it traps focus, closes on Escape and on the scrim,\n * and gives focus back to what opened it.\n */\nexport function Sheet({ label, side, onClose, children, head }: { label: string; side: 'left' | 'bottom'; onClose: () => void; children: ReactNode; head?: ReactNode }) {\n const { t } = useShell();\n const panel = useRef<HTMLDivElement>(null);\n const opener = useRef<Element | null>(typeof document !== 'undefined' ? document.activeElement : null);\n useEffect(() => {\n panel.current?.focus();\n const back = opener.current;\n return () => {\n if (back instanceof HTMLElement) back.focus();\n };\n }, []);\n return (\n <div className=\"cbx-overlay cbx-sheet-backdrop\" onPointerDown={event => { if (event.target === event.currentTarget) onClose(); }}>\n <div\n ref={panel}\n className={`cbx-sheet cbx-sheet-${side}`}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={label}\n tabIndex={-1}\n onKeyDown={event => {\n if (event.key === 'Escape' && !event.defaultPrevented) {\n event.preventDefault();\n onClose();\n }\n trapTab(event, panel.current);\n }}\n >\n <div className=\"cbx-sheet-head\">\n {head ?? <strong className=\"cbx-sheet-title\">{label}</strong>}\n <button type=\"button\" className=\"cbx-icon-button\" onClick={onClose} aria-label={t('Close')}>\n <X size={18} strokeWidth={1.8} aria-hidden />\n </button>\n </div>\n <div className=\"cbx-sheet-body\">{children}</div>\n </div>\n </div>\n );\n}\n\n/** ☰: areas with their pages, Switch app, notifications when the app has them, and the account. */\nexport function NavSheet({ onClose }: { onClose: () => void }) {\n const { shell, t, Link, icons } = useShell();\n const [view, setView] = useState<'nav' | 'apps'>('nav');\n if (view === 'apps') {\n return (\n <Sheet\n label={t('Switch app')}\n side=\"left\"\n onClose={onClose}\n head={\n <button type=\"button\" className=\"cbx-row cbx-row-action cbx-back\" onClick={() => setView('nav')}>\n <ArrowLeft size={16} strokeWidth={1.8} aria-hidden />\n <span className=\"cbx-row-name\">{t('Switch app')}</span>\n </button>\n }\n >\n <AppGrid autoFocus={false} />\n </Sheet>\n );\n }\n return (\n <Sheet label={shell.app.name} side=\"left\" onClose={onClose}>\n <nav aria-label={t('Navigation')} className=\"cbx-list\">\n {shell.nav.areas.map(area => {\n const Icon = resolveIcon(area.icon, icons);\n const activeArea = area.key === shell.nav.activeArea;\n return (\n <div key={area.key} className=\"cbx-sheet-area\">\n <Link href={navUrl(area)} className={`cbx-row cbx-row-action ${activeArea ? ((area.pages ?? []).length > 1 ? 'is-open' : 'is-current') : ''}`} aria-current={activeArea && (area.pages ?? []).length <= 1 ? 'page' : undefined} onClick={onClose}>\n <Icon size={16} strokeWidth={1.8} aria-hidden />\n <span className=\"cbx-row-name\">{area.label}</span>\n </Link>\n {(area.pages ?? []).length > 1 && (\n <div className=\"cbx-sheet-pages\">\n <NavPageList\n pages={area.pages ?? []}\n renderPage={page => {\n const on = activeArea && page.key === shell.nav.activePage;\n return (\n <Link key={page.key} href={navUrl(page)} className={`cbx-row cbx-row-action ${on ? 'is-current' : ''} ${page.locked === true ? 'is-locked' : ''}`} aria-current={on ? 'page' : undefined} data-locked={page.locked === true ? 'true' : undefined} onClick={onClose}>\n <span className=\"cbx-row-name\">{page.label}</span>\n <NavPageMarks page={page} />\n </Link>\n );\n }}\n />\n </div>\n )}\n </div>\n );\n })}\n </nav>\n <div className=\"cbx-list cbx-list-foot\">\n <button type=\"button\" className=\"cbx-row cbx-row-action\" onClick={() => setView('apps')}>\n <LayoutGrid size={16} strokeWidth={1.8} aria-hidden />\n <span className=\"cbx-row-name\">{t('Switch app')}</span>\n </button>\n {shell.notifications.enabled && (\n <Link href={shell.notifications.url} className=\"cbx-row cbx-row-action\" onClick={onClose}>\n <Bell size={16} strokeWidth={1.8} aria-hidden />\n <span className=\"cbx-row-name\">{t('Notifications')}</span>\n {shell.notifications.unread > 0 && <span className=\"cbx-count is-inline\">{shell.notifications.unread}</span>}\n </Link>\n )}\n </div>\n <AccountMenu inline onDone={onClose} />\n </Sheet>\n );\n}\n\n/** The one context button's sheet: every level stacked, each with search and \"New …\" (§4.5). */\nexport function ContextSheet({ onClose }: { onClose: () => void }) {\n const { shell, t, switchTo } = useShell();\n const [organization, outer, inner] = shell.context.levels;\n return (\n <Sheet label={t('Where you are')} side=\"bottom\" onClose={onClose}>\n {organization !== undefined && (\n <section className=\"cbx-sheet-level\" aria-label={organization.label}>\n <LevelPane\n level={organization}\n currentId={organization.current.id}\n heading={pluralOf(organization)}\n createLabel={t('New {thing}', { thing: organization.label.toLowerCase() })}\n onPick={item => switchTo({ [organization.key]: item.id })}\n />\n </section>\n )}\n {outer !== undefined && (\n <section className=\"cbx-sheet-level\" aria-label={outer.label}>\n <LevelPane\n level={outer}\n parent={organization?.current.id}\n currentId={outer.current.id}\n heading={pluralOf(outer)}\n createLabel={t('New {thing}', { thing: outer.label.toLowerCase() })}\n onPick={item => void pickKeepingEnvironment(outer, inner, item, switchTo)}\n />\n </section>\n )}\n {outer !== undefined && inner !== undefined && (\n <section className=\"cbx-sheet-level\" aria-label={inner.label}>\n <LevelPane\n level={inner}\n parent={outer.current.id}\n currentId={inner.current.id}\n heading={t('{things} in {name}', { things: pluralOf(inner), name: outer.current.name })}\n createLabel={t('New {thing} in {name}', { thing: inner.label.toLowerCase(), name: outer.current.name })}\n onPick={item => switchTo({ [outer.key]: outer.current.id, [inner.key]: item.id })}\n />\n </section>\n )}\n </Sheet>\n );\n}\n","import { ArrowRight, BookOpen, Building2, CornerDownLeft, FileText, Search, Sparkles, Zap } from 'lucide-react';\nimport { useEffect, useId, useMemo, useRef, useState, type KeyboardEvent, type ReactNode } from 'react';\nimport { initialsOf, requestJson, safeUrl, withQuery } from './data';\nimport { parseArticles, type HelpArticle } from './help-store';\nimport { resolveIcon } from './icons';\nimport { navUrl } from './nav-pages';\nimport { canAutofocus } from './media';\nimport { revealInList, trapTab } from './popover';\nimport { useShell } from './context';\nimport { DEBOUNCE_MS } from './use-list';\nimport type { Shell } from './types';\n\nexport const GROUP_LIMIT = 5;\n\nexport type PaletteGroupKey = 'pages' | 'records' | 'actions' | 'goto' | 'docs' | 'ask';\n\n/** One result. `run` does what Enter does; `href` is what ⌘Enter opens in a new tab. */\nexport type PaletteItem = {\n id: string;\n title: string;\n subtitle?: string;\n icon?: ReactNode;\n href?: string;\n run: (newTab: boolean) => void;\n};\n\ntype GroupState = { status: 'idle' | 'loading' | 'ready' | 'error'; items: PaletteItem[] };\n\n/** Matches `query` against words: every term must be found. Ranks prefix matches first. */\nexport function matchScore(text: string, query: string): number {\n const haystack = text.toLowerCase();\n const terms = query.toLowerCase().trim().split(/\\s+/).filter(Boolean);\n if (terms.length === 0) return 1;\n let score = 0;\n for (const term of terms) {\n const at = haystack.indexOf(term);\n if (at < 0) return 0;\n score += at === 0 ? 3 : haystack[at - 1] === ' ' ? 2 : 1;\n }\n return score;\n}\n\nfunction localPages(shell: Shell, query: string, open: (url: string, newTab: boolean) => void, lockedLabel: string): PaletteItem[] {\n const entries: Array<{ id: string; title: string; subtitle?: string; url: string; icon?: string }> = [];\n for (const area of shell.nav.areas) {\n const areaUrl = navUrl(area);\n entries.push({ id: `area:${area.key}`, title: area.label, url: areaUrl, icon: area.icon });\n for (const page of area.pages ?? []) {\n const url = navUrl(page);\n if (url === areaUrl) continue;\n // A locked page is still found, and says so: it leads to the upgrade prompt.\n const subtitle = page.locked === true ? `${area.label} · ${lockedLabel}` : area.label;\n entries.push({ id: `page:${area.key}:${page.key}`, title: page.label, subtitle, url, icon: page.locked === true ? 'lock' : (page.icon ?? area.icon) });\n }\n }\n return entries\n .map(entry => ({ entry, score: matchScore(`${entry.title} ${entry.subtitle ?? ''}`, query) }))\n .filter(({ score }) => score > 0)\n .sort((a, b) => b.score - a.score)\n .map(({ entry }) => {\n const Icon = resolveIcon(entry.icon);\n return { id: entry.id, title: entry.title, subtitle: entry.subtitle, href: entry.url, icon: <Icon size={16} strokeWidth={1.8} aria-hidden />, run: (newTab: boolean) => open(entry.url, newTab) };\n });\n}\n\n/**\n * The rows of a list answer: a bare array, `{data: [...]}` (a context list), or console-kit's\n * search answer `{groups: [{key, items}]}`, of which `group`'s items.\n */\nfunction rows(body: unknown, group?: string): Array<Record<string, unknown>> {\n let data: unknown = Array.isArray(body) ? body : typeof body === 'object' && body !== null ? (body as { data?: unknown }).data : null;\n if (data === undefined && group !== undefined && typeof body === 'object' && body !== null) {\n const groups = (body as { groups?: unknown }).groups;\n const match = Array.isArray(groups) ? groups.find((g): g is { items?: unknown } => typeof g === 'object' && g !== null && (g as { key?: unknown }).key === group) : undefined;\n data = match?.items;\n }\n return Array.isArray(data) ? data.filter((row): row is Record<string, unknown> => typeof row === 'object' && row !== null) : [];\n}\n\n/**\n * ⌘K (§6): Pages, Records, Actions, Go to, Docs and Ask Cbox, in that order. Typing is\n * debounced 120 ms; the server groups load in parallel, each on its own, so a slow group never\n * holds up the others. ↑↓ move, Enter opens, ⌘Enter opens in a new tab, Esc closes.\n */\nexport function CommandPalette({ onClose }: { onClose: () => void }) {\n const { shell, t, navigate, switchTo, openArticle, ask } = useShell();\n const [input, setInput] = useState('');\n const [query, setQuery] = useState('');\n const [groups, setGroups] = useState<Partial<Record<PaletteGroupKey, GroupState>>>({});\n const [expanded, setExpanded] = useState<PaletteGroupKey | null>(null);\n // The active row is held by its id, not its place: a slow group arriving above it must not\n // move the highlight onto another result under a fast Enter (§12.1, nothing jumps).\n const [activeKey, setActiveKey] = useState<string | null>(null);\n const field = useRef<HTMLInputElement>(null);\n const dialog = useRef<HTMLDivElement>(null);\n const id = useId();\n const opener = useRef<Element | null>(typeof document !== 'undefined' ? document.activeElement : null);\n\n useEffect(() => {\n if (canAutofocus()) field.current?.focus();\n else dialog.current?.focus();\n const back = opener.current;\n return () => {\n if (back instanceof HTMLElement) back.focus();\n };\n }, []);\n\n useEffect(() => {\n const timer = setTimeout(() => setQuery(input), DEBOUNCE_MS);\n return () => clearTimeout(timer);\n }, [input]);\n\n // A new tab leaves the palette open, so the person can open several results.\n const open = (url: string, newTab: boolean) => {\n if (!newTab) onClose();\n navigate(url, { newTab });\n };\n\n // Server groups: each starts on its own and fills in when it answers.\n useEffect(() => {\n const q = query.trim();\n const controller = new AbortController();\n const run = (key: PaletteGroupKey, load: () => Promise<PaletteItem[]>) => {\n setGroups(current => ({ ...current, [key]: { status: 'loading', items: current[key]?.items ?? [] } }));\n load()\n .then(items => {\n if (!controller.signal.aborted) setGroups(current => ({ ...current, [key]: { status: 'ready', items } }));\n })\n .catch(() => {\n if (!controller.signal.aborted) setGroups(current => ({ ...current, [key]: { status: 'error', items: [] } }));\n });\n };\n const signal = controller.signal;\n if (q === '') {\n setGroups({});\n return () => controller.abort();\n }\n if (shell.palette.searchUrl !== undefined) {\n run('records', async () =>\n rows(await requestJson(withQuery(shell.palette.searchUrl!, { q, group: 'records' }), { signal }), 'records').flatMap(row => {\n const url = safeUrl(row.url);\n if (typeof row.title !== 'string' || url === undefined) return [];\n return [{ id: `record:${String(row.id ?? url)}`, title: row.title, subtitle: typeof row.subtitle === 'string' ? row.subtitle : undefined, href: url, icon: <FileText size={16} strokeWidth={1.8} aria-hidden />, run: (newTab: boolean) => open(url, newTab) }];\n }),\n );\n }\n const organization = shell.context.levels[0];\n run('goto', async () => {\n const loads: Array<Promise<PaletteItem[]>> = [];\n // console-kit answers \"Go to\" (organizations, and level 2 and 2 · 3 across them) from\n // its search endpoint; a host without one lists the organizations itself.\n const kitGoto = shell.palette.gotoUrl === undefined && shell.palette.searchUrl !== undefined;\n if (kitGoto) {\n loads.push(\n requestJson(withQuery(shell.palette.searchUrl!, { q, group: 'goto' }), { signal }).then(body =>\n rows(body, 'goto').flatMap(row => {\n const url = safeUrl(row.url);\n if (typeof row.title !== 'string' || url === undefined) return [];\n return [{ id: `goto:${String(row.id ?? url)}`, title: row.title, subtitle: typeof row.subtitle === 'string' ? row.subtitle : undefined, href: url, icon: <Building2 size={16} strokeWidth={1.8} aria-hidden />, run: (newTab: boolean) => open(url, newTab) }];\n }),\n ),\n );\n }\n if (organization !== undefined && !kitGoto) {\n loads.push(\n requestJson(withQuery(organization.listUrl, { q, limit: '5' }), { signal }).then(body =>\n rows(body).flatMap(row => {\n if ((typeof row.id !== 'string' && typeof row.id !== 'number') || typeof row.name !== 'string') return [];\n const orgId = String(row.id);\n return [{ id: `org:${orgId}`, title: row.name, subtitle: organization.label, icon: <span className=\"cbx-chip cbx-chip-soft\" aria-hidden=\"true\">{typeof row.initials === 'string' ? row.initials : initialsOf(row.name)}</span>, run: () => { onClose(); switchTo({ [organization.key]: orgId }); } }];\n }),\n ),\n );\n }\n if (shell.palette.gotoUrl !== undefined) {\n loads.push(\n requestJson(withQuery(shell.palette.gotoUrl, { q }), { signal }).then(body =>\n rows(body).flatMap(row => {\n if (typeof row.title !== 'string') return [];\n const levels = typeof row.levels === 'object' && row.levels !== null ? (row.levels as Record<string, string>) : null;\n const url = safeUrl(row.url);\n if (levels === null && url === undefined) return [];\n return [{ id: `goto:${row.title}:${String(row.subtitle ?? '')}`, title: row.title, subtitle: typeof row.subtitle === 'string' ? row.subtitle : undefined, href: url, icon: <Building2 size={16} strokeWidth={1.8} aria-hidden />, run: (newTab: boolean) => { if (levels !== null && !newTab) { onClose(); switchTo(levels); } else if (url !== undefined) open(url, newTab); } }];\n }),\n ),\n );\n }\n const settled = await Promise.allSettled(loads);\n if (settled.every(result => result.status === 'rejected') && settled.length > 0) throw new Error('unavailable');\n return settled.flatMap(result => (result.status === 'fulfilled' ? result.value : []));\n });\n if (shell.help.enabled && shell.help.searchUrl !== undefined) {\n run('docs', async () =>\n parseArticles(await requestJson(withQuery(shell.help.searchUrl!, { q, topic: shell.help.topic }), { signal })).map((article: HelpArticle) => ({\n id: `doc:${article.id}`,\n title: article.title,\n subtitle: article.excerpt,\n href: article.url,\n icon: <BookOpen size={16} strokeWidth={1.8} aria-hidden />,\n run: (newTab: boolean) => {\n if (newTab && article.url !== undefined) {\n navigate(article.url, { newTab: true });\n return;\n }\n onClose();\n openArticle(article);\n },\n })),\n );\n }\n return () => controller.abort();\n }, [query, shell]);\n\n const q = input.trim();\n const pages = useMemo(() => localPages(shell, q, open, t('Locked')), [shell, q, t]);\n const actions = useMemo<PaletteItem[]>(\n () =>\n shell.palette.actions\n .filter(action => matchScore(`${action.label} ${(action.keywords ?? []).join(' ')}`, q) > 0)\n .map(action => {\n const Icon = action.icon !== undefined ? resolveIcon(action.icon) : Zap;\n return {\n id: `action:${action.id}`,\n title: action.label,\n href: action.method === 'post' ? undefined : action.url,\n icon: <Icon size={16} strokeWidth={1.8} aria-hidden />,\n run: (newTab: boolean) => {\n if (!newTab) onClose();\n navigate(action.url, { method: action.method ?? 'get', newTab: newTab && action.method !== 'post' });\n },\n };\n }),\n [shell, q],\n );\n\n const sections: Array<{ key: PaletteGroupKey; label: string; state: GroupState }> = [\n { key: 'pages' as const, label: t('Pages'), state: { status: 'ready' as const, items: pages } },\n { key: 'records' as const, label: t('Records'), state: groups.records ?? { status: 'idle' as const, items: [] } },\n { key: 'actions' as const, label: t('Actions'), state: { status: 'ready' as const, items: actions } },\n { key: 'goto' as const, label: t('Go to'), state: groups.goto ?? { status: 'idle' as const, items: [] } },\n { key: 'docs' as const, label: t('Docs and help'), state: groups.docs ?? { status: 'idle' as const, items: [] } },\n ];\n if (q !== '') {\n sections.push({\n key: 'ask',\n label: t('Ask Cbox'),\n state: {\n status: 'ready',\n items: [{ id: 'ask', title: t('Ask Cbox: “{query}”', { query: q }), subtitle: t('About this page'), icon: <Sparkles size={16} strokeWidth={1.8} aria-hidden />, run: () => { onClose(); ask(q); } }],\n },\n });\n }\n\n // Flatten into options, with \"Show all in {group}\" after five.\n type Option = { kind: 'item'; item: PaletteItem; group: PaletteGroupKey } | { kind: 'all'; group: PaletteGroupKey; label: string };\n const options: Option[] = [];\n const rendered = sections.map(section => {\n const all = expanded === section.key;\n const items = all ? section.state.items : section.state.items.slice(0, GROUP_LIMIT);\n const start = options.length;\n items.forEach(item => options.push({ kind: 'item', item, group: section.key }));\n const more = !all && section.state.items.length > GROUP_LIMIT;\n if (more) options.push({ kind: 'all', group: section.key, label: t('Show all in {group}', { group: section.label }) });\n return { ...section, start, count: items.length + (more ? 1 : 0) };\n });\n\n const keyOf = (option: Option): string => (option.kind === 'item' ? `${option.group}:${option.item.id}` : `all:${option.group}`);\n const found = activeKey === null ? -1 : options.findIndex(option => keyOf(option) === activeKey);\n const active = found >= 0 ? found : 0;\n const setActive = (next: number | ((index: number) => number)) => {\n const index = typeof next === 'function' ? next(active) : next;\n const option = options[index];\n setActiveKey(option === undefined ? null : keyOf(option));\n };\n\n useEffect(() => {\n setActiveKey(null);\n }, [q]);\n // Pin the first result once there is one, so a group arriving above does not take its place.\n const firstKey = options[0] === undefined ? null : keyOf(options[0]);\n useEffect(() => {\n if (activeKey === null && firstKey !== null) setActiveKey(firstKey);\n }, [activeKey, firstKey]);\n useEffect(() => {\n revealInList(`${id}-${active}`);\n }, [active, id]);\n\n const choose = (option: Option | undefined, newTab: boolean) => {\n if (option === undefined) return;\n if (option.kind === 'all') {\n setExpanded(option.group);\n return;\n }\n if (newTab && option.item.href === undefined) return;\n option.item.run(newTab);\n };\n\n const onKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n const last = options.length - 1;\n if (event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n onClose();\n } else if (event.key === 'ArrowDown') {\n event.preventDefault();\n setActive(index => (index >= last ? 0 : index + 1));\n } else if (event.key === 'ArrowUp') {\n event.preventDefault();\n setActive(index => (index <= 0 ? last : index - 1));\n } else if (event.key === 'Enter') {\n event.preventDefault();\n choose(options[active], event.metaKey || event.ctrlKey);\n } else {\n trapTab(event, dialog.current);\n }\n };\n\n const activeOption = options[active];\n return (\n <div className=\"cbx-overlay cbx-palette-backdrop\" onPointerDown={event => { if (event.target === event.currentTarget) onClose(); }}>\n <div ref={dialog} className=\"cbx-palette\" role=\"dialog\" aria-modal=\"true\" aria-label={t('Search')} tabIndex={-1} onKeyDown={onKeyDown}>\n <div className=\"cbx-palette-search\">\n <Search size={18} strokeWidth={1.8} aria-hidden />\n <input\n ref={field}\n type=\"search\"\n role=\"combobox\"\n aria-expanded=\"true\"\n aria-controls={`${id}-list`}\n aria-activedescendant={activeOption !== undefined ? `${id}-${active}` : undefined}\n aria-autocomplete=\"list\"\n aria-label={shell.palette.placeholder ?? t('Search or ask…')}\n placeholder={shell.palette.placeholder ?? t('Search or ask…')}\n value={input}\n onChange={event => setInput(event.target.value)}\n autoComplete=\"off\"\n spellCheck={false}\n />\n <kbd className=\"cbx-kbd\">Esc</kbd>\n </div>\n <div id={`${id}-list`} role=\"listbox\" aria-label={t('Results')} className=\"cbx-palette-list\">\n {rendered.map(section => {\n const loading = section.state.status === 'loading' && section.state.items.length === 0;\n if (section.count === 0 && !loading) return null;\n return (\n <div key={section.key} role=\"group\" aria-labelledby={`${id}-${section.key}`} className=\"cbx-palette-group\">\n <div id={`${id}-${section.key}`} className=\"cbx-pane-heading\" role=\"presentation\">\n <span>{section.label}</span>\n {section.state.status === 'loading' && <span className=\"cbx-palette-busy\" aria-hidden=\"true\" />}\n </div>\n {loading && <div className=\"cbx-list-note\" aria-live=\"polite\">{t('Searching…')}</div>}\n {options.slice(section.start, section.start + section.count).map((option, offset) => {\n const index = section.start + offset;\n const on = index === active;\n return (\n <div\n key={option.kind === 'item' ? option.item.id : `all:${option.group}`}\n id={`${id}-${index}`}\n role=\"option\"\n aria-selected={on}\n className={`cbx-row ${on ? 'is-active' : ''} ${option.kind === 'all' ? 'cbx-row-more' : ''}`}\n onMouseMove={() => setActive(index)}\n onClick={event => choose(option, event.metaKey || event.ctrlKey)}\n >\n {option.kind === 'item' ? (\n <>\n <span className=\"cbx-row-icon\">{option.item.icon}</span>\n <span className=\"cbx-row-name\" title={option.item.title}>{option.item.title}</span>\n {option.item.subtitle !== undefined && <span className=\"cbx-row-label cbx-truncate\">{option.item.subtitle}</span>}\n {on && <CornerDownLeft className=\"cbx-row-trail\" size={14} strokeWidth={1.8} aria-hidden />}\n </>\n ) : (\n <>\n <span className=\"cbx-row-icon\"><ArrowRight size={16} strokeWidth={1.8} aria-hidden /></span>\n <span className=\"cbx-row-name\">{option.label}</span>\n </>\n )}\n </div>\n );\n })}\n </div>\n );\n })}\n {options.length === 0 && q !== '' && <div className=\"cbx-list-note\">{t('Nothing matches “{query}”.', { query: q })}</div>}\n </div>\n <div className=\"cbx-palette-foot\" aria-hidden=\"true\">\n <span><kbd className=\"cbx-kbd\">↑</kbd><kbd className=\"cbx-kbd\">↓</kbd> {t('move')}</span>\n <span><kbd className=\"cbx-kbd\">↵</kbd> {t('open')}</span>\n <span><kbd className=\"cbx-kbd\">⌘↵</kbd> {t('new tab')}</span>\n </div>\n </div>\n </div>\n );\n}\n","import { Bell, ChevronsUpDown, CircleHelp, LayoutGrid, Menu, PanelLeftClose, PanelLeftOpen, Pin, PinOff, Search } from 'lucide-react';\nimport { useCallback, useEffect, useMemo, useRef, useState, type AnchorHTMLAttributes, type ReactNode } from 'react';\nimport { useCboxLocalization } from '../context/localization';\nimport { useKnownAppCatalog } from '../components/app-icon';\nimport { AccountMenu, Avatar } from './account-menu';\nimport { AppGrid, forgetShellCatalog, hueFor } from './app-grid';\nimport { CascadeLabel, Chip, CascadeMenu, OrganizationMenu } from './context-menus';\nimport { ShellContext, useShell, type ShellApi, type ShellLinkComponent, type ShellOverlay } from './context';\nimport { initials } from '../app-switcher/catalog';\nimport { currentLocation, defaultNavigate, switchPayload } from './data';\nimport { HelpColumn, useHelpState } from './help';\nimport { helpVisible, sharedHelpStore, type HelpStore } from './help-store';\nimport { resolveIcon, type ShellIcon } from './icons';\nimport { HELP_DOCKED, MOBILE, matches, useMedia } from './media';\nimport { ContextSheet, NavSheet } from './mobile';\nimport { NavPageList, NavPageMarks, navUrl } from './nav-pages';\nimport { CommandPalette } from './palette';\nimport { Popover } from './popover';\nimport { scopeLists } from './use-list';\nimport type { Shell, ShellNavigate, ShellPreferenceChange, ShellPreferences, ShellTheme } from './types';\n\nexport type CboxShellProps = {\n /** The shared `shell` prop. */\n shell: Shell;\n /** The page. */\n children: ReactNode;\n /** How to move the person. Inertia: `(url, o) => router.visit(url, { method: o?.method, data: o?.data })`, plus `window.open` for `newTab`. Default: page loads and form posts. */\n navigate?: ShellNavigate;\n /** Client-side link for nav and settings links (Inertia's `Link`). Default `<a>`. */\n LinkComponent?: ShellLinkComponent;\n /** Extra icons by name, on top of the built-in Lucide set. */\n icons?: Readonly<Record<string, ShellIcon>>;\n /**\n * Called when the person changes a preference, for the host to persist (a cookie read before\n * first paint, and Cbox ID's preferences for theme, language, format and time zone). Without\n * it the shell writes a `cbox_shell_<key>` cookie.\n */\n onPreferenceChange?: ShellPreferenceChange;\n /** Help's state store. Default: one per page, so it outlives the shell's own remounts. */\n helpStore?: HelpStore;\n /** Where the Cbox wordmark is served. Default `/brand`. */\n brandAssetBase?: string;\n /** `id` of the `<main>` landmark, which the shell's \"Skip to content\" link targets. Default `main-content`. */\n mainId?: string;\n};\n\nconst PlainLink: ShellLinkComponent = ({ href, children, ...props }: AnchorHTMLAttributes<HTMLAnchorElement> & { href: string; children?: ReactNode }) => <a href={href} {...props}>{children}</a>;\n\nfunction writeCookie(key: string, value: unknown): void {\n if (typeof document === 'undefined') return;\n const name = `cbox_shell_${key.replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`)}`;\n document.cookie = `${name}=${encodeURIComponent(String(value))}; path=/; max-age=31536000; SameSite=Lax`;\n}\n\n/**\n * Apply a theme choice to the document the way the tokens read it: `.dark` and `data-theme` on\n * the root, with `system` following the device. The saved choice stays `system`; the device's\n * scheme is never written back (cbox-design, shared preferences).\n */\nexport function applyTheme(theme: ShellTheme): void {\n if (typeof document === 'undefined') return;\n const dark = theme === 'dark' || (theme === 'system' && typeof window.matchMedia === 'function' && window.matchMedia('(prefers-color-scheme: dark)').matches);\n const root = document.documentElement;\n root.classList.toggle('dark', dark);\n root.dataset.theme = dark ? 'dark' : 'light';\n root.dataset.themePreference = theme;\n root.style.colorScheme = dark ? 'dark' : 'light';\n}\n\n/**\n * The inline script a host puts in `<head>` so the theme is right before the first paint\n * (§12.1). `theme` is the person's saved choice from the `shell` prop.\n */\nexport function themeBootScript(theme: ShellTheme): string {\n const safe = theme === 'dark' || theme === 'light' ? theme : 'system';\n return `(function(){var t='${safe}';var d=t==='dark'||(t==='system'&&window.matchMedia&&matchMedia('(prefers-color-scheme: dark)').matches);var r=document.documentElement;r.classList.toggle('dark',d);r.dataset.theme=d?'dark':'light';r.dataset.themePreference=t;r.style.colorScheme=d?'dark':'light';})();`;\n}\n\nfunction useIsMac(): boolean {\n const [mac, setMac] = useState(true);\n useEffect(() => {\n setMac(/Mac|iPhone|iPad/i.test(navigator.platform || navigator.userAgent));\n }, []);\n return mac;\n}\n\n/**\n * The one shell for every Cbox app (spec 2026-11-10 shell v1): rail with the account at the\n * bottom, subnav, header with the context selectors, Search, Help, the bell when the app has a\n * source, Switch app; the ⌘K palette; the Help column; and the phone layout.\n *\n * Render it in the host's persistent layout (Inertia `Page.layout`), so the rail, Help and the\n * chat survive page visits; only `shell` and `children` change.\n */\nexport function CboxShell({ shell, children, navigate = defaultNavigate, LinkComponent = PlainLink, icons = {}, onPreferenceChange, helpStore, brandAssetBase = '/brand', mainId = 'main-content' }: CboxShellProps) {\n const { t } = useCboxLocalization();\n const [store] = useState(() => helpStore ?? sharedHelpStore());\n const [preferences, setPreferences] = useState<ShellPreferences>(shell.preferences);\n const [overlay, setOverlay] = useState<ShellOverlay>(null);\n\n // Help starts as the person left it, once per page; later visits keep the live state. Left\n // open, it shows docked from 1280px; below that it waits for the person (see `restored`).\n if (!store.get().seeded) store.set({ open: shell.preferences.helpOpen, restored: shell.preferences.helpOpen, seeded: true });\n\n // A new `shell` prop from the server wins for the preferences it carries.\n const serverPreferences = JSON.stringify(shell.preferences);\n useEffect(() => {\n setPreferences(JSON.parse(serverPreferences) as ShellPreferences);\n }, [serverPreferences]);\n\n const setPreference = useCallback<ShellPreferenceChange>(\n (key, value) => {\n setPreferences(current => ({ ...current, [key]: value }));\n if (key === 'theme') applyTheme(value as ShellTheme);\n if (onPreferenceChange !== undefined) onPreferenceChange(key, value);\n else writeCookie(key, value);\n },\n [onPreferenceChange],\n );\n\n const toggleHelp = useCallback(\n (open?: boolean) => {\n const next = open ?? !helpVisible(store.get(), matches(HELP_DOCKED));\n store.set({ open: next, restored: false });\n setPreference('helpOpen', next);\n },\n [store, setPreference],\n );\n\n const levels = shell.context.levels;\n const switchUrl = shell.context.switchUrl;\n\n // Lists and the app catalog kept from another context are never shown in this one.\n const scope = levels.map(level => `${level.key}:${level.current.id}`).join('|');\n if (scopeLists(scope)) forgetShellCatalog();\n const api = useMemo<ShellApi>(\n () => ({\n shell,\n t,\n navigate,\n Link: LinkComponent,\n icons,\n preferences,\n setPreference,\n overlay,\n setOverlay,\n help: store,\n toggleHelp,\n openArticle: article => {\n store.set({ article, open: true, restored: false });\n setPreference('helpOpen', true);\n },\n ask: question => {\n store.set({ open: true, restored: false, article: null, pendingQuestion: question });\n setPreference('helpOpen', true);\n },\n switchTo: chosen => {\n setOverlay(null);\n navigate(switchUrl, { method: 'post', data: switchPayload(levels, chosen, currentLocation()) });\n },\n }),\n [shell, t, navigate, LinkComponent, icons, preferences, setPreference, overlay, store, toggleHelp, levels, switchUrl],\n );\n\n const preferencesRef = useRef(preferences);\n preferencesRef.current = preferences;\n\n // ⌘K / Ctrl+K anywhere; ⌘. collapses the subnav.\n useEffect(() => {\n const keydown = (event: KeyboardEvent) => {\n if (!(event.metaKey || event.ctrlKey) || event.altKey) return;\n if (event.key.toLowerCase() === 'k') {\n event.preventDefault();\n setOverlay(current => (current === 'palette' ? null : 'palette'));\n } else if (event.key === '.') {\n event.preventDefault();\n setPreference('subnavCollapsed', !(preferencesRef.current.subnavCollapsed ?? false));\n }\n };\n window.addEventListener('keydown', keydown);\n return () => window.removeEventListener('keydown', keydown);\n }, [setPreference]);\n\n // A visit closes any open menu.\n const page = `${shell.nav.activeArea}|${shell.nav.activePage ?? ''}|${shell.page?.title ?? ''}`;\n useEffect(() => {\n setOverlay(current => (current === 'palette' ? current : null));\n }, [page]);\n\n const docked = useMedia(HELP_DOCKED, true);\n const mobile = useMedia(MOBILE, false);\n const testData = levels.some(level => level.current.testData === true);\n const helpOpen = useHelpState(store, state => helpVisible(state, docked));\n const banner = shell.banner !== undefined && (shell.banner.kind !== 'sandbox' || testData) ? shell.banner : undefined;\n\n return (\n <ShellContext.Provider value={api}>\n <div className=\"cbx-shell\" data-help-open={helpOpen}>\n <a\n className=\"cbx-skip-link\"\n href={`#${mainId}`}\n onClick={event => {\n const main = document.getElementById(mainId);\n if (main === null) return;\n event.preventDefault();\n main.focus();\n main.scrollIntoView?.({ block: 'start' });\n }}\n >\n {t('Skip to content')}\n </a>\n <Rail brandAssetBase={brandAssetBase} />\n <div className=\"cbx-shell-column\">\n <Header mobile={mobile} />\n {banner !== undefined && (\n <div className={`cbx-banner cbx-banner-${banner.kind}`} role=\"status\">\n <span className=\"cbx-banner-text\">{banner.text}</span>\n {banner.action !== undefined && <LinkComponent href={navUrl(banner.action)} className=\"cbx-banner-action\">{banner.action.label}</LinkComponent>}\n </div>\n )}\n <div className=\"cbx-shell-body\">\n <Subnav />\n <main id={mainId} tabIndex={-1} className=\"cbx-shell-main canvas-gradient\">{children}</main>\n </div>\n </div>\n <HelpColumn docked={docked} />\n {overlay === 'palette' && <CommandPalette onClose={() => setOverlay(null)} />}\n {overlay === 'nav-sheet' && <NavSheet onClose={() => setOverlay(null)} />}\n {overlay === 'context-sheet' && <ContextSheet onClose={() => setOverlay(null)} />}\n </div>\n </ShellContext.Provider>\n );\n}\n\nfunction AppMark() {\n const { shell } = useShell();\n const known = useKnownAppCatalog().find(app => app.key === shell.app.key);\n const [failed, setFailed] = useState(false);\n const style = { '--cbx-hue': String(hueFor(shell.app.key)) } as Record<string, string>;\n if (known?.icon_url && !failed) {\n return (\n <span className=\"cbx-app-mark\" aria-hidden=\"true\">\n <img src={known.icon_url} alt=\"\" className={known.icon_dark_url ? 'cbx-app-icon-light' : ''} onError={() => setFailed(true)} />\n {known.icon_dark_url && <img src={known.icon_dark_url} alt=\"\" className=\"cbx-app-icon-dark\" onError={() => setFailed(true)} />}\n </span>\n );\n }\n return <span className=\"cbx-app-mark cbx-app-tile\" style={style} aria-hidden=\"true\">{initials(shell.app.name.replace(/^Cbox\\s*·?\\s*/i, ''))}</span>;\n}\n\nfunction Rail({ brandAssetBase }: { brandAssetBase: string }) {\n const { shell, t, Link, icons, preferences, setPreference, overlay, setOverlay } = useShell();\n const [hovered, setHovered] = useState(false);\n const account = useRef<HTMLButtonElement>(null);\n const pinned = preferences.railPinned;\n const open = pinned || hovered || overlay === 'account';\n const name = shell.app.name.replace(/^Cbox\\s*·?\\s*/i, '');\n return (\n <div className=\"cbx-rail-slot\" data-pinned={pinned}>\n <aside\n className=\"cbx-rail\"\n data-open={open}\n aria-label={t('Main navigation')}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n onFocusCapture={() => setHovered(true)}\n onBlurCapture={event => {\n if (!event.currentTarget.contains(event.relatedTarget as Node | null)) setHovered(false);\n }}\n >\n <div className=\"cbx-rail-top\">\n <Link href={shell.app.homeUrl} className=\"cbx-rail-home\" aria-label={t('{app} home', { app: shell.app.name })}>\n <AppMark />\n <span className=\"cbx-rail-brand\" aria-hidden=\"true\">\n <img className=\"cbx-wordmark cbx-wordmark-light\" src={`${brandAssetBase}/cbox-logo.png`} srcSet={`${brandAssetBase}/cbox-logo.png 1x, ${brandAssetBase}/cbox-logo@2x.png 2x`} alt=\"\" height={19} />\n <img className=\"cbx-wordmark cbx-wordmark-dark\" src={`${brandAssetBase}/cbox-logo-white.png`} srcSet={`${brandAssetBase}/cbox-logo-white.png 1x, ${brandAssetBase}/cbox-logo-white@2x.png 2x`} alt=\"\" height={19} />\n <span className=\"cbx-rail-app\">{name}</span>\n </span>\n </Link>\n <button type=\"button\" className=\"cbx-icon-button cbx-rail-pin\" onClick={() => setPreference('railPinned', !pinned)} aria-label={pinned ? t('Unpin navigation') : t('Pin navigation')} aria-pressed={pinned} tabIndex={open ? 0 : -1}>\n {pinned ? <PinOff size={16} strokeWidth={1.8} aria-hidden /> : <Pin size={16} strokeWidth={1.8} aria-hidden />}\n </button>\n </div>\n <nav className=\"cbx-rail-nav\" aria-label={name}>\n {shell.nav.areas.map(area => {\n const Icon = resolveIcon(area.icon, icons);\n const active = area.key === shell.nav.activeArea;\n return (\n <Link key={area.key} href={navUrl(area)} className={`cbx-rail-link ${active ? 'is-active' : ''}`} aria-current={active ? 'page' : undefined} title={open ? undefined : area.label} aria-label={area.label}>\n <Icon size={18} strokeWidth={1.7} aria-hidden />\n <span className=\"cbx-rail-label\">{area.label}</span>\n </Link>\n );\n })}\n </nav>\n <div className=\"cbx-rail-foot\">\n <button\n ref={account}\n type=\"button\"\n className={`cbx-rail-account ${overlay === 'account' ? 'is-open' : ''}`}\n aria-haspopup=\"menu\"\n aria-expanded={overlay === 'account'}\n aria-label={t('Account and preferences')}\n onClick={() => setOverlay(overlay === 'account' ? null : 'account')}\n >\n <Avatar />\n <span className=\"cbx-rail-who\">\n <span className=\"cbx-rail-name cbx-truncate\">{shell.person.name}</span>\n <span className=\"cbx-rail-sub cbx-truncate\">{t('Account and preferences')}</span>\n </span>\n </button>\n </div>\n </aside>\n <Popover open={overlay === 'account'} anchor={account} placement=\"top-start\" label={t('Account')} onClose={() => setOverlay(null)}>\n <AccountMenu onDone={() => setOverlay(null)} />\n </Popover>\n </div>\n );\n}\n\nfunction Subnav() {\n const { shell, t, Link, preferences, setPreference } = useShell();\n const area = shell.nav.areas.find(item => item.key === shell.nav.activeArea);\n const pages = area?.pages ?? [];\n if (area === undefined || pages.length < 2) return null;\n const collapsed = preferences.subnavCollapsed ?? false;\n if (collapsed) {\n return (\n <aside className=\"cbx-subnav\" data-collapsed=\"true\" aria-label={area.label}>\n <button type=\"button\" className=\"cbx-subnav-strip\" onClick={() => setPreference('subnavCollapsed', false)} aria-label={t('Expand {area}', { area: area.label })} title=\"⌘.\">\n <PanelLeftOpen size={16} strokeWidth={1.8} aria-hidden />\n <span>{area.label}</span>\n </button>\n </aside>\n );\n }\n return (\n <aside className=\"cbx-subnav\" aria-label={area.label}>\n <div className=\"cbx-subnav-head\">\n <strong className=\"cbx-truncate\">{area.label}</strong>\n <button type=\"button\" className=\"cbx-icon-button\" onClick={() => setPreference('subnavCollapsed', true)} aria-label={t('Collapse {area}', { area: area.label })} title=\"⌘.\">\n <PanelLeftClose size={16} strokeWidth={1.8} aria-hidden />\n </button>\n </div>\n <nav aria-label={area.label} className=\"cbx-subnav-list\">\n <NavPageList\n pages={pages}\n renderPage={page => {\n const active = page.key === shell.nav.activePage;\n return (\n <Link key={page.key} href={navUrl(page)} className={`cbx-subnav-link ${active ? 'is-active' : ''} ${page.locked === true ? 'is-locked' : ''}`} aria-current={active ? 'page' : undefined} data-locked={page.locked === true ? 'true' : undefined}>\n <span className=\"cbx-truncate\" title={page.label}>{page.label}</span>\n <NavPageMarks page={page} />\n </Link>\n );\n }}\n />\n </nav>\n </aside>\n );\n}\n\nfunction Header({ mobile }: { mobile: boolean }) {\n const { shell, t, overlay, setOverlay, help, toggleHelp, Link } = useShell();\n const mac = useIsMac();\n const org = useRef<HTMLButtonElement>(null);\n const second = useRef<HTMLButtonElement>(null);\n const apps = useRef<HTMLButtonElement>(null);\n const docked = useMedia(HELP_DOCKED, true);\n const helpOpen = useHelpState(help, state => helpVisible(state, docked));\n const unread = useHelpState(help, state => state.updates.filter(update => update.unread).length);\n const [organization, ...rest] = shell.context.levels;\n const trail = shell.context.levels.map(level => level.current.name).join(' / ');\n const close = useCallback(() => setOverlay(null), [setOverlay]);\n\n return (\n <header className=\"cbx-header\">\n <button type=\"button\" className=\"cbx-icon-button cbx-only-mobile\" onClick={() => setOverlay('nav-sheet')} aria-label={t('Open navigation')} aria-haspopup=\"dialog\">\n <Menu size={20} strokeWidth={1.8} aria-hidden />\n </button>\n {organization !== undefined && (\n <div className=\"cbx-context cbx-only-desktop\">\n <button ref={org} type=\"button\" className={`cbx-trigger ${overlay === 'org' ? 'is-open' : ''}`} aria-haspopup=\"dialog\" aria-expanded={overlay === 'org'} aria-label={t('{level}: {name}', { level: organization.label, name: organization.current.name })} onClick={() => setOverlay(overlay === 'org' ? null : 'org')}>\n <Chip item={organization.current} tone=\"solid\" />\n <span className=\"cbx-trigger-text\" title={organization.current.name}>{organization.current.name}</span>\n <ChevronsUpDown className=\"cbx-trigger-chevron\" size={14} strokeWidth={1.8} aria-hidden />\n </button>\n {!mobile && (\n <Popover open={overlay === 'org'} anchor={org} label={organization.label} onClose={close}>\n <OrganizationMenu level={organization} />\n </Popover>\n )}\n {rest.length > 0 && (\n <>\n <span className=\"cbx-separator\" aria-hidden=\"true\">/</span>\n <button ref={second} type=\"button\" className={`cbx-trigger ${overlay === 'context' ? 'is-open' : ''}`} aria-haspopup=\"dialog\" aria-expanded={overlay === 'context'} aria-label={rest.map(level => t('{level}: {name}', { level: level.label, name: level.current.name })).join(', ')} onClick={() => setOverlay(overlay === 'context' ? null : 'context')}>\n <CascadeLabel levels={rest} />\n <ChevronsUpDown className=\"cbx-trigger-chevron\" size={14} strokeWidth={1.8} aria-hidden />\n </button>\n {!mobile && (\n <Popover open={overlay === 'context'} anchor={second} label={rest.map(level => level.label).join(' / ')} onClose={close}>\n <CascadeMenu levels={rest} parent={organization.current.id} />\n </Popover>\n )}\n </>\n )}\n </div>\n )}\n {organization !== undefined && (\n <button type=\"button\" className=\"cbx-trigger cbx-context-mobile cbx-only-mobile\" onClick={() => setOverlay('context-sheet')} aria-haspopup=\"dialog\" aria-label={t('Where you are: {trail}', { trail })}>\n <Chip item={organization.current} tone=\"solid\" />\n <span className=\"cbx-trigger-text\">{trail}</span>\n <ChevronsUpDown className=\"cbx-trigger-chevron\" size={14} strokeWidth={1.8} aria-hidden />\n </button>\n )}\n <div className=\"cbx-tools\">\n <button type=\"button\" className=\"cbx-search-button\" onClick={() => setOverlay('palette')} aria-label={t('Search or ask…')} aria-keyshortcuts={mac ? 'Meta+K' : 'Control+K'}>\n <Search size={16} strokeWidth={1.8} aria-hidden />\n <span className=\"cbx-search-label\">{t('Search or ask…')}</span>\n <kbd className=\"cbx-kbd\">{mac ? '⌘K' : 'Ctrl K'}</kbd>\n </button>\n <button type=\"button\" className={`cbx-tool ${helpOpen ? 'is-on' : ''}`} onClick={() => toggleHelp()} aria-pressed={helpOpen} aria-controls=\"cbx-help\" aria-label={unread > 0 ? t('Help, {count} unread', { count: unread }) : t('Help')}>\n <CircleHelp size={16} strokeWidth={1.8} aria-hidden />\n <span className=\"cbx-tool-label\">{t('Help')}</span>\n {unread > 0 && <span className=\"cbx-count\" aria-hidden=\"true\">{unread}</span>}\n </button>\n {shell.notifications.enabled && (\n <Link href={shell.notifications.url} className=\"cbx-tool cbx-tool-icon cbx-only-desktop\" aria-label={shell.notifications.unread > 0 ? t('Notifications, {count} unread', { count: shell.notifications.unread }) : t('Notifications')}>\n <Bell size={16} strokeWidth={1.8} aria-hidden />\n {shell.notifications.unread > 0 && <span className=\"cbx-count\" aria-hidden=\"true\">{shell.notifications.unread}</span>}\n </Link>\n )}\n <button ref={apps} type=\"button\" className={`cbx-tool cbx-tool-icon cbx-only-desktop ${overlay === 'apps' ? 'is-on' : ''}`} onClick={() => setOverlay(overlay === 'apps' ? null : 'apps')} aria-haspopup=\"dialog\" aria-expanded={overlay === 'apps'} aria-label={t('Switch app')} title={t('Switch app')}>\n <LayoutGrid size={16} strokeWidth={1.8} aria-hidden />\n </button>\n {!mobile && (\n <Popover open={overlay === 'apps'} anchor={apps} placement=\"bottom-end\" label={t('Switch app')} onClose={close}>\n <AppGrid />\n </Popover>\n )}\n </div>\n </header>\n );\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';\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 { createElement } from 'react';\nimport { useCboxLocalization } from '../context/localization';\nimport { defineCboxAppSwitcher } from '../app-switcher/elements';\nimport type { CboxThemeMode } from '../app-switcher/theme';\n\nexport {\n authorizeHref,\n parseAppCatalog,\n signInTarget,\n type CboxAppCatalogState,\n type CboxCatalogApp,\n} from '../app-switcher/catalog';\n\ndefineCboxAppSwitcher();\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. */\n currentAppKey: string;\n /**\n * How the theme is read. Default `auto`: `.dark`/`[data-theme]` on the root, else the\n * system scheme. `class` for a host whose tokens only turn dark under `.dark`.\n */\n theme?: CboxThemeMode;\n className?: string;\n};\n\n/**\n * The Switch-app control. It renders `<cbox-app-switcher>` from `@cboxdk/cbox-ui/app-switcher`,\n * the same element every Blade app uses, so React and Blade apps draw one identical control:\n * the live catalog from the host's endpoint, Cbox ID's light and dark icons, a quiet retry when\n * the catalog cannot be loaded, and straight to sign-in when the host answers `401 { signin_url }`.\n */\nexport function CboxAppCatalog({ endpoint, currentAppKey, theme, className }: CboxAppCatalogProps) {\n const { t } = useCboxLocalization();\n const labels = JSON.stringify({\n title: t('Switch app'),\n loading: t('Loading apps…'),\n empty: t('No apps available'),\n unavailable: t('Apps could not be loaded.'),\n });\n\n return createElement('cbox-app-switcher', {\n endpoint: endpoint ?? '',\n current: currentAppKey,\n labels,\n theme,\n className,\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","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","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 { useCboxLocalization } from '../context/localization';\nimport { useShellHelp } from '../shell/context';\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 /**\n * Show the `?` beside the title that toggles the shell's Help column (spec §7.1). The page's\n * help topic travels in `shell.help.topic`, set on the server per route (console-kit's\n * `helpTopic`), so Help knows the topic on the first paint and for pages without a header.\n * Ignored outside `CboxShell`.\n */\n help?: boolean;\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 help = false,\n className,\n}: Props) {\n const { t } = useCboxLocalization();\n const shellHelp = useShellHelp();\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 <div className=\"flex items-center gap-2\">\n <h1 className=\"text-2xl leading-tight font-semibold tracking-tight text-foreground\">\n {title}\n </h1>\n {help && shellHelp !== null ? (\n <button\n type=\"button\"\n onClick={() => shellHelp.toggleHelp()}\n aria-label={t('Help for this page')}\n aria-controls=\"cbx-help\"\n className=\"group inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-full focus-visible:outline-2 focus-visible:outline-ring [@media(pointer:coarse)]:h-11 [@media(pointer:coarse)]:w-11\"\n >\n {/* The ring stays small beside the title; the hit area is 32px, 44px on touch (§12.2). */}\n <span\n aria-hidden=\"true\"\n className=\"inline-flex h-6 w-6 items-center justify-center rounded-full border border-border text-xs font-semibold text-muted-foreground group-hover:border-accent-edge group-hover:text-primary\"\n >\n ?\n </span>\n </button>\n ) : null}\n </div>\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","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 (the bell) 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 </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 (the bell) 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","/**\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","/** 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"]}
|