@arbidocs/blocks 0.4.32 → 0.4.37

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 (199) hide show
  1. package/dist/agents/index.cjs +258 -216
  2. package/dist/agents/index.js +9 -7
  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-3AFWGEDJ.cjs +53 -0
  38. package/dist/chunk-3AFWGEDJ.cjs.map +1 -0
  39. package/dist/{chunk-UBNVIIBT.js → chunk-4WWM3GQ5.js} +23 -8
  40. package/dist/chunk-4WWM3GQ5.js.map +1 -0
  41. package/dist/{chunk-56BUD74K.cjs → chunk-65THHQVB.cjs} +27 -27
  42. package/dist/{chunk-56BUD74K.cjs.map → chunk-65THHQVB.cjs.map} +1 -1
  43. package/dist/{chunk-UTYQPVIW.cjs → chunk-7QDX2CO4.cjs} +6 -6
  44. package/dist/{chunk-UTYQPVIW.cjs.map → chunk-7QDX2CO4.cjs.map} +1 -1
  45. package/dist/{chunk-5B4PXAKI.cjs → chunk-7RGLTF76.cjs} +23 -8
  46. package/dist/chunk-7RGLTF76.cjs.map +1 -0
  47. package/dist/{chunk-PLGVMLBD.cjs → chunk-AMXQQCCB.cjs} +1975 -610
  48. package/dist/chunk-AMXQQCCB.cjs.map +1 -0
  49. package/dist/{chunk-NUPVHEJW.js → chunk-BUHKUKKB.js} +7 -4
  50. package/dist/chunk-BUHKUKKB.js.map +1 -0
  51. package/dist/{chunk-4XJZ6AAY.js → chunk-CKB64Z4R.js} +245 -6
  52. package/dist/chunk-CKB64Z4R.js.map +1 -0
  53. package/dist/chunk-DDW3M22Z.js +126 -0
  54. package/dist/chunk-DDW3M22Z.js.map +1 -0
  55. package/dist/{chunk-KXMDOTGW.js → chunk-DLBUFHLY.js} +10 -2
  56. package/dist/chunk-DLBUFHLY.js.map +1 -0
  57. package/dist/{chunk-ZHLMDJCO.cjs → chunk-DLVX6R6B.cjs} +62 -26
  58. package/dist/chunk-DLVX6R6B.cjs.map +1 -0
  59. package/dist/{chunk-JGZTRLKL.cjs → chunk-IA7RTPT3.cjs} +7 -4
  60. package/dist/chunk-IA7RTPT3.cjs.map +1 -0
  61. package/dist/{chunk-6YVI74BC.js → chunk-JH25QIZW.js} +439 -12
  62. package/dist/chunk-JH25QIZW.js.map +1 -0
  63. package/dist/{chunk-FRRDPYBR.cjs → chunk-L7B4W4LA.cjs} +74 -5
  64. package/dist/chunk-L7B4W4LA.cjs.map +1 -0
  65. package/dist/{chunk-NJL4LIXX.js → chunk-LFGJAZ5H.js} +11 -8
  66. package/dist/chunk-LFGJAZ5H.js.map +1 -0
  67. package/dist/{chunk-IAKUTBPX.js → chunk-LYUO3E6V.js} +3 -3
  68. package/dist/{chunk-IAKUTBPX.js.map → chunk-LYUO3E6V.js.map} +1 -1
  69. package/dist/{chunk-EYPPB5CY.cjs → chunk-M2YGPC5N.cjs} +4 -4
  70. package/dist/{chunk-EYPPB5CY.cjs.map → chunk-M2YGPC5N.cjs.map} +1 -1
  71. package/dist/{chunk-5ZBP7TCD.cjs → chunk-MJCCBMM5.cjs} +10 -2
  72. package/dist/chunk-MJCCBMM5.cjs.map +1 -0
  73. package/dist/{chunk-VMCOH3AY.cjs → chunk-NUF2WGGF.cjs} +527 -96
  74. package/dist/chunk-NUF2WGGF.cjs.map +1 -0
  75. package/dist/{chunk-OJSWQM4G.js → chunk-OZJ5PXA6.js} +29 -4
  76. package/dist/chunk-OZJ5PXA6.js.map +1 -0
  77. package/dist/{chunk-3NZR6PAG.js → chunk-PE7Z53RB.js} +70 -4
  78. package/dist/chunk-PE7Z53RB.js.map +1 -0
  79. package/dist/chunk-Q6LF7N3A.cjs +130 -0
  80. package/dist/chunk-Q6LF7N3A.cjs.map +1 -0
  81. package/dist/{chunk-RGHQFJOL.cjs → chunk-QFUF4A4J.cjs} +28 -2
  82. package/dist/chunk-QFUF4A4J.cjs.map +1 -0
  83. package/dist/chunk-RFXJYIDV.js +50 -0
  84. package/dist/chunk-RFXJYIDV.js.map +1 -0
  85. package/dist/{chunk-QN42OA5J.js → chunk-SFXVNFES.js} +4 -4
  86. package/dist/chunk-SFXVNFES.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-S5HZBXZA.cjs → chunk-YJQVLVBJ.cjs} +243 -2
  100. package/dist/chunk-YJQVLVBJ.cjs.map +1 -0
  101. package/dist/{chunk-YMHGF6R5.js → chunk-ZCF2JJFA.js} +3 -3
  102. package/dist/{chunk-YMHGF6R5.js.map → chunk-ZCF2JJFA.js.map} +1 -1
  103. package/dist/{chunk-TZ4QF7EP.js → chunk-ZDA5CZPS.js} +1948 -594
  104. package/dist/chunk-ZDA5CZPS.js.map +1 -0
  105. package/dist/collaboration/index.cjs +45 -41
  106. package/dist/collaboration/index.js +1 -1
  107. package/dist/collaboration/mail/MailMessagePreview.d.ts +11 -0
  108. package/dist/collaboration/mail/index.d.ts +1 -0
  109. package/dist/connect/docx.cjs +4 -4
  110. package/dist/connect/docx.js +1 -1
  111. package/dist/connect/index.cjs +32 -32
  112. package/dist/connect/index.js +3 -3
  113. package/dist/docx/NativeDocxEditor.d.ts +2 -2
  114. package/dist/docx/index.cjs +33 -30
  115. package/dist/docx/index.cjs.map +1 -1
  116. package/dist/docx/index.d.ts +2 -2
  117. package/dist/docx/index.js +3 -4
  118. package/dist/docx/index.js.map +1 -1
  119. package/dist/docx/review/DocxEditorReview.d.ts +16 -0
  120. package/dist/docx/review/index.d.ts +3 -0
  121. package/dist/docx/review/reviewModule.d.ts +6 -0
  122. package/dist/docx/review/useReview.d.ts +29 -0
  123. package/dist/facts/FactsFilterInput.d.ts +2 -46
  124. package/dist/facts/FactsToolbar.d.ts +5 -5
  125. package/dist/facts/index.cjs +27 -124
  126. package/dist/facts/index.cjs.map +1 -1
  127. package/dist/facts/index.js +13 -118
  128. package/dist/facts/index.js.map +1 -1
  129. package/dist/files/FilesPage.d.ts +1 -1
  130. package/dist/files/FilesToolbar.d.ts +1 -1
  131. package/dist/files/FolderPicker.d.ts +2 -1
  132. package/dist/files/ViewerChrome.d.ts +1 -1
  133. package/dist/files/bulk/FolderFilterButton.d.ts +3 -2
  134. package/dist/files/cells/BulkLabelSelect.d.ts +11 -0
  135. package/dist/files/cells/LabelMultiSelect.d.ts +2 -1
  136. package/dist/files/cells/index.d.ts +1 -0
  137. package/dist/files/index.cjs +110 -167
  138. package/dist/files/index.cjs.map +1 -1
  139. package/dist/files/index.js +96 -159
  140. package/dist/files/index.js.map +1 -1
  141. package/dist/home/index.cjs +20 -20
  142. package/dist/home/index.cjs.map +1 -1
  143. package/dist/home/index.js +5 -5
  144. package/dist/home/index.js.map +1 -1
  145. package/dist/index.cjs +646 -623
  146. package/dist/index.cjs.map +1 -1
  147. package/dist/index.d.ts +1 -0
  148. package/dist/index.js +20 -68
  149. package/dist/index.js.map +1 -1
  150. package/dist/settings/SettingsPanel.d.ts +1 -1
  151. package/dist/settings/TriStateFilterMenu.d.ts +3 -1
  152. package/dist/settings/index.cjs +55 -280
  153. package/dist/settings/index.cjs.map +1 -1
  154. package/dist/settings/index.js +17 -248
  155. package/dist/settings/index.js.map +1 -1
  156. package/dist/shell/FilterInput.d.ts +48 -0
  157. package/dist/shell/TabHeader.d.ts +7 -1
  158. package/dist/shell/index.cjs +62 -49
  159. package/dist/shell/index.d.ts +1 -0
  160. package/dist/shell/index.js +4 -3
  161. package/dist/site/index.cjs +62 -62
  162. package/dist/site/index.js +2 -2
  163. package/dist/studio/index.cjs +75 -75
  164. package/dist/studio/index.js +6 -6
  165. package/dist/workspaces/WorkspaceCard.d.ts +2 -2
  166. package/dist/workspaces/index.cjs +9 -2
  167. package/dist/workspaces/index.cjs.map +1 -1
  168. package/dist/workspaces/index.js +9 -2
  169. package/dist/workspaces/index.js.map +1 -1
  170. package/package.json +9 -13
  171. package/src/blocks.css +4 -0
  172. package/src/components/grid.css +10 -0
  173. package/src/docx/styles.css +488 -43
  174. package/dist/chunk-3NZR6PAG.js.map +0 -1
  175. package/dist/chunk-4XJZ6AAY.js.map +0 -1
  176. package/dist/chunk-5B4PXAKI.cjs.map +0 -1
  177. package/dist/chunk-5ZBP7TCD.cjs.map +0 -1
  178. package/dist/chunk-6YVI74BC.js.map +0 -1
  179. package/dist/chunk-C75S6USL.js.map +0 -1
  180. package/dist/chunk-FRRDPYBR.cjs.map +0 -1
  181. package/dist/chunk-GVQOBJKR.cjs.map +0 -1
  182. package/dist/chunk-JGZTRLKL.cjs.map +0 -1
  183. package/dist/chunk-JLOYWXRB.js.map +0 -1
  184. package/dist/chunk-KXMDOTGW.js.map +0 -1
  185. package/dist/chunk-NJL4LIXX.js.map +0 -1
  186. package/dist/chunk-NUPVHEJW.js.map +0 -1
  187. package/dist/chunk-OJSWQM4G.js.map +0 -1
  188. package/dist/chunk-PLGVMLBD.cjs.map +0 -1
  189. package/dist/chunk-QN42OA5J.js.map +0 -1
  190. package/dist/chunk-RGHQFJOL.cjs.map +0 -1
  191. package/dist/chunk-S5HZBXZA.cjs.map +0 -1
  192. package/dist/chunk-TZ4QF7EP.js.map +0 -1
  193. package/dist/chunk-UBNVIIBT.js.map +0 -1
  194. package/dist/chunk-VMCOH3AY.cjs.map +0 -1
  195. package/dist/chunk-WSJVHSGN.js.map +0 -1
  196. package/dist/chunk-YVIOCITQ.cjs.map +0 -1
  197. package/dist/chunk-ZHLMDJCO.cjs.map +0 -1
  198. package/dist/chunk-ZORQ5M3W.cjs.map +0 -1
  199. 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"]}
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunk5ZBP7TCD_cjs = require('./chunk-5ZBP7TCD.cjs');
4
+ var chunkMJCCBMM5_cjs = require('./chunk-MJCCBMM5.cjs');
5
5
  var chunkZW6FPIFC_cjs = require('./chunk-ZW6FPIFC.cjs');
6
6
  var chunkOB5F4577_cjs = require('./chunk-OB5F4577.cjs');
7
7
  var lucideReact = require('lucide-react');
@@ -27,9 +27,9 @@ function DataTable({
27
27
  className
28
28
  }) {
29
29
  const ids = {
30
- table: testIds?.table ?? chunk5ZBP7TCD_cjs.tid(area, "table"),
31
- empty: testIds?.empty ?? chunk5ZBP7TCD_cjs.tid(area, "empty"),
32
- row: testIds?.row ?? ((id) => chunk5ZBP7TCD_cjs.tid(area, "row", id))
30
+ table: testIds?.table ?? chunkMJCCBMM5_cjs.tid(area, "table"),
31
+ empty: testIds?.empty ?? chunkMJCCBMM5_cjs.tid(area, "empty"),
32
+ row: testIds?.row ?? ((id) => chunkMJCCBMM5_cjs.tid(area, "row", id))
33
33
  };
34
34
  const labels = { ...DEFAULT_SELECTION_LABELS, ...selectionLabels };
35
35
  if (rows.length === 0) {
@@ -268,5 +268,5 @@ exports.DataTableBlock = DataTableBlock;
268
268
  exports.MetricCard = MetricCard;
269
269
  exports.PageHeader = PageHeader;
270
270
  exports.StatGroup = StatGroup;
271
- //# sourceMappingURL=chunk-UTYQPVIW.cjs.map
272
- //# sourceMappingURL=chunk-UTYQPVIW.cjs.map
271
+ //# sourceMappingURL=chunk-7QDX2CO4.cjs.map
272
+ //# sourceMappingURL=chunk-7QDX2CO4.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/DataTable.tsx","../src/components/DataTableBlock.tsx","../src/components/PageHeader.tsx","../src/components/MetricCard.tsx","../src/components/StatGroup.tsx"],"names":["tid","jsx","EmptyState","cn","jsxs","Table","TableHeader","TableRow","TableHead","ArrowUp","ArrowDown","ChevronsUpDown","TableBody","TableCell","Card","ArrowUpRight","ArrowDownRight","ActionLink"],"mappings":"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","file":"chunk-UTYQPVIW.cjs","sourcesContent":["import type { ReactNode } from 'react'\nimport { ArrowDown, ArrowUp, ChevronsUpDown } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@arbidocs/react/ui'\nimport { tid } from '../lib/testid'\nimport { EmptyState } from './EmptyState'\n\nexport interface Column<T> {\n key: string\n header: ReactNode\n render: (row: T) => ReactNode\n align?: 'left' | 'right' | 'center'\n /** Header becomes a sort button (needs `sort` and `onSortChange` on the table). */\n isSortable?: boolean\n className?: string\n headClassName?: string\n}\n\nexport interface DataTableSort {\n key: string\n direction: 'asc' | 'desc'\n}\n\nexport interface DataTableTestIds {\n table: string\n empty: string\n /** Test id of a row. */\n row: (id: string) => string\n}\n\nexport interface DataTableProps<T> {\n columns: Column<T>[]\n rows: T[]\n getRowId: (row: T) => string\n onRowClick?: (row: T) => void\n /** Test id area prefix, e.g. \"orders\" gives rows \"orders-row-{id}\". Default \"data\". */\n area?: string\n /** Replaces the ids derived from `area`. */\n testIds?: Partial<DataTableTestIds>\n emptyTitle?: string\n emptyDescription?: string\n /** Controlled sort state. The host sorts `rows`; the table only renders headers. */\n sort?: DataTableSort | null\n onSortChange?: (sort: DataTableSort) => void\n /** Controlled row selection: adds a leading checkbox column when `onSelectedIdsChange` is set. */\n selectedIds?: string[]\n onSelectedIdsChange?: (ids: string[]) => void\n /** Accessible names of the selection checkboxes. */\n selectionLabels?: { selectAll: string; selectRow: string }\n className?: string\n}\n\nconst alignClass = { left: 'text-left', right: 'text-right', center: 'text-center' } as const\n\nconst DEFAULT_SELECTION_LABELS = { selectAll: 'Select all rows', selectRow: 'Select row' }\n\n/** The one true table. Column-config driven, fully test-id'd, optional navigation, sort, selection. */\nexport function DataTable<T>({\n columns,\n rows,\n getRowId,\n onRowClick,\n area = 'data',\n testIds,\n emptyTitle = 'Nothing to show',\n emptyDescription,\n sort,\n onSortChange,\n selectedIds,\n onSelectedIdsChange,\n selectionLabels,\n className,\n}: DataTableProps<T>) {\n const ids = {\n table: testIds?.table ?? tid(area, 'table'),\n empty: testIds?.empty ?? tid(area, 'empty'),\n row: testIds?.row ?? ((id: string) => tid(area, 'row', id)),\n }\n const labels = { ...DEFAULT_SELECTION_LABELS, ...selectionLabels }\n if (rows.length === 0) {\n return <EmptyState title={emptyTitle} description={emptyDescription} testId={ids.empty} />\n }\n\n const isSelectable = Boolean(onSelectedIdsChange)\n const selected = new Set(selectedIds ?? [])\n const rowIds = rows.map(getRowId)\n const allSelected = rowIds.length > 0 && rowIds.every((id) => selected.has(id))\n const toggleRow = (id: string) => {\n const next = new Set(selected)\n if (next.has(id)) next.delete(id)\n else next.add(id)\n onSelectedIdsChange?.([...next])\n }\n\n return (\n <div className={cn('rounded-lg border border-border bg-card', className)}>\n <Table data-testid={ids.table}>\n <TableHeader>\n <TableRow className=\"hover:bg-transparent\">\n {isSelectable && (\n <TableHead className=\"w-10\">\n <input\n type=\"checkbox\"\n aria-label={labels.selectAll}\n checked={allSelected}\n onChange={() => onSelectedIdsChange?.(allSelected ? [] : rowIds)}\n />\n </TableHead>\n )}\n {columns.map((c) => {\n const active = sort?.key === c.key ? sort : null\n const isSortable = c.isSortable && onSortChange\n return (\n <TableHead\n key={c.key}\n aria-sort={\n active ? (active.direction === 'asc' ? 'ascending' : 'descending') : undefined\n }\n className={cn(c.align && alignClass[c.align], c.headClassName)}\n >\n {isSortable ? (\n <button\n type=\"button\"\n className=\"inline-flex items-center gap-1 hover:text-foreground\"\n onClick={() =>\n onSortChange({\n key: c.key,\n direction: active?.direction === 'asc' ? 'desc' : 'asc',\n })\n }\n >\n {c.header}\n {active ? (\n active.direction === 'asc' ? (\n <ArrowUp className=\"size-3\" />\n ) : (\n <ArrowDown className=\"size-3\" />\n )\n ) : (\n <ChevronsUpDown className=\"size-3 opacity-50\" />\n )}\n </button>\n ) : (\n c.header\n )}\n </TableHead>\n )\n })}\n </TableRow>\n </TableHeader>\n <TableBody>\n {rows.map((row) => {\n const id = getRowId(row)\n return (\n <TableRow\n key={id}\n data-testid={ids.row(id)}\n data-state={selected.has(id) ? 'selected' : undefined}\n onClick={onRowClick ? () => onRowClick(row) : undefined}\n className={cn(onRowClick && 'cursor-pointer')}\n >\n {isSelectable && (\n <TableCell className=\"w-10\" onClick={(e) => e.stopPropagation()}>\n <input\n type=\"checkbox\"\n aria-label={labels.selectRow}\n checked={selected.has(id)}\n onChange={() => toggleRow(id)}\n />\n </TableCell>\n )}\n {columns.map((c) => (\n <TableCell\n key={c.key}\n className={cn(c.align && alignClass[c.align], c.className)}\n >\n {c.render(row)}\n </TableCell>\n ))}\n </TableRow>\n )\n })}\n </TableBody>\n </Table>\n </div>\n )\n}\n","/**\n * A **serializable** data table for the Puck builder.\n *\n * The library's developer-facing {@link DataTable} is driven by `Column<T>` whose\n * `header`/`render` are React nodes and functions — powerful, but non-serializable,\n * so it can never be a Puck block. `DataTableBlock` closes that gap with a flat,\n * JSON-safe schema (string headers, string field keys, string cells) and rebuilds\n * the non-serializable `Column<Row>[]` internally, rendering through the very same\n * {@link DataTable} so it inherits the library's markup and tokens verbatim.\n */\nimport { DataTable, type Column } from './DataTable'\n\nexport interface DataTableBlockColumn {\n /** Column heading text. */\n header: string\n /** Key used to look a cell up in each row record. */\n field: string\n /** Cell/heading alignment. */\n align?: 'left' | 'right' | 'center'\n}\n\nexport interface DataTableBlockProps {\n /** Serializable column schema. */\n columns: DataTableBlockColumn[]\n /** One record per row; cells are looked up by each column's `field`. */\n rows: Array<Record<string, string>>\n /** Optional caption rendered above the table. */\n caption?: string\n /** Empty-state title shown when there are no rows. */\n emptyText?: string\n /** testid area prefix; also set on the wrapper element. */\n testId?: string\n}\n\n/** A row wrapper so {@link DataTable} gets a stable id without polluting the record. */\ninterface TableRowData {\n __id: string\n cells: Record<string, string>\n}\n\n/**\n * Renders a {@link DataTable} from a flat, serializable schema. Columns are mapped\n * to `Column<TableRowData>[]` (header string, positional-stable key, alignment) and\n * each cell is resolved by `field`; rows carry a synthetic id for React keys/testids.\n */\nexport function DataTableBlock({ columns, rows, caption, emptyText, testId }: DataTableBlockProps) {\n const area = testId ?? 'data-table-block'\n\n const tableColumns: Column<TableRowData>[] = columns.map((col, index) => ({\n key: col.field || `col-${index}`,\n header: col.header,\n align: col.align,\n render: (row) => row.cells[col.field] ?? '',\n }))\n\n const tableRows: TableRowData[] = rows.map((cells, index) => ({ __id: String(index), cells }))\n\n return (\n <div data-testid={testId}>\n {caption ? (\n <p\n className=\"mb-2 text-sm text-muted-foreground\"\n data-testid={testId ? `${testId}-caption` : undefined}\n >\n {caption}\n </p>\n ) : null}\n <DataTable\n columns={tableColumns}\n rows={tableRows}\n getRowId={(row) => row.__id}\n area={area}\n emptyTitle={emptyText}\n />\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport { cn } from '@arbidocs/react/ui'\n\nexport interface PageHeaderProps {\n title: ReactNode\n eyebrow?: ReactNode\n description?: ReactNode\n /** Before the title block: a back button, an avatar or an icon. */\n leading?: ReactNode\n actions?: ReactNode\n /** Under the whole header: a tab strip or segmented control. */\n tabs?: ReactNode\n className?: string\n testId?: string\n}\n\n/** Standard page title block: leading + eyebrow + title + description + actions, then tabs. */\nexport function PageHeader({\n title,\n eyebrow,\n description,\n leading,\n actions,\n tabs,\n className,\n testId,\n}: PageHeaderProps) {\n return (\n <div className={cn('flex flex-col gap-3', className)} data-testid={testId}>\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-end sm:justify-between\">\n <div className=\"flex min-w-0 items-center gap-3\">\n {leading && (\n <div className=\"shrink-0\" data-slot=\"page-header-leading\">\n {leading}\n </div>\n )}\n <div className=\"min-w-0\">\n {eyebrow && (\n <p className=\"mb-1 text-xs font-semibold uppercase tracking-wider text-muted-foreground\">\n {eyebrow}\n </p>\n )}\n <h1 className=\"font-display text-2xl font-semibold tracking-tight text-foreground\">\n {title}\n </h1>\n {description && (\n <p className=\"mt-1 max-w-2xl text-sm text-muted-foreground\">{description}</p>\n )}\n </div>\n </div>\n {actions && <div className=\"flex shrink-0 items-center gap-2\">{actions}</div>}\n </div>\n {tabs && <div data-slot=\"page-header-tabs\">{tabs}</div>}\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport type { LucideIcon } from 'lucide-react'\nimport { ArrowDownRight, ArrowUpRight } from 'lucide-react'\nimport { Card, cn } from '@arbidocs/react/ui'\nimport { ActionLink } from './ActionLink'\n\nexport interface MetricCardProps {\n label: ReactNode\n value: ReactNode\n icon?: LucideIcon\n hint?: ReactNode\n delta?: { value: string; direction: 'up' | 'down'; good?: boolean }\n /**\n * Icon accent as a theme colour-token key (e.g. `primary`, `success`, or the host's own brand\n * token). Resolved to `var(--color-<accent>)` at render. `'default'` inherits `foreground`.\n */\n accent?: string\n /** Show a placeholder instead of the value (the figure is still being fetched). */\n isLoading?: boolean\n /** Makes the tile a real link (ctrl/cmd-click works). */\n href?: string\n /** Click handler; with `href`, a plain click calls it instead of navigating. */\n onSelect?: () => void\n className?: string\n testId?: string\n}\n\n/** The one true KPI tile. Used across every dashboard and module header. */\nexport function MetricCard({\n label,\n value,\n icon: Icon,\n hint,\n delta,\n accent = 'default',\n isLoading = false,\n href,\n onSelect,\n className,\n testId,\n}: MetricCardProps) {\n const accentStyle =\n accent && accent !== 'default' ? { color: `var(--color-${accent})` } : undefined\n const deltaGood = delta?.good ?? delta?.direction === 'up'\n const isInteractive = Boolean(href || onSelect)\n const card = (\n <Card\n variant=\"elevated\"\n className={cn('card-hover min-w-0 rounded-xl p-5', className)}\n data-testid={isInteractive ? undefined : testId}\n aria-busy={isLoading || undefined}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <p className=\"min-w-0 text-xs font-medium uppercase tracking-wide text-muted-foreground\">\n {label}\n </p>\n {Icon && <Icon className=\"size-4 shrink-0\" style={accentStyle} />}\n </div>\n {isLoading ? (\n <div\n className=\"mt-2 h-8 w-20 animate-pulse rounded bg-muted\"\n data-slot=\"metric-card-skeleton\"\n />\n ) : (\n <p\n className=\"mt-2 font-display text-2xl font-semibold tracking-tight [overflow-wrap:anywhere]\"\n data-testid={testId && `${testId}-value`}\n >\n {value}\n </p>\n )}\n <div className=\"mt-1 flex items-center gap-2\">\n {delta && !isLoading && (\n <span\n className={cn(\n 'inline-flex items-center gap-0.5 text-xs font-medium',\n deltaGood ? 'text-success' : 'text-destructive'\n )}\n >\n {delta.direction === 'up' ? (\n <ArrowUpRight className=\"size-3\" />\n ) : (\n <ArrowDownRight className=\"size-3\" />\n )}\n {delta.value}\n </span>\n )}\n {hint && <span className=\"text-xs text-muted-foreground\">{hint}</span>}\n </div>\n </Card>\n )\n if (!isInteractive) return card\n return (\n <ActionLink\n href={href}\n onSelect={onSelect}\n className=\"block rounded-xl text-left focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n data-testid={testId}\n >\n {card}\n </ActionLink>\n )\n}\n","import { cn } from '@arbidocs/react/ui'\n\nexport interface StatItem {\n value: string\n label: string\n /** Optional caption under the label (e.g. a qualifier or unit). */\n sub?: string\n}\n\nexport interface StatGroupProps {\n items: StatItem[]\n testId?: string\n}\n\nconst GRID: Record<number, string> = {\n 1: 'grid-cols-1',\n 2: 'grid-cols-2',\n 3: 'grid-cols-2 sm:grid-cols-3',\n 4: 'grid-cols-2 lg:grid-cols-4',\n}\n\n/** Big-number stat group — headline metrics with captions. */\nexport function StatGroup({ items, testId }: StatGroupProps) {\n const list = items ?? []\n const cols = GRID[Math.min(list.length, 4)] ?? GRID[4]\n return (\n <dl className={cn('grid gap-8', cols)} data-testid={testId}>\n {list.map((item, i) => (\n <div key={i} className=\"min-w-0 text-center\" data-testid={testId && `${testId}-item-${i}`}>\n <dt className=\"sr-only\">{item.label}</dt>\n <dd className=\"text-4xl font-semibold tracking-tight [overflow-wrap:anywhere] sm:text-5xl\">\n {item.value}\n </dd>\n <p className=\"mt-2 text-sm text-muted-foreground\">{item.label}</p>\n {item.sub && <p className=\"mt-1 text-xs text-muted-foreground/80\">{item.sub}</p>}\n </div>\n ))}\n </dl>\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/components/DataTable.tsx","../src/components/DataTableBlock.tsx","../src/components/PageHeader.tsx","../src/components/MetricCard.tsx","../src/components/StatGroup.tsx"],"names":["tid","jsx","EmptyState","cn","jsxs","Table","TableHeader","TableRow","TableHead","ArrowUp","ArrowDown","ChevronsUpDown","TableBody","TableCell","Card","ArrowUpRight","ArrowDownRight","ActionLink"],"mappings":"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","file":"chunk-7QDX2CO4.cjs","sourcesContent":["import type { ReactNode } from 'react'\nimport { ArrowDown, ArrowUp, ChevronsUpDown } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@arbidocs/react/ui'\nimport { tid } from '../lib/testid'\nimport { EmptyState } from './EmptyState'\n\nexport interface Column<T> {\n key: string\n header: ReactNode\n render: (row: T) => ReactNode\n align?: 'left' | 'right' | 'center'\n /** Header becomes a sort button (needs `sort` and `onSortChange` on the table). */\n isSortable?: boolean\n className?: string\n headClassName?: string\n}\n\nexport interface DataTableSort {\n key: string\n direction: 'asc' | 'desc'\n}\n\nexport interface DataTableTestIds {\n table: string\n empty: string\n /** Test id of a row. */\n row: (id: string) => string\n}\n\nexport interface DataTableProps<T> {\n columns: Column<T>[]\n rows: T[]\n getRowId: (row: T) => string\n onRowClick?: (row: T) => void\n /** Test id area prefix, e.g. \"orders\" gives rows \"orders-row-{id}\". Default \"data\". */\n area?: string\n /** Replaces the ids derived from `area`. */\n testIds?: Partial<DataTableTestIds>\n emptyTitle?: string\n emptyDescription?: string\n /** Controlled sort state. The host sorts `rows`; the table only renders headers. */\n sort?: DataTableSort | null\n onSortChange?: (sort: DataTableSort) => void\n /** Controlled row selection: adds a leading checkbox column when `onSelectedIdsChange` is set. */\n selectedIds?: string[]\n onSelectedIdsChange?: (ids: string[]) => void\n /** Accessible names of the selection checkboxes. */\n selectionLabels?: { selectAll: string; selectRow: string }\n className?: string\n}\n\nconst alignClass = { left: 'text-left', right: 'text-right', center: 'text-center' } as const\n\nconst DEFAULT_SELECTION_LABELS = { selectAll: 'Select all rows', selectRow: 'Select row' }\n\n/** The one true table. Column-config driven, fully test-id'd, optional navigation, sort, selection. */\nexport function DataTable<T>({\n columns,\n rows,\n getRowId,\n onRowClick,\n area = 'data',\n testIds,\n emptyTitle = 'Nothing to show',\n emptyDescription,\n sort,\n onSortChange,\n selectedIds,\n onSelectedIdsChange,\n selectionLabels,\n className,\n}: DataTableProps<T>) {\n const ids = {\n table: testIds?.table ?? tid(area, 'table'),\n empty: testIds?.empty ?? tid(area, 'empty'),\n row: testIds?.row ?? ((id: string) => tid(area, 'row', id)),\n }\n const labels = { ...DEFAULT_SELECTION_LABELS, ...selectionLabels }\n if (rows.length === 0) {\n return <EmptyState title={emptyTitle} description={emptyDescription} testId={ids.empty} />\n }\n\n const isSelectable = Boolean(onSelectedIdsChange)\n const selected = new Set(selectedIds ?? [])\n const rowIds = rows.map(getRowId)\n const allSelected = rowIds.length > 0 && rowIds.every((id) => selected.has(id))\n const toggleRow = (id: string) => {\n const next = new Set(selected)\n if (next.has(id)) next.delete(id)\n else next.add(id)\n onSelectedIdsChange?.([...next])\n }\n\n return (\n <div className={cn('rounded-lg border border-border bg-card', className)}>\n <Table data-testid={ids.table}>\n <TableHeader>\n <TableRow className=\"hover:bg-transparent\">\n {isSelectable && (\n <TableHead className=\"w-10\">\n <input\n type=\"checkbox\"\n aria-label={labels.selectAll}\n checked={allSelected}\n onChange={() => onSelectedIdsChange?.(allSelected ? [] : rowIds)}\n />\n </TableHead>\n )}\n {columns.map((c) => {\n const active = sort?.key === c.key ? sort : null\n const isSortable = c.isSortable && onSortChange\n return (\n <TableHead\n key={c.key}\n aria-sort={\n active ? (active.direction === 'asc' ? 'ascending' : 'descending') : undefined\n }\n className={cn(c.align && alignClass[c.align], c.headClassName)}\n >\n {isSortable ? (\n <button\n type=\"button\"\n className=\"inline-flex items-center gap-1 hover:text-foreground\"\n onClick={() =>\n onSortChange({\n key: c.key,\n direction: active?.direction === 'asc' ? 'desc' : 'asc',\n })\n }\n >\n {c.header}\n {active ? (\n active.direction === 'asc' ? (\n <ArrowUp className=\"size-3\" />\n ) : (\n <ArrowDown className=\"size-3\" />\n )\n ) : (\n <ChevronsUpDown className=\"size-3 opacity-50\" />\n )}\n </button>\n ) : (\n c.header\n )}\n </TableHead>\n )\n })}\n </TableRow>\n </TableHeader>\n <TableBody>\n {rows.map((row) => {\n const id = getRowId(row)\n return (\n <TableRow\n key={id}\n data-testid={ids.row(id)}\n data-state={selected.has(id) ? 'selected' : undefined}\n onClick={onRowClick ? () => onRowClick(row) : undefined}\n className={cn(onRowClick && 'cursor-pointer')}\n >\n {isSelectable && (\n <TableCell className=\"w-10\" onClick={(e) => e.stopPropagation()}>\n <input\n type=\"checkbox\"\n aria-label={labels.selectRow}\n checked={selected.has(id)}\n onChange={() => toggleRow(id)}\n />\n </TableCell>\n )}\n {columns.map((c) => (\n <TableCell\n key={c.key}\n className={cn(c.align && alignClass[c.align], c.className)}\n >\n {c.render(row)}\n </TableCell>\n ))}\n </TableRow>\n )\n })}\n </TableBody>\n </Table>\n </div>\n )\n}\n","/**\n * A **serializable** data table for the Puck builder.\n *\n * The library's developer-facing {@link DataTable} is driven by `Column<T>` whose\n * `header`/`render` are React nodes and functions — powerful, but non-serializable,\n * so it can never be a Puck block. `DataTableBlock` closes that gap with a flat,\n * JSON-safe schema (string headers, string field keys, string cells) and rebuilds\n * the non-serializable `Column<Row>[]` internally, rendering through the very same\n * {@link DataTable} so it inherits the library's markup and tokens verbatim.\n */\nimport { DataTable, type Column } from './DataTable'\n\nexport interface DataTableBlockColumn {\n /** Column heading text. */\n header: string\n /** Key used to look a cell up in each row record. */\n field: string\n /** Cell/heading alignment. */\n align?: 'left' | 'right' | 'center'\n}\n\nexport interface DataTableBlockProps {\n /** Serializable column schema. */\n columns: DataTableBlockColumn[]\n /** One record per row; cells are looked up by each column's `field`. */\n rows: Array<Record<string, string>>\n /** Optional caption rendered above the table. */\n caption?: string\n /** Empty-state title shown when there are no rows. */\n emptyText?: string\n /** testid area prefix; also set on the wrapper element. */\n testId?: string\n}\n\n/** A row wrapper so {@link DataTable} gets a stable id without polluting the record. */\ninterface TableRowData {\n __id: string\n cells: Record<string, string>\n}\n\n/**\n * Renders a {@link DataTable} from a flat, serializable schema. Columns are mapped\n * to `Column<TableRowData>[]` (header string, positional-stable key, alignment) and\n * each cell is resolved by `field`; rows carry a synthetic id for React keys/testids.\n */\nexport function DataTableBlock({ columns, rows, caption, emptyText, testId }: DataTableBlockProps) {\n const area = testId ?? 'data-table-block'\n\n const tableColumns: Column<TableRowData>[] = columns.map((col, index) => ({\n key: col.field || `col-${index}`,\n header: col.header,\n align: col.align,\n render: (row) => row.cells[col.field] ?? '',\n }))\n\n const tableRows: TableRowData[] = rows.map((cells, index) => ({ __id: String(index), cells }))\n\n return (\n <div data-testid={testId}>\n {caption ? (\n <p\n className=\"mb-2 text-sm text-muted-foreground\"\n data-testid={testId ? `${testId}-caption` : undefined}\n >\n {caption}\n </p>\n ) : null}\n <DataTable\n columns={tableColumns}\n rows={tableRows}\n getRowId={(row) => row.__id}\n area={area}\n emptyTitle={emptyText}\n />\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport { cn } from '@arbidocs/react/ui'\n\nexport interface PageHeaderProps {\n title: ReactNode\n eyebrow?: ReactNode\n description?: ReactNode\n /** Before the title block: a back button, an avatar or an icon. */\n leading?: ReactNode\n actions?: ReactNode\n /** Under the whole header: a tab strip or segmented control. */\n tabs?: ReactNode\n className?: string\n testId?: string\n}\n\n/** Standard page title block: leading + eyebrow + title + description + actions, then tabs. */\nexport function PageHeader({\n title,\n eyebrow,\n description,\n leading,\n actions,\n tabs,\n className,\n testId,\n}: PageHeaderProps) {\n return (\n <div className={cn('flex flex-col gap-3', className)} data-testid={testId}>\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-end sm:justify-between\">\n <div className=\"flex min-w-0 items-center gap-3\">\n {leading && (\n <div className=\"shrink-0\" data-slot=\"page-header-leading\">\n {leading}\n </div>\n )}\n <div className=\"min-w-0\">\n {eyebrow && (\n <p className=\"mb-1 text-xs font-semibold uppercase tracking-wider text-muted-foreground\">\n {eyebrow}\n </p>\n )}\n <h1 className=\"font-display text-2xl font-semibold tracking-tight text-foreground\">\n {title}\n </h1>\n {description && (\n <p className=\"mt-1 max-w-2xl text-sm text-muted-foreground\">{description}</p>\n )}\n </div>\n </div>\n {actions && <div className=\"flex shrink-0 items-center gap-2\">{actions}</div>}\n </div>\n {tabs && <div data-slot=\"page-header-tabs\">{tabs}</div>}\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport type { LucideIcon } from 'lucide-react'\nimport { ArrowDownRight, ArrowUpRight } from 'lucide-react'\nimport { Card, cn } from '@arbidocs/react/ui'\nimport { ActionLink } from './ActionLink'\n\nexport interface MetricCardProps {\n label: ReactNode\n value: ReactNode\n icon?: LucideIcon\n hint?: ReactNode\n delta?: { value: string; direction: 'up' | 'down'; good?: boolean }\n /**\n * Icon accent as a theme colour-token key (e.g. `primary`, `success`, or the host's own brand\n * token). Resolved to `var(--color-<accent>)` at render. `'default'` inherits `foreground`.\n */\n accent?: string\n /** Show a placeholder instead of the value (the figure is still being fetched). */\n isLoading?: boolean\n /** Makes the tile a real link (ctrl/cmd-click works). */\n href?: string\n /** Click handler; with `href`, a plain click calls it instead of navigating. */\n onSelect?: () => void\n className?: string\n testId?: string\n}\n\n/** The one true KPI tile. Used across every dashboard and module header. */\nexport function MetricCard({\n label,\n value,\n icon: Icon,\n hint,\n delta,\n accent = 'default',\n isLoading = false,\n href,\n onSelect,\n className,\n testId,\n}: MetricCardProps) {\n const accentStyle =\n accent && accent !== 'default' ? { color: `var(--color-${accent})` } : undefined\n const deltaGood = delta?.good ?? delta?.direction === 'up'\n const isInteractive = Boolean(href || onSelect)\n const card = (\n <Card\n variant=\"elevated\"\n className={cn('card-hover min-w-0 rounded-xl p-5', className)}\n data-testid={isInteractive ? undefined : testId}\n aria-busy={isLoading || undefined}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <p className=\"min-w-0 text-xs font-medium uppercase tracking-wide text-muted-foreground\">\n {label}\n </p>\n {Icon && <Icon className=\"size-4 shrink-0\" style={accentStyle} />}\n </div>\n {isLoading ? (\n <div\n className=\"mt-2 h-8 w-20 animate-pulse rounded bg-muted\"\n data-slot=\"metric-card-skeleton\"\n />\n ) : (\n <p\n className=\"mt-2 font-display text-2xl font-semibold tracking-tight [overflow-wrap:anywhere]\"\n data-testid={testId && `${testId}-value`}\n >\n {value}\n </p>\n )}\n <div className=\"mt-1 flex items-center gap-2\">\n {delta && !isLoading && (\n <span\n className={cn(\n 'inline-flex items-center gap-0.5 text-xs font-medium',\n deltaGood ? 'text-success' : 'text-destructive'\n )}\n >\n {delta.direction === 'up' ? (\n <ArrowUpRight className=\"size-3\" />\n ) : (\n <ArrowDownRight className=\"size-3\" />\n )}\n {delta.value}\n </span>\n )}\n {hint && <span className=\"text-xs text-muted-foreground\">{hint}</span>}\n </div>\n </Card>\n )\n if (!isInteractive) return card\n return (\n <ActionLink\n href={href}\n onSelect={onSelect}\n className=\"block rounded-xl text-left focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n data-testid={testId}\n >\n {card}\n </ActionLink>\n )\n}\n","import { cn } from '@arbidocs/react/ui'\n\nexport interface StatItem {\n value: string\n label: string\n /** Optional caption under the label (e.g. a qualifier or unit). */\n sub?: string\n}\n\nexport interface StatGroupProps {\n items: StatItem[]\n testId?: string\n}\n\nconst GRID: Record<number, string> = {\n 1: 'grid-cols-1',\n 2: 'grid-cols-2',\n 3: 'grid-cols-2 sm:grid-cols-3',\n 4: 'grid-cols-2 lg:grid-cols-4',\n}\n\n/** Big-number stat group — headline metrics with captions. */\nexport function StatGroup({ items, testId }: StatGroupProps) {\n const list = items ?? []\n const cols = GRID[Math.min(list.length, 4)] ?? GRID[4]\n return (\n <dl className={cn('grid gap-8', cols)} data-testid={testId}>\n {list.map((item, i) => (\n <div key={i} className=\"min-w-0 text-center\" data-testid={testId && `${testId}-item-${i}`}>\n <dt className=\"sr-only\">{item.label}</dt>\n <dd className=\"text-4xl font-semibold tracking-tight [overflow-wrap:anywhere] sm:text-5xl\">\n {item.value}\n </dd>\n <p className=\"mt-2 text-sm text-muted-foreground\">{item.label}</p>\n {item.sub && <p className=\"mt-1 text-xs text-muted-foreground/80\">{item.sub}</p>}\n </div>\n ))}\n </dl>\n )\n}\n"]}