@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,32 @@
1
+ "use client";
2
+
3
+ import { useSyncExternalStore } from "react";
4
+ import { flushSync } from "react-dom";
5
+
6
+ let keep = false;
7
+ const listeners = new Set<() => void>();
8
+
9
+ function subscribe(listener: () => void): () => void {
10
+ listeners.add(listener);
11
+ return () => {
12
+ listeners.delete(listener);
13
+ };
14
+ }
15
+
16
+ /** True only while an HTML export is reading the page. */
17
+ export function useExportKeepMounted(): boolean {
18
+ return useSyncExternalStore(
19
+ subscribe,
20
+ () => keep,
21
+ () => false,
22
+ );
23
+ }
24
+
25
+ /** Mount closed panels for the export, then commit before the caller reads the DOM. */
26
+ export function setExportKeepMounted(value: boolean): void {
27
+ if (keep === value) return;
28
+ keep = value;
29
+ flushSync(() => {
30
+ for (const listener of listeners) listener();
31
+ });
32
+ }
@@ -0,0 +1,54 @@
1
+ import { redactString } from "./redact";
2
+
3
+ /**
4
+ * `<deployment>-<YYYY-MM-DD-HHMM>-<question>.html`. The time is UTC, so files
5
+ * from different machines sort together. The question is the latest one asked.
6
+ */
7
+ export function snapshotFilename(deployment: string, exportedAt: string, question: string): string {
8
+ return exportFilename(deployment, exportedAt, question, "html");
9
+ }
10
+
11
+ /** Same name as the HTML snapshot, with the given extension (`md`, `html`). */
12
+ export function exportFilename(
13
+ deployment: string,
14
+ exportedAt: string,
15
+ question: string,
16
+ ext: "md" | "html",
17
+ ): string {
18
+ const slug = slugPart(deployment) || "digichat";
19
+ const when = new Date(exportedAt);
20
+ const iso = Number.isNaN(when.getTime()) ? new Date() : when;
21
+ const stamp = iso.toISOString();
22
+ const day = stamp.slice(0, 10);
23
+ const hm = `${stamp.slice(11, 13)}${stamp.slice(14, 16)}`;
24
+ const q = questionSlug(question) || "thread";
25
+ return `${slug}-${day}-${hm}-${q}.${ext}`;
26
+ }
27
+
28
+ /**
29
+ * The question as a short slug. File names travel (listings, tickets, mail
30
+ * subjects), so beyond `redactString` any word of 8+ characters that carries
31
+ * a digit (an id, a key the patterns do not know) is dropped, and the slug is
32
+ * cut at a word boundary.
33
+ */
34
+ function questionSlug(question: string): string {
35
+ const words = slugPart(redactString(question))
36
+ .split("-")
37
+ .filter((word) => word && !(word.length >= 8 && /\d/.test(word)));
38
+ let out = "";
39
+ for (const word of words) {
40
+ const next = out ? `${out}-${word}` : word;
41
+ if (next.length > 48) break;
42
+ out = next;
43
+ }
44
+ return out;
45
+ }
46
+
47
+ function slugPart(value: string): string {
48
+ return value
49
+ .trim()
50
+ .toLowerCase()
51
+ .split(/[^a-z0-9]/)
52
+ .filter(Boolean)
53
+ .join("-");
54
+ }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Client-safe HTML export. The file is a snapshot of the open chat page.
3
+ */
4
+
5
+ export {
6
+ downloadMessageSnapshot,
7
+ downloadThreadSnapshot,
8
+ inlineAssetUrls,
9
+ inlineDomAssets,
10
+ liveSheetText,
11
+ } from "./browser";
12
+ export { snapshotFilename } from "./filename";
13
+ export { REDACTED, redactString, redactValue } from "./redact";
14
+ export { redactBlockText, redactSnapshotDom } from "./redact-dom";
15
+ export {
16
+ deploymentText,
17
+ questionText,
18
+ serializeSnapshot,
19
+ SNAPSHOT_CSS,
20
+ transformSnapshotDom,
21
+ } from "./snapshot";
@@ -0,0 +1,178 @@
1
+ /**
2
+ * Redact a snapshot DOM before it is serialized.
3
+ *
4
+ * Redaction runs on text and attribute values, never on serialized HTML, so a
5
+ * secret's replacement cannot swallow tags or the text after it. A secret that
6
+ * the page splits across inline elements (syntax-highlighted JSON, a `code`
7
+ * span inside a sentence) is found by redacting each inline-only block as one
8
+ * string; only a block that held a secret loses its inline formatting.
9
+ */
10
+
11
+ import { redactString, redactValue } from "./redact";
12
+
13
+ /**
14
+ * A block is re-scanned as one string unless it contains one of these.
15
+ * `del` (strikethrough), `ins`, `img`, `label` and `font` are not block
16
+ * elements, so a secret split by them is still joined.
17
+ */
18
+ const BLOCK = new Set([
19
+ "ADDRESS",
20
+ "ARTICLE",
21
+ "ASIDE",
22
+ "BLOCKQUOTE",
23
+ "DD",
24
+ "DIV",
25
+ "DL",
26
+ "DT",
27
+ "FIELDSET",
28
+ "FIGCAPTION",
29
+ "FIGURE",
30
+ "FOOTER",
31
+ "FORM",
32
+ "H1",
33
+ "H2",
34
+ "H3",
35
+ "H4",
36
+ "H5",
37
+ "H6",
38
+ "HEADER",
39
+ "HR",
40
+ "LI",
41
+ "MAIN",
42
+ "NAV",
43
+ "OL",
44
+ "P",
45
+ "PRE",
46
+ "SECTION",
47
+ "TABLE",
48
+ "UL",
49
+ "TR",
50
+ "TD",
51
+ "TH",
52
+ "THEAD",
53
+ "TBODY",
54
+ "TFOOT",
55
+ "CAPTION",
56
+ ]);
57
+
58
+ /** Text that is not page prose: CSS and math. SVG text is page content. */
59
+ const SKIP = new Set(["STYLE", "SCRIPT", "MATH", "math"]);
60
+
61
+ /**
62
+ * Redact one block of text. JSON (a tool call's args or result) is parsed and
63
+ * redacted by key, so `{"password": "abc"}` loses its value even when the
64
+ * value has no token shape; anything else goes through `redactString`.
65
+ */
66
+ export function redactBlockText(text: string): string {
67
+ const trimmed = text.trim();
68
+ if (
69
+ (trimmed.startsWith("{") && trimmed.endsWith("}")) ||
70
+ (trimmed.startsWith("[") && trimmed.endsWith("]"))
71
+ ) {
72
+ try {
73
+ const parsed: unknown = JSON.parse(trimmed);
74
+ const redacted = redactValue(parsed);
75
+ if (JSON.stringify(redacted) !== JSON.stringify(parsed)) {
76
+ return JSON.stringify(redacted, null, 2);
77
+ }
78
+ return text;
79
+ } catch {
80
+ /* not JSON: fall through to the text patterns */
81
+ }
82
+ }
83
+ return redactString(text);
84
+ }
85
+
86
+ export function redactSnapshotDom(root: Element): void {
87
+ redactTree(root);
88
+ }
89
+
90
+ /**
91
+ * `<template>` content is a document fragment, not a child of the element, so
92
+ * a walk of the page never sees it. SVG used to be skipped with `<style>`.
93
+ */
94
+ function redactTree(root: ParentNode): void {
95
+ redactAttributes(root);
96
+ redactTexts(root);
97
+ for (const block of inlineOnlyBlocks(root)) {
98
+ const text = block.textContent ?? "";
99
+ const next = redactBlockText(text);
100
+ if (next !== text) block.textContent = next;
101
+ }
102
+ for (const template of root.querySelectorAll("template")) {
103
+ if (template instanceof HTMLTemplateElement) redactTree(template.content);
104
+ }
105
+ }
106
+
107
+ function redactTexts(root: ParentNode): void {
108
+ const doc = root.ownerDocument;
109
+ if (!doc) return;
110
+ // Every text node first: a secret inside one node is replaced in place, so
111
+ // links and formatting around it survive.
112
+ const walker = doc.createTreeWalker(root, 4 /* NodeFilter.SHOW_TEXT */);
113
+ const texts: Text[] = [];
114
+ for (let node = walker.nextNode(); node; node = walker.nextNode()) texts.push(node as Text);
115
+ for (const node of texts) {
116
+ if (insideSkipped(node.parentElement, root)) continue;
117
+ const next = redactString(node.data);
118
+ if (next !== node.data) node.data = next;
119
+ }
120
+ }
121
+
122
+ function redactAttributes(root: ParentNode): void {
123
+ const elements: Element[] = [];
124
+ if (root instanceof Element) elements.push(root);
125
+ elements.push(...root.querySelectorAll("*"));
126
+ for (const el of elements) {
127
+ if (SKIP.has(el.tagName)) continue;
128
+ for (const attr of [...el.attributes]) {
129
+ const value = attr.value;
130
+ // style holds inlined url(data:…) payloads; data: URIs are the inlined assets.
131
+ if (!value || attr.name === "style" || isInlinedAsset(attr.name, value)) continue;
132
+ const next = redactString(value);
133
+ if (next !== value) el.setAttribute(attr.name, next);
134
+ }
135
+ }
136
+ }
137
+
138
+ /**
139
+ * The outermost elements whose whole subtree is inline and holds text: a `p`,
140
+ * `pre`, `li`, a JSON view, or an inline run beside block siblings.
141
+ */
142
+ function inlineOnlyBlocks(root: ParentNode): Element[] {
143
+ const elements: Element[] = [];
144
+ if (root instanceof Element) elements.push(root);
145
+ elements.push(...root.querySelectorAll("*"));
146
+ const candidates = elements.filter((el) => {
147
+ if (SKIP.has(el.tagName) || insideSkipped(el.parentElement, root)) return false;
148
+ if (!el.textContent?.trim()) return false;
149
+ for (const d of el.querySelectorAll("*")) {
150
+ if (BLOCK.has(d.tagName) || SKIP.has(d.tagName)) return false;
151
+ }
152
+ return true;
153
+ });
154
+ return dedupeOutermost(candidates);
155
+ }
156
+
157
+ function dedupeOutermost(els: Element[]): Element[] {
158
+ const set = new Set(els);
159
+ return els.filter((el) => {
160
+ for (let p = el.parentElement; p; p = p.parentElement) if (set.has(p)) return false;
161
+ return true;
162
+ });
163
+ }
164
+
165
+ /** Base64 image and font payloads. Any other `data:` value is still redacted. */
166
+ function isInlinedAsset(name: string, value: string): boolean {
167
+ const attr = name.toLowerCase();
168
+ if (attr !== "src" && attr !== "href" && attr !== "poster") return false;
169
+ return /^\s*data:(?:image|font)\/[^;,]*;base64,/i.test(value);
170
+ }
171
+
172
+ function insideSkipped(el: Element | null, stop: Node): boolean {
173
+ for (let cursor = el; cursor; cursor = cursor.parentElement) {
174
+ if (SKIP.has(cursor.tagName)) return true;
175
+ if (cursor === stop) break;
176
+ }
177
+ return false;
178
+ }
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Strip credentials before they can land in a replay file.
3
+ *
4
+ * Labeled secrets (auth headers, embed tokens, invite keys, API keys) are
5
+ * removed even when the value has no recognizable prefix. Known token shapes
6
+ * are removed wherever they sit in prose or tool JSON.
7
+ */
8
+
9
+ const SENSITIVE_KEY =
10
+ /^(authorization|proxy-authorization|cookie|set-cookie|x-api-key|x-embed-token|x-embed-chat-token|x-invite-key|x-digichat-session|api[-_]?key|embed[-_]?(?:key|token)|invite[-_]?(?:key|token)|access[-_]?token|refresh[-_]?token|id[-_]?token|auth[-_]?secret|nextauth[-_]?secret|password|secret|session)$/i;
11
+
12
+ /** `token`, `authToken`, `client_secret`, `privateKey`… (not `tokens` / `max_tokens`). */
13
+ const SENSITIVE_KEY_SUFFIX =
14
+ /(?:token|secret|secret[-_]?key|password|passwd|api[-_]?key|private[-_]?key|credentials?|session[-_]?id|cookie)$/i;
15
+
16
+ const TOKEN_SHAPES: readonly RegExp[] = [
17
+ // Separators and values use bounded runs so long inputs stay linear
18
+ // (CodeQL js/polynomial-redos). Authorization and Cookie are in LABELED below.
19
+ /\bToken\s+token=[^\s"',}&]+/gi,
20
+ /\b(?:ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9]{20,}\b/g,
21
+ /\bgithub_pat_[A-Za-z0-9_]{20,}\b/g,
22
+ /\bxox[abposr]-[A-Za-z0-9-]{10,}\b/g,
23
+ /\bAKIA[0-9A-Z]{16}\b/g,
24
+ /\bAIza[0-9A-Za-z_-]{35}\b/g,
25
+ /\bglpat-[A-Za-z0-9_-]{20,}\b/g,
26
+ /\b(?:dgk_live_|digi_live_|dgs_live_)[A-Za-z0-9_\-]{6,}\b/g,
27
+ /\bsk-(?:ant-|or-|proj-)?[A-Za-z0-9_\-]{8,}\b/g,
28
+ /\beyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\b/g,
29
+ /\bBearer\s+[A-Za-z0-9\-._~+/]{8,}={0,2}/gi,
30
+ // OCC invite keys are a standalone 48-hex token. A shorter or longer hex
31
+ // run (a git sha, a 32-byte hex secret) does not match.
32
+ /\b[0-9a-fA-F]{48}\b/g,
33
+ /(?:x-api-key|x-embed-token|x-embed-chat-token|x-invite-key|api[_-]?key|embed[_-]?(?:key|token)|invite[_-]?(?:key|token)|access[_-]?token|refresh[_-]?token|auth[_-]?secret|nextauth[_-]?secret|client[_-]?secret|private[_-]?key|password|passwd|(?<![A-Za-z0-9_?&-])token)["']?[ \t]{0,8}[:=][ \t]{0,8}["']?(?!\[redacted\])[^"'\s,}&]{6,}/gi,
34
+ ];
35
+
36
+ /**
37
+ * A query secret ends at `&`, `#`, whitespace or a quote.
38
+ *
39
+ * A `)` inside the value belongs to the secret when the value continues after
40
+ * it, so a secret that contains a parenthesis cannot leak its tail
41
+ * (`?token=abc)def` redacts the whole value). The character after the `)`
42
+ * has to look like part of a secret — a base64 or base64url character, or
43
+ * another delimiter — which is what keeps the closing parenthesis of a link
44
+ * (`?token=abc)`), a full stop (`?token=abc).`) and markdown emphasis
45
+ * (`?token=abc)**bold**`) outside the value.
46
+ *
47
+ * Three limits follow from the character being ambiguous. A secret whose
48
+ * value *ends* in a `)` still loses that character, a word right after a
49
+ * closing parenthesis (`?token=abc)and more`) is eaten with the value, and a
50
+ * delimiter followed by prose punctuation (`?token=abc).def`) ends the value,
51
+ * so the text after such a delimiter is not redacted. The rule is
52
+ * deliberately biased towards the secret: a redactor that eats a word is a
53
+ * bug in every export, and a redactor that leaves a secret tail is a leak.
54
+ */
55
+ const QUERY_SECRET =
56
+ /([?&](?:token|api_key|apikey|access_token|invite|invite_key|embed_token|key|x-amz-signature|x-amz-credential|x-amz-security-token|awsaccesskeyid|x-goog-signature|x-goog-credential|signature|sig|key-pair-id)=)(?:[^&#\s"')]|\)(?=[A-Za-z0-9_\-=+/~)]))*/gi;
57
+
58
+ /**
59
+ * Header-style labels whose value is replaced but whose label stays, so the
60
+ * transcript still reads. Authorization takes a scheme (Bearer, Basic, Token,
61
+ * …) and then a credential; without a scheme the value must contain a digit,
62
+ * so prose such as "Authorization: the user signs in" is left alone.
63
+ */
64
+ const LABELED: readonly RegExp[] = [
65
+ /(\b(?:proxy-)?authorization["']?[ \t]{0,8}[:=][ \t]{0,8}["']?)(?:(?:bearer|basic|token|digest|apikey|negotiate)[ \t]{1,4}(?:token=)?[^\s"',}]{3,2048}|(?=[^\s"',}]{0,2048}\d)[A-Za-z0-9\-._~+/=:]{8,2048})/gi,
66
+ /(\b(?:set-cookie|cookie|x-digichat-session)["']?[ \t]{0,8}:[ \t]{0,8}["']?)[^"'\n\r]{1,4096}/gi,
67
+ // A backtick inside a session value belongs to the value when the value
68
+ // continues after it, so a secret that contains a backtick cannot leak its
69
+ // tail (`session=abc`def`). The character after the backtick has to look
70
+ // like part of a secret — a base64 or base64url character, or another
71
+ // backtick — which is what keeps the backtick that closes a code span
72
+ // (`session=abc``) and the one that precedes prose (`session=abc`, and
73
+ // more) outside the value. The lookahead keeps every unit of the value
74
+ // one character long, so the bound below stays 512 characters.
75
+ /((?<![A-Za-z0-9_-])(?:session(?:[_-]?id)?|sid|csrftoken|connect\.sid)=)(?:[^;\s"',&`]|`(?=[A-Za-z0-9_\-=+/~`])){4,512}/gi,
76
+ // scheme://user:password@host (DSNs, URLs with userinfo).
77
+ /(\b[a-z][a-z0-9+.-]{1,20}:\/\/[^\s:/@"']{1,256}:)[^\s@/"']{1,256}(?=@)/gi,
78
+ ];
79
+
80
+ export const REDACTED = "[redacted]";
81
+
82
+ export function redactString(value: string): string {
83
+ let out = value;
84
+ for (const pattern of TOKEN_SHAPES) {
85
+ pattern.lastIndex = 0;
86
+ out = out.replace(pattern, REDACTED);
87
+ }
88
+ for (const pattern of LABELED) {
89
+ pattern.lastIndex = 0;
90
+ out = out.replace(pattern, `$1${REDACTED}`);
91
+ }
92
+ QUERY_SECRET.lastIndex = 0;
93
+ return out.replace(QUERY_SECRET, `$1${REDACTED}`);
94
+ }
95
+
96
+ export function redactValue<T>(value: T): T {
97
+ return walk(value) as T;
98
+ }
99
+
100
+ function walk(value: unknown): unknown {
101
+ if (typeof value === "string") return redactString(value);
102
+ if (Array.isArray(value)) return value.map((item) => walk(item));
103
+ if (!value || typeof value !== "object") return value;
104
+ const out: Record<string, unknown> = {};
105
+ for (const [key, inner] of Object.entries(value as Record<string, unknown>)) {
106
+ if (SENSITIVE_KEY.test(key) || SENSITIVE_KEY_SUFFIX.test(key)) {
107
+ out[key] = REDACTED;
108
+ continue;
109
+ }
110
+ out[key] = walk(inner);
111
+ }
112
+ return out;
113
+ }