@orangecheck/ui 0.5.0 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +55 -2
- package/dist/index.d.ts +55 -2
- package/dist/index.js +388 -69
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +385 -71
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ecosystem-switcher.tsx","../src/logo-dropdown.tsx","../src/app-shell.tsx","../src/section-header.tsx","../src/empty-state.tsx","../src/stat-grid.tsx"],"names":["useState","useRef","useEffect","jsxs","jsx","Boxes","ChevronDown","Link","Check","ENTRIES","useId","TONE_CLASS"],"mappings":"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","file":"index.js","sourcesContent":["import { Boxes, Check, ChevronDown } from 'lucide-react';\nimport Link from 'next/link';\nimport { useEffect, useRef, useState } from 'react';\n\n/**\n * EcosystemSwitcher — cross-product dropdown for jumping between every\n * site in the OrangeCheck family. Drop one into every site's LayoutHeader\n * and mark the active site via the `current` prop.\n *\n * <EcosystemSwitcher current=\"lock\" />\n *\n * The component is dependency-self-contained: no Radix, no Headless UI,\n * just outside-click + Escape handling so it works identically in every\n * site without forcing a peer-dep upgrade. Every link stays in-tab — the\n * family is one app from the user's POV.\n */\n\nexport type EcosystemSlug =\n | 'home'\n | 'docs'\n | 'fleet'\n | 'me'\n | 'vault'\n | 'attest'\n | 'lock'\n | 'vote'\n | 'stamp'\n | 'agent'\n | 'pledge';\n\ninterface SwitcherEntry {\n slug: EcosystemSlug;\n href: string;\n label: string;\n sub: string;\n docsHref: string;\n}\n\nconst ENTRIES: SwitcherEntry[] = [\n {\n slug: 'home',\n href: 'https://ochk.io',\n label: 'orangecheck',\n sub: 'umbrella',\n docsHref: 'https://docs.ochk.io',\n },\n {\n slug: 'docs',\n href: 'https://docs.ochk.io',\n label: 'oc·docs',\n sub: 'unified docs',\n docsHref: 'https://docs.ochk.io',\n },\n {\n slug: 'fleet',\n href: 'https://fleet.ochk.io',\n label: 'oc·fleet',\n sub: 'managed — agent fleet',\n docsHref: 'https://docs.ochk.io/fleet',\n },\n {\n slug: 'me',\n href: 'https://me.ochk.io',\n label: 'oc·me',\n sub: 'earn — consumer identity',\n docsHref: 'https://docs.ochk.io/me',\n },\n {\n slug: 'vault',\n href: 'https://vault.ochk.io',\n label: 'oc·vault',\n sub: 'keep — encrypted secrets',\n docsHref: 'https://docs.ochk.io/vault',\n },\n {\n slug: 'attest',\n href: 'https://attest.ochk.io',\n label: 'oc·attest',\n sub: 'am — sybil resistance',\n docsHref: 'https://docs.ochk.io/attest',\n },\n {\n slug: 'lock',\n href: 'https://lock.ochk.io',\n label: 'oc·lock',\n sub: 'whisper — encryption',\n docsHref: 'https://docs.ochk.io/lock',\n },\n {\n slug: 'vote',\n href: 'https://vote.ochk.io',\n label: 'oc·vote',\n sub: 'decide — polls',\n docsHref: 'https://docs.ochk.io/vote',\n },\n {\n slug: 'stamp',\n href: 'https://stamp.ochk.io',\n label: 'oc·stamp',\n sub: 'declare — block-anchored',\n docsHref: 'https://docs.ochk.io/stamp',\n },\n {\n slug: 'agent',\n href: 'https://agent.ochk.io',\n label: 'oc·agent',\n sub: 'delegate — scoped auth',\n docsHref: 'https://docs.ochk.io/agent',\n },\n {\n slug: 'pledge',\n href: 'https://pledge.ochk.io',\n label: 'oc·pledge',\n sub: 'swear — bonded commitment',\n docsHref: 'https://docs.ochk.io/pledge',\n },\n];\n\nexport interface EcosystemSwitcherProps {\n current: EcosystemSlug;\n className?: string;\n}\n\nexport function EcosystemSwitcher({\n current,\n className,\n}: EcosystemSwitcherProps) {\n const [open, setOpen] = useState(false);\n const containerRef = useRef<HTMLDivElement | null>(null);\n\n // Outside-click + Escape close.\n useEffect(() => {\n if (!open) return;\n function onDoc(e: MouseEvent) {\n if (!containerRef.current) return;\n if (!containerRef.current.contains(e.target as Node)) setOpen(false);\n }\n function onKey(e: KeyboardEvent) {\n if (e.key === 'Escape') setOpen(false);\n }\n document.addEventListener('mousedown', onDoc);\n document.addEventListener('keydown', onKey);\n return () => {\n document.removeEventListener('mousedown', onDoc);\n document.removeEventListener('keydown', onKey);\n };\n }, [open]);\n\n return (\n <div ref={containerRef} className={'relative ' + (className ?? '')}>\n <button\n type=\"button\"\n aria-haspopup=\"menu\"\n aria-expanded={open}\n aria-label=\"Switch OrangeCheck product\"\n title=\"Switch product\"\n onClick={() => setOpen((v) => !v)}\n className={\n 'inline-flex items-center gap-1 px-2 py-1 transition-colors ' +\n (open\n ? 'text-foreground'\n : 'text-muted-foreground hover:text-foreground')\n }\n >\n <Boxes className=\"h-4 w-4\" />\n <ChevronDown\n className={\n 'h-3.5 w-3.5 transition-transform ' + (open ? 'rotate-180' : '')\n }\n />\n </button>\n\n {open && (\n <div\n role=\"menu\"\n aria-label=\"Switch OrangeCheck product\"\n className=\"bg-background absolute right-0 top-full z-[60] mt-2 w-72 border shadow-lg\"\n >\n <div className=\"label-mono text-primary border-b px-4 py-2\">\n § the family\n </div>\n <ul className=\"py-1\">\n {ENTRIES.map((e) => {\n const isActive = e.slug === current;\n return (\n <li key={e.slug}>\n <Link\n href={e.href}\n onClick={() => setOpen(false)}\n aria-current={isActive ? 'page' : undefined}\n className={\n 'group flex items-baseline gap-3 px-4 py-2 transition-colors ' +\n (isActive\n ? 'bg-primary/5'\n : 'hover:bg-muted')\n }\n >\n <span\n className={\n 'font-display flex-1 text-[12px] font-semibold tracking-tight ' +\n (isActive\n ? 'text-primary'\n : 'text-foreground group-hover:text-primary transition-colors')\n }\n >\n {e.label}\n </span>\n <span className=\"text-muted-foreground font-mono text-[10px] tracking-wider uppercase\">\n {e.sub}\n </span>\n {isActive && (\n <Check className=\"text-primary h-3 w-3\" />\n )}\n </Link>\n </li>\n );\n })}\n </ul>\n <div className=\"border-t px-4 py-2 font-mono text-[10px] tracking-widest uppercase\">\n <Link\n href=\"https://docs.ochk.io\"\n onClick={() => setOpen(false)}\n className=\"text-muted-foreground hover:text-foreground inline-block transition-colors\"\n >\n docs.ochk.io →\n </Link>\n </div>\n </div>\n )}\n </div>\n );\n}\n","import { Check, ChevronDown } from 'lucide-react';\nimport Link from 'next/link';\nimport { useEffect, useId, useRef, useState, type ReactNode } from 'react';\n\nimport type { EcosystemSlug } from './ecosystem-switcher';\n\n/**\n * `<OcLogoDropdown>` — the logo IS the dropdown.\n *\n * Wraps a site's local LogoMark + wordmark in a button that, on click,\n * drops a popover listing every OrangeCheck family property. The current\n * property is highlighted with a primary-tinted background, a left-edge\n * accent bar, and a \"home\" label — and is itself a clickable link to\n * the local home href (default `/`).\n *\n * Family properties carry one of three categories:\n *\n * - `hub` — orangecheck umbrella + docs (no badge)\n * - `product` — commercial products (me, vault, fleet) · primary chip\n * - `protocol` — open verb specs (attest, lock, vote, stamp, agent,\n * pledge) · muted chip\n *\n * The category of the *current* site is auto-rendered as a tiny mono\n * chip inside the trigger button, and the dropdown itself groups\n * entries by category with subtle mono dividers — so the product /\n * protocol distinction is visible both on the logo and in the menu,\n * with a single source of truth (the `ENTRIES` table below).\n *\n * Mobile-aware: the popover's width is clamped to the viewport,\n * content scrolls when there are more entries than fit. The category\n * chip on the trigger hides below `sm` to preserve mobile header\n * space — the dropdown itself still shows the grouping.\n */\n\ntype Category = 'hub' | 'product' | 'protocol';\n\ninterface SwitcherEntry {\n slug: EcosystemSlug;\n href: string;\n label: string;\n sub: string;\n docsHref: string;\n category: Category;\n}\n\nconst ENTRIES: SwitcherEntry[] = [\n {\n slug: 'home',\n href: 'https://ochk.io',\n label: 'orangecheck',\n sub: 'umbrella · sign-in',\n docsHref: 'https://docs.ochk.io',\n category: 'hub',\n },\n {\n slug: 'docs',\n href: 'https://docs.ochk.io',\n label: 'oc·docs',\n sub: 'unified reference',\n docsHref: 'https://docs.ochk.io',\n category: 'hub',\n },\n {\n slug: 'me',\n href: 'https://me.ochk.io',\n label: 'oc·me',\n sub: 'earn — consumer identity',\n docsHref: 'https://docs.ochk.io/me',\n category: 'product',\n },\n {\n slug: 'vault',\n href: 'https://vault.ochk.io',\n label: 'oc·vault',\n sub: 'keep — encrypted secrets',\n docsHref: 'https://docs.ochk.io/vault',\n category: 'product',\n },\n {\n slug: 'fleet',\n href: 'https://fleet.ochk.io',\n label: 'oc·fleet',\n sub: 'managed — agent fleet',\n docsHref: 'https://docs.ochk.io/fleet',\n category: 'product',\n },\n {\n slug: 'attest',\n href: 'https://attest.ochk.io',\n label: 'oc·attest',\n sub: 'am — sybil resistance',\n docsHref: 'https://docs.ochk.io/attest',\n category: 'protocol',\n },\n {\n slug: 'lock',\n href: 'https://lock.ochk.io',\n label: 'oc·lock',\n sub: 'whisper — encryption',\n docsHref: 'https://docs.ochk.io/lock',\n category: 'protocol',\n },\n {\n slug: 'vote',\n href: 'https://vote.ochk.io',\n label: 'oc·vote',\n sub: 'decide — polls',\n docsHref: 'https://docs.ochk.io/vote',\n category: 'protocol',\n },\n {\n slug: 'stamp',\n href: 'https://stamp.ochk.io',\n label: 'oc·stamp',\n sub: 'declare — block-anchored',\n docsHref: 'https://docs.ochk.io/stamp',\n category: 'protocol',\n },\n {\n slug: 'agent',\n href: 'https://agent.ochk.io',\n label: 'oc·agent',\n sub: 'delegate — scoped auth',\n docsHref: 'https://docs.ochk.io/agent',\n category: 'protocol',\n },\n {\n slug: 'pledge',\n href: 'https://pledge.ochk.io',\n label: 'oc·pledge',\n sub: 'swear — bonded commitment',\n docsHref: 'https://docs.ochk.io/pledge',\n category: 'protocol',\n },\n];\n\nconst SECTIONS: Array<{ category: Category; label: string }> = [\n { category: 'hub', label: 'hub' },\n { category: 'product', label: 'products' },\n { category: 'protocol', label: 'protocols' },\n];\n\nexport interface OcLogoDropdownProps {\n /**\n * Which property this site IS. Used to highlight the active row,\n * route the active row's link to `homeHref` instead of the cross-\n * domain absolute URL, and pick the category chip rendered next\n * to the wordmark.\n */\n current: EcosystemSlug;\n /**\n * The site's local home path (for the active row). Default `/`.\n * Always a same-origin path — the logo's \"go home\" affordance is\n * preserved by clicking the highlighted row.\n */\n homeHref?: string;\n /**\n * Logo contents · typically `<LogoMark />` + `<span>oc·X</span>`.\n */\n children: ReactNode;\n /** className for the outer container. */\n className?: string;\n /** className for the trigger button. */\n triggerClassName?: string;\n /** className for the popover. */\n popoverClassName?: string;\n}\n\nfunction CategoryChip({ category }: { category: Category }) {\n if (category === 'hub') return null;\n const isProduct = category === 'product';\n return (\n <span\n aria-label={isProduct ? 'commercial product' : 'protocol reference'}\n className={\n 'ml-1 hidden rounded-sm border px-1.5 py-[1px] font-mono text-[9px] font-medium tracking-widest uppercase sm:inline-block ' +\n (isProduct\n ? 'border-primary/25 bg-primary/10 text-primary'\n : 'border-muted-foreground/20 bg-muted/40 text-muted-foreground/85')\n }\n data-oc-category={category}\n >\n {isProduct ? 'product' : 'protocol'}\n </span>\n );\n}\n\nfunction MenuCategoryChip({ category }: { category: Category }) {\n if (category === 'hub') return null;\n const isProduct = category === 'product';\n return (\n <span\n aria-hidden\n className={\n 'inline-block rounded-sm px-1 py-[1px] font-mono text-[9px] font-medium tracking-widest uppercase ' +\n (isProduct\n ? 'bg-primary/10 text-primary'\n : 'bg-muted/60 text-muted-foreground/80')\n }\n >\n {isProduct ? 'pro' : 'spec'}\n </span>\n );\n}\n\nexport function OcLogoDropdown({\n current,\n homeHref = '/',\n children,\n className,\n triggerClassName,\n popoverClassName,\n}: OcLogoDropdownProps) {\n const [open, setOpen] = useState(false);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const menuId = useId();\n\n const currentCategory: Category = ENTRIES.find((e) => e.slug === current)?.category ?? 'hub';\n\n // Outside-click + Escape close.\n useEffect(() => {\n if (!open) return;\n function onDoc(e: MouseEvent) {\n if (!containerRef.current) return;\n if (!containerRef.current.contains(e.target as Node)) setOpen(false);\n }\n function onKey(e: KeyboardEvent) {\n if (e.key === 'Escape') setOpen(false);\n }\n document.addEventListener('mousedown', onDoc);\n document.addEventListener('keydown', onKey);\n return () => {\n document.removeEventListener('mousedown', onDoc);\n document.removeEventListener('keydown', onKey);\n };\n }, [open]);\n\n return (\n <div\n ref={containerRef}\n className={'relative ' + (className ?? '')}\n data-oc-logo-dropdown=\"\"\n data-oc-current-category={currentCategory}\n >\n <button\n type=\"button\"\n aria-haspopup=\"menu\"\n aria-expanded={open}\n aria-controls={menuId}\n aria-label=\"OrangeCheck family · open property menu\"\n title=\"Switch OrangeCheck product\"\n onClick={() => setOpen((v) => !v)}\n className={\n triggerClassName ??\n 'group hover:bg-accent/30 -mx-1.5 -my-1 flex min-h-[40px] items-center gap-2 rounded-sm px-1.5 py-1 transition-colors'\n }\n data-oc-logo-dropdown-trigger=\"\"\n >\n {children}\n <CategoryChip category={currentCategory} />\n <ChevronDown\n aria-hidden\n className={\n 'text-muted-foreground/70 group-hover:text-foreground/80 h-3.5 w-3.5 shrink-0 transition-transform ' +\n (open ? 'rotate-180' : '')\n }\n />\n </button>\n\n {open && (\n <div\n id={menuId}\n role=\"menu\"\n aria-label=\"OrangeCheck family\"\n className={\n popoverClassName ??\n 'bg-background absolute top-full left-0 z-[60] mt-2 w-[min(20rem,calc(100vw-1rem))] border shadow-lg'\n }\n data-oc-logo-dropdown-popover=\"\"\n >\n <div className=\"label-mono text-primary border-b px-4 py-2\">\n § the orangecheck family\n </div>\n <div\n className=\"max-h-[min(28rem,70vh)] overflow-y-auto py-1\"\n role=\"none\"\n >\n {SECTIONS.map(({ category, label }) => {\n const sectionEntries = ENTRIES.filter((e) => e.category === category);\n if (sectionEntries.length === 0) return null;\n return (\n <div key={category} role=\"none\" data-oc-section={category}>\n <div\n role=\"separator\"\n aria-hidden\n className={\n 'text-muted-foreground/60 px-4 pt-2.5 pb-1 font-mono text-[9px] font-medium tracking-widest uppercase ' +\n (category === 'hub' ? '' : 'border-t mt-1')\n }\n >\n {label}\n </div>\n <ul role=\"none\" className=\"pb-1\">\n {sectionEntries.map((e) => {\n const isActive = e.slug === current;\n const href = isActive ? homeHref : e.href;\n return (\n <li key={e.slug} role=\"none\">\n <Link\n href={href}\n role=\"menuitem\"\n onClick={() => setOpen(false)}\n aria-current={isActive ? 'page' : undefined}\n className={\n 'group flex items-center gap-2 px-4 py-2 transition-colors ' +\n (isActive\n ? 'bg-primary/8 border-primary -ml-px border-l-2'\n : 'hover:bg-muted -ml-px border-l-2 border-transparent')\n }\n data-oc-logo-dropdown-item={\n isActive ? 'current' : 'sibling'\n }\n data-oc-entry-category={e.category}\n >\n <span className=\"flex min-w-0 flex-1 flex-col leading-tight\">\n <span\n className={\n 'font-display text-[12px] font-semibold tracking-tight ' +\n (isActive\n ? 'text-primary'\n : 'text-foreground group-hover:text-primary transition-colors')\n }\n >\n {e.label}\n </span>\n <span className=\"text-muted-foreground mt-0.5 font-mono text-[10px] tracking-wide\">\n {e.sub}\n </span>\n </span>\n <MenuCategoryChip category={e.category} />\n {isActive ? (\n <span className=\"text-primary inline-flex shrink-0 items-center gap-1 font-mono text-[10px] tracking-widest uppercase\">\n home\n <Check className=\"h-3 w-3\" />\n </span>\n ) : null}\n </Link>\n </li>\n );\n })}\n </ul>\n </div>\n );\n })}\n </div>\n <div className=\"border-t px-4 py-2 font-mono text-[10px] tracking-widest uppercase\">\n <Link\n href=\"https://docs.ochk.io\"\n onClick={() => setOpen(false)}\n className=\"text-muted-foreground hover:text-foreground inline-block transition-colors\"\n >\n docs.ochk.io →\n </Link>\n </div>\n </div>\n )}\n </div>\n );\n}\n","import type { ReactNode } from 'react';\n\n/**\n * AppShell — shared page chrome for every authenticated dashboard surface\n * across the OC family (vault, me, fleet, future). Lifted from oc-me-web's\n * `MeShell` and oc-vault-web's `VaultShell` — same eyebrow / title /\n * description / actions header band, no sidebar (sidebars are app-specific\n * and stay in the consuming app).\n *\n * Usage:\n * <AppShell eyebrow=\"§ vault\" title=\"your vault.\" description=\"…\">\n * ...\n * </AppShell>\n *\n * The component is stateless and dependency-free. Tailwind classes assume\n * the consuming site loads the family `globals.css` (which defines\n * `.container`, `.label-mono`, the dark-by-default palette, etc.).\n */\n\nexport interface AppShellProps {\n eyebrow?: ReactNode;\n title?: ReactNode;\n description?: ReactNode;\n /** Right-aligned action node rendered next to the title (e.g. CTA buttons). */\n headerActions?: ReactNode;\n children: ReactNode;\n className?: string;\n}\n\nexport function AppShell({\n eyebrow,\n title,\n description,\n headerActions,\n children,\n className,\n}: AppShellProps) {\n const hasHeader = Boolean(title);\n return (\n <div className={'container ' + (className ?? '')}>\n <div className=\"flex min-h-[calc(100vh-3rem)] flex-col\">\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <div className=\"pt-6 md:pt-8\">\n {hasHeader && (\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between\">\n <div className=\"max-w-3xl\">\n {eyebrow && (\n <div className=\"label-mono text-primary mb-3\">\n {eyebrow}\n </div>\n )}\n <h1 className=\"font-display text-2xl font-bold tracking-tight sm:text-3xl\">\n {title}\n </h1>\n {description && (\n <p className=\"text-muted-foreground mt-3 max-w-[64ch] text-sm leading-relaxed\">\n {description}\n </p>\n )}\n </div>\n {headerActions && (\n <div className=\"flex shrink-0 items-center gap-2\">\n {headerActions}\n </div>\n )}\n </div>\n )}\n <div className={hasHeader ? 'mt-8 pb-12' : 'pb-12'}>{children}</div>\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\n\nexport interface SectionHeaderProps {\n /** Plain section name — rendered after a \"§ \" glyph in label-mono. */\n label: string;\n /** Optional right-side string (count, \"most recent first\"). */\n meta?: ReactNode;\n tone?: 'primary' | 'muted' | 'warning' | 'success' | 'destructive';\n className?: string;\n}\n\nconst TONE_CLASS = {\n primary: 'text-primary',\n muted: 'text-muted-foreground',\n warning: 'text-warning',\n success: 'text-success',\n destructive: 'text-destructive',\n} as const;\n\n/**\n * SectionHeader — the canonical \"§ x\" section header used across every\n * /me, /vault, and /fleet dashboard surface. Lifted from oc-me-web's\n * `me/ui/SectionHeader` so the visual contract stays single-source.\n *\n * Pattern is `label-mono text-primary mb-3` with a \"§ \" glyph followed by\n * the label, plus an optional muted/uppercase right-side meta string.\n */\nexport function SectionHeader({\n label,\n meta,\n tone = 'primary',\n className = '',\n}: SectionHeaderProps) {\n return (\n <div className={`mb-3 flex items-baseline justify-between gap-2 ${className}`}>\n <div className=\"flex items-center gap-1.5\">\n <div className={`label-mono ${TONE_CLASS[tone]}`}>§ {label}</div>\n </div>\n {meta && (\n <span className=\"text-muted-foreground/70 font-mono text-[10px] tracking-widest uppercase\">\n {meta}\n </span>\n )}\n </div>\n );\n}\n","import Link from 'next/link';\nimport type { ReactNode } from 'react';\n\nexport interface EmptyStateCta {\n label: string;\n href: string;\n /** External links open in a new tab and get a ↗ glyph. */\n external?: boolean;\n}\n\nexport interface EmptyStateProps {\n /** Short heading — one mono-uppercased label like \"no entries yet\". */\n label: string;\n /** Body — short prose explaining what would appear here and how. */\n children: ReactNode;\n cta?: EmptyStateCta;\n secondary?: EmptyStateCta;\n tone?: 'info' | 'warning' | 'muted';\n className?: string;\n}\n\nconst TONE_CLASS = {\n info: 'border-primary/30 bg-primary/5',\n warning: 'border-warning/40 bg-warning/5',\n muted: 'border-border bg-muted/20',\n} as const;\n\nconst LABEL_TONE_CLASS = {\n info: 'text-primary',\n warning: 'text-warning',\n muted: 'text-muted-foreground',\n} as const;\n\n/**\n * EmptyState — the canonical empty-state card used across every /me,\n * /vault, and /fleet dashboard. Empty states should *teach*: explain what\n * would appear, and how to make it appear. Lifted from oc-me-web's\n * `me/ui/EmptyState`.\n */\nexport function EmptyState({\n label,\n children,\n cta,\n secondary,\n tone = 'info',\n className = '',\n}: EmptyStateProps) {\n return (\n <div className={`border p-5 md:p-6 ${TONE_CLASS[tone]} ${className}`}>\n <div className={`label-mono mb-2 ${LABEL_TONE_CLASS[tone]}`}>§ {label}</div>\n <div className=\"text-foreground/85 max-w-2xl text-sm leading-relaxed\">{children}</div>\n {(cta || secondary) && (\n <div className=\"mt-4 flex flex-wrap gap-3\">\n {cta && <CtaLink {...cta} variant=\"primary\" />}\n {secondary && <CtaLink {...secondary} variant=\"secondary\" />}\n </div>\n )}\n </div>\n );\n}\n\nfunction CtaLink({\n label,\n href,\n external,\n variant,\n}: EmptyStateCta & { variant: 'primary' | 'secondary' }) {\n const cls =\n variant === 'primary'\n ? 'bg-primary text-primary-foreground hover:bg-primary/90 inline-flex h-9 items-center justify-center rounded-md px-4 font-mono text-[11px] font-semibold tracking-widest uppercase'\n : 'text-muted-foreground hover:text-foreground border-input hover:bg-accent inline-flex h-9 items-center justify-center rounded-md border px-4 font-mono text-[11px] tracking-widest uppercase';\n const text = external ? `${label} ↗` : label;\n if (external) {\n return (\n <a href={href} target=\"_blank\" rel=\"noreferrer\" className={cls}>\n {text}\n </a>\n );\n }\n return (\n <Link href={href} className={cls}>\n {text}\n </Link>\n );\n}\n","import type { ReactNode } from 'react';\n\nexport interface StatItem {\n /** Short uppercased label rendered in mono. */\n label: string;\n /** Primary value · already formatted as a string. */\n value: string;\n /** Optional secondary line · USD conversion, \"last 30 days\", etc. */\n sub?: string;\n /** When true, value is rendered in primary tone (use for headline metric). */\n accent?: boolean;\n /** Optional tone for the value (overrides accent). */\n tone?: 'default' | 'primary' | 'success' | 'warning' | 'destructive' | 'muted';\n}\n\nexport interface StatGridProps {\n items: StatItem[];\n columns?: 1 | 2 | 3 | 4;\n className?: string;\n}\n\nconst TONE_CLASS = {\n default: '',\n primary: 'text-primary',\n success: 'text-success',\n warning: 'text-warning',\n destructive: 'text-destructive',\n muted: 'text-muted-foreground',\n} as const;\n\nconst COL_CLASS = {\n 1: '',\n 2: 'md:grid-cols-2',\n 3: 'md:grid-cols-3',\n 4: 'md:grid-cols-2 lg:grid-cols-4',\n} as const;\n\n/**\n * StatGrid — the canonical stats row used across family dashboards.\n * Lifted from oc-me-web's `me/ui/StatGrid`. Grid of equal-width tiles\n * separated by 1px borders. Always pre-format the value string —\n * the component does no number formatting.\n */\nexport function StatGrid({ items, columns = 3, className = '' }: StatGridProps) {\n return (\n <div className={`bg-border grid gap-px border ${COL_CLASS[columns]} ${className}`}>\n {items.map((it, i) => (\n <Tile key={`${it.label}-${i}`} item={it} />\n ))}\n </div>\n );\n}\n\nfunction Tile({ item }: { item: StatItem }) {\n const tone = item.tone ?? (item.accent ? 'primary' : 'default');\n return (\n <div className=\"bg-background p-5\">\n <div className=\"text-muted-foreground/80 font-mono text-[10px] tracking-widest uppercase\">\n {item.label}\n </div>\n <div\n className={`font-display mt-1 text-2xl font-bold tabular-nums tracking-tight ${TONE_CLASS[tone]}`}\n >\n {item.value}\n </div>\n {item.sub && (\n <div className=\"text-muted-foreground/70 mt-1 font-mono text-[10px] tracking-widest uppercase\">\n {item.sub}\n </div>\n )}\n </div>\n );\n}\n\nexport function StatTile({ children, ...item }: StatItem & { children?: ReactNode }) {\n return (\n <div>\n <Tile item={item} />\n {children}\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/ecosystem-switcher.tsx","../src/family-properties.ts","../src/logo-dropdown.tsx","../src/account-menu.tsx","../src/app-shell.tsx","../src/section-header.tsx","../src/empty-state.tsx","../src/stat-grid.tsx"],"names":["useState","useRef","useEffect","jsxs","jsx","Boxes","ChevronDown","Link","Check","useId","useOcSession","Fragment","TONE_CLASS"],"mappings":";;;;;;;;;;;;;AAsCA,IAAM,OAAA,GAA2B;AAAA,EAC7B;AAAA,IACI,IAAA,EAAM,MAAA;AAAA,IACN,IAAA,EAAM,iBAAA;AAAA,IACN,KAAA,EAAO,aAAA;AAAA,IACP,GAAA,EAAK,UAAA;AAAA,IACL,QAAA,EAAU;AAAA,GACd;AAAA,EACA;AAAA,IACI,IAAA,EAAM,MAAA;AAAA,IACN,IAAA,EAAM,sBAAA;AAAA,IACN,KAAA,EAAO,YAAA;AAAA,IACP,GAAA,EAAK,cAAA;AAAA,IACL,QAAA,EAAU;AAAA,GACd;AAAA,EACA;AAAA,IACI,IAAA,EAAM,OAAA;AAAA,IACN,IAAA,EAAM,uBAAA;AAAA,IACN,KAAA,EAAO,aAAA;AAAA,IACP,GAAA,EAAK,4BAAA;AAAA,IACL,QAAA,EAAU;AAAA,GACd;AAAA,EACA;AAAA,IACI,IAAA,EAAM,IAAA;AAAA,IACN,IAAA,EAAM,oBAAA;AAAA,IACN,KAAA,EAAO,UAAA;AAAA,IACP,GAAA,EAAK,+BAAA;AAAA,IACL,QAAA,EAAU;AAAA,GACd;AAAA,EACA;AAAA,IACI,IAAA,EAAM,OAAA;AAAA,IACN,IAAA,EAAM,uBAAA;AAAA,IACN,KAAA,EAAO,aAAA;AAAA,IACP,GAAA,EAAK,+BAAA;AAAA,IACL,QAAA,EAAU;AAAA,GACd;AAAA,EACA;AAAA,IACI,IAAA,EAAM,QAAA;AAAA,IACN,IAAA,EAAM,wBAAA;AAAA,IACN,KAAA,EAAO,cAAA;AAAA,IACP,GAAA,EAAK,4BAAA;AAAA,IACL,QAAA,EAAU;AAAA,GACd;AAAA,EACA;AAAA,IACI,IAAA,EAAM,MAAA;AAAA,IACN,IAAA,EAAM,sBAAA;AAAA,IACN,KAAA,EAAO,YAAA;AAAA,IACP,GAAA,EAAK,2BAAA;AAAA,IACL,QAAA,EAAU;AAAA,GACd;AAAA,EACA;AAAA,IACI,IAAA,EAAM,MAAA;AAAA,IACN,IAAA,EAAM,sBAAA;AAAA,IACN,KAAA,EAAO,YAAA;AAAA,IACP,GAAA,EAAK,qBAAA;AAAA,IACL,QAAA,EAAU;AAAA,GACd;AAAA,EACA;AAAA,IACI,IAAA,EAAM,OAAA;AAAA,IACN,IAAA,EAAM,uBAAA;AAAA,IACN,KAAA,EAAO,aAAA;AAAA,IACP,GAAA,EAAK,+BAAA;AAAA,IACL,QAAA,EAAU;AAAA,GACd;AAAA,EACA;AAAA,IACI,IAAA,EAAM,OAAA;AAAA,IACN,IAAA,EAAM,uBAAA;AAAA,IACN,KAAA,EAAO,aAAA;AAAA,IACP,GAAA,EAAK,6BAAA;AAAA,IACL,QAAA,EAAU;AAAA,GACd;AAAA,EACA;AAAA,IACI,IAAA,EAAM,QAAA;AAAA,IACN,IAAA,EAAM,wBAAA;AAAA,IACN,KAAA,EAAO,cAAA;AAAA,IACP,GAAA,EAAK,gCAAA;AAAA,IACL,QAAA,EAAU;AAAA;AAElB,CAAA;AAOO,SAAS,iBAAA,CAAkB;AAAA,EAC9B,OAAA;AAAA,EACA;AACJ,CAAA,EAA2B;AACvB,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,eAAS,KAAK,CAAA;AACtC,EAAA,MAAM,YAAA,GAAeC,aAA8B,IAAI,CAAA;AAGvD,EAAAC,eAAA,CAAU,MAAM;AACZ,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,SAAS,MAAM,CAAA,EAAe;AAC1B,MAAA,IAAI,CAAC,aAAa,OAAA,EAAS;AAC3B,MAAA,IAAI,CAAC,aAAa,OAAA,CAAQ,QAAA,CAAS,EAAE,MAAc,CAAA,UAAW,KAAK,CAAA;AAAA,IACvE;AACA,IAAA,SAAS,MAAM,CAAA,EAAkB;AAC7B,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,QAAA,EAAU,OAAA,CAAQ,KAAK,CAAA;AAAA,IACzC;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,KAAK,CAAA;AAC5C,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,KAAK,CAAA;AAC1C,IAAA,OAAO,MAAM;AACT,MAAA,QAAA,CAAS,mBAAA,CAAoB,aAAa,KAAK,CAAA;AAC/C,MAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,KAAK,CAAA;AAAA,IACjD,CAAA;AAAA,EACJ,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,uCACK,KAAA,EAAA,EAAI,GAAA,EAAK,cAAc,SAAA,EAAW,WAAA,IAAe,aAAa,EAAA,CAAA,EAC3D,QAAA,EAAA;AAAA,oBAAAC,eAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACG,IAAA,EAAK,QAAA;AAAA,QACL,eAAA,EAAc,MAAA;AAAA,QACd,eAAA,EAAe,IAAA;AAAA,QACf,YAAA,EAAW,4BAAA;AAAA,QACX,KAAA,EAAM,gBAAA;AAAA,QACN,SAAS,MAAM,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AAAA,QAChC,SAAA,EACI,6DAAA,IACC,IAAA,GACK,iBAAA,GACA,6CAAA,CAAA;AAAA,QAGV,QAAA,EAAA;AAAA,0BAAAC,cAAA,CAACC,iBAAA,EAAA,EAAM,WAAU,SAAA,EAAU,CAAA;AAAA,0BAC3BD,cAAA;AAAA,YAACE,uBAAA;AAAA,YAAA;AAAA,cACG,SAAA,EACI,mCAAA,IAAuC,IAAA,GAAO,YAAA,GAAe,EAAA;AAAA;AAAA;AAErE;AAAA;AAAA,KACJ;AAAA,IAEC,IAAA,oBACGH,eAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACG,IAAA,EAAK,MAAA;AAAA,QACL,YAAA,EAAW,4BAAA;AAAA,QACX,SAAA,EAAU,2EAAA;AAAA,QAEV,QAAA,EAAA;AAAA,0BAAAC,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4CAAA,EAA6C,QAAA,EAAA,iBAAA,EAE5D,CAAA;AAAA,yCACC,IAAA,EAAA,EAAG,SAAA,EAAU,QACT,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM;AAChB,YAAA,MAAM,QAAA,GAAW,EAAE,IAAA,KAAS,OAAA;AAC5B,YAAA,sCACK,IAAA,EAAA,EACG,QAAA,kBAAAD,eAAA;AAAA,cAACI,qBAAA;AAAA,cAAA;AAAA,gBACG,MAAM,CAAA,CAAE,IAAA;AAAA,gBACR,OAAA,EAAS,MAAM,OAAA,CAAQ,KAAK,CAAA;AAAA,gBAC5B,cAAA,EAAc,WAAW,MAAA,GAAS,MAAA;AAAA,gBAClC,SAAA,EACI,8DAAA,IACC,QAAA,GACK,cAAA,GACA,gBAAA,CAAA;AAAA,gBAGV,QAAA,EAAA;AAAA,kCAAAH,cAAA;AAAA,oBAAC,MAAA;AAAA,oBAAA;AAAA,sBACG,SAAA,EACI,+DAAA,IACC,QAAA,GACK,cAAA,GACA,4DAAA,CAAA;AAAA,sBAGT,QAAA,EAAA,CAAA,CAAE;AAAA;AAAA,mBACP;AAAA,kCACAA,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sEAAA,EACX,YAAE,GAAA,EACP,CAAA;AAAA,kBACC,QAAA,oBACGA,cAAA,CAACI,iBAAA,EAAA,EAAM,SAAA,EAAU,sBAAA,EAAuB;AAAA;AAAA;AAAA,aAEhD,EAAA,EA5BK,EAAE,IA6BX,CAAA;AAAA,UAER,CAAC,CAAA,EACL,CAAA;AAAA,0BACAJ,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oEAAA,EACX,QAAA,kBAAAA,cAAA;AAAA,YAACG,qBAAA;AAAA,YAAA;AAAA,cACG,IAAA,EAAK,sBAAA;AAAA,cACL,OAAA,EAAS,MAAM,OAAA,CAAQ,KAAK,CAAA;AAAA,cAC5B,SAAA,EAAU,4EAAA;AAAA,cACb,QAAA,EAAA;AAAA;AAAA,WAED,EACJ;AAAA;AAAA;AAAA;AACJ,GAAA,EAER,CAAA;AAER;;;ACvMO,IAAM,iBAAA,GAAmD;AAAA,EAC5D;AAAA,IACI,IAAA,EAAM,MAAA;AAAA,IACN,MAAA,EAAQ,iBAAA;AAAA,IACR,QAAA,EAAU,SAAA;AAAA,IACV,KAAA,EAAO,aAAA;AAAA,IACP,GAAA,EAAK,uBAAA;AAAA,IACL,QAAA,EAAU,sBAAA;AAAA,IACV,QAAA,EAAU;AAAA,GACd;AAAA,EACA;AAAA,IACI,IAAA,EAAM,MAAA;AAAA,IACN,MAAA,EAAQ,sBAAA;AAAA,IACR,QAAA,EAAU,cAAA;AAAA,IACV,KAAA,EAAO,YAAA;AAAA,IACP,GAAA,EAAK,mBAAA;AAAA,IACL,QAAA,EAAU,sBAAA;AAAA,IACV,QAAA,EAAU;AAAA,GACd;AAAA,EACA;AAAA,IACI,IAAA,EAAM,IAAA;AAAA,IACN,MAAA,EAAQ,oBAAA;AAAA,IACR,QAAA,EAAU,YAAA;AAAA,IACV,KAAA,EAAO,UAAA;AAAA,IACP,GAAA,EAAK,+BAAA;AAAA,IACL,QAAA,EAAU,yBAAA;AAAA,IACV,QAAA,EAAU;AAAA,GACd;AAAA,EACA;AAAA,IACI,IAAA,EAAM,OAAA;AAAA,IACN,MAAA,EAAQ,uBAAA;AAAA,IACR,QAAA,EAAU,eAAA;AAAA,IACV,KAAA,EAAO,aAAA;AAAA,IACP,GAAA,EAAK,+BAAA;AAAA,IACL,QAAA,EAAU,4BAAA;AAAA,IACV,QAAA,EAAU;AAAA,GACd;AAAA,EACA;AAAA,IACI,IAAA,EAAM,OAAA;AAAA,IACN,MAAA,EAAQ,uBAAA;AAAA,IACR,QAAA,EAAU,eAAA;AAAA,IACV,KAAA,EAAO,aAAA;AAAA,IACP,GAAA,EAAK,4BAAA;AAAA,IACL,QAAA,EAAU,4BAAA;AAAA,IACV,QAAA,EAAU;AAAA,GACd;AAAA,EACA;AAAA,IACI,IAAA,EAAM,QAAA;AAAA,IACN,MAAA,EAAQ,wBAAA;AAAA,IACR,QAAA,EAAU,gBAAA;AAAA,IACV,KAAA,EAAO,cAAA;AAAA,IACP,GAAA,EAAK,4BAAA;AAAA,IACL,QAAA,EAAU,6BAAA;AAAA,IACV,QAAA,EAAU;AAAA,GACd;AAAA,EACA;AAAA,IACI,IAAA,EAAM,MAAA;AAAA,IACN,MAAA,EAAQ,sBAAA;AAAA,IACR,QAAA,EAAU,cAAA;AAAA,IACV,KAAA,EAAO,YAAA;AAAA,IACP,GAAA,EAAK,2BAAA;AAAA,IACL,QAAA,EAAU,2BAAA;AAAA,IACV,QAAA,EAAU;AAAA,GACd;AAAA,EACA;AAAA,IACI,IAAA,EAAM,MAAA;AAAA,IACN,MAAA,EAAQ,sBAAA;AAAA,IACR,QAAA,EAAU,cAAA;AAAA,IACV,KAAA,EAAO,YAAA;AAAA,IACP,GAAA,EAAK,qBAAA;AAAA,IACL,QAAA,EAAU,2BAAA;AAAA,IACV,QAAA,EAAU;AAAA,GACd;AAAA,EACA;AAAA,IACI,IAAA,EAAM,OAAA;AAAA,IACN,MAAA,EAAQ,uBAAA;AAAA,IACR,QAAA,EAAU,eAAA;AAAA,IACV,KAAA,EAAO,aAAA;AAAA,IACP,GAAA,EAAK,+BAAA;AAAA,IACL,QAAA,EAAU,4BAAA;AAAA,IACV,QAAA,EAAU;AAAA,GACd;AAAA,EACA;AAAA,IACI,IAAA,EAAM,OAAA;AAAA,IACN,MAAA,EAAQ,uBAAA;AAAA,IACR,QAAA,EAAU,eAAA;AAAA,IACV,KAAA,EAAO,aAAA;AAAA,IACP,GAAA,EAAK,6BAAA;AAAA,IACL,QAAA,EAAU,4BAAA;AAAA,IACV,QAAA,EAAU;AAAA,GACd;AAAA,EACA;AAAA,IACI,IAAA,EAAM,QAAA;AAAA,IACN,MAAA,EAAQ,wBAAA;AAAA,IACR,QAAA,EAAU,gBAAA;AAAA,IACV,KAAA,EAAO,cAAA;AAAA,IACP,GAAA,EAAK,gCAAA;AAAA,IACL,QAAA,EAAU,6BAAA;AAAA,IACV,QAAA,EAAU;AAAA;AAElB;AAgBO,IAAM,gBAAA,GAA+D;AAAA,EACxE,KAAA,EAAO,OAAA;AAAA,EACP,IAAA,EAAM;AACV;AAGO,SAAS,mBAAmB,IAAA,EAAiD;AAChF,EAAA,OAAO,kBAAkB,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,IAAI,CAAA;AACxD;AC5GA,IAAM,QAAA,GAA+D;AAAA,EACjE,EAAE,QAAA,EAAU,KAAA,EAAO,KAAA,EAAO,KAAA,EAAM;AAAA,EAChC,EAAE,QAAA,EAAU,SAAA,EAAW,KAAA,EAAO,UAAA,EAAW;AAAA,EACzC,EAAE,QAAA,EAAU,UAAA,EAAY,KAAA,EAAO,WAAA;AACnC,CAAA;AAmCA,SAAS,YAAA,CAAa,EAAE,QAAA,EAAS,EAAiC;AAC9D,EAAA,IAAI,QAAA,KAAa,OAAO,OAAO,IAAA;AAC/B,EAAA,MAAM,YAAY,QAAA,KAAa,SAAA;AAC/B,EAAA,uBACIH,cAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACG,YAAA,EAAY,YAAY,oBAAA,GAAuB,oBAAA;AAAA,MAC/C,SAAA,EACI,2HAAA,IACC,SAAA,GACK,8CAAA,GACA,iEAAA,CAAA;AAAA,MAEV,kBAAA,EAAkB,QAAA;AAAA,MAEjB,sBAAY,SAAA,GAAY;AAAA;AAAA,GAC7B;AAER;AAEA,SAAS,cAAA,CAAe,EAAE,KAAA,EAAM,EAAyB;AACrD,EAAA,IAAI,KAAA,KAAU,QAAQ,OAAO,IAAA;AAC7B,EAAA,uBACIA,cAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACG,YAAA,EAAY,mBAAmB,KAAK,CAAA,CAAA;AAAA,MACpC,SAAA,EAAU,iHAAA;AAAA,MACV,oBAAA,EAAoB,KAAA;AAAA,MAEnB,2BAAiB,KAAK;AAAA;AAAA,GAC3B;AAER;AAEA,SAAS,gBAAA,CAAiB,EAAE,QAAA,EAAS,EAAiC;AAClE,EAAA,IAAI,QAAA,KAAa,OAAO,OAAO,IAAA;AAC/B,EAAA,MAAM,YAAY,QAAA,KAAa,SAAA;AAC/B,EAAA,uBACIA,cAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACG,aAAA,EAAW,IAAA;AAAA,MACX,SAAA,EACI,4GAAA,IACC,SAAA,GACK,4BAAA,GACA,sCAAA,CAAA;AAAA,MAGT,sBAAY,KAAA,GAAQ;AAAA;AAAA,GACzB;AAER;AAEO,SAAS,cAAA,CAAe;AAAA,EAC3B,OAAA;AAAA,EACA,QAAA,GAAW,GAAA;AAAA,EACX,SAAA,GAAY,MAAA;AAAA,EACZ,QAAA;AAAA,EACA,SAAA;AAAA,EACA,gBAAA;AAAA,EACA;AACJ,CAAA,EAAwB;AACpB,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIJ,eAAS,KAAK,CAAA;AACtC,EAAA,MAAM,YAAA,GAAeC,aAA8B,IAAI,CAAA;AACvD,EAAA,MAAM,SAASQ,WAAA,EAAM;AAErB,EAAA,MAAM,eAAA,GAAkC,kBAAA,CAAmB,OAAO,CAAA,EAAG,QAAA,IAAY,KAAA;AAGjF,EAAAP,gBAAU,MAAM;AACZ,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,SAAS,MAAM,CAAA,EAAe;AAC1B,MAAA,IAAI,CAAC,aAAa,OAAA,EAAS;AAC3B,MAAA,IAAI,CAAC,aAAa,OAAA,CAAQ,QAAA,CAAS,EAAE,MAAc,CAAA,UAAW,KAAK,CAAA;AAAA,IACvE;AACA,IAAA,SAAS,MAAM,CAAA,EAAkB;AAC7B,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,QAAA,EAAU,OAAA,CAAQ,KAAK,CAAA;AAAA,IACzC;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,KAAK,CAAA;AAC5C,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,KAAK,CAAA;AAC1C,IAAA,OAAO,MAAM;AACT,MAAA,QAAA,CAAS,mBAAA,CAAoB,aAAa,KAAK,CAAA;AAC/C,MAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,KAAK,CAAA;AAAA,IACjD,CAAA;AAAA,EACJ,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,uBACIC,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,GAAA,EAAK,YAAA;AAAA,MACL,SAAA,EAAW,eAAe,SAAA,IAAa,EAAA,CAAA;AAAA,MACvC,uBAAA,EAAsB,EAAA;AAAA,MACtB,0BAAA,EAA0B,eAAA;AAAA,MAC1B,oBAAA,EAAoB,SAAA;AAAA,MAEpB,QAAA,EAAA;AAAA,wBAAAA,eAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACG,IAAA,EAAK,QAAA;AAAA,YACL,eAAA,EAAc,MAAA;AAAA,YACd,eAAA,EAAe,IAAA;AAAA,YACf,eAAA,EAAe,MAAA;AAAA,YACf,YAAA,EAAW,4CAAA;AAAA,YACX,KAAA,EAAM,4BAAA;AAAA,YACN,SAAS,MAAM,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AAAA,YAChC,WACI,gBAAA,IACA,sHAAA;AAAA,YAEJ,+BAAA,EAA8B,EAAA;AAAA,YAE7B,QAAA,EAAA;AAAA,cAAA,QAAA;AAAA,8BACDC,cAAAA,CAAC,YAAA,EAAA,EAAa,QAAA,EAAU,eAAA,EAAiB,CAAA;AAAA,8BACzCA,cAAAA,CAAC,cAAA,EAAA,EAAe,KAAA,EAAO,SAAA,EAAW,CAAA;AAAA,8BAClCA,cAAAA;AAAA,gBAACE,uBAAAA;AAAA,gBAAA;AAAA,kBACG,aAAA,EAAW,IAAA;AAAA,kBACX,SAAA,EACI,oGAAA,IACC,IAAA,GAAO,YAAA,GAAe,EAAA;AAAA;AAAA;AAE/B;AAAA;AAAA,SACJ;AAAA,QAEC,wBACGH,eAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACG,EAAA,EAAI,MAAA;AAAA,YACJ,IAAA,EAAK,MAAA;AAAA,YACL,YAAA,EAAW,oBAAA;AAAA,YACX,WACI,gBAAA,IACA,qGAAA;AAAA,YAEJ,+BAAA,EAA8B,EAAA;AAAA,YAE9B,QAAA,EAAA;AAAA,8BAAAC,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4CAAA,EAA6C,QAAA,EAAA,6BAAA,EAE5D,CAAA;AAAA,8BACAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8CAAA,EAA+C,IAAA,EAAK,MAAA,EAC9D,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,CAAC,EAAE,QAAA,EAAU,OAAM,KAAM;AACnC,gBAAA,MAAM,iBAAiB,iBAAA,CAAkB,MAAA;AAAA,kBACrC,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,KAAa;AAAA,iBAC1B;AACA,gBAAA,IAAI,cAAA,CAAe,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AACxC,gBAAA,uBACID,eAAAA,CAAC,KAAA,EAAA,EAAmB,IAAA,EAAK,MAAA,EAAO,mBAAiB,QAAA,EAC7C,QAAA,EAAA;AAAA,kCAAAC,cAAAA;AAAA,oBAAC,KAAA;AAAA,oBAAA;AAAA,sBACG,IAAA,EAAK,WAAA;AAAA,sBACL,aAAA,EAAW,IAAA;AAAA,sBACX,SAAA,EACI,uGAAA,IACC,QAAA,KAAa,KAAA,GAAQ,EAAA,GAAK,eAAA,CAAA;AAAA,sBAG9B,QAAA,EAAA;AAAA;AAAA,mBACL;AAAA,kCACAA,cAAAA,CAAC,IAAA,EAAA,EAAG,IAAA,EAAK,MAAA,EAAO,WAAU,MAAA,EACrB,QAAA,EAAA,cAAA,CAAe,GAAA,CAAI,CAAC,CAAA,KAAM;AACvB,oBAAA,MAAM,QAAA,GAAW,EAAE,IAAA,KAAS,OAAA;AAC5B,oBAAA,MAAM,IAAA,GAAO,QAAA,GAAW,QAAA,GAAW,CAAA,CAAE,MAAA;AACrC,oBAAA,uBACIA,cAAAA,CAAC,IAAA,EAAA,EAAgB,IAAA,EAAK,QAClB,QAAA,kBAAAD,eAAAA;AAAA,sBAACI,qBAAAA;AAAA,sBAAA;AAAA,wBACG,IAAA;AAAA,wBACA,IAAA,EAAK,UAAA;AAAA,wBACL,OAAA,EAAS,MAAM,OAAA,CAAQ,KAAK,CAAA;AAAA,wBAC5B,cAAA,EAAc,WAAW,MAAA,GAAS,MAAA;AAAA,wBAClC,SAAA,EACI,4DAAA,IACC,QAAA,GACK,+CAAA,GACA,qDAAA,CAAA;AAAA,wBAEV,4BAAA,EACI,WAAW,SAAA,GAAY,SAAA;AAAA,wBAE3B,0BAAwB,CAAA,CAAE,QAAA;AAAA,wBAE1B,QAAA,EAAA;AAAA,0CAAAJ,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4CAAA,EACZ,QAAA,EAAA;AAAA,4CAAAC,cAAAA;AAAA,8BAAC,MAAA;AAAA,8BAAA;AAAA,gCACG,SAAA,EACI,wDAAA,IACC,QAAA,GACK,cAAA,GACA,4DAAA,CAAA;AAAA,gCAGT,QAAA,EAAA,CAAA,CAAE;AAAA;AAAA,6BACP;AAAA,4CACAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kEAAA,EACX,YAAE,GAAA,EACP;AAAA,2BAAA,EACJ,CAAA;AAAA,0CACAA,cAAAA,CAAC,gBAAA,EAAA,EAAiB,QAAA,EAAU,EAAE,QAAA,EAAU,CAAA;AAAA,0BACvC,QAAA,mBACGD,eAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,sGAAA,EAAuG,QAAA,EAAA;AAAA,4BAAA,MAAA;AAAA,4CAEnHC,cAAAA,CAACI,iBAAAA,EAAA,EAAM,WAAU,SAAA,EAAU;AAAA,2BAAA,EAC/B,CAAA,GACA;AAAA;AAAA;AAAA,qBACR,EAAA,EAvCK,EAAE,IAwCX,CAAA;AAAA,kBAER,CAAC,CAAA,EACL;AAAA,iBAAA,EAAA,EA3DM,QA4DV,CAAA;AAAA,cAER,CAAC,CAAA,EACL,CAAA;AAAA,8BACAJ,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sEACX,QAAA,kBAAAA,cAAAA;AAAA,gBAACG,qBAAAA;AAAA,gBAAA;AAAA,kBACG,IAAA,EAAK,sBAAA;AAAA,kBACL,OAAA,EAAS,MAAM,OAAA,CAAQ,KAAK,CAAA;AAAA,kBAC5B,SAAA,EAAU,4EAAA;AAAA,kBACb,QAAA,EAAA;AAAA;AAAA,eAED,EACJ;AAAA;AAAA;AAAA;AACJ;AAAA;AAAA,GAER;AAER;AC9KA,SAAS,WAAW,CAAA,EAAmB;AACnC,EAAA,IAAI,CAAA,CAAE,MAAA,IAAU,EAAA,EAAI,OAAO,CAAA;AAC3B,EAAA,OAAO,CAAA,EAAG,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,MAAA,EAAI,CAAA,CAAE,KAAA,CAAM,EAAE,CAAC,CAAA,CAAA;AAC1C;AASO,SAAS,cAAc,KAAA,EAA2B;AACrD,EAAA,MAAM,UAAUG,uBAAA,EAAa;AAC7B,EAAA,uBACIN,cAAAA;AAAA,IAAC,iBAAA;AAAA,IAAA;AAAA,MACI,GAAG,KAAA;AAAA,MACJ,OAAA,EAAS;AAAA,QACL,QAAQ,OAAA,CAAQ,MAAA;AAAA,QAChB,OAAA,EAAS,QAAQ,OAAA,GACX;AAAA,UACI,KAAA,EAAO,QAAQ,OAAA,CAAQ,KAAA;AAAA,UACvB,WAAA,EAAa,OAAA,CAAQ,OAAA,CAAQ,WAAA,IAAe;AAAA,SAChD,GACA,IAAA;AAAA,QACN,SAAS,OAAA,CAAQ,OAAA;AAAA,QACjB,SAAS,OAAA,CAAQ;AAAA;AACrB;AAAA,GACJ;AAER;AAiBO,SAAS,iBAAA,CAAkB;AAAA,EAC9B,OAAA;AAAA,EACA,SAAA,GAAY,SAAA;AAAA,EACZ,WAAA,GAAc,SAAA;AAAA,EACd,SAAA;AAAA,EACA,mBAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,gBAAA;AAAA,EACA,gBAAA;AAAA,EACA;AACJ,CAAA,EAA2B;AACvB,EAAA,MAAM,EAAE,MAAA,EAAQ,OAAA,EAAS,OAAA,EAAS,SAAQ,GAAI,OAAA;AAC9C,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIJ,eAAS,KAAK,CAAA;AAC9C,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,eAAS,KAAK,CAAA;AACtC,EAAA,MAAM,OAAA,GAAUC,aAA8B,IAAI,CAAA;AAElD,EAAA,MAAM,QAAA,GAAW,mBAAmB,OAAO,CAAA;AAC3C,EAAA,MAAM,QAAA,GAAW,QAAA,EAAU,QAAA,IAAY,CAAA,EAAG,OAAO,CAAA,QAAA,CAAA;AACjD,EAAA,MAAM,SAAS,OAAA,KAAY,MAAA;AAC3B,EAAA,MAAM,sBAAA,GAAyB,uBAAuB,CAAC,MAAA;AAEvD,EAAAC,gBAAU,MAAM,WAAA,CAAY,IAAI,CAAA,EAAG,EAAE,CAAA;AAGrC,EAAAA,gBAAU,MAAM;AACZ,IAAA,MAAM,SAAS,MAAM;AACjB,MAAA,IAAI,QAAA,CAAS,eAAA,KAAoB,SAAA,EAAW,KAAK,OAAA,EAAQ;AAAA,IAC7D,CAAA;AACA,IAAA,MAAM,OAAA,GAAU,MAAM,KAAK,OAAA,EAAQ;AACnC,IAAA,QAAA,CAAS,gBAAA,CAAiB,oBAAoB,MAAM,CAAA;AACpD,IAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,OAAO,CAAA;AACxC,IAAA,OAAO,MAAM;AACT,MAAA,QAAA,CAAS,mBAAA,CAAoB,oBAAoB,MAAM,CAAA;AACvD,MAAA,MAAA,CAAO,mBAAA,CAAoB,SAAS,OAAO,CAAA;AAAA,IAC/C,CAAA;AAAA,EACJ,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAGZ,EAAAA,gBAAU,MAAM;AACZ,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAkB;AAC/B,MAAA,IAAI,OAAA,CAAQ,OAAA,IAAW,CAAC,OAAA,CAAQ,OAAA,CAAQ,SAAS,CAAA,CAAE,MAAc,CAAA,EAAG,OAAA,CAAQ,KAAK,CAAA;AAAA,IACrF,CAAA;AACA,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAqB;AAChC,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,QAAA,EAAU,OAAA,CAAQ,KAAK,CAAA;AAAA,IACzC,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,OAAO,CAAA;AAC9C,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,KAAK,CAAA;AAC1C,IAAA,OAAO,MAAM;AACT,MAAA,QAAA,CAAS,mBAAA,CAAoB,aAAa,OAAO,CAAA;AACjD,MAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,KAAK,CAAA;AAAA,IACjD,CAAA;AAAA,EACJ,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,MAAM,gCACFE,cAAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACG,IAAA,EAAM,SAAA;AAAA,MACN,YAAA,EAAY,WAAA;AAAA,MACZ,6BAAA,EAA4B,EAAA;AAAA,MAC5B,WACI,gBAAA,IACA,+LAAA;AAAA,MAGH,QAAA,EAAA;AAAA;AAAA,GACL;AAKJ,EAAA,IAAI,CAAC,QAAA,IAAY,MAAA,KAAW,SAAA,EAAW;AACnC,IAAA,OAAO,aAAA;AAAA,EACX;AAEA,EAAA,IAAI,MAAA,KAAW,eAAA,IAAmB,CAAC,OAAA,EAAS;AACxC,IAAA,OAAO,aAAA;AAAA,EACX;AAGA,EAAA,MAAM,WAAA,GAAc,QAAQ,WAAA,IAAe,IAAA;AAC3C,EAAA,MAAM,KAAA,GAAQ,WAAA,IAAe,UAAA,CAAW,OAAA,CAAQ,KAAK,CAAA;AAErD,EAAA,uBACID,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,GAAA,EAAK,OAAA;AAAA,MACL,SAAA,EAAW,4BAA4B,SAAA,IAAa,EAAA,CAAA;AAAA,MACpD,sBAAA,EAAqB,EAAA;AAAA,MAErB,QAAA,EAAA;AAAA,wBAAAA,eAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACG,IAAA,EAAK,QAAA;AAAA,YACL,SAAS,MAAM,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AAAA,YAChC,eAAA,EAAc,MAAA;AAAA,YACd,eAAA,EAAe,IAAA;AAAA,YACf,YAAA,EAAY,CAAA,aAAA,EAAgB,OAAA,CAAQ,KAAK,CAAA,oBAAA,CAAA;AAAA,YACzC,WACI,gBAAA,IACA,6JAAA;AAAA,YAEJ,8BAAA,EAA6B,EAAA;AAAA,YAE7B,QAAA,EAAA;AAAA,8BAAAC,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+CAAA,EAAgD,eAAW,IAAA,EAAC,CAAA;AAAA,8BAC5EA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mBAAmB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,8BACzCA,cAAAA;AAAA,gBAAC,KAAA;AAAA,gBAAA;AAAA,kBACG,KAAA,EAAM,GAAA;AAAA,kBACN,MAAA,EAAO,GAAA;AAAA,kBACP,OAAA,EAAQ,WAAA;AAAA,kBACR,aAAA,EAAW,IAAA;AAAA,kBACX,SAAA,EACI,kCAAA,IAAsC,IAAA,GAAO,YAAA,GAAe,UAAA,CAAA;AAAA,kBAGhE,QAAA,kBAAAA,cAAAA;AAAA,oBAAC,MAAA;AAAA,oBAAA;AAAA,sBACG,CAAA,EAAE,gBAAA;AAAA,sBACF,MAAA,EAAO,cAAA;AAAA,sBACP,WAAA,EAAY,KAAA;AAAA,sBACZ,IAAA,EAAK,MAAA;AAAA,sBACL,aAAA,EAAc;AAAA;AAAA;AAClB;AAAA;AACJ;AAAA;AAAA,SACJ;AAAA,QAEC,wBACGD,eAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACG,IAAA,EAAK,MAAA;AAAA,YACL,YAAA,EAAW,cAAA;AAAA,YACX,WACI,gBAAA,IACA,8IAAA;AAAA,YAEJ,8BAAA,EAA6B,EAAA;AAAA,YAE7B,QAAA,EAAA;AAAA,8BAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EACX,QAAA,EAAA;AAAA,gCAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mEAAA,EAAoE,QAAA,EAAA;AAAA,kBAAA,sBAAA;AAAA,kBAChE;AAAA,iBAAA,EACnB,CAAA;AAAA,gCACAC,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kEAAA,EACV,kBAAQ,KAAA,EACb,CAAA;AAAA,gBACC,8BACGA,cAAAA,CAAC,SAAI,SAAA,EAAU,mEAAA,EACV,uBACL,CAAA,GACA;AAAA,eAAA,EACR,CAAA;AAAA,8BAEAD,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,KAAA,EACV,QAAA,EAAA;AAAA,gBAAA,SAAA,EAAW,GAAA,CAAI,CAAC,IAAA,KAAS;AACtB,kBAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,KAAK,CAAA;AACnC,kBAAA,MAAM,GAAA,GACF,yGAAA;AACJ,kBAAA,MAAM,KAAA,mBACFA,eAAAA,CAAAQ,mBAAA,EAAA,EACI,QAAA,EAAA;AAAA,oCAAAP,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAwB,aAAA,EAAW,MAAC,QAAA,EAAA,QAAA,EAEpD,CAAA;AAAA,oCACAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EAAU,eAAK,KAAA,EAAM,CAAA;AAAA,oBACpC,IAAA,CAAK,2BACFA,cAAAA;AAAA,sBAAC,MAAA;AAAA,sBAAA;AAAA,wBACG,SAAA,EAAU,sCAAA;AAAA,wBACV,aAAA,EAAW,IAAA;AAAA,wBACd,QAAA,EAAA;AAAA;AAAA,qBAED,GACA;AAAA,mBAAA,EACR,CAAA;AAEJ,kBAAA,OAAO,IAAA,CAAK,2BACRA,cAAAA;AAAA,oBAAC,GAAA;AAAA,oBAAA;AAAA,sBAEG,MAAM,IAAA,CAAK,IAAA;AAAA,sBACX,MAAA,EAAO,QAAA;AAAA,sBACP,GAAA,EAAI,YAAA;AAAA,sBACJ,OAAA;AAAA,sBACA,IAAA,EAAK,UAAA;AAAA,sBACL,SAAA,EAAW,GAAA;AAAA,sBACX,2BAAA,EAA0B,EAAA;AAAA,sBAEzB,QAAA,EAAA;AAAA,qBAAA;AAAA,oBATI,IAAA,CAAK;AAAA,sCAYdA,cAAAA;AAAA,oBAACG,qBAAAA;AAAA,oBAAA;AAAA,sBAEG,MAAM,IAAA,CAAK,IAAA;AAAA,sBACX,OAAA;AAAA,sBACA,IAAA,EAAK,UAAA;AAAA,sBACL,SAAA,EAAW,GAAA;AAAA,sBACX,2BAAA,EAA0B,EAAA;AAAA,sBAEzB,QAAA,EAAA;AAAA,qBAAA;AAAA,oBAPI,IAAA,CAAK;AAAA,mBAQd;AAAA,gBAER,CAAC,CAAA;AAAA,gBAEA,yCACGJ,eAAAA;AAAA,kBAAC,GAAA;AAAA,kBAAA;AAAA,oBACG,IAAA,EAAK,2BAAA;AAAA,oBACL,MAAA,EAAO,QAAA;AAAA,oBACP,GAAA,EAAI,YAAA;AAAA,oBACJ,OAAA,EAAS,MAAM,OAAA,CAAQ,KAAK,CAAA;AAAA,oBAC5B,IAAA,EAAK,UAAA;AAAA,oBACL,SAAA,EAAU,yGAAA;AAAA,oBACV,2BAAA,EAA0B,EAAA;AAAA,oBAC1B,uCAAA,EAAsC,EAAA;AAAA,oBAEtC,QAAA,EAAA;AAAA,sCAAAC,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAwB,aAAA,EAAW,MAAC,QAAA,EAAA,QAAA,EAEpD,CAAA;AAAA,sCACAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,UAAS,QAAA,EAAA,kBAAA,EAAgB,CAAA;AAAA,sCACzCA,cAAAA;AAAA,wBAAC,MAAA;AAAA,wBAAA;AAAA,0BACG,SAAA,EAAU,sCAAA;AAAA,0BACV,aAAA,EAAW,IAAA;AAAA,0BACd,QAAA,EAAA;AAAA;AAAA;AAED;AAAA;AAAA,iBACJ,GACA,IAAA;AAAA,gCAEJD,eAAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBACG,IAAA,EAAK,QAAA;AAAA,oBACL,IAAA,EAAK,UAAA;AAAA,oBACL,SAAS,MAAM;AACX,sBAAA,OAAA,CAAQ,KAAK,CAAA;AACb,sBAAA,KAAK,OAAA,EAAQ;AAAA,oBACjB,CAAA;AAAA,oBACA,SAAA,EAAU,0HAAA;AAAA,oBACV,2BAAA,EAA0B,EAAA;AAAA,oBAC1B,8BAAA,EAA6B,EAAA;AAAA,oBAE7B,QAAA,EAAA;AAAA,sCAAAC,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAwB,aAAA,EAAW,MAAC,QAAA,EAAA,QAAA,EAEpD,CAAA;AAAA,sCACAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,UAAS,QAAA,EAAA,UAAA,EAAQ;AAAA;AAAA;AAAA;AACrC,eAAA,EACJ,CAAA;AAAA,cAEC,KAAA,mBAAQA,cAAAA,CAAC,WAAA,EAAA,EAAY,UAAoB,KAAA,EAAc,KAAA,EAAO,WAAW,CAAA,GAAK;AAAA;AAAA;AAAA;AACnF;AAAA;AAAA,GAER;AAER;AAEA,SAAS,WAAA,CAAY;AAAA,EACjB,QAAA;AAAA,EACA,KAAA;AAAA,EACA;AACJ,CAAA,EAIG;AACC,EAAA,MAAM,MAAM,KAAA,CAAM,GAAA;AAClB,EAAA,MAAM,OAAA,GAAU,CAAC,CAAC,GAAA,IAAO,GAAA,KAAQ,KAAA;AACjC,EAAA,MAAM,SAAA,GAAY,WAAW,KAAA,CAAM,IAAA,GAAO,sBAAsB,KAAA,CAAM,IAAI,CAAA,QAAA,EAAW,GAAG,CAAA,CAAA,GAAK,IAAA;AAC7F,EAAA,uBACID,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,SAAA,EAAU,4GAAA;AAAA,MACV,4BAAA,EAA2B,EAAA;AAAA,MAE1B,QAAA,EAAA;AAAA,QAAA,QAAA;AAAA,QACA,KAAA,IAAS,KAAA,KAAU,MAAA,mBAChBA,gBAAAQ,mBAAA,EAAA,EACK,QAAA,EAAA;AAAA,UAAA,QAAA;AAAA,0BACDP,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4BAA4B,QAAA,EAAA,KAAA,EAAM;AAAA,SAAA,EACtD,CAAA,GACA,IAAA;AAAA,QAAM,GAAA;AAAA,wBACVD,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0BAAA,EAA2B,QAAA,EAAA;AAAA,UAAA,GAAA;AAAA,UACrC,KAAA,CAAM,OAAA;AAAA,UACP,OAAA,mBACGA,eAAAA,CAAAQ,mBAAA,EAAA,EACK,QAAA,EAAA;AAAA,YAAA,QAAA;AAAA,YACA,4BACGP,cAAAA;AAAA,cAAC,GAAA;AAAA,cAAA;AAAA,gBACG,IAAA,EAAM,SAAA;AAAA,gBACN,MAAA,EAAO,QAAA;AAAA,gBACP,GAAA,EAAI,YAAA;AAAA,gBACJ,SAAA,EAAU,yEAAA;AAAA,gBAET,QAAA,EAAA;AAAA;AAAA,aACL,GAEA;AAAA,WAAA,EAER,CAAA,GACA;AAAA,SAAA,EACR;AAAA;AAAA;AAAA,GACJ;AAER;ACpbO,SAAS,QAAA,CAAS;AAAA,EACrB,OAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA;AACJ,CAAA,EAAkB;AACd,EAAA,MAAM,SAAA,GAAY,QAAQ,KAAK,CAAA;AAC/B,EAAA,uBACIA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAW,gBAAgB,SAAA,IAAa,EAAA,CAAA,EACzC,0BAAAA,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,wCAAA,EACX,QAAA,kBAAAA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCACX,QAAA,kBAAAD,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,cAAA,EACV,QAAA,EAAA;AAAA,IAAA,SAAA,oBACGA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mEAAA,EACX,QAAA,EAAA;AAAA,sBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACV,QAAA,EAAA;AAAA,QAAA,OAAA,oBACGC,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCACV,QAAA,EAAA,OAAA,EACL,CAAA;AAAA,wBAEJA,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,8DACT,QAAA,EAAA,KAAA,EACL,CAAA;AAAA,QACC,+BACGA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,mEACR,QAAA,EAAA,WAAA,EACL;AAAA,OAAA,EAER,CAAA;AAAA,MACC,iCACGA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oCACV,QAAA,EAAA,aAAA,EACL;AAAA,KAAA,EAER,CAAA;AAAA,oBAEJA,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAW,SAAA,GAAY,YAAA,GAAe,SAAU,QAAA,EAAS;AAAA,GAAA,EAClE,CAAA,EACJ,GACJ,CAAA,EACJ,CAAA;AAER;AC9DA,IAAM,UAAA,GAAa;AAAA,EACf,OAAA,EAAS,cAAA;AAAA,EACT,KAAA,EAAO,uBAAA;AAAA,EACP,OAAA,EAAS,cAAA;AAAA,EACT,OAAA,EAAS,cAAA;AAAA,EACT,WAAA,EAAa;AACjB,CAAA;AAUO,SAAS,aAAA,CAAc;AAAA,EAC1B,KAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA,GAAO,SAAA;AAAA,EACP,SAAA,GAAY;AAChB,CAAA,EAAuB;AACnB,EAAA,uBACID,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,+CAAA,EAAkD,SAAS,CAAA,CAAA,EACvE,QAAA,EAAA;AAAA,oBAAAC,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACX,QAAA,kBAAAD,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,WAAA,EAAc,UAAA,CAAW,IAAI,CAAC,CAAA,CAAA,EAAI,QAAA,EAAA;AAAA,MAAA,OAAA;AAAA,MAAG;AAAA,KAAA,EAAM,CAAA,EAC/D,CAAA;AAAA,IACC,wBACGC,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4EACX,QAAA,EAAA,IAAA,EACL;AAAA,GAAA,EAER,CAAA;AAER;ACxBA,IAAMQ,WAAAA,GAAa;AAAA,EACf,IAAA,EAAM,gCAAA;AAAA,EACN,OAAA,EAAS,gCAAA;AAAA,EACT,KAAA,EAAO;AACX,CAAA;AAEA,IAAM,gBAAA,GAAmB;AAAA,EACrB,IAAA,EAAM,cAAA;AAAA,EACN,OAAA,EAAS,cAAA;AAAA,EACT,KAAA,EAAO;AACX,CAAA;AAQO,SAAS,UAAA,CAAW;AAAA,EACvB,KAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAA;AAAA,EACA,SAAA;AAAA,EACA,IAAA,GAAO,MAAA;AAAA,EACP,SAAA,GAAY;AAChB,CAAA,EAAoB;AAChB,EAAA,uBACIT,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,kBAAA,EAAqBS,YAAW,IAAI,CAAC,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,EAC9D,QAAA,EAAA;AAAA,oBAAAT,gBAAC,KAAA,EAAA,EAAI,SAAA,EAAW,mBAAmB,gBAAA,CAAiB,IAAI,CAAC,CAAA,CAAA,EAAI,QAAA,EAAA;AAAA,MAAA,OAAA;AAAA,MAAG;AAAA,KAAA,EAAM,CAAA;AAAA,oBACtEC,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wDAAwD,QAAA,EAAS,CAAA;AAAA,IAAA,CAC9E,OAAO,SAAA,qBACLD,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,2BAAA,EACV,QAAA,EAAA;AAAA,MAAA,GAAA,oBAAOC,cAAAA,CAAC,OAAA,EAAA,EAAS,GAAG,GAAA,EAAK,SAAQ,SAAA,EAAU,CAAA;AAAA,MAC3C,6BAAaA,cAAAA,CAAC,WAAS,GAAG,SAAA,EAAW,SAAQ,WAAA,EAAY;AAAA,KAAA,EAC9D;AAAA,GAAA,EAER,CAAA;AAER;AAEA,SAAS,OAAA,CAAQ;AAAA,EACb,KAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA;AACJ,CAAA,EAAyD;AACrD,EAAA,MAAM,GAAA,GACF,OAAA,KAAY,SAAA,GACN,kLAAA,GACA,6LAAA;AACV,EAAA,MAAM,IAAA,GAAO,QAAA,GAAW,CAAA,EAAG,KAAK,CAAA,OAAA,CAAA,GAAO,KAAA;AACvC,EAAA,IAAI,QAAA,EAAU;AACV,IAAA,uBACIA,cAAAA,CAAC,GAAA,EAAA,EAAE,IAAA,EAAY,MAAA,EAAO,UAAS,GAAA,EAAI,YAAA,EAAa,SAAA,EAAW,GAAA,EACtD,QAAA,EAAA,IAAA,EACL,CAAA;AAAA,EAER;AACA,EAAA,uBACIA,cAAAA,CAACG,qBAAAA,EAAA,EAAK,IAAA,EAAY,SAAA,EAAW,KACxB,QAAA,EAAA,IAAA,EACL,CAAA;AAER;AC/DA,IAAMK,WAAAA,GAAa;AAAA,EACf,OAAA,EAAS,EAAA;AAAA,EACT,OAAA,EAAS,cAAA;AAAA,EACT,OAAA,EAAS,cAAA;AAAA,EACT,OAAA,EAAS,cAAA;AAAA,EACT,WAAA,EAAa,kBAAA;AAAA,EACb,KAAA,EAAO;AACX,CAAA;AAEA,IAAM,SAAA,GAAY;AAAA,EACd,CAAA,EAAG,EAAA;AAAA,EACH,CAAA,EAAG,gBAAA;AAAA,EACH,CAAA,EAAG,gBAAA;AAAA,EACH,CAAA,EAAG;AACP,CAAA;AAQO,SAAS,SAAS,EAAE,KAAA,EAAO,UAAU,CAAA,EAAG,SAAA,GAAY,IAAG,EAAkB;AAC5E,EAAA,uBACIR,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,6BAAA,EAAgC,SAAA,CAAU,OAAO,CAAC,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,EAC1E,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,EAAA,EAAI,CAAA,qBACZA,cAAAA,CAAC,IAAA,EAAA,EAA8B,IAAA,EAAM,EAAA,EAAA,EAA1B,CAAA,EAAG,EAAA,CAAG,KAAK,CAAA,CAAA,EAAI,CAAC,CAAA,CAAc,CAC5C,CAAA,EACL,CAAA;AAER;AAEA,SAAS,IAAA,CAAK,EAAE,IAAA,EAAK,EAAuB;AACxC,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,KAAS,IAAA,CAAK,SAAS,SAAA,GAAY,SAAA,CAAA;AACrD,EAAA,uBACID,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EACX,QAAA,EAAA;AAAA,oBAAAC,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0EAAA,EACV,eAAK,KAAA,EACV,CAAA;AAAA,oBACAA,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACG,SAAA,EAAW,CAAA,iEAAA,EAAoEQ,WAAAA,CAAW,IAAI,CAAC,CAAA,CAAA;AAAA,QAE9F,QAAA,EAAA,IAAA,CAAK;AAAA;AAAA,KACV;AAAA,IACC,IAAA,CAAK,uBACFR,cAAAA,CAAC,SAAI,SAAA,EAAU,+EAAA,EACV,eAAK,GAAA,EACV;AAAA,GAAA,EAER,CAAA;AAER;AAEO,SAAS,QAAA,CAAS,EAAE,QAAA,EAAU,GAAG,MAAK,EAAwC;AACjF,EAAA,uBACID,gBAAC,KAAA,EAAA,EACG,QAAA,EAAA;AAAA,oBAAAC,cAAAA,CAAC,QAAK,IAAA,EAAY,CAAA;AAAA,IACjB;AAAA,GAAA,EACL,CAAA;AAER","file":"index.js","sourcesContent":["import { Boxes, Check, ChevronDown } from 'lucide-react';\nimport Link from 'next/link';\nimport { useEffect, useRef, useState } from 'react';\n\n/**\n * EcosystemSwitcher — cross-product dropdown for jumping between every\n * site in the OrangeCheck family. Drop one into every site's LayoutHeader\n * and mark the active site via the `current` prop.\n *\n * <EcosystemSwitcher current=\"lock\" />\n *\n * The component is dependency-self-contained: no Radix, no Headless UI,\n * just outside-click + Escape handling so it works identically in every\n * site without forcing a peer-dep upgrade. Every link stays in-tab — the\n * family is one app from the user's POV.\n */\n\nexport type EcosystemSlug =\n | 'home'\n | 'docs'\n | 'fleet'\n | 'me'\n | 'vault'\n | 'attest'\n | 'lock'\n | 'vote'\n | 'stamp'\n | 'agent'\n | 'pledge';\n\ninterface SwitcherEntry {\n slug: EcosystemSlug;\n href: string;\n label: string;\n sub: string;\n docsHref: string;\n}\n\nconst ENTRIES: SwitcherEntry[] = [\n {\n slug: 'home',\n href: 'https://ochk.io',\n label: 'orangecheck',\n sub: 'umbrella',\n docsHref: 'https://docs.ochk.io',\n },\n {\n slug: 'docs',\n href: 'https://docs.ochk.io',\n label: 'oc·docs',\n sub: 'unified docs',\n docsHref: 'https://docs.ochk.io',\n },\n {\n slug: 'fleet',\n href: 'https://fleet.ochk.io',\n label: 'oc·fleet',\n sub: 'managed — agent fleet',\n docsHref: 'https://docs.ochk.io/fleet',\n },\n {\n slug: 'me',\n href: 'https://me.ochk.io',\n label: 'oc·me',\n sub: 'earn — consumer identity',\n docsHref: 'https://docs.ochk.io/me',\n },\n {\n slug: 'vault',\n href: 'https://vault.ochk.io',\n label: 'oc·vault',\n sub: 'keep — encrypted secrets',\n docsHref: 'https://docs.ochk.io/vault',\n },\n {\n slug: 'attest',\n href: 'https://attest.ochk.io',\n label: 'oc·attest',\n sub: 'am — sybil resistance',\n docsHref: 'https://docs.ochk.io/attest',\n },\n {\n slug: 'lock',\n href: 'https://lock.ochk.io',\n label: 'oc·lock',\n sub: 'whisper — encryption',\n docsHref: 'https://docs.ochk.io/lock',\n },\n {\n slug: 'vote',\n href: 'https://vote.ochk.io',\n label: 'oc·vote',\n sub: 'decide — polls',\n docsHref: 'https://docs.ochk.io/vote',\n },\n {\n slug: 'stamp',\n href: 'https://stamp.ochk.io',\n label: 'oc·stamp',\n sub: 'declare — block-anchored',\n docsHref: 'https://docs.ochk.io/stamp',\n },\n {\n slug: 'agent',\n href: 'https://agent.ochk.io',\n label: 'oc·agent',\n sub: 'delegate — scoped auth',\n docsHref: 'https://docs.ochk.io/agent',\n },\n {\n slug: 'pledge',\n href: 'https://pledge.ochk.io',\n label: 'oc·pledge',\n sub: 'swear — bonded commitment',\n docsHref: 'https://docs.ochk.io/pledge',\n },\n];\n\nexport interface EcosystemSwitcherProps {\n current: EcosystemSlug;\n className?: string;\n}\n\nexport function EcosystemSwitcher({\n current,\n className,\n}: EcosystemSwitcherProps) {\n const [open, setOpen] = useState(false);\n const containerRef = useRef<HTMLDivElement | null>(null);\n\n // Outside-click + Escape close.\n useEffect(() => {\n if (!open) return;\n function onDoc(e: MouseEvent) {\n if (!containerRef.current) return;\n if (!containerRef.current.contains(e.target as Node)) setOpen(false);\n }\n function onKey(e: KeyboardEvent) {\n if (e.key === 'Escape') setOpen(false);\n }\n document.addEventListener('mousedown', onDoc);\n document.addEventListener('keydown', onKey);\n return () => {\n document.removeEventListener('mousedown', onDoc);\n document.removeEventListener('keydown', onKey);\n };\n }, [open]);\n\n return (\n <div ref={containerRef} className={'relative ' + (className ?? '')}>\n <button\n type=\"button\"\n aria-haspopup=\"menu\"\n aria-expanded={open}\n aria-label=\"Switch OrangeCheck product\"\n title=\"Switch product\"\n onClick={() => setOpen((v) => !v)}\n className={\n 'inline-flex items-center gap-1 px-2 py-1 transition-colors ' +\n (open\n ? 'text-foreground'\n : 'text-muted-foreground hover:text-foreground')\n }\n >\n <Boxes className=\"h-4 w-4\" />\n <ChevronDown\n className={\n 'h-3.5 w-3.5 transition-transform ' + (open ? 'rotate-180' : '')\n }\n />\n </button>\n\n {open && (\n <div\n role=\"menu\"\n aria-label=\"Switch OrangeCheck product\"\n className=\"bg-background absolute right-0 top-full z-[60] mt-2 w-72 border shadow-lg\"\n >\n <div className=\"label-mono text-primary border-b px-4 py-2\">\n § the family\n </div>\n <ul className=\"py-1\">\n {ENTRIES.map((e) => {\n const isActive = e.slug === current;\n return (\n <li key={e.slug}>\n <Link\n href={e.href}\n onClick={() => setOpen(false)}\n aria-current={isActive ? 'page' : undefined}\n className={\n 'group flex items-baseline gap-3 px-4 py-2 transition-colors ' +\n (isActive\n ? 'bg-primary/5'\n : 'hover:bg-muted')\n }\n >\n <span\n className={\n 'font-display flex-1 text-[12px] font-semibold tracking-tight ' +\n (isActive\n ? 'text-primary'\n : 'text-foreground group-hover:text-primary transition-colors')\n }\n >\n {e.label}\n </span>\n <span className=\"text-muted-foreground font-mono text-[10px] tracking-wider uppercase\">\n {e.sub}\n </span>\n {isActive && (\n <Check className=\"text-primary h-3 w-3\" />\n )}\n </Link>\n </li>\n );\n })}\n </ul>\n <div className=\"border-t px-4 py-2 font-mono text-[10px] tracking-widest uppercase\">\n <Link\n href=\"https://docs.ochk.io\"\n onClick={() => setOpen(false)}\n className=\"text-muted-foreground hover:text-foreground inline-block transition-colors\"\n >\n docs.ochk.io →\n </Link>\n </div>\n </div>\n )}\n </div>\n );\n}\n","/**\n * Family-property registry — the single source of truth for every\n * orangecheck-family site. Both `<OcLogoDropdown>` (the global logo →\n * property switcher) and `<OcAccountMenu>` (the global signed-in\n * account chip) read from this table, so a one-line edit here ripples\n * to every consumer simultaneously.\n *\n * Adding a new family member means appending one entry below. Removing\n * one means deleting the entry. There are no other call sites to chase.\n */\n\nimport type { EcosystemSlug } from './ecosystem-switcher';\n\nexport type FamilyCategory = 'hub' | 'product' | 'protocol';\n\nexport interface FamilyProperty {\n /** Stable URL-safe identifier (e.g. `'vault'`). */\n slug: EcosystemSlug;\n /** Absolute origin (e.g. `'https://vault.ochk.io'`). */\n origin: string;\n /** Bare hostname (e.g. `'vault.ochk.io'`). Used in account-menu headers. */\n hostname: string;\n /** Wordmark label (e.g. `'oc·vault'`). */\n label: string;\n /** Short tagline (verb — what-it-does), shown under the wordmark in the menu. */\n sub: string;\n /** Docs deep-link (e.g. `'https://docs.ochk.io/vault'`). */\n docsHref: string;\n /** Family-level category that shapes the visual chip + menu sectioning. */\n category: FamilyCategory;\n}\n\nexport const FAMILY_PROPERTIES: ReadonlyArray<FamilyProperty> = [\n {\n slug: 'home',\n origin: 'https://ochk.io',\n hostname: 'ochk.io',\n label: 'orangecheck',\n sub: 'umbrella · sign-in',\n docsHref: 'https://docs.ochk.io',\n category: 'hub',\n },\n {\n slug: 'docs',\n origin: 'https://docs.ochk.io',\n hostname: 'docs.ochk.io',\n label: 'oc·docs',\n sub: 'unified reference',\n docsHref: 'https://docs.ochk.io',\n category: 'hub',\n },\n {\n slug: 'me',\n origin: 'https://me.ochk.io',\n hostname: 'me.ochk.io',\n label: 'oc·me',\n sub: 'earn — consumer identity',\n docsHref: 'https://docs.ochk.io/me',\n category: 'product',\n },\n {\n slug: 'vault',\n origin: 'https://vault.ochk.io',\n hostname: 'vault.ochk.io',\n label: 'oc·vault',\n sub: 'keep — encrypted secrets',\n docsHref: 'https://docs.ochk.io/vault',\n category: 'product',\n },\n {\n slug: 'fleet',\n origin: 'https://fleet.ochk.io',\n hostname: 'fleet.ochk.io',\n label: 'oc·fleet',\n sub: 'managed — agent fleet',\n docsHref: 'https://docs.ochk.io/fleet',\n category: 'product',\n },\n {\n slug: 'attest',\n origin: 'https://attest.ochk.io',\n hostname: 'attest.ochk.io',\n label: 'oc·attest',\n sub: 'am — sybil resistance',\n docsHref: 'https://docs.ochk.io/attest',\n category: 'protocol',\n },\n {\n slug: 'lock',\n origin: 'https://lock.ochk.io',\n hostname: 'lock.ochk.io',\n label: 'oc·lock',\n sub: 'whisper — encryption',\n docsHref: 'https://docs.ochk.io/lock',\n category: 'protocol',\n },\n {\n slug: 'vote',\n origin: 'https://vote.ochk.io',\n hostname: 'vote.ochk.io',\n label: 'oc·vote',\n sub: 'decide — polls',\n docsHref: 'https://docs.ochk.io/vote',\n category: 'protocol',\n },\n {\n slug: 'stamp',\n origin: 'https://stamp.ochk.io',\n hostname: 'stamp.ochk.io',\n label: 'oc·stamp',\n sub: 'declare — block-anchored',\n docsHref: 'https://docs.ochk.io/stamp',\n category: 'protocol',\n },\n {\n slug: 'agent',\n origin: 'https://agent.ochk.io',\n hostname: 'agent.ochk.io',\n label: 'oc·agent',\n sub: 'delegate — scoped auth',\n docsHref: 'https://docs.ochk.io/agent',\n category: 'protocol',\n },\n {\n slug: 'pledge',\n origin: 'https://pledge.ochk.io',\n hostname: 'pledge.ochk.io',\n label: 'oc·pledge',\n sub: 'swear — bonded commitment',\n docsHref: 'https://docs.ochk.io/pledge',\n category: 'protocol',\n },\n];\n\n/**\n * Canonical lifecycle states for any family site. Used by both the\n * tiny chip rendered next to the wordmark and any other surface that\n * wants to display \"this site is still settling\" UX. Centralised\n * vocabulary so we can't accidentally drift to a parallel synonym\n * like `preview`/`experimental` on different sites.\n *\n * - `live` — production-ready; **no chip rendered** (the absence\n * of a chip is the affordance)\n * - `beta` — feature-complete but still iterating, soft launch\n * - `alpha` — early, breaking changes expected, integrators beware\n */\nexport type SiteState = 'alpha' | 'beta' | 'live';\n\nexport const SITE_STATE_LABEL: Record<Exclude<SiteState, 'live'>, string> = {\n alpha: 'alpha',\n beta: 'beta',\n};\n\n/** Find a property entry by its slug. */\nexport function findFamilyProperty(slug: EcosystemSlug): FamilyProperty | undefined {\n return FAMILY_PROPERTIES.find((p) => p.slug === slug);\n}\n","import { Check, ChevronDown } from 'lucide-react';\nimport Link from 'next/link';\nimport { useEffect, useId, useRef, useState, type ReactNode } from 'react';\n\nimport type { EcosystemSlug } from './ecosystem-switcher';\nimport {\n FAMILY_PROPERTIES,\n SITE_STATE_LABEL,\n findFamilyProperty,\n type FamilyCategory,\n type SiteState,\n} from './family-properties';\n\n/**\n * `<OcLogoDropdown>` — the logo IS the dropdown.\n *\n * Wraps a site's local LogoMark + wordmark in a button that, on click,\n * drops a popover listing every OrangeCheck family property. The current\n * property is highlighted with a primary-tinted background, a left-edge\n * accent bar, and a \"home\" label — and is itself a clickable link to\n * the local home href (default `/`).\n *\n * Family properties carry one of three categories:\n *\n * - `hub` — orangecheck umbrella + docs (no badge)\n * - `product` — commercial products (me, vault, fleet) · primary chip\n * - `protocol` — open verb specs (attest, lock, vote, stamp, agent,\n * pledge) · muted chip\n *\n * The category of the *current* site is auto-rendered as a tiny mono\n * chip inside the trigger button, and the dropdown itself groups\n * entries by category with subtle mono dividers — so the product /\n * protocol distinction is visible both on the logo and in the menu,\n * with a single source of truth (`./family-properties.ts`).\n *\n * The optional `siteState` prop renders a second tiny chip after the\n * category chip — `alpha` or `beta` — for sites that aren't `live`.\n * The vocabulary is canonical across the family (see SiteState in\n * family-properties.ts). Pass it from your per-site config so a\n * single edit propagates to the logo, the account menu, and anywhere\n * else the chip surfaces.\n *\n * Mobile-aware: the popover's width is clamped to the viewport,\n * content scrolls when there are more entries than fit. The trigger\n * chips hide below `sm` to preserve mobile header space — the dropdown\n * itself still shows the grouping.\n */\n\nconst SECTIONS: Array<{ category: FamilyCategory; label: string }> = [\n { category: 'hub', label: 'hub' },\n { category: 'product', label: 'products' },\n { category: 'protocol', label: 'protocols' },\n];\n\nexport interface OcLogoDropdownProps {\n /**\n * Which property this site IS. Used to highlight the active row,\n * route the active row's link to `homeHref` instead of the cross-\n * domain absolute URL, and pick the category chip rendered next\n * to the wordmark.\n */\n current: EcosystemSlug;\n /**\n * The site's local home path (for the active row). Default `/`.\n * Always a same-origin path — the logo's \"go home\" affordance is\n * preserved by clicking the highlighted row.\n */\n homeHref?: string;\n /**\n * Optional lifecycle state for this site. `'live'` (default) renders\n * no chip; `'alpha'` and `'beta'` render a small mono uppercase chip\n * after the category badge. Drive this from your per-site config so\n * one constant change ripples to every surface.\n */\n siteState?: SiteState;\n /**\n * Logo contents · typically `<LogoMark />` + `<span>oc·X</span>`.\n */\n children: ReactNode;\n /** className for the outer container. */\n className?: string;\n /** className for the trigger button. */\n triggerClassName?: string;\n /** className for the popover. */\n popoverClassName?: string;\n}\n\nfunction CategoryChip({ category }: { category: FamilyCategory }) {\n if (category === 'hub') return null;\n const isProduct = category === 'product';\n return (\n <span\n aria-label={isProduct ? 'commercial product' : 'protocol reference'}\n className={\n 'ml-1 hidden rounded-sm border px-1.5 py-[1px] font-mono text-[9px] font-medium tracking-widest uppercase sm:inline-block ' +\n (isProduct\n ? 'border-primary/25 bg-primary/10 text-primary'\n : 'border-muted-foreground/20 bg-muted/40 text-muted-foreground/85')\n }\n data-oc-category={category}\n >\n {isProduct ? 'product' : 'protocol'}\n </span>\n );\n}\n\nfunction SiteStateBadge({ state }: { state: SiteState }) {\n if (state === 'live') return null;\n return (\n <span\n aria-label={`site lifecycle: ${state}`}\n className=\"text-muted-foreground/70 ml-1 hidden font-mono text-[9px] font-medium tracking-widest uppercase sm:inline-block\"\n data-oc-site-state={state}\n >\n {SITE_STATE_LABEL[state]}\n </span>\n );\n}\n\nfunction MenuCategoryChip({ category }: { category: FamilyCategory }) {\n if (category === 'hub') return null;\n const isProduct = category === 'product';\n return (\n <span\n aria-hidden\n className={\n 'inline-block shrink-0 rounded-sm px-1 py-[1px] font-mono text-[9px] font-medium tracking-widest uppercase ' +\n (isProduct\n ? 'bg-primary/10 text-primary'\n : 'bg-muted/60 text-muted-foreground/80')\n }\n >\n {isProduct ? 'pro' : 'spec'}\n </span>\n );\n}\n\nexport function OcLogoDropdown({\n current,\n homeHref = '/',\n siteState = 'live',\n children,\n className,\n triggerClassName,\n popoverClassName,\n}: OcLogoDropdownProps) {\n const [open, setOpen] = useState(false);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const menuId = useId();\n\n const currentCategory: FamilyCategory = findFamilyProperty(current)?.category ?? 'hub';\n\n // Outside-click + Escape close.\n useEffect(() => {\n if (!open) return;\n function onDoc(e: MouseEvent) {\n if (!containerRef.current) return;\n if (!containerRef.current.contains(e.target as Node)) setOpen(false);\n }\n function onKey(e: KeyboardEvent) {\n if (e.key === 'Escape') setOpen(false);\n }\n document.addEventListener('mousedown', onDoc);\n document.addEventListener('keydown', onKey);\n return () => {\n document.removeEventListener('mousedown', onDoc);\n document.removeEventListener('keydown', onKey);\n };\n }, [open]);\n\n return (\n <div\n ref={containerRef}\n className={'relative ' + (className ?? '')}\n data-oc-logo-dropdown=\"\"\n data-oc-current-category={currentCategory}\n data-oc-site-state={siteState}\n >\n <button\n type=\"button\"\n aria-haspopup=\"menu\"\n aria-expanded={open}\n aria-controls={menuId}\n aria-label=\"OrangeCheck family · open property menu\"\n title=\"Switch OrangeCheck product\"\n onClick={() => setOpen((v) => !v)}\n className={\n triggerClassName ??\n 'group hover:bg-accent/30 -mx-1.5 -my-1 flex min-h-[40px] items-center gap-2 rounded-sm px-1.5 py-1 transition-colors'\n }\n data-oc-logo-dropdown-trigger=\"\"\n >\n {children}\n <CategoryChip category={currentCategory} />\n <SiteStateBadge state={siteState} />\n <ChevronDown\n aria-hidden\n className={\n 'text-muted-foreground/70 group-hover:text-foreground/80 h-3.5 w-3.5 shrink-0 transition-transform ' +\n (open ? 'rotate-180' : '')\n }\n />\n </button>\n\n {open && (\n <div\n id={menuId}\n role=\"menu\"\n aria-label=\"OrangeCheck family\"\n className={\n popoverClassName ??\n 'bg-background absolute top-full left-0 z-[60] mt-2 w-[min(20rem,calc(100vw-1rem))] border shadow-lg'\n }\n data-oc-logo-dropdown-popover=\"\"\n >\n <div className=\"label-mono text-primary border-b px-4 py-2\">\n § the orangecheck family\n </div>\n <div className=\"max-h-[min(28rem,70vh)] overflow-y-auto py-1\" role=\"none\">\n {SECTIONS.map(({ category, label }) => {\n const sectionEntries = FAMILY_PROPERTIES.filter(\n (e) => e.category === category\n );\n if (sectionEntries.length === 0) return null;\n return (\n <div key={category} role=\"none\" data-oc-section={category}>\n <div\n role=\"separator\"\n aria-hidden\n className={\n 'text-muted-foreground/60 px-4 pt-2.5 pb-1 font-mono text-[9px] font-medium tracking-widest uppercase ' +\n (category === 'hub' ? '' : 'border-t mt-1')\n }\n >\n {label}\n </div>\n <ul role=\"none\" className=\"pb-1\">\n {sectionEntries.map((e) => {\n const isActive = e.slug === current;\n const href = isActive ? homeHref : e.origin;\n return (\n <li key={e.slug} role=\"none\">\n <Link\n href={href}\n role=\"menuitem\"\n onClick={() => setOpen(false)}\n aria-current={isActive ? 'page' : undefined}\n className={\n 'group flex items-center gap-2 px-4 py-2 transition-colors ' +\n (isActive\n ? 'bg-primary/8 border-primary -ml-px border-l-2'\n : 'hover:bg-muted -ml-px border-l-2 border-transparent')\n }\n data-oc-logo-dropdown-item={\n isActive ? 'current' : 'sibling'\n }\n data-oc-entry-category={e.category}\n >\n <span className=\"flex min-w-0 flex-1 flex-col leading-tight\">\n <span\n className={\n 'font-display text-[12px] font-semibold tracking-tight ' +\n (isActive\n ? 'text-primary'\n : 'text-foreground group-hover:text-primary transition-colors')\n }\n >\n {e.label}\n </span>\n <span className=\"text-muted-foreground mt-0.5 font-mono text-[10px] tracking-wide\">\n {e.sub}\n </span>\n </span>\n <MenuCategoryChip category={e.category} />\n {isActive ? (\n <span className=\"text-primary inline-flex shrink-0 items-center gap-1 font-mono text-[10px] tracking-widest uppercase\">\n home\n <Check className=\"h-3 w-3\" />\n </span>\n ) : null}\n </Link>\n </li>\n );\n })}\n </ul>\n </div>\n );\n })}\n </div>\n <div className=\"border-t px-4 py-2 font-mono text-[10px] tracking-widest uppercase\">\n <Link\n href=\"https://docs.ochk.io\"\n onClick={() => setOpen(false)}\n className=\"text-muted-foreground hover:text-foreground inline-block transition-colors\"\n >\n docs.ochk.io →\n </Link>\n </div>\n </div>\n )}\n </div>\n );\n}\n","'use client';\n\nimport Link from 'next/link';\nimport { useEffect, useRef, useState } from 'react';\nimport { useOcSession } from '@orangecheck/auth-client';\n\nimport type { EcosystemSlug } from './ecosystem-switcher';\nimport { findFamilyProperty, type SiteState } from './family-properties';\n\n/**\n * `<OcAccountMenu>` — the canonical top-right account affordance for\n * every family site. Replaces the older inline-styled `OcAccountChip`\n * from `@orangecheck/auth-client` with a Tailwind-styled, fully\n * configurable, cross-site-aware dropdown.\n *\n * Three explicit visual states:\n *\n * 1. **Pre-hydration / loading** — neutral `sign in` placeholder so\n * the header never goes blank on first paint.\n * 2. **Anonymous / error** — primary-styled `sign in` CTA pointing\n * at the site's local `/signin` (or whatever `signInUrl` you\n * pass).\n * 3. **Authenticated** — pill with a primary-tinted signal dot and\n * shortened did_oc (or display name if set); click → popover\n * with full address, optional site-specific menu items, family\n * dashboard link, sign-out, and an optional BuildFooter showing\n * site name + version + commit sha → GitHub.\n *\n * Cross-site recognition: the component re-fetches the session on\n * `visibilitychange` and `focus` events, so when a user signs in at a\n * sibling site (ochk.io, attest.ochk.io, etc.) and tabs back, the\n * chip flips from \"sign in\" to \"signed in\" without a hard reload.\n *\n * The component reads `useOcSession()` from `@orangecheck/auth-client`,\n * so the consuming app must mount `<OcSessionProvider>` somewhere in\n * its tree (already standard in every consumer's `_app.tsx`).\n */\n\nexport interface OcAccountMenuItem {\n /** Same-origin path or absolute URL. */\n href: string;\n /** Visible label. */\n label: string;\n /**\n * When `true`, opens in a new tab and renders a ↗ glyph after the\n * label. Use for cross-domain links (e.g. `https://ochk.io/dashboard`).\n */\n external?: boolean;\n}\n\nexport interface OcAccountMenuBuildInfo {\n /** Display version string, e.g. `'0.5.0'` (rendered as `v0.5.0`). */\n version: string;\n /**\n * 7+ character commit SHA. Render as `'dev'` (or omit) for local\n * dev to suppress the GitHub link.\n */\n sha?: string;\n /**\n * GitHub `owner/repo` slug — combined with `sha` to produce the\n * `https://github.com/<repo>/commit/<sha>` link.\n */\n repo?: string;\n}\n\n/**\n * Minimal session shape `<OcAccountMenuView>` needs. Compatible with\n * `useOcSession()`'s return value but explicit so consumers running\n * their own auth context (e.g. oc-www's local `useAuth`) can pass an\n * adapter without depending on `@orangecheck/auth-client`'s exact\n * types.\n */\nexport interface OcAccountMenuSession {\n status: 'loading' | 'authenticated' | 'anonymous' | 'error';\n account: { didOc: string; displayName: string | null } | null;\n signOut: () => void | Promise<void>;\n refresh: () => void | Promise<void>;\n}\n\nexport interface OcAccountMenuProps {\n /**\n * Which family property this site IS. Used to label the section\n * header (`§ signed in · vault.ochk.io`) and to suppress the\n * family-dashboard menu item when the user is already on `home`.\n */\n current: EcosystemSlug;\n /**\n * Where the anonymous \"sign in\" affordance points. Default `'/signin'`\n * — works with every site's in-place `<OcSignIn>` page. Pass\n * `'https://ochk.io/signin'` if you want to bounce to the auth host\n * instead.\n */\n signInUrl?: string;\n /** Label for the anonymous \"sign in\" affordance. Default `'sign in'`. */\n signInLabel?: string;\n /**\n * Site-specific menu items, rendered between the section header\n * and the family-dashboard / sign-out rows. Keep this short —\n * 2–6 entries is the sweet spot. Pass `[]` (or omit) for sites\n * with no per-site routes worth surfacing.\n */\n menuItems?: ReadonlyArray<OcAccountMenuItem>;\n /**\n * When `true` (default), shows a `family dashboard ↗` link to\n * `https://ochk.io/dashboard`. Set `false` for `home` (already\n * there) or for sites that don't want it.\n */\n showFamilyDashboard?: boolean;\n /**\n * Optional BuildFooter info. When present, renders a tiny mono\n * footer at the bottom of the popover with `site · vX.Y.Z · sha`\n * — the SHA links to the matching GitHub commit when `repo` is\n * also provided. Drive this from your `next.config.ts` via\n * `NEXT_PUBLIC_APP_VERSION` / `NEXT_PUBLIC_BUILD_SHA` env vars.\n */\n build?: OcAccountMenuBuildInfo;\n /**\n * Optional lifecycle chip rendered inside the BuildFooter line\n * (between site and version). Mirrors the chip on the logo so\n * both surfaces agree.\n */\n siteState?: SiteState;\n /** className overrides for layout-level customisation. */\n className?: string;\n triggerClassName?: string;\n popoverClassName?: string;\n}\n\nfunction shortenDid(s: string): string {\n if (s.length <= 14) return s;\n return `${s.slice(0, 7)}…${s.slice(-5)}`;\n}\n\n/**\n * Connected variant — pulls the session from `useOcSession()`. This is\n * what every consumer site with `<OcSessionProvider>` mounted should\n * use. For sites running a parallel auth context (e.g. oc-www's local\n * `useAuth`), use `<OcAccountMenuView>` below and pass a session prop\n * directly.\n */\nexport function OcAccountMenu(props: OcAccountMenuProps) {\n const session = useOcSession();\n return (\n <OcAccountMenuView\n {...props}\n session={{\n status: session.status,\n account: session.account\n ? {\n didOc: session.account.didOc,\n displayName: session.account.displayName ?? null,\n }\n : null,\n signOut: session.signOut,\n refresh: session.refresh,\n }}\n />\n );\n}\n\nexport interface OcAccountMenuViewProps extends OcAccountMenuProps {\n /**\n * The session to render. When using `<OcAccountMenuView>` directly\n * (rather than the connected `<OcAccountMenu>`), pass an adapter\n * over your local auth context.\n */\n session: OcAccountMenuSession;\n}\n\n/**\n * Presentational variant — takes a session as an explicit prop. Use\n * this when your site runs its own auth context (e.g. ochk.io's\n * local `useAuth`) and you want the family-consistent visual without\n * mounting `<OcSessionProvider>`.\n */\nexport function OcAccountMenuView({\n current,\n signInUrl = '/signin',\n signInLabel = 'sign in',\n menuItems,\n showFamilyDashboard,\n build,\n siteState,\n className,\n triggerClassName,\n popoverClassName,\n session,\n}: OcAccountMenuViewProps) {\n const { status, account, signOut, refresh } = session;\n const [hydrated, setHydrated] = useState(false);\n const [open, setOpen] = useState(false);\n const wrapRef = useRef<HTMLDivElement | null>(null);\n\n const property = findFamilyProperty(current);\n const hostname = property?.hostname ?? `${current}.ochk.io`;\n const isHome = current === 'home';\n const familyDashboardEnabled = showFamilyDashboard ?? !isHome;\n\n useEffect(() => setHydrated(true), []);\n\n // Cross-site sign-in pickup: re-fetch on visibility / focus.\n useEffect(() => {\n const onWake = () => {\n if (document.visibilityState === 'visible') void refresh();\n };\n const onFocus = () => void refresh();\n document.addEventListener('visibilitychange', onWake);\n window.addEventListener('focus', onFocus);\n return () => {\n document.removeEventListener('visibilitychange', onWake);\n window.removeEventListener('focus', onFocus);\n };\n }, [refresh]);\n\n // Outside-click + Escape close.\n useEffect(() => {\n if (!open) return;\n const onClick = (e: MouseEvent) => {\n if (wrapRef.current && !wrapRef.current.contains(e.target as Node)) setOpen(false);\n };\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setOpen(false);\n };\n document.addEventListener('mousedown', onClick);\n document.addEventListener('keydown', onKey);\n return () => {\n document.removeEventListener('mousedown', onClick);\n document.removeEventListener('keydown', onKey);\n };\n }, [open]);\n\n const signInTrigger = (\n <a\n href={signInUrl}\n aria-label={signInLabel}\n data-oc-account-menu-signin=\"\"\n className={\n triggerClassName ??\n 'border-input bg-background hover:bg-accent inline-flex h-8 items-center justify-center rounded-md border px-3 font-mono text-[11px] font-semibold tracking-widest uppercase transition-colors'\n }\n >\n {signInLabel}\n </a>\n );\n\n // States 1 + 2: pre-hydration or anonymous — render the same\n // placeholder/CTA so the slot is never empty.\n if (!hydrated || status === 'loading') {\n return signInTrigger;\n }\n\n if (status !== 'authenticated' || !account) {\n return signInTrigger;\n }\n\n // Authenticated — pill + popover.\n const displayName = account.displayName ?? null;\n const label = displayName ?? shortenDid(account.didOc);\n\n return (\n <div\n ref={wrapRef}\n className={'relative inline-block ' + (className ?? '')}\n data-oc-account-menu=\"\"\n >\n <button\n type=\"button\"\n onClick={() => setOpen((v) => !v)}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n aria-label={`Signed in as ${account.didOc}. Open account menu.`}\n className={\n triggerClassName ??\n 'border-primary/40 bg-card hover:bg-accent inline-flex h-8 items-center gap-1.5 rounded-md border px-3 font-mono text-[11px] tracking-wide transition-colors'\n }\n data-oc-account-menu-trigger=\"\"\n >\n <span className=\"bg-primary inline-block size-1.5 rounded-full\" aria-hidden />\n <span className=\"text-foreground\">{label}</span>\n <svg\n width=\"9\"\n height=\"9\"\n viewBox=\"0 0 10 10\"\n aria-hidden\n className={\n 'opacity-60 transition-transform ' + (open ? 'rotate-180' : 'rotate-0')\n }\n >\n <path\n d=\"M2 4 L5 7 L8 4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n fill=\"none\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n\n {open && (\n <div\n role=\"menu\"\n aria-label=\"Account menu\"\n className={\n popoverClassName ??\n 'border-border bg-popover text-popover-foreground absolute top-[calc(100%+6px)] right-0 z-50 w-[min(18rem,calc(100vw-1rem))] border shadow-xl'\n }\n data-oc-account-menu-popover=\"\"\n >\n <div className=\"border-border border-b p-3\">\n <div className=\"text-primary mb-1 font-mono text-[10px] tracking-widest uppercase\">\n § signed in · {hostname}\n </div>\n <div className=\"text-foreground/90 font-mono text-[11px] leading-tight break-all\">\n {account.didOc}\n </div>\n {displayName ? (\n <div className=\"text-muted-foreground/80 mt-1 font-mono text-[10px] tracking-wide\">\n {displayName}\n </div>\n ) : null}\n </div>\n\n <div className=\"p-1\">\n {menuItems?.map((item) => {\n const onClick = () => setOpen(false);\n const cls =\n 'hover:bg-accent flex items-center gap-2 px-3 py-2 font-mono text-[11px] tracking-wide transition-colors';\n const inner = (\n <>\n <span className=\"text-muted-foreground\" aria-hidden>\n →\n </span>\n <span className=\"flex-1\">{item.label}</span>\n {item.external ? (\n <span\n className=\"text-muted-foreground/70 text-[10px]\"\n aria-hidden\n >\n ↗\n </span>\n ) : null}\n </>\n );\n return item.external ? (\n <a\n key={item.href}\n href={item.href}\n target=\"_blank\"\n rel=\"noreferrer\"\n onClick={onClick}\n role=\"menuitem\"\n className={cls}\n data-oc-account-menu-item=\"\"\n >\n {inner}\n </a>\n ) : (\n <Link\n key={item.href}\n href={item.href}\n onClick={onClick}\n role=\"menuitem\"\n className={cls}\n data-oc-account-menu-item=\"\"\n >\n {inner}\n </Link>\n );\n })}\n\n {familyDashboardEnabled ? (\n <a\n href=\"https://ochk.io/dashboard\"\n target=\"_blank\"\n rel=\"noreferrer\"\n onClick={() => setOpen(false)}\n role=\"menuitem\"\n className=\"hover:bg-accent flex items-center gap-2 px-3 py-2 font-mono text-[11px] tracking-wide transition-colors\"\n data-oc-account-menu-item=\"\"\n data-oc-account-menu-family-dashboard=\"\"\n >\n <span className=\"text-muted-foreground\" aria-hidden>\n →\n </span>\n <span className=\"flex-1\">family dashboard</span>\n <span\n className=\"text-muted-foreground/70 text-[10px]\"\n aria-hidden\n >\n ↗\n </span>\n </a>\n ) : null}\n\n <button\n type=\"button\"\n role=\"menuitem\"\n onClick={() => {\n setOpen(false);\n void signOut();\n }}\n className=\"hover:bg-accent flex w-full items-center gap-2 px-3 py-2 text-left font-mono text-[11px] tracking-wide transition-colors\"\n data-oc-account-menu-item=\"\"\n data-oc-account-menu-signout=\"\"\n >\n <span className=\"text-muted-foreground\" aria-hidden>\n →\n </span>\n <span className=\"flex-1\">sign out</span>\n </button>\n </div>\n\n {build ? <BuildFooter hostname={hostname} build={build} state={siteState} /> : null}\n </div>\n )}\n </div>\n );\n}\n\nfunction BuildFooter({\n hostname,\n build,\n state,\n}: {\n hostname: string;\n build: OcAccountMenuBuildInfo;\n state?: SiteState;\n}) {\n const sha = build.sha;\n const showSha = !!sha && sha !== 'dev';\n const commitUrl = showSha && build.repo ? `https://github.com/${build.repo}/commit/${sha}` : null;\n return (\n <div\n className=\"text-muted-foreground/60 border-border border-t px-3 py-2 font-mono text-[9.5px] tracking-widest uppercase\"\n data-oc-account-menu-build=\"\"\n >\n {hostname}\n {state && state !== 'live' ? (\n <>\n {' · '}\n <span className=\"text-muted-foreground/80\">{state}</span>\n </>\n ) : null}{' '}\n <span className=\"text-muted-foreground/80\">\n v{build.version}\n {showSha ? (\n <>\n {' · '}\n {commitUrl ? (\n <a\n href={commitUrl}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"hover:text-foreground/90 underline decoration-dotted underline-offset-2\"\n >\n {sha}\n </a>\n ) : (\n sha\n )}\n </>\n ) : null}\n </span>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\n\n/**\n * AppShell — shared page chrome for every authenticated dashboard surface\n * across the OC family (vault, me, fleet, future). Lifted from oc-me-web's\n * `MeShell` and oc-vault-web's `VaultShell` — same eyebrow / title /\n * description / actions header band, no sidebar (sidebars are app-specific\n * and stay in the consuming app).\n *\n * Usage:\n * <AppShell eyebrow=\"§ vault\" title=\"your vault.\" description=\"…\">\n * ...\n * </AppShell>\n *\n * The component is stateless and dependency-free. Tailwind classes assume\n * the consuming site loads the family `globals.css` (which defines\n * `.container`, `.label-mono`, the dark-by-default palette, etc.).\n */\n\nexport interface AppShellProps {\n eyebrow?: ReactNode;\n title?: ReactNode;\n description?: ReactNode;\n /** Right-aligned action node rendered next to the title (e.g. CTA buttons). */\n headerActions?: ReactNode;\n children: ReactNode;\n className?: string;\n}\n\nexport function AppShell({\n eyebrow,\n title,\n description,\n headerActions,\n children,\n className,\n}: AppShellProps) {\n const hasHeader = Boolean(title);\n return (\n <div className={'container ' + (className ?? '')}>\n <div className=\"flex min-h-[calc(100vh-3rem)] flex-col\">\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <div className=\"pt-6 md:pt-8\">\n {hasHeader && (\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between\">\n <div className=\"max-w-3xl\">\n {eyebrow && (\n <div className=\"label-mono text-primary mb-3\">\n {eyebrow}\n </div>\n )}\n <h1 className=\"font-display text-2xl font-bold tracking-tight sm:text-3xl\">\n {title}\n </h1>\n {description && (\n <p className=\"text-muted-foreground mt-3 max-w-[64ch] text-sm leading-relaxed\">\n {description}\n </p>\n )}\n </div>\n {headerActions && (\n <div className=\"flex shrink-0 items-center gap-2\">\n {headerActions}\n </div>\n )}\n </div>\n )}\n <div className={hasHeader ? 'mt-8 pb-12' : 'pb-12'}>{children}</div>\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\n\nexport interface SectionHeaderProps {\n /** Plain section name — rendered after a \"§ \" glyph in label-mono. */\n label: string;\n /** Optional right-side string (count, \"most recent first\"). */\n meta?: ReactNode;\n tone?: 'primary' | 'muted' | 'warning' | 'success' | 'destructive';\n className?: string;\n}\n\nconst TONE_CLASS = {\n primary: 'text-primary',\n muted: 'text-muted-foreground',\n warning: 'text-warning',\n success: 'text-success',\n destructive: 'text-destructive',\n} as const;\n\n/**\n * SectionHeader — the canonical \"§ x\" section header used across every\n * /me, /vault, and /fleet dashboard surface. Lifted from oc-me-web's\n * `me/ui/SectionHeader` so the visual contract stays single-source.\n *\n * Pattern is `label-mono text-primary mb-3` with a \"§ \" glyph followed by\n * the label, plus an optional muted/uppercase right-side meta string.\n */\nexport function SectionHeader({\n label,\n meta,\n tone = 'primary',\n className = '',\n}: SectionHeaderProps) {\n return (\n <div className={`mb-3 flex items-baseline justify-between gap-2 ${className}`}>\n <div className=\"flex items-center gap-1.5\">\n <div className={`label-mono ${TONE_CLASS[tone]}`}>§ {label}</div>\n </div>\n {meta && (\n <span className=\"text-muted-foreground/70 font-mono text-[10px] tracking-widest uppercase\">\n {meta}\n </span>\n )}\n </div>\n );\n}\n","import Link from 'next/link';\nimport type { ReactNode } from 'react';\n\nexport interface EmptyStateCta {\n label: string;\n href: string;\n /** External links open in a new tab and get a ↗ glyph. */\n external?: boolean;\n}\n\nexport interface EmptyStateProps {\n /** Short heading — one mono-uppercased label like \"no entries yet\". */\n label: string;\n /** Body — short prose explaining what would appear here and how. */\n children: ReactNode;\n cta?: EmptyStateCta;\n secondary?: EmptyStateCta;\n tone?: 'info' | 'warning' | 'muted';\n className?: string;\n}\n\nconst TONE_CLASS = {\n info: 'border-primary/30 bg-primary/5',\n warning: 'border-warning/40 bg-warning/5',\n muted: 'border-border bg-muted/20',\n} as const;\n\nconst LABEL_TONE_CLASS = {\n info: 'text-primary',\n warning: 'text-warning',\n muted: 'text-muted-foreground',\n} as const;\n\n/**\n * EmptyState — the canonical empty-state card used across every /me,\n * /vault, and /fleet dashboard. Empty states should *teach*: explain what\n * would appear, and how to make it appear. Lifted from oc-me-web's\n * `me/ui/EmptyState`.\n */\nexport function EmptyState({\n label,\n children,\n cta,\n secondary,\n tone = 'info',\n className = '',\n}: EmptyStateProps) {\n return (\n <div className={`border p-5 md:p-6 ${TONE_CLASS[tone]} ${className}`}>\n <div className={`label-mono mb-2 ${LABEL_TONE_CLASS[tone]}`}>§ {label}</div>\n <div className=\"text-foreground/85 max-w-2xl text-sm leading-relaxed\">{children}</div>\n {(cta || secondary) && (\n <div className=\"mt-4 flex flex-wrap gap-3\">\n {cta && <CtaLink {...cta} variant=\"primary\" />}\n {secondary && <CtaLink {...secondary} variant=\"secondary\" />}\n </div>\n )}\n </div>\n );\n}\n\nfunction CtaLink({\n label,\n href,\n external,\n variant,\n}: EmptyStateCta & { variant: 'primary' | 'secondary' }) {\n const cls =\n variant === 'primary'\n ? 'bg-primary text-primary-foreground hover:bg-primary/90 inline-flex h-9 items-center justify-center rounded-md px-4 font-mono text-[11px] font-semibold tracking-widest uppercase'\n : 'text-muted-foreground hover:text-foreground border-input hover:bg-accent inline-flex h-9 items-center justify-center rounded-md border px-4 font-mono text-[11px] tracking-widest uppercase';\n const text = external ? `${label} ↗` : label;\n if (external) {\n return (\n <a href={href} target=\"_blank\" rel=\"noreferrer\" className={cls}>\n {text}\n </a>\n );\n }\n return (\n <Link href={href} className={cls}>\n {text}\n </Link>\n );\n}\n","import type { ReactNode } from 'react';\n\nexport interface StatItem {\n /** Short uppercased label rendered in mono. */\n label: string;\n /** Primary value · already formatted as a string. */\n value: string;\n /** Optional secondary line · USD conversion, \"last 30 days\", etc. */\n sub?: string;\n /** When true, value is rendered in primary tone (use for headline metric). */\n accent?: boolean;\n /** Optional tone for the value (overrides accent). */\n tone?: 'default' | 'primary' | 'success' | 'warning' | 'destructive' | 'muted';\n}\n\nexport interface StatGridProps {\n items: StatItem[];\n columns?: 1 | 2 | 3 | 4;\n className?: string;\n}\n\nconst TONE_CLASS = {\n default: '',\n primary: 'text-primary',\n success: 'text-success',\n warning: 'text-warning',\n destructive: 'text-destructive',\n muted: 'text-muted-foreground',\n} as const;\n\nconst COL_CLASS = {\n 1: '',\n 2: 'md:grid-cols-2',\n 3: 'md:grid-cols-3',\n 4: 'md:grid-cols-2 lg:grid-cols-4',\n} as const;\n\n/**\n * StatGrid — the canonical stats row used across family dashboards.\n * Lifted from oc-me-web's `me/ui/StatGrid`. Grid of equal-width tiles\n * separated by 1px borders. Always pre-format the value string —\n * the component does no number formatting.\n */\nexport function StatGrid({ items, columns = 3, className = '' }: StatGridProps) {\n return (\n <div className={`bg-border grid gap-px border ${COL_CLASS[columns]} ${className}`}>\n {items.map((it, i) => (\n <Tile key={`${it.label}-${i}`} item={it} />\n ))}\n </div>\n );\n}\n\nfunction Tile({ item }: { item: StatItem }) {\n const tone = item.tone ?? (item.accent ? 'primary' : 'default');\n return (\n <div className=\"bg-background p-5\">\n <div className=\"text-muted-foreground/80 font-mono text-[10px] tracking-widest uppercase\">\n {item.label}\n </div>\n <div\n className={`font-display mt-1 text-2xl font-bold tabular-nums tracking-tight ${TONE_CLASS[tone]}`}\n >\n {item.value}\n </div>\n {item.sub && (\n <div className=\"text-muted-foreground/70 mt-1 font-mono text-[10px] tracking-widest uppercase\">\n {item.sub}\n </div>\n )}\n </div>\n );\n}\n\nexport function StatTile({ children, ...item }: StatItem & { children?: ReactNode }) {\n return (\n <div>\n <Tile item={item} />\n {children}\n </div>\n );\n}\n"]}
|