@orangecheck/app-design 0.6.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -3
- package/dist/brand.js.map +1 -1
- package/dist/brand.mjs.map +1 -1
- package/dist/chrome.d.mts +49 -15
- package/dist/chrome.d.ts +49 -15
- package/dist/chrome.js +619 -55
- package/dist/chrome.js.map +1 -1
- package/dist/chrome.mjs +617 -57
- package/dist/chrome.mjs.map +1 -1
- package/dist/components.d.mts +231 -1
- package/dist/components.d.ts +231 -1
- package/dist/components.js +1187 -2
- package/dist/components.js.map +1 -1
- package/dist/components.mjs +1162 -5
- package/dist/components.mjs.map +1 -1
- package/dist/family.d.mts +2 -0
- package/dist/family.d.ts +2 -0
- package/dist/family.js +167 -0
- package/dist/family.js.map +1 -0
- package/dist/family.mjs +154 -0
- package/dist/family.mjs.map +1 -0
- package/dist/index-C6hDqOOS.d.mts +58 -0
- package/dist/index-C6hDqOOS.d.ts +58 -0
- package/dist/index.d.mts +5 -3
- package/dist/index.d.ts +5 -3
- package/dist/index.js +1619 -132
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1575 -134
- package/dist/index.mjs.map +1 -1
- package/dist/primitives.d.mts +52 -1
- package/dist/primitives.d.ts +52 -1
- package/dist/primitives.js +280 -3
- package/dist/primitives.js.map +1 -1
- package/dist/primitives.mjs +271 -6
- package/dist/primitives.mjs.map +1 -1
- package/dist/status-badge-BEOxeY9j.d.ts +13 -0
- package/dist/status-badge-DRwGhB0h.d.mts +13 -0
- package/dist/styles/fonts.css +1 -1
- package/dist/styles/tokens.css +4 -2
- package/dist/tokens.d.mts +3 -1
- package/dist/tokens.d.ts +3 -1
- package/dist/tokens.js +5 -3
- package/dist/tokens.js.map +1 -1
- package/dist/tokens.mjs +5 -3
- package/dist/tokens.mjs.map +1 -1
- package/package.json +9 -2
package/dist/chrome.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/cn.ts","../src/brand/mark.tsx","../src/primitives/overlay.tsx","../src/chrome/site.tsx","../src/lib/shell-context.ts","../src/chrome/app-shell.tsx"],"names":["DialogContent","jsxs","jsx","DialogTitle","DialogDescription","SheetContent","PopoverContent","TooltipContent","DropdownMenuContent","DropdownMenuItem","DropdownMenuLabel","DropdownMenuSeparator","Link","useState","Menu"],"mappings":"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","file":"chrome.mjs","sourcesContent":["import { clsx, type ClassValue } from 'clsx';\nimport { extendTailwindMerge } from 'tailwind-merge';\n\n// tailwind-merge would treat `oca-display-1` and `text-foreground` as the same\n// group and drop one; teach it the package's own type utilities.\nconst merge = extendTailwindMerge<'oca-type'>({\n extend: {\n classGroups: {\n 'oca-type': [\n 'oca-display-1',\n 'oca-display-2',\n 'oca-display-3',\n 'oca-title',\n 'oca-title-sm',\n 'oca-eyebrow',\n 'oca-lead',\n 'oca-body',\n 'oca-numeral',\n ],\n },\n },\n});\n\nexport function cn(...inputs: ClassValue[]): string {\n return merge(clsx(inputs));\n}\n","import type { SVGProps } from 'react';\n\nimport { cn } from '../lib/cn';\n\n/*\n * The isometric check, measured from Sou's deck (slide 9) onto a 16×8 grid:\n * a chevron with a 3-unit short arm and a 5-unit long arm, one unit thick,\n * extruded two units. Three faces, three oranges.\n */\n\nconst TOP = '0,3 2,2 6,4 14,0 16,1 6,6';\nconst LEFT = '0,3 6,6 6,8 0,5';\nconst RIGHT = '6,6 16,1 16,3 6,8';\n\nexport const MARK_FACES = { top: '#FED8AB', left: '#FB933C', right: '#EA580B' } as const;\n\nexport interface MarkProps extends Omit<SVGProps<SVGSVGElement>, 'children'> {\n /** Accessible name. Omit to render the mark as decoration. */\n title?: string;\n /** Rendered width in px; height follows the 2:1 grid. */\n size?: number;\n}\n\nexport function Mark({ title, size, className, ...rest }: MarkProps) {\n return (\n <svg\n viewBox=\"0 0 16 8\"\n width={size}\n height={size ? size / 2 : undefined}\n role={title ? 'img' : undefined}\n aria-hidden={title ? undefined : true}\n className={cn('shrink-0', className)}\n {...rest}\n >\n {title ? <title>{title}</title> : null}\n <polygon points={LEFT} fill={MARK_FACES.left} />\n <polygon points={RIGHT} fill={MARK_FACES.right} />\n <polygon points={TOP} fill={MARK_FACES.top} />\n </svg>\n );\n}\n\nexport interface AppIconProps extends Omit<SVGProps<SVGSVGElement>, 'children'> {\n title?: string;\n size?: number;\n}\n\n/** The app icon: the mark on an ink squircle, as in the deck's lockup. */\nexport function AppIcon({ title, size = 32, className, ...rest }: AppIconProps) {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n width={size}\n height={size}\n role={title ? 'img' : undefined}\n aria-hidden={title ? undefined : true}\n className={cn('shrink-0', className)}\n {...rest}\n >\n {title ? <title>{title}</title> : null}\n <rect\n width=\"24\"\n height=\"24\"\n rx=\"6.25\"\n style={{ fill: 'var(--oca-icon-tile, #0A0A0A)', stroke: 'var(--oca-icon-ring, transparent)' }}\n strokeWidth=\"0.5\"\n />\n <g transform=\"translate(4.25 8.1) scale(0.97)\">\n <polygon points={LEFT} fill={MARK_FACES.left} />\n <polygon points={RIGHT} fill={MARK_FACES.right} />\n <polygon points={TOP} fill={MARK_FACES.top} />\n </g>\n </svg>\n );\n}\n\nexport interface LockupProps {\n /** The word beside the icon. */\n name?: string;\n /** Icon size in px; the word scales with it. */\n size?: number;\n className?: string;\n}\n\n/** Icon and wordmark, lowercase, as the deck sets it. */\nexport function Lockup({ name = 'orangecheck', size = 28, className }: LockupProps) {\n return (\n <span\n className={cn('inline-flex items-center font-medium tracking-[-0.01em]', className)}\n style={{ gap: size * 0.32, fontSize: size * 0.56 }}\n >\n <AppIcon size={size} />\n <span>{name}</span>\n </span>\n );\n}\n","import * as DialogPrimitive from '@radix-ui/react-dialog';\nimport * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';\nimport * as PopoverPrimitive from '@radix-ui/react-popover';\nimport * as TooltipPrimitive from '@radix-ui/react-tooltip';\nimport { X } from 'lucide-react';\nimport { forwardRef, type ComponentPropsWithoutRef, type ElementRef, type HTMLAttributes } from 'react';\n\nimport { cn } from '../lib/cn';\n\n/* ── Dialog ───────────────────────────────────────────────────────────── */\n\nexport const Dialog = DialogPrimitive.Root;\nexport const DialogTrigger = DialogPrimitive.Trigger;\nexport const DialogClose = DialogPrimitive.Close;\n\nconst overlayClass =\n 'oca-animate-fade fixed inset-0 z-50 bg-[rgb(10_10_10/0.38)] backdrop-blur-[2px] data-[state=closed]:opacity-0';\n\nexport const DialogContent = forwardRef<\n ElementRef<typeof DialogPrimitive.Content>,\n ComponentPropsWithoutRef<typeof DialogPrimitive.Content> & { hideClose?: boolean }\n>(function DialogContent({ className, children, hideClose, ...props }, ref) {\n return (\n <DialogPrimitive.Portal>\n <DialogPrimitive.Overlay className={overlayClass} />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n 'oca-animate-rise fixed left-1/2 top-1/2 z-50 w-[min(92vw,34rem)] -translate-x-1/2 -translate-y-1/2',\n 'max-h-[88vh] overflow-y-auto rounded-[1.5rem] border border-border bg-popover p-6 text-popover-foreground shadow-xl md:p-8',\n 'outline-none',\n className\n )}\n {...props}\n >\n {children}\n {hideClose ? null : (\n <DialogPrimitive.Close\n className=\"absolute right-4 top-4 inline-flex size-9 items-center justify-center rounded-full text-muted-foreground transition-colors hover:bg-accent hover:text-foreground\"\n aria-label=\"Close\"\n >\n <X className=\"size-4\" />\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </DialogPrimitive.Portal>\n );\n});\n\nexport function DialogHeader({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return <div className={cn('mb-5 flex flex-col gap-2 pr-8', className)} {...props} />;\n}\n\nexport function DialogFooter({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return <div className={cn('mt-7 flex flex-col-reverse gap-3 sm:flex-row sm:justify-end', className)} {...props} />;\n}\n\nexport const DialogTitle = forwardRef<\n ElementRef<typeof DialogPrimitive.Title>,\n ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(function DialogTitle({ className, ...props }, ref) {\n return (\n <DialogPrimitive.Title\n ref={ref}\n className={cn('text-[1.5rem] font-normal leading-tight tracking-[-0.02em]', className)}\n {...props}\n />\n );\n});\n\nexport const DialogDescription = forwardRef<\n ElementRef<typeof DialogPrimitive.Description>,\n ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(function DialogDescription({ className, ...props }, ref) {\n return <DialogPrimitive.Description ref={ref} className={cn('oca-body', className)} {...props} />;\n});\n\n/* ── Sheet: a dialog from an edge ────────────────────────────────────── */\n\nexport const Sheet = DialogPrimitive.Root;\nexport const SheetTrigger = DialogPrimitive.Trigger;\nexport const SheetClose = DialogPrimitive.Close;\nexport const SheetTitle = DialogTitle;\nexport const SheetDescription = DialogDescription;\n\nconst sheetSide = {\n right: 'inset-y-0 right-0 h-full w-[min(88vw,24rem)] border-l',\n left: 'inset-y-0 left-0 h-full w-[min(88vw,24rem)] border-r',\n bottom: 'inset-x-0 bottom-0 max-h-[88vh] rounded-t-[1.5rem] border-t',\n} as const;\n\nexport const SheetContent = forwardRef<\n ElementRef<typeof DialogPrimitive.Content>,\n ComponentPropsWithoutRef<typeof DialogPrimitive.Content> & { side?: keyof typeof sheetSide }\n>(function SheetContent({ className, children, side = 'right', ...props }, ref) {\n return (\n <DialogPrimitive.Portal>\n <DialogPrimitive.Overlay className={overlayClass} />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n 'oca-animate-fade fixed z-50 flex flex-col gap-4 overflow-y-auto border-border bg-popover p-6 text-popover-foreground shadow-xl outline-none',\n sheetSide[side],\n className\n )}\n {...props}\n >\n {children}\n <DialogPrimitive.Close\n className=\"absolute right-4 top-4 inline-flex size-9 items-center justify-center rounded-full text-muted-foreground hover:bg-accent hover:text-foreground\"\n aria-label=\"Close\"\n >\n <X className=\"size-4\" />\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </DialogPrimitive.Portal>\n );\n});\n\n/* ── Popover ──────────────────────────────────────────────────────────── */\n\nexport const Popover = PopoverPrimitive.Root;\nexport const PopoverTrigger = PopoverPrimitive.Trigger;\nexport const PopoverAnchor = PopoverPrimitive.Anchor;\n\nexport const PopoverContent = forwardRef<\n ElementRef<typeof PopoverPrimitive.Content>,\n ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>\n>(function PopoverContent({ className, align = 'center', sideOffset = 8, ...props }, ref) {\n return (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\n className={cn(\n 'oca-animate-fade z-50 w-72 rounded-2xl border border-border bg-popover p-4 text-popover-foreground shadow-lg outline-none',\n className\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n );\n});\n\n/* ── Tooltip: ink, small, quick ───────────────────────────────────────── */\n\nexport const TooltipProvider = TooltipPrimitive.Provider;\nexport const Tooltip = TooltipPrimitive.Root;\nexport const TooltipTrigger = TooltipPrimitive.Trigger;\n\nexport const TooltipContent = forwardRef<\n ElementRef<typeof TooltipPrimitive.Content>,\n ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(function TooltipContent({ className, sideOffset = 6, ...props }, ref) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n 'oca-animate-fade z-50 max-w-xs rounded-lg bg-oca-ink px-2.5 py-1.5 text-[0.8125rem] leading-snug text-oca-ink-foreground',\n className\n )}\n {...props}\n />\n </TooltipPrimitive.Portal>\n );\n});\n\n/* ── Menu ─────────────────────────────────────────────────────────────── */\n\nexport const DropdownMenu = DropdownMenuPrimitive.Root;\nexport const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;\nexport const DropdownMenuGroup = DropdownMenuPrimitive.Group;\n\nexport const DropdownMenuContent = forwardRef<\n ElementRef<typeof DropdownMenuPrimitive.Content>,\n ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>\n>(function DropdownMenuContent({ className, sideOffset = 8, ...props }, ref) {\n return (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n 'oca-animate-fade z-50 min-w-56 overflow-hidden rounded-2xl border border-border bg-popover p-1.5 text-popover-foreground shadow-lg',\n className\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n );\n});\n\nexport const DropdownMenuItem = forwardRef<\n ElementRef<typeof DropdownMenuPrimitive.Item>,\n ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & { destructive?: boolean }\n>(function DropdownMenuItem({ className, destructive, ...props }, ref) {\n return (\n <DropdownMenuPrimitive.Item\n ref={ref}\n className={cn(\n 'flex h-10 cursor-default select-none items-center gap-2.5 rounded-xl px-3 text-[0.9375rem] outline-none',\n 'data-[highlighted]:bg-accent data-[disabled]:opacity-50 [&_svg]:size-4 [&_svg]:text-muted-foreground',\n destructive && 'text-destructive [&_svg]:text-destructive',\n className\n )}\n {...props}\n />\n );\n});\n\nexport const DropdownMenuLabel = forwardRef<\n ElementRef<typeof DropdownMenuPrimitive.Label>,\n ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label>\n>(function DropdownMenuLabel({ className, ...props }, ref) {\n return (\n <DropdownMenuPrimitive.Label\n ref={ref}\n className={cn('px-3 pb-1.5 pt-2 text-[0.8125rem] text-muted-foreground', className)}\n {...props}\n />\n );\n});\n\nexport const DropdownMenuSeparator = forwardRef<\n ElementRef<typeof DropdownMenuPrimitive.Separator>,\n ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\n>(function DropdownMenuSeparator({ className, ...props }, ref) {\n return <DropdownMenuPrimitive.Separator ref={ref} className={cn('my-1.5 h-px bg-border', className)} {...props} />;\n});\n","import { Menu } from 'lucide-react';\nimport Link from 'next/link';\nimport { useState, type ReactNode } from 'react';\n\nimport { Lockup, Mark } from '../brand/mark';\nimport { cn } from '../lib/cn';\nimport { Sheet, SheetContent, SheetTitle, SheetTrigger } from '../primitives/overlay';\n\nexport interface NavItem {\n href: string;\n label: ReactNode;\n /** Marks the current section for styling and aria-current. */\n active?: boolean;\n external?: boolean;\n}\n\nfunction NavLink({ item, className, onNavigate }: { item: NavItem; className?: string; onNavigate?: () => void }) {\n const cls = cn(\n 'rounded-full px-3 py-2 text-[0.9375rem] transition-colors',\n item.active ? 'text-foreground' : 'text-muted-foreground hover:text-foreground',\n className\n );\n if (item.external) {\n return (\n <a href={item.href} className={cls} rel=\"noreferrer\" onClick={onNavigate}>\n {item.label}\n </a>\n );\n }\n return (\n <Link href={item.href} className={cls} aria-current={item.active ? 'page' : undefined} onClick={onNavigate}>\n {item.label}\n </Link>\n );\n}\n\n/**\n * The public header: lockup, a few words of navigation, actions on the right.\n * Below md the navigation moves into a sheet; the actions stay.\n */\nexport function SiteHeader({\n home = '/',\n brand,\n nav = [],\n actions,\n className,\n}: {\n home?: string;\n brand?: ReactNode;\n nav?: NavItem[];\n actions?: ReactNode;\n className?: string;\n}) {\n const [open, setOpen] = useState(false);\n return (\n <header\n className={cn(\n 'sticky top-0 z-40 w-full border-b border-transparent bg-background/85 backdrop-blur-md supports-[backdrop-filter]:bg-background/70',\n className\n )}\n >\n <div\n className={cn(\n 'oca-container flex h-16 items-center justify-between gap-4 md:h-[4.5rem]',\n // Three columns, the outer two each at least their content: the\n // navigation stays centred whatever the actions hold, so it does\n // not shift when they change (signed out to signed in).\n nav.length > 0 &&\n 'md:grid md:grid-cols-[minmax(max-content,1fr)_auto_minmax(max-content,1fr)]'\n )}\n >\n <Link href={home} className=\"-ml-1 justify-self-start rounded-lg p-1\">\n {brand ?? <Lockup size={28} />}\n {/* Read as \"orangecheck home\": the name starts with what the link shows. */}\n <span className=\"sr-only\"> home</span>\n </Link>\n {nav.length > 0 ? (\n <nav aria-label=\"Main\" className=\"hidden items-center gap-1 md:flex\">\n {nav.map((n) => (\n <NavLink key={n.href} item={n} />\n ))}\n </nav>\n ) : null}\n <div className=\"flex items-center gap-2 justify-self-end\">\n {actions}\n {nav.length > 0 ? (\n <Sheet open={open} onOpenChange={setOpen}>\n <SheetTrigger\n className=\"inline-flex size-10 items-center justify-center rounded-full text-foreground hover:bg-accent md:hidden\"\n aria-label=\"Open menu\"\n >\n <Menu className=\"size-5\" />\n </SheetTrigger>\n <SheetContent side=\"right\" className=\"pt-16\">\n <SheetTitle className=\"sr-only\">Menu</SheetTitle>\n <nav aria-label=\"Main\" className=\"flex flex-col\">\n {nav.map((n) => (\n <NavLink\n key={n.href}\n item={n}\n className=\"rounded-xl px-3 py-3 text-[1.0625rem]\"\n onNavigate={() => setOpen(false)}\n />\n ))}\n </nav>\n </SheetContent>\n </Sheet>\n ) : null}\n </div>\n </div>\n </header>\n );\n}\n\nexport interface FooterColumn {\n heading: string;\n links: NavItem[];\n}\n\n/**\n * The footer, in the deck's register: a line of fine print, the support credit,\n * and a few columns of links. Links are 44px tall on phones.\n */\nexport function SiteFooter({\n columns = [],\n fineprint,\n meta,\n signature = true,\n className,\n}: {\n columns?: FooterColumn[];\n fineprint?: ReactNode;\n meta?: ReactNode;\n /** The mark and wordmark at display size, closing the page. */\n signature?: boolean;\n className?: string;\n}) {\n return (\n <footer className={cn('border-t border-border bg-background', className)}>\n <div className=\"oca-container grid grid-cols-2 gap-x-6 gap-y-10 py-14 md:grid-cols-[1.3fr_repeat(3,1fr)] md:py-16\">\n <div className=\"col-span-2 flex flex-col gap-4 md:col-span-1\">\n <Lockup size={26} />\n {fineprint ? <p className=\"max-w-xs text-[0.9375rem] leading-relaxed text-muted-foreground\">{fineprint}</p> : null}\n </div>\n {columns.map((col, i) => {\n // On a phone an odd last column takes the whole row, its links in two\n // columns, instead of sitting alone beside an empty half.\n const spans = columns.length % 2 === 1 && i === columns.length - 1;\n return (\n <div\n key={col.heading}\n className={cn('flex min-w-0 flex-col gap-1', spans && 'col-span-2 md:col-span-1')}\n >\n <p className=\"mb-2 text-[0.875rem] font-medium\">{col.heading}</p>\n <div className={cn('flex flex-col gap-1', spans && 'grid grid-cols-2 gap-x-6 md:flex md:flex-col')}>\n {col.links.map((l) => (\n <NavLink\n key={l.href}\n item={l}\n className=\"-mx-3 py-2.5 text-[0.9375rem] md:py-1.5\"\n />\n ))}\n </div>\n </div>\n );\n })}\n </div>\n {signature ? (\n <div aria-hidden className=\"oca-container select-none overflow-hidden pb-8 md:pb-12\">\n <div className=\"flex items-end gap-[0.18em] text-[clamp(3rem,11.5vw,10rem)] leading-[0.78] tracking-[-0.065em] [font-family:var(--oc-font-display)]\">\n <span className=\"mb-[0.06em] inline-block w-[1.1em] shrink-0\">\n <Mark className=\"block h-auto w-full\" />\n </span>\n <span>orangecheck</span>\n </div>\n </div>\n ) : null}\n {meta ? (\n <div className=\"oca-container\">\n {/* The rule spans the content, not the gutters. */}\n <div className=\"border-t border-border py-6 text-[0.875rem] text-muted-foreground\">{meta}</div>\n </div>\n ) : null}\n </footer>\n );\n}\n","import { createContext, useContext } from 'react';\n\n/** Where the viewer is inside the signed-in shell: its section and page. */\nexport interface ShellPlace {\n section?: string;\n page?: string;\n}\n\nexport const ShellContext = createContext<ShellPlace>({});\n\nexport function useShellPlace(): ShellPlace {\n return useContext(ShellContext);\n}\n","import { ChevronRight, Menu, Moon, Sun, SunMoon } from 'lucide-react';\nimport Link from 'next/link';\nimport { useTheme } from 'next-themes';\nimport { useEffect, useMemo, useState, type ReactNode } from 'react';\n\nimport { Lockup } from '../brand/mark';\nimport { cn } from '../lib/cn';\nimport { ShellContext } from '../lib/shell-context';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n Sheet,\n SheetContent,\n SheetTitle,\n SheetTrigger,\n} from '../primitives/overlay';\n\nexport interface ShellNavItem {\n href: string;\n label: string;\n icon?: ReactNode;\n active?: boolean;\n /** A count or a dot beside the label (unread, needs attention). */\n badge?: ReactNode;\n}\n\nexport interface ShellNavGroup {\n /** Omit for the first, unlabeled group. */\n label?: string;\n items: ShellNavItem[];\n}\n\n/**\n * A part of the app with its own pages: \"You\", \"Build\", \"Operate\", \"Admin\".\n * The sidebar lists one section's pages at a time, under a switcher.\n */\nexport interface ShellSection {\n id: string;\n /** Short, for the switcher: one word. */\n label: string;\n /** The section's eyebrow on its pages; defaults to `label`. */\n title?: string;\n /** Where the switcher goes: the section's first page. */\n href: string;\n groups: ShellNavGroup[];\n}\n\nfunction SideNav({ groups, onNavigate }: { groups: ShellNavGroup[]; onNavigate?: () => void }) {\n return (\n <nav aria-label=\"Pages\" className=\"flex flex-col gap-5\">\n {groups.map((g, gi) => (\n <div key={g.label ?? gi} className=\"flex flex-col gap-0.5\">\n {g.label ? <p className=\"px-3 pb-1 text-[0.8125rem] text-muted-foreground\">{g.label}</p> : null}\n {g.items.map((it) => (\n <Link\n key={it.href}\n href={it.href}\n onClick={onNavigate}\n aria-current={it.active ? 'page' : undefined}\n className={cn(\n 'flex h-9 items-center gap-3 rounded-xl px-3 text-[0.9375rem] transition-colors',\n '[&_svg]:size-[1.0625rem] [&_svg]:shrink-0',\n it.active\n ? 'bg-card text-foreground shadow-sm ring-1 ring-border [&_svg]:text-foreground'\n : 'text-muted-foreground hover:bg-accent hover:text-foreground'\n )}\n >\n {it.icon}\n <span className=\"min-w-0 flex-1 truncate\">{it.label}</span>\n {it.badge ? <span className=\"shrink-0\">{it.badge}</span> : null}\n </Link>\n ))}\n </div>\n ))}\n </nav>\n );\n}\n\nfunction SectionSwitch({\n sections,\n current,\n onNavigate,\n}: {\n sections: ShellSection[];\n current: ShellSection;\n onNavigate?: () => void;\n}) {\n // Up to three fit one row of the sidebar; four go two by two, so no label\n // is ever cut short.\n const cols = sections.length <= 3 ? sections.length : 2;\n return (\n <nav\n aria-label=\"Sections\"\n className={cn('grid gap-1 bg-muted p-1', cols === sections.length ? 'rounded-full' : 'rounded-[1.25rem]')}\n style={{ gridTemplateColumns: `repeat(${cols}, minmax(0, 1fr))` }}\n >\n {sections.map((sec) => {\n const on = sec.id === current.id;\n return (\n <Link\n key={sec.id}\n href={sec.href}\n onClick={onNavigate}\n aria-current={on ? 'true' : undefined}\n className={cn(\n 'flex h-8 min-w-0 items-center justify-center rounded-full px-1.5 text-[0.8125rem] font-medium transition-colors',\n on ? 'bg-card text-foreground shadow-sm' : 'text-muted-foreground hover:text-foreground'\n )}\n >\n <span className=\"truncate\">{sec.label}</span>\n </Link>\n );\n })}\n </nav>\n );\n}\n\n/** The phone's way around a small app: every page one tap away, under the thumb. */\nfunction TabBar({ items }: { items: ShellNavItem[] }) {\n return (\n <nav\n aria-label=\"Pages\"\n data-oca-tabbar=\"\"\n className=\"fixed inset-x-0 bottom-0 z-40 border-t border-border bg-background/90 pb-[env(safe-area-inset-bottom)] backdrop-blur-md md:hidden\"\n >\n <div\n className=\"mx-auto grid h-14 max-w-[32rem] px-1.5\"\n style={{ gridTemplateColumns: `repeat(${items.length}, minmax(0, 1fr))` }}\n >\n {items.map((it) => (\n <Link\n key={it.href}\n href={it.href}\n aria-current={it.active ? 'page' : undefined}\n className={cn(\n 'flex min-w-0 flex-col items-center justify-center gap-1 rounded-2xl text-[0.6875rem] leading-none outline-none transition-colors [-webkit-tap-highlight-color:transparent] focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring',\n it.active ? 'text-foreground' : 'text-muted-foreground hover:text-foreground'\n )}\n >\n <span\n className={cn(\n 'relative flex h-7 w-12 items-center justify-center rounded-full transition-[background-color,box-shadow] duration-200',\n '[&_svg]:size-[1.125rem] [&_svg]:shrink-0',\n it.active ? 'bg-card shadow-sm ring-1 ring-border [&_svg]:stroke-2' : '[&_svg]:stroke-[1.75]'\n )}\n >\n {it.icon}\n {it.badge ? (\n <span aria-hidden className=\"absolute right-2.5 top-0.5 size-2 rounded-full bg-oca-orange ring-2 ring-background\" />\n ) : null}\n </span>\n <span className=\"max-w-full truncate px-0.5\">{it.label}</span>\n {it.badge ? <span className=\"sr-only\">{it.badge}</span> : null}\n </Link>\n ))}\n </div>\n </nav>\n );\n}\n\n/** Two to five pages, each with an icon, fit a tab bar. More, or sections, keep the drawer. */\nfunction tabsFor(groups: ShellNavGroup[]): ShellNavItem[] | null {\n const items = groups.flatMap((g) => g.items);\n return items.length >= 2 && items.length <= 5 && items.every((it) => it.icon) ? items : null;\n}\n\nconst activeItem = (groups: ShellNavGroup[]) => groups.flatMap((g) => g.items).find((it) => it.active);\n\n// Bundlers replace process.env.NODE_ENV; the typeof guard covers one that doesn't.\ndeclare const process: { env: { NODE_ENV?: string } } | undefined;\n\nconst warned = new Set<string>();\n\nfunction warnDuplicateLabels(groups: ShellNavGroup[]) {\n if (typeof process === 'undefined' || process.env.NODE_ENV === 'production') return;\n const seen = new Set<string>();\n for (const it of groups.flatMap((g) => g.items)) {\n if (seen.has(it.label) && !warned.has(it.label)) {\n warned.add(it.label);\n console.warn(`AppShell: two pages are labelled \"${it.label}\"; give each its own name.`);\n }\n seen.add(it.label);\n }\n}\n\n/**\n * The signed-in frame: a quiet sidebar on the canvas, content on the right.\n *\n * Give it `sections` and the sidebar shows a switcher (only when there is more\n * than one) and the current section's pages, so it never outgrows the screen;\n * `persistent` groups (Account) follow every section. The section is the one\n * holding an active item, or `activeSection`. On phones a top bar carries the\n * wordmark and the account, a strip under it names the section and page, and\n * the sidebar opens as a sheet. `nav` (flat groups) still works for a simple\n * app, and when it holds two to five pages, each with an icon, phones get a\n * tab bar instead: the pages sit under the thumb, the strip and the menu\n * button go (the sheet stays for a `footer`, without the pages), and tablets\n * keep the sheet. Pages get the section through context: PageHeader uses it\n * as its eyebrow. The account control and any banner are slots.\n */\nexport function AppShell({\n nav,\n sections,\n activeSection,\n page: pageOverride,\n persistent = [],\n home = '/',\n account,\n banner,\n footer,\n children,\n className,\n}: {\n /** Flat groups, for an app without sections. */\n nav?: ShellNavGroup[];\n sections?: ShellSection[];\n activeSection?: string;\n /** The page's name for the place strip, when it is not a nav item of its own. */\n page?: string;\n /** Groups shown under every section, after its own. */\n persistent?: ShellNavGroup[];\n home?: string;\n account?: ReactNode;\n banner?: ReactNode;\n footer?: ReactNode;\n children: ReactNode;\n className?: string;\n}) {\n const [open, setOpen] = useState(false);\n const current =\n sections && sections.length > 0\n ? (sections.find((sec) => sec.id === activeSection) ??\n sections.find((sec) => activeItem(sec.groups)) ??\n sections[0]!)\n : undefined;\n const groups = current ? [...current.groups, ...persistent] : [...(nav ?? []), ...persistent];\n warnDuplicateLabels(groups);\n const tabs = current ? null : tabsFor(groups);\n const page = activeItem(groups);\n const place = useMemo(\n () => ({\n section: current ? (current.title ?? current.label) : undefined,\n page: pageOverride ?? page?.label,\n }),\n [current, page?.label, pageOverride]\n );\n const switcher =\n sections && current && sections.length > 1 ? (\n <SectionSwitch sections={sections} current={current} onNavigate={() => setOpen(false)} />\n ) : null;\n return (\n <ShellContext.Provider value={place}>\n <div\n className={cn(\n 'min-h-dvh bg-background',\n tabs && 'max-md:pb-[calc(3.5rem_+_env(safe-area-inset-bottom))]',\n className\n )}\n >\n <div className=\"sticky top-0 z-40 border-b border-border bg-background/90 backdrop-blur-md lg:hidden\">\n <div className=\"flex h-14 items-center gap-2 px-3\">\n <Sheet open={open} onOpenChange={setOpen}>\n <SheetTrigger\n className={cn(\n 'inline-flex size-10 items-center justify-center rounded-full hover:bg-accent',\n // The tab bar holds every page; the sheet is left for a footer.\n tabs && !footer && 'max-md:hidden'\n )}\n aria-label=\"Open navigation\"\n >\n <Menu className=\"size-5\" />\n </SheetTrigger>\n <SheetContent side=\"left\" className=\"flex flex-col gap-6 overflow-y-auto p-4 pt-16\">\n <SheetTitle className=\"sr-only\">Navigation</SheetTitle>\n {switcher}\n <div className={tabs ? 'max-md:hidden' : undefined}>\n <SideNav groups={groups} onNavigate={() => setOpen(false)} />\n </div>\n {footer ? <div className=\"mt-auto flex flex-col gap-3\">{footer}</div> : null}\n </SheetContent>\n </Sheet>\n <Link href={home} aria-label=\"Home\" className=\"rounded-lg p-1\">\n <Lockup size={22} />\n </Link>\n <div className=\"ml-auto flex items-center\">{account}</div>\n </div>\n {place.page ? (\n <div\n className={cn(\n 'flex h-9 items-center gap-1.5 border-t border-border px-4 text-[0.875rem]',\n // The active tab already names the page.\n tabs && !pageOverride && 'max-md:hidden'\n )}\n >\n {place.section ? (\n <>\n <span className=\"shrink-0 text-muted-foreground\">{place.section}</span>\n <ChevronRight aria-hidden className=\"size-3.5 shrink-0 text-muted-foreground\" />\n </>\n ) : null}\n <span className=\"truncate font-medium\">{place.page}</span>\n </div>\n ) : null}\n </div>\n <div className=\"mx-auto flex w-full max-w-[90rem]\">\n <aside className=\"sticky top-0 hidden h-dvh w-[17rem] shrink-0 flex-col gap-6 overflow-y-auto px-4 py-6 lg:flex\">\n <Link href={home} className=\"px-2\" aria-label=\"Home\">\n <Lockup size={26} />\n </Link>\n {switcher}\n <SideNav groups={groups} />\n <div className=\"mt-auto flex flex-col gap-3\">{footer}</div>\n </aside>\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <div className=\"hidden h-[4.5rem] items-center justify-end gap-3 px-8 lg:flex\">{account}</div>\n {banner ? <div className=\"px-4 pb-2 pt-4 md:px-8 lg:pt-0\">{banner}</div> : null}\n <main id=\"main-content\" className=\"flex-1 px-4 pb-16 pt-6 md:px-8 lg:pt-2\">\n {/* One width for every signed-in page. */}\n <div className=\"mx-auto w-full max-w-[72rem]\">{children}</div>\n </main>\n </div>\n </div>\n {tabs ? <TabBar items={tabs} /> : null}\n </div>\n </ShellContext.Provider>\n );\n}\n\nexport interface AccountMenuItem {\n label: string;\n href?: string;\n onSelect?: () => void;\n icon?: ReactNode;\n destructive?: boolean;\n}\n\n/** The account button: initial + short id, a menu of items. */\nexport function AccountMenu({\n name,\n detail,\n items,\n nameFrom = 'sm',\n}: {\n name: string;\n /** A second line: the short did, an address. */\n detail?: string;\n items: (AccountMenuItem | 'separator')[];\n /** The width from which the name shows beside the initial. A header with\n * navigation beside it needs the room until lg. */\n nameFrom?: 'sm' | 'lg';\n}) {\n const initial = name.trim().charAt(0).toUpperCase() || '·';\n return (\n <DropdownMenu>\n <DropdownMenuTrigger\n className={cn(\n 'inline-flex h-10 items-center gap-2.5 rounded-full border border-border bg-card pl-1 pr-1 text-[0.9375rem] outline-none transition-colors hover:border-oca-hairline-strong focus-visible:ring-2 focus-visible:ring-ring',\n nameFrom === 'lg' ? 'lg:pr-3.5' : 'sm:pr-3.5'\n )}\n aria-label={`Account: ${name}`}\n >\n <span className=\"flex size-8 items-center justify-center rounded-full bg-foreground text-[0.8125rem] font-medium text-background\">\n {initial}\n </span>\n <span className={cn('max-w-[10rem] truncate', nameFrom === 'lg' ? 'max-lg:hidden' : 'max-sm:hidden')}>\n {name}\n </span>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-64\">\n <DropdownMenuLabel className=\"flex flex-col gap-0.5\">\n <span className=\"truncate text-[0.9375rem] font-medium text-foreground\">{name}</span>\n {detail ? <span className=\"truncate font-mono text-[0.75rem]\">{detail}</span> : null}\n </DropdownMenuLabel>\n <DropdownMenuSeparator />\n {items.map((it, i) =>\n it === 'separator' ? (\n <DropdownMenuSeparator key={`sep-${i}`} />\n ) : it.href ? (\n <DropdownMenuItem key={it.label} asChild destructive={it.destructive}>\n <Link href={it.href}>\n {it.icon}\n {it.label}\n </Link>\n </DropdownMenuItem>\n ) : (\n <DropdownMenuItem key={it.label} onSelect={it.onSelect} destructive={it.destructive}>\n {it.icon}\n {it.label}\n </DropdownMenuItem>\n )\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\n/** Light, dark, or follow the system: one button that cycles. */\nexport function ThemeToggle({ className }: { className?: string }) {\n const { theme, setTheme } = useTheme();\n const [mounted, setMounted] = useState(false);\n useEffect(() => setMounted(true), []);\n const current = mounted ? (theme ?? 'system') : 'system';\n const next = current === 'light' ? 'dark' : current === 'dark' ? 'system' : 'light';\n const Icon = current === 'light' ? Sun : current === 'dark' ? Moon : SunMoon;\n return (\n <button\n type=\"button\"\n onClick={() => setTheme(next)}\n aria-label={`Theme: ${current}. Switch to ${next}`}\n title={`Theme: ${current}`}\n className={cn(\n 'inline-flex size-10 items-center justify-center rounded-full text-muted-foreground transition-colors hover:bg-accent hover:text-foreground',\n className\n )}\n >\n <Icon className=\"size-[1.125rem]\" />\n </button>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/lib/cn.ts","../src/brand/mark.tsx","../src/family/index.ts","../src/primitives/overlay.tsx","../src/primitives/badge.tsx","../src/primitives/status-badge.tsx","../src/chrome/family-menu.tsx","../src/chrome/site.tsx","../src/brand/iso-check.tsx","../src/chrome/sign-in-frame.tsx","../src/lib/shell-context.ts","../src/chrome/app-shell.tsx"],"names":["DialogContent","jsxs","jsx","DialogTitle","DialogDescription","SheetContent","PopoverContent","TooltipContent","DropdownMenuContent","DropdownMenuItem","DropdownMenuLabel","DropdownMenuSeparator","Link","useState","ChevronDown","Menu","Fragment","useEffect"],"mappings":"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","file":"chrome.mjs","sourcesContent":["import { clsx, type ClassValue } from 'clsx';\nimport { extendTailwindMerge } from 'tailwind-merge';\n\n// tailwind-merge would treat `oca-display-1` and `text-foreground` as the same\n// group and drop one; teach it the package's own type utilities.\nconst merge = extendTailwindMerge<'oca-type'>({\n extend: {\n classGroups: {\n 'oca-type': [\n 'oca-display-1',\n 'oca-display-2',\n 'oca-display-3',\n 'oca-title',\n 'oca-title-sm',\n 'oca-eyebrow',\n 'oca-lead',\n 'oca-body',\n 'oca-numeral',\n ],\n },\n },\n});\n\nexport function cn(...inputs: ClassValue[]): string {\n return merge(clsx(inputs));\n}\n","import type { SVGProps } from 'react';\n\nimport { cn } from '../lib/cn';\n\n/*\n * The isometric check, measured from the ochk.app design (iteration 2, slide 9) onto a 16×8 grid:\n * a chevron with a 3-unit short arm and a 5-unit long arm, one unit thick,\n * extruded two units. Three faces, three oranges.\n */\n\nconst TOP = '0,3 2,2 6,4 14,0 16,1 6,6';\nconst LEFT = '0,3 6,6 6,8 0,5';\nconst RIGHT = '6,6 16,1 16,3 6,8';\n\nexport const MARK_FACES = { top: '#FED8AB', left: '#FB933C', right: '#EA580B' } as const;\n\nexport interface MarkProps extends Omit<SVGProps<SVGSVGElement>, 'children'> {\n /** Accessible name. Omit to render the mark as decoration. */\n title?: string;\n /** Rendered width in px; height follows the 2:1 grid. */\n size?: number;\n}\n\nexport function Mark({ title, size, className, ...rest }: MarkProps) {\n return (\n <svg\n viewBox=\"0 0 16 8\"\n width={size}\n height={size ? size / 2 : undefined}\n role={title ? 'img' : undefined}\n aria-hidden={title ? undefined : true}\n className={cn('shrink-0', className)}\n {...rest}\n >\n {title ? <title>{title}</title> : null}\n <polygon points={LEFT} fill={MARK_FACES.left} />\n <polygon points={RIGHT} fill={MARK_FACES.right} />\n <polygon points={TOP} fill={MARK_FACES.top} />\n </svg>\n );\n}\n\n/**\n * The mark drawn in hairlines only: the check where a check is missing (an\n * error page). Decoration; the stroke stays the same width at any size.\n */\nexport function MarkOutline({ className }: { className?: string }) {\n return (\n <svg viewBox=\"-0.2 -0.2 16.4 8.4\" aria-hidden className={cn('shrink-0 overflow-visible', className)}>\n {[TOP, LEFT, RIGHT].map((points) => (\n <polygon\n key={points}\n points={points}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1\"\n strokeLinejoin=\"round\"\n vectorEffect=\"non-scaling-stroke\"\n />\n ))}\n </svg>\n );\n}\n\nexport interface AppIconProps extends Omit<SVGProps<SVGSVGElement>, 'children'> {\n title?: string;\n size?: number;\n}\n\n/** The app icon: the mark on an ink squircle, as in the deck's lockup. */\nexport function AppIcon({ title, size = 32, className, ...rest }: AppIconProps) {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n width={size}\n height={size}\n role={title ? 'img' : undefined}\n aria-hidden={title ? undefined : true}\n className={cn('shrink-0', className)}\n {...rest}\n >\n {title ? <title>{title}</title> : null}\n <rect\n width=\"24\"\n height=\"24\"\n rx=\"6.25\"\n style={{ fill: 'var(--oca-icon-tile, #0A0A0A)', stroke: 'var(--oca-icon-ring, transparent)' }}\n strokeWidth=\"0.5\"\n />\n <g transform=\"translate(4.25 8.1) scale(0.97)\">\n <polygon points={LEFT} fill={MARK_FACES.left} />\n <polygon points={RIGHT} fill={MARK_FACES.right} />\n <polygon points={TOP} fill={MARK_FACES.top} />\n </g>\n </svg>\n );\n}\n\nexport interface LockupProps {\n /** The word beside the icon. */\n name?: string;\n /** Icon size in px; the word scales with it. */\n size?: number;\n className?: string;\n}\n\n/** Icon and wordmark, lowercase, as the deck sets it. */\nexport function Lockup({ name = 'orangecheck', size = 28, className }: LockupProps) {\n return (\n <span\n className={cn('inline-flex items-center font-medium tracking-[-0.01em]', className)}\n style={{ gap: size * 0.32, fontSize: size * 0.56 }}\n >\n <AppIcon size={size} />\n <span>{name}</span>\n </span>\n );\n}\n","/*\n * The orangecheck family as data: every public site, its one line, its group\n * and its status. The family menu, the footer, the protocol grid and the app\n * grid all read it, so a site is added, renamed or retired here and nowhere\n * else. No React: OG renderers and server code import it too.\n *\n * Status is written here until the claims source exists; then it is read\n * from there. \"live\" shows no badge.\n */\nimport type { FooterColumn, NavItem } from '../lib/nav';\n\n/** The six protocols, in the family's fixed order. */\nexport type ProtocolSlug = 'attest' | 'lock' | 'vote' | 'stamp' | 'agent' | 'pledge';\n\n/** The same slugs as the classic system's, so a site's `current` carries over. */\nexport type FamilySlug =\n | 'home'\n | 'me'\n | 'docs'\n | ProtocolSlug\n | 'vault'\n | 'chat'\n | 'cosign'\n | 'me-demo'\n | 'globe'\n | 'btc';\n\nexport type FamilyGroup = 'orangecheck' | 'protocol' | 'app' | 'public-good';\n\n/** Where a site or feature stands, in the family's words. */\nexport type SiteStatus = 'live' | 'testing' | 'not-yet' | 'paused';\n\nexport interface FamilySite {\n slug: FamilySlug;\n /** The site's word, lowercase, as menus and lockups show it. */\n label: string;\n /** Where the family menu and footer send people. A protocol's is its page on ochk.io. */\n href: string;\n group: FamilyGroup;\n /** What it is, in one sentence. */\n line: string;\n status: SiteStatus;\n /** For an app: the protocols it shows. */\n protocols?: ProtocolSlug[];\n}\n\nexport interface ProtocolSite extends FamilySite {\n slug: ProtocolSlug;\n group: 'protocol';\n /** What it carries: identity, confidentiality, legitimacy, provenance, authority, commitment. */\n verb: string;\n /** The protocol's page on ochk.io. */\n pageHref: string;\n /** The tools, on the protocol's own host. */\n toolHref: string;\n /** The normative spec. */\n specHref: string;\n /** The Nostr event kinds it publishes. */\n kinds: string;\n}\n\nexport const OCHK_IO = 'https://ochk.io';\n/** The docs live under ochk.io; docs.ochk.io 308s here. */\nexport const DOCS_HREF = `${OCHK_IO}/docs`;\n\nfunction protocol(\n slug: ProtocolSlug,\n verb: string,\n line: string,\n kinds: string\n): ProtocolSite {\n return {\n slug,\n label: slug,\n href: `${OCHK_IO}/${slug}`,\n group: 'protocol',\n line,\n status: 'live',\n verb,\n pageHref: `${OCHK_IO}/${slug}`,\n toolHref: `https://${slug}.ochk.io`,\n specHref: `https://github.com/orangecheck/oc-${slug}-protocol`,\n kinds,\n };\n}\n\n/** Attest · Lock · Vote · Stamp · Agent · Pledge, everywhere. */\nexport const PROTOCOLS: readonly ProtocolSite[] = [\n protocol('attest', 'identity', 'Show that an address holds bitcoin, and for how long.', '30078'),\n protocol('lock', 'confidentiality', 'Encrypt to a Bitcoin address, so only its holder can open it.', '30078'),\n protocol('vote', 'legitimacy', 'Polls weighed in sats, that anyone can tally.', '30080–30082'),\n protocol('stamp', 'provenance', 'Prove who signed something, and when.', '30083'),\n protocol('agent', 'authority', 'Give software scoped, revocable permission to act for you.', '30083–30086'),\n protocol('pledge', 'commitment', 'Make a promise with bitcoin behind it, on a public record.', '30078'),\n];\n\nexport const PROTOCOL_ORDER: readonly ProtocolSlug[] = PROTOCOLS.map((p) => p.slug);\n\nexport const FAMILY: readonly FamilySite[] = [\n {\n slug: 'home',\n label: 'ochk.io',\n href: OCHK_IO,\n group: 'orangecheck',\n line: 'The open protocols, and the company behind them.',\n status: 'live',\n },\n {\n slug: 'me',\n label: 'ochk.app',\n href: 'https://ochk.app',\n group: 'orangecheck',\n line: 'One account, with Bitcoin behind it.',\n status: 'testing',\n },\n {\n slug: 'docs',\n label: 'docs',\n href: DOCS_HREF,\n group: 'orangecheck',\n line: 'Specs, SDKs and guides for every protocol.',\n status: 'live',\n },\n ...PROTOCOLS,\n {\n slug: 'vault',\n label: 'vault',\n href: 'https://vault.ochk.io',\n group: 'app',\n line: 'A password manager, encrypted in your browser.',\n status: 'live',\n protocols: ['lock'],\n },\n {\n slug: 'chat',\n label: 'chat',\n href: 'https://chat.ochk.io',\n group: 'app',\n line: 'Messages only the holder of a Bitcoin address can read.',\n status: 'testing',\n protocols: ['lock'],\n },\n {\n slug: 'cosign',\n label: 'cosign',\n href: 'https://cosign.ochk.io',\n group: 'app',\n line: 'Builders find co-founders and backers.',\n status: 'testing',\n protocols: ['attest'],\n },\n {\n slug: 'me-demo',\n // \"demo\", not the made-up app's own name, so nobody takes it for ours.\n label: 'demo',\n href: 'https://me-demo.ochk.io',\n group: 'app',\n line: 'Lumen Notes, a made-up app that signs in with orangecheck.',\n status: 'live',\n },\n {\n slug: 'globe',\n label: 'globe',\n href: 'https://globe.ochk.io',\n group: 'public-good',\n line: 'The Bitcoin network, live, on a globe.',\n status: 'live',\n },\n {\n slug: 'btc',\n label: 'btc',\n href: 'https://btc.ochk.io',\n group: 'public-good',\n line: 'A free desk for reading the Bitcoin market.',\n status: 'live',\n },\n];\n\nexport const FAMILY_GROUPS: readonly { id: FamilyGroup; label: string }[] = [\n { id: 'orangecheck', label: 'orangecheck' },\n { id: 'protocol', label: 'Protocols' },\n { id: 'app', label: 'Apps' },\n { id: 'public-good', label: 'Public goods' },\n];\n\nconst BY_SLUG = new Map(FAMILY.map((s) => [s.slug, s]));\n\nexport function familySite(slug: FamilySlug): FamilySite {\n return BY_SLUG.get(slug)!;\n}\n\nexport function protocolSite(slug: ProtocolSlug): ProtocolSite {\n return BY_SLUG.get(slug) as ProtocolSite;\n}\n\n/** The family in its groups, in order, for menus and footers. */\nexport function familyByGroup(): { id: FamilyGroup; label: string; sites: FamilySite[] }[] {\n return FAMILY_GROUPS.map((g) => ({ ...g, sites: FAMILY.filter((s) => s.group === g.id) }));\n}\n\n/** One fixed row on every footer, all on ochk.io. */\nexport const LEGAL_LINKS: readonly NavItem[] = [\n { href: `${OCHK_IO}/privacy`, label: 'Privacy' },\n { href: `${OCHK_IO}/terms`, label: 'Terms' },\n { href: `${OCHK_IO}/security`, label: 'Security' },\n { href: `${OCHK_IO}/trademark`, label: 'Trademarks' },\n { href: `${OCHK_IO}/contact`, label: 'Contact' },\n];\n\n/**\n * ochk.io's header navigation. oc-www and the docs (served under ochk.io/docs)\n * both draw it from here, so the two cannot drift. Absolute links work from\n * either; mark the active item where it is rendered.\n */\nexport const OCHK_IO_NAV: readonly NavItem[] = [\n {\n href: `${OCHK_IO}/protocols`,\n label: 'Protocols',\n children: PROTOCOLS.map((p) => ({ href: p.pageHref, label: p.label, description: p.line })),\n },\n { href: `${OCHK_IO}/apps`, label: 'Apps' },\n { href: DOCS_HREF, label: 'Docs' },\n { href: `${OCHK_IO}/trust`, label: 'Trust' },\n { href: `${OCHK_IO}/about`, label: 'About' },\n];\n\n/** ochk.io's own footer column; `SiteFooter family` adds the family's. */\nexport const OCHK_IO_FOOTER: readonly FooterColumn[] = [\n {\n heading: 'Company',\n links: [\n { href: `${OCHK_IO}/about`, label: 'About' },\n { href: `${OCHK_IO}/trust`, label: 'Trust' },\n { href: 'https://github.com/orangecheck', label: 'GitHub', external: true },\n ],\n },\n];\n","import * as DialogPrimitive from '@radix-ui/react-dialog';\nimport * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';\nimport * as PopoverPrimitive from '@radix-ui/react-popover';\nimport * as TooltipPrimitive from '@radix-ui/react-tooltip';\nimport { X } from 'lucide-react';\nimport { forwardRef, type ComponentPropsWithoutRef, type ElementRef, type HTMLAttributes } from 'react';\n\nimport { cn } from '../lib/cn';\n\n/* ── Dialog ───────────────────────────────────────────────────────────── */\n\nexport const Dialog = DialogPrimitive.Root;\nexport const DialogTrigger = DialogPrimitive.Trigger;\nexport const DialogClose = DialogPrimitive.Close;\n\nconst overlayClass =\n 'oca-animate-fade fixed inset-0 z-50 bg-[rgb(10_10_10/0.38)] backdrop-blur-[2px] data-[state=closed]:opacity-0';\n\nexport const DialogContent = forwardRef<\n ElementRef<typeof DialogPrimitive.Content>,\n ComponentPropsWithoutRef<typeof DialogPrimitive.Content> & { hideClose?: boolean }\n>(function DialogContent({ className, children, hideClose, ...props }, ref) {\n return (\n <DialogPrimitive.Portal>\n <DialogPrimitive.Overlay className={overlayClass} />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n 'oca-animate-rise fixed left-1/2 top-1/2 z-50 w-[min(92vw,34rem)] -translate-x-1/2 -translate-y-1/2',\n 'max-h-[88vh] overflow-y-auto rounded-[1.5rem] border border-border bg-popover p-6 text-popover-foreground shadow-xl md:p-8',\n 'outline-none',\n className\n )}\n {...props}\n >\n {children}\n {hideClose ? null : (\n <DialogPrimitive.Close\n className=\"absolute right-4 top-4 inline-flex size-9 items-center justify-center rounded-full text-muted-foreground transition-colors hover:bg-accent hover:text-foreground\"\n aria-label=\"Close\"\n >\n <X className=\"size-4\" />\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </DialogPrimitive.Portal>\n );\n});\n\nexport function DialogHeader({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return <div className={cn('mb-5 flex flex-col gap-2 pr-8', className)} {...props} />;\n}\n\nexport function DialogFooter({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return <div className={cn('mt-7 flex flex-col-reverse gap-3 sm:flex-row sm:justify-end', className)} {...props} />;\n}\n\nexport const DialogTitle = forwardRef<\n ElementRef<typeof DialogPrimitive.Title>,\n ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(function DialogTitle({ className, ...props }, ref) {\n return (\n <DialogPrimitive.Title\n ref={ref}\n className={cn('text-[1.5rem] font-normal leading-tight tracking-[-0.02em]', className)}\n {...props}\n />\n );\n});\n\nexport const DialogDescription = forwardRef<\n ElementRef<typeof DialogPrimitive.Description>,\n ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(function DialogDescription({ className, ...props }, ref) {\n return <DialogPrimitive.Description ref={ref} className={cn('oca-body', className)} {...props} />;\n});\n\n/* ── Sheet: a dialog from an edge ────────────────────────────────────── */\n\nexport const Sheet = DialogPrimitive.Root;\nexport const SheetTrigger = DialogPrimitive.Trigger;\nexport const SheetClose = DialogPrimitive.Close;\nexport const SheetTitle = DialogTitle;\nexport const SheetDescription = DialogDescription;\n\nconst sheetSide = {\n right: 'inset-y-0 right-0 h-full w-[min(88vw,24rem)] border-l',\n left: 'inset-y-0 left-0 h-full w-[min(88vw,24rem)] border-r',\n bottom: 'inset-x-0 bottom-0 max-h-[88vh] rounded-t-[1.5rem] border-t',\n} as const;\n\nexport const SheetContent = forwardRef<\n ElementRef<typeof DialogPrimitive.Content>,\n ComponentPropsWithoutRef<typeof DialogPrimitive.Content> & { side?: keyof typeof sheetSide }\n>(function SheetContent({ className, children, side = 'right', ...props }, ref) {\n return (\n <DialogPrimitive.Portal>\n <DialogPrimitive.Overlay className={overlayClass} />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n 'oca-animate-fade fixed z-50 flex flex-col gap-4 overflow-y-auto border-border bg-popover p-6 text-popover-foreground shadow-xl outline-none',\n sheetSide[side],\n className\n )}\n {...props}\n >\n {children}\n <DialogPrimitive.Close\n className=\"absolute right-4 top-4 inline-flex size-9 items-center justify-center rounded-full text-muted-foreground hover:bg-accent hover:text-foreground\"\n aria-label=\"Close\"\n >\n <X className=\"size-4\" />\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </DialogPrimitive.Portal>\n );\n});\n\n/* ── Popover ──────────────────────────────────────────────────────────── */\n\nexport const Popover = PopoverPrimitive.Root;\nexport const PopoverTrigger = PopoverPrimitive.Trigger;\nexport const PopoverAnchor = PopoverPrimitive.Anchor;\n\nexport const PopoverContent = forwardRef<\n ElementRef<typeof PopoverPrimitive.Content>,\n ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>\n>(function PopoverContent({ className, align = 'center', sideOffset = 8, ...props }, ref) {\n return (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\n className={cn(\n 'oca-animate-fade z-50 w-72 rounded-2xl border border-border bg-popover p-4 text-popover-foreground shadow-lg outline-none',\n className\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n );\n});\n\n/* ── Tooltip: ink, small, quick ───────────────────────────────────────── */\n\nexport const TooltipProvider = TooltipPrimitive.Provider;\nexport const Tooltip = TooltipPrimitive.Root;\nexport const TooltipTrigger = TooltipPrimitive.Trigger;\n\nexport const TooltipContent = forwardRef<\n ElementRef<typeof TooltipPrimitive.Content>,\n ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(function TooltipContent({ className, sideOffset = 6, ...props }, ref) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n 'oca-animate-fade z-50 max-w-xs rounded-lg bg-oca-ink px-2.5 py-1.5 text-[0.8125rem] leading-snug text-oca-ink-foreground',\n className\n )}\n {...props}\n />\n </TooltipPrimitive.Portal>\n );\n});\n\n/* ── Menu ─────────────────────────────────────────────────────────────── */\n\nexport const DropdownMenu = DropdownMenuPrimitive.Root;\nexport const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;\nexport const DropdownMenuGroup = DropdownMenuPrimitive.Group;\n\nexport const DropdownMenuContent = forwardRef<\n ElementRef<typeof DropdownMenuPrimitive.Content>,\n ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>\n>(function DropdownMenuContent({ className, sideOffset = 8, ...props }, ref) {\n return (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n 'oca-animate-fade z-50 min-w-56 overflow-hidden rounded-2xl border border-border bg-popover p-1.5 text-popover-foreground shadow-lg',\n className\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n );\n});\n\nexport const DropdownMenuItem = forwardRef<\n ElementRef<typeof DropdownMenuPrimitive.Item>,\n ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & { destructive?: boolean }\n>(function DropdownMenuItem({ className, destructive, ...props }, ref) {\n return (\n <DropdownMenuPrimitive.Item\n ref={ref}\n className={cn(\n 'flex h-10 cursor-default select-none items-center gap-2.5 rounded-xl px-3 text-[0.9375rem] outline-none',\n 'data-[highlighted]:bg-accent data-[disabled]:opacity-50 [&_svg]:size-4 [&_svg]:text-muted-foreground',\n destructive && 'text-destructive [&_svg]:text-destructive',\n className\n )}\n {...props}\n />\n );\n});\n\nexport const DropdownMenuLabel = forwardRef<\n ElementRef<typeof DropdownMenuPrimitive.Label>,\n ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label>\n>(function DropdownMenuLabel({ className, ...props }, ref) {\n return (\n <DropdownMenuPrimitive.Label\n ref={ref}\n className={cn('px-3 pb-1.5 pt-2 text-[0.8125rem] text-muted-foreground', className)}\n {...props}\n />\n );\n});\n\nexport const DropdownMenuSeparator = forwardRef<\n ElementRef<typeof DropdownMenuPrimitive.Separator>,\n ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\n>(function DropdownMenuSeparator({ className, ...props }, ref) {\n return <DropdownMenuPrimitive.Separator ref={ref} className={cn('my-1.5 h-px bg-border', className)} {...props} />;\n});\n","import { cva, type VariantProps } from 'class-variance-authority';\nimport type { HTMLAttributes } from 'react';\n\nimport { cn } from '../lib/cn';\n\n/*\n * The small white pill from the deck (\"in testing\", \"on the path\"). Three tones\n * carry meaning: neutral, the orange accent for attention, and red for a real\n * error. Text stays on the token that clears 4.5:1 against its tint.\n */\nconst GOOD_DOT =\n \"border-border bg-card text-foreground before:size-1.5 before:shrink-0 before:rounded-full before:bg-success before:content-['']\";\n\nexport const badgeVariants = cva(\n 'inline-flex h-6 shrink-0 items-center gap-1.5 whitespace-nowrap rounded-full border px-2.5 text-[0.8125rem] font-medium leading-none',\n {\n variants: {\n tone: {\n neutral: 'border-border bg-card text-foreground',\n muted: 'border-transparent bg-muted text-muted-foreground',\n brand: 'border-transparent bg-[color-mix(in_oklab,var(--oca-orange)_9%,var(--card))] text-oca-accent-ink',\n danger: 'border-transparent bg-[color-mix(in_oklab,var(--destructive)_12%,var(--card))] text-destructive',\n // A good state is a neutral pill with a green dot, not a green pill.\n success: GOOD_DOT,\n // Aliases kept so older call sites keep compiling: attention is\n // the brand accent, information is neutral.\n warning: 'border-transparent bg-[color-mix(in_oklab,var(--oca-orange)_9%,var(--card))] text-oca-accent-ink',\n info: 'border-border bg-card text-foreground',\n // Inverted in dark mode, where ink would sit on a card of nearly its own colour.\n ink: 'border-transparent bg-oca-ink text-oca-ink-foreground dark:bg-foreground dark:text-background',\n onInk: 'border-white/15 bg-white/5 text-white/90',\n },\n },\n defaultVariants: { tone: 'neutral' },\n }\n);\n\nexport interface BadgeProps extends HTMLAttributes<HTMLSpanElement>, VariantProps<typeof badgeVariants> {}\n\nexport function Badge({ className, tone, ...props }: BadgeProps) {\n return <span data-ui=\"badge\" className={cn(badgeVariants({ tone }), className)} {...props} />;\n}\n\n/** A pill with a live dot: where something stands right now (\"In testing · payouts start after\"). */\nexport function StatusPill({\n className,\n children,\n pulse = true,\n ...props\n}: HTMLAttributes<HTMLSpanElement> & { pulse?: boolean }) {\n return (\n <span\n data-ui=\"status-pill\"\n className={cn(\n 'inline-flex min-h-8 w-fit items-center gap-2.5 rounded-full border border-border bg-card py-1 pl-3 pr-3.5 text-[0.875rem] leading-snug text-foreground',\n className\n )}\n {...props}\n >\n <span aria-hidden className=\"relative flex size-2 shrink-0\">\n {pulse ? (\n <span className=\"absolute inset-0 rounded-full bg-oca-orange opacity-50 motion-safe:animate-ping\" />\n ) : null}\n <span className=\"relative size-2 rounded-full bg-oca-orange\" />\n </span>\n {children}\n </span>\n );\n}\n","import type { HTMLAttributes } from 'react';\n\nimport type { SiteStatus } from '../family';\nimport { cn } from '../lib/cn';\nimport { Badge } from './badge';\n\n/*\n * Where something stands, in the family's fixed words. A site or feature is\n * live, in testing, not yet, or paused; a check on an artifact is good,\n * caution or refused. There is no free text: the words are the component, so\n * no page can invent \"LIVE · MAINNET\", \"BETA\" or \"PRO\" again.\n */\nexport type Statement = 'good' | 'caution' | 'refused';\nexport type Status = SiteStatus | Statement;\n\nconst WORD: Record<Status, string> = {\n live: 'Live',\n testing: 'In testing',\n 'not-yet': 'Not yet',\n paused: 'Paused',\n good: 'Good',\n caution: 'Caution',\n refused: 'Refused',\n};\n\nconst TONE = {\n live: 'success',\n testing: 'brand',\n 'not-yet': 'muted',\n paused: 'muted',\n good: 'success',\n caution: 'brand',\n refused: 'danger',\n} as const;\n\n/** The word for a status, for places that need it as text. */\nexport function statusWord(status: Status): string {\n return WORD[status];\n}\n\nexport interface StatusBadgeProps extends Omit<HTMLAttributes<HTMLSpanElement>, 'children'> {\n status: Status;\n}\n\nexport function StatusBadge({ status, className, ...props }: StatusBadgeProps) {\n return (\n <Badge tone={TONE[status]} data-status={status} className={cn(className)} {...props}>\n {WORD[status]}\n </Badge>\n );\n}\n","import { ChevronDown } from 'lucide-react';\nimport { useId, useState } from 'react';\n\nimport { familyByGroup, type FamilySite, type FamilySlug } from '../family';\nimport { cn } from '../lib/cn';\nimport { Popover, PopoverContent, PopoverTrigger } from '../primitives/overlay';\nimport { StatusBadge } from '../primitives/status-badge';\n\nfunction SiteRow({ site, here, onNavigate }: { site: FamilySite; here: boolean; onNavigate?: () => void }) {\n return (\n <li>\n <a\n href={site.href}\n onClick={onNavigate}\n aria-current={here ? 'page' : undefined}\n className={cn(\n 'flex flex-col gap-0.5 rounded-xl px-3 py-2 transition-colors hover:bg-accent',\n here && 'bg-muted hover:bg-muted dark:bg-white/[0.06]'\n )}\n >\n <span className=\"flex items-center gap-2 text-[0.9375rem] font-medium leading-6\">\n {site.label}\n {site.status !== 'live' ? <StatusBadge status={site.status} /> : null}\n {here ? <span className=\"sr-only\">(this site)</span> : null}\n </span>\n <span className=\"text-[0.8125rem] leading-snug text-muted-foreground\">{site.line}</span>\n </a>\n </li>\n );\n}\n\n/* Where each group sits. On a tablet, two columns: orangecheck over the\n protocols, the apps over the public goods. On a desk, three: orangecheck,\n the protocols, then the apps with the public goods below them, so the panel\n fits a 1280×800 screen without scrolling. Reading order stays orangecheck,\n Protocols, Apps, Public goods. */\nconst PLACE: Record<string, string> = {\n orangecheck: 'sm:col-start-1 sm:row-start-1 lg:row-span-2',\n protocol: 'sm:col-start-1 sm:row-start-2 lg:col-start-2 lg:row-start-1 lg:row-span-2',\n app: 'sm:col-start-2 sm:row-start-1 lg:col-start-3',\n 'public-good': 'sm:col-start-2 sm:row-start-2 lg:col-start-3',\n};\n\n/**\n * Every public site in the family, in its groups, one line each. `stack`\n * lays the groups in one column (a phone's menu sheet).\n */\nexport function FamilyList({\n current,\n onNavigate,\n stack = false,\n className,\n}: {\n current?: FamilySlug;\n onNavigate?: () => void;\n stack?: boolean;\n className?: string;\n}) {\n const id = useId();\n return (\n <div\n className={cn(\n 'grid grid-cols-1 gap-x-2 gap-y-4',\n // The second desk row takes the slack, so the public goods sit right under the apps.\n !stack && 'sm:grid-cols-2 lg:grid-cols-3 lg:grid-rows-[auto_1fr]',\n className\n )}\n >\n {familyByGroup().map((g) => (\n <div key={g.id} className={cn('flex flex-col gap-1', !stack && PLACE[g.id])}>\n <p id={`${id}-${g.id}`} className=\"px-3 pt-1 text-[0.8125rem] text-muted-foreground\">\n {g.label}\n </p>\n <ul aria-labelledby={`${id}-${g.id}`} className=\"flex flex-col\">\n {g.sites.map((s) => (\n <SiteRow key={s.slug} site={s} here={s.slug === current} onNavigate={onNavigate} />\n ))}\n </ul>\n </div>\n ))}\n </div>\n );\n}\n\n/**\n * The way between the family's sites: a small chevron beside the lockup, so\n * the lockup itself stays a link home. It opens every site, grouped, with a\n * status only where one is not live. `current` marks the site you are on.\n */\nexport function FamilyMenu({ current, className }: { current?: FamilySlug; className?: string }) {\n const [open, setOpen] = useState(false);\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger\n aria-label=\"All orangecheck sites\"\n className={cn(\n 'group inline-flex size-8 shrink-0 items-center justify-center rounded-full text-muted-foreground transition-colors',\n 'hover:bg-accent hover:text-foreground data-[state=open]:bg-accent data-[state=open]:text-foreground',\n className\n )}\n >\n <ChevronDown aria-hidden className=\"size-4 transition-transform duration-200 group-data-[state=open]:rotate-180\" />\n </PopoverTrigger>\n <PopoverContent\n align=\"start\"\n sideOffset={14}\n collisionPadding={16}\n className=\"max-h-[min(40rem,var(--radix-popover-content-available-height))] w-[min(calc(100vw-2rem),42rem)] overflow-y-auto p-3 lg:w-[min(calc(100vw-2rem),56rem)]\"\n >\n <FamilyList current={current} onNavigate={() => setOpen(false)} />\n </PopoverContent>\n </Popover>\n );\n}\n","import { ChevronDown, Menu } from 'lucide-react';\nimport Link from 'next/link';\nimport { useState, type CSSProperties, type ReactNode } from 'react';\n\nimport { Lockup, Mark } from '../brand/mark';\nimport { familyByGroup, LEGAL_LINKS, OCHK_IO, PROTOCOLS, type FamilySlug } from '../family';\nimport { cn } from '../lib/cn';\nimport type { FooterColumn, NavItem } from '../lib/nav';\nimport { Popover, PopoverContent, PopoverTrigger, Sheet, SheetContent, SheetTitle, SheetTrigger } from '../primitives/overlay';\nimport { FamilyList, FamilyMenu } from './family-menu';\n\nexport type { FooterColumn, NavItem } from '../lib/nav';\n\nfunction NavLink({ item, className, onNavigate }: { item: NavItem; className?: string; onNavigate?: () => void }) {\n const cls = cn(\n 'rounded-full px-3 py-2 text-[0.9375rem] transition-colors',\n item.active ? 'text-foreground' : 'text-muted-foreground hover:text-foreground',\n className\n );\n if (item.external) {\n return (\n <a href={item.href} className={cls} rel=\"noreferrer\" onClick={onNavigate}>\n {item.label}\n </a>\n );\n }\n return (\n <Link href={item.href} className={cls} aria-current={item.active ? 'page' : undefined} onClick={onNavigate}>\n {item.label}\n </Link>\n );\n}\n\n/** A link with its one line, as a dropdown lists them. */\nfunction NavRow({ item, onNavigate }: { item: NavItem; onNavigate?: () => void }) {\n const body = (\n <>\n <span className=\"text-[0.9375rem] font-medium leading-6 text-foreground\">{item.label}</span>\n {item.description ? (\n <span className=\"text-[0.8125rem] leading-snug text-muted-foreground\">{item.description}</span>\n ) : null}\n </>\n );\n const cls = cn(\n 'flex flex-col gap-0.5 rounded-xl px-3 py-2 transition-colors hover:bg-accent',\n item.active && 'bg-muted hover:bg-muted dark:bg-white/[0.06]'\n );\n return item.external ? (\n <a href={item.href} className={cls} rel=\"noreferrer\" onClick={onNavigate}>\n {body}\n </a>\n ) : (\n <Link href={item.href} className={cls} aria-current={item.active ? 'page' : undefined} onClick={onNavigate}>\n {body}\n </Link>\n );\n}\n\n/** \"All protocols\" for a \"Protocols\" menu; a parent with a node for a label gets \"See all\". */\nconst seeAll = (item: NavItem) => (typeof item.label === 'string' ? `All ${item.label.toLowerCase()}` : 'See all');\n\n/** One level of links under a word in the header. */\nfunction NavDropdown({ item }: { item: NavItem }) {\n const [open, setOpen] = useState(false);\n const active = item.active || item.children?.some((c) => c.active);\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger\n className={cn(\n 'group inline-flex items-center gap-1 rounded-full py-2 pl-3 pr-2.5 text-[0.9375rem] transition-colors',\n active ? 'text-foreground' : 'text-muted-foreground hover:text-foreground data-[state=open]:text-foreground'\n )}\n >\n {item.label}\n <ChevronDown aria-hidden className=\"size-3.5 transition-transform duration-200 group-data-[state=open]:rotate-180\" />\n </PopoverTrigger>\n <PopoverContent align=\"center\" sideOffset={10} className=\"w-[min(calc(100vw-2rem),26rem)] p-2\">\n <ul className=\"flex flex-col\">\n {item.children?.map((c) => (\n <li key={c.href}>\n <NavRow item={c} onNavigate={() => setOpen(false)} />\n </li>\n ))}\n </ul>\n <div className=\"mt-1.5 border-t border-border px-1 pt-1.5\">\n <NavLink\n item={{ ...item, label: seeAll(item), children: undefined }}\n className=\"block rounded-xl px-2 py-2 text-[0.875rem]\"\n onNavigate={() => setOpen(false)}\n />\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n\nexport interface SiteHeaderProps {\n home?: string;\n /** Replaces the lockup (and the product word). */\n brand?: ReactNode;\n /** The site's own word beside the lockup: \"orangecheck | stamp\". */\n product?: string;\n /** Mount the family menu beside the lockup. Pass the site's slug to mark it. */\n family?: boolean | FamilySlug;\n nav?: readonly NavItem[];\n /** A search control, set before the actions. */\n search?: ReactNode;\n actions?: ReactNode;\n /**\n * `site`: a public page's header, the navigation centred. `tool`: 56px,\n * full width, a hairline under it, the navigation after the lockup.\n */\n variant?: 'site' | 'tool';\n className?: string;\n}\n\n/**\n * The header: lockup (and the site's word), navigation, search and actions.\n * Below md the navigation, and the family when it is on, move into one sheet;\n * the actions stay.\n */\nexport function SiteHeader({\n home = '/',\n brand,\n product,\n family,\n nav = [],\n search,\n actions,\n variant = 'site',\n className,\n}: SiteHeaderProps) {\n const [open, setOpen] = useState(false);\n const tool = variant === 'tool';\n const size = tool ? 24 : 28;\n const current = typeof family === 'string' ? family : undefined;\n const menu = nav.length > 0 || Boolean(family);\n const brandNode = brand ?? (\n <span className=\"inline-flex items-center\">\n <Lockup size={size} />\n {product ? (\n <>\n <span aria-hidden className=\"mx-3 h-5 w-px bg-oca-hairline-strong\" />\n <span className=\"font-medium tracking-[-0.01em]\" style={{ fontSize: size * 0.56 }}>\n {product}\n </span>\n </>\n ) : null}\n </span>\n );\n const navigation =\n nav.length > 0 ? (\n <nav aria-label=\"Main\" className=\"hidden items-center gap-1 md:flex\">\n {nav.map((n) => (n.children?.length ? <NavDropdown key={n.href} item={n} /> : <NavLink key={n.href} item={n} />))}\n </nav>\n ) : null;\n return (\n <header\n className={cn(\n 'sticky top-0 z-40 w-full border-b bg-background/95 backdrop-blur-md supports-[backdrop-filter]:bg-background/90',\n tool ? 'border-border' : 'border-transparent',\n className\n )}\n >\n <div\n className={cn(\n 'flex items-center justify-between gap-4',\n tool ? 'h-14 px-4 md:px-6' : 'oca-container h-16 md:h-[4.5rem]',\n // Three columns, the outer two each at least their content: the\n // navigation stays centred whatever the actions hold, so it does\n // not shift when they change (signed out to signed in).\n !tool &&\n nav.length > 0 &&\n 'md:grid md:grid-cols-[minmax(max-content,1fr)_auto_minmax(max-content,1fr)]'\n )}\n >\n <div className={cn('flex min-w-0 items-center gap-1', tool ? 'md:gap-1' : 'justify-self-start')}>\n <Link href={home} className=\"-ml-1 min-w-0 rounded-lg p-1\">\n {brandNode}\n {/* Read as \"orangecheck home\": the name starts with what the link shows. */}\n <span className=\"sr-only\"> home</span>\n </Link>\n {family ? <FamilyMenu current={current} className=\"max-md:hidden\" /> : null}\n {tool && navigation ? <div className=\"ml-5\">{navigation}</div> : null}\n </div>\n {!tool ? navigation : null}\n <div className=\"flex items-center gap-2 justify-self-end\">\n {search}\n {actions}\n {menu ? (\n <Sheet open={open} onOpenChange={setOpen}>\n <SheetTrigger\n className=\"inline-flex size-10 items-center justify-center rounded-full text-foreground hover:bg-accent md:hidden\"\n aria-label=\"Open menu\"\n >\n <Menu className=\"size-5\" />\n </SheetTrigger>\n <SheetContent side=\"right\" className=\"pt-16\">\n <SheetTitle className=\"sr-only\">Menu</SheetTitle>\n {nav.length > 0 ? (\n <nav aria-label=\"Main\" className=\"flex flex-col\">\n {nav.map((n) =>\n n.children?.length ? (\n <div key={n.href} className=\"flex flex-col py-2\">\n <p className=\"px-3 pb-1 text-[0.8125rem] text-muted-foreground\">{n.label}</p>\n {n.children.map((c) => (\n <NavLink\n key={c.href}\n item={c}\n className=\"rounded-xl px-3 py-2.5 text-[1.0625rem]\"\n onNavigate={() => setOpen(false)}\n />\n ))}\n </div>\n ) : (\n <NavLink\n key={n.href}\n item={n}\n className=\"rounded-xl px-3 py-3 text-[1.0625rem]\"\n onNavigate={() => setOpen(false)}\n />\n )\n )}\n </nav>\n ) : null}\n {family ? (\n <details className={cn('group', nav.length > 0 && 'mt-2 border-t border-border pt-4')}>\n <summary className=\"flex cursor-pointer list-none items-center justify-between rounded-xl px-3 py-2.5 text-[1.0625rem] [&::-webkit-details-marker]:hidden\">\n All orangecheck sites\n <ChevronDown aria-hidden className=\"size-4 text-muted-foreground transition-transform group-open:rotate-180\" />\n </summary>\n <FamilyList current={current} onNavigate={() => setOpen(false)} stack className=\"mt-2\" />\n </details>\n ) : null}\n </SheetContent>\n </Sheet>\n ) : null}\n </div>\n </div>\n </header>\n );\n}\n\n/** The first thing a keyboard reaches: a way past the header to the page. */\nexport function SkipLink({ href = '#main-content', children = 'Skip to content' }: { href?: string; children?: ReactNode }) {\n return (\n <a\n href={href}\n className=\"sr-only focus:not-sr-only focus:fixed focus:left-4 focus:top-3 focus:z-50 focus:rounded-full focus:border focus:border-border focus:bg-card focus:px-4 focus:py-2 focus:text-[0.9375rem] focus:font-medium focus:text-foreground focus:shadow-md\"\n >\n {children}\n </a>\n );\n}\n\nconst BANNER_TONE = {\n neutral: 'border-border bg-muted',\n brand: 'border-[color-mix(in_oklab,var(--oca-orange)_30%,var(--border))] bg-[color-mix(in_oklab,var(--oca-orange)_9%,var(--background))]',\n danger: 'border-[color-mix(in_oklab,var(--destructive)_35%,var(--border))] bg-[color-mix(in_oklab,var(--destructive)_8%,var(--background))]',\n} as const;\n\n/**\n * One strip above the header: an outage, or a notice everyone must see. The\n * rule that shows it stays with each site; this is only how it looks. Three\n * tones, as a Notice has, and ink text on every one.\n */\nexport function SiteBanner({\n tone = 'neutral',\n children,\n action,\n className,\n}: {\n tone?: keyof typeof BANNER_TONE;\n children: ReactNode;\n /** A link to where the full story is (\"Status\"). */\n action?: ReactNode;\n className?: string;\n}) {\n return (\n <div role=\"status\" aria-live=\"polite\" data-tone={tone} className={cn('border-b text-[0.875rem]', BANNER_TONE[tone], className)}>\n <div className=\"oca-container flex flex-wrap items-center justify-between gap-x-4 gap-y-1 py-2.5\">\n <p className=\"flex min-w-0 items-baseline gap-2.5 leading-snug\">\n {tone !== 'neutral' ? (\n <span\n aria-hidden\n className={cn(\n 'size-2 shrink-0 translate-y-[-0.05em] rounded-full',\n tone === 'brand' ? 'bg-oca-orange' : 'bg-destructive'\n )}\n />\n ) : null}\n <span>{children}</span>\n </p>\n {/* On a phone the link wraps under the words, lined up with them, not the dot. */}\n {action ? <div className={cn('shrink-0 font-medium', tone !== 'neutral' && 'max-sm:pl-[1.125rem]')}>{action}</div> : null}\n </div>\n </div>\n );\n}\n\n/** A link in the footer's lists: 44px tall on phones. */\nconst FOOT_LINK = 'inline-flex min-h-11 items-center transition-colors hover:text-foreground md:min-h-0';\n\nfunction LegalRow() {\n return (\n <div className=\"flex flex-col gap-x-6 gap-y-2 sm:flex-row sm:items-center sm:justify-between\">\n <nav aria-label=\"Legal\">\n <ul className=\"flex flex-wrap gap-x-5\">\n {LEGAL_LINKS.map((l) => (\n <li key={l.href}>\n <a href={l.href} className={FOOT_LINK}>\n {l.label}\n </a>\n </li>\n ))}\n </ul>\n </nav>\n <p>© {new Date().getFullYear()} OrangeCheck</p>\n </div>\n );\n}\n\nexport interface SiteFooterProps {\n columns?: readonly FooterColumn[];\n /** Add the family's columns from the registry: orangecheck, Protocols, Apps, Public goods. */\n family?: boolean;\n /** The fixed legal row, all on ochk.io: Privacy, Terms, Security, Trademarks, Contact. */\n legal?: boolean;\n /** One row, for tools: the lockup, the protocols when `family`, legal and meta. */\n compact?: boolean;\n fineprint?: ReactNode;\n meta?: ReactNode;\n /** The mark and wordmark at display size, closing the page. */\n signature?: boolean;\n className?: string;\n}\n\n/**\n * The footer, in the deck's register: a line of fine print, columns of links,\n * the family when it is on, the legal row and the support credit. Any number\n * of columns: the lockup shares their row up to five, then takes its own.\n * Links are 44px tall on phones.\n */\nexport function SiteFooter({\n columns = [],\n family = false,\n legal = false,\n compact = false,\n fineprint,\n meta,\n signature = true,\n className,\n}: SiteFooterProps) {\n if (compact) {\n return (\n <footer className={cn('border-t border-border bg-background text-[0.875rem] text-muted-foreground', className)}>\n <div className=\"oca-container flex flex-col gap-x-8 gap-y-3 py-5 lg:flex-row lg:items-center lg:justify-between\">\n <div className=\"flex flex-wrap items-center gap-x-6 gap-y-1\">\n <a href={OCHK_IO} className=\"rounded-lg text-foreground\">\n <Lockup size={22} />\n </a>\n {family ? (\n <nav aria-label=\"Protocols\">\n <ul className=\"flex flex-wrap gap-x-4\">\n {PROTOCOLS.map((p) => (\n <li key={p.slug}>\n <a href={p.pageHref} className={FOOT_LINK}>\n {p.label}\n </a>\n </li>\n ))}\n </ul>\n </nav>\n ) : null}\n </div>\n {legal || meta ? (\n <div className=\"flex flex-col gap-x-6 gap-y-2 sm:flex-row sm:flex-wrap sm:items-center\">\n {legal ? <LegalRow /> : null}\n {meta}\n </div>\n ) : null}\n </div>\n </footer>\n );\n }\n const cols: FooterColumn[] = [\n ...columns,\n ...(family\n ? familyByGroup().map((g) => ({\n // The lockup above already says orangecheck.\n heading: g.id === 'orangecheck' ? 'Start here' : g.label,\n links: g.sites.map((s) => ({ href: s.href, label: s.label, external: true })),\n }))\n : []),\n ];\n const n = cols.length;\n const inline = n <= 5;\n const grid = {\n '--oca-footer-md': `repeat(${Math.max(1, Math.min(n, 4))}, minmax(0, 1fr))`,\n '--oca-footer-lg': inline\n ? `minmax(0, 1.3fr) repeat(${Math.max(1, n)}, minmax(0, 1fr))`\n : `repeat(${Math.min(n, 6)}, minmax(0, 1fr))`,\n } as CSSProperties;\n return (\n <footer className={cn('border-t border-border bg-background', className)}>\n <div\n style={grid}\n className=\"oca-container grid grid-cols-2 gap-x-6 gap-y-10 py-14 md:grid-cols-[var(--oca-footer-md)] md:py-16 lg:grid-cols-[var(--oca-footer-lg)]\"\n >\n <div className={cn('col-span-full flex flex-col gap-4', inline && 'lg:col-span-1')}>\n <Lockup size={26} />\n {fineprint ? <p className=\"max-w-xs text-[0.9375rem] leading-relaxed text-muted-foreground\">{fineprint}</p> : null}\n </div>\n {cols.map((col, i) => {\n // On a phone an odd last column takes the whole row, its links in two\n // columns, instead of sitting alone beside an empty half.\n const spans = n % 2 === 1 && i === n - 1;\n return (\n <div\n key={col.heading}\n className={cn('flex min-w-0 flex-col gap-1', spans && 'col-span-2 md:col-span-1')}\n >\n <p className=\"mb-2 text-[0.875rem] font-medium\">{col.heading}</p>\n <div className={cn('flex flex-col gap-1', spans && 'grid grid-cols-2 gap-x-6 md:flex md:flex-col')}>\n {col.links.map((l) => (\n <NavLink\n key={l.href}\n item={l}\n className=\"-mx-3 py-2.5 text-[0.9375rem] md:py-1.5\"\n />\n ))}\n </div>\n </div>\n );\n })}\n </div>\n {signature ? (\n <div aria-hidden className=\"oca-container select-none overflow-hidden pb-8 md:pb-12\">\n <div className=\"flex items-end gap-[0.18em] text-[clamp(3rem,11.5vw,10rem)] leading-[0.78] tracking-[-0.065em] [font-family:var(--oc-font-display)]\">\n <span className=\"mb-[0.06em] inline-block w-[1.1em] shrink-0\">\n <Mark className=\"block h-auto w-full\" />\n </span>\n <span>orangecheck</span>\n </div>\n </div>\n ) : null}\n {legal || meta ? (\n <div className=\"oca-container\">\n {/* The rule spans the content, not the gutters. */}\n <div className=\"flex flex-col gap-3 border-t border-border py-6 text-[0.875rem] text-muted-foreground\">\n {legal ? <LegalRow /> : null}\n {meta}\n </div>\n </div>\n ) : null}\n </footer>\n );\n}\n","import { useEffect, useRef } from 'react';\n\nimport { cn } from '../lib/cn';\nimport { Mark } from './mark';\n\nexport interface IsoCheckProps {\n /** Width in px; the check keeps its 2:1 grid. */\n size?: number;\n /** Drop it into place on first paint, the deck's closing gesture. */\n settle?: boolean;\n /** A soft floor shadow, so it reads as an object on the canvas. */\n shadow?: boolean;\n /** Turn a few degrees toward the pointer, with a warm light behind it. */\n tilt?: boolean;\n title?: string;\n className?: string;\n}\n\n/** The isometric check as an object: the deck's closing illustration. */\nexport function IsoCheck({ size = 360, settle = false, shadow = true, tilt = false, title, className }: IsoCheckProps) {\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const el = ref.current;\n if (!el || !tilt || window.matchMedia('(prefers-reduced-motion: reduce)').matches) return;\n let raf = 0;\n let tx = 0;\n let ty = 0;\n let x = 0;\n let y = 0;\n const step = () => {\n x += (tx - x) * 0.08;\n y += (ty - y) * 0.08;\n el.style.setProperty('--rx', `${(-y * 10).toFixed(2)}deg`);\n el.style.setProperty('--ry', `${(x * 14).toFixed(2)}deg`);\n raf = Math.abs(tx - x) + Math.abs(ty - y) > 0.001 ? requestAnimationFrame(step) : 0;\n };\n const move = (e: PointerEvent) => {\n const b = el.getBoundingClientRect();\n tx = Math.max(-1, Math.min(1, (e.clientX - (b.left + b.width / 2)) / (window.innerWidth / 2)));\n ty = Math.max(-1, Math.min(1, (e.clientY - (b.top + b.height / 2)) / (window.innerHeight / 2)));\n if (!raf) raf = requestAnimationFrame(step);\n };\n window.addEventListener('pointermove', move, { passive: true });\n return () => {\n cancelAnimationFrame(raf);\n window.removeEventListener('pointermove', move);\n };\n }, [tilt]);\n\n return (\n <div\n ref={ref}\n className={cn('relative inline-block', settle && 'oca-animate-settle', className)}\n style={{ width: size, perspective: tilt ? 900 : undefined }}\n >\n {tilt ? (\n <div\n aria-hidden\n className=\"absolute left-1/2 top-1/2 -z-0 aspect-square w-[120%] -translate-x-1/2 -translate-y-1/2 rounded-full opacity-70 blur-3xl\"\n style={{ background: 'radial-gradient(closest-side, rgb(255 140 70 / 0.35), transparent)' }}\n />\n ) : null}\n <div\n className=\"relative z-10 transition-transform duration-300 ease-out\"\n style={tilt ? { transform: 'rotateX(var(--rx, 0deg)) rotateY(var(--ry, 0deg))', transformStyle: 'preserve-3d' } : undefined}\n >\n <Mark size={size} title={title} className=\"block\" />\n </div>\n {shadow ? (\n <div\n aria-hidden\n className=\"absolute left-[8%] right-[8%] rounded-[50%] opacity-60 blur-xl\"\n style={{ height: size * 0.08, bottom: -size * 0.04, background: 'rgb(234 88 11 / 0.18)' }}\n />\n ) : null}\n </div>\n );\n}\n","import Link from 'next/link';\nimport type { ReactNode } from 'react';\n\nimport { IsoCheck } from '../brand/iso-check';\nimport { Lockup } from '../brand/mark';\nimport { cn } from '../lib/cn';\n\n/**\n * The page a sign-in happens on: a form column with the lockup, a display\n * title, one line and the ceremony, and from lg an ink column with a picture.\n * The ceremony itself (OcSignIn, a SignMessage, a passkey prompt) is the\n * children; this is only the frame, so ochk.io's /signin and /sudo and every\n * tool's sign-in page look the same.\n */\nexport function SignInFrame({\n title = 'Sign in',\n lead,\n children,\n error,\n fineprint,\n brand,\n home = '/',\n back,\n art,\n caption,\n className,\n}: {\n title?: ReactNode;\n /** One line under the title. */\n lead?: ReactNode;\n /** The ceremony. */\n children: ReactNode;\n /** A failure the ceremony could not show itself. */\n error?: ReactNode;\n /** Small print under the ceremony: where the code goes, what is kept. */\n fineprint?: ReactNode;\n /** Replaces the lockup in the corner. */\n brand?: ReactNode;\n home?: string;\n /** The link opposite the lockup. Defaults to \"Back to home\"; `null` leaves it out. */\n back?: ReactNode;\n /** The picture in the ink column. Defaults to the check. */\n art?: ReactNode;\n /** A line at the foot of the ink column. */\n caption?: ReactNode;\n className?: string;\n}) {\n return (\n <main\n id=\"main-content\"\n className={cn('grid min-h-dvh grid-cols-1 bg-background text-foreground lg:grid-cols-2', className)}\n >\n <section className=\"flex flex-col px-4 pb-8 pt-5 sm:px-8 lg:px-14 lg:pt-8\">\n <header className=\"flex items-center justify-between gap-4\">\n <Link href={home} className=\"w-fit rounded-lg\">\n {brand ?? <Lockup size={28} />}\n <span className=\"sr-only\"> home</span>\n </Link>\n {back === undefined ? (\n <Link\n href={home}\n className=\"text-[0.9375rem] text-muted-foreground underline-offset-4 hover:text-foreground hover:underline\"\n >\n Back to home\n </Link>\n ) : (\n back\n )}\n </header>\n <div className=\"mx-auto flex w-full max-w-[25rem] flex-1 flex-col justify-center gap-9 py-12\">\n <div className=\"flex flex-col gap-3\">\n <h1 className=\"oca-display-2\">{title}</h1>\n {lead ? <p className=\"oca-lead\">{lead}</p> : null}\n </div>\n <div>{children}</div>\n {error ? (\n <p role=\"alert\" className=\"text-[0.9375rem] text-destructive\">\n {error}\n </p>\n ) : null}\n {fineprint ? <p className=\"text-[0.8125rem] leading-relaxed text-muted-foreground\">{fineprint}</p> : null}\n </div>\n </section>\n <aside\n aria-hidden\n className=\"relative hidden flex-col justify-between gap-10 overflow-hidden border-l border-[var(--oca-band-line)] bg-oca-ink p-14 text-oca-ink-foreground lg:flex\"\n >\n <div className=\"flex flex-1 items-center justify-center\">{art ?? <IsoCheck size={340} settle tilt className=\"max-w-full\" />}</div>\n {caption ? <div className=\"flex max-w-[24rem] flex-col gap-3\">{caption}</div> : null}\n </aside>\n </main>\n );\n}\n","import { createContext, useContext } from 'react';\n\n/** Where the viewer is inside the signed-in shell: its section and page. */\nexport interface ShellPlace {\n section?: string;\n page?: string;\n}\n\nexport const ShellContext = createContext<ShellPlace>({});\n\nexport function useShellPlace(): ShellPlace {\n return useContext(ShellContext);\n}\n","import { ChevronRight, Menu, Moon, Sun, SunMoon } from 'lucide-react';\nimport Link from 'next/link';\nimport { useTheme } from 'next-themes';\nimport { useEffect, useMemo, useState, type ReactNode } from 'react';\n\nimport { Lockup } from '../brand/mark';\nimport { cn } from '../lib/cn';\nimport { ShellContext } from '../lib/shell-context';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n Sheet,\n SheetContent,\n SheetTitle,\n SheetTrigger,\n} from '../primitives/overlay';\n\nexport interface ShellNavItem {\n href: string;\n label: string;\n icon?: ReactNode;\n active?: boolean;\n /** A count or a dot beside the label (unread, needs attention). */\n badge?: ReactNode;\n}\n\nexport interface ShellNavGroup {\n /** Omit for the first, unlabeled group. */\n label?: string;\n items: ShellNavItem[];\n}\n\n/**\n * A part of the app with its own pages: \"You\", \"Build\", \"Operate\", \"Admin\".\n * The sidebar lists one section's pages at a time, under a switcher.\n */\nexport interface ShellSection {\n id: string;\n /** Short, for the switcher: one word. */\n label: string;\n /** The section's eyebrow on its pages; defaults to `label`. */\n title?: string;\n /** Where the switcher goes: the section's first page. */\n href: string;\n groups: ShellNavGroup[];\n}\n\nfunction SideNav({ groups, onNavigate }: { groups: ShellNavGroup[]; onNavigate?: () => void }) {\n return (\n <nav aria-label=\"Pages\" className=\"flex flex-col gap-5\">\n {groups.map((g, gi) => (\n <div key={g.label ?? gi} className=\"flex flex-col gap-0.5\">\n {g.label ? <p className=\"px-3 pb-1 text-[0.8125rem] text-muted-foreground\">{g.label}</p> : null}\n {g.items.map((it) => (\n <Link\n key={it.href}\n href={it.href}\n onClick={onNavigate}\n aria-current={it.active ? 'page' : undefined}\n className={cn(\n 'flex h-9 items-center gap-3 rounded-xl px-3 text-[0.9375rem] transition-colors',\n '[&_svg]:size-[1.0625rem] [&_svg]:shrink-0',\n it.active\n ? 'bg-card text-foreground shadow-sm ring-1 ring-border [&_svg]:text-foreground'\n : 'text-muted-foreground hover:bg-accent hover:text-foreground'\n )}\n >\n {it.icon}\n <span className=\"min-w-0 flex-1 truncate\">{it.label}</span>\n {it.badge ? <span className=\"shrink-0\">{it.badge}</span> : null}\n </Link>\n ))}\n </div>\n ))}\n </nav>\n );\n}\n\nfunction SectionSwitch({\n sections,\n current,\n onNavigate,\n}: {\n sections: ShellSection[];\n current: ShellSection;\n onNavigate?: () => void;\n}) {\n // Up to three fit one row of the sidebar; four go two by two, so no label\n // is ever cut short.\n const cols = sections.length <= 3 ? sections.length : 2;\n return (\n <nav\n aria-label=\"Sections\"\n className={cn('grid gap-1 bg-muted p-1', cols === sections.length ? 'rounded-full' : 'rounded-[1.25rem]')}\n style={{ gridTemplateColumns: `repeat(${cols}, minmax(0, 1fr))` }}\n >\n {sections.map((sec) => {\n const on = sec.id === current.id;\n return (\n <Link\n key={sec.id}\n href={sec.href}\n onClick={onNavigate}\n aria-current={on ? 'true' : undefined}\n className={cn(\n 'flex h-8 min-w-0 items-center justify-center rounded-full px-1.5 text-[0.8125rem] font-medium transition-colors',\n on ? 'bg-card text-foreground shadow-sm' : 'text-muted-foreground hover:text-foreground'\n )}\n >\n <span className=\"truncate\">{sec.label}</span>\n </Link>\n );\n })}\n </nav>\n );\n}\n\n/** The phone's way around a small app: every page one tap away, under the thumb. */\nfunction TabBar({ items }: { items: ShellNavItem[] }) {\n return (\n <nav\n aria-label=\"Pages\"\n data-oca-tabbar=\"\"\n className=\"fixed inset-x-0 bottom-0 z-40 border-t border-border bg-background/90 pb-[env(safe-area-inset-bottom)] backdrop-blur-md md:hidden\"\n >\n <div\n className=\"mx-auto grid h-14 max-w-[32rem] px-1.5\"\n style={{ gridTemplateColumns: `repeat(${items.length}, minmax(0, 1fr))` }}\n >\n {items.map((it) => (\n <Link\n key={it.href}\n href={it.href}\n aria-current={it.active ? 'page' : undefined}\n className={cn(\n 'flex min-w-0 flex-col items-center justify-center gap-1 rounded-2xl text-[0.6875rem] leading-none outline-none transition-colors [-webkit-tap-highlight-color:transparent] focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring',\n it.active ? 'text-foreground' : 'text-muted-foreground hover:text-foreground'\n )}\n >\n <span\n className={cn(\n 'relative flex h-7 w-12 items-center justify-center rounded-full transition-[background-color,box-shadow] duration-200',\n '[&_svg]:size-[1.125rem] [&_svg]:shrink-0',\n it.active ? 'bg-card shadow-sm ring-1 ring-border [&_svg]:stroke-2' : '[&_svg]:stroke-[1.75]'\n )}\n >\n {it.icon}\n {it.badge ? (\n <span aria-hidden className=\"absolute right-2.5 top-0.5 size-2 rounded-full bg-oca-orange ring-2 ring-background\" />\n ) : null}\n </span>\n <span className=\"max-w-full truncate px-0.5\">{it.label}</span>\n {it.badge ? <span className=\"sr-only\">{it.badge}</span> : null}\n </Link>\n ))}\n </div>\n </nav>\n );\n}\n\n/** Two to five pages, each with an icon, fit a tab bar. More, or sections, keep the drawer. */\nfunction tabsFor(groups: ShellNavGroup[]): ShellNavItem[] | null {\n const items = groups.flatMap((g) => g.items);\n return items.length >= 2 && items.length <= 5 && items.every((it) => it.icon) ? items : null;\n}\n\nconst activeItem = (groups: ShellNavGroup[]) => groups.flatMap((g) => g.items).find((it) => it.active);\n\n// Bundlers replace process.env.NODE_ENV; the typeof guard covers one that doesn't.\ndeclare const process: { env: { NODE_ENV?: string } } | undefined;\n\nconst warned = new Set<string>();\n\nfunction warnDuplicateLabels(groups: ShellNavGroup[]) {\n if (typeof process === 'undefined' || process.env.NODE_ENV === 'production') return;\n const seen = new Set<string>();\n for (const it of groups.flatMap((g) => g.items)) {\n if (seen.has(it.label) && !warned.has(it.label)) {\n warned.add(it.label);\n console.warn(`AppShell: two pages are labelled \"${it.label}\"; give each its own name.`);\n }\n seen.add(it.label);\n }\n}\n\n/**\n * The signed-in frame: a quiet sidebar on the canvas, content on the right.\n *\n * Give it `sections` and the sidebar shows a switcher (only when there is more\n * than one) and the current section's pages, so it never outgrows the screen;\n * `persistent` groups (Account) follow every section. The section is the one\n * holding an active item, or `activeSection`. On phones a top bar carries the\n * wordmark and the account, a strip under it names the section and page, and\n * the sidebar opens as a sheet. `nav` (flat groups) still works for a simple\n * app, and when it holds two to five pages, each with an icon, phones get a\n * tab bar instead: the pages sit under the thumb, the strip and the menu\n * button go (the sheet stays for a `footer`, without the pages), and tablets\n * keep the sheet. Pages get the section through context: PageHeader uses it\n * as its eyebrow. The account control and any banner are slots.\n */\nexport function AppShell({\n nav,\n sections,\n activeSection,\n page: pageOverride,\n persistent = [],\n home = '/',\n account,\n banner,\n footer,\n children,\n className,\n}: {\n /** Flat groups, for an app without sections. */\n nav?: ShellNavGroup[];\n sections?: ShellSection[];\n activeSection?: string;\n /** The page's name for the place strip, when it is not a nav item of its own. */\n page?: string;\n /** Groups shown under every section, after its own. */\n persistent?: ShellNavGroup[];\n home?: string;\n account?: ReactNode;\n banner?: ReactNode;\n footer?: ReactNode;\n children: ReactNode;\n className?: string;\n}) {\n const [open, setOpen] = useState(false);\n const current =\n sections && sections.length > 0\n ? (sections.find((sec) => sec.id === activeSection) ??\n sections.find((sec) => activeItem(sec.groups)) ??\n sections[0]!)\n : undefined;\n const groups = current ? [...current.groups, ...persistent] : [...(nav ?? []), ...persistent];\n warnDuplicateLabels(groups);\n const tabs = current ? null : tabsFor(groups);\n const page = activeItem(groups);\n const place = useMemo(\n () => ({\n section: current ? (current.title ?? current.label) : undefined,\n page: pageOverride ?? page?.label,\n }),\n [current, page?.label, pageOverride]\n );\n const switcher =\n sections && current && sections.length > 1 ? (\n <SectionSwitch sections={sections} current={current} onNavigate={() => setOpen(false)} />\n ) : null;\n return (\n <ShellContext.Provider value={place}>\n <div\n className={cn(\n 'min-h-dvh bg-background',\n tabs && 'max-md:pb-[calc(3.5rem_+_env(safe-area-inset-bottom))]',\n className\n )}\n >\n <div className=\"sticky top-0 z-40 border-b border-border bg-background/90 backdrop-blur-md lg:hidden\">\n <div className=\"flex h-14 items-center gap-2 px-3\">\n <Sheet open={open} onOpenChange={setOpen}>\n <SheetTrigger\n className={cn(\n 'inline-flex size-10 items-center justify-center rounded-full hover:bg-accent',\n // The tab bar holds every page; the sheet is left for a footer.\n tabs && !footer && 'max-md:hidden'\n )}\n aria-label=\"Open navigation\"\n >\n <Menu className=\"size-5\" />\n </SheetTrigger>\n <SheetContent side=\"left\" className=\"flex flex-col gap-6 overflow-y-auto p-4 pt-16\">\n <SheetTitle className=\"sr-only\">Navigation</SheetTitle>\n {switcher}\n <div className={tabs ? 'max-md:hidden' : undefined}>\n <SideNav groups={groups} onNavigate={() => setOpen(false)} />\n </div>\n {footer ? <div className=\"mt-auto flex flex-col gap-3\">{footer}</div> : null}\n </SheetContent>\n </Sheet>\n <Link href={home} aria-label=\"Home\" className=\"rounded-lg p-1\">\n <Lockup size={22} />\n </Link>\n <div className=\"ml-auto flex items-center\">{account}</div>\n </div>\n {place.page ? (\n <div\n className={cn(\n 'flex h-9 items-center gap-1.5 border-t border-border px-4 text-[0.875rem]',\n // The active tab already names the page.\n tabs && !pageOverride && 'max-md:hidden'\n )}\n >\n {place.section ? (\n <>\n <span className=\"shrink-0 text-muted-foreground\">{place.section}</span>\n <ChevronRight aria-hidden className=\"size-3.5 shrink-0 text-muted-foreground\" />\n </>\n ) : null}\n <span className=\"truncate font-medium\">{place.page}</span>\n </div>\n ) : null}\n </div>\n <div className=\"mx-auto flex w-full max-w-[90rem]\">\n <aside className=\"sticky top-0 hidden h-dvh w-[17rem] shrink-0 flex-col gap-6 overflow-y-auto px-4 py-6 lg:flex\">\n <Link href={home} className=\"px-2\" aria-label=\"Home\">\n <Lockup size={26} />\n </Link>\n {switcher}\n <SideNav groups={groups} />\n <div className=\"mt-auto flex flex-col gap-3\">{footer}</div>\n </aside>\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <div className=\"hidden h-[4.5rem] items-center justify-end gap-3 px-8 lg:flex\">{account}</div>\n {banner ? <div className=\"px-4 pb-2 pt-4 md:px-8 lg:pt-0\">{banner}</div> : null}\n <main id=\"main-content\" className=\"flex-1 px-4 pb-16 pt-6 md:px-8 lg:pt-2\">\n {/* One width for every signed-in page. */}\n <div className=\"mx-auto w-full max-w-[72rem]\">{children}</div>\n </main>\n </div>\n </div>\n {tabs ? <TabBar items={tabs} /> : null}\n </div>\n </ShellContext.Provider>\n );\n}\n\nexport interface AccountMenuItem {\n label: string;\n href?: string;\n onSelect?: () => void;\n icon?: ReactNode;\n destructive?: boolean;\n}\n\n/** The account button: initial + short id, a menu of items. */\nexport function AccountMenu({\n name,\n detail,\n items,\n nameFrom = 'sm',\n}: {\n name: string;\n /** A second line: the short did, an address. */\n detail?: string;\n items: (AccountMenuItem | 'separator')[];\n /** The width from which the name shows beside the initial. A header with\n * navigation beside it needs the room until lg. */\n nameFrom?: 'sm' | 'lg';\n}) {\n const initial = name.trim().charAt(0).toUpperCase() || '·';\n return (\n <DropdownMenu>\n <DropdownMenuTrigger\n className={cn(\n 'inline-flex h-10 items-center gap-2.5 rounded-full border border-border bg-card pl-1 pr-1 text-[0.9375rem] outline-none transition-colors hover:border-oca-hairline-strong focus-visible:ring-2 focus-visible:ring-ring',\n nameFrom === 'lg' ? 'lg:pr-3.5' : 'sm:pr-3.5'\n )}\n aria-label={`Account: ${name}`}\n >\n <span className=\"flex size-8 items-center justify-center rounded-full bg-foreground text-[0.8125rem] font-medium text-background\">\n {initial}\n </span>\n <span className={cn('max-w-[10rem] truncate', nameFrom === 'lg' ? 'max-lg:hidden' : 'max-sm:hidden')}>\n {name}\n </span>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-64\">\n <DropdownMenuLabel className=\"flex flex-col gap-0.5\">\n <span className=\"truncate text-[0.9375rem] font-medium text-foreground\">{name}</span>\n {detail ? <span className=\"truncate font-mono text-[0.75rem]\">{detail}</span> : null}\n </DropdownMenuLabel>\n <DropdownMenuSeparator />\n {items.map((it, i) =>\n it === 'separator' ? (\n <DropdownMenuSeparator key={`sep-${i}`} />\n ) : it.href ? (\n <DropdownMenuItem key={it.label} asChild destructive={it.destructive}>\n <Link href={it.href}>\n {it.icon}\n {it.label}\n </Link>\n </DropdownMenuItem>\n ) : (\n <DropdownMenuItem key={it.label} onSelect={it.onSelect} destructive={it.destructive}>\n {it.icon}\n {it.label}\n </DropdownMenuItem>\n )\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\n/** Light, dark, or follow the system: one button that cycles. */\nexport function ThemeToggle({ className }: { className?: string }) {\n const { theme, setTheme } = useTheme();\n const [mounted, setMounted] = useState(false);\n useEffect(() => setMounted(true), []);\n const current = mounted ? (theme ?? 'system') : 'system';\n const next = current === 'light' ? 'dark' : current === 'dark' ? 'system' : 'light';\n const Icon = current === 'light' ? Sun : current === 'dark' ? Moon : SunMoon;\n return (\n <button\n type=\"button\"\n onClick={() => setTheme(next)}\n aria-label={`Theme: ${current}. Switch to ${next}`}\n title={`Theme: ${current}`}\n className={cn(\n 'inline-flex size-10 items-center justify-center rounded-full text-muted-foreground transition-colors hover:bg-accent hover:text-foreground',\n className\n )}\n >\n <Icon className=\"size-[1.125rem]\" />\n </button>\n );\n}\n"]}
|