@arbidocs/blocks 0.4.32 → 0.4.33

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.
Files changed (179) hide show
  1. package/dist/agents/index.cjs +257 -215
  2. package/dist/agents/index.js +8 -6
  3. package/dist/agents/tasks/ConversationListView.d.ts +58 -0
  4. package/dist/agents/tasks/ConversationTurnSpeaker.d.ts +16 -0
  5. package/dist/agents/tasks/NewThreadDialog.d.ts +1 -1
  6. package/dist/agents/tasks/TaskActivityTimeline.d.ts +1 -1
  7. package/dist/agents/tasks/TaskFlow.d.ts +22 -0
  8. package/dist/agents/tasks/TaskInbox.d.ts +26 -0
  9. package/dist/agents/tasks/TaskReviewDialog.d.ts +22 -0
  10. package/dist/agents/tasks/TaskRowMenu.d.ts +10 -2
  11. package/dist/agents/tasks/TaskRunsDialog.d.ts +8 -3
  12. package/dist/agents/tasks/TaskStartDialog.d.ts +24 -0
  13. package/dist/agents/tasks/TaskTable.d.ts +1 -1
  14. package/dist/agents/tasks/ThreadNotifyDialog.d.ts +11 -0
  15. package/dist/agents/tasks/WorkflowComposer.d.ts +1 -1
  16. package/dist/agents/tasks/WorkflowsTable.d.ts +7 -0
  17. package/dist/agents/tasks/compact-thread-activity.d.ts +8 -0
  18. package/dist/agents/tasks/index.d.ts +10 -0
  19. package/dist/agents/tasks/taskComposerTypes.d.ts +16 -1
  20. package/dist/agents/tasks/taskRequest.d.ts +1 -0
  21. package/dist/agents/tasks/testGrid.d.ts +24 -0
  22. package/dist/agents/tasks/workflowColumns.d.ts +2 -1
  23. package/dist/agents/tasks/workflowRows.d.ts +6 -0
  24. package/dist/agents/workflows/types.d.ts +2 -0
  25. package/dist/auth/index.cjs +27 -27
  26. package/dist/auth/index.js +1 -1
  27. package/dist/chat/Message.d.ts +8 -2
  28. package/dist/chat/index.cjs +132 -120
  29. package/dist/chat/index.d.ts +2 -0
  30. package/dist/chat/index.js +2 -2
  31. package/dist/chat/participant-tints.d.ts +1 -0
  32. package/dist/chat/useRecipientDraft.d.ts +14 -0
  33. package/dist/{chunk-KF4EC5XU.js → chunk-24KQJYSB.js} +3 -3
  34. package/dist/{chunk-KF4EC5XU.js.map → chunk-24KQJYSB.js.map} +1 -1
  35. package/dist/{chunk-GVQOBJKR.cjs → chunk-2EAE5JP6.cjs} +7 -4
  36. package/dist/chunk-2EAE5JP6.cjs.map +1 -0
  37. package/dist/{chunk-S5HZBXZA.cjs → chunk-2QTT2RZE.cjs} +242 -2
  38. package/dist/chunk-2QTT2RZE.cjs.map +1 -0
  39. package/dist/chunk-3AFWGEDJ.cjs +53 -0
  40. package/dist/chunk-3AFWGEDJ.cjs.map +1 -0
  41. package/dist/{chunk-4XJZ6AAY.js → chunk-4AWS54US.js} +244 -6
  42. package/dist/chunk-4AWS54US.js.map +1 -0
  43. package/dist/{chunk-56BUD74K.cjs → chunk-65THHQVB.cjs} +27 -27
  44. package/dist/{chunk-56BUD74K.cjs.map → chunk-65THHQVB.cjs.map} +1 -1
  45. package/dist/{chunk-5B4PXAKI.cjs → chunk-6DNYPLCD.cjs} +21 -7
  46. package/dist/chunk-6DNYPLCD.cjs.map +1 -0
  47. package/dist/{chunk-TZ4QF7EP.js → chunk-6RXUMBTK.js} +1948 -594
  48. package/dist/chunk-6RXUMBTK.js.map +1 -0
  49. package/dist/{chunk-UTYQPVIW.cjs → chunk-7QDX2CO4.cjs} +6 -6
  50. package/dist/{chunk-UTYQPVIW.cjs.map → chunk-7QDX2CO4.cjs.map} +1 -1
  51. package/dist/{chunk-FRRDPYBR.cjs → chunk-AZ75JUIH.cjs} +74 -5
  52. package/dist/chunk-AZ75JUIH.cjs.map +1 -0
  53. package/dist/{chunk-NUPVHEJW.js → chunk-BUHKUKKB.js} +7 -4
  54. package/dist/chunk-BUHKUKKB.js.map +1 -0
  55. package/dist/chunk-C7FGONCM.js +124 -0
  56. package/dist/chunk-C7FGONCM.js.map +1 -0
  57. package/dist/{chunk-KXMDOTGW.js → chunk-DLBUFHLY.js} +10 -2
  58. package/dist/chunk-DLBUFHLY.js.map +1 -0
  59. package/dist/{chunk-ZHLMDJCO.cjs → chunk-DLVX6R6B.cjs} +62 -26
  60. package/dist/chunk-DLVX6R6B.cjs.map +1 -0
  61. package/dist/{chunk-JGZTRLKL.cjs → chunk-IA7RTPT3.cjs} +7 -4
  62. package/dist/chunk-IA7RTPT3.cjs.map +1 -0
  63. package/dist/{chunk-NJL4LIXX.js → chunk-LFGJAZ5H.js} +11 -8
  64. package/dist/chunk-LFGJAZ5H.js.map +1 -0
  65. package/dist/{chunk-IAKUTBPX.js → chunk-LYUO3E6V.js} +3 -3
  66. package/dist/{chunk-IAKUTBPX.js.map → chunk-LYUO3E6V.js.map} +1 -1
  67. package/dist/{chunk-EYPPB5CY.cjs → chunk-M2YGPC5N.cjs} +4 -4
  68. package/dist/{chunk-EYPPB5CY.cjs.map → chunk-M2YGPC5N.cjs.map} +1 -1
  69. package/dist/{chunk-5ZBP7TCD.cjs → chunk-MJCCBMM5.cjs} +10 -2
  70. package/dist/chunk-MJCCBMM5.cjs.map +1 -0
  71. package/dist/chunk-MZL67U2E.cjs +128 -0
  72. package/dist/chunk-MZL67U2E.cjs.map +1 -0
  73. package/dist/{chunk-OJSWQM4G.js → chunk-OZJ5PXA6.js} +29 -4
  74. package/dist/chunk-OZJ5PXA6.js.map +1 -0
  75. package/dist/{chunk-UBNVIIBT.js → chunk-PXFJDX2C.js} +21 -7
  76. package/dist/chunk-PXFJDX2C.js.map +1 -0
  77. package/dist/{chunk-RGHQFJOL.cjs → chunk-QFUF4A4J.cjs} +28 -2
  78. package/dist/chunk-QFUF4A4J.cjs.map +1 -0
  79. package/dist/chunk-RFXJYIDV.js +50 -0
  80. package/dist/chunk-RFXJYIDV.js.map +1 -0
  81. package/dist/{chunk-PLGVMLBD.cjs → chunk-SEQWI6E4.cjs} +1975 -610
  82. package/dist/chunk-SEQWI6E4.cjs.map +1 -0
  83. package/dist/{chunk-QN42OA5J.js → chunk-SFXVNFES.js} +4 -4
  84. package/dist/chunk-SFXVNFES.js.map +1 -0
  85. package/dist/{chunk-3NZR6PAG.js → chunk-V6U5KVAR.js} +70 -4
  86. package/dist/chunk-V6U5KVAR.js.map +1 -0
  87. package/dist/{chunk-YVIOCITQ.cjs → chunk-VUEZARW5.cjs} +3 -3
  88. package/dist/chunk-VUEZARW5.cjs.map +1 -0
  89. package/dist/{chunk-JLOYWXRB.js → chunk-VZGBCBYB.js} +3 -3
  90. package/dist/chunk-VZGBCBYB.js.map +1 -0
  91. package/dist/{chunk-ZVPTFTGV.cjs → chunk-WBDK4PIA.cjs} +11 -8
  92. package/dist/chunk-WBDK4PIA.cjs.map +1 -0
  93. package/dist/{chunk-ZORQ5M3W.cjs → chunk-WQFGG2BV.cjs} +4 -4
  94. package/dist/chunk-WQFGG2BV.cjs.map +1 -0
  95. package/dist/{chunk-C75S6USL.js → chunk-WYVCXY7R.js} +7 -4
  96. package/dist/chunk-WYVCXY7R.js.map +1 -0
  97. package/dist/{chunk-WSJVHSGN.js → chunk-XWEJ5LV2.js} +63 -27
  98. package/dist/chunk-XWEJ5LV2.js.map +1 -0
  99. package/dist/{chunk-YMHGF6R5.js → chunk-ZCF2JJFA.js} +3 -3
  100. package/dist/{chunk-YMHGF6R5.js.map → chunk-ZCF2JJFA.js.map} +1 -1
  101. package/dist/collaboration/index.cjs +45 -41
  102. package/dist/collaboration/index.js +1 -1
  103. package/dist/collaboration/mail/MailMessagePreview.d.ts +11 -0
  104. package/dist/collaboration/mail/index.d.ts +1 -0
  105. package/dist/connect/index.cjs +33 -33
  106. package/dist/connect/index.js +4 -4
  107. package/dist/facts/FactsFilterInput.d.ts +2 -46
  108. package/dist/facts/FactsToolbar.d.ts +5 -5
  109. package/dist/facts/index.cjs +27 -124
  110. package/dist/facts/index.cjs.map +1 -1
  111. package/dist/facts/index.js +13 -118
  112. package/dist/facts/index.js.map +1 -1
  113. package/dist/files/FilesPage.d.ts +1 -1
  114. package/dist/files/FilesToolbar.d.ts +1 -1
  115. package/dist/files/FolderPicker.d.ts +2 -1
  116. package/dist/files/ViewerChrome.d.ts +1 -1
  117. package/dist/files/bulk/FolderFilterButton.d.ts +3 -2
  118. package/dist/files/cells/BulkLabelSelect.d.ts +11 -0
  119. package/dist/files/cells/LabelMultiSelect.d.ts +2 -1
  120. package/dist/files/cells/index.d.ts +1 -0
  121. package/dist/files/index.cjs +109 -166
  122. package/dist/files/index.cjs.map +1 -1
  123. package/dist/files/index.js +95 -158
  124. package/dist/files/index.js.map +1 -1
  125. package/dist/home/index.cjs +19 -19
  126. package/dist/home/index.cjs.map +1 -1
  127. package/dist/home/index.js +4 -4
  128. package/dist/home/index.js.map +1 -1
  129. package/dist/index.cjs +787 -764
  130. package/dist/index.cjs.map +1 -1
  131. package/dist/index.d.ts +1 -0
  132. package/dist/index.js +21 -69
  133. package/dist/index.js.map +1 -1
  134. package/dist/settings/SettingsPanel.d.ts +1 -1
  135. package/dist/settings/index.cjs +55 -280
  136. package/dist/settings/index.cjs.map +1 -1
  137. package/dist/settings/index.js +17 -248
  138. package/dist/settings/index.js.map +1 -1
  139. package/dist/shell/FilterInput.d.ts +46 -0
  140. package/dist/shell/TabHeader.d.ts +5 -1
  141. package/dist/shell/index.cjs +61 -48
  142. package/dist/shell/index.d.ts +1 -0
  143. package/dist/shell/index.js +3 -2
  144. package/dist/site/index.cjs +62 -62
  145. package/dist/site/index.js +2 -2
  146. package/dist/studio/index.cjs +74 -74
  147. package/dist/studio/index.js +5 -5
  148. package/dist/workspaces/WorkspaceCard.d.ts +2 -2
  149. package/dist/workspaces/index.cjs +9 -2
  150. package/dist/workspaces/index.cjs.map +1 -1
  151. package/dist/workspaces/index.js +9 -2
  152. package/dist/workspaces/index.js.map +1 -1
  153. package/package.json +3 -3
  154. package/src/blocks.css +4 -0
  155. package/src/components/grid.css +10 -0
  156. package/dist/chunk-3NZR6PAG.js.map +0 -1
  157. package/dist/chunk-4XJZ6AAY.js.map +0 -1
  158. package/dist/chunk-5B4PXAKI.cjs.map +0 -1
  159. package/dist/chunk-5ZBP7TCD.cjs.map +0 -1
  160. package/dist/chunk-C75S6USL.js.map +0 -1
  161. package/dist/chunk-FRRDPYBR.cjs.map +0 -1
  162. package/dist/chunk-GVQOBJKR.cjs.map +0 -1
  163. package/dist/chunk-JGZTRLKL.cjs.map +0 -1
  164. package/dist/chunk-JLOYWXRB.js.map +0 -1
  165. package/dist/chunk-KXMDOTGW.js.map +0 -1
  166. package/dist/chunk-NJL4LIXX.js.map +0 -1
  167. package/dist/chunk-NUPVHEJW.js.map +0 -1
  168. package/dist/chunk-OJSWQM4G.js.map +0 -1
  169. package/dist/chunk-PLGVMLBD.cjs.map +0 -1
  170. package/dist/chunk-QN42OA5J.js.map +0 -1
  171. package/dist/chunk-RGHQFJOL.cjs.map +0 -1
  172. package/dist/chunk-S5HZBXZA.cjs.map +0 -1
  173. package/dist/chunk-TZ4QF7EP.js.map +0 -1
  174. package/dist/chunk-UBNVIIBT.js.map +0 -1
  175. package/dist/chunk-WSJVHSGN.js.map +0 -1
  176. package/dist/chunk-YVIOCITQ.cjs.map +0 -1
  177. package/dist/chunk-ZHLMDJCO.cjs.map +0 -1
  178. package/dist/chunk-ZORQ5M3W.cjs.map +0 -1
  179. package/dist/chunk-ZVPTFTGV.cjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/CollectionDetail.tsx","../src/components/Chart.tsx","../src/components/editorial/Eyebrow.tsx","../src/components/editorial/EditorialHeading.tsx","../src/components/editorial/EditorialHero.tsx","../src/components/editorial/EditorialSection.tsx","../src/components/editorial/lists.tsx","../src/components/editorial/Reveal.tsx","../src/components/editorial/PanelGrid.tsx","../src/components/editorial/PullQuote.tsx","../src/components/editorial/ArticleList.tsx","../src/components/editorial/Bands.tsx"],"names":["jsx","Fragment","useMemo","jsxs","cn","useEditorialTone","formatIndex","EditorialToneContext","Check","useRef","useState","useEffect","ArrowUpRight","BlockLink","COLS","BlockImage"],"mappings":"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","file":"chunk-56BUD74K.cjs","sourcesContent":["import type { ReactNode } from 'react'\n\nexport interface CollectionDetailContext<T> {\n previous?: T\n next?: T\n}\n\nexport interface CollectionDetailProps<T> {\n /** The collection, supplied by the host (CMS, files, API...). */\n items: T[]\n /** The slug from the host's route. Absent: the list is rendered. */\n slug?: string\n getSlug: (item: T) => string\n renderList: (items: T[]) => ReactNode\n /** One item's page. `previous` / `next` are the neighbours in `items` order. */\n renderDetail: (item: T, context: CollectionDetailContext<T>) => ReactNode\n /** Shown when `slug` matches nothing. */\n renderNotFound?: (slug: string) => ReactNode\n}\n\n/**\n * The list-and-detail page contract for a collection (people, articles, services...). It owns\n * only the slug lookup; the host owns the route, the data and every pixel of both views, so one\n * route (`/things/:slug?`) serves the list and each detail page.\n */\nexport function CollectionDetail<T>({\n items,\n slug,\n getSlug,\n renderList,\n renderDetail,\n renderNotFound,\n}: CollectionDetailProps<T>) {\n if (!slug) return <>{renderList(items)}</>\n const index = items.findIndex((item) => getSlug(item) === slug)\n if (index === -1) {\n return (\n <>\n {renderNotFound ? (\n renderNotFound(slug)\n ) : (\n <p role=\"status\" data-slot=\"collection-not-found\">\n Not found\n </p>\n )}\n </>\n )\n }\n return <>{renderDetail(items[index], { previous: items[index - 1], next: items[index + 1] })}</>\n}\n","import { useMemo } from 'react'\nimport { cn } from '@arbidocs/react/ui'\n\nexport interface ChartSeries {\n key: string\n /** Legend text (defaults to `key`). */\n label?: string\n /** One value per entry of `labels`. */\n values: number[]\n}\n\nexport interface ChartProps {\n type: 'bar' | 'line' | 'pie'\n /** Category (x) labels. For `pie` they name the slices of the first series. */\n labels: string[]\n series: ChartSeries[]\n /** Accessible description of the whole chart. */\n ariaLabel: string\n /** Formats values in axis ticks and slice titles. */\n formatValue?: (value: number) => string\n /** Hide the legend. */\n hideLegend?: boolean\n emptyLabel?: string\n /**\n * Longest category label drawn on the x axis, in characters; longer labels are cut with an\n * ellipsis and carry the full text as a `<title>`. Default: what fits the band (about 5px a\n * character), at least 3.\n */\n maxLabelChars?: number\n className?: string\n testId?: string\n}\n\nconst W = 440\nconst H = 160\nconst PAD = { top: 8, right: 8, bottom: 22, left: 40 }\n\n/** Series colours come from the `--chart-1..5` theme tokens, so charts follow the host theme. */\nconst color = (i: number) => `hsl(var(--chart-${(i % 5) + 1}))`\n\n/** Cut `label` to `max` characters with an ellipsis (the full text stays in a `<title>`). */\nexport function truncateLabel(label: string, max: number): string {\n const chars = Array.from(label)\n return chars.length <= max\n ? label\n : `${chars\n .slice(0, Math.max(1, max - 1))\n .join('')\n .trimEnd()}…`\n}\n\nconst defaultFormat = (v: number) => (v >= 1000 ? `${Math.round(v / 100) / 10}k` : String(v))\n\nfunction polar(cx: number, cy: number, r: number, angle: number): [number, number] {\n return [cx + r * Math.sin(angle), cy - r * Math.cos(angle)]\n}\n\n/**\n * Data-bound bar, line or pie chart in plain SVG. No chart library: it renders from props,\n * is themed by tokens and carries a text alternative (`ariaLabel`, slice and bar `<title>`s).\n */\nexport function Chart({\n type,\n labels,\n series,\n ariaLabel,\n formatValue = defaultFormat,\n hideLegend = false,\n emptyLabel = 'No data',\n maxLabelChars,\n className,\n testId,\n}: ChartProps) {\n const max = useMemo(() => Math.max(...series.flatMap((s) => s.values), 1), [series])\n if (!labels.length || !series.length) {\n return <p className=\"text-sm text-muted-foreground\">{emptyLabel}</p>\n }\n\n const legendItems =\n type === 'pie'\n ? labels.map((label, i) => ({ label, color: color(i) }))\n : series.map((s, i) => ({ label: s.label ?? s.key, color: color(i) }))\n\n let body\n if (type === 'pie') {\n const values = series[0].values\n const total = values.reduce((a, b) => a + Math.max(b, 0), 0)\n const cx = 80\n const cy = 80\n const r = 72\n let angle = 0\n body = (\n <svg viewBox=\"0 0 160 160\" className=\"mx-auto h-40 w-40\" role=\"img\" aria-label={ariaLabel}>\n {total > 0 &&\n values.map((v, i) => {\n const sweep = (Math.max(v, 0) / total) * Math.PI * 2\n if (sweep === 0) return null\n const title = `${labels[i]}: ${formatValue(v)}`\n if (sweep >= Math.PI * 2 - 1e-6) {\n return (\n <circle key={i} cx={cx} cy={cy} r={r} fill={color(i)}>\n <title>{title}</title>\n </circle>\n )\n }\n const [x1, y1] = polar(cx, cy, r, angle)\n const [x2, y2] = polar(cx, cy, r, angle + sweep)\n const d = `M${cx},${cy} L${x1},${y1} A${r},${r} 0 ${sweep > Math.PI ? 1 : 0} 1 ${x2},${y2} Z`\n angle += sweep\n return (\n <path key={i} d={d} fill={color(i)}>\n <title>{title}</title>\n </path>\n )\n })}\n </svg>\n )\n } else {\n const plotW = W - PAD.left - PAD.right\n const plotH = H - PAD.top - PAD.bottom\n const y = (v: number) => PAD.top + plotH - (v / max) * plotH\n const band = plotW / labels.length\n const xCenter = (i: number) => PAD.left + band * i + band / 2\n const maxChars = maxLabelChars ?? Math.max(3, Math.floor((band - 4) / 5))\n body = (\n <svg viewBox={`0 0 ${W} ${H}`} className=\"h-auto w-full\" role=\"img\" aria-label={ariaLabel}>\n {[0, max / 2, max].map((v) => (\n <g key={v}>\n <line\n x1={PAD.left}\n x2={W - PAD.right}\n y1={y(v)}\n y2={y(v)}\n className=\"stroke-border\"\n strokeDasharray=\"2,2\"\n />\n <text\n x={PAD.left - 4}\n y={y(v) + 3}\n textAnchor=\"end\"\n className=\"fill-muted-foreground text-[9px]\"\n >\n {formatValue(v)}\n </text>\n </g>\n ))}\n {labels.map((label, i) => (\n <text\n key={i}\n x={xCenter(i)}\n y={H - 6}\n textAnchor=\"middle\"\n className=\"fill-muted-foreground text-[9px]\"\n >\n {truncateLabel(label, maxChars)}\n {Array.from(label).length > maxChars && <title>{label}</title>}\n </text>\n ))}\n {type === 'bar' &&\n series.map((s, si) => {\n const barW = (band * 0.7) / series.length\n return s.values.map((v, i) => (\n <rect\n key={`${s.key}-${i}`}\n x={xCenter(i) - (band * 0.7) / 2 + si * barW}\n y={y(v)}\n width={barW}\n height={PAD.top + plotH - y(v)}\n fill={color(si)}\n rx={1.5}\n >\n <title>{`${labels[i]} ${s.label ?? s.key}: ${formatValue(v)}`}</title>\n </rect>\n ))\n })}\n {type === 'line' &&\n series.map((s, si) => (\n <g key={s.key}>\n <polyline\n fill=\"none\"\n stroke={color(si)}\n strokeWidth={2}\n points={s.values.map((v, i) => `${xCenter(i)},${y(v)}`).join(' ')}\n />\n {s.values.map((v, i) => (\n <circle key={i} cx={xCenter(i)} cy={y(v)} r={2.5} fill={color(si)}>\n <title>{`${labels[i]} ${s.label ?? s.key}: ${formatValue(v)}`}</title>\n </circle>\n ))}\n </g>\n ))}\n </svg>\n )\n }\n\n return (\n <figure\n className={cn('flex min-w-0 max-w-full flex-col gap-2', className)}\n data-slot=\"chart\"\n data-type={type}\n data-testid={testId}\n >\n {body}\n {!hideLegend && (\n <figcaption className=\"flex flex-wrap justify-center gap-x-4 gap-y-1 text-xs text-muted-foreground\">\n {legendItems.map((item) => (\n <span key={item.label} className=\"inline-flex items-center gap-1.5\">\n <span\n aria-hidden=\"true\"\n className=\"inline-block size-2 rounded-full\"\n style={{ background: item.color }}\n />\n {item.label}\n </span>\n ))}\n </figcaption>\n )}\n </figure>\n )\n}\n","import type { ReactNode } from 'react'\nimport { cn } from '@arbidocs/react/ui'\nimport { formatIndex, useEditorialTone, type EditorialTone } from './tone'\n\nexport interface EyebrowProps {\n children: ReactNode\n /** A number or label before the text: `1` renders `01`. */\n index?: number | string\n /** A short accent rule before the text. */\n rule?: boolean\n tone?: EditorialTone\n className?: string\n testId?: string\n}\n\n/** Small uppercase label above a heading: optional index and accent rule. */\nexport function Eyebrow({ children, index, rule = false, tone, className, testId }: EyebrowProps) {\n const t = useEditorialTone(tone)\n return (\n <p\n className={cn(\n 'flex items-center gap-3 text-xs font-semibold uppercase tracking-wider',\n t.subtle,\n className\n )}\n data-slot=\"eyebrow\"\n data-testid={testId}\n >\n {rule && <span aria-hidden=\"true\" className=\"h-px w-8 shrink-0 bg-primary\" />}\n {index !== undefined && (\n <span className={cn('tabular-nums', t.accent)}>{formatIndex(index)}</span>\n )}\n <span>{children}</span>\n </p>\n )\n}\n","import type { ReactNode } from 'react'\nimport { cn } from '@arbidocs/react/ui'\nimport { Eyebrow } from './Eyebrow'\nimport { useEditorialTone, type EditorialTone } from './tone'\n\nexport interface EditorialHeadingProps {\n eyebrow?: ReactNode\n /** Section number or label shown with the eyebrow. */\n index?: number | string\n title: ReactNode\n lead?: ReactNode\n /** Heading element level (default 2). */\n level?: 1 | 2 | 3\n align?: 'start' | 'center'\n tone?: EditorialTone\n className?: string\n testId?: string\n}\n\n/** Section heading: numbered or labelled eyebrow, display title and lead. */\nexport function EditorialHeading({\n eyebrow,\n index,\n title,\n lead,\n level = 2,\n align = 'start',\n tone,\n className,\n testId,\n}: EditorialHeadingProps) {\n const t = useEditorialTone(tone)\n const Heading = `h${level}` as 'h1' | 'h2' | 'h3'\n return (\n <div\n className={cn('max-w-3xl', align === 'center' && 'mx-auto text-center', className)}\n data-slot=\"editorial-heading\"\n data-testid={testId}\n >\n {(eyebrow || index !== undefined) && (\n <Eyebrow\n index={index}\n tone={tone}\n className={cn('mb-4', align === 'center' && 'justify-center')}\n >\n {eyebrow}\n </Eyebrow>\n )}\n <Heading\n className={cn(\n 'font-display text-3xl font-semibold tracking-tight text-balance sm:text-4xl',\n t.text\n )}\n >\n {title}\n </Heading>\n {lead && <p className={cn('mt-4 text-lg leading-relaxed', t.muted)}>{lead}</p>}\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport { cn } from '@arbidocs/react/ui'\nimport { Eyebrow } from './Eyebrow'\nimport { EditorialToneContext, useEditorialTone, type EditorialTone } from './tone'\n\nexport type EditorialSurface = 'plain' | 'muted' | 'inverse'\n\nexport interface EditorialHeroTestIds {\n root: string\n eyebrow: string\n title: string\n lede: string\n actions: string\n aside: string\n}\n\nexport interface EditorialHeroProps {\n eyebrow?: ReactNode\n /** Show the accent rule before the eyebrow. */\n eyebrowRule?: boolean\n /** The headline: text or any node. */\n title: ReactNode\n /** A phrase inside a string `title` set in the italic accent. */\n emphasis?: string\n /** The paragraph under the headline. */\n lede?: ReactNode\n /** Buttons or links under the lede. */\n actions?: ReactNode\n /** Anything under the actions (badges, a trust line). */\n footer?: ReactNode\n /** The figure beside (below on phones) the copy: an image frame, a card, a media slot. */\n aside?: ReactNode\n /** Decoration behind the copy (texture, wash, background image). Hidden from assistive tech. */\n backdrop?: ReactNode\n /** `start` copy, or `center` (no aside). */\n align?: 'start' | 'center'\n /** `page`: a page-opening header band. `cover`: the larger home-page hero. */\n size?: 'page' | 'cover'\n surface?: EditorialSurface\n className?: string\n testId?: string\n testIds?: Partial<EditorialHeroTestIds>\n}\n\nexport const SURFACE_CLASS: Record<EditorialSurface, string> = {\n plain: 'bg-background text-foreground',\n muted: 'bg-muted text-foreground',\n inverse: 'bg-foreground text-background',\n}\n\nexport const SURFACE_TONE: Record<EditorialSurface, EditorialTone> = {\n plain: 'default',\n muted: 'default',\n inverse: 'inverse',\n}\n\nfunction renderTitle(title: ReactNode, emphasis?: string): ReactNode {\n if (typeof title !== 'string' || !emphasis || !title.includes(emphasis)) return title\n const parts = title.split(emphasis)\n return parts.map((part, i) => (\n <span key={i}>\n {part}\n {i < parts.length - 1 && <em className=\"italic text-primary\">{emphasis}</em>}\n </span>\n ))\n}\n\n/**\n * Editorial opening band: eyebrow, display headline with an italic accent phrase, lede, actions\n * and an optional aside (image, card). Covers a page header (no aside, `size=\"page\"`), a split\n * hero (aside) and a centred landing hero (`align=\"center\"`, `size=\"cover\"`).\n */\nexport function EditorialHero({\n eyebrow,\n eyebrowRule = false,\n title,\n emphasis,\n lede,\n actions,\n footer,\n aside,\n backdrop,\n align = 'start',\n size = 'page',\n surface = 'plain',\n className,\n testId,\n testIds,\n}: EditorialHeroProps) {\n const tone = SURFACE_TONE[surface]\n const t = useEditorialTone(tone)\n const centered = align === 'center' && !aside\n const ids = {\n root: testIds?.root ?? testId,\n eyebrow: testIds?.eyebrow ?? (testId ? `${testId}-eyebrow` : undefined),\n title: testIds?.title ?? (testId ? `${testId}-title` : undefined),\n lede: testIds?.lede ?? (testId ? `${testId}-lede` : undefined),\n actions: testIds?.actions ?? (testId ? `${testId}-actions` : undefined),\n aside: testIds?.aside ?? (testId ? `${testId}-aside` : undefined),\n }\n return (\n <EditorialToneContext.Provider value={tone}>\n <section\n className={cn('relative isolate overflow-hidden', SURFACE_CLASS[surface], className)}\n data-slot=\"editorial-hero\"\n data-size={size}\n data-testid={ids.root}\n >\n {backdrop && (\n <div aria-hidden=\"true\" className=\"pointer-events-none absolute inset-0 -z-10\">\n {backdrop}\n </div>\n )}\n <div\n className={cn(\n 'mx-auto max-w-7xl px-5 lg:px-8',\n size === 'cover' ? 'py-16 lg:py-28' : 'py-14 lg:py-24',\n aside && 'grid items-center gap-12 lg:grid-cols-[1.02fr_0.98fr] lg:gap-14'\n )}\n >\n <div className={cn('max-w-3xl', centered && 'mx-auto text-center')}>\n {eyebrow && (\n <Eyebrow\n rule={eyebrowRule}\n tone={tone}\n className={cn('mb-6', centered && 'justify-center')}\n testId={ids.eyebrow}\n >\n {eyebrow}\n </Eyebrow>\n )}\n <h1\n className={cn(\n 'font-display font-semibold tracking-tight text-balance',\n size === 'cover'\n ? 'text-[2.6rem] leading-[1.03] sm:text-6xl lg:text-[4.4rem]'\n : 'text-4xl leading-[1.05] sm:text-5xl',\n t.text\n )}\n data-testid={ids.title}\n >\n {renderTitle(title, emphasis)}\n </h1>\n {lede && (\n <p\n className={cn(\n 'mt-6 max-w-2xl text-lg leading-relaxed',\n centered && 'mx-auto',\n t.muted\n )}\n data-testid={ids.lede}\n >\n {lede}\n </p>\n )}\n {actions && (\n <div\n className={cn(\n 'mt-8 flex flex-col gap-3 sm:flex-row',\n centered && 'sm:justify-center'\n )}\n data-testid={ids.actions}\n >\n {actions}\n </div>\n )}\n {footer && (\n <div className={cn('mt-8', centered && 'flex justify-center')}>{footer}</div>\n )}\n </div>\n {aside && (\n <div\n className=\"relative min-w-0\"\n data-slot=\"editorial-hero-aside\"\n data-testid={ids.aside}\n >\n {aside}\n </div>\n )}\n </div>\n </section>\n </EditorialToneContext.Provider>\n )\n}\n","import type { ReactNode } from 'react'\nimport { cn } from '@arbidocs/react/ui'\nimport { EditorialHeading } from './EditorialHeading'\nimport { SURFACE_CLASS, SURFACE_TONE, type EditorialSurface } from './EditorialHero'\nimport { EditorialToneContext, useEditorialTone } from './tone'\n\nexport interface EditorialSectionProps {\n id?: string\n eyebrow?: ReactNode\n /** Section number or label: `1` renders `01`. */\n index?: number | string\n title?: ReactNode\n lead?: ReactNode\n /** Sits beside the heading from `sm` up (a \"see all\" link or button). */\n action?: ReactNode\n /**\n * `stacked`: heading above the content. `split`: heading column beside the content from `lg`.\n * `split-wide`: the same with a wider content column.\n */\n layout?: 'stacked' | 'split' | 'split-wide'\n /** `plain`, `muted` (tinted band) or `inverse` (dark band on a light theme). */\n surface?: EditorialSurface\n /** Hairline above and below the band. */\n bordered?: boolean\n /** Vertical rhythm. */\n spacing?: 'md' | 'lg'\n /** Backdrop behind the content (texture, image), hidden from assistive tech. */\n backdrop?: ReactNode\n /** Accessible name when there is no `title`. */\n 'aria-label'?: string\n children?: ReactNode\n className?: string\n testId?: string\n}\n\n/**\n * A page band: numbered or labelled heading, optional action, and content stacked below or in a\n * second column. Sets the tone for the parts inside it, so the same list or panel grid reads on\n * a plain, tinted or inverse band.\n */\nexport function EditorialSection({\n id,\n eyebrow,\n index,\n title,\n lead,\n action,\n layout = 'stacked',\n surface = 'plain',\n bordered = false,\n spacing = 'lg',\n backdrop,\n 'aria-label': ariaLabel,\n children,\n className,\n testId,\n}: EditorialSectionProps) {\n const tone = SURFACE_TONE[surface]\n const t = useEditorialTone(tone)\n const hasHeading = Boolean(title || eyebrow || index !== undefined)\n const heading =\n hasHeading && title ? (\n <EditorialHeading eyebrow={eyebrow} index={index} title={title} lead={lead} tone={tone} />\n ) : null\n const split = layout !== 'stacked'\n return (\n <EditorialToneContext.Provider value={tone}>\n <section\n id={id}\n aria-label={title ? undefined : ariaLabel}\n className={cn(\n 'relative isolate overflow-hidden scroll-mt-24',\n SURFACE_CLASS[surface],\n bordered && cn('border-y', t.hairline),\n className\n )}\n data-slot=\"editorial-section\"\n data-testid={testId}\n >\n {backdrop && (\n <div aria-hidden=\"true\" className=\"pointer-events-none absolute inset-0 -z-10\">\n {backdrop}\n </div>\n )}\n <div\n className={cn(\n 'mx-auto max-w-7xl px-5 lg:px-8',\n spacing === 'lg' ? 'py-16 lg:py-24' : 'py-12 lg:py-16',\n split &&\n cn(\n 'grid gap-10 lg:gap-16',\n layout === 'split-wide' ? 'lg:grid-cols-[1fr_1.4fr]' : 'lg:grid-cols-2'\n )\n )}\n >\n {split ? (\n <>\n {heading && <div>{heading}</div>}\n <div className=\"min-w-0\">{children}</div>\n </>\n ) : (\n <>\n {heading && (\n <div className=\"flex flex-col justify-between gap-6 sm:flex-row sm:items-end\">\n {heading}\n {action && <div className=\"shrink-0\">{action}</div>}\n </div>\n )}\n {children && <div className={cn(heading && 'mt-12 lg:mt-14')}>{children}</div>}\n </>\n )}\n </div>\n </section>\n </EditorialToneContext.Provider>\n )\n}\n\nexport interface EditorialProseProps {\n /** One entry per paragraph. */\n paragraphs: ReactNode[]\n /** Two columns from `md` up (paragraphs never split across columns). */\n columns?: 1 | 2\n size?: 'base' | 'lg'\n className?: string\n testId?: string\n}\n\n/** Long-form paragraphs set at a readable measure, in one or two columns. */\nexport function EditorialProse({\n paragraphs,\n columns = 1,\n size = 'base',\n className,\n testId,\n}: EditorialProseProps) {\n const t = useEditorialTone()\n return (\n <div\n className={cn(\n size === 'lg' ? 'text-lg' : 'text-base',\n 'leading-relaxed',\n t.muted,\n columns === 2 ? 'gap-10 md:columns-2' : 'max-w-prose',\n className\n )}\n data-slot=\"editorial-prose\"\n data-testid={testId}\n >\n {paragraphs.map((p, i) => (\n <p key={i} className={cn(columns === 2 ? 'mb-5 break-inside-avoid' : 'mt-5 first:mt-0')}>\n {p}\n </p>\n ))}\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport { Check } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { useEditorialTone } from './tone'\n\nexport interface DefinitionItem {\n term: ReactNode\n description: ReactNode\n /** A leading icon; without one the `dot` marker is used when `marker=\"dot\"`. */\n icon?: ReactNode\n testId?: string\n}\n\nexport interface DefinitionListProps {\n items: DefinitionItem[]\n /**\n * `rows`: each entry is a lifted row with a marker. `ruled`: a spec sheet, term and description\n * side by side between hairlines.\n */\n layout?: 'rows' | 'ruled'\n /** Marker of an entry with no `icon` in the `rows` layout. */\n marker?: 'dot' | 'none'\n className?: string\n testId?: string\n}\n\n/** Term and description pairs (`<dl>`): feature rows, a spec sheet, a definition list. */\nexport function DefinitionList({\n items,\n layout = 'rows',\n marker = 'dot',\n className,\n testId,\n}: DefinitionListProps) {\n const t = useEditorialTone()\n return (\n <dl\n className={cn(layout === 'rows' ? 'space-y-3' : 'divide-y', t.hairline, className)}\n data-slot=\"definition-list\"\n data-layout={layout}\n data-testid={testId}\n >\n {items.map((item, i) =>\n layout === 'rows' ? (\n <div\n key={i}\n className={cn(\n 'flex gap-4 rounded-sm border p-5 transition-colors',\n t.panel,\n t.panelHover\n )}\n data-testid={item.testId ?? (testId ? `${testId}-item-${i}` : undefined)}\n >\n {item.icon ? (\n <span\n className={cn(\n 'flex size-9 shrink-0 items-center justify-center rounded-sm border',\n t.tile\n )}\n aria-hidden=\"true\"\n >\n {item.icon}\n </span>\n ) : (\n marker === 'dot' && (\n <span aria-hidden=\"true\" className=\"mt-2 size-2 shrink-0 rounded-full bg-primary\" />\n )\n )}\n <div className=\"min-w-0\">\n <dt className=\"font-medium\">{item.term}</dt>\n <dd className={cn('mt-0.5 text-sm', t.muted)}>{item.description}</dd>\n </div>\n </div>\n ) : (\n <div\n key={i}\n className=\"grid gap-1 py-4 sm:grid-cols-[minmax(0,1fr)_minmax(0,2fr)] sm:gap-8\"\n data-testid={item.testId ?? (testId ? `${testId}-item-${i}` : undefined)}\n >\n <dt className=\"font-medium\">{item.term}</dt>\n <dd className={cn('text-sm leading-relaxed', t.muted)}>{item.description}</dd>\n </div>\n )\n )}\n </dl>\n )\n}\n\nexport interface CheckListProps {\n items: ReactNode[]\n /** Two columns from `sm` up. */\n columns?: 1 | 2\n /** Replaces the check mark. */\n icon?: ReactNode\n className?: string\n testId?: string\n}\n\n/** A list of points, each with a ringed check mark. */\nexport function CheckList({ items, columns = 1, icon, className, testId }: CheckListProps) {\n const t = useEditorialTone()\n return (\n <ul\n className={cn(columns === 2 ? 'grid gap-4 sm:grid-cols-2' : 'space-y-3', className)}\n data-slot=\"check-list\"\n data-testid={testId}\n >\n {items.map((item, i) => (\n <li\n key={i}\n className={cn('flex items-start gap-3 text-sm leading-relaxed', t.muted)}\n data-testid={testId ? `${testId}-item-${i}` : undefined}\n >\n <span\n aria-hidden=\"true\"\n className={cn(\n 'mt-0.5 flex size-5 shrink-0 items-center justify-center rounded-full border',\n t.tile\n )}\n >\n {icon ?? <Check className=\"size-3\" />}\n </span>\n <span>{item}</span>\n </li>\n ))}\n </ul>\n )\n}\n\nexport interface TagListProps {\n items: string[]\n /** Accessible name of the list. */\n label?: string\n className?: string\n testId?: string\n}\n\n/** Small bordered chips: sectors, focus areas, topics. */\nexport function TagList({ items, label, className, testId }: TagListProps) {\n const t = useEditorialTone()\n if (items.length === 0) return null\n return (\n <ul\n aria-label={label}\n className={cn('flex flex-wrap gap-1.5', className)}\n data-slot=\"tag-list\"\n data-testid={testId}\n >\n {items.map((tag) => (\n <li key={tag} className={cn('rounded-sm border px-2 py-0.5 text-[11px]', t.chip)}>\n {tag}\n </li>\n ))}\n </ul>\n )\n}\n","import { useEffect, useRef, useState, type CSSProperties, type ReactNode } from 'react'\nimport { cn } from '@arbidocs/react/ui'\n\nexport interface RevealProps {\n children: ReactNode\n /** Delay in ms before the reveal starts (stagger siblings with `index * 90`). */\n delay?: number\n className?: string\n testId?: string\n}\n\n/**\n * Fade-and-rise on first scroll into view. Content is fully visible until the part has mounted\n * and found an `IntersectionObserver`, so server rendering, no-JS and jsdom show everything; the\n * hidden state and transition live in `blocks.css` (`[data-reveal]`) and collapse under\n * `prefers-reduced-motion`.\n */\nexport function Reveal({ children, delay = 0, className, testId }: RevealProps) {\n const ref = useRef<HTMLDivElement>(null)\n const [state, setState] = useState<'idle' | 'pending' | 'shown'>('idle')\n\n useEffect(() => {\n const el = ref.current\n if (!el || typeof IntersectionObserver === 'undefined') return\n setState('pending')\n const io = new IntersectionObserver(\n (entries) => {\n if (entries.some((e) => e.isIntersecting)) {\n setState('shown')\n io.disconnect()\n }\n },\n { rootMargin: '0px 0px -90px 0px' }\n )\n io.observe(el)\n return () => io.disconnect()\n }, [])\n\n return (\n <div\n ref={ref}\n data-slot=\"reveal\"\n data-reveal={state === 'idle' ? undefined : state}\n style={delay ? ({ '--reveal-delay': `${delay}ms` } as CSSProperties) : undefined}\n className={cn(className)}\n data-testid={testId}\n >\n {children}\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport { ArrowUpRight } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { BlockLink, type BlockLinkComponent } from '../blockLink'\nimport { CheckList, TagList } from './lists'\nimport { Reveal } from './Reveal'\nimport { EditorialToneContext, formatIndex, useEditorialTone, type EditorialTone } from './tone'\n\nexport interface PanelItem {\n title: ReactNode\n body?: ReactNode\n /** Icon in a bordered tile. */\n icon?: ReactNode\n /** Explicit number or label; with `numbered` on the grid it defaults to the position. */\n index?: number | string\n /** A small label above the title (category). */\n kicker?: ReactNode\n /** Bulleted points under the body. */\n points?: ReactNode[]\n /** Chips at the foot. */\n tags?: string[]\n /** Anything at the foot (a meta line, a link). */\n footer?: ReactNode\n /** Makes the whole panel a link. */\n href?: string\n testId?: string\n}\n\nexport interface PanelGridProps {\n items: PanelItem[]\n columns?: 2 | 3 | 4\n /** `cards`: separate bordered panels. `joined`: one hairline-ruled table of cells. */\n variant?: 'cards' | 'joined'\n /** Number the panels 01, 02, ... */\n numbered?: boolean\n /** Fade each panel in on scroll, staggered. */\n reveal?: boolean\n /** Router link for panels with an `href`. */\n linkComponent?: BlockLinkComponent\n /** Heading level of the panel titles (default 3). */\n headingLevel?: 2 | 3 | 4\n tone?: EditorialTone\n className?: string\n testId?: string\n}\n\nconst COLS: Record<2 | 3 | 4, string> = {\n 2: 'sm:grid-cols-2',\n 3: 'sm:grid-cols-2 lg:grid-cols-3',\n 4: 'sm:grid-cols-2 lg:grid-cols-4',\n}\n\n/**\n * Icon, title and body panels: principles, process steps, capability cards, security pillars,\n * practice areas. Cards or a joined hairline table, optional numbers, bullet points, chips and\n * a link per panel.\n */\nexport function PanelGrid({\n items,\n columns = 3,\n variant = 'cards',\n numbered = false,\n reveal = false,\n linkComponent,\n headingLevel = 3,\n tone,\n className,\n testId,\n}: PanelGridProps) {\n const t = useEditorialTone(tone)\n const Heading = `h${headingLevel}` as 'h2' | 'h3' | 'h4'\n const joined = variant === 'joined'\n return (\n <EditorialToneContext.Provider value={t.tone}>\n <ul\n className={cn(\n 'grid',\n joined ? cn('gap-px overflow-hidden rounded-sm border', t.hairline) : 'gap-4',\n joined && (t.tone === 'inverse' ? 'bg-background/15' : 'bg-border'),\n COLS[columns] ?? COLS[3],\n className\n )}\n data-slot=\"panel-grid\"\n data-variant={variant}\n data-testid={testId}\n >\n {items.map((item, i) => {\n const number = item.index ?? (numbered ? i + 1 : undefined)\n const inner = (\n <div\n className={cn(\n 'group flex h-full flex-col p-6 transition-colors duration-300',\n joined\n ? cn(\n t.tone === 'inverse' ? 'bg-foreground' : 'bg-background',\n item.href && 'hover:bg-muted/40'\n )\n : cn('rounded-sm border', t.panel, item.href && t.panelHover)\n )}\n data-testid={item.testId ?? (testId ? `${testId}-item-${i}` : undefined)}\n >\n {(item.icon || number !== undefined || item.href) && (\n <div className=\"flex items-start justify-between gap-4\">\n {item.icon ? (\n <span\n aria-hidden=\"true\"\n className={cn(\n 'flex size-11 items-center justify-center rounded-sm border',\n t.tile\n )}\n >\n {item.icon}\n </span>\n ) : (\n <span />\n )}\n {number !== undefined ? (\n <span className={cn('font-display text-sm tabular-nums', t.subtle)}>\n {formatIndex(number)}\n </span>\n ) : (\n item.href && (\n <ArrowUpRight\n aria-hidden=\"true\"\n className={cn(\n 'size-4 transition-colors group-hover:text-primary',\n t.subtle\n )}\n />\n )\n )}\n </div>\n )}\n {item.kicker && (\n <p\n className={cn(\n 'text-xs font-semibold uppercase tracking-wider',\n item.icon || number !== undefined ? 'mt-5' : '',\n t.accent\n )}\n >\n {item.kicker}\n </p>\n )}\n <Heading\n className={cn(\n 'font-display text-lg font-semibold leading-snug',\n item.icon || number !== undefined || item.kicker ? 'mt-4' : '',\n t.text\n )}\n >\n {item.title}\n </Heading>\n {item.body && (\n <div className={cn('mt-2 text-sm leading-relaxed', t.muted)}>{item.body}</div>\n )}\n {item.points && item.points.length > 0 && (\n <CheckList\n items={item.points}\n className={cn('mt-4 space-y-2 border-t pt-4', t.hairline)}\n />\n )}\n {item.tags && item.tags.length > 0 && (\n <TagList items={item.tags} className=\"mt-auto pt-5\" />\n )}\n {item.footer && (\n <div className={cn('mt-auto pt-5 text-xs', t.subtle)}>{item.footer}</div>\n )}\n </div>\n )\n const cell = (\n <BlockLink href={item.href} linkComponent={linkComponent} className=\"block h-full\">\n {inner}\n </BlockLink>\n )\n return (\n <li key={i} className=\"min-w-0\">\n {reveal ? (\n <Reveal delay={i * 90} className=\"h-full\">\n {cell}\n </Reveal>\n ) : (\n cell\n )}\n </li>\n )\n })}\n </ul>\n </EditorialToneContext.Provider>\n )\n}\n","import type { ReactNode } from 'react'\nimport { cn } from '@arbidocs/react/ui'\nimport { useEditorialTone } from './tone'\n\nexport interface PullQuoteProps {\n quote: ReactNode\n /** Who said it. */\n attribution?: { name: ReactNode; role?: ReactNode }\n /** Link to the source. */\n cite?: string\n align?: 'start' | 'center'\n size?: 'md' | 'lg'\n className?: string\n testId?: string\n}\n\n/** A large display quotation with an accent rule and attribution. */\nexport function PullQuote({\n quote,\n attribution,\n cite,\n align = 'start',\n size = 'md',\n className,\n testId,\n}: PullQuoteProps) {\n const t = useEditorialTone()\n const centered = align === 'center'\n return (\n <figure\n className={cn(\n 'max-w-3xl',\n centered ? 'mx-auto text-center' : 'border-l-2 border-primary pl-6 lg:pl-8',\n className\n )}\n data-slot=\"pull-quote\"\n data-testid={testId}\n >\n <blockquote\n cite={cite}\n className={cn(\n 'font-display font-medium leading-snug text-balance',\n size === 'lg' ? 'text-3xl sm:text-4xl' : 'text-2xl sm:text-3xl',\n t.text\n )}\n >\n <p>{quote}</p>\n </blockquote>\n {attribution && (\n <figcaption className={cn('mt-5 text-sm', t.muted)}>\n <span className={cn('font-semibold', t.text)}>{attribution.name}</span>\n {attribution.role && <span>, {attribution.role}</span>}\n </figcaption>\n )}\n </figure>\n )\n}\n","import type { ReactNode } from 'react'\nimport { ArrowUpRight } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { BlockImage } from '../BlockImage'\nimport { BlockLink, type BlockLinkComponent } from '../blockLink'\nimport { useEditorialTone } from './tone'\n\nexport interface ArticleItem {\n title: ReactNode\n summary?: ReactNode\n /** Category or type, shown as an accent label. */\n kicker?: ReactNode\n /** Short facts joined with a middle dot: author, date, reading time. */\n meta?: ReactNode[]\n href?: string\n imageUrl?: string\n imageAlt?: string\n testId?: string\n}\n\nexport interface ArticleListProps {\n items: ArticleItem[]\n /**\n * `cards`: a grid of cards. `rows`: ruled rows (kicker and meta beside the title), best for an\n * archive.\n */\n layout?: 'cards' | 'rows'\n /** `cards` only: the first item is a large card beside a column of the rest from `lg`. */\n featureFirst?: boolean\n columns?: 2 | 3\n linkComponent?: BlockLinkComponent\n /** Rendered instead of the list when `items` is empty. */\n empty?: ReactNode\n className?: string\n testId?: string\n}\n\nconst COLS: Record<2 | 3, string> = {\n 2: 'md:grid-cols-2',\n 3: 'md:grid-cols-2 lg:grid-cols-3',\n}\n\n/** Insight, news or post listing: `meta` joined with a middle dot, linked cards or rows. */\nfunction MetaLine({ meta, className }: { meta?: ReactNode[]; className?: string }) {\n if (!meta || meta.length === 0) return null\n return (\n <p className={className}>\n {meta.map((m, i) => (\n <span key={i}>\n {i > 0 && <span aria-hidden=\"true\"> · </span>}\n {m}\n </span>\n ))}\n </p>\n )\n}\n\n/** Article, insight or news items as cards (optionally with a lead card) or ruled archive rows. */\nexport function ArticleList({\n items,\n layout = 'cards',\n featureFirst = false,\n columns = 3,\n linkComponent,\n empty,\n className,\n testId,\n}: ArticleListProps) {\n const t = useEditorialTone()\n if (items.length === 0) return empty ? <>{empty}</> : null\n\n const idOf = (item: ArticleItem, i: number) =>\n item.testId ?? (testId ? `${testId}-item-${i}` : undefined)\n\n if (layout === 'rows') {\n return (\n <ul\n className={cn('divide-y border-y', t.hairline, className)}\n data-slot=\"article-list\"\n data-layout=\"rows\"\n data-testid={testId}\n >\n {items.map((item, i) => (\n <li key={i}>\n <BlockLink href={item.href} linkComponent={linkComponent} className=\"group block\">\n <article\n className=\"grid gap-2 py-6 transition-colors sm:grid-cols-[10rem_minmax(0,1fr)_auto] sm:gap-8\"\n data-testid={idOf(item, i)}\n >\n <div className=\"space-y-1\">\n {item.kicker && (\n <p className={cn('text-xs font-semibold uppercase tracking-wider', t.accent)}>\n {item.kicker}\n </p>\n )}\n <MetaLine meta={item.meta} className={cn('text-xs', t.subtle)} />\n </div>\n <div className=\"min-w-0\">\n <h3\n className={cn(\n 'font-display text-xl font-semibold leading-snug transition-colors group-hover:text-primary',\n t.text\n )}\n >\n {item.title}\n </h3>\n {item.summary && (\n <p className={cn('mt-2 text-sm leading-relaxed', t.muted)}>{item.summary}</p>\n )}\n </div>\n {item.href && (\n <ArrowUpRight\n aria-hidden=\"true\"\n className={cn(\n 'hidden size-4 transition-colors group-hover:text-primary sm:block',\n t.subtle\n )}\n />\n )}\n </article>\n </BlockLink>\n </li>\n ))}\n </ul>\n )\n }\n\n const card = (item: ArticleItem, i: number, lead: boolean) => (\n <BlockLink href={item.href} linkComponent={linkComponent} className=\"group block h-full\">\n <article\n className={cn(\n 'flex h-full flex-col rounded-sm border transition-colors duration-300',\n t.panel,\n item.href && t.panelHover,\n lead ? 'p-6 lg:p-8' : 'p-6'\n )}\n data-testid={idOf(item, i)}\n >\n {item.imageUrl && (\n <BlockImage\n src={item.imageUrl}\n alt={item.imageAlt ?? ''}\n aspect=\"16:9\"\n rounded=\"none\"\n className=\"mb-5 w-full\"\n />\n )}\n <div className=\"flex items-start justify-between gap-3\">\n {item.kicker ? (\n <p className={cn('text-xs font-semibold uppercase tracking-wider', t.accent)}>\n {item.kicker}\n </p>\n ) : (\n <span />\n )}\n {item.href && (\n <ArrowUpRight\n aria-hidden=\"true\"\n className={cn('size-4 transition-colors group-hover:text-primary', t.subtle)}\n />\n )}\n </div>\n <h3\n className={cn(\n 'mt-3 font-display font-semibold leading-snug',\n lead ? 'text-2xl sm:text-3xl' : 'text-lg',\n t.text\n )}\n >\n {item.title}\n </h3>\n {item.summary && (\n <p\n className={cn(\n 'mt-3 flex-1 text-sm leading-relaxed',\n lead && 'max-w-xl text-base',\n t.muted\n )}\n >\n {item.summary}\n </p>\n )}\n <MetaLine meta={item.meta} className={cn('mt-5 text-xs', t.subtle)} />\n </article>\n </BlockLink>\n )\n\n if (featureFirst && items.length > 1) {\n const [lead, ...rest] = items\n return (\n <div\n className={cn('grid gap-5 lg:grid-cols-[1.4fr_1fr]', className)}\n data-slot=\"article-list\"\n data-layout=\"feature\"\n data-testid={testId}\n >\n <div>{card(lead, 0, true)}</div>\n <ul className=\"grid gap-5\">\n {rest.map((item, i) => (\n <li key={i}>{card(item, i + 1, false)}</li>\n ))}\n </ul>\n </div>\n )\n }\n\n return (\n <ul\n className={cn('grid gap-5', COLS[columns] ?? COLS[3], className)}\n data-slot=\"article-list\"\n data-layout=\"cards\"\n data-testid={testId}\n >\n {items.map((item, i) => (\n <li key={i}>{card(item, i, false)}</li>\n ))}\n </ul>\n )\n}\n","import type { ReactNode } from 'react'\nimport { cn } from '@arbidocs/react/ui'\nimport { SURFACE_CLASS, SURFACE_TONE, type EditorialSurface } from './EditorialHero'\nimport { EditorialToneContext, useEditorialTone } from './tone'\n\nexport interface ProofStripProps {\n /** The lead statement (an icon and a sentence). */\n lead?: ReactNode\n /** Short labels: standards, memberships, clients. */\n items: ReactNode[]\n /** Accessible name of the label list. */\n label?: string\n surface?: EditorialSurface\n className?: string\n testId?: string\n}\n\n/** A thin band of proof points: a lead statement and a row of short uppercase labels. */\nexport function ProofStrip({\n lead,\n items,\n label,\n surface = 'muted',\n className,\n testId,\n}: ProofStripProps) {\n const tone = SURFACE_TONE[surface]\n const t = useEditorialTone(tone)\n return (\n <EditorialToneContext.Provider value={tone}>\n <section\n aria-label={label}\n className={cn('border-y', t.hairline, SURFACE_CLASS[surface], className)}\n data-slot=\"proof-strip\"\n data-testid={testId}\n >\n <div className=\"mx-auto flex max-w-7xl flex-col items-center gap-5 px-5 py-6 lg:flex-row lg:justify-between lg:px-8\">\n {lead && <div className=\"flex items-center gap-2.5 text-sm font-medium\">{lead}</div>}\n <ul className=\"flex flex-wrap items-center justify-center gap-x-6 gap-y-2\">\n {items.map((item, i) => (\n <li\n key={i}\n className={cn('text-xs font-semibold uppercase tracking-wider', t.subtle)}\n >\n {item}\n </li>\n ))}\n </ul>\n </div>\n </section>\n </EditorialToneContext.Provider>\n )\n}\n\nexport interface CtaBandProps {\n title: ReactNode\n lead?: ReactNode\n /** Buttons or links. */\n actions?: ReactNode\n /** Decoration behind the copy (image, texture), hidden from assistive tech. */\n backdrop?: ReactNode\n /** Default `inverse`: a dark closing band. */\n surface?: EditorialSurface\n className?: string\n testId?: string\n}\n\n/** Closing call-to-action band: centred heading, lead and actions over an optional backdrop. */\nexport function CtaBand({\n title,\n lead,\n actions,\n backdrop,\n surface = 'inverse',\n className,\n testId,\n}: CtaBandProps) {\n const tone = SURFACE_TONE[surface]\n const t = useEditorialTone(tone)\n return (\n <EditorialToneContext.Provider value={tone}>\n <section\n className={cn('relative isolate overflow-hidden', SURFACE_CLASS[surface], className)}\n data-slot=\"cta-band\"\n data-testid={testId}\n >\n {backdrop && (\n <div aria-hidden=\"true\" className=\"pointer-events-none absolute inset-0 -z-10\">\n {backdrop}\n </div>\n )}\n <div className=\"mx-auto max-w-4xl px-5 py-20 text-center lg:px-8 lg:py-24\">\n <h2\n className={cn(\n 'font-display text-3xl font-semibold tracking-tight text-balance sm:text-4xl',\n t.text\n )}\n >\n {title}\n </h2>\n {lead && <p className={cn('mx-auto mt-4 max-w-2xl text-lg', t.muted)}>{lead}</p>}\n {actions && (\n <div className=\"mt-8 flex flex-col items-center justify-center gap-3 sm:flex-row\">\n {actions}\n </div>\n )}\n </div>\n </section>\n </EditorialToneContext.Provider>\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/components/CollectionDetail.tsx","../src/components/Chart.tsx","../src/components/editorial/Eyebrow.tsx","../src/components/editorial/EditorialHeading.tsx","../src/components/editorial/EditorialHero.tsx","../src/components/editorial/EditorialSection.tsx","../src/components/editorial/lists.tsx","../src/components/editorial/Reveal.tsx","../src/components/editorial/PanelGrid.tsx","../src/components/editorial/PullQuote.tsx","../src/components/editorial/ArticleList.tsx","../src/components/editorial/Bands.tsx"],"names":["jsx","Fragment","useMemo","jsxs","cn","useEditorialTone","formatIndex","EditorialToneContext","Check","useRef","useState","useEffect","ArrowUpRight","BlockLink","COLS","BlockImage"],"mappings":"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","file":"chunk-65THHQVB.cjs","sourcesContent":["import type { ReactNode } from 'react'\n\nexport interface CollectionDetailContext<T> {\n previous?: T\n next?: T\n}\n\nexport interface CollectionDetailProps<T> {\n /** The collection, supplied by the host (CMS, files, API...). */\n items: T[]\n /** The slug from the host's route. Absent: the list is rendered. */\n slug?: string\n getSlug: (item: T) => string\n renderList: (items: T[]) => ReactNode\n /** One item's page. `previous` / `next` are the neighbours in `items` order. */\n renderDetail: (item: T, context: CollectionDetailContext<T>) => ReactNode\n /** Shown when `slug` matches nothing. */\n renderNotFound?: (slug: string) => ReactNode\n}\n\n/**\n * The list-and-detail page contract for a collection (people, articles, services...). It owns\n * only the slug lookup; the host owns the route, the data and every pixel of both views, so one\n * route (`/things/:slug?`) serves the list and each detail page.\n */\nexport function CollectionDetail<T>({\n items,\n slug,\n getSlug,\n renderList,\n renderDetail,\n renderNotFound,\n}: CollectionDetailProps<T>) {\n if (!slug) return <>{renderList(items)}</>\n const index = items.findIndex((item) => getSlug(item) === slug)\n if (index === -1) {\n return (\n <>\n {renderNotFound ? (\n renderNotFound(slug)\n ) : (\n <p role=\"status\" data-slot=\"collection-not-found\">\n Not found\n </p>\n )}\n </>\n )\n }\n return <>{renderDetail(items[index], { previous: items[index - 1], next: items[index + 1] })}</>\n}\n","import { useMemo } from 'react'\nimport { cn } from '@arbidocs/react/ui'\n\nexport interface ChartSeries {\n key: string\n /** Legend text (defaults to `key`). */\n label?: string\n /** One value per entry of `labels`. */\n values: number[]\n}\n\nexport interface ChartProps {\n type: 'bar' | 'line' | 'pie'\n /** Category (x) labels. For `pie` they name the slices of the first series. */\n labels: string[]\n series: ChartSeries[]\n /** Accessible description of the whole chart. */\n ariaLabel: string\n /** Formats values in axis ticks and slice titles. */\n formatValue?: (value: number) => string\n /** Hide the legend. */\n hideLegend?: boolean\n emptyLabel?: string\n /**\n * Longest category label drawn on the x axis, in characters; longer labels are cut with an\n * ellipsis and carry the full text as a `<title>`. Default: what fits the band (about 5px a\n * character), at least 3.\n */\n maxLabelChars?: number\n className?: string\n testId?: string\n}\n\nconst W = 440\nconst H = 160\nconst PAD = { top: 8, right: 8, bottom: 22, left: 40 }\n\n/** Series colours come from the `--chart-1..5` theme tokens, so charts follow the host theme. */\nconst color = (i: number) => `hsl(var(--chart-${(i % 5) + 1}))`\n\n/** Cut `label` to `max` characters with an ellipsis (the full text stays in a `<title>`). */\nexport function truncateLabel(label: string, max: number): string {\n const chars = Array.from(label)\n return chars.length <= max\n ? label\n : `${chars\n .slice(0, Math.max(1, max - 1))\n .join('')\n .trimEnd()}…`\n}\n\nconst defaultFormat = (v: number) => (v >= 1000 ? `${Math.round(v / 100) / 10}k` : String(v))\n\nfunction polar(cx: number, cy: number, r: number, angle: number): [number, number] {\n return [cx + r * Math.sin(angle), cy - r * Math.cos(angle)]\n}\n\n/**\n * Data-bound bar, line or pie chart in plain SVG. No chart library: it renders from props,\n * is themed by tokens and carries a text alternative (`ariaLabel`, slice and bar `<title>`s).\n */\nexport function Chart({\n type,\n labels,\n series,\n ariaLabel,\n formatValue = defaultFormat,\n hideLegend = false,\n emptyLabel = 'No data',\n maxLabelChars,\n className,\n testId,\n}: ChartProps) {\n const max = useMemo(() => Math.max(...series.flatMap((s) => s.values), 1), [series])\n if (!labels.length || !series.length) {\n return <p className=\"text-sm text-muted-foreground\">{emptyLabel}</p>\n }\n\n const legendItems =\n type === 'pie'\n ? labels.map((label, i) => ({ label, color: color(i) }))\n : series.map((s, i) => ({ label: s.label ?? s.key, color: color(i) }))\n\n let body\n if (type === 'pie') {\n const values = series[0].values\n const total = values.reduce((a, b) => a + Math.max(b, 0), 0)\n const cx = 80\n const cy = 80\n const r = 72\n let angle = 0\n body = (\n <svg viewBox=\"0 0 160 160\" className=\"mx-auto h-40 w-40\" role=\"img\" aria-label={ariaLabel}>\n {total > 0 &&\n values.map((v, i) => {\n const sweep = (Math.max(v, 0) / total) * Math.PI * 2\n if (sweep === 0) return null\n const title = `${labels[i]}: ${formatValue(v)}`\n if (sweep >= Math.PI * 2 - 1e-6) {\n return (\n <circle key={i} cx={cx} cy={cy} r={r} fill={color(i)}>\n <title>{title}</title>\n </circle>\n )\n }\n const [x1, y1] = polar(cx, cy, r, angle)\n const [x2, y2] = polar(cx, cy, r, angle + sweep)\n const d = `M${cx},${cy} L${x1},${y1} A${r},${r} 0 ${sweep > Math.PI ? 1 : 0} 1 ${x2},${y2} Z`\n angle += sweep\n return (\n <path key={i} d={d} fill={color(i)}>\n <title>{title}</title>\n </path>\n )\n })}\n </svg>\n )\n } else {\n const plotW = W - PAD.left - PAD.right\n const plotH = H - PAD.top - PAD.bottom\n const y = (v: number) => PAD.top + plotH - (v / max) * plotH\n const band = plotW / labels.length\n const xCenter = (i: number) => PAD.left + band * i + band / 2\n const maxChars = maxLabelChars ?? Math.max(3, Math.floor((band - 4) / 5))\n body = (\n <svg viewBox={`0 0 ${W} ${H}`} className=\"h-auto w-full\" role=\"img\" aria-label={ariaLabel}>\n {[0, max / 2, max].map((v) => (\n <g key={v}>\n <line\n x1={PAD.left}\n x2={W - PAD.right}\n y1={y(v)}\n y2={y(v)}\n className=\"stroke-border\"\n strokeDasharray=\"2,2\"\n />\n <text\n x={PAD.left - 4}\n y={y(v) + 3}\n textAnchor=\"end\"\n className=\"fill-muted-foreground text-[9px]\"\n >\n {formatValue(v)}\n </text>\n </g>\n ))}\n {labels.map((label, i) => (\n <text\n key={i}\n x={xCenter(i)}\n y={H - 6}\n textAnchor=\"middle\"\n className=\"fill-muted-foreground text-[9px]\"\n >\n {truncateLabel(label, maxChars)}\n {Array.from(label).length > maxChars && <title>{label}</title>}\n </text>\n ))}\n {type === 'bar' &&\n series.map((s, si) => {\n const barW = (band * 0.7) / series.length\n return s.values.map((v, i) => (\n <rect\n key={`${s.key}-${i}`}\n x={xCenter(i) - (band * 0.7) / 2 + si * barW}\n y={y(v)}\n width={barW}\n height={PAD.top + plotH - y(v)}\n fill={color(si)}\n rx={1.5}\n >\n <title>{`${labels[i]} ${s.label ?? s.key}: ${formatValue(v)}`}</title>\n </rect>\n ))\n })}\n {type === 'line' &&\n series.map((s, si) => (\n <g key={s.key}>\n <polyline\n fill=\"none\"\n stroke={color(si)}\n strokeWidth={2}\n points={s.values.map((v, i) => `${xCenter(i)},${y(v)}`).join(' ')}\n />\n {s.values.map((v, i) => (\n <circle key={i} cx={xCenter(i)} cy={y(v)} r={2.5} fill={color(si)}>\n <title>{`${labels[i]} ${s.label ?? s.key}: ${formatValue(v)}`}</title>\n </circle>\n ))}\n </g>\n ))}\n </svg>\n )\n }\n\n return (\n <figure\n className={cn('flex min-w-0 max-w-full flex-col gap-2', className)}\n data-slot=\"chart\"\n data-type={type}\n data-testid={testId}\n >\n {body}\n {!hideLegend && (\n <figcaption className=\"flex flex-wrap justify-center gap-x-4 gap-y-1 text-xs text-muted-foreground\">\n {legendItems.map((item) => (\n <span key={item.label} className=\"inline-flex items-center gap-1.5\">\n <span\n aria-hidden=\"true\"\n className=\"inline-block size-2 rounded-full\"\n style={{ background: item.color }}\n />\n {item.label}\n </span>\n ))}\n </figcaption>\n )}\n </figure>\n )\n}\n","import type { ReactNode } from 'react'\nimport { cn } from '@arbidocs/react/ui'\nimport { formatIndex, useEditorialTone, type EditorialTone } from './tone'\n\nexport interface EyebrowProps {\n children: ReactNode\n /** A number or label before the text: `1` renders `01`. */\n index?: number | string\n /** A short accent rule before the text. */\n rule?: boolean\n tone?: EditorialTone\n className?: string\n testId?: string\n}\n\n/** Small uppercase label above a heading: optional index and accent rule. */\nexport function Eyebrow({ children, index, rule = false, tone, className, testId }: EyebrowProps) {\n const t = useEditorialTone(tone)\n return (\n <p\n className={cn(\n 'flex items-center gap-3 text-xs font-semibold uppercase tracking-wider',\n t.subtle,\n className\n )}\n data-slot=\"eyebrow\"\n data-testid={testId}\n >\n {rule && <span aria-hidden=\"true\" className=\"h-px w-8 shrink-0 bg-primary\" />}\n {index !== undefined && (\n <span className={cn('tabular-nums', t.accent)}>{formatIndex(index)}</span>\n )}\n <span>{children}</span>\n </p>\n )\n}\n","import type { ReactNode } from 'react'\nimport { cn } from '@arbidocs/react/ui'\nimport { Eyebrow } from './Eyebrow'\nimport { useEditorialTone, type EditorialTone } from './tone'\n\nexport interface EditorialHeadingProps {\n eyebrow?: ReactNode\n /** Section number or label shown with the eyebrow. */\n index?: number | string\n title: ReactNode\n lead?: ReactNode\n /** Heading element level (default 2). */\n level?: 1 | 2 | 3\n align?: 'start' | 'center'\n tone?: EditorialTone\n className?: string\n testId?: string\n}\n\n/** Section heading: numbered or labelled eyebrow, display title and lead. */\nexport function EditorialHeading({\n eyebrow,\n index,\n title,\n lead,\n level = 2,\n align = 'start',\n tone,\n className,\n testId,\n}: EditorialHeadingProps) {\n const t = useEditorialTone(tone)\n const Heading = `h${level}` as 'h1' | 'h2' | 'h3'\n return (\n <div\n className={cn('max-w-3xl', align === 'center' && 'mx-auto text-center', className)}\n data-slot=\"editorial-heading\"\n data-testid={testId}\n >\n {(eyebrow || index !== undefined) && (\n <Eyebrow\n index={index}\n tone={tone}\n className={cn('mb-4', align === 'center' && 'justify-center')}\n >\n {eyebrow}\n </Eyebrow>\n )}\n <Heading\n className={cn(\n 'font-display text-3xl font-semibold tracking-tight text-balance sm:text-4xl',\n t.text\n )}\n >\n {title}\n </Heading>\n {lead && <p className={cn('mt-4 text-lg leading-relaxed', t.muted)}>{lead}</p>}\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport { cn } from '@arbidocs/react/ui'\nimport { Eyebrow } from './Eyebrow'\nimport { EditorialToneContext, useEditorialTone, type EditorialTone } from './tone'\n\nexport type EditorialSurface = 'plain' | 'muted' | 'inverse'\n\nexport interface EditorialHeroTestIds {\n root: string\n eyebrow: string\n title: string\n lede: string\n actions: string\n aside: string\n}\n\nexport interface EditorialHeroProps {\n eyebrow?: ReactNode\n /** Show the accent rule before the eyebrow. */\n eyebrowRule?: boolean\n /** The headline: text or any node. */\n title: ReactNode\n /** A phrase inside a string `title` set in the italic accent. */\n emphasis?: string\n /** The paragraph under the headline. */\n lede?: ReactNode\n /** Buttons or links under the lede. */\n actions?: ReactNode\n /** Anything under the actions (badges, a trust line). */\n footer?: ReactNode\n /** The figure beside (below on phones) the copy: an image frame, a card, a media slot. */\n aside?: ReactNode\n /** Decoration behind the copy (texture, wash, background image). Hidden from assistive tech. */\n backdrop?: ReactNode\n /** `start` copy, or `center` (no aside). */\n align?: 'start' | 'center'\n /** `page`: a page-opening header band. `cover`: the larger home-page hero. */\n size?: 'page' | 'cover'\n surface?: EditorialSurface\n className?: string\n testId?: string\n testIds?: Partial<EditorialHeroTestIds>\n}\n\nexport const SURFACE_CLASS: Record<EditorialSurface, string> = {\n plain: 'bg-background text-foreground',\n muted: 'bg-muted text-foreground',\n inverse: 'bg-foreground text-background',\n}\n\nexport const SURFACE_TONE: Record<EditorialSurface, EditorialTone> = {\n plain: 'default',\n muted: 'default',\n inverse: 'inverse',\n}\n\nfunction renderTitle(title: ReactNode, emphasis?: string): ReactNode {\n if (typeof title !== 'string' || !emphasis || !title.includes(emphasis)) return title\n const parts = title.split(emphasis)\n return parts.map((part, i) => (\n <span key={i}>\n {part}\n {i < parts.length - 1 && <em className=\"italic text-primary\">{emphasis}</em>}\n </span>\n ))\n}\n\n/**\n * Editorial opening band: eyebrow, display headline with an italic accent phrase, lede, actions\n * and an optional aside (image, card). Covers a page header (no aside, `size=\"page\"`), a split\n * hero (aside) and a centred landing hero (`align=\"center\"`, `size=\"cover\"`).\n */\nexport function EditorialHero({\n eyebrow,\n eyebrowRule = false,\n title,\n emphasis,\n lede,\n actions,\n footer,\n aside,\n backdrop,\n align = 'start',\n size = 'page',\n surface = 'plain',\n className,\n testId,\n testIds,\n}: EditorialHeroProps) {\n const tone = SURFACE_TONE[surface]\n const t = useEditorialTone(tone)\n const centered = align === 'center' && !aside\n const ids = {\n root: testIds?.root ?? testId,\n eyebrow: testIds?.eyebrow ?? (testId ? `${testId}-eyebrow` : undefined),\n title: testIds?.title ?? (testId ? `${testId}-title` : undefined),\n lede: testIds?.lede ?? (testId ? `${testId}-lede` : undefined),\n actions: testIds?.actions ?? (testId ? `${testId}-actions` : undefined),\n aside: testIds?.aside ?? (testId ? `${testId}-aside` : undefined),\n }\n return (\n <EditorialToneContext.Provider value={tone}>\n <section\n className={cn('relative isolate overflow-hidden', SURFACE_CLASS[surface], className)}\n data-slot=\"editorial-hero\"\n data-size={size}\n data-testid={ids.root}\n >\n {backdrop && (\n <div aria-hidden=\"true\" className=\"pointer-events-none absolute inset-0 -z-10\">\n {backdrop}\n </div>\n )}\n <div\n className={cn(\n 'mx-auto max-w-7xl px-5 lg:px-8',\n size === 'cover' ? 'py-16 lg:py-28' : 'py-14 lg:py-24',\n aside && 'grid items-center gap-12 lg:grid-cols-[1.02fr_0.98fr] lg:gap-14'\n )}\n >\n <div className={cn('max-w-3xl', centered && 'mx-auto text-center')}>\n {eyebrow && (\n <Eyebrow\n rule={eyebrowRule}\n tone={tone}\n className={cn('mb-6', centered && 'justify-center')}\n testId={ids.eyebrow}\n >\n {eyebrow}\n </Eyebrow>\n )}\n <h1\n className={cn(\n 'font-display font-semibold tracking-tight text-balance',\n size === 'cover'\n ? 'text-[2.6rem] leading-[1.03] sm:text-6xl lg:text-[4.4rem]'\n : 'text-4xl leading-[1.05] sm:text-5xl',\n t.text\n )}\n data-testid={ids.title}\n >\n {renderTitle(title, emphasis)}\n </h1>\n {lede && (\n <p\n className={cn(\n 'mt-6 max-w-2xl text-lg leading-relaxed',\n centered && 'mx-auto',\n t.muted\n )}\n data-testid={ids.lede}\n >\n {lede}\n </p>\n )}\n {actions && (\n <div\n className={cn(\n 'mt-8 flex flex-col gap-3 sm:flex-row',\n centered && 'sm:justify-center'\n )}\n data-testid={ids.actions}\n >\n {actions}\n </div>\n )}\n {footer && (\n <div className={cn('mt-8', centered && 'flex justify-center')}>{footer}</div>\n )}\n </div>\n {aside && (\n <div\n className=\"relative min-w-0\"\n data-slot=\"editorial-hero-aside\"\n data-testid={ids.aside}\n >\n {aside}\n </div>\n )}\n </div>\n </section>\n </EditorialToneContext.Provider>\n )\n}\n","import type { ReactNode } from 'react'\nimport { cn } from '@arbidocs/react/ui'\nimport { EditorialHeading } from './EditorialHeading'\nimport { SURFACE_CLASS, SURFACE_TONE, type EditorialSurface } from './EditorialHero'\nimport { EditorialToneContext, useEditorialTone } from './tone'\n\nexport interface EditorialSectionProps {\n id?: string\n eyebrow?: ReactNode\n /** Section number or label: `1` renders `01`. */\n index?: number | string\n title?: ReactNode\n lead?: ReactNode\n /** Sits beside the heading from `sm` up (a \"see all\" link or button). */\n action?: ReactNode\n /**\n * `stacked`: heading above the content. `split`: heading column beside the content from `lg`.\n * `split-wide`: the same with a wider content column.\n */\n layout?: 'stacked' | 'split' | 'split-wide'\n /** `plain`, `muted` (tinted band) or `inverse` (dark band on a light theme). */\n surface?: EditorialSurface\n /** Hairline above and below the band. */\n bordered?: boolean\n /** Vertical rhythm. */\n spacing?: 'md' | 'lg'\n /** Backdrop behind the content (texture, image), hidden from assistive tech. */\n backdrop?: ReactNode\n /** Accessible name when there is no `title`. */\n 'aria-label'?: string\n children?: ReactNode\n className?: string\n testId?: string\n}\n\n/**\n * A page band: numbered or labelled heading, optional action, and content stacked below or in a\n * second column. Sets the tone for the parts inside it, so the same list or panel grid reads on\n * a plain, tinted or inverse band.\n */\nexport function EditorialSection({\n id,\n eyebrow,\n index,\n title,\n lead,\n action,\n layout = 'stacked',\n surface = 'plain',\n bordered = false,\n spacing = 'lg',\n backdrop,\n 'aria-label': ariaLabel,\n children,\n className,\n testId,\n}: EditorialSectionProps) {\n const tone = SURFACE_TONE[surface]\n const t = useEditorialTone(tone)\n const hasHeading = Boolean(title || eyebrow || index !== undefined)\n const heading =\n hasHeading && title ? (\n <EditorialHeading eyebrow={eyebrow} index={index} title={title} lead={lead} tone={tone} />\n ) : null\n const split = layout !== 'stacked'\n return (\n <EditorialToneContext.Provider value={tone}>\n <section\n id={id}\n aria-label={title ? undefined : ariaLabel}\n className={cn(\n 'relative isolate overflow-hidden scroll-mt-24',\n SURFACE_CLASS[surface],\n bordered && cn('border-y', t.hairline),\n className\n )}\n data-slot=\"editorial-section\"\n data-testid={testId}\n >\n {backdrop && (\n <div aria-hidden=\"true\" className=\"pointer-events-none absolute inset-0 -z-10\">\n {backdrop}\n </div>\n )}\n <div\n className={cn(\n 'mx-auto max-w-7xl px-5 lg:px-8',\n spacing === 'lg' ? 'py-16 lg:py-24' : 'py-12 lg:py-16',\n split &&\n cn(\n 'grid gap-10 lg:gap-16',\n layout === 'split-wide' ? 'lg:grid-cols-[1fr_1.4fr]' : 'lg:grid-cols-2'\n )\n )}\n >\n {split ? (\n <>\n {heading && <div>{heading}</div>}\n <div className=\"min-w-0\">{children}</div>\n </>\n ) : (\n <>\n {heading && (\n <div className=\"flex flex-col justify-between gap-6 sm:flex-row sm:items-end\">\n {heading}\n {action && <div className=\"shrink-0\">{action}</div>}\n </div>\n )}\n {children && <div className={cn(heading && 'mt-12 lg:mt-14')}>{children}</div>}\n </>\n )}\n </div>\n </section>\n </EditorialToneContext.Provider>\n )\n}\n\nexport interface EditorialProseProps {\n /** One entry per paragraph. */\n paragraphs: ReactNode[]\n /** Two columns from `md` up (paragraphs never split across columns). */\n columns?: 1 | 2\n size?: 'base' | 'lg'\n className?: string\n testId?: string\n}\n\n/** Long-form paragraphs set at a readable measure, in one or two columns. */\nexport function EditorialProse({\n paragraphs,\n columns = 1,\n size = 'base',\n className,\n testId,\n}: EditorialProseProps) {\n const t = useEditorialTone()\n return (\n <div\n className={cn(\n size === 'lg' ? 'text-lg' : 'text-base',\n 'leading-relaxed',\n t.muted,\n columns === 2 ? 'gap-10 md:columns-2' : 'max-w-prose',\n className\n )}\n data-slot=\"editorial-prose\"\n data-testid={testId}\n >\n {paragraphs.map((p, i) => (\n <p key={i} className={cn(columns === 2 ? 'mb-5 break-inside-avoid' : 'mt-5 first:mt-0')}>\n {p}\n </p>\n ))}\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport { Check } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { useEditorialTone } from './tone'\n\nexport interface DefinitionItem {\n term: ReactNode\n description: ReactNode\n /** A leading icon; without one the `dot` marker is used when `marker=\"dot\"`. */\n icon?: ReactNode\n testId?: string\n}\n\nexport interface DefinitionListProps {\n items: DefinitionItem[]\n /**\n * `rows`: each entry is a lifted row with a marker. `ruled`: a spec sheet, term and description\n * side by side between hairlines.\n */\n layout?: 'rows' | 'ruled'\n /** Marker of an entry with no `icon` in the `rows` layout. */\n marker?: 'dot' | 'none'\n className?: string\n testId?: string\n}\n\n/** Term and description pairs (`<dl>`): feature rows, a spec sheet, a definition list. */\nexport function DefinitionList({\n items,\n layout = 'rows',\n marker = 'dot',\n className,\n testId,\n}: DefinitionListProps) {\n const t = useEditorialTone()\n return (\n <dl\n className={cn(layout === 'rows' ? 'space-y-3' : 'divide-y', t.hairline, className)}\n data-slot=\"definition-list\"\n data-layout={layout}\n data-testid={testId}\n >\n {items.map((item, i) =>\n layout === 'rows' ? (\n <div\n key={i}\n className={cn(\n 'flex gap-4 rounded-sm border p-5 transition-colors',\n t.panel,\n t.panelHover\n )}\n data-testid={item.testId ?? (testId ? `${testId}-item-${i}` : undefined)}\n >\n {item.icon ? (\n <span\n className={cn(\n 'flex size-9 shrink-0 items-center justify-center rounded-sm border',\n t.tile\n )}\n aria-hidden=\"true\"\n >\n {item.icon}\n </span>\n ) : (\n marker === 'dot' && (\n <span aria-hidden=\"true\" className=\"mt-2 size-2 shrink-0 rounded-full bg-primary\" />\n )\n )}\n <div className=\"min-w-0\">\n <dt className=\"font-medium\">{item.term}</dt>\n <dd className={cn('mt-0.5 text-sm', t.muted)}>{item.description}</dd>\n </div>\n </div>\n ) : (\n <div\n key={i}\n className=\"grid gap-1 py-4 sm:grid-cols-[minmax(0,1fr)_minmax(0,2fr)] sm:gap-8\"\n data-testid={item.testId ?? (testId ? `${testId}-item-${i}` : undefined)}\n >\n <dt className=\"font-medium\">{item.term}</dt>\n <dd className={cn('text-sm leading-relaxed', t.muted)}>{item.description}</dd>\n </div>\n )\n )}\n </dl>\n )\n}\n\nexport interface CheckListProps {\n items: ReactNode[]\n /** Two columns from `sm` up. */\n columns?: 1 | 2\n /** Replaces the check mark. */\n icon?: ReactNode\n className?: string\n testId?: string\n}\n\n/** A list of points, each with a ringed check mark. */\nexport function CheckList({ items, columns = 1, icon, className, testId }: CheckListProps) {\n const t = useEditorialTone()\n return (\n <ul\n className={cn(columns === 2 ? 'grid gap-4 sm:grid-cols-2' : 'space-y-3', className)}\n data-slot=\"check-list\"\n data-testid={testId}\n >\n {items.map((item, i) => (\n <li\n key={i}\n className={cn('flex items-start gap-3 text-sm leading-relaxed', t.muted)}\n data-testid={testId ? `${testId}-item-${i}` : undefined}\n >\n <span\n aria-hidden=\"true\"\n className={cn(\n 'mt-0.5 flex size-5 shrink-0 items-center justify-center rounded-full border',\n t.tile\n )}\n >\n {icon ?? <Check className=\"size-3\" />}\n </span>\n <span>{item}</span>\n </li>\n ))}\n </ul>\n )\n}\n\nexport interface TagListProps {\n items: string[]\n /** Accessible name of the list. */\n label?: string\n className?: string\n testId?: string\n}\n\n/** Small bordered chips: sectors, focus areas, topics. */\nexport function TagList({ items, label, className, testId }: TagListProps) {\n const t = useEditorialTone()\n if (items.length === 0) return null\n return (\n <ul\n aria-label={label}\n className={cn('flex flex-wrap gap-1.5', className)}\n data-slot=\"tag-list\"\n data-testid={testId}\n >\n {items.map((tag) => (\n <li key={tag} className={cn('rounded-sm border px-2 py-0.5 text-[11px]', t.chip)}>\n {tag}\n </li>\n ))}\n </ul>\n )\n}\n","import { useEffect, useRef, useState, type CSSProperties, type ReactNode } from 'react'\nimport { cn } from '@arbidocs/react/ui'\n\nexport interface RevealProps {\n children: ReactNode\n /** Delay in ms before the reveal starts (stagger siblings with `index * 90`). */\n delay?: number\n className?: string\n testId?: string\n}\n\n/**\n * Fade-and-rise on first scroll into view. Content is fully visible until the part has mounted\n * and found an `IntersectionObserver`, so server rendering, no-JS and jsdom show everything; the\n * hidden state and transition live in `blocks.css` (`[data-reveal]`) and collapse under\n * `prefers-reduced-motion`.\n */\nexport function Reveal({ children, delay = 0, className, testId }: RevealProps) {\n const ref = useRef<HTMLDivElement>(null)\n const [state, setState] = useState<'idle' | 'pending' | 'shown'>('idle')\n\n useEffect(() => {\n const el = ref.current\n if (!el || typeof IntersectionObserver === 'undefined') return\n setState('pending')\n const io = new IntersectionObserver(\n (entries) => {\n if (entries.some((e) => e.isIntersecting)) {\n setState('shown')\n io.disconnect()\n }\n },\n { rootMargin: '0px 0px -90px 0px' }\n )\n io.observe(el)\n return () => io.disconnect()\n }, [])\n\n return (\n <div\n ref={ref}\n data-slot=\"reveal\"\n data-reveal={state === 'idle' ? undefined : state}\n style={delay ? ({ '--reveal-delay': `${delay}ms` } as CSSProperties) : undefined}\n className={cn(className)}\n data-testid={testId}\n >\n {children}\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport { ArrowUpRight } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { BlockLink, type BlockLinkComponent } from '../blockLink'\nimport { CheckList, TagList } from './lists'\nimport { Reveal } from './Reveal'\nimport { EditorialToneContext, formatIndex, useEditorialTone, type EditorialTone } from './tone'\n\nexport interface PanelItem {\n title: ReactNode\n body?: ReactNode\n /** Icon in a bordered tile. */\n icon?: ReactNode\n /** Explicit number or label; with `numbered` on the grid it defaults to the position. */\n index?: number | string\n /** A small label above the title (category). */\n kicker?: ReactNode\n /** Bulleted points under the body. */\n points?: ReactNode[]\n /** Chips at the foot. */\n tags?: string[]\n /** Anything at the foot (a meta line, a link). */\n footer?: ReactNode\n /** Makes the whole panel a link. */\n href?: string\n testId?: string\n}\n\nexport interface PanelGridProps {\n items: PanelItem[]\n columns?: 2 | 3 | 4\n /** `cards`: separate bordered panels. `joined`: one hairline-ruled table of cells. */\n variant?: 'cards' | 'joined'\n /** Number the panels 01, 02, ... */\n numbered?: boolean\n /** Fade each panel in on scroll, staggered. */\n reveal?: boolean\n /** Router link for panels with an `href`. */\n linkComponent?: BlockLinkComponent\n /** Heading level of the panel titles (default 3). */\n headingLevel?: 2 | 3 | 4\n tone?: EditorialTone\n className?: string\n testId?: string\n}\n\nconst COLS: Record<2 | 3 | 4, string> = {\n 2: 'sm:grid-cols-2',\n 3: 'sm:grid-cols-2 lg:grid-cols-3',\n 4: 'sm:grid-cols-2 lg:grid-cols-4',\n}\n\n/**\n * Icon, title and body panels: principles, process steps, capability cards, security pillars,\n * practice areas. Cards or a joined hairline table, optional numbers, bullet points, chips and\n * a link per panel.\n */\nexport function PanelGrid({\n items,\n columns = 3,\n variant = 'cards',\n numbered = false,\n reveal = false,\n linkComponent,\n headingLevel = 3,\n tone,\n className,\n testId,\n}: PanelGridProps) {\n const t = useEditorialTone(tone)\n const Heading = `h${headingLevel}` as 'h2' | 'h3' | 'h4'\n const joined = variant === 'joined'\n return (\n <EditorialToneContext.Provider value={t.tone}>\n <ul\n className={cn(\n 'grid',\n joined ? cn('gap-px overflow-hidden rounded-sm border', t.hairline) : 'gap-4',\n joined && (t.tone === 'inverse' ? 'bg-background/15' : 'bg-border'),\n COLS[columns] ?? COLS[3],\n className\n )}\n data-slot=\"panel-grid\"\n data-variant={variant}\n data-testid={testId}\n >\n {items.map((item, i) => {\n const number = item.index ?? (numbered ? i + 1 : undefined)\n const inner = (\n <div\n className={cn(\n 'group flex h-full flex-col p-6 transition-colors duration-300',\n joined\n ? cn(\n t.tone === 'inverse' ? 'bg-foreground' : 'bg-background',\n item.href && 'hover:bg-muted/40'\n )\n : cn('rounded-sm border', t.panel, item.href && t.panelHover)\n )}\n data-testid={item.testId ?? (testId ? `${testId}-item-${i}` : undefined)}\n >\n {(item.icon || number !== undefined || item.href) && (\n <div className=\"flex items-start justify-between gap-4\">\n {item.icon ? (\n <span\n aria-hidden=\"true\"\n className={cn(\n 'flex size-11 items-center justify-center rounded-sm border',\n t.tile\n )}\n >\n {item.icon}\n </span>\n ) : (\n <span />\n )}\n {number !== undefined ? (\n <span className={cn('font-display text-sm tabular-nums', t.subtle)}>\n {formatIndex(number)}\n </span>\n ) : (\n item.href && (\n <ArrowUpRight\n aria-hidden=\"true\"\n className={cn(\n 'size-4 transition-colors group-hover:text-primary',\n t.subtle\n )}\n />\n )\n )}\n </div>\n )}\n {item.kicker && (\n <p\n className={cn(\n 'text-xs font-semibold uppercase tracking-wider',\n item.icon || number !== undefined ? 'mt-5' : '',\n t.accent\n )}\n >\n {item.kicker}\n </p>\n )}\n <Heading\n className={cn(\n 'font-display text-lg font-semibold leading-snug',\n item.icon || number !== undefined || item.kicker ? 'mt-4' : '',\n t.text\n )}\n >\n {item.title}\n </Heading>\n {item.body && (\n <div className={cn('mt-2 text-sm leading-relaxed', t.muted)}>{item.body}</div>\n )}\n {item.points && item.points.length > 0 && (\n <CheckList\n items={item.points}\n className={cn('mt-4 space-y-2 border-t pt-4', t.hairline)}\n />\n )}\n {item.tags && item.tags.length > 0 && (\n <TagList items={item.tags} className=\"mt-auto pt-5\" />\n )}\n {item.footer && (\n <div className={cn('mt-auto pt-5 text-xs', t.subtle)}>{item.footer}</div>\n )}\n </div>\n )\n const cell = (\n <BlockLink href={item.href} linkComponent={linkComponent} className=\"block h-full\">\n {inner}\n </BlockLink>\n )\n return (\n <li key={i} className=\"min-w-0\">\n {reveal ? (\n <Reveal delay={i * 90} className=\"h-full\">\n {cell}\n </Reveal>\n ) : (\n cell\n )}\n </li>\n )\n })}\n </ul>\n </EditorialToneContext.Provider>\n )\n}\n","import type { ReactNode } from 'react'\nimport { cn } from '@arbidocs/react/ui'\nimport { useEditorialTone } from './tone'\n\nexport interface PullQuoteProps {\n quote: ReactNode\n /** Who said it. */\n attribution?: { name: ReactNode; role?: ReactNode }\n /** Link to the source. */\n cite?: string\n align?: 'start' | 'center'\n size?: 'md' | 'lg'\n className?: string\n testId?: string\n}\n\n/** A large display quotation with an accent rule and attribution. */\nexport function PullQuote({\n quote,\n attribution,\n cite,\n align = 'start',\n size = 'md',\n className,\n testId,\n}: PullQuoteProps) {\n const t = useEditorialTone()\n const centered = align === 'center'\n return (\n <figure\n className={cn(\n 'max-w-3xl',\n centered ? 'mx-auto text-center' : 'border-l-2 border-primary pl-6 lg:pl-8',\n className\n )}\n data-slot=\"pull-quote\"\n data-testid={testId}\n >\n <blockquote\n cite={cite}\n className={cn(\n 'font-display font-medium leading-snug text-balance',\n size === 'lg' ? 'text-3xl sm:text-4xl' : 'text-2xl sm:text-3xl',\n t.text\n )}\n >\n <p>{quote}</p>\n </blockquote>\n {attribution && (\n <figcaption className={cn('mt-5 text-sm', t.muted)}>\n <span className={cn('font-semibold', t.text)}>{attribution.name}</span>\n {attribution.role && <span>, {attribution.role}</span>}\n </figcaption>\n )}\n </figure>\n )\n}\n","import type { ReactNode } from 'react'\nimport { ArrowUpRight } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { BlockImage } from '../BlockImage'\nimport { BlockLink, type BlockLinkComponent } from '../blockLink'\nimport { useEditorialTone } from './tone'\n\nexport interface ArticleItem {\n title: ReactNode\n summary?: ReactNode\n /** Category or type, shown as an accent label. */\n kicker?: ReactNode\n /** Short facts joined with a middle dot: author, date, reading time. */\n meta?: ReactNode[]\n href?: string\n imageUrl?: string\n imageAlt?: string\n testId?: string\n}\n\nexport interface ArticleListProps {\n items: ArticleItem[]\n /**\n * `cards`: a grid of cards. `rows`: ruled rows (kicker and meta beside the title), best for an\n * archive.\n */\n layout?: 'cards' | 'rows'\n /** `cards` only: the first item is a large card beside a column of the rest from `lg`. */\n featureFirst?: boolean\n columns?: 2 | 3\n linkComponent?: BlockLinkComponent\n /** Rendered instead of the list when `items` is empty. */\n empty?: ReactNode\n className?: string\n testId?: string\n}\n\nconst COLS: Record<2 | 3, string> = {\n 2: 'md:grid-cols-2',\n 3: 'md:grid-cols-2 lg:grid-cols-3',\n}\n\n/** Insight, news or post listing: `meta` joined with a middle dot, linked cards or rows. */\nfunction MetaLine({ meta, className }: { meta?: ReactNode[]; className?: string }) {\n if (!meta || meta.length === 0) return null\n return (\n <p className={className}>\n {meta.map((m, i) => (\n <span key={i}>\n {i > 0 && <span aria-hidden=\"true\"> · </span>}\n {m}\n </span>\n ))}\n </p>\n )\n}\n\n/** Article, insight or news items as cards (optionally with a lead card) or ruled archive rows. */\nexport function ArticleList({\n items,\n layout = 'cards',\n featureFirst = false,\n columns = 3,\n linkComponent,\n empty,\n className,\n testId,\n}: ArticleListProps) {\n const t = useEditorialTone()\n if (items.length === 0) return empty ? <>{empty}</> : null\n\n const idOf = (item: ArticleItem, i: number) =>\n item.testId ?? (testId ? `${testId}-item-${i}` : undefined)\n\n if (layout === 'rows') {\n return (\n <ul\n className={cn('divide-y border-y', t.hairline, className)}\n data-slot=\"article-list\"\n data-layout=\"rows\"\n data-testid={testId}\n >\n {items.map((item, i) => (\n <li key={i}>\n <BlockLink href={item.href} linkComponent={linkComponent} className=\"group block\">\n <article\n className=\"grid gap-2 py-6 transition-colors sm:grid-cols-[10rem_minmax(0,1fr)_auto] sm:gap-8\"\n data-testid={idOf(item, i)}\n >\n <div className=\"space-y-1\">\n {item.kicker && (\n <p className={cn('text-xs font-semibold uppercase tracking-wider', t.accent)}>\n {item.kicker}\n </p>\n )}\n <MetaLine meta={item.meta} className={cn('text-xs', t.subtle)} />\n </div>\n <div className=\"min-w-0\">\n <h3\n className={cn(\n 'font-display text-xl font-semibold leading-snug transition-colors group-hover:text-primary',\n t.text\n )}\n >\n {item.title}\n </h3>\n {item.summary && (\n <p className={cn('mt-2 text-sm leading-relaxed', t.muted)}>{item.summary}</p>\n )}\n </div>\n {item.href && (\n <ArrowUpRight\n aria-hidden=\"true\"\n className={cn(\n 'hidden size-4 transition-colors group-hover:text-primary sm:block',\n t.subtle\n )}\n />\n )}\n </article>\n </BlockLink>\n </li>\n ))}\n </ul>\n )\n }\n\n const card = (item: ArticleItem, i: number, lead: boolean) => (\n <BlockLink href={item.href} linkComponent={linkComponent} className=\"group block h-full\">\n <article\n className={cn(\n 'flex h-full flex-col rounded-sm border transition-colors duration-300',\n t.panel,\n item.href && t.panelHover,\n lead ? 'p-6 lg:p-8' : 'p-6'\n )}\n data-testid={idOf(item, i)}\n >\n {item.imageUrl && (\n <BlockImage\n src={item.imageUrl}\n alt={item.imageAlt ?? ''}\n aspect=\"16:9\"\n rounded=\"none\"\n className=\"mb-5 w-full\"\n />\n )}\n <div className=\"flex items-start justify-between gap-3\">\n {item.kicker ? (\n <p className={cn('text-xs font-semibold uppercase tracking-wider', t.accent)}>\n {item.kicker}\n </p>\n ) : (\n <span />\n )}\n {item.href && (\n <ArrowUpRight\n aria-hidden=\"true\"\n className={cn('size-4 transition-colors group-hover:text-primary', t.subtle)}\n />\n )}\n </div>\n <h3\n className={cn(\n 'mt-3 font-display font-semibold leading-snug',\n lead ? 'text-2xl sm:text-3xl' : 'text-lg',\n t.text\n )}\n >\n {item.title}\n </h3>\n {item.summary && (\n <p\n className={cn(\n 'mt-3 flex-1 text-sm leading-relaxed',\n lead && 'max-w-xl text-base',\n t.muted\n )}\n >\n {item.summary}\n </p>\n )}\n <MetaLine meta={item.meta} className={cn('mt-5 text-xs', t.subtle)} />\n </article>\n </BlockLink>\n )\n\n if (featureFirst && items.length > 1) {\n const [lead, ...rest] = items\n return (\n <div\n className={cn('grid gap-5 lg:grid-cols-[1.4fr_1fr]', className)}\n data-slot=\"article-list\"\n data-layout=\"feature\"\n data-testid={testId}\n >\n <div>{card(lead, 0, true)}</div>\n <ul className=\"grid gap-5\">\n {rest.map((item, i) => (\n <li key={i}>{card(item, i + 1, false)}</li>\n ))}\n </ul>\n </div>\n )\n }\n\n return (\n <ul\n className={cn('grid gap-5', COLS[columns] ?? COLS[3], className)}\n data-slot=\"article-list\"\n data-layout=\"cards\"\n data-testid={testId}\n >\n {items.map((item, i) => (\n <li key={i}>{card(item, i, false)}</li>\n ))}\n </ul>\n )\n}\n","import type { ReactNode } from 'react'\nimport { cn } from '@arbidocs/react/ui'\nimport { SURFACE_CLASS, SURFACE_TONE, type EditorialSurface } from './EditorialHero'\nimport { EditorialToneContext, useEditorialTone } from './tone'\n\nexport interface ProofStripProps {\n /** The lead statement (an icon and a sentence). */\n lead?: ReactNode\n /** Short labels: standards, memberships, clients. */\n items: ReactNode[]\n /** Accessible name of the label list. */\n label?: string\n surface?: EditorialSurface\n className?: string\n testId?: string\n}\n\n/** A thin band of proof points: a lead statement and a row of short uppercase labels. */\nexport function ProofStrip({\n lead,\n items,\n label,\n surface = 'muted',\n className,\n testId,\n}: ProofStripProps) {\n const tone = SURFACE_TONE[surface]\n const t = useEditorialTone(tone)\n return (\n <EditorialToneContext.Provider value={tone}>\n <section\n aria-label={label}\n className={cn('border-y', t.hairline, SURFACE_CLASS[surface], className)}\n data-slot=\"proof-strip\"\n data-testid={testId}\n >\n <div className=\"mx-auto flex max-w-7xl flex-col items-center gap-5 px-5 py-6 lg:flex-row lg:justify-between lg:px-8\">\n {lead && <div className=\"flex items-center gap-2.5 text-sm font-medium\">{lead}</div>}\n <ul className=\"flex flex-wrap items-center justify-center gap-x-6 gap-y-2\">\n {items.map((item, i) => (\n <li\n key={i}\n className={cn('text-xs font-semibold uppercase tracking-wider', t.subtle)}\n >\n {item}\n </li>\n ))}\n </ul>\n </div>\n </section>\n </EditorialToneContext.Provider>\n )\n}\n\nexport interface CtaBandProps {\n title: ReactNode\n lead?: ReactNode\n /** Buttons or links. */\n actions?: ReactNode\n /** Decoration behind the copy (image, texture), hidden from assistive tech. */\n backdrop?: ReactNode\n /** Default `inverse`: a dark closing band. */\n surface?: EditorialSurface\n className?: string\n testId?: string\n}\n\n/** Closing call-to-action band: centred heading, lead and actions over an optional backdrop. */\nexport function CtaBand({\n title,\n lead,\n actions,\n backdrop,\n surface = 'inverse',\n className,\n testId,\n}: CtaBandProps) {\n const tone = SURFACE_TONE[surface]\n const t = useEditorialTone(tone)\n return (\n <EditorialToneContext.Provider value={tone}>\n <section\n className={cn('relative isolate overflow-hidden', SURFACE_CLASS[surface], className)}\n data-slot=\"cta-band\"\n data-testid={testId}\n >\n {backdrop && (\n <div aria-hidden=\"true\" className=\"pointer-events-none absolute inset-0 -z-10\">\n {backdrop}\n </div>\n )}\n <div className=\"mx-auto max-w-4xl px-5 py-20 text-center lg:px-8 lg:py-24\">\n <h2\n className={cn(\n 'font-display text-3xl font-semibold tracking-tight text-balance sm:text-4xl',\n t.text\n )}\n >\n {title}\n </h2>\n {lead && <p className={cn('mx-auto mt-4 max-w-2xl text-lg', t.muted)}>{lead}</p>}\n {actions && (\n <div className=\"mt-8 flex flex-col items-center justify-center gap-3 sm:flex-row\">\n {actions}\n </div>\n )}\n </div>\n </section>\n </EditorialToneContext.Provider>\n )\n}\n"]}
@@ -49,6 +49,7 @@ function TabButton({
49
49
  // Touch: an icon-only tab still meets the 44px target; a titled active tab truncates.
50
50
  isCompact && tab.icon && (isActive ? "max-w-[45vw]" : "pointer-coarse:min-w-11 justify-center"),
51
51
  tab.disabled && "cursor-not-allowed opacity-50",
52
+ tab.presentation === "count" && "rounded-none border-transparent bg-transparent pl-0 font-normal hover:bg-transparent",
52
53
  tab.tabClassName
53
54
  );
54
55
  const countBadge = tab.count === void 0 ? null : (
@@ -65,7 +66,7 @@ function TabButton({
65
66
  // Compact rows drop counts to save width, but a tab whose glyph lives in the count has
66
67
  // nothing else to show: there the count IS the tab.
67
68
  isCompact && !tab.countIcon ? "hidden" : "inline-flex",
68
- tab.hasActiveFilters ? "font-semibold text-primary" : "text-muted-foreground"
69
+ tab.hasActiveFilters ? "text-primary" : "text-muted-foreground"
69
70
  ),
70
71
  children: [
71
72
  tab.countIcon && /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": true, className: "flex shrink-0 items-center justify-center", children: tab.countIcon }),
@@ -160,6 +161,7 @@ function TabHeader({
160
161
  onTabChange,
161
162
  leading,
162
163
  leftContent,
164
+ firstTabContent,
163
165
  afterTabs,
164
166
  centerContent,
165
167
  absoluteCenterContent,
@@ -206,7 +208,7 @@ function TabHeader({
206
208
  "div",
207
209
  {
208
210
  ref: containerRef,
209
- className: ui.cn("w-full bg-background pt-1 pb-2", className),
211
+ className: ui.cn("w-full bg-background pt-1 pr-3 pb-2", className),
210
212
  "data-slot": "tab-header",
211
213
  "data-testid": chunkMHVNT4J3_cjs.testIdOr(testId, { testId: "tab-header" }),
212
214
  children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative bg-background", children: [
@@ -230,7 +232,7 @@ function TabHeader({
230
232
  leading ? "pl-8" : "pl-3"
231
233
  ),
232
234
  children: leftContent || /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-end gap-1", children: [
233
- tabs.map((tab) => {
235
+ tabs.map((tab, index) => {
234
236
  const tabButton = /* @__PURE__ */ jsxRuntime.jsx(
235
237
  TabButton,
236
238
  {
@@ -244,11 +246,23 @@ function TabHeader({
244
246
  },
245
247
  tab.id
246
248
  );
247
- if (!tab.tooltip) return tabButton;
248
- return /* @__PURE__ */ jsxRuntime.jsxs(ui.Tooltip, { children: [
249
+ const renderedTab = !tab.tooltip ? tabButton : /* @__PURE__ */ jsxRuntime.jsxs(ui.Tooltip, { children: [
249
250
  /* @__PURE__ */ jsxRuntime.jsx(ui.TooltipTrigger, { asChild: true, children: tabButton }),
250
251
  /* @__PURE__ */ jsxRuntime.jsx(ui.TooltipContent, { side: "bottom", children: /* @__PURE__ */ jsxRuntime.jsx("p", { children: tab.tooltip }) })
251
252
  ] }, tab.id);
253
+ if (index !== 0 || !firstTabContent) return renderedTab;
254
+ return /* @__PURE__ */ jsxRuntime.jsxs(
255
+ "div",
256
+ {
257
+ "data-slot": "count-tab-group",
258
+ className: "flex shrink-0 items-end gap-1",
259
+ children: [
260
+ renderedTab,
261
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: ui.cn("self-center", COMPACT_SECTION), children: typeof firstTabContent === "function" ? firstTabContent(isCompact) : firstTabContent })
262
+ ]
263
+ },
264
+ tab.id
265
+ );
252
266
  }),
253
267
  afterTabs && /* @__PURE__ */ jsxRuntime.jsx("div", { className: ui.cn("self-center", COMPACT_SECTION), children: typeof afterTabs === "function" ? afterTabs(isCompact) : afterTabs })
254
268
  ] })
@@ -283,5 +297,5 @@ function TabHeader({
283
297
 
284
298
  exports.DEFAULT_TAB_HEADER_LABELS = DEFAULT_TAB_HEADER_LABELS;
285
299
  exports.TabHeader = TabHeader;
286
- //# sourceMappingURL=chunk-5B4PXAKI.cjs.map
287
- //# sourceMappingURL=chunk-5B4PXAKI.cjs.map
300
+ //# sourceMappingURL=chunk-6DNYPLCD.cjs.map
301
+ //# sourceMappingURL=chunk-6DNYPLCD.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/shell/TabHeader.tsx"],"names":["useCallback","cn","jsxs","testIdOr","jsx","Fragment","Badge","Tooltip","TooltipTrigger","X","TooltipContent","useRef","useState","useEffect","observeResize"],"mappings":"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","file":"chunk-6DNYPLCD.cjs","sourcesContent":["import {\n useCallback,\n useEffect,\n useRef,\n useState,\n type KeyboardEvent,\n type MouseEvent,\n type ReactNode,\n} from 'react'\nimport { X } from 'lucide-react'\nimport { Badge, cn, Tooltip, TooltipContent, TooltipTrigger } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\nimport { observeResize } from '../lib/observe-resize'\n\n/** Fixed strings of the tab row. */\nexport interface TabHeaderLabels {\n /** A tab's close button (a tab's own `closeTooltip` wins). */\n closeTab: string\n}\n\nexport const DEFAULT_TAB_HEADER_LABELS: TabHeaderLabels = {\n closeTab: 'Close tab',\n}\n\nexport interface Tab {\n id: string\n label: string | ReactNode\n testId?: string\n icon?: ReactNode\n /**\n * An entity pill (conversation, workspace, …) shown in place of the icon + label. The app\n * renders it, so the block stays free of entity components.\n */\n pill?: ReactNode\n count?: number\n /** Where the count sits relative to the label. Defaults to 'trailing'. */\n countPlacement?: 'leading' | 'trailing'\n /** Glyph INSIDE the count, in front of the number, so icon and count read as one object. */\n countIcon?: ReactNode\n badge?: string | ReactNode\n disabled?: boolean\n tooltip?: string\n actions?: ReactNode\n /** Hover handlers from actions (e.g. a filter dropdown), attached to the whole tab wrapper. */\n actionsHoverHandlers?: { onMouseEnter: () => void; onMouseLeave: () => void }\n isProcessing?: boolean\n isVariable?: boolean\n onClose?: () => void\n closeTooltip?: string\n hasActiveFilters?: boolean\n /** Entity count header without selectable-tab chrome (Facts, Tasks, Files). */\n presentation?: 'tab' | 'count'\n /** Extra classes for the tab button. */\n tabClassName?: string\n}\n\n/** Forces buttons in a header section to a uniform compact size (28px, 14px text). */\nconst COMPACT_SECTION =\n '[&_button]:h-7 [&_button]:px-2 [&_button]:py-0 [&_button]:text-sm [&_button]:font-medium ' +\n '[&_[role=button]]:h-7 [&_[role=button]]:px-2 [&_[role=button]]:py-0 [&_[role=button]]:text-sm [&_[role=button]]:font-medium ' +\n // Touch: the compact 28px floor is lifted to 44px (important beats the rules above).\n 'pointer-coarse:[&_button]:h-11! pointer-coarse:[&_[role=button]]:h-11!'\n\ninterface TabButtonProps {\n tab: Tab\n isActive: boolean\n /** Closable-items row: a soft chip with a close button instead of an underline. */\n isChip: boolean\n isCompact: boolean\n onTabChange: (tabId: string) => void\n labels: TabHeaderLabels\n testIds?: TabHeaderProps['testIds']\n}\n\nfunction TabButton({\n tab,\n isActive,\n isChip,\n isCompact,\n onTabChange,\n labels,\n testIds,\n}: TabButtonProps) {\n // Compact mode (narrow header) collapses every INACTIVE tab that has an icon to icon-only so\n // the trailing controls are never pushed off the edge. The active tab keeps a truncated title:\n // otherwise two icon-only tabs cannot be told apart on a phone. Collapsed tabs keep an\n // accessible name and a title with their label; label-only tabs keep their text.\n const hideLabel = isCompact && !!tab.icon && !isActive\n const handleClick = useCallback(() => {\n if (!tab.disabled) onTabChange(tab.id)\n }, [tab.disabled, tab.id, onTabChange])\n\n // div+role=button needs explicit keyboard handling; Space must not scroll the page.\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLDivElement>) => {\n if (tab.disabled) return\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n onTabChange(tab.id)\n }\n },\n [tab.disabled, tab.id, onTabChange]\n )\n\n const handleClose = useCallback(\n (e: MouseEvent) => {\n e.stopPropagation()\n tab.onClose?.()\n },\n [tab]\n )\n\n // Two looks, chosen by the row: a row that holds closable items (conversations, open panels)\n // shows soft chips, the active one filled, so \"close\" has an obvious owner. Every other row is a\n // plain underline: ink text + a 2px primary underline for the active tab, nothing else.\n const className = cn(\n 'group relative z-[1] flex pointer-coarse:h-11 cursor-pointer items-center justify-start text-left text-sm transition-colors',\n isChip\n ? 'h-8 max-w-[260px] rounded-md px-2.5'\n : 'h-9 max-w-[320px] border-b-2 bg-transparent px-2.5',\n isChip\n ? isActive\n ? 'bg-muted font-semibold text-foreground'\n : 'bg-transparent font-medium text-muted-foreground hover:bg-muted/60 hover:text-foreground'\n : isActive\n ? 'border-b-primary font-semibold text-foreground'\n : 'border-b-transparent font-medium text-muted-foreground hover:text-foreground',\n // Touch: an icon-only tab still meets the 44px target; a titled active tab truncates.\n isCompact && tab.icon && (isActive ? 'max-w-[45vw]' : 'pointer-coarse:min-w-11 justify-center'),\n tab.disabled && 'cursor-not-allowed opacity-50',\n tab.presentation === 'count' &&\n 'rounded-none border-transparent bg-transparent pl-0 font-normal hover:bg-transparent',\n tab.tabClassName\n )\n\n const countBadge =\n tab.count === undefined ? null : (\n // A plain muted number, a footnote to the label. A filtered count switches to primary ink so\n // \"this is narrowed\" still reads without a fill.\n <span\n data-testid={testIdOr(testIds?.count, { testId: 'tab-count' })}\n className={cn(\n 'flex-shrink-0 items-center justify-center gap-1 font-normal leading-none tabular-nums',\n tab.countIcon ? 'text-sm' : 'text-xs',\n tab.countPlacement === 'leading' ? 'mr-1.5' : 'ml-1.5',\n // Compact rows drop counts to save width, but a tab whose glyph lives in the count has\n // nothing else to show: there the count IS the tab.\n isCompact && !tab.countIcon ? 'hidden' : 'inline-flex',\n tab.hasActiveFilters ? 'text-primary' : 'text-muted-foreground'\n )}\n >\n {tab.countIcon && (\n <span aria-hidden className=\"flex shrink-0 items-center justify-center\">\n {tab.countIcon}\n </span>\n )}\n {tab.isProcessing ? <span className=\"animate-pulse\">{tab.count}</span> : tab.count}\n </span>\n )\n\n const content = tab.pill ? (\n // The outer wrapper hosts the processing dot outside the pill's bounds; the inner span keeps\n // the truncation the pill needs without clipping the dot.\n <span className=\"relative inline-flex min-w-0 items-center\">\n <span className=\"min-w-0 truncate overflow-hidden\">{tab.pill}</span>\n {tab.isProcessing && (\n <span className=\"absolute -right-1 -top-1 size-2 rounded-full border border-background bg-yellow-solid\" />\n )}\n </span>\n ) : (\n <>\n {tab.icon && (\n <span\n className={cn(\n 'flex size-5 flex-shrink-0 items-center justify-center',\n !hideLabel && 'mr-1.5'\n )}\n >\n {tab.icon}\n </span>\n )}\n {tab.countPlacement === 'leading' && countBadge}\n <span className={cn('truncate', hideLabel ? 'hidden' : 'inline')}>{tab.label}</span>\n {tab.countPlacement !== 'leading' && countBadge}\n {tab.badge &&\n (typeof tab.badge === 'string' ? (\n <Badge\n variant=\"outline\"\n className={cn('ml-1.5 truncate', isCompact ? 'max-w-[120px]' : 'max-w-none')}\n >\n {tab.badge}\n </Badge>\n ) : (\n <span className=\"ml-1.5 inline-flex items-center\">{tab.badge}</span>\n ))}\n </>\n )\n\n return (\n <div\n className={cn('flex items-end', isChip && 'pb-1')}\n data-testid={testIdOr(tab.testId, { testId: `${tab.id}-tab` })}\n onMouseEnter={tab.actionsHoverHandlers?.onMouseEnter}\n onMouseLeave={tab.actionsHoverHandlers?.onMouseLeave}\n >\n {/* role=button on a div, not a <button>: a tab whose badge holds a real interactive element\n (an entity tooltip trigger) would otherwise nest a button inside a button. */}\n <div\n role=\"button\"\n tabIndex={tab.disabled ? -1 : 0}\n aria-disabled={tab.disabled || undefined}\n aria-current={isActive ? 'true' : undefined}\n data-slot=\"tab\"\n data-state={isActive ? 'active' : 'inactive'}\n // Icon-only tabs expose the label for a11y and as a native title.\n aria-label={hideLabel && typeof tab.label === 'string' ? tab.label : undefined}\n title={hideLabel && !tab.tooltip && typeof tab.label === 'string' ? tab.label : undefined}\n className={className}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n >\n {content}\n {tab.actions && (\n <span className=\"ml-auto flex-shrink-0\" onClick={(e) => e.stopPropagation()}>\n {tab.actions}\n </span>\n )}\n {tab.onClose && (\n <Tooltip>\n <TooltipTrigger asChild>\n <span\n role=\"button\"\n tabIndex={0}\n className={cn(\n 'ml-0.5 inline-flex !size-4 flex-shrink-0 items-center justify-center rounded-sm !p-0 text-muted-foreground transition-colors hover:bg-foreground/10 hover:text-foreground pointer-coarse:!size-11',\n // A chip row keeps the close button quiet until the chip is the active one or is\n // hovered or focused; touch always shows it (there is no hover).\n isChip &&\n !isActive &&\n 'opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 pointer-coarse:opacity-100'\n )}\n onClick={handleClose}\n aria-label={tab.closeTooltip || labels.closeTab}\n data-testid={testIdOr(testIds?.closeButton, { testId: 'close-tab-button' })}\n >\n <X className=\"size-3\" />\n </span>\n </TooltipTrigger>\n <TooltipContent>\n <p>{tab.closeTooltip || labels.closeTab}</p>\n </TooltipContent>\n </Tooltip>\n )}\n </div>\n </div>\n )\n}\n\nexport interface TabHeaderProps {\n tabs: Tab[]\n activeTabId: string\n onTabChange: (tabId: string) => void\n /** Pinned to the far left before the tabs (e.g. the sidebar toggle). */\n leading?: ReactNode\n leftContent?: ReactNode\n /** Controls attached to the first count tab, before any additional tabs. */\n firstTabContent?: ReactNode | ((isCompact: boolean) => ReactNode)\n afterTabs?: ReactNode | ((isCompact: boolean) => ReactNode)\n centerContent?: ReactNode | ((isCompact: boolean) => ReactNode)\n /** Pinned to the true horizontal center of the row, independent of left/right widths. */\n absoluteCenterContent?: ReactNode\n rightContent?: ReactNode | ((isCompact: boolean) => ReactNode)\n className?: string\n /** Header width below which tabs collapse to icons. */\n compactBreakpoint?: number\n labels?: Partial<TabHeaderLabels>\n /**\n * `chips` renders every tab as a soft chip (for rows of closable items), `underline` as a plain\n * underline tab. Default: chips when any tab can be closed, underline otherwise.\n */\n variant?: 'underline' | 'chips'\n /** Root id (default `tab-header`). */\n testId?: string\n /**\n * Per-tab ids; defaults are the current ids. A tab's own id is `Tab.testId`, else `<tab id>-tab`\n * (structural).\n */\n testIds?: Partial<Record<'count' | 'closeButton', string>>\n}\n\n/** Underline tab row with leading / center / right slots; collapses to icons when narrow. */\nexport function TabHeader({\n tabs,\n activeTabId,\n onTabChange,\n leading,\n leftContent,\n firstTabContent,\n afterTabs,\n centerContent,\n absoluteCenterContent,\n rightContent,\n className,\n compactBreakpoint = 640,\n labels,\n variant,\n testId,\n testIds,\n}: TabHeaderProps) {\n const mergedLabels = { ...DEFAULT_TAB_HEADER_LABELS, ...labels }\n const isChipRow = variant ? variant === 'chips' : tabs.some((tab) => !!tab.onClose)\n const containerRef = useRef<HTMLDivElement>(null)\n const scrollerRef = useRef<HTMLDivElement>(null)\n const [isCompact, setIsCompact] = useState(false)\n const [canScrollEnd, setCanScrollEnd] = useState(false)\n\n useEffect(() => {\n const container = containerRef.current\n if (!container) return\n return observeResize(container, (entries) => {\n for (const entry of entries) setIsCompact(entry.contentRect.width < compactBreakpoint)\n })\n }, [compactBreakpoint])\n\n // Overflow cue: track whether tabs are hidden past the trailing edge.\n useEffect(() => {\n const scroller = scrollerRef.current\n if (!scroller) return\n const update = () =>\n setCanScrollEnd(scroller.scrollLeft + scroller.clientWidth < scroller.scrollWidth - 1)\n update()\n scroller.addEventListener('scroll', update, { passive: true })\n const stopObserving = observeResize(scroller, update)\n return () => {\n scroller.removeEventListener('scroll', update)\n stopObserving()\n }\n }, [tabs.length])\n\n // Keep the active tab visible when it changes (or on first render) in a scrolling row.\n useEffect(() => {\n const active = scrollerRef.current?.querySelector('[data-slot=\"tab\"][data-state=\"active\"]')\n if (active && typeof active.scrollIntoView === 'function') {\n active.scrollIntoView({ inline: 'nearest', block: 'nearest' })\n }\n }, [activeTabId])\n\n return (\n <div\n ref={containerRef}\n className={cn('w-full bg-background pt-1 pr-3 pb-2', className)}\n data-slot=\"tab-header\"\n data-testid={testIdOr(testId, { testId: 'tab-header' })}\n >\n <div className=\"relative bg-background\">\n {/* The hairline lives on this non-scrolling wrapper: overflow-y-hidden on the scroll row\n would clip the active tab's underline overhang. The tabs paint over the line. */}\n <span\n aria-hidden\n className=\"pointer-events-none absolute inset-x-0 bottom-0 h-px bg-border\"\n />\n {/* overflow-y-hidden is mandatory: overflow-x-auto alone makes the browser compute\n overflow-y to `auto` too, surfacing a phantom vertical scrollbar from sub-pixel\n overflow (e.g. the processing dot's -top-1). pt-1 keeps that dot inside the clip box. */}\n <div className=\"relative flex min-h-[40px] items-end justify-between gap-4\">\n {/* Leading slot: placed in the left margin (the pl-8 gap), claiming no extra width. */}\n {leading && (\n <div className=\"absolute bottom-1.5 left-1.5 z-10 flex items-center\">{leading}</div>\n )}\n {/* Only the tabs scroll: the center and right slots sit outside the scroller so they can\n never overlap a tab, and a fade at the trailing edge signals that more tabs exist. */}\n <div className=\"relative flex min-w-0 flex-shrink items-end\">\n <div\n ref={scrollerRef}\n data-slot=\"tab-scroller\"\n className={cn(\n 'flex min-w-0 items-end overflow-x-auto overflow-y-hidden pt-1',\n leading ? 'pl-8' : 'pl-3'\n )}\n >\n {leftContent || (\n <div className=\"flex items-end gap-1\">\n {tabs.map((tab, index) => {\n const tabButton = (\n <TabButton\n key={tab.id}\n tab={tab}\n isActive={activeTabId === tab.id}\n isChip={isChipRow}\n // A lone tab competes with nothing: its label is the surface's title.\n isCompact={isCompact && tabs.length > 1}\n onTabChange={onTabChange}\n labels={mergedLabels}\n testIds={testIds}\n />\n )\n const renderedTab = !tab.tooltip ? (\n tabButton\n ) : (\n <Tooltip key={tab.id}>\n <TooltipTrigger asChild>{tabButton}</TooltipTrigger>\n {/* Below: the header can sit at the very top of the viewport. */}\n <TooltipContent side=\"bottom\">\n <p>{tab.tooltip}</p>\n </TooltipContent>\n </Tooltip>\n )\n if (index !== 0 || !firstTabContent) return renderedTab\n return (\n <div\n key={tab.id}\n data-slot=\"count-tab-group\"\n className=\"flex shrink-0 items-end gap-1\"\n >\n {renderedTab}\n <div className={cn('self-center', COMPACT_SECTION)}>\n {typeof firstTabContent === 'function'\n ? firstTabContent(isCompact)\n : firstTabContent}\n </div>\n </div>\n )\n })}\n {afterTabs && (\n <div className={cn('self-center', COMPACT_SECTION)}>\n {typeof afterTabs === 'function' ? afterTabs(isCompact) : afterTabs}\n </div>\n )}\n </div>\n )}\n </div>\n {canScrollEnd && (\n <span\n aria-hidden\n data-slot=\"tab-scroll-cue\"\n className=\"pointer-events-none absolute inset-y-0 right-0 w-8 bg-gradient-to-l from-background to-transparent\"\n />\n )}\n </div>\n\n {centerContent && (\n <div className={cn('flex min-w-fit flex-1 items-center self-center', COMPACT_SECTION)}>\n {typeof centerContent === 'function' ? centerContent(isCompact) : centerContent}\n </div>\n )}\n\n {/* pointer-events-none on the overlay so clicks reach the tabs beneath; the inner div\n re-enables them for the actual content. */}\n {absoluteCenterContent && (\n <div className=\"pointer-events-none absolute inset-0 z-10 flex items-center justify-center\">\n <div className=\"pointer-events-auto\">{absoluteCenterContent}</div>\n </div>\n )}\n\n <div\n className={cn(\n 'flex flex-shrink-0 items-center justify-end gap-2 self-center',\n COMPACT_SECTION\n )}\n >\n {typeof rightContent === 'function' ? rightContent(isCompact) : rightContent}\n </div>\n </div>\n </div>\n </div>\n )\n}\n"]}