@assure-one/design-system 1.41.1 → 1.42.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/brand-scope-B7w3-y9E.d.ts +262 -0
- package/dist/{chunk-KUSY7BLL.js → chunk-AF3QYJ24.js} +3 -3
- package/dist/{chunk-KUSY7BLL.js.map → chunk-AF3QYJ24.js.map} +1 -1
- package/dist/{chunk-XV2VSEA5.js → chunk-H53VF62B.js} +14 -10
- package/dist/chunk-H53VF62B.js.map +1 -0
- package/dist/{chunk-NBI7E3VT.js → chunk-M2HMZ2RW.js} +243 -219
- package/dist/chunk-M2HMZ2RW.js.map +1 -0
- package/dist/{chunk-PTI4B2OI.js → chunk-YMRSFVW7.js} +23 -19
- package/dist/chunk-YMRSFVW7.js.map +1 -0
- package/dist/{chunk-X76J4QSJ.js → chunk-YRHRVOLV.js} +4 -4
- package/dist/{chunk-X76J4QSJ.js.map → chunk-YRHRVOLV.js.map} +1 -1
- package/dist/css/components.css +1 -1
- package/dist/css/tokens.css +8 -8
- package/dist/{data-table-view-ep8al7P9.d.ts → data-table-view-BN3GgNdp.d.ts} +186 -2
- package/dist/{design-system-provider-CfD2g2lY.d.ts → design-system-provider-CrBRFQjR.d.ts} +1 -1
- package/dist/icons/index.d.ts +1 -1
- package/dist/icons/index.js +2 -2
- package/dist/index.d.ts +67 -414
- package/dist/index.js +242 -129
- package/dist/index.js.map +1 -1
- package/dist/legacy/index.d.ts +11 -4
- package/dist/legacy/index.js +4 -4
- package/dist/next/index.d.ts +2 -2
- package/dist/{reference-BkDbrPIB.d.ts → reference-B5azRUoi.d.ts} +4 -4
- package/dist/styles.css +1 -1
- package/dist/suite/index.d.ts +14 -3
- package/dist/suite/index.js +4 -4
- package/dist/tokens/index.d.ts +1 -1
- package/dist/tokens/index.js +1 -1
- package/dist/{types-Coqw8iaS.d.ts → types-aBQCboFH.d.ts} +1 -1
- package/docs/components.md +5 -5
- package/docs/components.registry.json +5 -5
- package/package.json +1 -1
- package/dist/brand-scope-BOHId6BY.d.ts +0 -58
- package/dist/chunk-NBI7E3VT.js.map +0 -1
- package/dist/chunk-PTI4B2OI.js.map +0 -1
- package/dist/chunk-XV2VSEA5.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/primitives/badge.tsx","../src/primitives/blockquote.tsx","../src/legacy/category-divider.tsx","../src/legacy/document-source-tag.tsx","../src/legacy/documents-workspace-layout.tsx","../src/primitives/pagination.tsx","../src/foundation/progress-intent.ts","../src/primitives/progress-bar.tsx","../src/primitives/progress-ring.tsx","../src/primitives/section-header.tsx","../src/primitives/section.tsx","../src/primitives/segmented-progress.tsx","../src/primitives/stat.tsx","../src/primitives/status-dot.tsx","../src/primitives/status-pill.tsx","../src/primitives/behavior/form-reset.ts","../src/primitives/switch.tsx","../src/primitives/table.tsx","../src/primitives/tabs.tsx","../src/legacy/team-member-select.tsx","../src/primitives/toggle-group.tsx","../src/legacy/channel-tabs.tsx","../src/legacy/intent-badge.tsx","../src/primitives/behavior/data-table/use-data-table.ts","../src/legacy/document-request-upload.tsx","../src/legacy/ai-receipt-panel.tsx","../src/lib/service-tone.ts","../src/legacy/attention-item.tsx","../src/legacy/bottom-nav.tsx","../src/legacy/dash-grid.tsx","../src/legacy/engagement-card.tsx","../src/legacy/engagement-timeline.tsx","../src/composites/client-rail-item.tsx","../src/composites/document-file-row.tsx","../src/legacy/document-checklist.tsx","../src/legacy/document-request-field.tsx","../src/legacy/missing-documents-panel.tsx","../src/legacy/new-menu.tsx","../src/composites/data-table.tsx","../src/composites/data-table-view.tsx","../src/composites/document-request-detail.tsx","../src/legacy/document-source-filter.tsx","../src/composites/time-logger.tsx","../src/legacy/suggestion-pills.tsx","../src/legacy/ai-draft-card.tsx","../src/legacy/email-message-card.tsx","../src/legacy/signature-editor.tsx"],"names":["Badge","forwardRef","Blockquote","jsxs","jsx","CategoryTag","CategoryDivider","DocumentSourceTag","toneClass","DocumentsWorkspaceLayout","Pagination","DataTablePagination","cva","ProgressBar","ProgressRing","Section","SectionHead","SegmentedProgress","Stat","StatusDot","StatusPill","React","Switch","useEffect","Table","useRef","TableHeader","TableBody","TableFooter","TableRow","TableHead","TableCell","TableCaption","React2","Tabs","TabsList","TabsTrigger","TabsContent","React3","ToggleGroup","ToggleGroupItem","useId","useMemo","rows","useState","DocumentRequestUpload","AIReceiptPanel","AttentionItem","Fragment","BottomNav","DashGrid","EngagementCard","EngagementTimeline","EngagementTimelineStep","ClientRailItem","ClientRailGroupHeader","React5","DocumentFileRow","DocumentFileCard","DocumentFileLine","React6","DocumentChecklist","DocumentRequestField","MissingDocumentsPanel","NewMenu","DataTable","DataTableToolbar","DataTableSearch","DataTableSpacer","DataTableResultsCount","DataTableHead","DataTableBody","DataTableRow","DataTableHeader","useCallback","DataTableCell","DataTableCellName","DataTableCellMono","DataTableCellId","DataTableCellDue","DataTableCheckbox","TONE_DOT","DocumentRequestCard","DocumentRequestDetail","DocumentSourceFilter","TimeLogger","TimeLoggerHeader","TimeLoggerContextRow","TimeLoggerTimer","TimeLoggerField","TimeLoggerNotes","TimeLoggerBillable","TimeLoggerActions","TimeLoggerEntryList","TimeLoggerEntry","TimeLoggerFooter"],"mappings":"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","file":"chunk-PTI4B2OI.js","sourcesContent":["import { clsx } from \"clsx\";\nimport { forwardRef } from \"react\";\n\nimport { badgeAnatomy, type BadgeSlot } from \"../foundation/anatomy/slots\";\nimport { slot, stateAttributes } from \"../foundation/anatomy/slot\";\nimport type { ControlSize, Intent, Shape, Variant } from \"../foundation/vocab\";\nimport { cn } from \"../lib/cn\";\n\n/** The badge parts (ADR-008). See the registry for the doc comment. */\nexport type { BadgeSlot };\n\n/* ────────────────────────────────────────────────────────────────────────────\n * Badge — short static label or count (target architecture §31).\n *\n * Two axes (W3-13, ADR-007): `variant` is the emphasis, `intent` the meaning.\n * Every combination renders from one class table, so a consumer asks for\n * `variant=\"soft\" intent=\"brand\"` instead of overriding colours. The legacy\n * one-axis words (`default`, `secondary`, `destructive`, `success`, `warning`,\n * `info`) are still accepted and resolve through `resolveBadgeAppearance` to\n * the pair that renders exactly what they rendered before — the class string\n * for every legacy value is pinned byte-for-byte in `__tests__/badge.test.tsx`.\n *\n * Defaults are today's look, in the new words (ADR-007 decision 3): no props\n * is `solid` + `brand`. When one axis is given the other defaults *per value*\n * (`soft` alone is neutral; `danger` alone is soft), so a call that rendered\n * before renders the same pixels. Flipping the default to `soft` + `neutral`\n * is decision D1 and waits for 2.0.\n *\n * `shape` is offered where today's corner is a real choice (§18): omitted, the\n * badge keeps today's `--radius-pill` corner; `rounded` is the `radius.badge`\n * role (Portal's 4px status chips); `pill` is `radius.full`. Which of these is\n * the suite default is decision D1.\n *\n * Badges are static: nothing animates on a non-interactive element, so the\n * colour-transition classes are gone (the approved no-op diff of W3-13; one\n * product used to switch them off on every chip).\n * ──────────────────────────────────────────────────────────────────────────── */\n\n/** The emphasis subset a badge offers. @experimental */\nexport type BadgeVariant = Extract<Variant, \"solid\" | \"soft\" | \"outline\">;\n\n/** The badge's own size scale, spelled with the shared names (§17). @experimental */\nexport type BadgeSize = Extract<ControlSize, \"xs\" | \"sm\" | \"md\">;\n\n/** Corner treatment; omitted keeps today's corner (D1). @experimental */\nexport type BadgeShape = Extract<Shape, \"rounded\" | \"pill\">;\n\n/**\n * The one-axis words Badge accepted before W3-13. Each resolves to a\n * `{ variant, intent }` pair through `resolveBadgeAppearance` and renders the\n * same classes it always did.\n *\n * @deprecated Use `variant` (`solid | soft | outline`) with `intent` instead:\n * `default` → `solid` + `brand`, `secondary` → `soft` + `neutral`,\n * `destructive` → `soft` + `danger`, `success | warning | info` → `soft` +\n * the same word. `outline` is already an emphasis and is not deprecated.\n */\nexport type BadgeLegacyVariant =\n | \"default\"\n | \"secondary\"\n | \"destructive\"\n | \"success\"\n | \"warning\"\n | \"info\";\n\n/** A resolved `{ variant, intent }` pair. @experimental */\nexport interface BadgeAppearance {\n variant: BadgeVariant;\n intent: Intent;\n}\n\n/** What a badge can be asked for: the two axes, either one, or a legacy word. @experimental */\nexport interface BadgeAppearanceInput {\n variant?: BadgeVariant | BadgeLegacyVariant | null | undefined;\n intent?: Intent | null | undefined;\n}\n\nconst LEGACY_PAIRS: Record<BadgeLegacyVariant, BadgeAppearance> = {\n default: { variant: \"solid\", intent: \"brand\" },\n secondary: { variant: \"soft\", intent: \"neutral\" },\n destructive: { variant: \"soft\", intent: \"danger\" },\n success: { variant: \"soft\", intent: \"success\" },\n warning: { variant: \"soft\", intent: \"warning\" },\n info: { variant: \"soft\", intent: \"info\" },\n};\n\n/** The intent a variant carries when none is given: today's pixels for that word. */\nconst DEFAULT_INTENT: Record<BadgeVariant, Intent> = {\n solid: \"brand\",\n soft: \"neutral\",\n outline: \"neutral\",\n};\n\n/** The variant an intent carries when none is given: brand is solid, the rest soft. */\nconst defaultVariantFor = (intent: Intent): BadgeVariant => (intent === \"brand\" ? \"solid\" : \"soft\");\n\nconst isLegacy = (value: string): value is BadgeLegacyVariant => value in LEGACY_PAIRS;\n\n/**\n * Resolves what a consumer asked for into the pair the class table is keyed by.\n *\n * - both axes: taken as given (a legacy `variant` word with an explicit\n * `intent` keeps the word's emphasis and takes the intent);\n * - `variant` only: the per-variant default intent, or the legacy pair;\n * - `intent` only: the per-intent default variant;\n * - nothing: `solid` + `brand`, today's default.\n *\n * @experimental\n */\nexport function resolveBadgeAppearance({\n variant,\n intent,\n}: BadgeAppearanceInput = {}): BadgeAppearance {\n if (variant == null) {\n return intent == null ? LEGACY_PAIRS.default : { variant: defaultVariantFor(intent), intent };\n }\n if (isLegacy(variant)) {\n const pair = LEGACY_PAIRS[variant];\n return intent == null ? pair : { variant: pair.variant, intent };\n }\n return { variant, intent: intent ?? DEFAULT_INTENT[variant] };\n}\n\n/**\n * The class table, variant × intent. The seven cells the legacy words map to\n * (`default`, `secondary`, `destructive`, `success`, `warning`, `info`,\n * `outline`) are today's strings unchanged, order included.\n */\nconst APPEARANCE: Record<BadgeVariant, Record<Intent, string>> = {\n solid: {\n brand: \"ds:bg-brand ds:text-fg-on-brand ds:border-transparent\",\n neutral: \"ds:bg-fg-2 ds:text-bg ds:border-transparent\",\n info: \"ds:bg-info ds:text-fg-on-info ds:border-transparent\",\n success: \"ds:bg-success-fg ds:text-fg-on-success ds:border-transparent\",\n warning: \"ds:bg-warning-fg ds:text-fg-on-warning ds:border-transparent\",\n danger: \"ds:bg-danger-fg ds:text-fg-on-danger ds:border-transparent\",\n },\n soft: {\n brand: \"ds:bg-brand-bg ds:text-brand ds:border-brand-line\",\n neutral: \"ds:bg-bg-2 ds:text-fg-3 ds:border-rule\",\n info: \"ds:bg-accent-tint ds:text-accent-2 ds:border-[color:var(--color-accent-tint)]\",\n success: \"ds:bg-success-bg ds:text-success-fg ds:border-success-line\",\n warning: \"ds:bg-warning-bg ds:text-warning-fg ds:border-warning-line\",\n danger: \"ds:bg-danger-bg ds:text-danger-fg ds:border-danger-line\",\n },\n outline: {\n brand: \"ds:border-brand-line ds:bg-transparent ds:text-brand\",\n neutral: \"ds:border-rule ds:bg-transparent ds:text-fg-2\",\n info: \"ds:border-accent/30 ds:bg-transparent ds:text-accent-2\",\n success: \"ds:border-success-line ds:bg-transparent ds:text-success-fg\",\n warning: \"ds:border-warning-line ds:bg-transparent ds:text-warning-fg\",\n danger: \"ds:border-danger-line ds:bg-transparent ds:text-danger-fg\",\n },\n};\n\nconst SIZE: Record<BadgeSize, string> = {\n xs: \"ds:px-1.5 ds:py-px ds:text-micro\",\n sm: \"ds:px-2 ds:py-0.5 ds:text-xs\",\n md: \"ds:px-2.5 ds:py-0.5 ds:text-sm\",\n};\n\n/** Today's corner sits where it always sat in the class string; the roles replace it. */\nconst SHAPE: Record<BadgeShape | \"legacy\", string> = {\n legacy: \"ds:rounded-pill\",\n rounded: \"ds:rounded-badge\",\n pill: \"ds:rounded-full\",\n};\n\n/** The inputs `badgeVariants` accepts (the legacy `variant` words included). @experimental */\nexport interface BadgeVariantsProps extends BadgeAppearanceInput {\n size?: BadgeSize | null | undefined;\n shape?: BadgeShape | null | undefined;\n class?: string | null | undefined;\n className?: string | null | undefined;\n}\n\n/**\n * The badge's class string, for consumers that style their own element.\n * Same call shape as before W3-13 (`variant`, `size`, `class`/`className`),\n * plus `intent` and `shape`; a legacy `variant` word yields the string it\n * always did.\n */\nexport function badgeVariants({\n variant,\n intent,\n size,\n shape,\n class: classValue,\n className,\n}: BadgeVariantsProps = {}): string {\n const pair = resolveBadgeAppearance({ variant, intent });\n return clsx(\n \"ds:inline-flex ds:items-center ds:gap-1 ds:tabular-nums\",\n SHAPE[shape ?? \"legacy\"],\n \"ds:border ds:font-medium\",\n APPEARANCE[pair.variant][pair.intent],\n SIZE[size ?? \"sm\"],\n classValue,\n className,\n );\n}\n\nexport interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {\n /**\n * Visual emphasis: `solid` (filled), `soft` (tinted, the status look) or\n * `outline`. Omitted, it follows `intent` (brand is solid, the rest soft);\n * with neither prop the badge is `solid` + `brand`, as it always was.\n * The legacy one-axis words are accepted and deprecated (`BadgeLegacyVariant`).\n */\n variant?: BadgeVariant | BadgeLegacyVariant | undefined;\n /**\n * Semantic meaning → colour family. Omitted, it follows `variant`\n * (`solid` is brand, `soft` and `outline` are neutral).\n * @experimental\n */\n intent?: Intent;\n /** `xs` (10px text, W3-13), `sm` (default) or `md`. */\n size?: BadgeSize;\n /**\n * Corner treatment. Omitted keeps today's corner (`--radius-pill`);\n * `rounded` is the `radius.badge` role, `pill` is `radius.full` (D1).\n * @experimental\n */\n shape?: BadgeShape | undefined;\n /** Leading status dot, drawn in the text colour. */\n dot?: boolean;\n /** Leading 14px glyph. */\n icon?: React.ReactNode;\n}\n\nexport const Badge = forwardRef<HTMLSpanElement, BadgeProps>(function Badge(\n { variant, intent, size, shape, dot, icon, children, className, ...props },\n ref,\n) {\n const pair = resolveBadgeAppearance({ variant, intent });\n return (\n <span\n ref={ref}\n {...slot(badgeAnatomy, \"root\")}\n {...stateAttributes({ variant: pair.variant, intent: pair.intent, size: size ?? \"sm\" })}\n className={cn(badgeVariants({ variant, intent, size, shape }), className)}\n {...props}\n >\n {dot && (\n <span\n {...slot(badgeAnatomy, \"dot\")}\n className=\"ds:size-1.5 ds:rounded-full ds:bg-current\"\n aria-hidden=\"true\"\n />\n )}\n {icon && (\n <span\n {...slot(badgeAnatomy, \"icon\")}\n className=\"ds:inline-flex ds:size-3.5 ds:shrink-0\"\n aria-hidden=\"true\"\n >\n {icon}\n </span>\n )}\n {children}\n </span>\n );\n});\n\nBadge.displayName = \"Badge\";\n","import { forwardRef } from \"react\";\n\nimport { cn } from \"../lib/cn\";\n\n/**\n * Blockquote — semantic quote with optional attribution. Uses `font-display`\n * (Inter) at a comfortable reading scale; smart quotes are wrapped automatically.\n */\n\ninterface BlockquoteProps extends React.BlockquoteHTMLAttributes<HTMLQuoteElement> {\n author?: string;\n role?: string;\n}\n\nexport const Blockquote = forwardRef<HTMLQuoteElement, BlockquoteProps>(function Blockquote(\n { children, author, role: authorRole, className, ...props },\n ref,\n) {\n return (\n <figure>\n <blockquote\n ref={ref}\n className={cn(\n \"ds:font-display ds:text-fg ds:text-xl ds:leading-relaxed ds:tracking-[-0.022em] ds:md:text-2xl\",\n className,\n )}\n {...props}\n >\n <p>“{children}”</p>\n </blockquote>\n {author && (\n <figcaption className=\"ds:mt-4\">\n <cite className=\"ds:text-fg ds:text-sm ds:font-semibold ds:not-italic\">{author}</cite>\n {authorRole && <span className=\"ds:text-fg-3 ds:block ds:text-sm\">{authorRole}</span>}\n </figcaption>\n )}\n </figure>\n );\n});\n\nBlockquote.displayName = \"Blockquote\";\n","import { cva, type VariantProps } from \"class-variance-authority\";\nimport { forwardRef } from \"react\";\n\nimport { cn } from \"../lib/cn\";\n\n/**\n * CategoryDivider — THE category separator: a tone-tinted category pill, a\n * flex-1 hairline rule, and an optional trailing count chip. Used to group a\n * run of feed items / cards by service line. Per the ONE-brand rule, this tag\n * is the *only* place per-service color is allowed — everything else stays on\n * the single brand. Pure presentational.\n *\n * Tones map to the suite tints:\n * brand → --color-brand-pro · audit → --color-brand-audit ·\n * books → --color-brand-books · tax → --color-brand-tax ·\n * neutral → --color-fg-3\n */\nconst categoryTagVariants = cva(\n cn(\n \"ds:inline-flex ds:shrink-0 ds:items-center ds:gap-1.5 ds:rounded-full ds:px-2.5 ds:py-1\",\n \"ds:text-xs ds:font-bold ds:tracking-tight\",\n ),\n {\n variants: {\n tone: {\n brand:\n \"ds:text-brand-pro ds:bg-[color-mix(in_srgb,var(--color-brand-pro)_12%,transparent)]\",\n audit:\n \"ds:text-brand-audit ds:bg-[color-mix(in_srgb,var(--color-brand-audit)_12%,transparent)]\",\n books:\n \"ds:text-brand-books ds:bg-[color-mix(in_srgb,var(--color-brand-books)_12%,transparent)]\",\n tax: \"ds:text-brand-tax ds:bg-[color-mix(in_srgb,var(--color-brand-tax)_12%,transparent)]\",\n neutral:\n \"ds:text-fg-3 ds:bg-[color-mix(in_srgb,var(--color-fg-3)_12%,transparent)]\",\n },\n },\n defaultVariants: { tone: \"neutral\" },\n },\n);\n\nexport type CategoryTone = NonNullable<VariantProps<typeof categoryTagVariants>[\"tone\"]>;\n\nexport interface CategoryTagProps\n extends React.HTMLAttributes<HTMLSpanElement>,\n VariantProps<typeof categoryTagVariants> {\n /** Tag label text. */\n label: string;\n /** Optional leading icon rendered inside the pill. */\n icon?: React.ReactNode;\n}\n\n/**\n * CategoryTag — the standalone tone-tinted category pill, reusable in card\n * headers and feed-item rows. Same atom CategoryDivider renders on its left.\n */\nexport const CategoryTag = forwardRef<HTMLSpanElement, CategoryTagProps>(function CategoryTag(\n { label, icon, tone, className, ...props },\n ref,\n) {\n return (\n <span ref={ref} className={cn(categoryTagVariants({ tone }), className)} {...props}>\n {icon && (\n <span className=\"ds:inline-flex ds:size-3.5 ds:shrink-0\" aria-hidden=\"true\">\n {icon}\n </span>\n )}\n {label}\n </span>\n );\n});\nCategoryTag.displayName = \"CategoryTag\";\n\nexport interface CategoryDividerProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof categoryTagVariants> {\n /** Category label shown in the tone-tinted tag. */\n label: string;\n /** Optional leading icon rendered inside the tag. */\n icon?: React.ReactNode;\n /** Optional item count → trailing neutral count chip. */\n count?: number;\n}\n\n/**\n * @deprecated Frozen in `/legacy` (W8-09): no known consumer, no feature work.\n * Owner: PORTAL client portal, which decides to adopt, contribute or release\n * the name. Never removed before 3.0.\n */\nexport const CategoryDivider = forwardRef<HTMLDivElement, CategoryDividerProps>(\n function CategoryDivider({ label, icon, tone, count, className, ...props }, ref) {\n return (\n <div ref={ref} className={cn(\"ds:flex ds:items-center ds:gap-3\", className)} {...props}>\n <CategoryTag label={label} icon={icon} tone={tone} />\n <span className=\"ds:bg-rule ds:h-px ds:flex-1\" aria-hidden=\"true\" />\n {count !== undefined && (\n <span className=\"ds:text-fg-3 ds:bg-surface-2 ds:border-rule ds:inline-flex ds:h-5 ds:min-w-5 ds:shrink-0 ds:items-center ds:justify-center ds:rounded-full ds:border ds:px-1.5 ds:text-[11px] ds:font-bold\">\n {count}\n </span>\n )}\n </div>\n );\n },\n);\nCategoryDivider.displayName = \"CategoryDivider\";\n","\"use client\";\n\nimport { forwardRef } from \"react\";\n\nimport { cn } from \"../lib/cn\";\nimport { SendIcon, ShieldIcon, UploadIcon } from \"../primitives/icons\";\n\n/**\n * DocumentSourceTag — provenance atom for a document row/card: how the file\n * arrived. Mirrors StatusPill's shape (a `source` enum maps to label + icon +\n * tone), so call sites read as `<DocumentSourceTag source=\"requested\" />`\n * instead of repeating the label/icon/colour triple.\n *\n * requested → brand tint · send glyph (client fulfilled a firm request)\n * direct → outline · upload glyph (client uploaded unprompted)\n * internal → neutral · shield glyph (firm-prepared, not client-visible)\n *\n * Pass `children` to override the label while keeping the mapped tone/icon,\n * `icon` to swap the glyph, or `hideIcon` for a label-only tag.\n */\n\nexport type DocumentSource = \"requested\" | \"direct\" | \"internal\";\n\nconst sourceMap: Record<\n DocumentSource,\n { label: string; Icon: typeof SendIcon; className: string }\n> = {\n requested: {\n label: \"Requested\",\n Icon: SendIcon,\n className: \"ds:border-transparent ds:bg-brand-bg ds:text-brand\",\n },\n direct: {\n label: \"Direct upload\",\n Icon: UploadIcon,\n className: \"ds:border-rule-strong ds:text-fg-2\",\n },\n internal: {\n label: \"Internal\",\n Icon: ShieldIcon,\n className: \"ds:border-transparent ds:bg-surface-2 ds:text-fg-3\",\n },\n};\n\nexport interface DocumentSourceTagProps extends React.HTMLAttributes<HTMLSpanElement> {\n source: DocumentSource;\n /** Override the leading glyph for the mapped source. */\n icon?: React.ReactNode;\n /** Render label-only, with no leading glyph. */\n hideIcon?: boolean;\n}\n\n/**\n * @deprecated Frozen in `/legacy` (W8-09): no known consumer, no feature work.\n * Owner: PRO documents, which decides to adopt, contribute or release\n * the name. Never removed before 3.0.\n */\nexport const DocumentSourceTag = forwardRef<HTMLSpanElement, DocumentSourceTagProps>(\n function DocumentSourceTag({ source, icon, hideIcon, children, className, ...props }, ref) {\n const { label, Icon, className: toneClass } = sourceMap[source];\n return (\n <span\n ref={ref}\n className={cn(\n \"ds:inline-flex ds:items-center ds:gap-1 ds:rounded-md ds:border ds:py-0.5 ds:pr-[7px] ds:pl-1.5\",\n \"ds:text-[11px] ds:leading-none ds:font-semibold\",\n toneClass,\n className,\n )}\n {...props}\n >\n {!hideIcon &&\n (icon ?? <Icon size={11} className=\"ds:shrink-0 ds:opacity-90\" aria-hidden=\"true\" />)}\n {children ?? label}\n </span>\n );\n },\n);\n\nDocumentSourceTag.displayName = \"DocumentSourceTag\";\n","\"use client\";\n\nimport { forwardRef } from \"react\";\n\nimport { cn } from \"../lib/cn\";\n\n/**\n * DocumentsWorkspaceLayout — 3-pane CSS-grid shell for a firm Documents workspace.\n *\n * Renders three independently-scrolling columns: a clients rail, a folder tree,\n * and a files area. The root fills its parent height and does not scroll itself.\n * Each pane is a flex column container; consumers are responsible for placing\n * their own scroll regions inside the slots.\n *\n * Responsive grid:\n * Base (<lg): 2 visible columns — clientsRail + filesArea. The folderTree\n * pane is hidden so it does not occupy the 2-column base template.\n * lg (>=1024px): All 3 columns — 248px rail | 220px folders | remaining files.\n * xl (>=1280px): Wider columns — 280px rail | 244px folders | remaining files.\n *\n * No padding is imposed on any pane; the consumer owns spacing inside each slot.\n */\nexport interface DocumentsWorkspaceLayoutProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, \"children\"> {\n /** Left column — client list rail (always visible). */\n clientsRail: React.ReactNode;\n /** Middle column — folder/category tree (hidden below lg breakpoint). */\n folderTree: React.ReactNode;\n /** Right column — file list and preview area (always visible). */\n filesArea: React.ReactNode;\n}\n\n/**\n * @deprecated Frozen in `/legacy` (W8-09): no known consumer, no feature work.\n * Owner: PRO documents, which decides to adopt, contribute or release\n * the name. Never removed before 3.0.\n */\nexport const DocumentsWorkspaceLayout = forwardRef<\n HTMLDivElement,\n DocumentsWorkspaceLayoutProps\n>(function DocumentsWorkspaceLayout(\n { clientsRail, folderTree, filesArea, className, ...props },\n ref,\n) {\n return (\n <div\n ref={ref}\n className={cn(\n // Root: fills parent, no self-scroll, 2-col base → 3-col at lg/xl\n \"ds:grid ds:h-full ds:min-h-0 ds:overflow-hidden ds:bg-surface\",\n \"ds:grid-cols-[240px_minmax(0,1fr)]\",\n \"ds:lg:grid-cols-[248px_220px_minmax(0,1fr)]\",\n \"ds:xl:grid-cols-[280px_244px_minmax(0,1fr)]\",\n className,\n )}\n {...props}\n >\n {/* Pane 1 — clients rail: always visible, right border divider */}\n <div className=\"ds:flex ds:min-h-0 ds:min-w-0 ds:flex-col ds:border-r ds:border-rule ds:bg-surface\">\n {clientsRail}\n </div>\n\n {/* Pane 2 — folder tree: hidden below lg; becomes visible when the 3rd\n grid column is added so column counts always match what's displayed */}\n <div className=\"ds:hidden ds:min-h-0 ds:min-w-0 ds:flex-col ds:border-r ds:border-rule ds:bg-surface ds:lg:flex\">\n {folderTree}\n </div>\n\n {/* Pane 3 — files area: fills remaining space with a slightly recessed bg */}\n <div className=\"ds:flex ds:min-h-0 ds:min-w-0 ds:flex-col ds:bg-bg\">\n {filesArea}\n </div>\n </div>\n );\n});\n\nDocumentsWorkspaceLayout.displayName = \"DocumentsWorkspaceLayout\";\n","\"use client\";\n\nimport { forwardRef, useMemo } from \"react\";\n\nimport { paginationAnatomy, type PaginationSlot } from \"../foundation/anatomy/slots\";\nimport { slot, stateAttributes } from \"../foundation/anatomy/slot\";\nimport { deprecate } from \"../foundation/deprecate\";\nimport type { PaginationMessages } from \"../foundation/messages/types\";\nimport { useDsMessages } from \"../foundation/provider/context\";\nimport { cn } from \"../lib/cn\";\n\nimport { ChevronLeftIcon, ChevronRightIcon, MoreHorizontalIcon } from \"./icons\";\nimport { Select } from \"./select\";\n/**\n * Pagination — custom (no Radix equivalent).\n * Tokenized: tabular-nums numerals, mono context label, cyan accent for the\n * current page, `border-rule` divider boundaries.\n *\n * One pager for the package (W6-09): the former `Pagination` primitive and\n * `DataTablePagination` composite share this component and one prop\n * vocabulary — `page` / `pageCount` / `onPageChange`, `pageSize` /\n * `pageSizeOptions` / `onPageSizeChange`, `totalItems`, `hideOnSinglePage`.\n * `pageCount` is derived from `totalItems / pageSize` when omitted. The old\n * names (`currentPage`, `totalPages`; `current`, `total` on\n * `DataTablePagination`) keep working as deprecated aliases and render the\n * same DOM.\n */\n/** The pagination parts (ADR-008). See the registry for the doc comment. */\nexport type { PaginationSlot };\n/** The copy a `Pagination` renders (W5-22). @experimental */\nexport type { PaginationMessages };\n\nexport interface PaginationProps extends Omit<React.HTMLAttributes<HTMLElement>, \"onChange\"> {\n /** 1-indexed current page. */\n page?: number | undefined;\n /** Total number of pages. Derived from `totalItems / pageSize` when omitted. */\n pageCount?: number | undefined;\n onPageChange?: ((page: number) => void) | undefined;\n /** How many page numbers to show on each side of the current page. Default 1. */\n siblingCount?: number | undefined;\n /** Total item count — enables the \"1–10 of 47\" label and derives `pageCount`. */\n totalItems?: number | undefined;\n /** Items per page — used with `totalItems` for the range label and `pageCount`. */\n pageSize?: number | undefined;\n /**\n * Page sizes the reader may pick from. When given (with `onPageSizeChange`) a\n * page-size `Select` renders after the context label. @experimental\n */\n pageSizeOptions?: readonly number[] | undefined;\n /** Called with the new page size when the reader picks one. @experimental */\n onPageSizeChange?: ((pageSize: number) => void) | undefined;\n /**\n * Render nothing when there is a single page (or none). Default `false`\n * since 2.0 (W9-10; `true` in 1.x). @experimental\n */\n hideOnSinglePage?: boolean | undefined;\n /** Overrides of the copy the pager renders (W5-22): prop > provider `messages.pagination` > English. */\n messages?: Partial<PaginationMessages> | undefined;\n /** @deprecated Use `page`. Removed in 3.0. */\n currentPage?: number | undefined;\n /** @deprecated Use `pageCount`. Removed in 3.0. */\n totalPages?: number | undefined;\n}\n\nfunction getPageNumbers(current: number, total: number, siblings: number): (number | \"ellipsis\")[] {\n const range = (start: number, end: number) =>\n Array.from({ length: end - start + 1 }, (_, i) => start + i);\n\n const totalSlots = siblings * 2 + 5;\n if (total <= totalSlots) return range(1, total);\n\n const leftSibling = Math.max(current - siblings, 2);\n const rightSibling = Math.min(current + siblings, total - 1);\n\n const showLeftEllipsis = leftSibling > 2;\n const showRightEllipsis = rightSibling < total - 1;\n\n if (!showLeftEllipsis && showRightEllipsis) {\n const leftRange = range(1, 3 + 2 * siblings);\n return [...leftRange, \"ellipsis\", total];\n }\n\n if (showLeftEllipsis && !showRightEllipsis) {\n const rightRange = range(total - (2 + 2 * siblings), total);\n return [1, \"ellipsis\", ...rightRange];\n }\n\n return [1, \"ellipsis\", ...range(leftSibling, rightSibling), \"ellipsis\", total];\n}\n\nconst NAV_BUTTON = cn(\n \"ds:inline-flex ds:size-7 ds:items-center ds:justify-center ds:rounded-btn ds:text-fg-3\",\n \"ds:transition-colors ds:duration-[var(--duration-fast)] ds:ease-[var(--ease-out-quart)] ds:motion-reduce:transition-none\",\n \"ds:hover:bg-surface-hover ds:hover:text-fg\",\n \"ds:focus-visible:outline-none ds:focus-visible:[box-shadow:var(--shadow-focus-ring)]\",\n \"ds:disabled:pointer-events-none ds:disabled:cursor-not-allowed ds:disabled:text-fg-disabled\",\n);\n\nconst PAGE_BUTTON_BASE = cn(\n \"ds:inline-flex ds:h-7 ds:min-w-7 ds:items-center ds:justify-center ds:rounded-btn ds:px-2\",\n \"ds:text-xs ds:font-medium ds:tabular-nums\",\n \"ds:transition-colors ds:duration-[var(--duration-fast)] ds:ease-[var(--ease-out-quart)] ds:motion-reduce:transition-none\",\n \"ds:focus-visible:outline-none ds:focus-visible:[box-shadow:var(--shadow-focus-ring)]\",\n);\n\nconst noop = () => {};\n\nexport const Pagination = forwardRef<HTMLElement, PaginationProps>(function Pagination(\n {\n page: pageProp,\n pageCount: pageCountProp,\n onPageChange = noop,\n siblingCount = 1,\n totalItems,\n pageSize,\n pageSizeOptions,\n onPageSizeChange,\n hideOnSinglePage = false,\n messages: messagesProp,\n currentPage: legacyCurrentPage,\n totalPages: legacyTotalPages,\n className,\n ...props\n },\n ref,\n) {\n const messages = useDsMessages(\"pagination\", messagesProp);\n if (legacyCurrentPage !== undefined) {\n deprecate(\n \"C-DT-PARTS\",\n \"Pagination.currentPage\",\n \"<Pagination currentPage> is a deprecated alias. Pass page. Removed in 3.0.\",\n );\n }\n if (legacyTotalPages !== undefined) {\n deprecate(\n \"C-DT-PARTS\",\n \"Pagination.totalPages\",\n \"<Pagination totalPages> is a deprecated alias. Pass pageCount. Removed in 3.0.\",\n );\n }\n\n const currentPage = pageProp ?? legacyCurrentPage ?? 1;\n const derivedPageCount =\n totalItems != null && pageSize != null && pageSize > 0\n ? Math.max(1, Math.ceil(totalItems / pageSize))\n : 1;\n const totalPages = pageCountProp ?? legacyTotalPages ?? derivedPageCount;\n\n const sizeOptions = useMemo(\n () => (pageSizeOptions ?? []).map((size) => ({ value: String(size), label: String(size) })),\n [pageSizeOptions],\n );\n const showPageSize = sizeOptions.length > 0 && onPageSizeChange != null;\n\n if (hideOnSinglePage && totalPages <= 1 && !showPageSize) return null;\n\n const pages = getPageNumbers(currentPage, totalPages, siblingCount);\n\n // Range label: \"1–10 of 47\" or fallback to \"Page 1 of 5\"\n let contextLabel: string;\n if (totalItems != null && pageSize != null) {\n const start = totalItems === 0 ? 0 : (currentPage - 1) * pageSize + 1;\n const end = Math.min(currentPage * pageSize, totalItems);\n contextLabel = messages.range(start, end, totalItems);\n } else {\n contextLabel = messages.page(currentPage, totalPages);\n }\n\n return (\n <nav\n ref={ref}\n aria-label={messages.region(currentPage, totalPages)}\n {...slot(paginationAnatomy, \"root\")}\n className={cn(\"ds:flex ds:items-center ds:justify-between ds:gap-4\", className)}\n {...props}\n >\n {/* Context label — mono, tabular-nums, fg-4 */}\n <span\n {...slot(paginationAnatomy, \"label\")}\n className=\"ds:text-fg-4 ds:shrink-0 ds:font-mono ds:text-[11px] ds:tracking-[0.02em] ds:tabular-nums\"\n >\n {contextLabel}\n </span>\n\n {showPageSize && (\n <div\n {...slot(paginationAnatomy, \"page-size\")}\n className=\"ds:flex ds:shrink-0 ds:items-center ds:gap-2\"\n >\n <span className=\"ds:text-fg-4 ds:text-xs\">{messages.rowsPerPage}</span>\n <Select\n size=\"sm\"\n options={sizeOptions}\n value={pageSize != null ? String(pageSize) : undefined}\n onValueChange={(value) => onPageSizeChange?.(Number(value))}\n aria-label={messages.rowsPerPage}\n className=\"ds:w-auto ds:min-w-18\"\n />\n </div>\n )}\n\n {/* Page controls */}\n <div {...slot(paginationAnatomy, \"pages\")} className=\"ds:flex ds:items-center ds:gap-0.5\">\n {/* Previous */}\n <button\n type=\"button\"\n onClick={() => onPageChange(currentPage - 1)}\n disabled={currentPage <= 1}\n {...slot(paginationAnatomy, \"previous\")}\n {...stateAttributes({ disabled: currentPage <= 1 })}\n className={NAV_BUTTON}\n aria-label={messages.previous}\n >\n <ChevronLeftIcon className=\"ds:size-3.5\" aria-hidden=\"true\" />\n </button>\n\n {/* Page numbers */}\n {pages.map((page, i) =>\n page === \"ellipsis\" ? (\n <span\n key={`ellipsis-${i}`}\n {...slot(paginationAnatomy, \"ellipsis\")}\n className=\"ds:text-fg-5 ds:flex ds:h-7 ds:w-5 ds:items-center ds:justify-center ds:select-none\"\n aria-hidden=\"true\"\n >\n <MoreHorizontalIcon className=\"ds:size-3.5\" />\n </span>\n ) : (\n <button\n key={page}\n type=\"button\"\n onClick={() => onPageChange(page)}\n aria-current={page === currentPage ? \"page\" : undefined}\n {...slot(paginationAnatomy, \"page\")}\n {...stateAttributes({ selected: page === currentPage })}\n className={cn(\n PAGE_BUTTON_BASE,\n page === currentPage\n ? \"ds:bg-accent-tint ds:text-accent-2 ds:border ds:border-[color:var(--color-accent-tint)]\"\n : \"ds:text-fg-3 ds:hover:bg-surface-hover ds:hover:text-fg\",\n )}\n >\n {page}\n </button>\n ),\n )}\n\n {/* Next */}\n <button\n type=\"button\"\n onClick={() => onPageChange(currentPage + 1)}\n disabled={currentPage >= totalPages}\n {...slot(paginationAnatomy, \"next\")}\n {...stateAttributes({ disabled: currentPage >= totalPages })}\n className={NAV_BUTTON}\n aria-label={messages.next}\n >\n <ChevronRightIcon className=\"ds:size-3.5\" aria-hidden=\"true\" />\n </button>\n </div>\n </nav>\n );\n});\n\nPagination.displayName = \"Pagination\";\n\n/* ── DataTablePagination (alias) ──────────────────────────── */\n\nexport interface DataTablePaginationProps extends Omit<\n PaginationProps,\n \"page\" | \"totalItems\" | \"currentPage\" | \"totalPages\"\n> {\n /** 1-indexed current page. */\n page?: number;\n /** Total number of items across all pages. */\n totalItems?: number;\n /** Items per page. Default 25. */\n pageSize?: number;\n /** @deprecated Use `page`. Removed in 3.0. */\n current?: number;\n /** @deprecated Use `totalItems`. Removed in 3.0. */\n total?: number;\n}\n\n/**\n * DataTablePagination — the pager under a `DataTable`. Since W6-09 a thin\n * alias of {@link Pagination}: page size defaults to 25, `pageCount` derives\n * from `totalItems / pageSize`, and the strip keeps its `mt-4` gap. The old\n * `current` / `total` names keep working as deprecated aliases.\n */\nexport const DataTablePagination = forwardRef<HTMLElement, DataTablePaginationProps>(\n function DataTablePagination(\n { page, totalItems, pageSize = 25, current, total, className, ...props },\n ref,\n ) {\n if (current !== undefined) {\n deprecate(\n \"C-DT-PARTS\",\n \"DataTablePagination.current\",\n \"<DataTablePagination current> is a deprecated alias. Pass page. Removed in 3.0.\",\n );\n }\n if (total !== undefined) {\n deprecate(\n \"C-DT-PARTS\",\n \"DataTablePagination.total\",\n \"<DataTablePagination total> is a deprecated alias. Pass totalItems. Removed in 3.0.\",\n );\n }\n return (\n <Pagination\n ref={ref}\n page={page ?? current}\n totalItems={totalItems ?? total ?? 0}\n pageSize={pageSize}\n className={cn(\"ds:mt-4\", className)}\n {...props}\n />\n );\n },\n);\nDataTablePagination.displayName = \"DataTablePagination\";\n","import type { Intent } from \"../foundation/vocab\";\n\n/**\n * The colour vocabulary shared by the Progress family (W3-21, ADR-007 §4,\n * compat registry C-PROGRESS).\n *\n * `ProgressBar` and `ProgressRing` spelled their colour axis `variant`,\n * `SegmentedProgress` spelled it `tone`, and all three called the brand\n * colour `default` and danger `destructive`. The new spelling is `intent`\n * everywhere; the old words stay accepted as deprecated aliases that resolve\n * through the table below, and every legacy value keeps its classes.\n *\n * In 1.x the family **auto-coloured by value** when no colour was passed\n * (`< 50%` brand, `≥ 50%` warning, `≥ 80%` success). That mapping is\n * business-adjacent (Tax documents it as a gotcha), so 2.0 turns it **off**\n * (W9-10): no colour renders `brand`. CM-19 writes the intent the rule would\n * have picked into every literal-valued call site.\n *\n * Lives in the foundation layer because the four presets (L2, one A2 group)\n * share it and A2 allows no import between them; the unified `Progress`\n * module (target architecture §26) folds them together later.\n */\n\n/** Every intent of the shared vocabulary is a Progress colour. */\nexport type ProgressIntent = Intent;\n\n/**\n * The pre-W3-21 colour words of `ProgressBar`/`ProgressRing` (`variant`) and\n * `SegmentedProgress` (`tone`).\n *\n * @deprecated Use `intent` — `default` → `brand`, `destructive` → `danger`,\n * the others keep their name. Removed in 3.0; CM-06 / CM-19 rewrite call sites.\n */\nexport type ProgressLegacyColour = \"default\" | \"success\" | \"warning\" | \"destructive\" | \"info\";\n\n/** Legacy colour word → `intent` (ADR-007 §4). Classes are identical on both sides. */\nexport const PROGRESS_LEGACY_TO_INTENT: Readonly<Record<ProgressLegacyColour, ProgressIntent>> = {\n default: \"brand\",\n success: \"success\",\n warning: \"warning\",\n destructive: \"danger\",\n info: \"info\",\n};\n\n/** The intent the 1.x value-driven auto-colour picked (off since 2.0; the CM-19 rule). */\nexport function autoProgressIntent(percentage: number): ProgressIntent {\n return percentage >= 80 ? \"success\" : percentage >= 50 ? \"warning\" : \"brand\";\n}\n\n/**\n * Resolves the colour a legacy Progress component renders:\n *\n * 1. an explicit `intent`;\n * 2. else the aliased legacy colour word (`variant` / `tone`);\n * 3. else `brand` — no value-driven auto-colour since 2.0 (W9-10).\n */\nexport function resolveProgressIntent(\n intent: ProgressIntent | null | undefined,\n legacy: ProgressLegacyColour | null | undefined,\n): ProgressIntent {\n if (intent) return intent;\n if (legacy) return PROGRESS_LEGACY_TO_INTENT[legacy];\n return \"brand\";\n}\n","\"use client\";\n\nimport * as ProgressPrimitive from \"@radix-ui/react-progress\";\nimport { cva } from \"class-variance-authority\";\nimport { forwardRef } from \"react\";\n\nimport { useDsMessages } from \"../foundation/provider/context\";\nimport { cn } from \"../lib/cn\";\nimport { microInteractions } from \"../lib/micro-interactions\";\n\nimport {\n type ProgressIntent,\n type ProgressLegacyColour,\n resolveProgressIntent,\n} from \"../foundation/progress-intent\";\n\n/**\n * ProgressBar — Radix-driven determinate (or indeterminate) progress meter.\n * Track sits on `bg-3`; the fill follows `intent` (ADR-007), default `brand`.\n * The 1.x auto-colour by value is off since 2.0 (W9-10): pass `intent`.\n *\n * Public API preserved: `value`, `max`, `label`, `showPercentage`, `variant`.\n * `size` sets the track height (W9, C-DOM-12).\n * Pass `value={null}` (or omit when in-doubt) to render Radix's indeterminate\n * state — but for back-compat we still accept `value: number`.\n */\n\n/** @deprecated Use `intent`. `default` → `brand`, `destructive` → `danger`. */\nexport type ProgressBarVariant = ProgressLegacyColour;\n\nconst progressBarCva = cva(cn(\"ds:h-full ds:rounded-full\", microInteractions.progress), {\n variants: {\n intent: {\n brand: \"ds:bg-brand\",\n neutral: \"ds:bg-fg-4\",\n info: \"ds:bg-accent\",\n success: \"ds:bg-success-fg\",\n warning: \"ds:bg-warning-fg\",\n danger: \"ds:bg-danger-fg\",\n },\n },\n defaultVariants: { intent: \"brand\" },\n});\n\n/** Track height per `size`; `md` is the height the bar has always had. */\nconst PROGRESS_BAR_HEIGHT = {\n xs: \"ds:h-1\",\n sm: \"ds:h-1.5\",\n md: \"ds:h-2\",\n} as const;\n\nexport interface ProgressBarVariantProps {\n /**\n * Semantic fill colour (ADR-007). Default `brand`; wins over `variant`.\n */\n intent?: ProgressIntent | null;\n /** @deprecated Use `intent`. `default` → `brand`, `destructive` → `danger`. */\n variant?: ProgressBarVariant | null;\n}\n\n/**\n * The indicator class string for a resolved colour. Accepts `intent` or the\n * deprecated `variant`; with neither it renders `brand`.\n */\nexport function progressBarVariants({ intent, variant }: ProgressBarVariantProps = {}) {\n return progressBarCva({ intent: resolveProgressIntent(intent, variant) });\n}\n\nexport interface ProgressBarProps\n extends\n Omit<React.ComponentPropsWithoutRef<typeof ProgressPrimitive.Root>, \"value\">,\n ProgressBarVariantProps {\n /** 0..max. Set to `null` for an indeterminate track. */\n value: number | null;\n max?: number;\n label?: string;\n showPercentage?: boolean;\n /**\n * Track height: `xs` 4px, `sm` 6px, `md` 8px (default). Replaces a\n * `[&_[role=progressbar]]` height override on the wrapper (C-DOM-12).\n */\n size?: \"xs\" | \"sm\" | \"md\";\n}\n\nexport const ProgressBar = forwardRef<\n React.ElementRef<typeof ProgressPrimitive.Root>,\n ProgressBarProps\n>(function ProgressBar(\n { value, max = 100, label, showPercentage, size = \"md\", intent, variant, className, ...props },\n ref,\n) {\n const messages = useDsMessages(\"progress\");\n const isIndeterminate = value == null;\n const percentage = isIndeterminate ? 0 : Math.min(100, Math.max(0, (value / max) * 100));\n\n const resolvedIntent = resolveProgressIntent(intent, variant);\n\n return (\n <div className={cn(\"ds:w-full\", className)}>\n {(label || showPercentage) && (\n <div className=\"ds:mb-1.5 ds:flex ds:items-center ds:justify-between ds:text-sm\">\n {label && <span className=\"ds:text-fg-2 ds:font-medium\">{label}</span>}\n {showPercentage && !isIndeterminate && (\n <span className=\"ds:text-fg-3 ds:font-mono ds:text-xs ds:tabular-nums\">\n {Math.round(percentage)}%\n </span>\n )}\n </div>\n )}\n <ProgressPrimitive.Root\n ref={ref}\n value={isIndeterminate ? null : value}\n max={max}\n aria-label={label ?? messages.progress}\n className={cn(\n \"ds:bg-bg-3 ds:relative\",\n PROGRESS_BAR_HEIGHT[size],\n \"ds:w-full ds:overflow-hidden ds:rounded-full\",\n )}\n {...props}\n >\n <ProgressPrimitive.Indicator\n className={cn(\n progressBarCva({ intent: resolvedIntent }),\n isIndeterminate &&\n \"ds:absolute ds:inset-y-0 ds:left-0 ds:w-1/3 ds:animate-progress-indeterminate ds:motion-reduce:animate-none\",\n )}\n style={isIndeterminate ? undefined : { width: `${percentage}%` }}\n />\n </ProgressPrimitive.Root>\n {/* Indeterminate keyframes (scoped, no token leakage). */}\n {isIndeterminate && (\n <style>{`\n @keyframes progress-indeterminate {\n 0% { transform: translateX(-100%); }\n 100% { transform: translateX(400%); }\n }\n `}</style>\n )}\n </div>\n );\n});\n\nProgressBar.displayName = \"ProgressBar\";\n","\"use client\";\n\nimport { cva } from \"class-variance-authority\";\nimport { forwardRef } from \"react\";\n\nimport { useDsMessages } from \"../foundation/provider/context\";\nimport { cn } from \"../lib/cn\";\n\nimport {\n type ProgressIntent,\n type ProgressLegacyColour,\n resolveProgressIntent,\n} from \"../foundation/progress-intent\";\n\n/**\n * ProgressRing — custom SVG ring meter (no Radix equivalent).\n * Track is `bg-3`, the indicator picks up the active `intent` (ADR-007).\n * Colours mirror ProgressBar so consumers can mix freely; default `brand`\n * (the 1.x auto-colour by value is off since 2.0, W9-10).\n *\n * Public API preserved: `value`, `max`, `size`, `strokeWidth`, `label`, `sublabel`.\n */\n\n/** @deprecated Use `intent`. `default` → `brand`, `destructive` → `danger`. */\nexport type ProgressRingVariant = ProgressLegacyColour;\n\nconst progressRingCva = cva(\n \"ds:transition-[stroke-dashoffset,stroke] ds:duration-[var(--duration-slow)] ds:ease-[var(--ease-out-quart)] ds:motion-reduce:transition-none\",\n {\n variants: {\n intent: {\n brand: \"ds:text-brand\",\n neutral: \"ds:text-fg-4\",\n info: \"ds:text-accent\",\n success: \"ds:text-success-fg\",\n warning: \"ds:text-warning-fg\",\n danger: \"ds:text-danger-fg\",\n },\n },\n defaultVariants: { intent: \"brand\" },\n },\n);\n\nexport interface ProgressRingVariantProps {\n /**\n * Semantic indicator colour (ADR-007). Default `brand`; wins over `variant`.\n */\n intent?: ProgressIntent | null;\n /** @deprecated Use `intent`. `default` → `brand`, `destructive` → `danger`. */\n variant?: ProgressRingVariant | null;\n}\n\n/**\n * The indicator class string for a resolved colour. Accepts `intent` or the\n * deprecated `variant`; with neither it renders `brand`.\n */\nexport function progressRingVariants({ intent, variant }: ProgressRingVariantProps = {}) {\n return progressRingCva({ intent: resolveProgressIntent(intent, variant) });\n}\n\nexport interface ProgressRingProps\n extends React.HTMLAttributes<HTMLDivElement>, ProgressRingVariantProps {\n value: number;\n max?: number;\n size?: number;\n strokeWidth?: number;\n label?: string;\n sublabel?: string;\n}\n\nexport const ProgressRing = forwardRef<HTMLDivElement, ProgressRingProps>(function ProgressRing(\n {\n value,\n max = 100,\n size = 80,\n strokeWidth = 6,\n label,\n sublabel,\n intent,\n variant,\n className,\n ...props\n },\n ref,\n) {\n const messages = useDsMessages(\"progress\");\n const percentage = Math.min(100, Math.max(0, (value / max) * 100));\n const radius = (size - strokeWidth) / 2;\n const circumference = 2 * Math.PI * radius;\n const offset = circumference - (percentage / 100) * circumference;\n\n const resolvedIntent = resolveProgressIntent(intent, variant);\n\n return (\n <div\n ref={ref}\n className={cn(\"ds:inline-flex ds:flex-col ds:items-center ds:gap-1\", className)}\n role=\"progressbar\"\n aria-valuenow={value}\n aria-valuemin={0}\n aria-valuemax={max}\n aria-label={label ?? messages.progress}\n {...props}\n >\n <div className=\"ds:relative ds:inline-flex\" style={{ width: size, height: size }}>\n <svg width={size} height={size} className=\"ds:-rotate-90\" aria-hidden=\"true\">\n <circle\n cx={size / 2}\n cy={size / 2}\n r={radius}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={strokeWidth}\n className=\"ds:text-bg-3\"\n />\n <circle\n cx={size / 2}\n cy={size / 2}\n r={radius}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={strokeWidth}\n strokeDasharray={circumference}\n strokeDashoffset={offset}\n strokeLinecap=\"round\"\n className={progressRingCva({ intent: resolvedIntent })}\n />\n </svg>\n {label && !sublabel && (\n <span className=\"ds:text-fg ds:pointer-events-none ds:absolute ds:inset-0 ds:flex ds:items-center ds:justify-center ds:font-mono ds:text-xs ds:font-medium ds:tabular-nums\">\n {label}\n </span>\n )}\n </div>\n {label && sublabel && (\n <span className=\"ds:text-fg ds:font-mono ds:text-sm ds:font-medium ds:tabular-nums\">\n {label}\n </span>\n )}\n {sublabel && <span className=\"ds:text-fg-3 ds:text-xs\">{sublabel}</span>}\n </div>\n );\n});\n\nProgressRing.displayName = \"ProgressRing\";\n","import { cn } from \"../lib/cn\";\n\n/**\n * SectionHeader — title + description block for marketing-style sections.\n * Uses Inter (`font-display`) with the spec's `-0.022em` letterspacing.\n */\n\ninterface SectionHeaderProps {\n title: string;\n description?: string;\n align?: \"left\" | \"center\";\n className?: string;\n}\n\nexport function SectionHeader({\n title,\n description,\n align = \"center\",\n className,\n}: SectionHeaderProps) {\n return (\n <div\n className={cn(\n \"ds:mb-16\",\n align === \"center\" && \"ds:mx-auto ds:max-w-2xl ds:text-center\",\n align === \"left\" && \"ds:max-w-lg\",\n className,\n )}\n >\n <h2\n className={cn(\n \"ds:font-display ds:text-fg ds:mb-4 ds:text-3xl ds:font-medium ds:tracking-[-0.028em] ds:md:text-4xl\",\n )}\n >\n {title}\n </h2>\n {description && <p className=\"ds:text-fg-3 ds:text-lg ds:leading-relaxed\">{description}</p>}\n </div>\n );\n}\n","import { forwardRef } from \"react\";\n\nimport { cn } from \"../lib/cn\";\n\n/**\n * Section — max-width centered wrapper for marketing/section content.\n * The `--content-pad` token (32px) is the canonical app-content gutter,\n * but Section keeps its 24px (`px-6`) gutter for narrower marketing pages.\n */\n\nconst maxWidthStyles = {\n sm: \"ds:max-w-3xl\",\n md: \"ds:max-w-4xl\",\n lg: \"ds:max-w-5xl\",\n xl: \"ds:max-w-6xl\",\n} as const;\n\ninterface SectionProps extends React.HTMLAttributes<HTMLElement> {\n maxWidth?: keyof typeof maxWidthStyles;\n as?: \"section\" | \"div\";\n}\n\nexport const Section = forwardRef<HTMLElement, SectionProps>(function Section(\n { maxWidth = \"xl\", as: Tag = \"section\", children, className, ...props },\n ref,\n) {\n // Cast ref to any: TS can't narrow forwardRef across a polymorphic Tag.\n return (\n <Tag\n ref={ref as React.Ref<HTMLElement> as never}\n className={cn(\"ds:px-6 ds:py-24\", className)}\n {...props}\n >\n <div className={cn(\"ds:mx-auto\", maxWidthStyles[maxWidth])}>{children}</div>\n </Tag>\n );\n});\n\nSection.displayName = \"Section\";\n\ninterface SectionHeadProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"title\"> {\n eyebrow?: React.ReactNode;\n title?: React.ReactNode;\n meta?: React.ReactNode;\n}\n\nexport const SectionHead = forwardRef<HTMLDivElement, SectionHeadProps>(function SectionHead(\n { eyebrow, title, meta, className, children, ...props },\n ref,\n) {\n return (\n <div\n ref={ref}\n className={cn(\n \"ds:border-rule-soft ds:mb-3 ds:flex ds:items-end ds:justify-between ds:gap-3 ds:border-b ds:pb-2\",\n className,\n )}\n {...props}\n >\n <div className=\"ds:min-w-0 ds:space-y-1\">\n {eyebrow && (\n <div className=\"ds:text-fg-4 ds:font-mono ds:[font-feature-settings:'tnum'_1,'lnum'_1,'ss01'_1] ds:text-[10.5px] ds:font-medium ds:tracking-[0.14em] ds:uppercase\">\n {eyebrow}\n </div>\n )}\n {title && (\n <h3 className=\"ds:font-display ds:text-fg ds:text-sm ds:leading-tight ds:font-medium\">{title}</h3>\n )}\n {children}\n </div>\n {meta && <div className=\"ds:text-fg-3 ds:shrink-0 ds:text-xs\">{meta}</div>}\n </div>\n );\n});\n\nSectionHead.displayName = \"SectionHead\";\n","\"use client\";\n\nimport { forwardRef } from \"react\";\n\nimport { useDsMessages } from \"../foundation/provider/context\";\nimport { cn } from \"../lib/cn\";\n\nimport {\n PROGRESS_LEGACY_TO_INTENT,\n type ProgressIntent,\n type ProgressLegacyColour,\n} from \"../foundation/progress-intent\";\n\n/**\n * SegmentedProgress — discrete step meter rendered as N pill segments, the\n * first `current` of which are filled. Used on engagement cards (\"step 2\n * of 5\") where a continuous bar would over-state precision.\n *\n * `intent` colours the filled segments (ADR-007; default `brand`). `tone` is\n * the deprecated spelling: the status words alias to an intent, while the\n * service tones (`tax` | `audit` | `accounting`) stay on `tone` because\n * product names are never intents (ADR-007 §2). Both resolve to a single CSS\n * colour so the segment markup stays identical.\n */\n\nconst INTENT_FILL: Record<ProgressIntent, string> = {\n brand: \"var(--ds-color-action-brand-bg, var(--color-brand))\",\n neutral: \"var(--ds-color-content-subtle, var(--color-fg-4))\",\n info: \"var(--ds-color-action-accent-bg, var(--color-accent))\",\n success: \"var(--ds-color-feedback-success-fg, var(--color-success-fg))\",\n warning: \"var(--ds-color-feedback-warning-fg, var(--color-warning-fg))\",\n danger: \"var(--ds-color-feedback-danger-fg, var(--color-danger-fg))\",\n};\n\n/** Service tints — product hues, never intents (ADR-007 §2); reachable through `tone` only. */\nconst SERVICE_FILL = {\n tax: \"var(--ds-color-service-tax, var(--color-service-tax))\",\n audit: \"var(--ds-color-service-audit, var(--color-service-audit))\",\n accounting: \"var(--ds-color-service-accounting, var(--color-service-accounting))\",\n};\n\n/** Service tints: product hues that stay on the deprecated `tone` axis. */\nexport type SegmentedServiceTone = keyof typeof SERVICE_FILL;\n\n/**\n * The pre-W3-21 colour words (compat registry C-TONE).\n *\n * @deprecated Use `intent` — `default` → `brand`, `destructive` → `danger`,\n * the other status words keep their name. The service tones have no intent\n * and stay here. Removed in 3.0; CM-06 rewrites the mappable call sites.\n */\nexport type SegmentedTone = ProgressLegacyColour | SegmentedServiceTone;\n\nconst isSegmentedServiceTone = (tone: unknown): tone is SegmentedServiceTone =>\n typeof tone === \"string\" && Object.hasOwn(SERVICE_FILL, tone);\n\n/** The CSS colour a SegmentedProgress fills with: explicit `intent`, else the aliased `tone`. */\nfunction resolveSegmentedFill(\n intent: ProgressIntent | null | undefined,\n tone: SegmentedTone | null | undefined,\n): string {\n if (intent) return INTENT_FILL[intent];\n if (isSegmentedServiceTone(tone)) return SERVICE_FILL[tone];\n return INTENT_FILL[tone ? PROGRESS_LEGACY_TO_INTENT[tone] : \"brand\"];\n}\n\nexport interface SegmentedProgressProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n \"children\"\n> {\n /** Total number of segments. */\n steps: number;\n /** How many leading segments are filled. */\n current: number;\n /** Semantic fill colour (ADR-007). Default `brand`. Wins over `tone`. */\n intent?: ProgressIntent;\n /**\n * @deprecated Use `intent`. `default` → `brand`, `destructive` → `danger`;\n * `tax` / `audit` / `accounting` stay here (no intent).\n */\n tone?: SegmentedTone;\n /** Segment height in px. Default 6. */\n thickness?: number;\n /** Accessible label; falls back to \"Step X of Y\". */\n label?: string;\n}\n\nexport const SegmentedProgress = forwardRef<HTMLDivElement, SegmentedProgressProps>(\n function SegmentedProgress(\n { steps, current, intent, tone, thickness = 6, label, className, style, ...props },\n ref,\n ) {\n const messages = useDsMessages(\"segmentedProgress\");\n const filled = Math.min(steps, Math.max(0, current));\n const fill = resolveSegmentedFill(intent, tone);\n return (\n <div\n ref={ref}\n role=\"progressbar\"\n aria-valuenow={filled}\n aria-valuemin={0}\n aria-valuemax={steps}\n aria-label={label ?? messages.step(filled, steps)}\n className={cn(\"ds:flex ds:w-full ds:items-center ds:gap-1\", className)}\n style={{ height: thickness, ...style }}\n {...props}\n >\n {Array.from({ length: steps }, (_, i) => (\n <span\n key={i}\n aria-hidden=\"true\"\n className=\"ds:h-full ds:flex-1 ds:rounded-full ds:transition-colors ds:duration-[var(--duration-normal)] ds:ease-[var(--ease-out-quart)] ds:motion-reduce:transition-none\"\n style={{\n background:\n i < filled ? fill : \"var(--ds-color-canvas-sunken-strong, var(--color-bg-3))\",\n }}\n />\n ))}\n </div>\n );\n },\n);\n\nSegmentedProgress.displayName = \"SegmentedProgress\";\n","import { forwardRef } from \"react\";\n\nimport { cn } from \"../lib/cn\";\n\n/**\n * Stat — paired numeric display + caption (the StatNum primitive).\n * Numerals are set in `font-display` (Inter) at a fluid clamp size with\n * `font-variant-numeric: tabular-nums` for vertical alignment.\n */\n\ninterface StatProps extends React.HTMLAttributes<HTMLDivElement> {\n value: string;\n label: string;\n}\n\nexport const Stat = forwardRef<HTMLDivElement, StatProps>(function Stat(\n { value, label, className, ...props },\n ref,\n) {\n return (\n <div ref={ref} className={cn(\"ds:flex ds:flex-col ds:gap-1\", className)} {...props}>\n <span\n className={cn(\n \"ds:font-display ds:text-fg ds:block ds:leading-none ds:font-medium ds:tracking-[-0.035em] ds:tabular-nums\",\n \"ds:text-[clamp(28px,3.4vw,38px)]\",\n )}\n style={{ fontVariantNumeric: \"tabular-nums\" }}\n >\n {value}\n </span>\n <span className=\"ds:text-fg-3 ds:text-sm\">{label}</span>\n </div>\n );\n});\n\nStat.displayName = \"Stat\";\n","import { forwardRef } from \"react\";\nimport { cva } from \"class-variance-authority\";\n\nimport type { Intent } from \"../foundation/vocab\";\nimport { cn } from \"../lib/cn\";\n\n/**\n * StatusDot — standalone attention / unread / presence dot.\n *\n * A small filled circle for NON-avatar surfaces: nav rails, bottom nav,\n * top-bar bells, list rows, unread markers. (Avatar already renders its own\n * corner presence dot — use that for avatar-attached dots.)\n *\n * intent — danger (default) | warning | info | success | brand | neutral\n * (ADR-007 vocabulary; `tone` is the deprecated spelling)\n * size — sm ~7px (default) | md ~9px\n * ring — adds a 2px solid surface ring so the dot reads when overlaid on\n * icons / avatars (box-shadow, so it never shifts layout)\n * pulse — subtle expanding ping halo; hidden under prefers-reduced-motion\n *\n * The dot fills with `currentColor`, so the ping clone inherits the same\n * colour automatically. `aria-hidden` by default — pass `aria-label` to\n * expose it.\n */\n\n/** Every intent of the shared vocabulary is a StatusDot colour. */\nexport type StatusDotIntent = Intent;\n\n/** Legacy `tone` → `intent` (ADR-007 §4). Classes are identical on both sides. */\nexport const STATUS_DOT_TONE_TO_INTENT = {\n danger: \"danger\",\n warning: \"warning\",\n info: \"info\",\n success: \"success\",\n pro: \"brand\",\n neutral: \"neutral\",\n} as const satisfies Record<string, StatusDotIntent>;\n\n/**\n * The pre-W3-21 colour words (compat registry C-TONE). `pro` is the brand\n * colour spelled as a product name.\n *\n * @deprecated Use `intent` — `tone=\"pro\"` is `intent=\"brand\"`, every other\n * value keeps its name. Removed in 3.0; CM-06 rewrites call sites.\n */\nexport type StatusDotTone = keyof typeof STATUS_DOT_TONE_TO_INTENT;\n\nexport type StatusDotSize = \"sm\" | \"md\";\n\nconst statusDotCva = cva(\"ds:relative ds:inline-flex ds:shrink-0 ds:rounded-full ds:bg-current\", {\n variants: {\n intent: {\n danger: \"ds:text-danger-fg\",\n warning: \"ds:text-warning-fg\",\n info: \"ds:text-accent\",\n success: \"ds:text-success-fg\",\n // `brand` renders what `tone=\"pro\"` rendered: the brand ink of the\n // active theme (`--color-pro-fg` follows `createBrandTheme`).\n brand: \"ds:text-pro-fg\",\n neutral: \"ds:text-fg-4\",\n },\n size: {\n sm: \"ds:size-[7px]\",\n md: \"ds:size-[9px]\",\n },\n ring: {\n true: \"ds:shadow-[0_0_0_2px_var(--color-surface)]\",\n false: \"\",\n },\n },\n defaultVariants: {\n intent: \"danger\",\n size: \"sm\",\n ring: false,\n },\n});\n\nexport interface StatusDotVariantProps {\n /** Semantic colour (ADR-007). Default `danger`. Wins over `tone`. */\n intent?: StatusDotIntent | null | undefined;\n /** @deprecated Use `intent`. `pro` → `brand`; other values keep their name. */\n tone?: StatusDotTone | null | undefined;\n size?: StatusDotSize | null | undefined;\n ring?: boolean | null | undefined;\n}\n\n/** Resolves the colour a StatusDot renders: explicit `intent`, else the aliased `tone`. */\nconst resolveStatusDotIntent = (\n intent?: StatusDotIntent | null,\n tone?: StatusDotTone | null,\n): StatusDotIntent | undefined => intent ?? (tone ? STATUS_DOT_TONE_TO_INTENT[tone] : undefined);\n\n/** The StatusDot class string. Accepts `intent` or the deprecated `tone`. */\nexport function statusDotVariants({ intent, tone, size, ring }: StatusDotVariantProps = {}) {\n return statusDotCva({ intent: resolveStatusDotIntent(intent, tone), size, ring });\n}\n\nexport interface StatusDotProps\n extends React.HTMLAttributes<HTMLSpanElement>, StatusDotVariantProps {\n /** Subtle expanding ping halo. Respects `prefers-reduced-motion`. */\n pulse?: boolean;\n}\n\nexport const StatusDot = forwardRef<HTMLSpanElement, StatusDotProps>(function StatusDot(\n { intent, tone, size, ring, pulse, className, ...props },\n ref,\n) {\n const ariaLabel = props[\"aria-label\"];\n\n return (\n <span\n ref={ref}\n role={ariaLabel ? \"img\" : undefined}\n aria-hidden={ariaLabel ? undefined : true}\n className={cn(statusDotVariants({ intent, tone, size, ring }), className)}\n {...props}\n >\n {pulse && (\n <span\n aria-hidden=\"true\"\n className=\"ds:absolute ds:inset-0 ds:inline-flex ds:animate-ping ds:rounded-full ds:bg-current ds:opacity-75 ds:motion-reduce:hidden\"\n />\n )}\n </span>\n );\n});\n\nStatusDot.displayName = \"StatusDot\";\n","import { forwardRef } from \"react\";\n\nimport { Badge, type BadgeProps } from \"./badge\";\n\n/**\n * StatusPill — semantic status atom for engagement / document / signature\n * lifecycles. It is a thin mapping over <Badge>: each known `status` picks\n * the right variant + default label + dot, so call sites read as\n * `<StatusPill status=\"needs-revision\" />` instead of repeating the\n * variant/label pairing everywhere.\n *\n * Mapping (per the portal spec):\n * requested → warning \"Requested\"\n * in-review → info \"In review\"\n * needs-revision → danger \"Needs revision\"\n * accepted/signed/\n * approved/paid/\n * received → success \"Accepted\" / \"Signed\" / \"Received\" / …\n * draft/pending → secondary\n * overdue → danger\n *\n * Pass `children` to override the label while keeping the mapped variant.\n */\n\nexport type PillStatus =\n | \"requested\"\n | \"in-review\"\n | \"needs-revision\"\n | \"accepted\"\n | \"signed\"\n | \"approved\"\n | \"paid\"\n | \"complete\"\n | \"received\"\n | \"draft\"\n | \"pending\"\n | \"overdue\"\n | \"declined\"\n | \"internal\"\n | \"shared\";\n\nconst statusMap: Record<PillStatus, { variant: BadgeProps[\"variant\"]; label: string }> = {\n requested: { variant: \"warning\", label: \"Requested\" },\n \"in-review\": { variant: \"info\", label: \"In review\" },\n \"needs-revision\": { variant: \"destructive\", label: \"Needs revision\" },\n accepted: { variant: \"success\", label: \"Accepted\" },\n signed: { variant: \"success\", label: \"Signed\" },\n approved: { variant: \"success\", label: \"Approved\" },\n paid: { variant: \"success\", label: \"Paid\" },\n complete: { variant: \"success\", label: \"Complete\" },\n received: { variant: \"success\", label: \"Received\" },\n draft: { variant: \"secondary\", label: \"Draft\" },\n pending: { variant: \"secondary\", label: \"Pending\" },\n overdue: { variant: \"destructive\", label: \"Overdue\" },\n declined: { variant: \"destructive\", label: \"Declined\" },\n // Document visibility: firm-only (internal) vs shared with the client portal.\n internal: { variant: \"secondary\", label: \"Internal\" },\n shared: { variant: \"info\", label: \"Shared\" },\n};\n\nexport interface StatusPillProps extends Omit<BadgeProps, \"variant\"> {\n status: PillStatus;\n /** Show a leading dot. Default `true` (status atoms read better with one). */\n dot?: boolean;\n}\n\nexport const StatusPill = forwardRef<HTMLSpanElement, StatusPillProps>(function StatusPill(\n { status, dot = true, children, ...props },\n ref,\n) {\n const { variant, label } = statusMap[status];\n return (\n <Badge ref={ref} variant={variant} dot={dot} {...props}>\n {children ?? label}\n </Badge>\n );\n});\n\nStatusPill.displayName = \"StatusPill\";\n","import { useEffect, useRef, type RefObject } from \"react\";\n\n/**\n * L1a behaviour primitive (private). Not exported from the package.\n *\n * `useFormReset` — call `onReset` when the form a control belongs to is reset\n * (W4-14/W4-15/W4-16, ADR-006 §3). `form.reset()`, `<button type=\"reset\">`\n * and React 19's automatic reset after a `<form action>` all dispatch `reset`\n * on the form; the browser then restores the *native* fields, which for a\n * Radix control is the hidden input it renders — not the Radix state the\n * visible control shows. Radix Checkbox listens to `reset` itself; Switch,\n * RadioGroup and Slider do not, so the wrapper restores its own state here.\n * `FormBridge` has the same listener for the controls it serialises.\n *\n * The form is the one the element sits in (`closest(\"form\")`), or the one\n * `form={id}` names when the control is portalled out of it. Nothing happens\n * without a form. The callback is read at event time, so it may change\n * between renders without re-subscribing.\n */\nexport function useFormReset(\n elementRef: RefObject<HTMLElement | null>,\n onReset: (() => void) | undefined,\n form?: string | undefined,\n): void {\n const latest = useRef(onReset);\n latest.current = onReset;\n useEffect(() => {\n const element = elementRef.current;\n if (!element) return;\n const owner = form\n ? (element.ownerDocument.getElementById(form) as HTMLFormElement | null)\n : element.closest(\"form\");\n if (!owner) return;\n const handle = () => latest.current?.();\n owner.addEventListener(\"reset\", handle);\n return () => owner.removeEventListener(\"reset\", handle);\n }, [elementRef, form]);\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as SwitchPrimitive from \"@radix-ui/react-switch\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { switchAnatomy, type SwitchSlot } from \"../foundation/anatomy/slots\";\nimport { slot, stateAttributes } from \"../foundation/anatomy/slot\";\nimport { useMergedRefs } from \"../foundation/merge-refs\";\nimport { useControllableState } from \"../foundation/use-controllable-state\";\nimport { cn } from \"../lib/cn\";\n\nimport { useFormReset } from \"./behavior/form-reset\";\nimport { useFieldsetContext } from \"./field/internal/fieldset-context\";\nimport { useFieldControl } from \"./field/use-field-control\";\n\n/**\n * Switch — a Radix switch with the design system's track and thumb (W4-15,\n * plan §16.1). Sizes `sm` (20×36) and `md` (24×44, default) are the\n * component's own geometry, not the control scale (plan §2.1).\n *\n * **Form participation** is Radix's own (ADR-006 §1): the button is paired\n * with a hidden native `<input type=\"checkbox\">` carrying `name`, `value`\n * (default `\"on\"`), `required`, `disabled` and `form`, so `FormData` holds\n * `name=value` while on and nothing while off, and `required` blocks the\n * submission while off. Radix Switch does not follow a form `reset`; the\n * wrapper does (`useFormReset`), restoring `defaultChecked`.\n *\n * **Field binding** through `useFieldControl`: inside a `Field` the button\n * takes the field's id (so the `Label` names it through `htmlFor`), `name`,\n * `required`, `disabled`, `invalid` and `aria-describedby`. A settings row is\n * `<Field orientation=\"horizontal\">` with the `Label` first. Explicit props\n * win. Inside a disabled `Fieldset` the switch renders its disabled state.\n */\n\n/** The switch parts (ADR-008). See the registry for the doc comment. */\nexport type { SwitchSlot };\n\nconst switchVariants = cva(\n [\n \"ds:peer ds:inline-flex ds:shrink-0 ds:cursor-pointer ds:items-center ds:rounded-full ds:border ds:border-transparent\",\n \"ds:transition-colors ds:duration-[var(--motion-duration-feedback)] ds:ease-[var(--motion-ease-enter)]\",\n \"ds:motion-reduce:transition-none\",\n \"ds:focus-visible:outline-none ds:focus-visible:[box-shadow:var(--shadow-focus-ring)]\",\n \"ds:disabled:cursor-not-allowed\",\n \"ds:data-[state=checked]:bg-brand ds:data-[state=unchecked]:bg-bg-3\",\n // §5.17: disabled is signalled via the disabled token swap on the\n // track itself; the thumb borrows fg-disabled. No opacity.\n \"ds:data-[disabled]:data-[state=checked]:bg-fg-disabled\",\n \"ds:data-[disabled]:data-[state=unchecked]:bg-bg-disabled\",\n ],\n {\n variants: {\n size: {\n sm: \"ds:h-5 ds:w-9\",\n md: \"ds:h-6 ds:w-11\",\n },\n },\n defaultVariants: {\n size: \"md\",\n },\n },\n);\n\nconst switchThumbVariants = cva(\n [\n \"ds:pointer-events-none ds:block ds:rounded-full ds:bg-surface ds:shadow-quiet ds:ring-0\",\n \"ds:transition-transform ds:duration-[var(--motion-duration-feedback)] ds:ease-[var(--motion-ease-enter)] ds:motion-reduce:transition-none\",\n ],\n {\n variants: {\n size: {\n sm: \"ds:size-3.5 ds:data-[state=checked]:translate-x-4 ds:data-[state=unchecked]:translate-x-0.5\",\n md: \"ds:size-[18px] ds:data-[state=checked]:translate-x-[22px] ds:data-[state=unchecked]:translate-x-0.5\",\n },\n },\n defaultVariants: {\n size: \"md\",\n },\n },\n);\n\n/** The switch sizes: the component's own geometry (`sm` 20×36, `md` 24×44). */\nexport type SwitchSize = NonNullable<VariantProps<typeof switchVariants>[\"size\"]>;\n\nexport interface SwitchProps\n extends\n Omit<React.ComponentPropsWithoutRef<typeof SwitchPrimitive.Root>, \"size\">,\n VariantProps<typeof switchVariants> {\n /** Optional inline label rendered to the right of the track. Names the button through `htmlFor`. */\n label?: string | undefined;\n /** The value submitted with `name` while on. Default `\"on\"`, like a native checkbox. */\n value?: string;\n /**\n * The switch is in error: `aria-invalid` and `data-invalid`. Implied by the\n * surrounding `Field`'s `invalid` or a mounted `FieldError`.\n */\n invalid?: boolean;\n}\n\nexport const Switch = React.forwardRef<React.ElementRef<typeof SwitchPrimitive.Root>, SwitchProps>(\n function Switch(\n {\n label,\n size,\n className,\n id,\n name,\n invalid,\n required,\n disabled,\n form,\n checked: checkedProp,\n defaultChecked,\n onCheckedChange,\n \"aria-labelledby\": ariaLabelledBy,\n \"aria-describedby\": ariaDescribedBy,\n \"aria-invalid\": ariaInvalid,\n ...props\n },\n ref,\n ) {\n const fieldset = useFieldsetContext();\n const wiring = useFieldControl({\n id,\n name,\n invalid,\n required,\n disabled: disabled ?? (fieldset?.disabled ? true : undefined),\n \"aria-labelledby\": ariaLabelledBy,\n \"aria-describedby\": ariaDescribedBy,\n });\n\n // The state lives here so a form reset can restore it (Radix Switch does\n // not listen to `reset`). Controlled and uncontrolled both work.\n const [checked, setChecked] = useControllableState<boolean>({\n prop: checkedProp,\n defaultProp: defaultChecked ?? false,\n onChange: onCheckedChange,\n });\n const initialChecked = React.useRef(checkedProp ?? defaultChecked ?? false);\n const rootRef = React.useRef<HTMLButtonElement>(null);\n useFormReset(rootRef, () => setChecked(initialChecked.current), form);\n const mergedRef = useMergedRefs(ref, rootRef);\n\n const root = (\n <SwitchPrimitive.Root\n ref={mergedRef}\n id={wiring.id}\n name={wiring.name}\n {...(wiring.required !== undefined && { required: wiring.required })}\n disabled={wiring.disabled}\n form={form}\n checked={checked}\n onCheckedChange={setChecked}\n aria-labelledby={wiring[\"aria-labelledby\"]}\n aria-describedby={wiring[\"aria-describedby\"]}\n aria-invalid={ariaInvalid ?? wiring[\"aria-invalid\"]}\n data-invalid={wiring[\"data-invalid\"]}\n {...slot(switchAnatomy, \"root\")}\n {...stateAttributes({ size: size ?? \"md\" })}\n className={cn(switchVariants({ size }), className)}\n {...props}\n >\n <SwitchPrimitive.Thumb\n {...slot(switchAnatomy, \"thumb\")}\n className={cn(switchThumbVariants({ size }))}\n />\n </SwitchPrimitive.Root>\n );\n\n if (!label) return root;\n\n return (\n <div className=\"ds:inline-flex ds:items-center ds:gap-2\">\n {root}\n <label\n htmlFor={wiring.id}\n {...slot(switchAnatomy, \"label\")}\n className=\"ds:text-fg ds:peer-disabled:text-fg-disabled ds:cursor-pointer ds:text-[13px] ds:leading-none ds:select-none ds:peer-disabled:cursor-not-allowed\"\n >\n {label}\n </label>\n </div>\n );\n },\n);\n\nSwitch.displayName = SwitchPrimitive.Root.displayName;\n","\"use client\";\n\nimport { createContext, forwardRef, useContext, useEffect, useRef, useState } from \"react\";\n\nimport { tableAnatomy, type TableSlot } from \"../foundation/anatomy/slots\";\nimport { slot, stateAttributes } from \"../foundation/anatomy/slot\";\nimport type { TableMessages } from \"../foundation/messages/types\";\nimport { useDsMessages } from \"../foundation/provider/context\";\nimport type { ThemeDensity } from \"../foundation/theme/theme-scope\";\nimport { cn } from \"../lib/cn\";\n\nimport { ChevronDownIcon, ChevronsUpDownIcon, ChevronUpIcon } from \"./icons\";\nimport { Pressable } from \"./pressable\";\n\n/**\n * Table — semantic data-table primitives:\n * - sentence-case headers in the body font (14px, medium, `text-fg-3`)\n * on `bg-surface-2` — quiet column labels; `headerStyle=\"overline\"`\n * is the mono uppercase eyebrow for the products that still want it\n * - 1px `border-rule` under header, `border-rule-soft` between rows\n * - 13px body cells in `text-fg-2`, airy 44px rows, hover gets the\n * `surface-hover` wash\n *\n * Public API: Table / TableHeader / TableBody / TableRow /\n * TableHead / TableCell / TableCaption. `wrapperClassName` wraps\n * the responsive overflow container.\n *\n * Native `table/thead/tbody/tr/th/td` are permanent (P-NATIVE-TABLE), as is\n * `data-state=\"selected\"` on a row (P-DATA-STATE): the props added in W6-01\n * only ever add attributes and classes to that DOM. A table rendered with\n * none of them renders the same attributes and pixels it rendered before.\n */\n\n/** The table parts (ADR-008). See the registry for the doc comment. */\nexport type { TableSlot };\n/** The copy `Table` renders; see `TableProps[\"messages\"]`. @experimental */\nexport type { TableMessages };\n\n/**\n * How `TableHead` sets its column labels (W6-02).\n * - `plain` (default) — sentence case in the body font, 14px medium, `text-fg-3`.\n * This is what Table renders today and what Pro's `HEADER_CLS` override\n * reproduces by hand.\n * - `overline` — the mono uppercase eyebrow (`text-overline` role, `text-fg-4`).\n *\n * @experimental\n */\nexport type TableHeaderStyle = \"plain\" | \"overline\";\n\n/** Horizontal alignment of a cell's content, in logical (writing-direction) terms. @experimental */\nexport type TableCellAlign = \"start\" | \"center\" | \"end\";\n\n/** Which edge a cell sticks to while the wrapper scrolls horizontally (W6-10). @experimental */\nexport type TableStickyEdge = \"start\" | \"end\";\n\n/** A column's sort direction; `null` is \"sortable, not sorted\". @experimental */\nexport type TableSortDirection = \"asc\" | \"desc\";\n\ninterface TableContextValue {\n headerStyle: TableHeaderStyle;\n stickyHeader: boolean;\n}\n\nconst DEFAULT_TABLE_CONTEXT: TableContextValue = { headerStyle: \"plain\", stickyHeader: false };\nconst TableContext = createContext<TableContextValue>(DEFAULT_TABLE_CONTEXT);\n\nexport interface TableProps extends React.TableHTMLAttributes<HTMLTableElement> {\n /** Class for the wrapping `div` that handles overflow. */\n wrapperClassName?: string;\n /**\n * Per-part classes (W2-17 pattern). `wrapper` is the overflow container —\n * the same element `wrapperClassName` styles (C-CLASSNAME-PROPS).\n *\n * @experimental\n */\n classNames?: Partial<Record<Extract<TableSlot, \"wrapper\">, string>>;\n /**\n * The header label style (W6-02). Default `plain` — today's sentence-case\n * labels. `overline` renders the mono uppercase eyebrow.\n *\n * @experimental\n */\n headerStyle?: TableHeaderStyle;\n /**\n * Row density (W6-11). Stamps `data-ds-density` on the wrapper, so the\n * whole table — its rows and the controls inside them — renders one step\n * denser: 36px rows, 12px horizontal and 8px vertical cell padding, read\n * from the `--ds-table-*` tokens the scope re-points. Undefined leaves the\n * table on the ambient scope (ADR-013: density is a scope; this prop is the\n * scope on the table's own element).\n *\n * @experimental\n */\n density?: ThemeDensity;\n /**\n * Keep the header row visible while the wrapper scrolls vertically (W6-10).\n * Give the wrapper a height (`wrapperClassName=\"max-h-96\"`) for it to\n * scroll. Header cells become `position: sticky` with the surface-2\n * background they already have.\n *\n * @experimental\n */\n stickyHeader?: boolean;\n /**\n * Copy for this table; prop > provider > English default (W5-20). The only\n * message today is the accessible name of the horizontal scroll region\n * (`region`).\n *\n * @experimental\n */\n messages?: Partial<TableMessages>;\n}\n\n/**\n * Whether the wrapper scrolls — its columns overflow it, or its rows do when\n * it has a height (`stickyHeader`). Measured with a ResizeObserver (SSR renders\n * \"not overflowing\"); the wrapper only becomes a focusable, labelled region\n * when there is actually something to scroll — a table that fits gets no tab\n * stop, and its DOM stays what it was (C-DOM-09).\n */\nfunction useOverflowing(target: React.RefObject<HTMLElement | null>): boolean {\n const [overflowing, setOverflowing] = useState(false);\n useEffect(() => {\n const element = target.current;\n if (!element || typeof ResizeObserver === \"undefined\") return;\n const measure = () =>\n setOverflowing(\n element.scrollWidth > element.clientWidth + 1 ||\n element.scrollHeight > element.clientHeight + 1,\n );\n measure();\n const observer = new ResizeObserver(measure);\n observer.observe(element);\n const table = element.firstElementChild;\n if (table) observer.observe(table);\n return () => observer.disconnect();\n }, [target]);\n return overflowing;\n}\n\nexport const Table = forwardRef<HTMLTableElement, TableProps>(function Table(\n {\n className,\n wrapperClassName,\n classNames,\n headerStyle = \"plain\",\n density,\n stickyHeader = false,\n messages: messagesOverride,\n ...props\n },\n ref,\n) {\n const messages = useDsMessages(\"table\", messagesOverride);\n const wrapperRef = useRef<HTMLDivElement>(null);\n const overflowing = useOverflowing(wrapperRef);\n const context: TableContextValue =\n headerStyle === \"plain\" && !stickyHeader\n ? DEFAULT_TABLE_CONTEXT\n : { headerStyle, stickyHeader };\n\n return (\n <div\n ref={wrapperRef}\n {...slot(tableAnatomy, \"wrapper\")}\n {...(density === undefined ? {} : { \"data-ds-density\": density })}\n {...(overflowing ? { role: \"region\", \"aria-label\": messages.region, tabIndex: 0 } : {})}\n className={cn(\n \"ds:rounded-card ds:border-rule-strong ds:bg-surface ds:w-full ds:overflow-x-auto ds:border ds:shadow-quiet\",\n overflowing &&\n \"ds:focus-visible:outline-none ds:focus-visible:[box-shadow:var(--shadow-focus-ring)]\",\n wrapperClassName,\n classNames?.wrapper,\n )}\n >\n <TableContext.Provider value={context}>\n <table\n ref={ref}\n {...slot(tableAnatomy, \"root\")}\n className={cn(\"ds:w-full ds:caption-bottom ds:border-collapse ds:text-sm\", className)}\n {...props}\n />\n </TableContext.Provider>\n </div>\n );\n});\nTable.displayName = \"Table\";\n\nexport type TableHeaderProps = React.HTMLAttributes<HTMLTableSectionElement>;\n\nexport const TableHeader = forwardRef<HTMLTableSectionElement, TableHeaderProps>(\n function TableHeader({ className, ...props }, ref) {\n return (\n <thead\n ref={ref}\n {...slot(tableAnatomy, \"header\")}\n className={cn(\"ds:[&_tr]:border-rule ds:[&_tr]:border-b\", className)}\n {...props}\n />\n );\n },\n);\nTableHeader.displayName = \"TableHeader\";\n\nexport type TableBodyProps = React.HTMLAttributes<HTMLTableSectionElement>;\n\nexport const TableBody = forwardRef<HTMLTableSectionElement, TableBodyProps>(function TableBody(\n { className, ...props },\n ref,\n) {\n return (\n <tbody\n ref={ref}\n {...slot(tableAnatomy, \"body\")}\n className={cn(\"ds:[&_tr:last-child]:border-0\", className)}\n {...props}\n />\n );\n});\nTableBody.displayName = \"TableBody\";\n\nexport type TableFooterProps = React.HTMLAttributes<HTMLTableSectionElement>;\n\nexport const TableFooter = forwardRef<HTMLTableSectionElement, TableFooterProps>(\n function TableFooter({ className, ...props }, ref) {\n return (\n <tfoot\n ref={ref}\n {...slot(tableAnatomy, \"footer\")}\n className={cn(\n \"ds:border-rule ds:bg-surface-2 ds:border-t ds:font-medium ds:[&>tr]:last:border-b-0\",\n className,\n )}\n {...props}\n />\n );\n },\n);\nTableFooter.displayName = \"TableFooter\";\n\nexport interface TableRowProps extends React.HTMLAttributes<HTMLTableRowElement> {\n /**\n * The row is part of the current selection: renders `data-state=\"selected\"`\n * (P-DATA-STATE — the attribute consumers already set by hand keeps working)\n * and the brand tint.\n *\n * @experimental\n */\n selected?: boolean | undefined;\n /**\n * The row itself is a click target (W6-01): a tab stop with a focus ring,\n * Enter and Space fire `onClick` — Pressable's contract on a `<tr>`, which\n * stays a `<tr>` (P-NATIVE-TABLE; a `role=\"button\"` would take its cells\n * out of the table). Keys pressed on a control inside the row (a checkbox,\n * a menu button) are left to that control.\n *\n * @experimental\n */\n interactive?: boolean;\n}\n\nexport const TableRow = forwardRef<HTMLTableRowElement, TableRowProps>(function TableRow(\n { className, selected, interactive = false, onKeyDown, tabIndex, ...props },\n ref,\n) {\n const handleKeyDown = (event: React.KeyboardEvent<HTMLTableRowElement>) => {\n onKeyDown?.(event);\n if (event.defaultPrevented || event.target !== event.currentTarget) return;\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n event.currentTarget.click();\n }\n };\n\n return (\n <tr\n ref={ref}\n {...slot(tableAnatomy, \"row\")}\n {...(selected ? { \"data-state\": \"selected\" } : {})}\n {...(interactive\n ? { tabIndex: tabIndex ?? 0, onKeyDown: handleKeyDown }\n : { tabIndex, onKeyDown })}\n className={cn(\n \"ds:border-rule-soft ds:border-b ds:transition-colors ds:duration-[var(--duration-instant)] ds:ease-[var(--ease-out-quart)] ds:motion-reduce:transition-none\",\n // G15 compound: selected wins over hover; selected+hover uses the\n // Pro hover tint (not bg-bg-2, which would fight the selection).\n \"ds:data-[state=selected]:bg-brand-bg ds:data-[state=selected]:hover:bg-brand-bg-hover\",\n \"ds:[&:not([data-state=selected])]:hover:bg-surface-hover\",\n // An outline rather than the box-shadow ring: collapsed-border tables\n // do not paint a row's box-shadow, and an inset outline stays inside\n // the wrapper's overflow.\n interactive &&\n \"ds:cursor-pointer ds:focus-visible:outline-2 ds:focus-visible:-outline-offset-2 ds:focus-visible:outline-[var(--focus-ring-border)]\",\n className,\n )}\n {...props}\n />\n );\n});\nTableRow.displayName = \"TableRow\";\n\n/** The props `TableHead` and `TableCell` share (W6-01). @experimental */\nexport interface TableCellCommonProps {\n /**\n * Content alignment, logical: `end` is what a consumer wrote `text-right`\n * for (60 times in Pro). Default `start`. Replaces the deprecated HTML\n * `align` attribute on the cell, which no consumer passes.\n */\n align?: TableCellAlign | undefined;\n /** A column of figures: tabular numerals and `end` alignment. */\n numeric?: boolean | undefined;\n /** Clip overflowing content with an ellipsis (`truncate`, `max-width: 0`); pair with `width`. */\n truncate?: boolean | undefined;\n /** Column width, as a CSS length or a pixel number — an inline `width` on the cell. */\n width?: number | string | undefined;\n /**\n * Stick the cell to the `start` or `end` edge while the wrapper scrolls\n * horizontally (W6-10): the Pro sticky action column. The cell paints the\n * surface it sits on so scrolled content never shows through it.\n */\n sticky?: TableStickyEdge | undefined;\n}\n\n/**\n * The geometry a cell reads from the `--table-*` tokens *inside a density\n * scope* (W6-11). Outside one the utilities on the part apply unchanged, so a\n * table with no scope renders the same pixels; inside `[data-ds-density]`\n * these win and the scope decides the numbers. The checkbox column keeps its\n * `pr-0` in both.\n */\nconst CELL_DENSITY =\n \"ds:[[data-ds-density]_&]:px-(--table-cell-padding-x) ds:[[data-ds-density]_&]:py-(--table-cell-padding-y) ds:[[data-ds-density]_&:has([role=checkbox])]:pr-0\";\nconst HEAD_DENSITY =\n \"ds:[[data-ds-density]_&]:h-(--table-row-height) ds:[[data-ds-density]_&]:px-(--table-cell-padding-x) ds:[[data-ds-density]_&]:py-(--table-head-padding-y) ds:[[data-ds-density]_&:has([role=checkbox])]:pr-0\";\n\nconst ALIGN_CLASSES: Record<TableCellAlign, string> = {\n start: \"ds:text-start\",\n center: \"ds:text-center\",\n end: \"ds:text-end\",\n};\n\n/**\n * A sticky cell in a collapsed-border table loses its painted border while it\n * is stuck, so the edge rule is an inset shadow; the surface behind it is the\n * row's (hover and selection included) for a body cell, the header surface\n * for a head cell. Layering stays local to the table — a stuck body cell is\n * positioned, so it already paints over the static cells it slides across; a\n * stuck header row sits one step above those, the corner cell two — so the\n * page's own `--z-sticky` chrome keeps winning over all of them.\n */\nconst STICKY_HEADER_Z = \"ds:z-[calc(var(--z-base)+1)]\";\nconst STICKY_CORNER_Z = \"ds:z-[calc(var(--z-base)+2)]\";\nconst STICKY_CLASSES: Record<TableStickyEdge, string> = {\n start: \"ds:sticky ds:start-0 ds:[box-shadow:inset_-1px_0_0_var(--color-rule-soft)]\",\n end: \"ds:sticky ds:end-0 ds:[box-shadow:inset_1px_0_0_var(--color-rule-soft)]\",\n};\nconst STICKY_CELL_SURFACE =\n \"ds:bg-surface ds:[tr:hover>&]:bg-surface-hover ds:[tr[data-state=selected]>&]:bg-brand-bg ds:[tr[data-state=selected]:hover>&]:bg-brand-bg-hover\";\n\nfunction cellCommon(\n { align, numeric, truncate, sticky }: TableCellCommonProps,\n stickySurface: string,\n): string {\n const resolvedAlign = align ?? (numeric ? \"end\" : undefined);\n return cn(\n resolvedAlign && ALIGN_CLASSES[resolvedAlign],\n numeric && \"ds:tabular-nums\",\n truncate && \"ds:max-w-0 ds:truncate\",\n sticky && STICKY_CLASSES[sticky],\n sticky && stickySurface,\n );\n}\n\nfunction widthStyle(\n width: number | string | undefined,\n style: React.CSSProperties | undefined,\n): React.CSSProperties | undefined {\n if (width === undefined) return style;\n return { width, ...style };\n}\n\nexport interface TableHeadProps\n extends Omit<React.ThHTMLAttributes<HTMLTableCellElement>, \"align\">, TableCellCommonProps {\n /**\n * The column's sort state (W6-01): `\"asc\"`, `\"desc\"`, or `null` for a\n * sortable column that is not sorted. Undefined (the default) is a plain,\n * unsortable header. Setting it renders the label inside a `<button>` that\n * cycles none → asc → desc → none through `onSortChange` (the order\n * `DataTableHeader` has always used) and reflects the state as `aria-sort`\n * and `data-state`. The `<th>`'s text stays the label alone (C-DOM-14).\n *\n * @experimental\n */\n sort?: TableSortDirection | null | undefined;\n /** Receives the next step of the sort cycle when the header is activated. */\n onSortChange?: ((sort: TableSortDirection | null) => void) | undefined;\n}\n\n/** The label typography per header style; the default lives on the part itself. */\nconst HEAD_TYPOGRAPHY: Record<TableHeaderStyle, string> = {\n plain: \"ds:font-sans ds:text-sm ds:font-medium ds:tracking-normal ds:normal-case ds:text-fg-3\",\n overline:\n \"ds:font-mono ds:text-overline ds:font-medium ds:tracking-[0.14em] ds:uppercase ds:text-fg-4\",\n};\n\nexport const TableHead = forwardRef<HTMLTableCellElement, TableHeadProps>(function TableHead(\n {\n className,\n align,\n numeric,\n truncate,\n width,\n sticky,\n sort,\n onSortChange,\n style,\n children,\n ...props\n },\n ref,\n) {\n const { headerStyle, stickyHeader } = useContext(TableContext);\n const sortable = sort !== undefined;\n const ariaSort: React.AriaAttributes[\"aria-sort\"] = sortable\n ? sort === \"asc\"\n ? \"ascending\"\n : sort === \"desc\"\n ? \"descending\"\n : \"none\"\n : undefined;\n\n const handleSort = () => {\n const next: TableSortDirection | null = sort === null ? \"asc\" : sort === \"asc\" ? \"desc\" : null;\n onSortChange?.(next);\n };\n\n return (\n <th\n ref={ref}\n {...slot(tableAnatomy, \"head\")}\n {...(sortable\n ? { \"aria-sort\": ariaSort, ...stateAttributes({ state: sort ?? undefined }) }\n : {})}\n className={cn(\n // Sentence-case column labels in the body font (Plus Jakarta Sans),\n // quiet gray — not mono uppercase eyebrows.\n \"ds:h-11 ds:px-4 ds:py-2.5 ds:text-left ds:align-middle ds:whitespace-nowrap\",\n \"ds:font-sans ds:text-[13px] ds:font-medium ds:tracking-[0.01em] ds:normal-case ds:tabular-nums\",\n \"ds:text-fg-3 ds:bg-surface-2\",\n \"ds:border-rule ds:border-b\",\n \"ds:[&:has([role=checkbox])]:pr-0\",\n HEAD_DENSITY,\n headerStyle !== \"plain\" && HEAD_TYPOGRAPHY[headerStyle],\n // Stuck header cells lose their collapsed border: the rule is an inset shadow.\n stickyHeader &&\n cn(\n \"ds:sticky ds:top-0 ds:[box-shadow:inset_0_-1px_0_var(--color-rule)]\",\n STICKY_HEADER_Z,\n ),\n // A head cell that is both a sticky column and in a sticky header is the corner: above both.\n cellCommon({ align, numeric, truncate, sticky }, STICKY_CORNER_Z),\n className,\n )}\n style={widthStyle(width, style)}\n {...props}\n >\n {sortable ? (\n <Pressable\n onClick={handleSort}\n {...slot(tableAnatomy, \"sort\")}\n className={cn(\n \"ds:-mx-1 ds:-my-1 ds:inline-flex ds:items-center ds:gap-1 ds:rounded-icon ds:px-1 ds:py-1\",\n HEAD_TYPOGRAPHY[headerStyle],\n \"ds:transition-colors ds:duration-[var(--duration-fast)] ds:ease-[var(--ease-out-quart)] ds:motion-reduce:transition-none\",\n \"ds:hover:text-fg\",\n )}\n >\n {children}\n <span\n aria-hidden=\"true\"\n {...slot(tableAnatomy, \"sort-indicator\")}\n className={cn(\n \"ds:text-fg-5 ds:inline-flex ds:shrink-0 ds:items-center ds:justify-center\",\n sort && \"ds:text-fg-3\",\n )}\n >\n {sort === \"asc\" ? (\n <ChevronUpIcon className=\"ds:size-3\" strokeWidth={2.2} />\n ) : sort === \"desc\" ? (\n <ChevronDownIcon className=\"ds:size-3\" strokeWidth={2.2} />\n ) : (\n <ChevronsUpDownIcon className=\"ds:size-3\" strokeWidth={2} />\n )}\n </span>\n </Pressable>\n ) : (\n children\n )}\n </th>\n );\n});\nTableHead.displayName = \"TableHead\";\n\nexport interface TableCellProps\n extends Omit<React.TdHTMLAttributes<HTMLTableCellElement>, \"align\">, TableCellCommonProps {\n /**\n * Secondary content — `text-fg-3` (content-muted), what a consumer wrote\n * `text-muted-foreground` for (90 times in Pro).\n */\n muted?: boolean;\n}\n\nexport const TableCell = forwardRef<HTMLTableCellElement, TableCellProps>(function TableCell(\n { className, align, numeric, muted, truncate, width, sticky, style, ...props },\n ref,\n) {\n return (\n <td\n ref={ref}\n {...slot(tableAnatomy, \"cell\")}\n className={cn(\n // 13px, fg-2, soft 1px row divider, tabular nums; airier vertical\n // rhythm (py-3) for the taller rows in the catalog layout.\n \"ds:text-fg-2 ds:px-4 ds:py-3 ds:align-middle ds:text-[13px] ds:tabular-nums\",\n \"ds:[&:has([role=checkbox])]:pr-0\",\n CELL_DENSITY,\n muted && \"ds:text-fg-3\",\n cellCommon({ align, numeric, truncate, sticky }, STICKY_CELL_SURFACE),\n className,\n )}\n style={widthStyle(width, style)}\n {...props}\n />\n );\n});\nTableCell.displayName = \"TableCell\";\n\nexport type TableCaptionProps = React.HTMLAttributes<HTMLTableCaptionElement>;\n\nexport const TableCaption = forwardRef<HTMLTableCaptionElement, TableCaptionProps>(\n function TableCaption({ className, ...props }, ref) {\n return (\n <caption\n ref={ref}\n {...slot(tableAnatomy, \"caption\")}\n className={cn(\"ds:text-fg-3 ds:mt-3 ds:text-sm\", className)}\n {...props}\n />\n );\n },\n);\nTableCaption.displayName = \"TableCaption\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as TabsPrimitive from \"@radix-ui/react-tabs\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"../lib/cn\";\nimport { microInteractions } from \"../lib/micro-interactions\";\n\n/* -------------------------------------------------------------------------- */\n/* Tabs root */\n/* -------------------------------------------------------------------------- */\n\ntype TabsProps = React.ComponentPropsWithoutRef<typeof TabsPrimitive.Root>;\n\nexport const Tabs = React.forwardRef<React.ElementRef<typeof TabsPrimitive.Root>, TabsProps>(\n function Tabs({ className, ...props }, ref) {\n return <TabsPrimitive.Root ref={ref} className={cn(className)} {...props} />;\n },\n);\nTabs.displayName = TabsPrimitive.Root.displayName;\n\n/* -------------------------------------------------------------------------- */\n/* TabsList */\n/* Per spec §5 / 04-client-detail.html: a flush row sitting on a 1px rule. */\n/* -------------------------------------------------------------------------- */\n\ntype TabsListProps = React.ComponentPropsWithoutRef<typeof TabsPrimitive.List>;\n\nexport const TabsList = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.List>,\n TabsListProps\n>(function TabsList({ className, ...props }, ref) {\n return (\n <TabsPrimitive.List\n ref={ref}\n className={cn(\"ds:border-rule ds:flex ds:items-center ds:gap-0 ds:border-b\", className)}\n {...props}\n />\n );\n});\nTabsList.displayName = TabsPrimitive.List.displayName;\n\n/* -------------------------------------------------------------------------- */\n/* TabsTrigger — pill | underline (default underline, matches mockup) */\n/* -------------------------------------------------------------------------- */\n\nconst triggerVariants = cva(\n cn(\n \"ds:inline-flex ds:items-center ds:justify-center ds:gap-2 ds:text-[13px] ds:font-medium\",\n \"ds:text-fg-3\",\n microInteractions.selection,\n \"ds:focus-visible:outline-none ds:focus-visible:[box-shadow:var(--shadow-focus-ring)]\",\n \"ds:disabled:pointer-events-none ds:disabled:cursor-not-allowed ds:disabled:text-fg-disabled\",\n \"ds:hover:text-fg\",\n ),\n {\n variants: {\n variant: {\n // §5.16: tab current = 2px accent underline + bold foreground text.\n // The cyan rule carries the brand statement (tabs are interaction,\n // so cyan; Pro purple is reserved for selection state on\n // list/dropdown surfaces). The active LABEL stays in `text-fg` for\n // legibility — accent on text was too low-contrast against the page\n // background, especially in dark mode.\n underline: cn(\n \"ds:rounded-none ds:bg-transparent ds:px-3.5 ds:py-2.5\",\n \"ds:border-b-2 ds:border-transparent ds:-mb-px\",\n \"ds:data-[state=active]:border-accent ds:data-[state=active]:text-fg ds:data-[state=active]:font-semibold\",\n ),\n pill: cn(\n \"ds:rounded-pill ds:px-3 ds:py-1.5\",\n \"ds:data-[state=active]:bg-brand-bg ds:data-[state=active]:text-brand\",\n ),\n },\n },\n defaultVariants: {\n variant: \"underline\",\n },\n },\n);\n\ninterface TabsTriggerProps\n extends\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>,\n VariantProps<typeof triggerVariants> {}\n\nexport const TabsTrigger = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Trigger>,\n TabsTriggerProps\n>(function TabsTrigger({ className, variant, ...props }, ref) {\n return (\n <TabsPrimitive.Trigger\n ref={ref}\n className={cn(triggerVariants({ variant }), className)}\n {...props}\n />\n );\n});\nTabsTrigger.displayName = TabsPrimitive.Trigger.displayName;\n\n/* -------------------------------------------------------------------------- */\n/* TabsContent */\n/* -------------------------------------------------------------------------- */\n\ntype TabsContentProps = React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content>;\n\nexport const TabsContent = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Content>,\n TabsContentProps\n>(function TabsContent({ className, ...props }, ref) {\n return (\n <TabsPrimitive.Content\n ref={ref}\n className={cn(\n \"ds:mt-3 ds:focus-visible:outline-none\",\n \"ds:focus-visible:[box-shadow:var(--shadow-focus-ring)]\",\n className,\n )}\n {...props}\n />\n );\n});\nTabsContent.displayName = TabsPrimitive.Content.displayName;\n","\"use client\";\n\nimport * as React from \"react\";\n\nimport { Badge } from \"../primitives/badge\";\nimport { Select, type SelectOption } from \"../primitives/select\";\n\n/* ───────────────────────────────────────────────────────────────────────\n * TeamMemberSelect — assignee picker, built on the new Radix-based\n * `Select` primitive.\n *\n * Public API preserved verbatim:\n * <TeamMemberSelect\n * teamMembers currentUserId\n * value onValueChange\n * includeUnassigned placeholder\n * />\n *\n * Behaviour:\n * - Sort: current user first (when `currentUserId` matches), then\n * alphabetical on `fullName`.\n * - Current user is annotated with a small \"Me\" badge as the\n * `labelSuffix` of its option.\n * - When `includeUnassigned` is true (default), prepends a sentinel\n * `__unassigned__` option labelled \"Unassigned\". Note: legacy code\n * used `value: \"\"` for this, but Radix Select forbids empty-string\n * item values. We map \"\" ↔ \"__unassigned__\" transparently so the\n * consumer-facing contract (`value: \"\"` ⇔ unassigned) is preserved.\n * ─────────────────────────────────────────────────────────────────────── */\n\nconst UNASSIGNED_VALUE = \"__unassigned__\";\n\ninterface TeamMember {\n id: string;\n fullName: string;\n}\n\ninterface TeamMemberSelectProps {\n teamMembers: TeamMember[];\n currentUserId?: string | null;\n value: string;\n onValueChange: (value: string) => void;\n includeUnassigned?: boolean;\n placeholder?: string;\n className?: string;\n}\n\n/**\n * @deprecated Frozen in `/legacy` (W8-09): no known consumer, no feature work.\n * Owner: TAX, which keeps a local `TeamMemberPicker`; new code uses\n * `PeoplePicker` (W7-10). Never removed before 3.0.\n */\nexport function TeamMemberSelect({\n teamMembers,\n currentUserId,\n value,\n onValueChange,\n includeUnassigned = true,\n placeholder = \"Select team member...\",\n className,\n}: TeamMemberSelectProps) {\n const options = React.useMemo<SelectOption[]>(() => {\n const meBadge = (\n <Badge\n variant=\"secondary\"\n size=\"sm\"\n className=\"ds:px-1.5 ds:py-0 ds:font-mono ds:text-[10px] ds:tracking-wider ds:uppercase\"\n >\n Me\n </Badge>\n );\n\n // Sort: current user first, then alphabetical\n const sorted = [...teamMembers].sort((a, b) => {\n if (currentUserId) {\n if (a.id === currentUserId) return -1;\n if (b.id === currentUserId) return 1;\n }\n return a.fullName.localeCompare(b.fullName);\n });\n\n const memberOptions: SelectOption[] = sorted.map((m) => ({\n value: m.id,\n label: m.fullName,\n labelSuffix: m.id === currentUserId ? meBadge : undefined,\n }));\n\n if (includeUnassigned) {\n return [{ value: UNASSIGNED_VALUE, label: \"Unassigned\" }, ...memberOptions];\n }\n\n return memberOptions;\n }, [teamMembers, currentUserId, includeUnassigned]);\n\n // Map \"\" (legacy unassigned) ↔ sentinel for Radix.\n const innerValue = value === \"\" ? UNASSIGNED_VALUE : value;\n const handleChange = (next: string) => {\n onValueChange(next === UNASSIGNED_VALUE ? \"\" : next);\n };\n\n return (\n <Select\n options={options}\n value={innerValue}\n onValueChange={handleChange}\n placeholder={placeholder}\n className={className}\n />\n );\n}\n\nTeamMemberSelect.displayName = \"TeamMemberSelect\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as ToggleGroupPrimitive from \"@radix-ui/react-toggle-group\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { stateAttributes } from \"../foundation/anatomy/slot\";\nimport { useMergedRefs } from \"../foundation/merge-refs\";\nimport { useControllableState } from \"../foundation/use-controllable-state\";\nimport type { ControlSize } from \"../foundation/vocab\";\nimport { cn } from \"../lib/cn\";\nimport { microInteractions } from \"../lib/micro-interactions\";\n\nimport { CONTROL_SIZE_CLASSES } from \"./behavior/control-size\";\nimport { FormBridge } from \"./behavior/form-bridge\";\nimport { useFieldsetContext } from \"./field/internal/fieldset-context\";\nimport { useFieldControl } from \"./field/use-field-control\";\n\n/* -------------------------------------------------------------------------- */\n/* ToggleGroup (W4-16, plan §16.1) */\n/* Wraps Radix ToggleGroup; preserves single|multiple + default|outline. */\n/* */\n/* Sizes: without `size` an item keeps today's geometry (px-3 py-1.5, */\n/* 13px text — ~32px tall). With `size` it reads the shared control scale */\n/* (A1, ADR-013): `size=\"sm\"` is the `sm` height of every control. */\n/* */\n/* Forms: Radix ToggleGroup renders no native field, so participation goes */\n/* through FormBridge (ADR-006 §1): with `name`, a single group submits */\n/* `name=value` (`name=\"\"` while nothing is pressed, like a Select), a */\n/* multiple group one entry per pressed value in order (nothing while */\n/* empty); `required` blocks the submission while empty; `disabled` submits */\n/* nothing; a form reset restores `defaultValue`. */\n/* */\n/* Field / Fieldset: the group references the Field's Label or the */\n/* Fieldset's legend through `aria-labelledby`, and takes the Field's */\n/* `name`, `required`, `disabled`, `invalid` and `aria-describedby`. */\n/* -------------------------------------------------------------------------- */\n\nconst itemVariants = cva(\n cn(\n \"ds:inline-flex ds:items-center ds:justify-center ds:rounded-pill ds:px-3 ds:py-1.5 ds:text-[13px] ds:font-medium\",\n \"ds:text-fg-3\",\n microInteractions.selection,\n \"ds:hover:bg-surface-hover ds:hover:text-fg\",\n \"ds:focus-visible:outline-none ds:focus-visible:[box-shadow:var(--shadow-focus-ring)]\",\n \"ds:disabled:pointer-events-none ds:disabled:cursor-not-allowed ds:disabled:bg-bg-disabled ds:disabled:text-fg-disabled\",\n \"ds:data-[state=on]:bg-brand-bg ds:data-[state=on]:text-brand\",\n ),\n {\n variants: {\n variant: {\n default: \"\",\n outline: \"ds:border ds:border-rule-strong ds:bg-surface\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\n/** An item on the shared control scale: the scale row replaces the legacy padding and text size. */\nconst sizedItemVariants = cva(\n cn(\n \"ds:inline-flex ds:items-center ds:justify-center ds:rounded-pill ds:font-medium\",\n \"ds:text-fg-3\",\n microInteractions.selection,\n \"ds:hover:bg-surface-hover ds:hover:text-fg\",\n \"ds:focus-visible:outline-none ds:focus-visible:[box-shadow:var(--shadow-focus-ring)]\",\n \"ds:disabled:pointer-events-none ds:disabled:cursor-not-allowed ds:disabled:bg-bg-disabled ds:disabled:text-fg-disabled\",\n \"ds:data-[state=on]:bg-brand-bg ds:data-[state=on]:text-brand\",\n ),\n {\n variants: {\n variant: {\n default: \"\",\n outline: \"ds:border ds:border-rule-strong ds:bg-surface\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\n/** The toggle-group sizes: the shared control scale (A1). */\nexport type ToggleGroupSize = ControlSize;\n\n/** The item's look: bare (`default`) or with a border (`outline`). */\nexport type ToggleGroupVariant = NonNullable<VariantProps<typeof itemVariants>[\"variant\"]>;\n\ninterface ToggleGroupContextValue {\n variant: ToggleGroupVariant | null | undefined;\n size: ToggleGroupSize | undefined;\n}\n\nconst ToggleGroupContext = React.createContext<ToggleGroupContextValue>({\n variant: \"default\",\n size: undefined,\n});\n\ntype RadixRootProps = React.ComponentPropsWithoutRef<typeof ToggleGroupPrimitive.Root>;\n\n/** The props every group shares, whatever its `type`. */\nexport interface ToggleGroupFormProps extends VariantProps<typeof itemVariants> {\n /** Outer height from the shared control scale (A1). Omitted: today's geometry. */\n size?: ToggleGroupSize | undefined;\n /** The form field name. Without it the group does not take part in a form. */\n name?: string | undefined;\n /** `id` of the form to submit with when the group is rendered outside it. */\n form?: string | undefined;\n /** Block native submission while nothing is pressed. */\n required?: boolean | undefined;\n /**\n * The group is in error: `aria-invalid` and `data-invalid`. Implied by the\n * surrounding `Field`'s `invalid` or a mounted `FieldError`.\n */\n invalid?: boolean | undefined;\n /**\n * Single groups only: submit `name=\"\"` while nothing is pressed (`true`,\n * the default and what a Select does) or omit the entry (`false`).\n */\n submitEmpty?: boolean | undefined;\n}\n\nexport type ToggleGroupProps = RadixRootProps & ToggleGroupFormProps;\n\nexport const ToggleGroup = React.forwardRef<\n React.ElementRef<typeof ToggleGroupPrimitive.Root>,\n ToggleGroupProps\n>(function ToggleGroup(\n {\n className,\n variant,\n size,\n children,\n id,\n name,\n form,\n required,\n invalid,\n submitEmpty,\n disabled,\n \"aria-labelledby\": ariaLabelledBy,\n \"aria-describedby\": ariaDescribedBy,\n \"aria-invalid\": ariaInvalid,\n ...rest\n },\n ref,\n) {\n // The discriminated union is narrowed by `type` at the call site; inside,\n // the value is a string (single) or a list (multiple).\n const {\n type,\n value: valueProp,\n defaultValue,\n onValueChange,\n ...props\n } = rest as {\n type: \"single\" | \"multiple\";\n value?: string | string[];\n defaultValue?: string | string[];\n onValueChange?: (value: never) => void;\n } & Omit<RadixRootProps, \"type\" | \"value\" | \"defaultValue\" | \"onValueChange\">;\n\n const fieldset = useFieldsetContext();\n const wiring = useFieldControl({\n id,\n name,\n invalid,\n required,\n disabled: disabled ?? (fieldset?.disabled ? true : undefined),\n \"aria-labelledby\": ariaLabelledBy,\n \"aria-describedby\": ariaDescribedBy,\n native: false,\n });\n\n const multiple = type === \"multiple\";\n const emptyValue: string | string[] = multiple ? [] : \"\";\n const [value, setValue] = useControllableState<string | string[]>({\n prop: valueProp,\n defaultProp: defaultValue ?? emptyValue,\n onChange: onValueChange as ((next: string | string[]) => void) | undefined,\n });\n const initialValue = React.useRef(valueProp ?? defaultValue ?? emptyValue);\n const rootRef = React.useRef<HTMLDivElement>(null);\n const mergedRef = useMergedRefs(ref, rootRef);\n\n const labelledBy =\n wiring[\"aria-labelledby\"] ?? (fieldset?.legendMounted ? fieldset.legendId : undefined);\n const context = React.useMemo<ToggleGroupContextValue>(() => ({ variant, size }), [variant, size]);\n\n const radixProps = {\n ...props,\n type,\n value,\n onValueChange: setValue,\n } as RadixRootProps;\n\n return (\n <>\n <ToggleGroupPrimitive.Root\n ref={mergedRef}\n id={wiring.id}\n {...(wiring.disabled !== undefined && { disabled: wiring.disabled })}\n aria-labelledby={labelledBy}\n aria-describedby={wiring[\"aria-describedby\"]}\n // No `aria-required`: the attribute is not allowed on `group`, so\n // `required` is expressed by the bridge's validation proxy alone.\n aria-invalid={ariaInvalid ?? wiring[\"aria-invalid\"]}\n data-invalid={wiring[\"data-invalid\"]}\n {...(size ? stateAttributes({ size }) : undefined)}\n className={cn(\"ds:inline-flex ds:items-center ds:gap-1\", className)}\n {...radixProps}\n >\n <ToggleGroupContext.Provider value={context}>{children}</ToggleGroupContext.Provider>\n </ToggleGroupPrimitive.Root>\n <FormBridge\n name={wiring.name}\n value={value}\n submitEmpty={submitEmpty}\n form={form}\n disabled={wiring.disabled}\n required={wiring[\"aria-required\"] === true}\n focusTarget={rootRef}\n onReset={() => setValue(initialValue.current)}\n />\n </>\n );\n});\nToggleGroup.displayName = ToggleGroupPrimitive.Root.displayName;\n\nexport interface ToggleGroupItemProps\n extends\n React.ComponentPropsWithoutRef<typeof ToggleGroupPrimitive.Item>,\n VariantProps<typeof itemVariants> {}\n\nexport const ToggleGroupItem = React.forwardRef<\n React.ElementRef<typeof ToggleGroupPrimitive.Item>,\n ToggleGroupItemProps\n>(function ToggleGroupItem({ className, variant, ...props }, ref) {\n const ctx = React.useContext(ToggleGroupContext);\n const resolvedVariant = variant ?? ctx.variant;\n return (\n <ToggleGroupPrimitive.Item\n ref={ref}\n className={cn(\n ctx.size\n ? cn(sizedItemVariants({ variant: resolvedVariant }), CONTROL_SIZE_CLASSES[ctx.size])\n : itemVariants({ variant: resolvedVariant }),\n className,\n )}\n {...props}\n />\n );\n});\nToggleGroupItem.displayName = ToggleGroupPrimitive.Item.displayName;\n","\"use client\";\n\nimport { cn } from \"../lib/cn\";\n\n/**\n * ChannelTabs — a controlled, pill-style tab strip for switching between\n * communication channels (Chat / Email / SMS / Internal) on a thread surface.\n *\n * Each tab carries a colored status dot (toned per channel) and an optional\n * unread count. The active tab gets the accent ring treatment; inactive tabs\n * are quiet until hovered. The component is presentational and fully\n * controlled — the consumer owns the active value and maps it to whatever\n * backend channel group / compose channel the tab represents.\n *\n * <ChannelTabs\n * value={tab}\n * onChange={setTab}\n * tabs={[\n * { value: \"chat\", label: \"Chat\", tone: \"success\", count: 2 },\n * { value: \"email\", label: \"Email\", tone: \"info\" },\n * { value: \"sms\", label: \"SMS\", tone: \"accent\" },\n * ]}\n * />\n *\n * @since 1.5.0\n */\n\n/** Status-dot tone for a channel tab. Maps to a semantic color token. */\nexport type ChannelTone = \"brand\" | \"info\" | \"success\" | \"warning\" | \"muted\" | \"danger\";\n\nconst TONE_DOT: Record<ChannelTone, string> = {\n brand: \"ds:bg-brand\",\n info: \"ds:bg-accent-2\",\n success: \"ds:bg-success-fg\",\n warning: \"ds:bg-warning-fg\",\n muted: \"ds:bg-fg-4/40\",\n danger: \"ds:bg-danger-fg\",\n};\n\nexport interface ChannelTabItem {\n /** Stable identifier passed back to `onChange`. */\n value: string;\n /** Visible label. */\n label: string;\n /** Status-dot tone. Defaults to `muted`. */\n tone?: ChannelTone;\n /** Optional unread count — hidden when `0` or `undefined`. */\n count?: number;\n}\n\nexport interface ChannelTabsProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n /** The tabs to render. */\n tabs: ChannelTabItem[];\n /** Currently active tab `value`. */\n value: string;\n /** Fired with the picked tab's `value`. */\n onChange: (value: string) => void;\n}\n\n/**\n * @deprecated Frozen in `/legacy` (W8-09): no known consumer, no feature work.\n * Owner: PRO communications, which decides to adopt, contribute or release\n * the name. Never removed before 3.0.\n */\nexport function ChannelTabs({ tabs, value, onChange, className, ...props }: ChannelTabsProps) {\n return (\n <div\n role=\"tablist\"\n aria-label=\"Channel\"\n className={cn(\"ds:flex ds:items-center ds:gap-1 ds:border-b ds:border-rule ds:bg-surface ds:px-3 ds:py-2\", className)}\n {...props}\n >\n {tabs.map((tab) => {\n const active = value === tab.value;\n const count = tab.count;\n return (\n <button\n key={tab.value}\n type=\"button\"\n role=\"tab\"\n aria-selected={active}\n onClick={() => onChange(tab.value)}\n className={cn(\n \"ds:flex ds:items-center ds:gap-2 ds:rounded-md ds:border ds:px-3 ds:py-1.5 ds:text-sm ds:font-medium ds:transition-colors ds:motion-reduce:transition-none\",\n \"ds:focus-visible:[box-shadow:var(--shadow-focus-ring)] ds:focus-visible:outline-none\",\n active\n ? \"ds:border-brand ds:bg-brand/5 ds:text-brand\"\n : \"ds:border-transparent ds:text-fg-3 ds:hover:text-fg\",\n )}\n >\n <span\n className={cn(\n \"ds:size-1.5 ds:rounded-full\",\n active ? TONE_DOT[tab.tone ?? \"muted\"] : \"ds:bg-fg-4/40\",\n )}\n aria-hidden\n />\n {tab.label}\n {count !== undefined && count > 0 && (\n <span\n className={cn(\n \"ds:ml-0.5 ds:inline-flex ds:h-4 ds:min-w-4 ds:items-center ds:justify-center ds:rounded-full ds:px-1 ds:text-[10px] ds:font-semibold ds:tabular-nums\",\n active ? \"ds:bg-bg/60\" : \"ds:bg-bg-2 ds:text-fg-3\",\n )}\n >\n {count}\n </span>\n )}\n </button>\n );\n })}\n </div>\n );\n}\nChannelTabs.displayName = \"ChannelTabs\";\n","import type { ReactNode } from \"react\";\n\nimport { cn } from \"../lib/cn\";\n\n/**\n * IntentBadge — a small dashed-outline badge for an AI-classified intent\n * (Document, Question, Payment, Scheduling, Urgent, FYI, Follow-up…).\n *\n * The dashed border is the signature: it reads as \"machine-suggested, not\n * yet confirmed\", distinguishing it from the solid `StatusPill` used for\n * authoritative state. Presentational and generic — the consumer owns the\n * intent→tone→icon→label mapping in their own domain config and passes the\n * resolved pieces in.\n *\n * <IntentBadge tone=\"info\" icon={<FileIcon size={12} />}>Document</IntentBadge>\n *\n * @since 1.5.0\n */\n\n/** Color tone for an intent badge. */\nexport type IntentTone = \"brand\" | \"info\" | \"primary\" | \"success\" | \"warning\" | \"danger\" | \"muted\";\n\nconst TONE_STYLES: Record<IntentTone, string> = {\n brand: \"ds:bg-brand/10 ds:text-brand ds:border-brand/30\",\n info: \"ds:bg-accent-tint ds:text-accent-2 ds:border-accent/30\",\n primary: \"ds:bg-brand-bg ds:text-brand ds:border-brand-line\",\n success: \"ds:bg-success-bg ds:text-success-fg ds:border-success-line\",\n warning: \"ds:bg-warning-bg ds:text-warning-fg ds:border-warning-line\",\n danger: \"ds:bg-danger-bg ds:text-danger-fg ds:border-danger-line\",\n muted: \"ds:bg-bg-2 ds:text-fg-3 ds:border-rule\",\n};\n\nexport interface IntentBadgeProps extends Omit<React.HTMLAttributes<HTMLSpanElement>, \"children\"> {\n /** Color tone. Defaults to `muted`. */\n tone?: IntentTone;\n /** Optional leading glyph — pass a 12px icon. */\n icon?: ReactNode;\n /** Badge label. */\n children: ReactNode;\n}\n\n/**\n * @deprecated Frozen in `/legacy` (W8-09): no known consumer, no feature work.\n * Owner: PRO communications, which decides to adopt, contribute or release\n * the name. Never removed before 3.0.\n */\nexport function IntentBadge({ tone = \"muted\", icon, children, className, ...props }: IntentBadgeProps) {\n return (\n <span\n className={cn(\n \"ds:inline-flex ds:items-center ds:gap-1 ds:rounded-full ds:border ds:border-dashed ds:px-2.5 ds:py-1 ds:text-xs ds:font-medium\",\n TONE_STYLES[tone],\n className,\n )}\n {...props}\n >\n {icon && <span className=\"ds:shrink-0 ds:[&>svg]:size-3\">{icon}</span>}\n {children}\n </span>\n );\n}\nIntentBadge.displayName = \"IntentBadge\";\n","import { useCallback, useMemo, useRef, useState, type ReactNode } from \"react\";\n\nimport { useId } from \"../../../foundation/id\";\nimport type { Option } from \"../collection/option\";\n\n/**\n * `useDataTable<TRow>()` (W6-04/W6-05; target architecture §35.2) — the\n * headless controller behind every data table.\n *\n * No DOM, no styling: the hook owns the six state slices a table needs —\n * **sorting · pagination · search · selection · columnVisibility · filters** —\n * each independently controllable (`value` + `onValueChange`) or uncontrolled\n * with a default, plus the whole-state pair `state` / `onStateChange` for a\n * product hook that mirrors the table into the URL. It derives the rows to\n * render (filtered → searched → sorted → paged) from typed column definitions\n * and hands back stable ids for the ARIA wiring the rendering layer adds.\n *\n * Why it exists: today `DataTableView` keeps sort, search and page in private\n * state, so TAX seeds it once through `initialSort` and *listens to header\n * clicks by header text* to keep the URL in step (`use-queue-view.ts`), and\n * PRO hand-rolls the same three states per table. Every slice here is\n * observable and settable, so those bridges become `sorting` +\n * `onSortingChange`.\n *\n * `manual` (W6-05) turns the row model off for server-side tables: the hook\n * then never sorts, filters, searches or pages `data` itself — it only holds\n * and emits state, and `rowCount` sizes the pager.\n *\n * Every state slice is plain JSON (arrays and records, no `Set`/`Map`), so it\n * can be written to a URL or storage as it is. Persisting column visibility is\n * the consumer's `onColumnVisibilityChange`; the design system never touches\n * `localStorage`.\n *\n * @experimental\n */\n\n/* ───────────────────────────────── columns ──────────────────────────────── */\n\n/** Sort direction of one column; `null` on the sorting slice means unsorted. */\nexport type DataTableSortDirection = \"asc\" | \"desc\";\n\n/** What a column reads from a row: a property name or a function. */\nexport type DataTableAccessor<TRow> = keyof TRow | ((row: TRow) => unknown);\n\n/** A value the built-in comparator orders. `null`/`undefined` always sort last. */\nexport type DataTableSortValue = string | number | boolean | Date | null | undefined;\n\n/**\n * One column of a data table. `id` is the stable key the sorting and\n * column-visibility slices refer to and the ids for ARIA are derived from.\n *\n * @experimental\n */\nexport interface DataTableColumn<TRow> {\n /** Stable identifier: the key in `sorting`, `columnVisibility` and derived DOM ids. */\n id: string;\n /** Header content. Any node — not string-only, so a consumer never has to find a column by its text. */\n header: ReactNode;\n /** How the cell value is read. Defaults to `row[id]` when `id` is a key of the row. */\n accessor?: DataTableAccessor<TRow>;\n /** Cell renderer. Defaults to the accessor value rendered as text by the rendering layer. */\n cell?: (row: TRow, context: { value: unknown; rowId: string; index: number }) => ReactNode;\n /** Whether the header offers sorting. Default `false`. */\n sortable?: boolean | undefined;\n /** Custom sort key (e.g. a numeric age behind a \"5h ago\" label). Defaults to the accessor value. */\n sortValue?: ((row: TRow) => DataTableSortValue) | undefined;\n /**\n * Whether the client-side search reads this column. Default `true` for a\n * column with an accessor. `searchText` overrides what is read.\n */\n searchable?: boolean;\n /** Text the client-side search matches for this column. Defaults to `String(value)`. */\n searchText?: (row: TRow) => string;\n /** Whether the columns menu may hide it. Default `true`. */\n hideable?: boolean;\n /** Layout hint for the rendering layer (W6-01 `TableCell align`). */\n align?: \"start\" | \"center\" | \"end\";\n /** Layout hint: right-aligned, tabular figures (W6-01 `TableCell numeric`). */\n numeric?: boolean;\n /** Layout hint: a CSS width for the column. */\n width?: string;\n}\n\n/**\n * One filter of a data table: which rows a value keeps, and the options the\n * rendering layer offers, in the shared {@link Option} model.\n *\n * @experimental\n */\nexport interface DataTableFilterDefinition<TRow, TValue extends string = string> {\n id: string;\n label: string;\n options: readonly Option<TValue>[];\n /** `true` keeps the row for the given value. Receives one value at a time, also for a multi-value filter. */\n match: (row: TRow, value: TValue) => boolean;\n /** Whether several values may be active (a row matches when any matches). Default `false`. */\n multiple?: boolean;\n}\n\n/* ─────────────────────────────────── state ──────────────────────────────── */\n\n/** Sorting slice: one column and a direction, or `null` for unsorted. */\nexport interface DataTableSortingState {\n columnId: string;\n direction: DataTableSortDirection;\n}\n\n/** Pagination slice. `page` is 1-based, like `Pagination` and `DataTableView`. */\nexport interface DataTablePaginationState {\n page: number;\n pageSize: number;\n}\n\n/** Filters slice: filter id → active value(s). A missing key, `null` or `[]` means \"all\". */\nexport type DataTableFilterValue = string | readonly string[] | null;\nexport type DataTableFiltersState = Readonly<Record<string, DataTableFilterValue>>;\n\n/** Column-visibility slice: column id → shown. A missing key means shown. */\nexport type DataTableColumnVisibilityState = Readonly<Record<string, boolean>>;\n\n/** Selection slice: the ids of the selected rows, in selection order. */\nexport type DataTableSelectionState = readonly string[];\n\n/**\n * The whole serialisable state of a table, e.g. for a URL or storage mirror.\n *\n * @experimental\n */\nexport interface DataTableState {\n sorting: DataTableSortingState | null;\n pagination: DataTablePaginationState;\n search: string;\n selection: DataTableSelectionState;\n columnVisibility: DataTableColumnVisibilityState;\n filters: DataTableFiltersState;\n}\n\n/* ─────────────────────────────────── options ────────────────────────────── */\n\n/**\n * Options of {@link useDataTable}. Every slice accepts a controlled value, a\n * default, and a change callback; the whole-state `state` / `defaultState` /\n * `onStateChange` triple works alongside (a granular prop wins over `state`).\n *\n * @experimental\n */\nexport interface UseDataTableOptions<TRow> {\n /** The rows. In client mode the full set; in `manual` mode the current page as the server returned it. */\n data: readonly TRow[];\n columns: readonly DataTableColumn<TRow>[];\n /** Filter definitions (`filters` is the state). */\n filterDefinitions?: readonly DataTableFilterDefinition<TRow>[] | undefined;\n /**\n * Stable id of a row. Defaults to `row.id` when it is a string or number,\n * otherwise the row's index (fine for static data; pass one for anything\n * that reorders).\n */\n getRowId?: ((row: TRow, index: number) => string) | undefined;\n /** Whether a row may be selected. Default: every row. */\n isRowSelectable?: ((row: TRow) => boolean) | undefined;\n /** Base id for the derived DOM ids (`getColumnId`, `getRowDomId`). Generated when omitted. */\n id?: string | undefined;\n\n /**\n * Server mode (W6-05): the hook never sorts, filters, searches or pages\n * `data` — it only holds and emits state. `rowCount` sizes the pager.\n * Default `false`.\n */\n manual?: boolean | undefined;\n /** Total number of rows matching the current search and filters, in `manual` mode. Defaults to `data.length`. */\n rowCount?: number | undefined;\n /**\n * Called by `selection.selectAllMatching()` in `manual` mode, where only the\n * server knows every matching id: receives the current state so the\n * consumer can resolve the ids and set the selection.\n */\n onSelectAllMatching?: ((state: DataTableState) => void) | undefined;\n /**\n * Whether changing the search or a filter returns to page 1. Default\n * `true` (today's `DataTableView`). Sorting never resets the page.\n */\n resetPageOnChange?: boolean | undefined;\n\n sorting?: DataTableSortingState | null | undefined;\n defaultSorting?: DataTableSortingState | null | undefined;\n onSortingChange?: ((sorting: DataTableSortingState | null) => void) | undefined;\n\n pagination?: DataTablePaginationState | undefined;\n defaultPagination?: Partial<DataTablePaginationState> | undefined;\n onPaginationChange?: ((pagination: DataTablePaginationState) => void) | undefined;\n\n search?: string | undefined;\n defaultSearch?: string | undefined;\n onSearchChange?: ((search: string) => void) | undefined;\n\n selection?: DataTableSelectionState | undefined;\n defaultSelection?: DataTableSelectionState | undefined;\n onSelectionChange?: ((selection: DataTableSelectionState) => void) | undefined;\n\n columnVisibility?: DataTableColumnVisibilityState | undefined;\n defaultColumnVisibility?: DataTableColumnVisibilityState | undefined;\n /** The persistence hook for column visibility: write it wherever the product keeps preferences. */\n onColumnVisibilityChange?:\n | ((columnVisibility: DataTableColumnVisibilityState) => void)\n | undefined;\n\n filters?: DataTableFiltersState | undefined;\n defaultFilters?: DataTableFiltersState | undefined;\n onFiltersChange?: ((filters: DataTableFiltersState) => void) | undefined;\n\n /** Whole-state control. A granular prop (`sorting`, `search`, …) wins over the matching key. */\n state?: Partial<DataTableState> | undefined;\n defaultState?: Partial<DataTableState> | undefined;\n /** Called with the complete next state after any slice changes. */\n onStateChange?: ((state: DataTableState) => void) | undefined;\n}\n\n/* ─────────────────────────────────── result ─────────────────────────────── */\n\n/** One row of the derived row model. */\nexport interface DataTableRowModel<TRow> {\n id: string;\n row: TRow;\n /** Index within the rows to render (the current page). */\n index: number;\n selected: boolean;\n selectable: boolean;\n}\n\n/** `aria-sort` value of a sortable header. `undefined` for a non-sortable column. */\nexport type DataTableAriaSort = \"ascending\" | \"descending\" | \"none\" | undefined;\n\nexport interface DataTableSortingApi {\n value: DataTableSortingState | null;\n set: (sorting: DataTableSortingState | null) => void;\n /** Direction of one column, `null` when it is not the sorted column. */\n getDirection: (columnId: string) => DataTableSortDirection | null;\n /** Advances one column through today's cycle: unsorted → asc → desc → unsorted. */\n toggle: (columnId: string) => void;\n /** `aria-sort` for a header (`\"none\"` for a sortable, unsorted column). */\n getAriaSort: (columnId: string) => DataTableAriaSort;\n}\n\nexport interface DataTablePaginationApi extends DataTablePaginationState {\n pageCount: number;\n /** Total rows matching the search and filters (`rowCount` in manual mode). */\n rowCount: number;\n /** 1-based index of the first and last row on the page; both `0` when empty. */\n rangeStart: number;\n rangeEnd: number;\n canPreviousPage: boolean;\n canNextPage: boolean;\n set: (pagination: DataTablePaginationState) => void;\n setPage: (page: number) => void;\n /** Changes the page size and returns to page 1. */\n setPageSize: (pageSize: number) => void;\n nextPage: () => void;\n previousPage: () => void;\n}\n\nexport interface DataTableSearchApi {\n value: string;\n set: (search: string) => void;\n clear: () => void;\n}\n\nexport interface DataTableSelectionApi {\n value: DataTableSelectionState;\n count: number;\n isSelected: (rowId: string) => boolean;\n set: (selection: DataTableSelectionState) => void;\n select: (rowId: string) => void;\n deselect: (rowId: string) => void;\n toggle: (rowId: string) => void;\n clear: () => void;\n /** Every selectable row on the current page is selected (false when there is none). */\n allPageSelected: boolean;\n /** Some, but not all, selectable rows on the current page are selected (the header checkbox's indeterminate). */\n somePageSelected: boolean;\n /** Selects (or clears) the selectable rows on the current page, keeping selections made elsewhere. */\n selectPage: () => void;\n deselectPage: () => void;\n togglePage: () => void;\n /**\n * Selects every row matching the search and filters. In client mode the\n * hook knows them; in `manual` mode it calls `onSelectAllMatching(state)`.\n */\n selectAllMatching: () => void;\n}\n\nexport interface DataTableColumnVisibilityApi {\n value: DataTableColumnVisibilityState;\n isVisible: (columnId: string) => boolean;\n set: (columnVisibility: DataTableColumnVisibilityState) => void;\n setVisible: (columnId: string, visible: boolean) => void;\n toggle: (columnId: string) => void;\n /** Shows every column again. */\n reset: () => void;\n}\n\nexport interface DataTableFiltersApi<TRow> {\n value: DataTableFiltersState;\n definitions: readonly DataTableFilterDefinition<TRow>[];\n /** Active value(s) of one filter; `null` when it is not narrowing. */\n get: (filterId: string) => DataTableFilterValue;\n set: (filterId: string, value: DataTableFilterValue) => void;\n clear: (filterId: string) => void;\n clearAll: () => void;\n /** Number of filters that are narrowing. */\n activeCount: number;\n}\n\n/**\n * What {@link useDataTable} returns.\n *\n * @experimental\n */\nexport interface DataTableController<TRow> {\n /** Base id of the derived DOM ids. */\n id: string;\n manual: boolean;\n /** The whole serialisable state. */\n state: DataTableState;\n /** Every column, in order. */\n allColumns: readonly DataTableColumn<TRow>[];\n /** The columns to render: `allColumns` minus the hidden ones. */\n columns: readonly DataTableColumn<TRow>[];\n /** The rows to render: filtered → searched → sorted → paged (client mode), or `data` as given (manual mode). */\n rows: readonly DataTableRowModel<TRow>[];\n /**\n * Every row matching the search and filters, sorted, across all pages\n * (client mode) — the scope of `selection.selectAllMatching()`; `data` as\n * given in manual mode.\n */\n matchingRows: readonly TRow[];\n /** Reads a cell through the column's accessor. */\n getCellValue: (row: TRow, column: DataTableColumn<TRow>) => unknown;\n /** Renders a cell: the column's `cell`, or the accessor value as text. */\n renderCell: (model: DataTableRowModel<TRow>, column: DataTableColumn<TRow>) => ReactNode;\n /** Stable DOM id for a column's header cell (`aria-describedby`, `headers`). */\n getColumnId: (columnId: string) => string;\n /** Stable DOM id for a row. */\n getRowDomId: (rowId: string) => string;\n sorting: DataTableSortingApi;\n pagination: DataTablePaginationApi;\n search: DataTableSearchApi;\n selection: DataTableSelectionApi;\n columnVisibility: DataTableColumnVisibilityApi;\n filters: DataTableFiltersApi<TRow>;\n}\n\n/* ─────────────────────────────────── helpers ────────────────────────────── */\n\nconst DEFAULT_PAGE_SIZE = 15;\nconst EMPTY_RECORD: Readonly<Record<string, never>> = Object.freeze({});\nconst EMPTY_LIST: readonly never[] = Object.freeze([]);\n\nfunction defaultGetRowId<TRow>(row: TRow, index: number): string {\n const id = (row as { id?: unknown } | null)?.id;\n return typeof id === \"string\" || typeof id === \"number\" ? String(id) : String(index);\n}\n\nfunction readAccessor<TRow>(row: TRow, column: DataTableColumn<TRow>): unknown {\n const accessor = column.accessor;\n if (typeof accessor === \"function\") return accessor(row);\n if (accessor !== undefined) return row[accessor];\n return (row as Record<string, unknown>)[column.id];\n}\n\nfunction toText(value: unknown): string {\n if (value == null) return \"\";\n if (value instanceof Date) return value.toISOString();\n return typeof value === \"object\" ? \"\" : String(value as string | number | boolean);\n}\n\n/**\n * The comparator `DataTableView` uses today: case-insensitive strings,\n * numbers and dates by value, `null`/`undefined` last in both directions.\n */\nexport function compareSortValues(\n a: DataTableSortValue,\n b: DataTableSortValue,\n direction: DataTableSortDirection,\n): number {\n const dir = direction === \"asc\" ? 1 : -1;\n if (a == null && b == null) return 0;\n if (a == null) return 1;\n if (b == null) return -1;\n const av = normaliseSortValue(a);\n const bv = normaliseSortValue(b);\n return av < bv ? -dir : av > bv ? dir : 0;\n}\n\nfunction normaliseSortValue(value: string | number | boolean | Date): string | number {\n if (typeof value === \"string\") return value.toLowerCase();\n if (value instanceof Date) return value.getTime();\n if (typeof value === \"boolean\") return value ? 1 : 0;\n return value;\n}\n\n/** `null`, `undefined`, `\"\"` and `[]` all mean \"this filter is not narrowing\". */\nfunction filterValues(value: DataTableFilterValue | undefined): readonly string[] {\n if (value == null || value === \"\") return EMPTY_LIST;\n return typeof value === \"string\" ? [value] : value;\n}\n\n/** Advances through today's header cycle: unsorted → asc → desc → unsorted. */\nexport function nextSortDirection(\n current: DataTableSortDirection | null,\n): DataTableSortDirection | null {\n return current === null ? \"asc\" : current === \"asc\" ? \"desc\" : null;\n}\n\n/* ─────────────────────────────────── hook ───────────────────────────────── */\n\n/**\n * The headless data-table controller. See the module comment and\n * `docs/data-tables.md`.\n *\n * @experimental\n */\nexport function useDataTable<TRow>(options: UseDataTableOptions<TRow>): DataTableController<TRow> {\n const {\n data,\n columns: allColumns,\n filterDefinitions = EMPTY_LIST,\n getRowId = defaultGetRowId,\n isRowSelectable,\n manual = false,\n onSelectAllMatching,\n resetPageOnChange = true,\n } = options;\n const id = useId(options.id, \"ds-table\");\n\n // ── the six slices: controlled value or internal state, one setter each ──\n const [sorting, setSortingState] = useSlice<DataTableSortingState | null>(\n options.sorting,\n options.state?.sorting,\n options.defaultSorting,\n options.defaultState?.sorting,\n null,\n );\n const [pagination, setPaginationState] = useSlice<DataTablePaginationState>(\n options.pagination,\n options.state?.pagination,\n options.defaultPagination\n ? {\n page: options.defaultPagination.page ?? 1,\n pageSize: options.defaultPagination.pageSize ?? DEFAULT_PAGE_SIZE,\n }\n : undefined,\n options.defaultState?.pagination,\n { page: 1, pageSize: DEFAULT_PAGE_SIZE },\n );\n const [search, setSearchState] = useSlice<string>(\n options.search,\n options.state?.search,\n options.defaultSearch,\n options.defaultState?.search,\n \"\",\n );\n const [selection, setSelectionState] = useSlice<DataTableSelectionState>(\n options.selection,\n options.state?.selection,\n options.defaultSelection,\n options.defaultState?.selection,\n EMPTY_LIST,\n );\n const [columnVisibility, setColumnVisibilityState] = useSlice<DataTableColumnVisibilityState>(\n options.columnVisibility,\n options.state?.columnVisibility,\n options.defaultColumnVisibility,\n options.defaultState?.columnVisibility,\n EMPTY_RECORD,\n );\n const [filters, setFiltersState] = useSlice<DataTableFiltersState>(\n options.filters,\n options.state?.filters,\n options.defaultFilters,\n options.defaultState?.filters,\n EMPTY_RECORD,\n );\n\n const state = useMemo<DataTableState>(\n () => ({ sorting, pagination, search, selection, columnVisibility, filters }),\n [sorting, pagination, search, selection, columnVisibility, filters],\n );\n\n // Latest state and callbacks for the stable setters. Written during render.\n const latest = useRef({ state, options });\n latest.current = { state, options };\n\n /**\n * Applies a partial change: updates each touched slice, then reports the\n * granular callbacks and the whole-state callback once, with the merged\n * next state.\n */\n const commit = useCallback(\n (patch: Partial<DataTableState>) => {\n const { state: current, options: opts } = latest.current;\n const next: DataTableState = { ...current, ...patch };\n let changed = false;\n if (\"sorting\" in patch && !Object.is(patch.sorting, current.sorting)) {\n changed = true;\n setSortingState(next.sorting);\n opts.onSortingChange?.(next.sorting);\n }\n if (\"pagination\" in patch && !Object.is(patch.pagination, current.pagination)) {\n changed = true;\n setPaginationState(next.pagination);\n opts.onPaginationChange?.(next.pagination);\n }\n if (\"search\" in patch && !Object.is(patch.search, current.search)) {\n changed = true;\n setSearchState(next.search);\n opts.onSearchChange?.(next.search);\n }\n if (\"selection\" in patch && !Object.is(patch.selection, current.selection)) {\n changed = true;\n setSelectionState(next.selection);\n opts.onSelectionChange?.(next.selection);\n }\n if (\n \"columnVisibility\" in patch &&\n !Object.is(patch.columnVisibility, current.columnVisibility)\n ) {\n changed = true;\n setColumnVisibilityState(next.columnVisibility);\n opts.onColumnVisibilityChange?.(next.columnVisibility);\n }\n if (\"filters\" in patch && !Object.is(patch.filters, current.filters)) {\n changed = true;\n setFiltersState(next.filters);\n opts.onFiltersChange?.(next.filters);\n }\n if (changed) {\n latest.current = { state: next, options: opts };\n opts.onStateChange?.(next);\n }\n },\n [\n setSortingState,\n setPaginationState,\n setSearchState,\n setSelectionState,\n setColumnVisibilityState,\n setFiltersState,\n ],\n );\n\n /** Page 1 of the current pagination, for a search / filter change. */\n const firstPage = useCallback(\n (current: DataTablePaginationState): Partial<DataTableState> =>\n resetPageOnChange && current.page !== 1 ? { pagination: { ...current, page: 1 } } : {},\n [resetPageOnChange],\n );\n\n // ── columns ──\n const columns = useMemo(\n () => allColumns.filter((column) => columnVisibility[column.id] !== false),\n [allColumns, columnVisibility],\n );\n\n const getCellValue = useCallback(\n (row: TRow, column: DataTableColumn<TRow>) => readAccessor(row, column),\n [],\n );\n\n // ── row model: filtered → searched → sorted (client mode only) ──\n const matching = useMemo<readonly TRow[]>(() => {\n if (manual) return data;\n const query = search.trim().toLowerCase();\n const activeFilters = filterDefinitions\n .map((definition) => ({ definition, values: filterValues(filters[definition.id]) }))\n .filter(({ values }) => values.length > 0);\n const searched = query\n ? allColumns.filter(\n (column) =>\n column.searchable !== false &&\n (column.searchText !== undefined ||\n column.accessor !== undefined ||\n column.id in ((data[0] ?? {}) as object)),\n )\n : [];\n\n let rows = data.filter((row) => {\n for (const { definition, values } of activeFilters) {\n if (!values.some((value) => definition.match(row, value))) return false;\n }\n if (query) {\n const hit = searched.some((column) =>\n (column.searchText ? column.searchText(row) : toText(readAccessor(row, column)))\n .toLowerCase()\n .includes(query),\n );\n if (!hit) return false;\n }\n return true;\n });\n\n if (sorting) {\n const column = allColumns.find((c) => c.id === sorting.columnId);\n if (column) {\n const sortValue =\n column.sortValue ?? ((row: TRow) => readAccessor(row, column) as DataTableSortValue);\n rows = [...rows].sort((a, b) =>\n compareSortValues(sortValue(a), sortValue(b), sorting.direction),\n );\n }\n }\n return rows;\n }, [manual, data, allColumns, filterDefinitions, filters, search, sorting]);\n\n const rowCount = manual ? (options.rowCount ?? data.length) : matching.length;\n const pageSize = Math.max(1, pagination.pageSize);\n const pageCount = Math.max(1, Math.ceil(rowCount / pageSize));\n // Clamp like today's DataTableView: a page beyond the end shows the last page.\n const page = Math.min(Math.max(1, pagination.page), pageCount);\n\n const pageRows = useMemo<readonly TRow[]>(\n () => (manual ? matching : matching.slice((page - 1) * pageSize, page * pageSize)),\n [manual, matching, page, pageSize],\n );\n\n const selectedSet = useMemo(() => new Set(selection), [selection]);\n\n // Row ids are read against the index in `data`, once, so the same row has\n // the same id whether it is met on a page or in the matching set.\n const rowIds = useMemo(() => {\n const ids = new Map<TRow, string>();\n data.forEach((row, index) => ids.set(row, getRowId(row, index)));\n return ids;\n }, [data, getRowId]);\n const idOf = useCallback(\n (row: TRow) => rowIds.get(row) ?? getRowId(row, data.indexOf(row)),\n [rowIds, getRowId, data],\n );\n\n const rows = useMemo<readonly DataTableRowModel<TRow>[]>(\n () =>\n pageRows.map((row, index) => {\n const rowId = idOf(row);\n return {\n id: rowId,\n row,\n index,\n selected: selectedSet.has(rowId),\n selectable: isRowSelectable ? isRowSelectable(row) : true,\n };\n }),\n [pageRows, idOf, isRowSelectable, selectedSet],\n );\n\n const renderCell = useCallback(\n (model: DataTableRowModel<TRow>, column: DataTableColumn<TRow>): ReactNode => {\n const value = readAccessor(model.row, column);\n return column.cell\n ? column.cell(model.row, { value, rowId: model.id, index: model.index })\n : toText(value);\n },\n [],\n );\n\n // ── ids ──\n const getColumnId = useCallback((columnId: string) => `${id}-col-${columnId}`, [id]);\n const getRowDomId = useCallback((rowId: string) => `${id}-row-${rowId}`, [id]);\n\n // ── slice APIs ──\n const sortingApi = useMemo<DataTableSortingApi>(() => {\n const getDirection = (columnId: string) =>\n sorting?.columnId === columnId ? sorting.direction : null;\n return {\n value: sorting,\n set: (next) => commit({ sorting: next }),\n getDirection,\n toggle: (columnId) => {\n const direction = nextSortDirection(getDirection(columnId));\n commit({ sorting: direction ? { columnId, direction } : null });\n },\n getAriaSort: (columnId) => {\n const column = allColumns.find((c) => c.id === columnId);\n if (!column?.sortable) return undefined;\n const direction = getDirection(columnId);\n return direction === \"asc\" ? \"ascending\" : direction === \"desc\" ? \"descending\" : \"none\";\n },\n };\n }, [sorting, allColumns, commit]);\n\n const paginationApi = useMemo<DataTablePaginationApi>(() => {\n const setPage = (next: number) =>\n commit({ pagination: { page: Math.min(Math.max(1, next), pageCount), pageSize } });\n return {\n page,\n pageSize,\n pageCount,\n rowCount,\n rangeStart: rowCount === 0 ? 0 : (page - 1) * pageSize + 1,\n rangeEnd: rowCount === 0 ? 0 : Math.min(page * pageSize, rowCount),\n canPreviousPage: page > 1,\n canNextPage: page < pageCount,\n set: (next) => commit({ pagination: next }),\n setPage,\n setPageSize: (next) => commit({ pagination: { page: 1, pageSize: Math.max(1, next) } }),\n nextPage: () => setPage(page + 1),\n previousPage: () => setPage(page - 1),\n };\n }, [page, pageSize, pageCount, rowCount, commit]);\n\n const searchApi = useMemo<DataTableSearchApi>(\n () => ({\n value: search,\n set: (next) => commit({ search: next, ...firstPage(latest.current.state.pagination) }),\n clear: () => commit({ search: \"\", ...firstPage(latest.current.state.pagination) }),\n }),\n [search, commit, firstPage],\n );\n\n const selectionApi = useMemo<DataTableSelectionApi>(() => {\n const selectableOnPage = rows.filter((r) => r.selectable).map((r) => r.id);\n const selectedOnPage = selectableOnPage.filter((rowId) => selectedSet.has(rowId));\n const allPageSelected =\n selectableOnPage.length > 0 && selectedOnPage.length === selectableOnPage.length;\n const somePageSelected = selectedOnPage.length > 0 && !allPageSelected;\n const set = (next: DataTableSelectionState) => commit({ selection: next });\n const add = (ids: readonly string[]) => {\n const current = latest.current.state.selection;\n const seen = new Set(current);\n const added = ids.filter((rowId) => !seen.has(rowId));\n if (added.length > 0) set([...current, ...added]);\n };\n const remove = (ids: readonly string[]) => {\n const drop = new Set(ids);\n const current = latest.current.state.selection;\n const kept = current.filter((rowId) => !drop.has(rowId));\n if (kept.length !== current.length) set(kept);\n };\n const selectPage = () => add(selectableOnPage);\n const deselectPage = () => remove(selectableOnPage);\n return {\n value: selection,\n count: selection.length,\n isSelected: (rowId) => selectedSet.has(rowId),\n set,\n select: (rowId) => add([rowId]),\n deselect: (rowId) => remove([rowId]),\n toggle: (rowId) => (selectedSet.has(rowId) ? remove([rowId]) : add([rowId])),\n clear: () => {\n if (latest.current.state.selection.length > 0) set(EMPTY_LIST);\n },\n allPageSelected,\n somePageSelected,\n selectPage,\n deselectPage,\n togglePage: () => (allPageSelected ? deselectPage() : selectPage()),\n selectAllMatching: () => {\n if (manual) {\n onSelectAllMatching?.(latest.current.state);\n return;\n }\n add(\n matching\n .filter((row) => (isRowSelectable ? isRowSelectable(row) : true))\n .map((row) => idOf(row)),\n );\n },\n };\n }, [\n rows,\n selection,\n selectedSet,\n commit,\n manual,\n onSelectAllMatching,\n matching,\n idOf,\n isRowSelectable,\n ]);\n\n const columnVisibilityApi = useMemo<DataTableColumnVisibilityApi>(() => {\n const setVisible = (columnId: string, visible: boolean) => {\n const current = latest.current.state.columnVisibility;\n if ((current[columnId] !== false) === visible) return;\n const next = { ...current };\n if (visible) delete next[columnId];\n else next[columnId] = false;\n commit({ columnVisibility: next });\n };\n return {\n value: columnVisibility,\n isVisible: (columnId) => columnVisibility[columnId] !== false,\n set: (next) => commit({ columnVisibility: next }),\n setVisible,\n toggle: (columnId) => setVisible(columnId, columnVisibility[columnId] === false),\n reset: () => {\n if (Object.keys(latest.current.state.columnVisibility).length > 0) {\n commit({ columnVisibility: EMPTY_RECORD });\n }\n },\n };\n }, [columnVisibility, commit]);\n\n const filtersApi = useMemo<DataTableFiltersApi<TRow>>(() => {\n const set = (filterId: string, value: DataTableFilterValue) => {\n const { state: current } = latest.current;\n const next: Record<string, DataTableFilterValue> = { ...current.filters };\n if (filterValues(value).length === 0) delete next[filterId];\n else next[filterId] = value;\n commit({ filters: next, ...firstPage(current.pagination) });\n };\n return {\n value: filters,\n definitions: filterDefinitions,\n get: (filterId) => {\n const value = filters[filterId];\n return filterValues(value).length === 0 ? null : (value as DataTableFilterValue);\n },\n set,\n clear: (filterId) => set(filterId, null),\n clearAll: () => {\n const { state: current } = latest.current;\n if (Object.keys(current.filters).length > 0) {\n commit({ filters: EMPTY_RECORD, ...firstPage(current.pagination) });\n }\n },\n activeCount: Object.values(filters).filter((value) => filterValues(value).length > 0)\n .length,\n };\n }, [filters, filterDefinitions, commit, firstPage]);\n\n return {\n id,\n manual,\n state,\n allColumns,\n columns,\n rows,\n matchingRows: matching,\n getCellValue,\n renderCell,\n getColumnId,\n getRowDomId,\n sorting: sortingApi,\n pagination: paginationApi,\n search: searchApi,\n selection: selectionApi,\n columnVisibility: columnVisibilityApi,\n filters: filtersApi,\n };\n}\n\n/* ───────────────────────────────── one slice ────────────────────────────── */\n\n/**\n * One controllable slice: the granular prop wins over the whole-state prop;\n * the granular default over the whole-state default over the built-in.\n * Change callbacks are reported by `commit`, not here.\n */\nfunction useSlice<T>(\n prop: T | undefined,\n stateProp: T | undefined,\n defaultProp: T | undefined,\n defaultStateProp: T | undefined,\n fallback: T,\n): [T, (next: T) => void] {\n const controlled = prop !== undefined ? prop : stateProp;\n // Read on the first render only.\n const [uncontrolled, setUncontrolled] = useState<T>(\n defaultProp !== undefined\n ? defaultProp\n : defaultStateProp !== undefined\n ? defaultStateProp\n : fallback,\n );\n const value = controlled !== undefined ? controlled : uncontrolled;\n const isControlled = controlled !== undefined;\n const setValue = useCallback(\n (next: T) => {\n if (!isControlled) setUncontrolled(next);\n },\n [isControlled, setUncontrolled],\n );\n return [value, setValue];\n}\n","\"use client\";\n\nimport { forwardRef } from \"react\";\n\nimport { cn } from \"../lib/cn\";\nimport { Button } from \"../primitives/button\";\nimport { FileChip, type FileKind } from \"../primitives/file-chip\";\nimport { FileUpload } from \"../primitives/file-upload\";\nimport { HelpCircleIcon, LockIcon, TrashIcon } from \"../primitives/icons\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"../primitives/tooltip\";\n\n/**\n * DocumentRequestUpload — one self-contained \"please upload this document\" row\n * for an organizer or a document-request list: a label (with optional help +\n * required flag), a drag-drop dropzone, and the list of already-uploaded files\n * rendered as removable chips.\n *\n * It packages the `FileUpload` + `FileChip` primitives into the exact shape a\n * document-request row needs — including the file **remove** affordance that\n * the `Questions` `file-upload` type only exposes via its `onFileRemove` prop.\n * Reach for `Questions type=\"file-upload\"` when the upload is one field inside a\n * larger question list; reach for this when a document request is the whole unit\n * (its own card, its own awaiting/locked state).\n *\n * Fully presentational and controlled: the caller owns the file list and every\n * handler.\n */\n\nexport interface DocumentRequestUploadFile {\n /** Stable key. Falls back to `name` + `size` when omitted. */\n id?: string;\n /** File name shown on the chip. */\n name: string;\n /** Size in bytes; rendered as a human meta line when `meta` is not given. */\n size?: number;\n /** File-type tone for the chip tile. Defaults to `\"doc\"`. */\n kind?: FileKind;\n /** Overrides the derived \"size\" meta line (e.g. \"2.1 MB · uploaded just now\"). */\n meta?: React.ReactNode;\n}\n\nexport interface DocumentRequestUploadProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n /** Row headline, e.g. \"W-2 from each employer\". */\n label: string;\n /** Optional supporting line under the label. */\n description?: string;\n /** Renders a \"Required\" pill next to the label. */\n required?: boolean;\n /** Optional help tooltip beside the label. */\n help?: { title?: string; body: string };\n /** Already-uploaded files, rendered as removable chips. */\n files?: DocumentRequestUploadFile[];\n /** New files chosen via the dropzone / picker. */\n onFilesSelected?: (files: File[]) => void;\n /** Remove an uploaded file. When omitted, chips have no remove button. */\n onRemoveFile?: (file: DocumentRequestUploadFile, index: number) => void;\n /** Dropzone `accept` list, e.g. \".pdf,.jpg,.png\". */\n accept?: string;\n /** Max per-file size in bytes. */\n maxSize?: number;\n /** Allow selecting multiple files. Defaults to `true`. */\n multiple?: boolean;\n /** Locks the row: hides the dropzone and the remove buttons. */\n disabled?: boolean;\n /** Message shown in place of the dropzone when `disabled`. Defaults to a lock note. */\n disabledHint?: string;\n /** Card chrome or bare layout. Defaults to `\"card\"`. */\n chrome?: \"card\" | \"plain\";\n}\n\n/**\n * @deprecated Frozen in `/legacy` (W8-09): no known consumer, no feature work.\n * Owner: PORTAL client portal, which decides to adopt, contribute or release\n * the name. Never removed before 3.0.\n */\nexport const DocumentRequestUpload = forwardRef<HTMLDivElement, DocumentRequestUploadProps>(\n function DocumentRequestUpload(\n {\n label,\n description,\n required = false,\n help,\n files = [],\n onFilesSelected,\n onRemoveFile,\n accept,\n maxSize,\n multiple = true,\n disabled = false,\n disabledHint = \"This request is locked — no more uploads.\",\n chrome = \"card\",\n className,\n ...props\n },\n ref,\n ) {\n const isPlain = chrome === \"plain\";\n\n return (\n <section\n ref={ref}\n className={cn(\n \"ds:font-body\",\n isPlain ? \"ds:bg-transparent\" : \"ds:border-rule ds:bg-surface ds:shadow-card ds:rounded-[18px] ds:border ds:p-5\",\n className,\n )}\n {...props}\n >\n <div className=\"ds:mb-4 ds:flex ds:items-start ds:gap-3\">\n <div className=\"ds:min-w-0 ds:flex-1\">\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-2\">\n <h3 className=\"ds:text-fg ds:text-[14px] ds:leading-5 ds:font-bold\">{label}</h3>\n {help && <HelpTip title={help.title ?? label} body={help.body} />}\n {required && (\n <span className=\"ds:bg-brand-bg ds:text-brand ds:rounded-full ds:px-2 ds:py-0.5 ds:text-[11px] ds:font-bold\">\n Required\n </span>\n )}\n {files.length > 0 && (\n <span className=\"ds:text-fg-3 ds:text-[12px] ds:font-semibold ds:tabular-nums\">\n {files.length} {files.length === 1 ? \"file\" : \"files\"}\n </span>\n )}\n </div>\n {description && <p className=\"ds:text-fg-3 ds:mt-1 ds:text-[13px] ds:leading-5\">{description}</p>}\n </div>\n </div>\n\n <div className=\"ds:grid ds:gap-3\">\n {disabled ? (\n <div className=\"ds:border-rule ds:bg-surface-2 ds:text-fg-3 ds:flex ds:items-center ds:gap-2 ds:rounded-[var(--radius-input)] ds:border ds:border-dashed ds:px-3 ds:py-3 ds:text-[13px]\">\n <LockIcon size={15} className=\"ds:shrink-0\" aria-hidden=\"true\" />\n {disabledHint}\n </div>\n ) : (\n <FileUpload\n accept={accept}\n maxSize={maxSize}\n multiple={multiple}\n onFilesSelected={onFilesSelected}\n />\n )}\n\n {files.length > 0 && (\n <ul className=\"ds:grid ds:gap-2\">\n {files.map((file, fileIndex) => (\n <li key={file.id ?? `${file.name}-${file.size ?? \"unknown\"}`}>\n <FileChip\n name={file.name}\n meta={file.meta ?? (file.size != null ? formatBytes(file.size) : undefined)}\n kind={file.kind ?? \"doc\"}\n action={\n onRemoveFile && !disabled ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={() => onRemoveFile(file, fileIndex)}\n aria-label={`Remove ${file.name}`}\n className=\"ds:hover:text-danger-fg\"\n >\n <TrashIcon size={14} aria-hidden=\"true\" />\n </Button>\n ) : undefined\n }\n />\n </li>\n ))}\n </ul>\n )}\n </div>\n </section>\n );\n },\n);\n\nDocumentRequestUpload.displayName = \"DocumentRequestUpload\";\n\nfunction formatBytes(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\n/** Help tooltip beside the row label — mirrors the `Questions` help affordance. */\nfunction HelpTip({ title, body }: { title: string; body: string }) {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"ds:text-brand ds:inline-flex ds:shrink-0 ds:cursor-help\">\n <HelpCircleIcon size={14} aria-hidden=\"true\" />\n </span>\n </TooltipTrigger>\n <TooltipContent\n side=\"top\"\n align=\"center\"\n sideOffset={12}\n className={cn(\n \"ds:border-rule ds:bg-surface ds:shadow-pop ds:relative ds:max-w-[352px] ds:rounded-[7px] ds:p-5 ds:text-left\",\n \"ds:after:border-rule ds:after:bg-surface ds:after:absolute ds:after:top-full ds:after:left-1/2 ds:after:size-4 ds:after:-translate-x-1/2 ds:after:-translate-y-1/2 ds:after:rotate-45 ds:after:border-r ds:after:border-b ds:after:content-['']\",\n )}\n >\n <div className=\"ds:text-fg ds:text-[15px] ds:leading-5 ds:font-bold\">{title}</div>\n <p className=\"ds:text-fg-2 ds:mt-3 ds:text-[14px] ds:leading-6\">{body}</p>\n </TooltipContent>\n </Tooltip>\n );\n}\n","\"use client\";\n\nimport { forwardRef, useId } from \"react\";\n\nimport { cn } from \"../lib/cn\";\nimport { Button } from \"../primitives/button\";\nimport { FileChip } from \"../primitives/file-chip\";\nimport { CheckIcon, UploadIcon } from \"../primitives/icons\";\n\n/**\n * AIReceiptPanel — the portal \"attach a receipt, auto-fill with AI\" panel.\n * Three states drive the whole surface:\n *\n * idle → dashed \"Attach receipt\" button\n * reading → pulsing sparkle + \"Reading your receipt…\"\n * done → \"Auto-filled from receipt\" badge, the file chip, and the\n * extracted vendor / amount / date grid (each confirmed ✓)\n *\n * It is **controlled**: the consumer owns `state` and supplies `result`\n * when done. The simulated extraction in the reference is just one driver;\n * swap in real OCR/AI and the contract is unchanged — flip `state` to\n * \"reading\", then to \"done\" with a `result`.\n */\n\nexport interface AIReceiptResult {\n vendor: string;\n amount: string;\n date: string;\n file: { name: string; meta?: React.ReactNode };\n}\n\nexport interface AIReceiptPanelProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"results\"> {\n state?: \"idle\" | \"reading\" | \"done\";\n /** Extracted fields, shown in the `done` state. */\n result?: AIReceiptResult;\n /** Fired when the idle attach button is pressed. */\n onAttach?: () => void;\n /** Fired when the done-state \"Remove\" link is pressed. */\n onRemove?: () => void;\n /** View action for the file chip (e.g. open the receipt). */\n onViewFile?: () => void;\n}\n\n/**\n * Brand AI sparkle — gradient mark (#9E32FF → #1BB6FF). Not a catalog icon:\n * it carries the product's AI signature, so it lives with the feature that\n * owns it. The gradient id is `useId`-scoped so multiple panels on one page\n * (and SSR) don't collide on a shared `<defs>` id.\n */\nfunction AiSpark({ size = 16, className }: { size?: number; className?: string }) {\n const id = useId();\n return (\n <svg\n width={size}\n height={(size * 12) / 16}\n viewBox=\"0 0 16 12\"\n fill=\"none\"\n className={cn(\"ds:block ds:shrink-0\", className)}\n aria-hidden=\"true\"\n >\n <path\n d=\"M6.24553 5.34293C5.91553 5.23294 5.91553 4.76699 6.24553 4.657L8.18254 4.01207C8.60834 3.87011 8.99522 3.63094 9.31252 3.3135C9.62982 2.99607 9.8688 2.6091 10.0105 2.18327L10.6555 0.247473C10.7655 -0.0824911 11.2315 -0.0824912 11.3415 0.247473L11.9866 2.18427C12.1285 2.61002 12.3677 2.99686 12.6852 3.31412C13.0027 3.63139 13.3897 3.87035 13.8156 4.01207L15.7516 4.657C15.8238 4.68071 15.8868 4.72664 15.9314 4.78823C15.976 4.84982 16 4.92392 16 4.99996C16 5.07601 15.976 5.15011 15.9314 5.2117C15.8868 5.27329 15.8238 5.31921 15.7516 5.34293L13.8146 5.98786C13.3889 6.12971 13.0021 6.36874 12.6848 6.68599C12.3675 7.00324 12.1284 7.39001 11.9866 7.81566L11.3415 9.75245C11.3178 9.82471 11.2719 9.88763 11.2103 9.93223C11.1487 9.97684 11.0746 10.0009 10.9985 10.0009C10.9225 10.0009 10.8484 9.97684 10.7868 9.93223C10.7252 9.88763 10.6793 9.82471 10.6555 9.75245L10.0105 7.81566C9.86867 7.39001 9.62962 7.00324 9.31233 6.68599C8.99505 6.36874 8.60823 6.12971 8.18254 5.98786L6.24553 5.34293ZM1.14651 9.20551C1.1032 9.19117 1.06552 9.16355 1.03881 9.12658C1.0121 9.0896 0.99772 9.04515 0.99772 8.99954C0.99772 8.95392 1.0121 8.90947 1.03881 8.87249C1.06552 8.83552 1.1032 8.8079 1.14651 8.79356L2.30851 8.4066C2.82651 8.23362 3.23252 7.82766 3.40552 7.30972L3.79252 6.14784C3.80686 6.10454 3.83448 6.06686 3.87146 6.04015C3.90844 6.01345 3.9529 5.99907 3.99852 5.99907C4.04414 5.99907 4.0886 6.01345 4.12558 6.04015C4.16256 6.06686 4.19018 6.10454 4.20452 6.14784L4.59152 7.30972C4.67664 7.56516 4.82009 7.79728 5.0105 7.98767C5.20091 8.17806 5.43305 8.32149 5.68853 8.4066L6.85053 8.79356C6.89384 8.8079 6.93152 8.83551 6.95823 8.87249C6.98494 8.90947 6.99932 8.95392 6.99932 8.99954C6.99932 9.04515 6.98494 9.0896 6.95823 9.12658C6.93152 9.16355 6.89384 9.19117 6.85053 9.20551L5.68853 9.59247C5.43305 9.67758 5.20091 9.82101 5.0105 10.0114C4.82009 10.2018 4.67664 10.4339 4.59152 10.6894L4.20452 11.8512C4.19018 11.8945 4.16256 11.9322 4.12558 11.9589C4.0886 11.9856 4.04414 12 3.99852 12C3.9529 12 3.90844 11.9856 3.87146 11.9589C3.83448 11.9322 3.80686 11.8945 3.79252 11.8512L3.40552 10.6894C3.3204 10.4339 3.17695 10.2018 2.98654 10.0114C2.79613 9.82101 2.56399 9.67758 2.30851 9.59247L1.14651 9.20551ZM0.097503 2.13727C0.0690292 2.1274 0.0443387 2.1089 0.0268643 2.08435C0.00938996 2.0598 1.317e-09 2.03042 0 2.00029C-1.318e-09 1.97015 0.00938995 1.94077 0.0268643 1.91622C0.0443387 1.89167 0.0690292 1.87317 0.097503 1.8633L0.871506 1.60533C1.21751 1.49034 1.48851 1.21937 1.60351 0.873408L1.86151 0.0994903C1.87138 0.0710193 1.88988 0.0463306 1.91443 0.0288584C1.93899 0.0113861 1.96837 0.00199815 1.99851 0.00199814C2.02865 0.00199814 2.05803 0.0113861 2.08259 0.0288583C2.10714 0.0463306 2.12564 0.0710193 2.13551 0.0994903L2.39351 0.873408C2.45024 1.0439 2.54593 1.19882 2.673 1.32588C2.80006 1.45293 2.955 1.54861 3.12552 1.60533L3.89952 1.8633C3.92799 1.87317 3.95268 1.89167 3.97016 1.91622C3.98763 1.94077 3.99702 1.97015 3.99702 2.00029C3.99702 2.03042 3.98763 2.0598 3.97016 2.08435C3.95268 2.1089 3.92799 2.1274 3.89952 2.13727L3.12552 2.39524C2.955 2.45196 2.80006 2.54764 2.673 2.6747C2.54593 2.80175 2.45024 2.95667 2.39351 3.12717L2.13551 3.90008C2.12564 3.92855 2.10714 3.95324 2.08259 3.97071C2.05804 3.98819 2.02865 3.99757 1.99851 3.99757C1.96837 3.99757 1.93899 3.98819 1.91443 3.97071C1.88988 3.95324 1.87138 3.92855 1.86151 3.90008L1.60351 3.12617C1.48851 2.7802 1.21751 2.50923 0.871506 2.39424L0.097503 2.13727Z\"\n fill={`url(#${id})`}\n />\n <defs>\n <linearGradient\n id={id}\n x1=\"0.265576\"\n y1=\"0.856805\"\n x2=\"13.5\"\n y2=\"12\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"#9E32FF\" />\n <stop offset=\"1\" stopColor=\"#1BB6FF\" />\n </linearGradient>\n </defs>\n </svg>\n );\n}\n\nfunction Field({ label, value, confirmed }: { label: string; value: string; confirmed?: boolean }) {\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-0.5\">\n <span className=\"ds:text-fg-3 ds:text-[11px]\">{label}</span>\n <span className=\"ds:text-fg ds:inline-flex ds:items-center ds:gap-1 ds:text-sm ds:font-medium\">\n {value}\n {confirmed && <CheckIcon className=\"ds:text-success-fg ds:size-3\" strokeWidth={3} />}\n </span>\n </div>\n );\n}\n\n/**\n * @deprecated Frozen in `/legacy` (W8-09): no known consumer, no feature work.\n * Owner: PRO, which decides to adopt, contribute or release\n * the name. Never removed before 3.0.\n */\nexport const AIReceiptPanel = forwardRef<HTMLDivElement, AIReceiptPanelProps>(function AIReceiptPanel(\n { state = \"idle\", result, onAttach, onRemove, onViewFile, className, ...props },\n ref,\n) {\n if (state === \"reading\") {\n return (\n <div\n ref={ref}\n role=\"status\"\n aria-live=\"polite\"\n className={cn(\n \"ds:border-rule ds:bg-surface-2 ds:flex ds:items-center ds:gap-3 ds:rounded-[var(--radius-input)] ds:border ds:p-3\",\n className,\n )}\n {...props}\n >\n <AiSpark size={18} className=\"ds:motion-safe:animate-pulse\" />\n <div>\n <p className=\"ds:text-fg ds:text-sm ds:font-medium\">Reading your receipt…</p>\n <p className=\"ds:text-fg-3 ds:text-xs\">Pulling the vendor, amount and a suggested category.</p>\n </div>\n </div>\n );\n }\n\n if (state === \"done\" && result) {\n return (\n <div\n ref={ref}\n className={cn(\n \"ds:border-rule ds:bg-surface-2 ds:flex ds:flex-col ds:gap-3 ds:rounded-[var(--radius-input)] ds:border ds:p-3\",\n className,\n )}\n {...props}\n >\n <div className=\"ds:flex ds:items-center ds:justify-between\">\n <span className=\"ds:text-fg-2 ds:inline-flex ds:items-center ds:gap-1.5 ds:text-xs ds:font-semibold\">\n <AiSpark size={14} /> Auto-filled from receipt\n </span>\n {onRemove && (\n <Button variant=\"ghost\" size=\"sm\" onClick={onRemove}>\n Remove\n </Button>\n )}\n </div>\n <FileChip\n name={result.file.name}\n meta={result.file.meta}\n className=\"ds:bg-surface\"\n action={\n onViewFile && (\n <Button variant=\"ghost\" size=\"sm\" onClick={onViewFile}>\n View\n </Button>\n )\n }\n />\n <div className=\"ds:border-rule ds:grid ds:grid-cols-3 ds:gap-3 ds:border-t ds:pt-3\">\n <Field label=\"Vendor\" value={result.vendor} />\n <Field label=\"Amount\" value={result.amount} confirmed />\n <Field label=\"Date\" value={result.date} confirmed />\n </div>\n </div>\n );\n }\n\n return (\n <button\n ref={ref as React.Ref<HTMLButtonElement>}\n type=\"button\"\n onClick={onAttach}\n className={cn(\n \"ds:group ds:border-rule-strong ds:bg-surface ds:hover:border-brand/50 ds:hover:bg-brand-bg/40 ds:flex ds:w-full ds:items-center ds:gap-3 ds:rounded-[var(--radius-input)] ds:border-2 ds:border-dashed ds:p-3 ds:text-left ds:transition-colors ds:duration-[var(--duration-fast)] ds:ease-[var(--ease-out-quart)] ds:focus-visible:outline-none ds:focus-visible:[box-shadow:var(--shadow-focus-ring)] ds:motion-reduce:transition-none\",\n className,\n )}\n {...(props as React.ButtonHTMLAttributes<HTMLButtonElement>)}\n >\n <AiSpark size={19} />\n <span className=\"ds:min-w-0 ds:flex-1\">\n <span className=\"ds:text-fg ds:block ds:text-sm ds:font-medium\">\n Attach receipt — auto-fill with AI\n </span>\n <span className=\"ds:text-fg-3 ds:block ds:text-xs\">\n We'll read the vendor, amount & suggest a category\n </span>\n </span>\n <UploadIcon className=\"ds:text-fg-3 ds:size-4.5 ds:shrink-0\" aria-hidden=\"true\" />\n </button>\n );\n});\n\nAIReceiptPanel.displayName = \"AIReceiptPanel\";\n","import type { CSSProperties } from \"react\";\n\n/**\n * Practice service tones for the client portal. Each engagement surface\n * (card, ring, timeline) is \"toned per service\": a fill color + a track\n * tint. Rather than fork every primitive's `variant` enum, portal\n * composites set these two CSS vars (`--tone`, `--tone-bg`) once on their\n * root and let descendants read them via `[color:var(--tone)]` /\n * `[background:var(--tone-bg)]`. One place owns the mapping; theming and\n * dark mode flow through the underlying `--color-service-*` tokens.\n */\nexport type ServiceTone = \"tax\" | \"audit\" | \"accounting\" | \"neutral\";\n\nconst toneToken: Record<ServiceTone, { fill: string; bg: string }> = {\n tax: { fill: \"var(--ds-color-service-tax, var(--color-service-tax))\", bg: \"var(--ds-color-service-tax-bg, var(--color-service-tax-bg))\" },\n audit: { fill: \"var(--ds-color-service-audit, var(--color-service-audit))\", bg: \"var(--ds-color-service-audit-bg, var(--color-service-audit-bg))\" },\n accounting: {\n fill: \"var(--ds-color-service-accounting, var(--color-service-accounting))\",\n bg: \"var(--ds-color-service-accounting-bg, var(--color-service-accounting-bg))\",\n },\n neutral: { fill: \"var(--ds-ref-brand-pro-fg, var(--color-pro-fg))\", bg: \"var(--ds-ref-brand-pro-bg, var(--color-pro-bg))\" },\n};\n\n/**\n * CSS-var style object to spread on a service-toned root. Descendants read\n * `var(--tone)` / `var(--tone-bg)`; the cast is required because\n * `CSSProperties` doesn't type custom properties.\n */\nexport function serviceToneStyle(tone: ServiceTone): CSSProperties {\n const { fill, bg } = toneToken[tone];\n return { \"--tone\": fill, \"--tone-bg\": bg } as CSSProperties;\n}\n\nexport const SERVICE_TONES: ServiceTone[] = [\"tax\", \"audit\", \"accounting\", \"neutral\"];\n\n/** Human label for a tone, for chips and headings. */\nexport const serviceToneLabel: Record<ServiceTone, string> = {\n tax: \"Tax\",\n audit: \"Audit\",\n accounting: \"Accounting\",\n neutral: \"General\",\n};\n","\"use client\";\n\nimport { forwardRef } from \"react\";\n\nimport { cn } from \"../lib/cn\";\nimport { serviceToneStyle, type ServiceTone } from \"../lib/service-tone\";\nimport { ArrowRightIcon } from \"../primitives/icons\";\n\n/**\n * AttentionItem — one row in the portal \"Needs your attention\" feed:\n * a toned icon tile, a title + supporting line, and a trailing action\n * (custom node or a default chevron). Group these by service at the call\n * site; the row itself just renders one item.\n *\n * Set `tone` to color the icon tile per service (or use a status tone via\n * `urgency`). The whole row is a `<button>` when `onClick` is supplied.\n */\n\nexport type AttentionUrgency = \"default\" | \"warning\" | \"danger\";\n\nconst urgencyTile: Record<AttentionUrgency, string> = {\n default: \"ds:[background:var(--tone-bg)] ds:[color:var(--tone)]\",\n warning: \"ds:bg-warning-bg ds:text-warning-fg\",\n danger: \"ds:bg-danger-bg ds:text-danger-fg\",\n};\n\nexport interface AttentionItemProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"title\"> {\n icon: React.ReactNode;\n title: React.ReactNode;\n description?: React.ReactNode;\n /** Service tone for the icon tile (used when `urgency` is \"default\"). */\n tone?: ServiceTone;\n /** Status urgency — overrides the service tone for the tile. */\n urgency?: AttentionUrgency;\n /** Trailing slot; defaults to a chevron when the row is interactive. */\n action?: React.ReactNode;\n onClick?: () => void;\n}\n\n/**\n * @deprecated Frozen in `/legacy` (W8-09): no known consumer, no feature work.\n * Owner: PRO, which decides to adopt, contribute or release\n * the name. Never removed before 3.0.\n */\nexport const AttentionItem = forwardRef<HTMLDivElement, AttentionItemProps>(function AttentionItem(\n { icon, title, description, tone = \"neutral\", urgency = \"default\", action, onClick, className, style, ...props },\n ref,\n) {\n const interactive = Boolean(onClick);\n const body = (\n <>\n <span\n aria-hidden=\"true\"\n className={cn(\n \"ds:flex ds:size-9 ds:shrink-0 ds:items-center ds:justify-center ds:rounded-[var(--radius-input)] ds:[&_svg]:size-4.5\",\n urgencyTile[urgency],\n )}\n >\n {icon}\n </span>\n <div className=\"ds:min-w-0 ds:flex-1\">\n <p className=\"ds:text-fg ds:text-sm ds:font-medium\">{title}</p>\n {description != null && <p className=\"ds:text-fg-3 ds:mt-0.5 ds:text-xs\">{description}</p>}\n </div>\n {action ??\n (interactive && (\n <ArrowRightIcon className=\"ds:text-fg-4 ds:size-4 ds:shrink-0 ds:self-center\" aria-hidden=\"true\" />\n ))}\n </>\n );\n\n const rootClass = cn(\n \"ds:border-rule ds:bg-surface ds:flex ds:items-start ds:gap-3 ds:rounded-[var(--radius-input)] ds:border ds:p-3 ds:text-left\",\n interactive &&\n \"ds:w-full ds:transition-colors ds:duration-[var(--duration-fast)] ds:ease-[var(--ease-out-quart)] ds:hover:bg-surface-hover ds:focus-visible:outline-none ds:focus-visible:[box-shadow:var(--shadow-focus-ring)] ds:motion-reduce:transition-none\",\n className,\n );\n const rootStyle = { ...serviceToneStyle(tone), ...style };\n\n if (interactive) {\n return (\n <button\n ref={ref as React.Ref<HTMLButtonElement>}\n type=\"button\"\n onClick={onClick}\n className={rootClass}\n style={rootStyle}\n {...(props as React.ButtonHTMLAttributes<HTMLButtonElement>)}\n >\n {body}\n </button>\n );\n }\n return (\n <div ref={ref} className={rootClass} style={rootStyle} {...props}>\n {body}\n </div>\n );\n});\n\nAttentionItem.displayName = \"AttentionItem\";\n","\"use client\";\n\nimport { forwardRef } from \"react\";\n\nimport { useDsMessages } from \"../foundation/provider/context\";\nimport { cn } from \"../lib/cn\";\n\n/**\n * BottomNav — mobile tab bar for the client portal (desktop uses the\n * sidebar instead). Fixed to the viewport bottom with safe-area padding;\n * each tab is an icon + short label with an optional count/dot badge.\n *\n * Controlled via `value` + `onChange`. Keep it to 3–5 tabs — beyond that,\n * labels truncate and the row gets cramped on a 390px screen.\n */\n\nexport interface BottomNavTab {\n id: string;\n label: string;\n icon: React.ReactNode;\n /** Numeric badge; `true` renders a dot. */\n badge?: number | boolean;\n}\n\nexport interface BottomNavProps extends Omit<React.HTMLAttributes<HTMLElement>, \"onChange\"> {\n tabs: BottomNavTab[];\n value: string;\n onChange: (id: string) => void;\n}\n\n/**\n * @deprecated Frozen in `/legacy` (W8-09): no known consumer, no feature work.\n * Owner: DS — name released (docs/ownership/investigate.md, row 8); Portal's\n * mobile nav moves to the Sidebar mobile mode (W7-04). Never removed before 3.0.\n */\nexport const BottomNav = forwardRef<HTMLElement, BottomNavProps>(function BottomNav(\n { tabs, value, onChange, className, ...props },\n ref,\n) {\n const messages = useDsMessages(\"bottomNav\");\n return (\n <nav\n ref={ref}\n aria-label={messages.region}\n className={cn(\n \"ds:border-rule ds:bg-surface/95 ds:sticky ds:bottom-0 ds:z-[var(--z-sticky)] ds:flex ds:items-stretch ds:border-t ds:pb-[env(safe-area-inset-bottom)] ds:backdrop-blur\",\n className,\n )}\n {...props}\n >\n {tabs.map((tab) => {\n const active = tab.id === value;\n return (\n <button\n key={tab.id}\n type=\"button\"\n aria-current={active ? \"page\" : undefined}\n onClick={() => onChange(tab.id)}\n className={cn(\n \"ds:relative ds:flex ds:flex-1 ds:flex-col ds:items-center ds:gap-1 ds:px-1 ds:py-2 ds:text-[11px] ds:font-medium ds:transition-colors ds:duration-[var(--duration-fast)] ds:ease-[var(--ease-out-quart)] ds:focus-visible:outline-none ds:focus-visible:[box-shadow:var(--shadow-focus-ring)] ds:motion-reduce:transition-none\",\n active ? \"ds:text-brand\" : \"ds:text-fg-4 ds:hover:text-fg-2\",\n )}\n >\n <span className=\"ds:relative ds:[&_svg]:size-5\">\n {tab.icon}\n {tab.badge != null && tab.badge !== false && (\n <span\n className={cn(\n \"ds:bg-danger-fg ds:text-fg-on-danger ds:absolute ds:-top-1 ds:-right-1.5 ds:flex ds:min-w-3.5 ds:items-center ds:justify-center ds:rounded-full ds:px-1 ds:text-[9px] ds:leading-none ds:font-semibold ds:tabular-nums\",\n tab.badge === true && \"ds:size-2 ds:min-w-0 ds:px-0\",\n )}\n >\n {typeof tab.badge === \"number\" ? tab.badge : null}\n </span>\n )}\n </span>\n <span className=\"ds:max-w-full ds:truncate\">{tab.label}</span>\n </button>\n );\n })}\n </nav>\n );\n});\n\nBottomNav.displayName = \"BottomNav\";\n","\"use client\";\n\nimport { forwardRef, useState } from \"react\";\n\nimport { useDsMessages } from \"../foundation/provider/context\";\nimport { cn } from \"../lib/cn\";\n\n/**\n * DashGrid — drag-to-reorder widget grid for the firm dashboard. Each\n * widget gets a 6-dot grab handle; dragging it over another widget moves\n * it to that slot. The flat order is the source of truth; widgets flow\n * row-major into a responsive CSS grid.\n *\n * Order is uncontrolled by default. Pass `storageKey` to persist it to\n * `localStorage` — the initial order is read **once** in a lazy\n * `useState` initializer (SSR-safe: no read on the server), and the grid\n * carries `suppressHydrationWarning` because a persisted client order will\n * legitimately differ from the server's default order on first paint.\n * `onReorder` fires with the new id order on every move.\n */\n\nexport interface DashWidget {\n id: string;\n content: React.ReactNode;\n /** Column span on the lg grid (1–3). Default 1. */\n span?: 1 | 2 | 3;\n}\n\nexport interface DashGridProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onReorder\"> {\n widgets: DashWidget[];\n /** Persist order under this `localStorage` key. Omit to disable persistence. */\n storageKey?: string;\n onReorder?: (orderedIds: string[]) => void;\n /** Max columns on large screens. Default 3. */\n columns?: 2 | 3 | 4;\n}\n\nfunction readOrder(storageKey: string | undefined): string[] | null {\n if (!storageKey || typeof window === \"undefined\") return null;\n try {\n const raw = window.localStorage.getItem(storageKey);\n return raw ? (JSON.parse(raw) as string[]) : null;\n } catch {\n return null;\n }\n}\n\nconst colsClass: Record<NonNullable<DashGridProps[\"columns\"]>, string> = {\n 2: \"ds:lg:grid-cols-2\",\n 3: \"ds:lg:grid-cols-3\",\n 4: \"ds:lg:grid-cols-4\",\n};\n\nconst spanClass: Record<NonNullable<DashWidget[\"span\"]>, string> = {\n 1: \"\",\n 2: \"ds:lg:col-span-2\",\n 3: \"ds:lg:col-span-3\",\n};\n\n/**\n * @deprecated Frozen in `/legacy` (W8-09): no known consumer, no feature work.\n * Owner: PRO, which decides to adopt, contribute or release\n * the name. Never removed before 3.0.\n */\nexport const DashGrid = forwardRef<HTMLDivElement, DashGridProps>(function DashGrid(\n { widgets, storageKey, onReorder, columns = 3, className, ...props },\n ref,\n) {\n const messages = useDsMessages(\"dashGrid\");\n const [order, setOrder] = useState<string[]>(() => {\n const stored = readOrder(storageKey);\n const ids = widgets.map((w) => w.id);\n if (!stored) return ids;\n // Keep stored order, but append any new widgets and drop removed ones.\n const kept = stored.filter((id) => ids.includes(id));\n const added = ids.filter((id) => !kept.includes(id));\n return [...kept, ...added];\n });\n const [dragId, setDragId] = useState<string | null>(null);\n const [overId, setOverId] = useState<string | null>(null);\n\n const commit = (next: string[]) => {\n setOrder(next);\n onReorder?.(next);\n if (storageKey && typeof window !== \"undefined\") {\n try {\n window.localStorage.setItem(storageKey, JSON.stringify(next));\n } catch {\n /* storage full / unavailable — order still updates in-memory */\n }\n }\n };\n\n const move = (from: string, to: string) => {\n if (from === to) return;\n const next = [...order];\n const fromIdx = next.indexOf(from);\n const toIdx = next.indexOf(to);\n if (fromIdx < 0 || toIdx < 0) return;\n next.splice(toIdx, 0, ...next.splice(fromIdx, 1));\n commit(next);\n };\n\n const byId = new Map(widgets.map((w) => [w.id, w]));\n const ordered = order.map((id) => byId.get(id)).filter(Boolean) as DashWidget[];\n\n return (\n <div\n ref={ref}\n suppressHydrationWarning\n className={cn(\"ds:grid ds:grid-cols-1 ds:gap-4 ds:sm:grid-cols-2\", colsClass[columns], className)}\n {...props}\n >\n {ordered.map((widget) => {\n const isDragging = dragId === widget.id;\n const isOver = overId === widget.id && dragId !== widget.id;\n return (\n // The wrapper is an HTML5 drag DROP target: onDragOver/onDrop carry\n // no click semantics and aren't keyboard-reachable by design — the\n // grab handle below is the focusable control. Pointer reordering is\n // an enhancement (same precedent as the sidebar hover-peek); there\n // is intentionally no keyboard analogue on the drop zone itself.\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions\n <div\n key={widget.id}\n className={cn(\n \"ds:group/dash ds:relative ds:transition-[opacity,box-shadow] ds:duration-[var(--duration-fast)] ds:ease-[var(--ease-out-quart)] ds:motion-reduce:transition-none\",\n spanClass[widget.span ?? 1],\n isDragging && \"ds:opacity-40\",\n isOver && \"ds:rounded-card ds:[box-shadow:var(--shadow-focus-ring)]\",\n )}\n onDragOver={(e) => {\n if (!dragId) return;\n e.preventDefault();\n setOverId(widget.id);\n }}\n onDrop={(e) => {\n e.preventDefault();\n if (dragId) move(dragId, widget.id);\n setDragId(null);\n setOverId(null);\n }}\n >\n <button\n type=\"button\"\n aria-label={messages.reorder}\n draggable\n onDragStart={(e) => {\n setDragId(widget.id);\n e.dataTransfer.effectAllowed = \"move\";\n }}\n onDragEnd={() => {\n setDragId(null);\n setOverId(null);\n }}\n className=\"ds:absolute ds:top-3 ds:right-3 ds:z-[var(--z-base)] ds:flex ds:cursor-grab ds:touch-none ds:items-center ds:justify-center ds:rounded-[var(--radius-icon)] ds:p-1 ds:text-fg-4 ds:opacity-0 ds:transition-opacity ds:duration-[var(--duration-fast)] ds:hover:bg-surface-hover ds:hover:text-fg-2 ds:focus-visible:opacity-100 ds:focus-visible:outline-none ds:focus-visible:[box-shadow:var(--shadow-focus-ring)] ds:active:cursor-grabbing ds:group-hover/dash:opacity-100 ds:motion-reduce:transition-none\"\n >\n <span aria-hidden=\"true\" className=\"ds:grid ds:grid-cols-2 ds:gap-[3px]\">\n {Array.from({ length: 6 }, (_, i) => (\n <span key={i} className=\"ds:size-[3px] ds:rounded-full ds:bg-current\" />\n ))}\n </span>\n </button>\n {widget.content}\n </div>\n );\n })}\n </div>\n );\n});\n\nDashGrid.displayName = \"DashGrid\";\n","\"use client\";\n\nimport { forwardRef } from \"react\";\n\nimport { cn } from \"../lib/cn\";\nimport { serviceToneStyle, type ServiceTone } from \"../lib/service-tone\";\nimport { ArrowRightIcon, CalendarIcon } from \"../primitives/icons\";\nimport { ProgressRing } from \"../primitives/progress-ring\";\nimport { SegmentedProgress, type SegmentedTone } from \"../primitives/segmented-progress\";\n\n/**\n * EngagementCard — the portal home tile for one engagement, toned per\n * service. The service tone is set **once** on the root as `--tone` /\n * `--tone-bg` (see `serviceToneStyle`); the service glyph, the percent\n * readout, and the progress segments all read that single pair instead of\n * each re-deriving the service color.\n *\n * Progress shows as N segments + a percent by default; pass `ring` to swap\n * the segments for a `ProgressRing` (used on denser layouts). Renders as a\n * `<button>` when `onOpen` is supplied, otherwise a static `<div>`.\n */\n\nconst toneToSegment: Record<ServiceTone, SegmentedTone> = {\n tax: \"tax\",\n audit: \"audit\",\n accounting: \"accounting\",\n neutral: \"default\",\n};\n\nexport interface EngagementCardProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"title\"> {\n /** Service name, e.g. \"Tax\". */\n service: string;\n /** Service glyph (an icon node). */\n serviceIcon?: React.ReactNode;\n tone?: ServiceTone;\n title: string;\n /** Status node (typically a <StatusPill> or plain label). */\n status?: React.ReactNode;\n /** Current step index (1-based) and total. */\n current: number;\n steps: number;\n /** Name of the current step, shown in the caption. */\n stepLabel?: string;\n /** Footer ETA content, e.g. \"Est. completion Mar 14\" or \"Recurring engagement\". */\n eta?: React.ReactNode;\n /** Show a ProgressRing instead of segments + percent. */\n ring?: boolean;\n onOpen?: () => void;\n}\n\n/**\n * @deprecated Frozen in `/legacy` (W8-09): no known consumer, no feature work.\n * Owner: PORTAL client portal (PRO workflow keeps one too), which decides to\n * adopt, contribute or release the name. Never removed before 3.0.\n */\nexport const EngagementCard = forwardRef<HTMLDivElement, EngagementCardProps>(function EngagementCard(\n {\n service,\n serviceIcon,\n tone = \"neutral\",\n title,\n status,\n current,\n steps,\n stepLabel,\n eta,\n ring,\n onOpen,\n className,\n style,\n ...props\n },\n ref,\n) {\n const pct = steps > 0 ? Math.round((current / steps) * 100) : 0;\n const interactive = Boolean(onOpen);\n\n const body = (\n <>\n <div className=\"ds:flex ds:items-center ds:justify-between ds:gap-2\">\n <span className=\"ds:inline-flex ds:items-center ds:gap-1.5 ds:text-sm ds:font-semibold ds:[color:var(--tone)] ds:[&_svg]:size-[15px]\">\n {serviceIcon}\n {service}\n </span>\n {status}\n </div>\n <p className=\"ds:text-fg ds:mt-2 ds:text-base ds:leading-snug ds:font-medium\">{title}</p>\n {stepLabel != null && (\n <p className=\"ds:text-fg-3 ds:mt-1 ds:text-xs\">\n {stepLabel} · Step {current} of {steps}\n </p>\n )}\n\n {ring ? (\n <div className=\"ds:mt-3 ds:flex ds:items-center ds:gap-3\">\n <ProgressRing\n value={pct}\n size={52}\n strokeWidth={6}\n label={`${pct}%`}\n className=\"ds:[&_circle:last-child]:[stroke:var(--tone)]\"\n />\n <span className=\"ds:text-fg-3 ds:text-xs\">complete</span>\n </div>\n ) : (\n <div className=\"ds:mt-3 ds:flex ds:items-center ds:gap-3\">\n <SegmentedProgress steps={steps} current={current} tone={toneToSegment[tone]} />\n <span className=\"ds:shrink-0 ds:text-sm ds:font-semibold ds:tabular-nums ds:[color:var(--tone)]\">\n {pct}\n <span className=\"ds:text-fg-4 ds:text-xs ds:font-normal\">%</span>\n </span>\n </div>\n )}\n\n <div className=\"ds:border-rule-soft ds:mt-3 ds:flex ds:items-center ds:justify-between ds:gap-2 ds:border-t ds:pt-3\">\n {eta != null && (\n <span className=\"ds:text-fg-3 ds:inline-flex ds:items-center ds:gap-1.5 ds:text-xs ds:[&_svg]:size-3.5\">\n <CalendarIcon aria-hidden=\"true\" />\n {eta}\n </span>\n )}\n {interactive && (\n <span className=\"ds:inline-flex ds:items-center ds:gap-1 ds:text-xs ds:font-medium ds:[color:var(--tone)] ds:[&_svg]:size-3.5\">\n Open <ArrowRightIcon aria-hidden=\"true\" />\n </span>\n )}\n </div>\n </>\n );\n\n const rootClass = cn(\n \"ds:border-rule ds:bg-surface ds:block ds:w-full ds:rounded-card ds:border ds:p-4 ds:text-left ds:shadow-quiet\",\n interactive &&\n \"ds:transition-[border-color,box-shadow] ds:duration-[var(--duration-fast)] ds:ease-[var(--ease-out-quart)] ds:hover:border-[color:var(--tone)] ds:hover:shadow-card ds:focus-visible:outline-none ds:focus-visible:[box-shadow:var(--shadow-focus-ring)] ds:motion-reduce:transition-none\",\n className,\n );\n const rootStyle = { ...serviceToneStyle(tone), ...style };\n\n if (interactive) {\n return (\n <button\n ref={ref as React.Ref<HTMLButtonElement>}\n type=\"button\"\n onClick={onOpen}\n className={rootClass}\n style={rootStyle}\n {...(props as React.ButtonHTMLAttributes<HTMLButtonElement>)}\n >\n {body}\n </button>\n );\n }\n\n return (\n <div ref={ref} className={rootClass} style={rootStyle} {...props}>\n {body}\n </div>\n );\n});\n\nEngagementCard.displayName = \"EngagementCard\";\n","import { forwardRef } from \"react\";\n\nimport { cn } from \"../lib/cn\";\nimport { serviceToneStyle, type ServiceTone } from \"../lib/service-tone\";\nimport { CheckIcon } from \"../primitives/icons\";\n\n/**\n * EngagementTimeline — vertical stepper for an engagement's lifecycle.\n * Each step is a node + connector rail on the left and a body on the right.\n *\n * done → filled success node with a check + \"Completed {date}\" line\n * active → toned ring node + \"In progress\" badge + inline actions\n * todo → muted node + \"Upcoming\" badge\n *\n * The active node + badge read the service `--tone` set once on the\n * container (see `serviceToneStyle`). Compose with `<EngagementTimelineStep>`\n * children, mirroring the `<ActivityList>` / `<ActivityItem>` split.\n */\n\nexport type TimelineState = \"done\" | \"active\" | \"todo\";\n\nexport interface EngagementTimelineProps extends React.HTMLAttributes<HTMLOListElement> {\n /** Service tone for active nodes. */\n tone?: ServiceTone;\n}\n\n/**\n * @deprecated Frozen in `/legacy` (W8-09): no known consumer, no feature work.\n * Owner: PORTAL client portal (PRO documents keeps one too), which decides to\n * adopt, contribute or release the name. Never removed before 3.0.\n */\nexport const EngagementTimeline = forwardRef<HTMLOListElement, EngagementTimelineProps>(\n function EngagementTimeline({ tone = \"neutral\", className, style, children, ...props }, ref) {\n return (\n <ol\n ref={ref}\n className={cn(\"ds:flex ds:flex-col\", className)}\n style={{ ...serviceToneStyle(tone), ...style }}\n {...props}\n >\n {children}\n </ol>\n );\n },\n);\nEngagementTimeline.displayName = \"EngagementTimeline\";\n\nconst stateBadge: Record<TimelineState, { label: string; className: string }> = {\n done: { label: \"Done\", className: \"ds:text-success-fg\" },\n active: { label: \"In progress\", className: \"ds:[color:var(--tone)]\" },\n todo: { label: \"Upcoming\", className: \"ds:text-fg-4\" },\n};\n\nexport interface EngagementTimelineStepProps\n extends Omit<React.LiHTMLAttributes<HTMLLIElement>, \"title\"> {\n state: TimelineState;\n /** Step name. */\n name: React.ReactNode;\n /** 1-based index shown inside todo/active nodes. */\n index: number;\n /** Supporting copy under the name. */\n note?: React.ReactNode;\n /** Completion date, shown for `done` steps. */\n date?: React.ReactNode;\n /** Inline action row, shown for `active` steps. */\n actions?: React.ReactNode;\n /** Hide the connector below the node (last step). */\n last?: boolean;\n}\n\nexport const EngagementTimelineStep = forwardRef<HTMLLIElement, EngagementTimelineStepProps>(\n function EngagementTimelineStep(\n { state, name, index, note, date, actions, last, className, ...props },\n ref,\n ) {\n const badge = stateBadge[state];\n return (\n <li ref={ref} className={cn(\"ds:flex ds:gap-3\", className)} {...props}>\n <div className=\"ds:flex ds:flex-col ds:items-center\">\n <span\n aria-hidden=\"true\"\n className={cn(\n \"ds:flex ds:size-7 ds:shrink-0 ds:items-center ds:justify-center ds:rounded-full ds:text-xs ds:font-semibold ds:tabular-nums\",\n state === \"done\" && \"ds:bg-success-fg ds:text-fg-on-success\",\n state === \"active\" &&\n \"ds:bg-surface ds:border-2 ds:[border-color:var(--tone)] ds:[color:var(--tone)]\",\n state === \"todo\" && \"ds:bg-bg-3 ds:text-fg-4\",\n )}\n >\n {state === \"done\" ? <CheckIcon className=\"ds:size-4\" strokeWidth={3} /> : index}\n </span>\n {!last && (\n <span\n aria-hidden=\"true\"\n className={cn(\"ds:w-0.5 ds:flex-1\", state === \"done\" ? \"ds:bg-success-line\" : \"ds:bg-rule\")}\n />\n )}\n </div>\n <div className={cn(\"ds:min-w-0 ds:flex-1\", last ? \"ds:pb-0\" : \"ds:pb-6\")}>\n <div className=\"ds:flex ds:items-center ds:justify-between ds:gap-2\">\n <span\n className={cn(\n \"ds:text-sm ds:font-medium\",\n state === \"todo\" ? \"ds:text-fg-3\" : \"ds:text-fg\",\n )}\n >\n {name}\n </span>\n <span className={cn(\"ds:shrink-0 ds:text-[11px] ds:font-semibold\", badge.className)}>\n {badge.label}\n </span>\n </div>\n {note != null && <p className=\"ds:text-fg-3 ds:mt-0.5 ds:text-xs\">{note}</p>}\n {state === \"done\" && date != null && (\n <p className=\"ds:text-success-fg ds:mt-1 ds:inline-flex ds:items-center ds:gap-1 ds:text-[11px]\">\n <CheckIcon className=\"ds:size-3\" strokeWidth={3} aria-hidden=\"true\" /> Completed {date}\n </p>\n )}\n {state === \"active\" && actions && <div className=\"ds:mt-2 ds:flex ds:flex-wrap ds:gap-2\">{actions}</div>}\n </div>\n </li>\n );\n },\n);\nEngagementTimelineStep.displayName = \"EngagementTimelineStep\";\n","\"use client\";\n\nimport { forwardRef } from \"react\";\n\nimport { cn } from \"../lib/cn\";\nimport { Avatar } from \"../primitives/avatar\";\nimport { StatusDot } from \"../primitives/status-dot\";\n\n/* -------------------------------------------------------------------------- */\n/* ClientRailItem */\n/* -------------------------------------------------------------------------- */\n\n/**\n * ClientRailItem — a client row in the firm Documents left rail.\n *\n * Renders as a full-width, left-aligned `<button>`. Displays the client\n * avatar, name, an optional pending-documents indicator (purple dot +\n * \"N pending\" label), a file-count chip, and a meta suffix (e.g. a relative\n * timestamp).\n *\n * Active state highlights the row with `bg-brand-bg` and a 3 px left accent\n * bar in the active brand colour. Hover (when not active) applies `bg-surface-2`.\n *\n * Spread standard `<button>` attributes (including `onClick`) directly.\n */\nexport interface ClientRailItemProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /** Client or entity display name. */\n name: string;\n /** Optional avatar image URL — forwarded to the DS Avatar `src` prop. */\n avatarSrc?: string;\n /** Entity kind label, e.g. \"Individual\" or \"Business\". */\n entityType: string;\n /** Number of pending document requests; 0 / undefined → no pending badge. */\n pendingCount?: number | undefined;\n /** Total file count shown in the name-row chip. Omit to hide the chip. */\n fileCount?: number | undefined;\n /** Trailing meta node — typically a relative-time string like \"2h ago\". */\n metaSuffix?: React.ReactNode;\n /** Whether this row is the currently-selected client in the rail. */\n active?: boolean;\n}\n\nexport const ClientRailItem = forwardRef<HTMLButtonElement, ClientRailItemProps>(\n function ClientRailItem(\n {\n name,\n avatarSrc,\n entityType,\n pendingCount,\n fileCount,\n metaSuffix,\n active = false,\n className,\n ...props\n },\n ref,\n ) {\n const hasPending = Boolean(pendingCount && pendingCount > 0);\n\n return (\n <button\n ref={ref}\n type=\"button\"\n className={cn(\n // Layout\n \"ds:relative ds:flex ds:w-full ds:items-center ds:gap-[11px] ds:border-b ds:border-rule ds:px-[14px] ds:py-[11px] ds:text-left\",\n // Motion\n \"ds:transition-colors ds:duration-[var(--motion-duration-feedback)] ds:motion-reduce:transition-none\",\n // Cursor\n \"ds:cursor-pointer\",\n // State — hover only when not active to avoid override\n active ? \"ds:bg-brand-bg\" : \"ds:hover:bg-surface-2\",\n className,\n )}\n {...props}\n >\n {/* 3 px full-height left accent bar shown when active */}\n {active && (\n <span\n aria-hidden=\"true\"\n className=\"ds:absolute ds:top-0 ds:bottom-0 ds:left-0 ds:w-[3px] ds:bg-brand\"\n />\n )}\n\n {/* Avatar */}\n <span className=\"ds:shrink-0\">\n <Avatar name={name} src={avatarSrc} size=\"sm\" />\n </span>\n\n {/* Main content column */}\n <div className=\"ds:min-w-0 ds:flex-1\">\n {/* Name row */}\n <div className=\"ds:flex ds:items-center ds:gap-[7px]\">\n <span className=\"ds:truncate ds:text-[13.5px] ds:font-[650] ds:text-fg\">\n {name}\n </span>\n\n {/* Pending indicator dot — purple, 7 px */}\n {hasPending && <StatusDot intent=\"brand\" size=\"sm\" />}\n\n {/* File-count chip */}\n {fileCount != null && (\n <span className=\"ds:shrink-0 ds:rounded-full ds:bg-surface-2 ds:px-[6px] ds:py-px ds:text-[10.5px] ds:font-bold ds:text-fg-3\">\n {fileCount}\n </span>\n )}\n </div>\n\n {/* Meta line */}\n <p className=\"ds:mt-0.5 ds:text-[11.5px] ds:text-fg-3\">\n {hasPending ? (\n <>\n <span className=\"ds:font-semibold ds:text-brand\">\n {pendingCount} pending\n </span>\n {\" · \"}\n {entityType}\n </>\n ) : (\n <>\n {entityType}\n {metaSuffix != null && <> · {metaSuffix}</>}\n </>\n )}\n </p>\n </div>\n </button>\n );\n },\n);\n\nClientRailItem.displayName = \"ClientRailItem\";\n\n/* -------------------------------------------------------------------------- */\n/* ClientRailGroupHeader */\n/* -------------------------------------------------------------------------- */\n\n/**\n * ClientRailGroupHeader — section label row for the Documents left rail.\n *\n * When `accent` is true a 7 px pro-tone dot precedes the label and the text\n * is coloured in the active brand colour — signals that the group contains clients with\n * pending document requests. An optional `count` is appended as \" · N\".\n */\nexport interface ClientRailGroupHeaderProps\n extends React.HTMLAttributes<HTMLDivElement> {\n /** Group label text, e.g. \"Awaiting documents\" or \"All clients\". */\n label: string;\n /** Optional count appended as \" · N\" after the label. */\n count?: number;\n /**\n * When true, renders a purple StatusDot before the label and colours the\n * label in `text-brand` (the active brand colour). Use for \"Awaiting documents\" groups.\n */\n accent?: boolean;\n}\n\nexport const ClientRailGroupHeader = forwardRef<\n HTMLDivElement,\n ClientRailGroupHeaderProps\n>(function ClientRailGroupHeader(\n { label, count, accent = false, className, ...props },\n ref,\n) {\n return (\n <div\n ref={ref}\n className={cn(\n \"ds:flex ds:items-center ds:gap-[7px] ds:px-[14px] ds:pt-[14px] ds:pb-[5px] ds:text-[11.5px] ds:font-semibold\",\n accent ? \"ds:text-brand\" : \"ds:text-fg-3\",\n className,\n )}\n {...props}\n >\n {accent && <StatusDot intent=\"brand\" size=\"sm\" />}\n <span>\n {label}\n {count != null && (\n <span className={accent ? undefined : \"ds:text-fg-4\"}> · {count}</span>\n )}\n </span>\n </div>\n );\n});\n\nClientRailGroupHeader.displayName = \"ClientRailGroupHeader\";\n","\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn } from \"../lib/cn\";\nimport { Checkbox } from \"../primitives/checkbox\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuTrigger,\n} from \"../primitives/dropdown-menu\";\nimport { EyeIcon, FileIcon, FileTextIcon, MoreHorizontalIcon } from \"../primitives/icons\";\n\ntype FileGlyph = typeof FileIcon;\n\nexport interface DocumentFileRowProps extends React.HTMLAttributes<HTMLDivElement> {\n name: string;\n fileType: string;\n size?: string;\n date?: string;\n by?: string | undefined;\n status?: React.ReactNode;\n nameAdornment?: React.ReactNode;\n menu?: React.ReactNode;\n selected?: boolean | undefined;\n showCheckbox?: boolean;\n onSelectedChange?: (checked: boolean) => void;\n onOpen?: () => void;\n}\n\nexport type DocumentFileCardProps = DocumentFileRowProps;\n\nfunction getFileTypeParts(fileType: string): { Icon: FileGlyph; colorClass: string } {\n const normalized = fileType\n .toLowerCase()\n .trim()\n .replace(/^\\./, \"\");\n\n if (normalized.includes(\"pdf\")) {\n return { Icon: FileTextIcon, colorClass: \"ds:text-danger-fg\" };\n }\n\n if (\n normalized.includes(\"image\") ||\n [\"jpg\", \"jpeg\", \"png\", \"tiff\"].some((type) => normalized.includes(type))\n ) {\n return { Icon: FileIcon, colorClass: \"ds:text-brand\" };\n }\n\n if (\n normalized.includes(\"excel\") ||\n normalized.includes(\"spreadsheet\") ||\n [\"xlsx\", \"xls\", \"csv\"].some((type) => normalized.includes(type))\n ) {\n return { Icon: FileTextIcon, colorClass: \"ds:text-success-fg\" };\n }\n\n if (normalized.includes(\"word\") || [\"docx\", \"doc\"].some((type) => normalized.includes(type))) {\n return { Icon: FileTextIcon, colorClass: \"ds:text-brand\" };\n }\n\n return { Icon: FileIcon, colorClass: \"ds:text-fg-4\" };\n}\n\nfunction MetaText({\n values,\n className,\n dotClassName,\n}: {\n values: Array<string | undefined>;\n className: string;\n dotClassName?: string;\n}) {\n const presentValues = values.filter(Boolean);\n\n if (presentValues.length === 0) {\n return null;\n }\n\n return (\n <div className={className}>\n {presentValues.map((value, index) => (\n <React.Fragment key={`${value}-${index}`}>\n {index > 0 && (\n <span\n className={cn(\"ds:size-[3px] ds:rounded-full ds:bg-fg-4\", dotClassName)}\n aria-hidden=\"true\"\n />\n )}\n <span>{value}</span>\n </React.Fragment>\n ))}\n </div>\n );\n}\n\nfunction FileTile({ fileType, card }: { fileType: string; card?: boolean }) {\n const { Icon, colorClass } = getFileTypeParts(fileType);\n\n return (\n <span\n className={cn(\n \"ds:grid ds:shrink-0 ds:place-items-center ds:bg-surface-2\",\n card ? \"ds:size-[46px] ds:rounded-xl ds:bg-surface\" : \"ds:size-[38px] ds:rounded-[10px]\",\n )}\n aria-hidden=\"true\"\n >\n <Icon className={colorClass} size={card ? 22 : 18} />\n </span>\n );\n}\n\nfunction CheckboxSlot({\n name,\n selected,\n onSelectedChange,\n className,\n}: {\n /** The file name; the checkbox is named \"Select {name}\" (W4-13). */\n name: string;\n selected: boolean;\n onSelectedChange?: ((checked: boolean) => void) | undefined;\n className?: string | undefined;\n}) {\n return (\n // Wrapper only stops click propagation so the row's open handler does not\n // fire when toggling the checkbox; the Checkbox itself is the focusable control.\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions, jsx-a11y/click-events-have-key-events\n <div\n className={cn(\n \"ds:shrink-0 ds:transition-opacity ds:duration-[var(--motion-duration-feedback)] ds:motion-reduce:transition-none\",\n selected ? \"ds:opacity-100\" : \"ds:opacity-0 ds:group-hover:opacity-100\",\n className,\n )}\n onClick={(event) => event.stopPropagation()}\n >\n <Checkbox\n checked={selected}\n onCheckedChange={(checked) => onSelectedChange?.(checked === true)}\n aria-label={`Select ${name}`}\n />\n </div>\n );\n}\n\nfunction MoreActions({ menu }: { menu?: React.ReactNode }) {\n if (!menu) {\n return null;\n }\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n className={cn(\n \"ds:grid ds:size-[30px] ds:place-items-center ds:rounded-[8px] ds:text-fg-4\",\n \"ds:transition-colors ds:duration-[var(--motion-duration-feedback)] ds:motion-reduce:transition-none\",\n \"ds:group-hover:text-fg-2 ds:hover:bg-surface ds:hover:text-brand ds:hover:shadow-flat\",\n )}\n aria-label=\"More actions\"\n onClick={(event) => event.stopPropagation()}\n >\n <MoreHorizontalIcon size={16} />\n </button>\n </DropdownMenuTrigger>\n {/* Stop menu-item clicks from bubbling (through the React tree, even\n across the portal) to the row/card's onClick → onOpen, which would\n otherwise also fire the row's open/preview action. Mirrors the\n trigger and checkbox slot above. */}\n <DropdownMenuContent align=\"end\" onClick={(event) => event.stopPropagation()}>\n {menu}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\nexport const DocumentFileRow = React.forwardRef<HTMLDivElement, DocumentFileRowProps>(\n function DocumentFileRow(\n {\n name,\n fileType,\n size,\n date,\n by,\n status,\n nameAdornment,\n menu,\n selected = false,\n showCheckbox = true,\n onSelectedChange,\n onOpen,\n className,\n onClick,\n ...props\n },\n ref,\n ) {\n return (\n // Whole-row click is a pointer enhancement that opens the file; the same\n // action is keyboard-reachable via the kebab menu's items, and the row's\n // interactive controls (checkbox, menu) are independently focusable.\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions, jsx-a11y/click-events-have-key-events\n <div\n ref={ref}\n className={cn(\n \"ds:group ds:flex ds:cursor-pointer ds:items-center ds:gap-[13px] ds:border-b ds:border-rule ds:px-[14px] ds:py-3\",\n \"ds:transition-colors ds:duration-[var(--motion-duration-feedback)] ds:motion-reduce:transition-none ds:hover:bg-surface-2\",\n selected && \"ds:bg-brand-bg\",\n className,\n )}\n onClick={(event) => {\n onClick?.(event);\n if (!event.defaultPrevented) {\n onOpen?.();\n }\n }}\n {...props}\n >\n {showCheckbox !== false && (\n <CheckboxSlot name={name} selected={selected} onSelectedChange={onSelectedChange} />\n )}\n <FileTile fileType={fileType} />\n <div className=\"ds:min-w-0 ds:flex-1\">\n <div className=\"ds:flex ds:min-w-0 ds:items-center ds:gap-2\">\n <span className=\"ds:truncate ds:text-[13.5px] ds:font-semibold ds:text-fg\">{name}</span>\n {nameAdornment}\n </div>\n <MetaText\n values={[size, date, by]}\n className=\"ds:mt-0.5 ds:flex ds:flex-wrap ds:items-center ds:gap-[7px] ds:text-[11.5px] ds:text-fg-3\"\n />\n </div>\n <div className=\"ds:flex ds:shrink-0 ds:items-center ds:gap-[10px]\">\n {status}\n <MoreActions menu={menu} />\n </div>\n </div>\n );\n },\n);\n\nDocumentFileRow.displayName = \"DocumentFileRow\";\n\nexport const DocumentFileCard = React.forwardRef<HTMLDivElement, DocumentFileCardProps>(\n function DocumentFileCard(\n {\n name,\n fileType,\n size,\n date,\n by: _by,\n status,\n nameAdornment: _nameAdornment,\n menu,\n selected = false,\n showCheckbox = true,\n onSelectedChange,\n onOpen,\n className,\n onClick,\n ...props\n },\n ref,\n ) {\n return (\n // Whole-card click is a pointer enhancement that opens the file; the same\n // action is keyboard-reachable via the kebab menu's items, and the card's\n // interactive controls (checkbox, menu) are independently focusable.\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions, jsx-a11y/click-events-have-key-events\n <div\n ref={ref}\n className={cn(\n \"ds:group ds:relative ds:cursor-pointer ds:rounded-2xl ds:border ds:border-rule ds:bg-surface ds:p-3\",\n \"ds:transition-[border-color,box-shadow,transform] ds:duration-[var(--motion-duration-feedback)] ds:motion-reduce:transition-none\",\n \"ds:hover:border-rule-strong ds:hover:shadow-raised\",\n selected && \"ds:border-brand ds:bg-brand-bg\",\n className,\n )}\n onClick={(event) => {\n onClick?.(event);\n if (!event.defaultPrevented) {\n onOpen?.();\n }\n }}\n {...props}\n >\n {showCheckbox !== false && (\n <CheckboxSlot\n name={name}\n selected={selected}\n onSelectedChange={onSelectedChange}\n className=\"ds:absolute ds:top-2 ds:left-2 ds:z-[calc(var(--z-base)+2)]\"\n />\n )}\n <div className=\"ds:relative ds:mb-[11px] ds:grid ds:h-[92px] ds:place-items-center ds:overflow-hidden ds:rounded-[10px] ds:bg-surface-2\">\n <FileTile fileType={fileType} card />\n </div>\n <div className=\"ds:truncate ds:text-[13px] ds:font-semibold ds:text-fg\">{name}</div>\n <MetaText\n values={[size, date]}\n className=\"ds:mt-[3px] ds:flex ds:items-center ds:gap-[6px] ds:text-[11px] ds:text-fg-3\"\n />\n <div className=\"ds:mt-[10px] ds:flex ds:items-center ds:justify-between\">\n <div className=\"ds:min-w-0\">{status}</div>\n <MoreActions menu={menu} />\n </div>\n </div>\n );\n },\n);\n\nDocumentFileCard.displayName = \"DocumentFileCard\";\n\n/* -------------------------------------------------------------------------- */\n/* DocumentFileLine */\n/* -------------------------------------------------------------------------- */\n\nconst lineCaptionToneClass = {\n muted: \"ds:text-fg-4\",\n warning: \"ds:text-warning-fg\",\n danger: \"ds:text-danger-fg\",\n} as const;\n\nexport interface DocumentFileLineProps extends React.HTMLAttributes<HTMLDivElement> {\n /** The file's own name. */\n name: string;\n /** Drives the leading glyph colour (\"pdf\", \"image/png\", \"xlsx\", …). */\n fileType?: string | undefined;\n /** Small chip at the trailing edge — e.g. the classified document type. */\n typeLabel?: React.ReactNode | undefined;\n /** One muted status line under the name — e.g. \"Categorizing…\". */\n caption?: React.ReactNode | undefined;\n /** Colour tone for the caption. */\n captionTone?: keyof typeof lineCaptionToneClass | undefined;\n /** When set, a preview (eye) button is shown that calls this. */\n onOpen?: (() => void) | undefined;\n /** Accessible label for the preview button (defaults to `Preview {name}`). */\n previewLabel?: string | undefined;\n}\n\n/**\n * DocumentFileLine — a compact single-line file row for DENSE inline lists:\n * the files collected under a checklist item, a \"still sorting\" group, or an\n * \"also received\" list. Unlike {@link DocumentFileRow} it carries no checkbox,\n * kebab menu, or size/date/by meta — just a file glyph, name, an optional type\n * chip + caption, and an optional preview (eye) action. Purpose-built for\n * {@link DocumentChecklist}; reach for `DocumentFileRow` when you need\n * selection, a menu, or file metadata.\n */\nexport const DocumentFileLine = React.forwardRef<HTMLDivElement, DocumentFileLineProps>(\n function DocumentFileLine(\n {\n name,\n fileType = \"\",\n typeLabel,\n caption,\n captionTone = \"muted\",\n onOpen,\n previewLabel,\n className,\n ...props\n },\n ref,\n ) {\n const { Icon, colorClass } = getFileTypeParts(fileType);\n\n return (\n <div\n ref={ref}\n className={cn(\n \"ds:flex ds:items-center ds:gap-2.5 ds:rounded-[10px] ds:px-2.5 ds:py-2\",\n \"ds:transition-colors ds:duration-[var(--motion-duration-feedback)] ds:motion-reduce:transition-none ds:hover:bg-surface-2\",\n className,\n )}\n {...props}\n >\n <span\n className=\"ds:grid ds:size-8 ds:shrink-0 ds:place-items-center ds:rounded-lg ds:bg-surface-2\"\n aria-hidden=\"true\"\n >\n <Icon className={colorClass} size={16} />\n </span>\n <div className=\"ds:min-w-0 ds:flex-1\">\n <p className=\"ds:truncate ds:text-[13px] ds:font-medium ds:text-fg\">{name}</p>\n {caption != null && (\n <p\n className={cn(\n \"ds:mt-0.5 ds:truncate ds:text-[11.5px] ds:leading-none\",\n lineCaptionToneClass[captionTone],\n )}\n >\n {caption}\n </p>\n )}\n </div>\n {typeLabel != null && <div className=\"ds:shrink-0\">{typeLabel}</div>}\n {onOpen != null && (\n <button\n type=\"button\"\n aria-label={previewLabel ?? `Preview ${name}`}\n onClick={onOpen}\n className={cn(\n \"ds:grid ds:size-7 ds:shrink-0 ds:place-items-center ds:rounded-lg ds:text-fg-4\",\n \"ds:transition-colors ds:duration-[var(--motion-duration-feedback)] ds:motion-reduce:transition-none\",\n \"ds:hover:bg-surface ds:hover:text-brand\",\n \"ds:focus-visible:outline-none ds:focus-visible:[box-shadow:var(--shadow-focus-ring)]\",\n )}\n >\n <EyeIcon size={15} />\n </button>\n )}\n </div>\n );\n },\n);\n\nDocumentFileLine.displayName = \"DocumentFileLine\";\n","\"use client\";\n\nimport * as React from \"react\";\n\nimport { cn } from \"../lib/cn\";\nimport { CheckIcon, ClockIcon, FileTextIcon } from \"../primitives/icons\";\nimport { ProgressBar } from \"../primitives/progress-bar\";\nimport { StatusPill } from \"../primitives/status-pill\";\nimport { DocumentFileLine, type DocumentFileLineProps } from \"../composites/document-file-row\";\n\n/* -------------------------------------------------------------------------- */\n/* Types */\n/* -------------------------------------------------------------------------- */\n\n/**\n * A checklist item's lifecycle, from the client's point of view:\n * awaiting — expected, nothing uploaded yet\n * in-review — a file arrived and is being categorized / verified\n * received — the document is in\n * complete — in and finalized\n * not-applicable — the client marked it as not-needed\n */\nexport type DocumentChecklistStatus =\n | \"awaiting\"\n | \"in-review\"\n | \"received\"\n | \"complete\"\n | \"not-applicable\";\n\n/** A single collected file rendered under an item (or in the sorting/extra lists). */\nexport interface DocumentChecklistFile\n extends Pick<\n DocumentFileLineProps,\n \"name\" | \"fileType\" | \"typeLabel\" | \"caption\" | \"captionTone\" | \"onOpen\"\n > {\n id: string;\n}\n\n/** One expected document type on the checklist. */\nexport interface DocumentChecklistItem {\n id: string;\n /** Plain-English label the client reads (e.g. \"W-2\"). */\n label: string;\n status: DocumentChecklistStatus;\n /** Files classified into this slot (0..N). */\n files?: DocumentChecklistFile[] | undefined;\n /**\n * Rendered under an awaiting row — the \"I can't provide this\" control (a\n * caller-owned Select of missing-reason options). Kept as a slot so the\n * composite stays presentational and product-agnostic.\n */\n action?: React.ReactNode;\n}\n\nexport interface DocumentChecklistProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"title\"> {\n items: DocumentChecklistItem[];\n /** Section heading. */\n title?: string;\n /** Roll-up shown as a count + bar. Omit to hide the progress header. */\n progress?: { received: number; total: number; percent: number };\n /** The upload dropzone, rendered at the very top of the single column. */\n upload?: React.ReactNode;\n /** Files still being sorted (not yet placed on a slot). */\n reviewing?: DocumentChecklistFile[];\n /** Recognized files that aren't on the checklist. */\n extra?: DocumentChecklistFile[];\n reviewingLabel?: string;\n extraLabel?: string;\n /** Rendered when there are no items at all. */\n emptyState?: React.ReactNode;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Bits */\n/* -------------------------------------------------------------------------- */\n\nconst DONE_STATUSES: ReadonlySet<DocumentChecklistStatus> = new Set([\"received\", \"complete\"]);\n\nfunction StatePill({ status }: { status: DocumentChecklistStatus }) {\n switch (status) {\n case \"received\":\n return <StatusPill status=\"received\" dot={false} />;\n case \"complete\":\n return <StatusPill status=\"complete\" dot={false} />;\n case \"in-review\":\n return (\n <StatusPill status=\"in-review\" dot={false}>\n Reviewing\n </StatusPill>\n );\n case \"not-applicable\":\n return (\n <StatusPill status=\"draft\" dot={false}>\n Not needed\n </StatusPill>\n );\n default:\n return (\n <StatusPill status=\"pending\" dot={false}>\n Awaiting\n </StatusPill>\n );\n }\n}\n\n/** Leading state glyph — a token-pure soft circle that reads at a glance. */\nfunction StateGlyph({ status }: { status: DocumentChecklistStatus }) {\n if (DONE_STATUSES.has(status)) {\n return (\n <span\n className=\"ds:grid ds:size-[22px] ds:shrink-0 ds:place-items-center ds:rounded-full ds:bg-success-bg ds:text-success-fg ds:ring-1 ds:ring-inset ds:ring-success-line/70\"\n aria-hidden=\"true\"\n >\n <CheckIcon size={13} />\n </span>\n );\n }\n if (status === \"in-review\") {\n return (\n <span\n className=\"ds:grid ds:size-[22px] ds:shrink-0 ds:place-items-center ds:rounded-full ds:bg-warning-bg ds:text-warning-fg ds:ring-1 ds:ring-inset ds:ring-warning-line/70\"\n aria-hidden=\"true\"\n >\n <ClockIcon size={12} />\n </span>\n );\n }\n if (status === \"not-applicable\") {\n return (\n <span\n className=\"ds:grid ds:size-[22px] ds:shrink-0 ds:place-items-center ds:rounded-full ds:border ds:border-rule ds:text-fg-4\"\n aria-hidden=\"true\"\n >\n <span className=\"ds:h-px ds:w-2.5 ds:rounded-full ds:bg-current\" />\n </span>\n );\n }\n return (\n <span\n className=\"ds:size-[22px] ds:shrink-0 ds:rounded-full ds:border-[1.5px] ds:border-fg-4/35 ds:bg-surface\"\n aria-hidden=\"true\"\n />\n );\n}\n\nfunction ChecklistItemRow({ item }: { item: DocumentChecklistItem }) {\n const done = DONE_STATUSES.has(item.status);\n const files = item.files ?? [];\n\n return (\n <div\n className={cn(\n \"ds:rounded-xl ds:border ds:px-3.5 ds:py-2.5 ds:shadow-quiet ds:transition-colors ds:duration-[var(--motion-duration-feedback)] ds:motion-reduce:transition-none\",\n done\n ? \"ds:border-success-line/70 ds:bg-success-bg/30\"\n : item.status === \"in-review\"\n ? \"ds:border-warning-line/70 ds:bg-warning-bg/25\"\n : \"ds:border-rule ds:bg-surface\",\n )}\n >\n {/* One row when the pane is wide (glyph · label · reason · pill), and two\n rows when it's narrow (label + pill on top, reason wraps below). Driven\n by the container width via flex-wrap + order, not the viewport. */}\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-x-3\">\n <StateGlyph status={item.status} />\n <p className=\"ds:min-w-0 ds:flex-1 ds:truncate ds:text-[13.5px] ds:font-semibold ds:tracking-tight ds:text-fg\">\n {item.label}\n </p>\n {item.action != null && (\n <div className=\"ds:order-3 ds:w-full ds:border-t ds:border-rule/70 ds:pt-3 ds:@2xl/checklist:order-2 ds:@2xl/checklist:w-72 ds:@2xl/checklist:border-t-0 ds:@2xl/checklist:pt-0\">\n {item.action}\n </div>\n )}\n <div className=\"ds:order-2 ds:shrink-0 ds:@2xl/checklist:order-3\">\n <StatePill status={item.status} />\n </div>\n </div>\n\n {files.length > 0 && (\n <div className=\"ds:mt-2 ds:flex ds:flex-col ds:gap-0.5 ds:pl-[30px]\">\n {files.map((file) => (\n <DocumentFileLine\n key={file.id}\n name={file.name}\n fileType={file.fileType}\n typeLabel={file.typeLabel}\n caption={file.caption}\n captionTone={file.captionTone}\n onOpen={file.onOpen}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n\nfunction GroupDivider({ label }: { label: string }) {\n return (\n <div className=\"ds:flex ds:items-center ds:gap-3 ds:pt-1\">\n <span className=\"ds:text-[11px] ds:font-semibold ds:uppercase ds:tracking-wider ds:text-fg-4\">{label}</span>\n <span className=\"ds:h-px ds:flex-1 ds:bg-rule\" />\n </div>\n );\n}\n\nfunction FileGroup({ files }: { files: DocumentChecklistFile[] }) {\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-0.5 ds:rounded-xl ds:border ds:border-rule ds:bg-surface ds:p-1.5 ds:shadow-quiet\">\n {files.map((file) => (\n <DocumentFileLine\n key={file.id}\n name={file.name}\n fileType={file.fileType}\n typeLabel={file.typeLabel}\n caption={file.caption}\n captionTone={file.captionTone}\n onOpen={file.onOpen}\n />\n ))}\n </div>\n );\n}\n\n/* -------------------------------------------------------------------------- */\n/* DocumentChecklist */\n/* -------------------------------------------------------------------------- */\n\n/**\n * DocumentChecklist — the client's single-column \"your documents\" experience.\n *\n * One scannable list: an upload dropzone on top, a progress roll-up, then every\n * expected document as a row that moves through Awaiting → Reviewing → Received\n * in place (state lives on the row, never in a separate bucket). Files still\n * being sorted surface in a compact \"we're sorting these\" group, and recognized\n * files that aren't on the checklist fall under an \"also received\" divider — so\n * nothing an upload produced is ever hidden, and there is exactly one place to\n * look.\n *\n * Fully controlled and presentational: the caller supplies `items`, `progress`,\n * and slots (`upload`, per-row `action`, per-file `onOpen`). It consumes only\n * semantic tokens, so `data-brand` retints it per product automatically.\n *\n * @deprecated Frozen in `/legacy` (W8-09): no known consumer, no feature work.\n * Owner: PORTAL client portal, which decides to adopt, contribute or release\n * the name. Never removed before 3.0.\n */\nexport const DocumentChecklist = React.forwardRef<HTMLDivElement, DocumentChecklistProps>(\n function DocumentChecklist(\n {\n items,\n title = \"Your documents\",\n progress,\n upload,\n reviewing,\n extra,\n reviewingLabel = \"We're sorting these\",\n extraLabel = \"Also received\",\n emptyState,\n className,\n ...props\n },\n ref,\n ) {\n const hasProgress = progress != null && progress.total > 0;\n const reviewingFiles = reviewing ?? [];\n const extraFiles = extra ?? [];\n const isEmpty = items.length === 0 && reviewingFiles.length === 0 && extraFiles.length === 0;\n\n return (\n <div ref={ref} className={cn(\"ds:@container/checklist ds:flex ds:flex-col ds:gap-4\", className)} {...props}>\n {(title || hasProgress) && (\n <div className=\"ds:flex ds:flex-col ds:gap-2\">\n <div className=\"ds:flex ds:items-baseline ds:justify-between ds:gap-3\">\n <h3 className=\"ds:text-[15px] ds:font-semibold ds:tracking-tight ds:text-fg\">{title}</h3>\n {hasProgress && (\n <span className=\"ds:shrink-0 ds:text-[12.5px] ds:tabular-nums ds:text-fg-3\">\n <span className=\"ds:font-semibold ds:text-fg-2\">{progress.received}</span> of{\" \"}\n {progress.total} received\n </span>\n )}\n </div>\n {hasProgress && <ProgressBar value={progress.percent} max={100} />}\n </div>\n )}\n\n {upload}\n\n {items.length > 0 ? (\n <ul className=\"ds:flex ds:flex-col ds:gap-2\">\n {items.map((item) => (\n <li key={item.id}>\n <ChecklistItemRow item={item} />\n </li>\n ))}\n </ul>\n ) : isEmpty ? (\n (emptyState ?? (\n <div className=\"ds:flex ds:flex-col ds:items-center ds:gap-2 ds:rounded-2xl ds:border ds:border-dashed ds:border-rule ds:bg-surface ds:px-4 ds:py-10 ds:text-center\">\n <FileTextIcon size={20} className=\"ds:text-fg-4\" aria-hidden=\"true\" />\n <p className=\"ds:text-[13px] ds:font-medium ds:text-fg-3\">No documents expected yet.</p>\n </div>\n ))\n ) : null}\n\n {reviewingFiles.length > 0 && (\n <div className=\"ds:flex ds:flex-col ds:gap-1\">\n <GroupDivider label={reviewingLabel} />\n <div className=\"ds:rounded-xl ds:border ds:border-warning-line/70 ds:bg-warning-bg/20 ds:p-1.5 ds:shadow-quiet\">\n {reviewingFiles.map((file) => (\n <DocumentFileLine\n key={file.id}\n name={file.name}\n fileType={file.fileType}\n caption={file.caption ?? \"Categorizing…\"}\n captionTone={file.captionTone ?? \"warning\"}\n onOpen={file.onOpen}\n />\n ))}\n </div>\n </div>\n )}\n\n {extraFiles.length > 0 && (\n <div className=\"ds:flex ds:flex-col ds:gap-1\">\n <GroupDivider label={extraLabel} />\n <FileGroup files={extraFiles} />\n </div>\n )}\n </div>\n );\n },\n);\n\nDocumentChecklist.displayName = \"DocumentChecklist\";\n","\"use client\";\n\nimport { forwardRef } from \"react\";\n\nimport { cn } from \"../lib/cn\";\nimport { CloseIcon } from \"../primitives/icons\";\nimport { Input } from \"../primitives/input\";\n\n/**\n * DocumentRequestField — one numbered \"document N\" card inside the Request\n * Documents modal. Renders a header badge, an optional remove button, and a\n * three-field grid: document-type slot (caller-supplied), a required label\n * input, and an optional note input.\n *\n * Props:\n * - `index` — zero-based position; badge shows `index + 1`.\n * - `typeControl` — ReactNode rendered in the Type field slot (pass a\n * select, combobox, or disabled placeholder).\n * - `label` — controlled value for the Label input.\n * - `onLabelChange` — called with the new string on every keystroke.\n * - `note` — controlled value for the Note input.\n * - `onNoteChange` — called with the new string on every keystroke.\n * - `onRemove` — when provided (and `canRemove` is true) a remove\n * button appears in the header row.\n * - `canRemove` — guards `onRemove`; set false when only one field\n * remains so the user cannot delete the last entry.\n */\n\nexport interface DocumentRequestFieldProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n /** Zero-based index; displayed as `index + 1` in the badge and aria-labels. */\n index: number;\n /** Slot for the document-type control (select, combobox, disabled input, etc.). */\n typeControl: React.ReactNode;\n /** Controlled value for the Label field. */\n label: string;\n /** Called with the updated string whenever the Label input changes. */\n onLabelChange: (value: string) => void;\n /** Controlled value for the Note field. */\n note: string;\n /** Called with the updated string whenever the Note input changes. */\n onNoteChange: (value: string) => void;\n /** Callback to remove this card from the list. Only rendered when `canRemove` is also true. */\n onRemove?: () => void;\n /** Whether removal is permitted (e.g. false when this is the last card). */\n canRemove?: boolean;\n}\n\n/**\n * @deprecated Frozen in `/legacy` (W8-09): no known consumer, no feature work.\n * Owner: PRO documents, which decides to adopt, contribute or release\n * the name. Never removed before 3.0.\n */\nexport const DocumentRequestField = forwardRef<HTMLDivElement, DocumentRequestFieldProps>(\n function DocumentRequestField(\n {\n index,\n typeControl,\n label,\n onLabelChange,\n note,\n onNoteChange,\n onRemove,\n canRemove = true,\n className,\n ...props\n },\n ref,\n ) {\n const humanIndex = index + 1;\n const showRemove = Boolean(onRemove) && canRemove;\n\n return (\n <div\n ref={ref}\n className={cn(\n \"ds:rounded-2xl ds:border ds:border-rule ds:bg-surface-2 ds:p-[14px] ds:mb-[10px]\",\n className,\n )}\n {...props}\n >\n {/* ── Header row ─────────────────────────────────────────────── */}\n <div className=\"ds:flex ds:items-center ds:gap-[9px] ds:mb-3\">\n {/* Number badge */}\n <span\n aria-hidden=\"true\"\n className=\"ds:size-[22px] ds:rounded-full ds:bg-brand-bg ds:text-brand ds:text-[11px] ds:font-bold ds:grid ds:place-items-center ds:shrink-0 ds:leading-none\"\n >\n {humanIndex}\n </span>\n\n {/* Title */}\n <span className=\"ds:text-[13px] ds:font-[650] ds:text-brand\">Document {humanIndex}</span>\n\n {/* Remove button */}\n {showRemove && (\n <button\n type=\"button\"\n onClick={onRemove}\n aria-label={`Remove document ${humanIndex}`}\n className={cn(\n \"ds:ml-auto ds:size-[26px] ds:rounded-[7px] ds:grid ds:place-items-center\",\n \"ds:text-fg-4\",\n \"ds:transition-colors ds:duration-[var(--motion-duration-feedback)] ds:motion-reduce:transition-none\",\n \"ds:hover:bg-danger-bg ds:hover:text-danger-fg\",\n \"ds:focus-visible:outline-none ds:focus-visible:[box-shadow:var(--shadow-focus-ring)]\",\n )}\n >\n <CloseIcon size={14} aria-hidden=\"true\" />\n </button>\n )}\n </div>\n\n {/* ── Fields grid ────────────────────────────────────────────── */}\n <div className=\"ds:grid ds:grid-cols-2 ds:gap-3\">\n {/* Field 1 — Type (caller-supplied control) */}\n <div>\n <span className=\"ds:mb-1.5 ds:block ds:text-[11.5px] ds:font-semibold ds:text-fg-2\">Type</span>\n {typeControl}\n </div>\n\n {/* Field 2 — Label (required) */}\n <div>\n <span className=\"ds:mb-1.5 ds:block ds:text-[11.5px] ds:font-semibold ds:text-fg-2\">\n Label{\" \"}\n <span className=\"ds:text-danger-fg\" aria-hidden=\"true\">\n *\n </span>\n </span>\n <Input\n value={label}\n onChange={(e) => onLabelChange(e.target.value)}\n placeholder=\"e.g. Bank statement for review\"\n inputSize=\"sm\"\n aria-label={`Label for document ${humanIndex}`}\n aria-required=\"true\"\n />\n </div>\n\n {/* Field 3 — Note (full width) */}\n <div className=\"ds:col-span-2\">\n <span className=\"ds:mb-1.5 ds:block ds:text-[11.5px] ds:font-semibold ds:text-fg-2\">Note</span>\n <Input\n value={note}\n onChange={(e) => onNoteChange(e.target.value)}\n placeholder=\"Optional note for the client\"\n inputSize=\"sm\"\n aria-label={`Note for document ${humanIndex}`}\n />\n </div>\n </div>\n </div>\n );\n },\n);\n\nDocumentRequestField.displayName = \"DocumentRequestField\";\n","\"use client\";\n\nimport { forwardRef } from \"react\";\n\nimport { cn } from \"../lib/cn\";\nimport { Button } from \"../primitives/button\";\nimport { SparklesIcon } from \"../primitives/icons\";\nimport { StatusPill, type PillStatus } from \"../primitives/status-pill\";\n\n/**\n * MissingDocumentsPanel — an AI insight card that surfaces documents still\n * expected from a client within an engagement.\n *\n * Items carry one of three states that map to a `<StatusPill>` semantic:\n * missing → \"Requested\" (warning)\n * pending → \"Pending\" (secondary)\n * received → \"Received\" (success)\n *\n * When no items remain, the panel renders a compact \"All documents received\"\n * success line instead of an empty list.\n *\n * Pass `onRequest` to show a \"Request missing\" footer button. The panel is\n * fully controlled — it renders whatever `items` you supply.\n */\n\nexport type DocumentItemState = \"missing\" | \"pending\" | \"received\";\n\nexport interface MissingDocumentItem {\n /** Document label shown in the row. */\n label: string;\n /** Optional due / expected date string (e.g. \"Due Jun 20\"). */\n dueDate?: string;\n /** Current fulfilment state for this document. */\n state: DocumentItemState;\n}\n\nexport interface MissingDocumentsPanelProps extends React.HTMLAttributes<HTMLDivElement> {\n /** List of expected documents and their current states. */\n items: MissingDocumentItem[];\n /** Subtitle below the panel title. */\n subtitle?: string;\n /** When provided a \"Request missing\" button is rendered in the footer. */\n onRequest?: () => void;\n}\n\nconst stateToStatus: Record<DocumentItemState, PillStatus> = {\n missing: \"requested\",\n pending: \"pending\",\n received: \"received\",\n};\n\n/** Small leading dot that communicates item state without relying solely on the pill. */\nfunction StateDot({ state }: { state: DocumentItemState }) {\n const colorClass =\n state === \"received\"\n ? \"ds:bg-success-fg\"\n : state === \"pending\"\n ? \"ds:bg-fg-4\"\n : \"ds:bg-warning-fg\";\n\n return (\n <span\n aria-hidden=\"true\"\n className={cn(\"ds:block ds:size-1.5 ds:shrink-0 ds:rounded-full\", colorClass)}\n />\n );\n}\n\n/**\n * @deprecated Frozen in `/legacy` (W8-09): no known consumer, no feature work.\n * Owner: PRO documents, which decides to adopt, contribute or release\n * the name. Never removed before 3.0.\n */\nexport const MissingDocumentsPanel = forwardRef<HTMLDivElement, MissingDocumentsPanelProps>(\n function MissingDocumentsPanel(\n { items, subtitle = \"Suggested from this engagement\", onRequest, className, ...props },\n ref,\n ) {\n const hasItems = items.length > 0;\n\n return (\n <div\n ref={ref}\n className={cn(\n \"ds:border-rule ds:bg-surface ds:flex ds:flex-col ds:gap-3 ds:rounded-2xl ds:border ds:p-4 ds:shadow-quiet\",\n className,\n )}\n {...props}\n >\n {/* ── Header ── */}\n <div className=\"ds:flex ds:items-start ds:gap-2.5\">\n {/* AI gradient icon chip */}\n <span\n aria-hidden=\"true\"\n className=\"ds:grid ds:size-7 ds:shrink-0 ds:place-items-center ds:rounded-lg ds:bg-[image:var(--gradient-ai)] ds:text-white ds:[&_svg]:size-3.5\"\n >\n <SparklesIcon />\n </span>\n\n <div className=\"ds:min-w-0 ds:flex-1\">\n {/* Eyebrow */}\n <p className=\"ds:text-fg-4 ds:mb-0.5 ds:text-[10px] ds:font-semibold ds:tracking-widest ds:uppercase\">\n AI\n </p>\n <p className=\"ds:text-fg ds:text-[14px] ds:font-[650] ds:leading-tight\">Missing documents</p>\n <p className=\"ds:text-fg-3 ds:mt-0.5 ds:text-[12px] ds:leading-snug\">{subtitle}</p>\n </div>\n </div>\n\n {/* ── Body ── */}\n {hasItems ? (\n <ul className=\"ds:flex ds:flex-col\">\n {items.map((item, idx) => (\n <li\n key={idx}\n className=\"ds:border-rule ds:flex ds:items-center ds:gap-3 ds:border-b ds:py-2 ds:last:border-0\"\n >\n {/* Leading dot */}\n <StateDot state={item.state} />\n\n {/* Label + due date */}\n <div className=\"ds:min-w-0 ds:flex-1\">\n <p className=\"ds:text-fg ds:truncate ds:text-[13px] ds:leading-snug\">{item.label}</p>\n {item.dueDate != null && (\n <p className=\"ds:text-fg-3 ds:mt-0.5 ds:text-[11.5px] ds:leading-none\">{item.dueDate}</p>\n )}\n </div>\n\n {/* Status pill */}\n <StatusPill status={stateToStatus[item.state]} dot={false} />\n </li>\n ))}\n </ul>\n ) : (\n /* Empty / all-received state */\n <p className=\"ds:text-success-fg ds:py-1 ds:text-[13px] ds:font-medium\">\n All documents received\n </p>\n )}\n\n {/* ── Footer ── */}\n {onRequest != null && hasItems && (\n <div className=\"ds:flex ds:justify-end\">\n <Button size=\"sm\" variant=\"secondary\" onClick={onRequest}>\n Request missing\n </Button>\n </div>\n )}\n </div>\n );\n },\n);\n\nMissingDocumentsPanel.displayName = \"MissingDocumentsPanel\";\n","\"use client\";\n\nimport { forwardRef } from \"react\";\n\nimport { Button } from \"../primitives/button\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuTrigger,\n} from \"../primitives/dropdown-menu\";\nimport { ChevronDownIcon, PlusIcon } from \"../primitives/icons\";\n\n/**\n * NewMenu — the TopBar \"+ New\" create dropdown. A primary button opens a\n * menu of create actions, optionally split into labelled groups (e.g.\n * \"Work\" vs \"People\"). Thin composition over the DropdownMenu primitive;\n * the surface, focus, and portal behavior all come from there.\n */\n\nexport interface NewMenuAction {\n id: string;\n label: React.ReactNode;\n /** Supporting line under the label. */\n description?: React.ReactNode;\n icon?: React.ReactNode;\n /** Keyboard hint, right-aligned (display only). */\n shortcut?: string;\n onSelect?: () => void;\n}\n\nexport interface NewMenuGroup {\n label?: React.ReactNode;\n actions: NewMenuAction[];\n}\n\nexport interface NewMenuProps {\n /** Flat action list. Use `groups` instead for labelled sections. */\n actions?: NewMenuAction[];\n groups?: NewMenuGroup[];\n /** Trigger label. Default \"New\". */\n triggerLabel?: React.ReactNode;\n /** Override the trigger entirely (still opens the menu). */\n trigger?: React.ReactNode;\n align?: \"start\" | \"center\" | \"end\";\n}\n\nfunction renderAction(action: NewMenuAction) {\n return (\n <DropdownMenuItem\n key={action.id}\n {...(action.onSelect !== undefined && { onSelect: action.onSelect })}\n >\n {action.icon && (\n <span aria-hidden=\"true\" className=\"ds:text-fg-3 ds:[&_svg]:size-4\">\n {action.icon}\n </span>\n )}\n <span className=\"ds:flex ds:min-w-0 ds:flex-col\">\n <span className=\"ds:truncate\">{action.label}</span>\n {action.description && (\n <span className=\"ds:text-fg-3 ds:truncate ds:text-xs\">{action.description}</span>\n )}\n </span>\n {action.shortcut && <DropdownMenuShortcut>{action.shortcut}</DropdownMenuShortcut>}\n </DropdownMenuItem>\n );\n}\n\n/**\n * @deprecated Frozen in `/legacy` (W8-09): no known consumer, no feature work.\n * Owner: PRO, which decides to adopt, contribute or release\n * the name. Never removed before 3.0.\n */\nexport const NewMenu = forwardRef<HTMLButtonElement, NewMenuProps>(function NewMenu(\n { actions, groups, triggerLabel = \"New\", trigger, align = \"end\" },\n ref,\n) {\n const sections: NewMenuGroup[] = groups ?? (actions ? [{ actions }] : []);\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n {trigger ?? (\n <Button ref={ref} iconLeft={<PlusIcon />}>\n {triggerLabel}\n <ChevronDownIcon className=\"ds:size-4 ds:opacity-70\" />\n </Button>\n )}\n </DropdownMenuTrigger>\n <DropdownMenuContent align={align} className=\"ds:w-60\">\n {sections.map((section, i) => (\n <div key={i}>\n {i > 0 && <DropdownMenuSeparator />}\n {section.label && <DropdownMenuLabel>{section.label}</DropdownMenuLabel>}\n {section.actions.map(renderAction)}\n </div>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n});\n\nNewMenu.displayName = \"NewMenu\";\n","\"use client\";\n\nimport { forwardRef, useCallback, useState, type ReactNode } from \"react\";\n\nimport { dataTableAnatomy, type DataTableSlot } from \"../foundation/anatomy/slots\";\nimport { slot, stateAttributes } from \"../foundation/anatomy/slot\";\nimport { useDsMessages } from \"../foundation/provider/context\";\nimport { cn } from \"../lib/cn\";\nimport { Checkbox } from \"../primitives/checkbox\";\nimport { Input } from \"../primitives/input\";\nimport { Pressable } from \"../primitives/pressable\";\nimport {\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n type TableBodyProps,\n type TableCellProps,\n type TableHeaderProps,\n type TableHeadProps,\n type TableRowProps,\n type TableSortDirection,\n} from \"../primitives/table\";\n\nimport {\n ChevronDownIcon,\n ChevronUpIcon,\n ChevronsUpDownIcon,\n SearchIcon,\n} from \"../primitives/icons\";\n/* ============================================================\n DataTable — composite chrome around the Table primitive.\n\n The card frame, toolbar, search, spacer and results count are the\n DataTable's own; the table parts (W6-03) are aliases of the `Table*`\n parts under the `DataTable*` names, so consumers keep their imports\n and the styling has one source.\n ============================================================ */\n\n/* ── Frame ────────────────────────────────────────────────── */\n\n/** The data-table parts (ADR-008). See the registry for the doc comment. */\nexport type { DataTableSlot };\n\nexport interface DataTableProps extends React.HTMLAttributes<HTMLDivElement> {\n /** When true, renders the table card with a flat top edge so it\n * visually attaches to a `<DataTableToolbar>` above it. */\n withToolbar?: boolean;\n}\n\n/**\n * DataTable — outer wrapper. Children are typically:\n * <DataTableToolbar /> + <table> + <DataTablePagination />.\n *\n * The `<table>` is hand-written by the consumer; this wrapper renders\n * the surface card chrome on its descendant `<table>` element via a\n * Tailwind arbitrary-variant selector. When `withToolbar` is set, the\n * top corners flatten so the table visually joins the toolbar above.\n *\n * Children render in document order — toolbar (if any) then `<table>`\n * then pagination — with the table card and the pagination not sharing\n * a background.\n */\nexport const DataTable = forwardRef<HTMLDivElement, DataTableProps>(function DataTable(\n { withToolbar, className, children, ...props },\n ref,\n) {\n return (\n <div\n ref={ref}\n data-with-toolbar={withToolbar ? \"true\" : undefined}\n {...slot(dataTableAnatomy, \"root\")}\n className={cn(\n // Outer frame on the whole component: a single visible border +\n // quiet shadow wrapping the toolbar (if any) and the table as one\n // card. overflow-hidden clips the header/cell backgrounds to the\n // rounded corners.\n \"ds:w-full ds:overflow-hidden ds:rounded-card ds:border ds:border-rule-strong ds:bg-surface ds:shadow-quiet\",\n \"ds:[&_table]:bg-surface ds:[&_table]:w-full ds:[&_table]:border-collapse\",\n className,\n )}\n {...props}\n >\n {children}\n </div>\n );\n});\nDataTable.displayName = \"DataTable\";\n\n/* ── Toolbar ──────────────────────────────────────────────── */\n\nexport type DataTableToolbarProps = React.HTMLAttributes<HTMLDivElement>;\n\n/**\n * DataTableToolbar — header strip at the top of the table card. The outer\n * frame is owned by `<DataTable>`, so this is just a row with a bottom\n * divider separating it from the table below.\n */\nexport const DataTableToolbar = forwardRef<HTMLDivElement, DataTableToolbarProps>(\n function DataTableToolbar({ className, ...props }, ref) {\n return (\n <div\n ref={ref}\n {...slot(dataTableAnatomy, \"toolbar\")}\n className={cn(\n \"ds:flex ds:items-center ds:gap-2 ds:px-3 ds:py-2.5\",\n \"ds:border-rule ds:bg-surface ds:border-b\",\n className,\n )}\n {...props}\n />\n );\n },\n);\nDataTableToolbar.displayName = \"DataTableToolbar\";\n\nexport interface DataTableSearchProps extends Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n \"size\"\n> {\n /** Override the default placeholder. */\n placeholder?: string;\n}\n\n/**\n * DataTableSearch — small search input slot inside the toolbar. Wraps\n * the `Input` primitive at `inputSize=\"sm\"` with a leading search icon.\n */\nexport const DataTableSearch = forwardRef<HTMLInputElement, DataTableSearchProps>(\n function DataTableSearch({ placeholder: placeholderProp, className, ...props }, ref) {\n const messages = useDsMessages(\"dataTable\");\n const placeholder = placeholderProp ?? messages.search;\n return (\n <Input\n ref={ref}\n type=\"search\"\n inputSize=\"sm\"\n placeholder={placeholder}\n prefixIcon={<SearchIcon aria-hidden=\"true\" />}\n className={cn(\"ds:w-[280px]\", className)}\n {...props}\n />\n );\n },\n);\nDataTableSearch.displayName = \"DataTableSearch\";\n\nexport type DataTableSpacerProps = React.HTMLAttributes<HTMLSpanElement>;\n\n/** DataTableSpacer — `flex-1` spacer for arranging toolbar items. */\nexport const DataTableSpacer = forwardRef<HTMLSpanElement, DataTableSpacerProps>(\n function DataTableSpacer({ className, ...props }, ref) {\n return (\n <span\n ref={ref}\n aria-hidden=\"true\"\n {...slot(dataTableAnatomy, \"spacer\")}\n className={cn(\"ds:flex-1\", className)}\n {...props}\n />\n );\n },\n);\nDataTableSpacer.displayName = \"DataTableSpacer\";\n\nexport interface DataTableResultsCountProps extends Omit<\n React.HTMLAttributes<HTMLSpanElement>,\n \"children\"\n> {\n current: number;\n total: number;\n}\n\n/**\n * DataTableResultsCount — small \"12 of 247\" indicator. Mono + tabular.\n */\nexport const DataTableResultsCount = forwardRef<HTMLSpanElement, DataTableResultsCountProps>(\n function DataTableResultsCount({ current, total, className, ...props }, ref) {\n const messages = useDsMessages(\"dataTable\");\n return (\n <span\n ref={ref}\n {...slot(dataTableAnatomy, \"results-count\")}\n className={cn(\n \"ds:text-fg-4 ds:mr-1 ds:shrink-0 ds:font-sans ds:text-[11px] ds:whitespace-nowrap ds:tabular-nums\",\n className,\n )}\n {...props}\n >\n {current.toLocaleString()} {messages.of} {total.toLocaleString()}\n </span>\n );\n },\n);\nDataTableResultsCount.displayName = \"DataTableResultsCount\";\n\n/* ── Table sections ───────────────────────────────────────── */\n\n/*\n * W6-03: from here down the `DataTable*` parts are aliases of the `Table*`\n * parts of `src/primitives/table.tsx` — one styling source. Each renders the\n * `Table*` part and stamps its own `data-slot` (`data-table-*`) on top, so the\n * DOM a consumer selects on (C-DOM-13, the `data-table-*` anatomy) is what it\n * was, while the classes, geometry and colours are the table's. The props\n * gained in W6-01 (`align`, `numeric`, `muted`, `truncate`, `width`, `sticky`,\n * row `interactive`) are available on the `DataTable*` names too. CM-18\n * renames the 1:1 parts to the `Table*` names; the DataTable-specific cells\n * (`Name`, `Mono`, `Id`, `Due`, `Checkbox`) stay.\n */\n\n/** DataTableHead — `<thead>`; alias of `TableHeader`. */\nexport type DataTableHeadProps = TableHeaderProps;\n\nexport const DataTableHead = forwardRef<HTMLTableSectionElement, DataTableHeadProps>(\n function DataTableHead(props, ref) {\n return <TableHeader ref={ref} {...slot(dataTableAnatomy, \"header\")} {...props} />;\n },\n);\nDataTableHead.displayName = \"DataTableHead\";\n\n/** DataTableBody — `<tbody>`; alias of `TableBody`. Last row drops its bottom border. */\nexport type DataTableBodyProps = TableBodyProps;\n\nexport const DataTableBody = forwardRef<HTMLTableSectionElement, DataTableBodyProps>(\n function DataTableBody(props, ref) {\n return <TableBody ref={ref} {...slot(dataTableAnatomy, \"body\")} {...props} />;\n },\n);\nDataTableBody.displayName = \"DataTableBody\";\n\n/**\n * DataTableRow — `<tr>`; alias of `TableRow`. `selected` renders\n * `data-state=\"selected\"` and the brand tint (P-DATA-STATE); `interactive`\n * (W6-01) makes the row a click target.\n */\nexport type DataTableRowProps = TableRowProps;\n\nexport const DataTableRow = forwardRef<HTMLTableRowElement, DataTableRowProps>(\n function DataTableRow(props, ref) {\n return <TableRow ref={ref} {...slot(dataTableAnatomy, \"row\")} {...props} />;\n },\n);\nDataTableRow.displayName = \"DataTableRow\";\n\n/* ── Header cell ──────────────────────────────────────────── */\n\nexport type SortDirection = TableSortDirection;\n\nexport interface DataTableHeaderProps extends Omit<TableHeadProps, \"sort\" | \"onSortChange\"> {\n /** When true, the cell becomes a clickable button that toggles sort\n * state and renders a chevron indicator. */\n sortable?: boolean;\n /** Initial sort direction when the header mounts in a sorted state. */\n defaultSort?: SortDirection;\n /** Optional controlled sort state. When provided, `onSortChange` should\n * also be wired up — the header becomes fully controlled. */\n sort?: SortDirection | null;\n /** Fires whenever the user clicks a sortable header. */\n onSortChange?: (sort: SortDirection | null) => void;\n}\n\n/**\n * DataTableHeader — `<th scope=\"col\">`; alias of `TableHead` that keeps the\n * DataTable sort API: `sortable` gates sorting, the sort state is uncontrolled\n * (`defaultSort`) or controlled (`sort` + `onSortChange`). Sort cycle when\n * uncontrolled: unsorted → asc → desc → unsorted (3-state). The sort button\n * is the header's direct child `<button>` (C-DOM-13), styled like\n * `TableHead`'s.\n */\nexport const DataTableHeader = forwardRef<HTMLTableCellElement, DataTableHeaderProps>(\n function DataTableHeader(\n { sortable = false, defaultSort, sort: controlledSort, onSortChange, children, ...props },\n ref,\n ) {\n const [uncontrolledSort, setUncontrolledSort] = useState<SortDirection | null>(\n defaultSort ?? null,\n );\n const isControlled = controlledSort !== undefined;\n const currentSort = isControlled ? controlledSort : uncontrolledSort;\n\n const handleClick = useCallback(() => {\n if (!sortable) return;\n const next: SortDirection | null =\n currentSort === null ? \"asc\" : currentSort === \"asc\" ? \"desc\" : null;\n if (!isControlled) setUncontrolledSort(next);\n onSortChange?.(next);\n }, [sortable, currentSort, isControlled, onSortChange]);\n\n const ariaSort: React.AriaAttributes[\"aria-sort\"] = sortable\n ? currentSort === \"asc\"\n ? \"ascending\"\n : currentSort === \"desc\"\n ? \"descending\"\n : \"none\"\n : undefined;\n\n return (\n <TableHead\n ref={ref}\n scope=\"col\"\n aria-sort={ariaSort}\n {...slot(dataTableAnatomy, \"head\")}\n {...stateAttributes({ state: currentSort ?? undefined })}\n {...props}\n >\n {sortable ? (\n <Pressable\n onClick={handleClick}\n {...slot(dataTableAnatomy, \"head-button\")}\n className={cn(\n // Mirrors the sort button of `TableHead` (table.tsx) on the\n // DataTable's own `head-button` slot.\n \"ds:-mx-1 ds:-my-1 ds:inline-flex ds:items-center ds:gap-1 ds:rounded-icon ds:px-1 ds:py-1\",\n \"ds:font-sans ds:text-sm ds:font-medium ds:tracking-normal ds:normal-case ds:text-fg-3\",\n \"ds:transition-colors ds:duration-[var(--duration-fast)] ds:ease-[var(--ease-out-quart)] ds:motion-reduce:transition-none\",\n \"ds:hover:text-fg\",\n )}\n >\n {children}\n <span\n aria-hidden=\"true\"\n {...slot(dataTableAnatomy, \"head-indicator\")}\n className={cn(\n \"ds:text-fg-5 ds:ml-1 ds:inline-flex ds:shrink-0 ds:items-center ds:justify-center\",\n currentSort && \"ds:text-fg-3\",\n )}\n >\n {currentSort === \"asc\" ? (\n <ChevronUpIcon className=\"ds:size-3\" strokeWidth={2.2} />\n ) : currentSort === \"desc\" ? (\n <ChevronDownIcon className=\"ds:size-3\" strokeWidth={2.2} />\n ) : (\n <ChevronsUpDownIcon className=\"ds:size-3\" strokeWidth={2} />\n )}\n </span>\n </Pressable>\n ) : (\n children\n )}\n </TableHead>\n );\n },\n);\nDataTableHeader.displayName = \"DataTableHeader\";\n\n/* ── Body cells ───────────────────────────────────────────── */\n\n/** DataTableCell — `<td>`; alias of `TableCell` (13px / fg-2, W6-01 cell props). */\nexport type DataTableCellProps = TableCellProps;\n\nexport const DataTableCell = forwardRef<HTMLTableCellElement, DataTableCellProps>(\n function DataTableCell(props, ref) {\n return <TableCell ref={ref} {...slot(dataTableAnatomy, \"cell\")} {...props} />;\n },\n);\nDataTableCell.displayName = \"DataTableCell\";\n\n/**\n * DataTableCellName — primary identifier of the row. Display font,\n * fg color, medium weight.\n */\nexport const DataTableCellName = forwardRef<HTMLTableCellElement, DataTableCellProps>(\n function DataTableCellName({ className, ...props }, ref) {\n return (\n <TableCell\n ref={ref}\n {...slot(dataTableAnatomy, \"cell\")}\n {...stateAttributes({ variant: \"name\" })}\n className={cn(\"ds:font-display ds:text-fg ds:font-medium\", className)}\n {...props}\n />\n );\n },\n);\nDataTableCellName.displayName = \"DataTableCellName\";\n\n/**\n * DataTableCellMono — currency / IDs / numerics. Body font (Plus Jakarta\n * Sans) with tabular numerals so columns of figures stay aligned.\n */\nexport const DataTableCellMono = forwardRef<HTMLTableCellElement, DataTableCellProps>(\n function DataTableCellMono({ className, ...props }, ref) {\n return (\n <TableCell\n ref={ref}\n {...slot(dataTableAnatomy, \"cell\")}\n {...stateAttributes({ variant: \"mono\" })}\n className={cn(\"ds:font-sans ds:tabular-nums\", className)}\n {...props}\n />\n );\n },\n);\nDataTableCellMono.displayName = \"DataTableCellMono\";\n\n/**\n * DataTableCellId — muted ID (EIN, UUID, \"5h ago\") in the body font\n * (Plus Jakarta Sans) with tabular numerals.\n */\nexport const DataTableCellId = forwardRef<HTMLTableCellElement, DataTableCellProps>(\n function DataTableCellId({ className, ...props }, ref) {\n return (\n <TableCell\n ref={ref}\n {...slot(dataTableAnatomy, \"cell\")}\n {...stateAttributes({ variant: \"id\" })}\n className={cn(\"ds:font-sans ds:text-fg-4 ds:text-xs ds:tabular-nums\", className)}\n {...props}\n />\n );\n },\n);\nDataTableCellId.displayName = \"DataTableCellId\";\n\n/* ── Due-date cell ────────────────────────────────────────── */\n\nconst MS_PER_DAY = 86_400_000;\nconst DUE_NEAR_THRESHOLD_DAYS = 14;\n\nconst dueDateFormatter = new Intl.DateTimeFormat(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n});\n\nexport interface DataTableCellDueProps extends Omit<DataTableCellProps, \"children\"> {\n /** Date this row is due. */\n value: Date;\n /** Optional override for the displayed label (defaults to the\n * formatted date). */\n children?: ReactNode;\n}\n\n/**\n * DataTableCellDue — accepts a Date and auto-colors:\n * diff < 0 → text-danger-fg (overdue)\n * diff < 14d → text-warning-fg (due-near)\n * otherwise → text-fg-3 (default)\n *\n * The 14-day threshold and day-rounding (`Math.floor`) match the\n * `.cell-due-near` / `.cell-due-overdue` CSS classes in the mockup.\n */\nexport const DataTableCellDue = forwardRef<HTMLTableCellElement, DataTableCellDueProps>(\n function DataTableCellDue({ value, children, className, ...props }, ref) {\n const days = Math.floor((value.getTime() - Date.now()) / MS_PER_DAY);\n const tone =\n days < 0\n ? \"ds:text-danger-fg ds:font-medium\"\n : days < DUE_NEAR_THRESHOLD_DAYS\n ? \"ds:text-warning-fg ds:font-medium\"\n : \"ds:text-fg-3\";\n\n const ariaState = days < 0 ? \"overdue\" : days < DUE_NEAR_THRESHOLD_DAYS ? \"near\" : \"future\";\n\n return (\n <TableCell\n ref={ref}\n data-due-state={ariaState}\n {...slot(dataTableAnatomy, \"cell\")}\n {...stateAttributes({ variant: \"due\" })}\n className={cn(\"ds:font-sans ds:tabular-nums\", tone, className)}\n {...props}\n >\n {children ?? dueDateFormatter.format(value)}\n </TableCell>\n );\n },\n);\nDataTableCellDue.displayName = \"DataTableCellDue\";\n\n/* ── Checkbox cell ────────────────────────────────────────── */\n\nexport interface DataTableCheckboxProps extends Omit<\n DataTableCellProps,\n \"onChange\" | \"defaultChecked\" | \"children\"\n> {\n /** Forwarded to the inner `Checkbox` primitive. */\n checked?: boolean | \"indeterminate\";\n defaultChecked?: boolean | \"indeterminate\";\n onCheckedChange?: (checked: boolean | \"indeterminate\") => void;\n /** Accessible label for the checkbox (e.g. \"Select row Acme Corp.\"). */\n ariaLabel?: string;\n disabled?: boolean;\n /** Render the cell as `<th>` (for the select-all header) instead of `<td>`. */\n asHeader?: boolean;\n}\n\n/**\n * DataTableCheckbox — `<td>` (or `<th>` with `asHeader`) containing the\n * row-selection checkbox: `TableCell` / `TableHead` tightened to a 32px\n * column with no right padding to match `.row-checkbox` in the spec.\n */\nexport const DataTableCheckbox = forwardRef<HTMLTableCellElement, DataTableCheckboxProps>(\n function DataTableCheckbox(\n {\n checked,\n defaultChecked,\n onCheckedChange,\n ariaLabel,\n disabled,\n asHeader,\n className,\n ...props\n },\n ref,\n ) {\n const Cell = asHeader ? TableHead : TableCell;\n return (\n <Cell\n ref={ref}\n {...slot(dataTableAnatomy, \"checkbox-cell\")}\n className={cn(\"ds:w-8 ds:pr-0\", className)}\n {...props}\n >\n <Checkbox\n checked={checked}\n defaultChecked={defaultChecked}\n {...(onCheckedChange !== undefined && { onCheckedChange })}\n disabled={disabled}\n aria-label={ariaLabel}\n />\n </Cell>\n );\n },\n);\nDataTableCheckbox.displayName = \"DataTableCheckbox\";\n","\"use client\";\n\nimport { useCallback, useMemo, useState, type ReactNode } from \"react\";\n\nimport { cn } from \"../lib/cn\";\nimport { Avatar } from \"../primitives/avatar\";\nimport {\n useDataTable,\n type DataTableColumn,\n type DataTableFilterDefinition,\n type DataTableSortingState,\n} from \"../primitives/behavior/data-table/use-data-table\";\nimport { Select } from \"../primitives/select\";\nimport {\n DataTable,\n DataTableBody,\n DataTableCell,\n DataTableCheckbox,\n DataTableHead,\n DataTableHeader,\n DataTableResultsCount,\n DataTableRow,\n DataTableSearch,\n DataTableSpacer,\n DataTableToolbar,\n type SortDirection,\n} from \"./data-table\";\nimport { DataTablePagination } from \"../primitives/pagination\";\n\n/**\n * DataTableView — config-driven table on top of the composition\n * `DataTable*` primitives. Every list/table screen is just a config:\n * `columns` + `data` (+ optional `filters` / `searchKeys` / sort). Since\n * W6-07 the search / filter / sort / pagination *state* lives in the\n * headless `useDataTable` controller, so each of sort, page and search is\n * **controllable** (`sorting` / `onSortingChange`, `page` / `onPageChange`,\n * `search` / `onSearchChange`) while the uncontrolled defaults and the DOM\n * stay exactly what they were: `<th>` text is `column.header`, the sort\n * cycle is unsorted → asc → desc → unsorted (C-DOM-14). The table chrome,\n * sortable headers and pagination all come from the existing `DataTable`\n * family (no fork, no second table chrome).\n *\n * It complements — does not replace — the composition API: reach for the\n * raw `DataTable*` parts when a screen needs bespoke cells or layout; reach\n * for `DataTableView` when the table is \"columns + rows + the usual\n * toolbar.\" Render helpers (`EmptyValue`, `TagsCell`) cover the generic\n * cell shapes; the product-flavoured ones (`StagePill`, `Assignee`,\n * `MoneyCell`) are deprecated and flagged for hand-over to TAX (W6-14 →\n * W8-13).\n */\n\nexport type TableRowData = Record<string, unknown>;\n\nexport interface DataTableViewColumn<Row extends TableRowData> {\n key: string;\n header: string;\n /** Column width. Fixed px (`\"120px\"`) sets a hard width; a grid-style\n * `\"minmax(190px,1.5fr)\"` is read as a `min-width` and the column flexes. */\n width?: string;\n sortable?: boolean;\n align?: \"right\";\n /** Custom sort accessor (e.g. a numeric `lastDays` behind a \"5h ago\" label). */\n sortValue?: (row: Row) => string | number | null | undefined;\n /** Custom cell renderer; defaults to the raw field value. */\n render?: (row: Row) => ReactNode;\n}\n\nexport interface DataTableViewFilter<Row extends TableRowData> {\n key: string;\n label?: string;\n allLabel?: string;\n options: (string | { value: string; label: string })[];\n match: (row: Row, value: string) => boolean;\n}\n\n/**\n * Row selection. Controlled: the caller owns the id set, so a selection can\n * outlive a filter change (or be cleared on one) — that policy belongs to the\n * screen, not the table.\n */\nexport interface DataTableViewSelection<Row extends TableRowData> {\n /** Ids of selected rows, keyed by `rowKey`. May include rows not currently visible. */\n selectedIds: ReadonlySet<string>;\n onSelectionChange: (selectedIds: Set<string>) => void;\n /**\n * Rows the caller will not accept — e.g. an already-sent record. They render a\n * disabled checkbox and are excluded from select-all, so \"all\" never selects\n * something the action would reject.\n */\n isRowSelectable?: (row: Row) => boolean;\n /**\n * What the header checkbox covers. **Required decision, not a default to\n * ignore:** with 132 filtered rows across 9 pages, \"select all\" meaning *this\n * page* and meaning *all 132* are different features, and a table that guesses\n * eventually acts on 132 records when the user saw 15.\n * `\"page\"` (default) — the rows currently on screen.\n * `\"filtered\"` — every row matching the active search and filters.\n */\n selectAllScope?: \"page\" | \"filtered\" | undefined;\n /** Accessible label for a row's checkbox, e.g. ``(row) => `Select ${row.name}` ``. */\n rowLabel?: (row: Row) => string;\n}\n\n/**\n * The sort of a `DataTableView`: one column key and a direction, or `null`\n * for unsorted. The shape `initialSort` has always used.\n *\n * @experimental\n */\nexport type DataTableViewSort = { key: string; dir: SortDirection } | null;\n\nexport interface DataTableViewProps<Row extends TableRowData> {\n columns: DataTableViewColumn<Row>[];\n data: Row[];\n filters?: DataTableViewFilter<Row>[];\n searchKeys?: string[];\n searchPlaceholder?: string;\n /** The sort the table starts with when `sorting` is not controlled. */\n initialSort?: DataTableViewSort;\n /**\n * Controlled sort (W6-07). Pass it with `onSortingChange` to own the sort —\n * e.g. to mirror it into the URL — instead of listening for header clicks.\n * Omit it for the uncontrolled default seeded by `initialSort`.\n *\n * @experimental\n */\n sorting?: DataTableViewSort;\n /** Called with the next sort when a header is pressed; the cycle is asc → desc → unsorted. @experimental */\n onSortingChange?: (sorting: DataTableViewSort) => void;\n /** Controlled 1-based page (W6-07). @experimental */\n page?: number;\n /** Called with the next page, including the return to page 1 on a search or filter change. @experimental */\n onPageChange?: (page: number) => void;\n /** Controlled search text (W6-07). @experimental */\n search?: string;\n /** Called with the search text on every keystroke. @experimental */\n onSearchChange?: (search: string) => void;\n onRowClick?: (row: Row) => void;\n rowKey?: string;\n pageSize?: number;\n /**\n * Hide the pager when every row fits on one page. Default `true` — the 1.x\n * behaviour, kept here although `Pagination` itself defaults to `false` in\n * 2.0 (W9-10). Pass `false` to always show the pager. @experimental\n */\n hideOnSinglePage?: boolean;\n /** Plural noun for the footer / empty state, e.g. \"clients\". */\n itemLabel?: string;\n /** Opt in to row selection. Omit it and the table renders exactly as before. */\n selection?: DataTableViewSelection<Row>;\n className?: string;\n}\n\nconst ALL = \"__all\";\n/** Id prefix of a search-only column: a `searchKeys` entry that is not a rendered column. */\nconst SEARCH_ONLY = \"__search:\";\n\n/** Translate a column `width` into a `<col>` style. */\nfunction colStyle(width?: string): React.CSSProperties | undefined {\n if (!width) return undefined;\n const flexible = width.match(/minmax\\(\\s*([\\d.]+)px/);\n if (flexible) return { minWidth: `${flexible[1]}px` };\n return { width, minWidth: width };\n}\n\nconst toControllerSort = (\n sort: DataTableViewSort | undefined,\n): DataTableSortingState | null | undefined =>\n sort === undefined ? undefined : sort && { columnId: sort.key, direction: sort.dir };\nconst fromControllerSort = (sort: DataTableSortingState | null): DataTableViewSort =>\n sort && { key: sort.columnId, dir: sort.direction };\n\n/** Today's search: the field read as text, `\"\"` for a missing value. */\nconst fieldText = (row: TableRowData, key: string) => String(row[key] ?? \"\");\n\nexport function DataTableView<Row extends TableRowData>({\n columns,\n data,\n filters = [],\n searchKeys = [],\n searchPlaceholder = \"Search…\",\n initialSort = null,\n sorting: sortingProp,\n onSortingChange,\n page: pageProp,\n onPageChange,\n search: searchProp,\n onSearchChange,\n onRowClick,\n rowKey = \"id\",\n pageSize = 15,\n hideOnSinglePage = true,\n itemLabel = \"items\",\n selection,\n className,\n}: DataTableViewProps<Row>) {\n // The page is always handed to the controller as a controlled slice so a\n // `pageSize` prop change applies immediately (it is derived, not state).\n const [uncontrolledPage, setUncontrolledPage] = useState(1);\n const page = pageProp ?? uncontrolledPage;\n\n const controllerColumns = useMemo<DataTableColumn<Row>[]>(() => {\n const searched = new Set(searchKeys);\n const result: DataTableColumn<Row>[] = columns.map((c) => ({\n id: c.key,\n header: c.header,\n sortable: c.sortable,\n sortValue: c.sortValue,\n searchable: searched.has(c.key),\n searchText: (row) => fieldText(row, c.key),\n }));\n for (const key of searchKeys) {\n if (columns.some((c) => c.key === key)) continue;\n result.push({\n id: `${SEARCH_ONLY}${key}`,\n header: null,\n searchable: true,\n searchText: (row) => fieldText(row, key),\n });\n }\n return result;\n }, [columns, searchKeys]);\n\n const filterDefinitions = useMemo<DataTableFilterDefinition<Row>[]>(\n () =>\n filters.map((filter) => ({\n id: filter.key,\n label: filter.label ?? filter.key,\n options: filter.options.map((o) => (typeof o === \"string\" ? { value: o, label: o } : o)),\n match: filter.match,\n })),\n [filters],\n );\n\n const getRowId = useCallback((row: Row) => String(row[rowKey]), [rowKey]);\n\n const selectedIds = selection?.selectedIds;\n const controlledSelection = useMemo(\n () => (selectedIds ? Array.from(selectedIds) : undefined),\n [selectedIds],\n );\n\n const table = useDataTable<Row>({\n data,\n columns: controllerColumns,\n filterDefinitions,\n getRowId,\n isRowSelectable: selection?.isRowSelectable,\n sorting: toControllerSort(sortingProp),\n defaultSorting: toControllerSort(initialSort),\n onSortingChange: onSortingChange\n ? (next) => onSortingChange(fromControllerSort(next))\n : undefined,\n pagination: { page, pageSize },\n onPaginationChange: (next) => {\n setUncontrolledPage(next.page);\n onPageChange?.(next.page);\n },\n // Without search keys nothing is searchable, so a query must not hide every row.\n search: searchKeys.length > 0 ? searchProp : \"\",\n onSearchChange,\n selection: controlledSelection,\n onSelectionChange: selection\n ? (next) => selection.onSelectionChange(new Set(next))\n : undefined,\n });\n\n const total = table.pagination.rowCount;\n const hasToolbar = searchKeys.length > 0 || filters.length > 0;\n\n /* ── Selection ──────────────────────────────────────────────────────────\n All of it is inert without a `selection` prop: `selectCol` gates the extra\n `<col>`, `<th>` and `<td>`, so an existing caller renders byte-identical\n markup and keeps its column widths. */\n const selectCol = selection != null;\n const canSelect = (row: Row) => selection?.isRowSelectable?.(row) ?? true;\n const filteredScope = selection?.selectAllScope === \"filtered\";\n\n // Select-all acts on its declared scope only, and never on a row the caller\n // has excluded — \"all\" must not select something the action would reject.\n const scopeIds = selection\n ? filteredScope\n ? table.matchingRows.filter(canSelect).map(getRowId)\n : table.rows.filter((r) => r.selectable).map((r) => r.id)\n : [];\n const selectedInScope = scopeIds.filter((id) => table.selection.isSelected(id));\n const allInScopeSelected = scopeIds.length > 0 && selectedInScope.length === scopeIds.length;\n const someInScopeSelected = selectedInScope.length > 0 && !allInScopeSelected;\n\n const toggleAll = () => {\n if (!selection) return;\n // Toggling off clears only this scope — a selection made under a different\n // filter is the caller's to keep or clear, and silently dropping it here\n // would be a deletion the user never asked for.\n if (!filteredScope) {\n table.selection.togglePage();\n } else if (allInScopeSelected) {\n const drop = new Set(scopeIds);\n table.selection.set(table.selection.value.filter((id) => !drop.has(id)));\n } else {\n table.selection.selectAllMatching();\n }\n };\n\n const selectAllLabel = filteredScope\n ? `Select all ${scopeIds.length} ${itemLabel}`\n : `Select all ${itemLabel} on this page`;\n\n return (\n <DataTable withToolbar={hasToolbar} className={className}>\n {hasToolbar && (\n <DataTableToolbar>\n {searchKeys.length > 0 && (\n <DataTableSearch\n placeholder={searchPlaceholder}\n value={table.search.value}\n onChange={(e) => table.search.set(e.target.value)}\n />\n )}\n {filters.map((filter) => {\n const options = [\n { value: ALL, label: filter.allLabel ?? `All ${filter.label ?? \"\"}`.trim() },\n ...filter.options.map((o) => (typeof o === \"string\" ? { value: o, label: o } : o)),\n ];\n return (\n <Select\n key={filter.key}\n options={options}\n value={(table.filters.get(filter.key) as string | null) ?? ALL}\n onValueChange={(value) =>\n table.filters.set(filter.key, value === ALL ? null : value)\n }\n aria-label={filter.label ?? filter.key}\n className=\"ds:w-auto ds:min-w-[150px]\"\n />\n );\n })}\n <DataTableSpacer />\n <DataTableResultsCount current={total} total={data.length} />\n </DataTableToolbar>\n )}\n\n <table className=\"ds:table-auto\">\n <colgroup>\n {selectCol && <col style={{ width: \"32px\", minWidth: \"32px\" }} />}\n {columns.map((c) => (\n <col key={c.key} style={colStyle(c.width)} />\n ))}\n </colgroup>\n <DataTableHead>\n <DataTableRow>\n {selection && (\n <DataTableCheckbox\n asHeader\n checked={\n allInScopeSelected ? true : someInScopeSelected ? \"indeterminate\" : false\n }\n onCheckedChange={toggleAll}\n disabled={scopeIds.length === 0}\n ariaLabel={selectAllLabel}\n />\n )}\n {columns.map((c) =>\n c.sortable ? (\n <DataTableHeader\n key={c.key}\n sortable\n sort={table.sorting.getDirection(c.key)}\n onSortChange={() => table.sorting.toggle(c.key)}\n className={c.align === \"right\" ? \"ds:text-right ds:[&>button]:ml-auto\" : undefined}\n >\n {c.header}\n </DataTableHeader>\n ) : (\n <DataTableHeader\n key={c.key}\n className={c.align === \"right\" ? \"ds:text-right\" : undefined}\n >\n {c.header}\n </DataTableHeader>\n ),\n )}\n </DataTableRow>\n </DataTableHead>\n <DataTableBody>\n {table.rows.length === 0 ? (\n <tr>\n <DataTableCell\n colSpan={columns.length + (selectCol ? 1 : 0)}\n className=\"ds:text-fg-3 ds:py-12 ds:text-center\"\n >\n No {itemLabel} match your filters.\n </DataTableCell>\n </tr>\n ) : (\n table.rows.map(({ id, row, selected, selectable }) => (\n <DataTableRow\n key={id}\n selected={selection ? selected : undefined}\n onClick={onRowClick ? () => onRowClick(row) : undefined}\n className={onRowClick ? \"ds:cursor-pointer\" : undefined}\n >\n {selection && (\n <DataTableCheckbox\n checked={selected}\n onCheckedChange={() => table.selection.toggle(id)}\n disabled={!selectable}\n ariaLabel={selection.rowLabel?.(row) ?? `Select ${id}`}\n // The cell sits inside a clickable row when `onRowClick` is\n // set; without this, ticking a box also opens the record.\n onClick={(event) => event.stopPropagation()}\n />\n )}\n {columns.map((c) => (\n <DataTableCell\n key={c.key}\n className={c.align === \"right\" ? \"ds:text-right\" : undefined}\n >\n {c.render ? c.render(row) : ((row[c.key] as ReactNode) ?? <EmptyValue />)}\n </DataTableCell>\n ))}\n </DataTableRow>\n ))\n )}\n </DataTableBody>\n </table>\n\n <DataTablePagination\n page={table.pagination.page}\n totalItems={total}\n pageSize={pageSize}\n onPageChange={table.pagination.setPage}\n hideOnSinglePage={hideOnSinglePage}\n />\n </DataTable>\n );\n}\n\n/* ── Generic cell render helpers ──────────────────────────────────────── */\n\n/**\n * EmptyValue — the em-dash placeholder for a cell with no value. Generic:\n * no copy, no product tone.\n *\n * @experimental\n */\nexport function EmptyValue() {\n return <span className=\"ds:text-fg-5\">—</span>;\n}\n\n/**\n * Em-dash placeholder for empty cells.\n *\n * @deprecated Renamed `EmptyValue` (W6-14); same DOM. Removed in 3.0.\n */\nexport function Dash() {\n return <EmptyValue />;\n}\n\n/** TagsCell — first tag + \"+N\" overflow. */\nexport function TagsCell({ items = [] }: { items?: string[] }) {\n if (items.length === 0) return <EmptyValue />;\n return (\n <span className=\"ds:flex ds:items-center ds:gap-1.5\">\n <span className=\"ds:bg-bg-2 ds:text-fg-3 ds:border-rule ds:rounded-pill ds:border ds:px-2 ds:py-0.5 ds:text-xs\">\n {items[0]}\n </span>\n {items.length > 1 && (\n <span className=\"ds:text-fg-4 ds:text-xs ds:tabular-nums\">+{items.length - 1}</span>\n )}\n </span>\n );\n}\n\n/* ── Product cell render helpers (W6-14) ──────────────────────────────────\n These speak product vocabulary — a `$` currency, the word \"Unassigned\",\n the Pro and Tax brand tones — so they are not part of the generic table.\n They keep their exports and render exactly as before, and are flagged for\n hand-over to TAX in W8-13: `@deprecated` in the design system, `@product`\n for the repository that owns them next. New code renders its own cells\n (`Badge`, `StatusBadge`, `Avatar`, `EmptyValue`) through `column.render`. */\n\n/**\n * Stage tones of {@link StagePill}. \"blue\" and \"violet\" are the Tax and Pro\n * brand tones: product vocabulary, not a system palette.\n *\n * @deprecated Product vocabulary (W6-14). Hands over to TAX in W8-13; use\n * `StatusBadge` with `defineStatusMap` for a system-toned status.\n * @product\n */\nexport type TableTone = \"slate\" | \"blue\" | \"violet\" | \"amber\" | \"ok\" | \"rose\";\n\n/* Six stage tones mapped to existing semantic tokens. \"blue\" uses the\n Tax brand blue so it stays distinct from \"violet\" (Pro purple) now that\n the suite accent is itself purple; its text is the Tax ink (`tax-fg`),\n since the raw brand blue reads under 4.5:1 on the tint (G10). Product\n vocabulary (W6-14). */\nconst toneClass: Record<TableTone, string> = {\n slate: \"ds:bg-bg-3 ds:text-fg-3\",\n blue: \"ds:bg-[color-mix(in_oklab,var(--color-brand-tax)_14%,transparent)] ds:text-tax-fg\",\n violet: \"ds:bg-pro-bg ds:text-pro-fg\",\n amber: \"ds:bg-warning-bg ds:text-warning-fg\",\n ok: \"ds:bg-success-bg ds:text-success-fg\",\n rose: \"ds:bg-danger-bg ds:text-danger-fg\",\n};\n\n/**\n * StagePill — colored stage/status pill for `column.render`.\n *\n * @deprecated Product vocabulary (W6-14). Hands over to TAX in W8-13; use\n * `StatusBadge` for a status word in the system palette.\n * @product\n */\nexport function StagePill({\n tone = \"slate\",\n dot = true,\n children,\n}: {\n tone?: TableTone | undefined;\n dot?: boolean;\n children: ReactNode;\n}) {\n return (\n <span\n className={cn(\n \"ds:inline-flex ds:items-center ds:gap-1.5 ds:rounded-pill ds:px-2 ds:py-0.5 ds:text-xs ds:font-medium\",\n toneClass[tone],\n )}\n >\n {dot && <span aria-hidden=\"true\" className=\"ds:size-1.5 ds:rounded-full ds:bg-current\" />}\n {children}\n </span>\n );\n}\n\n/**\n * Assignee — grey avatar + name, or \"Unassigned\".\n *\n * @deprecated Product copy (\"Unassigned\") and layout (W6-14). Hands over to\n * TAX in W8-13; render `Avatar` + name in `column.render`.\n * @product\n */\nexport function Assignee({ name }: { name?: string | null | undefined }) {\n if (!name) return <span className=\"ds:text-fg-4 ds:text-[13px]\">Unassigned</span>;\n return (\n <span className=\"ds:flex ds:items-center ds:gap-2\">\n <Avatar name={name} size=\"xs\" />\n <span className=\"ds:text-fg-2 ds:truncate ds:text-[13px]\">{name}</span>\n </span>\n );\n}\n\n/**\n * MoneyCell — `$1,234` or an em-dash when falsy/zero.\n *\n * @deprecated Hard-coded `$` and host-locale formatting (W6-14). Hands over\n * to TAX in W8-13; format with `Intl.NumberFormat` in `column.render` and\n * fall back to `EmptyValue`.\n * @product\n */\nexport function MoneyCell({ value }: { value?: number | null }) {\n if (!value) return <EmptyValue />;\n return (\n <span className=\"ds:text-fg ds:font-medium ds:tabular-nums\">${value.toLocaleString()}</span>\n );\n}\n","\"use client\";\n\nimport { forwardRef } from \"react\";\n\nimport { cn } from \"../lib/cn\";\nimport { Avatar } from \"../primitives/avatar\";\nimport { Badge, type BadgeProps } from \"../primitives/badge\";\nimport { Button } from \"../primitives/button\";\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuTrigger,\n} from \"../primitives/dropdown-menu\";\nimport {\n AlertTriangleIcon,\n ArrowRightIcon,\n BellIcon,\n CalendarIcon,\n CheckCircleSolidIcon,\n CheckIcon,\n ChevronDownIcon,\n DownloadIcon,\n EyeIcon,\n FileTextIcon,\n FlagIcon,\n FolderClosedIcon,\n LockIcon,\n LockOpenIcon,\n MessageCircleIcon,\n PaperclipIcon,\n PencilIcon,\n SendIcon,\n TrashIcon,\n UploadIcon,\n UsersIcon,\n XCircleSolidIcon,\n} from \"../primitives/icons\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"../primitives/tabs\";\nimport { Textarea } from \"../primitives/textarea\";\nimport {\n DocumentDetailActions,\n DocumentDetailHeader,\n DocumentDetailMetaRow,\n DocumentDetailPanel,\n DocumentDetailRequester,\n DocumentDetailTitle,\n DocumentList,\n DocumentListSection,\n DocumentRow,\n} from \"../suite/documents/document-detail-panel\";\n\n/**\n * DocumentRequestCard + DocumentRequestDetail — the firm \"Requests\" surface.\n *\n * Both are presentational: the app owns data fetching, tab/preview state, and\n * every action handler, and passes plain data + callbacks. They wrap the\n * `DocumentDetail*` kit, the icon set, the tab primitives, and the assignee\n * dropdown so a consuming app imports two components instead of ~40 parts.\n */\n\n/* ─── Shared tone tokens ──────────────────────────────────────── */\n\nexport type DocumentRequestTone = \"warning\" | \"success\" | \"danger\" | \"muted\";\n\nconst TONE_TEXT: Record<DocumentRequestTone, string> = {\n warning: \"ds:text-warning-fg\",\n success: \"ds:text-success-fg\",\n danger: \"ds:text-danger-fg\",\n muted: \"ds:text-fg-4\",\n};\n\nconst TONE_PILL: Record<DocumentRequestTone, string> = {\n warning: \"ds:bg-warning-bg ds:text-warning-fg\",\n success: \"ds:bg-success-bg ds:text-success-fg\",\n danger: \"ds:bg-danger-bg ds:text-danger-fg\",\n muted: \"ds:bg-surface-2 ds:text-fg-3\",\n};\n\nconst TONE_DOT: Record<DocumentRequestTone, string> = {\n warning: \"ds:bg-warning-fg\",\n success: \"ds:bg-success-fg\",\n danger: \"ds:bg-danger-fg\",\n muted: \"ds:bg-fg-4\",\n};\n\nfunction initials(name: string): string {\n return name\n .split(/\\s+/)\n .slice(0, 2)\n .map((p) => p[0]?.toUpperCase() ?? \"\")\n .join(\"\");\n}\n\n/* ─── Card ────────────────────────────────────────────────────── */\n\nexport interface DocumentRequestItemSummary {\n /** Stable id for the row key. */\n id: string;\n /** Requested-document label, e.g. \"AR aging (12/31/2025)\". */\n label: string;\n /** Short type chip, e.g. \"Schedule\". */\n docType?: string;\n /** Status text, e.g. \"Received\". */\n statusLabel: string;\n /** Status colour. */\n statusTone: DocumentRequestTone;\n}\n\nexport interface DocumentRequestCardProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n \"onClick\" | \"title\"\n> {\n /** Request headline. */\n title: string;\n /** Free-form category chip. */\n category?: string;\n /** Renders the urgent triangle when true. */\n highPriority?: boolean;\n /** Relative due chip + tone, e.g. `{ text: \"Due in 6d\", tone: \"warning\" }`. */\n due?: { text: string; tone: DocumentRequestTone };\n /** Optional request description rendered as a quote. */\n comment?: string;\n /** Fulfilled item count (numerator of the progress pill). */\n fulfilledCount: number;\n /** Total item count (denominator of the progress pill). */\n totalCount: number;\n /** Requested items rendered as rows. */\n items: DocumentRequestItemSummary[];\n /** Assignee display names for the footer avatar stack. */\n assignees?: string[];\n /** Open the request detail. */\n onOpen: () => void;\n}\n\nexport const DocumentRequestCard = forwardRef<HTMLDivElement, DocumentRequestCardProps>(\n function DocumentRequestCard(\n {\n title,\n category,\n highPriority,\n due,\n comment,\n fulfilledCount,\n totalCount,\n items,\n assignees = [],\n onOpen,\n className,\n ...props\n },\n ref,\n ) {\n const docWord = totalCount === 1 ? \"document\" : \"documents\";\n return (\n <div\n ref={ref}\n role=\"button\"\n tabIndex={0}\n onClick={onOpen}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onOpen();\n }\n }}\n className={cn(\n \"ds:rounded-card ds:border-rule ds:bg-surface ds:cursor-pointer ds:overflow-hidden ds:border ds:shadow-flat\",\n \"ds:transition-shadow ds:duration-[var(--duration-fast)] ds:ease-[var(--ease-out-quart)] ds:motion-reduce:transition-none\",\n \"ds:hover:shadow-raised ds:focus-visible:[box-shadow:var(--shadow-focus-ring)] ds:focus-visible:outline-none\",\n className,\n )}\n {...props}\n >\n <div className=\"ds:flex ds:items-center ds:gap-2.5 ds:px-5 ds:py-3.5\">\n <span className=\"ds:bg-surface-2 ds:text-fg-3 ds:inline-flex ds:shrink-0 ds:items-center ds:rounded-md rounded-md ds:px-2 ds:py-0.5 ds:text-xs ds:font-semibold ds:tabular-nums tabular-nums\">\n {fulfilledCount}/{totalCount}\n </span>\n <div className=\"ds:flex ds:min-w-0 ds:flex-1 ds:items-center ds:gap-2\">\n <span className=\"ds:text-fg ds:min-w-0 ds:truncate ds:text-sm ds:font-semibold\">{title}</span>\n {category && (\n <span className=\"ds:bg-surface-2 ds:text-fg-3 ds:inline-flex ds:shrink-0 ds:items-center ds:rounded-md rounded-md ds:px-2 ds:py-0.5 ds:text-xs ds:font-medium font-medium\">\n {category}\n </span>\n )}\n {highPriority && (\n <AlertTriangleIcon\n size={14}\n className=\"ds:text-warning-fg ds:shrink-0\"\n aria-label=\"Urgent request\"\n />\n )}\n {due && (\n <span\n className={cn(\n \"ds:inline-flex ds:shrink-0 ds:items-center ds:rounded-md rounded-md ds:px-2 ds:py-0.5 ds:text-xs ds:font-semibold\",\n TONE_PILL[due.tone],\n )}\n >\n {due.text}\n </span>\n )}\n </div>\n <span\n aria-hidden\n className=\"ds:bg-brand-bg ds:text-brand ds:ml-auto ds:inline-flex ds:shrink-0 ds:items-center ds:gap-1 ds:rounded-lg ds:px-2.5 ds:py-1.5 ds:text-[13px] ds:font-semibold\"\n >\n Open\n <ArrowRightIcon size={13} />\n </span>\n </div>\n\n {comment && (\n <p className=\"ds:text-fg-2 ds:px-5 ds:pb-1 ds:text-[13.5px] ds:leading-snug\">“{comment}”</p>\n )}\n\n <div className=\"ds:flex ds:flex-col flex-col ds:gap-2 ds:px-5 ds:pt-3 ds:pb-4\">\n {items.map((item) => (\n <div\n key={item.id}\n className=\"ds:bg-surface-2 ds:flex ds:items-center ds:gap-3 ds:rounded-xl ds:px-4 ds:py-3.5\"\n >\n <FileTextIcon size={16} className=\"ds:text-fg-3 ds:shrink-0\" />\n <span className=\"ds:text-fg ds:min-w-0 ds:flex-1 ds:truncate ds:text-sm ds:font-semibold\">\n {item.label}\n </span>\n {item.docType && (\n <span className=\"ds:border-rule ds:bg-surface ds:text-fg-3 ds:inline-flex ds:shrink-0 ds:items-center ds:rounded-md rounded-md ds:border ds:px-2 ds:py-0.5 ds:text-[10.5px] ds:font-semibold ds:tracking-wide ds:uppercase\">\n {item.docType}\n </span>\n )}\n <span\n className={cn(\"ds:shrink-0 ds:text-[13px] ds:font-semibold\", TONE_TEXT[item.statusTone])}\n >\n {item.statusLabel}\n </span>\n </div>\n ))}\n </div>\n\n <div className=\"ds:border-rule ds:flex ds:items-center ds:gap-2 ds:border-t ds:px-5 ds:py-2.5\">\n <FolderClosedIcon size={14} className=\"ds:text-fg-4 ds:shrink-0\" />\n <span className=\"ds:text-fg-3 ds:text-[12.5px] ds:tabular-nums tabular-nums\">\n {totalCount} {docWord}\n </span>\n {assignees.length > 0 && (\n <span className=\"ds:text-fg-3 ds:ml-auto ds:flex ds:items-center ds:gap-2 ds:text-[12.5px]\">\n <span className=\"ds:flex ds:items-center ds:-space-x-1.5\">\n {assignees.map((name) => (\n <span\n key={name}\n title={name}\n className=\"ds:border-surface ds:bg-surface-2 ds:text-fg-3 ds:ring-surface ds:grid ds:size-6 ds:place-items-center ds:rounded-full ds:border ds:text-[10px] ds:font-semibold ds:ring-1\"\n >\n {initials(name)}\n </span>\n ))}\n </span>\n Assigned\n </span>\n )}\n </div>\n </div>\n );\n },\n);\nDocumentRequestCard.displayName = \"DocumentRequestCard\";\n\n/* ─── Detail panel ────────────────────────────────────────────── */\n\nexport type DocumentRequestDetailTab = \"documents\" | \"comments\" | \"activity\";\n\nexport type DocumentRequestActivityKind =\n | \"assigned\"\n | \"unassigned\"\n | \"added\"\n | \"uploaded\"\n | \"priority\"\n | \"created\"\n | \"reminded\"\n | \"updated\"\n | \"commented\"\n | \"cancelled\"\n | \"received\"\n | \"approved\"\n | \"needs_revision\"\n | \"locked\"\n | \"unlocked\"\n | \"status\";\n\nconst ACTIVITY_ICON: Record<\n DocumentRequestActivityKind,\n React.ComponentType<{ size?: number; className?: string }>\n> = {\n assigned: UsersIcon,\n unassigned: UsersIcon,\n added: PaperclipIcon,\n uploaded: DownloadIcon,\n priority: AlertTriangleIcon,\n created: SendIcon,\n reminded: BellIcon,\n updated: PencilIcon,\n commented: MessageCircleIcon,\n cancelled: XCircleSolidIcon,\n received: DownloadIcon,\n approved: CheckCircleSolidIcon,\n needs_revision: AlertTriangleIcon,\n locked: LockIcon,\n unlocked: LockOpenIcon,\n status: FlagIcon,\n};\n\nexport interface DocumentRequestDetailDoc {\n /** Stable id for the row key. */\n id: string;\n /** File name shown as the row's primary line. */\n fileName: string;\n /** Secondary meta line (size · date · uploader). */\n meta?: React.ReactNode;\n /** Highlight the row (e.g. its preview is open). */\n active?: boolean;\n /** Firm review verdict — `true` renders the row in its approved state\n * (green icon + \"Approved\" tag) and hides the approve action. */\n approved?: boolean;\n /** Firm review verdict — `true` renders the row in its rejected state\n * (red icon + \"Rejected\" tag). Ignored when `approved` is set. */\n rejected?: boolean;\n /** Approve this document. Renders a tick action before Preview while the\n * doc is not yet approved; omit to hide the affordance. */\n onApprove?: () => void;\n onPreview?: () => void;\n onDownload?: () => void;\n onDelete?: () => void;\n}\n\nexport interface DocumentRequestRequestedItem {\n /** Stable id for the row key. */\n id: string;\n /** Requested-document label, e.g. \"AR aging (12/31/2025)\". */\n label: string;\n /** Short type chip, e.g. \"Schedule\". */\n docType?: string;\n /** Status text, e.g. \"Received\". */\n statusLabel: string;\n /** Status colour (drives the dot + label). */\n statusTone: DocumentRequestTone;\n /** Client upload(s) fulfilling this item; empty means still awaiting. */\n documents: DocumentRequestDetailDoc[];\n}\n\nexport interface DocumentRequestDetailComment {\n /** Stable id for the row key. */\n id: string;\n /** Author display name. */\n author: string;\n /** True for a firm author (vs a client contact) — drives the badge. */\n isFirm: boolean;\n /** Render a \"(You)\" suffix for the current user. */\n you?: boolean;\n /** Relative time. */\n time: string;\n /** Comment body. */\n body: string;\n}\n\nexport interface DocumentRequestDetailActivityEvent {\n /** Stable id for the row key. */\n id: string;\n /** Event kind — selects the leading icon. */\n kind: DocumentRequestActivityKind;\n /** Rendered event text (may include bolded names). */\n text: React.ReactNode;\n /** Relative time. */\n time: string;\n}\n\nexport interface DocumentRequestAssigneeOption {\n /** Firm-user id. */\n id: string;\n /** Display name. */\n name: string;\n /** Whether currently assigned. */\n selected: boolean;\n}\n\nexport interface DocumentRequestReviewStatusOption {\n /** Stored value (e.g. \"provided\"). */\n value: string;\n /** Human label (e.g. \"Provided\"). */\n label: string;\n /** Tailwind background class for the leading status dot (e.g. \"bg-info-fg\"). */\n color?: string;\n}\n\nexport interface DocumentRequestDetailProps {\n /** Request headline. */\n title: string;\n /** Category chip (left of the header bar). */\n category?: string;\n /** Renders a \"High priority\" chip. */\n highPriority?: boolean;\n /** Status pill text, right-aligned. */\n statusLabel?: string;\n /** Status pill colour. */\n statusVariant?: BadgeProps[\"variant\"];\n /** Requester block. */\n requester: { org: string; avatar?: string; requestedBy: string; time: string };\n /** Due chip text + absolute date. */\n due?: { text: string; dateLabel?: string };\n /** Assignee options for the picker; `selected` marks the current set. */\n assignees: DocumentRequestAssigneeOption[];\n /** Toggle one assignee (omit to render the avatar stack read-only). */\n onToggleAssignee?: (id: string) => void;\n /** Show the Edit / Lock / Status / Delete action row (firm only). */\n canEdit?: boolean;\n onEdit?: () => void;\n onDelete?: () => void;\n onClose?: () => void;\n /** Whether the request is frozen (drives the Lock/Unlock button label + icon). */\n isLocked?: boolean;\n /** Toggle the lock (omit to hide the Lock button). */\n onToggleLock?: () => void;\n /** The firm's current review verdict (radio-selected in the Status menu). */\n reviewStatus?: string | null;\n /** Selectable review-status options for the Status menu. */\n reviewStatusOptions?: DocumentRequestReviewStatusOption[];\n /** Set the review verdict, or `null` to clear it (omit to hide the Status button). */\n onSetReviewStatus?: (value: string | null) => void;\n /** Controlled active tab. */\n tab?: DocumentRequestDetailTab;\n /** Uncontrolled initial tab (defaults to \"documents\"). */\n defaultTab?: DocumentRequestDetailTab;\n onTabChange?: (tab: DocumentRequestDetailTab) => void;\n /** Documents tab — flat client-uploaded vault docs. Used only as a fallback\n * when `requestedItems` is omitted. */\n clientUploads?: DocumentRequestDetailDoc[];\n /** Documents tab — firm reference documents. */\n firmDocuments: DocumentRequestDetailDoc[];\n /** Documents tab — requested items with the client upload(s) fulfilling each.\n * When provided, the tab renders a per-item grouped view (each requested\n * document, its status, and the uploads against it) instead of the flat\n * client-uploads list. */\n requestedItems?: DocumentRequestRequestedItem[];\n /** Client uploads not tied to any current item — rendered as a trailing\n * \"Other uploads\" group in the grouped view. */\n otherUploads?: DocumentRequestDetailDoc[];\n /** Upload affordance for the firm-documents section (omit to hide). */\n onUploadFirmDocument?: () => void;\n /** Comments tab thread. */\n comments: DocumentRequestDetailComment[];\n /** Controlled composer value. */\n commentDraft: string;\n onCommentDraftChange: (value: string) => void;\n onSubmitComment: () => void;\n /** Disable the composer (e.g. lacking permission). */\n commentDisabled?: boolean;\n /** In-flight comment submit. */\n commentPending?: boolean;\n /** Activity tab events, newest-first as desired by the caller. */\n activity: DocumentRequestDetailActivityEvent[];\n className?: string;\n}\n\nexport const DocumentRequestDetail = forwardRef<HTMLElement, DocumentRequestDetailProps>(\n function DocumentRequestDetail(props, ref) {\n const {\n title,\n category,\n highPriority,\n statusLabel,\n statusVariant = \"secondary\",\n requester,\n due,\n assignees,\n onToggleAssignee,\n canEdit,\n onEdit,\n onDelete,\n onClose,\n isLocked,\n onToggleLock,\n reviewStatus,\n reviewStatusOptions,\n onSetReviewStatus,\n tab,\n defaultTab = \"documents\",\n onTabChange,\n clientUploads = [],\n firmDocuments,\n requestedItems,\n otherUploads = [],\n onUploadFirmDocument,\n comments,\n commentDraft,\n onCommentDraftChange,\n onSubmitComment,\n commentDisabled,\n commentPending,\n activity,\n className,\n } = props;\n\n const clientDocCount = requestedItems\n ? requestedItems.reduce((n, it) => n + it.documents.length, 0) + otherUploads.length\n : clientUploads.length;\n const docCount = clientDocCount + firmDocuments.length;\n const providedCount = requestedItems?.filter((it) => it.statusTone === \"success\").length ?? 0;\n const selectedAssignees = assignees.filter((a) => a.selected);\n\n return (\n <DocumentDetailPanel ref={ref} className={className}>\n <DocumentDetailHeader\n onClose={onClose}\n tags={\n category || highPriority ? (\n <>\n {category && (\n <Badge variant=\"outline\" className=\"ds:gap-1\">\n <FolderClosedIcon className=\"ds:size-3\" />\n {category}\n </Badge>\n )}\n {highPriority && <Badge variant=\"warning\">High priority</Badge>}\n </>\n ) : undefined\n }\n status={statusLabel ? <Badge variant={statusVariant}>{statusLabel}</Badge> : undefined}\n >\n <DocumentDetailTitle>{title}</DocumentDetailTitle>\n\n <DocumentDetailRequester\n avatar={requester.avatar ?? requester.org}\n org={requester.org}\n requestedBy={requester.requestedBy}\n time={requester.time}\n />\n\n <DocumentDetailMetaRow>\n {due ? (\n <span className=\"ds:rounded-pill ds:border-rule ds:text-fg-3 ds:inline-flex ds:items-center ds:gap-1.5 ds:border ds:px-2.5 ds:py-1 ds:text-xs\">\n <CalendarIcon className=\"ds:size-3.5\" />\n {due.text}\n {due.dateLabel ? ` · ${due.dateLabel}` : \"\"}\n </span>\n ) : (\n <span />\n )}\n {(selectedAssignees.length > 0 || onToggleAssignee) && (\n <AssigneePicker assignees={assignees} onToggle={onToggleAssignee} />\n )}\n </DocumentDetailMetaRow>\n\n {canEdit && (\n <DocumentDetailActions className=\"ds:border-rule ds:border-t ds:pt-3\">\n <Button variant=\"secondary\" size=\"sm\" onClick={onEdit}>\n <PencilIcon />\n Edit\n </Button>\n {onToggleLock && (\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={onToggleLock}\n aria-pressed={isLocked}\n className={isLocked ? \"ds:text-warning-fg\" : undefined}\n >\n {isLocked ? <LockIcon /> : <LockOpenIcon />}\n {isLocked ? \"Unlock\" : \"Lock\"}\n </Button>\n )}\n {onSetReviewStatus && reviewStatusOptions && reviewStatusOptions.length > 0 && (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"secondary\" size=\"sm\">\n <FlagIcon />\n Status\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"ds:w-60\">\n <DropdownMenuLabel>Set request status</DropdownMenuLabel>\n {reviewStatusOptions.map((opt) => {\n const checked = reviewStatus === opt.value;\n return (\n <DropdownMenuItem\n key={opt.value}\n onSelect={(e) => {\n e.preventDefault();\n onSetReviewStatus(checked ? null : opt.value);\n }}\n className=\"ds:flex ds:items-center ds:gap-2.5 ds:py-2\"\n >\n <span\n className={cn(\"ds:size-2.5 ds:shrink-0 ds:rounded-full\", opt.color ?? \"ds:bg-fg-4\")}\n />\n <span className=\"ds:flex-1 ds:text-sm\">{opt.label}</span>\n <span\n aria-hidden=\"true\"\n className={cn(\n \"ds:grid ds:size-4 ds:shrink-0 ds:place-items-center ds:rounded-[5px] ds:border ds:transition-colors ds:duration-[var(--duration-fast)] ds:motion-reduce:transition-none\",\n checked ? \"ds:bg-brand ds:border-brand ds:text-fg-on-brand\" : \"ds:border-rule\",\n )}\n >\n {checked && <CheckIcon className=\"ds:size-3\" />}\n </span>\n </DropdownMenuItem>\n );\n })}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n <Button variant=\"secondary\" size=\"sm\" className=\"ds:text-danger-fg\" onClick={onDelete}>\n <TrashIcon />\n Delete\n </Button>\n </DocumentDetailActions>\n )}\n </DocumentDetailHeader>\n\n <Tabs\n {...(tab !== undefined && { value: tab })}\n {...(!tab && { defaultValue: defaultTab })}\n onValueChange={(v) => onTabChange?.(v as DocumentRequestDetailTab)}\n className=\"ds:flex ds:min-h-0 ds:flex-1 ds:flex-col flex-col\"\n >\n <TabsList className=\"ds:w-full ds:shrink-0 ds:px-5\">\n <TabsTrigger value=\"documents\">Documents {docCount}</TabsTrigger>\n <TabsTrigger value=\"comments\">Comments {comments.length}</TabsTrigger>\n <TabsTrigger value=\"activity\">Activity {activity.length}</TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"documents\" className=\"ds:min-h-0 ds:flex-1 ds:overflow-y-auto ds:px-5 ds:py-4\">\n {isLocked && (\n <div className=\"ds:bg-brand-bg ds:text-brand ds:mb-4 ds:flex ds:items-center ds:gap-2 ds:rounded-lg ds:px-3 ds:py-2.5 ds:text-[13px] ds:font-medium font-medium\">\n <LockIcon size={15} className=\"ds:shrink-0\" />\n This request is locked — the client can no longer upload documents.\n </div>\n )}\n <DocumentList>\n {requestedItems ? (\n <>\n <div className=\"ds:text-fg-3 ds:px-2.5 ds:text-[13px] ds:font-medium font-medium ds:tabular-nums tabular-nums\">\n {providedCount} of {requestedItems.length} provided\n </div>\n\n {requestedItems.map((item) => (\n <section key={item.id} className=\"ds:space-y-1\">\n <div className=\"ds:flex ds:items-center ds:gap-2 ds:px-2.5 ds:py-1\">\n <FileTextIcon size={15} className=\"ds:text-fg-3 ds:shrink-0\" />\n <span className=\"ds:text-fg ds:min-w-0 ds:flex-1 ds:truncate ds:text-sm ds:font-semibold\">\n {item.label}\n </span>\n {item.docType && (\n <span className=\"ds:border-rule ds:bg-surface ds:text-fg-3 ds:inline-flex ds:shrink-0 ds:items-center ds:rounded-md rounded-md ds:border ds:px-1.5 ds:py-0.5 ds:text-[10px] ds:font-semibold ds:tracking-wide ds:uppercase\">\n {item.docType}\n </span>\n )}\n <span className=\"ds:flex ds:shrink-0 ds:items-center ds:gap-1.5\">\n <span\n aria-hidden\n className={cn(\"ds:size-2 ds:rounded-full\", TONE_DOT[item.statusTone])}\n />\n <span className={cn(\"ds:text-xs ds:font-semibold\", TONE_TEXT[item.statusTone])}>\n {item.statusLabel}\n </span>\n </span>\n </div>\n <div className=\"ds:space-y-0.5 ds:pl-[1.625rem]\">\n {item.documents.length > 0 ? (\n item.documents.map((d) => (\n <DocumentRow\n key={d.id}\n fileName={d.fileName}\n meta={d.meta}\n approved={d.approved}\n rejected={d.rejected}\n className={d.active ? \"ds:bg-overlay-hover\" : undefined}\n actions={<FileRowActions doc={d} />}\n />\n ))\n ) : (\n <p className=\"ds:text-fg-4 ds:px-2.5 ds:py-1.5 ds:text-[13px]\">\n Awaiting client upload\n </p>\n )}\n </div>\n </section>\n ))}\n\n {otherUploads.length > 0 && (\n <DocumentListSection label=\"Other uploads\" count={otherUploads.length}>\n {otherUploads.map((d) => (\n <DocumentRow\n key={d.id}\n fileName={d.fileName}\n meta={d.meta}\n approved={d.approved}\n rejected={d.rejected}\n className={d.active ? \"ds:bg-overlay-hover\" : undefined}\n actions={<FileRowActions doc={d} />}\n />\n ))}\n </DocumentListSection>\n )}\n\n <DocumentListSection\n label=\"Firm reference\"\n count={firmDocuments.length}\n action={\n onUploadFirmDocument ? (\n <Button variant=\"ghost\" size=\"sm\" onClick={onUploadFirmDocument}>\n <UploadIcon />\n Upload\n </Button>\n ) : undefined\n }\n >\n {firmDocuments.length > 0 ? (\n firmDocuments.map((d) => (\n <DocumentRow\n key={d.id}\n fileName={d.fileName}\n meta={d.meta}\n approved={d.approved}\n rejected={d.rejected}\n className={d.active ? \"ds:bg-overlay-hover\" : undefined}\n actions={<FileRowActions doc={d} />}\n />\n ))\n ) : (\n <p className=\"ds:text-fg-4 ds:px-2.5 ds:py-2 ds:text-sm\">No firm documents attached.</p>\n )}\n </DocumentListSection>\n </>\n ) : (\n <>\n <DocumentListSection label=\"Client uploads\" count={clientUploads.length}>\n {clientUploads.length > 0 ? (\n clientUploads.map((d) => (\n <DocumentRow\n key={d.id}\n fileName={d.fileName}\n meta={d.meta}\n approved={d.approved}\n rejected={d.rejected}\n className={d.active ? \"ds:bg-overlay-hover\" : undefined}\n actions={<FileRowActions doc={d} />}\n />\n ))\n ) : (\n <p className=\"ds:text-fg-4 ds:px-2.5 ds:py-2 ds:text-sm\">No client uploads yet.</p>\n )}\n </DocumentListSection>\n\n <DocumentListSection\n label=\"Firm documents\"\n count={firmDocuments.length}\n action={\n onUploadFirmDocument ? (\n <Button variant=\"ghost\" size=\"sm\" onClick={onUploadFirmDocument}>\n <UploadIcon />\n Upload\n </Button>\n ) : undefined\n }\n >\n {firmDocuments.length > 0 ? (\n firmDocuments.map((d) => (\n <DocumentRow\n key={d.id}\n fileName={d.fileName}\n meta={d.meta}\n approved={d.approved}\n rejected={d.rejected}\n className={d.active ? \"ds:bg-overlay-hover\" : undefined}\n actions={<FileRowActions doc={d} />}\n />\n ))\n ) : (\n <p className=\"ds:text-fg-4 ds:px-2.5 ds:py-2 ds:text-sm\">No firm documents attached.</p>\n )}\n </DocumentListSection>\n </>\n )}\n </DocumentList>\n </TabsContent>\n\n <TabsContent value=\"comments\" className=\"ds:flex ds:min-h-0 ds:flex-1 ds:flex-col flex-col\">\n <div className=\"ds:min-h-0 ds:flex-1 ds:overflow-y-auto ds:px-5 ds:py-4\">\n {comments.length > 0 ? (\n <div className=\"ds:flex ds:flex-col flex-col ds:gap-4\">\n {comments.map((c) => (\n <CommentRow key={c.id} comment={c} />\n ))}\n </div>\n ) : (\n <p className=\"ds:text-fg-4 ds:text-sm\">No comments yet. Start the conversation below.</p>\n )}\n </div>\n <div className=\"ds:border-rule ds:shrink-0 ds:border-t ds:px-5 ds:py-3\">\n <Textarea\n value={commentDraft}\n onChange={(e) => onCommentDraftChange(e.target.value)}\n onKeyDown={(e) => {\n if ((e.metaKey || e.ctrlKey) && e.key === \"Enter\") {\n e.preventDefault();\n onSubmitComment();\n }\n }}\n placeholder=\"Add a comment for the client or your team…\"\n rows={2}\n disabled={commentDisabled}\n className=\"ds:resize-none\"\n />\n <div className=\"ds:mt-2 ds:flex ds:items-center ds:justify-between\">\n <span className=\"ds:text-fg-4 ds:text-[11px]\">⌘↵ to send</span>\n <Button\n size=\"sm\"\n onClick={onSubmitComment}\n disabled={commentDisabled || commentPending || !commentDraft.trim()}\n >\n <SendIcon size={14} />\n Comment\n </Button>\n </div>\n </div>\n </TabsContent>\n\n <TabsContent value=\"activity\" className=\"ds:min-h-0 ds:flex-1 ds:overflow-y-auto ds:px-5 ds:py-4\">\n {activity.length > 0 ? (\n <ul className=\"ds:flex ds:flex-col flex-col ds:gap-1.5\">\n {activity.map((event) => {\n const Icon = ACTIVITY_ICON[event.kind] ?? SendIcon;\n return (\n <li key={event.id} className=\"ds:flex ds:items-start ds:gap-3 ds:py-1\">\n <span className=\"ds:bg-brand-bg ds:text-brand ds:grid ds:size-9 ds:shrink-0 ds:place-items-center ds:rounded-[10px]\">\n <Icon size={16} />\n </span>\n <div className=\"ds:min-w-0 ds:flex-1 ds:pt-1\">\n <p className=\"ds:text-fg-2 ds:text-[13px] ds:leading-snug\">{event.text}</p>\n <p className=\"ds:text-fg-4 ds:mt-0.5 ds:text-[12px]\">{event.time}</p>\n </div>\n </li>\n );\n })}\n </ul>\n ) : (\n <p className=\"ds:text-fg-4 ds:text-sm\">No activity yet.</p>\n )}\n </TabsContent>\n </Tabs>\n </DocumentDetailPanel>\n );\n },\n);\nDocumentRequestDetail.displayName = \"DocumentRequestDetail\";\n\n/* ─── Internal pieces ─────────────────────────────────────────── */\n\nfunction AssigneePicker({\n assignees,\n onToggle,\n}: {\n assignees: DocumentRequestAssigneeOption[];\n onToggle?: ((id: string) => void) | undefined;\n}) {\n const selected = assignees.filter((a) => a.selected);\n\n const stack = (\n <span className=\"ds:flex ds:-space-x-2\">\n {selected.map((a) => (\n <Avatar key={a.id} size=\"sm\" name={a.name} variant=\"branded\" />\n ))}\n </span>\n );\n\n if (!onToggle) {\n return (\n <span className=\"ds:rounded-pill ds:border-rule ds:inline-flex ds:items-center ds:gap-2 ds:border ds:py-1 ds:pr-2.5 ds:pl-1.5\">\n {stack}\n <span className=\"ds:text-fg-2 ds:text-sm ds:font-semibold ds:tabular-nums tabular-nums\">{selected.length}</span>\n </span>\n );\n }\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n aria-label=\"Edit assignees\"\n className=\"ds:rounded-pill ds:border-rule ds:hover:bg-overlay-hover ds:inline-flex ds:items-center ds:gap-2 ds:border ds:py-1 ds:pr-2.5 ds:pl-1.5 ds:transition-colors ds:focus-visible:[box-shadow:var(--shadow-focus-ring)] ds:focus-visible:outline-none\"\n >\n {stack}\n <span className=\"ds:text-fg-2 ds:text-sm ds:font-semibold ds:tabular-nums tabular-nums\">{selected.length}</span>\n <ChevronDownIcon className=\"ds:text-fg-4 ds:size-4\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"ds:w-56\">\n <DropdownMenuLabel>Assign to</DropdownMenuLabel>\n {assignees.map((a) => (\n <DropdownMenuCheckboxItem\n key={a.id}\n checked={a.selected}\n onCheckedChange={() => onToggle(a.id)}\n onSelect={(e) => e.preventDefault()}\n className=\"ds:gap-2\"\n >\n <Avatar size=\"xs\" name={a.name} variant=\"branded\" />\n {a.name}\n </DropdownMenuCheckboxItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\nfunction CommentRow({ comment }: { comment: DocumentRequestDetailComment }) {\n // Two-sided chat: firm (the viewer of this firm-app panel) is anchored right,\n // the client contact left — so the two participants never stack on one side.\n const { isFirm } = comment;\n return (\n <div className={cn(\"ds:flex ds:gap-2.5\", isFirm ? \"ds:flex-row-reverse\" : \"ds:flex-row\")}>\n <Avatar size=\"sm\" name={comment.author} variant=\"branded\" className=\"ds:mt-0.5 ds:shrink-0\" />\n <div\n className={cn(\"ds:flex ds:max-w-[78%] ds:min-w-0 ds:flex-col flex-col\", isFirm ? \"ds:items-end\" : \"ds:items-start\")}\n >\n <div className={cn(\"ds:flex ds:items-center ds:gap-2\", isFirm && \"ds:flex-row-reverse\")}>\n <span className=\"ds:text-fg ds:truncate ds:text-[13px] ds:font-semibold\">\n {comment.author}\n {comment.you && \" (You)\"}\n </span>\n <span className=\"ds:text-fg-4 ds:shrink-0 ds:text-[11.5px]\">{comment.time}</span>\n </div>\n <div\n className={cn(\n \"ds:mt-1 ds:rounded-2xl ds:px-3 ds:py-2 ds:text-[13px] ds:leading-snug\",\n isFirm ? \"ds:bg-brand-bg ds:text-brand ds:rounded-tr-sm\" : \"ds:bg-surface-2 ds:text-fg-2 ds:rounded-tl-sm\",\n )}\n >\n <p className=\"ds:break-words ds:whitespace-pre-wrap\">{comment.body}</p>\n </div>\n </div>\n </div>\n );\n}\n\nfunction FileRowActions({ doc }: { doc: DocumentRequestDetailDoc }) {\n return (\n <>\n {doc.onApprove && !doc.approved && (\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n aria-label=\"Approve\"\n className=\"ds:hover:text-success-fg\"\n onClick={doc.onApprove}\n >\n <CheckIcon />\n </Button>\n )}\n {doc.onPreview && (\n <Button variant=\"ghost\" size=\"icon-sm\" aria-label=\"Preview\" onClick={doc.onPreview}>\n <EyeIcon />\n </Button>\n )}\n {doc.onDownload && (\n <Button variant=\"ghost\" size=\"icon-sm\" aria-label=\"Download\" onClick={doc.onDownload}>\n <DownloadIcon />\n </Button>\n )}\n {doc.onDelete && (\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n aria-label=\"Delete\"\n className=\"ds:hover:text-danger-fg\"\n onClick={doc.onDelete}\n >\n <TrashIcon />\n </Button>\n )}\n </>\n );\n}\n","\"use client\";\n\nimport { forwardRef } from \"react\";\n\nimport { cn } from \"../lib/cn\";\nimport { type DocumentSource } from \"./document-source-tag\";\nimport { SendIcon, ShieldIcon, UploadIcon } from \"../primitives/icons\";\nimport { ToggleGroup, ToggleGroupItem } from \"../primitives/toggle-group\";\n\n/**\n * DocumentSourceFilter — segmented single-select for a files toolbar: scope the\n * list to a provenance bucket. Wraps ToggleGroup (so it inherits roving-focus\n * keyboard nav + the pro-tint active state) and reuses the same `source` →\n * glyph mapping as DocumentSourceTag, plus an \"all\" aggregate segment.\n *\n * all → (no glyph) every document\n * requested → send glyph client fulfilled a firm request\n * direct → upload glyph client uploaded unprompted\n * internal → shield glyph firm-prepared, not client-visible\n *\n * Controlled: pass `value` + `onValueChange`. `counts` adds a trailing badge per\n * segment; `hideIcons` renders label-only segments.\n */\n\nexport type DocumentSourceFilterValue = \"all\" | DocumentSource;\n\nconst OPTIONS: {\n value: DocumentSourceFilterValue;\n label: string;\n Icon?: typeof SendIcon;\n}[] = [\n { value: \"all\", label: \"All\" },\n { value: \"requested\", label: \"Requested\", Icon: SendIcon },\n { value: \"direct\", label: \"Direct\", Icon: UploadIcon },\n { value: \"internal\", label: \"Internal\", Icon: ShieldIcon },\n];\n\nexport interface DocumentSourceFilterProps {\n /** Currently active segment. */\n value: DocumentSourceFilterValue;\n /** Fired when a segment is chosen (re-selecting the active one is ignored). */\n onValueChange: (value: DocumentSourceFilterValue) => void;\n /** Per-segment item counts, rendered as a trailing badge. */\n counts?: Partial<Record<DocumentSourceFilterValue, number>>;\n /** Render label-only segments, with no leading glyph. */\n hideIcons?: boolean;\n className?: string;\n /** Accessible name for the group. */\n \"aria-label\"?: string;\n}\n\n/**\n * @deprecated Frozen in `/legacy` (W8-09): no known consumer, no feature work.\n * Owner: PRO documents, which decides to adopt, contribute or release\n * the name. Never removed before 3.0.\n */\nexport const DocumentSourceFilter = forwardRef<HTMLDivElement, DocumentSourceFilterProps>(\n function DocumentSourceFilter(\n {\n value,\n onValueChange,\n counts,\n hideIcons,\n className,\n \"aria-label\": ariaLabel = \"Filter by document source\",\n },\n ref,\n ) {\n return (\n <ToggleGroup\n ref={ref}\n type=\"single\"\n value={value}\n onValueChange={(next) => {\n // ToggleGroup emits \"\" when the active item is re-clicked; a filter\n // must always keep one segment selected, so ignore the empty value.\n if (next) onValueChange(next as DocumentSourceFilterValue);\n }}\n aria-label={ariaLabel}\n className={cn(\"ds:rounded-pill ds:border-rule ds:bg-surface ds:gap-0.5 ds:border ds:p-1\", className)}\n >\n {OPTIONS.map(({ value: optionValue, label, Icon }) => {\n const count = counts?.[optionValue];\n const active = value === optionValue;\n return (\n <ToggleGroupItem key={optionValue} value={optionValue} className=\"ds:gap-1.5\">\n {!hideIcons && Icon && (\n <Icon size={13} className=\"ds:shrink-0 ds:opacity-90\" aria-hidden=\"true\" />\n )}\n {label}\n {typeof count === \"number\" && (\n <span\n className={cn(\n \"ds:rounded-md ds:px-1.5 ds:py-px ds:text-[11px] ds:font-bold ds:tabular-nums\",\n active ? \"ds:bg-brand-bg-active ds:text-brand\" : \"ds:bg-surface-2 ds:text-fg-4\",\n )}\n >\n {count}\n </span>\n )}\n </ToggleGroupItem>\n );\n })}\n </ToggleGroup>\n );\n },\n);\n\nDocumentSourceFilter.displayName = \"DocumentSourceFilter\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport { forwardRef, useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { cn } from \"../lib/cn\";\nimport { Button } from \"../primitives/button\";\nimport {\n CheckIcon,\n ChevronRightIcon,\n ClockIcon,\n FileTextIcon,\n PauseIcon,\n PlayIcon,\n SettingsIcon,\n StopIcon,\n Trash2Icon,\n} from \"../primitives/icons\";\nimport { Popover, PopoverClose, PopoverContent, PopoverTrigger } from \"../primitives/popover\";\nimport { Switch } from \"../primitives/switch\";\n\n/**\n * TimeLogger — compact, no-scroll time-entry panel for the firm app.\n *\n * Presentational compound (the app owns data + state); compose only the rows\n * a given surface needs, so the same panel covers a quick timer popover and a\n * full billable time entry:\n *\n * ┌─ Track Time ──────────────── 2h 10m / 8h ─┐ Header (goal + seam)\n * │ ◳ Northwind Ledger · 1120-S (IS) ⌄ │ ContextRow (client + member)\n * │ 0:42:17 ⏸ ■ │ Timer (input ⇄ live clock)\n * │ ○ 1120-S · Review trial balance → │ Field (task)\n * │ ▦ Fri, May 29 · 4:54–5:30 pm CET → │ Field (date / range)\n * │ ≡ Reviewed Q1 adjusting entries │ Notes (plain text)\n * │ ◉ Billable ⚙ $541.67 Cancel Save │ Actions (billable + buttons)\n * ├───────────────────────────────────────────┤\n * │ Fri, May 29 2h 10m │ EntryList (day + total)\n * │ ◉ 1120-S review 36m ▶ 🗑 │ Entry (resume / delete)\n * │ My Timesheet Dashboard │ Footer (nav)\n * └───────────────────────────────────────────┘\n *\n * The live `H:MM:SS` clock is driven by {@link useStopwatch} (SSR-safe). The\n * panel supplies no surface chrome of its own — wrap it in a fixed-width frame\n * or a `Popover` (which already provides border/radius/shadow), exactly like\n * `NotificationPanel`.\n *\n * const sw = useStopwatch();\n * <TimeLogger>\n * <TimeLoggerHeader loggedMinutes={130} goalMinutes={480} />\n * <TimeLoggerTimer\n * phase={sw.phase}\n * elapsedMs={sw.elapsedMs}\n * value={draft}\n * onValueChange={setDraft}\n * onStart={() => sw.start(parseDuration(draft) != null ? parseDuration(draft)! * 1000 : 0)}\n * onPause={sw.pause}\n * onResume={sw.resume}\n * onStop={sw.stop}\n * />\n * <TimeLoggerActions>\n * <TimeLoggerBillable className=\"mr-auto\" billable={billable} onBillableChange={setBillable} />\n * <Button variant=\"ghost\" onClick={sw.reset}>Cancel</Button>\n * <Button>Save</Button>\n * </TimeLoggerActions>\n * </TimeLogger>\n */\n\n/* ────────────────────────────────────────────────────────────────────────\n * Time helpers — exported so consumers format the same way the panel does.\n * ──────────────────────────────────────────────────────────────────────── */\n\nconst padded = (n: number) => String(n).padStart(2, \"0\");\n\n/** Running-clock format from milliseconds → `H:MM:SS`. */\nexport function formatClock(ms: number): string {\n const total = Math.max(0, Math.floor(ms / 1000));\n return `${Math.floor(total / 3600)}:${padded(Math.floor((total % 3600) / 60))}:${padded(total % 60)}`;\n}\n\n/** Compact duration from seconds → `Xh Ym` (e.g. `2h 10m`, `45m`, `3h`). */\nexport function formatDuration(totalSeconds: number): string {\n const minutes = Math.round(totalSeconds / 60);\n const h = Math.floor(minutes / 60);\n const m = minutes % 60;\n if (h && m) return `${h}h ${m}m`;\n if (h) return `${h}h`;\n return `${m}m`;\n}\n\n/** Parse human input (`3h 20m`, `1:30`, `45m`, bare `90` → minutes) → seconds, or `null`. */\nexport function parseDuration(input: string): number | null {\n const text = input.trim().toLowerCase();\n if (!text) return null;\n const clock = text.match(/^(\\d{1,2}):(\\d{2})$/);\n if (clock) return (Number(clock[1]) * 60 + Number(clock[2])) * 60;\n let seconds = 0;\n let matched = false;\n const unit = /(\\d+(?:\\.\\d+)?)\\s*(h|hr|hrs|hour|hours|m|min|mins|minute|minutes|s|sec|secs)/g;\n let part: RegExpExecArray | null;\n while ((part = unit.exec(text)) !== null) {\n matched = true;\n const value = parseFloat(part[1] ?? \"\");\n const unitName = part[2] ?? \"\";\n if (unitName.startsWith(\"h\")) seconds += value * 3600;\n else if (unitName.startsWith(\"m\")) seconds += value * 60;\n else seconds += value;\n }\n if (!matched && /^\\d+$/.test(text)) return Number(text) * 60;\n return matched ? Math.round(seconds) : null;\n}\n\n/** Currency format used by the billing rows; falls back to `$0.00` for bad ISO codes. */\nexport function formatCurrency(amount: number, currency = \"USD\"): string {\n try {\n return new Intl.NumberFormat(\"en-US\", { style: \"currency\", currency }).format(amount);\n } catch {\n return `$${amount.toFixed(2)}`;\n }\n}\n\n/* ────────────────────────────────────────────────────────────────────────\n * useStopwatch — drift-free timing engine for the panel.\n * Elapsed is recomputed from wall-clock timestamps on each tick, so the\n * readout never accumulates interval drift. SSR-safe: no window/storage\n * access, and the first client render matches the server (idle / 0ms).\n * ──────────────────────────────────────────────────────────────────────── */\n\nexport type TimeLoggerPhase = \"idle\" | \"running\" | \"paused\" | \"stopped\";\n\nexport interface UseStopwatchReturn {\n phase: TimeLoggerPhase;\n elapsedMs: number;\n isRunning: boolean;\n /** Begin running, optionally seeded with an offset (e.g. a parsed manual entry). */\n start: (fromMs?: number) => void;\n pause: () => void;\n resume: () => void;\n /** Freeze and mark complete; elapsed is preserved for saving. */\n stop: () => void;\n /** Return to idle at zero. */\n reset: () => void;\n}\n\n// 250ms keeps a H:MM:SS readout visually live without sub-second busywork.\nconst TICK_MS = 250;\n\nexport function useStopwatch(): UseStopwatchReturn {\n const [phase, setPhaseState] = useState<TimeLoggerPhase>(\"idle\");\n const [elapsedMs, setElapsedMs] = useState(0);\n // accumulatedRef holds completed run-time; startedAtRef is the wall clock at\n // the last start/resume. phaseRef mirrors phase so callbacks read it\n // synchronously without re-running impure logic inside a state updater.\n const accumulatedRef = useRef(0);\n const startedAtRef = useRef(0);\n const phaseRef = useRef<TimeLoggerPhase>(\"idle\");\n\n const setPhase = useCallback((next: TimeLoggerPhase) => {\n phaseRef.current = next;\n setPhaseState(next);\n }, []);\n\n useEffect(() => {\n if (phase !== \"running\") return;\n const id = setInterval(() => {\n setElapsedMs(accumulatedRef.current + (Date.now() - startedAtRef.current));\n }, TICK_MS);\n return () => clearInterval(id);\n }, [phase]);\n\n const start = useCallback(\n (fromMs = 0) => {\n accumulatedRef.current = fromMs;\n startedAtRef.current = Date.now();\n setElapsedMs(fromMs);\n setPhase(\"running\");\n },\n [setPhase],\n );\n\n const pause = useCallback(() => {\n if (phaseRef.current !== \"running\") return;\n accumulatedRef.current += Date.now() - startedAtRef.current;\n setElapsedMs(accumulatedRef.current);\n setPhase(\"paused\");\n }, [setPhase]);\n\n const resume = useCallback(() => {\n if (phaseRef.current !== \"paused\") return;\n startedAtRef.current = Date.now();\n setPhase(\"running\");\n }, [setPhase]);\n\n const stop = useCallback(() => {\n if (phaseRef.current === \"idle\") return;\n if (phaseRef.current === \"running\") {\n accumulatedRef.current += Date.now() - startedAtRef.current;\n setElapsedMs(accumulatedRef.current);\n }\n setPhase(\"stopped\");\n }, [setPhase]);\n\n const reset = useCallback(() => {\n accumulatedRef.current = 0;\n startedAtRef.current = 0;\n setElapsedMs(0);\n setPhase(\"idle\");\n }, [setPhase]);\n\n return { phase, elapsedMs, isRunning: phase === \"running\", start, pause, resume, stop, reset };\n}\n\n/* ────────────────────────────────────────────────────────────────────────\n * Root\n * ──────────────────────────────────────────────────────────────────────── */\n\nexport interface TimeLoggerProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Layout direction.\n * - `\"vertical\"` (default) — the stacked panel; rows separated by top\n * rules. For popovers and side panels.\n * - `\"horizontal\"` — a single compact bar; segments sit side by side,\n * separated by left rules. For an app top/bottom bar. Exposed as\n * `data-orientation` so segment atoms flip their divider via\n * `group-data-[orientation=horizontal]/timelogger`.\n */\n orientation?: \"vertical\" | \"horizontal\";\n}\n\nexport const TimeLogger = forwardRef<HTMLDivElement, TimeLoggerProps>(function TimeLogger(\n { className, orientation = \"vertical\", children, ...props },\n ref,\n) {\n return (\n <div\n ref={ref}\n data-orientation={orientation}\n className={cn(\n \"ds:group/timelogger ds:bg-surface ds:text-fg-2 ds:flex ds:w-full\",\n orientation === \"horizontal\" ? \"ds:flex-row ds:items-stretch\" : \"ds:flex-col\",\n className,\n )}\n {...props}\n >\n {children}\n </div>\n );\n});\nTimeLogger.displayName = \"TimeLogger\";\n\n// Shared by every segment row: in a horizontal <TimeLogger> the stacking\n// top-rule becomes a leading left-rule between side-by-side segments (and the\n// first segment drops it). Atoms opt in by appending this to their className.\nconst horizontalSegment =\n \"ds:group-data-[orientation=horizontal]/timelogger:border-t-0 ds:group-data-[orientation=horizontal]/timelogger:border-l ds:group-data-[orientation=horizontal]/timelogger:first:border-l-0\";\n\n/* ────────────────────────────────────────────────────────────────────────\n * Header — title + daily goal + progress seam\n * ──────────────────────────────────────────────────────────────────────── */\n\nexport interface TimeLoggerHeaderProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"title\"> {\n title?: React.ReactNode;\n icon?: React.ReactNode;\n /** Minutes logged today. With `goalMinutes`, renders the `Xh / Yh` figure + seam. */\n loggedMinutes?: number;\n /** Daily goal in minutes. Omit to hide the goal figure and the progress seam. */\n goalMinutes?: number;\n}\n\nexport const TimeLoggerHeader = forwardRef<HTMLDivElement, TimeLoggerHeaderProps>(\n function TimeLoggerHeader(\n { title = \"Track Time\", icon, loggedMinutes = 0, goalMinutes, className, ...props },\n ref,\n ) {\n const hasGoal = goalMinutes != null;\n const pct = hasGoal && goalMinutes > 0 ? Math.min(100, (loggedMinutes / goalMinutes) * 100) : 0;\n\n return (\n <div ref={ref} className={cn(\"ds:flex ds:flex-col\", className)} {...props}>\n <div className=\"ds:flex ds:items-center ds:justify-between ds:px-4 ds:py-3.5\">\n <div className=\"ds:text-fg ds:flex ds:items-center ds:gap-2.5 ds:text-[17px] ds:font-semibold\">\n {/* Rounded app-icon tile — a calmer, more modern lockup than a\n bare glyph against the title. */}\n <span\n className=\"ds:bg-brand-bg ds:text-brand ds:flex ds:size-7 ds:shrink-0 ds:items-center ds:justify-center ds:rounded-lg ds:[&_svg]:size-[17px]\"\n aria-hidden=\"true\"\n >\n {icon ?? <ClockIcon />}\n </span>\n {title}\n </div>\n {hasGoal && (\n <div className=\"ds:text-fg-3 ds:font-mono ds:text-[13px] ds:tabular-nums\">\n <b className=\"ds:text-fg ds:font-semibold\">{formatDuration(loggedMinutes * 60)}</b> /{\" \"}\n {formatDuration(goalMinutes * 60)}\n </div>\n )}\n </div>\n {/* A flush seam, not a labelled ProgressBar meter — different role, so\n it stays a token-styled one-off. The brand gradient fill reads as a\n more deliberate, modern accent than a flat bar. */}\n {hasGoal && (\n <div\n className=\"ds:bg-bg-3 ds:relative ds:h-1 ds:w-full\"\n role=\"progressbar\"\n aria-label=\"Daily goal progress\"\n aria-valuemin={0}\n aria-valuemax={goalMinutes}\n aria-valuenow={Math.min(loggedMinutes, goalMinutes)}\n >\n <div\n className=\"ds:h-full ds:rounded-r-full ds:bg-[image:var(--gradient-pro)] ds:transition-[width] ds:duration-[var(--duration-normal)] ds:ease-[var(--ease-out-quart)] ds:motion-reduce:transition-none\"\n style={{ width: `${pct}%` }}\n />\n </div>\n )}\n </div>\n );\n },\n);\nTimeLoggerHeader.displayName = \"TimeLoggerHeader\";\n\n/* ────────────────────────────────────────────────────────────────────────\n * Context row — client / engagement (left) + assignee (right)\n * Two semantic targets: the left selector is a button; the right `member`\n * slot is the consumer's own control (Avatar + menu, TeamMemberSelect, …),\n * so the two intents never nest inside one click target.\n * ──────────────────────────────────────────────────────────────────────── */\n\nexport interface TimeLoggerContextRowProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n \"title\"\n> {\n client: React.ReactNode;\n engagement?: React.ReactNode;\n /** Leading slot, e.g. an `<Avatar variant=\"branded\" />`. */\n avatar?: React.ReactNode;\n onClientSelect?: () => void;\n /** Right-aligned slot — an assignee avatar + menu, or a `<TeamMemberSelect>`. */\n member?: React.ReactNode;\n}\n\nexport const TimeLoggerContextRow = forwardRef<HTMLDivElement, TimeLoggerContextRowProps>(\n function TimeLoggerContextRow(\n { client, engagement, avatar, onClientSelect, member, className, ...props },\n ref,\n ) {\n const text = (\n <span className=\"ds:min-w-0\">\n <span className=\"ds:text-fg ds:block ds:truncate ds:text-sm ds:font-medium\">{client}</span>\n {engagement && <span className=\"ds:text-fg-3 ds:block ds:truncate ds:text-xs\">{engagement}</span>}\n </span>\n );\n\n return (\n <div\n ref={ref}\n className={cn(\n \"ds:border-rule-soft ds:flex ds:items-center ds:gap-2.5 ds:border-t ds:px-4 ds:py-3\",\n horizontalSegment,\n className,\n )}\n {...props}\n >\n {onClientSelect ? (\n <button\n type=\"button\"\n onClick={onClientSelect}\n className=\"ds:rounded-btn ds:hover:bg-surface-2 ds:focus-visible:bg-surface-2 ds:-m-1 ds:flex ds:min-w-0 ds:flex-1 ds:items-center ds:gap-2.5 ds:p-1 ds:text-left ds:transition-colors ds:duration-[var(--duration-fast)] ds:ease-[var(--ease-out-quart)] ds:outline-none ds:focus-visible:[box-shadow:var(--shadow-focus-ring)] ds:motion-reduce:transition-none\"\n >\n {avatar}\n {text}\n </button>\n ) : (\n <div className=\"ds:flex ds:min-w-0 ds:flex-1 ds:items-center ds:gap-2.5\">\n {avatar}\n {text}\n </div>\n )}\n {member && <div className=\"ds:shrink-0\">{member}</div>}\n </div>\n );\n },\n);\nTimeLoggerContextRow.displayName = \"TimeLoggerContextRow\";\n\n/* ────────────────────────────────────────────────────────────────────────\n * Timer — manual-entry input that flips to a live read-only clock once running\n * ──────────────────────────────────────────────────────────────────────── */\n\nexport interface TimeLoggerTimerProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n \"onChange\"\n> {\n phase: TimeLoggerPhase;\n elapsedMs: number;\n /** Manual-entry text, shown only while idle. Controlled. */\n value?: string;\n onValueChange?: (value: string) => void;\n placeholder?: string;\n onStart?: () => void;\n onPause?: () => void;\n onResume?: () => void;\n onStop?: () => void;\n}\n\nexport const TimeLoggerTimer = forwardRef<HTMLDivElement, TimeLoggerTimerProps>(\n function TimeLoggerTimer(\n {\n phase,\n elapsedMs,\n value,\n onValueChange,\n placeholder = \"Enter time (ex: 3h 20m) or start timer\",\n onStart,\n onPause,\n onResume,\n onStop,\n className,\n ...props\n },\n ref,\n ) {\n const showClock = phase !== \"idle\";\n const canStop = phase === \"running\" || phase === \"paused\";\n\n return (\n <div\n ref={ref}\n className={cn(\n \"ds:border-rule-soft ds:flex ds:items-center ds:gap-2.5 ds:border-t ds:px-4 ds:py-4\",\n // In a horizontal bar this segment is usually the `flex-1` grower;\n // min-w-0 lets the clock shrink instead of pushing the trailing\n // segment off the edge.\n \"ds:group-data-[orientation=horizontal]/timelogger:min-w-0\",\n horizontalSegment,\n className,\n )}\n {...props}\n >\n <input\n className={cn(\n \"ds:text-fg ds:placeholder:text-fg-4 ds:min-w-0 ds:flex-1 ds:border-0 ds:bg-transparent ds:outline-none\",\n showClock\n ? \"ds:font-mono ds:text-[28px] ds:font-semibold ds:tracking-tight ds:tabular-nums\"\n : \"ds:text-[15px]\",\n )}\n value={showClock ? formatClock(elapsedMs) : (value ?? \"\")}\n onChange={(event) => onValueChange?.(event.target.value)}\n placeholder={placeholder}\n readOnly={showClock}\n aria-label=\"Tracked time\"\n />\n\n {/* Pause / Resume — a quiet ghost circle so it sits behind the primary\n control in the visual hierarchy. */}\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"ds:text-fg-3 ds:hover:bg-bg-3 ds:hover:text-fg ds:size-10 ds:rounded-full\"\n aria-label={phase === \"paused\" ? \"Resume timer\" : \"Pause timer\"}\n disabled={phase === \"idle\" || phase === \"stopped\"}\n onClick={phase === \"paused\" ? onResume : onPause}\n >\n {phase === \"paused\" ? <PlayIcon /> : <PauseIcon />}\n </Button>\n\n {/* Start / Stop — the hero action. A larger brand-gradient circle with\n a soft lift + press feedback; the destructive Stop mirrors the size\n so the transport doesn't jump between phases. */}\n {canStop ? (\n <Button\n type=\"button\"\n variant=\"destructive\"\n size=\"icon\"\n className=\"ds:shadow-card ds:hover:shadow-pop ds:size-12 ds:rounded-full ds:transition-[transform,box-shadow] ds:active:scale-95 ds:motion-reduce:transition-none\"\n aria-label=\"Stop timer\"\n onClick={onStop}\n >\n <StopIcon />\n </Button>\n ) : (\n <Button\n type=\"button\"\n variant=\"primary\"\n size=\"icon\"\n className=\"ds:shadow-card ds:hover:shadow-pop ds:size-12 ds:rounded-full ds:bg-[image:var(--gradient-brand)] ds:transition-[transform,box-shadow] ds:active:scale-95 ds:motion-reduce:transition-none\"\n aria-label=\"Start timer\"\n onClick={onStart}\n >\n <PlayIcon />\n </Button>\n )}\n </div>\n );\n },\n);\nTimeLoggerTimer.displayName = \"TimeLoggerTimer\";\n\n/* ────────────────────────────────────────────────────────────────────────\n * Field — generic icon + value row (task, date/range, or any custom field).\n * Renders as a button when `onSelect` is given, otherwise a static div.\n * ──────────────────────────────────────────────────────────────────────── */\n\nexport interface TimeLoggerFieldProps extends Omit<React.HTMLAttributes<HTMLElement>, \"onSelect\"> {\n icon?: React.ReactNode;\n /** Small caption above the value. */\n label?: React.ReactNode;\n onSelect?: () => void;\n /** Trailing node; defaults to a chevron when interactive. Pass `null` to suppress. */\n trailing?: React.ReactNode;\n /** Render the value in the muted placeholder colour. */\n muted?: boolean;\n}\n\nexport const TimeLoggerField = forwardRef<HTMLElement, TimeLoggerFieldProps>(\n function TimeLoggerField(\n { icon, label, onSelect, trailing, muted, className, children, ...props },\n ref,\n ) {\n const interactive = Boolean(onSelect);\n const inner = (\n <>\n {icon && (\n <span\n className=\"ds:text-fg-4 ds:flex ds:size-[17px] ds:shrink-0 ds:items-center ds:justify-center ds:[&_svg]:size-[17px]\"\n aria-hidden=\"true\"\n >\n {icon}\n </span>\n )}\n <span className=\"ds:min-w-0 ds:flex-1\">\n {label && <span className=\"ds:text-fg-3 ds:block ds:text-[11px] ds:leading-tight\">{label}</span>}\n <span className={cn(\"ds:block ds:truncate\", muted ? \"ds:text-fg-3\" : \"ds:text-fg-2\")}>\n {children}\n </span>\n </span>\n {trailing !== undefined ? (\n trailing\n ) : interactive ? (\n <ChevronRightIcon className=\"ds:text-fg-4 ds:size-4 ds:shrink-0\" />\n ) : null}\n </>\n );\n\n const classes = cn(\n \"ds:border-rule-soft ds:flex ds:w-full ds:items-center ds:gap-3 ds:border-t ds:px-4 ds:py-3 ds:text-left\",\n \"ds:group-data-[orientation=horizontal]/timelogger:w-auto\",\n horizontalSegment,\n interactive &&\n \"ds:hover:bg-surface-2 ds:focus-visible:bg-surface-2 ds:cursor-pointer ds:transition-colors ds:duration-[var(--duration-fast)] ds:ease-[var(--ease-out-quart)] ds:outline-none ds:motion-reduce:transition-none\",\n className,\n );\n\n if (interactive) {\n return (\n <button\n ref={ref as React.Ref<HTMLButtonElement>}\n type=\"button\"\n onClick={onSelect}\n className={classes}\n {...(props as React.ButtonHTMLAttributes<HTMLButtonElement>)}\n >\n {inner}\n </button>\n );\n }\n return (\n <div ref={ref as React.Ref<HTMLDivElement>} className={classes} {...props}>\n {inner}\n </div>\n );\n },\n);\nTimeLoggerField.displayName = \"TimeLoggerField\";\n\n/* ────────────────────────────────────────────────────────────────────────\n * Notes — plain-text entry row\n * ──────────────────────────────────────────────────────────────────────── */\n\nexport interface TimeLoggerNotesProps extends Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n \"value\" | \"onChange\"\n> {\n value?: string;\n onValueChange?: (value: string) => void;\n icon?: React.ReactNode;\n}\n\nexport const TimeLoggerNotes = forwardRef<HTMLInputElement, TimeLoggerNotesProps>(\n function TimeLoggerNotes(\n { value, onValueChange, icon, placeholder = \"Add notes\", className, ...props },\n ref,\n ) {\n return (\n <div className=\"ds:border-rule-soft ds:flex ds:items-center ds:gap-3 ds:border-t ds:px-4 ds:py-3\">\n <span\n className=\"ds:text-fg-4 ds:flex ds:size-[17px] ds:shrink-0 ds:items-center ds:justify-center ds:[&_svg]:size-[17px]\"\n aria-hidden=\"true\"\n >\n {icon ?? <FileTextIcon />}\n </span>\n <input\n ref={ref}\n type=\"text\"\n value={value ?? \"\"}\n onChange={(event) => onValueChange?.(event.target.value)}\n placeholder={placeholder}\n aria-label=\"Notes\"\n className={cn(\n \"ds:text-fg ds:placeholder:text-fg-4 ds:min-w-0 ds:flex-1 ds:border-0 ds:bg-transparent ds:text-sm ds:outline-none\",\n className,\n )}\n {...props}\n />\n </div>\n );\n },\n);\nTimeLoggerNotes.displayName = \"TimeLoggerNotes\";\n\n/* ────────────────────────────────────────────────────────────────────────\n * Billable — toggle + pricing-tier settings pop-view + amount readout\n * ──────────────────────────────────────────────────────────────────────── */\n\nexport interface TimeLoggerTier {\n id: string;\n name: React.ReactNode;\n /** Hourly rate in the panel currency; shown in the tier menu's right column. */\n rate: number;\n}\n\nexport interface TimeLoggerBillableProps extends React.HTMLAttributes<HTMLDivElement> {\n billable: boolean;\n onBillableChange?: (billable: boolean) => void;\n /** Defaults to \"Billable\" / \"Non-billable\" derived from `billable`. */\n label?: React.ReactNode;\n /** Pricing tiers shown in the settings pop-view. Omit to hide the gear. */\n tiers?: TimeLoggerTier[];\n tierId?: string;\n onTierChange?: (id: string) => void;\n /** ISO currency for tier-rate formatting. Default `\"USD\"`. */\n currency?: string;\n /** Computed amount readout (rate × time). Pass a formatted node, or omit. */\n amount?: React.ReactNode;\n}\n\nexport const TimeLoggerBillable = forwardRef<HTMLDivElement, TimeLoggerBillableProps>(\n function TimeLoggerBillable(\n {\n billable,\n onBillableChange,\n label,\n tiers,\n tierId,\n onTierChange,\n currency = \"USD\",\n amount,\n className,\n ...props\n },\n ref,\n ) {\n return (\n <div ref={ref} className={cn(\"ds:flex ds:min-w-0 ds:items-center ds:gap-2.5\", className)} {...props}>\n <Switch\n size=\"sm\"\n checked={billable}\n {...(onBillableChange !== undefined && { onCheckedChange: onBillableChange })}\n aria-label=\"Billable\"\n />\n <span className=\"ds:text-fg-3 ds:text-[13px] ds:whitespace-nowrap\">\n {label ?? (billable ? \"Billable\" : \"Non-billable\")}\n </span>\n\n {tiers && tiers.length > 0 && (\n <Popover>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n aria-label=\"Billing settings\"\n className=\"ds:text-fg-4 ds:hover:text-fg-2 ds:hover:bg-surface-hover ds:rounded-btn ds:flex ds:size-6 ds:items-center ds:justify-center ds:transition-colors ds:duration-[var(--duration-fast)] ds:ease-[var(--ease-out-quart)] ds:outline-none ds:focus-visible:[box-shadow:var(--shadow-focus-ring)] ds:motion-reduce:transition-none ds:[&_svg]:size-4\"\n >\n <SettingsIcon />\n </button>\n </PopoverTrigger>\n <PopoverContent align=\"start\" side=\"top\" className=\"ds:w-56 ds:p-1.5\">\n <p className=\"ds:text-fg-3 ds:px-2 ds:pt-1 ds:pb-1.5 ds:font-mono ds:text-[10px] ds:tracking-wider ds:uppercase\">\n Pricing tier · {currency}\n </p>\n {tiers.map((tier) => {\n const selected = tier.id === tierId;\n return (\n <PopoverClose asChild key={tier.id}>\n <button\n type=\"button\"\n onClick={() => onTierChange?.(tier.id)}\n className=\"ds:hover:bg-surface-2 ds:flex ds:w-full ds:items-center ds:gap-2 ds:rounded-md ds:px-2 ds:py-2 ds:text-left ds:transition-colors ds:duration-[var(--duration-fast)] ds:ease-[var(--ease-out-quart)] ds:outline-none ds:focus-visible:[box-shadow:var(--shadow-focus-ring)] ds:motion-reduce:transition-none\"\n >\n <span\n className={cn(\n \"ds:flex-1 ds:truncate ds:text-[13px]\",\n selected ? \"ds:text-brand ds:font-medium\" : \"ds:text-fg\",\n )}\n >\n {tier.name}\n </span>\n <span className=\"ds:text-fg-3 ds:font-mono ds:text-[12.5px] ds:tabular-nums\">\n {formatCurrency(tier.rate, currency)}/hr\n </span>\n <CheckIcon\n className={cn(\n \"ds:text-brand ds:size-4 ds:shrink-0\",\n selected ? \"ds:opacity-100\" : \"ds:opacity-0\",\n )}\n />\n </button>\n </PopoverClose>\n );\n })}\n </PopoverContent>\n </Popover>\n )}\n\n {amount != null && (\n <span className=\"ds:text-fg-2 ds:font-mono ds:text-[12.5px] ds:font-medium ds:tabular-nums\">\n {amount}\n </span>\n )}\n </div>\n );\n },\n);\nTimeLoggerBillable.displayName = \"TimeLoggerBillable\";\n\n/* ────────────────────────────────────────────────────────────────────────\n * Actions — bottom bar; consumer drops the billable cluster + Save/Cancel here\n * ──────────────────────────────────────────────────────────────────────── */\n\nexport type TimeLoggerActionsProps = React.HTMLAttributes<HTMLDivElement>;\n\nexport const TimeLoggerActions = forwardRef<HTMLDivElement, TimeLoggerActionsProps>(\n function TimeLoggerActions({ className, children, ...props }, ref) {\n return (\n <div\n ref={ref}\n className={cn(\n \"ds:border-rule ds:bg-surface-2 ds:flex ds:items-center ds:gap-2 ds:border-t ds:px-4 ds:py-3\",\n horizontalSegment,\n className,\n )}\n {...props}\n >\n {children}\n </div>\n );\n },\n);\nTimeLoggerActions.displayName = \"TimeLoggerActions\";\n\n/* ────────────────────────────────────────────────────────────────────────\n * Entry list + entry rows\n * ──────────────────────────────────────────────────────────────────────── */\n\nexport interface TimeLoggerEntryListProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Day group caption, e.g. \"Fri, May 29\". */\n dayLabel?: React.ReactNode;\n /** Right-aligned day subtotal, e.g. \"2h 10m\". */\n total?: React.ReactNode;\n}\n\nexport const TimeLoggerEntryList = forwardRef<HTMLDivElement, TimeLoggerEntryListProps>(\n function TimeLoggerEntryList({ dayLabel, total, className, children, ...props }, ref) {\n return (\n <div ref={ref} className={cn(\"ds:border-bg-2 ds:border-t-[7px]\", className)} {...props}>\n {(dayLabel || total) && (\n <div className=\"ds:flex ds:items-center ds:justify-between ds:px-4 ds:pt-2.5 ds:pb-1 ds:text-xs\">\n {dayLabel && <span className=\"ds:text-fg-3 ds:font-medium\">{dayLabel}</span>}\n {total && <span className=\"ds:text-fg-2 ds:font-mono ds:tabular-nums\">{total}</span>}\n </div>\n )}\n {children}\n </div>\n );\n },\n);\nTimeLoggerEntryList.displayName = \"TimeLoggerEntryList\";\n\nexport interface TimeLoggerEntryProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"title\"> {\n title: React.ReactNode;\n /** Secondary line — time range, billable amount, etc. */\n meta?: React.ReactNode;\n duration: React.ReactNode;\n onResume?: () => void;\n onDelete?: () => void;\n}\n\nexport const TimeLoggerEntry = forwardRef<HTMLDivElement, TimeLoggerEntryProps>(\n function TimeLoggerEntry(\n { title, meta, duration, onResume, onDelete, className, ...props },\n ref,\n ) {\n return (\n <div\n ref={ref}\n className={cn(\n \"ds:border-rule-soft ds:hover:bg-surface-2 ds:flex ds:items-center ds:gap-3 ds:border-t ds:px-4 ds:py-2.5 ds:transition-colors ds:duration-[var(--duration-fast)] ds:ease-[var(--ease-out-quart)] ds:motion-reduce:transition-none\",\n className,\n )}\n {...props}\n >\n <span\n aria-hidden=\"true\"\n className=\"ds:border-brand ds:size-[15px] ds:shrink-0 ds:rounded-full ds:border-[1.5px] ds:shadow-[inset_0_0_0_3px_var(--color-brand)]\"\n />\n <div className=\"ds:min-w-0 ds:flex-1\">\n <p className=\"ds:text-fg ds:truncate ds:text-[13px]\">{title}</p>\n {meta && <p className=\"ds:text-fg-3 ds:truncate ds:text-[11.5px]\">{meta}</p>}\n </div>\n <span className=\"ds:text-fg-2 ds:font-mono ds:text-[13px] ds:tabular-nums\">{duration}</span>\n {onResume && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n className=\"ds:text-fg-3 ds:hover:text-brand ds:hover:bg-brand-bg ds:rounded-full\"\n aria-label=\"Resume entry\"\n onClick={onResume}\n >\n <PlayIcon />\n </Button>\n )}\n {onDelete && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n className=\"ds:text-fg-3 ds:hover:text-danger-fg ds:hover:bg-danger-bg ds:rounded-full\"\n aria-label=\"Delete entry\"\n onClick={onDelete}\n >\n <Trash2Icon />\n </Button>\n )}\n </div>\n );\n },\n);\nTimeLoggerEntry.displayName = \"TimeLoggerEntry\";\n\n/* ────────────────────────────────────────────────────────────────────────\n * Footer — equal-width nav row (My Timesheet / Dashboard, etc.)\n * ──────────────────────────────────────────────────────────────────────── */\n\nexport type TimeLoggerFooterProps = React.HTMLAttributes<HTMLDivElement>;\n\nexport const TimeLoggerFooter = forwardRef<HTMLDivElement, TimeLoggerFooterProps>(\n function TimeLoggerFooter({ className, children, ...props }, ref) {\n return (\n <div\n ref={ref}\n className={cn(\"ds:border-rule ds:flex ds:gap-2 ds:border-t ds:px-4 ds:py-3 ds:[&>*]:flex-1\", className)}\n {...props}\n >\n {children}\n </div>\n );\n },\n);\nTimeLoggerFooter.displayName = \"TimeLoggerFooter\";\n","\"use client\";\n\nimport { SparkleIcon } from \"../primitives/icons\";\nimport { cn } from \"../lib/cn\";\n\n/**\n * SuggestionPills — a horizontal strip of AI quick-reply pills, typically\n * floated above a message composer when the last inbound message warrants a\n * fast response.\n *\n * The pills materialise with a staggered \"magic smoke\" entrance (the bar\n * rises, the sparkle pulses, each pill puffs in) driven by the shipped\n * `.ds-suggestion-*` classes — motion is suppressed under\n * `prefers-reduced-motion`. Presentational and controlled: the consumer\n * supplies the suggestion strings and a pick handler.\n *\n * <SuggestionPills\n * suggestions={[\"Sounds good — thanks!\", \"Could you send the W-2?\"]}\n * onPick={(text) => editor.insert(text)}\n * loading={generating}\n * />\n *\n * Returns `null` when not loading and there are no suggestions, so it can be\n * rendered unconditionally.\n *\n * @since 1.5.0\n */\n\nexport interface SuggestionPillsProps {\n /** Suggestion strings to render as pills. */\n suggestions: string[];\n /** Fired with the picked suggestion text. */\n onPick: (text: string) => void;\n /** Show skeleton pills while suggestions are being generated. */\n loading?: boolean;\n /** Strip label. Default: `\"Smart replies\"`. */\n label?: string;\n /** Extra classes on the bar. */\n className?: string;\n}\n\n/**\n * @deprecated Frozen in `/legacy` (W8-09): no known consumer, no feature work.\n * Owner: PRO communications, which decides to adopt, contribute or release\n * the name. Never removed before 3.0.\n */\nexport function SuggestionPills({\n suggestions,\n onPick,\n loading,\n label = \"Smart replies\",\n className,\n}: SuggestionPillsProps) {\n if (!loading && suggestions.length === 0) return null;\n\n return (\n <div\n className={cn(\n \"ds-suggestion-bar ds:flex ds:items-center ds:gap-2 ds:overflow-x-auto ds:border-t ds:border-rule/60 ds:bg-gradient-to-b ds:from-brand-bg/40 ds:to-transparent ds:px-4 ds:py-2.5 ds:motion-reduce:animate-none ds:[scrollbar-width:none]\",\n className,\n )}\n >\n <span className=\"ds:flex ds:shrink-0 ds:items-center ds:gap-1.5 ds:text-[11px] ds:font-medium ds:text-fg-3\">\n <SparkleIcon className=\"ds-suggestion-spark ds:size-3.5 ds:text-brand\" aria-hidden=\"true\" />\n {label}\n </span>\n\n {loading\n ? [0, 1].map((i) => (\n <span key={i} className=\"ds:h-7 ds:w-32 ds:shrink-0 ds:animate-pulse ds:rounded-full ds:bg-bg-2 ds:motion-reduce:animate-none\" />\n ))\n : suggestions.map((text, i) => (\n <button\n key={text + i}\n type=\"button\"\n onClick={() => onPick(text)}\n title={text}\n style={{ animationDelay: `${i * 110}ms` }}\n className={cn(\n \"ds-suggestion-pill ds:max-w-[260px] ds:shrink-0 ds:truncate ds:whitespace-nowrap ds:rounded-full ds:border ds:px-3.5 ds:py-1.5 ds:text-[12px] ds:font-medium ds:motion-reduce:animate-none\",\n \"ds:border-brand/30 ds:bg-brand-bg ds:text-brand ds:shadow-quiet\",\n \"ds:transition-[color,background-color,border-color,box-shadow,transform] ds:duration-[var(--duration-fast)] ds:ease-[var(--ease-out-quart)] ds:hover:-translate-y-0.5 ds:hover:border-brand/50 ds:hover:bg-brand-bg-hover ds:hover:shadow-card ds:motion-reduce:transform-none ds:motion-reduce:transition-none\",\n \"ds:focus-visible:[box-shadow:var(--shadow-focus-ring)] ds:focus-visible:outline-none\",\n )}\n >\n {text}\n </button>\n ))}\n </div>\n );\n}\nSuggestionPills.displayName = \"SuggestionPills\";\n","\"use client\";\n\nimport { useState, type ReactNode } from \"react\";\n\nimport { Button } from \"../primitives/button\";\nimport { ChevronDownIcon, SparkleIcon } from \"../primitives/icons\";\nimport { cn } from \"../lib/cn\";\n\n/**\n * AiDraftCard — the \"lit-from-within\" slab that presents an AI-generated\n * message draft inside a composer.\n *\n * It owns four visual states behind one prop:\n * - `loading` / `refining` — a sparkle + shimmer skeleton over the flowing\n * neon `.ds-ai-surface`.\n * - `error` — a quiet destructive panel with an optional Retry and a\n * Dismiss.\n * - `ready` — the collapsible draft: header (sparkle, \"AI Draft\",\n * optional context line, collapse toggle), an optional subject line, the\n * draft `children`, and a footer `actions` slot.\n *\n * Presentational only — the consumer supplies the draft text as `children`\n * and the action buttons (Insert / Regenerate / Shorter / …) as `actions`.\n * The card re-expands automatically whenever fresh `children` arrive (keyed\n * off `resetCollapseKey`) so a refined draft is never hidden behind a stale\n * collapsed state.\n *\n * <AiDraftCard\n * state=\"ready\"\n * contextLine=\"Replying to Jane\"\n * subject=\"Re: Your 2024 return\"\n * resetCollapseKey={draftText}\n * actions={<><Button size=\"sm\">Insert</Button>…</>}\n * >\n * <p className=\"whitespace-pre-wrap\">{draftText}</p>\n * </AiDraftCard>\n *\n * @since 1.5.0\n */\n\nexport type AiDraftState = \"loading\" | \"refining\" | \"error\" | \"ready\";\n\nexport interface AiDraftCardProps {\n /** Which visual state to render. */\n state: AiDraftState;\n /** Header title. Default: `\"AI Draft\"`. */\n title?: string;\n /** Optional muted context line in the header (e.g. \"Replying to Jane\"). */\n contextLine?: ReactNode;\n /** Optional bold subject line shown above the body (email drafts). */\n subject?: ReactNode;\n /** The draft body — typically a `<p className=\"whitespace-pre-wrap\">`. */\n children?: ReactNode;\n /** Footer action buttons (Insert / Regenerate / Discard …). */\n actions?: ReactNode;\n /** Error message — shown when `state=\"error\"`. */\n error?: ReactNode;\n /** Retry handler — adds a Retry button to the error panel. */\n onRetry?: () => void;\n /** Dismiss handler for the error panel. */\n onDismiss?: () => void;\n /** Re-expands the card whenever this value changes (pass the draft text so\n * a freshly generated/refined draft is always revealed). */\n resetCollapseKey?: unknown;\n className?: string;\n}\n\n/**\n * @deprecated Frozen in `/legacy` (W8-09): no known consumer, no feature work.\n * Owner: PRO communications, which decides to adopt, contribute or release\n * the name. Never removed before 3.0.\n */\nexport function AiDraftCard({\n state,\n title = \"AI Draft\",\n contextLine,\n subject,\n children,\n actions,\n error,\n onRetry,\n onDismiss,\n resetCollapseKey,\n className,\n}: AiDraftCardProps) {\n const [collapsed, setCollapsed] = useState(false);\n // Re-expand when a fresh/refined draft arrives (adjust-state-during-render).\n const [prevKey, setPrevKey] = useState(resetCollapseKey);\n if (resetCollapseKey !== prevKey) {\n setPrevKey(resetCollapseKey);\n setCollapsed(false);\n }\n\n if (state === \"loading\" || state === \"refining\") {\n const duration = state === \"loading\" ? \"1200ms\" : \"800ms\";\n return (\n <div className={cn(\"ds-ai-surface ds:rounded-lg ds:p-3\", className)}>\n <div className=\"ds:flex ds:items-center ds:gap-2 ds:pb-2\">\n <SparkleIcon size={14} className=\"animate-pulse-soft ds:text-brand\" />\n <span className=\"ds:text-xs ds:font-semibold ds:text-brand\">\n {state === \"loading\" ? \"Generating draft...\" : \"Refining...\"}\n </span>\n </div>\n <div className=\"ds:space-y-2\">\n {[90, 100, 75, 60].map((width, i) => (\n <div\n key={i}\n className=\"ds:h-3 animate-pulse-soft ds:rounded ds:bg-brand/20\"\n style={{ width: `${width}%`, animationDuration: duration }}\n />\n ))}\n </div>\n </div>\n );\n }\n\n if (state === \"error\") {\n return (\n <div className={cn(\"ds:rounded-lg ds:border ds:border-danger-line ds:bg-danger-bg ds:p-3\", className)}>\n <p className=\"ds:text-xs ds:text-danger-fg\">{error ?? \"Something went wrong.\"}</p>\n {(onRetry || onDismiss) && (\n <div className=\"ds:mt-2 ds:flex ds:gap-2\">\n {onRetry && (\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={onRetry} className=\"ds:text-danger-fg\">\n Retry\n </Button>\n )}\n {onDismiss && (\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={onDismiss}>\n Dismiss\n </Button>\n )}\n </div>\n )}\n </div>\n );\n }\n\n // state === \"ready\"\n return (\n <div className={cn(\"ds-ai-surface ds:rounded-lg ds:p-3\", className)}>\n <div className={cn(\"ds:flex ds:items-center ds:gap-2\", !collapsed && \"ds:mb-2\")}>\n <SparkleIcon size={14} className=\"ds:text-brand\" />\n <span className=\"ds:text-xs ds:font-bold ds:text-brand\">{title}</span>\n {contextLine && <span className=\"ds:truncate ds:text-xs ds:text-fg-3\">{contextLine}</span>}\n <button\n type=\"button\"\n onClick={() => setCollapsed((c) => !c)}\n aria-expanded={!collapsed}\n aria-label={collapsed ? \"Expand AI draft\" : \"Collapse AI draft\"}\n title={collapsed ? \"Show draft\" : \"Hide draft\"}\n className=\"ds:ml-auto ds:-mr-1 ds:shrink-0 ds:rounded ds:p-1 ds:text-brand/70 ds:transition-colors ds:hover:bg-brand-bg ds:hover:text-brand ds:focus-visible:[box-shadow:var(--shadow-focus-ring)] ds:focus-visible:outline-none ds:motion-reduce:transition-none\"\n >\n <ChevronDownIcon size={16} className={cn(\"ds:transition-transform ds:motion-reduce:transition-none\", collapsed && \"ds:-rotate-90\")} />\n </button>\n </div>\n\n {!collapsed && (\n <>\n {subject && <p className=\"ds:mb-1.5 ds:text-sm ds:font-semibold ds:text-fg\">{subject}</p>}\n <div\n role=\"region\"\n aria-label={`${title} content`}\n // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex -- Keyboard focus is required for scrollable regions in Safari.\n tabIndex={0}\n className=\"ds:max-h-[140px] ds:overflow-y-auto ds:text-sm ds:font-medium ds:leading-relaxed ds:text-fg ds:focus-visible:[box-shadow:var(--shadow-focus-ring)] ds:focus-visible:outline-none\"\n >\n {children}\n </div>\n {actions && <div className=\"ds:mt-3 ds:flex ds:flex-wrap ds:items-center ds:gap-2\">{actions}</div>}\n </>\n )}\n </div>\n );\n}\nAiDraftCard.displayName = \"AiDraftCard\";\n","\"use client\";\n\nimport { useEffect, useRef, useState, type ReactNode } from \"react\";\n\nimport { ChevronDownIcon, MailIcon } from \"../primitives/icons\";\nimport { cn } from \"../lib/cn\";\n\n/**\n * EmailMessageCard — renders an email message as an envelope-style card\n * (header strip / readable body / footer) inside a conversation thread,\n * replacing the \"rich HTML stuffed into a chat bubble\" anti-pattern.\n *\n * Anatomy:\n * - a meta line (\"Name via Email · 3:42 PM\") above the card,\n * - a tinted header strip with a mail glyph, the \"EMAIL\" eyebrow, the\n * subject, a \"From …\" / optional \"Cc N\" sub-line, and the time,\n * - a readable body (`children`) that auto-clamps past `clampHeight` with a\n * gradient fade and a \"Show full email\" toggle,\n * - an optional footer carrying `attachments`, a `status` slot, and\n * `actions` (e.g. a Reply button).\n *\n * Presentational only. The consumer sanitises and renders the email HTML as\n * `children`, supplies the avatar, and brings its own attachment chips /\n * status indicator / Reply control via slots. Direction flips the layout:\n * outbound aligns right with a brand-tinted border; inbound aligns left.\n *\n * <EmailMessageCard\n * direction=\"inbound\"\n * senderName=\"Jane Cooper\"\n * subject=\"Question about my W-2\"\n * time=\"3:42 PM\"\n * avatar={<Avatar name=\"Jane Cooper\" size=\"xs\" />}\n * ccCount={2}\n * attachments={<AttachmentChip … />}\n * actions={<Button size=\"sm\" variant=\"outline\">Reply</Button>}\n * >\n * <div dangerouslySetInnerHTML={{ __html: safeHtml }} />\n * </EmailMessageCard>\n *\n * @since 1.5.0\n */\n\nexport interface EmailMessageCardProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"children\"> {\n /** Message direction — flips alignment and border treatment. */\n direction: \"inbound\" | \"outbound\";\n /** Sender display name. */\n senderName: string;\n /** Email subject — omitted for replies without one. */\n subject?: string;\n /** Pre-formatted send time (e.g. \"3:42 PM\"). */\n time: string;\n /** Channel label in the meta line. Default: `\"Email\"`. */\n via?: string;\n /** Avatar node — rendered for inbound messages only. */\n avatar?: ReactNode;\n /** Cc recipient count — shows a \"Cc N\" indicator when > 0. */\n ccCount?: number;\n /** Sanitised email body (HTML node or plain text). */\n children: ReactNode;\n /** Footer attachment chips. */\n attachments?: ReactNode;\n /** Footer status slot (delivery state). */\n status?: ReactNode;\n /** Footer actions (e.g. Reply). */\n actions?: ReactNode;\n /** Body height (px) above which the clamp/expand toggle appears. Default 240. */\n clampHeight?: number;\n}\n\n/**\n * @deprecated Frozen in `/legacy` (W8-09): no known consumer, no feature work.\n * Owner: PRO communications, which decides to adopt, contribute or release\n * the name. Never removed before 3.0.\n */\nexport function EmailMessageCard({\n direction,\n senderName,\n subject,\n time,\n via = \"Email\",\n avatar,\n ccCount = 0,\n children,\n attachments,\n status,\n actions,\n clampHeight = 240,\n className,\n ...props\n}: EmailMessageCardProps) {\n const isOutbound = direction === \"outbound\";\n const subjectText = subject?.trim();\n\n const bodyRef = useRef<HTMLDivElement>(null);\n const [needsClamp, setNeedsClamp] = useState(false);\n const [expanded, setExpanded] = useState(false);\n useEffect(() => {\n const el = bodyRef.current;\n if (el) setNeedsClamp(el.scrollHeight > clampHeight);\n }, [children, clampHeight]);\n\n const clamped = needsClamp && !expanded;\n const hasFooter = Boolean(attachments || status || actions);\n\n return (\n <div\n className={cn(\"ds:group ds:flex ds:gap-2\", isOutbound ? \"ds:flex-row-reverse\" : \"ds:flex-row\", className)}\n {...props}\n >\n {!isOutbound && avatar && <span className=\"ds:mt-7 ds:shrink-0\">{avatar}</span>}\n\n <div className={cn(\"ds:flex ds:min-w-0 ds:flex-col ds:gap-1\", isOutbound ? \"ds:items-end\" : \"ds:items-start\")}>\n {/* Meta line */}\n <div className=\"ds:flex ds:items-center ds:gap-1.5 ds:px-1\">\n <span className=\"ds:text-xs ds:font-medium ds:text-fg\">{senderName}</span>\n <span className=\"ds:text-[10px] ds:text-fg-3\">via {via}</span>\n <span className=\"ds:text-[10px] ds:text-fg-3\">·</span>\n <span className=\"ds:text-[10px] ds:text-fg-3\">{time}</span>\n </div>\n\n {/* Envelope card */}\n <div\n className={cn(\n \"ds:w-full ds:max-w-2xl ds:overflow-hidden ds:rounded-xl ds:border ds:bg-surface ds:shadow-flat\",\n isOutbound ? \"ds:border-brand/30\" : \"ds:border-rule\",\n )}\n >\n {/* Header strip */}\n <div className=\"ds:flex ds:items-start ds:gap-2.5 ds:border-b ds:border-rule ds:bg-brand-bg ds:px-3.5 ds:py-2.5\">\n <span className=\"ds:flex ds:size-8 ds:shrink-0 ds:items-center ds:justify-center ds:rounded-lg ds:border ds:border-brand/20 ds:bg-brand/10 ds:text-brand\">\n <MailIcon size={16} />\n </span>\n <div className=\"ds:min-w-0 ds:flex-1\">\n <div className=\"ds:flex ds:items-center ds:gap-2\">\n <span className=\"ds:shrink-0 ds:rounded ds:px-1.5 ds:py-px ds:text-[10px] ds:font-bold ds:uppercase ds:tracking-wider ds:text-brand\">\n Email\n </span>\n {subjectText && (\n <span className=\"ds:min-w-0 ds:truncate ds:text-sm ds:font-semibold ds:text-fg\">{subjectText}</span>\n )}\n </div>\n <div className=\"ds:mt-0.5 ds:flex ds:flex-wrap ds:items-center ds:gap-1.5 ds:text-[10px] ds:text-fg-3\">\n <span>\n From <span className=\"ds:font-medium ds:text-fg/80\">{senderName}</span>\n </span>\n {ccCount > 0 && (\n <>\n <span className=\"ds:text-fg-3/60\">·</span>\n <span>Cc {ccCount}</span>\n </>\n )}\n </div>\n </div>\n <span className=\"ds:shrink-0 ds:whitespace-nowrap ds:pt-0.5 ds:text-[10px] ds:text-fg-3\">{time}</span>\n </div>\n\n {/* Body */}\n <div className=\"ds:relative\">\n <div\n ref={bodyRef}\n className={cn(\n \"ds:px-4 ds:py-3 ds:text-sm ds:leading-relaxed ds:text-fg\",\n clamped && \"ds:max-h-56 ds:overflow-hidden\",\n )}\n >\n {children}\n </div>\n {clamped && (\n <div className=\"ds:pointer-events-none ds:absolute ds:inset-x-0 ds:bottom-0 ds:h-14 ds:bg-gradient-to-b ds:from-transparent ds:to-surface\" />\n )}\n </div>\n\n {/* Show full email toggle */}\n {needsClamp && (\n <button\n type=\"button\"\n onClick={() => setExpanded((v) => !v)}\n aria-expanded={expanded}\n className=\"ds:flex ds:w-full ds:items-center ds:justify-center ds:gap-1.5 ds:border-t ds:border-rule/60 ds:bg-surface ds:py-1.5 ds:text-xs ds:font-medium ds:text-brand ds:transition-colors ds:hover:bg-surface-hover/40 ds:motion-reduce:transition-none\"\n >\n {expanded ? \"Show less\" : \"Show full email\"}\n <ChevronDownIcon size={13} className={cn(\"ds:transition-transform ds:motion-reduce:transition-none\", expanded && \"ds:rotate-180\")} />\n </button>\n )}\n\n {/* Footer */}\n {hasFooter && (\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:justify-between ds:gap-2 ds:border-t ds:border-rule ds:bg-bg-2/30 ds:px-3 ds:py-2\">\n <div className=\"ds:min-w-0\">{attachments}</div>\n <div className=\"ds:ml-auto ds:flex ds:items-center ds:gap-2\">\n {status}\n {actions}\n </div>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\nEmailMessageCard.displayName = \"EmailMessageCard\";\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\n\nimport { Button } from \"../primitives/button\";\nimport { UploadIcon } from \"../primitives/icons\";\nimport { cn } from \"../lib/cn\";\n\n/**\n * SignatureEditor — the panel chrome for editing a personal email signature\n * (rich text, links, and an inline banner image). Designed to live inside a\n * Popover anchored to a \"Pen\" affordance in the email composer, but it's just\n * a self-contained card so it works in a Dialog or settings page too.\n *\n * Like `MessageComposer`, DS owns the CHROME and the consumer owns the\n * EDITOR: pass your rich-text editor (Tiptap, contenteditable, etc.) as\n * `children`. The panel supplies the titled header with an \"Add image\"\n * action, a body region (with a loading skeleton), and a Save / Insert\n * footer. All actions are slots/handlers — persistence, image upload, and\n * insertion logic stay with the consumer.\n *\n * <Popover>\n * <PopoverContent className=\"w-96 p-0\">\n * <SignatureEditor\n * loading={loading}\n * addingImage={uploading}\n * onAddImage={pickImage}\n * saving={saving}\n * onSave={save}\n * onInsert={insert}\n * >\n * <RichTextEditor ref={editorRef} />\n * </SignatureEditor>\n * </PopoverContent>\n * </Popover>\n *\n * @since 1.5.0\n */\n\nexport interface SignatureEditorProps {\n /** Panel title. Default: `\"Email signature\"`. */\n title?: string;\n /** The editor — a rich-text input the consumer owns. */\n children: ReactNode;\n /** Show a loading skeleton in place of the editor (while the saved\n * signature is being fetched). */\n loading?: boolean;\n /** \"Add image\" handler — hides the button when omitted. */\n onAddImage?: () => void;\n /** Spinner + disabled state on the \"Add image\" button while uploading. */\n addingImage?: boolean;\n /** Save handler — hides the Save button when omitted. */\n onSave?: () => void;\n /** Spinner + disabled state on Save. */\n saving?: boolean;\n /** Insert handler — hides the Insert button when omitted. */\n onInsert?: () => void;\n className?: string;\n}\n\n/**\n * @deprecated Frozen in `/legacy` (W8-09): no known consumer, no feature work.\n * Owner: PRO communications, which decides to adopt, contribute or release\n * the name. Never removed before 3.0.\n */\nexport function SignatureEditor({\n title = \"Email signature\",\n children,\n loading = false,\n onAddImage,\n addingImage = false,\n onSave,\n saving = false,\n onInsert,\n className,\n}: SignatureEditorProps) {\n return (\n <div className={cn(\"ds:flex ds:flex-col\", className)}>\n {/* Header */}\n <div className=\"ds:flex ds:items-center ds:justify-between ds:border-b ds:border-rule ds:px-3 ds:py-2\">\n <p className=\"ds:text-xs ds:font-semibold ds:text-fg\">{title}</p>\n {onAddImage && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"ds:h-7 ds:gap-1.5 ds:text-xs\"\n disabled={addingImage || loading}\n loading={addingImage}\n onClick={onAddImage}\n >\n <UploadIcon size={13} />\n Add image\n </Button>\n )}\n </div>\n\n {/* Body */}\n <div className=\"ds:p-3\">\n {loading ? <div className=\"ds:h-32 ds:animate-pulse ds:rounded-md ds:bg-bg-2 ds:motion-reduce:animate-none\" /> : children}\n </div>\n\n {/* Footer */}\n {(onSave || onInsert) && (\n <div className=\"ds:flex ds:items-center ds:justify-end ds:gap-2 ds:border-t ds:border-rule ds:px-3 ds:py-2\">\n {onSave && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n disabled={saving || loading}\n loading={saving}\n onClick={onSave}\n >\n Save\n </Button>\n )}\n {onInsert && (\n <Button type=\"button\" size=\"sm\" disabled={loading} onClick={onInsert}>\n Insert\n </Button>\n )}\n </div>\n )}\n </div>\n );\n}\nSignatureEditor.displayName = \"SignatureEditor\";\n"]}
|