@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,71 @@
1
+ "use client";
2
+
3
+ /**
4
+ * EquityCurve — the tearsheet's headline promoted from the design reference
5
+ * (finance/equity-curve): cumulative equity as an area series on TradingView
6
+ * Lightweight Charts. It wears the module accent — identity, not a single
7
+ * P&L read, so the money colors stay out of it — with a gradient fill that
8
+ * thins toward the baseline, and re-themes live on `data-theme` flips.
9
+ *
10
+ * Data comes in via the required `data` prop (ISO-dated points, ascending);
11
+ * `EQUITY_CURVE_DEMO` is the exported reference filler. The host fills its
12
+ * pane (`autoSize`) — give the pane a definite height. Client component —
13
+ * chart lifecycle effect; no motion/react surface.
14
+ *
15
+ * Wiring (consuming app): `lightweight-charts` dependency, plus
16
+ * globals.css @source "<path-to>/packages/ui/src/components/finance-charts";
17
+ */
18
+
19
+ import { useCallback } from "react";
20
+ import { AreaSeries, type AreaData, type IChartApi } from "lightweight-charts";
21
+ import {
22
+ toChartTime,
23
+ tokenAlpha,
24
+ useFinanceChart,
25
+ type FinanceChartPalette,
26
+ type FinanceSeriesPoint,
27
+ } from "./chart-host";
28
+
29
+ export type EquityCurveProps = {
30
+ /** Cumulative-equity series, ISO `yyyy-mm-dd` ascending. */
31
+ data: FinanceSeriesPoint[];
32
+ /** Extra classes on the chart host (it is `h-full w-full` by default). */
33
+ className?: string;
34
+ /** Accessible name; omitted → decorative (`aria-hidden`). */
35
+ label?: string;
36
+ };
37
+
38
+ export function EquityCurve({ data, className, label }: EquityCurveProps) {
39
+ const setup = useCallback(
40
+ (chart: IChartApi, p: FinanceChartPalette) => {
41
+ const area = chart.addSeries(AreaSeries, {
42
+ lineColor: p.accent,
43
+ topColor: tokenAlpha(p.accent, 0.28),
44
+ bottomColor: tokenAlpha(p.accent, 0.02),
45
+ lineWidth: 2,
46
+ priceLineVisible: false,
47
+ });
48
+ area.setData(
49
+ data.map((pt): AreaData => ({ time: toChartTime(pt.time), value: pt.value }))
50
+ );
51
+ return (next: FinanceChartPalette) => {
52
+ area.applyOptions({
53
+ lineColor: next.accent,
54
+ topColor: tokenAlpha(next.accent, 0.28),
55
+ bottomColor: tokenAlpha(next.accent, 0.02),
56
+ });
57
+ };
58
+ },
59
+ [data]
60
+ );
61
+
62
+ const hostRef = useFinanceChart(setup, "accent");
63
+
64
+ return (
65
+ <div
66
+ ref={hostRef}
67
+ className={`h-full w-full${className ? ` ${className}` : ""}`}
68
+ {...(label ? { role: "img", "aria-label": label } : { "aria-hidden": true })}
69
+ />
70
+ );
71
+ }
@@ -0,0 +1,119 @@
1
+ "use client";
2
+
3
+ /**
4
+ * PriceChart — the standard price-plotting primitive promoted from the design
5
+ * reference (finance/price-chart): candlesticks (plus an optional volume
6
+ * histogram tucked under the price pane) on TradingView Lightweight Charts.
7
+ * Candles and volume wear the digiquant chart scale (`--up` / `--down`) —
8
+ * this IS a P&L read. Volume follows the candle at the same time: up when
9
+ * the close is at or above the open. Everything re-themes live on
10
+ * `data-theme` flips. Custom SVG candles are retired (see the finance
11
+ * reference page's charting rules).
12
+ *
13
+ * Data comes in via the required `candles` prop (ISO-dated OHLC, ascending);
14
+ * `volume` is optional — omit it for a candles-only pane. `PRICE_CHART_DEMO`
15
+ * is the exported reference filler carrying both. The host fills its pane
16
+ * (`autoSize`) — give the pane a definite height. Client component — chart
17
+ * lifecycle effect; no motion/react surface.
18
+ *
19
+ * Wiring (consuming app): `lightweight-charts` dependency, plus
20
+ * globals.css @source "<path-to>/packages/ui/src/components/finance-charts";
21
+ */
22
+
23
+ import { useCallback } from "react";
24
+ import {
25
+ CandlestickSeries,
26
+ HistogramSeries,
27
+ type CandlestickData,
28
+ type HistogramData,
29
+ type IChartApi,
30
+ } from "lightweight-charts";
31
+ import {
32
+ toChartTime,
33
+ useFinanceChart,
34
+ type FinanceChartPalette,
35
+ type FinanceSeriesPoint,
36
+ type OhlcPoint,
37
+ } from "./chart-host";
38
+
39
+ export type PriceChartProps = {
40
+ /** OHLC candles, ISO `yyyy-mm-dd` ascending. */
41
+ candles: OhlcPoint[];
42
+ /** Optional volume bars (same time axis); omitted → candles only. */
43
+ volume?: FinanceSeriesPoint[];
44
+ /** Extra classes on the chart host (it is `h-full w-full` by default). */
45
+ className?: string;
46
+ /** Accessible name; omitted → decorative (`aria-hidden`). */
47
+ label?: string;
48
+ };
49
+
50
+ export function PriceChart({ candles, volume, className, label }: PriceChartProps) {
51
+ const setup = useCallback(
52
+ (chart: IChartApi, p: FinanceChartPalette) => {
53
+ const candleSeries = chart.addSeries(CandlestickSeries, {
54
+ upColor: p.up,
55
+ downColor: p.down,
56
+ borderUpColor: p.up,
57
+ borderDownColor: p.down,
58
+ wickUpColor: p.up,
59
+ wickDownColor: p.down,
60
+ });
61
+ candleSeries.setData(
62
+ candles.map(
63
+ (c): CandlestickData => ({
64
+ time: toChartTime(c.time),
65
+ open: c.open,
66
+ high: c.high,
67
+ low: c.low,
68
+ close: c.close,
69
+ })
70
+ )
71
+ );
72
+
73
+ const volumeSeries = volume
74
+ ? chart.addSeries(HistogramSeries, {
75
+ priceFormat: { type: "volume" },
76
+ priceScaleId: "vol",
77
+ })
78
+ : null;
79
+ const paintVolume = (palette: FinanceChartPalette) => {
80
+ if (!volumeSeries || !volume) return;
81
+ const direction = new Map(candles.map((c) => [c.time, c.close >= c.open]));
82
+ volumeSeries.setData(
83
+ volume.map((v): HistogramData => ({
84
+ time: toChartTime(v.time),
85
+ value: v.value,
86
+ color: direction.get(v.time) === false ? palette.down : palette.up,
87
+ }))
88
+ );
89
+ };
90
+ paintVolume(p);
91
+ if (volumeSeries) {
92
+ chart.priceScale("vol").applyOptions({ scaleMargins: { top: 0.82, bottom: 0 } });
93
+ }
94
+
95
+ return (next: FinanceChartPalette) => {
96
+ candleSeries.applyOptions({
97
+ upColor: next.up,
98
+ downColor: next.down,
99
+ borderUpColor: next.up,
100
+ borderDownColor: next.down,
101
+ wickUpColor: next.up,
102
+ wickDownColor: next.down,
103
+ });
104
+ paintVolume(next);
105
+ };
106
+ },
107
+ [candles, volume]
108
+ );
109
+
110
+ const hostRef = useFinanceChart(setup, "accent");
111
+
112
+ return (
113
+ <div
114
+ ref={hostRef}
115
+ className={`h-full w-full${className ? ` ${className}` : ""}`}
116
+ {...(label ? { role: "img", "aria-label": label } : { "aria-hidden": true })}
117
+ />
118
+ );
119
+ }
@@ -0,0 +1,236 @@
1
+ "use client";
2
+
3
+ /**
4
+ * Finance-charts host scaffold (#1450) — the family's shared TradingView
5
+ * Lightweight Charts lifecycle, promoted from the design reference
6
+ * (finance/price-chart · equity-curve · drawdown). Since batch E this IS the
7
+ * chart-scaffold canon: dashboard's `lib/lw-chart.tsx` is a thin adapter over
8
+ * this family (see lw-chart.tsx here for the persistent-chart lifecycle).
9
+ * Token-themed via CSS-variable reads with SSR fallbacks, `autoSize: true`,
10
+ * transparent canvas, attribution logo off, a MutationObserver on
11
+ * `data-theme` re-applies the palette live, and kinetic-scroll inertia is
12
+ * disabled under prefers-reduced-motion.
13
+ *
14
+ * Charts draw on canvas, so there is no CSS file for them — the host div
15
+ * carries `h-full w-full` utilities and fills whatever definite-height pane
16
+ * the consumer provides. `lightweight-charts` must be a dependency of the
17
+ * consuming app (it is a peer of this family).
18
+ */
19
+
20
+ import { useEffect, useRef, useSyncExternalStore, type RefObject } from "react";
21
+ import {
22
+ createChart,
23
+ type ChartOptions,
24
+ type DeepPartial,
25
+ type IChartApi,
26
+ type Time,
27
+ } from "lightweight-charts";
28
+ import { chartChromeOptions } from "./lw-chart";
29
+
30
+ /** ISO-dated series point — the wire shape every finance chart accepts. */
31
+ export type FinanceSeriesPoint = {
32
+ /** ISO `yyyy-mm-dd`, ascending and unique across the series. */
33
+ time: string;
34
+ value: number;
35
+ };
36
+
37
+ /** ISO-dated OHLC candle for <PriceChart/>. */
38
+ export type OhlcPoint = {
39
+ /** ISO `yyyy-mm-dd`, ascending and unique across the series. */
40
+ time: string;
41
+ open: number;
42
+ high: number;
43
+ low: number;
44
+ close: number;
45
+ };
46
+
47
+ /** Resolved design tokens a finance chart paints with. */
48
+ export type FinanceChartPalette = {
49
+ ink: string;
50
+ inkMute: string;
51
+ hair: string;
52
+ accent: string;
53
+ up: string;
54
+ down: string;
55
+ mono: string;
56
+ };
57
+
58
+ /** Which palette token backs the crosshair's axis labels. */
59
+ export type CrosshairLabelToken = "accent" | "up" | "down";
60
+
61
+ /** ISO `yyyy-mm-dd` → lightweight-charts `Time`. */
62
+ export function toChartTime(iso: string): Time {
63
+ return iso as unknown as Time;
64
+ }
65
+
66
+ /** Token reads off the host element, with SSR-safe fallbacks mirroring the
67
+ * dark theme in @digithings-ai/design/tokens.css (the sanctioned cssVar
68
+ * fallback pattern — see scripts/check_frontend_canon.py). Fallbacks track
69
+ * tokens.css:161,166,175,182-183; the light theme intentionally renders
70
+ * from the dark snapshot until the client re-reads. Pass `null`
71
+ * (or call on the server) to get the fallback palette verbatim. */
72
+ export function readFinancePalette(host: HTMLElement | null): FinanceChartPalette {
73
+ const cs = host && typeof window !== "undefined" ? getComputedStyle(host) : null;
74
+ const cssVar = (name: string, fallback: string) =>
75
+ cs?.getPropertyValue(name).trim() || fallback;
76
+ return {
77
+ ink: cssVar("--ink", "#ECEEF0"),
78
+ inkMute: cssVar("--ink-mute", "#7D8389"),
79
+ hair: cssVar("--hair", "rgba(255,255,255,0.09)"),
80
+ accent: cssVar("--accent", "#3dd6c4"),
81
+ up: cssVar("--up", "#3DD6C4"),
82
+ down: cssVar("--down", "#E5533E"),
83
+ mono: cssVar("--font-mono", "monospace"),
84
+ };
85
+ }
86
+
87
+ /**
88
+ * Re-emit a resolved token color at `alpha` — the gradient fills read the
89
+ * accent/money tokens, then thin them out. Handles both token spellings in
90
+ * tokens.css: `#rgb`/`#rrggbb` hex (accents, money colors) and `rgb()`/
91
+ * `rgba()` functions (hairlines). Unparseable values pass through.
92
+ */
93
+ export function tokenAlpha(color: string, alpha: number): string {
94
+ if (color.startsWith("#")) {
95
+ const hex = color.slice(1);
96
+ const full =
97
+ hex.length === 3 || hex.length === 4
98
+ ? [...hex.slice(0, 3)].map((c) => c + c).join("")
99
+ : hex.slice(0, 6);
100
+ if (!/^[0-9a-fA-F]{6}$/.test(full)) return color;
101
+ const r = parseInt(full.slice(0, 2), 16);
102
+ const g = parseInt(full.slice(2, 4), 16);
103
+ const b = parseInt(full.slice(4, 6), 16);
104
+ return `rgba(${r},${g},${b},${alpha})`;
105
+ }
106
+ const channels = color.match(/[\d.]+/g);
107
+ if (!channels || channels.length < 3) return color;
108
+ return `rgba(${channels[0]},${channels[1]},${channels[2]},${alpha})`;
109
+ }
110
+
111
+ /** Chart-wide options derived from the tokens: transparent canvas, hair
112
+ * grid + scale borders, ink-mute mono text and crosshair lines, token-backed
113
+ * crosshair labels. Re-applied wholesale on theme flips. Thin binding of the
114
+ * palette onto the family's unified chrome builder (lw-chart.tsx). */
115
+ export function financeChartOptions(
116
+ p: FinanceChartPalette,
117
+ crosshairLabel: CrosshairLabelToken
118
+ ): DeepPartial<ChartOptions> {
119
+ return chartChromeOptions({
120
+ text: p.inkMute,
121
+ hair: p.hair,
122
+ label: p[crosshairLabel],
123
+ fontFamily: p.mono,
124
+ });
125
+ }
126
+
127
+ /* ── Theme-reactive document-level palette ─────────────────────────────── */
128
+
129
+ /** SSR / pre-mount snapshot — the fallback palette, referentially stable. */
130
+ const SSR_PALETTE = readFinancePalette(null);
131
+
132
+ let paletteCache: { theme: string | null; palette: FinanceChartPalette } | null = null;
133
+
134
+ /**
135
+ * Resolved document-level palette, re-read once per `data-theme` flip and
136
+ * referentially stable between flips (safe as an effect dependency). This is
137
+ * the live-read companion to `useFinanceChartPalette` — pass it as
138
+ * `readColors` when composing with `useLightweightChart`.
139
+ */
140
+ export function getFinancePalette(): FinanceChartPalette {
141
+ if (typeof window === "undefined") return SSR_PALETTE;
142
+ const theme = document.documentElement.getAttribute("data-theme");
143
+ if (!paletteCache || paletteCache.theme !== theme) {
144
+ paletteCache = { theme, palette: readFinancePalette(document.documentElement) };
145
+ }
146
+ return paletteCache.palette;
147
+ }
148
+
149
+ function subscribeToThemeFlips(onStoreChange: () => void): () => void {
150
+ const observer = new MutationObserver(onStoreChange);
151
+ observer.observe(document.documentElement, {
152
+ attributes: true,
153
+ attributeFilter: ["data-theme"],
154
+ });
155
+ return () => observer.disconnect();
156
+ }
157
+
158
+ /**
159
+ * Theme-reactive palette hook: serves the fallback palette on the server
160
+ * (hydration-safe), the live document-level token values on the client, and
161
+ * re-reads when `data-theme` flips on `<html>`. Pairs with the persistent
162
+ * `useLightweightChart` scaffold (lw-chart.tsx) for dashboard surfaces.
163
+ * Note: document-level reads — scoped liveries (`.accent-digiquant { … }`)
164
+ * resolve per-host only through `useFinanceChart`'s host reads.
165
+ */
166
+ export function useFinanceChartPalette(): FinanceChartPalette {
167
+ return useSyncExternalStore(subscribeToThemeFlips, getFinancePalette, () => SSR_PALETTE);
168
+ }
169
+
170
+ /**
171
+ * Owns a chart's lifecycle against the returned host ref: create with the
172
+ * token theme, hand the chart to `setup` (add series + set data there, return
173
+ * a re-tint callback for the series' own colors), fit content, re-theme on
174
+ * `data-theme` flips, dispose on unmount.
175
+ *
176
+ * `setup` is an effect dependency — memoize it with `useCallback` keyed on
177
+ * the data props. A data change tears the chart down and rebuilds it, which
178
+ * matches the reference specimens' lifecycle (these are display surfaces;
179
+ * dashboards with live-updating series should use the persistent
180
+ * `useLightweightChart` scaffold from lw-chart.tsx instead).
181
+ */
182
+ export function useFinanceChart(
183
+ setup: (
184
+ chart: IChartApi,
185
+ palette: FinanceChartPalette
186
+ ) => (palette: FinanceChartPalette) => void,
187
+ crosshairLabel: CrosshairLabelToken = "accent"
188
+ ): RefObject<HTMLDivElement | null> {
189
+ const hostRef = useRef<HTMLDivElement | null>(null);
190
+
191
+ useEffect(() => {
192
+ const host = hostRef.current;
193
+ if (!host) return;
194
+
195
+ const reducedMotion =
196
+ window.matchMedia?.("(prefers-reduced-motion: reduce)").matches === true;
197
+ let palette = readFinancePalette(host);
198
+
199
+ const chart: IChartApi = createChart(host, {
200
+ autoSize: true,
201
+ ...financeChartOptions(palette, crosshairLabel),
202
+ // These are display specimens embedded in scrolling prose (design
203
+ // reference / marketing surfaces), never a live dashboard — see this
204
+ // file's own docblock. A reader's wheel/touch scroll landing on the
205
+ // canvas should keep moving the page, not pan/zoom a chart nobody
206
+ // asked to interact with. useLightweightChart (lw-chart.tsx), the
207
+ // dashboard-facing sibling, is untouched and keeps full pan/zoom.
208
+ handleScroll: { mouseWheel: false, pressedMouseMove: false, horzTouchDrag: false, vertTouchDrag: false },
209
+ handleScale: { axisPressedMouseMove: false, mouseWheel: false, pinch: false },
210
+ // Reduced motion: no kinetic-scroll inertia (the final state is the
211
+ // same chart — panning still works, it just stops with the pointer).
212
+ ...(reducedMotion ? { kineticScroll: { touch: false, mouse: false } } : {}),
213
+ });
214
+
215
+ const retintSeries = setup(chart, palette);
216
+ chart.timeScale().fitContent();
217
+
218
+ const retheme = () => {
219
+ palette = readFinancePalette(host);
220
+ chart.applyOptions(financeChartOptions(palette, crosshairLabel));
221
+ retintSeries(palette);
222
+ };
223
+ const themeObs = new MutationObserver(retheme);
224
+ themeObs.observe(document.documentElement, {
225
+ attributes: true,
226
+ attributeFilter: ["data-theme"],
227
+ });
228
+
229
+ return () => {
230
+ themeObs.disconnect();
231
+ chart.remove();
232
+ };
233
+ }, [setup, crosshairLabel]);
234
+
235
+ return hostRef;
236
+ }
@@ -0,0 +1,93 @@
1
+ /**
2
+ * One digiquant chart scale. Candles, volume, and price moves use the
3
+ * design-canon pair already declared as `--up` and `--down` in
4
+ * `@digithings-ai/design/tokens.css` (dark teal `#3DD6C4` / red `#E5533E`,
5
+ * light `#0C7C71` / `#B2452E`).
6
+ *
7
+ * Studies use a teal-led palette — spring, cyan, yellow, lime, orange,
8
+ * green, azure — so each indicator keeps its own hue. Grid and axis stay
9
+ * on the neutral hair and mute tokens.
10
+ *
11
+ * Canvas engines need a resolved color. `DIGIQUANT_CHART` is the dark-theme
12
+ * snapshot (the same fallback `readFinancePalette` uses). Call
13
+ * `readDigiquantChartScale` when a document is available so a theme flip
14
+ * resolves the live custom properties.
15
+ *
16
+ * Import path: `@digithings-ai/ui/chart-scale`.
17
+ */
18
+
19
+ export type DigiquantChartScale = {
20
+ candleUp: string;
21
+ candleDown: string;
22
+ volumeUp: string;
23
+ volumeDown: string;
24
+ sma: string;
25
+ ema: string;
26
+ vwap: string;
27
+ bollingerBasis: string;
28
+ bollingerBand: string;
29
+ supertrendUp: string;
30
+ supertrendDown: string;
31
+ grid: string;
32
+ axis: string;
33
+ };
34
+
35
+ /** Dark-theme snapshot. The token name on each line is the canon-guard escape. */
36
+ function role(token: `--${string}`, fallback: string): string {
37
+ void token;
38
+ return fallback;
39
+ }
40
+
41
+ export const DIGIQUANT_CHART: DigiquantChartScale = {
42
+ candleUp: role("--chart-candle-up", "#3DD6C4"),
43
+ candleDown: role("--chart-candle-down", "#E5533E"),
44
+ volumeUp: role("--chart-volume-up", "#3DD6C4"),
45
+ volumeDown: role("--chart-volume-down", "#E5533E"),
46
+ sma: role("--chart-sma", "#1EC98A"),
47
+ ema: role("--chart-ema", "#5AD4F0"),
48
+ vwap: role("--chart-vwap", "#F0D44A"),
49
+ bollingerBasis: role("--chart-bollinger", "#B0DC3A"),
50
+ bollingerBand: role("--chart-bollinger-band", "#F09238"),
51
+ supertrendUp: role("--chart-supertrend-up", "#54DC62"),
52
+ supertrendDown: role("--chart-supertrend-down", "#6A96F0"),
53
+ grid: role("--chart-grid", "rgba(255, 255, 255, 0.09)"),
54
+ axis: role("--chart-axis", "#7D8389"),
55
+ };
56
+
57
+ /** Live chart roles off `host`, or the dark snapshot when there is no document. */
58
+ export function readDigiquantChartScale(host: HTMLElement | null): DigiquantChartScale {
59
+ const cs = host && typeof window !== "undefined" ? getComputedStyle(host) : null;
60
+ const cssVar = (name: keyof typeof TOKEN, fallback: string) =>
61
+ cs?.getPropertyValue(TOKEN[name]).trim() || fallback;
62
+ return {
63
+ candleUp: cssVar("candleUp", DIGIQUANT_CHART.candleUp),
64
+ candleDown: cssVar("candleDown", DIGIQUANT_CHART.candleDown),
65
+ volumeUp: cssVar("volumeUp", DIGIQUANT_CHART.volumeUp),
66
+ volumeDown: cssVar("volumeDown", DIGIQUANT_CHART.volumeDown),
67
+ sma: cssVar("sma", DIGIQUANT_CHART.sma),
68
+ ema: cssVar("ema", DIGIQUANT_CHART.ema),
69
+ vwap: cssVar("vwap", DIGIQUANT_CHART.vwap),
70
+ bollingerBasis: cssVar("bollingerBasis", DIGIQUANT_CHART.bollingerBasis),
71
+ bollingerBand: cssVar("bollingerBand", DIGIQUANT_CHART.bollingerBand),
72
+ supertrendUp: cssVar("supertrendUp", DIGIQUANT_CHART.supertrendUp),
73
+ supertrendDown: cssVar("supertrendDown", DIGIQUANT_CHART.supertrendDown),
74
+ grid: cssVar("grid", DIGIQUANT_CHART.grid),
75
+ axis: cssVar("axis", DIGIQUANT_CHART.axis),
76
+ };
77
+ }
78
+
79
+ const TOKEN = {
80
+ candleUp: "--chart-candle-up",
81
+ candleDown: "--chart-candle-down",
82
+ volumeUp: "--chart-volume-up",
83
+ volumeDown: "--chart-volume-down",
84
+ sma: "--chart-sma",
85
+ ema: "--chart-ema",
86
+ vwap: "--chart-vwap",
87
+ bollingerBasis: "--chart-bollinger",
88
+ bollingerBand: "--chart-bollinger-band",
89
+ supertrendUp: "--chart-supertrend-up",
90
+ supertrendDown: "--chart-supertrend-down",
91
+ grid: "--chart-grid",
92
+ axis: "--chart-axis",
93
+ } as const;
@@ -0,0 +1,88 @@
1
+ /**
2
+ * DEMO DATA ONLY (#1450) — deterministic filler series for the finance-charts
3
+ * family, the exact LCG walks the reference specimens shipped with, so the
4
+ * promoted charts render pixel-identical on the reference pages. Marketing /
5
+ * catalog surfaces may pass these; anything showing real performance passes
6
+ * its own series — the chart components take data via required props precisely
7
+ * so demo numbers can never ship by omission.
8
+ */
9
+
10
+ import type { FinanceSeriesPoint, OhlcPoint } from "./chart-host";
11
+
12
+ /** Deterministic LCG in [0, 1) — stable across renders and runtimes. */
13
+ function lcg(seed: number): () => number {
14
+ let s = seed;
15
+ return () => {
16
+ s = (s * 1103515245 + 12345) & 0x7fffffff;
17
+ return s / 0x7fffffff;
18
+ };
19
+ }
20
+
21
+ function isoOffset(startUtc: Date, days: number): string {
22
+ const date = new Date(startUtc);
23
+ date.setUTCDate(startUtc.getUTCDate() + days);
24
+ return date.toISOString().slice(0, 10);
25
+ }
26
+
27
+ /** Cumulative-equity walk: starts at 100, drifts up with dips (weekly bars). */
28
+ function equityCurveDemo(n: number): FinanceSeriesPoint[] {
29
+ const rnd = lcg(730217);
30
+ const start = new Date(Date.UTC(2022, 0, 1));
31
+ const data: FinanceSeriesPoint[] = [];
32
+ let equity = 100;
33
+ for (let i = 0; i < n; i++) {
34
+ equity *= 1 + (rnd() - 0.44) * 0.05;
35
+ data.push({ time: isoOffset(start, i * 7), value: Math.max(40, equity) });
36
+ }
37
+ return data;
38
+ }
39
+
40
+ /** Underwater curve: % below the running peak of an equity walk — every
41
+ * value is ≤ 0. */
42
+ function drawdownDemo(n: number): FinanceSeriesPoint[] {
43
+ const rnd = lcg(5150);
44
+ const start = new Date(Date.UTC(2022, 0, 1));
45
+ const data: FinanceSeriesPoint[] = [];
46
+ let equity = 100;
47
+ let peak = 100;
48
+ for (let i = 0; i < n; i++) {
49
+ equity *= 1 + (rnd() - 0.44) * 0.05;
50
+ peak = Math.max(peak, equity);
51
+ data.push({
52
+ time: isoOffset(start, i * 7),
53
+ value: Math.round((equity / peak - 1) * 1000) / 10,
54
+ });
55
+ }
56
+ return data;
57
+ }
58
+
59
+ /** Daily OHLC + volume walk. */
60
+ function priceChartDemo(n: number): { candles: OhlcPoint[]; volume: FinanceSeriesPoint[] } {
61
+ const rnd = lcg(20260101);
62
+ const start = new Date(Date.UTC(2026, 0, 1));
63
+ const candles: OhlcPoint[] = [];
64
+ const volume: FinanceSeriesPoint[] = [];
65
+ let price = 92;
66
+ for (let i = 0; i < n; i++) {
67
+ const time = isoOffset(start, i);
68
+ const drift = (rnd() - 0.47) * 3.4;
69
+ const open = price;
70
+ const close = Math.max(6, open + drift);
71
+ const high = Math.max(open, close) + rnd() * 2.1;
72
+ const low = Math.min(open, close) - rnd() * 2.1;
73
+ candles.push({ time, open, high, low, close });
74
+ volume.push({ time, value: 40 + rnd() * 120 });
75
+ price = close;
76
+ }
77
+ return { candles, volume };
78
+ }
79
+
80
+ /** Demo cumulative-equity series (210 weekly points from 2022-01-01). */
81
+ export const EQUITY_CURVE_DEMO: FinanceSeriesPoint[] = equityCurveDemo(210);
82
+
83
+ /** Demo underwater-drawdown series (210 weekly points, all ≤ 0). */
84
+ export const DRAWDOWN_DEMO: FinanceSeriesPoint[] = drawdownDemo(210);
85
+
86
+ /** Demo OHLC candles + volume bars (120 daily points from 2026-01-01). */
87
+ export const PRICE_CHART_DEMO: { candles: OhlcPoint[]; volume: FinanceSeriesPoint[] } =
88
+ priceChartDemo(120);
@@ -0,0 +1,46 @@
1
+ /**
2
+ * finance-charts family barrel (#1450) — canvas dashboard chart surfaces
3
+ * promoted from the design reference's finance page. Time-series charts ride
4
+ * TradingView Lightweight Charts (the engine ruling — see
5
+ * packages/ui/CHARTS.md for the canvas-vs-SVG split; print-grade
6
+ * surfaces compose the finance-tearsheet family instead). MonthlyReturns was
7
+ * deprecated into finance-tearsheet's ReturnsMatrix (#1463) — one matrix
8
+ * grammar, no app consumers existed. Re-exported from the package root by
9
+ * src/index.ts.
10
+ */
11
+
12
+ export { PriceChart, type PriceChartProps } from "./PriceChart";
13
+ export { EquityCurve, type EquityCurveProps } from "./EquityCurve";
14
+ export { DrawdownPlot, type DrawdownPlotProps } from "./DrawdownPlot";
15
+ export {
16
+ useFinanceChart,
17
+ useFinanceChartPalette,
18
+ getFinancePalette,
19
+ readFinancePalette,
20
+ financeChartOptions,
21
+ tokenAlpha,
22
+ toChartTime,
23
+ type FinanceChartPalette,
24
+ type FinanceSeriesPoint,
25
+ type OhlcPoint,
26
+ type CrosshairLabelToken,
27
+ } from "./chart-host";
28
+ export {
29
+ useLightweightChart,
30
+ chartChromeOptions,
31
+ hostMonoFont,
32
+ toLineData,
33
+ timeToISO,
34
+ useChartTip,
35
+ ChartTipShell,
36
+ type ChartChrome,
37
+ type ChartTip,
38
+ type UseLightweightChartConfig,
39
+ type UseLightweightChartResult,
40
+ } from "./lw-chart";
41
+ export { PRICE_CHART_DEMO, EQUITY_CURVE_DEMO, DRAWDOWN_DEMO } from "./demo-data";
42
+ export {
43
+ DIGIQUANT_CHART,
44
+ readDigiquantChartScale,
45
+ type DigiquantChartScale,
46
+ } from "./chart-scale";