@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,267 @@
1
+ import type { ComponentProps, CSSProperties } from "react";
2
+ import { cn } from "../../../../../lib/utils";
3
+
4
+ const GRID = 5;
5
+ const CENTER = (GRID - 1) / 2;
6
+ const DOT_INDEXES = Array.from({ length: GRID * GRID }, (_, i) => i);
7
+
8
+ /* Deterministic bit-mixing hash so server and client render identical markup; takes a range in milliseconds and returns seconds. A plain (i * prime) % range correlates indexes a grid-stride apart and renders as column-synchronized waves instead of a twinkle. */
9
+ const hash = (n: number, salt: number, range: number) => {
10
+ let h = (Math.imul(n, 374761393) + Math.imul(salt, 668265263)) >>> 0;
11
+ h = Math.imul(h ^ (h >>> 13), 1274126177) >>> 0;
12
+ return ((h ^ (h >>> 16)) % range) / 1000;
13
+ };
14
+
15
+ const glyph = (dots: [number, number][]) =>
16
+ new Set(dots.map(([row, col]) => row * GRID + col));
17
+
18
+ const CHECK = glyph([
19
+ [1, 4],
20
+ [2, 3],
21
+ [3, 0],
22
+ [3, 2],
23
+ [4, 1],
24
+ ]);
25
+ const CROSS = glyph([
26
+ [0, 0],
27
+ [0, 4],
28
+ [1, 1],
29
+ [1, 3],
30
+ [2, 2],
31
+ [3, 1],
32
+ [3, 3],
33
+ [4, 0],
34
+ [4, 4],
35
+ ]);
36
+ const BANG = glyph([
37
+ [0, 2],
38
+ [1, 2],
39
+ [2, 2],
40
+ [4, 2],
41
+ ]);
42
+ const INFO = glyph([
43
+ [0, 2],
44
+ [2, 2],
45
+ [3, 2],
46
+ [4, 2],
47
+ ]);
48
+ const PAUSE = glyph([
49
+ [1, 1],
50
+ [2, 1],
51
+ [3, 1],
52
+ [1, 3],
53
+ [2, 3],
54
+ [3, 3],
55
+ ]);
56
+ const STOP = glyph([
57
+ [1, 1],
58
+ [1, 2],
59
+ [1, 3],
60
+ [2, 1],
61
+ [2, 2],
62
+ [2, 3],
63
+ [3, 1],
64
+ [3, 2],
65
+ [3, 3],
66
+ ]);
67
+ const RECORD = glyph([
68
+ [1, 2],
69
+ [2, 1],
70
+ [2, 2],
71
+ [2, 3],
72
+ [3, 2],
73
+ ]);
74
+ const ELLIPSIS = glyph([
75
+ [2, 0],
76
+ [2, 2],
77
+ [2, 4],
78
+ ]);
79
+
80
+ type Blink = { duration: number; delay: number; lo: number };
81
+
82
+ type StateConfig = {
83
+ /** Text color class; dots inherit the surrounding color when omitted. */
84
+ color?: string;
85
+ /** Dots that render at full opacity; all others rest at `dim`. Omit for the full grid. */
86
+ glyph?: Set<number>;
87
+ /** Resting opacity of on dots. */
88
+ base?: number;
89
+ /** Resting opacity of off dots when a glyph is set. */
90
+ dim?: number;
91
+ /** Blink parameters per on dot, keyed by index and grid position. */
92
+ blink?: (i: number, row: number, col: number) => Blink;
93
+ };
94
+
95
+ const STATES = {
96
+ idle: { color: "text-muted-foreground", base: 0.3 },
97
+ loading: {
98
+ blink: (i) => ({
99
+ duration: 0.9 + hash(i, 2, 700),
100
+ delay: -hash(i, 1, 1200),
101
+ lo: 0.15,
102
+ }),
103
+ },
104
+ thinking: {
105
+ blink: (_i, row, col) => ({
106
+ duration: 1.2,
107
+ delay: -(row + col) * 0.09,
108
+ lo: 0.2,
109
+ }),
110
+ },
111
+ streaming: {
112
+ blink: (_i, row, col) => ({
113
+ duration: 0.9,
114
+ delay: -(row * 0.12 + hash(col, 3, 900)),
115
+ lo: 0.15,
116
+ }),
117
+ },
118
+ searching: {
119
+ blink: (_i, _row, col) => ({ duration: 1.1, delay: -col * 0.12, lo: 0.2 }),
120
+ },
121
+ syncing: {
122
+ blink: (_i, row, col) => {
123
+ const turn =
124
+ (Math.atan2(row - CENTER, col - CENTER) + Math.PI) / (2 * Math.PI);
125
+ return { duration: 1.3, delay: -turn * 1.3, lo: 0.2 };
126
+ },
127
+ },
128
+ connecting: {
129
+ blink: (_i, row, col) => ({
130
+ duration: 1.4,
131
+ delay: -Math.max(Math.abs(row - CENTER), Math.abs(col - CENTER)) * 0.18,
132
+ lo: 0.15,
133
+ }),
134
+ },
135
+ waiting: {
136
+ glyph: ELLIPSIS,
137
+ blink: (_i, _row, col) => ({
138
+ duration: 1.2,
139
+ delay: -col * 0.09,
140
+ lo: 0.2,
141
+ }),
142
+ },
143
+ uploading: {
144
+ blink: (_i, row) => ({
145
+ duration: 1,
146
+ delay: -(GRID - 1 - row) * 0.12,
147
+ lo: 0.2,
148
+ }),
149
+ },
150
+ downloading: {
151
+ blink: (_i, row) => ({ duration: 1, delay: -row * 0.12, lo: 0.2 }),
152
+ },
153
+ listening: {
154
+ blink: (_i, _row, col) => ({
155
+ duration: 0.7 + hash(col, 4, 500),
156
+ delay: -hash(col, 5, 900),
157
+ lo: 0.25,
158
+ }),
159
+ },
160
+ speaking: {
161
+ blink: (_i, _row, col) => ({
162
+ duration: 0.4 + hash(col, 6, 350),
163
+ delay: -hash(col, 7, 700),
164
+ lo: 0.2,
165
+ }),
166
+ },
167
+ recording: {
168
+ color: "text-red-500",
169
+ glyph: RECORD,
170
+ dim: 0.12,
171
+ blink: () => ({ duration: 1.4, delay: 0, lo: 0.3 }),
172
+ },
173
+ success: { color: "text-emerald-500", glyph: CHECK },
174
+ error: {
175
+ color: "text-red-500",
176
+ glyph: CROSS,
177
+ blink: () => ({ duration: 1.1, delay: 0, lo: 0.4 }),
178
+ },
179
+ warning: {
180
+ color: "text-amber-500",
181
+ glyph: BANG,
182
+ blink: () => ({ duration: 1.6, delay: 0, lo: 0.45 }),
183
+ },
184
+ info: { color: "text-blue-500", glyph: INFO },
185
+ paused: { color: "text-muted-foreground", glyph: PAUSE },
186
+ stopped: { color: "text-muted-foreground", glyph: STOP },
187
+ offline: { color: "text-muted-foreground", base: 0.15 },
188
+ } satisfies Record<string, StateConfig>;
189
+
190
+ export type DotMatrixState = keyof typeof STATES;
191
+
192
+ const dotMatrixStates = Object.keys(STATES) as readonly DotMatrixState[];
193
+
194
+ export type DotMatrixProps = Omit<ComponentProps<"span">, "children"> & {
195
+ state?: DotMatrixState;
196
+ label?: string;
197
+ };
198
+
199
+ /* The blink animation runs on every dot in every state (static states set hi = lo) and the registered hi/lo custom properties carry a transition, because removing or adding an animation never triggers a CSS transition on the animated property itself; transitioning the amplitude bounds is what makes state changes cross-fade. */
200
+ const DOT_MATRIX_CSS =
201
+ '@property --aui-dot-matrix-hi{syntax:"<number>";inherits:false;initial-value:1}@property --aui-dot-matrix-lo{syntax:"<number>";inherits:false;initial-value:0.15}@keyframes aui-dot-matrix-blink{0%,100%{opacity:var(--aui-dot-matrix-hi,1)}50%{opacity:var(--aui-dot-matrix-lo,0.15)}}';
202
+
203
+ /**
204
+ * Tiny 5x5 dot-matrix status indicator with 20 built-in states. Dots inherit the text color and animate in state-specific patterns: twinkle, waves, ripples, sweeps, equalizer columns, and check/cross/bang glyphs. State changes cross-fade per dot.
205
+ *
206
+ * ```tsx
207
+ * <DotMatrix state={isRunning ? "loading" : "success"} />
208
+ * ```
209
+ */
210
+ function DotMatrix({
211
+ className,
212
+ state = "loading",
213
+ label,
214
+ ...props
215
+ }: DotMatrixProps) {
216
+ const config: StateConfig = STATES[state];
217
+ return (
218
+ <span
219
+ data-slot="dot-matrix"
220
+ data-state={state}
221
+ role="status"
222
+ className={cn("inline-block size-4 shrink-0", config.color, className)}
223
+ {...props}
224
+ >
225
+ <span className="sr-only">{label ?? state}</span>
226
+ {/* Hoisted and deduplicated across instances by React; must live in HTML scope, inside the SVG it would be an SVG-namespace element React does not hoist. */}
227
+ <style href="aui-dot-matrix" precedence="low">
228
+ {DOT_MATRIX_CSS}
229
+ </style>
230
+ <svg
231
+ aria-hidden
232
+ viewBox="0 0 20 20"
233
+ fill="currentColor"
234
+ className="size-full"
235
+ >
236
+ {DOT_INDEXES.map((i) => {
237
+ const row = Math.floor(i / GRID);
238
+ const col = i % GRID;
239
+ const on = !config.glyph || config.glyph.has(i);
240
+ const hi = on ? (config.base ?? 1) : (config.dim ?? 0.15);
241
+ const blink = on ? config.blink?.(i, row, col) : undefined;
242
+ return (
243
+ <circle
244
+ key={i}
245
+ data-slot="dot-matrix-dot"
246
+ cx={2 + col * 4}
247
+ cy={2 + row * 4}
248
+ r={1.3}
249
+ className="[transition-property:--aui-dot-matrix-hi,--aui-dot-matrix-lo,opacity] duration-300 [animation-iteration-count:infinite] [animation-name:aui-dot-matrix-blink] [animation-timing-function:ease-in-out] motion-reduce:[animation-name:none]"
250
+ style={
251
+ {
252
+ opacity: hi,
253
+ animationDuration: `${blink?.duration ?? 1}s`,
254
+ animationDelay: `${blink?.delay ?? 0}s`,
255
+ "--aui-dot-matrix-hi": hi,
256
+ "--aui-dot-matrix-lo": blink?.lo ?? hi,
257
+ } as CSSProperties
258
+ }
259
+ />
260
+ );
261
+ })}
262
+ </svg>
263
+ </span>
264
+ );
265
+ }
266
+
267
+ export { DotMatrix, dotMatrixStates };
@@ -0,0 +1,97 @@
1
+ "use client";
2
+
3
+ import * as React from "react";
4
+ import { Popover as PopoverPrimitive } from "@base-ui/react/popover";
5
+
6
+ import { cn } from "../../../../../lib/utils";
7
+
8
+ function Popover({ ...props }: PopoverPrimitive.Root.Props) {
9
+ return <PopoverPrimitive.Root data-slot="popover" {...props} />;
10
+ }
11
+
12
+ function PopoverTrigger({ ...props }: PopoverPrimitive.Trigger.Props) {
13
+ return <PopoverPrimitive.Trigger data-slot="popover-trigger" {...props} />;
14
+ }
15
+
16
+ const PopoverContent = React.forwardRef<
17
+ HTMLDivElement,
18
+ PopoverPrimitive.Popup.Props &
19
+ Pick<
20
+ PopoverPrimitive.Positioner.Props,
21
+ "align" | "alignOffset" | "side" | "sideOffset"
22
+ >
23
+ >(function PopoverContent(
24
+ {
25
+ className,
26
+ align = "center",
27
+ alignOffset = 0,
28
+ side = "bottom",
29
+ sideOffset = 4,
30
+ ...props
31
+ },
32
+ ref,
33
+ ) {
34
+ return (
35
+ <PopoverPrimitive.Portal>
36
+ <PopoverPrimitive.Positioner
37
+ align={align}
38
+ alignOffset={alignOffset}
39
+ side={side}
40
+ sideOffset={sideOffset}
41
+ className="isolate z-50"
42
+ >
43
+ <PopoverPrimitive.Popup
44
+ ref={ref}
45
+ data-slot="popover-content"
46
+ className={cn(
47
+ "bg-popover text-popover-foreground ring-foreground/10 data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95 z-50 flex w-72 origin-(--transform-origin) flex-col gap-2.5 rounded-[var(--radius-surface,var(--radius-lg))] p-3 text-sm ring-1 outline-hidden duration-100",
48
+ className,
49
+ )}
50
+ {...props}
51
+ />
52
+ </PopoverPrimitive.Positioner>
53
+ </PopoverPrimitive.Portal>
54
+ );
55
+ });
56
+
57
+ function PopoverHeader({ className, ...props }: React.ComponentProps<"div">) {
58
+ return (
59
+ <div
60
+ data-slot="popover-header"
61
+ className={cn("flex flex-col gap-0.5 text-sm", className)}
62
+ {...props}
63
+ />
64
+ );
65
+ }
66
+
67
+ function PopoverTitle({ className, ...props }: PopoverPrimitive.Title.Props) {
68
+ return (
69
+ <PopoverPrimitive.Title
70
+ data-slot="popover-title"
71
+ className={cn("font-medium", className)}
72
+ {...props}
73
+ />
74
+ );
75
+ }
76
+
77
+ function PopoverDescription({
78
+ className,
79
+ ...props
80
+ }: PopoverPrimitive.Description.Props) {
81
+ return (
82
+ <PopoverPrimitive.Description
83
+ data-slot="popover-description"
84
+ className={cn("text-muted-foreground", className)}
85
+ {...props}
86
+ />
87
+ );
88
+ }
89
+
90
+ export {
91
+ Popover,
92
+ PopoverContent,
93
+ PopoverDescription,
94
+ PopoverHeader,
95
+ PopoverTitle,
96
+ PopoverTrigger,
97
+ };
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Base skin skeleton: the assistant-ui / shadcn default, drawn only from the theme
3
+ * tokens (background, foreground, popover, muted, primary, border, ring), so a
4
+ * tenant or brand theme restyles it. The stock (digichat) twin keeps its own
5
+ * square look; nothing in the base skin path may import it
6
+ * (base-skin-theme-surfaces.source.test.ts).
7
+ */
8
+ import { cn } from "../../../../../lib/utils"
9
+
10
+ function Skeleton({ className, ...props }: React.ComponentProps<"div">) {
11
+ return (
12
+ <div
13
+ data-slot="skeleton"
14
+ className={cn("animate-pulse rounded-md bg-muted", className)}
15
+ {...props}
16
+ />
17
+ )
18
+ }
19
+
20
+ export { Skeleton }
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Base skin textarea: the assistant-ui / shadcn default, drawn only from the theme
3
+ * tokens (background, foreground, popover, muted, primary, border, ring), so a
4
+ * tenant or brand theme restyles it. The stock (digichat) twin keeps its own
5
+ * square look; nothing in the base skin path may import it
6
+ * (base-skin-theme-surfaces.source.test.ts).
7
+ */
8
+ import * as React from "react"
9
+ import { cn } from "../../../../../lib/utils"
10
+
11
+ function Textarea({ className, ...props }: React.ComponentProps<"textarea">) {
12
+ return (
13
+ <textarea
14
+ data-slot="textarea"
15
+ className={cn(
16
+ "flex field-sizing-content min-h-16 w-full rounded-md border border-input bg-transparent px-2.5 py-2 text-base transition-colors outline-none placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40",
17
+ className
18
+ )}
19
+ {...props}
20
+ />
21
+ )
22
+ }
23
+
24
+ export { Textarea }
@@ -0,0 +1,73 @@
1
+ "use client"
2
+
3
+ /**
4
+ * Base skin tooltip: the assistant-ui / shadcn default, drawn only from the theme
5
+ * tokens (background, foreground, popover, muted, primary, border, ring), so a
6
+ * tenant or brand theme restyles it. The stock (digichat) twin keeps its own
7
+ * square look; nothing in the base skin path may import it
8
+ * (base-skin-theme-surfaces.source.test.ts).
9
+ */
10
+
11
+ import { Tooltip as TooltipPrimitive } from "@base-ui/react/tooltip"
12
+ import { cn } from "../../../../../lib/utils"
13
+
14
+ function TooltipProvider({
15
+ delay = 0,
16
+ ...props
17
+ }: TooltipPrimitive.Provider.Props) {
18
+ return (
19
+ <TooltipPrimitive.Provider
20
+ data-slot="tooltip-provider"
21
+ delay={delay}
22
+ {...props}
23
+ />
24
+ )
25
+ }
26
+
27
+ function Tooltip({ ...props }: TooltipPrimitive.Root.Props) {
28
+ return <TooltipPrimitive.Root data-slot="tooltip" {...props} />
29
+ }
30
+
31
+ function TooltipTrigger({ ...props }: TooltipPrimitive.Trigger.Props) {
32
+ return <TooltipPrimitive.Trigger data-slot="tooltip-trigger" {...props} />
33
+ }
34
+
35
+ function TooltipContent({
36
+ className,
37
+ side = "top",
38
+ sideOffset = 4,
39
+ align = "center",
40
+ alignOffset = 0,
41
+ children,
42
+ ...props
43
+ }: TooltipPrimitive.Popup.Props &
44
+ Pick<
45
+ TooltipPrimitive.Positioner.Props,
46
+ "align" | "alignOffset" | "side" | "sideOffset"
47
+ >) {
48
+ return (
49
+ <TooltipPrimitive.Portal>
50
+ <TooltipPrimitive.Positioner
51
+ align={align}
52
+ alignOffset={alignOffset}
53
+ side={side}
54
+ sideOffset={sideOffset}
55
+ className="isolate z-50"
56
+ >
57
+ <TooltipPrimitive.Popup
58
+ data-slot="tooltip-content"
59
+ className={cn(
60
+ "z-50 inline-flex w-fit max-w-xs origin-(--transform-origin) items-center gap-1.5 rounded-md bg-foreground px-3 py-1.5 text-xs text-background has-data-[slot=kbd]:pr-1.5 data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 **:data-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-50 **:data-[slot=kbd]:rounded-sm data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
61
+ className
62
+ )}
63
+ {...props}
64
+ >
65
+ {children}
66
+ <TooltipPrimitive.Arrow data-slot="tooltip-arrow" className="z-50 size-2.5 translate-y-[calc(-50%-2px)] rotate-45 rounded-[2px] bg-foreground fill-foreground data-[side=bottom]:top-1 data-[side=inline-end]:top-1/2! data-[side=inline-end]:-left-1 data-[side=inline-end]:-translate-y-1/2 data-[side=inline-start]:top-1/2! data-[side=inline-start]:-right-1 data-[side=inline-start]:-translate-y-1/2 data-[side=left]:top-1/2! data-[side=left]:-right-1 data-[side=left]:-translate-y-1/2 data-[side=right]:top-1/2! data-[side=right]:-left-1 data-[side=right]:-translate-y-1/2 data-[side=top]:-bottom-2.5" />
67
+ </TooltipPrimitive.Popup>
68
+ </TooltipPrimitive.Positioner>
69
+ </TooltipPrimitive.Portal>
70
+ )
71
+ }
72
+
73
+ export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }
@@ -0,0 +1,90 @@
1
+ "use client";
2
+
3
+ import {
4
+ createContext,
5
+ useContext,
6
+ type CSSProperties,
7
+ type ReactNode,
8
+ } from "react";
9
+ import {
10
+ defaultBaseConfig,
11
+ type ResolvedBaseConfig,
12
+ } from "./defaults";
13
+
14
+ const BaseConfigContext = createContext<ResolvedBaseConfig>(defaultBaseConfig);
15
+
16
+ export function BaseConfigProvider({
17
+ value,
18
+ children,
19
+ }: {
20
+ value: ResolvedBaseConfig;
21
+ children: ReactNode;
22
+ }) {
23
+ const theme = value.brandTheme;
24
+ const style = {
25
+ "--background": theme.background,
26
+ "--foreground": theme.text,
27
+ "--muted": theme.surface,
28
+ "--muted-foreground": colorMix(theme.text, theme.background, 0.7),
29
+ "--accent": colorMix(theme.accent, theme.background, 0.18),
30
+ "--accent-foreground": theme.text,
31
+ "--border": colorMix(theme.surface, theme.text, 0.82),
32
+ "--input": colorMix(theme.surface, theme.text, 0.82),
33
+ "--ring": theme.accent,
34
+ "--primary": theme.accent,
35
+ "--primary-foreground": bestContrast(theme.accent),
36
+ "--popover": theme.background,
37
+ "--popover-foreground": theme.text,
38
+ "--card": theme.background,
39
+ "--card-foreground": theme.text,
40
+ "--sidebar": theme.surface,
41
+ "--sidebar-foreground": theme.text,
42
+ "--sidebar-primary": theme.accent,
43
+ "--sidebar-primary-foreground": bestContrast(theme.accent),
44
+ "--sidebar-accent": colorMix(theme.accent, theme.surface, 0.2),
45
+ "--sidebar-accent-foreground": theme.text,
46
+ "--sidebar-border": colorMix(theme.surface, theme.accent, 0.78),
47
+ "--sidebar-ring": theme.accent,
48
+ } as CSSProperties;
49
+
50
+ return (
51
+ <BaseConfigContext.Provider value={value}>
52
+ <div className="dark h-full" style={style}>
53
+ {children}
54
+ </div>
55
+ </BaseConfigContext.Provider>
56
+ );
57
+ }
58
+
59
+ export function useBaseConfig() {
60
+ return useContext(BaseConfigContext);
61
+ }
62
+
63
+ function colorMix(first: string, second: string, firstWeight: number) {
64
+ const a = parseHex(first);
65
+ const b = parseHex(second);
66
+ if (!a || !b) return first;
67
+
68
+ const mix = a.map((value, index) =>
69
+ Math.round(value * firstWeight + b[index] * (1 - firstWeight)),
70
+ );
71
+ return `#${mix.map((value) => value.toString(16).padStart(2, "0")).join("")}`;
72
+ }
73
+
74
+ function bestContrast(hex: string) {
75
+ const rgb = parseHex(hex);
76
+ if (!rgb) return "#000000";
77
+ const luminance = (0.2126 * rgb[0] + 0.7152 * rgb[1] + 0.0722 * rgb[2]) / 255;
78
+ return luminance > 0.6 ? "#09090b" : "#ffffff";
79
+ }
80
+
81
+ function parseHex(hex: string) {
82
+ const match = /^#([0-9a-f]{6})$/i.exec(hex);
83
+ if (!match) return null;
84
+ const value = match[1];
85
+ return [
86
+ Number.parseInt(value.slice(0, 2), 16),
87
+ Number.parseInt(value.slice(2, 4), 16),
88
+ Number.parseInt(value.slice(4, 6), 16),
89
+ ];
90
+ }