@lovett/ui 0.0.4 → 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +2659 -0
- package/dist/index.js +14451 -0
- package/dist/index.js.map +1 -0
- package/dist/styles.css +636 -0
- package/dist/tokens.css +700 -0
- package/package.json +44 -17
- package/src/__tests__/button.test.tsx +137 -0
- package/src/__tests__/card.test.tsx +103 -0
- package/src/__tests__/dead-render.test.tsx +117 -0
- package/src/__tests__/input.test.tsx +134 -0
- package/src/__tests__/modal.test.tsx +154 -0
- package/src/__tests__/page-shell.test.tsx +128 -0
- package/src/__tests__/setup.ts +43 -0
- package/src/__tests__/token-shape.test.ts +193 -0
- package/src/allocation-sparkbar.tsx +90 -0
- package/src/card.tsx +1 -1
- package/src/collapsible-card.tsx +85 -0
- package/src/data-grid/table-body.tsx +8 -1
- package/src/dropdown-menu.tsx +1 -1
- package/src/floating-status-bar.tsx +112 -0
- package/src/folder-tree-picker.tsx +5 -6
- package/src/frame-stack.tsx +27 -10
- package/src/hero-form-card.tsx +2 -2
- package/src/icons/brand.tsx +187 -0
- package/src/index.ts +43 -0
- package/src/lib/clipboard.ts +14 -0
- package/src/lib/color.ts +111 -0
- package/src/meta-cell.tsx +52 -0
- package/src/meta-previews/MetaFeedCarousel.tsx +1 -1
- package/src/meta-previews/MetaFeedPreview.tsx +1 -1
- package/src/microsoft-logo.tsx +33 -0
- package/src/modal.tsx +77 -6
- package/src/pill-button.tsx +23 -5
- package/src/profile-section.tsx +40 -9
- package/src/sortable-table.tsx +5 -1
- package/src/styles.css +74 -0
- package/src/tabs.tsx +4 -0
- package/src/tag-chip-input.tsx +1 -1
- package/src/theme-v2.css +466 -0
- package/src/token-badge.tsx +92 -0
- package/src/tokens.css +181 -60
- package/src/v2/README.md +208 -0
- package/src/v2/__demo__/showcase.tsx +1045 -0
- package/src/v2/action.tsx +91 -0
- package/src/v2/callout.tsx +76 -0
- package/src/v2/document-section.tsx +82 -0
- package/src/v2/document-shell.tsx +0 -0
- package/src/v2/field-row.tsx +113 -0
- package/src/v2/icons.tsx +165 -0
- package/src/v2/index.ts +147 -0
- package/src/v2/layout.tsx +293 -0
- package/src/v2/progress-track.tsx +89 -0
- package/src/v2/stat-tile.tsx +129 -0
- package/src/v2/states.tsx +271 -0
- package/src/v2/status-pill.tsx +74 -0
- package/src/v2/theme.css +1861 -0
- package/src/v2/timeline.tsx +81 -0
- package/src/v2/tokens.ts +228 -0
- package/src/value-chip.tsx +76 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/utils.ts","../src/card.tsx","../src/collapsible-card.tsx","../src/button.tsx","../src/button-group.tsx","../src/input.tsx","../src/textarea.tsx","../src/modal.tsx","../src/floating-drawer.tsx","../src/brand-logo-tile.tsx","../src/profile-section.tsx","../src/lib/layout.ts","../src/chip-nav.tsx","../src/completion-ring.tsx","../src/microsoft-logo.tsx","../src/icons/brand.tsx","../src/choropleth.tsx","../src/page-shell.tsx","../src/toast.tsx","../src/atoms.tsx","../src/sortable.tsx","../src/empty-state.tsx","../src/radio.tsx","../src/option-tile.tsx","../src/metric-card.tsx","../src/progress-bar.tsx","../src/step-loader.tsx","../src/badge.tsx","../src/token-badge.tsx","../src/lib/clipboard.ts","../src/value-chip.tsx","../src/meta-cell.tsx","../src/lib/color.ts","../src/allocation-sparkbar.tsx","../src/floating-status-bar.tsx","../src/stats-grid.tsx","../src/sortable-table.tsx","../src/pagination.tsx","../src/tabs.tsx","../src/pill-button.tsx","../src/checkbox.tsx","../src/dropdown-menu.tsx","../src/data-grid/drawer-panel.tsx","../src/data-grid/table-elements.tsx","../src/data-grid/sortable-parts.tsx","../src/data-grid/sticky.ts","../src/data-grid/table-header.tsx","../src/data-grid/table-body.tsx","../src/data-grid/table-summary-footer.tsx","../src/data-grid/table-overlays.tsx","../src/data-grid/table-view.tsx","../src/data-grid/use-grid-columns.ts","../src/data-grid/use-grid-editing.ts","../src/data-grid/data-grid.tsx","../src/data-grid/toolbar.tsx","../src/data-grid/column-options-menu.tsx","../src/dropdown-button.tsx","../src/accordion.tsx","../src/menu-button.tsx","../src/copy-field.tsx","../src/tag-chip-input.tsx","../src/folder-tree-picker.tsx","../src/shell.tsx","../src/hero-form-card.tsx","../src/range-slider.tsx","../src/segmented-pill.tsx","../src/folder-card.tsx","../src/bulk-action-bar.tsx","../src/file-upload/file-upload-button.tsx","../src/file-upload/file-drop-zone.tsx","../src/file-upload/file-thumbnail.tsx","../src/file-upload/file-preview-item.tsx","../src/file-upload/file-preview-grid.tsx","../src/file-upload/use-file-upload.ts","../src/code-block.tsx","../src/markdown.tsx","../src/resizable.tsx","../src/kbd.tsx","../src/frame-stack.tsx","../src/calculator-shell.tsx","../src/calculator-shell-v2.tsx","../src/stat-row.tsx","../src/slider.tsx","../src/format.ts","../src/page-hero.tsx","../src/search-bar.tsx","../src/filter-bar.tsx","../src/filter-dropdown.tsx","../src/device-frame.tsx","../src/meta-previews/index.ts","../src/meta-previews/CreativeMedia.tsx","../src/meta-previews/ProfileAvatar.tsx","../src/meta-previews/defaults.ts","../src/meta-previews/MetaFeedPreview.tsx","../src/meta-previews/MetaStoryPreview.tsx","../src/meta-previews/MetaReelPreview.tsx","../src/meta-previews/MetaMessengerPreview.tsx","../src/meta-previews/MetaRightColumnPreview.tsx","../src/meta-previews/MetaSearchPreview.tsx","../src/meta-previews/MetaInstreamPreview.tsx","../src/meta-previews/InstagramFeedPreview.tsx","../src/meta-previews/InstagramExplorePreview.tsx","../src/meta-previews/MetaFeedCarousel.tsx","../src/meta-previews/InstagramFeedCarousel.tsx","../src/meta-previews/types.ts"],"names":["clamp","ActionButton","Card","jsxs","jsx","forwardRef","Button","SIZE_CLASS","Input","useState","Textarea","Children","isValidElement","Tray","Fragment","useEffect","X","Foot","useRef","useCallback","SonnerToaster","createContext","Radio","useContext","useId","Check","Loader2","ValueChip","MetaCell","ChevronDown","className","Checkbox","useMemo","createPortal","isEmptyValue","Table","TableHeader","TableBody","TableFooter","TableRow","TableHead","TableCell","useSortable","CSS","GripVertical","ChevronUp","ChevronsUpDown","arrayMove","CONTROL_COLUMN_WIDTH","useSensors","useSensor","PointerSensor","DndContext","closestCenter","SortableContext","verticalListSortingStrategy","VARIANT_CLASS","useLayoutEffect","Shell","Footer","toast","SyntaxHighlighter","Copy","FrameStack","lead","Search","MetaFeedPreview","React","Link2","ChevronLeft","MoreHorizontal","ThumbsUp","WIDTH","FONT","C","memo","InstagramFeedPreview","Dots","Placeholder","stroke","MetaFeedCarousel","Globe","Bubble","ShareArrow","IG_RING","LIKES","COMMENTS","POSTED","InstagramFeedCarousel","MenuDots","Arrow","Chevron","Heart","CommentBubble","Send","Bookmark"],"mappings":"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","file":"index.js","sourcesContent":["import { clsx, type ClassValue } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import {\n Children,\n forwardRef,\n isValidElement,\n type HTMLAttributes,\n type ReactNode,\n} from 'react'\nimport { cn } from './lib/utils'\n\n/**\n * Card — head/body/foot anatomy.\n *\n * Usage:\n * <Card interactive onClick={...}>\n * <Card.Head>\n * <IconTile bg={...} fg={...}><Icon/></IconTile>\n * <div className=\"flex-1 min-w-0\">\n * <Card.Title>Roof Replacement</Card.Title>\n * <Card.Desc>Full tear-off and replacement...</Card.Desc>\n * </div>\n * </Card.Head>\n * <Card.Body>\n * <TagRow tags={['25-Year Warranty', 'Metal & Asphalt']}/>\n * </Card.Body>\n * <Card.Foot>\n * <Card.Meta>...</Card.Meta>\n * <Card.Actions>...</Card.Actions>\n * </Card.Foot>\n * </Card>\n *\n * `interactive` adds cursor + hover lift + reveal-on-hover for Card.Actions.\n */\n\ntype DivProps = HTMLAttributes<HTMLDivElement>\n\ninterface CardProps extends DivProps {\n interactive?: boolean\n}\n\nconst CardRoot = forwardRef<HTMLDivElement, CardProps>(function Card(\n { className, interactive, children, ...rest },\n ref,\n) {\n // Auto-wrap Head + Body (and any sibling content) into a single\n // tray, with Foot left outside on the outer frame. This gives every\n // card the canonical \"gray frame + white focal panel + footer on\n // frame\" look without callers needing to restructure their JSX.\n //\n // Two opt-outs:\n // 1. If a child is <Card.Tray> directly, the caller is managing\n // tray layout themselves (asset card pattern) — render flat.\n // 2. If no child is <Card.Head>/<Card.Body>/<Card.Foot>, this is\n // a \"custom content\" card (e.g. brand-profile logo, history row,\n // mini stat) — render flat so the auto-wrap doesn't add unwanted\n // inset margin to small or one-off layouts.\n const childArray = Children.toArray(children)\n const hasExplicitTray = childArray.some(\n (child) => isValidElement(child) && child.type === Tray,\n )\n const hasNamedSlot = childArray.some(\n (child) =>\n isValidElement(child) &&\n (child.type === Head || child.type === Body || child.type === Foot),\n )\n const shouldAutoWrap = !hasExplicitTray && hasNamedSlot\n\n let renderedChildren: ReactNode = children\n if (shouldAutoWrap) {\n const trayChildren: ReactNode[] = []\n const footChildren: ReactNode[] = []\n childArray.forEach((child) => {\n if (isValidElement(child) && child.type === Foot) {\n footChildren.push(child)\n } else {\n trayChildren.push(child)\n }\n })\n renderedChildren = (\n <>\n {trayChildren.length > 0 && (\n <div className=\"ds-card-tray flex-1\">{trayChildren}</div>\n )}\n {footChildren}\n </>\n )\n }\n\n return (\n <div\n ref={ref}\n data-interactive={interactive ? 'true' : undefined}\n data-framed={shouldAutoWrap ? 'true' : undefined}\n className={cn(\n 'ds-card-surface group/card flex flex-col h-full overflow-hidden',\n className,\n )}\n {...rest}\n >\n {renderedChildren}\n </div>\n )\n})\n\nfunction Head({ className, ...rest }: DivProps) {\n return (\n <div\n className={cn('flex items-start gap-3 px-5 pt-5', className)}\n {...rest}\n />\n )\n}\n\nfunction Body({ className, ...rest }: DivProps) {\n return <div className={cn('px-5 py-3 pb-4', className)} {...rest} />\n}\n\nfunction Tray({ className, ...rest }: DivProps) {\n return <div className={cn('ds-card-tray', className)} {...rest} />\n}\n\nfunction Foot({ className, ...rest }: DivProps) {\n return (\n <div\n className={cn(\n 'mt-auto flex items-center justify-between gap-3 px-5 py-3 text-[12px]',\n className,\n )}\n style={{\n color: 'rgb(var(--text-tertiary))',\n ...rest.style,\n }}\n {...rest}\n />\n )\n}\n\nfunction Title({\n children,\n className,\n ...rest\n}: HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn(\n 'text-[15px] font-semibold leading-[1.3] truncate flex-1 min-w-0',\n className,\n )}\n style={{ color: 'rgb(var(--foreground))', ...rest.style }}\n {...rest}\n >\n {children}\n </div>\n )\n}\n\nfunction Desc({\n children,\n className,\n ...rest\n}: HTMLAttributes<HTMLDivElement> & { clamp?: 2 | 3 }) {\n const clamp = (rest as { clamp?: 2 | 3 }).clamp ?? 2\n return (\n <div\n className={cn(\n 'text-[13px] leading-[1.5] mt-1.5',\n clamp === 2 && 'line-clamp-2',\n clamp === 3 && 'line-clamp-3',\n className,\n )}\n style={{ color: 'rgb(var(--text-secondary))', ...rest.style }}\n {...rest}\n >\n {children}\n </div>\n )\n}\n\nfunction Meta({ className, ...rest }: DivProps) {\n return (\n <div\n className={cn('flex items-center gap-3 min-w-0', className)}\n {...rest}\n />\n )\n}\n\nfunction MetaItem({\n icon,\n children,\n className,\n}: {\n icon?: ReactNode\n children: ReactNode\n className?: string\n}) {\n return (\n <div\n className={cn('flex items-center gap-1.5 text-[12px]', className)}\n style={{ color: 'rgb(var(--text-tertiary))' }}\n >\n {icon && (\n <span style={{ opacity: 0.7 }} className=\"shrink-0 inline-flex\">\n {icon}\n </span>\n )}\n <span className=\"truncate tabular-nums\">{children}</span>\n </div>\n )\n}\n\nfunction Actions({ className, ...rest }: DivProps) {\n return (\n <div\n className={cn('flex items-center gap-1', className)}\n onClick={(e) => e.stopPropagation()}\n {...rest}\n />\n )\n}\n\ninterface ActionButtonProps extends HTMLAttributes<HTMLButtonElement> {\n danger?: boolean\n}\n\nconst ActionButton = forwardRef<HTMLButtonElement, ActionButtonProps>(\n function ActionButton({ className, danger, children, ...rest }, ref) {\n return (\n <button\n ref={ref}\n className={cn(\n 'flex h-7 w-7 items-center justify-center rounded-[6px] transition-colors',\n className,\n )}\n style={{\n background: 'transparent',\n color: 'rgb(var(--text-tertiary))',\n border: '1px solid rgb(var(--border))',\n }}\n onMouseEnter={(e) => {\n if (danger) {\n e.currentTarget.style.color = 'rgb(var(--destructive))'\n e.currentTarget.style.borderColor = 'rgb(var(--destructive) / 0.4)'\n e.currentTarget.style.background =\n 'rgb(var(--destructive) / 0.08)'\n } else {\n e.currentTarget.style.color = 'rgb(var(--foreground))'\n e.currentTarget.style.borderColor = 'rgb(var(--border-strong))'\n e.currentTarget.style.background = 'rgb(var(--surface-overlay))'\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.color = 'rgb(var(--text-tertiary))'\n e.currentTarget.style.borderColor = 'rgb(var(--border))'\n e.currentTarget.style.background = 'transparent'\n }}\n {...rest}\n >\n {children}\n </button>\n )\n },\n)\n\n/**\n * Icon-on-color tile used in card heads. Pass tone colors as inline rgb()\n * strings so they can reference semantic tokens (info/success/etc.).\n */\nfunction IconTile({\n bg,\n fg,\n size = 38,\n className,\n children,\n}: {\n bg: string\n fg: string\n size?: number\n className?: string\n children: ReactNode\n}) {\n return (\n <span\n className={cn(\n 'inline-flex items-center justify-center rounded-[10px] shrink-0',\n className,\n )}\n style={{\n width: size,\n height: size,\n background: bg,\n color: fg,\n }}\n >\n {children}\n </span>\n )\n}\n\n/** Tag row helper — reads `--tag-bg`/`--border` automatically. */\nfunction TagRow({\n tags,\n max = 4,\n className,\n}: {\n tags: string[]\n max?: number\n className?: string\n}) {\n const shown = tags.slice(0, max)\n const overflow = tags.length - max\n return (\n <div className={cn('flex flex-wrap gap-1.5', className)}>\n {shown.map((t, i) => (\n <span\n key={i}\n className=\"inline-flex items-center px-2.5 py-[3px] rounded-full text-[11.5px] font-medium whitespace-nowrap\"\n style={{\n background: 'rgb(var(--surface-overlay))',\n border: '1px solid rgb(var(--border))',\n color: 'rgb(var(--text-secondary))',\n }}\n >\n {t}\n </span>\n ))}\n {overflow > 0 && (\n <span\n className=\"text-[11px] font-semibold self-center\"\n style={{ color: 'rgb(var(--text-muted))' }}\n >\n +{overflow}\n </span>\n )}\n </div>\n )\n}\n\n// Compose the API\ntype CardComponent = typeof CardRoot & {\n Head: typeof Head\n Body: typeof Body\n Tray: typeof Tray\n Foot: typeof Foot\n Title: typeof Title\n Desc: typeof Desc\n Meta: typeof Meta\n MetaItem: typeof MetaItem\n Actions: typeof Actions\n ActionButton: typeof ActionButton\n IconTile: typeof IconTile\n TagRow: typeof TagRow\n}\n\nconst Card = CardRoot as CardComponent\nCard.Head = Head\nCard.Body = Body\nCard.Tray = Tray\nCard.Foot = Foot\nCard.Title = Title\nCard.Desc = Desc\nCard.Meta = Meta\nCard.MetaItem = MetaItem\nCard.Actions = Actions\nCard.ActionButton = ActionButton\nCard.IconTile = IconTile\nCard.TagRow = TagRow\n\nexport default Card\nexport { IconTile, TagRow }\n","// CollapsibleCard — a Card whose titled header toggles its body open/closed.\n//\n// Reviewing long specs means scrolling past sections you don't care about right\n// now (a long Sitelinks list to reach Structured snippets, etc.). A collapsible\n// titled card lets the reviewer fold sections away as they go. Built on the\n// Card primitive; accessible (the title is a real button with aria-expanded)\n// and honors prefers-reduced-motion.\n//\n// The collapse toggle is the chevron+title region only, so header `actions`\n// (e.g. a \"Suggest\" button) stay independently clickable beside it — not nested\n// inside the toggle button.\n//\n// Promoted from the SEM Spec lens per ADR-136 Decision 11 (the \"2+ consumers ->\n// promote\" gate): the report tabs and the public share view both consume it.\n\nimport { useId, useState, type ReactNode } from 'react'\nimport { ChevronDown } from 'lucide-react'\nimport Card from './card'\n\nexport interface CollapsibleCardProps {\n title: ReactNode\n /** Optional leading icon (rendered before the title). */\n icon?: ReactNode\n /** Optional header content after the title (e.g. a count or subtitle). */\n meta?: ReactNode\n /** Right-aligned header controls, kept outside the collapse toggle. */\n actions?: ReactNode\n /** Start expanded (default) or collapsed. */\n defaultOpen?: boolean\n /** Body padding utility; pass '' for full-bleed bodies (e.g. tables). */\n contentClassName?: string\n children: ReactNode\n}\n\nexport function CollapsibleCard({\n title,\n icon,\n meta,\n actions,\n defaultOpen = true,\n contentClassName = 'px-4 py-4',\n children,\n}: CollapsibleCardProps) {\n const [open, setOpen] = useState(defaultOpen)\n const bodyId = useId()\n\n return (\n <Card>\n <div\n className=\"flex items-center justify-between gap-3 px-4 py-3\"\n style={{\n borderBottom: `1px solid ${open ? 'rgb(var(--border))' : 'transparent'}`,\n }}\n >\n <button\n type=\"button\"\n onClick={() => setOpen((o) => !o)}\n aria-expanded={open}\n aria-controls={bodyId}\n className=\"flex min-w-0 flex-1 items-center gap-2 rounded-[var(--radius-sm)] py-0.5 text-left transition-colors focus-visible:outline-none focus-visible:[box-shadow:var(--ring-focus)]\"\n >\n <ChevronDown\n className=\"h-4 w-4 shrink-0 transition-transform duration-200 ease-out motion-reduce:transition-none\"\n style={{\n color: 'rgb(var(--text-tertiary))',\n transform: open ? 'rotate(0deg)' : 'rotate(-90deg)',\n }}\n aria-hidden=\"true\"\n />\n {icon}\n <span className=\"truncate text-[14px] font-semibold\" style={{ color: 'rgb(var(--foreground))' }}>\n {title}\n </span>\n {meta}\n </button>\n {actions && <div className=\"flex shrink-0 items-center gap-2\">{actions}</div>}\n </div>\n {open && (\n <div id={bodyId} className={contentClassName}>\n {children}\n </div>\n )}\n </Card>\n )\n}\n","/**\n * Button — typed primitive over the .btn CSS classes in styles.css.\n *\n * variants: primary | secondary | outline | ghost | destructive |\n * destructive-soft | icon | toolbar\n * sizes: sm (32) | md (40) — default | lg (48)\n * shape: default | circle (use with variant=\"icon\" — ADR-026 D3)\n * states: loading, disabled — both forwarded to the CSS class\n */\nimport { forwardRef, type ButtonHTMLAttributes, type ReactNode } from 'react'\nimport { cn } from './lib/utils'\n\nexport type ButtonVariant =\n | 'primary'\n | 'secondary'\n | 'outline'\n | 'ghost'\n | 'destructive'\n | 'destructive-soft'\n | 'icon'\n | 'toolbar'\n\nexport type ButtonSize = 'sm' | 'md' | 'lg'\n\nexport type ButtonShape = 'default' | 'circle'\n\nconst VARIANT_CLASS: Record<ButtonVariant, string> = {\n primary: 'btn-primary',\n secondary: 'btn-secondary',\n outline: 'btn-outline',\n ghost: 'btn-ghost',\n destructive: 'btn-destructive',\n 'destructive-soft': 'btn-destructive-soft',\n icon: 'btn-icon',\n toolbar: 'btn-toolbar',\n}\n\nconst SIZE_CLASS: Record<ButtonSize, string> = {\n sm: 'size-sm',\n md: '',\n lg: 'size-lg',\n}\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: ButtonVariant\n size?: ButtonSize\n /** ADR-026 D3 — `circle` only takes effect when `variant=\"icon\"`. */\n shape?: ButtonShape\n /** Show the loading spinner overlay; auto-disables the button. */\n loading?: boolean\n /** Optional left-side icon. Forces icon-text gap from .btn. */\n leadingIcon?: ReactNode\n /** Optional right-side icon. */\n trailingIcon?: ReactNode\n}\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(function Button(\n {\n variant = 'primary',\n size = 'md',\n shape = 'default',\n loading,\n leadingIcon,\n trailingIcon,\n disabled,\n className,\n children,\n type = 'button',\n ...rest\n },\n ref,\n) {\n return (\n <button\n ref={ref}\n type={type}\n disabled={disabled || loading}\n className={cn(\n 'btn',\n VARIANT_CLASS[variant],\n SIZE_CLASS[size],\n shape === 'circle' && variant === 'icon' && 'is-circle',\n loading && 'is-loading',\n className,\n )}\n {...rest}\n >\n {leadingIcon}\n {children}\n {trailingIcon}\n </button>\n )\n})\n","/**\n * ButtonGroup — typed wrapper over the `.btn-group` CSS class in styles.css.\n *\n * Renders Button children as a joined segmented control (single-row,\n * shared borders, rounded outer corners). Used for view-switchers,\n * mode toggles, and other \"pick one of N\" affordances where the\n * options should read as a connected group.\n *\n * Promoted from inline CSS-class usage to a typed primitive per\n * ADR-026 D5 (inspired by gray-ui-csm recon §13 DQ-5 — the\n * view-switcher button group).\n *\n * <ButtonGroup aria-label=\"View mode\">\n * <Button variant=\"secondary\" aria-pressed={view === 'grid'}>\n * <Grid /> Grid\n * </Button>\n * <Button variant=\"secondary\" aria-pressed={view === 'list'}>\n * <List /> List\n * </Button>\n * </ButtonGroup>\n *\n * The first/last child get rounded outer corners; inner segments are\n * square. Inner borders deduplicate via `border-right-width: 0` on\n * non-last children.\n */\n\nimport type { HTMLAttributes, ReactNode } from 'react'\nimport { cn } from './lib/utils'\n\nexport interface ButtonGroupProps extends HTMLAttributes<HTMLDivElement> {\n /** One or more `<Button>` elements. */\n children: ReactNode\n}\n\nexport function ButtonGroup({\n children,\n className,\n role = 'group',\n ...rest\n}: ButtonGroupProps) {\n return (\n <div role={role} className={cn('btn-group', className)} {...rest}>\n {children}\n </div>\n )\n}\n","/**\n * Input — typed text input wrapped in the .input-shell from styles.css.\n * Supports leading/trailing affixes (icon, badge, action button), three\n * sizes (sm 32 / md 40 / lg 48), and the standard error/disabled states.\n *\n * <Input value={v} onChange={e => setV(e.target.value)} placeholder=\"Search…\" />\n *\n * <Input\n * leadingAffix={<Search className=\"h-4 w-4\" />}\n * trailingAffix={<KeyboardShortcut keys=\"⌘K\" />}\n * placeholder=\"Type to search\"\n * />\n *\n * <Input error placeholder=\"Invalid\" />\n *\n * <Input\n * type=\"password\"\n * showPasswordToggle\n * autoComplete=\"current-password\"\n * />\n */\nimport {\n forwardRef,\n useState,\n type InputHTMLAttributes,\n type ReactNode,\n} from 'react'\nimport { Eye, EyeOff } from 'lucide-react'\nimport { cn } from './lib/utils'\n\nexport type InputSize = 'sm' | 'md' | 'lg'\n\nexport interface InputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'size' | 'prefix'> {\n inputSize?: InputSize\n error?: boolean\n /** Element rendered before the input — typically an icon. Static, no interaction. */\n leadingAffix?: ReactNode\n /** Element rendered after the input. Pass an `<button class=\"affix action\">` for clickable. */\n trailingAffix?: ReactNode\n /** Override classes on the .input-shell wrapper. */\n shellClassName?: string\n /**\n * Show/hide affordance for `type=\"password\"`. Manages visibility state\n * internally and renders an Eye/EyeOff toggle in the trailing affix slot.\n * No-op when `type !== \"password\"`. Caller-supplied `trailingAffix`\n * wins — the toggle is only injected when the slot is otherwise empty.\n */\n showPasswordToggle?: boolean\n /**\n * Numeric variant (ADR-076 D8) — renders the field in the monospace\n * face with `tabular-nums` so digits align as the value changes.\n * Pair with the existing `leadingAffix` (e.g. a `$`) / `trailingAffix`\n * (e.g. a unit suffix) for calculator inputs. No new prefix/suffix\n * props — affixes are the canonical adornment slots.\n */\n numeric?: boolean\n}\n\nconst SIZE_CLASS: Record<InputSize, string> = {\n sm: 'size-sm',\n md: '',\n lg: 'size-lg',\n}\n\nexport const Input = forwardRef<HTMLInputElement, InputProps>(function Input(\n {\n inputSize = 'md',\n error,\n leadingAffix,\n trailingAffix,\n shellClassName,\n className,\n disabled,\n type,\n showPasswordToggle,\n numeric,\n ...rest\n },\n ref,\n) {\n const [revealed, setRevealed] = useState(false)\n const isPasswordToggle =\n showPasswordToggle === true && type === 'password' && !trailingAffix\n const resolvedType = isPasswordToggle && revealed ? 'text' : type\n const resolvedTrailingAffix = isPasswordToggle ? (\n <button\n type=\"button\"\n onClick={() => setRevealed((v) => !v)}\n aria-label={revealed ? 'Hide password' : 'Show password'}\n aria-pressed={revealed}\n className=\"affix action\"\n tabIndex={-1}\n >\n {revealed ? (\n <EyeOff className=\"h-4 w-4\" aria-hidden />\n ) : (\n <Eye className=\"h-4 w-4\" aria-hidden />\n )}\n </button>\n ) : (\n trailingAffix\n )\n\n return (\n <div\n className={cn(\n 'input-shell',\n SIZE_CLASS[inputSize],\n numeric && 'is-numeric',\n leadingAffix && 'has-leading',\n resolvedTrailingAffix && 'has-trailing',\n error && 'is-error',\n disabled && 'is-disabled',\n shellClassName,\n )}\n >\n {leadingAffix && <span className=\"affix\">{leadingAffix}</span>}\n <input\n ref={ref}\n type={resolvedType}\n disabled={disabled}\n className={className}\n {...rest}\n />\n {resolvedTrailingAffix && (\n <span className=\"affix\">{resolvedTrailingAffix}</span>\n )}\n </div>\n )\n})\n","/**\n * Textarea — typed primitive in the .input-shell.textarea-shell variant.\n * Auto-grows to content (resize: vertical), shares the same focus/error/\n * disabled visuals as Input.\n *\n * <Textarea\n * value={v}\n * onChange={e => setV(e.target.value)}\n * placeholder=\"Write something…\"\n * rows={4}\n * />\n */\nimport { forwardRef, type TextareaHTMLAttributes } from 'react'\nimport { cn } from './lib/utils'\n\nexport interface TextareaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {\n error?: boolean\n /** Override classes on the .input-shell wrapper. */\n shellClassName?: string\n}\n\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(function Textarea(\n { error, shellClassName, className, disabled, rows = 4, ...rest },\n ref,\n) {\n return (\n <div\n className={cn(\n 'input-shell',\n 'textarea-shell',\n error && 'is-error',\n disabled && 'is-disabled',\n shellClassName,\n )}\n >\n <textarea ref={ref} disabled={disabled} rows={rows} className={className} {...rest} />\n </div>\n )\n})\n","import {\n Children,\n isValidElement,\n useEffect,\n type HTMLAttributes,\n type ReactElement,\n type ReactNode,\n} from 'react'\nimport { X } from 'lucide-react'\nimport { cn } from './lib/utils'\n\n/**\n * Modal — a centered floating panel on top of a backdrop. Built on\n * `.ds-card-surface` so it inherits the premium card chrome (border,\n * radius, multi-layer shadow with inner highlight in light mode).\n *\n * Two layout modes:\n *\n * 1. Flat children (back-compat) — pass content directly:\n *\n * <Modal title=\"...\" onClose={...}>\n * <p>body</p>\n * <Button>action</Button>\n * </Modal>\n *\n * 2. Shell / Tray pattern (recommended) — body in a recessed tray,\n * action buttons on the outer-card bottom strip below the tray:\n *\n * <Modal title=\"...\" onClose={...}>\n * <Modal.Tray>\n * <p>body content sits in a recessed shelf</p>\n * <textarea ... />\n * </Modal.Tray>\n * <Modal.Footer>\n * <Button variant=\"ghost\" onClick={onClose}>Cancel</Button>\n * <Button>Confirm</Button>\n * </Modal.Footer>\n * </Modal>\n */\n\ninterface ModalProps {\n isOpen: boolean\n onClose: () => void\n title: string\n children: ReactNode\n className?: string\n}\n\nfunction Modal({ isOpen, onClose, title, children, className }: ModalProps) {\n useEffect(() => {\n if (!isOpen) return\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose()\n }\n document.addEventListener('keydown', handleEscape)\n return () => document.removeEventListener('keydown', handleEscape)\n }, [isOpen, onClose])\n\n if (!isOpen) return null\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center\">\n {/* Backdrop */}\n <div\n className=\"absolute inset-0\"\n style={{ background: 'rgb(var(--modal-overlay))' }}\n onClick={onClose}\n />\n {/* Outer card — uses .ds-card-surface so the modal gets the\n same chrome as cards (border + multi-layer shadow + inner\n highlight in light mode). overflow-hidden clips children to\n the rounded corners; the tray inside handles its own scroll. */}\n <div\n data-framed=\"true\"\n className={cn(\n 'ds-card-surface relative w-full max-w-2xl flex flex-col max-h-[90vh] overflow-hidden',\n className,\n )}\n style={{ borderRadius: 'var(--radius-xl)' }}\n >\n {/* Header — title + close. Sits on the outer card surface,\n outside any tray. Shrink-0 so it never collapses when the\n body grows. */}\n {/* Header. Geometry from the B/C proposal at /design-system/modals:\n 12px/16px padding, a 24px close button and centre alignment.\n\n It was px-6 pt-6 pb-4 with a 32px close button, which measured\n 60px tall for a 23px title — and because the button was taller\n than the text, the BUTTON set the row height and the title\n floated in slack it never asked for. */}\n <div className=\"flex items-center justify-between gap-3 shrink-0 px-4 py-3\">\n <h2 className=\"text-[15px] font-bold tracking-[-0.01em] text-[rgb(var(--foreground))]\">\n {title}\n </h2>\n <button\n onClick={onClose}\n className=\"inline-flex items-center justify-center w-6 h-6 shrink-0 rounded-[var(--radius-sm)] text-[rgb(var(--text-tertiary))] hover:bg-[rgb(var(--surface-hover))] hover:text-[rgb(var(--foreground))] transition-colors\"\n aria-label=\"Close\"\n >\n <X className=\"h-[15px] w-[15px]\" />\n </button>\n </div>\n {renderBody(children)}\n </div>\n </div>\n )\n}\n\n/**\n * Partition Tray + Footer into ONE tray box, footer last, divider between.\n *\n * Why this exists. Consumers write Tray and Footer as siblings, and until\n * now they rendered that way: the tray at --tray-inset (4px) and the\n * footer on the outer card at px-6 (24px). Three things went wrong at\n * once — the buttons sat 20px inboard of the tray edge they were meant\n * to align with, `.ds-card-tray:not(:last-child)` zeroed the tray's\n * bottom margin so its lower corners were cut flush, and the actions\n * ended up floating in the frame gap instead of on the decision surface.\n *\n * The tray is the decision surface, so the actions belong inside it.\n * Done here rather than by editing 26 consumers, and it keeps the\n * sibling API — the same auto-wrap trick <Card> uses for Head/Body/Foot.\n */\nfunction renderBody(children: ReactNode): ReactNode {\n const kids = Children.toArray(children)\n const tray = kids.find(\n (c): c is ReactElement<HTMLAttributes<HTMLDivElement>> =>\n isValidElement(c) && c.type === Tray,\n )\n const footer = kids.find(\n (c): c is ReactElement<HTMLAttributes<HTMLDivElement>> =>\n isValidElement(c) && c.type === Footer,\n )\n\n // Flat children, or a tray with no actions — nothing to reconcile.\n if (!tray || !footer) return children\n\n const rest = kids.filter((c) => c !== tray && c !== footer)\n const trayProps = tray.props\n const footerProps = footer.props\n\n return (\n <>\n {rest}\n <div className=\"ds-card-tray flex flex-col flex-1 min-h-0\">\n <div\n {...trayProps}\n className={cn('flex-1 min-h-0 overflow-y-auto p-5', trayProps.className)}\n />\n <div\n {...footerProps}\n className={cn(\n 'flex items-center justify-end gap-2 shrink-0 px-5 py-3.5 border-t',\n footerProps.className,\n )}\n style={{ borderColor: 'rgb(var(--border))', ...footerProps.style }}\n />\n </div>\n </>\n )\n}\n\n/**\n * Modal.Tray — the recessed body panel. Sits inside the modal's outer\n * card with --tray-inset margin and its own bg. Scrolls if content\n * exceeds the modal's max-height.\n *\n * When a <Modal.Footer> is also present, `renderBody` above merges the\n * two into a single tray and this standalone styling is not used.\n */\nfunction Tray({ className, ...rest }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn(\n 'ds-card-tray flex-1 min-h-0 overflow-y-auto p-5',\n className,\n )}\n {...rest}\n />\n )\n}\n\n/**\n * Modal.Footer — bottom action strip on the outer card, below the\n * tray inset. `shrink-0` keeps it pinned even when the tray scrolls.\n */\nfunction Footer({ className, ...rest }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn(\n 'flex items-center justify-end gap-2 shrink-0 px-6 py-4',\n className,\n )}\n {...rest}\n />\n )\n}\n\nModal.Tray = Tray\nModal.Footer = Footer\n\nexport default Modal\n","/**\n * FloatingDrawer — edge-anchored, floating-shell drawer.\n *\n * Promoted in Phase 7a (ADR-012 Decision 4) from\n * brand-ai-extension/webapp/src/components/ui/detail-drawer.tsx. The\n * right-anchored variant ports verbatim from that source. The bottom-\n * anchored variant with drag-to-resize is BUILD_FRESH inside this\n * primitive, born of GeoSearch's ResultsDrawer needs.\n *\n * Two committed consumers from day 1 (zero-current-consumers rule):\n * • GeoSearch (`side=\"bottom\"`, `anchor=\"container\"`, resizable) —\n * Phase 7a — non-modal, scoped to the lens main pane\n * • Future card-grid lenses (`side=\"right\"`, modal) — Phase 4+\n *\n * Anatomy:\n * ResizeHandle (optional) — leading edge for drag-to-resize\n * Header (title + titleSlot) — single compact row; consumer\n * drives layout via `title` slot\n * Body (scrollable children)\n * Footer (optional) — action row, separator above\n *\n * The drawer owns its internal token references (`--bg-surface`,\n * `--border`, `--modal-overlay`) — consumers never reach for them.\n */\n\nimport {\n useCallback,\n useEffect,\n useRef,\n useState,\n type PointerEvent as ReactPointerEvent,\n type ReactNode,\n} from 'react'\nimport { X } from 'lucide-react'\nimport { cn } from './lib/utils'\n\ntype Side = 'right' | 'bottom'\ntype Anchor = 'viewport' | 'container'\n\nexport interface FloatingDrawerProps {\n isOpen: boolean\n onClose: () => void\n side: Side\n /** Width (`side=\"right\"`) or height (`side=\"bottom\"`) in px. Defaults: 520 / 480. */\n size?: number\n /** When true, render a drag handle along the leading edge of the panel. */\n resizable?: boolean\n /** Called as the user drags the resize handle. */\n onResize?: (next: number) => void\n /** Header title — short, e.g. the record's name or the drawer's purpose. */\n title?: ReactNode\n /** Optional element rendered to the right of the title, before close. */\n titleSlot?: ReactNode\n /** Optional footer — action buttons. */\n footer?: ReactNode\n children: ReactNode\n className?: string\n /** Optional className on the inner panel for fine-grained body styling. */\n panelClassName?: string\n /**\n * Modal mode renders a backdrop, locks body scroll, and closes on Esc\n * (default — matches the card-grid drawer use case). Non-modal mode\n * (used by GeoSearch's always-on results panel per Phase 7a) skips\n * the backdrop + scroll lock + Esc handler so the user can interact\n * with content behind the panel.\n */\n modal?: boolean\n /**\n * Collapsed mode hides the body and footer entirely so the panel\n * shrinks to just the header — no residual flex-1 body div, no\n * seam between header and panel edge. Designed for non-modal,\n * always-on consumers (GeoSearch) where the user toggles the panel\n * between \"show table\" and \"hide table\" without dismissing it.\n * The header keeps its border-bottom hidden in this state so it\n * reads as a clean single-bar strip.\n *\n * When collapsed, callers should pass `size` matching the header's\n * natural height (Phase 7a uses 44px); panel border + header chrome\n * fit cleanly inside that height with `box-sizing: border-box`.\n */\n collapsed?: boolean\n /**\n * `'viewport'` (default) anchors the drawer with `position: fixed` to\n * the browser viewport — the card-grid drawer pattern. `'container'`\n * anchors with `position: absolute` to the nearest positioned ancestor\n * (the parent MUST establish a containing block, e.g.\n * `position: relative`). Container mode scopes the drawer to a lens\n * pane so it doesn't escape the surrounding chrome — used by\n * GeoSearch in Phase 7a.\n */\n anchor?: Anchor\n /** Whether to render a default close (X) button after `titleSlot`. Default true. */\n showClose?: boolean\n /** Override the header padding. Default: `px-4 py-2.5` — tighter than\n * the right-drawer's body padding so the action bar feels integrated. */\n headerClassName?: string\n}\n\nconst DEFAULT_SIZE: Record<Side, number> = { right: 520, bottom: 480 }\n// Bottom drawer minimum — at least header + a row of content visible.\nconst MIN_SIZE: Record<Side, number> = { right: 360, bottom: 180 }\n// 16px of gap budget keeps the floating shell off the screen edges.\nconst EDGE_GAP = 8\n\nexport function FloatingDrawer({\n isOpen,\n onClose,\n side,\n size,\n resizable = false,\n onResize,\n title,\n titleSlot,\n footer,\n children,\n className,\n panelClassName,\n modal = true,\n anchor = 'viewport',\n showClose = true,\n headerClassName,\n collapsed = false,\n}: FloatingDrawerProps) {\n const resolvedSize = size ?? DEFAULT_SIZE[side]\n\n // Close on Esc — modal mode only.\n useEffect(() => {\n if (!isOpen || !modal) return\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose()\n }\n document.addEventListener('keydown', onKey)\n return () => document.removeEventListener('keydown', onKey)\n }, [isOpen, onClose, modal])\n\n // Body scroll lock — modal mode only.\n useEffect(() => {\n if (!isOpen || !modal) return\n const prev = document.body.style.overflow\n document.body.style.overflow = 'hidden'\n return () => {\n document.body.style.overflow = prev\n }\n }, [isOpen, modal])\n\n // Pointer-drag resize. Tracks the live size locally so the handle feels\n // responsive even when the parent throttles `onResize` updates.\n const [dragSize, setDragSize] = useState<number | null>(null)\n const draggingRef = useRef(false)\n\n const onPointerDown = useCallback(\n (event: ReactPointerEvent<HTMLDivElement>) => {\n if (!resizable) return\n event.preventDefault()\n draggingRef.current = true\n const startCoord = side === 'bottom' ? event.clientY : event.clientX\n const startSize = resolvedSize\n\n const onMove = (e: PointerEvent) => {\n if (!draggingRef.current) return\n const coord = side === 'bottom' ? e.clientY : e.clientX\n const delta = startCoord - coord\n const next = Math.max(MIN_SIZE[side], startSize + delta)\n setDragSize(next)\n onResize?.(next)\n }\n\n const onUp = () => {\n draggingRef.current = false\n setDragSize(null)\n document.removeEventListener('pointermove', onMove)\n document.removeEventListener('pointerup', onUp)\n }\n\n document.addEventListener('pointermove', onMove)\n document.addEventListener('pointerup', onUp)\n },\n [resizable, side, resolvedSize, onResize],\n )\n\n const liveSize = dragSize ?? resolvedSize\n const isContainer = anchor === 'container'\n\n // Viewport vs container only differs in (a) position and (b) maxSize\n // bounds. Edge gap + transform geometry is identical.\n const panelStyle =\n side === 'right'\n ? {\n position: isContainer ? ('absolute' as const) : ('fixed' as const),\n top: EDGE_GAP,\n right: EDGE_GAP,\n bottom: EDGE_GAP,\n width: liveSize,\n maxWidth: isContainer\n ? `calc(100% - ${EDGE_GAP * 2}px)`\n : 'calc(100vw - 16px)',\n boxShadow: '-8px 0 40px rgba(0,0,0,0.3)',\n transform: isOpen\n ? 'translateX(0)'\n : 'translateX(calc(100% + 16px))',\n }\n : {\n position: isContainer ? ('absolute' as const) : ('fixed' as const),\n left: EDGE_GAP,\n right: EDGE_GAP,\n bottom: EDGE_GAP,\n height: liveSize,\n maxHeight: isContainer\n ? `calc(100% - ${EDGE_GAP * 2}px)`\n : 'calc(100dvh - 16px)',\n boxShadow: '0 -8px 40px rgba(0,0,0,0.3)',\n transform: isOpen\n ? 'translateY(0)'\n : 'translateY(calc(100% + 16px))',\n }\n\n const backdropClass = isContainer\n ? 'absolute inset-0 z-[40] transition-opacity duration-200'\n : 'fixed inset-0 z-[99] transition-opacity duration-200'\n\n const panelZ = isContainer ? 'z-[50]' : 'z-[100]'\n\n return (\n <>\n {/* Backdrop — modal mode only. */}\n {modal && (\n <div\n onClick={onClose}\n aria-hidden=\"true\"\n className={cn(\n backdropClass,\n isOpen\n ? 'opacity-100 pointer-events-auto'\n : 'opacity-0 pointer-events-none',\n )}\n style={{ background: 'rgb(var(--modal-overlay))' }}\n />\n )}\n\n {/* Drawer panel */}\n <aside\n role=\"dialog\"\n aria-modal={modal ? 'true' : undefined}\n aria-label={typeof title === 'string' ? title : undefined}\n className={cn(\n panelZ,\n 'flex flex-col overflow-hidden',\n 'transition-transform duration-300 ease-[cubic-bezier(0.16,1,0.3,1)]',\n className,\n )}\n style={{\n ...panelStyle,\n background: 'rgb(var(--bg-surface))',\n border: '1px solid rgb(var(--border))',\n borderRadius: 'var(--radius-2xl)',\n }}\n >\n {resizable && (\n <ResizeHandle side={side} onPointerDown={onPointerDown} />\n )}\n\n {/* Header — single compact row. Consumer provides layout inside\n `title` + `titleSlot`. Default close button can be hidden via\n `showClose={false}` for non-modal always-on consumers. The\n border-bottom is dropped when `collapsed` so the panel reads\n as a clean single-bar strip without a separator line above\n an empty area. */}\n {(title || titleSlot || showClose) && (\n <div\n className={cn(\n 'flex items-center justify-between gap-3 shrink-0',\n headerClassName ?? 'px-4 py-2.5',\n )}\n style={\n collapsed\n ? undefined\n : { borderBottom: '1px solid rgb(var(--border))' }\n }\n >\n <div className=\"flex items-center gap-2 flex-1 min-w-0\">\n {title && (\n <div\n className=\"text-[13px] font-semibold flex items-center gap-2 min-w-0\"\n style={{ color: 'rgb(var(--foreground))' }}\n >\n {title}\n </div>\n )}\n {titleSlot && (\n <div className=\"flex items-center gap-2 min-w-0 flex-1\">\n {titleSlot}\n </div>\n )}\n </div>\n {showClose && <CloseButton onClose={onClose} />}\n </div>\n )}\n\n {/* Body — omitted entirely when collapsed so no residual flex-1\n div eats space below the header. */}\n {!collapsed && (\n <div\n className={cn(\n 'flex-1 overflow-y-auto',\n panelClassName ?? 'px-4 py-3',\n )}\n >\n {children}\n </div>\n )}\n\n {/* Footer — also omitted when collapsed. */}\n {!collapsed && footer && (\n <div\n className=\"flex items-center gap-2 px-4 py-2.5 shrink-0\"\n style={{ borderTop: '1px solid rgb(var(--border))' }}\n >\n {footer}\n </div>\n )}\n </aside>\n </>\n )\n}\n\nfunction CloseButton({ onClose }: { onClose: () => void }) {\n return (\n <button\n onClick={onClose}\n aria-label=\"Close\"\n className=\"w-7 h-7 flex items-center justify-center rounded-[6px] shrink-0 transition-colors\"\n style={{\n background: 'transparent',\n color: 'rgb(var(--text-tertiary))',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = 'rgb(var(--surface-overlay))'\n e.currentTarget.style.color = 'rgb(var(--foreground))'\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = 'transparent'\n e.currentTarget.style.color = 'rgb(var(--text-tertiary))'\n }}\n >\n <X className=\"h-3.5 w-3.5\" />\n </button>\n )\n}\n\nfunction ResizeHandle({\n side,\n onPointerDown,\n}: {\n side: Side\n onPointerDown: (event: ReactPointerEvent<HTMLDivElement>) => void\n}) {\n // `side=\"right\"` puts the grab strip on the LEFT edge of the panel\n // (user drags leftward to widen); `side=\"bottom\"` puts it on the TOP\n // edge (user drags upward to grow).\n const positional =\n side === 'right'\n ? 'top-0 bottom-0 left-0 w-1.5 cursor-ew-resize'\n : 'left-0 right-0 top-0 h-1.5 cursor-ns-resize'\n\n return (\n <div\n role=\"separator\"\n aria-orientation={side === 'right' ? 'vertical' : 'horizontal'}\n onPointerDown={onPointerDown}\n className={cn(\n 'absolute z-10 flex items-center justify-center group',\n positional,\n )}\n style={{ touchAction: 'none' }}\n >\n <span\n className={cn(\n 'rounded-full transition-opacity',\n side === 'right' ? 'h-8 w-0.5' : 'h-0.5 w-8',\n 'opacity-30 group-hover:opacity-100',\n )}\n style={{ background: 'rgb(var(--border-strong))' }}\n />\n </div>\n )\n}\n\n/**\n * DetailSection — small label/value layout for drawer body content.\n * Ports verbatim from brand-ai-extension's detail-drawer.tsx.\n */\nexport function DetailSection({\n label,\n children,\n className,\n}: {\n label: string\n children: ReactNode\n className?: string\n}) {\n return (\n <div className={cn('mb-6', className)}>\n <div\n className=\"text-[11px] font-semibold uppercase tracking-[0.4px] mb-2\"\n style={{ color: 'rgb(var(--text-muted))' }}\n >\n {label}\n </div>\n <div\n className=\"text-[14px] leading-[1.6]\"\n style={{ color: 'rgb(var(--foreground))' }}\n >\n {children}\n </div>\n </div>\n )\n}\n\n// Default export intentionally omitted; named export is the canonical\n// import path. Re-exported via packages/ui/src/index.ts.\n","/**\n * BrandLogoTile — the rounded-square logo container used wherever the\n * app shows a brand's identity at a glance: the brand profile rail\n * (78px), the sidebar switcher button (36px), dropdown rows (28px),\n * the dashboard hero tile, etc.\n *\n * <BrandLogoTile size=\"lg\" url={brand.logoUrl} name={brand.name} />\n * <BrandLogoTile size={56} url={...} name={...} />\n * <BrandLogoTile size=\"md\" name=\"Acme\" /> // initial-only\n *\n * Sizes are tokens (sm/md/lg) but custom numbers work too — radius\n * scales proportionally so a 64px tile looks right without manual\n * tuning. Pass `accentGlow` to add the subtle radial halo used on the\n * brand profile rail tray.\n */\n\nimport { useEffect, useState, type CSSProperties, type ReactNode } from 'react'\nimport { cn } from './lib/utils'\n\nexport type BrandLogoTileSize = 'xs' | 'sm' | 'md' | 'lg' | number\n\n// Named sizes map to the most common diameters in the app. Keep\n// these in sync with patterns.md when adding entries.\nconst SIZE_PX: Record<Exclude<BrandLogoTileSize, number>, number> = {\n xs: 28, // dropdown rows\n sm: 36, // collapsed sidebar\n md: 56, // dashboard hero\n lg: 78, // brand profile rail\n}\n\nfunction resolveSize(size: BrandLogoTileSize): number {\n return typeof size === 'number' ? size : SIZE_PX[size]\n}\n\n/**\n * Radius scales with diameter so every size looks like the same shape\n * family. Coefficient 0.23 chosen to match the rail's 78px → 18px ratio.\n * Floored to whole px since sub-pixel radii render fuzzy on some GPUs.\n */\nfunction radiusFor(size: number): number {\n return Math.max(6, Math.floor(size * 0.23))\n}\n\n/** Inner padding for image children — bigger for full logos so the\n * glyph doesn't kiss the edges, zero for tiny favicons that need to\n * fill the tile. */\nfunction paddingFor(size: number, isFavicon: boolean): number {\n if (isFavicon) return 0\n if (size <= 36) return 4\n if (size <= 56) return 8\n return 10\n}\n\nexport interface BrandLogoTileProps {\n /** Size token or a raw pixel number. Defaults to `md` (56px). */\n size?: BrandLogoTileSize\n /** Image URL — logo, favicon, anything `<img>` can render. */\n url?: string | null\n /**\n * Brand name. Used as `alt` text and as the source for the\n * single-character fallback when no `url` is provided (or the image\n * fails to load).\n */\n name?: string\n /**\n * Treat the image as a favicon — render it smaller, centred, without\n * stretching to fill the tile. Auto-detected when the URL starts\n * with the Google s2 favicon endpoint; pass `true`/`false` to override.\n */\n isFavicon?: boolean\n /**\n * Adds a subtle accent-coloured radial glow above the tile. Used on\n * the brand profile rail to give the logo a sense of presence\n * against the slate frame.\n */\n accentGlow?: boolean\n /** Override the fallback character (defaults to `name[0]`). */\n fallbackChar?: ReactNode\n /**\n * Override the tile background. Use for contexts that have their own\n * visual identity (e.g. the sidebar switcher's blue gradient). When\n * omitted, the tile picks up the neutral card→overlay gradient that\n * blends with surrounding chrome.\n */\n background?: string\n /**\n * Override the fallback character / image-area text colour. Pair\n * with `background` for branded variants (white text on coloured\n * gradient). Defaults to the accent token.\n */\n color?: string\n /** Drop the 1px border (used when the tile sits on a strongly tinted bg). */\n borderless?: boolean\n className?: string\n style?: CSSProperties\n}\n\nexport default function BrandLogoTile({\n size = 'md',\n url,\n name,\n isFavicon,\n accentGlow,\n fallbackChar,\n background,\n color,\n borderless,\n className,\n style,\n}: BrandLogoTileProps) {\n const px = resolveSize(size)\n const radius = radiusFor(px)\n const fav = isFavicon ?? url?.includes('s2/favicons') ?? false\n const pad = paddingFor(px, fav)\n // Initial text scales with the tile so a 78px tile gets a big 34-ish\n // glyph and a 28px tile gets a 12-ish one. Tuned against the rail\n // (78 → 34) — coefficient ≈ 0.44.\n const initialFontSize = Math.max(11, Math.round(px * 0.44))\n\n const initial = (\n typeof fallbackChar === 'string'\n ? fallbackChar\n : (name?.charAt(0).toUpperCase() ?? '?')\n ) as ReactNode\n\n // Favicon/logo images that fail to load (404, blocked, dead host) fall\n // back to the initial. We track the error in state so the <img> is\n // *replaced* by the letter span — hiding the broken img alone left an\n // empty tile (the letter only renders in the no-url branch). The flag\n // resets when `url` changes so a reused tile re-attempts the new image.\n const [imgError, setImgError] = useState(false)\n useEffect(() => {\n setImgError(false)\n }, [url])\n const showImg = !!url && !imgError\n\n return (\n <div\n className={cn(\n 'relative inline-flex items-center justify-center overflow-hidden shrink-0',\n className,\n )}\n style={{\n width: px,\n height: px,\n borderRadius: radius,\n background:\n background ??\n 'linear-gradient(180deg, rgb(var(--bg-card)) 0%, rgb(var(--surface-overlay)) 100%)',\n border: borderless ? 'none' : '1px solid rgb(var(--border))',\n color: color ?? 'rgb(var(--accent))',\n boxShadow: borderless ? undefined : 'var(--shadow-sm)',\n ...style,\n }}\n >\n {accentGlow && (\n <span\n aria-hidden\n className=\"absolute pointer-events-none\"\n style={{\n top: -Math.round(px * 0.5),\n left: '50%',\n transform: 'translateX(-50%)',\n width: Math.round(px * 2.6),\n height: Math.round(px * 1.05),\n background:\n 'radial-gradient(closest-side, rgb(var(--accent) / 0.18), transparent 70%)',\n }}\n />\n )}\n {showImg ? (\n <img\n src={url ?? undefined}\n alt={name ?? ''}\n className=\"object-contain\"\n style={{\n width: fav ? '60%' : '100%',\n height: fav ? '60%' : '100%',\n padding: pad,\n }}\n onError={() => {\n // Fall back to the initial silently — swap the img for the\n // fallback character (see imgError note above).\n setImgError(true)\n }}\n />\n ) : (\n <span\n className=\"font-extrabold leading-none\"\n style={{\n fontSize: initialFontSize,\n letterSpacing: '-0.04em',\n }}\n >\n {fallbackChar ?? initial}\n </span>\n )}\n </div>\n )\n}\n","/**\n * ProfileSection — section primitive with the head/tray/foot anatomy\n * used by the redesigned Brand Profile page (and reusable on any\n * settings-style page with multiple labelled, scrollable sections).\n *\n * Built on `ds-card-surface` with `data-framed=\"true\"` so it inherits\n * the same chrome as Card / MediaCard / StatCard — slate frame around\n * a bright focal tray, with the foot sitting back on the frame.\n *\n * Two head modes:\n * • Static (default) — pass `actions` (e.g. Edit / Generate buttons).\n * • Editable — pass `editable` props (onSave / onCancel / isSaving)\n * and the head shows an Edit pencil in view mode, swapping to\n * Cancel + Save buttons in edit mode. Tray content can branch on\n * the render-prop child: `{(isEditing) => isEditing ? <Form/> : <View/>}`.\n *\n * Sections expose `data-section-id=\"<id>\"` so ChipNav can scroll-spy.\n */\n\nimport {\n cloneElement,\n isValidElement,\n useState,\n type ButtonHTMLAttributes,\n type ReactElement,\n type ReactNode,\n} from 'react'\nimport { Check, Loader2, Pencil, X } from 'lucide-react'\nimport { cn } from './lib/utils'\n\n// Canonical size for the head icon. Centralised so every section uses\n// the same glyph size — no more `<Compass className=\"h-[17px] w-[17px]\" />`\n// at seven callsites.\nconst HEAD_ICON_SIZE = 17\n\n// ---------------------------------------------------------------------------\n// Section head — icon + title + subtitle + actions\n// ---------------------------------------------------------------------------\n\ninterface SectionHeadProps {\n icon?: ReactNode | undefined\n title: string\n subtitle?: string | undefined\n actions?: ReactNode | undefined\n}\n\nfunction SectionHead({ icon, title, subtitle, actions }: SectionHeadProps) {\n const sizedIcon = isValidElement(icon)\n ? cloneElement(\n icon as ReactElement<{ className?: string; size?: number | string }>,\n {\n // Sizing rides on `size`, which Lucide honours. A previous\n // `h-[${HEAD_ICON_SIZE}px]` here never did anything: Tailwind\n // scans source statically, so an interpolated class is never\n // generated. Keep the literal in sync with HEAD_ICON_SIZE.\n size: HEAD_ICON_SIZE,\n className: cn(\n (icon.props as { className?: string }).className,\n 'h-[17px] w-[17px]',\n ),\n },\n )\n : icon\n\n return (\n <div className=\"flex items-center gap-3 px-4 pt-4 pb-3\">\n {icon && (\n <span\n className=\"shrink-0 inline-flex items-center justify-center w-[34px] h-[34px] rounded-[10px]\"\n style={{\n background: 'rgb(var(--accent-muted))',\n color: 'rgb(var(--accent))',\n }}\n >\n {sizedIcon}\n </span>\n )}\n <div className=\"flex-1 min-w-0\">\n <div\n className=\"text-[14.5px] font-semibold leading-tight tracking-[-0.01em] truncate\"\n style={{ color: 'rgb(var(--foreground))' }}\n >\n {title}\n </div>\n {subtitle && (\n <div\n className=\"text-[12px] mt-[3px] leading-snug\"\n style={{ color: 'rgb(var(--text-tertiary))' }}\n >\n {subtitle}\n </div>\n )}\n </div>\n {actions && (\n <div className=\"shrink-0 flex items-center gap-1\">{actions}</div>\n )}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Action button — small icon button used in the section head\n// ---------------------------------------------------------------------------\n\ninterface ActionButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n label: string\n}\n\nfunction ActionButton({\n label,\n className,\n children,\n ...rest\n}: ActionButtonProps) {\n return (\n <button\n type=\"button\"\n title={label}\n aria-label={label}\n className={cn(\n 'inline-flex items-center justify-center w-[30px] h-[30px] rounded-[8px] transition-colors cursor-pointer',\n className,\n )}\n style={{\n background: 'transparent',\n color: 'rgb(var(--text-tertiary))',\n border: '1px solid transparent',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = 'rgb(var(--surface-overlay))'\n e.currentTarget.style.color = 'rgb(var(--foreground))'\n e.currentTarget.style.borderColor = 'rgb(var(--border))'\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = 'transparent'\n e.currentTarget.style.color = 'rgb(var(--text-tertiary))'\n e.currentTarget.style.borderColor = 'transparent'\n }}\n {...rest}\n >\n {children}\n </button>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Foot — meta items + optional AI-action link\n// ---------------------------------------------------------------------------\n\ninterface FootProps {\n meta?: ReactNode\n link?: { label: string; onClick: () => void; icon?: ReactNode }\n}\n\nfunction Foot({ meta, link }: FootProps) {\n if (!meta && !link) return null\n return (\n <div className=\"flex items-center justify-between gap-3 px-4 pt-3 pb-4 text-[12px]\">\n <div\n className=\"flex items-center gap-3.5 flex-wrap\"\n style={{ color: 'rgb(var(--text-tertiary))' }}\n >\n {meta}\n </div>\n {link && (\n <button\n type=\"button\"\n onClick={link.onClick}\n className=\"inline-flex items-center gap-1 text-[11.5px] font-medium bg-transparent border-0 cursor-pointer p-0 transition-opacity\"\n style={{\n color: 'rgb(var(--accent))',\n fontFamily: 'var(--font-sans)',\n }}\n onMouseEnter={(e) => (e.currentTarget.style.textDecoration = 'underline')}\n onMouseLeave={(e) => (e.currentTarget.style.textDecoration = 'none')}\n >\n {link.label}\n {link.icon}\n </button>\n )}\n </div>\n )\n}\n\n/** FootItem — a single icon+text item inside the foot. */\nfunction FootItem({ children }: { children: ReactNode }) {\n return <span className=\"inline-flex items-center gap-1.5\">{children}</span>\n}\n\n// ---------------------------------------------------------------------------\n// Editable head — pencil → cancel/save controls\n// ---------------------------------------------------------------------------\n\ninterface EditableHeadActionsProps {\n isEditing: boolean\n isSaving: boolean\n saveDisabled?: boolean | undefined\n onEdit: () => void\n onCancel: () => void\n onSave: () => void\n extraViewActions?: ReactNode | undefined\n}\n\nfunction EditableHeadActions({\n isEditing,\n isSaving,\n saveDisabled,\n onEdit,\n onCancel,\n onSave,\n extraViewActions,\n}: EditableHeadActionsProps) {\n if (isEditing) {\n return (\n <>\n <ActionButton\n label=\"Cancel\"\n onClick={onCancel}\n disabled={isSaving}\n style={\n isSaving\n ? { opacity: 0.5, pointerEvents: 'none' }\n : undefined\n }\n >\n <X className=\"h-4 w-4\" />\n </ActionButton>\n <ActionButton\n label={isSaving ? 'Saving…' : 'Save'}\n onClick={onSave}\n disabled={isSaving || saveDisabled}\n style={\n isSaving || saveDisabled\n ? { opacity: 0.5, pointerEvents: 'none' }\n : { color: 'rgb(var(--accent))' }\n }\n >\n {isSaving ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Check className=\"h-4 w-4\" />\n )}\n </ActionButton>\n </>\n )\n }\n return (\n <>\n {extraViewActions}\n <ActionButton label=\"Edit\" onClick={onEdit}>\n <Pencil className=\"h-[14px] w-[14px]\" />\n </ActionButton>\n </>\n )\n}\n\n// ---------------------------------------------------------------------------\n// ProfileSection root\n// ---------------------------------------------------------------------------\n\ninterface BaseProps {\n /** DOM id and `data-section-id` for ChipNav scroll-spy. */\n id: string\n /** Lucide icon (rendered ~17px). */\n icon?: ReactNode\n /** Section title. */\n title: string\n /** Section subtitle / description. */\n subtitle?: string\n /** Optional foot meta + AI-action link. */\n foot?: FootProps\n /** Extra padding tweak. */\n className?: string\n /**\n * Render as a SINGLE flat surface — header, divider, body — instead of\n * the default frame-plus-inner-tray.\n *\n * Use this when the section is already inside a <FrameStack>. A framed\n * section nested in a frame gives you three surface tiers (group frame →\n * section frame → tray), which reads as boxes inside boxes. Flat is the\n * shape <SectionCard> uses in the Social Spec builder, and it is what\n * makes a group of sections read as one contained unit rather than as a\n * stack of independent cards.\n *\n * Default (false) is unchanged, so every existing consumer is unaffected.\n */\n flat?: boolean\n}\n\ninterface StaticSectionProps extends BaseProps {\n /** Right-side header actions (override default pencil/generate). */\n actions?: ReactNode\n children: ReactNode\n editable?: undefined\n}\n\ninterface EditableSectionProps extends BaseProps {\n editable: {\n onSave: () => void | Promise<void>\n onCancel?: () => void\n isSaving?: boolean\n saveDisabled?: boolean\n /** Controlled editing state. If omitted, state is internal. */\n isEditing?: boolean\n onEditingChange?: (editing: boolean) => void\n /** Extra actions before the pencil in view mode (e.g. Generate). */\n extraViewActions?: ReactNode\n }\n /** Render-prop child receives the current editing state. */\n children: (isEditing: boolean) => ReactNode\n actions?: undefined\n}\n\ntype ProfileSectionProps = StaticSectionProps | EditableSectionProps\n\nfunction ProfileSection(props: ProfileSectionProps) {\n const { id, icon, title, subtitle, foot, className } = props\n const [internalEditing, setInternalEditing] = useState(false)\n\n const editable = 'editable' in props ? props.editable : undefined\n const isEditing = editable\n ? editable.isEditing ?? internalEditing\n : false\n\n const setEditing = (v: boolean) => {\n if (editable?.onEditingChange) editable.onEditingChange(v)\n else setInternalEditing(v)\n }\n\n const handleCancel = () => {\n editable?.onCancel?.()\n setEditing(false)\n }\n\n const handleSave = async () => {\n if (!editable) return\n try {\n await editable.onSave()\n setEditing(false)\n } catch {\n // Caller surfaces the error via toast / mutation state.\n }\n }\n\n const headActions = editable ? (\n <EditableHeadActions\n isEditing={isEditing}\n isSaving={!!editable.isSaving}\n saveDisabled={editable.saveDisabled}\n onEdit={() => setEditing(true)}\n onCancel={handleCancel}\n onSave={handleSave}\n extraViewActions={editable.extraViewActions}\n />\n ) : (\n props.actions ?? (\n <ActionButton label=\"Edit\">\n <Pencil className=\"h-[14px] w-[14px]\" />\n </ActionButton>\n )\n )\n\n const children = editable\n ? (props.children as (e: boolean) => ReactNode)(isEditing)\n : (props.children as ReactNode)\n\n const flat = props.flat ?? false\n\n return (\n <section\n id={id}\n data-section-id={id}\n data-framed={flat ? undefined : 'true'}\n className={cn('ds-card-surface flex flex-col', className)}\n style={{ scrollMarginTop: 'var(--section-scroll-offset)' }}\n >\n <SectionHead\n icon={icon}\n title={title}\n subtitle={subtitle}\n actions={headActions}\n />\n {flat ? (\n /* One surface. The divider does the separating that the tray's\n fill does in the default shape. */\n <div\n className=\"px-4 pb-4 pt-4 border-t\"\n style={{ flex: '1 1 auto', borderColor: 'rgb(var(--border))' }}\n >\n {children}\n </div>\n ) : (\n /* flex:1 lets the tray fill remaining height when the section is\n stretched (e.g. side-by-side in an equal-height grid), so trays\n bottom-align instead of leaving a gap under a shorter-header card.\n No effect on un-stretched (vertically-stacked) sections. */\n <div className=\"ds-card-tray p-5\" style={{ flex: '1 1 auto' }}>\n {children}\n </div>\n )}\n {foot && <Foot {...foot} />}\n </section>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Compose\n// ---------------------------------------------------------------------------\n\ntype ProfileSectionComponent = typeof ProfileSection & {\n ActionButton: typeof ActionButton\n FootItem: typeof FootItem\n}\n\nconst PS = ProfileSection as ProfileSectionComponent\nPS.ActionButton = ActionButton\nPS.FootItem = FootItem\n\nexport default PS\nexport type { ProfileSectionProps }\n","/**\n * Layout constants shared between CSS and JS.\n *\n * Some primitives (e.g. ChipNav) need numeric pixel values for\n * `IntersectionObserver` rootMargin or `position: sticky` `top` style\n * — those can't read from CSS custom properties. To keep the layout\n * coherent, this module mirrors the canonical values from `tokens.css`.\n * If you change one, change the other.\n *\n * The corresponding CSS tokens are:\n * --header-height → HEADER_HEIGHT\n * --section-scroll-offset → SECTION_SCROLL_OFFSET\n */\n\n/** Height of the sticky AppHeader, in px. Mirrors `--header-height`. */\nexport const HEADER_HEIGHT = 56\n\n/**\n * Vertical offset for in-page section anchors (header + chip nav +\n * breathing room). Mirrors `--section-scroll-offset`.\n */\nexport const SECTION_SCROLL_OFFSET = 120\n","/**\n * ChipNav — sticky pill bar with built-in scroll-spy.\n *\n * Renders a horizontally-scrolling row of chips; each chip targets a\n * sibling element marked `data-section-id=\"<id>\"`. On mount it wires up\n * an IntersectionObserver to highlight the chip whose section is\n * currently near the top of the scroll container; clicks smooth-scroll\n * the section into view.\n *\n * Usage:\n * <ChipNav\n * items={[\n * { id: 'identity', label: 'Identity' },\n * { id: 'colors', label: 'Colors' },\n * ]}\n * scrollContainer={mainScrollRef} // or `'#scroll'` selector\n * stickyTop={56} // px from top when stuck\n * />\n *\n * Pure presentational primitive — no brand-profile coupling.\n */\n\nimport {\n useEffect,\n useRef,\n useState,\n type CSSProperties,\n type ReactNode,\n} from 'react'\nimport { cn } from './lib/utils'\nimport { HEADER_HEIGHT, SECTION_SCROLL_OFFSET } from './lib/layout'\n\nexport interface ChipNavItem {\n id: string\n label: string\n}\n\ninterface ChipNavProps {\n items: ChipNavItem[]\n /**\n * Element (ref or CSS selector) used as the scroll container for both\n * the IntersectionObserver root and the smooth-scroll target. Falls\n * back to the document if omitted.\n */\n scrollContainer?: React.RefObject<HTMLElement | null> | string\n /** Pixel offset for sticky positioning (default: 0 — caller manages). */\n stickyTop?: number\n /** Pixels above the section to offset when click-scrolling. */\n scrollOffset?: number\n /**\n * Optional content rendered on the right side of the bar, separated\n * from the chips by a flexible spacer. Use for page-level actions\n * that should stay pinned to the sticky bar (e.g. Export, Generate).\n */\n actions?: ReactNode\n /** Extra Tailwind classes on the outer wrapper. */\n className?: string\n /** Inline style on the outer wrapper. */\n style?: CSSProperties\n /**\n * Background painted on the sticky wrapper so page content scrolling\n * behind the chip pill gets masked cleanly.\n *\n * - `'none'` (default) — wrapper is transparent. Correct inside a Card,\n * inside a tray, or anywhere the chip nav sits over a non-page surface.\n * - `'page'` — wrapper paints `rgb(var(--main-content-bg))`. Correct\n * when the chip nav is mounted directly under the AppHeader, against\n * the page background, and needs to mask scrolling content beneath.\n *\n * Default was page-colored in the original brand-ai port; that bled\n * into Card / Modal / Tray contexts as a discordant horizontal strip.\n * Phase 2 callers that mount ChipNav against the page background must\n * pass `surface=\"page\"`.\n */\n surface?: 'none' | 'page'\n /**\n * Controlled mode: when provided, the parent owns the active chip.\n * Scroll-spy is disabled and `onItemClick` is invoked instead of the\n * default smooth-scroll behavior. Phase 7a GeoSearch uses this to\n * drive mode-switch tabs (not scroll targets).\n */\n activeId?: string\n /**\n * Optional click handler. When provided, takes precedence over the\n * built-in scroll-to-section behavior. Required for controlled-mode\n * (`activeId`) use.\n */\n onItemClick?: (id: string) => void\n /**\n * `'sticky'` (default) — the wrapper is `sticky top-{stickyTop}` for\n * the canonical scroll-spy use case.\n * `'static'` — wrapper is `relative` with no inset; the consumer owns\n * positioning. Used by GeoSearch (Phase 7a) to mount ChipNav as a\n * floating island absolute-positioned above the map.\n */\n position?: 'sticky' | 'static'\n /**\n * `'comfortable'` (default, 32px chip height) — the canonical\n * brand-profile lens density.\n * `'compact'` (24px chip height) — slim variant for tight chrome\n * like the `<PageHeaderHost />` center slot, where the surrounding\n * header is only 48px tall. Reduces inner pill padding and chip\n * vertical padding by 2px each.\n */\n density?: 'comfortable' | 'compact'\n}\n\nfunction resolveScrollEl(\n scrollContainer: ChipNavProps['scrollContainer'],\n): HTMLElement | null {\n if (!scrollContainer) return null\n if (typeof scrollContainer === 'string') {\n return document.querySelector(scrollContainer) as HTMLElement | null\n }\n return scrollContainer.current ?? null\n}\n\nexport default function ChipNav({\n items,\n scrollContainer,\n // Default lands the chip bar directly under the AppHeader. Callers\n // only need to override when the chip bar lives under additional\n // sticky chrome.\n stickyTop = HEADER_HEIGHT,\n scrollOffset = SECTION_SCROLL_OFFSET,\n actions,\n className,\n style,\n surface = 'none',\n activeId: activeIdProp,\n onItemClick,\n position = 'sticky',\n density = 'comfortable',\n}: ChipNavProps) {\n const isControlled = activeIdProp !== undefined\n const [internalActiveId, setInternalActiveId] = useState<string>(\n items[0]?.id ?? '',\n )\n const activeId = isControlled ? activeIdProp : internalActiveId\n const setActiveId = (id: string) => {\n if (!isControlled) setInternalActiveId(id)\n }\n const [stuck, setStuck] = useState(false)\n const wrapRef = useRef<HTMLDivElement>(null)\n const navRef = useRef<HTMLDivElement>(null)\n\n // Scroll-spy. Skipped in controlled mode — parent owns activeId.\n useEffect(() => {\n if (isControlled) return\n const scrollEl = resolveScrollEl(scrollContainer)\n const root = scrollEl ?? null\n\n const sections = items\n .map((it) =>\n (root ?? document).querySelector<HTMLElement>(\n `[data-section-id=\"${it.id}\"]`,\n ),\n )\n .filter((el): el is HTMLElement => !!el)\n\n if (sections.length === 0) return\n\n const observer = new IntersectionObserver(\n (entries) => {\n const visible = entries\n .filter((e) => e.isIntersecting)\n .map((e) => ({\n id: e.target.getAttribute('data-section-id') ?? '',\n top: e.boundingClientRect.top,\n }))\n .sort((a, b) => a.top - b.top)\n const first = visible[0]\n // Effect early-returns when isControlled (line above), so this\n // path always wants to update the uncontrolled state directly.\n // Inlining `setInternalActiveId` (a stable useState setter)\n // avoids closing over `setActiveId`, which would require\n // including it in the deps array even though its identity\n // changes on every render.\n if (first) setInternalActiveId(first.id)\n },\n {\n root,\n rootMargin: `-${stickyTop + 60}px 0px -55% 0px`,\n threshold: 0,\n },\n )\n\n sections.forEach((s) => observer.observe(s))\n return () => observer.disconnect()\n }, [items, scrollContainer, stickyTop, isControlled])\n\n // Track \"stuck\" state for backdrop blur / shadow style.\n useEffect(() => {\n const scrollEl = resolveScrollEl(scrollContainer)\n if (!scrollEl || !wrapRef.current) return\n const wrap = wrapRef.current\n const update = () => {\n const wRect = wrap.getBoundingClientRect()\n const sRect = scrollEl.getBoundingClientRect()\n setStuck(wRect.top - sRect.top <= stickyTop + 1)\n }\n update()\n scrollEl.addEventListener('scroll', update, { passive: true })\n return () => scrollEl.removeEventListener('scroll', update)\n }, [scrollContainer, stickyTop])\n\n // Auto-scroll active chip into view in the horizontal row.\n useEffect(() => {\n if (!navRef.current) return\n const nav = navRef.current\n const active = nav.querySelector<HTMLElement>(\n `[data-chip-id=\"${activeId}\"]`,\n )\n if (!active) return\n const navRect = nav.getBoundingClientRect()\n const aRect = active.getBoundingClientRect()\n if (aRect.left < navRect.left) {\n nav.scrollTo({ left: nav.scrollLeft + (aRect.left - navRect.left) - 12, behavior: 'smooth' })\n } else if (aRect.right > navRect.right) {\n nav.scrollTo({\n left: nav.scrollLeft + (aRect.right - navRect.right) + 12,\n behavior: 'smooth',\n })\n }\n }, [activeId])\n\n const handleClick = (id: string) => {\n if (onItemClick) {\n onItemClick(id)\n setActiveId(id)\n return\n }\n const scrollEl = resolveScrollEl(scrollContainer)\n const section = (scrollEl ?? document).querySelector<HTMLElement>(\n `[data-section-id=\"${id}\"]`,\n )\n if (!section) return\n if (scrollEl) {\n const top =\n section.getBoundingClientRect().top -\n scrollEl.getBoundingClientRect().top +\n scrollEl.scrollTop -\n scrollOffset\n scrollEl.scrollTo({ top, behavior: 'smooth' })\n } else {\n section.scrollIntoView({ behavior: 'smooth', block: 'start' })\n }\n setActiveId(id)\n }\n\n const isStatic = position === 'static'\n return (\n <div\n ref={wrapRef}\n data-stuck={stuck ? 'true' : undefined}\n className={cn(\n isStatic ? 'relative' : 'sticky z-20 py-3 -mt-3',\n className,\n )}\n style={{\n top: isStatic ? undefined : stickyTop,\n background:\n surface === 'page' ? 'rgb(var(--main-content-bg))' : 'transparent',\n ...style,\n }}\n >\n <div\n className={cn(\n 'flex items-center gap-2',\n density === 'compact' ? 'p-[3px]' : 'p-[5px]',\n )}\n style={{\n background: 'rgb(var(--bg-card))',\n border: '1px solid rgb(var(--border))',\n borderRadius: 10,\n boxShadow: stuck ? 'var(--shadow-md)' : 'var(--shadow-sm)',\n }}\n >\n <div\n ref={navRef}\n role=\"tablist\"\n className=\"flex gap-1 overflow-x-auto scrollbar-hide flex-1 min-w-0\"\n >\n {items.map((item) => {\n const active = item.id === activeId\n return (\n <button\n key={item.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={active}\n data-chip-id={item.id}\n onClick={() => handleClick(item.id)}\n className={cn(\n 'inline-flex items-center gap-[7px] rounded-[7px] text-[12.5px] whitespace-nowrap cursor-pointer transition-colors border-0',\n density === 'compact'\n ? 'px-[10px] py-[4px]'\n : 'px-[11px] py-[7px]',\n active ? 'font-semibold' : 'font-medium',\n )}\n style={{\n fontFamily: 'var(--font-sans)',\n letterSpacing: '-0.005em',\n color: active\n ? 'rgb(var(--surface-on-accent))'\n : 'rgb(var(--text-tertiary))',\n background: active\n ? 'rgb(var(--accent))'\n : 'transparent',\n }}\n onMouseEnter={(e) => {\n if (active) return\n e.currentTarget.style.color = 'rgb(var(--foreground))'\n e.currentTarget.style.background =\n 'rgb(var(--surface-overlay-soft))'\n }}\n onMouseLeave={(e) => {\n if (active) return\n e.currentTarget.style.color = 'rgb(var(--text-tertiary))'\n e.currentTarget.style.background = 'transparent'\n }}\n >\n {item.label}\n </button>\n )\n })}\n </div>\n {actions && (\n <>\n <div\n aria-hidden\n className=\"shrink-0\"\n style={{\n width: 1,\n height: 18,\n background: 'rgb(var(--border))',\n }}\n />\n <div className=\"shrink-0 flex items-center gap-1.5 pr-0.5\">\n {actions}\n </div>\n </>\n )}\n </div>\n </div>\n )\n}\n","/**\n * CompletionRing — small SVG ring showing a 0–100 percentage.\n *\n * Used wherever the app wants to communicate \"X% of this thing is\n * done\" in a compact, glanceable widget — currently on the Brand\n * Profile rail and (queued) on the dashboard onboarding card.\n *\n * Sizing is configurable so the same primitive can render at 30px\n * (rail) and 38–48px (dashboard) without duplicating the stroke maths.\n *\n * <CompletionRing percent={80} />\n * <CompletionRing percent={pct} size={38} strokeWidth={3} />\n * <CompletionRing percent={pct} showLabel={false} />\n * <CompletionRing percent={pct} label={<Check className=\"h-3 w-3\" />} />\n *\n * SVG is the right tool for ring geometry — the \"no inline SVG\" guidance\n * applies to icons (use Lucide), not to chart primitives like this one.\n */\n\nimport type { CSSProperties, ReactNode } from 'react'\nimport { cn } from './lib/utils'\n\nexport interface CompletionRingProps {\n /** 0–100. Values outside the range are clamped. */\n percent: number\n /** Outer dimension in px. Default 30. */\n size?: number\n /** Ring stroke width in px. Default scales with size (size / 12). */\n strokeWidth?: number\n /**\n * What to render in the middle. Defaults to the percent number with\n * a `%` suffix. Pass `false`/`null` to hide. Pass a node (icon, text)\n * to fully override.\n */\n label?: ReactNode | false\n /** Convenience: false hides the default label. Same as `label={false}`. */\n showLabel?: boolean\n /** Track colour CSS value. Defaults to `--surface-overlay-strong`. */\n trackColor?: string\n /** Fill (progress arc) colour. Defaults to `--accent`. */\n fillColor?: string\n /** Extra classes / inline style on the wrapper. */\n className?: string\n style?: CSSProperties\n}\n\nexport default function CompletionRing({\n percent,\n size = 30,\n strokeWidth,\n label,\n showLabel = true,\n trackColor = 'rgb(var(--surface-overlay-strong))',\n fillColor = 'rgb(var(--accent))',\n className,\n style,\n}: CompletionRingProps) {\n const clamped = Math.max(0, Math.min(100, percent))\n const sw = strokeWidth ?? Math.max(2, Math.round(size / 12))\n const r = (size - sw) / 2\n const cx = size / 2\n const cy = size / 2\n const circ = 2 * Math.PI * r\n const dashoff = circ * (1 - clamped / 100)\n\n // `label` (when provided) wins over `showLabel`. The default renders\n // the percentage in tabular-nums at a size that fits comfortably in\n // the ring at any sane diameter.\n const explicitLabel = label === undefined ? undefined : label\n const renderedLabel =\n explicitLabel !== undefined\n ? explicitLabel || null\n : showLabel\n ? `${Math.round(clamped)}%`\n : null\n\n return (\n <div\n className={cn('relative shrink-0', className)}\n style={{ width: size, height: size, ...style }}\n >\n <svg width={size} height={size} viewBox={`0 0 ${size} ${size}`}>\n <circle\n cx={cx}\n cy={cy}\n r={r}\n fill=\"none\"\n stroke={trackColor}\n strokeWidth={sw}\n />\n <circle\n cx={cx}\n cy={cy}\n r={r}\n fill=\"none\"\n stroke={fillColor}\n strokeWidth={sw}\n strokeLinecap=\"round\"\n strokeDasharray={circ}\n strokeDashoffset={dashoff}\n transform={`rotate(-90 ${cx} ${cy})`}\n style={{ transition: 'stroke-dashoffset var(--dur-base) var(--ease-out)' }}\n />\n </svg>\n {renderedLabel !== null && (\n <div\n className=\"absolute inset-0 flex items-center justify-center font-bold tabular-nums leading-none\"\n style={{\n color: 'rgb(var(--foreground))',\n // Auto-size the label to the ring so 30px and 48px both look right.\n fontSize: Math.max(8, Math.round(size * 0.3)),\n }}\n >\n {renderedLabel}\n </div>\n )}\n </div>\n )\n}\n","/**\n * MicrosoftLogo — the Microsoft four-square brand mark, for \"Sign in with\n * Microsoft\" SSO buttons (ADR-124 D8). Lucide has no Microsoft glyph, so this\n * is a bespoke SVG primitive — which `@lovett/ui` is the one allowed home for\n * (CLAUDE.md §2/§6). The four square colours are Microsoft's required brand\n * colours (per their identity guidelines); they are intrinsic to the mark, not\n * theme tokens, exactly like BrandLogoTile's imagery — so they live here as\n * literals rather than `tokens.css` variables.\n */\n\nexport interface MicrosoftLogoProps {\n /** Square size in px. Default 18 (matches a control-height button glyph). */\n size?: number\n className?: string\n}\n\nexport default function MicrosoftLogo({ size = 18, className }: MicrosoftLogoProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 21 21\"\n className={className}\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <rect x=\"1\" y=\"1\" width=\"9\" height=\"9\" fill=\"#f25022\" />\n <rect x=\"11\" y=\"1\" width=\"9\" height=\"9\" fill=\"#7fba00\" />\n <rect x=\"1\" y=\"11\" width=\"9\" height=\"9\" fill=\"#00a4ef\" />\n <rect x=\"11\" y=\"11\" width=\"9\" height=\"9\" fill=\"#ffb900\" />\n </svg>\n )\n}\n","/**\n * Brand platform glyphs — real mono (currentColor) marks for the ad platforms\n * the Social Spec builds for, replacing approximate Lucide stand-ins (Ghost for\n * Snapchat, Home for Nextdoor, Music for TikTok, Megaphone for Meta). ADR-135.\n *\n * `@lovett/ui` is the one allowed home for bespoke SVG definitions (CLAUDE.md\n * §2/§6) — same rationale as `MicrosoftLogo`. Path data is extracted from the\n * owner's MIT-licensed fork github.com/edwinlov3tt/logos-apps (upstream: the\n * ln-dev7 \"logos\" collection); each glyph is normalized to a single-colour\n * `currentColor` silhouette so it adapts to its context (active pill = white,\n * inactive tab = grey) — full-colour marks would clash inside the red pill.\n * Extraction choices were picked by visual review; Facebook, Messenger and\n * TikTok silhouettes are true path-boolean derivations of the official marks\n * (disc⊖f, bubble⊖bolt, glitch-layer union — computed offline with paper.js,\n * baked here as static path data).\n *\n * Marks are trademarks of their platforms — used nominatively to refer to the\n * platforms themselves, exactly like the platform-chrome in the ad previews.\n */\n\nexport interface BrandIconProps {\n /** Square box size in px; the glyph letterboxes inside (non-square viewBoxes\n * centre via preserveAspectRatio). Default 16 — a tab/affix glyph. */\n size?: number\n className?: string\n}\n\n/** Meta brand glyph (mono, currentColor). */\nexport function BrandMeta({ size = 16, className }: BrandIconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"-5.12 -5.12 266.24 180.28\"\n className={className}\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path d=\"M27.651 112.136c0 9.775 2.146 17.28 4.95 21.82c3.677 5.947 9.16 8.466 14.751 8.466c7.211 0 13.808-1.79 26.52-19.372c10.185-14.092 22.186-33.874 30.26-46.275l13.675-21.01c9.499-14.591 20.493-30.811 33.1-41.806C161.196 4.985 172.298 0 183.47 0c18.758 0 36.625 10.87 50.3 31.257C248.735 53.584 256 81.707 256 110.729c0 17.253-3.4 29.93-9.187 39.946c-5.591 9.686-16.488 19.363-34.818 19.363v-27.616c15.695 0 19.612-14.422 19.612-30.927c0-23.52-5.484-49.623-17.564-68.273c-8.574-13.23-19.684-21.313-31.907-21.313c-13.22 0-23.859 9.97-35.815 27.75c-6.356 9.445-12.882 20.956-20.208 33.944l-8.066 14.289c-16.203 28.728-20.307 35.271-28.408 46.07c-14.2 18.91-26.324 26.076-42.287 26.076c-18.935 0-30.91-8.2-38.325-20.556C2.973 139.413 0 126.202 0 111.148z\" fill=\"currentColor\" />\n <path d=\"M21.802 33.206C34.48 13.666 52.774 0 73.757 0C85.91 0 97.99 3.597 110.605 13.897c13.798 11.261 28.505 29.805 46.853 60.368l6.58 10.967c15.881 26.459 24.917 40.07 30.205 46.49c6.802 8.243 11.565 10.7 17.752 10.7c15.695 0 19.612-14.422 19.612-30.927l24.393-.766c0 17.253-3.4 29.93-9.187 39.946c-5.591 9.686-16.488 19.363-34.818 19.363c-11.395 0-21.49-2.475-32.654-13.007c-8.582-8.083-18.615-22.443-26.334-35.352l-22.96-38.352C118.528 64.08 107.96 49.73 101.845 43.23c-6.578-6.988-15.036-15.428-28.532-15.428c-10.923 0-20.2 7.666-27.963 19.39z\" fill=\"currentColor\" />\n <path d=\"M73.312 27.802c-10.923 0-20.2 7.666-27.963 19.39c-10.976 16.568-17.698 41.245-17.698 64.944c0 9.775 2.146 17.28 4.95 21.82L9.027 149.482C2.973 139.413 0 126.202 0 111.148C0 83.772 7.514 55.24 21.802 33.206C34.48 13.666 52.774 0 73.757 0z\" fill=\"currentColor\" />\n </svg>\n )\n}\n\n/** Facebook brand glyph (mono, currentColor). */\nexport function BrandFacebook({ size = 16, className }: BrandIconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"-5.12 -5.12 266.24 264.69\"\n className={className}\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path d=\"M256 128C256 57.308 198.692 0 128 0S0 57.308 0 128c0 63.888 46.808 116.843 108 126.445V165H75.5v-37H108V99.8c0-32.08 19.11-49.8 48.348-49.8C170.352 50 185 52.5 185 52.5V84h-16.14C152.959 84 148 93.867 148 103.99V128h35.5l-5.675 37H148v89.445c61.192-9.602 108-62.556 108-126.445\" fill=\"currentColor\" />\n </svg>\n )\n}\n\n/** Instagram brand glyph (mono, currentColor). */\nexport function BrandInstagram({ size = 16, className }: BrandIconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"-5.12 -5.12 266.24 266.24\"\n className={className}\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path d=\"M128 23.064c34.177 0 38.225.13 51.722.745c12.48.57 19.258 2.655 23.769 4.408c5.974 2.322 10.238 5.096 14.717 9.575s7.253 8.743 9.575 14.717c1.753 4.511 3.838 11.289 4.408 23.768c.615 13.498.745 17.546.745 51.723s-.13 38.226-.745 51.723c-.57 12.48-2.655 19.257-4.408 23.768c-2.322 5.974-5.096 10.239-9.575 14.718s-8.743 7.253-14.717 9.574c-4.511 1.753-11.289 3.839-23.769 4.408c-13.495.616-17.543.746-51.722.746s-38.228-.13-51.723-.746c-12.48-.57-19.257-2.655-23.768-4.408c-5.974-2.321-10.239-5.095-14.718-9.574c-4.479-4.48-7.253-8.744-9.574-14.718c-1.753-4.51-3.839-11.288-4.408-23.768c-.616-13.497-.746-17.545-.746-51.723s.13-38.225.746-51.722c.57-12.48 2.655-19.258 4.408-23.769c2.321-5.974 5.095-10.238 9.574-14.717c4.48-4.48 8.744-7.253 14.718-9.575c4.51-1.753 11.288-3.838 23.768-4.408c13.497-.615 17.545-.745 51.723-.745M128 0C93.237 0 88.878.147 75.226.77c-13.625.622-22.93 2.786-31.071 5.95c-8.418 3.271-15.556 7.648-22.672 14.764S9.991 35.738 6.72 44.155C3.555 52.297 1.392 61.602.77 75.226C.147 88.878 0 93.237 0 128s.147 39.122.77 52.774c.622 13.625 2.785 22.93 5.95 31.071c3.27 8.417 7.647 15.556 14.763 22.672s14.254 11.492 22.672 14.763c8.142 3.165 17.446 5.328 31.07 5.95c13.653.623 18.012.77 52.775.77s39.122-.147 52.774-.77c13.624-.622 22.929-2.785 31.07-5.95c8.418-3.27 15.556-7.647 22.672-14.763s11.493-14.254 14.764-22.672c3.164-8.142 5.328-17.446 5.95-31.07c.623-13.653.77-18.012.77-52.775s-.147-39.122-.77-52.774c-.622-13.624-2.786-22.929-5.95-31.07c-3.271-8.418-7.648-15.556-14.764-22.672S220.262 9.99 211.845 6.72c-8.142-3.164-17.447-5.328-31.071-5.95C167.122.147 162.763 0 128 0m0 62.27c-36.302 0-65.73 29.43-65.73 65.73s29.428 65.73 65.73 65.73c36.301 0 65.73-29.428 65.73-65.73c0-36.301-29.429-65.73-65.73-65.73m0 108.397c-23.564 0-42.667-19.103-42.667-42.667S104.436 85.333 128 85.333s42.667 19.103 42.667 42.667s-19.103 42.667-42.667 42.667m83.686-110.994c0 8.484-6.876 15.36-15.36 15.36s-15.36-6.876-15.36-15.36s6.877-15.36 15.36-15.36s15.36 6.877 15.36 15.36\" fill=\"currentColor\" />\n </svg>\n )\n}\n\n/** Messenger brand glyph (mono, currentColor). */\nexport function BrandMessenger({ size = 16, className }: BrandIconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"-5.12 -5.12 266.24 266.24\"\n className={className}\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path d=\"M128,0c-72.106,0 -128,52.818 -128,124.16c0,37.317 15.293,69.562 40.2,91.835c2.09,1.871 3.352,4.493 3.438,7.298l0.697,22.77c0.223,7.262 7.724,11.988 14.37,9.054l25.406,-11.217c2.15335,-0.94916 4.56829,-1.12613 6.837,-0.501c11.675,3.21 24.1,4.92 37.052,4.92c72.106,0 128,-52.818 128,-124.16c0,-71.342 -55.894,-124.159 -128,-124.159 M51.137,160.47l37.6,-59.653c5.98,-9.49 18.788,-11.853 27.762,-5.123l29.905,22.43c2.744,2.05808 6.52006,2.04706 9.252,-0.027l40.388,-30.652c5.39,-4.091 12.428,2.36 8.82,8.085l-37.6,59.654c-5.981,9.489 -18.79,11.852 -27.763,5.122l-29.906,-22.43c-2.74359,-2.05707 -6.51846,-2.04605 -9.25,0.027l-40.39,30.652c-5.39,4.09 -12.427,-2.36 -8.818,-8.085\" fill=\"currentColor\" />\n </svg>\n )\n}\n\n/** LinkedIn brand glyph (mono, currentColor). */\nexport function BrandLinkedIn({ size = 16, className }: BrandIconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"1.44 -0.56 29.12 29.12\"\n className={className}\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path d=\"M8.268 28H2.463V9.306h5.805zM5.362 6.756C3.506 6.756 2 5.218 2 3.362a3.362 3.362 0 0 1 6.724 0c0 1.856-1.506 3.394-3.362 3.394M29.994 28h-5.792v-9.1c0-2.169-.044-4.95-3.018-4.95c-3.018 0-3.481 2.356-3.481 4.794V28h-5.799V9.306h5.567v2.55h.081c.775-1.469 2.668-3.019 5.492-3.019c5.875 0 6.955 3.869 6.955 8.894V28z\" fill=\"currentColor\" />\n </svg>\n )\n}\n\n/** Nextdoor brand glyph (mono, currentColor). */\nexport function BrandNextdoor({ size = 16, className }: BrandIconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"-1.28 5.29 66.56 53.4\"\n className={className}\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path d=\"M0 25.993c.285-.085.56-.2.82-.343l9.538-5.894c.166-.125.325-.26.477-.4V6.708h10.168v6.524L32 6.574l32 19.6-5.265 8.622-5.475-3.338h-.172a.21.21 0 0 0 0 .114v25.58c-1.068.267-38.343.362-41.967.134V56.8q0-12.533 0-25.104l-.114-.23-5.76 3.32L3.1 31.373c-.916-1.488-1.908-2.976-2.766-4.464A1.91 1.91 0 0 0 0 26.508z\" fill=\"currentColor\" />\n </svg>\n )\n}\n\n/** Pinterest brand glyph (mono, currentColor). */\nexport function BrandPinterest({ size = 16, className }: BrandIconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"3.38 -0.22 25.25 32.44\"\n className={className}\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path d=\"M16.75.406C10.337.406 4 4.681 4 11.6c0 4.4 2.475 6.9 3.975 6.9c.619 0 .975-1.725.975-2.212c0-.581-1.481-1.819-1.481-4.238c0-5.025 3.825-8.588 8.775-8.588c4.256 0 7.406 2.419 7.406 6.863c0 3.319-1.331 9.544-5.644 9.544c-1.556 0-2.888-1.125-2.888-2.737c0-2.363 1.65-4.65 1.65-7.088c0-4.137-5.869-3.387-5.869 1.613c0 1.05.131 2.212.6 3.169c-.863 3.713-2.625 9.244-2.625 13.069c0 1.181.169 2.344.281 3.525c.212.238.106.213.431.094c3.15-4.313 3.038-5.156 4.463-10.8c.769 1.463 2.756 2.25 4.331 2.25c6.637 0 9.619-6.469 9.619-12.3c0-6.206-5.363-10.256-11.25-10.256z\" fill=\"currentColor\" />\n </svg>\n )\n}\n\n/** Snapchat brand glyph (mono, currentColor). */\nexport function BrandSnapchat({ size = 16, className }: BrandIconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"208.68 112.18 391.9 368.85\"\n className={className}\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path d=\"M407.001,473.488c-1.068,0-2.087-0.039-2.862-0.076c-0.615,0.053-1.25,0.076-1.886,0.076 c-22.437,0-37.439-10.607-50.678-19.973c-9.489-6.703-18.438-13.031-28.922-14.775c-5.149-0.854-10.271-1.287-15.22-1.287 c-8.917,0-15.964,1.383-21.109,2.389c-3.166,0.617-5.896,1.148-8.006,1.148c-2.21,0-4.895-0.49-6.014-4.311 c-0.887-3.014-1.523-5.934-2.137-8.746c-1.536-7.027-2.65-11.316-5.281-11.723c-28.141-4.342-44.768-10.738-48.08-18.484 c-0.347-0.814-0.541-1.633-0.584-2.443c-0.129-2.309,1.501-4.334,3.777-4.711c22.348-3.68,42.219-15.492,59.064-35.119 c13.049-15.195,19.457-29.713,20.145-31.316c0.03-0.072,0.065-0.148,0.101-0.217c3.247-6.588,3.893-12.281,1.926-16.916 c-3.626-8.551-15.635-12.361-23.58-14.882c-1.976-0.625-3.845-1.217-5.334-1.808c-7.043-2.782-18.626-8.66-17.083-16.773 c1.124-5.916,8.949-10.036,15.273-10.036c1.756,0,3.312,0.308,4.622,0.923c7.146,3.348,13.575,5.045,19.104,5.045 c6.876,0,10.197-2.618,11-3.362c-0.198-3.668-0.44-7.546-0.674-11.214c0-0.004-0.005-0.048-0.005-0.048 c-1.614-25.675-3.627-57.627,4.546-75.95c24.462-54.847,76.339-59.112,91.651-59.112c0.408,0,6.674-0.062,6.674-0.062 c0.283-0.005,0.59-0.009,0.908-0.009c15.354,0,67.339,4.27,91.816,59.15c8.173,18.335,6.158,50.314,4.539,76.016l-0.076,1.23 c-0.222,3.49-0.427,6.793-0.6,9.995c0.756,0.696,3.795,3.096,9.978,3.339c5.271-0.202,11.328-1.891,17.998-5.014 c2.062-0.968,4.345-1.169,5.895-1.169c2.343,0,4.727,0.456,6.714,1.285l0.106,0.041c5.66,2.009,9.367,6.024,9.447,10.242 c0.071,3.932-2.851,9.809-17.223,15.485c-1.472,0.583-3.35,1.179-5.334,1.808c-7.952,2.524-19.951,6.332-23.577,14.878 c-1.97,4.635-1.322,10.326,1.926,16.912c0.036,0.072,0.067,0.145,0.102,0.221c1,2.344,25.205,57.535,79.209,66.432 c2.275,0.379,3.908,2.406,3.778,4.711c-0.048,0.828-0.248,1.656-0.598,2.465c-3.289,7.703-19.915,14.09-48.064,18.438 c-2.642,0.408-3.755,4.678-5.277,11.668c-0.63,2.887-1.271,5.717-2.146,8.691c-0.819,2.797-2.641,4.164-5.567,4.164h-0.441 c-1.905,0-4.604-0.346-8.008-1.012c-5.95-1.158-12.623-2.236-21.109-2.236c-4.948,0-10.069,0.434-15.224,1.287 c-10.473,1.744-19.421,8.062-28.893,14.758C444.443,462.88,429.436,473.488,407.001,473.488\" fill=\"currentColor\" />\n </svg>\n )\n}\n\n/** TikTok brand glyph (mono, currentColor). */\nexport function BrandTikTok({ size = 16, className }: BrandIconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"-5.79 -5.79 267.56 300.84\"\n className={className}\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path d=\"M189.722,104.42243l0,96.99357c0,48.525 -39.357,87.857 -87.905,87.857c-24.62405,0 -46.88248,-10.1174 -62.84421,-26.42813c-0.00093,-0.00062 -0.00186,-0.00125 -0.00279,-0.00187c-0.00254,-0.00259 -0.00508,-0.00519 -0.00761,-0.00778c-23.49917,-15.76977 -38.96239,-42.57494 -38.96239,-72.99022c0,-48.518 39.355,-87.852 87.905,-87.852c4.03423,-0.001 8.06385,0.2723 12.061,0.818l0,10.76898c4.64967,-0.09894 9.30133,0.17007 13.911,0.80102v48.593c-3.94487,-1.25017 -8.05877,-1.88528 -12.197,-1.883c-22.209,0 -40.21,17.994 -40.21,40.186c-0.00942,6.11418 1.38223,12.11209 4.025,17.54894l-17.941,-29.11894c0,-6.79366 1.68644,-13.19354 4.66379,-18.8042c-2.97797,5.61107 -4.66479,12.01139 -4.66479,18.8052c0,15.692 8.998,29.28 22.118,35.898c0.00103,0.00136 0.00207,0.00271 0.0031,0.00407c5.60932,2.82644 11.80469,4.29426 18.0859,4.28493c22.162,0 40.132,-17.92 40.208,-40.05v-189.845h47.834v6.113c0.1689,1.82808 0.41177,3.64857 0.728,5.457l-34.643,0.001v189.844c-0.078,22.132 -18.05,40.05 -40.21,40.05c-5.67604,0 -11.07698,-1.17525 -15.97293,-3.29552c4.89621,2.12093 10.2975,3.29652 15.97393,3.29652c22.161,0 40.131,-17.92 40.21,-40.052v-189.843l47.832,0v6.113c1.356,14.892 7.624,28.362 17.17,38.785h-0.001c10.55395,6.58342 22.74707,10.06504 35.186,10.047v10.116c4.57579,0.96983 9.24056,1.45782 13.918,1.456v47.53c-24.71212,0 -47.59337,-7.85144 -66.271,-21.19557zM99.964,151.40168c0.00033,0.00011 0.00067,0.00021 0.001,0.00032l0,-37.82098c-0.00033,0.00001 -0.00067,0.00001 -0.001,0.00002zM242.075,114.045v-0.001c-24.712,0 -47.589,-7.851 -66.272,-21.195v0.001c18.682,13.344 41.561,21.195 66.272,21.195zM69.673,225.607c-1.62409,-2.12792 -3.02095,-4.40072 -4.178,-6.78106zM228.74787,72.27412c3.67381,1.65002 7.52454,2.97698 11.51604,3.94463c-3.9686,-0.96405 -7.82207,-2.2874 -11.51604,-3.94463z\" fill=\"currentColor\" />\n </svg>\n )\n}\n\n/** Keyed map for registry-style resolution (e.g. the Social Spec tactic icons). */\nexport const BRAND_ICONS = {\n meta: BrandMeta,\n facebook: BrandFacebook,\n instagram: BrandInstagram,\n messenger: BrandMessenger,\n linkedin: BrandLinkedIn,\n nextdoor: BrandNextdoor,\n pinterest: BrandPinterest,\n snapchat: BrandSnapchat,\n tiktok: BrandTikTok,\n} as const\n\nexport type BrandIconKey = keyof typeof BRAND_ICONS\n","/**\n * Choropleth — decorative concentric trade-zone rings (ADR-104 D3).\n *\n * A glanceable \"trade zone\" graphic for the GeoDiscovery rail's report cards and\n * the geo surface's empty state. It is DECORATIVE only — the real interactive map\n * lives in the GeoDiscovery lens, one deep-link away. SVG is the right tool for\n * ring geometry; the \"no inline SVG\" guidance applies to icons (use Lucide), not\n * chart/decoration primitives like this one (CLAUDE.md §6).\n *\n * Token choice (ADR-104 D3, recorded): the ring fills use the existing\n * ACCENT-TINT tier — `rgb(var(--accent) / α)` — NOT a new `--choropleth-ring-*`\n * token tier, so no new public token shape and no ADR proposal is required. No\n * hex / oklch literal lands in this SVG; every colour references a token.\n *\n * <Choropleth /> // radius (concentric circles)\n * <Choropleth mode=\"isochrone\" /> // drive-time (concentric polygons)\n */\n\nimport type { CSSProperties } from 'react'\n\nexport interface ChoroplethProps {\n /** `radius` → concentric circles; `isochrone` → concentric polygons. */\n mode?: 'radius' | 'isochrone'\n className?: string\n style?: CSSProperties\n}\n\nconst RING_FILLS = ['rgb(var(--accent) / 0.45)', 'rgb(var(--accent) / 0.28)', 'rgb(var(--accent) / 0.14)']\nconst RING_STROKE = 'rgb(var(--accent) / 0.5)'\nconst GRID_STROKE = 'rgb(var(--foreground) / 0.04)'\nconst RADII = [34, 24, 14]\n\nexport default function Choropleth({ mode = 'radius', className, style }: ChoroplethProps) {\n return (\n <svg\n viewBox=\"0 0 240 84\"\n width=\"100%\"\n height=\"100%\"\n preserveAspectRatio=\"xMidYMid slice\"\n className={className}\n style={{ display: 'block', ...style }}\n aria-hidden=\"true\"\n >\n {[20, 60, 100, 140, 180, 220].map((x) => (\n <line key={`v${x}`} x1={x} y1=\"0\" x2={x} y2=\"84\" stroke={GRID_STROKE} strokeWidth=\"1\" />\n ))}\n {[21, 42, 63].map((y) => (\n <line key={`h${y}`} x1=\"0\" y1={y} x2=\"240\" y2={y} stroke={GRID_STROKE} strokeWidth=\"1\" />\n ))}\n {mode === 'radius'\n ? RADII.map((r, i) => (\n <circle key={r} cx=\"120\" cy=\"42\" r={r} fill={RING_FILLS[i] ?? RING_STROKE} stroke={RING_STROKE} strokeWidth=\"1\" />\n ))\n : [0, 1, 2].map((i) => {\n const s = 1 - i * 0.32\n const pts = `120,${42 - 30 * s} ${120 + 40 * s},${42 - 8 * s} ${120 + 28 * s},${42 + 26 * s} ${120 - 30 * s},${42 + 22 * s} ${120 - 42 * s},${42 - 6 * s}`\n return <polygon key={i} points={pts} fill={RING_FILLS[i] ?? RING_STROKE} stroke={RING_STROKE} strokeWidth=\"1\" />\n })}\n <circle cx=\"120\" cy=\"42\" r=\"3\" fill=\"rgb(var(--accent))\" stroke=\"rgb(var(--surface-on-accent))\" strokeWidth=\"1.5\" />\n </svg>\n )\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n type ReactNode,\n type RefObject,\n} from 'react'\nimport { createPortal } from 'react-dom'\nimport { Link } from 'react-router-dom'\nimport { cn } from './lib/utils'\n\nexport type Crumb = {\n label: string\n to?: string\n}\n\ninterface PageShellProps {\n /** Breadcrumb chain — last item renders as the bold current label.\n * For back-compat, `breadcrumb` + `title` are still accepted. */\n crumbs?: Crumb[]\n /** Legacy convenience: single parent crumb (label only). */\n breadcrumb?: string\n /** Legacy: current-page title. Used as the last crumb when `crumbs` isn't provided. */\n title?: string\n /** Right-side actions in the page header. */\n actions?: ReactNode\n /**\n * Content for the horizontally-centered slot in `<PageHeaderHost />`\n * (Phase 7a). Relayed via the slot portal alongside `crumbs` /\n * `actions`. When mounted in slot-host mode, the content sits in a\n * dedicated absolutely-centered slot between the breadcrumb cluster\n * and the trailing chrome, so it stays centered regardless of left/\n * right slot widths. Ignored when PageShell renders its own inline\n * header (no `<PageHeaderHost />` mounted).\n *\n * Phase 7a's GeoSearch lens lifts its mode-tabs ChipNav into this\n * slot so the AppHeader carries: sidebar-toggle | crumbs | tabs |\n * theme-toggle. Other lenses leave it unset.\n */\n headerCenter?: ReactNode\n children: ReactNode\n /** Override content padding if needed. Default leaves room for the sticky-blend header. */\n contentClassName?: string\n}\n\n// ---------------------------------------------------------------------------\n// PageHeaderSlot — optional \"publish to host\" mode (portal-based).\n//\n// By default, PageShell renders its own sticky header band with breadcrumbs +\n// actions. When the app wraps the tree in <PageHeaderSlotProvider> AND mounts\n// a <PageHeaderHost /> elsewhere, PageShell PORTALS its breadcrumbs/actions\n// into the host's slot div, and skips rendering its own header band. That\n// collapses what would be two stacked sticky bars into a single bar.\n//\n// Portal-based to avoid any state churn on the publish path — only the host\n// DOM ref + the active scroll element are stored in context (each set once\n// per mount, never per render).\n// ---------------------------------------------------------------------------\n\ninterface PageHeaderSlotValue {\n hostEl: HTMLElement | null\n centerEl: HTMLElement | null\n scrollEl: HTMLElement | null\n registerHost: (el: HTMLElement | null) => void\n registerCenter: (el: HTMLElement | null) => void\n registerScroll: (el: HTMLElement | null) => void\n}\n\nconst PageHeaderSlotContext = createContext<PageHeaderSlotValue | null>(null)\n\nexport function PageHeaderSlotProvider({ children }: { children: ReactNode }) {\n const [hostEl, setHostEl] = useState<HTMLElement | null>(null)\n const [centerEl, setCenterEl] = useState<HTMLElement | null>(null)\n const [scrollEl, setScrollEl] = useState<HTMLElement | null>(null)\n const registerHost = useCallback((el: HTMLElement | null) => setHostEl(el), [])\n const registerCenter = useCallback(\n (el: HTMLElement | null) => setCenterEl(el),\n [],\n )\n const registerScroll = useCallback((el: HTMLElement | null) => setScrollEl(el), [])\n return (\n <PageHeaderSlotContext.Provider\n value={{\n hostEl,\n centerEl,\n scrollEl,\n registerHost,\n registerCenter,\n registerScroll,\n }}\n >\n {children}\n </PageHeaderSlotContext.Provider>\n )\n}\n\n/**\n * Page shell — promoted from brand-ai-extension Phase 2a (ADR-009 Decision 7).\n *\n * Self-contained: provides a scrollable region whose sticky-blend header\n * gains a translucent backdrop-blur background once you scroll past a few\n * px. Breadcrumbs render at top-left, page actions at top-right.\n *\n * When mounted inside <PageHeaderSlotProvider> with a <PageHeaderHost />\n * elsewhere, PageShell portals its header content into the host instead of\n * rendering its own bar — the workspace uses this to merge the lens crumbs\n * onto the same row as the workspace sidebar toggle.\n */\nexport function PageShell({\n crumbs,\n breadcrumb,\n title,\n actions,\n headerCenter,\n children,\n contentClassName,\n}: PageShellProps) {\n const resolvedCrumbs: Crumb[] =\n crumbs && crumbs.length > 0\n ? crumbs\n : ([\n breadcrumb ? { label: breadcrumb } : null,\n title ? { label: title } : null,\n ].filter(Boolean) as Crumb[])\n\n const slot = useContext(PageHeaderSlotContext)\n\n return (\n <AppScroll>\n {(scrollRef) => (\n <PageShellBody\n resolvedCrumbs={resolvedCrumbs}\n actions={actions ?? null}\n headerCenter={headerCenter ?? null}\n scrollRef={scrollRef}\n slot={slot}\n contentClassName={contentClassName}\n >\n {children}\n </PageShellBody>\n )}\n </AppScroll>\n )\n}\n\nfunction PageShellBody({\n resolvedCrumbs,\n actions,\n headerCenter,\n scrollRef,\n slot,\n contentClassName,\n children,\n}: {\n resolvedCrumbs: Crumb[]\n actions: ReactNode | null\n headerCenter: ReactNode | null\n scrollRef: RefObject<HTMLDivElement | null>\n slot: PageHeaderSlotValue | null\n contentClassName?: string | undefined\n children: ReactNode\n}) {\n // Register our scroll element with the host once when this PageShell\n // mounts. Unregisters on unmount. Effect runs once because `slot` is a\n // stable context object (provider memoizes its callbacks) and scrollRef\n // identity is stable across renders of the same PageShell instance.\n useEffect(() => {\n if (!slot) return\n const el = scrollRef.current\n if (!el) return\n slot.registerScroll(el)\n return () => slot.registerScroll(null)\n }, [slot, scrollRef])\n\n const headerContent = (\n <>\n <div className=\"flex items-center gap-2 min-w-0 flex-1\">\n <Breadcrumbs\n parents={resolvedCrumbs.slice(0, -1)}\n current={resolvedCrumbs[resolvedCrumbs.length - 1]}\n />\n </div>\n {actions && (\n <div className=\"flex items-center gap-1.5 shrink-0\">{actions}</div>\n )}\n </>\n )\n\n return (\n <>\n {slot?.hostEl ? (\n createPortal(headerContent, slot.hostEl)\n ) : (\n <PageHeader\n crumbs={resolvedCrumbs}\n actions={actions ?? undefined}\n scrollRef={scrollRef}\n />\n )}\n {/* Header-center relay: portal into the host's center slot when\n one is mounted. Falls through silently in slot-less mode — the\n inline `<PageHeader />` doesn't render a centered band. */}\n {slot?.centerEl && headerCenter\n ? createPortal(headerCenter, slot.centerEl)\n : null}\n <div className={cn(contentClassName ?? 'px-7 pb-7')}>{children}</div>\n </>\n )\n}\n\nexport default PageShell\n\ninterface PageHeaderProps {\n crumbs: Crumb[]\n actions?: ReactNode\n scrollRef: RefObject<HTMLDivElement | null>\n}\n\nfunction PageHeader({ crumbs, actions, scrollRef }: PageHeaderProps) {\n const [stuck, setStuck] = useState(false)\n\n useEffect(() => {\n const el = scrollRef.current\n if (!el) return\n const onScroll = () => setStuck(el.scrollTop > 4)\n onScroll()\n el.addEventListener('scroll', onScroll, { passive: true })\n return () => el.removeEventListener('scroll', onScroll)\n }, [scrollRef])\n\n const parents = crumbs.slice(0, -1)\n const current = crumbs[crumbs.length - 1]\n\n return (\n <header\n className=\"sticky top-0 z-30 flex items-center gap-3 h-14 px-5\"\n style={{\n background: stuck ? 'rgb(var(--main-content-bg) / 0.78)' : 'transparent',\n backdropFilter: stuck ? 'saturate(180%) blur(14px)' : undefined,\n WebkitBackdropFilter: stuck ? 'saturate(180%) blur(14px)' : undefined,\n borderBottom: `1px solid ${stuck ? 'rgb(var(--border))' : 'transparent'}`,\n transition:\n 'background var(--dur-base) var(--ease-out), border-color var(--dur-base) var(--ease-out)',\n }}\n >\n <div className=\"flex items-center gap-2 min-w-0 flex-1\">\n <Breadcrumbs parents={parents} current={current} />\n </div>\n {actions && (\n <div className=\"flex items-center gap-1.5 shrink-0\">{actions}</div>\n )}\n </header>\n )\n}\n\n/**\n * PageHeaderHost — single workspace-level header bar that the active\n * <PageShell> portals its breadcrumbs/actions into. Renders the `leading`\n * slot (typically a sidebar toggle button) on the same row, so the lens's\n * chrome doesn't stack as a separate sticky band. The `trailing` slot\n * sits past the portal area for persistent right-cluster chrome (e.g.\n * a theme toggle) that should never collide with per-page actions.\n *\n * Sticky-blend: subscribes to the scroll container the active PageShell\n * registered with the slot so the same scroll-past-4px fade-in still fires.\n */\nexport function PageHeaderHost({\n leading,\n center,\n trailing,\n padX = 'px-3',\n}: {\n leading?: ReactNode\n /**\n * Horizontal padding utility for the header bar. Defaults to `px-3`\n * (the toggle-anchored layout). Callers with no `leading` slot (e.g. a\n * single-lens skin that hides the sidebar toggle) pass a larger inset\n * like `px-7` so the breadcrumbs line up with the content column below\n * instead of hugging the edge. ADR-061 D3.\n */\n padX?: string\n /**\n * Horizontally-centered slot — Phase 7a (ADR-012 Decision 12\n * deviation). Renders absolutely positioned at the geometric center\n * of the header so width changes in the breadcrumb (left) and\n * trailing (right) clusters never shift its position. The active\n * `<PageShell>` may also portal content into this slot via its\n * `headerCenter` prop; both routes target the same DOM node.\n *\n * Wrapped in a `max-w` so on narrow viewports the center stays\n * within the breadcrumb and trailing clusters' visual lanes\n * (truncates internally before overlapping).\n */\n center?: ReactNode\n trailing?: ReactNode\n}) {\n const slot = useContext(PageHeaderSlotContext)\n const [stuck, setStuck] = useState(false)\n const scrollEl = slot?.scrollEl ?? null\n\n useEffect(() => {\n if (!scrollEl) {\n setStuck(false)\n return\n }\n const onScroll = () => setStuck(scrollEl.scrollTop > 4)\n onScroll()\n scrollEl.addEventListener('scroll', onScroll, { passive: true })\n return () => scrollEl.removeEventListener('scroll', onScroll)\n }, [scrollEl])\n\n const setHostRef = useCallback(\n (el: HTMLDivElement | null) => {\n slot?.registerHost(el)\n },\n [slot],\n )\n\n const setCenterRef = useCallback(\n (el: HTMLDivElement | null) => {\n slot?.registerCenter(el)\n },\n [slot],\n )\n\n return (\n <header\n className={cn(\n 'sticky top-0 z-30 flex items-center gap-3 h-12 shrink-0 relative',\n padX,\n )}\n style={{\n background: stuck ? 'rgb(var(--main-content-bg) / 0.78)' : 'transparent',\n backdropFilter: stuck ? 'saturate(180%) blur(14px)' : undefined,\n WebkitBackdropFilter: stuck ? 'saturate(180%) blur(14px)' : undefined,\n borderBottom: `1px solid ${stuck ? 'rgb(var(--border))' : 'transparent'}`,\n transition:\n 'background var(--dur-base) var(--ease-out), border-color var(--dur-base) var(--ease-out)',\n }}\n >\n {leading && <div className=\"shrink-0 flex items-center\">{leading}</div>}\n <div\n ref={setHostRef}\n data-page-header-host=\"true\"\n className=\"flex items-center gap-3 flex-1 min-w-0\"\n />\n {/* Absolutely-centered slot — sits above the row's flex flow so\n it stays geometrically centered regardless of leading/host/\n trailing widths. `pointer-events-none` on the wrapper so empty\n space passes clicks through; inner content re-enables. */}\n <div\n className=\"absolute left-1/2 -translate-x-1/2 flex items-center justify-center pointer-events-none\"\n style={{\n top: 0,\n bottom: 0,\n maxWidth: 'min(560px, 56%)',\n }}\n aria-hidden={center == null && !slot?.centerEl ? 'true' : undefined}\n >\n <div\n ref={setCenterRef}\n data-page-header-center=\"true\"\n className=\"pointer-events-auto flex items-center gap-2 min-w-0\"\n >\n {center}\n </div>\n </div>\n {trailing && (\n <div className=\"shrink-0 flex items-center gap-1.5\">{trailing}</div>\n )}\n </header>\n )\n}\n\nfunction Breadcrumbs({\n parents,\n current,\n}: {\n parents: Crumb[]\n current: Crumb | undefined\n}) {\n return (\n <nav\n className=\"flex items-center gap-1.5 text-[13px] min-w-0\"\n style={{ color: 'rgb(var(--text-tertiary))' }}\n >\n {parents.map((c, i) => (\n <span key={i} className=\"flex items-center gap-1.5 min-w-0\">\n {c.to ? (\n <Link\n to={c.to}\n className=\"truncate transition-colors hover:text-[rgb(var(--foreground))]\"\n style={{ color: 'inherit' }}\n >\n {c.label}\n </Link>\n ) : (\n <span className=\"truncate\">{c.label}</span>\n )}\n <span style={{ color: 'rgb(var(--text-muted))' }}>/</span>\n </span>\n ))}\n {current && (\n <span\n className=\"truncate font-medium\"\n style={{ color: 'rgb(var(--foreground))' }}\n >\n {current.label}\n </span>\n )}\n </nav>\n )\n}\n\n/**\n * Scrollable wrapper that exposes its scrollRef via a render prop so\n * the consuming header (PageShell's internal PageHeader) can subscribe\n * to scroll for the stuck-state effect.\n */\nexport function AppScroll({\n children,\n className,\n}: {\n children: (scrollRef: RefObject<HTMLDivElement | null>) => ReactNode\n className?: string\n}) {\n const scrollRef = useRef<HTMLDivElement>(null)\n return (\n <div\n ref={scrollRef}\n data-app-scroll=\"true\"\n className={cn('flex-1 overflow-y-auto', className)}\n >\n {children(scrollRef)}\n </div>\n )\n}\n","/**\n * @lovett/ui — toast surface.\n *\n * Sonner is the toast provider; this module is a thin wrapper that\n * (a) re-exports Sonner's `toast` API verbatim, and\n * (b) exports a `<Toaster />` component pre-styled with @lovett/ui\n * tokens (--toast-bg, --toast-text, --toast-border).\n *\n * Per ADR-008 Decision 5, `@lovett/ui` does not own the toast\n * primitive itself — it owns the wrapper. Apps mount one `<Toaster />`\n * at the root and call `toast(...)` from anywhere.\n *\n * import { Toaster, toast } from '@lovett/ui'\n *\n * <Toaster /> // mount once at app root\n * toast.success('Saved') // call from anywhere\n * toast.error('Something went wrong')\n *\n * Sonner's full API is available via the re-exported `toast`.\n */\n\nimport { Toaster as SonnerToaster, toast } from 'sonner'\nimport type { ComponentProps } from 'react'\n\ntype SonnerToasterProps = ComponentProps<typeof SonnerToaster>\n\n/**\n * Token-aware `<Toaster />` shell.\n *\n * Defaults: top-right, 12px gap, 5s duration. The toastOptions wire\n * Sonner's internal CSS variables to our `--toast-*` tokens so toasts\n * adopt the design system surface color, border, and text color.\n *\n * Apps can override any prop (position, duration, theme, etc.) by\n * passing it through.\n */\nexport function Toaster(props: SonnerToasterProps) {\n return (\n <SonnerToaster\n position=\"top-right\"\n gap={12}\n duration={5000}\n toastOptions={{\n style: {\n background: 'rgb(var(--toast-bg))',\n color: 'rgb(var(--toast-text))',\n border: '1px solid rgb(var(--toast-border))',\n borderRadius: 'var(--radius-md)',\n boxShadow: 'var(--shadow-lg)',\n fontFamily: 'var(--font-sans)',\n fontSize: '13px',\n },\n }}\n {...props}\n />\n )\n}\n\nexport { toast }\n","/**\n * Brand-profile atoms — promoted from brand-ai-extension\n * `webapp/src/components/brand-profile-v2/atoms.tsx` per ADR-010 Decision 3.\n *\n * Seven presentational primitives the Phase 2b brand-profile lens (and\n * later sibling lenses — Discovery, Creative Brief) reach for:\n *\n * IdentityLabel, IdentityValue, EmptyPlaceholder, ListItem, SectionLabel,\n * TextInput, TextareaInput\n *\n * The source's local `Card` + `CardGrid` are intentionally NOT promoted\n * (ADR-010 Decision 4) — the canonical `Card` from `@lovett/ui` replaces\n * both, and the source's `ListItems` wrapper is `<div class=\"flex flex-col\n * gap-1.5\">` boilerplate that callers can inline.\n *\n * `TextInput` + `TextareaInput` are thin (string)-callback wrappers around\n * the canonical `<Input>` + `<Textarea>` so source section files don't\n * need callsite churn during the port.\n */\n\nimport type { ReactNode } from 'react'\nimport { Input } from './input'\nimport { Textarea } from './textarea'\n\n// =======================================================================\n// LABELS\n// =======================================================================\n\nexport function SectionLabel({ children }: { children: ReactNode }) {\n return (\n <div className=\"text-[11px] font-semibold uppercase tracking-[0.5px] text-[rgb(var(--text-muted))]\">\n {children}\n </div>\n )\n}\n\nexport function IdentityLabel({ children }: { children: ReactNode }) {\n return (\n <div className=\"text-[11px] font-semibold uppercase tracking-[0.4px] text-[rgb(var(--text-muted))] mb-1.5\">\n {children}\n </div>\n )\n}\n\nexport function IdentityValue({\n children,\n className = '',\n}: {\n children: ReactNode\n className?: string\n}) {\n return (\n <div\n className={`text-[14px] text-[rgb(var(--foreground))] ${className}`}\n style={{ lineHeight: 1.6 }}\n >\n {children}\n </div>\n )\n}\n\n// =======================================================================\n// INPUTS\n// Thin (string)-callback wrappers around the canonical <Input> / <Textarea>.\n// Section files across brand-profile-v2 pass `value + onChange(string)` so\n// keeping that API means zero callsite churn during the Phase 2b port.\n// =======================================================================\n\nexport function TextInput({\n value,\n onChange,\n placeholder,\n autoFocus,\n autoComplete,\n name,\n}: {\n value: string\n onChange: (v: string) => void\n placeholder?: string | undefined\n autoFocus?: boolean | undefined\n /** Forwarded so the browser's autofill / password manager can identify the field. */\n autoComplete?: string | undefined\n /** Forwarded so the field participates in form submission / autofill heuristics. */\n name?: string | undefined\n}) {\n return (\n <Input\n type=\"text\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder={placeholder}\n autoFocus={autoFocus}\n autoComplete={autoComplete}\n name={name}\n />\n )\n}\n\nexport function TextareaInput({\n value,\n onChange,\n placeholder,\n autoFocus,\n autoComplete,\n name,\n rows = 4,\n}: {\n value: string\n onChange: (v: string) => void\n placeholder?: string | undefined\n autoFocus?: boolean | undefined\n autoComplete?: string | undefined\n name?: string | undefined\n rows?: number | undefined\n}) {\n return (\n <Textarea\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder={placeholder}\n autoFocus={autoFocus}\n autoComplete={autoComplete}\n name={name}\n rows={rows}\n />\n )\n}\n\n// =======================================================================\n// EMPTY PLACEHOLDER (always-visible placeholder card for missing content)\n// =======================================================================\n\nexport function EmptyPlaceholder({\n label,\n description,\n onAdd,\n}: {\n label: string\n description?: string | undefined\n onAdd?: (() => void) | undefined\n}) {\n const clickable = !!onAdd\n return (\n <div\n onClick={onAdd}\n className={`flex flex-col items-center justify-center text-center py-8 px-6 transition-colors ${\n clickable ? 'cursor-pointer' : ''\n }`}\n style={{\n background: 'rgb(var(--bg-card))',\n border: '1px dashed rgb(var(--border-strong))',\n borderRadius: 'var(--radius-lg)',\n }}\n onMouseEnter={(e) => {\n if (!clickable) return\n e.currentTarget.style.background = 'rgb(var(--accent-subtle))'\n e.currentTarget.style.borderColor = 'rgb(var(--accent))'\n }}\n onMouseLeave={(e) => {\n if (!clickable) return\n e.currentTarget.style.background = 'rgb(var(--bg-card))'\n e.currentTarget.style.borderColor = 'rgb(var(--border-strong))'\n }}\n >\n <div className=\"text-[13px] font-medium text-[rgb(var(--text-secondary))] mb-1\">\n {clickable ? `+ Add ${label}` : `No ${label} yet`}\n </div>\n {description && (\n <div className=\"text-[11px] text-[rgb(var(--text-muted))] max-w-xs\">{description}</div>\n )}\n </div>\n )\n}\n\n// =======================================================================\n// LIST ITEMS (with accent bullet)\n// =======================================================================\n\nexport function ListItem({ children }: { children: ReactNode }) {\n return (\n <div\n className=\"flex items-start gap-2 text-[13px] text-[rgb(var(--text-secondary))]\"\n style={{ lineHeight: 1.5 }}\n >\n <div\n className=\"rounded-full shrink-0\"\n style={{\n width: 'var(--bullet-size)',\n height: 'var(--bullet-size)',\n background: 'rgb(var(--accent))',\n marginTop: 'var(--bullet-offset-y)',\n }}\n />\n <div>{children}</div>\n </div>\n )\n}\n","/**\n * Sortable primitives built on @dnd-kit. Promoted from brand-ai-extension\n * `webapp/src/components/brand-profile-v2/sortable.tsx` per ADR-010\n * Decision 5. CLAUDE.md §1 amended (Decision 6) to permit @dnd-kit/core +\n * @dnd-kit/sortable + @dnd-kit/utilities as runtime deps.\n *\n * - <SortableList> wraps children with DndContext + SortableContext\n * - <SortableItem> makes a single item draggable with a grab handle\n * - <DragHandle> is a Lucide-grip handle pre-wired to the listeners\n */\n\nimport type { CSSProperties, HTMLAttributes, ReactNode } from 'react'\nimport {\n DndContext,\n closestCenter,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n type DragEndEvent,\n} from '@dnd-kit/core'\nimport {\n arrayMove,\n SortableContext,\n sortableKeyboardCoordinates,\n useSortable,\n verticalListSortingStrategy,\n horizontalListSortingStrategy,\n rectSortingStrategy,\n} from '@dnd-kit/sortable'\nimport { CSS } from '@dnd-kit/utilities'\nimport { GripVertical } from 'lucide-react'\n\ntype Strategy = 'vertical' | 'horizontal' | 'grid'\n\nexport function SortableList<T>({\n items,\n getId,\n onReorder,\n strategy = 'vertical',\n children,\n}: {\n items: T[]\n getId: (item: T, index: number) => string\n onReorder: (items: T[]) => void\n strategy?: Strategy\n children: ReactNode\n}) {\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 4 } }),\n useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates }),\n )\n\n const sortIds = items.map(getId)\n\n const sortingStrategy =\n strategy === 'horizontal'\n ? horizontalListSortingStrategy\n : strategy === 'grid'\n ? rectSortingStrategy\n : verticalListSortingStrategy\n\n const handleDragEnd = (event: DragEndEvent) => {\n const { active, over } = event\n if (over && active.id !== over.id) {\n const oldIndex = sortIds.indexOf(String(active.id))\n const newIndex = sortIds.indexOf(String(over.id))\n if (oldIndex >= 0 && newIndex >= 0) {\n onReorder(arrayMove(items, oldIndex, newIndex))\n }\n }\n }\n\n return (\n <DndContext sensors={sensors} collisionDetection={closestCenter} onDragEnd={handleDragEnd}>\n <SortableContext items={sortIds} strategy={sortingStrategy}>\n {children}\n </SortableContext>\n </DndContext>\n )\n}\n\nexport function SortableItem({\n id,\n children,\n}: {\n id: string\n children: (props: {\n dragHandleProps: HTMLAttributes<HTMLElement>\n setNodeRef: (node: HTMLElement | null) => void\n style: CSSProperties\n isDragging: boolean\n }) => ReactNode\n}) {\n const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({\n id,\n })\n\n const style: CSSProperties = {\n transform: CSS.Transform.toString(transform),\n transition,\n opacity: isDragging ? 0.4 : 1,\n position: 'relative',\n zIndex: isDragging ? 10 : 'auto',\n }\n\n return (\n <>\n {children({\n dragHandleProps: { ...attributes, ...listeners } as HTMLAttributes<HTMLElement>,\n setNodeRef,\n style,\n isDragging,\n })}\n </>\n )\n}\n\nexport function DragHandle({\n dragHandleProps,\n className = '',\n}: {\n dragHandleProps: HTMLAttributes<HTMLElement>\n className?: string\n}) {\n return (\n <button\n {...dragHandleProps}\n type=\"button\"\n className={`cursor-grab active:cursor-grabbing flex items-center justify-center text-[rgb(var(--text-muted))] hover:text-[rgb(var(--text-secondary))] transition-colors ${className}`}\n style={{ touchAction: 'none' }}\n aria-label=\"Drag to reorder\"\n >\n <GripVertical className=\"h-4 w-4\" />\n </button>\n )\n}\n","/**\n * EmptyState — full-area placeholder shown when a lens has no data.\n *\n * Distinct from `EmptyPlaceholder` (in `atoms.tsx`), which is the\n * in-card dashed-border variant used by brand-profile sections. Use\n * `EmptyState` for whole-lens empty states (Products / Personas /\n * Competitors / Assets / etc.) — the prominent centered icon-tile\n * pattern.\n *\n * Design (locked by ADR-019, derived from the Phase 15 Assets pattern):\n * • 56×56 icon tile (surface-overlay background, --radius-lg corner,\n * icon centered, --text-muted color)\n * • 28px Lucide icon inside the tile (the consumer passes a sized\n * element; this primitive does not size the icon)\n * • 15px / semibold title in --foreground\n * • 13px / --text-tertiary description (optional), capped at max-w-md\n * • py-16 vertical padding for whole-lens placement\n * • Action slot below the description (flex-wrap, gap-2)\n *\n * All values come from public tokens. Token boundary clean.\n */\n\nimport type { ReactNode } from 'react'\n\nexport interface EmptyStateProps {\n /** Lucide icon (or any ReactNode) rendered inside the 56×56 tile.\n * Pass at h-7 w-7 (28px) for visual parity with the canonical sites. */\n icon: ReactNode\n /** Headline text. */\n title: string\n /** Optional supporting copy. Kept under max-w-md by default. */\n description?: string\n /** Optional action buttons row. Wraps with gap-2. */\n actions?: ReactNode\n /** Optional className override on the outer container — use sparingly\n * (e.g. when the parent already provides vertical padding). */\n className?: string\n}\n\nexport function EmptyState({\n icon,\n title,\n description,\n actions,\n className,\n}: EmptyStateProps) {\n return (\n <div\n className={\n className ??\n 'mx-auto flex max-w-md flex-col items-center text-center gap-3 py-16'\n }\n >\n <div\n className=\"inline-flex h-14 w-14 items-center justify-center\"\n style={{\n background: 'rgb(var(--surface-overlay))',\n color: 'rgb(var(--text-muted))',\n borderRadius: 'var(--radius-lg)',\n }}\n >\n {icon}\n </div>\n <div\n className=\"text-[15px] font-semibold\"\n style={{ color: 'rgb(var(--foreground))' }}\n >\n {title}\n </div>\n {description && (\n <p\n className=\"text-[13px]\"\n style={{ color: 'rgb(var(--text-tertiary))' }}\n >\n {description}\n </p>\n )}\n {actions && (\n <div className=\"mt-2 flex flex-wrap items-center justify-center gap-2\">\n {actions}\n </div>\n )}\n </div>\n )\n}\n","/**\n * Radio + RadioGroup primitives (ADR-029 D3).\n *\n * Stand-alone radio inputs for cases where the OptionTile pattern is\n * too visual — inline form labels, compact mode pickers. For tinted-\n * card mode pickers use <OptionTileGroup type=\"radio\"> instead.\n *\n * API mirrors RadioGroup conventions:\n * <RadioGroup name=\"case\" value={mode} onChange={setMode}>\n * <Radio value=\"lower\" label=\"lowercase\" />\n * <Radio value=\"upper\" label=\"UPPERCASE\" description=\"all caps\" />\n * </RadioGroup>\n *\n * Token discipline: all public tokens (--accent, --border, --foreground,\n * --text-tertiary, --ring-focus). Composable inside <Field>.\n */\n\nimport {\n createContext,\n forwardRef,\n useContext,\n useId,\n type ReactNode,\n} from 'react'\nimport { cn } from './lib/utils'\n\nexport interface RadioGroupProps<T extends string = string> {\n /** Form name — required for proper radio semantics + form submission. */\n name: string\n /** Currently selected value. */\n value: T | null\n /** Fires when the user picks a different option. */\n onChange: (next: T) => void\n /** <Radio> children. */\n children: ReactNode\n /** Visually-hidden label for screen readers. Renders as <legend>. */\n ariaLabel?: string\n /** Layout direction. Defaults to vertical. */\n orientation?: 'horizontal' | 'vertical'\n /** Extra classes on the wrapping <fieldset>. */\n className?: string\n /** Disable every child radio. */\n disabled?: boolean\n}\n\ninterface RadioGroupContextValue {\n name: string\n value: string | null\n onChange: (next: string) => void\n disabled: boolean\n}\n\nconst RadioGroupContext = createContext<RadioGroupContextValue | null>(null)\n\nexport function RadioGroup<T extends string = string>({\n name,\n value,\n onChange,\n children,\n ariaLabel,\n orientation = 'vertical',\n className,\n disabled = false,\n}: RadioGroupProps<T>) {\n const ctx: RadioGroupContextValue = {\n name,\n value,\n onChange: onChange as (next: string) => void,\n disabled,\n }\n return (\n <RadioGroupContext.Provider value={ctx}>\n <fieldset\n className={cn(\n 'flex',\n orientation === 'horizontal' ? 'flex-row gap-4' : 'flex-col gap-2',\n className,\n )}\n >\n {ariaLabel && <legend className=\"sr-only\">{ariaLabel}</legend>}\n {children}\n </fieldset>\n </RadioGroupContext.Provider>\n )\n}\n\nexport interface RadioProps {\n /** Value emitted to the group's onChange when picked. */\n value: string\n /** Visible label. */\n label: ReactNode\n /** Optional secondary text (smaller, --text-tertiary). */\n description?: ReactNode\n /** Disable this specific radio (overrides group default). */\n disabled?: boolean\n /** Extra classes on the outer <label>. */\n className?: string\n}\n\nexport const Radio = forwardRef<HTMLInputElement, RadioProps>(function Radio(\n { value, label, description, disabled, className },\n ref,\n) {\n const ctx = useContext(RadioGroupContext)\n if (!ctx) {\n throw new Error('<Radio> must be rendered inside <RadioGroup>')\n }\n const inputId = useId()\n const isSelected = ctx.value === value\n const isDisabled = disabled ?? ctx.disabled\n\n return (\n <label\n htmlFor={inputId}\n className={cn(\n 'inline-flex items-start gap-2.5 cursor-pointer select-none group',\n isDisabled && 'cursor-not-allowed opacity-50',\n className,\n )}\n >\n <input\n ref={ref}\n id={inputId}\n type=\"radio\"\n name={ctx.name}\n value={value}\n checked={isSelected}\n disabled={isDisabled}\n onChange={() => ctx.onChange(value)}\n className=\"peer sr-only\"\n />\n {/* Visual dot — 16px outer ring, 8px inner fill. */}\n <span\n aria-hidden\n className={cn(\n 'mt-0.5 inline-flex h-4 w-4 shrink-0 items-center justify-center rounded-full transition-colors',\n 'peer-focus-visible:[box-shadow:var(--ring-focus)]',\n )}\n style={{\n border: `1.5px solid rgb(var(${\n isSelected ? '--accent' : '--border-strong'\n }))`,\n background: 'transparent',\n }}\n >\n <span\n className={cn(\n 'h-2 w-2 rounded-full transition-opacity',\n isSelected ? 'opacity-100' : 'opacity-0',\n )}\n style={{ background: 'rgb(var(--accent))' }}\n />\n </span>\n <span className=\"flex flex-col gap-0.5 min-w-0\">\n <span\n className=\"text-[13px] font-medium\"\n style={{ color: 'rgb(var(--foreground))' }}\n >\n {label}\n </span>\n {description && (\n <span\n className=\"text-[12px]\"\n style={{ color: 'rgb(var(--text-tertiary))' }}\n >\n {description}\n </span>\n )}\n </span>\n </label>\n )\n})\n","/**\n * OptionTile + OptionTileGroup primitives (ADR-029 D2).\n *\n * Tinted-card-with-input pattern — clickable card surface that wraps a\n * native radio OR checkbox input, with accent fill + border when active\n * and an optional preview/description sub-line.\n *\n * Replaces 4 lens-local forks of the same idiom across Convert Case\n * (route + modal), Text Formatter, and the Replace/Dedupe modals.\n *\n * Group usage (recommended):\n * <OptionTileGroup\n * type=\"radio\"\n * name=\"case-mode\"\n * value={mode}\n * onChange={setMode}\n * options={[\n * { value: 'lower', label: 'lowercase', description: 'all small letters' },\n * { value: 'upper', label: 'UPPERCASE' },\n * ]}\n * />\n *\n * <OptionTileGroup\n * type=\"checkbox\"\n * value={enabledOps}\n * onChange={setEnabledOps}\n * options={...}\n * />\n *\n * Standalone usage (escape hatch for non-group layouts):\n * <OptionTile\n * selected={mode === 'lower'}\n * onSelect={() => setMode('lower')}\n * inputType=\"radio\"\n * inputName=\"case-mode\"\n * label=\"lowercase\"\n * description=\"all small letters\"\n * />\n */\n\nimport { useId, type ReactNode } from 'react'\nimport { cn } from './lib/utils'\n\n// ─── single tile ─────────────────────────────────────────────────────\n\nexport interface OptionTileProps {\n selected: boolean\n onSelect: () => void\n inputType: 'radio' | 'checkbox'\n /** Required for radio (shared name across the group). */\n inputName: string | undefined\n label: ReactNode\n description: ReactNode | undefined\n disabled: boolean | undefined\n className: string | undefined\n}\n\nexport function OptionTile({\n selected,\n onSelect,\n inputType,\n inputName,\n label,\n description,\n disabled = false,\n className,\n}: OptionTileProps) {\n const inputId = useId()\n\n return (\n <label\n htmlFor={inputId}\n className={cn(\n 'flex items-start gap-2.5 px-3 py-2.5 cursor-pointer select-none transition-colors',\n 'focus-within:[box-shadow:var(--ring-focus)]',\n disabled && 'cursor-not-allowed opacity-50',\n className,\n )}\n style={{\n borderRadius: 'var(--radius-md)',\n background: selected\n ? 'rgb(var(--accent-subtle))'\n : 'rgb(var(--surface-overlay-soft))',\n border: `1px solid rgb(var(${\n selected ? '--accent-muted' : '--border'\n }))`,\n }}\n >\n <input\n id={inputId}\n type={inputType}\n name={inputName}\n checked={selected}\n disabled={disabled}\n onChange={onSelect}\n className=\"sr-only\"\n />\n {/* Visual indicator — dot for radio, check for checkbox. */}\n <span\n aria-hidden\n className=\"mt-0.5 inline-flex h-4 w-4 shrink-0 items-center justify-center\"\n style={{\n borderRadius: inputType === 'radio' ? '9999px' : '4px',\n border: `1.5px solid rgb(var(${\n selected ? '--accent' : '--border-strong'\n }))`,\n background:\n selected && inputType === 'checkbox'\n ? 'rgb(var(--accent))'\n : 'transparent',\n }}\n >\n {selected && inputType === 'radio' && (\n <span\n className=\"h-2 w-2 rounded-full\"\n style={{ background: 'rgb(var(--accent))' }}\n />\n )}\n {selected && inputType === 'checkbox' && (\n <CheckGlyph />\n )}\n </span>\n <span className=\"flex flex-col gap-0.5 min-w-0 flex-1\">\n <span\n className=\"text-[13px] font-medium leading-tight\"\n style={{ color: 'rgb(var(--foreground))' }}\n >\n {label}\n </span>\n {description && (\n <span\n className=\"text-[12px] leading-snug\"\n style={{ color: 'rgb(var(--text-tertiary))' }}\n >\n {description}\n </span>\n )}\n </span>\n </label>\n )\n}\n\nfunction CheckGlyph() {\n // Lucide-style check, rendered as inline SVG path inside a primitive.\n // Kept inline because the parent <span> already provides the colored\n // background — we just need the white tick on top. NOT a violation of\n // CLAUDE.md §6 (icon discipline only forbids inline SVG OUTSIDE\n // packages/ui — primitives in this package may render their own\n // canonical glyphs).\n return (\n <svg\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"white\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n )\n}\n\n// ─── group wrapper ──────────────────────────────────────────────────\n\ninterface OptionTileGroupOption<T extends string> {\n value: T\n label: ReactNode\n description?: ReactNode\n disabled?: boolean\n}\n\n// Discriminated by `type` so TS narrows value + onChange shapes correctly.\nexport type OptionTileGroupProps<T extends string = string> =\n | {\n type: 'radio'\n name: string\n value: T | null\n onChange: (next: T) => void\n options: OptionTileGroupOption<T>[]\n ariaLabel?: string\n columns?: number\n className?: string\n }\n | {\n type: 'checkbox'\n value: T[]\n onChange: (next: T[]) => void\n options: OptionTileGroupOption<T>[]\n ariaLabel?: string\n columns?: number\n className?: string\n /** Optional shared `name` attr on the underlying checkboxes (rarely needed). */\n name?: string\n }\n\nexport function OptionTileGroup<T extends string = string>(\n props: OptionTileGroupProps<T>,\n) {\n const gridStyle = props.columns\n ? { gridTemplateColumns: `repeat(${props.columns}, minmax(0, 1fr))` }\n : { gridTemplateColumns: 'repeat(auto-fill, minmax(180px, 1fr))' }\n\n return (\n <fieldset\n className={cn('grid gap-2', props.className)}\n style={gridStyle}\n >\n {props.ariaLabel && <legend className=\"sr-only\">{props.ariaLabel}</legend>}\n {props.options.map((opt) => {\n if (props.type === 'radio') {\n return (\n <OptionTile\n key={opt.value}\n selected={props.value === opt.value}\n onSelect={() => props.onChange(opt.value)}\n inputType=\"radio\"\n inputName={props.name}\n label={opt.label}\n description={opt.description}\n disabled={opt.disabled}\n className={undefined}\n />\n )\n }\n // checkbox variant\n const isSelected = props.value.includes(opt.value)\n return (\n <OptionTile\n key={opt.value}\n selected={isSelected}\n onSelect={() =>\n props.onChange(\n isSelected\n ? props.value.filter((v) => v !== opt.value)\n : [...props.value, opt.value],\n )\n }\n inputType=\"checkbox\"\n inputName={props.name}\n label={opt.label}\n description={opt.description}\n disabled={opt.disabled}\n className={undefined}\n />\n )\n })}\n </fieldset>\n )\n}\n","/**\n * MetricCard — KPI tile with large value + label + optional tone variant.\n *\n * Promoted in ADR-020 (Phase 3a Discovery Company Research, first\n * committed consumer). Cross-batch consumers: Phase 3c (admin stats),\n * Phase 8 (results summary), Phase 12 (review-overview summary).\n *\n * Designed for use inside `<StatsGrid>` (also new this batch — see\n * `stats-grid.tsx`) but works standalone in any flex/grid container.\n *\n * Token discipline: all colors via public tokens. Tone variant gives\n * the value text an accent/success/warning/destructive/info color;\n * background is always neutral surface-overlay.\n */\n\nimport type { ReactNode } from 'react'\n\nexport type MetricCardTone = 'neutral' | 'accent' | 'success' | 'warning' | 'destructive' | 'info'\n\nconst TONE_COLOR: Record<MetricCardTone, string> = {\n neutral: 'rgb(var(--foreground))',\n accent: 'rgb(var(--accent))',\n success: 'rgb(var(--success))',\n warning: 'rgb(var(--warning))',\n destructive: 'rgb(var(--destructive))',\n info: 'rgb(var(--info))',\n}\n\nexport interface MetricCardProps {\n /** Headline value (large, semibold, tone-colored). Numbers should\n * use `font-mono` for tabular alignment when relevant. */\n value: ReactNode\n /** Small descriptive label below the value. */\n label: string\n /** Optional tone — colors the value text. Background stays neutral. */\n tone?: MetricCardTone\n /** Optional icon shown to the left of the value (h-5 w-5 expected). */\n icon?: ReactNode\n /**\n * Where the label sits relative to the value. Default `'bottom'`\n * (value-then-label — the original shape; existing consumers are\n * unchanged). `'top'` renders a small uppercase label above the\n * value — the KPI-chip shape used by Calculator Shell v2 (ADR-076\n * D8). The value size is unchanged in both positions.\n */\n labelPosition?: 'top' | 'bottom'\n /** Optional className override for the outer container. */\n className?: string\n}\n\nexport function MetricCard({\n value,\n label,\n tone = 'neutral',\n icon,\n labelPosition = 'bottom',\n className,\n}: MetricCardProps) {\n const labelEl =\n labelPosition === 'top' ? (\n <div\n className=\"text-[10px] font-bold uppercase tracking-[0.05em]\"\n style={{ color: 'rgb(var(--text-tertiary))' }}\n >\n {label}\n </div>\n ) : (\n <div\n className=\"text-[12px]\"\n style={{ color: 'rgb(var(--text-tertiary))' }}\n >\n {label}\n </div>\n )\n\n const valueEl = (\n <div className=\"flex items-center gap-2\">\n {icon && (\n <span style={{ color: TONE_COLOR[tone] }} className=\"flex-shrink-0\">\n {icon}\n </span>\n )}\n <div\n className=\"text-[24px] font-semibold tabular-nums\"\n style={{ color: TONE_COLOR[tone] }}\n >\n {value}\n </div>\n </div>\n )\n\n return (\n <div\n className={\n className ??\n 'flex flex-col gap-1 px-4 py-3 border'\n }\n style={{\n background: 'rgb(var(--surface-overlay-soft))',\n borderColor: 'rgb(var(--border))',\n borderRadius: 'var(--radius-lg)',\n }}\n >\n {labelPosition === 'top' ? (\n <>\n {labelEl}\n {valueEl}\n </>\n ) : (\n <>\n {valueEl}\n {labelEl}\n </>\n )}\n </div>\n )\n}\n","/**\n * ProgressBar — labeled fill bar.\n *\n * Promoted in ADR-020 (Phase 3a Discovery report generation, first\n * committed consumer). Cross-batch consumers: Phase 8 (AI-suggest\n * progress if surfaced), Phase 12 (generation step in wizard).\n *\n * Indeterminate variant for unknown-duration progress (animated\n * stripe sweep); determinate variant for known-percent progress.\n *\n * Token discipline: all colors via public tokens.\n */\n\nexport interface ProgressBarProps {\n /** Optional label above the bar. */\n label?: string\n /** 0-100 percent (determinate). Omit for indeterminate animation. */\n percent?: number\n /** Optional secondary text shown right of the label. Often \"X%\" or a status message. */\n status?: string\n /** Track height in px (default 8). */\n height?: number\n}\n\nexport function ProgressBar({ label, percent, status, height = 8 }: ProgressBarProps) {\n const determinate = typeof percent === 'number'\n const clamped = determinate ? Math.max(0, Math.min(100, percent)) : 0\n\n return (\n <div className=\"flex flex-col gap-1.5\">\n {(label || status) && (\n <div className=\"flex items-center justify-between\">\n {label && (\n <span\n className=\"text-[12px] font-medium\"\n style={{ color: 'rgb(var(--text-secondary))' }}\n >\n {label}\n </span>\n )}\n {status && (\n <span\n className=\"text-[11px] tabular-nums\"\n style={{ color: 'rgb(var(--text-tertiary))' }}\n >\n {status}\n </span>\n )}\n </div>\n )}\n <div\n role=\"progressbar\"\n aria-valuenow={determinate ? clamped : undefined}\n aria-valuemin={0}\n aria-valuemax={100}\n className=\"w-full overflow-hidden\"\n style={{\n height,\n background: 'rgb(var(--surface-overlay))',\n borderRadius: 'var(--radius-full)',\n }}\n >\n {determinate ? (\n <div\n className=\"h-full transition-[width] duration-300 ease-out\"\n style={{\n width: `${clamped}%`,\n background: 'rgb(var(--accent))',\n borderRadius: 'var(--radius-full)',\n }}\n />\n ) : (\n <div\n className=\"h-full progress-indeterminate\"\n style={{\n background: 'rgb(var(--accent))',\n borderRadius: 'var(--radius-full)',\n }}\n />\n )}\n </div>\n </div>\n )\n}\n","/**\n * StepLoader — a sequential, multi-step loading indicator (3-5 steps). Each step\n * dwells for a believable duration, then the next begins (completed → check, current\n * → spinner, pending → dot), connected by a vertical rail.\n *\n * The defining behavior: the FINAL step is HELD until the real work reports `done`\n * AND a minimum dwell has elapsed — so a backend that returns faster than usual still\n * plays the full, believable sequence instead of snapping away. Non-final steps always\n * advance on their own timers (independent of `done`).\n *\n * <StepLoader steps={[...]} done={isReady} onComplete={() => show()} />\n */\n\nimport { useEffect, useRef, useState } from 'react'\nimport { Check, Loader2 } from 'lucide-react'\n\nexport interface StepLoaderStep {\n label: string\n /** Override the default dwell for this step (ms). */\n durationMs?: number\n}\n\nexport interface StepLoaderProps {\n /** The ordered steps (3-5). Strings use the default dwell. */\n steps: ReadonlyArray<string | StepLoaderStep>\n /** The real work finished — gates completion of the FINAL step only. */\n done?: boolean\n /** Fired once the sequence has played out AND `done` is true (+ `minLastStepMs`). */\n onComplete?: () => void\n /** Default per-step dwell (ms) for steps without an explicit duration. */\n defaultStepMs?: number\n /** Minimum time the final step stays before completing — keeps a fast result believable. */\n minLastStepMs?: number\n className?: string\n}\n\ntype StepState = 'done' | 'active' | 'pending'\n\nexport function StepLoader({\n steps,\n done = false,\n onComplete,\n defaultStepMs = 2600,\n minLastStepMs = 1400,\n className,\n}: StepLoaderProps) {\n const items = steps.map((s) => (typeof s === 'string' ? { label: s } : s))\n const n = items.length\n const [active, setActive] = useState(0)\n const [complete, setComplete] = useState(false)\n const completedRef = useRef(false)\n const minElapsedRef = useRef(false)\n const doneRef = useRef(done)\n doneRef.current = done\n const onCompleteRef = useRef(onComplete)\n onCompleteRef.current = onComplete\n\n function fire() {\n if (completedRef.current) return\n completedRef.current = true\n setComplete(true)\n onCompleteRef.current?.()\n }\n\n // Walk the non-final steps on their dwell timers, independent of `done` — the\n // sequence always plays out so a fast backend still looks believable.\n useEffect(() => {\n if (complete || active >= n - 1) return\n const ms = items[active]?.durationMs ?? defaultStepMs\n const t = setTimeout(() => setActive((a) => Math.min(a + 1, n - 1)), ms)\n return () => clearTimeout(t)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [active, n, complete, defaultStepMs])\n\n // On the final step, hold for `minLastStepMs`, then complete if the work is already\n // `done` (synchronously, so it flushes) — otherwise mark the dwell done and wait.\n useEffect(() => {\n if (active !== n - 1) return\n const t = setTimeout(() => {\n minElapsedRef.current = true\n if (doneRef.current) fire()\n }, minLastStepMs)\n return () => clearTimeout(t)\n }, [active, n, minLastStepMs])\n\n // When the work finishes after the dwell has already elapsed, complete.\n useEffect(() => {\n if (active === n - 1 && done && minElapsedRef.current) fire()\n }, [done, active, n])\n\n return (\n <div className={['flex flex-col', className].filter(Boolean).join(' ')} role=\"status\" aria-live=\"polite\">\n {items.map((item, i) => {\n const state: StepState = complete || i < active ? 'done' : i === active ? 'active' : 'pending'\n const isLast = i === n - 1\n return (\n <div key={item.label} className=\"flex gap-3\">\n {/* marker + connector rail */}\n <div className=\"flex flex-col items-center\">\n <span\n className=\"inline-flex h-7 w-7 shrink-0 items-center justify-center rounded-[var(--radius-full)] transition-colors\"\n style={\n state === 'done'\n ? { background: 'rgb(var(--accent))', color: 'rgb(var(--surface-on-accent))' }\n : state === 'active'\n ? { boxShadow: 'inset 0 0 0 2px rgb(var(--accent))', color: 'rgb(var(--accent))' }\n : { boxShadow: 'inset 0 0 0 2px rgb(var(--border))', color: 'rgb(var(--text-muted))' }\n }\n aria-current={state === 'active' ? 'step' : undefined}\n >\n {state === 'done' ? (\n <Check className=\"h-4 w-4\" />\n ) : state === 'active' ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <span className=\"h-1.5 w-1.5 rounded-[var(--radius-full)]\" style={{ background: 'currentColor' }} />\n )}\n </span>\n {!isLast && (\n <span\n className=\"my-1 w-px flex-1 transition-colors\"\n style={{ minHeight: 12, background: i < active || complete ? 'rgb(var(--accent))' : 'rgb(var(--border))' }}\n />\n )}\n </div>\n {/* label */}\n <span\n className=\"pt-[5px] pb-2 text-[13.5px] leading-tight transition-colors\"\n style={{\n color: state === 'pending' ? 'rgb(var(--text-tertiary))' : 'rgb(var(--foreground))',\n fontWeight: state === 'active' ? 600 : 500,\n }}\n >\n {item.label}\n </span>\n </div>\n )\n })}\n </div>\n )\n}\n","/**\n * Badge — semantic pill chip with optional leading icon.\n *\n * Promoted in ADR-021 (Phase 3b Discovery Contacts, first committed\n * consumer — decision-maker level + salary range). Cross-batch\n * consumers: Phase 8 (keyword competition + brand-type), Phase 12\n * (validation severity).\n *\n * Distinct from EmptyPlaceholder + EmptyState + ChipNav.ChipNavItem —\n * this is the pure-pill labeled-chip primitive for inline use within\n * other components.\n *\n * Token discipline: all colors via public semantic tokens. Each tone\n * pairs a background-tint + foreground-color from the matching token\n * pair (--success / --success-bg, etc.).\n */\n\nimport type { ReactNode } from 'react'\n\nimport { cn } from './lib/utils'\n\nexport type BadgeTone =\n | 'neutral'\n | 'accent'\n | 'success'\n | 'warning'\n | 'destructive'\n | 'info'\n\nconst TONE_STYLE: Record<BadgeTone, { bg: string; color: string }> = {\n neutral: {\n bg: 'rgb(var(--surface-overlay))',\n color: 'rgb(var(--text-secondary))',\n },\n accent: {\n bg: 'rgb(var(--accent-subtle))',\n color: 'rgb(var(--accent))',\n },\n success: {\n bg: 'rgb(var(--success-bg))',\n color: 'rgb(var(--success))',\n },\n warning: {\n bg: 'rgb(var(--warning-bg))',\n color: 'rgb(var(--warning))',\n },\n destructive: {\n bg: 'rgb(var(--destructive) / 0.12)',\n color: 'rgb(var(--destructive))',\n },\n info: {\n bg: 'rgb(var(--info-bg))',\n color: 'rgb(var(--info))',\n },\n}\n\nexport interface BadgeProps {\n tone: BadgeTone\n children: ReactNode\n /** Optional leading icon — sized 12-14px expected. */\n icon?: ReactNode\n /** Leading status dot in the tone color (gray-ui chip style). Ignored\n * when `icon` is provided. */\n dot?: boolean\n /** Size variant. `sm` = compact (10px), `md` = default (11px),\n * `lg` = roomier category-chip (12px, taller). */\n size?: 'sm' | 'md' | 'lg'\n /** Extra classes merged onto the outer span (no longer replaces base). */\n className?: string\n}\n\nconst SIZE_CLASS: Record<NonNullable<BadgeProps['size']>, string> = {\n sm: 'text-[10px] px-1.5 py-0.5',\n md: 'text-[11px] px-2 py-0.5',\n lg: 'text-xs px-2.5 py-1',\n}\n\nexport function Badge({\n tone,\n children,\n icon,\n dot = false,\n size = 'md',\n className,\n}: BadgeProps) {\n const { bg, color } = TONE_STYLE[tone]\n return (\n <span\n className={cn(\n 'inline-flex w-fit items-center gap-1.5 font-medium whitespace-nowrap',\n SIZE_CLASS[size],\n className,\n )}\n style={{\n background: bg,\n color,\n borderRadius: 'var(--radius-full)',\n }}\n >\n {dot && !icon ? (\n <span\n aria-hidden\n className=\"size-1.5 shrink-0 rounded-full\"\n style={{ background: 'currentColor' }}\n />\n ) : null}\n {icon && <span className=\"flex-shrink-0\">{icon}</span>}\n {children}\n </span>\n )\n}\n","/**\n * TokenBadge — tinted, token-driven category badge.\n *\n * Promoted in ADR-123 (Budget Flighting redesign) from the lens-local\n * `TacticBadge`. Distinct from `<Badge>`: Badge carries only the 6 fixed\n * semantic tones (success / warning / …); TokenBadge tints from ANY public\n * token base name, so a categorical palette like `--folder-*` (tactic colors,\n * flight-group colors) works. The lens keeps a thin `TacticBadge` wrapper that\n * passes the matching `--folder-*` token.\n *\n * Token discipline: the only color input is a public token *name*; fill/border/\n * text are derived from it via `rgb(var(--token) / a)`. No literals.\n */\n\nimport type { ReactNode } from 'react'\n\nimport { cn } from './lib/utils'\n\nexport interface TokenBadgeProps {\n /** Public token name to tint from, e.g. `--folder-teal`, `--accent`,\n * `--success`. Must include the leading `--`. */\n colorVar: string\n children: ReactNode\n /** `soft` = tinted fill (default). `outline` = transparent fill + tinted\n * border. */\n variant?: 'soft' | 'outline'\n /** Optional leading status dot in the token color. Ignored when `icon` set. */\n dot?: boolean\n /** Optional leading icon (12–14px expected). */\n icon?: ReactNode\n /** `sm` (10px) · `md` (11px, default) · `lg` (12px, taller). */\n size?: 'sm' | 'md' | 'lg'\n /** Pill (`full`) vs squared category tag (`tag`, default). */\n shape?: 'tag' | 'pill'\n /** Uppercase + wider tracking for short category codes (PRG, YT…). */\n uppercase?: boolean\n className?: string\n}\n\nconst SIZE_CLASS: Record<NonNullable<TokenBadgeProps['size']>, string> = {\n sm: 'h-[18px] px-1.5 text-[10px]',\n md: 'h-5 px-2 text-[11px]',\n lg: 'h-[22px] px-2.5 text-xs',\n}\n\nexport function TokenBadge({\n colorVar,\n children,\n variant = 'soft',\n dot = false,\n icon,\n size = 'md',\n shape = 'tag',\n uppercase = false,\n className,\n}: TokenBadgeProps) {\n const solid = `rgb(var(${colorVar}))`\n const style =\n variant === 'outline'\n ? {\n background: 'transparent',\n color: solid,\n boxShadow: `inset 0 0 0 1px rgb(var(${colorVar}) / 0.4)`,\n }\n : { background: `rgb(var(${colorVar}) / 0.12)`, color: solid }\n\n return (\n <span\n className={cn(\n 'inline-flex w-fit shrink-0 items-center gap-1 font-bold whitespace-nowrap',\n uppercase && 'uppercase tracking-[0.06em]',\n SIZE_CLASS[size],\n className,\n )}\n style={{\n ...style,\n borderRadius:\n shape === 'pill' ? 'var(--radius-full)' : 'var(--radius-xs)',\n }}\n >\n {dot && !icon ? (\n <span\n aria-hidden\n className=\"size-1.5 shrink-0 rounded-full\"\n style={{ background: 'currentColor' }}\n />\n ) : null}\n {icon && <span className=\"flex shrink-0 items-center\">{icon}</span>}\n {children}\n </span>\n )\n}\n","/**\n * Copy-with-confirmation. Promoted from the extension's local helper so\n * the toast wording is identical everywhere a value is copyable.\n */\nimport { toast } from '../toast'\n\nexport async function copyText(value: string, label?: string): Promise<void> {\n try {\n await navigator.clipboard.writeText(value)\n toast.success(label ? `Copied ${label}` : `Copied ${value}`)\n } catch {\n toast.error('Copy failed')\n }\n}\n","/**\n * ValueChip — a monospace value sitting in a recessed well.\n *\n * The smallest unit of the tightened v2 language: any literal value the\n * user might want to read precisely or copy (a hex, an rgb triple, a\n * dimension, an id, a duration) renders the same way everywhere —\n * `--surface-inset` fill, hairline border, mono + tabular figures.\n *\n * Lifted from the extension's Colors/Fonts tabs, which had built this\n * three times locally as `.panel-inset` chips.\n *\n * Pass `copyValue` to make it a button that copies and toasts. Without\n * it the chip is inert text and renders as a <span>, so a read-only\n * value never advertises an interaction it doesn't have.\n */\nimport { forwardRef, type ButtonHTMLAttributes, type ReactNode } from 'react'\nimport { cn } from './lib/utils'\nimport { copyText } from './lib/clipboard'\n\nexport interface ValueChipProps\n extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'value'> {\n children: ReactNode\n /** Makes the chip copyable. The toast reads \"Copied <copyLabel>\". */\n copyValue?: string\n copyLabel?: string\n /** `sm` for dense rows (10px), `md` default (11px). */\n size?: 'sm' | 'md'\n /** Stretch to fill a flex row — the equal-thirds hex/rgb/hsl layout. */\n fill?: boolean\n}\n\nexport const ValueChip = forwardRef<HTMLButtonElement, ValueChipProps>(\n function ValueChip(\n { children, copyValue, copyLabel, size = 'md', fill, className, ...rest },\n ref,\n ) {\n const shared = cn(\n 'inline-flex items-center justify-center px-2 py-1 font-mono tabular-nums truncate',\n size === 'sm' ? 'text-[10px]' : 'text-[11px]',\n fill && 'flex-1 min-w-0',\n className,\n )\n const surface = {\n background: 'rgb(var(--surface-inset))',\n border: '1px solid rgb(var(--border))',\n borderRadius: 'var(--radius-sm)',\n color: 'rgb(var(--text-secondary))',\n } as const\n\n if (!copyValue) {\n return (\n <span className={shared} style={surface}>\n {children}\n </span>\n )\n }\n\n return (\n <button\n ref={ref}\n type=\"button\"\n onClick={() => void copyText(copyValue, copyLabel)}\n className={cn(\n shared,\n 'cursor-pointer transition-colors',\n 'hover:border-[rgb(var(--border-strong))] hover:text-[rgb(var(--foreground))]',\n 'focus-visible:outline-none focus-visible:[box-shadow:var(--ring-focus)]',\n )}\n style={surface}\n {...rest}\n >\n {children}\n </button>\n )\n },\n)\n","/**\n * MetaCell — a labelled fact in a recessed well.\n *\n * The second v2 atom: a micro uppercase label over a value, on\n * `--surface-inset`. Every \"Category / Elements found / Updated / Weight\"\n * pair in the product is this shape, and it had been hand-rolled per\n * lens with five different label sizes and four tracking values.\n *\n * Numbers get `tabular-nums` unconditionally — a MetaCell value is by\n * definition something you compare or watch update.\n */\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react'\nimport { cn } from './lib/utils'\n\nexport interface MetaCellProps extends HTMLAttributes<HTMLDivElement> {\n label: ReactNode\n children: ReactNode\n /** Optional leading glyph in the label row. */\n icon?: ReactNode\n}\n\nexport const MetaCell = forwardRef<HTMLDivElement, MetaCellProps>(\n function MetaCell({ label, children, icon, className, style, ...rest }, ref) {\n return (\n <div\n ref={ref}\n className={cn('flex flex-col gap-0.5 px-2.5 py-2 min-w-0', className)}\n style={{\n background: 'rgb(var(--surface-inset))',\n border: '1px solid rgb(var(--border))',\n borderRadius: 'var(--radius-sm)',\n ...style,\n }}\n {...rest}\n >\n <span\n className=\"inline-flex items-center gap-1 text-[9px] font-semibold uppercase tracking-[0.06em]\"\n style={{ color: 'rgb(var(--text-tertiary))' }}\n >\n {icon}\n {label}\n </span>\n <span\n className=\"text-[12px] font-semibold tabular-nums truncate\"\n style={{ color: 'rgb(var(--foreground))' }}\n >\n {children}\n </span>\n </div>\n )\n },\n)\n","/**\n * Colour maths for brand-palette surfaces — hex to rgb/hsl, WCAG contrast.\n *\n * Promoted from `apps/extension/src/sidepanel/color-utils.ts` when the\n * workspace's Brand Profile grew the same colour cards the extension's\n * Colors tab already had. Two consumers, one implementation — the same\n * rule the platform-chrome tokens were consolidated under.\n *\n * Pure functions, no deps, no DOM.\n */\n\nexport type RgbTuple = [number, number, number]\n\n/** Parse `#abc` or `#aabbcc` (with or without the hash) into an rgb tuple. */\nexport function hexToRgbTuple(hex: string): RgbTuple {\n const h = hex.replace('#', '')\n const full =\n h.length === 3\n ? h\n .split('')\n .map((c) => c + c)\n .join('')\n : h\n const r = parseInt(full.slice(0, 2), 16) || 0\n const g = parseInt(full.slice(2, 4), 16) || 0\n const b = parseInt(full.slice(4, 6), 16) || 0\n return [r, g, b]\n}\n\n/** `\"24, 119, 242\"` — display form, the inside of an `rgb()`. */\nexport function rgbString(hex: string): string {\n const [r, g, b] = hexToRgbTuple(hex)\n return `${r}, ${g}, ${b}`\n}\n\n/**\n * `\"rgb(24, 119, 242)\"` — a complete CSS value, for copying.\n *\n * Lives here rather than being assembled at the call site because the\n * token-boundary lint reads `rgb(...)` in app code as a raw colour\n * literal — correctly, since it cannot tell a clipboard string from a\n * style. packages/ui is the exempt substrate, so this is its job.\n */\nexport function rgbCss(hex: string): string {\n return `rgb(${rgbString(hex)})`\n}\n\n/** `\"217° 89% 52%\"` — display form, not a CSS value. */\nexport function hslString(hex: string): string {\n const [r, g, b] = hexToRgbTuple(hex).map((v) => v / 255) as RgbTuple\n const max = Math.max(r, g, b)\n const min = Math.min(r, g, b)\n const l = (max + min) / 2\n let h = 0\n let s = 0\n if (max !== min) {\n const d = max - min\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min)\n if (max === r) h = (g - b) / d + (g < b ? 6 : 0)\n else if (max === g) h = (b - r) / d + 2\n else h = (r - g) / d + 4\n h /= 6\n }\n return `${Math.round(h * 360)}° ${Math.round(s * 100)}% ${Math.round(l * 100)}%`\n}\n\n/** WCAG 2.1 relative luminance (sRGB). */\nexport function relativeLuminance(hex: string): number {\n const lin = hexToRgbTuple(hex).map((v) => {\n const c = v / 255\n return c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4)\n }) as RgbTuple\n return 0.2126 * lin[0] + 0.7152 * lin[1] + 0.0722 * lin[2]\n}\n\n/** Contrast ratio between two relative luminances. */\nexport function contrastRatio(a: number, b: number): number {\n const [hi, lo] = a > b ? [a, b] : [b, a]\n return (hi + 0.05) / (lo + 0.05)\n}\n\n/**\n * Whether black or white text reads better ON this colour, and at what\n * ratio. Used to pick a legible foreground for a swatch banner.\n */\nexport function bestTextOn(hex: string): { onLight: boolean; ratio: number } {\n const l = relativeLuminance(hex)\n const vsWhite = contrastRatio(l, 1)\n const vsBlack = contrastRatio(l, 0)\n return { onLight: vsBlack >= vsWhite, ratio: Math.max(vsWhite, vsBlack) }\n}\n\nexport interface WcagBadge {\n label: string\n pass: boolean\n}\n\n/**\n * The three standard thresholds, scored against the BEST of black-or-white\n * text on this swatch. It answers \"can any text sit on this colour\", which\n * is the useful question for a brand palette — not \"is this colour itself\n * readable\", which depends on a background the palette doesn't know.\n */\nexport function wcagBadges(hex: string): WcagBadge[] {\n const best = bestTextOn(hex).ratio\n return [\n { label: 'AA Large', pass: best >= 3 },\n { label: 'AA', pass: best >= 4.5 },\n { label: 'AAA', pass: best >= 7 },\n ]\n}\n","/**\n * AllocationSparkbar — a compact per-period bar strip.\n *\n * New in ADR-123 (Budget Flighting redesign). Renders one bar per period\n * (month), height proportional to the value; a zero/paused period renders\n * short + dashed in a muted tone. Each bar can tint from its own token (e.g. a\n * flight-group color), falling back to `baseColorVar`. Optional single-letter\n * labels sit under each bar.\n *\n * Token discipline: colors come only from public token *names* via\n * `rgb(var(--token) / a)`. No literals. Layout sizes use the spacing scale.\n */\n\nexport interface AllocationSparkbarProps {\n /** Per-period amounts. A value of 0 is treated as paused (short + dashed). */\n values: number[]\n /** Base token name for normal bars, e.g. `--folder-teal`. Includes `--`. */\n baseColorVar: string\n /** Optional per-period token name (e.g. a flight-group color). `null`/\n * `undefined` falls back to `baseColorVar`. Length should match `values`. */\n colorVars?: (string | null | undefined)[]\n /** Optional short labels under each bar (e.g. `['J','F','M']`). */\n labels?: string[]\n /** Optional per-bar tooltip text (native `title`). */\n titles?: string[]\n /** Strip height in px. Default 36. */\n height?: number\n className?: string\n}\n\nexport function AllocationSparkbar({\n values,\n baseColorVar,\n colorVars,\n labels,\n titles,\n height = 36,\n className,\n}: AllocationSparkbarProps) {\n const max = Math.max(...values, 1)\n return (\n <div\n className={className}\n style={{ display: 'flex', gap: 'var(--space-1)', alignItems: 'flex-end', height }}\n >\n {values.map((value, i) => {\n const paused = value === 0\n const barH = paused ? 4 : 8 + (value / max) * (height - 12)\n const colorVar = colorVars?.[i] ?? baseColorVar\n return (\n <div\n key={i}\n title={titles?.[i]}\n style={{\n flex: 1,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: 'var(--space-1)',\n minWidth: 0,\n }}\n >\n <div\n style={{\n width: '100%',\n height: barH,\n borderRadius: 'var(--radius-xs)',\n background: paused\n ? 'rgb(var(--text-muted) / 0.18)'\n : `rgb(var(${colorVar}) / 0.67)`,\n border: paused\n ? '1px dashed rgb(var(--text-muted) / 0.4)'\n : 'none',\n transition: 'background var(--dur-fast, 120ms)',\n }}\n />\n {labels?.[i] !== undefined && (\n <span\n className=\"text-[9.5px] font-semibold tracking-[0.02em]\"\n style={{ color: 'rgb(var(--text-muted))' }}\n >\n {labels[i]}\n </span>\n )}\n </div>\n )\n })}\n </div>\n )\n}\n","/**\n * FloatingStatusBar — a bottom-center floating status + summary + action bar.\n *\n * Promoted in ADR-123 (Budget Flighting redesign). The lens's budget tracker\n * and the creative-checker recon's \"StatusFooter\" both want this shape, so it\n * graduates to @lovett/ui. A tone dot + label, an optional secondary meta, an\n * optional summary node after a divider, and an optional single action slot.\n *\n * Honors `prefers-reduced-motion`: the entrance fade/slide is applied only\n * under `motion-safe`. Token discipline: all colors via public tokens.\n */\n\nimport type { ReactNode } from 'react'\n\nimport { cn } from './lib/utils'\n\nexport type FloatingStatusTone =\n | 'neutral'\n | 'accent'\n | 'success'\n | 'warning'\n | 'destructive'\n | 'info'\n\nconst TONE_VAR: Record<FloatingStatusTone, string> = {\n neutral: '--text-secondary',\n accent: '--accent',\n success: '--success',\n warning: '--warning',\n destructive: '--destructive',\n info: '--info',\n}\n\nexport interface FloatingStatusBarProps {\n /** Tone for the status dot + label color. */\n tone: FloatingStatusTone\n /** Primary status label (tone-colored, bold). */\n label: ReactNode\n /** Optional muted text after the label (e.g. a percentage). */\n meta?: ReactNode\n /** Optional summary node shown after a vertical divider (e.g. `$X → $Y`). */\n summary?: ReactNode\n /** Optional single action element (typically a secondary Button). */\n action?: ReactNode\n /** Override the fixed positioning (e.g. to embed in a story). Default fixed\n * bottom-center. */\n className?: string\n}\n\nexport function FloatingStatusBar({\n tone,\n label,\n meta,\n summary,\n action,\n className,\n}: FloatingStatusBarProps) {\n const toneColor = `rgb(var(${TONE_VAR[tone]}))`\n return (\n <div\n role=\"status\"\n className={cn(\n 'fixed bottom-4 left-1/2 z-30 flex -translate-x-1/2 items-center gap-3.5 px-3.5 py-2.5',\n 'ds-enter-rise',\n className,\n )}\n style={{\n background: 'rgb(var(--bg-card))',\n border: '1px solid rgb(var(--border-card))',\n borderRadius: 'var(--radius-xl)',\n boxShadow: 'var(--shadow-lg)',\n }}\n >\n <div className=\"flex items-center gap-2\">\n <span\n aria-hidden\n className=\"size-2 shrink-0 rounded-full\"\n style={{ background: toneColor }}\n />\n <span className=\"text-[12.5px] font-bold\" style={{ color: toneColor }}>\n {label}\n </span>\n {meta !== undefined && (\n <span\n className=\"text-[11px] tabular-nums\"\n style={{ color: 'rgb(var(--text-tertiary))' }}\n >\n {meta}\n </span>\n )}\n </div>\n\n {summary !== undefined && (\n <>\n <span\n aria-hidden\n className=\"h-[18px] w-px\"\n style={{ background: 'rgb(var(--border))' }}\n />\n <span\n className=\"text-[11.5px]\"\n style={{ color: 'rgb(var(--text-tertiary))' }}\n >\n {summary}\n </span>\n </>\n )}\n\n {action}\n </div>\n )\n}\n","/**\n * StatsGrid — auto-fit responsive grid for MetricCard rows.\n *\n * Promoted in ADR-022 (Phase 3c Discovery Analytics, first committed\n * consumer). Cross-batch consumers: Phase 3a (generation cost row),\n * Phase 8 (results summary), Phase 12 (review-overview summary).\n *\n * Tiny primitive — but stops the auto-fit grid pattern being\n * re-written 4+ times across the batch.\n */\n\nimport type { ReactNode } from 'react'\n\nexport interface StatsGridProps {\n children: ReactNode\n /** Minimum column width in px (controls how many cards per row at a\n * given viewport). Default 220 — comfortable for 4-up at md+. */\n minColumnWidth?: number\n /** Optional className override for the outer container. */\n className?: string\n}\n\nexport function StatsGrid({\n children,\n minColumnWidth = 220,\n className,\n}: StatsGridProps) {\n return (\n <div\n className={className ?? 'grid gap-3'}\n style={{\n gridTemplateColumns: `repeat(auto-fit, minmax(${minColumnWidth}px, 1fr))`,\n }}\n >\n {children}\n </div>\n )\n}\n","/**\n * SortableTable — generic sortable table with sticky header.\n *\n * Promoted in ADR-022 (Phase 3c Discovery reports table, first\n * committed consumer). Cross-batch consumers: Phase 8 keywords table,\n * Phase 12 SEMSpec keywords/extensions/locations tables.\n *\n * Numeric columns auto-apply tabular-nums + right-align. Click column\n * headers to sort. Sticky `<thead>` for scrollable bodies. Zebra-stripe\n * optional.\n *\n * Token discipline: all colors via public tokens.\n */\n\nimport { useMemo, useState, type ReactNode } from 'react'\nimport { ChevronDown, ChevronUp, ChevronsUpDown } from 'lucide-react'\n\nexport interface Column<T> {\n /** Unique id; doubles as the sort key. Use a `keyof T` string or\n * an arbitrary string if `sortValue` is provided. */\n id: string\n label: string\n /** How to render a cell for a row. */\n accessor: (row: T) => ReactNode\n /** Optional explicit value used for sorting (defaults to the\n * accessor's stringified output for sort comparison). */\n sortValue?: (row: T) => string | number | null | undefined\n sortable?: boolean\n /** Right-align + tabular-nums for numeric columns. Default false. */\n numeric?: boolean\n /** Header tooltip text. */\n tooltip?: string\n /** Width as a CSS value (e.g. `120px` or `20%`). */\n width?: string\n}\n\nexport interface SortableTableProps<T> {\n columns: Column<T>[]\n rows: T[]\n /** Function returning a stable React key for each row. */\n rowKey: (row: T) => string\n /** Initial sort. */\n initialSort?: { columnId: string; dir: 'asc' | 'desc' }\n /** Row click handler. */\n onRowClick?: (row: T) => void\n /** Rendered when rows.length === 0. */\n emptyState?: ReactNode\n /** Zebra stripe alternating rows. Default true. */\n zebra?: boolean\n /** Compact density (smaller padding). Default false. */\n compact?: boolean\n}\n\nexport function SortableTable<T>({\n columns,\n rows,\n rowKey,\n initialSort,\n onRowClick,\n emptyState,\n zebra = true,\n compact = false,\n}: SortableTableProps<T>) {\n const [sortColumnId, setSortColumnId] = useState<string | null>(\n initialSort?.columnId ?? null,\n )\n const [sortDir, setSortDir] = useState<'asc' | 'desc'>(\n initialSort?.dir ?? 'desc',\n )\n\n const sortedRows = useMemo(() => {\n if (!sortColumnId) return rows\n const col = columns.find((c) => c.id === sortColumnId)\n if (!col) return rows\n const valueOf = col.sortValue ?? ((row: T) => String(col.accessor(row)))\n const dir = sortDir === 'asc' ? 1 : -1\n return [...rows].sort((a, b) => {\n const va = valueOf(a)\n const vb = valueOf(b)\n if (va == null && vb == null) return 0\n if (va == null) return 1 * dir\n if (vb == null) return -1 * dir\n if (typeof va === 'number' && typeof vb === 'number') return (va - vb) * dir\n return String(va).localeCompare(String(vb)) * dir\n })\n }, [rows, sortColumnId, sortDir, columns])\n\n const handleHeaderClick = (col: Column<T>) => {\n if (!col.sortable) return\n if (sortColumnId === col.id) {\n setSortDir((d) => (d === 'asc' ? 'desc' : 'asc'))\n } else {\n setSortColumnId(col.id)\n setSortDir(col.numeric ? 'desc' : 'asc')\n }\n }\n\n if (rows.length === 0 && emptyState) {\n return <>{emptyState}</>\n }\n\n const cellPadding = compact ? 'px-2 py-1.5' : 'px-3 py-2.5'\n\n return (\n <div\n className=\"w-full overflow-x-auto border\"\n style={{\n borderColor: 'rgb(var(--border))',\n borderRadius: 'var(--radius-lg)',\n }}\n >\n <table className=\"w-full border-collapse text-[13px]\">\n <thead\n className=\"sticky top-0 z-10\"\n style={{ background: 'rgb(var(--surface-overlay-soft))' }}\n >\n <tr>\n {columns.map((col) => {\n const isSorted = sortColumnId === col.id\n const align = col.numeric ? 'text-right' : 'text-left'\n const ariaSort: 'ascending' | 'descending' | 'none' = !col.sortable\n ? 'none'\n : isSorted\n ? sortDir === 'asc'\n ? 'ascending'\n : 'descending'\n : 'none'\n return (\n <th\n key={col.id}\n scope=\"col\"\n aria-sort={ariaSort}\n title={col.tooltip}\n className={`${cellPadding} ${align} font-semibold border-b ${\n col.sortable ? 'cursor-pointer select-none' : ''\n }`}\n style={{\n color: 'rgb(var(--text-secondary))',\n borderColor: 'rgb(var(--border))',\n width: col.width,\n }}\n onClick={() => handleHeaderClick(col)}\n >\n <span className=\"inline-flex items-center gap-1\">\n {col.label}\n {col.sortable &&\n (isSorted ? (\n sortDir === 'asc' ? (\n <ChevronUp className=\"h-3 w-3\" />\n ) : (\n <ChevronDown className=\"h-3 w-3\" />\n )\n ) : (\n <ChevronsUpDown\n className=\"h-3 w-3 opacity-40\"\n aria-hidden\n />\n ))}\n </span>\n </th>\n )\n })}\n </tr>\n </thead>\n <tbody>\n {sortedRows.map((row, idx) => (\n <tr\n key={rowKey(row)}\n onClick={onRowClick ? () => onRowClick(row) : undefined}\n className={\n onRowClick ? 'cursor-pointer transition-colors' : undefined\n }\n style={{\n background:\n /* --surface-overlay-soft already carries an alpha; nesting a\n second one produced `rgb(0 0 0 / 0.03 / 0.5)` — invalid, so\n the banding never painted. --muted is the opaque zebra fill\n the data-display recipe (CLAUDE.md §2) calls for. */\n zebra && idx % 2 === 1\n ? 'rgb(var(--muted))'\n : 'transparent',\n }}\n >\n {columns.map((col) => (\n <td\n key={col.id}\n className={`${cellPadding} ${col.numeric ? 'text-right tabular-nums font-mono' : 'text-left'} border-b`}\n style={{\n borderColor: 'rgb(var(--border))',\n color: 'rgb(var(--foreground))',\n }}\n >\n {col.accessor(row)}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )\n}\n","/**\n * Pagination — \"Showing X-Y of Z\" + prev/next buttons.\n *\n * Promoted in ADR-022 (Phase 3c Discovery reports table, first\n * committed consumer). Cross-batch consumers: Phase 3b contacts\n * (when >50), Phase 8 keywords table, Phase 12 SEMSpec keywords tab.\n *\n * Stateless — parent owns currentPage state and provides onPageChange.\n *\n * Token discipline: all colors via public tokens.\n */\n\nimport { ChevronLeft, ChevronRight } from 'lucide-react'\n\nexport interface PaginationProps {\n /** 1-indexed current page. */\n currentPage: number\n /** Items per page. */\n pageSize: number\n /** Total item count across all pages. */\n totalItems: number\n onPageChange: (page: number) => void\n}\n\nexport function Pagination({\n currentPage,\n pageSize,\n totalItems,\n onPageChange,\n}: PaginationProps) {\n const totalPages = Math.max(1, Math.ceil(totalItems / pageSize))\n const firstItem = totalItems === 0 ? 0 : (currentPage - 1) * pageSize + 1\n const lastItem = Math.min(currentPage * pageSize, totalItems)\n const canPrev = currentPage > 1\n const canNext = currentPage < totalPages\n\n if (totalPages <= 1) return null\n\n return (\n <div className=\"flex items-center justify-between gap-3 py-2\">\n <div\n className=\"text-[12px] tabular-nums\"\n style={{ color: 'rgb(var(--text-tertiary))' }}\n >\n Showing {firstItem.toLocaleString()}–{lastItem.toLocaleString()} of{' '}\n {totalItems.toLocaleString()}\n </div>\n <div className=\"flex items-center gap-2\">\n <span\n className=\"text-[12px] tabular-nums\"\n style={{ color: 'rgb(var(--text-tertiary))' }}\n >\n Page {currentPage} of {totalPages}\n </span>\n <button\n type=\"button\"\n aria-label=\"Previous page\"\n disabled={!canPrev}\n onClick={() => onPageChange(currentPage - 1)}\n className=\"inline-flex h-7 w-7 items-center justify-center transition-colors disabled:cursor-not-allowed disabled:opacity-40\"\n style={{\n background: 'rgb(var(--surface-overlay))',\n color: 'rgb(var(--text-secondary))',\n borderRadius: 'var(--radius-sm)',\n }}\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </button>\n <button\n type=\"button\"\n aria-label=\"Next page\"\n disabled={!canNext}\n onClick={() => onPageChange(currentPage + 1)}\n className=\"inline-flex h-7 w-7 items-center justify-center transition-colors disabled:cursor-not-allowed disabled:opacity-40\"\n style={{\n background: 'rgb(var(--surface-overlay))',\n color: 'rgb(var(--text-secondary))',\n borderRadius: 'var(--radius-sm)',\n }}\n >\n <ChevronRight className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n )\n}\n","/**\n * Tabs — horizontal tab nav with optional leading icons.\n *\n * Promoted in ADR-023 (Phase 8 Keywords, first committed consumer).\n * Cross-batch consumers: Phase 12 SEMSpec (5-tab review dashboard),\n * Phase 3b Discovery (sub-tabs).\n *\n * Distinct from <ChipNav> (Phase 1 / Phase 7a) — ChipNav serves\n * section scroll-spy + section-nav-as-tabs on profile pages. <Tabs>\n * is the simpler horizontal-button-row for top-of-content tab navigation.\n *\n * Token discipline: all colors via public tokens. Active tab uses the\n * accent token; inactive uses text-tertiary.\n */\n\nimport type { ReactNode } from 'react'\n\nexport interface Tab {\n id: string\n label: string\n /** Optional Lucide icon (h-3.5 w-3.5 to h-4 w-4 expected). */\n icon?: ReactNode\n /** Optional count badge rendered after the label. */\n count?: number\n disabled?: boolean\n /** Accessible name for ICON-ONLY tabs (label rendered empty) — e.g. the\n * responsive platform switcher's compact tier (ADR-135). */\n ariaLabel?: string\n}\n\nexport interface TabsProps {\n tabs: Tab[]\n activeTabId: string\n onTabChange: (id: string) => void\n /** Compact (12px label) or default (13px). */\n size?: 'sm' | 'md'\n /** Underline (default) or pill active-state. */\n variant?: 'underline' | 'pill'\n /** Stretch the tablist to full width with equal-width, centred tabs. */\n stretch?: boolean\n className?: string\n}\n\nexport function Tabs({\n tabs,\n activeTabId,\n onTabChange,\n size = 'md',\n variant = 'underline',\n stretch = false,\n className,\n}: TabsProps) {\n const textSize = size === 'sm' ? 'text-[12px]' : 'text-[13px]'\n return (\n <div\n role=\"tablist\"\n className={\n className ??\n (variant === 'underline'\n ? `${stretch ? 'flex w-full' : 'inline-flex'} items-center gap-1 border-b`\n : `${stretch ? 'flex w-full' : 'inline-flex'} items-center gap-1 p-1`)\n }\n style={\n variant === 'underline'\n ? { borderColor: 'rgb(var(--border))' }\n : {\n background: 'rgb(var(--surface-overlay-soft))',\n border: '1px solid rgb(var(--border))',\n borderRadius: 'var(--radius-full)',\n }\n }\n >\n {tabs.map((tab) => {\n const isActive = tab.id === activeTabId\n const base = `inline-flex items-center gap-1.5 px-3 h-9 ${textSize} font-medium transition-colors${stretch ? ' flex-1 justify-center' : ''}`\n const underlineClass = `${base} border-b-2 -mb-px`\n const pillClass = `${base}`\n const className = variant === 'underline' ? underlineClass : pillClass\n\n const activeStyle =\n variant === 'underline'\n ? {\n color: 'rgb(var(--accent))',\n borderColor: 'rgb(var(--accent))',\n }\n : {\n // Pill variant — filled-accent active state.\n color: 'rgb(var(--primary-foreground))',\n background: 'rgb(var(--accent))',\n border: '1px solid rgb(var(--accent))',\n borderRadius: 'var(--radius-full)',\n }\n const inactiveStyle =\n variant === 'underline'\n ? {\n color: 'rgb(var(--text-tertiary))',\n borderColor: 'transparent',\n }\n : {\n color: 'rgb(var(--text-secondary))',\n background: 'transparent',\n border: '1px solid transparent',\n borderRadius: 'var(--radius-full)',\n }\n\n return (\n <button\n key={tab.id}\n role=\"tab\"\n type=\"button\"\n aria-selected={isActive}\n aria-label={tab.ariaLabel}\n disabled={tab.disabled}\n onClick={() => onTabChange(tab.id)}\n className={`${className} ${tab.disabled ? 'cursor-not-allowed opacity-40' : 'cursor-pointer'}`}\n style={isActive ? activeStyle : inactiveStyle}\n >\n {tab.icon && (\n <span className=\"flex-shrink-0\" aria-hidden>\n {tab.icon}\n </span>\n )}\n {tab.label}\n {tab.count !== undefined && (\n <span\n className=\"ml-0.5 inline-flex min-w-[1.1rem] items-center justify-center rounded-full px-1 text-[10.5px] font-semibold tabular-nums\"\n style={\n isActive && variant === 'pill'\n ? {\n background: 'rgb(var(--primary-foreground) / 0.22)',\n color: 'rgb(var(--primary-foreground))',\n }\n : {\n background: 'rgb(var(--surface-overlay))',\n color: 'rgb(var(--text-tertiary))',\n }\n }\n >\n {tab.count}\n </span>\n )}\n </button>\n )\n })}\n </div>\n )\n}\n","/**\n * PillButton — toggle-able filter pill with active / inactive states.\n *\n * Promoted in ADR-024 (Phase 12 SEMSpec keywords + extensions tab\n * filters, first committed consumer). Cross-batch consumers: Phase 8\n * Keywords (competition + brand-type filters).\n *\n * Distinct from <Badge> (read-only labeled chip) — PillButton is\n * always clickable and reflects active-state via accent tone.\n *\n * Compose 1+ PillButton inside a lens-local <FilterGroup> wrapper\n * when grouped with a label.\n *\n * Token discipline: all colors via public tokens.\n */\n\nimport type { ReactNode } from 'react'\nimport type { BadgeTone } from './badge'\n\n/**\n * Active (filled) tone map.\n *\n * This was an inverted copy of <Badge>'s TONE_STYLE: Badge pairs a tinted\n * `*-bg` fill with solid `*` text, and success/warning/info were copied\n * across with bg and color still in Badge's order — painting the label in\n * a 12%-alpha version of its own background. Measured contrast was ~1:1,\n * i.e. the label was not low-contrast, it was invisible.\n *\n * A filled pill needs a foreground that reads on a solid fill, which is\n * exactly what --surface-on-accent is for (ADR-049).\n *\n * KNOWN GAP: the solid semantic fills are themselves too light for white\n * at AA — warning is the worst (2.15:1 dark / 3.19:1 light). That is the\n * same defect Badge has in 6 of 12 tone x theme combos and it belongs to\n * the semantic-token retune, not here; fixing it per-component would bake\n * in a value the retune has to undo.\n */\nconst ACTIVE_STYLE: Record<BadgeTone, { bg: string; color: string }> = {\n neutral: {\n bg: 'rgb(var(--accent))',\n color: 'rgb(var(--surface-on-accent))',\n },\n accent: {\n bg: 'rgb(var(--accent))',\n color: 'rgb(var(--surface-on-accent))',\n },\n success: {\n bg: 'rgb(var(--success))',\n color: 'rgb(var(--surface-on-accent))',\n },\n warning: {\n bg: 'rgb(var(--warning))',\n color: 'rgb(var(--surface-on-accent))',\n },\n destructive: {\n bg: 'rgb(var(--destructive))',\n color: 'rgb(var(--destructive-foreground))',\n },\n info: {\n bg: 'rgb(var(--info))',\n color: 'rgb(var(--surface-on-accent))',\n },\n}\n\nexport interface PillButtonProps {\n active: boolean\n onClick: () => void\n children: ReactNode\n /** Size variant. `sm` = compact (12px), `md` = default (13px). */\n size?: 'sm' | 'md'\n /** Optional active-state tone. Default = accent. */\n tone?: BadgeTone\n /** Optional leading icon (12-14px). */\n icon?: ReactNode\n disabled?: boolean\n}\n\nexport function PillButton({\n active,\n onClick,\n children,\n size = 'md',\n tone = 'accent',\n icon,\n disabled,\n}: PillButtonProps) {\n const sizeClass = size === 'sm' ? 'text-[12px] px-2.5 h-7' : 'text-[13px] px-3 h-8'\n const activeStyle = ACTIVE_STYLE[tone]\n\n return (\n <button\n type=\"button\"\n aria-pressed={active}\n disabled={disabled}\n onClick={onClick}\n className={`inline-flex items-center gap-1.5 font-medium border transition-colors ${sizeClass} ${disabled ? 'cursor-not-allowed opacity-40' : 'cursor-pointer'}`}\n style={\n active\n ? {\n background: activeStyle.bg,\n color: activeStyle.color,\n borderColor: activeStyle.bg,\n borderRadius: 'var(--radius-full)',\n }\n : {\n background: 'transparent',\n color: 'rgb(var(--text-secondary))',\n borderColor: 'rgb(var(--border))',\n borderRadius: 'var(--radius-full)',\n }\n }\n >\n {icon && (\n <span className=\"flex-shrink-0\" aria-hidden>\n {icon}\n </span>\n )}\n {children}\n </button>\n )\n}\n","/**\n * Checkbox — workspace-native checkbox primitive.\n *\n * Inspired by gray-ui-csm `components/ui/checkbox.tsx` (MIT,\n * https://github.com/Jason-uxui/gray-ui-csm/blob/baf8346ac0c1160282e0b173de1bffc594d9c9c3/components/ui/checkbox.tsx)\n * — see packages/ui/licenses/gray-ui-csm-LICENSE.txt.\n *\n * BUILD_FRESH per ADR-025 DEVIATION-2: source ships on\n * `@base-ui/react/checkbox`, which is NOT in CLAUDE.md §1 allowed\n * deps. The shape (icon-in-square + indeterminate state +\n * accessible Root API) and the surface API (`checked`,\n * `indeterminate`, `onCheckedChange`) carry over; the implementation\n * is a native `<input type=\"checkbox\">` styled with our tokens.\n *\n * Workspace ADR: ADR-025\n * Ported 2026-05-18\n */\n\nimport {\n forwardRef,\n useEffect,\n useRef,\n type InputHTMLAttributes,\n} from 'react'\nimport { Check, Minus } from 'lucide-react'\nimport { cn } from './lib/utils'\n\nexport interface CheckboxProps\n extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'type' | 'onChange' | 'checked'\n > {\n checked?: boolean\n indeterminate?: boolean\n onCheckedChange?: (checked: boolean) => void\n}\n\nexport const Checkbox = forwardRef<HTMLInputElement, CheckboxProps>(\n function Checkbox(\n { checked, indeterminate, onCheckedChange, className, disabled, ...rest },\n forwardedRef,\n ) {\n const internalRef = useRef<HTMLInputElement | null>(null)\n\n // Compose forwarded ref + internal ref so we can drive\n // `.indeterminate` (a DOM-only property — not reflected as an\n // attribute and not settable via React props).\n const setRef = (node: HTMLInputElement | null) => {\n internalRef.current = node\n if (typeof forwardedRef === 'function') forwardedRef(node)\n else if (forwardedRef)\n (forwardedRef as { current: HTMLInputElement | null }).current = node\n }\n\n useEffect(() => {\n if (internalRef.current) {\n internalRef.current.indeterminate = Boolean(indeterminate)\n }\n }, [indeterminate])\n\n const isChecked = Boolean(checked)\n const isIndeterminate = Boolean(indeterminate)\n const showIcon = isChecked || isIndeterminate\n\n return (\n <span\n data-slot=\"checkbox\"\n data-state={\n isIndeterminate\n ? 'indeterminate'\n : isChecked\n ? 'checked'\n : 'unchecked'\n }\n className={cn(\n 'relative inline-flex items-center justify-center shrink-0',\n 'h-4 w-4 rounded-[4px]',\n 'transition-colors',\n disabled && 'opacity-50 cursor-not-allowed',\n className,\n )}\n style={{\n background: showIcon\n ? 'rgb(var(--accent))'\n : 'rgb(var(--bg-input))',\n border: showIcon\n ? '1.5px solid rgb(var(--accent))'\n : '1.5px solid rgb(var(--border-strong))',\n // Checkmark on the brand-red fill — matches the `.btn-primary`\n // pattern in styles.css (`color: white`) — fixed white reads\n // cleanly in both light and dark mode on the accent fill.\n color: 'white',\n }}\n >\n <input\n ref={setRef}\n type=\"checkbox\"\n checked={isChecked}\n disabled={disabled}\n onChange={(event) => onCheckedChange?.(event.target.checked)}\n className=\"absolute inset-0 cursor-pointer opacity-0 disabled:cursor-not-allowed\"\n {...rest}\n />\n {showIcon ? (\n isIndeterminate ? (\n <Minus className=\"h-3 w-3 pointer-events-none\" strokeWidth={3} />\n ) : (\n <Check className=\"h-3 w-3 pointer-events-none\" strokeWidth={3} />\n )\n ) : null}\n </span>\n )\n },\n)\n","/**\n * DropdownMenu — workspace-native dropdown menu primitive.\n *\n * Inspired by gray-ui-csm `components/ui/dropdown-menu.tsx` (MIT,\n * https://github.com/Jason-uxui/gray-ui-csm/blob/baf8346ac0c1160282e0b173de1bffc594d9c9c3/components/ui/dropdown-menu.tsx)\n * — see packages/ui/licenses/gray-ui-csm-LICENSE.txt.\n *\n * BUILD_FRESH per ADR-025 DEVIATION-3: source ships on\n * `@base-ui/react/menu`, which is NOT in CLAUDE.md §1 allowed deps.\n * The compound-component surface (Root / Trigger / Content / Item /\n * CheckboxItem / Separator / Label / Group) carries over; the\n * implementation is a lightweight React Context + Portal + outside-\n * click + Escape handler.\n *\n * Trigger styling per ADR-026 D4 (DQ-4 LIFT): the default trigger\n * inherits the secondary Button visual (rounded-xl, `--bg-card` fill,\n * 1px `--border`). Consumers can pass `asChild`-equivalent custom\n * trigger content; the wrapper applies the button-style classes\n * unless `unstyled` is set.\n *\n * Workspace ADR: ADR-025 (port) + ADR-026 D4 (trigger spec)\n * Ported 2026-05-18\n */\n\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useId,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type ButtonHTMLAttributes,\n type HTMLAttributes,\n type ReactNode,\n} from 'react'\nimport { createPortal } from 'react-dom'\nimport { Check } from 'lucide-react'\nimport { cn } from './lib/utils'\n\ntype Align = 'start' | 'center' | 'end'\ntype Side = 'top' | 'bottom'\n\ninterface DropdownMenuContextValue {\n open: boolean\n setOpen: (next: boolean) => void\n triggerRef: React.RefObject<HTMLButtonElement | null>\n contentId: string\n}\n\nconst DropdownMenuCtx = createContext<DropdownMenuContextValue | null>(null)\n\nfunction useDropdownMenuCtx(consumer: string): DropdownMenuContextValue {\n const ctx = useContext(DropdownMenuCtx)\n if (!ctx) {\n throw new Error(\n `${consumer} must be rendered inside <DropdownMenu>. ` +\n `Wrap your trigger + content with the DropdownMenu root component.`,\n )\n }\n return ctx\n}\n\nexport interface DropdownMenuProps {\n /** Controlled open state. Omit for internal state. */\n open?: boolean\n /** Fires whenever open transitions. */\n onOpenChange?: (open: boolean) => void\n defaultOpen?: boolean\n children: ReactNode\n}\n\nexport function DropdownMenu({\n open: controlledOpen,\n onOpenChange,\n defaultOpen,\n children,\n}: DropdownMenuProps) {\n const [uncontrolledOpen, setUncontrolledOpen] = useState(\n Boolean(defaultOpen),\n )\n const isControlled = controlledOpen !== undefined\n const open = isControlled ? Boolean(controlledOpen) : uncontrolledOpen\n const triggerRef = useRef<HTMLButtonElement | null>(null)\n const generatedId = useId()\n const contentId = `dropdown-${generatedId.replace(/:/g, '')}`\n\n const setOpen = useCallback(\n (next: boolean) => {\n if (!isControlled) setUncontrolledOpen(next)\n onOpenChange?.(next)\n },\n [isControlled, onOpenChange],\n )\n\n const value = useMemo<DropdownMenuContextValue>(\n () => ({ open, setOpen, triggerRef, contentId }),\n [open, setOpen, contentId],\n )\n\n return (\n <DropdownMenuCtx.Provider value={value}>\n {children}\n </DropdownMenuCtx.Provider>\n )\n}\n\nexport interface DropdownMenuTriggerProps\n extends ButtonHTMLAttributes<HTMLButtonElement> {\n /** Skip the default secondary-Button styling. Useful when wrapping\n * an existing Button primitive. */\n unstyled?: boolean\n}\n\n/**\n * Default trigger styled per ADR-026 D4 (DQ-4) — inherits the\n * secondary Button visual (rounded-xl + `--bg-card` fill + 1px\n * `--border`). Set `unstyled` to wrap your own button shape.\n */\nexport function DropdownMenuTrigger({\n unstyled,\n className,\n onClick,\n children,\n ...rest\n}: DropdownMenuTriggerProps) {\n const { open, setOpen, triggerRef, contentId } =\n useDropdownMenuCtx('DropdownMenuTrigger')\n\n return (\n <button\n ref={triggerRef}\n type=\"button\"\n aria-haspopup=\"menu\"\n aria-expanded={open}\n aria-controls={open ? contentId : undefined}\n className={cn(\n !unstyled && 'btn btn-secondary',\n className,\n )}\n onClick={(event) => {\n onClick?.(event)\n if (!event.defaultPrevented) setOpen(!open)\n }}\n {...rest}\n >\n {children}\n </button>\n )\n}\n\nexport interface DropdownMenuContentProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {\n children: ReactNode\n /** Horizontal alignment relative to the trigger. Default `start`. */\n align?: Align\n /** Pixel offset along the alignment axis. Default 0. */\n alignOffset?: number\n /** Place above (`top`) or below (`bottom`) the trigger. Default `bottom`. */\n side?: Side\n /** Pixel offset along the side axis. Default 6. */\n sideOffset?: number\n}\n\nexport function DropdownMenuContent({\n children,\n align = 'start',\n alignOffset = 0,\n side = 'bottom',\n sideOffset = 6,\n className,\n style,\n ...rest\n}: DropdownMenuContentProps) {\n const { open, setOpen, triggerRef, contentId } =\n useDropdownMenuCtx('DropdownMenuContent')\n const contentRef = useRef<HTMLDivElement | null>(null)\n const [position, setPosition] = useState<{ left: number; top: number } | null>(\n null,\n )\n\n // Position relative to the trigger viewport rect. We measure on\n // open + on layout changes (scroll / resize) so the panel tracks.\n useLayoutEffect(() => {\n if (!open) {\n setPosition(null)\n return\n }\n const measure = () => {\n const triggerEl = triggerRef.current\n const contentEl = contentRef.current\n if (!triggerEl || !contentEl) return\n const triggerRect = triggerEl.getBoundingClientRect()\n const contentRect = contentEl.getBoundingClientRect()\n\n let left = triggerRect.left + alignOffset\n if (align === 'end') left = triggerRect.right - contentRect.width - alignOffset\n else if (align === 'center')\n left =\n triggerRect.left +\n triggerRect.width / 2 -\n contentRect.width / 2 +\n alignOffset\n\n let top =\n side === 'bottom'\n ? triggerRect.bottom + sideOffset\n : triggerRect.top - contentRect.height - sideOffset\n\n // Keep on-screen — clamp to viewport with an 8px gutter.\n const gutter = 8\n const maxLeft = window.innerWidth - contentRect.width - gutter\n const maxTop = window.innerHeight - contentRect.height - gutter\n left = Math.max(gutter, Math.min(left, maxLeft))\n top = Math.max(gutter, Math.min(top, maxTop))\n\n setPosition({ left, top })\n }\n\n measure()\n window.addEventListener('resize', measure)\n window.addEventListener('scroll', measure, true)\n return () => {\n window.removeEventListener('resize', measure)\n window.removeEventListener('scroll', measure, true)\n }\n }, [open, align, alignOffset, side, sideOffset, triggerRef])\n\n // Outside-click + Escape dismissal.\n useEffect(() => {\n if (!open) return\n const onPointerDown = (event: PointerEvent) => {\n const target = event.target as Node | null\n if (!target) return\n if (contentRef.current?.contains(target)) return\n if (triggerRef.current?.contains(target)) return\n setOpen(false)\n }\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n event.stopPropagation()\n setOpen(false)\n triggerRef.current?.focus()\n }\n }\n document.addEventListener('pointerdown', onPointerDown)\n document.addEventListener('keydown', onKeyDown)\n return () => {\n document.removeEventListener('pointerdown', onPointerDown)\n document.removeEventListener('keydown', onKeyDown)\n }\n }, [open, setOpen, triggerRef])\n\n if (!open || typeof document === 'undefined') return null\n\n // Two-phase render: first paint measures the content invisibly at\n // (0,0) with opacity:0, useLayoutEffect computes the real position,\n // and the second paint applies the correct coords + entrance animation.\n // The animation classes are gated behind `isPositioned` so the\n // entrance never fires from the unpositioned location — that's what\n // caused the \"flash at top of viewport then jump under the trigger\"\n // glitch.\n const isPositioned = position !== null\n\n return createPortal(\n <div\n ref={contentRef}\n id={contentId}\n role=\"menu\"\n data-slot=\"dropdown-menu-content\"\n data-state=\"open\"\n data-positioned={isPositioned ? 'true' : 'false'}\n className={cn(\n 'fixed z-[100] min-w-48 max-w-[min(28rem,calc(100vw-16px))]',\n 'p-1.5 overflow-y-auto',\n 'rounded-[var(--radius-lg)]',\n isPositioned && 'ds-enter-pop',\n className,\n )}\n style={{\n // Anchor the unpositioned phase WAY off-screen as a defense\n // against any browser/renderer that doesn't fully respect\n // visibility:hidden during a same-frame double-render. If the\n // first paint slips through, it's at (-99999, -99999), not at\n // viewport (0, 0) where a left-edge flash would be visible.\n left: position?.left ?? -99999,\n top: position?.top ?? -99999,\n opacity: isPositioned ? undefined : 0,\n pointerEvents: isPositioned ? undefined : 'none',\n visibility: isPositioned ? 'visible' : 'hidden',\n background: 'rgb(var(--popover))',\n color: 'rgb(var(--popover-foreground))',\n border: '1px solid rgb(var(--border))',\n boxShadow: 'var(--shadow-lg, 0 10px 32px rgba(0,0,0,0.18))',\n ...style,\n }}\n {...rest}\n >\n {children}\n </div>,\n document.body,\n )\n}\n\nexport interface DropdownMenuItemProps\n extends ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: 'default' | 'destructive'\n /** Pad-left compensation so items with no leading icon align with\n * items that have one. */\n inset?: boolean\n}\n\nexport function DropdownMenuItem({\n variant = 'default',\n inset,\n className,\n onClick,\n children,\n ...rest\n}: DropdownMenuItemProps) {\n const { setOpen } = useDropdownMenuCtx('DropdownMenuItem')\n return (\n <button\n role=\"menuitem\"\n type=\"button\"\n data-slot=\"dropdown-menu-item\"\n data-variant={variant}\n className={cn(\n 'group relative flex w-full cursor-default items-center gap-2.5',\n 'rounded-[var(--radius-md)] px-3 py-2 text-sm font-medium',\n 'outline-none text-left',\n 'transition-colors',\n 'hover:bg-[rgb(var(--surface-overlay))]',\n 'focus-visible:bg-[rgb(var(--surface-overlay))]',\n 'disabled:pointer-events-none disabled:opacity-50',\n inset && 'pl-9',\n variant === 'destructive' && 'text-[rgb(var(--destructive))]',\n className,\n )}\n onClick={(event) => {\n onClick?.(event)\n if (!event.defaultPrevented) setOpen(false)\n }}\n {...rest}\n >\n {children}\n </button>\n )\n}\n\nexport interface DropdownMenuCheckboxItemProps\n extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'onChange'> {\n checked?: boolean\n onCheckedChange?: (checked: boolean) => void\n}\n\nexport function DropdownMenuCheckboxItem({\n checked,\n onCheckedChange,\n className,\n children,\n onClick,\n disabled,\n ...rest\n}: DropdownMenuCheckboxItemProps) {\n return (\n <button\n role=\"menuitemcheckbox\"\n type=\"button\"\n data-slot=\"dropdown-menu-checkbox-item\"\n aria-checked={Boolean(checked)}\n disabled={disabled}\n className={cn(\n 'group relative flex w-full cursor-default items-center gap-2.5',\n 'rounded-[var(--radius-md)] py-2 pl-3 pr-8 text-sm font-medium',\n 'outline-none text-left',\n 'transition-colors',\n 'hover:bg-[rgb(var(--surface-overlay))]',\n 'focus-visible:bg-[rgb(var(--surface-overlay))]',\n 'disabled:pointer-events-none disabled:opacity-50',\n className,\n )}\n onClick={(event) => {\n onClick?.(event)\n if (!event.defaultPrevented) onCheckedChange?.(!checked)\n }}\n {...rest}\n >\n {children}\n {checked ? (\n <span\n className=\"pointer-events-none absolute right-2 flex items-center justify-center\"\n data-slot=\"dropdown-menu-checkbox-item-indicator\"\n >\n <Check className=\"h-3.5 w-3.5\" />\n </span>\n ) : null}\n </button>\n )\n}\n\nexport function DropdownMenuSeparator({\n className,\n ...rest\n}: HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n role=\"separator\"\n data-slot=\"dropdown-menu-separator\"\n className={cn('-mx-1.5 my-1.5 h-px', className)}\n style={{ background: 'rgb(var(--border))' }}\n {...rest}\n />\n )\n}\n\nexport interface DropdownMenuLabelProps\n extends HTMLAttributes<HTMLDivElement> {\n inset?: boolean\n}\n\nexport function DropdownMenuLabel({\n inset,\n className,\n ...rest\n}: DropdownMenuLabelProps) {\n return (\n <div\n data-slot=\"dropdown-menu-label\"\n className={cn(\n 'px-3 py-2 text-[11px] font-semibold uppercase tracking-[0.4px]',\n inset && 'pl-9',\n className,\n )}\n style={{ color: 'rgb(var(--text-muted))' }}\n {...rest}\n />\n )\n}\n\nexport function DropdownMenuGroup({\n className,\n ...rest\n}: HTMLAttributes<HTMLDivElement>) {\n return (\n <div role=\"group\" data-slot=\"dropdown-menu-group\" className={className} {...rest} />\n )\n}\n","/**\n * DrawerPanel — cell-detail side drawer for the DataGrid.\n *\n * Ported 2026-05-18 from gray-ui-csm\n * https://github.com/Jason-uxui/gray-ui-csm/blob/baf8346ac0c1160282e0b173de1bffc594d9c9c3/components/data-grid/drawer-panel.tsx\n * License: MIT (see packages/ui/licenses/gray-ui-csm-LICENSE.txt)\n * Workspace ADR: ADR-025\n *\n * BRING_WITH_REFACTOR (load-bearing) per ADR-025 D5:\n * • Source mounts inside a `@base-ui/react/dialog` Root, reading\n * open + close through Dialog context. CLAUDE.md §1 forbids\n * `@base-ui/react`. This port rewires to the workspace\n * <FloatingDrawer side=\"right\">, which the orchestrator drives\n * via explicit `isOpen` + `onClose` props (see data-grid.tsx).\n * • The header title/description, body content (cell value tile +\n * metadata <dl>), and footer Close button all carry over —\n * chrome is supplied by FloatingDrawer's title + children +\n * footer slots.\n * • `modal` / `size` pass through to FloatingDrawer.\n *\n * Token reskin per ADR-025 D7. Icons replaced by Lucide imports\n * (workspace doesn't ship the source's tabler set; CLAUDE.md §6).\n */\n\nimport type { ReactNode } from 'react'\n\nimport { Button } from '../button'\nimport { FloatingDrawer } from '../floating-drawer'\n\nimport type { DataGridColumn } from './types'\n\ntype DrawerPanelProps<Row, ColumnId extends string> = {\n isOpen: boolean\n onClose: () => void\n drawerRow: Row | null\n drawerColumn: DataGridColumn<ColumnId> | null\n drawerCellValue: ReactNode\n getRowLabel: (row: Row) => string\n isEditableColumn: (columnId: ColumnId) => boolean\n isEmptyValue: (value: ReactNode) => boolean\n /** Optional — controls FloatingDrawer modal mode. Defaults to false\n * (matches the source's `modal={drawerModal}` default). */\n modal?: boolean\n /** Pixel width of the drawer panel. Defaults to FloatingDrawer's\n * 520 for `side=\"right\"`. */\n size: number | undefined\n}\n\nexport function DrawerPanel<Row, ColumnId extends string>({\n isOpen,\n onClose,\n drawerRow,\n drawerColumn,\n drawerCellValue,\n getRowLabel,\n isEditableColumn,\n isEmptyValue,\n modal = false,\n size,\n}: DrawerPanelProps<Row, ColumnId>) {\n const title = (\n <div className=\"min-w-0\">\n <div className=\"truncate text-sm font-medium\">\n {drawerRow ? getRowLabel(drawerRow) : 'Record'} ·{' '}\n {drawerColumn?.label ?? 'Details'}\n </div>\n <div\n className=\"text-xs\"\n style={{ color: 'rgb(var(--text-muted))' }}\n >\n Context panel for the selected cell.\n </div>\n </div>\n )\n\n const footer = (\n <Button variant=\"outline\" onClick={onClose}>\n Close\n </Button>\n )\n\n return (\n <FloatingDrawer\n isOpen={isOpen}\n onClose={onClose}\n side=\"right\"\n modal={modal}\n {...(size !== undefined ? { size } : {})}\n title={title}\n footer={footer}\n >\n <div className=\"space-y-4\">\n <div\n className=\"rounded-[var(--radius-md)] p-3\"\n style={{\n background: 'rgb(var(--surface-overlay-soft))',\n border: '1px solid rgb(var(--border))',\n }}\n >\n <div\n className=\"text-xs\"\n style={{ color: 'rgb(var(--text-muted))' }}\n >\n Cell value\n </div>\n <div\n className=\"mt-1 break-words text-sm\"\n style={{ color: 'rgb(var(--foreground))' }}\n >\n {!isEmptyValue(drawerCellValue) ? drawerCellValue : 'Empty'}\n </div>\n </div>\n\n <dl className=\"grid gap-3 text-sm\">\n <div className=\"flex items-center justify-between gap-3\">\n <dt style={{ color: 'rgb(var(--text-muted))' }}>Record</dt>\n <dd\n className=\"text-right font-medium\"\n style={{ color: 'rgb(var(--foreground))' }}\n >\n {drawerRow ? getRowLabel(drawerRow) : '-'}\n </dd>\n </div>\n <div className=\"flex items-center justify-between gap-3\">\n <dt style={{ color: 'rgb(var(--text-muted))' }}>Field</dt>\n <dd\n className=\"text-right font-medium\"\n style={{ color: 'rgb(var(--foreground))' }}\n >\n {drawerColumn?.label ?? '-'}\n </dd>\n </div>\n <div className=\"flex items-center justify-between gap-3\">\n <dt style={{ color: 'rgb(var(--text-muted))' }}>Editable</dt>\n <dd\n className=\"text-right font-medium\"\n style={{ color: 'rgb(var(--foreground))' }}\n >\n {drawerColumn && isEditableColumn(drawerColumn.id) ? 'Yes' : 'No'}\n </dd>\n </div>\n </dl>\n </div>\n </FloatingDrawer>\n )\n}\n","/**\n * Table* — thin <table> / <thead> / <tbody> sub-components used\n * internally by DataGrid.\n *\n * Inlined locally (NOT promoted to a top-level @lovett/ui Table\n * primitive) per ADR-025 DEVIATION-1. Recon §5 anticipated this\n * (\"Probably LEAVE_BEHIND — DataGrid's table-view supersedes a\n * standalone Table primitive\"); the deviation realizes that\n * assumption by keeping these wrappers scoped to data-grid/.\n *\n * Inspired by gray-ui-csm `components/ui/table.tsx` (MIT,\n * https://github.com/Jason-uxui/gray-ui-csm/blob/baf8346ac0c1160282e0b173de1bffc594d9c9c3/components/ui/table.tsx)\n * — see packages/ui/licenses/gray-ui-csm-LICENSE.txt.\n *\n * Workspace ADR: ADR-025\n * Ported 2026-05-18\n */\n\nimport {\n forwardRef,\n type HTMLAttributes,\n type ThHTMLAttributes,\n type TdHTMLAttributes,\n} from 'react'\nimport { cn } from '../lib/utils'\n\nexport const Table = forwardRef<\n HTMLTableElement,\n HTMLAttributes<HTMLTableElement> & { containerClassName?: string | undefined }\n>(function Table({ className, containerClassName, ...props }, ref) {\n return (\n <div\n className={cn('relative w-full overflow-auto', containerClassName)}\n style={{\n border: '1px solid rgb(var(--border))',\n borderRadius: 'var(--radius-lg)',\n // NOTE: intentionally NOT setting scrollbar-width / scrollbar-color.\n // On macOS, any custom scrollbar property opts the element out of the\n // platform's auto-hiding *overlay* scrollbars into *classic*\n // always-visible ones — which left the vertical bar permanently\n // covering the pinned action column. Native overlay bars are already\n // thin + light AND auto-hide, so we leave them untouched.\n }}\n >\n <table\n ref={ref}\n className={cn('w-full caption-bottom text-sm', className)}\n {...props}\n />\n </div>\n )\n})\n\nexport const TableHeader = forwardRef<\n HTMLTableSectionElement,\n HTMLAttributes<HTMLTableSectionElement>\n>(function TableHeader({ className, ...props }, ref) {\n return (\n <thead\n ref={ref}\n className={cn(className)}\n style={{ borderBottom: '1px solid rgb(var(--border))' }}\n {...props}\n />\n )\n})\n\nexport const TableBody = forwardRef<\n HTMLTableSectionElement,\n HTMLAttributes<HTMLTableSectionElement>\n>(function TableBody({ className, ...props }, ref) {\n return (\n <tbody\n ref={ref}\n className={cn('[&_tr:last-child]:border-0', className)}\n {...props}\n />\n )\n})\n\nexport const TableFooter = forwardRef<\n HTMLTableSectionElement,\n HTMLAttributes<HTMLTableSectionElement>\n>(function TableFooter({ className, ...props }, ref) {\n return (\n <tfoot\n ref={ref}\n className={cn('font-normal [&>tr]:last:border-b-0', className)}\n style={{\n borderTop: '1px solid rgb(var(--border))',\n background: 'rgb(var(--surface-overlay-soft))',\n }}\n {...props}\n />\n )\n})\n\nexport const TableRow = forwardRef<\n HTMLTableRowElement,\n HTMLAttributes<HTMLTableRowElement>\n>(function TableRow({ className, ...props }, ref) {\n // border-b is a Tailwind class so the `[&_tr:last-child]:border-0`\n // selector on <TableBody> can override it. (Previously this was an\n // inline style, which `border-0` couldn't override — combined with\n // the new outer container border it would have produced a double\n // line on the bottom edge.)\n return (\n <tr\n ref={ref}\n className={cn(\n 'transition-colors',\n 'border-b border-[rgb(var(--border))]',\n 'hover:bg-[rgb(var(--surface-overlay-soft))]',\n 'data-[state=selected]:bg-[rgb(var(--surface-overlay))]',\n className,\n )}\n {...props}\n />\n )\n})\n\nexport const TableHead = forwardRef<\n HTMLTableCellElement,\n ThHTMLAttributes<HTMLTableCellElement>\n>(function TableHead({ className, ...props }, ref) {\n return (\n <th\n ref={ref}\n className={cn('h-10 px-4 text-left align-middle font-medium', className)}\n style={{ color: 'rgb(var(--text-muted))' }}\n {...props}\n />\n )\n})\n\nexport const TableCell = forwardRef<\n HTMLTableCellElement,\n TdHTMLAttributes<HTMLTableCellElement>\n>(function TableCell({ className, ...props }, ref) {\n return <td ref={ref} className={cn('p-4 align-middle', className)} {...props} />\n})\n","/**\n * SortableHeaderCell + SortableColumnOptionItem — dnd-kit-driven\n * column reorder UI.\n *\n * Ported 2026-05-18 from gray-ui-csm\n * https://github.com/Jason-uxui/gray-ui-csm/blob/baf8346ac0c1160282e0b173de1bffc594d9c9c3/components/data-grid/sortable-parts.tsx\n * License: MIT (see packages/ui/licenses/gray-ui-csm-LICENSE.txt)\n * Workspace ADR: ADR-025\n *\n * BRING_WITH_REFACTOR:\n * • Token reskin to workspace vocabulary per ADR-025 D7\n * • @tabler/icons-react → lucide-react per CLAUDE.md §6 (DEV-4)\n * • Imports DropdownMenuCheckboxItem from the workspace\n * dropdown-menu (BUILD_FRESH per DEV-3) and TableHead from the\n * local table-elements (inlined per DEV-1)\n */\n\nimport { useRef } from 'react'\nimport type {\n CSSProperties,\n KeyboardEvent as ReactKeyboardEvent,\n PointerEvent as ReactPointerEvent,\n} from 'react'\n\nimport { useSortable } from '@dnd-kit/sortable'\nimport { CSS } from '@dnd-kit/utilities'\nimport { ChevronDown, ChevronsUpDown, ChevronUp, GripVertical } from 'lucide-react'\n\nimport { cn } from '../lib/utils'\nimport { DropdownMenuCheckboxItem } from '../dropdown-menu'\nimport { TableHead } from './table-elements'\n\nimport type { DataGridColumn } from './types'\n\ntype SortableHeaderCellProps<ColumnId extends string> = {\n column: DataGridColumn<ColumnId>\n width: number\n onResize: (\n event: ReactPointerEvent<HTMLButtonElement>,\n columnId: ColumnId,\n ) => void\n /** ADR-027 — current sort direction for THIS column, or null when this\n * column is not the active sort. */\n sortDir: 'asc' | 'desc' | null\n /** ADR-027 — header click handler. When omitted the header is non-\n * interactive for sort (column reorder + resize still work). */\n onSortChange: ((columnId: ColumnId) => void) | undefined\n /** Extra style merged onto the <th> (sticky/pinned positioning, opaque\n * background + scroll-shadow). Spread last so it wins over the base. */\n cellStyle?: CSSProperties\n}\n\ntype SortableColumnOptionItemProps<ColumnId extends string> = {\n column: DataGridColumn<ColumnId>\n checked: boolean\n disabled: boolean\n onCheckedChange: (checked: boolean) => void\n}\n\nfunction ColumnHead<ColumnId extends string>({\n icon: Icon,\n label,\n}: Pick<DataGridColumn<ColumnId>, 'icon' | 'label'>) {\n // `leading-tight` (1.25) keeps the header compact but gives descenders\n // ('y','g','p','q') enough vertical room so they don't get clipped by\n // the parent th's overflow-hidden. The previous `leading-none` (= font\n // size) clipped the bottom of descenders.\n return (\n <span className=\"flex min-w-0 items-center gap-1.5 leading-tight\">\n <Icon className=\"h-3.5 w-3.5 shrink-0\" />\n <span className=\"truncate\">{label}</span>\n </span>\n )\n}\n\nexport function SortableColumnOptionItem<ColumnId extends string>({\n column,\n checked,\n disabled,\n onCheckedChange,\n}: SortableColumnOptionItemProps<ColumnId>) {\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({\n id: column.id,\n disabled,\n })\n\n return (\n <div\n ref={setNodeRef}\n style={{\n transform: CSS.Translate.toString(transform),\n transition,\n }}\n >\n <DropdownMenuCheckboxItem\n checked={checked}\n disabled={disabled}\n onCheckedChange={(next) => onCheckedChange(next === true)}\n className={cn(\n 'touch-none pl-1.5',\n isDragging && 'opacity-70',\n )}\n style={isDragging ? { background: 'rgb(var(--surface-overlay))' } : undefined}\n >\n <span\n {...attributes}\n {...listeners}\n role=\"button\"\n aria-label={`Reorder ${column.label}`}\n onClick={(event) => {\n event.preventDefault()\n event.stopPropagation()\n }}\n className=\"inline-flex h-5 w-5 shrink-0 cursor-grab items-center justify-center rounded-[4px] transition-colors active:cursor-grabbing\"\n style={{ color: 'rgb(var(--text-muted))' }}\n >\n <GripVertical className=\"h-3.5 w-3.5\" />\n </span>\n <span className=\"truncate\">{column.label}</span>\n </DropdownMenuCheckboxItem>\n </div>\n )\n}\n\nexport function SortableHeaderCell<ColumnId extends string>({\n column,\n width,\n onResize,\n sortDir,\n onSortChange,\n cellStyle,\n}: SortableHeaderCellProps<ColumnId>) {\n // ADR-027 — column sortability: explicit `sortable: false` opts out;\n // missing `onSortChange` also disables (no parent handler).\n // Suppress the sort click that the browser fires after a resize\n // interaction (drag OR a stray click on the resize handle), so resizing\n // never accidentally toggles the sort.\n const justResizedRef = useRef(false)\n const isSortable =\n column.sortable !== false && typeof onSortChange === 'function'\n const ariaSort: 'ascending' | 'descending' | 'none' = !isSortable\n ? 'none'\n : sortDir === 'asc'\n ? 'ascending'\n : sortDir === 'desc'\n ? 'descending'\n : 'none'\n\n function handleSortClick() {\n if (!isSortable) return\n if (justResizedRef.current) return\n onSortChange!(column.id)\n }\n\n function handleResizePointerDown(event: ReactPointerEvent<HTMLButtonElement>) {\n // Don't bubble the resize-pointer-down up to the th's onClick sort\n // handler — resize is its own interaction.\n event.stopPropagation()\n onResize(event, column.id)\n const onUp = () => {\n window.removeEventListener('pointerup', onUp)\n justResizedRef.current = true\n // Clear after the click that fires on this same pointerup has been\n // dispatched (a later macrotask), so that click is swallowed but\n // genuine subsequent clicks still sort.\n window.setTimeout(() => {\n justResizedRef.current = false\n }, 0)\n }\n window.addEventListener('pointerup', onUp)\n }\n\n function handleSortKey(event: ReactKeyboardEvent<HTMLDivElement>) {\n if (!isSortable) return\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n onSortChange!(column.id)\n }\n }\n\n return (\n <TableHead\n aria-sort={ariaSort}\n tabIndex={isSortable ? 0 : undefined}\n onClick={isSortable ? handleSortClick : undefined}\n onKeyDown={isSortable ? handleSortKey : undefined}\n className={cn(\n 'group/column-head relative h-10 overflow-hidden px-2 text-sm',\n isSortable && 'cursor-pointer select-none',\n )}\n style={{\n width,\n minWidth: width,\n transition: 'none',\n borderRight: '1px solid rgb(var(--border))',\n background: 'rgb(var(--surface-overlay-soft))',\n color: 'rgb(var(--foreground))',\n ...cellStyle,\n }}\n >\n <div className=\"flex h-full min-w-0 items-center justify-between gap-1 overflow-hidden\">\n <ColumnHead icon={column.icon} label={column.label} />\n {isSortable &&\n (sortDir === 'asc' ? (\n <ChevronUp\n className=\"h-3.5 w-3.5 shrink-0\"\n style={{ color: 'rgb(var(--foreground))' }}\n aria-hidden\n />\n ) : sortDir === 'desc' ? (\n <ChevronDown\n className=\"h-3.5 w-3.5 shrink-0\"\n style={{ color: 'rgb(var(--foreground))' }}\n aria-hidden\n />\n ) : (\n <ChevronsUpDown\n className=\"h-3.5 w-3.5 shrink-0 opacity-40\"\n style={{ color: 'rgb(var(--text-muted))' }}\n aria-hidden\n />\n ))}\n </div>\n <button\n type=\"button\"\n aria-label={`Resize ${column.label} column`}\n className=\"absolute top-0 right-0 flex h-full w-3 cursor-col-resize items-center justify-center transition-colors\"\n style={{ color: 'rgb(var(--text-muted))' }}\n onPointerDown={handleResizePointerDown}\n onClick={(event) => event.stopPropagation()}\n />\n </TableHead>\n )\n}\n","/**\n * Sticky / pinned-column helpers for DataGrid.\n *\n * Centralizes the styling for the grid's three sticky surfaces so they\n * behave consistently:\n * • sticky header (top) and sticky summary footer (bottom)\n * • pinned columns (`column.pin: 'left' | 'right'`), with the built-in\n * select/control column implicitly pinned left\n * • a trailing flex \"spacer\" column (`fillWidth`) so the table fills\n * 100% width while real columns keep their exact widths (resize stays\n * independent — the spacer gives/takes the slack)\n *\n * Two correctness rules every sticky cell must follow:\n * 1. it MUST be opaque, or scrolled content bleeds through it; and\n * 2. it shows a soft \"scroll shadow\" on its inner edge ONLY while there\n * is content scrolled past that edge — so there's visual separation\n * while pinned, and it disappears flush when snapped back.\n */\n\nimport type { CSSProperties } from 'react'\n\nimport type { DataGridColumn } from './types'\n\nexport const CONTROL_COLUMN_WIDTH = 40\n\n/** Which edges of the scroll viewport are currently AT rest (not scrolled\n * away from). A shadow on a given side shows when its edge is NOT `at*`. */\nexport type ScrollEdges = {\n atTop: boolean\n atBottom: boolean\n atLeft: boolean\n atRight: boolean\n}\n\n/** Default = everything at rest → no shadows (used before first scroll). */\nexport const SCROLL_EDGES_AT_REST: ScrollEdges = {\n atTop: true,\n atBottom: true,\n atLeft: true,\n atRight: true,\n}\n\nconst SHADOW_RIGHT = '6px 0 8px -6px rgba(2, 6, 23, 0.22)' // pinned-left edge\nconst SHADOW_LEFT = '-6px 0 8px -6px rgba(2, 6, 23, 0.22)' // pinned-right edge\nconst SHADOW_DOWN = '0 6px 8px -6px rgba(2, 6, 23, 0.22)' // sticky header\nconst SHADOW_UP = '0 -6px 8px -6px rgba(2, 6, 23, 0.22)' // sticky footer\n\nexport type PinInfo = { side: 'left' | 'right'; offset: number }\n\n/** Map each pinned column → its side + cumulative sticky offset (px), so\n * multiple pinned columns on the same side stack correctly. The control\n * column occupies the first `CONTROL_COLUMN_WIDTH` on the left. */\nexport function computePinOffsets<ColumnId extends string>(\n visibleColumns: DataGridColumn<ColumnId>[],\n columnWidths: Record<ColumnId, number>,\n): Map<ColumnId, PinInfo> {\n const map = new Map<ColumnId, PinInfo>()\n const widthOf = (c: DataGridColumn<ColumnId>) =>\n columnWidths[c.id] ?? c.defaultWidth\n\n let leftOffset = CONTROL_COLUMN_WIDTH\n for (const c of visibleColumns) {\n if (c.pin !== 'left') continue\n map.set(c.id, { side: 'left', offset: leftOffset })\n leftOffset += widthOf(c)\n }\n\n let rightOffset = 0\n const rightPinned = visibleColumns.filter((c) => c.pin === 'right')\n for (let i = rightPinned.length - 1; i >= 0; i -= 1) {\n const c = rightPinned[i]\n if (!c) continue\n map.set(c.id, { side: 'right', offset: rightOffset })\n rightOffset += widthOf(c)\n }\n\n return map\n}\n\n/** Split a column list at the first right-pinned column, so renderers can\n * drop the flex spacer immediately before the right-pinned group (or at\n * the end when nothing is pinned right). */\nexport function splitAtRightPinned<ColumnId extends string>(\n visibleColumns: DataGridColumn<ColumnId>[],\n): {\n leading: DataGridColumn<ColumnId>[]\n rightPinned: DataGridColumn<ColumnId>[]\n} {\n const firstRight = visibleColumns.findIndex((c) => c.pin === 'right')\n if (firstRight === -1) {\n return { leading: visibleColumns, rightPinned: [] }\n }\n return {\n leading: visibleColumns.slice(0, firstRight),\n rightPinned: visibleColumns.slice(firstRight),\n }\n}\n\ntype Role = 'header' | 'body' | 'footer'\n\n/** Opaque background. Header + footer composite their translucent tint\n * over an opaque base so they read as a light-gray band but never let\n * content through. Body pinned cells stay plain card-colored. */\nfunction opaqueBg(role: Role): CSSProperties {\n if (role === 'header' || role === 'footer') {\n return {\n backgroundColor: 'rgb(var(--bg-card))',\n backgroundImage:\n 'linear-gradient(rgb(var(--surface-overlay-soft)), rgb(var(--surface-overlay-soft)))',\n }\n }\n return { backgroundColor: 'rgb(var(--bg-card))' }\n}\n\n/**\n * Compute the inline style for a (possibly) sticky cell. Returns `{}` when\n * the cell isn't sticky in any axis, so callers can spread it\n * unconditionally.\n */\nexport function stickyCellStyle(opts: {\n role: Role\n pin?: PinInfo | null\n edges: ScrollEdges\n stickyHeader: boolean\n stickyFooter: boolean\n}): CSSProperties {\n const { role, pin, edges, stickyHeader, stickyFooter } = opts\n const verticalSticky =\n (role === 'header' && stickyHeader) || (role === 'footer' && stickyFooter)\n if (!verticalSticky && !pin) return {}\n\n const style: CSSProperties = { position: 'sticky' }\n\n if (role === 'header' && stickyHeader) style.top = 0\n if (role === 'footer' && stickyFooter) style.bottom = 0\n if (pin?.side === 'left') style.left = pin.offset\n if (pin?.side === 'right') style.right = pin.offset\n\n Object.assign(style, opaqueBg(role))\n\n // Corners (vertical-sticky ∩ pinned) must sit above both axes.\n const vertZ = role === 'header' ? 30 : role === 'footer' ? 20 : 0\n style.zIndex = vertZ + (pin ? 10 : 0) || (pin ? 10 : undefined)\n\n const shadows: string[] = []\n if (role === 'header' && stickyHeader && !edges.atTop) shadows.push(SHADOW_DOWN)\n if (role === 'footer' && stickyFooter && !edges.atBottom) shadows.push(SHADOW_UP)\n if (pin?.side === 'left' && !edges.atLeft) shadows.push(SHADOW_RIGHT)\n if (pin?.side === 'right' && !edges.atRight) shadows.push(SHADOW_LEFT)\n if (shadows.length) style.boxShadow = shadows.join(', ')\n\n return style\n}\n","/**\n * DataGridTableHeader — the column-header row including the\n * select-all checkbox cell.\n *\n * Ported 2026-05-18 from gray-ui-csm\n * https://github.com/Jason-uxui/gray-ui-csm/blob/baf8346ac0c1160282e0b173de1bffc594d9c9c3/components/data-grid/table-header.tsx\n * License: MIT (see packages/ui/licenses/gray-ui-csm-LICENSE.txt)\n * Workspace ADR: ADR-025\n *\n * BRING_WITH_REFACTOR:\n * • Token reskin per ADR-025 D7\n * • Checkbox imported from workspace BUILD_FRESH primitive (DEV-2)\n * • Table sub-components from local table-elements (DEV-1)\n * • Sticky header + pinned columns + fill-width spacer (workspace\n * addition) via the shared sticky helper.\n */\n\nimport type { PointerEvent as ReactPointerEvent } from 'react'\n\nimport { Checkbox } from '../checkbox'\nimport { TableHead, TableHeader, TableRow } from './table-elements'\n\nimport { SortableHeaderCell } from './sortable-parts'\nimport {\n CONTROL_COLUMN_WIDTH,\n splitAtRightPinned,\n stickyCellStyle,\n type PinInfo,\n type ScrollEdges,\n} from './sticky'\nimport type { DataGridColumn, DataGridSortState } from './types'\n\ntype DataGridTableHeaderProps<ColumnId extends string> = {\n visibleColumns: DataGridColumn<ColumnId>[]\n columnWidths: Record<ColumnId, number>\n allVisibleRowsSelected: boolean\n someVisibleRowsSelected: boolean\n onToggleAllRows: (checked: boolean) => void\n onResizeStart: (\n event: ReactPointerEvent<HTMLButtonElement>,\n columnId: ColumnId,\n ) => void\n sort: DataGridSortState<ColumnId> | null\n onSortChange: ((columnId: ColumnId) => void) | undefined\n pinOffsets: Map<ColumnId, PinInfo>\n scrollEdges: ScrollEdges\n stickyHeader: boolean\n fillWidth: boolean\n}\n\nexport function DataGridTableHeader<ColumnId extends string>({\n visibleColumns,\n columnWidths,\n allVisibleRowsSelected,\n someVisibleRowsSelected,\n onToggleAllRows,\n onResizeStart,\n sort,\n onSortChange,\n pinOffsets,\n scrollEdges,\n stickyHeader,\n fillWidth,\n}: DataGridTableHeaderProps<ColumnId>) {\n const { leading, rightPinned } = splitAtRightPinned(visibleColumns)\n\n const styleFor = (column: DataGridColumn<ColumnId>) =>\n stickyCellStyle({\n role: 'header',\n pin: pinOffsets.get(column.id) ?? null,\n edges: scrollEdges,\n stickyHeader,\n stickyFooter: false,\n })\n\n const controlStyle = stickyCellStyle({\n role: 'header',\n pin: { side: 'left', offset: 0 },\n edges: scrollEdges,\n stickyHeader,\n stickyFooter: false,\n })\n\n const spacerStyle = stickyCellStyle({\n role: 'header',\n pin: null,\n edges: scrollEdges,\n stickyHeader,\n stickyFooter: false,\n })\n\n const renderHeadCell = (\n column: DataGridColumn<ColumnId>,\n noRightBorder = false,\n ) => (\n <SortableHeaderCell\n key={column.id}\n column={column}\n width={columnWidths[column.id]}\n onResize={onResizeStart}\n sortDir={sort?.columnId === column.id ? sort.dir : null}\n onSortChange={onSortChange}\n cellStyle={{\n ...styleFor(column),\n ...(noRightBorder ? { borderRight: 'none' } : null),\n }}\n />\n )\n\n return (\n <>\n <colgroup>\n <col style={{ width: CONTROL_COLUMN_WIDTH }} />\n {leading.map((column) => (\n <col key={`col-${column.id}`} style={{ width: columnWidths[column.id] }} />\n ))}\n {fillWidth ? <col style={{ width: 'auto' }} /> : null}\n {rightPinned.map((column) => (\n <col key={`col-${column.id}`} style={{ width: columnWidths[column.id] }} />\n ))}\n </colgroup>\n\n <TableHeader style={{ background: 'rgb(var(--bg-card))' }}>\n <TableRow style={{ background: 'rgb(var(--surface-overlay-soft))' }}>\n <TableHead\n className=\"h-10 w-10 px-0 text-center\"\n style={{\n borderRight: '1px solid rgb(var(--border))',\n background: 'rgb(var(--surface-overlay-soft))',\n ...controlStyle,\n }}\n >\n <Checkbox\n aria-label=\"Select all rows\"\n checked={allVisibleRowsSelected}\n indeterminate={someVisibleRowsSelected}\n onCheckedChange={(checked) => onToggleAllRows(checked === true)}\n className=\"mx-auto\"\n />\n </TableHead>\n {leading.map((column) => renderHeadCell(column))}\n {fillWidth ? (\n <th aria-hidden style={{ width: 'auto', padding: 0, ...spacerStyle }} />\n ) : null}\n {rightPinned.map((column, i) =>\n renderHeadCell(column, i === rightPinned.length - 1),\n )}\n </TableRow>\n </TableHeader>\n </>\n )\n}\n","/**\n * DataGridTableBody — row + cell render with editing state, focus,\n * keyboard navigation, and the open-drawer affordance.\n *\n * Ported 2026-05-18 from gray-ui-csm\n * https://github.com/Jason-uxui/gray-ui-csm/blob/baf8346ac0c1160282e0b173de1bffc594d9c9c3/components/data-grid/table-body.tsx\n * License: MIT (see packages/ui/licenses/gray-ui-csm-LICENSE.txt)\n * Workspace ADR: ADR-025\n *\n * BRING_WITH_REFACTOR:\n * • Token reskin per ADR-025 D7\n * • @tabler/icons-react → lucide-react (DEV-4)\n * • Checkbox + Button from workspace primitives (DEV-2 + existing\n * @lovett/ui Button)\n * • Source's `size=\"xs\"` Button maps to workspace `size=\"sm\"`\n * (workspace Button only ships sm/md/lg)\n * • Inline edit input uses workspace token vocabulary directly\n * rather than the Input primitive — the input is intentionally\n * compact (h-7) and edge-to-edge inside the cell, not a typical\n * form input.\n * • Pinned columns + fill-width spacer (workspace addition) via the\n * shared sticky helper.\n */\n\nimport type {\n KeyboardEvent as ReactKeyboardEvent,\n ReactNode,\n RefObject,\n} from 'react'\n\nimport { ExternalLink } from 'lucide-react'\n\nimport { cn } from '../lib/utils'\nimport { Button } from '../button'\nimport { Checkbox } from '../checkbox'\nimport { TableBody, TableCell, TableRow } from './table-elements'\n\nimport {\n splitAtRightPinned,\n stickyCellStyle,\n type PinInfo,\n type ScrollEdges,\n} from './sticky'\nimport type {\n DataGridColumn,\n DataGridRowBase,\n EditingCell,\n} from './types'\n\ntype DataGridTableBodyProps<\n Row extends DataGridRowBase,\n ColumnId extends string,\n> = {\n visibleRows: Row[]\n getRowLabel: (row: Row) => string\n visibleColumns: DataGridColumn<ColumnId>[]\n editingCell: EditingCell<ColumnId> | null\n isEditableColumn: (columnId: ColumnId) => boolean\n startEditing: (row: Row, columnId: ColumnId) => void\n onCellKeyDown: (\n event: ReactKeyboardEvent<HTMLTableCellElement>,\n row: Row,\n rowIndex: number,\n column: DataGridColumn<ColumnId>,\n colIndex: number,\n ) => void\n inputRef: RefObject<HTMLInputElement | null>\n draftValue: string\n setDraftValue: (value: string) => void\n commitEdit: () => void\n cancelEdit: () => void\n canOpenDrawer: (columnId: ColumnId) => boolean\n renderCell: (row: Row, column: DataGridColumn<ColumnId>) => ReactNode\n onOpenDrawer: (cell: EditingCell<ColumnId>) => void\n selectedRowIds: string[]\n onToggleRowSelection: (rowId: string, checked: boolean) => void\n columnWidths: Record<ColumnId, number>\n draggingColumnId: ColumnId | null\n pinOffsets: Map<ColumnId, PinInfo>\n scrollEdges: ScrollEdges\n fillWidth: boolean\n fillHeight: boolean\n}\n\nexport function DataGridTableBody<\n Row extends DataGridRowBase,\n ColumnId extends string,\n>({\n visibleRows,\n getRowLabel,\n visibleColumns,\n editingCell,\n isEditableColumn,\n startEditing,\n onCellKeyDown,\n inputRef,\n draftValue,\n setDraftValue,\n commitEdit,\n cancelEdit,\n canOpenDrawer,\n renderCell,\n onOpenDrawer,\n selectedRowIds,\n onToggleRowSelection,\n columnWidths,\n draggingColumnId,\n pinOffsets,\n scrollEdges,\n fillWidth,\n fillHeight,\n}: DataGridTableBodyProps<Row, ColumnId>) {\n const { leading, rightPinned } = splitAtRightPinned(visibleColumns)\n\n const controlStyle = stickyCellStyle({\n role: 'body',\n pin: { side: 'left', offset: 0 },\n edges: scrollEdges,\n stickyHeader: false,\n stickyFooter: false,\n })\n\n const renderDataCell = (\n row: Row,\n rowIndex: number,\n column: DataGridColumn<ColumnId>,\n colIndex: number,\n noRightBorder = false,\n ) => {\n const isEditing =\n editingCell?.rowId === row.id && editingCell.columnId === column.id\n const editable = isEditableColumn(column.id)\n const showDrawerAction = canOpenDrawer(column.id)\n const isDraggingThisColumn = draggingColumnId === column.id\n const sticky = stickyCellStyle({\n role: 'body',\n pin: pinOffsets.get(column.id) ?? null,\n edges: scrollEdges,\n stickyHeader: false,\n stickyFooter: false,\n })\n\n return (\n <TableCell\n key={`${row.id}-${column.id}`}\n data-grid-cell=\"true\"\n data-row-index={rowIndex}\n data-col-index={colIndex}\n tabIndex={isEditing ? -1 : 0}\n className={cn(\n 'group/cell relative h-10 overflow-hidden px-2 py-1 whitespace-nowrap outline-none',\n editable && 'cursor-text',\n )}\n style={{\n width: columnWidths[column.id],\n minWidth: columnWidths[column.id],\n // The rightmost pinned cell drops its right border — the table\n // container's own border already draws that edge (no double line).\n borderRight: noRightBorder ? undefined : '1px solid rgb(var(--border))',\n ...sticky,\n ...(isDraggingThisColumn\n ? { background: 'rgb(var(--surface-overlay-soft))' }\n : null),\n }}\n onDoubleClick={() => {\n if (editable) startEditing(row, column.id)\n }}\n onKeyDown={(event) =>\n onCellKeyDown(event, row, rowIndex, column, colIndex)\n }\n >\n {isEditing ? (\n <input\n ref={inputRef}\n value={draftValue}\n onChange={(event) => setDraftValue(event.target.value)}\n onBlur={commitEdit}\n onKeyDown={(event) => {\n if (event.key === 'Enter') {\n event.preventDefault()\n commitEdit()\n }\n\n if (event.key === 'Escape') {\n event.preventDefault()\n cancelEdit()\n }\n }}\n className=\"h-7 w-full px-2 text-xs outline-none rounded-[var(--radius-sm)]\"\n style={{\n background: 'rgb(var(--bg-input))',\n border: '1px solid rgb(var(--border-strong))',\n color: 'rgb(var(--foreground))',\n }}\n />\n ) : (\n <>\n <span\n aria-hidden\n className=\"pointer-events-none absolute inset-0 transition-colors duration-150\"\n style={{ border: '1px solid transparent' }}\n />\n <div\n className={cn(\n 'min-w-0 truncate transition-[padding] duration-150',\n showDrawerAction &&\n 'group-hover/cell:pr-16 group-focus-within/cell:pr-16',\n )}\n style={{ color: 'rgb(var(--foreground))' }}\n >\n {renderCell(row, column)}\n </div>\n {showDrawerAction ? (\n <div className=\"pointer-events-none absolute top-1/2 right-1.5 z-10 -translate-y-1/2 opacity-0 transition-all group-focus-within/cell:pointer-events-auto group-focus-within/cell:opacity-100 group-hover/cell:pointer-events-auto group-hover/cell:opacity-100\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n aria-label={`Open details for ${getRowLabel(row)} ${column.label}`}\n title=\"Open drawer\"\n className=\"h-7 px-2.5\"\n onPointerDown={(event) => {\n event.stopPropagation()\n }}\n onDoubleClick={(event) => {\n event.stopPropagation()\n }}\n onClick={(event) => {\n event.stopPropagation()\n const originElement =\n event.currentTarget.closest('td') ?? event.currentTarget\n const originRect = originElement.getBoundingClientRect()\n\n onOpenDrawer({\n rowId: row.id,\n columnId: column.id,\n originRect: {\n x: originRect.x,\n y: originRect.y,\n width: originRect.width,\n height: originRect.height,\n },\n })\n }}\n leadingIcon={<ExternalLink className=\"h-3.5 w-3.5\" />}\n >\n Open\n </Button>\n </div>\n ) : null}\n </>\n )}\n </TableCell>\n )\n }\n\n return (\n <TableBody>\n {visibleRows.map((row, rowIndex) => (\n // TableRow styles `data-[state=selected]`; without this attribute a\n // checked row had no visual state at all — only the checkbox changed.\n <TableRow\n key={row.id}\n {...(selectedRowIds.includes(row.id)\n ? { 'data-state': 'selected' as const }\n : {})}\n >\n <TableCell\n className=\"h-10 px-0 text-center\"\n style={{\n borderRight: '1px solid rgb(var(--border))',\n ...controlStyle,\n }}\n >\n <Checkbox\n aria-label={`Select ${getRowLabel(row)}`}\n checked={selectedRowIds.includes(row.id)}\n onCheckedChange={(checked) =>\n onToggleRowSelection(row.id, checked === true)\n }\n className=\"mx-auto\"\n />\n </TableCell>\n {leading.map((column, colIndex) =>\n renderDataCell(row, rowIndex, column, colIndex),\n )}\n {fillWidth ? (\n <td aria-hidden style={{ width: 'auto', padding: 0 }} />\n ) : null}\n {rightPinned.map((column, i) =>\n renderDataCell(\n row,\n rowIndex,\n column,\n leading.length + i,\n i === rightPinned.length - 1,\n ),\n )}\n </TableRow>\n ))}\n {fillHeight ? (\n // Filler row absorbs the leftover height (table is height:100%) so\n // the summary footer stays pinned to the bottom even with few rows.\n <tr aria-hidden style={{ height: '100%' }}>\n <td style={{ padding: 0, border: 0 }} colSpan={visibleColumns.length + 2} />\n </tr>\n ) : null}\n </TableBody>\n )\n}\n","/**\n * DataGridSummaryFooter — optional sum-style row beneath the body.\n *\n * Ported 2026-05-18 from gray-ui-csm\n * https://github.com/Jason-uxui/gray-ui-csm/blob/baf8346ac0c1160282e0b173de1bffc594d9c9c3/components/data-grid/table-summary-footer.tsx\n * License: MIT (see packages/ui/licenses/gray-ui-csm-LICENSE.txt)\n * Workspace ADR: ADR-025\n *\n * BRING_WITH_REFACTOR: token reskin per ADR-025 D7; sticky footer +\n * pinned columns + fill-width spacer via the shared sticky helper.\n */\n\nimport type { ReactNode } from 'react'\n\nimport { cn } from '../lib/utils'\nimport { TableCell, TableFooter, TableRow } from './table-elements'\n\nimport {\n splitAtRightPinned,\n stickyCellStyle,\n type PinInfo,\n type ScrollEdges,\n} from './sticky'\nimport type { DataGridColumn, DataGridRowBase } from './types'\n\ntype DataGridSummaryFooterProps<\n Row extends DataGridRowBase,\n ColumnId extends string,\n> = {\n showSummaries: boolean\n stickySummaryFooter: boolean\n renderSummary:\n | ((\n column: DataGridColumn<ColumnId>,\n visibleRows: Row[],\n ) => ReactNode)\n | undefined\n visibleColumns: DataGridColumn<ColumnId>[]\n visibleRows: Row[]\n columnWidths: Record<ColumnId, number>\n draggingColumnId: ColumnId | null\n isEmptyValue: (value: ReactNode) => boolean\n pinOffsets: Map<ColumnId, PinInfo>\n scrollEdges: ScrollEdges\n fillWidth: boolean\n}\n\nexport function DataGridSummaryFooter<\n Row extends DataGridRowBase,\n ColumnId extends string,\n>({\n showSummaries,\n stickySummaryFooter,\n renderSummary,\n visibleColumns,\n visibleRows,\n columnWidths,\n draggingColumnId,\n isEmptyValue,\n pinOffsets,\n scrollEdges,\n fillWidth,\n}: DataGridSummaryFooterProps<Row, ColumnId>) {\n if (!showSummaries || !renderSummary) return null\n\n const { leading, rightPinned } = splitAtRightPinned(visibleColumns)\n\n const footerStyle = (pin: PinInfo | null) =>\n stickyCellStyle({\n role: 'footer',\n pin,\n edges: scrollEdges,\n stickyHeader: false,\n stickyFooter: stickySummaryFooter,\n })\n\n const renderSummaryCell = (\n column: DataGridColumn<ColumnId>,\n noRightBorder = false,\n ) => {\n const summaryContent = renderSummary(column, visibleRows)\n const isDraggingThisColumn = draggingColumnId === column.id\n\n return (\n <TableCell\n key={`summary-${column.id}`}\n className={cn('h-10 px-2 py-1 text-left text-xs whitespace-nowrap')}\n style={{\n width: columnWidths[column.id],\n minWidth: columnWidths[column.id],\n color: 'rgb(var(--text-muted))',\n borderRight: noRightBorder ? undefined : '1px solid rgb(var(--border))',\n ...footerStyle(pinOffsets.get(column.id) ?? null),\n ...(isDraggingThisColumn\n ? { background: 'rgb(var(--surface-overlay-soft))' }\n : null),\n }}\n >\n {!isEmptyValue(summaryContent) ? (\n <span className=\"inline-block\">{summaryContent}</span>\n ) : null}\n </TableCell>\n )\n }\n\n return (\n <TableFooter>\n <TableRow className=\"hover:bg-transparent\">\n <TableCell\n className={cn('h-10 px-2 py-1')}\n style={{\n borderRight: '1px solid rgb(var(--border))',\n ...footerStyle({ side: 'left', offset: 0 }),\n }}\n />\n {leading.map((column) => renderSummaryCell(column))}\n {fillWidth ? (\n <td\n aria-hidden\n style={{ width: 'auto', padding: 0, ...footerStyle(null) }}\n />\n ) : null}\n {rightPinned.map((column, i) =>\n renderSummaryCell(column, i === rightPinned.length - 1),\n )}\n </TableRow>\n </TableFooter>\n )\n}\n","/**\n * DataGridDragOverlay + DataGridDropIndicator — visual chrome that\n * renders during column drag-reorder.\n *\n * Ported 2026-05-18 from gray-ui-csm\n * https://github.com/Jason-uxui/gray-ui-csm/blob/baf8346ac0c1160282e0b173de1bffc594d9c9c3/components/data-grid/table-overlays.tsx\n * License: MIT (see packages/ui/licenses/gray-ui-csm-LICENSE.txt)\n * Workspace ADR: ADR-025\n *\n * BRING_WITH_REFACTOR: token reskin to workspace vocabulary per\n * ADR-025 D7.\n */\n\nimport type { DataGridColumn } from './types'\n\ntype DataGridDragOverlayProps<ColumnId extends string> = {\n dragOverlayColumn: DataGridColumn<ColumnId> | null\n columnWidths: Record<ColumnId, number>\n dragOverlayHeight: number\n}\n\nexport function DataGridDragOverlay<ColumnId extends string>({\n dragOverlayColumn,\n columnWidths,\n dragOverlayHeight,\n}: DataGridDragOverlayProps<ColumnId>) {\n if (!dragOverlayColumn) return null\n\n const Icon = dragOverlayColumn.icon\n\n return (\n <div\n className=\"pointer-events-none rounded-[var(--radius-md)]\"\n style={{\n width: columnWidths[dragOverlayColumn.id],\n height: dragOverlayHeight,\n border: '1px solid rgb(var(--border))',\n background: 'rgb(var(--bg-card))',\n boxShadow: 'var(--shadow-lg, 0 10px 32px rgba(0,0,0,0.18))',\n }}\n >\n <div\n className=\"flex h-8 items-center gap-1.5 px-2 text-xs font-medium\"\n style={{\n borderBottom: '1px solid rgb(var(--border))',\n color: 'rgb(var(--foreground))',\n }}\n >\n <Icon className=\"h-3.5 w-3.5 shrink-0\" />\n <span className=\"truncate\">{dragOverlayColumn.label}</span>\n </div>\n </div>\n )\n}\n\ntype DataGridDropIndicatorProps = {\n dropIndicatorLeft: number | null\n dragTableRect: { top: number; height: number } | null\n}\n\nexport function DataGridDropIndicator({\n dropIndicatorLeft,\n dragTableRect,\n}: DataGridDropIndicatorProps) {\n if (dropIndicatorLeft === null || !dragTableRect) return null\n\n return (\n <div\n className=\"pointer-events-none fixed z-50 w-0.5\"\n style={{\n left: dropIndicatorLeft - 1,\n top: dragTableRect.top,\n height: dragTableRect.height,\n background: 'rgb(var(--accent))',\n }}\n />\n )\n}\n","/**\n * DataGridTableView — composes Header + Body + SummaryFooter inside\n * a single <Table>.\n *\n * Ported 2026-05-18 from gray-ui-csm\n * https://github.com/Jason-uxui/gray-ui-csm/blob/baf8346ac0c1160282e0b173de1bffc594d9c9c3/components/data-grid/table-view.tsx\n * License: MIT (see packages/ui/licenses/gray-ui-csm-LICENSE.txt)\n * Workspace ADR: ADR-025\n *\n * BRING_WITH_REFACTOR:\n * • Table sub-component imported from local table-elements (DEV-1)\n * • No additional styling beyond what the sub-components carry\n */\n\nimport type {\n KeyboardEvent as ReactKeyboardEvent,\n PointerEvent as ReactPointerEvent,\n ReactNode,\n RefObject,\n} from 'react'\n\nimport { Table } from './table-elements'\nimport {\n DataGridSummaryFooter,\n DataGridTableBody,\n DataGridTableHeader,\n} from './table-parts'\nimport { computePinOffsets, type ScrollEdges } from './sticky'\nimport type {\n DataGridColumn,\n DataGridRowBase,\n DataGridSortState,\n EditingCell,\n} from './types'\n\ntype DataGridTableViewProps<\n Row extends DataGridRowBase,\n ColumnId extends string,\n> = {\n tableRef: RefObject<HTMLTableElement | null>\n gridMinWidth: number\n visibleColumns: DataGridColumn<ColumnId>[]\n columnWidths: Record<ColumnId, number>\n visibleRows: Row[]\n getRowLabel: (row: Row) => string\n editingCell: EditingCell<ColumnId> | null\n isEditableColumn: (columnId: ColumnId) => boolean\n startEditing: (row: Row, columnId: ColumnId) => void\n onCellKeyDown: (\n event: ReactKeyboardEvent<HTMLTableCellElement>,\n row: Row,\n rowIndex: number,\n column: DataGridColumn<ColumnId>,\n colIndex: number,\n ) => void\n inputRef: RefObject<HTMLInputElement | null>\n draftValue: string\n setDraftValue: (value: string) => void\n commitEdit: () => void\n cancelEdit: () => void\n canOpenDrawer: (columnId: ColumnId) => boolean\n renderCell: (row: Row, column: DataGridColumn<ColumnId>) => ReactNode\n onOpenDrawer: (cell: EditingCell<ColumnId>) => void\n selectedRowIds: string[]\n allVisibleRowsSelected: boolean\n someVisibleRowsSelected: boolean\n onToggleRowSelection: (rowId: string, checked: boolean) => void\n onToggleAllRows: (checked: boolean) => void\n showSummaries: boolean\n renderSummary:\n | ((\n column: DataGridColumn<ColumnId>,\n visibleRows: Row[],\n ) => ReactNode)\n | undefined\n stickySummaryFooter: boolean\n stickyHeader: boolean\n fillWidth: boolean\n fillHeight: boolean\n scrollEdges: ScrollEdges\n tableContainerClassName: string | undefined\n isEmptyValue: (value: ReactNode) => boolean\n onResizeStart: (\n event: ReactPointerEvent<HTMLButtonElement>,\n columnId: ColumnId,\n ) => void\n draggingColumnId: ColumnId | null\n sort: DataGridSortState<ColumnId> | null\n onSortChange: ((columnId: ColumnId) => void) | undefined\n}\n\nexport function DataGridTableView<\n Row extends DataGridRowBase,\n ColumnId extends string,\n>({\n tableRef,\n gridMinWidth,\n visibleColumns,\n columnWidths,\n visibleRows,\n getRowLabel,\n editingCell,\n isEditableColumn,\n startEditing,\n onCellKeyDown,\n inputRef,\n draftValue,\n setDraftValue,\n commitEdit,\n cancelEdit,\n canOpenDrawer,\n renderCell,\n onOpenDrawer,\n selectedRowIds,\n allVisibleRowsSelected,\n someVisibleRowsSelected,\n onToggleRowSelection,\n onToggleAllRows,\n showSummaries,\n renderSummary,\n stickySummaryFooter,\n stickyHeader,\n fillWidth,\n fillHeight,\n scrollEdges,\n tableContainerClassName,\n isEmptyValue,\n onResizeStart,\n draggingColumnId,\n sort,\n onSortChange,\n}: DataGridTableViewProps<Row, ColumnId>) {\n const pinOffsets = computePinOffsets(visibleColumns, columnWidths)\n return (\n <Table\n ref={tableRef}\n className=\"table-fixed\"\n containerClassName={tableContainerClassName}\n style={{\n width: `max(100%, ${gridMinWidth}px)`,\n // When the grid fills its height, stretch the table to the full\n // viewport so the spacer body row can push the summary footer to\n // the bottom even with few rows.\n ...(fillHeight ? { height: '100%' } : null),\n }}\n >\n <DataGridTableHeader\n visibleColumns={visibleColumns}\n columnWidths={columnWidths}\n allVisibleRowsSelected={allVisibleRowsSelected}\n someVisibleRowsSelected={someVisibleRowsSelected}\n onToggleAllRows={onToggleAllRows}\n onResizeStart={onResizeStart}\n sort={sort}\n onSortChange={onSortChange}\n pinOffsets={pinOffsets}\n scrollEdges={scrollEdges}\n stickyHeader={stickyHeader}\n fillWidth={fillWidth}\n />\n\n <DataGridTableBody\n visibleRows={visibleRows}\n getRowLabel={getRowLabel}\n visibleColumns={visibleColumns}\n editingCell={editingCell}\n isEditableColumn={isEditableColumn}\n startEditing={startEditing}\n onCellKeyDown={onCellKeyDown}\n inputRef={inputRef}\n draftValue={draftValue}\n setDraftValue={setDraftValue}\n commitEdit={commitEdit}\n cancelEdit={cancelEdit}\n canOpenDrawer={canOpenDrawer}\n renderCell={renderCell}\n onOpenDrawer={onOpenDrawer}\n selectedRowIds={selectedRowIds}\n onToggleRowSelection={onToggleRowSelection}\n columnWidths={columnWidths}\n draggingColumnId={draggingColumnId}\n pinOffsets={pinOffsets}\n scrollEdges={scrollEdges}\n fillWidth={fillWidth}\n fillHeight={fillHeight}\n />\n\n <DataGridSummaryFooter\n showSummaries={showSummaries}\n renderSummary={renderSummary}\n stickySummaryFooter={stickySummaryFooter}\n visibleColumns={visibleColumns}\n visibleRows={visibleRows}\n columnWidths={columnWidths}\n draggingColumnId={draggingColumnId}\n isEmptyValue={isEmptyValue}\n pinOffsets={pinOffsets}\n scrollEdges={scrollEdges}\n fillWidth={fillWidth}\n />\n </Table>\n )\n}\n","/**\n * useGridColumns — column width / visibility / drag-reorder state.\n *\n * Ported 2026-05-18 from gray-ui-csm\n * https://github.com/Jason-uxui/gray-ui-csm/blob/baf8346ac0c1160282e0b173de1bffc594d9c9c3/components/data-grid/use-grid-columns.ts\n * License: MIT (see packages/ui/licenses/gray-ui-csm-LICENSE.txt)\n * Workspace ADR: ADR-025\n *\n * BRING_WITH_REFACTOR: pure TS port — no styling changes; only\n * relative-path adjustment for the workspace tree.\n */\n\nimport {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type PointerEvent as ReactPointerEvent,\n type RefObject,\n} from 'react'\n\nimport {\n type DragEndEvent,\n type DragOverEvent,\n type DragStartEvent,\n} from '@dnd-kit/core'\nimport { arrayMove } from '@dnd-kit/sortable'\n\nimport type { DataGridColumn } from './types'\n\nfunction createInitialColumnWidths<ColumnId extends string>(\n columns: DataGridColumn<ColumnId>[],\n): Record<ColumnId, number> {\n return columns.reduce<Record<ColumnId, number>>(\n (acc, column) => {\n acc[column.id] = column.defaultWidth\n return acc\n },\n {} as Record<ColumnId, number>,\n )\n}\n\ntype UseGridColumnsParams<ColumnId extends string> = {\n columns: DataGridColumn<ColumnId>[]\n tableRef: RefObject<HTMLTableElement | null>\n minColumnWidth: number\n controlColumnWidth: number\n}\n\nexport function useGridColumns<ColumnId extends string>({\n columns,\n tableRef,\n minColumnWidth,\n controlColumnWidth,\n}: UseGridColumnsParams<ColumnId>) {\n const columnOrder = useMemo(\n () => columns.map((column) => column.id),\n [columns],\n )\n\n const [columnWidths, setColumnWidths] = useState<\n Record<ColumnId, number>\n >(() => createInitialColumnWidths(columns))\n const [visibleColumnIds, setVisibleColumnIds] = useState<ColumnId[]>(\n () => columnOrder,\n )\n const [draggingColumnId, setDraggingColumnId] =\n useState<ColumnId | null>(null)\n const [dragOverColumnId, setDragOverColumnId] =\n useState<ColumnId | null>(null)\n const [dragOverlayHeight, setDragOverlayHeight] = useState(280)\n const [dropIndicatorLeft, setDropIndicatorLeft] = useState<\n number | null\n >(null)\n const [dragTableRect, setDragTableRect] = useState<{\n top: number\n height: number\n } | null>(null)\n\n const resizingRef = useRef<{\n columnId: ColumnId\n startX: number\n startWidth: number\n } | null>(null)\n const orderBeforeDragRef = useRef<ColumnId[]>(columnOrder)\n\n useEffect(() => {\n const allowedIds = new Set(columnOrder)\n\n setColumnWidths((current) => {\n const next = createInitialColumnWidths(columns)\n columns.forEach((column) => {\n if (typeof current[column.id] === 'number') {\n next[column.id] = current[column.id]\n }\n })\n return next\n })\n\n setVisibleColumnIds((current) => {\n const kept = current.filter((id) => allowedIds.has(id))\n const missing = columnOrder.filter((id) => !kept.includes(id))\n if (missing.length === 0) {\n return kept.length === current.length ? current : kept\n }\n // Insert newly-visible columns at their natural position (per the\n // `columns` prop order) instead of appending them at the very end.\n // Appending broke pinned trailing columns (e.g. an actions column\n // pinned right would stop being last once another column was toggled\n // on). Existing columns keep their (possibly drag-reordered) order.\n const orderIndex = (id: ColumnId) => columnOrder.indexOf(id)\n const next = [...kept]\n for (const id of missing) {\n const target = orderIndex(id)\n let insertAt = next.length\n for (let i = 0; i < next.length; i += 1) {\n const cur = next[i]\n if (cur !== undefined && orderIndex(cur) > target) {\n insertAt = i\n break\n }\n }\n next.splice(insertAt, 0, id)\n }\n return next\n })\n\n orderBeforeDragRef.current = columnOrder\n }, [columns, columnOrder])\n\n useEffect(() => {\n const handlePointerMove = (event: PointerEvent) => {\n const activeResize = resizingRef.current\n if (!activeResize) return\n\n const column = columns.find((item) => item.id === activeResize.columnId)\n const resolvedMinWidth = column?.minWidth ?? minColumnWidth\n const deltaX = event.clientX - activeResize.startX\n const nextWidth = Math.max(\n resolvedMinWidth,\n activeResize.startWidth + deltaX,\n )\n\n setColumnWidths((currentWidths) => ({\n ...currentWidths,\n [activeResize.columnId]: nextWidth,\n }))\n }\n\n const handlePointerUp = () => {\n if (!resizingRef.current) return\n resizingRef.current = null\n document.body.style.userSelect = ''\n document.body.style.cursor = ''\n }\n\n window.addEventListener('pointermove', handlePointerMove)\n window.addEventListener('pointerup', handlePointerUp)\n\n return () => {\n window.removeEventListener('pointermove', handlePointerMove)\n window.removeEventListener('pointerup', handlePointerUp)\n document.body.style.userSelect = ''\n document.body.style.cursor = ''\n }\n }, [columns, minColumnWidth])\n\n const visibleColumns = useMemo(() => {\n return visibleColumnIds\n .map((columnId) => columns.find((column) => column.id === columnId))\n .filter((column): column is DataGridColumn<ColumnId> => Boolean(column))\n }, [columns, visibleColumnIds])\n\n const gridMinWidth = useMemo(() => {\n const contentWidth = visibleColumns.reduce((sum, column) => {\n return sum + (columnWidths[column.id] ?? column.defaultWidth)\n }, 0)\n\n return controlColumnWidth + contentWidth\n }, [columnWidths, controlColumnWidth, visibleColumns])\n\n const hiddenColumns = useMemo(() => {\n return columns.filter((column) => !visibleColumnIds.includes(column.id))\n }, [columns, visibleColumnIds])\n\n const toggleColumnVisibility = useCallback(\n (columnId: ColumnId, visible: boolean) => {\n setVisibleColumnIds((currentColumns) => {\n if (visible) {\n if (currentColumns.includes(columnId)) return currentColumns\n return [...currentColumns, columnId]\n }\n\n if (currentColumns.length === 1 && currentColumns.includes(columnId)) {\n return currentColumns\n }\n\n return currentColumns.filter((id) => id !== columnId)\n })\n },\n [],\n )\n\n const handleColumnDragStart = useCallback(\n (event: DragStartEvent) => {\n const activeId = String(event.active.id) as ColumnId\n const tableRect = tableRef.current?.getBoundingClientRect()\n orderBeforeDragRef.current = visibleColumnIds\n setDraggingColumnId(activeId)\n setDragOverColumnId(activeId)\n setDragOverlayHeight(tableRect?.height ?? 280)\n if (tableRect) {\n setDragTableRect({ top: tableRect.top, height: tableRect.height })\n }\n },\n [tableRef, visibleColumnIds],\n )\n\n const handleColumnDragOver = useCallback(\n (event: DragOverEvent) => {\n if (!event.over) return\n\n const activeId = String(event.active.id) as ColumnId\n const overId = String(event.over.id) as ColumnId\n const overRect = event.over.rect\n setDragOverColumnId(overId)\n\n const currentIndex = visibleColumnIds.indexOf(activeId)\n const targetIndex = visibleColumnIds.indexOf(overId)\n const indicatorLeft =\n currentIndex > -1 && targetIndex > -1 && currentIndex < targetIndex\n ? overRect.left + overRect.width\n : overRect.left\n\n setDropIndicatorLeft(indicatorLeft)\n\n if (activeId === overId) return\n\n setVisibleColumnIds((currentColumns) => {\n const oldIndex = currentColumns.indexOf(activeId)\n const newIndex = currentColumns.indexOf(overId)\n\n if (oldIndex === -1 || newIndex === -1 || oldIndex === newIndex) {\n return currentColumns\n }\n\n return arrayMove(currentColumns, oldIndex, newIndex)\n })\n },\n [visibleColumnIds],\n )\n\n const handleColumnDragEnd = useCallback((event: DragEndEvent) => {\n if (!event.over) {\n setVisibleColumnIds(orderBeforeDragRef.current)\n }\n\n setDraggingColumnId(null)\n setDragOverColumnId(null)\n setDropIndicatorLeft(null)\n setDragTableRect(null)\n }, [])\n\n const handleOptionColumnDragEnd = useCallback((event: DragEndEvent) => {\n if (!event.over) return\n\n const activeId = String(event.active.id) as ColumnId\n const overId = String(event.over.id) as ColumnId\n\n if (activeId === overId) return\n\n setVisibleColumnIds((currentColumns) => {\n const oldIndex = currentColumns.indexOf(activeId)\n const newIndex = currentColumns.indexOf(overId)\n\n if (oldIndex === -1 || newIndex === -1) return currentColumns\n\n return arrayMove(currentColumns, oldIndex, newIndex)\n })\n }, [])\n\n const handleColumnDragCancel = useCallback(() => {\n setVisibleColumnIds(orderBeforeDragRef.current)\n setDraggingColumnId(null)\n setDragOverColumnId(null)\n setDropIndicatorLeft(null)\n setDragTableRect(null)\n }, [])\n\n const beginResize = useCallback(\n (event: ReactPointerEvent<HTMLButtonElement>, columnId: ColumnId) => {\n event.preventDefault()\n event.stopPropagation()\n\n resizingRef.current = {\n columnId,\n startX: event.clientX,\n startWidth: columnWidths[columnId],\n }\n\n document.body.style.userSelect = 'none'\n document.body.style.cursor = 'col-resize'\n },\n [columnWidths],\n )\n\n const dragOverlayColumn = useMemo(() => {\n if (!draggingColumnId) return null\n return columns.find((column) => column.id === draggingColumnId) ?? null\n }, [columns, draggingColumnId])\n\n return {\n columnWidths,\n visibleColumnIds,\n draggingColumnId,\n dragOverColumnId,\n dragOverlayHeight,\n dropIndicatorLeft,\n dragTableRect,\n visibleColumns,\n gridMinWidth,\n hiddenColumns,\n toggleColumnVisibility,\n handleColumnDragStart,\n handleColumnDragOver,\n handleColumnDragEnd,\n handleOptionColumnDragEnd,\n handleColumnDragCancel,\n beginResize,\n dragOverlayColumn,\n }\n}\n","/**\n * useGridEditing — cell editing draft / commit / keyboard navigation.\n *\n * Ported 2026-05-18 from gray-ui-csm\n * https://github.com/Jason-uxui/gray-ui-csm/blob/baf8346ac0c1160282e0b173de1bffc594d9c9c3/components/data-grid/use-grid-editing.ts\n * License: MIT (see packages/ui/licenses/gray-ui-csm-LICENSE.txt)\n * Workspace ADR: ADR-025\n *\n * BRING_WITH_REFACTOR: pure TS port — relative-path adjustment only.\n */\n\nimport {\n useCallback,\n useEffect,\n useState,\n type KeyboardEvent as ReactKeyboardEvent,\n type RefObject,\n} from 'react'\n\nimport type { DataGridColumn, DataGridRowBase, EditingCell } from './types'\n\ntype UseGridEditingParams<\n Row extends DataGridRowBase,\n ColumnId extends string,\n> = {\n gridRef: RefObject<HTMLDivElement | null>\n inputRef: RefObject<HTMLInputElement | null>\n visibleRowCount: number\n visibleColumnCount: number\n isEditableColumn: (columnId: ColumnId) => boolean\n getCellEditValue: (row: Row, columnId: ColumnId) => string\n applyCellEdit: (row: Row, columnId: ColumnId, nextValue: string) => Row\n commitRows: (updater: (currentRows: Row[]) => Row[]) => void\n}\n\nexport function useGridEditing<\n Row extends DataGridRowBase,\n ColumnId extends string,\n>({\n gridRef,\n inputRef,\n visibleRowCount,\n visibleColumnCount,\n isEditableColumn,\n getCellEditValue,\n applyCellEdit,\n commitRows,\n}: UseGridEditingParams<Row, ColumnId>) {\n const [editingCell, setEditingCell] =\n useState<EditingCell<ColumnId> | null>(null)\n const [draftValue, setDraftValue] = useState('')\n\n useEffect(() => {\n if (!editingCell) return\n inputRef.current?.focus()\n inputRef.current?.select()\n }, [editingCell, inputRef])\n\n const startEditing = useCallback(\n (row: Row, columnId: ColumnId) => {\n if (!isEditableColumn(columnId)) return\n setEditingCell({ rowId: row.id, columnId })\n setDraftValue(getCellEditValue(row, columnId))\n },\n [getCellEditValue, isEditableColumn],\n )\n\n const commitEdit = useCallback(() => {\n if (!editingCell) return\n\n commitRows((currentRows) =>\n currentRows.map((row) => {\n if (row.id !== editingCell.rowId) return row\n return applyCellEdit(row, editingCell.columnId, draftValue)\n }),\n )\n setEditingCell(null)\n setDraftValue('')\n }, [applyCellEdit, commitRows, draftValue, editingCell])\n\n const cancelEdit = useCallback(() => {\n setEditingCell(null)\n setDraftValue('')\n }, [])\n\n const focusCell = useCallback(\n (rowIndex: number, colIndex: number) => {\n const targetCell = gridRef.current?.querySelector<HTMLElement>(\n `[data-grid-cell=\"true\"][data-row-index=\"${rowIndex}\"][data-col-index=\"${colIndex}\"]`,\n )\n targetCell?.focus()\n },\n [gridRef],\n )\n\n const handleCellKeyDown = useCallback(\n (\n event: ReactKeyboardEvent<HTMLTableCellElement>,\n row: Row,\n rowIndex: number,\n column: DataGridColumn<ColumnId>,\n colIndex: number,\n ) => {\n const maxRowIndex = visibleRowCount - 1\n const maxColIndex = visibleColumnCount - 1\n\n if (event.key === 'Enter' && isEditableColumn(column.id)) {\n event.preventDefault()\n startEditing(row, column.id)\n return\n }\n\n if (event.key === 'ArrowRight') {\n event.preventDefault()\n focusCell(rowIndex, Math.min(colIndex + 1, maxColIndex))\n return\n }\n\n if (event.key === 'ArrowLeft') {\n event.preventDefault()\n focusCell(rowIndex, Math.max(colIndex - 1, 0))\n return\n }\n\n if (event.key === 'ArrowDown') {\n event.preventDefault()\n focusCell(Math.min(rowIndex + 1, maxRowIndex), colIndex)\n return\n }\n\n if (event.key === 'ArrowUp') {\n event.preventDefault()\n focusCell(Math.max(rowIndex - 1, 0), colIndex)\n }\n },\n [\n focusCell,\n isEditableColumn,\n startEditing,\n visibleColumnCount,\n visibleRowCount,\n ],\n )\n\n return {\n editingCell,\n draftValue,\n setDraftValue,\n startEditing,\n commitEdit,\n cancelEdit,\n handleCellKeyDown,\n }\n}\n","/**\n * DataGrid — top-level orchestrator that composes the table view +\n * drawer panel and threads state through the editing + columns hooks.\n *\n * Ported 2026-05-18 from gray-ui-csm\n * https://github.com/Jason-uxui/gray-ui-csm/blob/baf8346ac0c1160282e0b173de1bffc594d9c9c3/components/data-grid/data-grid.tsx\n * License: MIT (see packages/ui/licenses/gray-ui-csm-LICENSE.txt)\n * Workspace ADR: ADR-025\n *\n * BRING_WITH_REFACTOR per ADR-025 D5:\n * • Source wraps everything in `<DialogPrimitive.Root open={...}>`\n * and lets DrawerPanel discover open + close via Dialog context.\n * CLAUDE.md §1 forbids `@base-ui/react`. The workspace port hoists\n * open state into this component (already present here as\n * `drawerCell`) and threads `isOpen` + `closeDrawer` explicitly\n * into the default <DrawerPanel> (which renders a workspace\n * <FloatingDrawer side=\"right\">).\n * • `drawerModal` + new `drawerSize` props pass through to\n * FloatingDrawer.\n * • `disablePointerDismissal` is dropped — FloatingDrawer's modal\n * mode handles pointer-dismissal via its backdrop click handler\n * only when `modal=true`. Non-modal mode never dismisses on\n * pointer events. This matches the source's `disablePointerDismissal`\n * default-true behavior when used in non-modal mode (the source's\n * primary mode). DEVIATION-5 in the completion report.\n *\n * Token reskin per ADR-025 D7. No tabler icons used here.\n */\n\nimport {\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from 'react'\n\nimport { PointerSensor, useSensor, useSensors } from '@dnd-kit/core'\n\nimport { cn } from '../lib/utils'\nimport { DrawerPanel } from './drawer-panel'\nimport { DataGridTableView } from './table-view'\nimport { useGridColumns } from './use-grid-columns'\nimport { useGridEditing } from './use-grid-editing'\nimport { SCROLL_EDGES_AT_REST, type ScrollEdges } from './sticky'\nimport type {\n DataGridDrawerPanelProps,\n DataGridProps,\n DataGridRowBase,\n EditingCell,\n} from './types'\n\nexport type {\n DataGridColumn,\n DataGridDrawerPanelProps,\n DataGridProps,\n DataGridRowBase,\n DataGridToolbarRenderProps,\n} from './types'\n\nconst MIN_COLUMN_WIDTH = 96\nconst CONTROL_COLUMN_WIDTH = 40\n\nfunction isEmptyValue(value: ReactNode) {\n if (value === null || value === undefined) return true\n if (typeof value === 'string') return value.trim().length === 0\n return false\n}\n\nexport function DataGrid<Row extends DataGridRowBase, ColumnId extends string>({\n rows,\n columns,\n getRowLabel,\n renderCell,\n isEditableColumn,\n getCellEditValue,\n applyCellEdit,\n getDrawerCellValue,\n canOpenDrawer = () => true,\n renderSummary,\n renderDrawerPanel,\n renderToolbar,\n onToolbarPropsChange,\n onOpenDrawerCell,\n drawerModal = false,\n drawerSize,\n stickySummaryFooter = false,\n stickyHeader = false,\n fillWidth = false,\n fillAvailableHeight = false,\n tableContainerClassName,\n onRowsChange,\n sort,\n onSortChange,\n}: DataGridProps<Row, ColumnId>) {\n const [showSummaries, setShowSummaries] = useState(true)\n const [drawerCell, setDrawerCell] =\n useState<EditingCell<ColumnId> | null>(null)\n const [selectedRowIds, setSelectedRowIds] = useState<string[]>([])\n const [scrollEdges, setScrollEdges] =\n useState<ScrollEdges>(SCROLL_EDGES_AT_REST)\n const reactInstanceId = useId()\n const instanceId = useMemo(\n () => reactInstanceId.replace(/:/g, ''),\n [reactInstanceId],\n )\n\n const gridRef = useRef<HTMLDivElement>(null)\n const inputRef = useRef<HTMLInputElement>(null)\n const tableRef = useRef<HTMLTableElement>(null)\n\n const {\n columnWidths,\n visibleColumnIds,\n draggingColumnId,\n visibleColumns,\n gridMinWidth,\n hiddenColumns,\n toggleColumnVisibility,\n handleOptionColumnDragEnd,\n beginResize,\n } = useGridColumns({\n columns,\n tableRef,\n minColumnWidth: MIN_COLUMN_WIDTH,\n controlColumnWidth: CONTROL_COLUMN_WIDTH,\n })\n\n const optionsPointerSensorOptions = useMemo(\n () => ({\n activationConstraint: {\n distance: 6,\n },\n }),\n [],\n )\n const optionsSensors = useSensors(\n useSensor(PointerSensor, optionsPointerSensorOptions),\n )\n\n const drawerRow = useMemo(() => {\n if (!drawerCell) return null\n return rows.find((row) => row.id === drawerCell.rowId) ?? null\n }, [drawerCell, rows])\n\n const drawerRowIndex = useMemo(() => {\n if (!drawerRow) return -1\n return rows.findIndex((row) => row.id === drawerRow.id)\n }, [drawerRow, rows])\n\n const drawerColumn = useMemo(() => {\n if (!drawerCell) return null\n return columns.find((column) => column.id === drawerCell.columnId) ?? null\n }, [columns, drawerCell])\n\n const drawerCellValue = useMemo(() => {\n if (!drawerCell || !drawerRow) return null\n return getDrawerCellValue(drawerRow, drawerCell.columnId)\n }, [drawerCell, drawerRow, getDrawerCellValue])\n\n const commitRows = useCallback(\n (updater: (currentRows: Row[]) => Row[]) => {\n const nextRows = updater(rows)\n onRowsChange?.(nextRows)\n },\n [onRowsChange, rows],\n )\n\n const {\n editingCell,\n draftValue,\n setDraftValue,\n startEditing,\n commitEdit,\n cancelEdit,\n handleCellKeyDown,\n } = useGridEditing<Row, ColumnId>({\n gridRef,\n inputRef,\n visibleRowCount: rows.length,\n visibleColumnCount: visibleColumns.length,\n isEditableColumn,\n getCellEditValue,\n applyCellEdit,\n commitRows,\n })\n\n const closeDrawer = useCallback(() => {\n setDrawerCell(null)\n }, [])\n\n useEffect(() => {\n setSelectedRowIds((current) => {\n if (current.length === 0) return current\n const visibleRowIds = new Set(rows.map((row) => row.id))\n const filtered = current.filter((rowId) => visibleRowIds.has(rowId))\n return filtered.length === current.length ? current : filtered\n })\n }, [rows])\n\n const toggleRowSelection = useCallback(\n (rowId: string, checked: boolean) => {\n setSelectedRowIds((current) => {\n if (checked) {\n return current.includes(rowId) ? current : [...current, rowId]\n }\n\n return current.filter((currentRowId) => currentRowId !== rowId)\n })\n },\n [],\n )\n\n const toggleAllRows = useCallback(\n (checked: boolean) => {\n setSelectedRowIds(checked ? rows.map((row) => row.id) : [])\n },\n [rows],\n )\n\n const clearSelection = useCallback(() => {\n setSelectedRowIds([])\n }, [])\n\n const selectedRowCount = selectedRowIds.length\n const allVisibleRowsSelected =\n rows.length > 0 && selectedRowCount === rows.length\n const someVisibleRowsSelected =\n selectedRowCount > 0 && !allVisibleRowsSelected\n\n const updateRow = useCallback(\n (rowId: string, updater: (row: Row) => Row) => {\n commitRows((currentRows) =>\n currentRows.map((row) => (row.id === rowId ? updater(row) : row)),\n )\n },\n [commitRows],\n )\n\n const openDrawerRowAt = useCallback(\n (rowIndex: number) => {\n if (!drawerCell) return\n\n const nextRow = rows[rowIndex]\n if (!nextRow) return\n\n setDrawerCell({\n rowId: nextRow.id,\n columnId: drawerCell.columnId,\n })\n },\n [drawerCell, rows],\n )\n\n const openPreviousRow = useCallback(() => {\n openDrawerRowAt(drawerRowIndex - 1)\n }, [drawerRowIndex, openDrawerRowAt])\n\n const openNextRow = useCallback(() => {\n openDrawerRowAt(drawerRowIndex + 1)\n }, [drawerRowIndex, openDrawerRowAt])\n\n const drawerIsOpen = drawerCell !== null\n\n const drawerPanelProps: DataGridDrawerPanelProps<Row, ColumnId> = {\n drawerRow,\n drawerRowIndex,\n drawerRowCount: rows.length,\n drawerColumn,\n drawerCellValue,\n getRowLabel,\n isEditableColumn,\n isEmptyValue,\n updateRow,\n openPreviousRow,\n openNextRow,\n closeDrawer,\n isOpen: drawerIsOpen,\n }\n\n const toolbarProps = useMemo(\n () => ({\n visibleRowCount: rows.length,\n selectedRowIds,\n selectedRowCount,\n allVisibleRowsSelected,\n someVisibleRowsSelected,\n onToggleAllRows: toggleAllRows,\n clearSelection,\n showSummaries,\n onShowSummariesChange: setShowSummaries,\n visibleColumns,\n visibleColumnIds,\n hiddenColumns,\n toggleColumnVisibility,\n optionsSensors,\n onOptionColumnDragEnd: handleOptionColumnDragEnd,\n optionsDndContextId: `data-grid-options-${instanceId}`,\n }),\n [\n rows.length,\n selectedRowIds,\n selectedRowCount,\n allVisibleRowsSelected,\n someVisibleRowsSelected,\n toggleAllRows,\n clearSelection,\n showSummaries,\n visibleColumns,\n visibleColumnIds,\n hiddenColumns,\n toggleColumnVisibility,\n optionsSensors,\n handleOptionColumnDragEnd,\n instanceId,\n ],\n )\n\n useEffect(() => {\n onToolbarPropsChange?.(toolbarProps)\n }, [onToolbarPropsChange, toolbarProps])\n\n // Track which edges of the scroll viewport are at rest, so sticky/pinned\n // cells can show a scroll-shadow only when content is scrolled past them.\n const hasPinnedColumn = useMemo(\n () => columns.some((column) => column.pin),\n [columns],\n )\n useEffect(() => {\n if (!stickyHeader && !stickySummaryFooter && !hasPinnedColumn) return\n const scroller = tableRef.current?.parentElement\n if (!scroller) return\n\n let frame = 0\n const measure = () => {\n frame = 0\n const next: ScrollEdges = {\n atTop: scroller.scrollTop <= 0,\n atBottom:\n scroller.scrollTop + scroller.clientHeight >= scroller.scrollHeight - 1,\n atLeft: scroller.scrollLeft <= 0,\n atRight:\n scroller.scrollLeft + scroller.clientWidth >= scroller.scrollWidth - 1,\n }\n setScrollEdges((prev) =>\n prev.atTop === next.atTop &&\n prev.atBottom === next.atBottom &&\n prev.atLeft === next.atLeft &&\n prev.atRight === next.atRight\n ? prev\n : next,\n )\n }\n const onScroll = () => {\n if (!frame) frame = requestAnimationFrame(measure)\n }\n\n measure()\n scroller.addEventListener('scroll', onScroll, { passive: true })\n const observer = new ResizeObserver(measure)\n observer.observe(scroller)\n\n return () => {\n scroller.removeEventListener('scroll', onScroll)\n observer.disconnect()\n if (frame) cancelAnimationFrame(frame)\n }\n }, [stickyHeader, stickySummaryFooter, hasPinnedColumn, rows.length, columnWidths])\n\n return (\n <>\n <div\n className={cn('min-h-0', fillAvailableHeight && 'flex h-full flex-col')}\n ref={gridRef}\n >\n {renderToolbar?.(toolbarProps)}\n\n <div className={cn(fillAvailableHeight && 'min-h-0 flex-1')}>\n <DataGridTableView\n tableRef={tableRef}\n gridMinWidth={gridMinWidth}\n visibleColumns={visibleColumns}\n columnWidths={columnWidths}\n draggingColumnId={draggingColumnId}\n visibleRows={rows}\n getRowLabel={getRowLabel}\n editingCell={editingCell}\n isEditableColumn={isEditableColumn}\n startEditing={startEditing}\n onCellKeyDown={handleCellKeyDown}\n inputRef={inputRef}\n draftValue={draftValue}\n setDraftValue={setDraftValue}\n commitEdit={commitEdit}\n cancelEdit={cancelEdit}\n canOpenDrawer={canOpenDrawer}\n renderCell={renderCell}\n onOpenDrawer={(cell) => {\n if (onOpenDrawerCell) {\n onOpenDrawerCell(cell)\n return\n }\n\n setDrawerCell(cell)\n }}\n selectedRowIds={selectedRowIds}\n allVisibleRowsSelected={allVisibleRowsSelected}\n someVisibleRowsSelected={someVisibleRowsSelected}\n onToggleRowSelection={toggleRowSelection}\n onToggleAllRows={toggleAllRows}\n showSummaries={showSummaries}\n renderSummary={renderSummary}\n stickySummaryFooter={stickySummaryFooter}\n stickyHeader={stickyHeader}\n fillWidth={fillWidth}\n fillHeight={fillAvailableHeight}\n scrollEdges={scrollEdges}\n tableContainerClassName={tableContainerClassName}\n isEmptyValue={isEmptyValue}\n onResizeStart={beginResize}\n sort={sort ?? null}\n onSortChange={onSortChange}\n />\n </div>\n </div>\n\n {renderDrawerPanel ? (\n renderDrawerPanel(drawerPanelProps)\n ) : (\n <DrawerPanel\n isOpen={drawerIsOpen}\n onClose={closeDrawer}\n drawerRow={drawerRow}\n drawerColumn={drawerColumn}\n drawerCellValue={drawerCellValue}\n getRowLabel={getRowLabel}\n isEditableColumn={isEditableColumn}\n isEmptyValue={isEmptyValue}\n modal={drawerModal}\n size={drawerSize ?? undefined}\n />\n )}\n </>\n )\n}\n","/**\n * DataGridToolbar — the standard layout band that sits directly above a\n * DataGrid: a search field on the left and filter / column / view\n * controls on the right (gray-ui \"table toolbar\" pattern). Collapses to\n * a stacked column on narrow viewports.\n *\n * Purely a layout primitive — pass whatever search input + action\n * buttons you like into the slots.\n */\n\nimport type { ReactNode } from 'react'\n\nimport { cn } from '../lib/utils'\n\nexport interface DataGridToolbarProps {\n /** Left slot — typically a <SearchBar>. Stretches up to a comfortable\n * reading width, full-width when stacked. */\n search?: ReactNode\n /** Right slot — filter / columns / view-toggle controls. */\n children?: ReactNode\n className?: string\n}\n\nexport function DataGridToolbar({\n search,\n children,\n className,\n}: DataGridToolbarProps) {\n return (\n <div\n className={cn(\n 'flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between',\n className,\n )}\n >\n {search ? <div className=\"w-full sm:max-w-sm\">{search}</div> : <span />}\n {children ? (\n <div className=\"flex flex-wrap items-center gap-2 sm:justify-end\">\n {children}\n </div>\n ) : null}\n </div>\n )\n}\n","/**\n * DataGridColumnOptionsMenu — toolbar dropdown for showing summary\n * row + toggling column visibility + reordering columns via dnd-kit.\n *\n * Ported 2026-05-18 from gray-ui-csm\n * https://github.com/Jason-uxui/gray-ui-csm/blob/baf8346ac0c1160282e0b173de1bffc594d9c9c3/components/data-grid/column-options-menu.tsx\n * License: MIT (see packages/ui/licenses/gray-ui-csm-LICENSE.txt)\n * Workspace ADR: ADR-025\n *\n * BRING_WITH_REFACTOR:\n * • Token reskin per ADR-025 D7\n * • @tabler/icons-react → lucide-react per CLAUDE.md §6 (DEV-4)\n * • DropdownMenu* imports come from the workspace BUILD_FRESH\n * primitive (DEV-3). Trigger inherits the secondary Button visual\n * per ADR-026 D4 (DQ-4) — by default the workspace\n * DropdownMenuTrigger applies `.btn .btn-secondary`, so we just\n * spread the icon + label inside it.\n */\n\nimport { closestCenter, DndContext } from '@dnd-kit/core'\nimport { SortableContext, verticalListSortingStrategy } from '@dnd-kit/sortable'\nimport { SlidersHorizontal } from 'lucide-react'\n\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '../dropdown-menu'\nimport { SortableColumnOptionItem } from './sortable-parts'\nimport type {\n DataGridColumn,\n DataGridToolbarRenderProps,\n} from './types'\n\ntype DataGridColumnOptionsMenuProps<ColumnId extends string> = Pick<\n DataGridToolbarRenderProps<ColumnId>,\n | 'showSummaries'\n | 'onShowSummariesChange'\n | 'visibleColumns'\n | 'visibleColumnIds'\n | 'hiddenColumns'\n | 'toggleColumnVisibility'\n | 'optionsSensors'\n | 'onOptionColumnDragEnd'\n | 'optionsDndContextId'\n> & {\n triggerLabel?: string\n}\n\nexport function DataGridColumnOptionsMenu<ColumnId extends string>({\n showSummaries,\n onShowSummariesChange,\n visibleColumns,\n visibleColumnIds,\n hiddenColumns,\n toggleColumnVisibility,\n optionsSensors,\n onOptionColumnDragEnd,\n optionsDndContextId,\n triggerLabel = 'Options',\n}: DataGridColumnOptionsMenuProps<ColumnId>) {\n return (\n <DropdownMenu>\n <DropdownMenuTrigger aria-label=\"Open table options\">\n <SlidersHorizontal className=\"h-4 w-4\" />\n <span>{triggerLabel}</span>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-56\">\n <DropdownMenuGroup>\n <DropdownMenuLabel>Options</DropdownMenuLabel>\n </DropdownMenuGroup>\n <DropdownMenuSeparator />\n <DropdownMenuCheckboxItem\n checked={showSummaries}\n onCheckedChange={(checked) => onShowSummariesChange(checked === true)}\n >\n Show summary row\n </DropdownMenuCheckboxItem>\n\n <DropdownMenuSeparator />\n <DropdownMenuGroup>\n <DropdownMenuLabel>Columns</DropdownMenuLabel>\n </DropdownMenuGroup>\n <DndContext\n id={optionsDndContextId}\n sensors={optionsSensors}\n collisionDetection={closestCenter}\n onDragEnd={onOptionColumnDragEnd}\n >\n <SortableContext\n items={visibleColumns.map((column) => column.id)}\n strategy={verticalListSortingStrategy}\n >\n {visibleColumns.map((column) => (\n <SortableColumnOptionItem\n key={column.id}\n column={column}\n checked\n disabled={visibleColumnIds.length === 1}\n onCheckedChange={(checked) =>\n toggleColumnVisibility(column.id, checked)\n }\n />\n ))}\n </SortableContext>\n </DndContext>\n\n {hiddenColumns.length > 0 ? <DropdownMenuSeparator /> : null}\n {hiddenColumns.map((column: DataGridColumn<ColumnId>) => (\n <DropdownMenuCheckboxItem\n key={column.id}\n checked={false}\n onCheckedChange={(checked) =>\n toggleColumnVisibility(column.id, checked === true)\n }\n >\n {column.label}\n </DropdownMenuCheckboxItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n","/**\n * DropdownButton — Button-styled trigger that opens a rich popover menu.\n *\n * The split-button pattern from the design reference: a primary Button\n * with a trailing chevron-down, which on click reveals a popover of\n * actions. Items render as `icon + title + description` rows.\n *\n * Built on top of <DropdownMenu> + <DropdownMenuTrigger> +\n * <DropdownMenuContent> + <DropdownMenuItem>. Use this primitive when:\n * • A toolbar CTA has 2+ creation paths that share a noun (e.g.\n * \"New Keyword Plan\" → Set OR Group).\n * • You want a \"primary action + secondary picker\" feel without\n * resorting to multiple side-by-side buttons.\n *\n * For arbitrary menu content (sort pickers, kebab menus, etc.), use\n * the lower-level <DropdownMenu> compound directly.\n *\n * Implementation note: the trigger renders the .btn class chain\n * directly on <DropdownMenuTrigger> (rather than wrapping a <Button>),\n * so the rendered DOM stays a single <button>. The variant/size class\n * maps mirror <Button> 1:1.\n */\n\nimport { useId, type ReactNode } from 'react'\nimport { Check, ChevronDown } from 'lucide-react'\nimport type { ButtonVariant, ButtonSize } from './button'\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n type DropdownMenuContentProps,\n} from './dropdown-menu'\nimport { cn } from './lib/utils'\n\nconst VARIANT_CLASS: Record<ButtonVariant, string> = {\n primary: 'btn-primary',\n secondary: 'btn-secondary',\n outline: 'btn-outline',\n ghost: 'btn-ghost',\n destructive: 'btn-destructive',\n 'destructive-soft': 'btn-destructive-soft',\n icon: 'btn-icon',\n toolbar: 'btn-toolbar',\n}\n\nconst SIZE_CLASS: Record<ButtonSize, string> = {\n sm: 'size-sm',\n md: '',\n lg: 'size-lg',\n}\n\nexport interface DropdownButtonItem {\n /** Stable id for keying. If omitted, the index is used (avoid for\n * long lists where order can change). */\n id?: string\n /** Icon shown in the leading tile (Lucide or any ReactNode). */\n icon?: ReactNode\n /** Primary label of the item. */\n label: string\n /** Optional helper text rendered below the label. */\n description?: string\n /** Visual variant — `default` or `destructive`. */\n variant?: 'default' | 'destructive'\n disabled?: boolean\n onSelect: () => void\n}\n\nexport interface DropdownButtonProps {\n /** Trigger label (e.g., \"New Keyword Plan\"). */\n label: string\n /** Trigger variant — defaults to primary to match the screenshot. */\n variant?: ButtonVariant\n /** Trigger size — passes through to the .btn size class. */\n size?: ButtonSize\n /** Optional leading icon on the trigger (e.g., a `+`). */\n leadingIcon?: ReactNode\n /** Override the default chevron-down trailing icon if needed. */\n trailingIcon?: ReactNode\n /** Menu items rendered in order. */\n items: DropdownButtonItem[]\n /** Disable the trigger entirely. */\n disabled?: boolean\n /** Show the .is-loading state on the trigger. */\n loading?: boolean\n /** Forwarded to the trigger's className for layout overrides. */\n className?: string\n /** Popover alignment relative to the trigger. Default `end`\n * (right-aligned) to match the reference screenshot. */\n align?: DropdownMenuContentProps['align']\n /** Popover side — `top` or `bottom`. Default `bottom`. */\n side?: DropdownMenuContentProps['side']\n /** Popover gap from the trigger. Default 6. */\n sideOffset?: DropdownMenuContentProps['sideOffset']\n /** Constrain the popover width. Default `min(20rem, calc(100vw-16px))`. */\n menuWidth?: string\n /** Optional aria-label for the trigger if the visible label is\n * ambiguous (e.g., icon-only triggers). */\n triggerAriaLabel?: string\n /** Optional id of the currently-active item. When set, that item\n * renders a trailing check mark — turns the DropdownButton into a\n * single-select filter/picker. */\n activeId?: string\n /** When true, the trigger gets an accent-tinted treatment — signals\n * an engaged filter. Pair with `activeId` for filter-chip use. */\n active?: boolean\n}\n\nexport function DropdownButton({\n label,\n variant = 'primary',\n size = 'md',\n leadingIcon,\n trailingIcon,\n items,\n disabled,\n loading,\n className,\n align = 'end',\n side = 'bottom',\n sideOffset = 6,\n menuWidth = 'min(20rem, calc(100vw - 16px))',\n triggerAriaLabel,\n activeId,\n active,\n}: DropdownButtonProps) {\n const reactId = useId()\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger\n unstyled\n disabled={disabled || loading}\n aria-label={triggerAriaLabel}\n className={cn(\n 'btn',\n VARIANT_CLASS[variant],\n SIZE_CLASS[size],\n loading && 'is-loading',\n className,\n )}\n style={\n active\n ? {\n background: 'rgb(var(--accent-subtle))',\n borderColor: 'rgb(var(--accent))',\n color: 'rgb(var(--accent))',\n }\n : undefined\n }\n >\n {leadingIcon}\n <span>{label}</span>\n {trailingIcon ?? (\n <ChevronDown className=\"h-4 w-4\" aria-hidden=\"true\" />\n )}\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align={align}\n side={side}\n sideOffset={sideOffset}\n style={{ width: menuWidth, padding: 6 }}\n >\n {items.map((item, index) => {\n const isActive =\n activeId !== undefined && item.id === activeId\n return (\n <DropdownMenuItem\n key={item.id ?? `${reactId}-${index}`}\n {...(item.variant ? { variant: item.variant } : {})}\n {...(item.disabled ? { disabled: item.disabled } : {})}\n onClick={item.onSelect}\n className=\"!py-2.5 !px-2.5 !gap-3 items-start\"\n >\n {item.icon && (\n <span\n className=\"inline-flex h-9 w-9 shrink-0 items-center justify-center\"\n style={{\n background: 'rgb(var(--surface-overlay))',\n color: 'rgb(var(--text-muted))',\n borderRadius: 'var(--radius-md)',\n }}\n aria-hidden=\"true\"\n >\n {item.icon}\n </span>\n )}\n <span className=\"flex flex-col gap-0.5 min-w-0 flex-1\">\n <span\n className={cn(\n 'text-[13px] font-semibold leading-tight',\n item.variant === 'destructive'\n ? 'text-[rgb(var(--destructive))]'\n : 'text-[rgb(var(--foreground))]',\n )}\n >\n {item.label}\n </span>\n {item.description && (\n <span\n className=\"text-[12px] leading-[1.4]\"\n style={{ color: 'rgb(var(--text-tertiary))' }}\n >\n {item.description}\n </span>\n )}\n </span>\n {isActive && (\n <Check\n className=\"h-4 w-4 shrink-0 mt-0.5\"\n style={{ color: 'rgb(var(--accent))' }}\n aria-hidden=\"true\"\n />\n )}\n </DropdownMenuItem>\n )\n })}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n","/**\n * Accordion — controlled collapsible-section group.\n *\n * A vertical stack of card sections; each has a rich header (status\n * indicator + title + optional badge + summary + chevron) and a body\n * revealed when open. The consumer owns open state via `openIds` +\n * `onToggle`, so single-open, multi-open, and \"expand all\" are all\n * just different caller logic.\n *\n * <Accordion openIds={openIds} onToggle={toggle}>\n * <Accordion.Section id=\"objective\" title=\"Campaign objective\"\n * summary=\"Lead generation\" complete>\n * …body…\n * </Accordion.Section>\n * </Accordion>\n *\n * Workspace ADR: ADR-033.\n */\n\nimport { createContext, useContext, type ReactNode } from 'react'\nimport { Check, ChevronDown } from 'lucide-react'\nimport { cn } from './lib/utils'\n\ninterface AccordionContextValue {\n openIds: ReadonlySet<string>\n onToggle: (id: string) => void\n}\n\nconst AccordionCtx = createContext<AccordionContextValue | null>(null)\n\nexport interface AccordionProps {\n /** Ids of the currently-open sections. */\n openIds: string[]\n /** Fired with a section id when its header is clicked. */\n onToggle: (id: string) => void\n children: ReactNode\n className?: string\n}\n\nfunction Accordion({ openIds, onToggle, children, className }: AccordionProps) {\n return (\n <AccordionCtx.Provider value={{ openIds: new Set(openIds), onToggle }}>\n <div className={cn('flex flex-col gap-2.5', className)}>{children}</div>\n </AccordionCtx.Provider>\n )\n}\n\nexport interface AccordionSectionProps {\n /** Stable id — matched against the Accordion's `openIds`. */\n id: string\n title: string\n /** Muted one-line summary under the title. */\n summary?: ReactNode\n /** Optional node right of the title — e.g. a \"New\" <Badge>. */\n badge?: ReactNode\n /** When true the leading indicator is an accent filled check;\n * otherwise an empty ring. */\n complete?: boolean\n children: ReactNode\n}\n\nfunction AccordionSection({\n id,\n title,\n summary,\n badge,\n complete,\n children,\n}: AccordionSectionProps) {\n const ctx = useContext(AccordionCtx)\n if (!ctx) {\n throw new Error('Accordion.Section must be rendered inside <Accordion>.')\n }\n const open = ctx.openIds.has(id)\n\n return (\n <section\n data-slot=\"accordion-section\"\n data-state={open ? 'open' : 'closed'}\n style={{\n background: 'rgb(var(--bg-card))',\n border: '1px solid rgb(var(--border-card))',\n borderRadius: 'var(--radius-lg)',\n }}\n >\n <button\n type=\"button\"\n aria-expanded={open}\n onClick={() => ctx.onToggle(id)}\n className=\"flex w-full items-center gap-3 px-4 py-3.5 text-left\"\n >\n <span\n className=\"inline-flex h-[22px] w-[22px] shrink-0 items-center justify-center rounded-full\"\n style={\n complete\n ? {\n background: 'rgb(var(--accent))',\n color: 'rgb(var(--primary-foreground))',\n }\n : { border: '1.5px solid rgb(var(--border-strong))' }\n }\n aria-hidden=\"true\"\n >\n {complete && <Check className=\"h-3.5 w-3.5\" strokeWidth={3} />}\n </span>\n\n <span className=\"flex min-w-0 flex-1 flex-col gap-0.5\">\n <span className=\"flex items-center gap-2\">\n <span\n className=\"text-[14px] font-semibold tracking-[-0.01em]\"\n style={{ color: 'rgb(var(--foreground))' }}\n >\n {title}\n </span>\n {badge}\n </span>\n {summary && (\n <span\n className=\"text-[12.5px] leading-snug\"\n style={{ color: 'rgb(var(--text-tertiary))' }}\n >\n {summary}\n </span>\n )}\n </span>\n\n <ChevronDown\n className=\"h-4 w-4 shrink-0 transition-transform\"\n style={{\n color: 'rgb(var(--text-tertiary))',\n transform: open ? 'rotate(180deg)' : 'none',\n }}\n aria-hidden=\"true\"\n />\n </button>\n\n {open && (\n <div\n className=\"px-4 pb-4 pt-3.5\"\n style={{ borderTop: '1px solid rgb(var(--border))' }}\n >\n {children}\n </div>\n )}\n </section>\n )\n}\n\nconst AccordionCompound = Object.assign(Accordion, {\n Section: AccordionSection,\n})\n\nexport { AccordionCompound as Accordion }\n","/**\n * MenuButton — menu-bar dropdown for File / Edit-style affordances.\n *\n * The classic app menu-bar pattern: a bordered secondary button with a\n * trailing chevron that opens a compact menu of actions.\n *\n * Distinct from <DropdownButton>:\n * • DropdownButton — a primary/secondary CTA whose items are\n * icon-tile + title + description rows. For \"primary action +\n * secondary picker\".\n * • MenuButton — a compact secondary button whose items are\n * `icon? + label + shortcut?` rows. For a menu bar.\n *\n * Trigger is a bordered `.btn .btn-secondary` (NOT a ghost button) —\n * per CLAUDE.md §2, buttons carry a 1px border by default.\n *\n * Built on the <DropdownMenu> compound. Items accept a\n * `{ type: 'separator' }` sentinel for dividers.\n *\n * Workspace ADR: ADR-031 Decision 1.\n */\n\nimport { useId, type ReactNode } from 'react'\nimport { ChevronDown } from 'lucide-react'\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n type DropdownMenuContentProps,\n} from './dropdown-menu'\nimport { cn } from './lib/utils'\n\nexport interface MenuButtonItem {\n /** Stable id for keying. Falls back to the index. */\n id?: string\n /** Optional leading icon (Lucide or any ReactNode), sized ~14px. */\n icon?: ReactNode\n /** Primary label. */\n label: string\n /** Optional right-aligned shortcut hint, e.g. \"⌘C\". */\n shortcut?: string\n /** Visual variant. `destructive` tints the row red. */\n variant?: 'default' | 'destructive'\n disabled?: boolean\n onSelect: () => void\n}\n\n/** A divider between menu items. */\nexport interface MenuButtonSeparator {\n type: 'separator'\n}\n\nexport type MenuButtonEntry = MenuButtonItem | MenuButtonSeparator\n\nexport interface MenuButtonProps {\n /** Trigger label — e.g. \"File\", \"Edit\". */\n label: string\n /** Menu entries, in order. */\n items: MenuButtonEntry[]\n /** Optional leading icon on the trigger. */\n leadingIcon?: ReactNode\n /** Disable the trigger entirely. */\n disabled?: boolean\n /** Popover alignment relative to the trigger. Default `start`. */\n align?: DropdownMenuContentProps['align']\n /** Popover width. Default `14rem`. */\n menuWidth?: string\n /** Forwarded to the trigger className for layout overrides. */\n className?: string\n /** aria-label for the trigger when the visible label is ambiguous. */\n triggerAriaLabel?: string\n}\n\nfunction isSeparator(entry: MenuButtonEntry): entry is MenuButtonSeparator {\n return 'type' in entry && entry.type === 'separator'\n}\n\nexport function MenuButton({\n label,\n items,\n leadingIcon,\n disabled,\n align = 'start',\n menuWidth = '14rem',\n className,\n triggerAriaLabel,\n}: MenuButtonProps) {\n const reactId = useId()\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger\n unstyled\n disabled={disabled}\n aria-label={triggerAriaLabel}\n className={cn('btn btn-secondary size-sm', className)}\n >\n {leadingIcon}\n <span>{label}</span>\n <ChevronDown className=\"h-3.5 w-3.5\" aria-hidden=\"true\" />\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align={align}\n sideOffset={6}\n style={{ width: menuWidth, padding: 6 }}\n >\n {items.map((entry, index) => {\n if (isSeparator(entry)) {\n return <DropdownMenuSeparator key={`${reactId}-sep-${index}`} />\n }\n return (\n <DropdownMenuItem\n key={entry.id ?? `${reactId}-${index}`}\n {...(entry.variant ? { variant: entry.variant } : {})}\n {...(entry.disabled ? { disabled: entry.disabled } : {})}\n onClick={entry.onSelect}\n className=\"!py-1.5 !px-2 !gap-2 text-[13px]\"\n >\n <span\n className=\"inline-flex h-4 w-4 shrink-0 items-center justify-center\"\n aria-hidden=\"true\"\n >\n {entry.icon}\n </span>\n <span className=\"flex-1 truncate\">{entry.label}</span>\n {entry.shortcut && (\n <span\n className=\"shrink-0 text-[11px] tabular-nums\"\n style={{ color: 'rgb(var(--text-tertiary))' }}\n >\n {entry.shortcut}\n </span>\n )}\n </DropdownMenuItem>\n )\n })}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n","/**\n * CopyField — an input/output field with a copy button pinned to the\n * top-right corner.\n *\n * The workbench input/output pattern from the tool prototypes: a single\n * field a user types into and that a transform writes its result back\n * into (\"output replaces input\"), with a one-click copy affordance\n * always in reach.\n *\n * Wraps <Textarea> (`multiline`, the default) or <Input>. Owns the copy\n * interaction end-to-end — clipboard write, a transient ✓ confirmation,\n * and a success/error toast. The field content is right-padded so text\n * never slides under the button.\n *\n * CopyField does NOT render a char/line count — that is caller state;\n * render it in the surrounding footer.\n *\n * Workspace ADR: ADR-031 Decision 2.\n */\n\nimport {\n useId,\n useState,\n type ChangeEvent,\n type CSSProperties,\n} from 'react'\nimport { Check, Copy } from 'lucide-react'\nimport { Textarea } from './textarea'\nimport { Input } from './input'\nimport { toast } from './toast'\nimport { cn } from './lib/utils'\n\nexport interface CopyFieldProps {\n /** Field value (controlled). */\n value: string\n /** Change handler. Omit for a read-only output field. */\n onChange?: (value: string) => void\n /** Multi-line textarea (default) or single-line input. */\n multiline?: boolean\n /** Textarea row count. Ignored when `multiline` is false. */\n rows?: number\n placeholder?: string\n readOnly?: boolean\n /** Visible field label — wires `<label htmlFor>`. */\n label?: string\n /** Keep the label for assistive tech but hide it visually. */\n hideLabel?: boolean\n /** Field id. Auto-generated when omitted. */\n id?: string\n /** Toast message on a successful copy. */\n copyToastMessage?: string\n className?: string\n}\n\nexport function CopyField({\n value,\n onChange,\n multiline = true,\n rows = 10,\n placeholder,\n readOnly,\n label,\n hideLabel,\n id,\n copyToastMessage = 'Copied to clipboard',\n className,\n}: CopyFieldProps) {\n const reactId = useId()\n const fieldId = id ?? reactId\n const [copied, setCopied] = useState(false)\n\n const handleCopy = async () => {\n if (value === '') return\n let ok = false\n if (typeof navigator !== 'undefined' && navigator.clipboard) {\n try {\n await navigator.clipboard.writeText(value)\n ok = true\n } catch {\n ok = false\n }\n }\n if (ok) {\n setCopied(true)\n setTimeout(() => setCopied(false), 1500)\n toast.success(copyToastMessage)\n } else {\n toast.error('Clipboard unavailable')\n }\n }\n\n // Reserve room on the right so text never slides under the button.\n const fieldStyle: CSSProperties = { paddingRight: 44 }\n\n return (\n <div className={cn('flex flex-col gap-1.5', className)}>\n {label && (\n <label\n htmlFor={fieldId}\n className={cn(\n 'text-[12px] font-semibold tracking-[0.02em]',\n hideLabel && 'sr-only',\n )}\n style={{ color: 'rgb(var(--foreground))' }}\n >\n {label}\n </label>\n )}\n <div className=\"relative\">\n {multiline ? (\n <Textarea\n id={fieldId}\n value={value}\n {...(onChange\n ? {\n onChange: (e: ChangeEvent<HTMLTextAreaElement>) =>\n onChange(e.target.value),\n }\n : {})}\n placeholder={placeholder}\n readOnly={readOnly}\n rows={rows}\n style={fieldStyle}\n />\n ) : (\n <Input\n id={fieldId}\n value={value}\n {...(onChange\n ? {\n onChange: (e: ChangeEvent<HTMLInputElement>) =>\n onChange(e.target.value),\n }\n : {})}\n placeholder={placeholder}\n readOnly={readOnly}\n style={fieldStyle}\n />\n )}\n <button\n type=\"button\"\n onClick={handleCopy}\n disabled={value === ''}\n aria-label={copied ? 'Copied' : 'Copy'}\n className=\"absolute inline-flex items-center justify-center transition-colors disabled:opacity-40 disabled:pointer-events-none\"\n style={{\n top: 8,\n right: 8,\n height: 28,\n width: 28,\n borderRadius: 'var(--radius-xs)',\n background: 'rgb(var(--bg-card))',\n border: '1px solid rgb(var(--border))',\n boxShadow: 'var(--shadow-sm)',\n color: copied\n ? 'rgb(var(--success))'\n : 'rgb(var(--text-secondary))',\n }}\n >\n {copied ? (\n <Check className=\"h-3.5 w-3.5\" />\n ) : (\n <Copy className=\"h-3.5 w-3.5\" />\n )}\n </button>\n </div>\n </div>\n )\n}\n","/**\n * TagChipInput — type-to-create chips with autocomplete.\n *\n * Behavior:\n * • Comma or Enter commits the current draft into a chip.\n * • Backspace on an empty input removes the last chip.\n * • Autocomplete suggestions surface as a popover; filtered by the\n * current draft (case-insensitive). Click or arrow-keys + Enter to\n * pick a suggestion.\n * • Tags are case-insensitively deduped; the displayed label preserves\n * the user's first casing per session.\n * • Submitting a new label (not in suggestions) creates it inline.\n *\n * Token discipline:\n * • Chips inherit Badge tones via tokens.\n * • Popover uses --popover / --popover-foreground / --shadow-lg.\n * • No hex, no inline SVG outside Lucide.\n *\n * First consumer: Keywords lens (NewSetPage, NewGroupPage). Generic —\n * promote anywhere a multi-tag input is needed.\n */\n\nimport {\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type ChangeEvent,\n type KeyboardEvent,\n} from 'react'\nimport { createPortal } from 'react-dom'\nimport { Plus, X } from 'lucide-react'\nimport { cn } from './lib/utils'\n\nexport interface TagChipInputProps {\n /** Current list of tag labels. */\n value: string[]\n onChange: (next: string[]) => void\n /** Existing labels (across all items in scope) used for autocomplete. */\n suggestions?: string[]\n placeholder?: string\n /** Hard cap on the number of chips. When reached, the input becomes\n * disabled with a \"max reached\" hint. */\n max?: number\n /** Maximum length of any single tag. Defaults to 60. */\n maxLength?: number\n /** Disable input + interactions. */\n disabled?: boolean\n /** id attached to the text input — for label-for binding. */\n id?: string\n /** Apply error styling. */\n error?: boolean\n className?: string\n}\n\nfunction normalize(label: string): string {\n return label.trim().toLowerCase()\n}\n\nexport function TagChipInput({\n value,\n onChange,\n suggestions = [],\n placeholder = 'Add a tag…',\n max,\n maxLength = 60,\n disabled,\n id,\n error,\n className,\n}: TagChipInputProps) {\n const [draft, setDraft] = useState('')\n const [open, setOpen] = useState(false)\n const [activeIndex, setActiveIndex] = useState(0)\n const inputRef = useRef<HTMLInputElement | null>(null)\n const wrapperRef = useRef<HTMLDivElement | null>(null)\n const popoverRef = useRef<HTMLDivElement | null>(null)\n const generatedId = useId()\n const popoverId = `tag-chip-${generatedId.replace(/:/g, '')}`\n\n const atMax = typeof max === 'number' && value.length >= max\n const isDisabled = disabled || atMax\n\n // Filter suggestions: not already in value, matches draft (substring,\n // case-insensitive), sorted alpha. Limited to 8 to keep the popover\n // tight.\n const filteredSuggestions = useMemo(() => {\n const selected = new Set(value.map(normalize))\n const needle = normalize(draft)\n return suggestions\n .filter((s) => {\n const n = normalize(s)\n if (selected.has(n)) return false\n if (needle && !n.includes(needle)) return false\n return true\n })\n .slice(0, 8)\n }, [suggestions, value, draft])\n\n // Show the \"create\" affordance when the draft is non-empty and isn't\n // already a chip / suggestion (case-insensitive).\n const canCreate = useMemo(() => {\n const needle = normalize(draft)\n if (!needle) return false\n if (value.some((v) => normalize(v) === needle)) return false\n if (suggestions.some((s) => normalize(s) === needle)) return false\n return true\n }, [draft, value, suggestions])\n\n const optionCount = filteredSuggestions.length + (canCreate ? 1 : 0)\n\n // Clamp activeIndex when the option list changes.\n useEffect(() => {\n if (activeIndex >= optionCount) {\n setActiveIndex(Math.max(0, optionCount - 1))\n }\n }, [optionCount, activeIndex])\n\n const addTag = useCallback(\n (label: string) => {\n const cleaned = label.trim()\n if (!cleaned) return\n const exists = value.some((v) => normalize(v) === normalize(cleaned))\n if (exists) {\n setDraft('')\n return\n }\n if (typeof max === 'number' && value.length >= max) return\n onChange([...value, cleaned])\n setDraft('')\n setActiveIndex(0)\n },\n [value, onChange, max],\n )\n\n const removeAt = useCallback(\n (index: number) => {\n const next = value.filter((_, i) => i !== index)\n onChange(next)\n },\n [value, onChange],\n )\n\n const commitFromKeyboard = useCallback(() => {\n if (!open || optionCount === 0) {\n // Plain submit of whatever's in the draft.\n if (draft.trim()) addTag(draft)\n return\n }\n if (activeIndex < filteredSuggestions.length) {\n addTag(filteredSuggestions[activeIndex]!)\n } else {\n addTag(draft)\n }\n }, [open, optionCount, activeIndex, filteredSuggestions, draft, addTag])\n\n const handleChange = (event: ChangeEvent<HTMLInputElement>) => {\n setDraft(event.target.value)\n setOpen(true)\n setActiveIndex(0)\n }\n\n const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter') {\n event.preventDefault()\n commitFromKeyboard()\n return\n }\n if (event.key === ',') {\n event.preventDefault()\n if (draft.trim()) addTag(draft)\n return\n }\n if (event.key === 'Backspace' && draft.length === 0 && value.length > 0) {\n event.preventDefault()\n removeAt(value.length - 1)\n return\n }\n if (event.key === 'ArrowDown' && optionCount > 0) {\n event.preventDefault()\n setOpen(true)\n setActiveIndex((i) => (i + 1) % optionCount)\n return\n }\n if (event.key === 'ArrowUp' && optionCount > 0) {\n event.preventDefault()\n setOpen(true)\n setActiveIndex((i) => (i - 1 + optionCount) % optionCount)\n return\n }\n if (event.key === 'Escape') {\n setOpen(false)\n return\n }\n }\n\n // Outside-click + Esc dismissal of the popover.\n useEffect(() => {\n if (!open) return\n const onPointerDown = (event: PointerEvent) => {\n const target = event.target as Node | null\n if (!target) return\n if (wrapperRef.current?.contains(target)) return\n if (popoverRef.current?.contains(target)) return\n setOpen(false)\n }\n document.addEventListener('pointerdown', onPointerDown)\n return () => document.removeEventListener('pointerdown', onPointerDown)\n }, [open])\n\n // Position the popover under the wrapper.\n const [popoverPos, setPopoverPos] = useState<{\n left: number\n top: number\n width: number\n } | null>(null)\n useEffect(() => {\n if (!open) {\n setPopoverPos(null)\n return\n }\n const measure = () => {\n const wrap = wrapperRef.current\n if (!wrap) return\n const rect = wrap.getBoundingClientRect()\n setPopoverPos({\n left: rect.left,\n top: rect.bottom + 4,\n width: rect.width,\n })\n }\n measure()\n window.addEventListener('resize', measure)\n window.addEventListener('scroll', measure, true)\n return () => {\n window.removeEventListener('resize', measure)\n window.removeEventListener('scroll', measure, true)\n }\n }, [open])\n\n return (\n <>\n <div\n ref={wrapperRef}\n className={cn(\n 'flex flex-wrap items-center gap-1.5 px-2 py-1.5 min-h-10 cursor-text',\n 'border transition-colors',\n error\n ? 'border-[rgb(var(--destructive))] focus-within:border-[rgb(var(--destructive))]'\n : 'border-[rgb(var(--border))] focus-within:border-[rgb(var(--accent))]',\n isDisabled && 'opacity-60 cursor-not-allowed',\n className,\n )}\n style={{\n background: 'rgb(var(--bg-input))',\n borderRadius: 'var(--radius-sm)',\n }}\n onClick={() => {\n if (!isDisabled) inputRef.current?.focus()\n }}\n >\n {value.map((label, index) => (\n <span\n key={`${label}-${index}`}\n className=\"inline-flex items-center gap-1 pl-2 pr-1 py-0.5 text-[12px] font-medium\"\n style={{\n background: 'rgb(var(--surface-overlay))',\n color: 'rgb(var(--foreground))',\n borderRadius: 'var(--radius-xs)',\n }}\n >\n <span className=\"truncate max-w-[12rem]\">{label}</span>\n <button\n type=\"button\"\n aria-label={`Remove tag ${label}`}\n onClick={(e) => {\n e.stopPropagation()\n removeAt(index)\n }}\n className=\"inline-flex h-4 w-4 items-center justify-center rounded-[var(--radius-xs)] transition-colors hover:bg-[rgb(var(--surface-overlay-strong))]\"\n style={{ color: 'rgb(var(--text-muted))' }}\n >\n <X className=\"h-3 w-3\" aria-hidden=\"true\" />\n </button>\n </span>\n ))}\n <input\n ref={inputRef}\n id={id}\n type=\"text\"\n value={draft}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onFocus={() => setOpen(true)}\n placeholder={value.length === 0 ? placeholder : ''}\n disabled={isDisabled}\n maxLength={maxLength}\n autoComplete=\"off\"\n aria-autocomplete=\"list\"\n aria-controls={open ? popoverId : undefined}\n aria-expanded={open}\n className=\"flex-1 min-w-[6rem] bg-transparent text-[13px] outline-none disabled:cursor-not-allowed\"\n style={{ color: 'rgb(var(--foreground))' }}\n />\n </div>\n\n {atMax && (\n <p\n className=\"text-[11px] mt-1\"\n style={{ color: 'rgb(var(--text-tertiary))' }}\n >\n Maximum of {max} tags reached.\n </p>\n )}\n\n {open && popoverPos && optionCount > 0 && typeof document !== 'undefined'\n ? createPortal(\n <div\n ref={popoverRef}\n id={popoverId}\n role=\"listbox\"\n className=\"fixed z-[100] p-1 overflow-y-auto max-h-64\"\n style={{\n left: popoverPos.left,\n top: popoverPos.top,\n width: popoverPos.width,\n background: 'rgb(var(--popover))',\n color: 'rgb(var(--popover-foreground))',\n border: '1px solid rgb(var(--border))',\n borderRadius: 'var(--radius-md)',\n boxShadow: 'var(--shadow-lg, 0 10px 32px rgba(0,0,0,0.18))',\n }}\n >\n {filteredSuggestions.map((label, index) => {\n const isActive = index === activeIndex\n return (\n <button\n key={label}\n type=\"button\"\n role=\"option\"\n aria-selected={isActive}\n onClick={() => addTag(label)}\n onMouseEnter={() => setActiveIndex(index)}\n className={cn(\n 'w-full flex items-center gap-2 px-2 py-1.5 text-left text-[13px]',\n 'rounded-[var(--radius-xs)] cursor-default',\n isActive\n ? 'bg-[rgb(var(--surface-overlay))]'\n : 'hover:bg-[rgb(var(--surface-overlay-soft))]',\n )}\n style={{ color: 'rgb(var(--foreground))' }}\n >\n <span className=\"truncate\">{label}</span>\n </button>\n )\n })}\n {canCreate && (\n <button\n key=\"__create__\"\n type=\"button\"\n role=\"option\"\n aria-selected={activeIndex === filteredSuggestions.length}\n onClick={() => addTag(draft)}\n onMouseEnter={() =>\n setActiveIndex(filteredSuggestions.length)\n }\n className={cn(\n 'w-full flex items-center gap-2 px-2 py-1.5 text-left text-[13px]',\n 'rounded-[var(--radius-xs)] cursor-default',\n activeIndex === filteredSuggestions.length\n ? 'bg-[rgb(var(--surface-overlay))]'\n : 'hover:bg-[rgb(var(--surface-overlay-soft))]',\n )}\n style={{ color: 'rgb(var(--foreground))' }}\n >\n <Plus\n className=\"h-3.5 w-3.5 shrink-0\"\n style={{ color: 'rgb(var(--text-muted))' }}\n aria-hidden=\"true\"\n />\n <span className=\"truncate\">\n Create “{draft.trim()}”\n </span>\n </button>\n )}\n </div>,\n document.body,\n )\n : null}\n </>\n )\n}\n","/**\n * FolderTreePicker — dropdown picker for a nestable folder tree.\n *\n * Behavior:\n * • Trigger renders the selected folder's name (with parent breadcrumb\n * when nested) or a placeholder when none.\n * • Popover shows a \"(No folder)\" option + DFS-ordered tree with\n * indent by depth.\n * • Optional inline \"+ New folder\" path — when the consumer passes\n * `onCreateFolder`, the popover footer exposes a create form whose\n * parent defaults to the currently selected folder (or root).\n *\n * Generic — accepts a `folders: Array<{ id, name, parentId }>` shape so\n * any folder-like data structure can use it. First consumer: Keywords\n * lens NewSetPage / NewGroupPage.\n *\n * Token discipline: tokens only (no hex). Trigger inherits the same\n * `.btn .btn-secondary` chrome as our other dropdown triggers for\n * visual consistency.\n */\n\nimport {\n useCallback,\n useEffect,\n useId,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type ChangeEvent,\n type KeyboardEvent,\n} from 'react'\nimport { createPortal } from 'react-dom'\nimport { Check, ChevronDown, FolderClosed, FolderPlus, X } from 'lucide-react'\nimport { cn } from './lib/utils'\n\nexport interface FolderTreeNode {\n id: string\n name: string\n parentId: string | null\n}\n\nexport interface FolderTreePickerProps {\n /** Flat list of folder nodes (parentId references id). */\n folders: FolderTreeNode[]\n /** Currently selected folder id, or null for \"no folder\" / root. */\n value: string | null\n onChange: (next: string | null) => void\n /** Optional inline-create handler. When omitted, the create UI is\n * hidden — the picker is read-only over the given folders. The\n * returned id is selected on success. */\n onCreateFolder?: (input: {\n name: string\n parentId: string | null\n }) => Promise<{ id: string }>\n /** Placeholder when no folder is selected. */\n placeholder?: string\n /** Disable everything. */\n disabled?: boolean\n /** id for the trigger — supports label-for binding. */\n id?: string\n /** Optional className for the trigger button. */\n className?: string\n /** Apply error styling to the trigger. */\n error?: boolean\n}\n\ninterface OrderedNode extends FolderTreeNode {\n depth: number\n}\n\nfunction buildOrderedTree(folders: FolderTreeNode[]): OrderedNode[] {\n // Children index keyed by parentId (null bucket = root).\n const byParent = new Map<string | null, FolderTreeNode[]>()\n for (const f of folders) {\n const list = byParent.get(f.parentId) ?? []\n list.push(f)\n byParent.set(f.parentId, list)\n }\n for (const list of byParent.values()) {\n list.sort((a, b) => a.name.localeCompare(b.name))\n }\n const out: OrderedNode[] = []\n const walk = (parentId: string | null, depth: number) => {\n const children = byParent.get(parentId) ?? []\n for (const child of children) {\n out.push({ ...child, depth })\n walk(child.id, depth + 1)\n }\n }\n walk(null, 0)\n return out\n}\n\nfunction buildBreadcrumb(\n folders: FolderTreeNode[],\n id: string | null,\n): string {\n if (!id) return ''\n const byId = new Map(folders.map((f) => [f.id, f]))\n const chain: string[] = []\n let cur: FolderTreeNode | undefined = byId.get(id)\n while (cur) {\n chain.unshift(cur.name)\n cur = cur.parentId ? byId.get(cur.parentId) : undefined\n }\n return chain.join(' / ')\n}\n\nexport function FolderTreePicker({\n folders,\n value,\n onChange,\n onCreateFolder,\n placeholder = 'No folder',\n disabled,\n id,\n className,\n error,\n}: FolderTreePickerProps) {\n const [open, setOpen] = useState(false)\n const [creating, setCreating] = useState(false)\n const [draft, setDraft] = useState('')\n const [pending, setPending] = useState(false)\n const [createError, setCreateError] = useState<string | null>(null)\n const triggerRef = useRef<HTMLButtonElement | null>(null)\n const popoverRef = useRef<HTMLDivElement | null>(null)\n const draftInputRef = useRef<HTMLInputElement | null>(null)\n const generatedId = useId()\n const popoverId = `folder-picker-${generatedId.replace(/:/g, '')}`\n\n const orderedTree = useMemo(() => buildOrderedTree(folders), [folders])\n const selectedLabel = useMemo(\n () => buildBreadcrumb(folders, value),\n [folders, value],\n )\n\n const closeAndReset = useCallback(() => {\n setOpen(false)\n setCreating(false)\n setDraft('')\n setCreateError(null)\n }, [])\n\n // Outside-click + Escape.\n useEffect(() => {\n if (!open) return\n const onPointerDown = (event: PointerEvent) => {\n const target = event.target as Node | null\n if (!target) return\n if (triggerRef.current?.contains(target)) return\n if (popoverRef.current?.contains(target)) return\n closeAndReset()\n }\n const onKeyDown = (event: KeyboardEvent | globalThis.KeyboardEvent) => {\n if (event.key === 'Escape') {\n event.stopPropagation()\n closeAndReset()\n triggerRef.current?.focus()\n }\n }\n document.addEventListener('pointerdown', onPointerDown)\n document.addEventListener('keydown', onKeyDown as EventListener)\n return () => {\n document.removeEventListener('pointerdown', onPointerDown)\n document.removeEventListener('keydown', onKeyDown as EventListener)\n }\n }, [open, closeAndReset])\n\n // Position the popover under the trigger. Same two-phase approach as\n // <DropdownMenuContent>: render off-screen at first, measure, then\n // reposition + reveal.\n const [popoverPos, setPopoverPos] = useState<{\n left: number\n top: number\n width: number\n } | null>(null)\n useLayoutEffect(() => {\n if (!open) {\n setPopoverPos(null)\n return\n }\n const measure = () => {\n const trig = triggerRef.current\n if (!trig) return\n const rect = trig.getBoundingClientRect()\n // Width: at least 240px, capped at viewport.\n const width = Math.max(\n 240,\n Math.min(rect.width, window.innerWidth - 16),\n )\n const gutter = 8\n let left = rect.left\n const maxLeft = window.innerWidth - width - gutter\n left = Math.max(gutter, Math.min(left, maxLeft))\n const top = rect.bottom + 6\n setPopoverPos({ left, top, width })\n }\n measure()\n window.addEventListener('resize', measure)\n window.addEventListener('scroll', measure, true)\n return () => {\n window.removeEventListener('resize', measure)\n window.removeEventListener('scroll', measure, true)\n }\n }, [open])\n\n // Focus the draft input when the create row opens.\n useEffect(() => {\n if (creating) {\n // Delay one frame so the input renders before focus.\n const handle = requestAnimationFrame(() => {\n draftInputRef.current?.focus()\n })\n return () => cancelAnimationFrame(handle)\n }\n return undefined\n }, [creating])\n\n const handleCreate = async () => {\n if (!onCreateFolder) return\n const name = draft.trim()\n if (!name) return\n setPending(true)\n setCreateError(null)\n try {\n const created = await onCreateFolder({\n name,\n parentId: value,\n })\n onChange(created.id)\n closeAndReset()\n } catch (err) {\n setCreateError(\n err instanceof Error ? err.message : 'Could not create folder.',\n )\n } finally {\n setPending(false)\n }\n }\n\n const handleDraftKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter') {\n event.preventDefault()\n handleCreate()\n }\n if (event.key === 'Escape') {\n event.preventDefault()\n setCreating(false)\n setDraft('')\n setCreateError(null)\n }\n }\n\n const isPositioned = popoverPos !== null\n\n return (\n <>\n <button\n ref={triggerRef}\n id={id}\n type=\"button\"\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-controls={open ? popoverId : undefined}\n disabled={disabled}\n onClick={() => setOpen((o) => !o)}\n className={cn('btn btn-secondary justify-between w-full', className)}\n style={{\n /* --ring-error is a box-shadow LIST, not a colour; rgb(var(--ring-error))\n is invalid CSS and gets dropped, which left this error state inert.\n The colour token is --destructive (what .input-shell.is-error uses). */\n borderColor: error ? 'rgb(var(--destructive))' : undefined,\n }}\n >\n <span className=\"inline-flex items-center gap-2 min-w-0\">\n <FolderClosed\n className=\"h-4 w-4 shrink-0\"\n style={{\n color: value\n ? 'rgb(var(--text-secondary))'\n : 'rgb(var(--text-tertiary))',\n }}\n aria-hidden=\"true\"\n />\n <span\n className=\"truncate\"\n style={{\n color: value\n ? 'rgb(var(--foreground))'\n : 'rgb(var(--text-tertiary))',\n }}\n >\n {selectedLabel || placeholder}\n </span>\n </span>\n <ChevronDown\n className=\"h-4 w-4 shrink-0\"\n aria-hidden=\"true\"\n style={{ color: 'rgb(var(--text-muted))' }}\n />\n </button>\n\n {open && typeof document !== 'undefined'\n ? createPortal(\n <div\n ref={popoverRef}\n id={popoverId}\n role=\"listbox\"\n className=\"fixed z-[100] overflow-hidden flex flex-col\"\n style={{\n left: popoverPos?.left ?? -99999,\n top: popoverPos?.top ?? -99999,\n width: popoverPos?.width,\n opacity: isPositioned ? undefined : 0,\n visibility: isPositioned ? 'visible' : 'hidden',\n pointerEvents: isPositioned ? undefined : 'none',\n background: 'rgb(var(--popover))',\n color: 'rgb(var(--popover-foreground))',\n border: '1px solid rgb(var(--border))',\n borderRadius: 'var(--radius-md)',\n boxShadow:\n 'var(--shadow-lg, 0 10px 32px rgba(0,0,0,0.18))',\n maxHeight: 'min(60vh, 28rem)',\n }}\n >\n <div className=\"overflow-y-auto flex-1 p-1\">\n <PickerOption\n label={placeholder}\n selected={value === null}\n depth={0}\n showIcon={false}\n onClick={() => {\n onChange(null)\n closeAndReset()\n }}\n />\n {orderedTree.length > 0 && (\n <div\n className=\"my-1 h-px\"\n style={{ background: 'rgb(var(--border))' }}\n />\n )}\n {orderedTree.map((node) => (\n <PickerOption\n key={node.id}\n label={node.name}\n selected={value === node.id}\n depth={node.depth}\n showIcon\n onClick={() => {\n onChange(node.id)\n closeAndReset()\n }}\n />\n ))}\n </div>\n\n {onCreateFolder && (\n <div\n className=\"p-1 shrink-0\"\n style={{\n borderTop: '1px solid rgb(var(--border))',\n background: 'rgb(var(--surface-overlay-soft))',\n }}\n >\n {creating ? (\n <div className=\"flex flex-col gap-1 px-1.5 py-1\">\n <div className=\"flex items-center gap-1.5\">\n <FolderPlus\n className=\"h-3.5 w-3.5 shrink-0\"\n style={{ color: 'rgb(var(--text-muted))' }}\n aria-hidden=\"true\"\n />\n <input\n ref={draftInputRef}\n type=\"text\"\n value={draft}\n onChange={(e: ChangeEvent<HTMLInputElement>) =>\n setDraft(e.target.value)\n }\n onKeyDown={handleDraftKeyDown}\n placeholder={\n value\n ? 'New sub-folder name'\n : 'New folder name'\n }\n maxLength={80}\n disabled={pending}\n className=\"flex-1 min-w-0 bg-transparent text-[13px] outline-none\"\n style={{ color: 'rgb(var(--foreground))' }}\n />\n <button\n type=\"button\"\n aria-label=\"Cancel new folder\"\n onClick={() => {\n setCreating(false)\n setDraft('')\n setCreateError(null)\n }}\n className=\"inline-flex h-5 w-5 items-center justify-center rounded-[var(--radius-xs)] hover:bg-[rgb(var(--surface-overlay))]\"\n style={{ color: 'rgb(var(--text-muted))' }}\n >\n <X className=\"h-3 w-3\" aria-hidden=\"true\" />\n </button>\n <button\n type=\"button\"\n onClick={handleCreate}\n disabled={pending || draft.trim().length === 0}\n className=\"btn btn-primary size-sm\"\n >\n Create\n </button>\n </div>\n {value && (\n <span\n className=\"text-[11px] pl-5\"\n style={{ color: 'rgb(var(--text-tertiary))' }}\n >\n Created inside {selectedLabel}\n </span>\n )}\n {createError && (\n <span\n role=\"alert\"\n className=\"text-[11px] pl-5\"\n style={{ color: 'rgb(var(--destructive))' }}\n >\n {createError}\n </span>\n )}\n </div>\n ) : (\n <button\n type=\"button\"\n onClick={() => setCreating(true)}\n className=\"w-full flex items-center gap-2 px-2 py-1.5 text-left text-[13px] rounded-[var(--radius-xs)] hover:bg-[rgb(var(--surface-overlay))]\"\n style={{ color: 'rgb(var(--foreground))' }}\n >\n <FolderPlus\n className=\"h-3.5 w-3.5 shrink-0\"\n style={{ color: 'rgb(var(--text-muted))' }}\n aria-hidden=\"true\"\n />\n <span>New folder</span>\n </button>\n )}\n </div>\n )}\n </div>,\n document.body,\n )\n : null}\n </>\n )\n}\n\ninterface PickerOptionProps {\n label: string\n selected: boolean\n depth: number\n showIcon: boolean\n onClick: () => void\n}\n\nfunction PickerOption({\n label,\n selected,\n depth,\n showIcon,\n onClick,\n}: PickerOptionProps) {\n return (\n <button\n type=\"button\"\n role=\"option\"\n aria-selected={selected}\n onClick={onClick}\n className={cn(\n 'w-full flex items-center gap-2 px-2 py-1.5 text-left text-[13px]',\n 'rounded-[var(--radius-xs)] cursor-default',\n selected\n ? 'bg-[rgb(var(--surface-overlay))]'\n : 'hover:bg-[rgb(var(--surface-overlay-soft))]',\n )}\n style={{\n color: 'rgb(var(--foreground))',\n paddingLeft: `${0.5 + depth * 0.875}rem`,\n }}\n >\n {showIcon ? (\n <FolderClosed\n className=\"h-3.5 w-3.5 shrink-0\"\n style={{ color: 'rgb(var(--text-muted))' }}\n aria-hidden=\"true\"\n />\n ) : (\n <span className=\"h-3.5 w-3.5 shrink-0\" aria-hidden=\"true\" />\n )}\n <span className=\"truncate flex-1\">{label}</span>\n {selected && (\n <Check\n className=\"h-3.5 w-3.5 shrink-0\"\n style={{ color: 'rgb(var(--accent))' }}\n aria-hidden=\"true\"\n />\n )}\n </button>\n )\n}\n","/**\n * Shell — multi-tray framed-card pattern.\n *\n * Two-level card structure: an outer slate \"wrapper\" that holds one or\n * more white panes inside it. Inspired by `src/lenses/brand/identity-\n * rail.tsx` and codified into a reusable primitive after the utility-\n * tools redesign (2026-05-19).\n *\n * Anatomy:\n *\n * ┌─────────────────────────────────────────────┐\n * │ outer frame (--card-frame-bg + 16px │ ← <Shell>\n * │ radius + border + rest-shadow + 10px │\n * │ padding + 10px flex-gap) │\n * │ │\n * │ ┌───────────────────────────────────────┐ │ ← <Shell.Tray>\n * │ │ Title meta │ │ <Shell.TrayHeader>\n * │ │ │ │\n * │ │ body content │ │ <Shell.TrayBody>\n * │ │ │ │\n * │ │ ─────────────────────────────────────│ │\n * │ │ toggle toggle [Primary] │ │ <Shell.TrayFooter>\n * │ └───────────────────────────────────────┘ │\n * │ ┌───────────────────────────────────────┐ │\n * │ │ Title │ │\n * │ │ body content │ │\n * │ └───────────────────────────────────────┘ │\n * └─────────────────────────────────────────────┘\n *\n * Compound API:\n * • <Shell> outer frame (page-level wrapper auto-centers)\n * • <Shell.Tray> inner pane\n * • <Shell.TrayHeader> title + meta + optional accent numeral\n * • <Shell.TrayBody> body content\n * • <Shell.TrayFooter> recessed footer strip — secondary controls\n * left, primary right via marginLeft:auto\n * • <Shell.SubCard> card-inside-a-tray for grouped items\n *\n * Token discipline: internal-only tokens (--card-frame-bg, --tray-bg,\n * --card-foot-bg, --border-card, --card-shadow-rest) are touched HERE,\n * not in app code. Consumers compose Shell.* with their own content.\n *\n * Icon-agnostic. No hardcoded icons.\n *\n * SPACING REFERENCE (per the locked spec):\n * • Outer frame padding: 10px (all sides)\n * • Gap between trays: 10px (flex gap, NOT margin)\n * • Tray header padding: 20px 24px 0\n * • Tray body padding: 14px 24px 22px (top 14 = header bottom shim)\n * • Tray footer padding: 14px 18px (or 12px 18px compact)\n * • Outer radius: 16px (--radius-lg) — inner tray radius: 12px\n * (--radius-md) — DO NOT change one without the other.\n */\n\nimport {\n forwardRef,\n type HTMLAttributes,\n type ReactNode,\n} from 'react'\nimport { cn } from './lib/utils'\n\n// ─── Shell (outer frame) ───────────────────────────────────────────\n\nexport interface ShellProps extends HTMLAttributes<HTMLDivElement> {\n /** Max-width for the auto-centered page-level wrapper, in pixels.\n * Default 760 (tool-page width). New Set / similar form pages use\n * 880. When `centered` is false, the value is ignored. */\n maxWidth?: number\n /** When true (default), the frame is centered horizontally inside\n * its parent via `mx-auto` + `max-width`. Pass `false` if you need\n * the frame to fill its parent (e.g. inside a tight grid cell). */\n centered?: boolean\n}\n\nconst ShellRoot = forwardRef<HTMLDivElement, ShellProps>(function Shell(\n { maxWidth = 760, centered = true, className, style, children, ...rest },\n ref,\n) {\n return (\n <div\n ref={ref}\n data-framed=\"true\"\n data-slot=\"shell\"\n className={cn(\n 'ds-card-surface flex flex-col',\n centered && 'mx-auto w-full',\n className,\n )}\n style={{\n background: 'rgb(var(--card-frame-bg))',\n // 10px padding + 10px gap is what makes the trays \"float\"\n // inside the frame. Concentric 16px outer / 12px inner radii\n // depend on the 4px wall + 10px gap working together.\n padding: 10,\n gap: 10,\n ...(centered ? { maxWidth } : {}),\n ...style,\n }}\n {...rest}\n >\n {children}\n </div>\n )\n})\n\n// ─── Shell.Tray ─────────────────────────────────────────────────────\n\nexport interface ShellTrayProps extends HTMLAttributes<HTMLElement> {\n /** Visual variant. `default` (white inner pane, used for primary\n * content) or `compact` (tighter padding for dense rows). */\n variant?: 'default' | 'compact'\n}\n\nconst Tray = forwardRef<HTMLElement, ShellTrayProps>(function ShellTray(\n { variant = 'default', className, style, children, ...rest },\n ref,\n) {\n void variant\n return (\n <section\n ref={ref}\n data-slot=\"shell-tray\"\n // `overflow: hidden` is required so the recessed footer's flat\n // top edge clips cleanly inside the tray's 12px corners.\n className={cn('flex flex-col', className)}\n style={{\n background: 'rgb(var(--tray-bg))',\n border: '1px solid rgb(var(--border-card))',\n borderRadius: 12,\n overflow: 'hidden',\n // Reset any margin the global `.ds-card-tray` class would\n // apply — Shell uses flex-gap on the frame instead.\n margin: 0,\n ...style,\n }}\n {...rest}\n >\n {children}\n </section>\n )\n})\n\n// ─── Shell.TrayHeader ───────────────────────────────────────────────\n\nexport interface ShellTrayHeaderProps\n extends Omit<HTMLAttributes<HTMLElement>, 'title'> {\n title: ReactNode\n /** Right-aligned meta — e.g. \"12 lines · 3 dupes\" or\n * \"Name is required · everything else is optional\". */\n meta?: ReactNode\n /** Optional left-side numeral chip (\"01\", \"02\") in accent color.\n * Skip for tools that don't need step indication. */\n index?: ReactNode\n /** Optional supporting copy beneath the title row. */\n description?: ReactNode\n /** Tighter padding for dense layouts. */\n compact?: boolean\n}\n\nfunction TrayHeader({\n title,\n meta,\n index,\n description,\n compact,\n className,\n style,\n ...rest\n}: ShellTrayHeaderProps) {\n return (\n <header\n data-slot=\"shell-tray-header\"\n className={cn('flex flex-col gap-1.5', className)}\n style={{\n // 20px top / 24px sides / 0 bottom — body padding shimmies\n // the 14px top to land at 14px from the title baseline.\n padding: compact ? '16px 18px 0' : '20px 24px 0',\n ...style,\n }}\n {...rest}\n >\n <div className=\"flex items-baseline justify-between gap-3 flex-wrap\">\n <div className=\"flex items-baseline gap-2 min-w-0\">\n {index && (\n <span\n className=\"text-[11px] font-bold uppercase tracking-[0.12em] shrink-0\"\n style={{ color: 'rgb(var(--accent))' }}\n >\n {index}\n </span>\n )}\n <h2\n className=\"text-[15px] font-semibold leading-tight truncate\"\n style={{\n color: 'rgb(var(--foreground))',\n letterSpacing: '-0.005em',\n }}\n >\n {title}\n </h2>\n </div>\n {meta && (\n <span\n className=\"text-[11.5px] tabular-nums shrink-0\"\n style={{ color: 'rgb(var(--text-tertiary))' }}\n >\n {meta}\n </span>\n )}\n </div>\n {description && (\n <p\n className=\"text-[13px] leading-[1.45]\"\n style={{ color: 'rgb(var(--text-tertiary))' }}\n >\n {description}\n </p>\n )}\n </header>\n )\n}\n\n// ─── Shell.TrayBody ─────────────────────────────────────────────────\n\nexport interface ShellTrayBodyProps extends HTMLAttributes<HTMLDivElement> {\n /** Vertical gap between children. Default `form` (16px). `grid`\n * (14px) is for tighter sub-card grids. `flush` (0) lets the\n * consumer manage spacing entirely. */\n spacing?: 'form' | 'grid' | 'flush'\n /** Tighter padding for dense layouts. */\n compact?: boolean\n}\n\nfunction TrayBody({\n spacing = 'form',\n compact,\n className,\n style,\n children,\n ...rest\n}: ShellTrayBodyProps) {\n const gap = spacing === 'flush' ? 0 : spacing === 'grid' ? 14 : 16\n return (\n <div\n data-slot=\"shell-tray-body\"\n className={cn('flex flex-col', className)}\n style={{\n padding: compact ? '12px 18px 18px' : '14px 24px 22px',\n gap,\n ...style,\n }}\n {...rest}\n >\n {children}\n </div>\n )\n}\n\n// ─── Shell.TrayFooter ───────────────────────────────────────────────\n\nexport interface ShellTrayFooterProps\n extends HTMLAttributes<HTMLDivElement> {\n /** Tighter padding for dense layouts. */\n compact?: boolean\n /** Left-aligned secondary controls (toggles, disclosure, etc.).\n * Renders inline before any extra children. */\n left?: ReactNode\n /** Right-aligned primary action (button, link, etc.). Pushed to\n * the right edge via `margin-left: auto`. */\n right?: ReactNode\n}\n\nfunction TrayFooter({\n compact,\n left,\n right,\n className,\n style,\n children,\n ...rest\n}: ShellTrayFooterProps) {\n return (\n <div\n data-slot=\"shell-tray-footer\"\n className={cn(\n 'flex items-center gap-3 flex-wrap',\n className,\n )}\n style={{\n background: 'rgb(var(--card-foot-bg))',\n borderTop: '1px solid rgb(var(--border-card))',\n padding: compact ? '12px 18px' : '14px 18px',\n ...style,\n }}\n {...rest}\n >\n {left && (\n <div className=\"flex items-center gap-4 flex-wrap\">{left}</div>\n )}\n {children}\n {right && <div className=\"ml-auto\">{right}</div>}\n </div>\n )\n}\n\n// ─── Shell.SubCard ──────────────────────────────────────────────────\n// Card-inside-a-tray for grouped items (e.g. Keyword Combiner's\n// list-A / list-B sub-cards). Uses --surface-overlay-soft so it reads\n// as a sub-element of the white tray, not another framed tray.\n\nexport interface ShellSubCardProps extends HTMLAttributes<HTMLDivElement> {\n /** Optional header content rendered above the body. */\n header?: ReactNode\n}\n\nfunction SubCard({\n header,\n className,\n style,\n children,\n ...rest\n}: ShellSubCardProps) {\n return (\n <div\n data-slot=\"shell-subcard\"\n className={cn('flex flex-col gap-3', className)}\n style={{\n background: 'rgb(var(--surface-overlay-soft))',\n border: '1px solid rgb(var(--border))',\n borderRadius: 12,\n padding: 12,\n ...style,\n }}\n {...rest}\n >\n {header && (\n <div className=\"flex items-center justify-between gap-2 min-w-0\">\n {header}\n </div>\n )}\n {children}\n </div>\n )\n}\n\n// ─── ShellStat (KPI card) ───────────────────────────────────────────\n// A KPI card built on the shell pattern, inverted: the metric LABEL\n// sits in the outer slate frame, the metric VALUE sits in the inner\n// white tray. Drop several into a grid for an overview row.\n\n/** Value-text tone for <ShellStat>. Semantic tones map to the public\n * status tokens — handy for traffic-light KPIs (e.g. competition). */\nexport type ShellStatTone =\n | 'default'\n | 'accent'\n | 'success'\n | 'warning'\n | 'destructive'\n\nconst SHELL_STAT_TONE: Record<ShellStatTone, string> = {\n default: 'rgb(var(--foreground))',\n accent: 'rgb(var(--accent))',\n success: 'rgb(var(--success))',\n warning: 'rgb(var(--warning))',\n destructive: 'rgb(var(--destructive))',\n}\n\nexport interface ShellStatProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n /** KPI name — rendered in the outer frame, above the tray. */\n label: ReactNode\n /** The metric value — rendered large inside the inner white tray. */\n value: ReactNode\n /** Optional icon shown beside the label in the frame. */\n icon?: ReactNode\n /** Optional supporting text under the value (e.g. \"+3 this week\"). */\n hint?: ReactNode\n /** Value text tone — `default`, `accent`, or a semantic status\n * color (`success` / `warning` / `destructive`). */\n valueTone?: ShellStatTone\n}\n\nfunction ShellStat({\n label,\n value,\n icon,\n hint,\n valueTone = 'default',\n className,\n ...rest\n}: ShellStatProps) {\n return (\n // `h-full` + the flex-1 tray below let a row of ShellStats keep\n // equal-height trays even when only some cards carry a `hint`.\n <Shell\n centered={false}\n className={cn('h-full', className)}\n {...rest}\n >\n <div className=\"flex items-center gap-1.5 px-1.5 pt-0.5\">\n {icon && (\n <span\n className=\"inline-flex shrink-0\"\n style={{ color: 'rgb(var(--text-muted))' }}\n aria-hidden=\"true\"\n >\n {icon}\n </span>\n )}\n <span\n className=\"text-[11px] font-bold uppercase tracking-[0.1em] truncate\"\n style={{ color: 'rgb(var(--text-secondary))' }}\n >\n {label}\n </span>\n </div>\n {/* `justify-center` vertically centers the value block inside\n the flex-1 tray, so a row of ShellStats keeps every number on\n the same baseline even when only some cards carry a `hint`. */}\n <Shell.Tray className=\"flex-1 justify-center\">\n <div className=\"flex flex-col gap-0.5 px-4 py-3.5\">\n <span\n className=\"text-[26px] font-bold leading-none tabular-nums\"\n style={{\n color: SHELL_STAT_TONE[valueTone],\n letterSpacing: '-0.02em',\n }}\n >\n {value}\n </span>\n {hint && (\n <span\n className=\"text-[12px]\"\n style={{ color: 'rgb(var(--text-tertiary))' }}\n >\n {hint}\n </span>\n )}\n </div>\n </Shell.Tray>\n </Shell>\n )\n}\n\n// ─── Compose the compound API ───────────────────────────────────────\n\ntype ShellComponent = typeof ShellRoot & {\n Tray: typeof Tray\n TrayHeader: typeof TrayHeader\n TrayBody: typeof TrayBody\n TrayFooter: typeof TrayFooter\n SubCard: typeof SubCard\n Stat: typeof ShellStat\n}\n\nconst Shell = ShellRoot as ShellComponent\nShell.Tray = Tray\nShell.TrayHeader = TrayHeader\nShell.TrayBody = TrayBody\nShell.TrayFooter = TrayFooter\nShell.SubCard = SubCard\nShell.Stat = ShellStat\n\nexport { Shell, ShellStat }\n","/**\n * HeroFormCard — centered hero-layout form scaffold.\n *\n * Shape:\n *\n * ┌──────────────────────────────────────────────────┐\n * │ EYEBROW (uppercase, accent) │ ← header (outside card)\n * │ Title │\n * │ Subtitle / lede (muted) │\n * ├──────────────────────────────────────────────────┤\n * │ ╭──────────────────────────────────────────────╮ │\n * │ │ Section title (optional icon) │ │ ← card body\n * │ │ ┌────────────────────────────────────────┐ │ │\n * │ │ │ Field label *required │ │ │\n * │ │ │ <Input /> │ │ │\n * │ │ └────────────────────────────────────────┘ │ │\n * │ │ ... │ │\n * │ ╰──────────────────────────────────────────────╯ │\n * │ helper text (optional, muted, centered) │\n * ├──────────────────────────────────────────────────┤\n * │ Cancel Primary │ ← footer (outside card)\n * └──────────────────────────────────────────────────┘\n *\n * Compound sub-components:\n * • HeroFormCard.Section — labeled section with optional icon slot\n * • HeroFormCard.Field — labeled field row with required / optional\n * chip + error text\n * • HeroFormCard.Advanced — collapsible <details> styled to match\n * the rest of the card\n * • HeroFormCard.Footer — action cluster (right-aligned)\n * • HeroFormCard.Banner — informational strip above the body (e.g.,\n * \"From Quick Research · 80 keywords\")\n *\n * Icon-agnostic: the primitive does NOT import or hard-code any\n * specific icons. Consumers pass any Lucide (or custom) ReactNode as\n * `icon` props on Section / Field / Banner.\n *\n * Token discipline: every spacing, radius, color, font-weight derives\n * from a CSS variable in tokens.css. No hex literals.\n *\n * First consumers: NewSetPage + NewGroupPage. Designed to also fit the\n * SEM Spec input lens — same hero-card pattern with a different body.\n */\n\nimport {\n forwardRef,\n type FormEvent,\n type FormHTMLAttributes,\n type HTMLAttributes,\n type ReactNode,\n} from 'react'\nimport { cn } from './lib/utils'\nimport { Shell } from './shell'\n\n// ─── HeroFormCard root ──────────────────────────────────────────────\n\nexport interface HeroFormCardProps\n extends Omit<FormHTMLAttributes<HTMLFormElement>, 'title' | 'onSubmit'> {\n /** Small accent text above the title, e.g. \"Brand · Research\". */\n eyebrow?: ReactNode\n /** The page-level title. Required. */\n title: ReactNode\n /** Supporting copy under the title. */\n subtitle?: ReactNode\n /** Optional helper text rendered between the body and the footer\n * (centered, muted). Good for \"Name is required · everything else\n * is optional\" affordances. */\n helperText?: ReactNode\n /** Body — typically composed of Section + Field. */\n children: ReactNode\n /** Footer action cluster (right-aligned). */\n footer?: ReactNode\n /** Container max-width in px (default 720). */\n maxWidth?: number\n /** When true the wrapping element is a <form> with onSubmit attached\n * (default). When false, renders a <div> — useful when an outer form\n * owns submission. */\n asForm?: boolean\n /** Form submit handler. Ignored when `asForm` is false. */\n onSubmit?: (event: FormEvent<HTMLFormElement>) => void\n className?: string\n}\n\nfunction HeroFormCard({\n eyebrow,\n title,\n subtitle,\n helperText,\n children,\n footer,\n maxWidth = 720,\n asForm = true,\n onSubmit,\n className,\n ...rest\n}: HeroFormCardProps) {\n const bodyContent = (\n <>\n <div className=\"flex flex-col gap-2 pt-4 pb-7\">\n {eyebrow && (\n <div\n className=\"text-[11px] font-bold uppercase tracking-[0.12em]\"\n style={{ color: 'rgb(var(--accent))' }}\n >\n {eyebrow}\n </div>\n )}\n <h1\n className=\"text-[26px] font-bold tracking-[-0.02em] leading-tight\"\n style={{ color: 'rgb(var(--foreground))' }}\n >\n {title}\n </h1>\n {subtitle && (\n <p\n className=\"text-[14px] leading-[1.5] mt-1\"\n style={{\n color: 'rgb(var(--text-tertiary))',\n maxWidth: 'var(--prose-wide)',\n }}\n >\n {subtitle}\n </p>\n )}\n </div>\n\n <Shell centered={false}>{children}</Shell>\n\n {helperText && (\n <p\n className=\"text-[12px] mt-3\"\n style={{ color: 'rgb(var(--text-tertiary))' }}\n >\n {helperText}\n </p>\n )}\n\n {footer && (\n <div className=\"flex items-center justify-end gap-2 mt-6\">\n {footer}\n </div>\n )}\n </>\n )\n\n if (!asForm) {\n return (\n <div\n className={cn('mx-auto w-full', className)}\n style={{ maxWidth }}\n >\n {bodyContent}\n </div>\n )\n }\n\n return (\n <form\n onSubmit={onSubmit}\n className={cn('mx-auto w-full', className)}\n style={{ maxWidth }}\n {...rest}\n >\n {bodyContent}\n </form>\n )\n}\n\n// ─── HeroFormCard.Section ───────────────────────────────────────────\n\nexport interface HeroFormCardSectionProps\n extends Omit<HTMLAttributes<HTMLElement>, 'title'> {\n /** Section heading. Optional — omit for an untitled body. */\n title?: ReactNode\n /** Optional icon node (Lucide or custom). Sized by the consumer. */\n icon?: ReactNode\n /** Optional supporting copy under the section title. */\n description?: ReactNode\n /** Optional content rendered to the RIGHT of the section title row.\n * Good for inline helper text (\"Name is required · everything else\n * is optional\") or action chips. */\n trailing?: ReactNode\n children: ReactNode\n}\n\nfunction Section({\n title,\n icon,\n description,\n trailing,\n children,\n className,\n ...rest\n}: HeroFormCardSectionProps) {\n // `icon` is accepted by the API for back-compat but not used in the\n // shell-tray rendering — the prototype's tray headers are\n // icon-free. Surface lint-friendly by void-ing the binding.\n void icon\n\n const hasHeader = Boolean(title || description || trailing)\n\n return (\n <Shell.Tray className={className} {...rest}>\n {hasHeader && (\n <Shell.TrayHeader\n title={title ?? ''}\n {...(trailing ? { meta: trailing } : {})}\n {...(description ? { description } : {})}\n />\n )}\n <Shell.TrayBody spacing=\"form\">{children}</Shell.TrayBody>\n </Shell.Tray>\n )\n}\n\n// ─── HeroFormCard.Field ─────────────────────────────────────────────\n\nexport interface HeroFormCardFieldProps {\n /** Visible field label. */\n label: ReactNode\n /** HTML id of the underlying control — wires <label htmlFor>. */\n htmlFor?: string\n required?: boolean\n optional?: boolean\n /** Inline error string. Renders below the field. */\n error?: string | null\n /** Optional helper hint below the field (when no error). */\n hint?: ReactNode\n children: ReactNode\n className?: string\n}\n\nfunction Field({\n label,\n htmlFor,\n required,\n optional,\n error,\n hint,\n children,\n className,\n}: HeroFormCardFieldProps) {\n return (\n <div className={cn('flex flex-col gap-1.5', className)}>\n <label\n htmlFor={htmlFor}\n className=\"text-[12px] font-semibold tracking-[0.02em]\"\n style={{ color: 'rgb(var(--foreground))' }}\n >\n {label}\n {required && (\n <span\n className=\"ml-1\"\n style={{ color: 'rgb(var(--destructive))' }}\n aria-hidden=\"true\"\n >\n *\n </span>\n )}\n {optional && (\n <span\n className=\"ml-1 font-normal\"\n style={{ color: 'rgb(var(--text-tertiary))' }}\n >\n (optional)\n </span>\n )}\n </label>\n {children}\n {error ? (\n <p\n className=\"text-[12px]\"\n role=\"alert\"\n style={{ color: 'rgb(var(--destructive))' }}\n >\n {error}\n </p>\n ) : hint ? (\n <p\n className=\"text-[12px]\"\n style={{ color: 'rgb(var(--text-tertiary))' }}\n >\n {hint}\n </p>\n ) : null}\n </div>\n )\n}\n\n// ─── HeroFormCard.FieldRow ──────────────────────────────────────────\n// Two-up grid for side-by-side fields. Collapses to single column on\n// narrow viewports.\n\nfunction FieldRow({\n children,\n className,\n ...rest\n}: HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn('grid grid-cols-1 sm:grid-cols-2 gap-4', className)}\n {...rest}\n >\n {children}\n </div>\n )\n}\n\n// ─── HeroFormCard.Banner ────────────────────────────────────────────\n\nexport interface HeroFormCardBannerProps {\n /** Optional leading icon. */\n icon?: ReactNode\n /** Body content — text + optional inline marks. */\n children: ReactNode\n /** Visual tone. Default `info`. */\n tone?: 'info' | 'accent' | 'success' | 'warning' | 'destructive'\n className?: string\n}\n\nconst BANNER_TONE: Record<\n NonNullable<HeroFormCardBannerProps['tone']>,\n { bg: string; border: string; icon: string }\n> = {\n info: {\n bg: 'rgb(var(--surface-overlay-soft))',\n border: 'rgb(var(--border))',\n icon: 'rgb(var(--text-secondary))',\n },\n accent: {\n bg: 'rgb(var(--accent-subtle))',\n border: 'rgb(var(--accent-muted))',\n icon: 'rgb(var(--accent))',\n },\n success: {\n bg: 'rgb(var(--success-bg))',\n border: 'rgb(var(--success))',\n icon: 'rgb(var(--success))',\n },\n warning: {\n bg: 'rgb(var(--warning-bg))',\n border: 'rgb(var(--warning))',\n icon: 'rgb(var(--warning))',\n },\n destructive: {\n bg: 'rgb(var(--destructive-bg))',\n border: 'rgb(var(--destructive))',\n icon: 'rgb(var(--destructive))',\n },\n}\n\nfunction Banner({\n icon,\n children,\n tone = 'info',\n className,\n}: HeroFormCardBannerProps) {\n const colors = BANNER_TONE[tone]\n return (\n <div\n className={cn('flex items-start gap-3 p-3', className)}\n style={{\n background: colors.bg,\n border: `1px solid ${colors.border}`,\n borderRadius: 'var(--radius-md)',\n }}\n >\n {icon && (\n <span\n className=\"inline-flex shrink-0 mt-0.5\"\n style={{ color: colors.icon }}\n aria-hidden=\"true\"\n >\n {icon}\n </span>\n )}\n <div\n className=\"text-[13px] leading-[1.45]\"\n style={{ color: 'rgb(var(--text-secondary))' }}\n >\n {children}\n </div>\n </div>\n )\n}\n\n// ─── HeroFormCard.Advanced ──────────────────────────────────────────\n// Collapsible \"Advanced options\" disclosure — native <details> styled\n// to match the card chrome.\n\nexport interface HeroFormCardAdvancedProps {\n summary?: ReactNode\n /** Optional icon node next to the summary. */\n icon?: ReactNode\n defaultOpen?: boolean\n children: ReactNode\n className?: string\n}\n\nfunction Advanced({\n summary = 'Advanced options',\n icon,\n defaultOpen,\n children,\n className,\n}: HeroFormCardAdvancedProps) {\n return (\n <details\n open={defaultOpen}\n className={cn('group flex flex-col gap-3', className)}\n >\n <summary\n className=\"flex items-center gap-1.5 cursor-pointer select-none text-[12px] font-semibold uppercase tracking-[0.08em] list-none [&::-webkit-details-marker]:hidden\"\n style={{ color: 'rgb(var(--text-muted))' }}\n >\n {icon && (\n <span className=\"inline-flex shrink-0\" aria-hidden=\"true\">\n {icon}\n </span>\n )}\n <span>{summary}</span>\n </summary>\n <div className=\"flex flex-col gap-4 pt-1\">{children}</div>\n </details>\n )\n}\n\n// ─── HeroFormCard.Footer ────────────────────────────────────────────\n// Footer rendering is folded into the root layout via the `footer`\n// prop, but consumers sometimes want to render the footer cluster\n// inline (e.g., right below a banner for inline confirmation flows).\n// Footer compound provides the same styling for that use case.\n\nfunction Footer({\n children,\n className,\n ...rest\n}: HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn('flex items-center justify-end gap-2', className)}\n {...rest}\n >\n {children}\n </div>\n )\n}\n\n// ─── Compound binding ───────────────────────────────────────────────\n\nconst HeroFormCardCompound = Object.assign(\n forwardRef<HTMLFormElement, HeroFormCardProps>(\n function HeroFormCardForwardRef(props, _ref) {\n // _ref is intentionally unused — no consumer needs focus-management\n // on the <form> yet. forwardRef is kept on the public surface so a\n // ref can be wired later without a breaking API change. React requires\n // the two-parameter signature even when ref is not forwarded.\n return <HeroFormCard {...props} />\n },\n ),\n {\n Section,\n Field,\n FieldRow,\n Banner,\n Advanced,\n Footer,\n },\n)\n\nexport { HeroFormCardCompound as HeroFormCard }\n","/**\n * RangeSlider — dual-thumb numeric range selector.\n *\n * Label 1,000 – 48,000\n * ●━━━━━━━━━━━━━━━━━━●─────────────────────────────────\n *\n * Two native `<input type=\"range\">` elements are stacked over a shared\n * track + fill. Native inputs give keyboard support (arrows / Home /\n * End) and accessibility for free; the `.ds-range-input` CSS in\n * styles.css makes the input bodies transparent + click-through so the\n * two thumbs don't block each other.\n *\n * Controlled — the parent owns `value` as a `[low, high]` tuple. The\n * component clamps so the thumbs can meet but never cross.\n *\n * Token discipline: track / fill colors from CSS variables; thumb\n * styling lives in `.ds-range-input` (pseudo-elements can't be styled\n * inline). No hex.\n *\n * First consumer: Keywords lens filter bar (Volume + Avg CPC ranges).\n * Generic — reusable for any numeric min/max filter.\n */\n\nimport { useId, type ReactNode } from 'react'\nimport { cn } from './lib/utils'\n\nexport interface RangeSliderProps {\n /** Lower bound of the track. */\n min: number\n /** Upper bound of the track. */\n max: number\n /** Current selection — `[low, high]`. Clamped within `[min, max]`. */\n value: [number, number]\n onChange: (next: [number, number]) => void\n /** Step granularity. Default 1. */\n step?: number\n /** Optional label rendered above the track. */\n label?: ReactNode\n /** Formats the two end values shown beside the label. Default\n * `toLocaleString`. */\n formatValue?: (value: number) => string\n /** id base — the two range inputs get `${id}-min` / `${id}-max`. */\n id?: string\n disabled?: boolean\n className?: string\n}\n\nfunction clamp(n: number, lo: number, hi: number): number {\n return Math.max(lo, Math.min(hi, n))\n}\n\nexport function RangeSlider({\n min,\n max,\n value,\n onChange,\n step = 1,\n label,\n formatValue = (n) => n.toLocaleString('en-US'),\n id,\n disabled,\n className,\n}: RangeSliderProps) {\n const generatedId = useId()\n const baseId = id ?? `range-${generatedId.replace(/:/g, '')}`\n\n const span = max - min || 1\n const [lowRaw, highRaw] = value\n const low = clamp(lowRaw, min, max)\n const high = clamp(highRaw, min, max)\n\n const lowPct = ((low - min) / span) * 100\n const highPct = ((high - min) / span) * 100\n\n const handleLow = (next: number) => {\n // Low thumb can meet the high thumb but not pass it.\n onChange([clamp(next, min, high), high])\n }\n const handleHigh = (next: number) => {\n onChange([low, clamp(next, low, max)])\n }\n\n return (\n <div className={cn('flex flex-col gap-1.5', className)}>\n {label && (\n <div className=\"flex items-baseline justify-between gap-2\">\n <span\n className=\"text-[12px] font-semibold tracking-[0.02em]\"\n style={{ color: 'rgb(var(--foreground))' }}\n >\n {label}\n </span>\n <span\n className=\"text-[12px] tabular-nums\"\n style={{ color: 'rgb(var(--text-tertiary))' }}\n >\n {formatValue(low)} – {formatValue(high)}\n </span>\n </div>\n )}\n\n <div className=\"ds-range-slider relative h-4 flex items-center\">\n {/* Base track */}\n <div\n className=\"absolute left-0 right-0 h-1.5 rounded-full\"\n style={{ background: 'rgb(var(--surface-overlay-strong))' }}\n />\n {/* Selected fill */}\n <div\n className=\"absolute h-1.5 rounded-full\"\n style={{\n left: `${lowPct}%`,\n right: `${100 - highPct}%`,\n background: disabled\n ? 'rgb(var(--border-strong))'\n : 'rgb(var(--accent))',\n }}\n />\n {/* Low thumb. z-index lifts when both thumbs sit at the top\n end so the low thumb stays grabbable. */}\n <input\n id={`${baseId}-min`}\n type=\"range\"\n className=\"ds-range-input\"\n style={{ zIndex: low >= max ? 4 : 3 }}\n min={min}\n max={max}\n step={step}\n value={low}\n disabled={disabled}\n onChange={(e) => handleLow(Number(e.target.value))}\n aria-label={\n typeof label === 'string'\n ? `${label} — minimum`\n : 'Range minimum'\n }\n aria-valuetext={formatValue(low)}\n />\n {/* High thumb */}\n <input\n id={`${baseId}-max`}\n type=\"range\"\n className=\"ds-range-input\"\n style={{ zIndex: 3 }}\n min={min}\n max={max}\n step={step}\n value={high}\n disabled={disabled}\n onChange={(e) => handleHigh(Number(e.target.value))}\n aria-label={\n typeof label === 'string'\n ? `${label} — maximum`\n : 'Range maximum'\n }\n aria-valuetext={formatValue(high)}\n />\n </div>\n </div>\n )\n}\n","/**\n * SegmentedPill — segmented control with an outlined-accent active state.\n *\n * Visual:\n *\n * ╭──────────────────────────────────────────────────────────────╮\n * │ ┌──────────────┐ │\n * │ │ ⚙ Active │ ☰ Inactive ⚙ Inactive ☰ Inactive │\n * │ └──────────────┘ │\n * ╰──────────────────────────────────────────────────────────────╯\n *\n * • Whole strip sits in a subtle `--surface-overlay-soft` rounded\n * container so the inactive segments read as text rather than\n * borderless buttons.\n * • The active segment is wrapped in a 1px accent border with an\n * `--accent-subtle` fill — reads as an \"outlined pill\" sitting\n * inside the strip.\n * • Each segment is a button with an optional leading icon.\n *\n * Generic — accepts a typed `items` array. First consumer: Keywords\n * lens SearchPanel (research-mode picker). Reusable anywhere a small\n * (2–5 item) mutually-exclusive choice needs a low-emphasis tab-like\n * control.\n *\n * Icon-agnostic. Token-only styling.\n */\n\nimport { useId, type ReactNode } from 'react'\nimport { cn } from './lib/utils'\n\nexport interface SegmentedPillItem<Id extends string = string> {\n id: Id\n label: ReactNode\n icon?: ReactNode\n disabled?: boolean\n /** Optional accessible label override for icon-heavy segments. */\n ariaLabel?: string\n}\n\nexport interface SegmentedPillProps<Id extends string = string> {\n items: SegmentedPillItem<Id>[]\n value: Id\n onChange: (next: Id) => void\n /** Accessible label for the whole group (rendered as aria-label on\n * the `role=\"tablist\"` container). */\n ariaLabel?: string\n /** Size variant — controls vertical padding + font. Default `md`.\n * `xs` is for dense inline contexts (e.g. a sort toggle inside a tab bar). */\n size?: 'xs' | 'sm' | 'md'\n /** Fill the available width and stretch segments. Default `true`. */\n stretch?: boolean\n className?: string\n}\n\nexport function SegmentedPill<Id extends string = string>({\n items,\n value,\n onChange,\n ariaLabel,\n size = 'md',\n stretch = true,\n className,\n}: SegmentedPillProps<Id>) {\n const reactId = useId()\n\n const padY = size === 'xs' ? 'py-1' : size === 'sm' ? 'py-1.5' : 'py-2'\n const textSize = size === 'xs' ? 'text-[11px]' : size === 'sm' ? 'text-[12px]' : 'text-[13px]'\n const padX = size === 'xs' ? 'px-2.5' : 'px-3'\n const containerPad = size === 'xs' ? 'p-0.5' : 'p-1'\n\n return (\n <div\n role=\"tablist\"\n aria-label={ariaLabel}\n className={cn(\n 'flex items-center gap-1',\n containerPad,\n stretch && 'w-full',\n className,\n )}\n style={{\n background: 'rgb(var(--surface-overlay-soft))',\n border: '1px solid rgb(var(--border))',\n borderRadius: 'var(--radius-full)',\n }}\n >\n {items.map((item) => {\n const isActive = item.id === value\n return (\n <button\n key={item.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={isActive}\n aria-controls={`${reactId}-panel-${item.id}`}\n disabled={item.disabled}\n onClick={() => onChange(item.id)}\n aria-label={item.ariaLabel}\n className={cn(\n 'inline-flex items-center justify-center gap-1.5',\n padX,\n padY,\n textSize,\n 'font-medium transition-colors',\n 'disabled:opacity-50 disabled:cursor-not-allowed',\n stretch && 'flex-1',\n isActive ? 'cursor-default' : 'cursor-pointer',\n )}\n style={{\n borderRadius: 'var(--radius-full)',\n ...(isActive\n ? {\n background: 'rgb(var(--accent-subtle))',\n border: '1px solid rgb(var(--accent))',\n color: 'rgb(var(--accent))',\n }\n : {\n background: 'transparent',\n border: '1px solid transparent',\n color: 'rgb(var(--text-secondary))',\n }),\n }}\n >\n {item.icon && (\n <span\n className=\"inline-flex shrink-0\"\n style={{\n color: isActive\n ? 'rgb(var(--accent))'\n : 'rgb(var(--text-muted))',\n }}\n aria-hidden=\"true\"\n >\n {item.icon}\n </span>\n )}\n <span className=\"truncate\">{item.label}</span>\n </button>\n )\n })}\n </div>\n )\n}\n","/**\n * FolderCard — drive-style folder tile.\n *\n * A horizontal tile: a colour-keyed folder-icon swatch, the folder\n * name, an asset / subfolder count line, a hover-revealed selection\n * checkbox, and an optional hover-revealed menu slot. Clicking the\n * body opens the folder.\n *\n * Promoted to @lovett/ui in ADR-035 (Assets lens redesign). It is a\n * primitive — not lens-local — because a folder card is a card\n * surface and needs the internal surface tokens (`--bg-card`,\n * `--border-card`); CLAUDE.md §5 says that is exactly when a\n * component belongs in `packages/ui/`. Reusable by the v1.1 Swipes /\n * Collections lenses (PRD §5.6) without a fork.\n *\n * Folder colour is a KEY into the `--folder-*` token palette\n * (tokens.css — ADR-035 Decision 6), never a hex. The primitive maps\n * the key to `rgb(var(--folder-<key>))`.\n */\n\nimport { useState, type KeyboardEvent, type ReactNode } from 'react'\nimport { Check, Folder } from 'lucide-react'\nimport { cn } from './lib/utils'\n\nexport type FolderColorKey =\n | 'red'\n | 'amber'\n | 'emerald'\n | 'teal'\n | 'blue'\n | 'violet'\n | 'pink'\n | 'slate'\n | 'ink'\n\n/** All folder colour keys, in palette order — for swatch pickers. */\nexport const FOLDER_COLOR_KEYS: FolderColorKey[] = [\n 'red',\n 'amber',\n 'emerald',\n 'teal',\n 'blue',\n 'violet',\n 'pink',\n 'slate',\n 'ink',\n]\n\n/** Resolve a colour key to its `rgb(var(--folder-*))` CSS value. */\nexport function folderColorVar(key: FolderColorKey): string {\n return `rgb(var(--folder-${key}))`\n}\n\nexport interface FolderCardProps {\n name: string\n colorKey: FolderColorKey\n assetCount: number\n /** Subfolder count — omitted or 0 → not shown. */\n folderCount?: number\n selected?: boolean\n /** When true, a selection checkbox reveals on hover and stays\n * visible while selected. */\n selectable?: boolean\n onOpen: () => void\n onSelect?: () => void\n /** Optional menu affordance (e.g. a kebab trigger), revealed on\n * hover at the row end. */\n menuSlot?: ReactNode\n className?: string\n}\n\nexport function FolderCard({\n name,\n colorKey,\n assetCount,\n folderCount = 0,\n selected = false,\n selectable = false,\n onOpen,\n onSelect,\n menuSlot,\n className,\n}: FolderCardProps) {\n const [hover, setHover] = useState(false)\n const color = folderColorVar(colorKey)\n const showCheckbox = selectable && (hover || selected)\n\n const onKeyDown = (e: KeyboardEvent<HTMLDivElement>) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n onOpen()\n }\n }\n\n return (\n <div\n role=\"button\"\n tabIndex={0}\n onClick={onOpen}\n onKeyDown={onKeyDown}\n onMouseEnter={() => setHover(true)}\n onMouseLeave={() => setHover(false)}\n className={cn(\n 'group/folder relative flex items-center gap-3 px-3 py-2.5 cursor-pointer transition-shadow text-left',\n className,\n )}\n style={{\n background: selected\n ? 'rgb(var(--accent-subtle))'\n : 'rgb(var(--bg-card))',\n border: `1px solid ${\n selected ? 'rgb(var(--accent))' : 'rgb(var(--border-card))'\n }`,\n borderRadius: 'var(--radius-md)',\n boxShadow: hover ? 'var(--shadow-sm)' : 'none',\n }}\n >\n {/* Selection checkbox — top-left, revealed on hover / selected. */}\n {showCheckbox && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation()\n onSelect?.()\n }}\n aria-label={selected ? `Deselect ${name}` : `Select ${name}`}\n aria-pressed={selected}\n className=\"absolute top-2 left-2 z-[1] inline-flex h-[18px] w-[18px] items-center justify-center cursor-pointer text-white\"\n style={{\n borderRadius: 'var(--radius-xs)',\n background: selected\n ? 'rgb(var(--accent))'\n : 'rgb(var(--bg-card))',\n border: `1.5px solid ${\n selected ? 'rgb(var(--accent))' : 'rgb(var(--border-strong))'\n }`,\n }}\n >\n {selected && <Check className=\"h-3 w-3\" strokeWidth={3} />}\n </button>\n )}\n\n {/* Colour swatch + folder icon. */}\n <span\n className=\"inline-flex h-[38px] w-[38px] shrink-0 items-center justify-center\"\n style={{\n borderRadius: 'var(--radius-sm)',\n background: `rgb(var(--folder-${colorKey}) / 0.12)`,\n color,\n }}\n >\n <Folder className=\"h-5 w-5\" strokeWidth={1.6} aria-hidden=\"true\" />\n </span>\n\n {/* Name + count. */}\n <div className=\"flex min-w-0 flex-1 flex-col gap-0.5\">\n <span\n className=\"truncate text-[13.5px] font-semibold\"\n style={{ color: 'rgb(var(--foreground))' }}\n >\n {name}\n </span>\n <span\n className=\"text-[11.5px] tabular-nums\"\n style={{ color: 'rgb(var(--text-tertiary))' }}\n >\n {assetCount} {assetCount === 1 ? 'asset' : 'assets'}\n {folderCount > 0 && (\n <>\n {' · '}\n {folderCount} {folderCount === 1 ? 'folder' : 'folders'}\n </>\n )}\n </span>\n </div>\n\n {/* Menu slot — revealed on hover. */}\n {menuSlot && (\n <span\n className=\"shrink-0 opacity-0 transition-opacity group-hover/folder:opacity-100\"\n onClick={(e) => e.stopPropagation()}\n >\n {menuSlot}\n </span>\n )}\n </div>\n )\n}\n","/**\n * BulkActionBar — floating, bottom-centred selection action bar.\n *\n * Shown when a multi-select surface has a non-empty selection. The\n * primitive owns the fixed bottom-centre shell, the accent count\n * badge, the dividers, and the Clear button; the caller passes its\n * own action buttons as `children`.\n *\n * Promoted to @lovett/ui in ADR-035 (Assets lens redesign) — two\n * committed consumers (the Assets page and the Manage Folders page)\n * and it needs the internal surface tokens (`--bg-card` /\n * `--border-card`).\n */\n\nimport type { ReactNode } from 'react'\nimport { X } from 'lucide-react'\n\nexport interface BulkActionBarProps {\n /** Selection count shown in the accent badge. */\n count: number\n /** Optional summary string, e.g. \"2 folders · 3 assets\". When\n * omitted, a plain \"<count> selected\" label is shown. */\n summary?: string\n /** Caller-owned action buttons (icon buttons or labelled Buttons). */\n children: ReactNode\n onClear: () => void\n}\n\nfunction Divider() {\n return (\n <span\n aria-hidden=\"true\"\n className=\"h-[22px] w-px shrink-0\"\n style={{ background: 'rgb(var(--border))' }}\n />\n )\n}\n\nexport function BulkActionBar({\n count,\n summary,\n children,\n onClear,\n}: BulkActionBarProps) {\n return (\n <div\n role=\"region\"\n aria-label=\"Bulk actions\"\n className=\"fixed bottom-6 left-1/2 z-30 flex -translate-x-1/2 items-center gap-2.5 py-2.5 pl-4 pr-3\"\n style={{\n background: 'rgb(var(--bg-card))',\n border: '1px solid rgb(var(--border-card))',\n borderRadius: 'var(--radius-lg)',\n boxShadow: 'var(--shadow-lg)',\n }}\n >\n <span className=\"inline-flex items-center gap-2\">\n <span\n className=\"inline-flex h-[22px] min-w-[22px] items-center justify-center px-1.5 text-[11.5px] font-bold tabular-nums text-white\"\n style={{\n background: 'rgb(var(--accent))',\n borderRadius: 'var(--radius-full)',\n }}\n >\n {count}\n </span>\n <span\n className=\"text-[13px] font-semibold\"\n style={{ color: 'rgb(var(--foreground))' }}\n >\n {summary ?? 'selected'}\n </span>\n </span>\n\n <Divider />\n\n <div className=\"flex items-center gap-1.5\">{children}</div>\n\n <Divider />\n\n <button\n type=\"button\"\n onClick={onClear}\n className=\"inline-flex h-7 items-center gap-1.5 px-2.5 cursor-pointer text-[12px] font-medium transition-colors\"\n style={{\n background: 'transparent',\n color: 'rgb(var(--text-tertiary))',\n borderRadius: 'var(--radius-sm)',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = 'rgb(var(--surface-overlay))'\n e.currentTarget.style.color = 'rgb(var(--foreground))'\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = 'transparent'\n e.currentTarget.style.color = 'rgb(var(--text-tertiary))'\n }}\n >\n <X className=\"h-3.5 w-3.5\" aria-hidden=\"true\" />\n Clear\n </button>\n </div>\n )\n}\n","/**\n * FileUploadButton — paperclip trigger that opens a native file picker.\n * Disables itself when the file limit is reached.\n *\n * Promoted from brand-ai-extension (ADR-036 D20).\n */\n\nimport { useRef } from 'react'\nimport { Paperclip } from 'lucide-react'\nimport { cn } from '../lib/utils'\n\nconst ACCEPTED_TYPES = [\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'application/pdf',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'text/plain',\n 'text/csv',\n 'text/html',\n 'text/css',\n 'text/xml',\n 'application/xml',\n 'application/javascript',\n 'text/javascript',\n].join(',')\n\ninterface FileUploadButtonProps {\n onFilesSelected: (files: File[]) => void\n disabled?: boolean\n fileCount?: number\n maxFiles?: number\n}\n\nexport function FileUploadButton({\n onFilesSelected,\n disabled = false,\n fileCount = 0,\n maxFiles = 10,\n}: FileUploadButtonProps) {\n const inputRef = useRef<HTMLInputElement>(null)\n const isAtLimit = fileCount >= maxFiles\n\n const handleClick = () => {\n inputRef.current?.click()\n }\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const files = e.target.files\n if (files && files.length > 0) {\n onFilesSelected(Array.from(files))\n // Reset so the same file can be re-selected\n e.target.value = ''\n }\n }\n\n return (\n <>\n <input\n ref={inputRef}\n type=\"file\"\n multiple\n accept={ACCEPTED_TYPES}\n onChange={handleChange}\n className=\"hidden\"\n disabled={disabled || isAtLimit}\n />\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={disabled || isAtLimit}\n className={cn(\n 'flex h-8 w-8 items-center justify-center transition-colors',\n (disabled || isAtLimit) && 'cursor-not-allowed opacity-50',\n )}\n style={{ borderRadius: 'var(--radius-sm)' }}\n title={\n isAtLimit\n ? `Maximum ${maxFiles} files`\n : `Attach files (${fileCount}/${maxFiles})`\n }\n aria-label={\n isAtLimit\n ? `Maximum ${maxFiles} files reached`\n : `Attach files (${fileCount} of ${maxFiles})`\n }\n >\n <Paperclip\n className=\"h-4 w-4\"\n style={{ color: 'rgb(var(--muted-foreground))' }}\n />\n </button>\n </>\n )\n}\n","/**\n * FileDropZone — drag-and-drop overlay wrapper for file intake.\n *\n * Promoted from brand-ai-extension (ADR-036 D20).\n */\n\nimport { useState, useCallback, useRef, type ReactNode } from 'react'\nimport { Upload } from 'lucide-react'\nimport { cn } from '../lib/utils'\n\ninterface FileDropZoneProps {\n children: ReactNode\n onFilesDropped: (files: File[]) => void\n disabled?: boolean\n className?: string\n}\n\nexport function FileDropZone({\n children,\n onFilesDropped,\n disabled = false,\n className,\n}: FileDropZoneProps) {\n const [isDragOver, setIsDragOver] = useState(false)\n const dragCounterRef = useRef(0)\n\n // Recursively collect all files from a FileSystem entry (handles folders)\n const getFilesFromEntry = useCallback(async (entry: FileSystemEntry): Promise<File[]> => {\n if (entry.isFile) {\n return new Promise((resolve) => {\n ;(entry as FileSystemFileEntry).file(\n (file) => resolve([file]),\n () => resolve([]),\n )\n })\n }\n\n if (entry.isDirectory) {\n const dirReader = (entry as FileSystemDirectoryEntry).createReader()\n const entries = await new Promise<FileSystemEntry[]>((resolve) => {\n dirReader.readEntries(\n (e) => resolve(e),\n () => resolve([]),\n )\n })\n\n const allFiles: File[] = []\n for (const childEntry of entries) {\n const files = await getFilesFromEntry(childEntry)\n allFiles.push(...files)\n }\n return allFiles\n }\n\n return []\n }, [])\n\n const processDroppedItems = useCallback(async (\n items: DataTransferItemList,\n ): Promise<File[]> => {\n const allFiles: File[] = []\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i]\n if (!item || item.kind !== 'file') continue\n\n const entry = item.webkitGetAsEntry?.()\n if (entry) {\n const files = await getFilesFromEntry(entry)\n allFiles.push(...files)\n } else {\n const file = item.getAsFile()\n if (file) allFiles.push(file)\n }\n }\n\n return allFiles\n }, [getFilesFromEntry])\n\n const handleDragEnter = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n if (disabled) return\n\n dragCounterRef.current++\n if (e.dataTransfer.types.includes('Files')) {\n setIsDragOver(true)\n }\n },\n [disabled],\n )\n\n const handleDragLeave = useCallback((e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n\n dragCounterRef.current--\n if (dragCounterRef.current === 0) {\n setIsDragOver(false)\n }\n }, [])\n\n const handleDragOver = useCallback((e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n }, [])\n\n const handleDrop = useCallback(\n async (e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n dragCounterRef.current = 0\n setIsDragOver(false)\n\n if (disabled) return\n\n const files = await processDroppedItems(e.dataTransfer.items)\n if (files.length > 0) {\n onFilesDropped(files)\n }\n },\n [disabled, onFilesDropped, processDroppedItems],\n )\n\n return (\n <div\n className={cn('relative', className)}\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n >\n {children}\n\n {isDragOver && !disabled && (\n <div\n className=\"absolute inset-0 z-50 flex items-center justify-center border-2 border-dashed backdrop-blur-sm\"\n style={{\n borderRadius: 'var(--radius-xl)',\n borderColor: 'rgb(var(--accent))',\n background: 'rgb(var(--accent) / 0.08)',\n }}\n >\n <div\n className=\"flex flex-col items-center gap-2\"\n style={{ color: 'rgb(var(--accent))' }}\n >\n <Upload className=\"h-8 w-8\" />\n <span className=\"text-sm font-medium\">Drop files here</span>\n </div>\n </div>\n )}\n </div>\n )\n}\n","/**\n * FileThumbnail — icon-based preview tile for non-image files; renders the\n * actual image for image files when a preview URL is available.\n *\n * Promoted from brand-ai-extension (ADR-036 D20).\n *\n * Token-boundary note: the source used Tailwind color utilities (text-red-600,\n * bg-blue-100, etc.) which are raw color literals. Rewritten to use inline\n * style with CSS variables from the public token set where possible, and\n * for the categorical file-type tints we use the --folder-* palette tokens\n * (ADR-035) which are the closest semantic color set in the design system\n * for categorical accent use.\n */\n\nimport { FileText, Table, Code, Image, FileType } from 'lucide-react'\nimport { cn } from '../lib/utils'\n\ninterface FileThumbnailProps {\n file: File\n previewUrl?: string\n className?: string\n}\n\ntype IconComponent = typeof FileText\n\ninterface ExtensionConfig {\n icon: IconComponent\n colorVar: string\n bgVar: string\n}\n\n// Map file extensions to Lucide icons and design-system token pairs.\n// Using --folder-* palette tokens (ADR-035) as categorical accents.\nconst EXTENSION_CONFIG: Record<string, ExtensionConfig> = {\n pdf: { icon: FileText, colorVar: '--folder-red', bgVar: '--folder-red' },\n docx: { icon: FileText, colorVar: '--folder-blue', bgVar: '--folder-blue' },\n txt: { icon: FileText, colorVar: '--folder-slate', bgVar: '--folder-slate' },\n csv: { icon: Table, colorVar: '--folder-emerald', bgVar: '--folder-emerald' },\n xml: { icon: Code, colorVar: '--folder-amber', bgVar: '--folder-amber' },\n html: { icon: Code, colorVar: '--folder-violet', bgVar: '--folder-violet' },\n css: { icon: Code, colorVar: '--folder-blue', bgVar: '--folder-blue' },\n js: { icon: Code, colorVar: '--folder-amber', bgVar: '--folder-amber' },\n jpg: { icon: Image, colorVar: '--folder-pink', bgVar: '--folder-pink' },\n jpeg: { icon: Image, colorVar: '--folder-pink', bgVar: '--folder-pink' },\n png: { icon: Image, colorVar: '--folder-pink', bgVar: '--folder-pink' },\n gif: { icon: Image, colorVar: '--folder-pink', bgVar: '--folder-pink' },\n}\n\nconst FALLBACK_CONFIG: ExtensionConfig = {\n icon: FileType,\n colorVar: '--folder-slate',\n bgVar: '--folder-slate',\n}\n\nfunction getExtension(filename: string): string {\n const parts = filename.split('.')\n return parts.length > 1 ? (parts[parts.length - 1] ?? '').toLowerCase() : ''\n}\n\nexport function FileThumbnail({ file, previewUrl, className }: FileThumbnailProps) {\n const extension = getExtension(file.name)\n const isImage = file.type.startsWith('image/')\n\n if (isImage && previewUrl) {\n return (\n <div className={cn('relative overflow-hidden rounded-md', className)}>\n <img\n src={previewUrl}\n alt={file.name}\n className=\"h-full w-full object-cover\"\n />\n </div>\n )\n }\n\n const config = EXTENSION_CONFIG[extension] ?? FALLBACK_CONFIG\n const IconComponent = config.icon\n\n return (\n <div\n className={cn('flex items-center justify-center rounded-md', className)}\n style={{ background: `rgb(var(${config.bgVar}) / 0.15)` }}\n >\n <div className=\"flex flex-col items-center gap-1\">\n <IconComponent\n className=\"h-6 w-6\"\n style={{ color: `rgb(var(${config.colorVar}))` }}\n />\n <span\n className=\"text-[10px] font-medium uppercase\"\n style={{ color: `rgb(var(${config.colorVar}))` }}\n >\n {extension || '?'}\n </span>\n </div>\n </div>\n )\n}\n","/**\n * FilePreviewItem — single file card showing thumbnail, name, size, upload\n * progress, error state, and a remove button.\n *\n * Promoted from brand-ai-extension (ADR-036 D20).\n */\n\nimport { X, AlertCircle, Loader2 } from 'lucide-react'\nimport { cn } from '../lib/utils'\nimport { FileThumbnail } from './file-thumbnail'\nimport type { PendingFile } from './use-file-upload'\n\ninterface FilePreviewItemProps {\n pendingFile: PendingFile\n onRemove: (id: string) => void\n}\n\nfunction formatFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`\n}\n\nfunction truncateFilename(name: string, maxLength = 20): string {\n if (name.length <= maxLength) return name\n\n const ext = name.includes('.') ? name.split('.').pop() : ''\n const baseName = ext ? name.slice(0, -(ext.length + 1)) : name\n const available = maxLength - (ext ? ext.length + 4 : 3)\n\n if (available <= 0) return name.slice(0, maxLength - 3) + '...'\n\n return `${baseName.slice(0, available)}...${ext ? `.${ext}` : ''}`\n}\n\nexport function FilePreviewItem({ pendingFile, onRemove }: FilePreviewItemProps) {\n const { id, file, progress, status, error, previewUrl } = pendingFile\n const isUploading = status === 'uploading'\n const isError = status === 'error'\n const isUploaded = status === 'uploaded'\n\n return (\n <div\n className={cn(\n 'group relative flex flex-col gap-1 p-2',\n 'border bg-[rgb(var(--background))]',\n )}\n style={{\n borderRadius: 'var(--radius-md)',\n borderColor: isError\n ? 'rgb(var(--destructive) / 0.5)'\n : isUploaded\n ? 'rgb(var(--success) / 0.5)'\n : 'rgb(var(--border))',\n background: isError\n ? 'rgb(var(--destructive) / 0.08)'\n : isUploaded\n ? 'rgb(var(--success-bg))'\n : 'rgb(var(--background))',\n }}\n >\n {/* Thumbnail */}\n <div\n className=\"relative aspect-square w-full overflow-hidden\"\n style={{\n borderRadius: 'var(--radius-sm)',\n background: 'rgb(var(--muted))',\n }}\n >\n <FileThumbnail\n file={file}\n className=\"h-full w-full\"\n {...(previewUrl !== undefined ? { previewUrl } : {})}\n />\n\n {isUploading && (\n <div\n className=\"absolute inset-0 flex items-center justify-center\"\n style={{ background: 'rgb(var(--background) / 0.8)' }}\n >\n <Loader2\n className=\"h-5 w-5 animate-spin\"\n style={{ color: 'rgb(var(--accent))' }}\n />\n </div>\n )}\n\n {isError && (\n <div\n className=\"absolute inset-0 flex items-center justify-center\"\n style={{ background: 'rgb(var(--destructive) / 0.2)' }}\n >\n <AlertCircle\n className=\"h-5 w-5\"\n style={{ color: 'rgb(var(--destructive))' }}\n />\n </div>\n )}\n </div>\n\n {/* File info */}\n <div className=\"flex flex-col gap-0.5\">\n <span\n className=\"truncate text-xs font-medium\"\n style={{ color: 'rgb(var(--foreground))' }}\n title={file.name}\n >\n {truncateFilename(file.name)}\n </span>\n <span className=\"text-[10px]\" style={{ color: 'rgb(var(--text-muted))' }}>\n {formatFileSize(file.size)}\n </span>\n </div>\n\n {/* Progress bar */}\n {isUploading && (\n <div\n className=\"h-1 w-full overflow-hidden\"\n style={{\n borderRadius: 'var(--radius-full)',\n background: 'rgb(var(--muted))',\n }}\n >\n <div\n className=\"h-full transition-all duration-300\"\n style={{\n width: `${progress}%`,\n background: 'rgb(var(--accent))',\n }}\n />\n </div>\n )}\n\n {/* Error message */}\n {isError && error && (\n <span\n className=\"truncate text-[10px]\"\n style={{ color: 'rgb(var(--destructive))' }}\n title={error}\n >\n {error}\n </span>\n )}\n\n {/* Remove button */}\n <button\n type=\"button\"\n onClick={() => onRemove(id)}\n disabled={isUploading}\n className={cn(\n 'absolute -right-2 -top-2 flex h-5 w-5 items-center justify-center',\n 'rounded-full border transition-all',\n 'shadow-[var(--shadow-sm)]',\n isError\n ? 'opacity-100'\n : 'opacity-0 group-hover:opacity-100',\n isUploading && 'pointer-events-none',\n )}\n style={\n isError\n ? {\n background: 'rgb(var(--destructive))',\n color: 'white',\n borderColor: 'rgb(var(--destructive))',\n }\n : undefined\n }\n title={isError ? 'Remove failed upload' : 'Remove file'}\n aria-label={isError ? 'Remove failed upload' : 'Remove file'}\n >\n <X className=\"h-3 w-3\" />\n </button>\n </div>\n )\n}\n","/**\n * FilePreviewGrid — responsive grid of FilePreviewItem tiles, sized by\n * file count (1 → single col, 2 → 2-col, 3-4 → 4-col, 5+ → 5-col).\n *\n * Promoted from brand-ai-extension (ADR-036 D20).\n */\n\nimport { cn } from '../lib/utils'\nimport { FilePreviewItem } from './file-preview-item'\nimport type { PendingFile } from './use-file-upload'\n\ninterface FilePreviewGridProps {\n files: PendingFile[]\n onRemove: (id: string) => void\n className?: string\n}\n\nexport function FilePreviewGrid({ files, onRemove, className }: FilePreviewGridProps) {\n if (files.length === 0) return null\n\n const gridCols =\n files.length === 1\n ? 'grid-cols-1 max-w-[120px]'\n : files.length === 2\n ? 'grid-cols-2 max-w-[248px]'\n : files.length <= 4\n ? 'grid-cols-4'\n : 'grid-cols-5'\n\n return (\n <div className={cn('px-3 pt-3', className)}>\n <div className={cn('grid gap-2', gridCols)}>\n {files.map((file) => (\n <FilePreviewItem key={file.id} pendingFile={file} onRemove={onRemove} />\n ))}\n </div>\n </div>\n )\n}\n","/**\n * useFileUpload — stateful file-selection, validation, text-extraction, and\n * XHR upload hook with per-file progress tracking.\n *\n * Promoted from brand-ai-extension (ADR-036 D20).\n *\n * D14 fix: the original hook read `import.meta.env.VITE_API_URL` and\n * hardcoded a fallback URL. A @lovett/ui primitive must not read env vars or\n * embed URLs. Consumers pass `uploadUrl` (required) and optional `authHeaders`\n * so the workspace `lib/api.ts` config can supply both without the primitive\n * knowing anything about the deployment environment.\n */\n\nimport { useState, useCallback, useRef, useMemo } from 'react'\nimport { toast } from 'sonner'\n\n// Configuration defaults\nconst MAX_FILE_SIZE = 20 * 1024 * 1024 // 20 MB\nconst MAX_FILES = 10\n\nconst ALLOWED_TYPES: Record<string, { category: string; ext: string }> = {\n 'image/jpeg': { category: 'image', ext: 'jpg' },\n 'image/png': { category: 'image', ext: 'png' },\n 'image/gif': { category: 'image', ext: 'gif' },\n 'application/pdf': { category: 'pdf', ext: 'pdf' },\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': {\n category: 'document',\n ext: 'docx',\n },\n 'text/plain': { category: 'text', ext: 'txt' },\n 'text/csv': { category: 'text', ext: 'csv' },\n 'text/html': { category: 'text', ext: 'html' },\n 'text/css': { category: 'text', ext: 'css' },\n 'text/xml': { category: 'text', ext: 'xml' },\n 'application/xml': { category: 'text', ext: 'xml' },\n 'application/javascript': { category: 'text', ext: 'js' },\n 'text/javascript': { category: 'text', ext: 'js' },\n}\n\nexport interface UploadResult {\n id: string\n filename: string\n fileType: string\n fileSize: number\n fileCategory: string\n publicUrl?: string\n status: string\n}\n\nexport interface PendingFile {\n id: string\n file: File\n progress: number\n status: 'pending' | 'uploading' | 'uploaded' | 'error'\n error?: string\n previewUrl?: string\n extractedText?: string\n uploadResult?: UploadResult\n}\n\nexport interface UseFileUploadOptions {\n /**\n * Absolute URL that accepts POST multipart/form-data uploads.\n * Supplied by the consuming lens via `lib/api.ts` — never hardcoded here.\n */\n uploadUrl: string\n /**\n * Optional HTTP headers forwarded with every XHR upload request\n * (e.g. `{ Authorization: 'Bearer <token>' }`). Supplied by the\n * consuming lens; the primitive never reads env vars or auth stores.\n */\n authHeaders?: Record<string, string>\n /** Conversation ID to associate uploads with an existing conversation. */\n conversationId?: string | null | undefined\n /** Maximum number of files (default: 10). */\n maxFiles?: number\n /** Maximum bytes per file (default: 20 MB). */\n maxFileSize?: number\n /** Called when a file fails to upload. */\n onError?: (error: Error) => void\n}\n\nexport function useFileUpload({\n uploadUrl,\n authHeaders,\n conversationId,\n maxFiles = MAX_FILES,\n maxFileSize = MAX_FILE_SIZE,\n onError,\n}: UseFileUploadOptions) {\n const [pendingFiles, setPendingFiles] = useState<PendingFile[]>([])\n const [isUploading, setIsUploading] = useState(false)\n const abortControllersRef = useRef<Map<string, AbortController>>(new Map())\n\n // Stable session ID for this upload session\n const sessionId = useMemo(\n () => `session-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\n [],\n )\n\n const generateId = () =>\n `file-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\n\n const getFileInfo = (mimeType: string) => ALLOWED_TYPES[mimeType] ?? null\n\n const validateFile = (file: File): string | null => {\n if (file.size > maxFileSize) {\n return `${file.name} exceeds ${maxFileSize / 1024 / 1024}MB limit`\n }\n if (!getFileInfo(file.type)) {\n return `${file.name} has unsupported type (${file.type || 'unknown'})`\n }\n return null\n }\n\n // Extract text from DOCX files — dynamic import keeps mammoth out of the\n // initial bundle when the feature is unused.\n const extractDocxText = async (file: File): Promise<string | undefined> => {\n try {\n const mammoth = await import('mammoth')\n const arrayBuffer = await file.arrayBuffer()\n const result = await mammoth.extractRawText({ arrayBuffer })\n return result.value\n } catch (error) {\n console.error('Failed to extract DOCX text:', error)\n return undefined\n }\n }\n\n const readTextFile = async (file: File): Promise<string | undefined> => {\n try {\n return await file.text()\n } catch (error) {\n console.error('Failed to read text file:', error)\n return undefined\n }\n }\n\n const processFile = async (file: File): Promise<Partial<PendingFile>> => {\n const fileInfo = getFileInfo(file.type)\n if (!fileInfo) return {}\n\n if (fileInfo.category === 'image') {\n return { previewUrl: URL.createObjectURL(file) }\n }\n if (fileInfo.category === 'document') {\n const extractedText = await extractDocxText(file)\n return extractedText !== undefined ? { extractedText } : {}\n }\n if (fileInfo.category === 'text') {\n const extractedText = await readTextFile(file)\n return extractedText !== undefined ? { extractedText } : {}\n }\n return {}\n }\n\n // XHR upload — kept over fetch so we get granular upload-progress events.\n const uploadFile = async (pendingFile: PendingFile): Promise<UploadResult> => {\n const formData = new FormData()\n formData.append('file', pendingFile.file)\n formData.append('sessionId', sessionId)\n if (conversationId) {\n formData.append('conversationId', conversationId)\n }\n formData.append('originalFilename', pendingFile.file.name)\n if (pendingFile.extractedText) {\n formData.append('extractedText', pendingFile.extractedText)\n }\n\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest()\n const controller = new AbortController()\n abortControllersRef.current.set(pendingFile.id, controller)\n\n xhr.upload.addEventListener('progress', (e) => {\n if (e.lengthComputable) {\n const progress = Math.round((e.loaded / e.total) * 100)\n setPendingFiles((prev) =>\n prev.map((f) => (f.id === pendingFile.id ? { ...f, progress } : f)),\n )\n }\n })\n\n xhr.addEventListener('load', () => {\n abortControllersRef.current.delete(pendingFile.id)\n if (xhr.status >= 200 && xhr.status < 300) {\n const result = JSON.parse(xhr.responseText) as UploadResult\n resolve(result)\n } else {\n try {\n const errBody = JSON.parse(xhr.responseText) as { error?: string }\n reject(new Error(errBody.error ?? `Upload failed: ${xhr.status}`))\n } catch {\n reject(new Error(`Upload failed: ${xhr.status}`))\n }\n }\n })\n\n xhr.addEventListener('error', () => {\n abortControllersRef.current.delete(pendingFile.id)\n reject(new Error('Upload failed'))\n })\n\n xhr.addEventListener('abort', () => {\n abortControllersRef.current.delete(pendingFile.id)\n reject(new Error('Upload aborted'))\n })\n\n xhr.open('POST', uploadUrl)\n\n // Forward caller-supplied auth headers (e.g. Bearer token)\n if (authHeaders) {\n for (const [key, value] of Object.entries(authHeaders)) {\n xhr.setRequestHeader(key, value)\n }\n }\n\n xhr.send(formData)\n })\n }\n\n const uploadSingleFile = useCallback(\n async (pendingFile: PendingFile) => {\n setPendingFiles((prev) =>\n prev.map((f) =>\n f.id === pendingFile.id ? { ...f, status: 'uploading' as const } : f,\n ),\n )\n\n try {\n const result = await uploadFile(pendingFile)\n setPendingFiles((prev) =>\n prev.map((f) =>\n f.id === pendingFile.id\n ? { ...f, status: 'uploaded' as const, progress: 100, uploadResult: result }\n : f,\n ),\n )\n return result\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'Upload failed'\n setPendingFiles((prev) =>\n prev.map((f) =>\n f.id === pendingFile.id\n ? { ...f, status: 'error' as const, error: errorMessage }\n : f,\n ),\n )\n onError?.(error instanceof Error ? error : new Error(errorMessage))\n return null\n }\n },\n [uploadUrl, authHeaders, sessionId, conversationId, onError],\n )\n\n const addFiles = useCallback(\n async (files: File[]) => {\n const currentCount = pendingFiles.length\n const availableSlots = maxFiles - currentCount\n\n if (availableSlots <= 0) {\n toast.error(`Maximum ${maxFiles} files allowed`)\n return\n }\n\n const filesToAdd = files.slice(0, availableSlots)\n const errors: string[] = []\n const validFiles: { file: File; processed: Partial<PendingFile> }[] = []\n\n for (const file of filesToAdd) {\n const error = validateFile(file)\n if (error) {\n errors.push(error)\n continue\n }\n const processed = await processFile(file)\n validFiles.push({ file, processed })\n }\n\n if (errors.length > 0) {\n errors.forEach((err) => toast.error(err))\n }\n\n if (validFiles.length > 0) {\n const newPendingFiles: PendingFile[] = validFiles.map(\n ({ file, processed }) => ({\n id: generateId(),\n file,\n progress: 0,\n status: 'pending' as const,\n ...processed,\n }),\n )\n\n setPendingFiles((prev) => [...prev, ...newPendingFiles])\n\n setIsUploading(true)\n void Promise.all(newPendingFiles.map((pf) => uploadSingleFile(pf))).finally(\n () => {\n setIsUploading(false)\n },\n )\n }\n\n if (files.length > availableSlots) {\n toast.warning(`Only ${availableSlots} files added (max ${maxFiles})`)\n }\n },\n [pendingFiles.length, maxFiles, maxFileSize, uploadSingleFile],\n )\n\n const removeFile = useCallback((fileId: string) => {\n setPendingFiles((prev) => {\n const file = prev.find((f) => f.id === fileId)\n if (file?.previewUrl) {\n URL.revokeObjectURL(file.previewUrl)\n }\n const controller = abortControllersRef.current.get(fileId)\n if (controller) {\n controller.abort()\n abortControllersRef.current.delete(fileId)\n }\n return prev.filter((f) => f.id !== fileId)\n })\n }, [])\n\n const clearFiles = useCallback(() => {\n pendingFiles.forEach((file) => {\n if (file.previewUrl) URL.revokeObjectURL(file.previewUrl)\n })\n abortControllersRef.current.forEach((controller) => controller.abort())\n abortControllersRef.current.clear()\n setPendingFiles([])\n }, [pendingFiles])\n\n const getUploadedResults = useCallback(\n (): UploadResult[] =>\n pendingFiles\n .filter((f) => f.status === 'uploaded' && f.uploadResult)\n .map((f) => f.uploadResult!),\n [pendingFiles],\n )\n\n const hasFilesUploading = pendingFiles.some(\n (f) => f.status === 'uploading' || f.status === 'pending',\n )\n const hasUploadErrors = pendingFiles.some((f) => f.status === 'error')\n const allFilesUploaded =\n pendingFiles.length > 0 && pendingFiles.every((f) => f.status === 'uploaded')\n const totalProgress =\n pendingFiles.length > 0\n ? Math.round(\n pendingFiles.reduce((sum, f) => sum + f.progress, 0) / pendingFiles.length,\n )\n : 0\n\n return {\n pendingFiles,\n addFiles,\n removeFile,\n clearFiles,\n getUploadedResults,\n isUploading,\n hasFilesUploading,\n hasUploadErrors,\n allFilesUploaded,\n totalProgress,\n sessionId,\n }\n}\n","/**\n * CodeBlock — syntax-highlighted code block with language label + copy button.\n * MarkdownCode — react-markdown `code` element adapter (inline + fenced).\n *\n * Uses PrismLight (synchronous, tree-shakeable) so only registered languages\n * are bundled. Theme follows the html data-theme attribute via a local\n * MutationObserver hook.\n *\n * Promoted from brand-ai-extension (ADR-036 D20).\n */\n\nimport { useEffect, useState, type HTMLAttributes } from 'react'\nimport { Check, Copy } from 'lucide-react'\nimport { PrismLight as SyntaxHighlighter } from 'react-syntax-highlighter'\nimport { vscDarkPlus, oneLight } from 'react-syntax-highlighter/dist/esm/styles/prism'\n\nimport bash from 'react-syntax-highlighter/dist/esm/languages/prism/bash'\nimport css from 'react-syntax-highlighter/dist/esm/languages/prism/css'\nimport diff from 'react-syntax-highlighter/dist/esm/languages/prism/diff'\nimport javascript from 'react-syntax-highlighter/dist/esm/languages/prism/javascript'\nimport json from 'react-syntax-highlighter/dist/esm/languages/prism/json'\nimport jsx from 'react-syntax-highlighter/dist/esm/languages/prism/jsx'\nimport markdown from 'react-syntax-highlighter/dist/esm/languages/prism/markdown'\nimport markup from 'react-syntax-highlighter/dist/esm/languages/prism/markup'\nimport python from 'react-syntax-highlighter/dist/esm/languages/prism/python'\nimport sql from 'react-syntax-highlighter/dist/esm/languages/prism/sql'\nimport tsx from 'react-syntax-highlighter/dist/esm/languages/prism/tsx'\nimport typescript from 'react-syntax-highlighter/dist/esm/languages/prism/typescript'\nimport yaml from 'react-syntax-highlighter/dist/esm/languages/prism/yaml'\n\nimport { cn } from './lib/utils'\n\n/**\n * Reads the html data-theme attribute and re-fires whenever it changes.\n * Kept local until a workspace-wide useTheme hook is promoted.\n */\nfunction useDataTheme(): 'light' | 'dark' {\n const read = (): 'light' | 'dark' => {\n if (typeof document === 'undefined') return 'dark'\n const attr = document.documentElement.getAttribute('data-theme')\n return attr === 'light' ? 'light' : 'dark'\n }\n\n const [theme, setTheme] = useState<'light' | 'dark'>(read)\n\n useEffect(() => {\n if (typeof window === 'undefined') return\n const observer = new MutationObserver(() => setTheme(read()))\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['data-theme'],\n })\n return () => observer.disconnect()\n }, [])\n\n return theme\n}\n\n// Register the language allowlist once at module scope.\nconst LANGUAGES: Record<string, unknown> = {\n bash,\n shell: bash,\n sh: bash,\n css,\n diff,\n javascript,\n js: javascript,\n json,\n jsx,\n markdown,\n md: markdown,\n html: markup,\n xml: markup,\n python,\n py: python,\n sql,\n tsx,\n typescript,\n ts: typescript,\n yaml,\n yml: yaml,\n}\n\nfor (const [name, lang] of Object.entries(LANGUAGES)) {\n SyntaxHighlighter.registerLanguage(name, lang as never)\n}\n\nconst LANGUAGE_LABELS: Record<string, string> = {\n bash: 'bash',\n sh: 'shell',\n css: 'css',\n diff: 'diff',\n html: 'html',\n javascript: 'javascript',\n js: 'javascript',\n json: 'json',\n jsx: 'jsx',\n markdown: 'markdown',\n md: 'markdown',\n python: 'python',\n py: 'python',\n shell: 'shell',\n sql: 'sql',\n tsx: 'tsx',\n ts: 'typescript',\n typescript: 'typescript',\n xml: 'xml',\n yaml: 'yaml',\n yml: 'yaml',\n}\n\nexport interface CodeBlockProps {\n /** Lowercased language identifier, e.g. \"typescript\" or \"json\". */\n language?: string\n /** Raw source text. */\n children: string\n}\n\nexport function CodeBlock({ language, children }: CodeBlockProps) {\n const [copied, setCopied] = useState(false)\n const theme = useDataTheme()\n const syntaxStyle = theme === 'light' ? oneLight : vscDarkPlus\n const lang = (language ?? '').toLowerCase()\n const supported = lang in LANGUAGES\n const label = (LANGUAGE_LABELS[lang] ?? lang) || 'plaintext'\n const source = String(children).replace(/\\n$/, '')\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(source)\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n } catch {\n // Clipboard can fail in insecure contexts — silently no-op.\n }\n }\n\n return (\n <div\n className=\"my-4 overflow-hidden text-sm\"\n style={{\n background: 'rgb(var(--bg-elevated))',\n border: '1px solid rgb(var(--border))',\n borderRadius: 'var(--radius-md)',\n }}\n >\n {/* Header: language label + copy button */}\n <div\n className=\"flex items-center justify-between px-3 py-1.5 text-xs\"\n style={{\n background: 'rgb(var(--muted))',\n borderBottom: '1px solid rgb(var(--border))',\n color: 'rgb(var(--muted-foreground))',\n }}\n >\n <span className=\"font-mono lowercase\">{label}</span>\n <button\n type=\"button\"\n onClick={handleCopy}\n className={cn(\n 'flex items-center gap-1 rounded-md px-2 py-1 text-xs transition-colors',\n !copied && 'hover:text-[rgb(var(--foreground))]',\n )}\n style={copied ? { color: 'rgb(var(--success))' } : undefined}\n aria-label={copied ? 'Copied' : 'Copy code'}\n >\n {copied ? (\n <>\n <Check className=\"h-3.5 w-3.5\" /> Copied\n </>\n ) : (\n <>\n <Copy className=\"h-3.5 w-3.5\" /> Copy\n </>\n )}\n </button>\n </div>\n\n {/* Body */}\n {supported ? (\n <SyntaxHighlighter\n language={lang}\n style={syntaxStyle}\n customStyle={{\n margin: 0,\n padding: '0.875rem 1rem',\n background: 'transparent',\n fontSize: '0.8125rem',\n lineHeight: 1.6,\n }}\n codeTagProps={{\n style: { fontFamily: 'ui-monospace, SFMono-Regular, Menlo, monospace' },\n }}\n >\n {source}\n </SyntaxHighlighter>\n ) : (\n <pre\n className=\"overflow-x-auto px-4 py-3.5 font-mono text-[0.8125rem] leading-relaxed\"\n style={{ color: 'rgb(var(--foreground))' }}\n >\n {source}\n </pre>\n )}\n </div>\n )\n}\n\n/**\n * MarkdownCode — react-markdown code element adapter.\n *\n * Inline code (single backtick, no className) renders as a small chip.\n * Fenced code (triple backtick, className=\"language-xxx\") delegates to\n * CodeBlock for syntax highlighting + copy button.\n */\nexport function MarkdownCode({ className, children }: HTMLAttributes<HTMLElement>) {\n if (!className) {\n return (\n <code\n className=\"rounded px-1.5 py-0.5 font-mono text-[0.85em]\"\n style={{\n background: 'rgb(var(--muted))',\n color: 'rgb(var(--foreground))',\n borderRadius: 'var(--radius-xs)',\n }}\n >\n {children}\n </code>\n )\n }\n\n const match = /language-([\\w-]+)/.exec(className)\n const language = match?.[1]\n return <CodeBlock {...(language !== undefined ? { language } : {})}>{String(children)}</CodeBlock>\n}\n","/**\n * MarkdownRenderer — renders a markdown string using react-markdown + remark-gfm.\n * Component overrides match the chat-message.tsx config from brand-ai-extension.\n *\n * Promoted from brand-ai-extension (ADR-036 D20).\n * Extracted from components/chat/chat-message.tsx (lines 15-110 — the\n * MARKDOWN_COMPONENTS and REMARK_PLUGINS constants + renderMarkdown helper).\n *\n * Token note: the source referenced --primary for blockquote border, link\n * colour, and ordered-list marker accent. --primary is an internal token.\n * Replaced with the public --accent token throughout.\n */\n\nimport type {\n InputHTMLAttributes,\n HTMLAttributes,\n AnchorHTMLAttributes,\n} from 'react'\nimport ReactMarkdown, { type Components } from 'react-markdown'\nimport remarkGfm from 'remark-gfm'\nimport { MarkdownCode } from './code-block'\n\ntype NodeProps = HTMLAttributes<HTMLElement>\ntype AnchorProps = AnchorHTMLAttributes<HTMLAnchorElement>\n\nconst MARKDOWN_COMPONENTS: Components = {\n h1: ({ children }: NodeProps) => (\n <h1\n className=\"mt-6 mb-3 text-xl font-bold first:mt-0\"\n style={{ color: 'rgb(var(--foreground))' }}\n >\n {children}\n </h1>\n ),\n h2: ({ children }: NodeProps) => (\n <h2\n className=\"mt-5 mb-2 text-lg font-bold first:mt-0\"\n style={{ color: 'rgb(var(--foreground))' }}\n >\n {children}\n </h2>\n ),\n h3: ({ children }: NodeProps) => (\n <h3\n className=\"mt-4 mb-2 text-base font-semibold first:mt-0\"\n style={{ color: 'rgb(var(--foreground))' }}\n >\n {children}\n </h3>\n ),\n p: ({ children }: NodeProps) => (\n <p\n className=\"mb-4 leading-relaxed last:mb-0\"\n style={{ color: 'rgb(var(--foreground))' }}\n >\n {children}\n </p>\n ),\n // list-outside + left padding so wrapped lines indent under the text (not the\n // marker). Bullets use text-tertiary; ordered markers use --accent + bold so\n // the numbering reads as deliberate hierarchy rather than browser-default grey.\n ul: ({ children }: NodeProps) => (\n <ul\n className=\"mb-4 list-disc list-outside space-y-2 pl-6\"\n style={{ color: 'rgb(var(--text-tertiary))' }}\n >\n {children}\n </ul>\n ),\n ol: ({ children }: NodeProps) => (\n <ol\n className=\"mb-4 list-decimal list-outside space-y-2 pl-6 marker:font-semibold\"\n style={{ color: 'rgb(var(--foreground))' }}\n >\n {children}\n </ol>\n ),\n li: ({ children }: NodeProps) => (\n <li\n className=\"pl-1 leading-relaxed\"\n style={{ color: 'rgb(var(--foreground))' }}\n >\n {children}\n </li>\n ),\n strong: ({ children }: NodeProps) => (\n <strong className=\"font-semibold\" style={{ color: 'rgb(var(--foreground))' }}>\n {children}\n </strong>\n ),\n em: ({ children }: NodeProps) => (\n <em className=\"italic\" style={{ color: 'rgb(var(--foreground))' }}>\n {children}\n </em>\n ),\n // code: inline chip or fenced block (handled by CodeBlock via MarkdownCode).\n // pre just passes through so the highlighter owns its own container.\n code: MarkdownCode,\n pre: ({ children }: NodeProps) => <>{children}</>,\n blockquote: ({ children }: NodeProps) => (\n <blockquote\n className=\"my-4 border-l-4 py-1 pl-4 italic\"\n style={{\n borderColor: 'rgb(var(--accent))',\n color: 'rgb(var(--muted-foreground))',\n }}\n >\n {children}\n </blockquote>\n ),\n hr: () => (\n <hr className=\"my-6\" style={{ borderColor: 'rgb(var(--border))' }} />\n ),\n a: ({ href, children }: AnchorProps) => (\n <a\n href={href}\n className=\"hover:underline\"\n style={{ color: 'rgb(var(--accent))' }}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {children}\n </a>\n ),\n // GFM additions — tables, task lists, strikethrough.\n table: ({ children }: NodeProps) => (\n <div\n className=\"my-4 overflow-x-auto\"\n style={{\n borderRadius: 'var(--radius-md)',\n border: '1px solid rgb(var(--border))',\n }}\n >\n <table className=\"w-full border-collapse text-sm\">{children}</table>\n </div>\n ),\n thead: ({ children }: NodeProps) => (\n <thead\n style={{\n background: 'rgb(var(--muted))',\n color: 'rgb(var(--muted-foreground))',\n }}\n >\n {children}\n </thead>\n ),\n tbody: ({ children }: NodeProps) => <tbody>{children}</tbody>,\n tr: ({ children }: NodeProps) => (\n <tr\n className=\"first:border-t-0\"\n style={{ borderTop: '1px solid rgb(var(--border))' }}\n >\n {children}\n </tr>\n ),\n th: ({ children }: NodeProps) => (\n <th className=\"px-3 py-2 text-left font-medium\">{children}</th>\n ),\n td: ({ children }: NodeProps) => (\n <td\n className=\"px-3 py-2 align-top\"\n style={{ color: 'rgb(var(--foreground))' }}\n >\n {children}\n </td>\n ),\n del: ({ children }: NodeProps) => (\n <del className=\"line-through\" style={{ color: 'rgb(var(--muted-foreground))' }}>\n {children}\n </del>\n ),\n // Task-list checkboxes rendered by remark-gfm for \"- [ ] ...\" / \"- [x] ...\".\n input: (props: InputHTMLAttributes<HTMLInputElement>) =>\n props.type === 'checkbox' ? (\n <input\n {...props}\n disabled\n className=\"mr-1.5 -translate-y-px\"\n style={{ accentColor: 'rgb(var(--accent))' }}\n />\n ) : (\n <input {...props} />\n ),\n}\n\nconst REMARK_PLUGINS = [remarkGfm]\n\nexport interface MarkdownRendererProps {\n /** Raw markdown string to render. */\n children: string\n /** Optional className applied to the wrapping div. */\n className?: string\n}\n\n/**\n * MarkdownRenderer — drop-in markdown surface with GFM support.\n * Renders headings, lists, code (via CodeBlock), tables, task lists,\n * strikethrough, blockquotes, and links with workspace token styling.\n */\nexport function MarkdownRenderer({ children, className }: MarkdownRendererProps) {\n return (\n <div className={className}>\n <ReactMarkdown\n components={MARKDOWN_COMPONENTS}\n remarkPlugins={REMARK_PLUGINS}\n >\n {children}\n </ReactMarkdown>\n </div>\n )\n}\n\n// Re-export for callers that just want the raw component map\nexport { MARKDOWN_COMPONENTS as markdownComponents }\n","/**\n * ResizableHandle — pointer-driven splitter handle with WAI-ARIA splitter\n * a11y. Controlled `value` (px); `onChange` fires every animation frame\n * during drag, `onCommit` once on release. Arrow keys nudge by `step`;\n * `Home` and double-click reset to `defaultValue ?? (min + max) / 2`.\n *\n * Pointer events (with `setPointerCapture`) give touch + mouse parity in\n * a single code path; the capture also keeps the drag live when the\n * cursor leaves the 1-px handle. State during drag lives in refs so\n * pointermove never triggers a React re-render — `onChange` is the\n * caller's signal that the controlled value should update.\n *\n * Promoted per ADR-049 D8/D9: the Generate lens (`form-panel.tsx`) had\n * a local mouse-event resize; ADR-049's pinned sidebar panel is the\n * second consumer (ADR-008 D3 gate).\n *\n * ResizablePane is an optional thin `<aside>` wrapper that sizes itself\n * to `value` on the relevant axis and mounts a `<ResizableHandle>` on\n * the matching edge.\n */\n\nimport {\n useCallback,\n useRef,\n useState,\n type CSSProperties,\n type KeyboardEvent,\n type PointerEvent as ReactPointerEvent,\n type ReactNode,\n} from 'react'\nimport { cn } from './lib/utils'\n\nexport interface ResizableHandleProps {\n /** Which edge of the parent the handle decorates. */\n side: 'left' | 'right' | 'top' | 'bottom'\n /** Controlled width/height (px). */\n value: number\n /** Called on every animation-frame-throttled pointermove during drag. */\n onChange: (next: number) => void\n /** Called once on pointerup with the final value. Use for persistence. */\n onCommit?: (final: number) => void\n /** Lower bound (px). */\n min: number\n /** Upper bound (px). */\n max: number\n /** Double-click / Home target. Defaults to `(min + max) / 2`. */\n defaultValue?: number\n /** Keyboard nudge step (px). Default 16. */\n step?: number\n /** ARIA label for the splitter. Required. */\n 'aria-label': string\n /** Disable all interaction. Used by the sidebar's hover-out mode. */\n disabled?: boolean\n className?: string\n}\n\nfunction clamp(n: number, lo: number, hi: number): number {\n return Math.max(lo, Math.min(hi, n))\n}\n\nfunction isHorizontal(side: ResizableHandleProps['side']): boolean {\n return side === 'left' || side === 'right'\n}\n\nexport function ResizableHandle({\n side,\n value,\n onChange,\n onCommit,\n min,\n max,\n defaultValue,\n step = 16,\n 'aria-label': ariaLabel,\n disabled = false,\n className,\n}: ResizableHandleProps) {\n const horizontal = isHorizontal(side)\n const resetValue = defaultValue ?? (min + max) / 2\n\n // Drag state lives in refs — pointermove must not re-render.\n const dragStartCoord = useRef(0)\n const dragStartValue = useRef(0)\n const rafIdRef = useRef<number | null>(null)\n const pendingValueRef = useRef<number>(value)\n const lastEmittedRef = useRef<number>(value)\n\n const [isDragging, setIsDragging] = useState(false)\n\n const flushPending = useCallback(() => {\n rafIdRef.current = null\n const next = pendingValueRef.current\n if (next !== lastEmittedRef.current) {\n lastEmittedRef.current = next\n onChange(next)\n }\n }, [onChange])\n\n const handlePointerDown = useCallback(\n (e: ReactPointerEvent<HTMLDivElement>) => {\n if (disabled) return\n // Only react to primary pointer (left mouse, primary touch).\n if (e.button !== 0 && e.pointerType === 'mouse') return\n e.preventDefault()\n e.currentTarget.setPointerCapture(e.pointerId)\n dragStartCoord.current = horizontal ? e.clientX : e.clientY\n dragStartValue.current = value\n pendingValueRef.current = value\n lastEmittedRef.current = value\n setIsDragging(true)\n },\n [disabled, horizontal, value],\n )\n\n const handlePointerMove = useCallback(\n (e: ReactPointerEvent<HTMLDivElement>) => {\n if (disabled) return\n if (!e.currentTarget.hasPointerCapture(e.pointerId)) return\n const coord = horizontal ? e.clientX : e.clientY\n const delta = coord - dragStartCoord.current\n // For `left` and `top` sides, dragging \"toward\" the parent shrinks it,\n // so the sign of the delta is inverted.\n const signed = side === 'left' || side === 'top' ? -delta : delta\n const next = clamp(dragStartValue.current + signed, min, max)\n pendingValueRef.current = next\n if (rafIdRef.current === null) {\n rafIdRef.current = requestAnimationFrame(flushPending)\n }\n },\n [disabled, flushPending, horizontal, max, min, side],\n )\n\n const endDrag = useCallback(\n (e: ReactPointerEvent<HTMLDivElement>) => {\n if (!e.currentTarget.hasPointerCapture(e.pointerId)) return\n e.currentTarget.releasePointerCapture(e.pointerId)\n if (rafIdRef.current !== null) {\n cancelAnimationFrame(rafIdRef.current)\n rafIdRef.current = null\n }\n const final = pendingValueRef.current\n // Ensure the final value reached the caller before commit.\n if (final !== lastEmittedRef.current) {\n lastEmittedRef.current = final\n onChange(final)\n }\n setIsDragging(false)\n onCommit?.(final)\n },\n [onChange, onCommit],\n )\n\n const handleDoubleClick = useCallback(() => {\n if (disabled) return\n const next = clamp(resetValue, min, max)\n onChange(next)\n onCommit?.(next)\n }, [disabled, max, min, onChange, onCommit, resetValue])\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLDivElement>) => {\n if (disabled) return\n const decreaseKey = horizontal ? 'ArrowLeft' : 'ArrowUp'\n const increaseKey = horizontal ? 'ArrowRight' : 'ArrowDown'\n // For `left`/`top` sides, \"decrease size\" maps to the OPPOSITE arrow\n // because the handle sits on the far side of the parent.\n const inverted = side === 'left' || side === 'top'\n // PageUp/PageDown follow the conventional splitter pattern of nudging\n // by step * 4 — large-step navigation for keyboard-only users.\n const largeStep = step * 4\n let next: number | null = null\n if (e.key === decreaseKey) {\n next = clamp(value + (inverted ? step : -step), min, max)\n } else if (e.key === increaseKey) {\n next = clamp(value + (inverted ? -step : step), min, max)\n } else if (e.key === 'PageDown') {\n // PageDown shrinks (mirrors decrease arrow direction).\n next = clamp(value + (inverted ? largeStep : -largeStep), min, max)\n } else if (e.key === 'PageUp') {\n // PageUp grows (mirrors increase arrow direction).\n next = clamp(value + (inverted ? -largeStep : largeStep), min, max)\n } else if (e.key === 'Home') {\n next = clamp(resetValue, min, max)\n }\n if (next !== null) {\n e.preventDefault()\n onChange(next)\n onCommit?.(next)\n }\n },\n [disabled, horizontal, max, min, onChange, onCommit, resetValue, side, step, value],\n )\n\n const cursor = horizontal ? 'col-resize' : 'row-resize'\n const orientation = horizontal ? 'vertical' : 'horizontal'\n\n // MAJ-2 (Sidebar-A hot-fix): hit-target widened to 8 px while the visible\n // line stays 4 px (`w-1`/`h-1`). Padding extends the interactive area on the\n // cross-axis; `background-clip: content-box` keeps the rest-state background\n // painting only on the inner 4 px. Negative margin on the cross-axis\n // recenters the element over the parent's edge so the visual line still\n // sits on the seam.\n //\n // Math: 4 px line + 2 × 2 px padding = 8 px effective hit zone.\n // `box-sizing: content-box` makes the padding additive to width/height\n // (Tailwind's preflight sets box-sizing: border-box globally, which would\n // otherwise eat the padding into the existing 4 px).\n const HIT_PAD = 2\n const style: CSSProperties = {\n cursor: disabled ? 'default' : cursor,\n backgroundColor: isDragging\n ? 'rgb(var(--accent-muted))'\n : undefined,\n touchAction: 'none',\n padding: horizontal ? `0 ${HIT_PAD}px` : `${HIT_PAD}px 0`,\n backgroundClip: 'content-box',\n boxSizing: 'content-box',\n // Recenter on the parent's edge so the inner 4 px line stays where it\n // was before the padding was added.\n marginLeft: horizontal ? `-${HIT_PAD}px` : undefined,\n marginTop: horizontal ? undefined : `-${HIT_PAD}px`,\n }\n\n return (\n <div\n role=\"separator\"\n aria-orientation={orientation}\n aria-valuenow={value}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-label={ariaLabel}\n aria-disabled={disabled || undefined}\n tabIndex={disabled ? -1 : 0}\n data-resizable-handle\n data-side={side}\n data-orientation={orientation}\n data-dragging={isDragging || undefined}\n onPointerDown={disabled ? undefined : handlePointerDown}\n onPointerMove={disabled ? undefined : handlePointerMove}\n onPointerUp={disabled ? undefined : endDrag}\n onPointerCancel={disabled ? undefined : endDrag}\n onDoubleClick={disabled ? undefined : handleDoubleClick}\n onKeyDown={disabled ? undefined : handleKeyDown}\n className={cn(\n 'resizable-handle',\n horizontal\n ? 'absolute top-0 w-1 h-full'\n : 'absolute left-0 h-1 w-full',\n side === 'right' && 'right-0',\n side === 'left' && 'left-0',\n side === 'bottom' && 'bottom-0',\n side === 'top' && 'top-0',\n !isDragging && !disabled && 'hover:bg-[rgb(var(--accent-subtle))]',\n 'focus-visible:outline-none focus-visible:bg-[rgb(var(--accent-subtle))]',\n className,\n )}\n style={style}\n />\n )\n}\n\nexport interface ResizablePaneProps extends ResizableHandleProps {\n children: ReactNode\n paneClassName?: string\n}\n\nexport function ResizablePane({\n children,\n paneClassName,\n ...handleProps\n}: ResizablePaneProps) {\n const horizontal = isHorizontal(handleProps.side)\n const paneStyle: CSSProperties = horizontal\n ? { width: `${handleProps.value}px` }\n : { height: `${handleProps.value}px` }\n return (\n <aside className={cn('relative', paneClassName)} style={paneStyle}>\n {children}\n <ResizableHandle {...handleProps} />\n </aside>\n )\n}\n","/**\n * Kbd — semantic keyboard-input chip.\n *\n * Promoted from the Chat lens's inline title-chip markup per ADR-050 D11.\n * Committed consumers (ADR-008 D3 promotion gate):\n * • Chat lens title-bar chip (apps/workspace/src/lenses/chat/index.tsx) —\n * first migrated consumer, lands in this phase.\n * • Command palette body / footer hints (ADR-050 Phases B–E).\n * • Sidebar switcher-popout Esc hint (ADR-049 Phase C).\n *\n * Renders a `<kbd>` semantic element (screen readers announce as keyboard\n * input). Token-driven styling — no hex literals, all colors flow through\n * public tokens.\n */\n\nimport type { ReactNode, CSSProperties } from 'react'\n\nexport interface KbdProps {\n /** Child text — typically a single key glyph or short string. */\n children: ReactNode\n /** Optional size — defaults to 'md'. */\n size?: 'sm' | 'md'\n}\n\nexport function Kbd({ children, size = 'md' }: KbdProps) {\n const style: CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '0.125rem',\n background: 'rgb(var(--surface-overlay-soft))',\n border: '1px solid rgb(var(--border))',\n color: 'rgb(var(--text-tertiary))',\n fontFamily: 'var(--font-mono)',\n fontSize: size === 'sm' ? '10.5px' : '11.5px',\n padding: size === 'sm' ? '1px 6px' : '2px 8px',\n borderRadius: 'var(--radius-xs)',\n lineHeight: 1,\n }\n return <kbd style={style}>{children}</kbd>\n}\n","/**\n * FrameStack — slate outer-frame wrapper for the shell/tray pattern.\n *\n * Single purpose: wrap 2+ inner cards as ONE visual group. Renders an\n * outer frame (--surface-frame via --card-frame-bg, --border-card)\n * holding the children with a --tray-inset outer padding and a slightly\n * larger gap between them.\n *\n * The padding is the SAME token <Card> uses for its own tray inset, so a\n * framed group and a framed card have an identical edge. It was a\n * hardcoded 10 px, which made the group frame visibly chunkier than every\n * card beside it — the two patterns are the same idea and should not\n * measure differently.\n *\n * Padding smaller than the gap is deliberate, not an oversight: it is\n * what the corpus kits measure (AI Agent's shell is pad 4 / gap 10), and\n * it reads as panes seated in a tight frame rather than cards floating in\n * a loose one.\n *\n * ┌─────────────────────────────────┐ ← <FrameStack>\n * │ ┌─────────────────────────────┐ │ frame bg (--card-frame-bg)\n * │ │ Card / SectionCard 01 │ │ --tray-inset padding, 10 px gap\n * │ └─────────────────────────────┘ │ 1 px --border-card outline\n * │ ┌─────────────────────────────┐ │ --radius-xl (20 px) outer\n * │ │ Card / SectionCard 02 │ │\n * │ └─────────────────────────────┘ │ ← child Card (tray)\n * │ ┌─────────────────────────────┐ │ white bg, 1 px border,\n * │ │ Card / SectionCard 03 │ │ --radius-lg (16 px)\n * │ └─────────────────────────────┘ │\n * └─────────────────────────────────┘\n *\n * Why a dedicated primitive instead of <Shell>:\n * <Shell> is overloaded in the workspace (\"the route shell\" / \"the\n * primitive\" / \"the data-framed div\"). When a directive says \"use a\n * shell\" or \"no shell,\" <Shell> consumers can't reliably tell which\n * one is meant. FrameStack does exactly one job, named clearly. If\n * you want this pattern, wrap. If you don't, don't.\n *\n * Anti-pattern (DO NOT replicate): rendering N <Card> / <SectionCard>\n * elements as direct page-background children with `gap-3`. That's\n * \"free-floating cards,\" not the shell/tray pattern. Wrap them.\n *\n * Consumers: the Social Spec builder (BuilderForm, TacticBuilder) and the\n * Brand Profile section groups.\n *\n * Token discipline: internal tokens (--card-frame-bg, --border-card)\n * are touched HERE per ADR-006 D2 — primitives live under\n * `packages/ui/` and may reference internal tokens.\n */\n\nimport { forwardRef, type HTMLAttributes } from 'react'\nimport { cn } from './lib/utils'\n\nexport interface FrameStackProps extends HTMLAttributes<HTMLDivElement> {\n /** Visual gap between child cards. Defaults to 10 px to match the\n * prototype's spec. Override only with a token value\n * (e.g. `'var(--space-3)'` for 12 px) — never a literal. */\n gap?: string\n /** Outer padding. Defaults to `--tray-inset`, the same inset <Card>\n * uses, so a framed group and a framed card share one edge. */\n padding?: string\n}\n\nexport const FrameStack = forwardRef<HTMLDivElement, FrameStackProps>(\n function FrameStack(\n { className, style, gap = '10px', padding = 'var(--tray-inset)', children, ...rest },\n ref,\n ) {\n return (\n <div\n ref={ref}\n data-framed=\"true\"\n className={cn('flex flex-col', className)}\n style={{\n background: 'rgb(var(--card-frame-bg))',\n border: '1px solid rgb(var(--border-card))',\n borderRadius: 'var(--radius-xl)',\n padding,\n gap,\n ...style,\n }}\n {...rest}\n >\n {children}\n </div>\n )\n },\n)\n\nFrameStack.displayName = 'FrameStack'\n","/**\n * CalculatorShell — centered, fixed-width layout primitive for\n * marketing / ad-performance / customer-economics calculators.\n *\n * Locked by ADR-030 D2 / D5 / D6 / D8 (the original shape spec) and\n * sharpened by ADR-058 D8 (final API + first 6 consumers). Promoted to\n * `@lovett/ui` with 6 first-day consumers (ROAS / ROI / CTR / CPC /\n * CPM / Conversion Rate) which clears ADR-008 D3's 2+ consumer gate\n * three-times over.\n *\n * Layout (per ADR-030 D2 + D8):\n * <PageShell crumbs={[{label: 'Tools', to: '/tools'}, {label: title}]}>\n * <div max-width: var(--prose-narrow), centered>\n * <header>\n * <h1>{title}</h1>\n * {subtitle && <p>{subtitle}</p>}\n * </header>\n * <div role=\"group\" aria-label=\"${title} inputs\">\n * {inputs}\n * </div>\n * {formula && <div>FORMULA · {formula}</div>}\n * <section aria-live=\"polite\" aria-atomic=\"true\">\n * RESULT · <big>{result}</big>\n * </section>\n * {secondaryStats && <div>{secondaryStats}</div>}\n * {(onReset || copyValue || shareUrl) && <action row>}\n * </div>\n * </PageShell>\n *\n * Interaction model (ADR-030 D5):\n * • No submit button. The result updates live as inputs change.\n * • The shell is presentational — it does NOT own form state. Each\n * calculator route owns its `useState` and computes `result` /\n * `secondaryStats` reactively before passing in.\n * • `aria-live=\"polite\"` on the result region so screen readers\n * announce the value once it stabilises (the user can finish\n * typing without the AT interrupting).\n *\n * Token + visual discipline (ADR-030 D8 / ADR-006):\n * • Result card: --accent-subtle background, --accent-muted border,\n * --accent text. Stands out from the form.\n * • Formula label: --text-tertiary, monospace.\n * • All sizing via --space-* / --radius-* / --ctrl-* tokens. Zero\n * hex literals.\n * • `tabular-nums` font-variant on the result so digit widths don't\n * shift during typing.\n */\n\nimport { useId, useState, type CSSProperties, type ReactNode } from 'react'\nimport { Check, Link2, RotateCcw } from 'lucide-react'\nimport PageShell from './page-shell'\nimport { Button } from './button'\nimport { toast } from './toast'\n\nexport interface CalculatorShellProps {\n /** Display title (e.g. \"ROAS Calculator\"). Rendered as H1 + last\n * crumb in <PageShell>. */\n title: string\n /** One-line subtitle below the title. Optional — describes what the\n * calculator computes. */\n subtitle?: string\n /** Form inputs slot. Typically a vertical stack of @lovett/ui\n * <Input> primitives wrapped in <label>s with `type=\"number\"`. */\n inputs: ReactNode\n /** Headline result value — large, accent-tinted, tabular-nums. Pass\n * the FORMATTED string (use `formatCurrency` / `formatPercent` /\n * `formatRatio` / `formatNumber`). NaN inputs surface as `'—'`. */\n result: ReactNode\n /** Optional formula label (e.g. \"ROAS = Revenue ÷ Ad Spend\"). Small,\n * dim, monospace-feel. Render as a <code> node so monospace +\n * semantics carry. */\n formula?: ReactNode\n /** Optional row of secondary derived stats (smaller, dim). Pass a\n * node containing 1-3 stat tiles or a single inline span. */\n secondaryStats?: ReactNode\n /** Optional reset to defaults. Renders a secondary \"Reset\" button\n * when provided. */\n onReset?: () => void\n /** Optional copy-result value (the formatted result string). Renders\n * a \"Copy result\" secondary button when provided. The value is\n * written to the clipboard on click; the button flashes a checkmark\n * + emits a success toast on success. Pass `undefined` to omit the\n * button — typically when the underlying number is NaN. */\n copyValue?: string | undefined\n /** Optional share-link URL — full or path. When provided, renders a\n * \"Copy link\" secondary button; click writes the URL to the\n * clipboard. (No tinyURL-style encoding here — the consumer\n * pre-builds the URL with encoded inputs.) */\n shareUrl?: string | undefined\n}\n\n/**\n * CalculatorShell — the layout primitive. See file-level JSDoc for the\n * locked layout / interaction / token rules.\n */\nexport function CalculatorShell({\n title,\n subtitle,\n inputs,\n result,\n formula,\n secondaryStats,\n onReset,\n copyValue,\n shareUrl,\n}: CalculatorShellProps) {\n const inputsGroupId = useId()\n const [copiedResult, setCopiedResult] = useState(false)\n const [copiedShare, setCopiedShare] = useState(false)\n\n const hasActions = Boolean(onReset || copyValue || shareUrl)\n\n const handleCopy = async (\n value: string,\n setFlag: (b: boolean) => void,\n successMsg: string,\n ) => {\n if (!value) return\n let ok = false\n if (typeof navigator !== 'undefined' && navigator.clipboard) {\n try {\n await navigator.clipboard.writeText(value)\n ok = true\n } catch {\n ok = false\n }\n }\n if (ok) {\n setFlag(true)\n setTimeout(() => setFlag(false), 1500)\n toast.success(successMsg)\n } else {\n toast.error('Clipboard unavailable')\n }\n }\n\n return (\n <PageShell\n crumbs={[{ label: 'Tools', to: '/tools' }, { label: title }]}\n >\n <div\n className=\"mx-auto flex flex-col\"\n style={{\n maxWidth: 'var(--prose-narrow)',\n gap: 'var(--space-6)',\n paddingTop: 'var(--space-4)',\n paddingBottom: 'var(--space-8)',\n }}\n >\n {/* Header */}\n <header className=\"flex flex-col\" style={{ gap: 'var(--space-2)' }}>\n <h1\n className=\"text-2xl font-semibold tracking-tight\"\n style={{ color: 'rgb(var(--foreground))' }}\n >\n {title}\n </h1>\n {subtitle && (\n <p\n className=\"text-sm\"\n style={{ color: 'rgb(var(--text-secondary))' }}\n >\n {subtitle}\n </p>\n )}\n </header>\n\n {/* Inputs */}\n <div\n role=\"group\"\n aria-labelledby={inputsGroupId}\n className=\"flex flex-col\"\n style={{ gap: 'var(--space-4)' }}\n >\n <span id={inputsGroupId} className=\"sr-only\">\n {title} inputs\n </span>\n {inputs}\n </div>\n\n {/* Formula (optional) */}\n {formula && (\n <div\n className=\"flex items-center\"\n style={{ gap: 'var(--space-3)' }}\n >\n <span\n className=\"text-[10px] font-semibold uppercase tracking-[0.08em]\"\n style={{ color: 'rgb(var(--text-tertiary))' }}\n >\n Formula\n </span>\n <span\n className=\"text-sm font-mono\"\n style={{ color: 'rgb(var(--text-tertiary))' }}\n >\n {formula}\n </span>\n </div>\n )}\n\n {/* Result card */}\n <section\n aria-live=\"polite\"\n aria-atomic=\"true\"\n className=\"flex flex-col items-center text-center\"\n style={\n {\n gap: 'var(--space-2)',\n padding: 'var(--space-6)',\n background: 'rgb(var(--accent-subtle))',\n border: '1px solid rgb(var(--accent-muted))',\n borderRadius: 'var(--radius-lg)',\n } satisfies CSSProperties\n }\n >\n <span\n className=\"text-[10px] font-semibold uppercase tracking-[0.08em]\"\n style={{ color: 'rgb(var(--text-tertiary))' }}\n >\n Result\n </span>\n <div\n className=\"text-4xl font-semibold\"\n style={{\n fontVariantNumeric: 'tabular-nums',\n color: 'rgb(var(--accent))',\n lineHeight: 1.1,\n }}\n >\n {result}\n </div>\n {secondaryStats && (\n <div\n className=\"flex flex-wrap items-center justify-center\"\n style={{\n gap: 'var(--space-3)',\n color: 'rgb(var(--text-tertiary))',\n fontVariantNumeric: 'tabular-nums',\n }}\n >\n {secondaryStats}\n </div>\n )}\n </section>\n\n {/* Action row (optional) */}\n {hasActions && (\n <div\n className=\"flex flex-wrap items-center justify-end\"\n style={{ gap: 'var(--space-2)' }}\n >\n {onReset && (\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={onReset}\n leadingIcon={<RotateCcw className=\"h-4 w-4\" />}\n >\n Reset\n </Button>\n )}\n {copyValue && (\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={() =>\n handleCopy(\n copyValue,\n setCopiedResult,\n 'Result copied to clipboard',\n )\n }\n leadingIcon={\n copiedResult ? (\n <Check className=\"h-4 w-4\" />\n ) : undefined\n }\n >\n {copiedResult ? 'Copied' : 'Copy result'}\n </Button>\n )}\n {shareUrl && (\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={() =>\n handleCopy(\n shareUrl,\n setCopiedShare,\n 'Share link copied to clipboard',\n )\n }\n leadingIcon={\n copiedShare ? (\n <Check className=\"h-4 w-4\" />\n ) : (\n <Link2 className=\"h-4 w-4\" />\n )\n }\n >\n {copiedShare ? 'Copied' : 'Copy link'}\n </Button>\n )}\n </div>\n )}\n </div>\n </PageShell>\n )\n}\n","/**\n * CalculatorShell v2 — the superset calculator shell (ADR-076 D1/D4).\n *\n * A presentational shell with two layouts and a flat brand-ink header.\n * It owns NO form state (same contract as v1, ADR-030 D5) — each\n * calculator owns its `useState` and composes the `inputs` / `result`\n * slots from kit pieces (ProfileSection Frames, StatRow, MetricCard,\n * Slider, Input). v1 `<CalculatorShell>` is retained untouched for the\n * existing six math calculators; v2 is the path forward.\n *\n * layout=\"shell\" (default) — a single contained card (radius 24,\n * --shell-shadow): flat header + padded body + bordered footer.\n * For compact calculators.\n * layout=\"open\" — the header becomes a rounded banner and the Frames\n * sit directly on the page in a vertical stack; the footer is\n * borderless/transparent. Scales to long forms (funnels).\n *\n * Header (D4): a flat `--brand-ink` strip with a 46px red-glyph tile, a\n * mono uppercase eyebrow, and an uppercase title whose LAST word renders\n * in `--accent`. A single-word title renders entirely in accent; pass a\n * `[lead, accentWord]` tuple for explicit control. No completion ring.\n *\n * Data seam (D9): `prefill` + `benchmarkSlot` are accepted but STUBBED\n * this ADR — `prefill` is typed and not read. Per ADR-076 Amendment 1 E,\n * `benchmarkSlot` now renders a muted \"Benchmark unavailable in manual\n * mode\" placeholder when absent (was: nothing). The live data wiring is a\n * separate future ADR.\n *\n * Amendment 1 additions (2026-06-05):\n * - `assumptions` (B) — manual-vs-connected inputs, \"directional planning\n * math, not observed performance,\" and the config/formula version.\n * Rendered as a compact hover popover in the FOOTER (next to the footer\n * note), not a body strip, so honest framing never lengthens the shell.\n * - benchmark placeholder (E) — see above.\n * - `copyReport` (F) — the footer Copy action emits a structured\n * mini-report (inputs + result + StatRow chain + assumptions +\n * benchmark status), not the bare number. Shell-owned so every\n * calculator's Copy is consistent.\n */\n\nimport { useState, type CSSProperties, type ReactNode } from 'react'\nimport { BarChart3, Copy, Info } from 'lucide-react'\nimport { Button } from './button'\nimport { toast } from './toast'\n\nexport type CalcLayout = 'shell' | 'open'\n\n/**\n * Brand-profile prefill source (ADR-076 D9). Typed now so the data\n * connection is a later drop-in, not a refactor.\n *\n * TODO(data-layer): source = useActiveBrandProfile().brand — prefill\n * audience / CPM / etc. from the active brand (canonical brn_ id).\n */\nexport interface CalcPrefill {\n source: 'none' | 'brand'\n values?: Record<string, number>\n}\n\nexport interface CalculatorShellV2Props {\n /** Mono uppercase eyebrow (e.g. \"Streaming TV · Reality Check\"). */\n eyebrow: string\n /** Uppercase title. The last whitespace-delimited word renders in\n * `--accent`; a single word renders entirely in accent. Pass a\n * `[lead, accentWord]` tuple for explicit control (D4). */\n title: string | [string, string]\n /** Lucide glyph rendered red inside the header tile. */\n icon: ReactNode\n /** Layout — `'shell'` (compact card) or `'open'` (long-form). */\n layout?: CalcLayout\n /** One or more `<ProfileSection>` Frames composing the inputs. */\n inputs: ReactNode\n /** A `<ProfileSection>` Frame wrapping the result block + StatRow. */\n result: ReactNode\n /** Left-aligned muted footer note (also the data-mode signal, D9). */\n footerNote: ReactNode\n /** Right-aligned footer actions (Reset / Save). The Copy action is\n * shell-owned via `copyReport` (Amendment 1 F) — do not pass a Copy\n * button here. */\n actions?: ReactNode\n /** Assumptions content (Amendment 1 B): manual-vs-connected inputs, the\n * \"directional planning math\" disclaimer, and the config/formula version.\n * Rendered as a footer hover popover (not a body strip) so it never adds\n * shell height. Omitted when absent. */\n assumptions?: ReactNode\n /** Structured mini-report for the shell-owned Copy action (Amendment 1\n * F). A string, or a function returning one (so it captures live state\n * at click time). When set, the shell renders a Copy button that writes\n * this to the clipboard. */\n copyReport?: string | (() => string)\n /** STUBBED (D9) — typed, not read this ADR. */\n prefill?: CalcPrefill\n /** \"vs. benchmark\" rail. When absent, the shell renders a muted\n * \"Benchmark unavailable in manual mode\" placeholder (Amendment 1 E). */\n benchmarkSlot?: ReactNode\n}\n\nfunction HeaderTitle({ title }: { title: string | [string, string] }) {\n const accent: CSSProperties = { color: 'rgb(var(--accent))' }\n if (Array.isArray(title)) {\n const [lead, accentWord] = title\n return (\n <>\n {lead ? `${lead} ` : ''}\n <span style={accent}>{accentWord}</span>\n </>\n )\n }\n const parts = title.trim().split(/\\s+/)\n if (parts.length <= 1) {\n return <span style={accent}>{title}</span>\n }\n const last = parts[parts.length - 1]\n const lead = parts.slice(0, -1).join(' ')\n return (\n <>\n {lead} <span style={accent}>{last}</span>\n </>\n )\n}\n\n/** Muted rail shown in place of `benchmarkSlot` until the benchmark data\n * layer exists (Amendment 1 E) — reinforces the data-backed promise. */\nfunction BenchmarkPlaceholder() {\n return (\n <div\n className=\"flex items-center\"\n style={{\n gap: 10,\n padding: '12px 16px',\n borderRadius: 'var(--radius-lg)',\n background: 'rgb(var(--muted))',\n border: '1px dashed rgb(var(--border))',\n color: 'rgb(var(--text-muted))',\n }}\n >\n <BarChart3 size={15} />\n <span style={{ fontSize: 12, fontWeight: 500 }}>\n Benchmark unavailable in manual mode\n </span>\n </div>\n )\n}\n\n/** Footer assumptions affordance (Amendment 1 B). A compact \"Assumptions\"\n * trigger that reveals the full disclaimer in a hover/focus popover. The\n * popover is absolutely positioned, so it never lengthens the shell — the\n * honest framing is one hover away, not a permanent strip. The calculator\n * supplies the content. */\nfunction AssumptionsPopover({ children }: { children: ReactNode }) {\n const [open, setOpen] = useState(false)\n return (\n <span\n className=\"inline-flex\"\n style={{ position: 'relative' }}\n onMouseEnter={() => setOpen(true)}\n onMouseLeave={() => setOpen(false)}\n >\n <button\n type=\"button\"\n aria-label=\"Planning assumptions\"\n onFocus={() => setOpen(true)}\n onBlur={() => setOpen(false)}\n className=\"inline-flex items-center\"\n style={{\n gap: 5,\n fontSize: 12,\n fontWeight: 500,\n color: 'rgb(var(--text-muted))',\n background: 'transparent',\n border: 'none',\n padding: 0,\n cursor: 'help',\n }}\n >\n <Info size={14} />\n Assumptions\n </button>\n <span\n role=\"note\"\n style={{\n position: 'absolute',\n bottom: 'calc(100% + 8px)',\n left: 0,\n width: 320,\n maxWidth: '78vw',\n padding: '12px 14px',\n borderRadius: 'var(--radius-lg)',\n background: 'rgb(var(--bg-card))',\n border: '1px solid rgb(var(--border))',\n boxShadow: 'var(--shadow-lg)',\n color: 'rgb(var(--muted-foreground))',\n fontSize: 11.5,\n lineHeight: 1.5,\n fontWeight: 500,\n opacity: open ? 1 : 0,\n transform: open ? 'translateY(0)' : 'translateY(4px)',\n pointerEvents: open ? 'auto' : 'none',\n transition:\n 'opacity 160ms var(--ease-out), transform 160ms var(--ease-out)',\n zIndex: 20,\n }}\n >\n {children}\n </span>\n </span>\n )\n}\n\nexport function CalculatorShellV2({\n eyebrow,\n title,\n icon,\n layout = 'shell',\n inputs,\n result,\n footerNote,\n actions,\n assumptions,\n copyReport,\n benchmarkSlot,\n}: CalculatorShellV2Props) {\n const isOpen = layout === 'open'\n\n // Shell-owned Copy = structured mini-report (Amendment 1 F). `copyReport`\n // may be a function so it captures live state at click time.\n const handleCopy = async () => {\n const text = typeof copyReport === 'function' ? copyReport() : copyReport\n if (!text) return\n try {\n await navigator.clipboard.writeText(text)\n toast.success('Report copied to clipboard')\n } catch {\n toast.error('Clipboard unavailable')\n }\n }\n\n const header = (\n <header\n className=\"flex items-center\"\n style={{\n gap: 16,\n padding: '20px 24px',\n background: 'rgb(var(--brand-ink))',\n borderRadius: isOpen ? 'var(--radius-xl)' : 0,\n }}\n >\n <span\n className=\"grid place-items-center shrink-0\"\n style={{\n width: 46,\n height: 46,\n borderRadius: 'var(--radius-md)',\n background: 'rgb(255 255 255 / 0.07)',\n border: '1px solid rgb(255 255 255 / 0.1)',\n color: 'rgb(var(--accent))',\n }}\n >\n {icon}\n </span>\n <div className=\"flex-1 min-w-0\">\n <div\n className=\"font-semibold uppercase\"\n style={{\n fontFamily: 'var(--font-mono)',\n fontSize: 11,\n letterSpacing: '0.14em',\n color: 'rgb(255 255 255 / 0.5)',\n }}\n >\n {eyebrow}\n </div>\n <h1\n className=\"font-extrabold uppercase\"\n style={{\n margin: '3px 0 0',\n fontSize: 21,\n letterSpacing: '-0.01em',\n color: 'rgb(255 255 255)',\n }}\n >\n <HeaderTitle title={title} />\n </h1>\n </div>\n </header>\n )\n\n const footer = (\n <footer\n className=\"flex items-center\"\n style={{\n gap: 12,\n padding: '16px 24px',\n borderTop: isOpen ? 'none' : '1px solid rgb(var(--border))',\n marginTop: isOpen ? 4 : 0,\n background: isOpen ? 'transparent' : 'rgb(var(--bg-card))',\n }}\n >\n <span\n className=\"flex items-center\"\n style={{ gap: 8, minWidth: 0 }}\n >\n <span\n style={{\n fontSize: 12,\n fontWeight: 500,\n color: 'rgb(var(--text-muted))',\n }}\n >\n {footerNote}\n </span>\n {assumptions != null && (\n <>\n <span style={{ color: 'rgb(var(--text-muted))', fontSize: 12 }}>\n ·\n </span>\n <AssumptionsPopover>{assumptions}</AssumptionsPopover>\n </>\n )}\n </span>\n <span style={{ flex: 1 }} />\n {copyReport != null && (\n <Button\n variant=\"secondary\"\n onClick={handleCopy}\n leadingIcon={<Copy size={15} />}\n >\n Copy\n </Button>\n )}\n {actions}\n </footer>\n )\n\n const body = (\n <>\n {inputs}\n {result}\n {benchmarkSlot ?? <BenchmarkPlaceholder />}\n </>\n )\n\n return (\n <div\n className=\"flex flex-col items-center\"\n style={{ paddingTop: 'var(--space-8)', paddingBottom: 'var(--space-12)' }}\n >\n {isOpen ? (\n <div\n className=\"flex flex-col\"\n style={{ width: 'min(980px, 100%)', gap: 'var(--space-4)' }}\n >\n {header}\n {body}\n {footer}\n </div>\n ) : (\n <main\n style={{\n width: 'min(980px, 100%)',\n background: 'rgb(var(--bg-card))',\n border: '1px solid rgb(var(--border-card))',\n borderRadius: 'var(--radius-2xl)',\n boxShadow: 'var(--shell-shadow)',\n overflow: 'hidden',\n }}\n >\n {header}\n <div\n className=\"flex flex-col\"\n style={{ padding: 'var(--space-6)', gap: 'var(--space-4)' }}\n >\n {body}\n </div>\n {footer}\n </main>\n )}\n </div>\n )\n}\n","/**\n * StatRow — the Calculator Shell v2 signature primitive (ADR-076 D2).\n *\n * A horizontal row of \"step\" tiles showing a metric chain compounding\n * left -> right. Each tile is a near-black brand-ink outer card holding a\n * recessed white inner panel with the figure; a red arrow between tiles\n * shows the math compounding. Exactly one tile may be `pivotal` — it\n * flips from brand-ink to accent red (the \"black/red/white rendered in\n * miniature\" that makes black survive without a heavy slab).\n *\n * <StatRow steps={[\n * { icon: <Users size={16} />, label: 'Audience', value: '120K' },\n * { icon: <Repeat size={16} />, label: 'Frequency', value: '2.0x', pivotal: true },\n * { icon: <Eye size={16} />, label: 'Impressions', value: '240K' },\n * { icon: <Wallet size={16} />, label: 'Budget', value: '$8,160' },\n * ]} />\n *\n * Presentational + stateless. The caller formats `value` (tabular-nums is\n * applied here). Inner panels carry a fixed `min-height` so a tile never\n * resizes as its value's length changes (ADR-076 D5 zero-layout-shift).\n *\n * Promoted to @lovett/ui under ADR-076 D2 — the catalog of calculator\n * consumers clears ADR-008 D3's 2+ consumer gate.\n */\n\nimport { ArrowRight } from 'lucide-react'\nimport { Fragment, type ReactNode } from 'react'\n\nexport interface StatRowStep {\n /** Lucide glyph (~16px). Inherits the dark-frame label colour. */\n icon: ReactNode\n /** Uppercase metric label (rendered ~9.5px). */\n label: string\n /** Pre-formatted figure. Rendered tabular-nums. */\n value: string\n /** The single pivotal tile — rendered in `--accent` instead of\n * `--brand-ink`. At most one step should set this. */\n pivotal?: boolean\n}\n\nexport interface StatRowProps {\n steps: StatRowStep[]\n className?: string\n}\n\nexport function StatRow({ steps, className }: StatRowProps) {\n return (\n <div className={className} style={{ display: 'flex', alignItems: 'stretch', gap: 0 }}>\n {steps.map((s, i) => (\n <Fragment key={i}>\n {i > 0 && (\n <div\n className=\"flex items-center shrink-0\"\n style={{ padding: '0 2px', color: 'rgb(var(--text-muted))' }}\n aria-hidden=\"true\"\n >\n <ArrowRight size={14} strokeWidth={2.2} />\n </div>\n )}\n <div\n data-pivotal={s.pivotal ? 'true' : undefined}\n style={{\n flex: 1,\n minWidth: 0,\n borderRadius: 'var(--radius-lg)',\n padding: 5,\n background: s.pivotal\n ? 'rgb(var(--accent))'\n : 'rgb(var(--brand-ink))',\n }}\n >\n {/* label row sits on the dark frame */}\n <div\n className=\"flex items-center\"\n style={{\n gap: 5,\n padding: '4px 7px 6px',\n color: 'rgb(255 255 255 / 0.7)',\n minWidth: 0,\n }}\n >\n <span className=\"inline-flex shrink-0\">{s.icon}</span>\n {/* Single-line cap: long labels truncate with an ellipsis\n (full text on hover via title) instead of wrapping to a\n second line and unbalancing the tile row. Keep labels short. */}\n <span\n className=\"font-bold uppercase\"\n title={s.label}\n style={{\n fontSize: '9.5px',\n letterSpacing: '0.05em',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n minWidth: 0,\n flex: 1,\n }}\n >\n {s.label}\n </span>\n </div>\n {/* recessed white inner panel — fixed min-height so the tile\n never resizes as the value's length changes */}\n <div\n className=\"grid place-items-center text-center\"\n style={{\n background: 'rgb(var(--bg-card))',\n borderRadius: 10,\n padding: '12px 10px',\n minHeight: 46,\n }}\n >\n <span\n className=\"font-extrabold tabular-nums\"\n style={{\n fontSize: 22,\n letterSpacing: '-0.025em',\n lineHeight: 1,\n color: s.pivotal\n ? 'rgb(var(--accent))'\n : 'rgb(var(--foreground))',\n }}\n >\n {s.value}\n </span>\n </div>\n </div>\n </Fragment>\n ))}\n </div>\n )\n}\n","/**\n * Slider — single-value numeric slider (ADR-076 D8).\n *\n * Distinct from <RangeSlider>, which is dual-thumb (`value: [number,\n * number]`) and cannot represent a single value. This is the control\n * the Calculator Shell v2 frequency input uses: an accent fill from the\n * track start to the current value, a `--bg-card` thumb with a 2px\n * accent ring, and a transparent native `<input type=\"range\">` overlaid\n * for keyboard + accessibility (arrows / Home / End come free).\n *\n * <Slider value={freq} min={1} max={10} step={0.5}\n * onChange={setFreq} aria-label=\"Target frequency\" />\n *\n * Controlled — the parent owns `value`. Presentational otherwise.\n */\n\nimport type { CSSProperties } from 'react'\n\nexport interface SliderProps {\n value: number\n min: number\n max: number\n /** Step granularity. Default 1. */\n step?: number\n onChange: (value: number) => void\n /** Accessible name for the native range input. */\n 'aria-label'?: string\n disabled?: boolean\n className?: string\n}\n\nexport function Slider({\n value,\n min,\n max,\n step = 1,\n onChange,\n 'aria-label': ariaLabel,\n disabled,\n className,\n}: SliderProps) {\n const span = max - min || 1\n const pct = Math.max(0, Math.min(100, ((value - min) / span) * 100))\n\n const railStyle: CSSProperties = {\n position: 'absolute',\n height: 7,\n borderRadius: 'var(--radius-full)',\n }\n\n return (\n <div\n className={className}\n style={{ position: 'relative', height: 18, display: 'flex', alignItems: 'center' }}\n >\n {/* base track */}\n <div style={{ ...railStyle, left: 0, right: 0, background: 'rgb(var(--muted))' }} />\n {/* accent fill */}\n <div\n style={{\n ...railStyle,\n left: 0,\n width: `${pct}%`,\n background: disabled\n ? 'rgb(var(--border-strong))'\n : 'rgb(var(--accent))',\n }}\n />\n {/* thumb */}\n <div\n style={{\n position: 'absolute',\n left: `${pct}%`,\n transform: 'translateX(-50%)',\n width: 18,\n height: 18,\n borderRadius: 'var(--radius-full)',\n background: 'rgb(var(--bg-card))',\n border: `2px solid ${disabled ? 'rgb(var(--border-strong))' : 'rgb(var(--accent))'}`,\n boxShadow: 'var(--shadow-sm)',\n pointerEvents: 'none',\n }}\n />\n {/* native range — transparent overlay for keyboard + a11y */}\n <input\n type=\"range\"\n min={min}\n max={max}\n step={step}\n value={value}\n disabled={disabled}\n aria-label={ariaLabel}\n aria-valuetext={String(value)}\n onChange={(e) => onChange(Number(e.target.value))}\n style={{\n position: 'absolute',\n left: 0,\n width: '100%',\n height: 18,\n margin: 0,\n opacity: 0,\n cursor: disabled ? 'not-allowed' : 'pointer',\n }}\n />\n </div>\n )\n}\n","/**\n * Number-formatting helpers — small set of pure, zero-dep utilities\n * shared by the `<CalculatorShell>` consumers (ROAS / ROI / CTR / CPC\n * / CPM / Conversion Rate and the future ad-performance + customer/\n * business calculators).\n *\n * Locked by ADR-030 D6 (the helpers' existence + signatures) and\n * sharpened by ADR-058 D8 (re-exported from `@lovett/ui` alongside the\n * promoted `<CalculatorShell>`). Implementation rules:\n *\n * • Garbage in → `'—'` out. NaN, ±Infinity, null, undefined all\n * produce the em-dash string. Calculator UI should never crash on\n * partial input (empty inputs, zero divisors).\n * • Uses `Intl.NumberFormat('en-US', ...)` under the hood — proper\n * locale-aware separators, no manual `toFixed` rounding.\n * • `formatPercent` expects PERCENT UNITS, not a 0–1 fraction. Pass\n * `2.45` to get `\"2.45%\"`. Passing `0.0245` would yield `\"0.02%\"`.\n *\n * Zero runtime deps — `Intl.NumberFormat` is a built-in.\n */\n\nconst EM_DASH = '—'\n\nfunction invalid(n: unknown): boolean {\n return (\n typeof n !== 'number' ||\n Number.isNaN(n) ||\n !Number.isFinite(n)\n )\n}\n\ninterface FormatOptions {\n /** Decimal places. Defaults vary per helper (see each helper's JSDoc). */\n decimals?: number\n}\n\n/**\n * Format a number as USD currency.\n *\n * formatCurrency(42.5) → \"$42.50\"\n * formatCurrency(1234567.89) → \"$1,234,567.89\"\n * formatCurrency(NaN) → \"—\"\n *\n * Default decimals: 2.\n */\nexport function formatCurrency(n: number, opts: FormatOptions = {}): string {\n if (invalid(n)) return EM_DASH\n const decimals = opts.decimals ?? 2\n return new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n }).format(n)\n}\n\n/**\n * Format a number as a percent. Input is in PERCENT UNITS (i.e. pass\n * `2.45` to get `\"2.45%\"`, NOT `0.0245`). This matches the way the\n * calculator routes compute their results (e.g. CTR = clicks ÷\n * impressions × 100 — the × 100 already happened upstream).\n *\n * formatPercent(2.45) → \"2.45%\"\n * formatPercent(3.2, { decimals: 1 }) → \"3.2%\"\n * formatPercent(NaN) → \"—\"\n *\n * Default decimals: 2.\n */\nexport function formatPercent(n: number, opts: FormatOptions = {}): string {\n if (invalid(n)) return EM_DASH\n const decimals = opts.decimals ?? 2\n // Use 'decimal' style with manual '%' suffix rather than 'percent' —\n // 'percent' would re-multiply by 100, which is the wrong contract for\n // this helper (see JSDoc above).\n const body = new Intl.NumberFormat('en-US', {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n }).format(n)\n return `${body}%`\n}\n\n/**\n * Format a number as a ratio with the `x` suffix. Used by ROAS.\n *\n * formatRatio(4.25) → \"4.25x\"\n * formatRatio(10, { decimals: 0 }) → \"10x\"\n * formatRatio(Infinity) → \"—\"\n *\n * Default decimals: 2.\n */\nexport function formatRatio(n: number, opts: FormatOptions = {}): string {\n if (invalid(n)) return EM_DASH\n const decimals = opts.decimals ?? 2\n const body = new Intl.NumberFormat('en-US', {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n }).format(n)\n return `${body}x`\n}\n\n/**\n * Format a number with thousand-separators and configurable decimals.\n *\n * formatNumber(1234567) → \"1,234,567\"\n * formatNumber(1234.567, { decimals: 2 }) → \"1,234.57\"\n * formatNumber(NaN) → \"—\"\n *\n * Default decimals: 0.\n */\nexport function formatNumber(n: number, opts: FormatOptions = {}): string {\n if (invalid(n)) return EM_DASH\n const decimals = opts.decimals ?? 0\n return new Intl.NumberFormat('en-US', {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n }).format(n)\n}\n","/**\n * PageHero — large title row that sits IN the content area, beneath the\n * sticky header. At rest it owns the visual weight; on scroll the\n * AppHeader's breadcrumbs become the persistent label.\n *\n * Promoted from `brand-ai-extension/webapp/src/components/ui/page-hero.tsx`\n * as part of Phase A of the v1.1 lens port batch — used by Swipes,\n * Collections, Discover; shared lens-local equivalents existed in earlier\n * ports.\n *\n * Token-clean: only public tokens (`--accent`, `--foreground`,\n * `--text-tertiary`).\n */\nimport type { ReactNode } from 'react'\nimport { cn } from './lib/utils'\n\nexport interface PageHeroProps {\n /** Small uppercase label above the title, usually colored with --accent. */\n eyebrow?: string\n title: string\n subtitle?: string\n /** Right-aligned trailing content — typically a row of action buttons. */\n actions?: ReactNode\n /**\n * Optional left-side adornment rendered alongside the title — e.g. the\n * brand profile's logo block. Sits in the title row (not next to the\n * eyebrow), vertically aligned with the title text. The hero gracefully\n * collapses if this is `undefined` so pages without an adornment look\n * unchanged.\n */\n leading?: ReactNode\n className?: string\n}\n\nexport function PageHero({\n eyebrow,\n title,\n subtitle,\n actions,\n leading,\n className,\n}: PageHeroProps) {\n return (\n <div className={cn('flex items-end justify-between gap-4 flex-wrap pt-4 pb-5', className)}>\n <div className=\"min-w-0 flex-1 flex items-center gap-5\">\n {leading && <div className=\"shrink-0\">{leading}</div>}\n <div className=\"min-w-0 flex-1\">\n {eyebrow && (\n <div\n className=\"text-[11px] font-bold uppercase tracking-[0.1em] mb-1.5\"\n style={{ color: 'rgb(var(--accent))' }}\n >\n {eyebrow}\n </div>\n )}\n <h1\n className=\"text-[24px] font-bold tracking-[-0.02em] leading-tight\"\n style={{ color: 'rgb(var(--foreground))' }}\n >\n {title}\n </h1>\n {subtitle && (\n <p\n className=\"text-[13px] mt-1.5 leading-[1.5]\"\n style={{\n color: 'rgb(var(--text-tertiary))',\n maxWidth: 'var(--prose-narrow)',\n }}\n >\n {subtitle}\n </p>\n )}\n </div>\n </div>\n {actions && <div className=\"flex items-center gap-2 shrink-0\">{actions}</div>}\n </div>\n )\n}\n","/**\n * SearchBar — input-shaped search field with a leading magnifier icon\n * and an inline clear button when the value is non-empty. The width prop\n * accepts a px number or any CSS length.\n *\n * Promoted from `brand-ai-extension/webapp/src/components/ui/search-bar.tsx`\n * as part of Phase A of the v1.1 lens port batch — used by Collections,\n * Swipes, Prompts.\n *\n * Internal tokens (--bg-input, --border, --accent-subtle) are fine to use\n * inside packages/ui per the token-boundary rule.\n */\nimport { Search, X } from 'lucide-react'\n\nexport interface SearchBarProps {\n value: string\n onChange: (v: string) => void\n placeholder?: string\n width?: number | string\n className?: string\n}\n\nexport function SearchBar({\n value,\n onChange,\n placeholder = 'Search…',\n width = 260,\n className,\n}: SearchBarProps) {\n return (\n <div\n className={`flex items-center gap-2 px-3.5 py-2 transition-all ${className ?? ''}`.trim()}\n style={{\n background: 'rgb(var(--bg-input))',\n border: '1px solid rgb(var(--border))',\n borderRadius: 'var(--radius-sm)',\n width,\n }}\n onFocus={(e) => {\n e.currentTarget.style.borderColor = 'rgb(var(--accent))'\n e.currentTarget.style.boxShadow = '0 0 0 3px rgb(var(--accent-subtle))'\n }}\n onBlur={(e) => {\n e.currentTarget.style.borderColor = 'rgb(var(--border))'\n e.currentTarget.style.boxShadow = 'none'\n }}\n >\n <Search\n className=\"h-4 w-4 shrink-0\"\n style={{ color: 'rgb(var(--text-muted))' }}\n />\n <input\n type=\"text\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder={placeholder}\n className=\"flex-1 bg-transparent outline-none text-[13px]\"\n style={{\n color: 'rgb(var(--foreground))',\n fontFamily: 'var(--font-sans)',\n }}\n />\n {value && (\n <button\n type=\"button\"\n onClick={() => onChange('')}\n aria-label=\"Clear\"\n style={{ color: 'rgb(var(--text-muted))' }}\n onMouseEnter={(e) =>\n (e.currentTarget.style.color = 'rgb(var(--foreground))')\n }\n onMouseLeave={(e) =>\n (e.currentTarget.style.color = 'rgb(var(--text-muted))')\n }\n >\n <X className=\"h-3.5 w-3.5\" />\n </button>\n )}\n </div>\n )\n}\n","// FilterBar — canonical search + filter-chip toolbar (ADR-121).\n//\n// Modeled on the Assets filter bar (the owner's reference — \"handles\n// split dropdowns well\"): a framed card holding a search field on the\n// left, filter chips after it, a flexible spacer, then a right group\n// (sort / view toggle / result count / actions). Lenses compose their\n// own `<DropdownButton>` chips as children; this primitive owns the\n// frame, the flex/wrap layout, the standardized search slot, and the\n// left/right split — so every lens's bar looks and behaves the same.\n//\n// Compound API:\n// <FilterBar variant=\"framed\" aria-label=\"Asset filters\">\n// <FilterBar.Search value={q} onChange={setQ} aria-label=\"Search assets\" />\n// <DropdownButton … /> // filter chips (left group)\n// <FilterBar.Spacer /> // pushes the rest right\n// <DropdownButton … /> // sort (right group)\n// <FilterBar.Count shown={n} total={m} />\n// </FilterBar>\n//\n// Lives in @lovett/ui; the frame is the `.ds-card-surface` utility +\n// `data-framed` (same as Card / ProfileSection). Token-boundary clean.\n\nimport type { ReactNode } from 'react'\nimport { Search } from 'lucide-react'\nimport { Input } from './input'\nimport { cn } from './lib/utils'\n\nexport interface FilterBarProps {\n /**\n * `framed` (default) = bordered `.ds-card-surface` card, matching the\n * Assets bar. `bare` = no frame, just the flex row (for bars that sit\n * inside an already-framed container).\n */\n variant?: 'framed' | 'bare'\n /** Accessible label for the toolbar group (e.g. \"Asset filters\"). */\n 'aria-label'?: string\n className?: string\n children: ReactNode\n}\n\nfunction FilterBarRoot({\n variant = 'framed',\n 'aria-label': ariaLabel,\n className,\n children,\n}: FilterBarProps) {\n const framed = variant === 'framed'\n return (\n <div\n role=\"group\"\n aria-label={ariaLabel}\n data-framed={framed ? 'true' : undefined}\n className={cn(\n 'filter-bar flex flex-wrap items-center gap-2',\n // 10px frame padding matches the <Shell> outer frame (the SEM Spec\n // Overview bar) — the established thinner filter-bar padding. ADR-121.\n framed && 'ds-card-surface p-2.5',\n className,\n )}\n >\n {children}\n </div>\n )\n}\n\nexport interface FilterBarSearchProps {\n value: string\n onChange: (next: string) => void\n placeholder?: string\n /** Required — icon-only field needs an accessible name. */\n 'aria-label': string\n /** Override the default width sizing if a bar needs it. */\n className?: string\n}\n\n/** Standardized search field: small `Input` with a leading magnifier. */\nfunction FilterBarSearch({\n value,\n onChange,\n placeholder,\n 'aria-label': ariaLabel,\n className,\n}: FilterBarSearchProps) {\n return (\n <div className={cn('min-w-[12rem] flex-1 sm:max-w-xs', className)}>\n <Input\n inputSize=\"sm\"\n type=\"text\"\n placeholder={placeholder}\n leadingAffix={<Search className=\"h-3.5 w-3.5\" />}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n aria-label={ariaLabel}\n />\n </div>\n )\n}\n\n/** Flexible spacer — everything after it is pushed to the right edge. */\nfunction FilterBarSpacer() {\n return <div className=\"flex-1\" />\n}\n\nexport interface FilterBarCountProps {\n shown: number\n total: number\n}\n\n/** Right-aligned \"{shown} of {total}\" result count, tabular-nums. */\nfunction FilterBarCount({ shown, total }: FilterBarCountProps) {\n return (\n <span\n className=\"text-[11.5px] tabular-nums\"\n style={{ color: 'rgb(var(--text-tertiary))' }}\n >\n {shown.toLocaleString()} of {total.toLocaleString()}\n </span>\n )\n}\n\nexport const FilterBar = Object.assign(FilterBarRoot, {\n Search: FilterBarSearch,\n Spacer: FilterBarSpacer,\n Count: FilterBarCount,\n})\n","/**\n * FilterDropdown — pill-shaped \"Key: Value ▾\" filter trigger that opens\n * a menu of options. Each option can show a right-aligned count.\n *\n * <FilterDropdown\n * label=\"Platform\"\n * value={activePlatform}\n * onChange={setActivePlatform}\n * options={[\n * { value: 'all', label: 'All platforms' },\n * { value: 'facebook', label: 'Facebook', count: 12 },\n * ]}\n * />\n *\n * Visual matches the `prototype/assets.html` filter row: muted-key\n * trigger that flips to accent-muted bg when a non-default value is\n * selected; menu items show count on the right.\n *\n * Promoted from `brand-ai-extension/webapp/src/components/ui/filter-dropdown.tsx`\n * as part of Phase A of the v1.1 lens port batch — used by Swipes\n * (multi-filter strip), candidate for Collections + Prompts.\n */\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from 'react'\nimport { ChevronDown, Check } from 'lucide-react'\nimport { cn } from './lib/utils'\n\nexport interface FilterOption<T extends string = string> {\n value: T\n label: string\n /** Right-aligned count chip in the menu. */\n count?: number\n /** Optional left-side adornment (icon, color dot). */\n leading?: ReactNode\n}\n\nexport interface FilterDropdownProps<T extends string = string> {\n label: string\n value: T\n onChange: (value: T) => void\n options: FilterOption<T>[]\n /** The value treated as \"no filter applied\" — defaults to \"all\". When\n * `value` differs from this, the trigger flips to its active style. */\n neutralValue?: T\n /** Defaults to the option label. */\n triggerValueLabel?: string\n className?: string\n align?: 'left' | 'right'\n}\n\nexport function FilterDropdown<T extends string = string>({\n label,\n value,\n onChange,\n options,\n neutralValue = 'all' as T,\n triggerValueLabel,\n className,\n align = 'left',\n}: FilterDropdownProps<T>) {\n const [open, setOpen] = useState(false)\n const [highlight, setHighlight] = useState(-1)\n const wrapperRef = useRef<HTMLDivElement>(null)\n const itemRefs = useRef<(HTMLButtonElement | null)[]>([])\n\n const active = value !== neutralValue\n const selectedIndex = useMemo(\n () => options.findIndex((o) => o.value === value),\n [options, value],\n )\n const selected = selectedIndex >= 0 ? options[selectedIndex] : undefined\n const valueLabel =\n triggerValueLabel ?? (selected ? shortLabel(selected.label) : 'All')\n\n const triggerLeading = active ? selected?.leading : undefined\n\n const close = useCallback(() => {\n setOpen(false)\n setHighlight(-1)\n }, [])\n\n const openMenu = useCallback(() => {\n setOpen(true)\n setHighlight(selectedIndex >= 0 ? selectedIndex : 0)\n }, [selectedIndex])\n\n useEffect(() => {\n if (!open) return\n function onDocClick(e: MouseEvent) {\n if (wrapperRef.current && !wrapperRef.current.contains(e.target as Node)) {\n close()\n }\n }\n function onKey(e: KeyboardEvent) {\n if (e.key === 'Escape') close()\n }\n document.addEventListener('mousedown', onDocClick)\n document.addEventListener('keydown', onKey)\n return () => {\n document.removeEventListener('mousedown', onDocClick)\n document.removeEventListener('keydown', onKey)\n }\n }, [open, close])\n\n useLayoutEffect(() => {\n if (!open || highlight < 0) return\n itemRefs.current[highlight]?.scrollIntoView({ block: 'nearest' })\n }, [open, highlight])\n\n const onTriggerKeyDown = (e: React.KeyboardEvent<HTMLButtonElement>) => {\n const lastIndex = options.length - 1\n if (e.key === 'ArrowDown') {\n e.preventDefault()\n if (!open) {\n openMenu()\n } else {\n setHighlight((h) => (h >= lastIndex ? 0 : h + 1))\n }\n } else if (e.key === 'ArrowUp') {\n e.preventDefault()\n if (!open) {\n openMenu()\n } else {\n setHighlight((h) => (h <= 0 ? lastIndex : h - 1))\n }\n } else if (e.key === 'Home') {\n if (open) {\n e.preventDefault()\n setHighlight(0)\n }\n } else if (e.key === 'End') {\n if (open) {\n e.preventDefault()\n setHighlight(lastIndex)\n }\n } else if (e.key === 'Enter' || e.key === ' ') {\n if (open && highlight >= 0) {\n e.preventDefault()\n const opt = options[highlight]\n if (opt) {\n onChange(opt.value)\n close()\n }\n }\n }\n }\n\n return (\n <div\n ref={wrapperRef}\n className={cn('relative inline-block', className)}\n >\n <button\n type=\"button\"\n onClick={() => (open ? close() : openMenu())}\n onKeyDown={onTriggerKeyDown}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n className=\"inline-flex items-center gap-1.5 h-8 px-3 text-[12px] font-medium cursor-pointer transition-colors\"\n style={{\n background: active\n ? 'rgb(var(--accent-muted))'\n : 'rgb(var(--bg-elevated))',\n border: `1px solid ${active ? 'rgb(var(--accent) / 0.35)' : 'rgb(var(--border))'}`,\n color: active ? 'rgb(var(--accent))' : 'rgb(var(--text-secondary))',\n borderRadius: 999,\n }}\n >\n <span\n className=\"font-semibold\"\n style={{\n color: active ? 'rgb(var(--accent))' : 'rgb(var(--text-muted))',\n }}\n >\n {label}:\n </span>\n {triggerLeading && (\n <span className=\"shrink-0 inline-flex items-center\">\n {triggerLeading}\n </span>\n )}\n <span\n style={{\n color: active ? 'rgb(var(--accent))' : 'rgb(var(--foreground))',\n }}\n >\n {valueLabel}\n </span>\n <ChevronDown\n className={cn('h-3 w-3 transition-transform', open && 'rotate-180')}\n style={{\n color: active ? 'rgb(var(--accent))' : 'rgb(var(--text-muted))',\n }}\n />\n </button>\n\n {open && (\n <div\n role=\"listbox\"\n aria-label={label}\n aria-activedescendant={\n highlight >= 0 ? `${label}-opt-${highlight}` : undefined\n }\n className={cn(\n 'absolute z-30 mt-1.5 min-w-[200px] p-1.5',\n align === 'right' ? 'right-0' : 'left-0',\n )}\n style={{\n background: 'rgb(var(--bg-elevated))',\n border: '1px solid rgb(var(--border))',\n borderRadius: 'var(--radius-md)',\n boxShadow: 'var(--shadow-lg)',\n }}\n >\n {options.map((opt, i) => {\n const isActive = opt.value === value\n const isHighlighted = i === highlight\n const bg = isActive\n ? 'rgb(var(--accent-muted))'\n : isHighlighted\n ? 'rgb(var(--surface-overlay))'\n : 'transparent'\n const fg = isActive\n ? 'rgb(var(--accent))'\n : isHighlighted\n ? 'rgb(var(--foreground))'\n : 'rgb(var(--text-secondary))'\n return (\n <button\n key={opt.value}\n ref={(el) => {\n itemRefs.current[i] = el\n }}\n id={`${label}-opt-${i}`}\n role=\"option\"\n aria-selected={isActive}\n type=\"button\"\n onClick={() => {\n onChange(opt.value)\n close()\n }}\n onMouseEnter={() => setHighlight(i)}\n className=\"flex w-full items-center gap-2 px-2.5 py-[7px] text-[12.5px] text-left cursor-pointer rounded-[8px] border-0\"\n style={{ background: bg, color: fg }}\n >\n {opt.leading && (\n <span className=\"shrink-0 inline-flex items-center\">\n {opt.leading}\n </span>\n )}\n <span className=\"truncate flex-1\">{opt.label}</span>\n {typeof opt.count === 'number' && (\n <span\n className=\"text-[11px] font-medium tabular-nums\"\n style={{\n color: isActive\n ? 'rgb(var(--accent) / 0.7)'\n : 'rgb(var(--text-muted))',\n }}\n >\n {opt.count.toLocaleString()}\n </span>\n )}\n {isActive && typeof opt.count !== 'number' && (\n <Check\n className=\"h-3 w-3 shrink-0\"\n style={{ color: 'rgb(var(--accent))' }}\n />\n )}\n </button>\n )\n })}\n </div>\n )}\n </div>\n )\n}\n\nfunction shortLabel(label: string) {\n if (label.toLowerCase().startsWith('all ')) return 'All'\n return label\n}\n","/**\n * DeviceFrame — a generic, content-agnostic device bezel.\n *\n * Renders the chrome of a real device around arbitrary `children`:\n * • `device='desktop'` → a macOS Safari browser window (rounded card,\n * gradient title bar with the three traffic-light dots, centered\n * address bar with a lock icon + URL).\n * • `device='mobile'` → an iPhone (rounded bezel, top notch, status bar\n * with 9:41 + signal/wifi/battery, an address pill, and the bottom\n * home-indicator bar).\n *\n * The frame is pure presentation. `children` are the page being previewed;\n * they render inside the screen area, which scrolls and clips with the\n * correct rounded corners. Nothing about Google / SERPs / any specific site\n * is baked in — pass whatever content you like.\n *\n * Promoted (genericized) from the sem-spec source app's `SerpCard`\n * `MacOSFrame` + `IPhoneFrame`. First reuse target: AdStage. The sem-spec\n * lens does not yet consume this.\n *\n * Icon discipline (CLAUDE.md §6): inline `<svg>` is permitted here because\n * this is a `@lovett/ui` primitive that OWNS its device-replica glyph\n * definitions (iOS status-bar signal/wifi/battery). The lock icon uses\n * Lucide where a clean equivalent exists.\n *\n * Colors: device-replica chrome — literal colors mirroring real macOS / iOS\n * UI; owned by this primitive (like the platform-chrome allowlist), NOT the\n * theme palette. They live in the `DEVICE` constant below and are referenced\n * by name, never scattered as raw hex through the JSX. `packages/ui` is not\n * scanned by the app-level hex-grep, so this is gate-clean.\n */\n\nimport type { ReactNode } from 'react'\nimport { Lock } from 'lucide-react'\nimport { cn } from './lib/utils'\n\n/**\n * Device-replica chrome palette — literal colors mirroring real macOS / iOS\n * UI. Owned by this primitive (like the platform-chrome allowlist), not the\n * theme palette. Reference by name; do not inline raw hex in the JSX.\n */\nconst DEVICE = {\n /** iPhone bezel + status-bar ink + home indicator. */\n bezel: '#1D1D1F',\n /** Screen background behind children. */\n screen: '#ffffff',\n /** macOS window outer border. */\n windowBorder: '#D1D5DB',\n /** macOS title-bar gradient stops + divider. */\n titleBarTop: '#E8E8E8',\n titleBarBottom: '#D4D4D4',\n titleBarBorder: '#BFBFBF',\n /** macOS address-bar fill + border. */\n addressFill: '#ffffff',\n addressBorder: '#C4C4C4',\n /** macOS / iOS address-bar text + lock glyph. */\n addressText: '#5F6368',\n /** iOS address pill fill. */\n pillFill: '#F1F3F4',\n /** Traffic-light dots (fill + matching darker border ring). */\n trafficRed: '#FF5F57',\n trafficRedBorder: '#E0443E',\n trafficAmber: '#FEBC2E',\n trafficAmberBorder: '#DEA123',\n trafficGreen: '#28C840',\n trafficGreenBorder: '#1AAB29',\n} as const\n\nconst PLACEHOLDER_URL = 'example.com'\n\nexport interface DeviceFrameProps {\n /** Which device bezel to render. */\n device: 'desktop' | 'mobile'\n /**\n * URL shown in the address bar / pill. On desktop, the address bar is\n * hidden when omitted; on mobile the pill falls back to a neutral\n * placeholder.\n */\n url?: string\n /** The page being previewed, rendered inside the (scrollable) screen area. */\n children: ReactNode\n /** Optional className on the outer frame element. */\n className?: string\n}\n\n/* ------------------------------------------------------------------ */\n/* iOS status-bar glyphs (device-replica SVG definitions) */\n/* ------------------------------------------------------------------ */\n\nfunction CellularGlyph() {\n return (\n <svg className=\"w-4 h-3\" viewBox=\"0 0 17 12\" fill={DEVICE.bezel} aria-hidden=\"true\">\n <path d=\"M1.5 5.5A.5.5 0 0 1 2 5h1a.5.5 0 0 1 .5.5v5a.5.5 0 0 1-.5.5H2a.5.5 0 0 1-.5-.5v-5Zm3-2A.5.5 0 0 1 5 3h1a.5.5 0 0 1 .5.5v7a.5.5 0 0 1-.5.5H5a.5.5 0 0 1-.5-.5v-7Zm3-2A.5.5 0 0 1 8 1h1a.5.5 0 0 1 .5.5v9a.5.5 0 0 1-.5.5H8a.5.5 0 0 1-.5-.5v-9Z\" />\n </svg>\n )\n}\n\nfunction WifiGlyph() {\n return (\n <svg className=\"w-4 h-3\" viewBox=\"0 0 16 12\" fill={DEVICE.bezel} aria-hidden=\"true\">\n <path d=\"M8 3.3a6.2 6.2 0 0 1 4.2 1.6l1.1-1.2A8 8 0 0 0 8 1.3a8 8 0 0 0-5.3 2.4l1.1 1.2A6.2 6.2 0 0 1 8 3.3Zm0 3.2c1 0 2 .4 2.7 1l1.1-1.2A5.2 5.2 0 0 0 8 4.7a5.2 5.2 0 0 0-3.8 1.6l1.1 1.2c.7-.6 1.7-1 2.7-1Z\" />\n </svg>\n )\n}\n\nfunction BatteryGlyph() {\n return (\n <div className=\"flex items-center\" aria-hidden=\"true\">\n <div\n className=\"w-[22px] h-[10px] rounded-[3px] border p-[1px]\"\n style={{ borderColor: DEVICE.bezel }}\n >\n <div\n className=\"w-full h-full rounded-[1.5px]\"\n style={{ backgroundColor: DEVICE.bezel }}\n />\n </div>\n </div>\n )\n}\n\n/** Inner-frame props — `url` / `className` are explicitly optional (the\n * public `DeviceFrame` already validated them; the helpers just forward). */\ninterface InnerFrameProps {\n url: string | undefined\n children: ReactNode\n className: string | undefined\n}\n\n/* ------------------------------------------------------------------ */\n/* macOS Safari browser window */\n/* ------------------------------------------------------------------ */\n\nfunction DesktopFrame({ url, children, className }: InnerFrameProps) {\n return (\n <div\n className={cn('rounded-xl overflow-hidden border shadow-lg', className)}\n style={{ borderColor: DEVICE.windowBorder, backgroundColor: DEVICE.screen }}\n >\n {/* Title bar */}\n <div\n className=\"px-4 py-2.5 flex items-center gap-3 border-b\"\n style={{\n backgroundImage: `linear-gradient(to bottom, ${DEVICE.titleBarTop}, ${DEVICE.titleBarBottom})`,\n borderColor: DEVICE.titleBarBorder,\n }}\n aria-hidden=\"true\"\n >\n {/* Traffic lights */}\n <div className=\"flex items-center gap-[6px]\">\n <span\n className=\"w-3 h-3 rounded-full border\"\n style={{ backgroundColor: DEVICE.trafficRed, borderColor: DEVICE.trafficRedBorder }}\n />\n <span\n className=\"w-3 h-3 rounded-full border\"\n style={{ backgroundColor: DEVICE.trafficAmber, borderColor: DEVICE.trafficAmberBorder }}\n />\n <span\n className=\"w-3 h-3 rounded-full border\"\n style={{ backgroundColor: DEVICE.trafficGreen, borderColor: DEVICE.trafficGreenBorder }}\n />\n </div>\n\n {/* Address bar (hidden when no url) */}\n {url && (\n <div className=\"flex-1 mx-8\">\n <div\n className=\"rounded-md border px-3 py-1 flex items-center justify-center shadow-inner\"\n style={{ backgroundColor: DEVICE.addressFill, borderColor: DEVICE.addressBorder }}\n >\n <div className=\"flex items-center gap-1.5\">\n <Lock className=\"w-3 h-3\" style={{ color: DEVICE.addressText }} aria-hidden=\"true\" />\n <span className=\"text-[12px]\" style={{ color: DEVICE.addressText }}>\n {url}\n </span>\n </div>\n </div>\n </div>\n )}\n </div>\n\n {/* Screen — clips to the window's rounded bottom corners */}\n <div className=\"overflow-auto\" style={{ backgroundColor: DEVICE.screen }}>\n {children}\n </div>\n </div>\n )\n}\n\n/* ------------------------------------------------------------------ */\n/* iPhone frame */\n/* ------------------------------------------------------------------ */\n\nfunction MobileFrame({ url, children, className }: InnerFrameProps) {\n return (\n <div className={cn('mx-auto', className)} style={{ maxWidth: 375 }}>\n <div\n className=\"rounded-[40px] border-[3px] p-1 shadow-2xl\"\n style={{ borderColor: DEVICE.bezel, backgroundColor: DEVICE.bezel }}\n >\n {/* Notch */}\n <div className=\"relative\" aria-hidden=\"true\">\n <div\n className=\"absolute top-0 left-1/2 -translate-x-1/2 z-10 w-[120px] h-[30px] rounded-b-[16px]\"\n style={{ backgroundColor: DEVICE.bezel }}\n />\n </div>\n\n <div className=\"rounded-[36px] overflow-hidden\" style={{ backgroundColor: DEVICE.screen }}>\n {/* Status bar */}\n <div\n className=\"px-6 pt-3 pb-1 flex items-center justify-between\"\n style={{ backgroundColor: DEVICE.screen }}\n aria-hidden=\"true\"\n >\n <span className=\"text-[12px] font-semibold\" style={{ color: DEVICE.bezel }}>\n 9:41\n </span>\n <div className=\"flex items-center gap-1\">\n <CellularGlyph />\n <WifiGlyph />\n <BatteryGlyph />\n </div>\n </div>\n\n {/* Address pill */}\n <div className=\"px-3 pb-1\" aria-hidden=\"true\">\n <div\n className=\"rounded-full px-3 py-1.5 flex items-center gap-2\"\n style={{ backgroundColor: DEVICE.pillFill }}\n >\n <Lock\n className=\"w-3 h-3 flex-shrink-0\"\n style={{ color: DEVICE.addressText }}\n aria-hidden=\"true\"\n />\n <span className=\"text-[12px] truncate\" style={{ color: DEVICE.addressText }}>\n {url || PLACEHOLDER_URL}\n </span>\n </div>\n </div>\n\n {/* Screen */}\n <div className=\"overflow-auto\">{children}</div>\n\n {/* Home indicator */}\n <div className=\"flex justify-center py-2\" aria-hidden=\"true\">\n <div className=\"w-32 h-1 rounded-full\" style={{ backgroundColor: DEVICE.bezel }} />\n </div>\n </div>\n </div>\n </div>\n )\n}\n\n/* ------------------------------------------------------------------ */\n/* Public component */\n/* ------------------------------------------------------------------ */\n\nexport function DeviceFrame({ device, url, children, className }: DeviceFrameProps) {\n if (device === 'mobile') {\n return (\n <MobileFrame url={url} className={className}>\n {children}\n </MobileFrame>\n )\n }\n return (\n <DesktopFrame url={url} className={className}>\n {children}\n </DesktopFrame>\n )\n}\n","// @lovett/ui/meta-previews — public surface.\n//\n// Promoted from docs/prototype/meta/preview-package/ per ADR-060 D9a\n// (amended 2026-05-28). Pixel-accurate Meta + Instagram + Messenger\n// preview renderers; zero coupling to stores, hooks, routers, or API\n// clients. Designed for portable drop-in reuse across the workspace's\n// Meta-related lenses.\n//\n// API contract: every renderer takes one prop, `adData: PreviewAdData`.\n// Several also accept `device`, `platform`, `format`, or dominant-color\n// tinting hints — see each component's prop signature for specifics.\n\nexport { CreativeMedia } from './CreativeMedia';\nexport { MetaFeedPreview } from './MetaFeedPreview';\nexport { MetaStoryPreview } from './MetaStoryPreview';\nexport { MetaReelPreview } from './MetaReelPreview';\nexport { MetaMessengerPreview } from './MetaMessengerPreview';\nexport { MetaRightColumnPreview } from './MetaRightColumnPreview';\nexport { MetaSearchPreview } from './MetaSearchPreview';\nexport { MetaInstreamPreview } from './MetaInstreamPreview';\nexport { InstagramFeedPreview } from './InstagramFeedPreview';\nexport { InstagramExplorePreview } from './InstagramExplorePreview';\nexport { MetaFeedCarousel } from './MetaFeedCarousel';\nexport { InstagramFeedCarousel } from './InstagramFeedCarousel';\n\nexport type {\n PreviewAdData,\n PreviewPlatform,\n PreviewPlacement,\n PreviewDevice,\n PlacementPreview,\n PreviewConfiguration,\n CarouselCardView,\n CarouselViewProps,\n} from './types';\n\nexport { PLACEMENT_CONFIGS } from './types';\n","import React, { useState, useRef, useCallback } from 'react';\nimport { Play, Volume2, VolumeX } from 'lucide-react';\n\n// `| undefined` on every optional so the workspace's\n// exactOptionalPropertyTypes consumers may pass `undefined` literals.\ninterface CreativeMediaProps {\n src: string;\n alt?: string | undefined;\n mediaType?: 'image' | 'video' | undefined;\n className?: string | undefined;\n style?: React.CSSProperties | undefined;\n autoPlay?: boolean | undefined;\n loop?: boolean | undefined;\n showPlayOverlay?: boolean | undefined;\n thumbnailSrc?: string | undefined;\n onError?: ((e: React.SyntheticEvent) => void) | undefined;\n}\n\nexport const CreativeMedia: React.FC<CreativeMediaProps> = ({\n src,\n alt = 'Ad creative',\n mediaType,\n className,\n style,\n autoPlay = false,\n loop = true,\n showPlayOverlay = true,\n thumbnailSrc,\n onError,\n}) => {\n const isVideo = mediaType === 'video' || /\\.(mp4|mov|webm|m4v)$/i.test(src);\n const videoRef = useRef<HTMLVideoElement>(null);\n const [isPlaying, setIsPlaying] = useState(autoPlay ?? false);\n const [isMuted, setIsMuted] = useState(true);\n\n // Hooks must run on every render — keep them above the early return.\n const togglePlay = useCallback(() => {\n const v = videoRef.current;\n if (!v) return;\n if (v.paused) {\n void v.play();\n setIsPlaying(true);\n } else {\n v.pause();\n setIsPlaying(false);\n }\n }, []);\n\n const toggleMute = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n const v = videoRef.current;\n if (!v) return;\n v.muted = !v.muted;\n setIsMuted(v.muted);\n }, []);\n\n if (!isVideo) {\n return (\n <img\n src={src}\n alt={alt}\n className={className}\n style={style}\n loading=\"lazy\"\n onError={onError || ((e) => { (e.currentTarget as HTMLElement).style.display = 'none'; })}\n />\n );\n }\n\n const { objectFit, ...wrapperStyle } =\n (style ?? {}) as React.CSSProperties & { objectFit?: React.CSSProperties['objectFit'] };\n\n return (\n <div\n className={`relative ${className || ''}`}\n style={wrapperStyle}\n onClick={togglePlay}\n >\n <video\n ref={videoRef}\n src={src}\n poster={thumbnailSrc}\n style={{ width: '100%', height: '100%', objectFit: objectFit || 'cover' }}\n muted={isMuted}\n loop={loop}\n playsInline\n autoPlay={autoPlay}\n preload=\"metadata\"\n onPlay={() => setIsPlaying(true)}\n onPause={() => setIsPlaying(false)}\n onError={onError || ((e) => { (e.currentTarget as HTMLElement).style.display = 'none'; })}\n />\n\n {/* Play overlay — shown when paused */}\n {showPlayOverlay && !isPlaying && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-black/20 cursor-pointer\">\n <div className=\"w-12 h-12 rounded-full bg-white/90 flex items-center justify-center shadow-lg\">\n <Play className=\"w-5 h-5 text-[#1c1e21] ml-0.5\" fill=\"currentColor\" />\n </div>\n </div>\n )}\n\n {/* Sound toggle — shown when playing */}\n {isPlaying && (\n <button\n type=\"button\"\n onClick={toggleMute}\n className=\"absolute bottom-2 right-2 w-7 h-7 rounded-full bg-black/60 flex items-center justify-center hover:bg-black/80 transition-colors\"\n >\n {isMuted ? (\n <VolumeX className=\"w-3.5 h-3.5 text-white\" />\n ) : (\n <Volume2 className=\"w-3.5 h-3.5 text-white\" />\n )}\n </button>\n )}\n </div>\n );\n};\n","import { useEffect, useState } from 'react';\nimport type { CSSProperties } from 'react';\n\ninterface ProfileAvatarProps {\n /** The pulled Meta page profile image. Empty/missing OR a load failure falls\n * back to the brand-initial letter. */\n src?: string | undefined;\n /** Brand / page name — its first character is the letter fallback. */\n name: string;\n /** Letter-fallback background — a color OR a gradient (platform-specific).\n * Defaults to Meta blue. */\n background?: string;\n /** Letter-fallback text color. Defaults to white. */\n color?: string;\n /** Letter-fallback font size in px. Defaults to 14. */\n fontSize?: number;\n /** Geometry applied to BOTH the image and the letter so they stay identical.\n * Defaults to filling the parent circle (the caller owns the size / radius /\n * ring); pass explicit width/height/margin/borderRadius for avatars that are\n * not a plain parent-fill (e.g. Messenger). */\n style?: CSSProperties;\n}\n\nconst FILL: CSSProperties = { width: '100%', height: '100%' };\n\n/**\n * Unified advertiser avatar for every Meta / Instagram preview. Renders the\n * pulled page profile image (object-cover), falling back to the brand's initial\n * when the image is missing OR fails to load. Centralising the image↔letter\n * logic here is what keeps every preview consistent — no preview can drift to a\n * grey box (Search/Explore did) or an empty circle (a broken CDN URL did).\n */\nexport function ProfileAvatar({\n src,\n name,\n background = 'rgb(24, 119, 242)',\n color = 'white',\n fontSize = 14,\n style,\n}: ProfileAvatarProps) {\n const [failed, setFailed] = useState(false);\n // A new src (e.g. brand switch) gets a fresh chance to load.\n useEffect(() => {\n setFailed(false);\n }, [src]);\n\n const geom = style ?? FILL;\n\n if (src && !failed) {\n return (\n <img\n src={src}\n alt={name}\n style={{ objectFit: 'cover', display: 'block', ...geom }}\n loading=\"lazy\"\n decoding=\"async\"\n onError={() => setFailed(true)}\n />\n );\n }\n\n return (\n <div\n aria-label={name}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n background,\n color,\n fontSize: `${fontSize}px`,\n fontWeight: 600,\n ...geom,\n }}\n >\n {(name.trim().charAt(0) || '?').toUpperCase()}\n </div>\n );\n}\n","import type { PreviewAdData } from './types'\n\n/**\n * Placeholder copy shown in a preview when the corresponding input field is\n * empty — so a fresh ad reads as a complete ad instead of blank gaps. Only\n * fills BLANK fields; any typed value passes through unchanged.\n */\nexport const PREVIEW_DEFAULTS = {\n brandName: 'Your Brand',\n primaryText: 'Your primary text will show up here.',\n headline: 'Your headline',\n displayLink: 'yoursite.com',\n callToAction: 'Learn more',\n} as const\n\n/** Fill empty `PreviewAdData` copy fields with placeholders (image/media fields\n * are left untouched — those have their own in-component placeholders). */\nexport function withPreviewDefaults(ad: PreviewAdData): PreviewAdData {\n return {\n ...ad,\n brandName: ad.brandName || PREVIEW_DEFAULTS.brandName,\n primaryText: ad.primaryText || PREVIEW_DEFAULTS.primaryText,\n headline: ad.headline || PREVIEW_DEFAULTS.headline,\n displayLink: ad.displayLink || PREVIEW_DEFAULTS.displayLink,\n callToAction: ad.callToAction || PREVIEW_DEFAULTS.callToAction,\n }\n}\n","import { memo, useState } from 'react'\nimport type { ReactNode } from 'react'\nimport type { PreviewAdData } from './types'\nimport { CreativeMedia } from './CreativeMedia'\nimport { ProfileAvatar } from './ProfileAvatar'\nimport { withPreviewDefaults } from './defaults'\n\n/**\n * Facebook Feed — single image (sponsored). GREENFIELD rebuild.\n *\n * Not the Creative-Hub export extraction. Faithful to the real FB feed ad chrome\n * but built cleanly: a 320px card with natural full-width flow (no fixed\n * 300px / containerWidth-24 inner rows, no divider margins), Meta-exact hex\n * (self-contained — no design tokens), a system font stack. Layout, top → bottom:\n * header · primary text · creative · link card · divider · action bar\n */\n\ninterface MetaFeedPreviewProps {\n adData: PreviewAdData\n format: '1:1' | '4:5' | '9:16'\n}\n\nconst WIDTH = 320\nconst FONT =\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif'\n\nconst C = {\n name: 'rgb(8, 8, 8)',\n sub: 'rgb(101, 103, 107)',\n body: 'rgb(0, 0, 0)',\n seeMore: 'var(--color-meta-blue)',\n imageBg: '#F0F2F5',\n imageEdge: 'rgba(0, 0, 0, 0.06)',\n card: '#F7F8FA',\n link: 'rgb(101, 103, 107)',\n headline: 'rgb(28, 32, 40)',\n desc: 'rgb(101, 103, 107)',\n ctaBtnBg: 'rgb(228, 230, 235)',\n ctaBtnInk: 'rgb(8, 8, 9)',\n divider: 'rgb(219, 221, 224)',\n action: 'rgb(97, 103, 112)',\n}\n\nexport const MetaFeedPreview = memo(function MetaFeedPreview({\n adData: rawAdData,\n format,\n}: MetaFeedPreviewProps) {\n const adData = withPreviewDefaults(rawAdData)\n const [expanded, setExpanded] = useState(false)\n\n const imageHeight = format === '4:5' ? 400 : WIDTH // 1:1 → 320, 4:5 → 400\n const text = adData.primaryText ?? ''\n const LIMIT = 125\n const clipped = text.length > LIMIT && !expanded\n\n return (\n <div style={{ width: WIDTH, background: '#fff', fontFamily: FONT, color: C.body }}>\n {/* Header */}\n <div style={{ display: 'flex', alignItems: 'center', gap: 8, padding: '10px 12px' }}>\n <div style={{ width: 40, height: 40, borderRadius: '50%', overflow: 'hidden', flexShrink: 0 }}>\n <ProfileAvatar src={adData.profileImage} name={adData.brandName} fontSize={15} />\n </div>\n <div style={{ flex: 1, minWidth: 0 }}>\n <div\n style={{\n fontSize: 14,\n fontWeight: 600,\n lineHeight: '18px',\n color: C.name,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {adData.brandName}\n </div>\n <div style={{ display: 'flex', alignItems: 'center', gap: 4, marginTop: 1, color: C.sub }}>\n <span style={{ fontSize: 12, lineHeight: '15px' }}>Sponsored</span>\n <span style={{ fontSize: 12 }}>·</span>\n <Globe />\n </div>\n </div>\n <Dots />\n </div>\n\n {/* Primary text */}\n {text && (\n <div style={{ padding: '0 12px 10px', fontSize: 14, fontWeight: 400, lineHeight: '19px', color: C.body, whiteSpace: 'pre-wrap', wordBreak: 'break-word' }}>\n {clipped ? text.slice(0, LIMIT).trimEnd() : text}\n {clipped && (\n <>\n {'… '}\n <button\n type=\"button\"\n onClick={() => setExpanded(true)}\n style={{ border: 0, background: 'none', padding: 0, color: C.seeMore, fontWeight: 600, fontSize: 14, cursor: 'pointer', fontFamily: FONT }}\n >\n See more\n </button>\n </>\n )}\n </div>\n )}\n\n {/* Creative */}\n <div\n style={{\n width: WIDTH,\n height: imageHeight,\n background: C.imageBg,\n borderTop: `1px solid ${C.imageEdge}`,\n borderBottom: `1px solid ${C.imageEdge}`,\n overflow: 'hidden',\n }}\n >\n {adData.creativeImage ? (\n <CreativeMedia\n src={adData.creativeImage}\n mediaType={adData.creativeMediaType}\n alt=\"\"\n style={{ width: WIDTH, height: imageHeight, objectFit: 'cover', display: 'block' }}\n />\n ) : (\n <Placeholder format={format} />\n )}\n </div>\n\n {/* Link card */}\n <div style={{ display: 'flex', alignItems: 'center', gap: 12, padding: 12, background: C.card }}>\n <div style={{ flex: 1, minWidth: 0 }}>\n {adData.displayLink && (\n <div\n style={{\n fontSize: 12,\n lineHeight: '16px',\n color: C.link,\n textTransform: 'uppercase',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {adData.displayLink}\n </div>\n )}\n {adData.headline && (\n <div\n style={{\n fontSize: 15,\n fontWeight: 700,\n lineHeight: '19px',\n color: C.headline,\n marginTop: 1,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n display: '-webkit-box',\n WebkitLineClamp: 2,\n WebkitBoxOrient: 'vertical',\n }}\n >\n {adData.headline}\n </div>\n )}\n {adData.description && (\n <div\n style={{\n fontSize: 13,\n lineHeight: '17px',\n color: C.desc,\n marginTop: 2,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {adData.description}\n </div>\n )}\n </div>\n <div\n style={{\n flexShrink: 0,\n display: 'inline-flex',\n alignItems: 'center',\n height: 36,\n padding: '0 14px',\n borderRadius: 6,\n background: C.ctaBtnBg,\n fontSize: 14,\n fontWeight: 600,\n color: C.ctaBtnInk,\n whiteSpace: 'nowrap',\n cursor: 'pointer',\n }}\n >\n {adData.callToAction || 'Learn more'}\n </div>\n </div>\n\n {/* Divider */}\n <div style={{ height: 1, background: C.divider }} />\n\n {/* Action bar */}\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-around', padding: '6px 8px' }}>\n <Action label=\"Like\"><ThumbsUp /></Action>\n <Action label=\"Comment\"><Bubble /></Action>\n <Action label=\"Share\"><ShareArrow /></Action>\n </div>\n </div>\n )\n})\n\n/* ------------------------------- icons / bits ------------------------------- */\n\nconst stroke = {\n fill: 'none',\n stroke: C.action,\n strokeWidth: 2,\n strokeLinecap: 'round' as const,\n strokeLinejoin: 'round' as const,\n}\n\nfunction Action({ label, children }: { label: string; children: ReactNode }) {\n return (\n <div style={{ display: 'flex', alignItems: 'center', gap: 6, padding: '4px 8px', cursor: 'pointer' }}>\n {children}\n <span style={{ fontSize: 13, fontWeight: 600, color: C.action }}>{label}</span>\n </div>\n )\n}\n\nfunction Dots() {\n return (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill={C.sub} style={{ display: 'block', flexShrink: 0 }}>\n <circle cx=\"5\" cy=\"12\" r=\"1.6\" />\n <circle cx=\"12\" cy=\"12\" r=\"1.6\" />\n <circle cx=\"19\" cy=\"12\" r=\"1.6\" />\n </svg>\n )\n}\n\nfunction Globe() {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 16 16\" fill={C.sub} style={{ display: 'block' }}>\n <path d=\"M8 0a8 8 0 1 0 8 8 8 8 0 0 0-8-8zm5.9 7H11a13 13 0 0 0-.9-4.4A6 6 0 0 1 13.9 7zM8 14c-.7 0-1.8-1.8-2-5h4c-.2 3.2-1.3 5-2 5zM6 7c.2-3.2 1.3-5 2-5s1.8 1.8 2 5zm-.1-4.4A13 13 0 0 0 5 7H2.1a6 6 0 0 1 3.8-4.4zM2.1 9H5a13 13 0 0 0 .9 4.4A6 6 0 0 1 2.1 9zm8 4.4a13 13 0 0 0 .9-4.4h2.9a6 6 0 0 1-3.8 4.4z\" />\n </svg>\n )\n}\n\nfunction ThumbsUp() {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" {...stroke} style={{ display: 'block' }}>\n <path d=\"M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3\" />\n </svg>\n )\n}\n\nfunction Bubble() {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" {...stroke} style={{ display: 'block' }}>\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n </svg>\n )\n}\n\nfunction ShareArrow() {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" {...stroke} style={{ display: 'block' }}>\n <path d=\"M4 12v8a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-8\" />\n <polyline points=\"16 6 12 2 8 6\" />\n <line x1=\"12\" y1=\"2\" x2=\"12\" y2=\"15\" />\n </svg>\n )\n}\n\nfunction Placeholder({ format }: { format: string }) {\n return (\n <div\n style={{\n width: '100%',\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 8,\n color: 'rgb(140, 140, 140)',\n }}\n >\n <div style={{ width: 56, height: 56, borderRadius: 10, background: '#E4E6EB' }} />\n <span style={{ fontSize: 13 }}>Ad creative · {format}</span>\n </div>\n )\n}\n","import React from 'react';\nimport { ChevronUp, MoreHorizontal, X, Link2 } from 'lucide-react';\nimport type { PreviewAdData, PreviewPlatform } from './types';\nimport { ProfileAvatar } from './ProfileAvatar';\nimport { CreativeMedia } from './CreativeMedia';\n\ninterface MetaStoryPreviewProps {\n platform: PreviewPlatform;\n adData: PreviewAdData;\n dominantColor?: string | undefined;\n accentColor?: string | undefined;\n isLight?: boolean | undefined;\n}\n\n/**\n * Shared story header — consistent across FB Stories, IG Stories, Messenger Stories.\n * Sized 10% smaller than Meta's actual preview for better fit in our grid.\n */\ninterface StoryHeaderProps {\n platform: PreviewPlatform;\n profileImage: string;\n brandName: string;\n username: string;\n isLight?: boolean | undefined;\n}\n\nconst StoryHeader: React.FC<StoryHeaderProps> = ({ platform, profileImage, brandName, username, isLight = false }) => {\n const isIG = platform === 'instagram';\n // Display name: IG uses username, FB/Messenger use full page name\n const displayName = isIG ? username : brandName;\n // Sub text: FB = \"Ad\", Messenger = \"Sponsored\", IG = none (but aligned to top like others)\n const subText = platform === 'facebook' ? 'Ad' : platform === 'messenger' ? 'Sponsored' : null;\n // Icons: FB = ellipsis + X, Messenger = ellipsis only, IG = ellipsis + X\n const showClose = platform !== 'messenger';\n\n // All story headers: 25% smaller than Meta's native sizes\n const profileSize = 30;\n const nameSize = 10;\n const subSize = 9;\n const iconBtnSize = 24;\n const iconSize = 18;\n\n // Dynamic contrast: dark text on light gradient backgrounds\n const textColor = isLight ? 'rgb(28, 30, 33)' : 'rgb(255, 255, 255)';\n const subTextColor = isLight ? 'rgba(0, 0, 0, 0.6)' : 'rgba(255, 255, 255, 0.8)';\n const iconColor = isLight ? 'rgb(28, 30, 33)' : 'rgb(255, 255, 255)';\n\n return (\n <div\n style={{\n position: 'absolute',\n top: '14px',\n left: '10px',\n right: '10px',\n display: 'flex',\n alignItems: 'flex-start',\n gap: '6px',\n zIndex: 20,\n filter: 'drop-shadow(0 1px 3px rgba(0, 0, 0, 0.4))',\n }}\n >\n {/* Profile Image */}\n <div\n style={{\n width: `${profileSize}px`,\n height: `${profileSize}px`,\n borderRadius: '50%',\n overflow: 'hidden',\n flexShrink: 0,\n border: '2px solid rgba(255, 255, 255, 0.2)',\n marginTop: '1px',\n }}\n >\n <ProfileAvatar\n src={profileImage}\n name={brandName}\n fontSize={9}\n color={textColor}\n background=\"rgb(100, 100, 100)\"\n />\n </div>\n\n {/* Name + Sub text — aligned to top */}\n <div style={{ flex: 1, minWidth: 0, paddingTop: '1px' }}>\n <p\n style={{\n color: textColor,\n fontSize: `${nameSize}px`,\n fontWeight: 600,\n lineHeight: `${Math.round(nameSize * 1.3)}px`,\n margin: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {displayName}\n </p>\n {/* Sub text for FB/Messenger, empty line for IG to keep alignment */}\n <p\n style={{\n color: subTextColor,\n fontSize: `${subSize}px`,\n fontWeight: 400,\n lineHeight: `${Math.round(subSize * 1.3)}px`,\n margin: 0,\n visibility: subText ? 'visible' : 'hidden',\n }}\n >\n {subText || '.'}\n </p>\n </div>\n\n {/* Ellipsis */}\n <button\n style={{\n width: `${iconBtnSize}px`,\n height: `${iconBtnSize}px`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: iconColor,\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n flexShrink: 0,\n padding: 0,\n }}\n >\n <MoreHorizontal style={{ width: `${iconSize}px`, height: `${iconSize}px` }} />\n </button>\n\n {/* Close X — FB and IG only */}\n {showClose && (\n <button\n style={{\n width: `${iconBtnSize}px`,\n height: `${iconBtnSize}px`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: iconColor,\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n flexShrink: 0,\n padding: 0,\n }}\n >\n <X style={{ width: `${iconSize}px`, height: `${iconSize}px` }} />\n </button>\n )}\n </div>\n );\n};\n\n/**\n * Meta Stories Preview (Facebook/Instagram/Messenger)\n * Exact styling extracted from Facebook Creative Hub\n * Reference: creative-spec/references/META_DESIGN_TOKENS.md\n * Sources: facebook-stories-singleimage-1080x1080.html, instagram-mobile-stories-singleimage-1080x1080.html\n * Facebook Stories Container: 318x566px\n * Instagram Stories Container: 320x567px (inner: 318x565px)\n */\nexport const MetaStoryPreview: React.FC<MetaStoryPreviewProps> = ({\n platform,\n adData,\n dominantColor = 'rgb(40, 40, 40)',\n}) => {\n const [progressKey, setProgressKey] = React.useState(0);\n const [instagramFrame, setInstagramFrame] = React.useState<'default' | 'expanded'>('default');\n const [isTextExpanded, setIsTextExpanded] = React.useState(false);\n\n // Facebook Stories exact design tokens - extracted from Creative Hub\n const fbStory = {\n // Container — bumped 318 → 320 to match peer previews (Feed, Reel, IG Story)\n // so the AdPreview canvas no longer renders FB Stories 2px narrower.\n containerWidth: 320,\n containerHeight: 569,\n containerBorder: 'none',\n fontFamily: 'system-ui, -apple-system, \"system-ui\", \".SFNSText-Regular\", sans-serif',\n baseColor: 'rgb(28, 30, 33)',\n baseFontSize: 12,\n baseLineHeight: '16.08px',\n\n // Background gradient (for 1:1 images centered) — dynamically matched to creative\n backgroundGradient: `linear-gradient(to top, ${dominantColor}, rgb(255, 255, 255))`,\n\n // Image\n imageWidth: 318,\n imageHeight: 318,\n imageTop: 71, // Centers 1:1 image in 9:16 frame\n\n // Bottom gradient overlay\n bottomGradientTop: 399,\n bottomGradientWidth: 318,\n bottomGradientHeight: 167,\n bottomGradient: 'linear-gradient(rgba(85, 85, 85, 0), rgba(85, 85, 85, 0.5))',\n\n // Primary text overlay\n textLeft: 15,\n textRight: 15,\n textTop: 419,\n textWidth: 288,\n textMaxWidth: 288,\n textColor: 'rgb(255, 255, 255)',\n textFont: 'Helvetica, Arial, sans-serif',\n textSize: 14,\n textWeight: 600,\n textLineHeight: '19.6px',\n\n // Progress bar\n progressTop: 6,\n progressLeft: 4,\n progressRight: 4,\n progressWidth: 310,\n progressHeight: 2,\n progressBg: 'rgba(255, 255, 255, 0.5)',\n progressFillBg: 'rgb(255, 255, 255)',\n progressRadius: 1,\n };\n\n // Instagram Stories design tokens\n const igStory = {\n // Container\n containerWidth: 320,\n containerHeight: 567,\n innerWidth: 318,\n innerHeight: 565,\n containerBorder: 'none',\n fontFamily: 'system-ui, -apple-system, \"system-ui\", \".SFNSText-Regular\", sans-serif',\n baseColor: 'rgb(28, 30, 33)',\n\n // Background — dynamic gradient matched to creative\n backgroundGradient: `linear-gradient(rgb(255, 255, 255), ${dominantColor})`,\n overlayBg: 'rgba(0, 0, 0, 0.5)',\n\n // Profile\n profileSize: 28,\n profileRadius: 14,\n profileTop: 16,\n profileLeft: 10,\n\n // Username\n usernameTop: 16,\n usernameLeft: 46,\n usernameWidth: 236,\n usernameSize: 12,\n usernameWeight: 700,\n usernameLineHeight: '14px',\n usernameColor: 'rgb(255, 255, 255)',\n\n // Sponsored text at bottom\n sponsoredTop: 535.602,\n sponsoredPadding: '6px 6px 10px 12px',\n sponsoredGradient: 'linear-gradient(rgba(0, 0, 0, 0.03), rgba(0, 0, 0, 0.2))',\n sponsoredSize: 10,\n sponsoredLineHeight: '13.4px',\n sponsoredColor: 'rgb(255, 255, 255)',\n\n // CTA button (sticker style)\n ctaButtonBg: 'rgb(255, 255, 255)',\n ctaButtonWidth: 145.648,\n ctaButtonHeight: 29.6953,\n ctaButtonRadius: 15,\n ctaButtonPadding: '6px 12px 5.4px',\n ctaButtonFont: '\"Instagram Sans\"',\n ctaButtonSize: 27,\n ctaButtonWeight: 400,\n ctaButtonLineHeight: '29.7px',\n ctaButtonColor: 'rgb(0, 0, 0)',\n ctaIconColor: 'rgb(0, 149, 246)',\n\n // Progress bar\n progressTop: 6,\n progressLeft: 4,\n progressWidth: 310,\n progressHeight: 2,\n progressBg: 'rgba(255, 255, 255, 0.5)',\n progressFillBg: 'rgb(255, 255, 255)',\n progressRadius: 1,\n\n // Caption text\n captionFont: 'Tahoma, Helvetica, Arial, sans-serif',\n captionSize: 13,\n captionWeight: 700,\n captionLineHeight: '18.2px',\n captionColor: 'rgb(0, 0, 0)',\n captionRadius: 4,\n captionPadding: '2px 8px 5px',\n captionWidth: 245.68,\n captionTop: 10,\n captionLeft: 26,\n\n // Expanded view center info\n centerTitleSize: 20,\n centerTitleWeight: 700,\n centerTitleLineHeight: '26.8px',\n centerTitleColor: 'rgb(255, 255, 255)',\n centerLinkSize: 12,\n centerLinkWeight: 500,\n centerLinkLineHeight: '16.08px',\n centerLinkColor: 'rgb(255, 255, 255)',\n };\n\n const username = platform === 'instagram'\n ? adData.brandName.toLowerCase().replace(/[^a-z0-9]/g, '')\n : adData.brandName;\n\n // Truncate text to 65 characters for Instagram Stories\n const truncateInstagramText = (text: string, limit: number = 65) => {\n if (!text || text.length <= limit) return text;\n return text.substring(0, limit);\n };\n\n // Progress bar animation for Messenger and Facebook Stories\n React.useEffect(() => {\n if (platform === 'instagram') return;\n\n const interval = setInterval(() => {\n setProgressKey((prev) => prev + 1);\n }, 7000); // Reset every 7 seconds\n\n return () => clearInterval(interval);\n }, [platform]);\n\n // Instagram Stories animation cycle\n React.useEffect(() => {\n if (platform !== 'instagram') return;\n\n const cycle = () => {\n // Default view (0-5s)\n setInstagramFrame('default');\n setProgressKey((prev) => prev + 1);\n\n setTimeout(() => {\n // Expanded view (5-12s)\n setInstagramFrame('expanded');\n }, 5000);\n };\n\n // Start cycle immediately\n cycle();\n\n // Repeat every 12 seconds\n const interval = setInterval(cycle, 12000);\n\n return () => clearInterval(interval);\n }, [platform]);\n\n // Messenger Stories Layout\n if (platform === 'messenger') {\n return (\n <div\n className=\"meta-preview\"\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '100%',\n height: '100%',\n fontFamily: fbStory.fontFamily,\n fontSize: `${fbStory.baseFontSize}px`,\n color: fbStory.baseColor,\n lineHeight: fbStory.baseLineHeight,\n }}\n >\n <div\n style={{\n position: 'relative',\n width: `${fbStory.containerWidth}px`, maxWidth: '100%',\n height: `${fbStory.containerHeight}px`,\n backgroundColor: 'rgb(0, 0, 0)',\n border: fbStory.containerBorder,\n overflow: 'hidden',\n }}\n >\n {/* Top scrim for progress bar / header visibility */}\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n height: '70px',\n background: 'linear-gradient(to bottom, rgba(0,0,0,0.35) 0%, transparent 100%)',\n zIndex: 15,\n pointerEvents: 'none',\n }}\n />\n\n {/* Progress Bar */}\n <div\n style={{\n position: 'absolute',\n top: `${fbStory.progressTop}px`,\n left: `${fbStory.progressLeft}px`,\n right: `${fbStory.progressRight}px`,\n width: `${fbStory.progressWidth}px`,\n height: `${fbStory.progressHeight}px`,\n backgroundColor: fbStory.progressBg,\n borderRadius: `${fbStory.progressRadius}px`,\n zIndex: 25,\n }}\n >\n <div\n key={progressKey}\n style={{\n height: `${fbStory.progressHeight}px`,\n backgroundColor: fbStory.progressFillBg,\n borderRadius: `${fbStory.progressRadius}px`,\n animation: 'progressBar 7s linear forwards',\n }}\n />\n </div>\n\n <style>{`\n @keyframes progressBar {\n from { width: 0%; }\n to { width: 100%; }\n }\n `}</style>\n\n {/* Story Content */}\n {adData.creativeImage && (\n <CreativeMedia\n src={adData.creativeImage}\n mediaType={adData.creativeMediaType}\n alt=\"Story ad\"\n autoPlay\n showPlayOverlay={false}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: `${fbStory.containerWidth}px`, maxWidth: '100%',\n height: `${fbStory.containerHeight}px`,\n objectFit: 'contain',\n backgroundColor: 'rgb(0, 0, 0)',\n }}\n />\n )}\n\n {/* Header — shared component */}\n <StoryHeader platform=\"messenger\" profileImage={adData.profileImage} brandName={adData.brandName} username={username} isLight={false} />\n\n {/* Bottom CTA */}\n <div\n style={{\n position: 'absolute',\n bottom: '20px',\n left: '16px',\n right: '16px',\n zIndex: 10,\n }}\n >\n {/* Up Arrow */}\n <div style={{ display: 'flex', justifyContent: 'center', marginBottom: '12px' }}>\n <ChevronUp style={{ width: '24px', height: '24px', color: 'rgb(255, 255, 255)' }} strokeWidth={3} />\n </div>\n\n {/* CTA Button - Pill shape, centered */}\n <div style={{ display: 'flex', justifyContent: 'center' }}>\n <a\n href={adData.websiteUrl || '#'}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{\n display: 'inline-block',\n padding: '8px 24px',\n backgroundColor: 'rgb(255, 255, 255)',\n color: 'rgb(0, 0, 0)',\n borderRadius: '50px',\n fontWeight: 600,\n fontSize: '14px',\n textDecoration: 'none',\n }}\n >\n {adData.callToAction}\n </a>\n </div>\n </div>\n\n {/* Placeholder if no image */}\n {!adData.creativeImage && (\n <div\n style={{\n position: 'absolute',\n inset: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <div style={{ textAlign: 'center', color: 'rgba(255, 255, 255, 0.6)' }}>\n <div\n style={{\n width: '96px',\n height: '96px',\n backgroundColor: 'rgba(255, 255, 255, 0.2)',\n borderRadius: '8px',\n margin: '0 auto 8px',\n }}\n />\n <p style={{ fontSize: '14px', margin: 0 }}>Messenger Story</p>\n <p style={{ fontSize: '12px', margin: '4px 0 0' }}>9:16 Format</p>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n }\n\n // Facebook Stories Layout\n if (platform === 'facebook') {\n return (\n <div\n className=\"meta-preview\"\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '100%',\n height: '100%',\n fontFamily: fbStory.fontFamily,\n fontSize: `${fbStory.baseFontSize}px`,\n color: fbStory.baseColor,\n lineHeight: fbStory.baseLineHeight,\n }}\n >\n <div\n style={{\n position: 'relative',\n width: `${fbStory.containerWidth}px`, maxWidth: '100%',\n height: `${fbStory.containerHeight}px`,\n backgroundImage: fbStory.backgroundGradient,\n border: fbStory.containerBorder,\n overflow: 'hidden',\n }}\n >\n {/* Top dark scrim — ensures progress bar and header are visible on light backgrounds */}\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n height: '70px',\n background: 'linear-gradient(to bottom, rgba(0,0,0,0.35) 0%, transparent 100%)',\n zIndex: 15,\n pointerEvents: 'none',\n }}\n />\n\n {/* Progress Bar */}\n <div\n style={{\n position: 'absolute',\n top: `${fbStory.progressTop}px`,\n left: `${fbStory.progressLeft}px`,\n right: `${fbStory.progressRight}px`,\n width: `${fbStory.progressWidth}px`,\n height: `${fbStory.progressHeight}px`,\n backgroundColor: fbStory.progressBg,\n borderRadius: `${fbStory.progressRadius}px`,\n zIndex: 25,\n }}\n >\n <div\n key={progressKey}\n style={{\n height: `${fbStory.progressHeight}px`,\n backgroundColor: fbStory.progressFillBg,\n borderRadius: `${fbStory.progressRadius}px`,\n animation: 'progressBar 7s linear forwards',\n }}\n />\n </div>\n\n <style>{`\n @keyframes progressBar {\n from { width: 0%; }\n to { width: 100%; }\n }\n `}</style>\n\n {/* Header — shared component */}\n <StoryHeader platform=\"facebook\" profileImage={adData.profileImage} brandName={adData.brandName} username={username} isLight={false} />\n\n {/* Bottom gradient overlay */}\n <div\n style={{\n position: 'absolute',\n top: `${fbStory.bottomGradientTop}px`,\n width: `${fbStory.bottomGradientWidth}px`,\n height: `${fbStory.bottomGradientHeight}px`,\n backgroundImage: fbStory.bottomGradient,\n zIndex: 5,\n }}\n />\n\n {/* Story Image - centered for 1:1 */}\n {adData.creativeImage && (\n <CreativeMedia\n src={adData.creativeImage}\n mediaType={adData.creativeMediaType}\n alt=\"Story ad\"\n autoPlay\n showPlayOverlay={false}\n style={{\n position: 'relative',\n top: `${fbStory.imageTop}px`,\n width: `${fbStory.imageWidth}px`,\n height: `${fbStory.imageHeight}px`,\n objectFit: 'cover',\n display: 'block',\n }}\n />\n )}\n\n {/* Primary Text Overlay */}\n <div\n style={{\n position: 'absolute',\n top: `${fbStory.textTop}px`,\n left: `${fbStory.textLeft}px`,\n right: `${fbStory.textRight}px`,\n width: `${fbStory.textWidth}px`,\n maxWidth: `${fbStory.textMaxWidth}px`,\n color: fbStory.textColor,\n fontFamily: fbStory.textFont,\n fontSize: `${fbStory.textSize}px`,\n fontWeight: fbStory.textWeight,\n lineHeight: fbStory.textLineHeight,\n textAlign: 'left',\n zIndex: 10,\n }}\n >\n {adData.primaryText && (\n <span style={{ marginLeft: '11px' }}>\n {adData.primaryText.length > 100\n ? adData.primaryText.substring(0, 100) + '...'\n : adData.primaryText}\n </span>\n )}\n </div>\n\n {/* Bottom CTA Area */}\n <div\n style={{\n position: 'absolute',\n bottom: '20px',\n left: '16px',\n right: '16px',\n zIndex: 10,\n }}\n >\n {/* Up Arrow */}\n <div style={{ display: 'flex', justifyContent: 'center', marginBottom: '12px' }}>\n <ChevronUp style={{ width: '24px', height: '24px', color: 'rgb(255, 255, 255)' }} strokeWidth={3} />\n </div>\n\n {/* CTA Button - Rounded corners, centered */}\n <div style={{ display: 'flex', justifyContent: 'center' }}>\n <a\n href={adData.websiteUrl || '#'}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '8px',\n padding: '10px 20px',\n backgroundColor: 'rgb(255, 255, 255)',\n color: 'rgb(56, 88, 152)',\n borderRadius: '8px',\n fontWeight: 600,\n fontSize: '14px',\n textDecoration: 'none',\n }}\n >\n <Link2 style={{ width: '20px', height: '20px' }} />\n <span>{adData.callToAction}</span>\n </a>\n </div>\n </div>\n\n {/* Placeholder if no image */}\n {!adData.creativeImage && (\n <div\n style={{\n position: 'absolute',\n inset: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <div style={{ textAlign: 'center', color: 'rgba(255, 255, 255, 0.6)' }}>\n <div\n style={{\n width: '96px',\n height: '96px',\n backgroundColor: 'rgba(255, 255, 255, 0.2)',\n borderRadius: '8px',\n margin: '0 auto 8px',\n }}\n />\n <p style={{ fontSize: '14px', margin: 0 }}>Facebook Story</p>\n <p style={{ fontSize: '12px', margin: '4px 0 0' }}>9:16 Format</p>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n }\n\n // Instagram Stories Layout\n return (\n <div\n className=\"meta-preview\"\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '100%',\n height: '100%',\n fontFamily: igStory.fontFamily,\n fontSize: '12px',\n color: igStory.baseColor,\n }}\n >\n <div\n style={{\n position: 'relative',\n width: `${igStory.containerWidth}px`, maxWidth: '100%',\n height: `${igStory.containerHeight}px`,\n padding: '1px',\n }}\n >\n <div\n id=\"instagram_story_preview_frame\"\n style={{\n position: 'relative',\n width: `${igStory.innerWidth}px`, maxWidth: '100%',\n height: `${igStory.innerHeight}px`,\n backgroundImage: igStory.backgroundGradient,\n border: igStory.containerBorder,\n overflow: 'hidden',\n }}\n >\n {/* Top scrim for progress bar / header visibility + bottom scrim for text */}\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n height: '70px',\n background: 'linear-gradient(to bottom, rgba(0,0,0,0.3) 0%, transparent 100%)',\n zIndex: 15,\n pointerEvents: 'none',\n }}\n />\n <div\n style={{\n position: 'absolute',\n bottom: 0,\n left: 0,\n right: 0,\n height: '120px',\n background: 'linear-gradient(to top, rgba(0,0,0,0.25) 0%, transparent 100%)',\n zIndex: 1,\n pointerEvents: 'none',\n }}\n />\n\n {/* Progress Bar - exact Instagram positioning */}\n <div\n style={{\n position: 'absolute',\n top: `${igStory.progressTop}px`,\n left: `${igStory.progressLeft}px`,\n width: `${igStory.progressWidth}px`,\n height: `${igStory.progressHeight}px`,\n backgroundColor: igStory.progressBg,\n borderRadius: `${igStory.progressRadius}px`,\n zIndex: 20,\n }}\n >\n <div\n key={progressKey}\n style={{\n height: `${igStory.progressHeight}px`,\n backgroundColor: igStory.progressFillBg,\n borderRadius: `${igStory.progressRadius}px`,\n animation: 'progressBar 12s linear forwards',\n }}\n />\n </div>\n\n <style>{`\n @keyframes progressBar {\n from { width: 0%; }\n to { width: 100%; }\n }\n @keyframes fadeUp {\n from {\n opacity: 0;\n transform: translateY(20px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n @keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n `}</style>\n\n {/* Header — shared component */}\n {/* Header always white — top scrim ensures visibility */}\n <StoryHeader platform=\"instagram\" profileImage={adData.profileImage} brandName={adData.brandName} username={username} isLight={false} />\n\n {/* Story Image - centered at top: 50px margin */}\n <div\n style={{\n position: 'relative',\n width: `${igStory.innerWidth}px`, maxWidth: '100%',\n marginTop: '50px',\n zIndex: 5,\n }}\n >\n {adData.creativeImage ? (\n <CreativeMedia\n src={adData.creativeImage}\n mediaType={adData.creativeMediaType}\n alt=\"Story ad\"\n autoPlay\n showPlayOverlay={false}\n style={{\n position: 'relative',\n width: `${igStory.innerWidth}px`, maxWidth: '100%',\n height: `${igStory.innerWidth}px`,\n objectFit: 'cover',\n display: 'block',\n }}\n />\n ) : (\n <div\n style={{\n width: `${igStory.innerWidth}px`, maxWidth: '100%',\n height: `${igStory.innerWidth}px`,\n backgroundColor: 'rgba(255, 255, 255, 0.1)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <div style={{ textAlign: 'center', color: 'rgba(255, 255, 255, 0.6)' }}>\n <div\n style={{\n width: '96px',\n height: '96px',\n backgroundColor: 'rgba(255, 255, 255, 0.2)',\n borderRadius: '8px',\n margin: '0 auto 8px',\n }}\n />\n <p style={{ fontSize: '14px', margin: 0 }}>Instagram Story</p>\n <p style={{ fontSize: '12px', margin: '4px 0 0' }}>9:16 Format</p>\n </div>\n </div>\n )}\n </div>\n\n {/* Caption/Primary Text Area */}\n {adData.primaryText && (\n <div\n style={{\n position: 'absolute',\n top: '400px',\n left: `${igStory.captionLeft}px`,\n width: `${igStory.captionWidth}px`,\n padding: igStory.captionPadding,\n fontFamily: igStory.captionFont,\n fontSize: `${igStory.captionSize}px`,\n fontWeight: igStory.captionWeight,\n lineHeight: igStory.captionLineHeight,\n color: igStory.captionColor,\n borderRadius: `${igStory.captionRadius}px`,\n zIndex: 10,\n }}\n >\n {isTextExpanded ? (\n adData.primaryText\n ) : (\n <>\n {truncateInstagramText(adData.primaryText, 50)}\n {adData.primaryText.length > 50 && (\n <button\n onClick={() => setIsTextExpanded(true)}\n style={{\n display: 'inline-block',\n background: 'none',\n border: 'none',\n color: igStory.captionColor,\n fontFamily: igStory.captionFont,\n fontSize: `${igStory.captionSize}px`,\n fontWeight: 700,\n cursor: 'pointer',\n opacity: 0.8,\n }}\n >\n more\n </button>\n )}\n </>\n )}\n </div>\n )}\n\n {/* CTA Button Sticker - visible in default view */}\n {instagramFrame === 'default' && (\n <div\n style={{\n position: 'absolute',\n bottom: '68px',\n left: '50%',\n transform: 'translateX(-50%)',\n zIndex: 10,\n }}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: igStory.ctaButtonPadding,\n backgroundColor: igStory.ctaButtonBg,\n borderRadius: `${igStory.ctaButtonRadius}px`,\n color: igStory.ctaButtonColor,\n fontFamily: igStory.ctaButtonFont,\n fontSize: '14px',\n fontWeight: igStory.ctaButtonWeight,\n textAlign: 'center',\n }}\n >\n <div style={{ marginRight: '6px', color: igStory.ctaIconColor }}>\n <Link2 style={{ width: '16px', height: '16px' }} />\n </div>\n {adData.callToAction}\n </div>\n </div>\n )}\n\n {/* End scene — dark overlay with centered profile, name, URL, CTA */}\n {instagramFrame === 'expanded' && (\n <>\n {/* Dark overlay that fades in */}\n <div\n style={{\n position: 'absolute',\n inset: 0,\n backgroundColor: 'rgba(0, 0, 0, 0.55)',\n zIndex: 30,\n animation: 'fadeIn 1.5s ease-out forwards',\n pointerEvents: 'none',\n }}\n />\n\n {/* Centered content */}\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: '66px',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n zIndex: 35,\n animation: 'fadeUp 0.8s ease-out 0.3s both',\n }}\n >\n {/* Profile image */}\n <div\n style={{\n width: '64px',\n height: '64px',\n borderRadius: '50%',\n overflow: 'hidden',\n marginBottom: '12px',\n border: '2px solid rgba(255, 255, 255, 0.3)',\n }}\n >\n {adData.profileImage ? (\n <img\n src={adData.profileImage}\n alt={adData.brandName}\n style={{ width: '100%', height: '100%', objectFit: 'cover' }}\n onError={(e) => { e.currentTarget.style.display = 'none'; }}\n />\n ) : (\n <div\n style={{\n width: '100%',\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: 'rgb(80, 80, 80)',\n color: 'white',\n fontSize: '24px',\n fontWeight: 600,\n }}\n >\n {adData.brandName.charAt(0).toUpperCase()}\n </div>\n )}\n </div>\n\n {/* Page name */}\n <div\n style={{\n fontSize: '15px',\n fontWeight: 600,\n color: 'rgb(255, 255, 255)',\n textAlign: 'center',\n marginBottom: '2px',\n }}\n >\n {adData.brandName}\n </div>\n\n {/* Display URL */}\n <div\n style={{\n fontSize: '12px',\n fontWeight: 400,\n color: 'rgba(255, 255, 255, 0.7)',\n textAlign: 'center',\n marginBottom: '16px',\n }}\n >\n {adData.displayLink}\n </div>\n\n {/* CTA Button */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '8px 20px',\n backgroundColor: 'rgb(255, 255, 255)',\n borderRadius: '20px',\n color: 'rgb(0, 0, 0)',\n fontSize: '13px',\n fontWeight: 600,\n gap: '6px',\n }}\n >\n <Link2 style={{ width: '14px', height: '14px' }} />\n {adData.callToAction}\n </div>\n </div>\n </>\n )}\n\n {/* Bottom bar — Ad label + action icons (2026 IG Stories update) */}\n <div\n style={{\n position: 'absolute',\n bottom: 0,\n left: 0,\n right: 0,\n height: '48px',\n minHeight: '48px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingLeft: '16px',\n paddingRight: '16px',\n backgroundColor: 'rgb(0, 0, 0)',\n zIndex: 25,\n }}\n >\n <span\n style={{\n color: 'rgb(255, 255, 255)',\n fontSize: '12px',\n lineHeight: '18px',\n }}\n >\n Ad\n </span>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n }}\n >\n {/* Heart */}\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"white\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z\" />\n </svg>\n {/* Comment */}\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"white\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z\" />\n </svg>\n {/* Send / Share */}\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"white\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"22\" y1=\"2\" x2=\"11\" y2=\"13\" />\n <polygon points=\"22 2 15 22 11 13 2 9 22 2\" />\n </svg>\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nMetaStoryPreview.displayName = 'MetaStoryPreview';\n","import React from 'react';\nimport type { PreviewAdData, PreviewPlatform } from './types';\nimport { CreativeMedia } from './CreativeMedia';\nimport { ProfileAvatar } from './ProfileAvatar';\n\ninterface MetaReelPreviewProps {\n platform: PreviewPlatform;\n adData: PreviewAdData;\n dominantColor?: string | undefined;\n accentColor?: string | undefined;\n}\n\n/**\n * Facebook/Instagram Reels Preview\n * Exact styling extracted from Facebook Creative Hub\n * Reference: creative-spec/references/META_DESIGN_TOKENS.md\n * Source: Facebook-Reels-singleimage-1080x1080.html extraction\n * Container: 320x567px (9:16 ratio)\n */\nexport const MetaReelPreview: React.FC<MetaReelPreviewProps> = ({\n platform,\n adData,\n dominantColor = 'rgb(40, 40, 40)',\n}) => {\n\n // Instagram animation states\n const [instagramFrame, setInstagramFrame] = React.useState<'transparent' | 'solid' | 'expanded'>('transparent');\n\n // Facebook Reels exact design tokens - extracted from Creative Hub\n const reels = {\n // Container - 320x567px (9:16 ratio)\n containerWidth: 320,\n containerHeight: 567,\n // FB Reels = solid black, IG Reels = dominant color gradient\n containerBg: platform === 'instagram'\n ? `linear-gradient(to bottom, ${dominantColor}, rgb(0, 0, 0))`\n : 'linear-gradient(rgb(0, 0, 0), rgb(0, 0, 0))',\n containerBorder: '1px solid rgba(0, 0, 0, 0.3)',\n fontFamily: 'system-ui, -apple-system, \"system-ui\", \".SFNSText-Regular\", sans-serif',\n\n // Image centered in black container\n imageWidth: 318,\n imageHeight: 318,\n imageMarginTop: 123.5, // Centers in 565px height\n\n // Sponsored pill (top left)\n sponsoredPillTop: 10,\n sponsoredPillLeft: 10,\n sponsoredPillPadding: '4px 10px',\n sponsoredPillBg: 'rgba(24, 25, 26, 0.6)',\n sponsoredPillRadius: '50px',\n sponsoredPillSize: 12,\n sponsoredPillColor: 'rgb(255, 255, 255)',\n\n // Profile section (bottom overlay)\n profileTop: 422.922,\n profileLeft: 16,\n profileWidth: 250,\n\n // Profile image\n profileImageSize: 30,\n profileImageRadius: '50px',\n\n // Page name\n pageNameSize: 14,\n pageNameWeight: 400,\n pageNameColor: 'rgb(255, 255, 255)',\n pageNameLineHeight: '19px',\n\n // Primary text\n primaryTextSize: 14,\n primaryTextWeight: 400,\n primaryTextColor: 'rgb(252, 252, 252)',\n primaryTextLineHeight: '16px',\n\n // CTA button\n ctaButtonWidth: 250,\n ctaButtonHeight: 34,\n ctaButtonMarginTop: 12,\n ctaButtonRadius: 5,\n ctaButtonTextSize: 14,\n ctaButtonTextWeight: 700,\n ctaButtonTextColor: 'rgba(0, 0, 0, 0.85)',\n ctaButtonLineHeight: '20px',\n // CTA button — white bg with dark text per 2026 extraction\n ctaButtonBg: 'rgba(228, 230, 235, 0.95)',\n\n // Action icons (right side)\n actionIconsTop: 483,\n actionIconsRight: 10,\n actionIconsWidth: 36,\n actionIconSize: 24,\n actionIconMarginLeft: 6,\n actionIconBg: 'rgba(228, 230, 235, 0)',\n actionIconRadius: 15,\n };\n\n // Truncate text to 30 characters for collapsed view\n const truncateText = (text: string, limit: number = 30) => {\n if (!text || text.length <= limit) return text;\n return text.substring(0, limit);\n };\n\n // Instagram Reels animation cycle\n React.useEffect(() => {\n if (platform !== 'instagram') return;\n\n const cycle = () => {\n // Transparent button (0-5s)\n setInstagramFrame('transparent');\n\n setTimeout(() => {\n // Solid white button (5-10s)\n setInstagramFrame('solid');\n }, 5000);\n\n setTimeout(() => {\n // Expanded CTA (10-30s)\n setInstagramFrame('expanded');\n }, 10000);\n };\n\n // Start cycle immediately\n cycle();\n\n // Repeat every 30 seconds\n const interval = setInterval(cycle, 30000);\n\n return () => clearInterval(interval);\n }, [platform]);\n\n return (\n <div\n className=\"meta-preview\"\n style={{\n width: '100%',\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontFamily: reels.fontFamily,\n }}\n >\n <div\n style={{\n width: `${reels.containerWidth}px`, maxWidth: '100%',\n height: `${reels.containerHeight}px`,\n backgroundImage: reels.containerBg,\n border: reels.containerBorder,\n borderRadius: '8px',\n overflow: 'hidden',\n position: 'relative',\n }}\n >\n {/* Creative Image - Centered vertically */}\n {adData.creativeImage ? (\n <CreativeMedia\n src={adData.creativeImage}\n mediaType={adData.creativeMediaType}\n alt=\"Reel ad\"\n autoPlay\n showPlayOverlay={false}\n style={{\n position: 'absolute',\n width: `${reels.imageWidth}px`,\n height: `${reels.imageHeight}px`,\n top: `${reels.imageMarginTop}px`,\n left: '1px',\n objectFit: 'cover',\n }}\n />\n ) : (\n <div\n style={{\n position: 'absolute',\n width: `${reels.imageWidth}px`,\n height: `${reels.imageHeight}px`,\n top: `${reels.imageMarginTop}px`,\n left: '1px',\n backgroundColor: '#333',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <div style={{ textAlign: 'center', color: 'rgba(255, 255, 255, 0.6)' }}>\n <div\n style={{\n width: '64px',\n height: '64px',\n borderRadius: '8px',\n backgroundColor: 'rgba(255, 255, 255, 0.2)',\n margin: '0 auto 8px',\n }}\n />\n <p style={{ fontSize: '14px', margin: 0 }}>Reel Preview</p>\n <p style={{ fontSize: '12px', margin: '4px 0 0' }}>9:16 Format</p>\n </div>\n </div>\n )}\n\n {/* Top gradient overlay */}\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: `${reels.imageWidth}px`,\n height: '98px',\n background: 'linear-gradient(180deg, rgba(0,0,0,0.4) 0%, transparent 100%)',\n pointerEvents: 'none',\n }}\n />\n\n {/* Bottom gradient overlay */}\n <div\n style={{\n position: 'absolute',\n bottom: 0,\n left: 0,\n width: `${reels.imageWidth}px`,\n height: '271px',\n background: 'linear-gradient(0deg, rgba(0,0,0,0.6) 0%, transparent 100%)',\n pointerEvents: 'none',\n }}\n />\n\n {/* Sponsored Pill - Top left */}\n <div\n style={{\n position: 'absolute',\n top: `${reels.sponsoredPillTop}px`,\n left: `${reels.sponsoredPillLeft}px`,\n padding: reels.sponsoredPillPadding,\n backgroundColor: reels.sponsoredPillBg,\n borderRadius: reels.sponsoredPillRadius,\n }}\n >\n <span\n style={{\n fontSize: `${reels.sponsoredPillSize}px`,\n fontWeight: 400,\n color: reels.sponsoredPillColor,\n }}\n >\n Sponsored\n </span>\n </div>\n\n {/* Play Icon Overlay - Center */}\n {adData.creativeImage && (\n <div\n style={{\n position: 'absolute',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n width: '64px',\n height: '64px',\n backgroundColor: 'rgba(0, 0, 0, 0.4)',\n borderRadius: '50%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"white\">\n <polygon points=\"5 3 19 12 5 21 5 3\" />\n </svg>\n </div>\n )}\n\n {platform === 'facebook' ? (\n /* Facebook Reels Layout — anchored to bottom */\n <>\n {/* Bottom content area */}\n <div\n style={{\n position: 'absolute',\n bottom: '12px',\n left: `${reels.profileLeft}px`,\n right: '50px',\n zIndex: 10,\n }}\n >\n {/* Profile Image + Page Name */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n marginBottom: '6px',\n }}\n >\n <div\n style={{\n width: `${reels.profileImageSize}px`,\n height: `${reels.profileImageSize}px`,\n borderRadius: reels.profileImageRadius,\n overflow: 'hidden',\n flexShrink: 0,\n }}\n >\n <ProfileAvatar src={adData.profileImage} name={adData.brandName} fontSize={12} />\n </div>\n <span\n style={{\n fontSize: `${reels.pageNameSize}px`,\n fontWeight: reels.pageNameWeight,\n lineHeight: reels.pageNameLineHeight,\n color: reels.pageNameColor,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {adData.brandName}\n </span>\n </div>\n\n {/* Primary Text */}\n <div style={{ marginBottom: '6px' }}>\n <span\n style={{\n fontSize: `${reels.primaryTextSize}px`,\n fontWeight: reels.primaryTextWeight,\n lineHeight: reels.primaryTextLineHeight,\n color: reels.primaryTextColor,\n }}\n >\n {truncateText(adData.primaryText || adData.headline, 30)}\n {(adData.primaryText || adData.headline || '').length > 30 && (\n <span style={{ color: 'rgba(255,255,255,0.7)' }}>...more</span>\n )}\n </span>\n </div>\n\n {/* CTA Button */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: `${reels.ctaButtonWidth}px`,\n height: `${reels.ctaButtonHeight}px`,\n backgroundColor: reels.ctaButtonBg,\n borderRadius: `${reels.ctaButtonRadius}px`,\n cursor: 'pointer',\n }}\n >\n <span\n style={{\n fontSize: `${reels.ctaButtonTextSize}px`,\n fontWeight: reels.ctaButtonTextWeight,\n lineHeight: reels.ctaButtonLineHeight,\n color: reels.ctaButtonTextColor,\n }}\n >\n {adData.callToAction || 'Learn more'}\n </span>\n </div>\n </div>\n\n {/* Action Icons - Right side, anchored to bottom */}\n <div\n style={{\n position: 'absolute',\n bottom: '12px',\n right: '10px',\n width: `${reels.actionIconsWidth}px`,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: '14px',\n zIndex: 10,\n }}\n >\n {/* Like */}\n <button\n style={{\n width: `${reels.actionIconSize}px`,\n height: `${reels.actionIconSize}px`,\n marginLeft: `${reels.actionIconMarginLeft}px`,\n backgroundColor: reels.actionIconBg,\n borderRadius: `${reels.actionIconRadius}px`,\n border: 'none',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"white\" strokeWidth=\"2\">\n <path d=\"M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z\"/>\n </svg>\n </button>\n\n {/* Comment */}\n <button\n style={{\n width: `${reels.actionIconSize}px`,\n height: `${reels.actionIconSize}px`,\n marginLeft: `${reels.actionIconMarginLeft}px`,\n backgroundColor: reels.actionIconBg,\n borderRadius: `${reels.actionIconRadius}px`,\n border: 'none',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"white\" strokeWidth=\"2\">\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\"/>\n </svg>\n </button>\n\n {/* Share */}\n <button\n style={{\n width: `${reels.actionIconSize}px`,\n height: `${reels.actionIconSize}px`,\n marginLeft: `${reels.actionIconMarginLeft}px`,\n backgroundColor: reels.actionIconBg,\n borderRadius: `${reels.actionIconRadius}px`,\n border: 'none',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"white\" strokeWidth=\"2\">\n <path d=\"M4 12v8a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-8\"/>\n <polyline points=\"16 6 12 2 8 6\"/>\n <line x1=\"12\" y1=\"2\" x2=\"12\" y2=\"15\"/>\n </svg>\n </button>\n </div>\n </>\n ) : (\n /* Instagram Reels Layout - Animated */\n <>\n {/* Profile Section - Bottom overlay */}\n <div\n style={{\n position: 'absolute',\n bottom: '12px',\n left: '16px',\n right: '50px',\n zIndex: 10,\n }}\n >\n {/* Profile Image + Page Name + Follow Button */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n marginBottom: '12px',\n }}\n >\n {/* Profile Image */}\n <div\n style={{\n width: `${reels.profileImageSize}px`,\n height: `${reels.profileImageSize}px`,\n borderRadius: reels.profileImageRadius,\n overflow: 'hidden',\n flexShrink: 0,\n border: '2px solid rgba(255, 255, 255, 0.2)',\n }}\n >\n <ProfileAvatar\n src={adData.profileImage}\n name={adData.brandName}\n fontSize={10}\n background=\"linear-gradient(45deg, #f09433 0%, #e6683c 25%, #dc2743 50%, #cc2366 75%, #bc1888 100%)\"\n />\n </div>\n\n {/* Page Name */}\n <span\n style={{\n fontSize: `${reels.pageNameSize}px`,\n fontWeight: 600,\n color: reels.pageNameColor,\n flex: 1,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {adData.brandName}\n </span>\n\n {/* Follow Button */}\n <button\n style={{\n backgroundColor: 'rgb(0, 149, 246)',\n color: 'white',\n fontSize: '12px',\n fontWeight: 600,\n padding: '6px 12px',\n borderRadius: '8px',\n border: 'none',\n cursor: 'pointer',\n flexShrink: 0,\n }}\n >\n Follow\n </button>\n </div>\n\n {/* Animated CTA Section */}\n {instagramFrame === 'expanded' ? (\n /* Frame 2: Expanded CTA Container */\n <div\n style={{\n backgroundColor: 'rgba(38, 38, 38, 0.9)',\n backdropFilter: 'blur(8px)',\n borderRadius: '16px',\n padding: '16px',\n marginBottom: '8px',\n }}\n >\n {/* Thumbnail + Headline */}\n <div\n style={{\n display: 'flex',\n gap: '12px',\n alignItems: 'center',\n marginBottom: '12px',\n }}\n >\n {/* 1:1 Thumbnail */}\n <div\n style={{\n width: '64px',\n height: '64px',\n borderRadius: '8px',\n overflow: 'hidden',\n flexShrink: 0,\n backgroundColor: '#555',\n }}\n >\n {adData.creativeImage ? (\n <CreativeMedia\n src={adData.creativeImage}\n mediaType={adData.creativeMediaType}\n alt=\"Ad preview\"\n autoPlay\n showPlayOverlay={false}\n style={{\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n }}\n />\n ) : (\n <div\n style={{\n width: '100%',\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <div style={{ width: '48px', height: '48px', backgroundColor: '#666', borderRadius: '4px' }} />\n </div>\n )}\n </div>\n\n {/* Headline */}\n <div style={{ flex: 1, minWidth: 0 }}>\n <span\n style={{\n fontSize: '11px',\n fontWeight: 500,\n color: 'white',\n lineHeight: '14px',\n }}\n >\n {adData.headline}\n </span>\n </div>\n </div>\n\n {/* CTA Button */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '100%',\n height: '40px',\n backgroundColor: 'white',\n borderRadius: '8px',\n cursor: 'pointer',\n }}\n >\n <span\n style={{\n fontSize: '14px',\n fontWeight: 600,\n color: 'black',\n }}\n >\n {adData.callToAction || 'Learn more'}\n </span>\n </div>\n </div>\n ) : (\n /* Frame 1: Simple CTA (transparent or solid) */\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '100%',\n height: '36px',\n backgroundColor: instagramFrame === 'transparent' ? 'transparent' : 'white',\n border: instagramFrame === 'transparent' ? '2px solid white' : 'none',\n borderRadius: '8px',\n marginBottom: '8px',\n cursor: 'pointer',\n transition: 'all 0.5s ease',\n }}\n >\n <span\n style={{\n fontSize: '14px',\n fontWeight: 600,\n color: instagramFrame === 'transparent' ? 'white' : 'black',\n }}\n >\n {adData.callToAction || 'Learn more'}\n </span>\n </div>\n )}\n\n {/* Primary Text */}\n <span\n style={{\n display: 'block',\n fontSize: `${reels.primaryTextSize}px`,\n fontWeight: reels.primaryTextWeight,\n lineHeight: reels.primaryTextLineHeight,\n color: reels.primaryTextColor,\n marginBottom: '4px',\n }}\n >\n {truncateText(adData.primaryText || adData.headline, 25)}\n {(adData.primaryText || adData.headline || '').length > 25 && (\n <span style={{ color: 'rgba(255,255,255,0.7)' }}>...more</span>\n )}\n </span>\n\n {/* Ad Tag */}\n <span\n style={{\n fontSize: '12px',\n color: 'rgba(255, 255, 255, 0.7)',\n }}\n >\n Ad\n </span>\n </div>\n\n {/* Right Side Actions - Instagram style, anchored to bottom */}\n <div\n style={{\n position: 'absolute',\n bottom: '12px',\n right: '12px',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: '14px',\n zIndex: 10,\n }}\n >\n {/* Like */}\n <button\n style={{\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n padding: 0,\n }}\n >\n <svg width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"white\" strokeWidth=\"2\">\n <path d=\"M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z\"/>\n </svg>\n </button>\n\n {/* Comment */}\n <button\n style={{\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n padding: 0,\n }}\n >\n <svg width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"white\" strokeWidth=\"2\">\n <path d=\"M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z\"/>\n </svg>\n </button>\n\n {/* Send */}\n <button\n style={{\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n padding: 0,\n }}\n >\n <svg width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"white\" strokeWidth=\"2\">\n <line x1=\"22\" y1=\"2\" x2=\"11\" y2=\"13\"/>\n <polygon points=\"22 2 15 22 11 13 2 9 22 2\"/>\n </svg>\n </button>\n\n {/* More */}\n <button\n style={{\n background: 'none',\n border: 'none',\n cursor: 'pointer',\n padding: 0,\n }}\n >\n <svg width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"white\">\n <circle cx=\"6\" cy=\"12\" r=\"2\" />\n <circle cx=\"12\" cy=\"12\" r=\"2\" />\n <circle cx=\"18\" cy=\"12\" r=\"2\" />\n </svg>\n </button>\n </div>\n </>\n )}\n </div>\n </div>\n );\n};\n\nMetaReelPreview.displayName = 'MetaReelPreview';\n","import React, { useState } from 'react';\nimport { ChevronLeft, MoreHorizontal } from 'lucide-react';\nimport type { PreviewAdData } from './types';\nimport { ProfileAvatar } from './ProfileAvatar';\nimport { CreativeMedia } from './CreativeMedia';\n\ninterface MetaMessengerPreviewProps {\n adData: PreviewAdData;\n}\n\n/**\n * Facebook Messenger Inbox Preview\n * Exact styling extracted from Facebook Creative Hub\n * Reference: creative-spec/references/META_DESIGN_TOKENS.md\n * Source: singleimage-facebook-messenger-inbox.html\n * Container: 250x444px (outer), 375x142px (inner - Ad view)\n */\nexport const MetaMessengerPreview: React.FC<MetaMessengerPreviewProps> = ({\n adData,\n}) => {\n const [view, setView] = useState<'ad' | 'expanded'>('ad');\n\n // Messenger Inbox exact design tokens - extracted from Creative Hub\n const mi = {\n // Outer container\n outerContainerWidth: 250,\n outerContainerHeight: 444,\n outerContainerBg: 'rgba(0, 0, 0, 0.03)',\n outerContainerRadius: 8,\n outerContainerBorder: 'none',\n outerContainerShadow: 'rgba(0, 0, 0, 0.1) 0px 0px 5px 0px, rgba(0, 0, 0, 0.1) 0px 0px 1px 0px',\n fontFamily: 'Roboto, Arial, sans-serif',\n baseColor: 'rgb(28, 30, 33)',\n baseFontSize: 12,\n baseLineHeight: '15.36px',\n\n // Inner container (Ad view)\n innerContainerWidth: 375,\n innerContainerHeight: 142,\n innerContainerBg: 'rgb(255, 255, 255)',\n transformScale: 0.666667,\n\n // Toggle buttons\n toggleContainerWidth: 190,\n toggleContainerHeight: 28,\n toggleMarginTop: 12,\n toggleMarginBottom: 16,\n toggleMarginHorizontal: 92.5,\n\n // Active button\n activeButtonBg: 'rgb(24, 119, 242)',\n activeButtonColor: 'rgb(255, 255, 255)',\n activeButtonBorder: '1px solid rgb(24, 119, 242)',\n\n // Inactive button\n inactiveButtonBg: 'rgb(245, 246, 247)',\n inactiveButtonColor: 'rgb(68, 73, 80)',\n inactiveButtonBorder: '1px solid rgb(218, 221, 225)',\n\n // Button common styles\n buttonFontSize: 12,\n buttonFontWeight: 700,\n buttonLineHeight: '26px',\n buttonHeight: 28,\n adViewButtonWidth: 71.0547,\n expandedViewButtonWidth: 113.445,\n buttonRadius: 2,\n buttonPadding: '0px 11px',\n\n // Divider\n dividerBg: 'rgba(0, 0, 0, 0.1)',\n dividerHeight: 1,\n\n // Content row\n contentRowHeight: 76,\n contentRowPadding: '0px 20px',\n contentRowBg: 'rgb(255, 255, 255)',\n\n // Profile image (large)\n profileSize: 60,\n profileRadius: 30,\n profileMarginTop: 8,\n\n // Text content\n textContentWidth: 191,\n textContentMargin: '10px 12px 8px',\n\n // Brand name row\n brandNameHeight: 20,\n brandNameWidth: 191,\n brandNameMaxWidth: 169,\n brandNameFontSize: 17,\n brandNameFontWeight: 600,\n brandNameLineHeight: '20px',\n brandNameColor: 'rgb(0, 0, 0)',\n\n // Ad badge\n adBadgeBg: 'rgb(218, 220, 222)',\n adBadgeHeight: 17,\n adBadgeWidth: 20.1641,\n adBadgeRadius: 4,\n adBadgeMargin: '2px 0px 1px 4px',\n adBadgeTextSize: 10,\n adBadgeTextColor: 'rgb(255, 255, 255)',\n adBadgeTextLineHeight: '16px',\n\n // Description text\n descriptionSize: 14,\n descriptionWeight: 400,\n descriptionLineHeight: '18px',\n descriptionColor: 'rgba(0, 0, 0, 0.5)',\n descriptionMaxHeight: 18,\n\n // View more link\n viewMoreColor: 'rgb(31, 135, 255)',\n viewMoreSize: 14,\n viewMoreLineHeight: '18px',\n\n // Thumbnail image (right side)\n thumbnailSize: 60,\n thumbnailRadius: 12,\n thumbnailMargin: '8px 0px',\n thumbnailShadow: 'rgba(0, 0, 0, 0.2) 0px 0px 0px 0.666667px',\n };\n\n // Truncate text helper\n const truncateText = (text: string, limit: number) => {\n if (!text || text.length <= limit) return text;\n return text.substring(0, limit);\n };\n\n return (\n <div\n className=\"meta-preview\"\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '100%',\n height: '100%',\n fontFamily: mi.fontFamily,\n fontSize: `${mi.baseFontSize}px`,\n color: mi.baseColor,\n lineHeight: mi.baseLineHeight,\n }}\n >\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: view === 'expanded' ? 'flex-start' : 'center',\n width: `${mi.outerContainerWidth}px`, maxWidth: '100%',\n height: view === 'expanded' ? '540px' : `${mi.outerContainerHeight}px`,\n backgroundColor: mi.outerContainerBg,\n borderRadius: `${mi.outerContainerRadius}px`,\n boxShadow: mi.outerContainerShadow,\n overflow: 'hidden',\n }}\n >\n {/* Inner container with transform scale */}\n <div\n style={{\n width: `${mi.innerContainerWidth}px`,\n height: view === 'expanded' ? 'auto' : `${mi.innerContainerHeight}px`,\n transform: `matrix(${mi.transformScale}, 0, 0, ${mi.transformScale}, 0, 0)`,\n transformOrigin: view === 'expanded' ? 'top center' : 'center center',\n }}\n >\n <div\n style={{\n display: 'flex',\n flexDirection: 'row',\n width: `${mi.innerContainerWidth}px`,\n height: `${mi.innerContainerHeight}px`,\n backgroundColor: mi.innerContainerBg,\n }}\n >\n <div\n data-ad-preview=\"previewContainer\"\n style={{\n width: `${mi.innerContainerWidth}px`,\n height: `${mi.innerContainerHeight}px`,\n }}\n >\n <div\n style={{\n width: `${mi.innerContainerWidth}px`,\n height: '122px',\n }}\n >\n <div\n style={{\n margin: `${mi.toggleMarginTop}px 0px 8px`,\n width: `${mi.innerContainerWidth}px`,\n }}\n >\n {/* Toggle Buttons */}\n <div\n style={{\n display: 'block',\n alignItems: 'center',\n width: `${mi.toggleContainerWidth}px`,\n height: `${mi.toggleContainerHeight}px`,\n margin: `0px ${mi.toggleMarginHorizontal}px ${mi.toggleMarginBottom}px`,\n }}\n >\n <div style={{ transform: 'matrix(1, 0, 0, 1, 0, 0)' }}>\n {/* Ad View Button */}\n <button\n type=\"button\"\n onClick={() => setView('ad')}\n style={{\n display: 'inline-block',\n position: 'relative',\n width: `${mi.adViewButtonWidth}px`,\n height: `${mi.buttonHeight}px`,\n maxWidth: '242px',\n padding: mi.buttonPadding,\n backgroundColor: view === 'ad' ? mi.activeButtonBg : mi.inactiveButtonBg,\n color: view === 'ad' ? mi.activeButtonColor : mi.inactiveButtonColor,\n fontFamily: '-apple-system, system-ui, \"system-ui\", Arial, sans-serif',\n fontSize: `${mi.buttonFontSize}px`,\n fontWeight: mi.buttonFontWeight,\n lineHeight: mi.buttonLineHeight,\n textAlign: 'center',\n border: view === 'ad' ? mi.activeButtonBorder : mi.inactiveButtonBorder,\n borderRadius: `${mi.buttonRadius}px 0px 0px ${mi.buttonRadius}px`,\n cursor: 'pointer',\n }}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: '26px',\n }}\n >\n <div\n style={{\n textOverflow: 'ellipsis',\n overflow: 'hidden',\n }}\n >\n Ad view\n </div>\n </div>\n </button>\n\n {/* Expanded View Button */}\n <button\n type=\"button\"\n onClick={() => setView('expanded')}\n style={{\n display: 'inline-block',\n position: 'relative',\n width: `${mi.expandedViewButtonWidth}px`,\n height: `${mi.buttonHeight}px`,\n maxWidth: '242px',\n padding: mi.buttonPadding,\n backgroundColor: view === 'expanded' ? mi.activeButtonBg : mi.inactiveButtonBg,\n color: view === 'expanded' ? mi.activeButtonColor : mi.inactiveButtonColor,\n fontFamily: '-apple-system, system-ui, \"system-ui\", Arial, sans-serif',\n fontSize: `${mi.buttonFontSize}px`,\n fontWeight: mi.buttonFontWeight,\n lineHeight: mi.buttonLineHeight,\n textAlign: 'center',\n borderRadius: `0px ${mi.buttonRadius}px ${mi.buttonRadius}px 0px`,\n borderWidth: '1px 1px 1px 0px',\n borderStyle: 'solid',\n borderColor: view === 'expanded' ? 'rgb(24, 119, 242)' : 'rgb(218, 221, 225)',\n cursor: 'pointer',\n }}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: '26px',\n }}\n >\n <div\n style={{\n textOverflow: 'ellipsis',\n overflow: 'hidden',\n }}\n >\n Expanded view\n </div>\n </div>\n </button>\n </div>\n </div>\n\n {view === 'ad' ? (\n // Ad View\n <div>\n {/* Top divider */}\n <hr\n style={{\n width: `${mi.innerContainerWidth}px`,\n height: `${mi.dividerHeight}px`,\n backgroundColor: mi.dividerBg,\n border: '0px inset',\n margin: 0,\n }}\n />\n\n {/* Main content row */}\n <div\n style={{\n display: 'flex',\n flexDirection: 'row',\n width: '335px',\n height: `${mi.contentRowHeight}px`,\n padding: mi.contentRowPadding,\n backgroundColor: mi.contentRowBg,\n overflow: 'hidden',\n }}\n >\n {/* Profile Image */}\n <div style={{ width: `${mi.profileSize}px`, height: `${mi.contentRowHeight}px` }}>\n <ProfileAvatar\n src={adData.profileImage}\n name={adData.brandName}\n fontSize={18}\n background={mi.adBadgeBg}\n style={{\n width: `${mi.profileSize}px`,\n height: `${mi.profileSize}px`,\n marginTop: `${mi.profileMarginTop}px`,\n borderRadius: `${mi.profileRadius}px`,\n }}\n />\n </div>\n\n {/* Text Content */}\n <div\n style={{\n width: `${mi.textContentWidth}px`,\n height: '58px',\n margin: mi.textContentMargin,\n overflow: 'hidden',\n }}\n >\n {/* Brand Name and Ad Badge */}\n <div\n style={{\n display: 'flex',\n flexDirection: 'row',\n height: `${mi.brandNameHeight}px`,\n maxWidth: `${mi.textContentWidth}px`,\n }}\n >\n <h2\n style={{\n width: `${mi.brandNameMaxWidth}px`,\n maxWidth: `${mi.brandNameMaxWidth}px`,\n height: '19px',\n padding: '1px 0px 0px',\n fontSize: `${mi.brandNameFontSize}px`,\n fontWeight: mi.brandNameFontWeight,\n lineHeight: mi.brandNameLineHeight,\n color: mi.brandNameColor,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n margin: 0,\n }}\n >\n {truncateText(adData.brandName, 25)}\n </h2>\n <div\n style={{\n width: `${mi.adBadgeWidth}px`,\n height: `${mi.adBadgeHeight}px`,\n margin: mi.adBadgeMargin,\n backgroundColor: mi.adBadgeBg,\n borderRadius: `${mi.adBadgeRadius}px`,\n }}\n >\n <div\n style={{\n width: '12.1641px',\n height: '16px',\n margin: '1px 4px 0px',\n fontSize: `${mi.adBadgeTextSize}px`,\n fontWeight: 400,\n lineHeight: mi.adBadgeTextLineHeight,\n color: mi.adBadgeTextColor,\n textAlign: 'center',\n }}\n >\n Ad\n </div>\n </div>\n </div>\n\n {/* Description */}\n <p\n style={{\n width: `${mi.textContentWidth}px`,\n maxWidth: `${mi.textContentWidth}px`,\n height: '18px',\n maxHeight: `${mi.descriptionMaxHeight}px`,\n padding: '1px 0px 0px',\n fontSize: `${mi.descriptionSize}px`,\n fontWeight: mi.descriptionWeight,\n lineHeight: mi.descriptionLineHeight,\n color: mi.descriptionColor,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n margin: 0,\n }}\n >\n {truncateText(adData.description || adData.primaryText || '', 60)}\n </p>\n\n {/* View more link */}\n <div\n style={{\n width: `${mi.textContentWidth}px`,\n height: '18px',\n fontSize: `${mi.viewMoreSize}px`,\n fontWeight: 400,\n lineHeight: mi.viewMoreLineHeight,\n color: mi.viewMoreColor,\n }}\n >\n View more\n </div>\n </div>\n\n {/* Thumbnail Image */}\n <div\n style={{\n display: 'flex',\n position: 'relative',\n width: `${mi.thumbnailSize}px`,\n height: `${mi.thumbnailSize}px`,\n margin: mi.thumbnailMargin,\n }}\n >\n {adData.creativeImage ? (\n <CreativeMedia\n src={adData.creativeImage}\n mediaType={adData.creativeMediaType}\n alt=\"Ad creative\"\n style={{\n position: 'relative',\n zIndex: 1,\n width: `${mi.thumbnailSize}px`,\n height: `${mi.thumbnailSize}px`,\n objectFit: 'cover',\n borderRadius: `${mi.thumbnailRadius}px`,\n boxShadow: mi.thumbnailShadow,\n display: 'block',\n }}\n />\n ) : (\n <div\n style={{\n width: `${mi.thumbnailSize}px`,\n height: `${mi.thumbnailSize}px`,\n backgroundColor: mi.adBadgeBg,\n borderRadius: `${mi.thumbnailRadius}px`,\n }}\n />\n )}\n </div>\n </div>\n\n {/* Bottom divider */}\n <hr\n style={{\n width: `${mi.innerContainerWidth}px`,\n height: `${mi.dividerHeight}px`,\n backgroundColor: mi.dividerBg,\n border: '0px inset',\n margin: 0,\n }}\n />\n </div>\n ) : (\n // Expanded View (simplified - would need more reference HTML)\n <div>\n {/* Top divider */}\n <hr\n style={{\n width: `${mi.innerContainerWidth}px`,\n height: `${mi.dividerHeight}px`,\n backgroundColor: mi.dividerBg,\n border: '0px inset',\n margin: 0,\n }}\n />\n\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n maxHeight: '720px',\n paddingTop: '12px',\n paddingBottom: '10px',\n }}\n >\n {/* Header with back button, profile, and menu */}\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n width: `${mi.innerContainerWidth}px`,\n }}\n >\n <div\n style={{\n display: 'flex',\n height: '72px',\n marginLeft: '20px',\n marginRight: '8px',\n marginTop: '16px',\n width: `${mi.innerContainerWidth}px`,\n }}\n >\n <ChevronLeft\n style={{\n height: '24px',\n width: '24px',\n color: mi.baseColor,\n }}\n />\n <ProfileAvatar\n src={adData.profileImage}\n name={adData.brandName}\n fontSize={18}\n background={mi.adBadgeBg}\n style={{\n height: '60px',\n width: '60px',\n marginLeft: '114px',\n marginRight: '114px',\n marginTop: '-8px',\n marginBottom: '12px',\n borderRadius: '30px',\n }}\n />\n <MoreHorizontal\n style={{\n height: '24px',\n width: '24px',\n color: mi.baseColor,\n }}\n />\n </div>\n\n {/* Brand Name and Ad Badge */}\n <div\n style={{\n display: 'flex',\n height: '20px',\n maxWidth: '344px',\n marginLeft: '92px',\n marginRight: '92px',\n justifyContent: 'center',\n }}\n >\n <div\n style={{\n fontSize: '18px',\n fontWeight: 700,\n height: '20px',\n lineHeight: '20px',\n overflow: 'hidden',\n textAlign: 'center',\n textOverflow: 'ellipsis',\n }}\n >\n {truncateText(adData.brandName, 25)}\n </div>\n <div\n style={{\n height: '16px',\n width: '24px',\n marginLeft: '6px',\n marginTop: '2px',\n marginBottom: '4px',\n borderRadius: '4px',\n backgroundColor: mi.adBadgeBg,\n }}\n >\n <div\n style={{\n color: 'rgb(255, 255, 255)',\n fontSize: '10px',\n height: '18px',\n marginLeft: '4px',\n marginRight: '4px',\n marginTop: '2px',\n textAlign: 'center',\n width: '16px',\n }}\n >\n Ad\n </div>\n </div>\n </div>\n\n {/* Like count */}\n <div\n style={{\n color: mi.descriptionColor,\n fontSize: '16px',\n height: '20px',\n lineHeight: '20px',\n marginLeft: '66px',\n marginRight: '66px',\n marginTop: '2px',\n maxWidth: '344px',\n overflow: 'hidden',\n textAlign: 'center',\n }}\n >\n 615 people like {adData.brandName}\n </div>\n </div>\n\n {/* Primary Text */}\n <div\n style={{\n fontSize: '18px',\n lineHeight: '22px',\n marginLeft: '16px',\n marginRight: '16px',\n marginTop: '8px',\n maxHeight: '66px',\n overflow: 'hidden',\n WebkitLineClamp: 3,\n }}\n >\n {adData.primaryText}\n </div>\n\n {/* Image and Card */}\n <div\n style={{\n display: 'flex',\n marginLeft: '16px',\n marginRight: '16px',\n marginTop: '12px',\n width: '344px',\n }}\n >\n <div style={{ width: '344px' }}>\n {/* Creative Image */}\n {adData.creativeImage ? (\n <CreativeMedia\n src={adData.creativeImage}\n mediaType={adData.creativeMediaType}\n alt=\"Ad creative\"\n style={{\n borderTopLeftRadius: '18px',\n borderTopRightRadius: '18px',\n height: '344px',\n width: '344px',\n objectFit: 'cover',\n }}\n />\n ) : (\n <div\n style={{\n borderTopLeftRadius: '18px',\n borderTopRightRadius: '18px',\n height: '344px',\n width: '344px',\n backgroundColor: mi.adBadgeBg,\n }}\n />\n )}\n\n {/* Card with CTA */}\n <div\n style={{\n backgroundColor: 'rgba(0, 0, 0, 0.05)',\n borderBottomLeftRadius: '18px',\n borderBottomRightRadius: '18px',\n display: 'flex',\n flexDirection: 'column',\n marginTop: '-4px',\n width: '344px',\n }}\n >\n <div style={{ width: '344px' }}>\n {/* Headline */}\n <div\n style={{\n fontSize: '18px',\n fontWeight: 700,\n lineHeight: '22px',\n marginLeft: '16px',\n marginRight: '16px',\n marginTop: '12px',\n maxHeight: '22px',\n overflow: 'hidden',\n WebkitLineClamp: 1,\n }}\n >\n {truncateText(adData.headline || '', 30)}\n </div>\n\n {/* Description */}\n <div\n style={{\n color: mi.descriptionColor,\n fontSize: '16px',\n lineHeight: '20px',\n marginLeft: '16px',\n marginRight: '16px',\n marginTop: '4px',\n maxHeight: '20px',\n overflow: 'hidden',\n WebkitLineClamp: 1,\n }}\n >\n {truncateText(adData.description || '', 40)}\n </div>\n\n {/* Display Link */}\n <div\n style={{\n color: mi.descriptionColor,\n fontSize: '16px',\n lineHeight: '20px',\n marginLeft: '16px',\n marginRight: '16px',\n maxHeight: '20px',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n WebkitLineClamp: 1,\n }}\n >\n {adData.displayLink}\n </div>\n </div>\n\n {/* CTA Button */}\n <div\n style={{\n backgroundColor: 'rgb(10, 124, 255)',\n borderRadius: '12px',\n margin: '12px',\n padding: '8px',\n textAlign: 'center',\n }}\n >\n <div\n style={{\n color: 'rgb(255, 255, 255)',\n height: '20px',\n lineHeight: '20px',\n }}\n >\n {adData.callToAction}\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n {/* Bottom divider */}\n <hr\n style={{\n width: `${mi.innerContainerWidth}px`,\n height: `${mi.dividerHeight}px`,\n backgroundColor: mi.dividerBg,\n border: '0px inset',\n margin: 0,\n }}\n />\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nMetaMessengerPreview.displayName = 'MetaMessengerPreview';\n","import React from 'react';\nimport type { PreviewAdData } from './types';\nimport { CreativeMedia } from './CreativeMedia';\n\ninterface MetaRightColumnPreviewProps {\n adData: PreviewAdData;\n}\n\n/**\n * Facebook Desktop Right Column Preview\n * Exact styling extracted from Facebook Creative Hub\n * Reference: creative-spec/references/META_DESIGN_TOKENS.md\n * Source: desktop-right-column.html extraction\n * Container: 375x206px\n */\nexport const MetaRightColumnPreview: React.FC<MetaRightColumnPreviewProps> = ({\n adData,\n}) => {\n // Facebook Right Column exact design tokens - extracted from Creative Hub\n const rc = {\n // Container\n containerWidth: 375,\n containerHeight: 206.648,\n containerBg: 'rgb(255, 255, 255)',\n fontFamily: 'system-ui, -apple-system, \"system-ui\", \".SFNSText-Regular\", sans-serif',\n baseColor: 'rgb(28, 30, 33)',\n baseFontSize: 12,\n baseLineHeight: '16.08px',\n\n // Inner card\n cardWidth: 343,\n cardHeight: 190.648,\n cardMargin: '0px 8px',\n cardPadding: '8px',\n cardRadius: 6,\n\n // Image\n imageWidth: 188.648,\n imageHeight: 188.648,\n imageMinHeight: 1,\n imageMaxHeight: 205,\n imageBorder: '1px solid rgba(0, 0, 0, 0.1)',\n imageRadius: 8,\n\n // Content section\n contentWidth: 142.352,\n contentPaddingLeft: 12,\n\n // Headline\n headlineSize: 15,\n headlineWeight: 500,\n headlineColor: 'rgb(8, 8, 9)',\n headlineLineHeight: '19.64px',\n headlineHeight: 39.28,\n\n // Display Link\n displayLinkSize: 13,\n displayLinkWeight: 400,\n displayLinkColor: 'rgb(101, 104, 108)',\n displayLinkLineHeight: '18.22px',\n };\n\n return (\n <div\n className=\"meta-preview\"\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '100%',\n height: '100%',\n fontFamily: rc.fontFamily,\n fontSize: `${rc.baseFontSize}px`,\n color: rc.baseColor,\n lineHeight: rc.baseLineHeight,\n }}\n >\n <div\n style={{\n width: `${rc.containerWidth}px`, maxWidth: '100%',\n height: `${rc.containerHeight}px`,\n backgroundColor: rc.containerBg,\n overflow: 'visible',\n }}\n >\n {/* Inner Card */}\n <div\n style={{\n display: 'flex',\n flexDirection: 'row',\n width: `${rc.cardWidth}px`,\n height: `${rc.cardHeight}px`,\n margin: rc.cardMargin,\n padding: rc.cardPadding,\n borderRadius: `${rc.cardRadius}px`,\n cursor: 'pointer',\n }}\n >\n {/* Content wrapper */}\n <div\n style={{\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n width: `${rc.cardWidth}px`,\n height: `${rc.cardHeight}px`,\n }}\n >\n {/* Image - 188.648x188.648px with 8px radius */}\n <div\n style={{\n width: `${rc.imageWidth}px`,\n height: `${rc.imageHeight}px`,\n flexShrink: 0,\n }}\n >\n {adData.creativeImage ? (\n <CreativeMedia\n src={adData.creativeImage}\n mediaType={adData.creativeMediaType}\n alt={adData.headline || 'Ad'}\n style={{\n width: `${rc.imageWidth}px`,\n height: `${rc.imageHeight}px`,\n minHeight: `${rc.imageMinHeight}px`,\n maxHeight: `${rc.imageMaxHeight}px`,\n border: rc.imageBorder,\n borderRadius: `${rc.imageRadius}px`,\n objectFit: 'cover',\n display: 'block',\n overflow: 'clip',\n }}\n />\n ) : (\n <div\n style={{\n width: `${rc.imageWidth}px`,\n height: `${rc.imageHeight}px`,\n minHeight: `${rc.imageMinHeight}px`,\n maxHeight: `${rc.imageMaxHeight}px`,\n border: rc.imageBorder,\n borderRadius: `${rc.imageRadius}px`,\n backgroundColor: 'var(--color-surface-100)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <div style={{ textAlign: 'center', color: rc.displayLinkColor }}>\n <div\n style={{\n width: '48px',\n height: '48px',\n backgroundColor: 'var(--color-surface-200)',\n borderRadius: '8px',\n margin: '0 auto 8px',\n }}\n />\n <p style={{ fontSize: '12px', margin: 0 }}>1:1</p>\n </div>\n </div>\n )}\n </div>\n\n {/* Text Content */}\n <div\n style={{\n width: `${rc.contentWidth}px`,\n paddingLeft: `${rc.contentPaddingLeft}px`,\n }}\n >\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n margin: '-5px 0px',\n }}\n >\n {/* Headline - font-size: 15px, font-weight: 500, color: rgb(8, 8, 9) */}\n <div\n style={{\n margin: '5px 0px',\n }}\n >\n <span\n style={{\n display: 'block',\n width: `${rc.contentWidth}px`,\n maxWidth: '100%',\n fontSize: `${rc.headlineSize}px`,\n fontWeight: rc.headlineWeight,\n lineHeight: rc.headlineLineHeight,\n color: rc.headlineColor,\n overflow: 'hidden',\n textOverflow: 'clip',\n }}\n >\n <span\n style={{\n display: '-webkit-box',\n WebkitLineClamp: 2,\n WebkitBoxOrient: 'vertical',\n overflow: 'hidden',\n maxWidth: '100%',\n }}\n >\n {adData.headline}\n </span>\n </span>\n </div>\n\n {/* Display Link - font-size: 13px, color: rgb(101, 104, 108) */}\n <div\n style={{\n margin: '5px 0px',\n }}\n >\n <span\n style={{\n display: 'block',\n width: `${rc.contentWidth}px`,\n maxWidth: '100%',\n fontSize: `${rc.displayLinkSize}px`,\n fontWeight: rc.displayLinkWeight,\n lineHeight: rc.displayLinkLineHeight,\n color: rc.displayLinkColor,\n textTransform: 'lowercase',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {adData.displayLink}\n </span>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nMetaRightColumnPreview.displayName = 'MetaRightColumnPreview';\n","import React from 'react';\nimport { MoreHorizontal } from 'lucide-react';\nimport type { PreviewAdData } from './types';\nimport { ProfileAvatar } from './ProfileAvatar';\n\ninterface MetaSearchPreviewProps {\n adData: PreviewAdData;\n}\n\nexport const MetaSearchPreview: React.FC<MetaSearchPreviewProps> = ({\n adData,\n}) => {\n // Truncate text helper\n const truncateText = (text: string, limit: number) => {\n if (!text || text.length <= limit) return text;\n return text.substring(0, limit);\n };\n\n return (\n <div className=\"meta-preview w-full h-full\">\n <div\n className=\"flex items-center justify-center bg-gray-100 rounded-xl w-full h-full\"\n style={{\n padding: '24px',\n }}\n >\n <div className=\"bg-white rounded-lg overflow-hidden w-full max-w-[300px]\">\n {/* Image Section - Square 1:1 */}\n <div style={{ width: '100%', position: 'relative', paddingBottom: '100%' }}>\n {adData.creativeImage ? (\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n backgroundImage: `url(\"${adData.creativeImage}\")`,\n backgroundSize: 'cover',\n backgroundPosition: 'center',\n }}\n />\n ) : (\n <div\n className=\"flex items-center justify-center bg-gray-100\"\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n }}\n >\n <div className=\"text-center text-gray-400\">\n <div className=\"w-16 h-16 bg-gray-200 rounded-lg mx-auto mb-2\" />\n <p className=\"text-sm\">1:1 Image</p>\n </div>\n </div>\n )}\n </div>\n\n {/* Content Section */}\n <div className=\"p-4\">\n {/* Profile Section */}\n <div className=\"flex items-start gap-2 mb-2\">\n {/* Profile Image */}\n <div\n className=\"flex-shrink-0 rounded-full border overflow-hidden\"\n style={{\n width: '20px',\n height: '20px',\n borderColor: 'rgb(235, 237, 240)',\n }}\n >\n <ProfileAvatar src={adData.profileImage} name={adData.brandName} fontSize={10} />\n </div>\n\n {/* Brand Name */}\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-gray-900 truncate\">\n {truncateText(adData.brandName, 30)}\n </p>\n </div>\n\n {/* Ellipsis Button */}\n <button className=\"flex-shrink-0\">\n <MoreHorizontal className=\"w-5 h-5 text-gray-600\" />\n </button>\n </div>\n\n {/* Headline */}\n <h3\n className=\"font-medium mb-2 overflow-hidden\"\n style={{\n color: 'var(--color-meta-blue)',\n fontSize: '15px',\n lineHeight: '20px',\n display: '-webkit-box',\n WebkitLineClamp: 2,\n WebkitBoxOrient: 'vertical',\n }}\n >\n {adData.headline}\n </h3>\n\n {/* Sponsored Tag */}\n <p className=\"text-xs text-gray-500\">Sponsored</p>\n </div>\n </div>\n </div>\n </div>\n );\n};\n","import React from 'react';\nimport { ThumbsUp, MessageCircle, Share2, MoreHorizontal, X } from 'lucide-react';\nimport { CreativeMedia } from './CreativeMedia';\nimport type { PreviewAdData } from './types';\n\ninterface MetaInstreamPreviewProps {\n adData: PreviewAdData;\n}\n\nexport const MetaInstreamPreview: React.FC<MetaInstreamPreviewProps> = ({\n adData,\n}) => {\n // Truncate text helper\n const truncateText = (text: string, limit: number) => {\n if (!text || text.length <= limit) return text;\n return text.substring(0, limit);\n };\n\n return (\n <div className=\"meta-preview w-full h-full\">\n <div\n className=\"bg-white rounded-md overflow-hidden w-full h-full flex flex-col\"\n style={{}}\n >\n {/* Skeleton Header */}\n <div className=\"p-3 flex items-center gap-2.5\">\n <div className=\"w-10 h-10 rounded-full bg-gray-200 animate-pulse flex-shrink-0\" />\n <div className=\"flex-1 min-w-0\">\n <div className=\"h-3 bg-gray-200 rounded w-32 mb-2 animate-pulse\" />\n <div className=\"h-2 bg-gray-200 rounded w-24 animate-pulse\" />\n </div>\n <button className=\"w-8 h-8 flex items-center justify-center text-gray-400\">\n <MoreHorizontal className=\"w-5 h-5\" />\n </button>\n </div>\n\n {/* Main Video/Image Creative - Square 1:1 */}\n <div className=\"relative w-full\" style={{ paddingBottom: '100%' }}>\n {adData.creativeImage ? (\n <CreativeMedia\n src={adData.creativeImage}\n mediaType={adData.creativeMediaType}\n alt=\"In-stream ad\"\n className=\"absolute inset-0 w-full h-full object-cover\"\n autoPlay\n />\n ) : (\n <div className=\"absolute inset-0 bg-gray-100 flex items-center justify-center\">\n <div className=\"text-center text-gray-400\">\n <div className=\"w-16 h-16 bg-gray-200 rounded-lg mx-auto mb-2\" />\n <p className=\"text-sm\">1:1 Video</p>\n </div>\n </div>\n )}\n </div>\n\n {/* Thumbnail Section */}\n <div className=\"p-3 border-t border-gray-200\">\n <div className=\"flex gap-3\">\n {/* Thumbnail */}\n <div className=\"w-24 h-24 flex-shrink-0 rounded-lg overflow-hidden bg-gray-100\">\n {adData.creativeImage ? (\n <CreativeMedia\n src={adData.creativeImage}\n mediaType={adData.creativeMediaType}\n alt=\"Thumbnail\"\n className=\"w-full h-full object-cover\"\n showPlayOverlay={false}\n />\n ) : (\n <div className=\"w-full h-full bg-gray-200\" />\n )}\n </div>\n\n {/* Ad Content */}\n <div className=\"flex-1 min-w-0\">\n {/* Headline */}\n <h3 className=\"font-semibold text-sm text-gray-900 mb-1 line-clamp-2\">\n {truncateText(adData.headline, 60)}...\n </h3>\n\n {/* Sponsored + Display Link */}\n <div className=\"flex items-center gap-1 text-xs text-gray-500 mb-1\">\n <span>Sponsored</span>\n <span>·</span>\n <span className=\"truncate\">{adData.displayLink}</span>\n </div>\n\n {/* Primary Text - truncated */}\n <p className=\"text-xs text-gray-600 line-clamp-2\">\n {truncateText(adData.primaryText, 80)}...\n </p>\n </div>\n\n {/* X and Ellipsis buttons */}\n <div className=\"flex flex-col gap-1 flex-shrink-0\">\n <button className=\"w-6 h-6 flex items-center justify-center text-gray-400 hover:text-gray-600\">\n <X className=\"w-4 h-4\" />\n </button>\n <button className=\"w-6 h-6 flex items-center justify-center text-gray-400 hover:text-gray-600\">\n <MoreHorizontal className=\"w-4 h-4\" />\n </button>\n </div>\n </div>\n </div>\n\n {/* Skeleton engagement section */}\n <div className=\"px-3 py-2 border-t border-gray-200\">\n <div className=\"flex items-center gap-4\">\n <div className=\"h-2 bg-gray-200 rounded w-16 animate-pulse\" />\n <div className=\"h-2 bg-gray-200 rounded w-20 animate-pulse\" />\n </div>\n </div>\n\n {/* Action Buttons */}\n <div className=\"px-3 py-2 border-t border-gray-200\">\n <div className=\"flex items-center justify-around\">\n <button className=\"flex items-center gap-2 px-4 py-2 text-gray-600 hover:bg-gray-50 rounded-md transition-colors\">\n <ThumbsUp className=\"w-5 h-5\" />\n <span className=\"text-sm font-medium\">Like</span>\n </button>\n <button className=\"flex items-center gap-2 px-4 py-2 text-gray-600 hover:bg-gray-50 rounded-md transition-colors\">\n <MessageCircle className=\"w-5 h-5\" />\n <span className=\"text-sm font-medium\">Comment</span>\n </button>\n <button className=\"flex items-center gap-2 px-4 py-2 text-gray-600 hover:bg-gray-50 rounded-md transition-colors\">\n <Share2 className=\"w-5 h-5\" />\n <span className=\"text-sm font-medium\">Share</span>\n </button>\n </div>\n </div>\n </div>\n </div>\n );\n};\n","import { memo, useState } from 'react'\nimport type { PreviewAdData } from './types'\nimport { CreativeMedia } from './CreativeMedia'\nimport { ProfileAvatar } from './ProfileAvatar'\nimport { withPreviewDefaults } from './defaults'\n\n/**\n * Instagram Feed — single image (sponsored). GREENFIELD rebuild.\n *\n * Not the Creative-Hub export extraction. Faithful to the real IG sponsored-post\n * chrome but built cleanly: a 320px card with natural full-width flow (no fixed\n * 300px inner rows, no empty placeholder divs), Meta-exact hex (self-contained —\n * no design tokens), and a system font stack. Layout, top → bottom:\n * header · creative · CTA bar · action row · caption\n */\n\ninterface InstagramFeedPreviewProps {\n adData: PreviewAdData\n format: '1:1' | '4:5' | '9:16'\n}\n\nconst WIDTH = 320\nconst FONT =\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif'\n\nconst C = {\n ink: 'rgb(38, 38, 38)',\n sub: 'rgb(115, 115, 115)',\n hair: 'rgb(239, 239, 239)',\n imageBg: '#FAFAFA',\n}\n\n// The IG story-ring gradient — used as the avatar letter-fallback fill.\nconst IG_RING =\n 'linear-gradient(45deg, #f09433 0%, #e6683c 25%, #dc2743 50%, #cc2366 75%, #bc1888 100%)'\n\n// Illustrative placeholder engagement — these previews are mockups, not live\n// data (PreviewAdData carries no likes/comments/timestamp). Static on purpose.\nconst LIKES = '234'\nconst COMMENTS = 12\nconst POSTED = '2 hours ago'\n\nexport const InstagramFeedPreview = memo(function InstagramFeedPreview({\n adData: rawAdData,\n format,\n}: InstagramFeedPreviewProps) {\n const adData = withPreviewDefaults(rawAdData)\n const [expanded, setExpanded] = useState(false)\n\n const imageHeight = format === '4:5' ? 400 : WIDTH // 1:1 → 320, 4:5 → 400\n const caption = adData.primaryText ?? ''\n const handle = adData.brandName.trim().toLowerCase().replace(/\\s+/g, '')\n const LIMIT = 100\n const clipped = caption.length > LIMIT && !expanded\n\n return (\n <div style={{ width: WIDTH, background: '#fff', fontFamily: FONT, color: C.ink }}>\n {/* Header */}\n <div style={{ display: 'flex', alignItems: 'center', gap: 10, padding: '9px 12px' }}>\n <div style={{ width: 30, height: 30, borderRadius: '50%', overflow: 'hidden', flexShrink: 0 }}>\n <ProfileAvatar src={adData.profileImage} name={adData.brandName} fontSize={12} background={IG_RING} />\n </div>\n <div style={{ flex: 1, minWidth: 0 }}>\n <div\n style={{\n fontSize: 13,\n fontWeight: 600,\n lineHeight: '16px',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {adData.brandName}\n </div>\n <div style={{ fontSize: 12, lineHeight: '15px', color: C.sub }}>Sponsored</div>\n </div>\n <Dots />\n </div>\n\n {/* Creative */}\n <div style={{ width: WIDTH, height: imageHeight, background: C.imageBg, overflow: 'hidden' }}>\n {adData.creativeImage ? (\n <CreativeMedia\n src={adData.creativeImage}\n mediaType={adData.creativeMediaType}\n alt=\"\"\n style={{ width: WIDTH, height: imageHeight, objectFit: 'cover', display: 'block' }}\n />\n ) : (\n <Placeholder format={format} />\n )}\n </div>\n\n {/* CTA bar — full-width tappable sponsored action */}\n <button\n type=\"button\"\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n width: '100%',\n padding: '11px 14px',\n border: 0,\n borderBottom: `1px solid ${C.hair}`,\n background: 'none',\n cursor: 'pointer',\n font: 'inherit',\n textAlign: 'left',\n }}\n >\n <span style={{ fontSize: 14, fontWeight: 600, color: C.ink }}>\n {adData.callToAction || 'Learn more'}\n </span>\n <Chevron />\n </button>\n\n {/* Action row */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '9px 12px 5px',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: 16 }}>\n <Heart />\n <CommentBubble />\n <Send />\n </div>\n <Bookmark />\n </div>\n\n {/* Likes */}\n <div style={{ padding: '0 12px', fontSize: 13, fontWeight: 600, color: C.ink, lineHeight: '18px' }}>\n {LIKES} likes\n </div>\n\n {/* Caption — bold handle prefix + post text (darker + a touch heavier) */}\n {caption && (\n <div style={{ padding: '3px 12px 0', fontSize: 13, lineHeight: '18px', fontWeight: 400, color: 'rgb(20, 20, 20)' }}>\n <span style={{ fontWeight: 600 }}>{handle}</span>{' '}\n {clipped ? caption.slice(0, LIMIT).trimEnd() : caption}\n {clipped && (\n <button\n type=\"button\"\n onClick={() => setExpanded(true)}\n style={{\n border: 0,\n background: 'none',\n padding: 0,\n marginLeft: 4,\n color: C.sub,\n fontWeight: 400,\n fontSize: 13,\n cursor: 'pointer',\n fontFamily: FONT,\n }}\n >\n more\n </button>\n )}\n </div>\n )}\n\n {/* Comments */}\n <div style={{ padding: '5px 12px 0', fontSize: 13, color: C.sub }}>\n View all {COMMENTS} comments\n </div>\n\n {/* Timestamp */}\n <div style={{ padding: '4px 12px 12px', fontSize: 11, color: C.sub }}>\n {POSTED}\n </div>\n </div>\n )\n})\n\n/* ------------------------------- icons / bits ------------------------------- */\n\nconst stroke = {\n fill: 'none',\n stroke: 'rgb(38, 38, 38)',\n strokeWidth: 1.8,\n strokeLinecap: 'round' as const,\n strokeLinejoin: 'round' as const,\n}\n\nfunction Dots() {\n return (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"rgb(38,38,38)\" style={{ display: 'block', flexShrink: 0 }}>\n <circle cx=\"5\" cy=\"12\" r=\"1.4\" />\n <circle cx=\"12\" cy=\"12\" r=\"1.4\" />\n <circle cx=\"19\" cy=\"12\" r=\"1.4\" />\n </svg>\n )\n}\n\nfunction Chevron() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" {...stroke} style={{ display: 'block' }}>\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n )\n}\n\nfunction Heart() {\n return (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" {...stroke} style={{ display: 'block' }}>\n <path d=\"M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z\" />\n </svg>\n )\n}\n\nfunction CommentBubble() {\n return (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" {...stroke} style={{ display: 'block' }}>\n <path d=\"M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z\" />\n </svg>\n )\n}\n\nfunction Send() {\n return (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" {...stroke} style={{ display: 'block' }}>\n <line x1=\"22\" y1=\"2\" x2=\"11\" y2=\"13\" />\n <polygon points=\"22 2 15 22 11 13 2 9 22 2\" />\n </svg>\n )\n}\n\nfunction Bookmark() {\n return (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" {...stroke} style={{ display: 'block', flexShrink: 0 }}>\n <path d=\"M19 21l-7-5-7 5V5a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2z\" />\n </svg>\n )\n}\n\nfunction Placeholder({ format }: { format: string }) {\n return (\n <div\n style={{\n width: '100%',\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 8,\n color: 'rgb(140, 140, 140)',\n }}\n >\n <div style={{ width: 56, height: 56, borderRadius: 10, background: '#E4E6EB' }} />\n <span style={{ fontSize: 13 }}>Ad creative · {format}</span>\n </div>\n )\n}\n","import React from 'react';\nimport type { PreviewAdData } from './types';\nimport { CreativeMedia } from './CreativeMedia';\nimport { ProfileAvatar } from './ProfileAvatar';\n\ninterface InstagramExplorePreviewProps {\n adData: PreviewAdData;\n}\n\nexport const InstagramExplorePreview: React.FC<InstagramExplorePreviewProps> = ({\n adData,\n}) => {\n return (\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', width: '100%', height: '100%' }}>\n <div\n style={{\n color: 'rgb(28, 30, 33)',\n fontSize: '12px',\n lineHeight: '16px',\n position: 'relative',\n width: '320px',\n maxWidth: '100%',\n backgroundColor: 'rgb(255, 255, 255)',\n }}\n >\n <div style={{ height: '564px', overflow: 'hidden', width: '320px', maxWidth: '100%' }}>\n <div\n style={{\n flexWrap: 'wrap',\n height: '566px',\n justifyContent: 'space-between',\n width: '320px', maxWidth: '100%',\n display: 'flex',\n }}\n >\n {/* Column 1 - Single tall tile */}\n <div\n style={{\n backgroundColor: 'rgb(242, 242, 242)',\n height: '174px',\n marginBottom: '2px',\n position: 'relative',\n width: '106px',\n }}\n />\n\n {/* Column 2 - Two tiles */}\n <div style={{ height: '176px', width: '106px' }}>\n <div\n style={{\n backgroundColor: 'rgb(242, 242, 242)',\n height: '68px',\n marginBottom: '2px',\n position: 'relative',\n width: '106px',\n }}\n />\n <div\n style={{\n backgroundColor: 'rgb(242, 242, 242)',\n height: '106px',\n marginBottom: '2px',\n position: 'relative',\n width: '106px',\n }}\n />\n </div>\n\n {/* Column 3 - Two tiles */}\n <div style={{ height: '176px', width: '106px' }}>\n <div\n style={{\n backgroundColor: 'rgb(242, 242, 242)',\n height: '68px',\n marginBottom: '2px',\n position: 'relative',\n width: '106px',\n }}\n />\n <div\n style={{\n backgroundColor: 'rgb(242, 242, 242)',\n height: '106px',\n marginBottom: '2px',\n position: 'relative',\n width: '106px',\n }}\n />\n </div>\n\n {/* Column 4 - Two tiles (placeholder) */}\n <div style={{ height: '214px', width: '106px' }}>\n <div\n style={{\n backgroundColor: 'rgb(242, 242, 242)',\n height: '106px',\n marginBottom: '2px',\n position: 'relative',\n width: '106px',\n }}\n />\n <div\n style={{\n backgroundColor: 'rgb(242, 242, 242)',\n height: '106px',\n marginBottom: '2px',\n position: 'relative',\n width: '106px',\n }}\n />\n </div>\n\n {/* Column 5 - Two tiles (AD TILE is first) */}\n <div style={{ height: '214px', width: '106px' }}>\n {/* AD TILE */}\n <div\n style={{\n backgroundColor: 'rgb(242, 242, 242)',\n height: '106px',\n marginBottom: '2px',\n position: 'relative',\n width: '106px',\n }}\n >\n {/* Ad Image */}\n <div\n style={{\n height: '106px',\n overflow: 'hidden',\n position: 'relative',\n width: '106px',\n display: 'inline-block',\n }}\n >\n {adData.creativeImage ? (\n <CreativeMedia\n src={adData.creativeImage}\n mediaType={adData.creativeMediaType}\n alt=\"Ad creative\"\n style={{\n height: '100%',\n objectFit: 'cover',\n position: 'absolute',\n width: '100%',\n zIndex: 0,\n }}\n />\n ) : (\n <div\n style={{\n height: '100%',\n width: '100%',\n backgroundColor: 'rgb(218, 220, 222)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <span style={{ fontSize: '10px', color: 'rgb(160, 160, 160)' }}>1:1</span>\n </div>\n )}\n </div>\n\n {/* Gradient overlay */}\n <div\n style={{\n backgroundImage: 'linear-gradient(0deg, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.4))',\n bottom: '24px',\n height: '84px',\n position: 'absolute',\n width: '100%',\n }}\n />\n\n {/* Content overlay */}\n <div\n style={{\n flexDirection: 'column',\n height: '100%',\n position: 'absolute',\n width: '100%',\n display: 'flex',\n top: 0,\n left: 0,\n }}\n >\n {/* Sponsored tag - top right */}\n <div\n style={{\n height: '18px',\n justifyContent: 'flex-end',\n width: '100%',\n display: 'flex',\n }}\n >\n <div style={{ height: '18px', width: '72px' }}>\n <div style={{ height: '16px', width: '72px' }}>\n <div\n style={{\n color: 'rgb(255, 255, 255)',\n fontWeight: 500,\n height: '16px',\n marginLeft: '2px',\n marginRight: '2px',\n marginTop: '6px',\n paddingLeft: '6px',\n paddingRight: '6px',\n width: '58px',\n }}\n >\n Sponsored\n </div>\n </div>\n </div>\n </div>\n\n {/* Profile image - bottom left */}\n <div\n style={{\n height: '40px',\n justifyContent: 'flex-start',\n marginTop: 'auto',\n width: '40px',\n display: 'flex',\n }}\n >\n <div style={{ height: '40px', width: '36px' }}>\n <ProfileAvatar\n src={adData.profileImage}\n name={adData.brandName}\n fontSize={11}\n background=\"linear-gradient(45deg, #f09433 0%, #e6683c 25%, #dc2743 50%, #cc2366 75%, #bc1888 100%)\"\n style={{\n height: '24px',\n width: '24px',\n marginLeft: '6px',\n marginRight: '6px',\n marginTop: '10px',\n borderRadius: '24px',\n }}\n />\n </div>\n </div>\n </div>\n </div>\n\n {/* Second tile in this column */}\n <div\n style={{\n backgroundColor: 'rgb(242, 242, 242)',\n height: '106px',\n marginBottom: '2px',\n position: 'relative',\n width: '106px',\n }}\n />\n </div>\n\n {/* Column 6 - Two tiles */}\n <div style={{ height: '214px', width: '106px' }}>\n <div\n style={{\n backgroundColor: 'rgb(242, 242, 242)',\n height: '106px',\n marginBottom: '2px',\n position: 'relative',\n width: '106px',\n }}\n />\n <div\n style={{\n backgroundColor: 'rgb(242, 242, 242)',\n height: '106px',\n marginBottom: '2px',\n position: 'relative',\n width: '106px',\n }}\n />\n </div>\n\n {/* Column 7 - Single tall tile */}\n <div\n style={{\n backgroundColor: 'rgb(242, 242, 242)',\n height: '174px',\n marginBottom: '2px',\n position: 'relative',\n width: '106px',\n }}\n />\n\n {/* Column 8 - Two tiles */}\n <div style={{ height: '176px', width: '106px' }}>\n <div\n style={{\n backgroundColor: 'rgb(242, 242, 242)',\n height: '106px',\n marginBottom: '2px',\n position: 'relative',\n width: '106px',\n }}\n />\n <div\n style={{\n backgroundColor: 'rgb(242, 242, 242)',\n height: '68px',\n marginBottom: '2px',\n position: 'relative',\n width: '106px',\n }}\n />\n </div>\n\n {/* Column 9 - Two tiles */}\n <div style={{ height: '176px', width: '106px' }}>\n <div\n style={{\n backgroundColor: 'rgb(242, 242, 242)',\n height: '106px',\n marginBottom: '2px',\n position: 'relative',\n width: '106px',\n }}\n />\n <div\n style={{\n backgroundColor: 'rgb(242, 242, 242)',\n height: '68px',\n marginBottom: '2px',\n position: 'relative',\n width: '106px',\n }}\n />\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n};\n","import { memo, useState } from 'react'\nimport type { ReactNode } from 'react'\nimport { ProfileAvatar } from './ProfileAvatar'\nimport type { CarouselViewProps } from './types'\nimport { PREVIEW_DEFAULTS } from './defaults'\n\n/**\n * Facebook Feed — CAROUSEL (presentational). ADR-119 Decision 1.\n *\n * Pure: no carousel controller, no crop system. The card list, active index +\n * setter, and each card's image (`renderImage(i)` slot) all come from props, so\n * the same view serves the controller-driven form (CropFrame slot) and static\n * surfaces (plain <img> slot). Standard FB feed chrome around a peeking card\n * strip; each card = image slot + footer (headline, description, shared CTA).\n * Meta-exact hex — `packages/ui` is token-boundary exempt (ADR-119 D5).\n */\n\nconst WIDTH = 320\nconst CARD_W = 232\nconst GAP = 8\nconst FONT =\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif'\n\nconst C = {\n name: 'rgb(8, 8, 8)',\n sub: 'rgb(101, 103, 107)',\n body: 'rgb(0, 0, 0)',\n seeMore: 'var(--color-meta-blue)',\n imageBg: '#F0F2F5',\n cardBorder: 'rgba(0, 0, 0, 0.1)',\n headline: 'rgb(28, 32, 40)',\n ctaBtnBg: 'rgb(228, 230, 235)',\n ctaBtnInk: 'rgb(8, 8, 9)',\n divider: 'rgb(219, 221, 224)',\n action: 'rgb(97, 103, 112)',\n}\n\nexport const MetaFeedCarousel = memo(function MetaFeedCarousel({\n cards,\n active,\n onActive,\n renderImage,\n brandName,\n profileImage,\n primaryText,\n callToAction,\n}: CarouselViewProps) {\n const [expanded, setExpanded] = useState(false)\n\n const brand = brandName || PREVIEW_DEFAULTS.brandName\n const cta = callToAction || PREVIEW_DEFAULTS.callToAction\n const maxIndex = Math.max(0, cards.length - 1)\n const i = Math.min(Math.max(0, active), maxIndex)\n const translate = -(i * (CARD_W + GAP))\n\n const text = primaryText || PREVIEW_DEFAULTS.primaryText\n const LIMIT = 125\n const clipped = text.length > LIMIT && !expanded\n\n return (\n <div style={{ width: WIDTH, background: '#fff', fontFamily: FONT, color: C.body }}>\n {/* Header */}\n <div style={{ display: 'flex', alignItems: 'center', gap: 8, padding: '10px 12px' }}>\n <div style={{ width: 40, height: 40, borderRadius: '50%', overflow: 'hidden', flexShrink: 0 }}>\n <ProfileAvatar src={profileImage} name={brand} fontSize={15} />\n </div>\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ fontSize: 14, fontWeight: 600, lineHeight: '18px', color: C.name, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>\n {brand}\n </div>\n <div style={{ display: 'flex', alignItems: 'center', gap: 4, marginTop: 1, color: C.sub }}>\n <span style={{ fontSize: 12, lineHeight: '15px' }}>Sponsored</span>\n <span style={{ fontSize: 12 }}>·</span>\n <Globe />\n </div>\n </div>\n <MenuDots />\n </div>\n\n {/* Primary text */}\n {text && (\n <div style={{ padding: '0 12px 10px', fontSize: 14, fontWeight: 400, lineHeight: '19px', color: C.body, whiteSpace: 'pre-wrap', wordBreak: 'break-word' }}>\n {clipped ? text.slice(0, LIMIT).trimEnd() : text}\n {clipped && (\n <>\n {'… '}\n <button type=\"button\" onClick={() => setExpanded(true)} style={{ border: 0, background: 'none', padding: 0, color: C.seeMore, fontWeight: 600, fontSize: 14, cursor: 'pointer', fontFamily: FONT }}>\n See more\n </button>\n </>\n )}\n </div>\n )}\n\n {/* Card strip */}\n <div style={{ position: 'relative', overflow: 'hidden', padding: '2px 0 10px' }}>\n <div style={{ display: 'flex', gap: GAP, paddingLeft: 12, transform: `translateX(${translate}px)`, transition: 'transform 280ms cubic-bezier(0.22, 1, 0.36, 1)' }}>\n {cards.map((card, k) => (\n <div key={card.key} style={{ width: CARD_W, flexShrink: 0, border: `1px solid ${C.cardBorder}`, borderRadius: 8, overflow: 'hidden', background: '#fff' }}>\n <div style={{ width: '100%', height: CARD_W, background: C.imageBg, overflow: 'hidden' }}>\n {renderImage(k)}\n </div>\n <div style={{ padding: '10px 12px' }}>\n <div style={{ fontSize: 13, fontWeight: 700, lineHeight: '17px', color: C.headline, overflow: 'hidden', textOverflow: 'ellipsis', display: '-webkit-box', WebkitLineClamp: 2, WebkitBoxOrient: 'vertical' }}>\n {card.headline || PREVIEW_DEFAULTS.headline}\n </div>\n {card.description && (\n <div style={{ fontSize: 12, lineHeight: '16px', color: C.sub, marginTop: 2, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>\n {card.description}\n </div>\n )}\n <div style={{ marginTop: 10, display: 'inline-flex', alignItems: 'center', height: 30, padding: '0 12px', borderRadius: 6, background: C.ctaBtnBg, color: C.ctaBtnInk, fontSize: 13, fontWeight: 600 }}>\n {cta}\n </div>\n </div>\n </div>\n ))}\n </div>\n {i > 0 && <Arrow dir=\"left\" onClick={() => onActive(i - 1)} />}\n {i < maxIndex && <Arrow dir=\"right\" onClick={() => onActive(i + 1)} />}\n </div>\n\n {/* Divider */}\n <div style={{ height: 1, background: C.divider }} />\n\n {/* Action bar */}\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-around', padding: '6px 8px' }}>\n <FbAction label=\"Like\"><ThumbsUp /></FbAction>\n <FbAction label=\"Comment\"><Bubble /></FbAction>\n <FbAction label=\"Share\"><ShareArrow /></FbAction>\n </div>\n </div>\n )\n})\n\n/* ------------------------------- icons / bits ------------------------------- */\n\nconst stroke = {\n fill: 'none',\n stroke: C.action,\n strokeWidth: 2,\n strokeLinecap: 'round' as const,\n strokeLinejoin: 'round' as const,\n}\n\nfunction Arrow({ dir, onClick }: { dir: 'left' | 'right'; onClick: () => void }) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n aria-label={dir === 'left' ? 'Previous' : 'Next'}\n style={{\n position: 'absolute',\n top: CARD_W / 2 + 2,\n transform: 'translateY(-50%)',\n ...(dir === 'left' ? { left: 8 } : { right: 8 }),\n width: 30,\n height: 30,\n borderRadius: '50%',\n border: 0,\n background: '#fff',\n boxShadow: '0 1px 4px rgba(0,0,0,0.28)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n cursor: 'pointer',\n color: 'rgb(8,8,8)',\n }}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.4\" strokeLinecap=\"round\" strokeLinejoin=\"round\" style={{ display: 'block' }}>\n {dir === 'left' ? <polyline points=\"15 18 9 12 15 6\" /> : <polyline points=\"9 18 15 12 9 6\" />}\n </svg>\n </button>\n )\n}\n\nfunction FbAction({ label, children }: { label: string; children: ReactNode }) {\n return (\n <div style={{ display: 'flex', alignItems: 'center', gap: 6, padding: '4px 8px', cursor: 'pointer' }}>\n {children}\n <span style={{ fontSize: 13, fontWeight: 600, color: C.action }}>{label}</span>\n </div>\n )\n}\n\nfunction MenuDots() {\n return (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill={C.sub} style={{ display: 'block', flexShrink: 0 }}>\n <circle cx=\"5\" cy=\"12\" r=\"1.6\" />\n <circle cx=\"12\" cy=\"12\" r=\"1.6\" />\n <circle cx=\"19\" cy=\"12\" r=\"1.6\" />\n </svg>\n )\n}\n\nfunction Globe() {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 16 16\" fill={C.sub} style={{ display: 'block' }}>\n <path d=\"M8 0a8 8 0 1 0 8 8 8 8 0 0 0-8-8zm5.9 7H11a13 13 0 0 0-.9-4.4A6 6 0 0 1 13.9 7zM8 14c-.7 0-1.8-1.8-2-5h4c-.2 3.2-1.3 5-2 5zM6 7c.2-3.2 1.3-5 2-5s1.8 1.8 2 5zm-.1-4.4A13 13 0 0 0 5 7H2.1a6 6 0 0 1 3.8-4.4zM2.1 9H5a13 13 0 0 0 .9 4.4A6 6 0 0 1 2.1 9zm8 4.4a13 13 0 0 0 .9-4.4h2.9a6 6 0 0 1-3.8 4.4z\" />\n </svg>\n )\n}\n\nfunction ThumbsUp() {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" {...stroke} style={{ display: 'block' }}>\n <path d=\"M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3\" />\n </svg>\n )\n}\n\nfunction Bubble() {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" {...stroke} style={{ display: 'block' }}>\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n </svg>\n )\n}\n\nfunction ShareArrow() {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" {...stroke} style={{ display: 'block' }}>\n <path d=\"M4 12v8a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-8\" />\n <polyline points=\"16 6 12 2 8 6\" />\n <line x1=\"12\" y1=\"2\" x2=\"12\" y2=\"15\" />\n </svg>\n )\n}\n","import { memo, useState } from 'react'\nimport { ProfileAvatar } from './ProfileAvatar'\nimport type { CarouselViewProps } from './types'\nimport { PREVIEW_DEFAULTS } from './defaults'\n\n/**\n * Instagram Feed — CAROUSEL (presentational). ADR-119 Decision 1.\n *\n * Pure: no carousel controller, no crop system. Cards, active index + setter,\n * and each slide's image (`renderImage(i)` slot) come from props. IG feed chrome\n * around a full-width swipeable track: a `1/N` counter, dot indicators centered\n * in the action row, and shared CTA / caption / engagement below. Square slides\n * (Meta carousel is 1:1). Meta-exact hex — `packages/ui` is token-boundary\n * exempt (ADR-119 D5).\n */\n\nconst WIDTH = 320\nconst FONT =\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif'\n\nconst IG_RING =\n 'linear-gradient(45deg, #f09433 0%, #e6683c 25%, #dc2743 50%, #cc2366 75%, #bc1888 100%)'\n\nconst C = {\n ink: 'rgb(38, 38, 38)',\n sub: 'rgb(115, 115, 115)',\n hair: 'rgb(239, 239, 239)',\n imageBg: '#FAFAFA',\n dot: 'rgb(196, 196, 196)',\n dotActive: '#0095F6',\n}\n\n// Illustrative placeholder engagement — preview chrome, not live data.\nconst LIKES = '234'\nconst COMMENTS = 12\nconst POSTED = '2 hours ago'\n\nexport const InstagramFeedCarousel = memo(function InstagramFeedCarousel({\n cards,\n active,\n onActive,\n renderImage,\n brandName,\n profileImage,\n primaryText,\n callToAction,\n}: CarouselViewProps) {\n const [expanded, setExpanded] = useState(false)\n\n const maxIndex = Math.max(0, cards.length - 1)\n const i = Math.min(Math.max(0, active), maxIndex)\n const imageHeight = WIDTH // square slides\n const translate = -(i * WIDTH)\n\n const brand = brandName || PREVIEW_DEFAULTS.brandName\n const handle = brand.trim().toLowerCase().replace(/\\s+/g, '')\n const caption = primaryText || PREVIEW_DEFAULTS.primaryText\n const LIMIT = 100\n const clipped = caption.length > LIMIT && !expanded\n\n return (\n <div style={{ width: WIDTH, background: '#fff', fontFamily: FONT, color: C.ink }}>\n {/* Header */}\n <div style={{ display: 'flex', alignItems: 'center', gap: 10, padding: '9px 12px' }}>\n <div style={{ width: 30, height: 30, borderRadius: '50%', overflow: 'hidden', flexShrink: 0 }}>\n <ProfileAvatar src={profileImage} name={brand} fontSize={12} background={IG_RING} />\n </div>\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ fontSize: 13, fontWeight: 600, lineHeight: '16px', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>\n {brand}\n </div>\n <div style={{ fontSize: 12, lineHeight: '15px', color: C.sub }}>Sponsored</div>\n </div>\n <MenuDots />\n </div>\n\n {/* Image carousel */}\n <div style={{ position: 'relative', width: WIDTH, height: imageHeight, overflow: 'hidden', background: C.imageBg }}>\n <div style={{ display: 'flex', height: '100%', transform: `translateX(${translate}px)`, transition: 'transform 300ms cubic-bezier(0.22, 1, 0.36, 1)' }}>\n {cards.map((card, k) => (\n <div key={card.key} style={{ width: WIDTH, height: imageHeight, flexShrink: 0, overflow: 'hidden' }}>\n {renderImage(k)}\n </div>\n ))}\n </div>\n {/* Counter pill */}\n <div style={{ position: 'absolute', top: 10, right: 10, padding: '2px 9px', borderRadius: 11, background: 'rgba(0,0,0,0.55)', color: '#fff', fontSize: 12, fontWeight: 600 }}>\n {i + 1}/{cards.length}\n </div>\n {i > 0 && <Arrow dir=\"left\" onClick={() => onActive(i - 1)} top={imageHeight / 2} />}\n {i < maxIndex && <Arrow dir=\"right\" onClick={() => onActive(i + 1)} top={imageHeight / 2} />}\n </div>\n\n {/* CTA bar */}\n <button\n type=\"button\"\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n width: '100%',\n padding: '11px 14px',\n border: 0,\n borderBottom: `1px solid ${C.hair}`,\n background: 'none',\n cursor: 'pointer',\n font: 'inherit',\n textAlign: 'left',\n }}\n >\n <span style={{ fontSize: 14, fontWeight: 600, color: C.ink }}>{callToAction || PREVIEW_DEFAULTS.callToAction}</span>\n <Chevron />\n </button>\n\n {/* Action row — heart/comment/share · dots (centered) · bookmark */}\n <div style={{ position: 'relative', display: 'flex', alignItems: 'center', justifyContent: 'space-between', padding: '9px 12px 5px' }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: 16 }}>\n <Heart />\n <CommentBubble />\n <Send />\n </div>\n <div style={{ position: 'absolute', left: '50%', top: '50%', transform: 'translate(-50%, -50%)', display: 'flex', alignItems: 'center', gap: 5 }}>\n {cards.map((card, k) => (\n <span key={card.key} style={{ width: 6, height: 6, borderRadius: '50%', background: k === i ? C.dotActive : C.dot }} />\n ))}\n </div>\n <Bookmark />\n </div>\n\n {/* Likes */}\n <div style={{ padding: '0 12px', fontSize: 13, fontWeight: 600, color: C.ink, lineHeight: '18px' }}>{LIKES} likes</div>\n\n {/* Caption */}\n {caption && (\n <div style={{ padding: '3px 12px 0', fontSize: 13, lineHeight: '18px', fontWeight: 400, color: 'rgb(20, 20, 20)' }}>\n <span style={{ fontWeight: 600 }}>{handle}</span>{' '}\n {clipped ? caption.slice(0, LIMIT).trimEnd() : caption}\n {clipped && (\n <button type=\"button\" onClick={() => setExpanded(true)} style={{ border: 0, background: 'none', padding: 0, marginLeft: 4, color: C.sub, fontWeight: 400, fontSize: 13, cursor: 'pointer', fontFamily: FONT }}>\n more\n </button>\n )}\n </div>\n )}\n\n {/* Comments */}\n <div style={{ padding: '5px 12px 0', fontSize: 13, color: C.sub }}>View all {COMMENTS} comments</div>\n\n {/* Timestamp */}\n <div style={{ padding: '4px 12px 12px', fontSize: 11, color: C.sub }}>{POSTED}</div>\n </div>\n )\n})\n\n/* ------------------------------- icons / bits ------------------------------- */\n\nconst stroke = {\n fill: 'none',\n stroke: 'rgb(38, 38, 38)',\n strokeWidth: 1.8,\n strokeLinecap: 'round' as const,\n strokeLinejoin: 'round' as const,\n}\n\nfunction Arrow({ dir, onClick, top }: { dir: 'left' | 'right'; onClick: () => void; top: number }) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n aria-label={dir === 'left' ? 'Previous' : 'Next'}\n style={{\n position: 'absolute',\n top,\n transform: 'translateY(-50%)',\n ...(dir === 'left' ? { left: 8 } : { right: 8 }),\n width: 26,\n height: 26,\n borderRadius: '50%',\n border: 0,\n background: 'rgba(255,255,255,0.9)',\n boxShadow: '0 1px 3px rgba(0,0,0,0.25)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n cursor: 'pointer',\n color: 'rgb(38,38,38)',\n }}\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" style={{ display: 'block' }}>\n {dir === 'left' ? <polyline points=\"15 18 9 12 15 6\" /> : <polyline points=\"9 18 15 12 9 6\" />}\n </svg>\n </button>\n )\n}\n\nfunction MenuDots() {\n return (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"rgb(38,38,38)\" style={{ display: 'block', flexShrink: 0 }}>\n <circle cx=\"5\" cy=\"12\" r=\"1.4\" />\n <circle cx=\"12\" cy=\"12\" r=\"1.4\" />\n <circle cx=\"19\" cy=\"12\" r=\"1.4\" />\n </svg>\n )\n}\n\nfunction Chevron() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" {...stroke} style={{ display: 'block' }}>\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n )\n}\n\nfunction Heart() {\n return (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" {...stroke} style={{ display: 'block' }}>\n <path d=\"M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z\" />\n </svg>\n )\n}\n\nfunction CommentBubble() {\n return (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" {...stroke} style={{ display: 'block' }}>\n <path d=\"M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z\" />\n </svg>\n )\n}\n\nfunction Send() {\n return (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" {...stroke} style={{ display: 'block' }}>\n <line x1=\"22\" y1=\"2\" x2=\"11\" y2=\"13\" />\n <polygon points=\"22 2 15 22 11 13 2 9 22 2\" />\n </svg>\n )\n}\n\nfunction Bookmark() {\n return (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" {...stroke} style={{ display: 'block', flexShrink: 0 }}>\n <path d=\"M19 21l-7-5-7 5V5a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2z\" />\n </svg>\n )\n}\n","// @lovett/ui — Meta / Instagram platform-preview types.\n//\n// Promoted from docs/prototype/meta/preview-package/types/previews.ts\n// per ADR-060 D9a (amended 2026-05-28). Pixel-accurate FB+IG preview\n// renderers consume `PreviewAdData`; the 10 renderers + this types\n// module + the PLACEMENT_CONFIGS constant comprise the public surface\n// of `@lovett/ui/meta-previews`.\n\nimport type { ReactNode } from 'react';\n\nexport type PreviewPlatform = 'facebook' | 'instagram' | 'messenger';\nexport type PreviewPlacement =\n | 'feed'\n | 'story'\n | 'reel'\n | 'inbox'\n | 'instream'\n | 'search'\n | 'rightcolumn'\n | 'explore';\nexport type PreviewDevice = 'mobile' | 'desktop';\n\nexport interface PreviewConfiguration {\n platform: PreviewPlatform;\n placement: PreviewPlacement;\n device: PreviewDevice;\n format: '1:1' | '4:5' | '9:16';\n}\n\nexport interface PreviewAdData {\n adName: string;\n primaryText: string;\n headline: string;\n description: string;\n callToAction: string;\n websiteUrl: string;\n displayLink: string;\n brandName: string;\n profileImage: string;\n creativeImage: string;\n // `| undefined` is explicit so callers may assign an absent media type\n // under the workspace's exactOptionalPropertyTypes tsconfig.\n creativeMediaType?: 'image' | 'video' | undefined;\n}\n\n/**\n * A single carousel card for the presentational carousel views (ADR-119 D1).\n * Per-card copy/destination only — the CTA is ad-level/shared (ADR-119 D3).\n */\nexport interface CarouselCardView {\n key: string;\n headline?: string | undefined;\n description?: string | undefined;\n url?: string | undefined;\n}\n\n/**\n * Props for the pure presentational carousels (`MetaFeedCarousel`,\n * `InstagramFeedCarousel`). They own NO data or crop logic: the caller supplies\n * the card list, the active index + setter, and an image-render slot\n * (`CropFrame` on the controller-driven form side; a plain <img> on static\n * surfaces). Because the view imports neither the controller nor the crop\n * system, it lives in `packages/ui` and earns Meta-exact hex (ADR-119 D1/D5).\n */\nexport interface CarouselViewProps {\n cards: CarouselCardView[];\n active: number;\n onActive: (index: number) => void;\n renderImage: (index: number) => ReactNode;\n brandName: string;\n profileImage?: string | undefined;\n primaryText?: string | undefined;\n /** Ad-level CTA, shared across cards (ADR-119 D3). */\n callToAction: string;\n}\n\nexport interface PlacementPreview {\n id: string;\n platform: PreviewPlatform;\n placement: PreviewPlacement;\n label: string;\n description: string;\n aspectRatio: '1:1' | '4:5' | '9:16';\n device: PreviewDevice;\n enabled: boolean;\n}\n\nexport const PLACEMENT_CONFIGS: PlacementPreview[] = [\n {\n id: 'fb-feed',\n platform: 'facebook',\n placement: 'feed',\n label: 'Facebook Feed',\n description: 'Standard news feed placement',\n aspectRatio: '1:1',\n device: 'desktop',\n enabled: true,\n },\n {\n id: 'ig-feed',\n platform: 'instagram',\n placement: 'feed',\n label: 'Instagram Feed',\n description: 'Standard Instagram feed',\n aspectRatio: '1:1',\n device: 'mobile',\n enabled: true,\n },\n {\n id: 'fb-rightcolumn',\n platform: 'facebook',\n placement: 'rightcolumn',\n label: 'Facebook Right column',\n description: 'Desktop right column placement',\n aspectRatio: '1:1',\n device: 'desktop',\n enabled: true,\n },\n {\n id: 'fb-feed-mobile',\n platform: 'facebook',\n placement: 'feed',\n label: 'Facebook Feed (Mobile)',\n description: 'Mobile news feed',\n aspectRatio: '4:5',\n device: 'mobile',\n enabled: false,\n },\n {\n id: 'ig-story',\n platform: 'instagram',\n placement: 'story',\n label: 'Instagram Stories',\n description: 'Full-screen vertical stories',\n aspectRatio: '9:16',\n device: 'mobile',\n enabled: true,\n },\n {\n id: 'fb-story',\n platform: 'facebook',\n placement: 'story',\n label: 'Facebook Stories',\n description: 'Full-screen vertical stories',\n aspectRatio: '9:16',\n device: 'mobile',\n enabled: true,\n },\n {\n id: 'messenger-story',\n platform: 'messenger',\n placement: 'story',\n label: 'Messenger Stories',\n description: 'Full-screen vertical stories',\n aspectRatio: '9:16',\n device: 'mobile',\n enabled: true,\n },\n {\n id: 'ig-reel',\n platform: 'instagram',\n placement: 'reel',\n label: 'Instagram Reels',\n description: 'Short-form video placement',\n aspectRatio: '9:16',\n device: 'mobile',\n enabled: true,\n },\n {\n id: 'fb-reel',\n platform: 'facebook',\n placement: 'reel',\n label: 'Facebook Reels',\n description: 'Short-form video placement',\n aspectRatio: '9:16',\n device: 'mobile',\n enabled: true,\n },\n {\n id: 'ig-explore',\n platform: 'instagram',\n placement: 'explore',\n label: 'Instagram Explore home',\n description: 'Explore grid placement',\n aspectRatio: '1:1',\n device: 'mobile',\n enabled: true,\n },\n {\n id: 'messenger-inbox',\n platform: 'messenger',\n placement: 'inbox',\n label: 'Messenger Inbox',\n description: 'Sponsored message in inbox',\n aspectRatio: '1:1',\n device: 'mobile',\n enabled: true,\n },\n {\n id: 'fb-instream',\n platform: 'facebook',\n placement: 'instream',\n label: 'Facebook In-stream videos',\n description: 'Video ads in Facebook Watch and video feeds',\n aspectRatio: '1:1',\n device: 'mobile',\n enabled: true,\n },\n {\n id: 'fb-search',\n platform: 'facebook',\n placement: 'search',\n label: 'Facebook Marketplace Search',\n description: 'Ads in Facebook Marketplace search results',\n aspectRatio: '1:1',\n device: 'mobile',\n enabled: true,\n },\n];\n"]}
|