@digithings-ai/ui 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (424) hide show
  1. package/README.md +48 -2
  2. package/package.json +143 -4
  3. package/src/components/NavShell.tsx +776 -0
  4. package/src/components/SocialRow.tsx +87 -0
  5. package/src/components/Spinner.tsx +27 -0
  6. package/src/components/StackLogo.tsx +40 -0
  7. package/src/components/Terminal.tsx +110 -0
  8. package/src/components/TerminalManifest.tsx +212 -0
  9. package/src/components/ThemeProvider.tsx +271 -0
  10. package/src/components/account/AuthCard.tsx +309 -0
  11. package/src/components/assistant-ui/elements/mermaid-diagram.aui.tsx +63 -0
  12. package/src/components/assistant-ui/elements/mermaid-diagram.tsx +340 -0
  13. package/src/components/brand/BrandWordmark.tsx +32 -0
  14. package/src/components/changelog/ReleaseRail.tsx +81 -0
  15. package/src/components/changelog/index.ts +1 -0
  16. package/src/components/chat/ChatCodeBlock.tsx +67 -0
  17. package/src/components/chat/ChatMarkdown.tsx +66 -0
  18. package/src/components/chat/ChatMarkdownSource.tsx +203 -0
  19. package/src/components/chat/ChatMermaidBlock.tsx +202 -0
  20. package/src/components/chat/ChatMessage.tsx +77 -0
  21. package/src/components/chat/ChatPlayback.tsx +422 -0
  22. package/src/components/chat/ChatStreamCursor.tsx +25 -0
  23. package/src/components/chat/ChatThinking.tsx +113 -0
  24. package/src/components/chat/ChatToolCall.tsx +190 -0
  25. package/src/components/chat/ChatTranscript.tsx +60 -0
  26. package/src/components/chat/ChatWidgetFrame.tsx +107 -0
  27. package/src/components/chat/DigichatBootLoader.tsx +683 -0
  28. package/src/components/chat/DigichatLauncher.tsx +361 -0
  29. package/src/components/chat/DigichatThread.tsx +118 -0
  30. package/src/components/chat/DigichatThreadList.tsx +54 -0
  31. package/src/components/chat/DigichatWordmark.tsx +24 -0
  32. package/src/components/chat/DotMatrix.tsx +650 -0
  33. package/src/components/chat/boot-lab.tsx +766 -0
  34. package/src/components/chat/boot-signal.ts +144 -0
  35. package/src/components/chat/chat-surfaces.ts +52 -0
  36. package/src/components/chat/connection-status.ts +40 -0
  37. package/src/components/chat/digichat-wordmark.ts +355 -0
  38. package/src/components/chat/disclosure-chevron.tsx +49 -0
  39. package/src/components/chat/followable-href.ts +9 -0
  40. package/src/components/chat/gallery-thread/action-icons.tsx +25 -0
  41. package/src/components/chat/gallery-thread/attachment.aui.tsx +262 -0
  42. package/src/components/chat/gallery-thread/block-caret.tsx +439 -0
  43. package/src/components/chat/gallery-thread/cn.ts +1 -0
  44. package/src/components/chat/gallery-thread/composer-keyboard.ts +106 -0
  45. package/src/components/chat/gallery-thread/composer-trigger-popover.aui.tsx +235 -0
  46. package/src/components/chat/gallery-thread/css.d.ts +6 -0
  47. package/src/components/chat/gallery-thread/file.tsx +238 -0
  48. package/src/components/chat/gallery-thread/follow-up-suggestions.aui.tsx +92 -0
  49. package/src/components/chat/gallery-thread/format-json-dump.ts +112 -0
  50. package/src/components/chat/gallery-thread/hooks/use-attachment-src.ts +46 -0
  51. package/src/components/chat/gallery-thread/hooks/use-copy-to-clipboard.ts +9 -0
  52. package/src/components/chat/gallery-thread/image.tsx +519 -0
  53. package/src/components/chat/gallery-thread/markdown-text.tsx +278 -0
  54. package/src/components/chat/gallery-thread/message-error.aui.tsx +105 -0
  55. package/src/components/chat/gallery-thread/message-timing.aui.tsx +143 -0
  56. package/src/components/chat/gallery-thread/private-work-step.tsx +188 -0
  57. package/src/components/chat/gallery-thread/reasoning.tsx +332 -0
  58. package/src/components/chat/gallery-thread/scroll-mode.ts +174 -0
  59. package/src/components/chat/gallery-thread/source.tsx +76 -0
  60. package/src/components/chat/gallery-thread/thread.aui.tsx +1619 -0
  61. package/src/components/chat/gallery-thread/tooltip-icon-button.tsx +53 -0
  62. package/src/components/chat/gallery-thread/typed-welcome-copy.tsx +18 -0
  63. package/src/components/chat/gallery-thread/ui/tooltip.tsx +22 -0
  64. package/src/components/chat/gallery-thread/work-chain-summary.tsx +48 -0
  65. package/src/components/chat/gallery-thread/work-chain.tsx +110 -0
  66. package/src/components/chat/gallery-thread/work-status.ts +66 -0
  67. package/src/components/chat/overlay-scrollbar.tsx +86 -0
  68. package/src/components/chat/sanitize-mermaid-svg.ts +38 -0
  69. package/src/components/chat/skins/SOURCE.md +36 -0
  70. package/src/components/chat/skins/base/attachment.aui.tsx +287 -0
  71. package/src/components/chat/skins/base/aui-default/README.md +45 -0
  72. package/src/components/chat/skins/base/aui-default/collapsible-root.tsx +19 -0
  73. package/src/components/chat/skins/base/aui-default/collapsible.tsx +21 -0
  74. package/src/components/chat/skins/base/aui-default/reasoning.aui.tsx +120 -0
  75. package/src/components/chat/skins/base/aui-default/reasoning.tsx +331 -0
  76. package/src/components/chat/skins/base/aui-default/surfaces.ts +7 -0
  77. package/src/components/chat/skins/base/aui-default/tool-fallback.aui.tsx +772 -0
  78. package/src/components/chat/skins/base/aui-default/tool-group.aui.tsx +241 -0
  79. package/src/components/chat/skins/base/docs-model-options.ts +6 -0
  80. package/src/components/chat/skins/base/elements/assistant-trace.aui.tsx +169 -0
  81. package/src/components/chat/skins/base/elements/composer-trigger-popover.aui.tsx +271 -0
  82. package/src/components/chat/skins/base/elements/directive-text.aui.tsx +29 -0
  83. package/src/components/chat/skins/base/elements/directive-text.tsx +76 -0
  84. package/src/components/chat/skins/base/elements/message-timing.aui.tsx +104 -0
  85. package/src/components/chat/skins/base/elements/model-selector.aui.tsx +140 -0
  86. package/src/components/chat/skins/base/elements/model-selector.tsx +720 -0
  87. package/src/components/chat/skins/base/elements/quote.aui.tsx +290 -0
  88. package/src/components/chat/skins/base/elements/work-chain.tsx +100 -0
  89. package/src/components/chat/skins/base/markdown-text.tsx +294 -0
  90. package/src/components/chat/skins/base/model.ts +1 -0
  91. package/src/components/chat/skins/base/thread.tsx +1050 -0
  92. package/src/components/chat/skins/base/tooltip-icon-button.tsx +56 -0
  93. package/src/components/chat/skins/base/ui/avatar.tsx +115 -0
  94. package/src/components/chat/skins/base/ui/badge.tsx +51 -0
  95. package/src/components/chat/skins/base/ui/button.tsx +67 -0
  96. package/src/components/chat/skins/base/ui/command.tsx +185 -0
  97. package/src/components/chat/skins/base/ui/dialog.tsx +168 -0
  98. package/src/components/chat/skins/base/ui/dot-matrix.tsx +267 -0
  99. package/src/components/chat/skins/base/ui/popover.tsx +97 -0
  100. package/src/components/chat/skins/base/ui/skeleton.tsx +20 -0
  101. package/src/components/chat/skins/base/ui/textarea.tsx +24 -0
  102. package/src/components/chat/skins/base/ui/tooltip.tsx +73 -0
  103. package/src/components/chat/skins/base-assistant-ui/config-provider.tsx +90 -0
  104. package/src/components/chat/skins/base-assistant-ui/defaults.ts +419 -0
  105. package/src/components/chat/skins/base-assistant-ui/index.tsx +44 -0
  106. package/src/components/chat/skins/chatgpt.tsx +448 -0
  107. package/src/components/chat/skins/claude.tsx +380 -0
  108. package/src/components/chat/skins/digichat-composer-toolbar.tsx +151 -0
  109. package/src/components/chat/skins/digichat-context-meter-shares.ts +158 -0
  110. package/src/components/chat/skins/digichat-context-meter.tsx +243 -0
  111. package/src/components/chat/skins/digichat-meter-tone.ts +26 -0
  112. package/src/components/chat/skins/digichat-usage-meter.tsx +103 -0
  113. package/src/components/chat/skins/digichat.tsx +144 -0
  114. package/src/components/chat/skins/expo-react-native.tsx +29 -0
  115. package/src/components/chat/skins/gemini.tsx +322 -0
  116. package/src/components/chat/skins/grok-icon.tsx +34 -0
  117. package/src/components/chat/skins/grok.tsx +369 -0
  118. package/src/components/chat/skins/index.ts +46 -0
  119. package/src/components/chat/skins/perplexity.tsx +462 -0
  120. package/src/components/chat/skins/product-page-assistant/assistant-modal.tsx +73 -0
  121. package/src/components/chat/skins/product-page-assistant/index.tsx +19 -0
  122. package/src/components/chat/skins/product-page-assistant/product-dashboard.tsx +164 -0
  123. package/src/components/chat/skins/react-ink.tsx +97 -0
  124. package/src/components/chat/skins/thread-skin-host-contract.ts +102 -0
  125. package/src/components/chat/skins/thread-skin-view.tsx +156 -0
  126. package/src/components/chat/skins/thread-skins.ts +143 -0
  127. package/src/components/chat/skins/tooltip-icon-button.tsx +35 -0
  128. package/src/components/chat/skins/ui/dropdown-menu.tsx +272 -0
  129. package/src/components/chat/skins/webpage-assistant/assistant-config.ts +238 -0
  130. package/src/components/chat/skins/webpage-assistant/assistant-modal.tsx +78 -0
  131. package/src/components/chat/skins/webpage-assistant/config-provider.tsx +132 -0
  132. package/src/components/chat/skins/webpage-assistant/docs-app.tsx +106 -0
  133. package/src/components/chat/skins/webpage-assistant/docs-article.tsx +109 -0
  134. package/src/components/chat/skins/webpage-assistant/docs-assistant.tsx +73 -0
  135. package/src/components/chat/skins/webpage-assistant/docs-nav.tsx +81 -0
  136. package/src/components/chat/skins/webpage-assistant/host-ui.ts +79 -0
  137. package/src/components/chat/skins/webpage-assistant/index.tsx +12 -0
  138. package/src/components/chat/skins/webpage-assistant/markdown-page.tsx +11 -0
  139. package/src/components/chat/skins/webpage-assistant/pages.ts +9 -0
  140. package/src/components/chat/skins/webpage-assistant/types.ts +178 -0
  141. package/src/components/chat/skins/webpage-assistant/use-mobile.ts +19 -0
  142. package/src/components/chat/stock/SOURCE.md +90 -0
  143. package/src/components/chat/stock/artifacts-panel.tsx +305 -0
  144. package/src/components/chat/stock/attachment.aui.tsx +280 -0
  145. package/src/components/chat/stock/chat-notice.tsx +143 -0
  146. package/src/components/chat/stock/chat-private-mode.tsx +64 -0
  147. package/src/components/chat/stock/deploy-ui-context.tsx +89 -0
  148. package/src/components/chat/stock/embed-chat-prefs.tsx +471 -0
  149. package/src/components/chat/stock/file.tsx +265 -0
  150. package/src/components/chat/stock/follow-up-suggestions.aui.tsx +83 -0
  151. package/src/components/chat/stock/image.tsx +531 -0
  152. package/src/components/chat/stock/index.ts +129 -0
  153. package/src/components/chat/stock/json-view.tsx +140 -0
  154. package/src/components/chat/stock/markdown-text.tsx +319 -0
  155. package/src/components/chat/stock/message-error.aui.tsx +96 -0
  156. package/src/components/chat/stock/message-export-menu.tsx +156 -0
  157. package/src/components/chat/stock/palette-row-preview.tsx +26 -0
  158. package/src/components/chat/stock/reasoning.aui.tsx +120 -0
  159. package/src/components/chat/stock/reasoning.tsx +335 -0
  160. package/src/components/chat/stock/skin-chrome.tsx +81 -0
  161. package/src/components/chat/stock/skin-credit.tsx +63 -0
  162. package/src/components/chat/stock/skin-palette-bridge.tsx +235 -0
  163. package/src/components/chat/stock/skin-palette-context.ts +16 -0
  164. package/src/components/chat/stock/skin-runtime.tsx +52 -0
  165. package/src/components/chat/stock/skin-slash-palette.tsx +393 -0
  166. package/src/components/chat/stock/skin-types.ts +217 -0
  167. package/src/components/chat/stock/stock-chat-prefs-host.tsx +501 -0
  168. package/src/components/chat/stock/stock-send-gate.tsx +94 -0
  169. package/src/components/chat/stock/stock-shape.tsx +39 -0
  170. package/src/components/chat/stock/thread.aui.tsx +645 -0
  171. package/src/components/chat/stock/tool-display.ts +6 -0
  172. package/src/components/chat/stock/tool-fallback.aui.tsx +866 -0
  173. package/src/components/chat/stock/tool-group.aui.tsx +244 -0
  174. package/src/components/chat/stock/tool-surface.ts +120 -0
  175. package/src/components/chat/stock/tooltip-icon-button.tsx +49 -0
  176. package/src/components/chat/stock/ui/avatar.tsx +108 -0
  177. package/src/components/chat/stock/ui/button.tsx +81 -0
  178. package/src/components/chat/stock/ui/collapsible.tsx +21 -0
  179. package/src/components/chat/stock/ui/dialog.tsx +163 -0
  180. package/src/components/chat/stock/ui/skeleton.tsx +13 -0
  181. package/src/components/chat/stock/ui/textarea.tsx +20 -0
  182. package/src/components/chat/stock/ui/tooltip.tsx +68 -0
  183. package/src/components/chat/stock/use-attachment-src.ts +42 -0
  184. package/src/components/chat/stock/use-copy-to-clipboard.ts +29 -0
  185. package/src/components/chat/strip-model-boilerplate.ts +42 -0
  186. package/src/components/chat/suggestion-cycle.tsx +230 -0
  187. package/src/components/chat/suggestion-scroll-row.tsx +81 -0
  188. package/src/components/chat/trace-grouping/chain-group-by.ts +44 -0
  189. package/src/components/chat/trace-grouping/chain-state.ts +141 -0
  190. package/src/components/chat/trace-grouping/index.ts +32 -0
  191. package/src/components/chat/trace-grouping/tool-row.ts +74 -0
  192. package/src/components/chat/trace-grouping/use-deploy-work-disclosure.ts +35 -0
  193. package/src/components/chat/trace-grouping/use-work-chain.ts +103 -0
  194. package/src/components/chat/trace-i18n/core.ts +48 -0
  195. package/src/components/chat/trace-i18n/index.tsx +23 -0
  196. package/src/components/chat/trace-i18n/locales/en.ts +24 -0
  197. package/src/components/chat/trace-i18n/locales/fr.ts +28 -0
  198. package/src/components/chat/trace-i18n/types.ts +35 -0
  199. package/src/components/chat/trace-spacing.ts +249 -0
  200. package/src/components/chat/transcript/activity-view.ts +375 -0
  201. package/src/components/chat/transcript/chat-export.ts +133 -0
  202. package/src/components/chat/transcript/index.ts +10 -0
  203. package/src/components/chat/transcript/save-file.ts +209 -0
  204. package/src/components/chat/transcript/transcript-markdown.ts +428 -0
  205. package/src/components/chat/transcript/types.ts +81 -0
  206. package/src/components/chat/turn-outcome.ts +52 -0
  207. package/src/components/chat/use-warmup-phase.ts +18 -0
  208. package/src/components/chat/work-status-lead.tsx +49 -0
  209. package/src/components/chrome.tsx +264 -0
  210. package/src/components/command-palette/CommandPalette.tsx +404 -0
  211. package/src/components/command-palette/index.ts +6 -0
  212. package/src/components/contact/ContactMailto.tsx +112 -0
  213. package/src/components/contact/index.ts +5 -0
  214. package/src/components/conviction/ConvictionMeter.tsx +40 -0
  215. package/src/components/conviction/SignedConvictionBadge.tsx +26 -0
  216. package/src/components/conviction/index.ts +7 -0
  217. package/src/components/data-layout/BentoGrid.tsx +52 -0
  218. package/src/components/data-layout/CardRail.tsx +150 -0
  219. package/src/components/data-layout/DotMatrixStat.tsx +65 -0
  220. package/src/components/data-layout/FeatureCell.tsx +80 -0
  221. package/src/components/data-layout/MediaFrame.tsx +125 -0
  222. package/src/components/data-layout/ModuleGrid.tsx +735 -0
  223. package/src/components/data-layout/Odometer.tsx +149 -0
  224. package/src/components/data-layout/ProductFrame.tsx +79 -0
  225. package/src/components/data-layout/TestimonialWall.tsx +139 -0
  226. package/src/components/data-layout/index.ts +19 -0
  227. package/src/components/data-layout/treemap.ts +368 -0
  228. package/src/components/deck/DeckStack.tsx +243 -0
  229. package/src/components/desk/DataTable.tsx +373 -0
  230. package/src/components/desk/KpiGrid.tsx +80 -0
  231. package/src/components/desk/Sparkline.tsx +63 -0
  232. package/src/components/desk/StateBlock.tsx +132 -0
  233. package/src/components/desk/index.ts +18 -0
  234. package/src/components/diagrams/ArchitectureDiagram.tsx +350 -0
  235. package/src/components/diagrams/ArchitectureTour.tsx +912 -0
  236. package/src/components/diagrams/TerminalSchematic.tsx +192 -0
  237. package/src/components/diagrams/architecture-svg.tsx +384 -0
  238. package/src/components/diagrams/index.ts +30 -0
  239. package/src/components/diagrams/mermaid-theme.ts +115 -0
  240. package/src/components/diagrams/tour-camera.ts +171 -0
  241. package/src/components/docs/CodeTabs.tsx +90 -0
  242. package/src/components/docs/CopyCommand.tsx +151 -0
  243. package/src/components/docs/DocsLayout.tsx +197 -0
  244. package/src/components/docs/DocsSearch.tsx +97 -0
  245. package/src/components/docs/Endpoint.tsx +135 -0
  246. package/src/components/document/DocumentFrame.tsx +43 -0
  247. package/src/components/document/GlyphList.tsx +51 -0
  248. package/src/components/document/PageTitle.tsx +44 -0
  249. package/src/components/document/Prose.tsx +38 -0
  250. package/src/components/document/Section.tsx +55 -0
  251. package/src/components/document/index.ts +13 -0
  252. package/src/components/effects-chrome/AnnouncementBar.tsx +88 -0
  253. package/src/components/effects-chrome/HorizontalScrollTrack.tsx +461 -0
  254. package/src/components/effects-chrome/Pipeline.tsx +226 -0
  255. package/src/components/effects-chrome/RotatingPrompts.tsx +116 -0
  256. package/src/components/effects-chrome/StackingPanels.tsx +101 -0
  257. package/src/components/effects-chrome/TabStrip.tsx +232 -0
  258. package/src/components/effects-chrome/ToastStack.tsx +201 -0
  259. package/src/components/effects-chrome/horizontal-track-core.ts +70 -0
  260. package/src/components/effects-chrome/index.ts +35 -0
  261. package/src/components/emblems.tsx +188 -0
  262. package/src/components/faviconTheme.ts +23 -0
  263. package/src/components/figure/Figure.tsx +38 -0
  264. package/src/components/figure/index.ts +2 -0
  265. package/src/components/finance-charts/DrawdownPlot.tsx +76 -0
  266. package/src/components/finance-charts/EquityCurve.tsx +71 -0
  267. package/src/components/finance-charts/PriceChart.tsx +119 -0
  268. package/src/components/finance-charts/chart-host.tsx +236 -0
  269. package/src/components/finance-charts/chart-scale.ts +93 -0
  270. package/src/components/finance-charts/demo-data.ts +88 -0
  271. package/src/components/finance-charts/index.ts +46 -0
  272. package/src/components/finance-charts/lw-chart.tsx +292 -0
  273. package/src/components/finance-composites/MarketBar.tsx +243 -0
  274. package/src/components/finance-composites/OrderBook.tsx +133 -0
  275. package/src/components/finance-composites/PerformanceDashboard.tsx +185 -0
  276. package/src/components/finance-composites/SortableTable.tsx +144 -0
  277. package/src/components/finance-composites/StockTicker.tsx +65 -0
  278. package/src/components/finance-composites/SyncedTearsheet.tsx +226 -0
  279. package/src/components/finance-composites/index.ts +28 -0
  280. package/src/components/finance-tearsheet/KpiStrip.tsx +49 -0
  281. package/src/components/finance-tearsheet/LiveBadge.tsx +29 -0
  282. package/src/components/finance-tearsheet/ReturnsMatrix.tsx +321 -0
  283. package/src/components/finance-tearsheet/StrategyTearsheet.tsx +99 -0
  284. package/src/components/finance-tearsheet/TearsheetCard.tsx +54 -0
  285. package/src/components/finance-tearsheet/TradeLogTable.tsx +73 -0
  286. package/src/components/finance-tearsheet/charts.tsx +2624 -0
  287. package/src/components/finance-tearsheet/demo-data.ts +177 -0
  288. package/src/components/finance-tearsheet/format.ts +41 -0
  289. package/src/components/finance-tearsheet/index.ts +120 -0
  290. package/src/components/finance-tearsheet/print.ts +52 -0
  291. package/src/components/finance-tearsheet/risk-bands.ts +48 -0
  292. package/src/components/finance-tearsheet/stats.ts +35 -0
  293. package/src/components/finance-tearsheet/strategy-sheet-model.ts +238 -0
  294. package/src/components/finance-tearsheet/types.ts +58 -0
  295. package/src/components/footer/FooterCells.tsx +109 -0
  296. package/src/components/footer/index.ts +6 -0
  297. package/src/components/graph.tsx +158 -0
  298. package/src/components/icons.tsx +98 -0
  299. package/src/components/landing/PixelWordmark.tsx +36 -0
  300. package/src/components/logos.ts +39 -0
  301. package/src/components/marquee/Marquee.tsx +204 -0
  302. package/src/components/metrics/PerfMetrics.tsx +68 -0
  303. package/src/components/metrics/StatCounter.tsx +104 -0
  304. package/src/components/page-geometry.tsx +177 -0
  305. package/src/components/pricing/Pricing.tsx +174 -0
  306. package/src/components/pricing/PricingMatrix.tsx +219 -0
  307. package/src/components/prose/index.ts +2 -0
  308. package/src/components/prose/prose.tsx +86 -0
  309. package/src/components/repo-activity/RepoActivity.tsx +599 -0
  310. package/src/components/repo-activity/RepoHeatmap.tsx +225 -0
  311. package/src/components/repo-activity/demo.ts +201 -0
  312. package/src/components/repo-activity/fetch.ts +211 -0
  313. package/src/components/repo-activity/heatmap.ts +123 -0
  314. package/src/components/repo-activity/index.ts +28 -0
  315. package/src/components/repo-activity/types.ts +99 -0
  316. package/src/components/stages/NumberedStages.tsx +116 -0
  317. package/src/components/symbols/marks.tsx +116 -0
  318. package/src/components/symbols/terminal-lockup.tsx +136 -0
  319. package/src/components/symbols/terminal-marks.tsx +226 -0
  320. package/src/components/terminal/ChatResponseLoader.tsx +67 -0
  321. package/src/components/terminal/ContainerBootLoader.tsx +82 -0
  322. package/src/components/terminal/TerminalStepCaret.tsx +202 -0
  323. package/src/components/themeInit.ts +24 -0
  324. package/src/components/typography/MotionReveal.tsx +108 -0
  325. package/src/components/typography/TypewriterReveal.tsx +101 -0
  326. package/src/components/typography/WordReveal.tsx +143 -0
  327. package/src/data/modules.ts +378 -0
  328. package/src/data/subsystems.ts +101 -0
  329. package/src/index.ts +587 -0
  330. package/src/lib/base-path.ts +60 -0
  331. package/src/lib/cx.ts +25 -0
  332. package/src/lib/gloomberb.ts +69 -0
  333. package/src/lib/record.ts +19 -0
  334. package/src/lib/stub-payload.ts +183 -0
  335. package/src/lib/useBodyScrollLock.ts +44 -0
  336. package/src/lib/utils.ts +6 -0
  337. package/src/motion/primitives.tsx +105 -0
  338. package/src/motion/scroll-glide.ts +62 -0
  339. package/src/motion/scrolly-core.ts +38 -0
  340. package/src/motion/scrolly.tsx +95 -0
  341. package/src/navigation/HashScrollManager.tsx +167 -0
  342. package/src/navigation/hashScroll.ts +78 -0
  343. package/src/replay/browser.ts +280 -0
  344. package/src/replay/chat-export-run.ts +121 -0
  345. package/src/replay/export-format.ts +25 -0
  346. package/src/replay/export-mount.ts +32 -0
  347. package/src/replay/filename.ts +54 -0
  348. package/src/replay/index.ts +21 -0
  349. package/src/replay/redact-dom.ts +178 -0
  350. package/src/replay/redact.ts +113 -0
  351. package/src/replay/snapshot.ts +659 -0
  352. package/src/styles/account-auth.css +339 -0
  353. package/src/styles/brand-wordmark.css +11 -0
  354. package/src/styles/card-rail.css +120 -0
  355. package/src/styles/chat-aui.css +1143 -0
  356. package/src/styles/chat-core.css +469 -0
  357. package/src/styles/chat-digichat.css +2531 -0
  358. package/src/styles/chat-math.css +70 -0
  359. package/src/styles/chat-skin-palette.css +138 -0
  360. package/src/styles/chat-stock-menu.css +37 -0
  361. package/src/styles/chat-widgets.css +190 -0
  362. package/src/styles/command-palette.css +372 -0
  363. package/src/styles/controls-core.css +2261 -0
  364. package/src/styles/controls-overlay.css +603 -0
  365. package/src/styles/data-layout.css +288 -0
  366. package/src/styles/deck.css +141 -0
  367. package/src/styles/diagrams.css +1860 -0
  368. package/src/styles/digichat-app-theme.css +250 -0
  369. package/src/styles/digichat-boot-loader.css +487 -0
  370. package/src/styles/digichat-launcher.css +377 -0
  371. package/src/styles/docs.css +165 -0
  372. package/src/styles/effects-chrome.css +888 -0
  373. package/src/styles/finance-composites.css +214 -0
  374. package/src/styles/finance-tearsheet-overlay.css +90 -0
  375. package/src/styles/finance-tearsheet.css +945 -0
  376. package/src/styles/marquee.css +168 -0
  377. package/src/styles/metrics.css +82 -0
  378. package/src/styles/nav-shell.css +551 -0
  379. package/src/styles/pricing.css +79 -0
  380. package/src/styles/repo-activity.css +575 -0
  381. package/src/styles/stages.css +69 -0
  382. package/src/styles/terminal-loaders.css +122 -0
  383. package/src/styles/terminal-manifest.css +228 -0
  384. package/src/styles/web-theme.css +1007 -0
  385. package/src/styles/word-reveal.css +204 -0
  386. package/src/theme/apply-theme.ts +214 -0
  387. package/src/theme/index.ts +27 -0
  388. package/src/theme/palette-registry.ts +855 -0
  389. package/src/theme/tui-prefs.ts +64 -0
  390. package/src/ui/alert.tsx +78 -0
  391. package/src/ui/avatar.tsx +104 -0
  392. package/src/ui/badge.tsx +75 -0
  393. package/src/ui/breadcrumb.tsx +61 -0
  394. package/src/ui/button.tsx +67 -0
  395. package/src/ui/card.tsx +139 -0
  396. package/src/ui/checkbox.tsx +27 -0
  397. package/src/ui/collapsible.tsx +32 -0
  398. package/src/ui/date-pager.tsx +325 -0
  399. package/src/ui/dialog.tsx +157 -0
  400. package/src/ui/dropdown-menu.tsx +267 -0
  401. package/src/ui/empty-state.tsx +165 -0
  402. package/src/ui/field.tsx +104 -0
  403. package/src/ui/form.tsx +36 -0
  404. package/src/ui/icon-button.tsx +36 -0
  405. package/src/ui/index.ts +34 -0
  406. package/src/ui/input.tsx +33 -0
  407. package/src/ui/kbd.tsx +30 -0
  408. package/src/ui/label.tsx +32 -0
  409. package/src/ui/pager.tsx +119 -0
  410. package/src/ui/pagination.tsx +126 -0
  411. package/src/ui/radio-group.tsx +51 -0
  412. package/src/ui/search-bar.tsx +85 -0
  413. package/src/ui/segmented-control.tsx +76 -0
  414. package/src/ui/select.tsx +257 -0
  415. package/src/ui/separator.tsx +24 -0
  416. package/src/ui/sheet.tsx +141 -0
  417. package/src/ui/skeleton.tsx +76 -0
  418. package/src/ui/slider.tsx +76 -0
  419. package/src/ui/switch.tsx +31 -0
  420. package/src/ui/table.tsx +179 -0
  421. package/src/ui/tabs.tsx +89 -0
  422. package/src/ui/tags-input.tsx +168 -0
  423. package/src/ui/textarea.tsx +17 -0
  424. package/src/ui/tooltip.tsx +71 -0
@@ -0,0 +1,174 @@
1
+ /**
2
+ * Pricing — the open-core tier-card family. `PricingTierCard` is one hairline
3
+ * card: name, mono price line, soft description, ✓-marked feature list
4
+ * (check-marker grammar in styles/pricing.css), and a CTA slot; `accent`
5
+ * tints the featured tier (two-color mix, also styles/pricing.css). The
6
+ * `variant` picks a density: "compact" is the reference/catalog voice,
7
+ * "hero" the marketing-page voice (digiquant contact tiers). `Pricing` lays
8
+ * cards out on the two-up grid with an optional hairline trust line;
9
+ * `PrecisionTable` is the per-unit price table riding the tearsheet
10
+ * hairline-row, mono-numeral voice. Every name, price, feature and CTA
11
+ * arrives as a prop — nothing product-specific baked in. Static display
12
+ * components; no client state.
13
+ */
14
+ import type { ElementType, ReactNode } from "react";
15
+
16
+ const cx = (...parts: Array<string | false | undefined>) => parts.filter(Boolean).join(" ");
17
+
18
+ export interface PricingTierCardProps {
19
+ /** Tier name, e.g. "Self-hosted". */
20
+ name: ReactNode;
21
+ /** Element rendered for the name (default "p"; marketing pages want "h3"). */
22
+ nameAs?: ElementType;
23
+ /** Mono sub-line under the name ("$40/mo", "open core · free", "contact us"). */
24
+ priceLine?: ReactNode;
25
+ /** Soft body copy under the name/price line. */
26
+ description?: ReactNode;
27
+ /** ✓-marked feature rows — the check-marker grammar. */
28
+ features?: ReactNode[];
29
+ /** CTA slot — the caller brings its own button/anchor dressing (btn-*). */
30
+ cta?: ReactNode;
31
+ /** Featured tier: accent-tinted border + wash (styles/pricing.css). */
32
+ accent?: boolean;
33
+ /** Density: "compact" (reference/catalog) or "hero" (marketing page). */
34
+ variant?: "compact" | "hero";
35
+ className?: string;
36
+ }
37
+
38
+ /** One pricing tier card. Composable alone (apps own their grid) or via <Pricing/>. */
39
+ export function PricingTierCard({
40
+ name,
41
+ nameAs: NameTag = "p",
42
+ priceLine,
43
+ description,
44
+ features,
45
+ cta,
46
+ accent = false,
47
+ variant = "compact",
48
+ className,
49
+ }: PricingTierCardProps) {
50
+ const hero = variant === "hero";
51
+ return (
52
+ <div
53
+ className={cx(
54
+ "border",
55
+ hero ? "rounded-none px-[1.8rem] py-[2rem]" : "rounded-none p-[1.1rem]",
56
+ accent ? "pricing-tier-accent" : "border-hair bg-surface",
57
+ className,
58
+ )}
59
+ >
60
+ <NameTag className={hero ? "text-[1.4rem] font-semibold tracking-[-0.02em]" : "text-[1rem]"}>
61
+ {name}
62
+ </NameTag>
63
+ {priceLine != null ? (
64
+ <p
65
+ className={cx(
66
+ "mt-[0.4rem] font-mono text-ink-soft",
67
+ hero ? "text-[0.95rem]" : "text-[0.78rem]",
68
+ )}
69
+ >
70
+ {priceLine}
71
+ </p>
72
+ ) : null}
73
+ {description != null ? (
74
+ <p className="mt-[0.4rem] text-[0.85rem] text-ink-soft">{description}</p>
75
+ ) : null}
76
+ {features && features.length > 0 ? (
77
+ <ul
78
+ className={cx(
79
+ "m-0 flex list-none flex-col gap-[0.55rem] p-0 text-[0.9rem] text-ink-soft",
80
+ hero ? "mt-[1.3rem]" : "mt-[0.8rem]",
81
+ )}
82
+ >
83
+ {features.map((feature, i) => (
84
+ <li key={i} className="pricing-feature flex items-start gap-[0.55rem]">
85
+ {feature}
86
+ </li>
87
+ ))}
88
+ </ul>
89
+ ) : null}
90
+ {cta != null ? <div className={hero ? "mt-[1.6rem]" : "mt-[0.9rem]"}>{cta}</div> : null}
91
+ </div>
92
+ );
93
+ }
94
+
95
+ export interface PricingProps {
96
+ /** Tier cards, left to right. */
97
+ tiers: PricingTierCardProps[];
98
+ /** Hairline-ruled trust line under the grid ("Free for 30 days…"). */
99
+ footnote?: ReactNode;
100
+ /** Density forwarded to every tier card (a tier's own `variant` wins). */
101
+ variant?: "compact" | "hero";
102
+ /** Extra classes on the grid (e.g. "mt-[1.2rem]"). */
103
+ className?: string;
104
+ }
105
+
106
+ /** Tier cards on the reference two-up grid, plus the optional trust line. */
107
+ export function Pricing({ tiers, footnote, variant = "compact", className }: PricingProps) {
108
+ return (
109
+ <>
110
+ <div className={cx("grid grid-cols-2 gap-[0.9rem] max-[640px]:grid-cols-1", className)}>
111
+ {tiers.map((tier, i) => (
112
+ <PricingTierCard key={i} variant={variant} {...tier} />
113
+ ))}
114
+ </div>
115
+ {footnote != null ? (
116
+ <p className="mt-[0.9rem] border-t border-hair pt-[0.9rem] text-[0.82rem] text-ink-mute">
117
+ {footnote}
118
+ </p>
119
+ ) : null}
120
+ </>
121
+ );
122
+ }
123
+
124
+ export interface PrecisionTableProps {
125
+ /** Column headers; the last column right-aligns (numerals live there). */
126
+ columns: ReactNode[];
127
+ /** Row cells, one array per row; the first cell carries full ink. */
128
+ rows: ReactNode[][];
129
+ /** Extra classes on the table (e.g. "mt-[1.2rem]"). */
130
+ className?: string;
131
+ }
132
+
133
+ /** Per-unit price table — hairline rows, mono numerals, right-aligned tail column. */
134
+ export function PrecisionTable({ columns, rows, className }: PrecisionTableProps) {
135
+ const last = columns.length - 1;
136
+ return (
137
+ <table className={cx("w-full border-collapse font-mono text-[0.76rem]", className)}>
138
+ <thead>
139
+ <tr>
140
+ {columns.map((column, i) => (
141
+ <th
142
+ key={i}
143
+ scope="col"
144
+ className={cx(
145
+ "border-b border-hair pb-[0.5rem] text-[0.6rem] uppercase tracking-[0.08em] text-ink-mute",
146
+ i === last ? "text-end" : "text-start",
147
+ )}
148
+ >
149
+ {column}
150
+ </th>
151
+ ))}
152
+ </tr>
153
+ </thead>
154
+ <tbody>
155
+ {rows.map((row, ri) => (
156
+ <tr key={ri}>
157
+ {row.map((cell, ci) => (
158
+ <td
159
+ key={ci}
160
+ className={cx(
161
+ "border-b border-hair py-[0.55rem]",
162
+ ci === 0 ? "text-ink" : "text-ink-soft",
163
+ ci === last && "text-end",
164
+ )}
165
+ >
166
+ {cell}
167
+ </td>
168
+ ))}
169
+ </tr>
170
+ ))}
171
+ </tbody>
172
+ </table>
173
+ );
174
+ }
@@ -0,0 +1,219 @@
1
+ "use client";
2
+ /**
3
+ * PricingMatrix — the grouped feature-comparison matrix (Graphite grammar):
4
+ * tier column headers with a mono price line + CTA slot, an optional billing
5
+ * toggle, uppercase group rows, plain-word cells ("✓ · Limited · Advanced";
6
+ * a "—" cell reads muted), and one continuous accent-tinted band down the
7
+ * `popular` tier (header + body). Billing-dependent prices arrive precomputed
8
+ * (`priceMonthly` / `priceAnnual`) so server components can pass plain nodes;
9
+ * the toggle only picks between them. Tier names, prices, CTAs, toggle and
10
+ * popular labels are all props — nothing product-specific baked in. Static
11
+ * structure is token-backed utilities; the toggle switch (ancestor `.on`
12
+ * state + two-color mix + knob translate) lives in styles/pricing.css.
13
+ */
14
+ import { useId, useState, type ReactNode } from "react";
15
+
16
+ const cx = (...parts: Array<string | false | undefined>) => parts.filter(Boolean).join(" ");
17
+
18
+ export interface PricingMatrixTier {
19
+ name: ReactNode;
20
+ /** Billing-independent price line ("Free", "Let's talk"). Wins over the pair. */
21
+ price?: ReactNode;
22
+ /** Price line while the toggle is off (monthly billing). */
23
+ priceMonthly?: ReactNode;
24
+ /** Price line while the toggle is on (annual billing). */
25
+ priceAnnual?: ReactNode;
26
+ /** CTA slot — the caller brings its own button/anchor dressing (btn-*). */
27
+ cta?: ReactNode;
28
+ /** Tinted column band + accent top rule + the `popularLabel` flag. */
29
+ popular?: boolean;
30
+ }
31
+
32
+ export interface PricingMatrixRow {
33
+ label: ReactNode;
34
+ /** One cell per tier, in tier order; a cell that is exactly "—" renders muted. */
35
+ cells: ReactNode[];
36
+ }
37
+
38
+ export interface PricingMatrixGroup {
39
+ label: ReactNode;
40
+ rows: PricingMatrixRow[];
41
+ }
42
+
43
+ export interface PricingMatrixProps {
44
+ tiers: PricingMatrixTier[];
45
+ groups: PricingMatrixGroup[];
46
+ /** Billing-toggle label ("Annual billing (20% off)"); omit to hide the toggle. */
47
+ toggleLabel?: ReactNode;
48
+ /** Initial toggle state. Default true (annual). */
49
+ defaultAnnual?: boolean;
50
+ /** Flag under the popular tier's CTA (e.g. "Most popular"). */
51
+ popularLabel?: ReactNode;
52
+ /** Accessible name for the empty feature-label column header. */
53
+ featureColumnLabel?: string;
54
+ /** Extra classes on the toggle row (e.g. "mt-[1.2rem]"). */
55
+ toggleClassName?: string;
56
+ /** Extra classes on the table's scroll wrapper (e.g. "mt-4"). */
57
+ className?: string;
58
+ }
59
+
60
+ /** Grouped tier-comparison table with an optional annual-billing toggle. */
61
+ export function PricingMatrix({
62
+ tiers,
63
+ groups,
64
+ toggleLabel,
65
+ defaultAnnual = true,
66
+ popularLabel,
67
+ featureColumnLabel = "Feature",
68
+ toggleClassName,
69
+ className,
70
+ }: PricingMatrixProps) {
71
+ const [annual, setAnnual] = useState(defaultAnnual);
72
+ const toggleLabelId = useId();
73
+ const priceOf = (tier: PricingMatrixTier) =>
74
+ tier.price ?? (annual ? tier.priceAnnual : tier.priceMonthly);
75
+
76
+ return (
77
+ <>
78
+ {toggleLabel != null ? (
79
+ <div className={cx("flex items-center gap-[0.6rem]", toggleClassName)}>
80
+ <button
81
+ type="button"
82
+ className={`pm-toggle${annual ? " on" : ""}`}
83
+ role="switch"
84
+ aria-checked={annual}
85
+ aria-labelledby={toggleLabelId}
86
+ onClick={() => setAnnual((v) => !v)}
87
+ >
88
+ <span className="pm-knob" aria-hidden="true" />
89
+ </button>
90
+ <span id={toggleLabelId} className="font-mono text-[0.72rem] text-ink-soft">
91
+ {toggleLabel}
92
+ </span>
93
+ </div>
94
+ ) : null}
95
+
96
+ {/* Narrow screens cannot hold four columns, so each tier is its own
97
+ card. The comparison table returns at md, where 640px fits. */}
98
+ <div className="grid gap-[0.85rem] md:hidden">
99
+ {tiers.map((tier, i) => (
100
+ <section
101
+ key={i}
102
+ className={cx(
103
+ "border border-hair bg-surface px-[1rem] py-[1.05rem]",
104
+ tier.popular && "border-t-2 border-t-accent bg-accent/6",
105
+ )}
106
+ >
107
+ <h3 className="m-0 text-[1.05rem] font-medium text-ink">{tier.name}</h3>
108
+ <p className="mt-[0.2rem] mb-[0.75rem] font-mono text-[0.8rem] text-ink-soft">
109
+ {priceOf(tier)}
110
+ </p>
111
+ <div className="[&_a]:flex [&_a]:w-full [&_a]:justify-center">{tier.cta}</div>
112
+ {tier.popular && popularLabel != null ? (
113
+ <p className="mt-[0.5rem] mb-0 font-mono text-[0.58rem] uppercase tracking-[0.08em] text-accent">
114
+ {popularLabel}
115
+ </p>
116
+ ) : null}
117
+ {groups.map((group, gi) => (
118
+ <div key={gi} className="mt-[1rem]">
119
+ <p className="m-0 font-mono text-[0.62rem] font-normal uppercase tracking-[0.1em] text-ink-mute">
120
+ {group.label}
121
+ </p>
122
+ <dl className="m-0">
123
+ {group.rows.map((row, ri) => (
124
+ <div key={ri} className="border-b border-hair/60 py-[0.5rem]">
125
+ <dt className="text-[0.78rem] text-ink-mute">{row.label}</dt>
126
+ <dd
127
+ className={cx(
128
+ "m-0 mt-[0.12rem] font-mono text-[0.86rem] text-ink",
129
+ row.cells[i] === "—" && "text-ink-mute",
130
+ )}
131
+ >
132
+ {row.cells[i]}
133
+ </dd>
134
+ </div>
135
+ ))}
136
+ </dl>
137
+ </div>
138
+ ))}
139
+ </section>
140
+ ))}
141
+ </div>
142
+
143
+ <div
144
+ tabIndex={0}
145
+ role="region"
146
+ aria-label="Pricing comparison"
147
+ className={cx("hidden overflow-x-auto md:block", className)}
148
+ >
149
+ <table className="w-full min-w-[640px] border-collapse text-[0.82rem]">
150
+ <thead>
151
+ <tr>
152
+ <th
153
+ scope="col"
154
+ aria-label={featureColumnLabel}
155
+ className="border-b border-hair pt-[0.8rem] pe-[0.9rem] pb-[1rem] ps-0 text-start align-top"
156
+ />
157
+ {tiers.map((tier, i) => (
158
+ <th
159
+ scope="col"
160
+ key={i}
161
+ className={cx(
162
+ "border-b border-hair px-[0.9rem] pt-[0.8rem] pb-[1rem] text-start align-top",
163
+ tier.popular && "pm-popular rounded-none border-t-2 border-t-accent bg-accent/6",
164
+ )}
165
+ >
166
+ <span className="block text-[0.95rem]">{tier.name}</span>
167
+ <span className="mt-[0.25rem] mb-[0.7rem] block font-mono text-[0.78rem] text-ink-soft">
168
+ {priceOf(tier)}
169
+ </span>
170
+ {tier.cta}
171
+ {tier.popular && popularLabel != null ? (
172
+ <span className="mt-[0.5rem] block font-mono text-[0.58rem] uppercase tracking-[0.08em] text-accent">
173
+ {popularLabel}
174
+ </span>
175
+ ) : null}
176
+ </th>
177
+ ))}
178
+ </tr>
179
+ </thead>
180
+ {groups.map((group, gi) => (
181
+ <tbody key={gi}>
182
+ <tr>
183
+ <th
184
+ scope="rowgroup"
185
+ colSpan={tiers.length + 1}
186
+ className="px-0 pt-[1rem] pb-[0.4rem] text-start font-mono text-[0.62rem] font-normal uppercase tracking-[0.1em] text-ink-mute"
187
+ >
188
+ {group.label}
189
+ </th>
190
+ </tr>
191
+ {group.rows.map((row, ri) => (
192
+ <tr key={ri}>
193
+ <th
194
+ scope="row"
195
+ className="border-b border-hair/60 py-[0.55rem] pe-[0.9rem] ps-0 text-start font-normal text-ink-soft"
196
+ >
197
+ {row.label}
198
+ </th>
199
+ {row.cells.map((cell, ci) => (
200
+ <td
201
+ key={ci}
202
+ className={cx(
203
+ "border-b border-hair/60 px-[0.9rem] py-[0.55rem] font-mono text-[0.74rem]",
204
+ cell === "—" && "text-ink-mute",
205
+ tiers[ci]?.popular && "pm-popular bg-accent/6",
206
+ )}
207
+ >
208
+ {cell}
209
+ </td>
210
+ ))}
211
+ </tr>
212
+ ))}
213
+ </tbody>
214
+ ))}
215
+ </table>
216
+ </div>
217
+ </>
218
+ );
219
+ }
@@ -0,0 +1,2 @@
1
+ export { Mono, PageHead, RuledList, RuledRow } from "./prose";
2
+ export type { MonoProps, PageHeadProps, RuledListProps, RuledRowProps } from "./prose";
@@ -0,0 +1,86 @@
1
+ import type { ReactNode } from "react";
2
+
3
+ /**
4
+ * Prose atoms — the shared grammar for the long-form company / legal pages
5
+ * (`/about`, `/team`, `/security`, `/services`, `/legal/*`).
6
+ * Promoted verbatim from `apps/digithings-web/app/_company/prose.tsx` (D1,
7
+ * #4429) so the shape is authored once and assembled by every site instead of
8
+ * living app-locally.
9
+ *
10
+ * **Utilities only.** These emit no site/app CSS class — the reference canon
11
+ * imports neither `@digithings-ai/design/site/site.css` nor an app sheet — so the
12
+ * exact values of the legacy `.section` / `.wrap` / `.kicker` / `.hero-title`
13
+ * grammar are reproduced with token-backed utilities (source: `site.css`):
14
+ *
15
+ * .section `padding: clamp(4rem,9vw,7.5rem) 0` → `pt-[clamp(4rem,9vw,7.5rem)]`
16
+ * (the old call site added `pb-0`, so only the top half survives)
17
+ * .wrap → `w-full max-w-[var(--wrap)] mx-auto px-[var(--gutter)] relative z-[1]`
18
+ * .kicker → `font-mono text-[0.8rem] tracking-[0.02em] text-accent`
19
+ * .hero-title → `font-display font-normal text-[clamp(2.8rem,6.4vw,5rem)]
20
+ * leading-[1.02] tracking-[-0.02em] mt-[1.4rem] mb-[1.2rem]
21
+ * max-w-[16ch] [&_em]:italic [&_em]:text-accent`
22
+ *
23
+ * Server components — no hooks, no state. The consuming app still needs a
24
+ * Tailwind `@source` line for this directory because the parts carry
25
+ * utilities (Tailwind does not scan package sources on its own).
26
+ */
27
+
28
+ export type MonoProps = { children: ReactNode };
29
+
30
+ /** Inline code. The site reset styles no bare `code` element, so the mono face
31
+ * has to be asked for explicitly; `0.92em` keeps the mono x-height in line
32
+ * with the surrounding body copy. */
33
+ export function Mono({ children }: MonoProps) {
34
+ return <code className="font-mono text-[0.92em] text-ink">{children}</code>;
35
+ }
36
+
37
+ export type PageHeadProps = {
38
+ /** The `//` mono eyebrow above the title. */
39
+ kicker: string;
40
+ /** The page title; `<em>` renders italic + accent. */
41
+ title: ReactNode;
42
+ /** The lede paragraph under the title. */
43
+ children: ReactNode;
44
+ };
45
+
46
+ /** The standing long-form page opener: `//` kicker, display title, one lede
47
+ * paragraph. Mirrors the landing hero's shape at subpage scale. */
48
+ export function PageHead({ kicker, title, children }: PageHeadProps) {
49
+ return (
50
+ <section className="pt-[clamp(4rem,9vw,7.5rem)]">
51
+ <div className="relative z-[1] mx-auto w-full max-w-[var(--wrap)] px-[var(--gutter)]">
52
+ <span className="font-mono text-[0.8rem] tracking-[0.02em] text-accent">{kicker}</span>
53
+ <h1 className="mt-[1.4rem] mb-[1.2rem] max-w-[16ch] font-display text-[clamp(2.8rem,6.4vw,5rem)] font-normal leading-[1.02] tracking-[-0.02em] [&_em]:italic [&_em]:text-accent">
54
+ {title}
55
+ </h1>
56
+ <p className="max-w-[64ch] text-[1.08rem] leading-[1.7] text-ink-soft">{children}</p>
57
+ </div>
58
+ </section>
59
+ );
60
+ }
61
+
62
+ export type RuledRowProps = {
63
+ /** The mono lead cell — a file, env var, rule or term the body describes. */
64
+ term: ReactNode;
65
+ children: ReactNode;
66
+ };
67
+
68
+ /** A hairline-ruled definition row — the shape used for control lists,
69
+ * compatibility lists, residual-risk lists and gate lists. `term` is mono
70
+ * (it names a file, an env var or a rule); the body is sans. */
71
+ export function RuledRow({ term, children }: RuledRowProps) {
72
+ return (
73
+ <li className="grid gap-[0.35rem] border-t border-hair py-[1rem] last:border-b sm:grid-cols-[15rem_1fr] sm:gap-[1.5rem]">
74
+ <span className="font-mono text-[0.86rem] leading-[1.5] text-ink">{term}</span>
75
+ <span className="text-[0.9rem] leading-[1.65] text-ink-soft">{children}</span>
76
+ </li>
77
+ );
78
+ }
79
+
80
+ export type RuledListProps = { children: ReactNode; className?: string };
81
+
82
+ /** The list wrapper for `RuledRow` — resets the marker and collapses the gap
83
+ * so the hairlines butt against each other. */
84
+ export function RuledList({ children, className }: RuledListProps) {
85
+ return <ul className={[className, "m-0 grid list-none gap-0 p-0"].filter(Boolean).join(" ")}>{children}</ul>;
86
+ }