@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,645 @@
1
+ "use client";
2
+
3
+ import "../../../styles/chat-stock-menu.css";
4
+ import {
5
+ ComposerAddAttachment,
6
+ ComposerAttachments,
7
+ UserMessageAttachments,
8
+ } from "./attachment.aui";
9
+ import { File } from "./file";
10
+ import { ThreadFollowupSuggestions } from "./follow-up-suggestions.aui";
11
+ import { Image } from "./image";
12
+ import { useSuggestionGroup } from "../suggestion-cycle";
13
+ import { MarkdownText } from "./markdown-text";
14
+ import { AssistantTrace } from "../skins/base/elements/assistant-trace.aui";
15
+ import { messageHasContent } from "../trace-grouping";
16
+ import { MessageExportMenu } from "./message-export-menu";
17
+ import { TooltipIconButton } from "./tooltip-icon-button";
18
+ import { Button } from "./ui/button";
19
+ import { Skeleton } from "./ui/skeleton";
20
+ import { StockShapeProvider } from "./stock-shape";
21
+ import { cn } from "../../../lib/utils";
22
+ import { useStockComposerGateSubmit } from "./stock-send-gate";
23
+ import { MessageError } from "./message-error.aui";
24
+ import { SkinCredit } from "./skin-credit";
25
+ import { DotMatrix } from "../DotMatrix";
26
+
27
+ import { useDeployUi } from "./deploy-ui-context";
28
+ import {
29
+ ActionBarPrimitive,
30
+ AuiIf,
31
+ type AssistantState,
32
+ BranchPickerPrimitive,
33
+ ComposerPrimitive,
34
+ MessagePrimitive,
35
+ SuggestionPrimitive,
36
+ ThreadPrimitive,
37
+ type FileMessagePartComponent,
38
+ type ImageMessagePartComponent,
39
+ type ToolCallMessagePartComponent,
40
+ useAuiState,
41
+ } from "@assistant-ui/react";
42
+ import {
43
+ ArrowDownIcon,
44
+ ArrowUpIcon,
45
+ CheckIcon,
46
+ ChevronLeftIcon,
47
+ ChevronRightIcon,
48
+ CopyIcon,
49
+ DownloadIcon,
50
+ MicIcon,
51
+ MoreHorizontalIcon,
52
+ PencilIcon,
53
+ RefreshCwIcon,
54
+ SquareIcon,
55
+ } from "lucide-react";
56
+ import {
57
+ createContext,
58
+ useContext,
59
+ type ComponentType,
60
+ type FC,
61
+ type PropsWithChildren,
62
+ } from "react";
63
+
64
+ export type ThreadGroupPart = MessagePrimitive.GroupedParts.GroupPart;
65
+
66
+ /**
67
+ * Optional component overrides for the thread. `AssistantMessage` and
68
+ * `Welcome` replace whole sections; the remaining slots override how the
69
+ * assistant message renders tool calls and part groups. Tool UIs registered
70
+ * by name (toolkit `render`, `useAssistantDataUI`) take precedence over
71
+ * `ToolFallback`.
72
+ */
73
+ export type ThreadComponents = {
74
+ AssistantMessage?: ComponentType | undefined;
75
+ Welcome?: ComponentType | undefined;
76
+ /**
77
+ * Optional footer slot below the composer (defaults to the shared
78
+ * "powered by digichat" credit; hosts may render their own footer here).
79
+ */
80
+ Footer?: ComponentType | undefined;
81
+ ToolFallback?: ToolCallMessagePartComponent | undefined;
82
+ ToolGroup?:
83
+ | ComponentType<PropsWithChildren<{ group: ThreadGroupPart }>>
84
+ | undefined;
85
+ ReasoningGroup?:
86
+ | ComponentType<PropsWithChildren<{ group: ThreadGroupPart }>>
87
+ | undefined;
88
+ };
89
+
90
+ export type ThreadProps = {
91
+ components?: ThreadComponents | undefined;
92
+ autoFocus?: boolean | undefined;
93
+ };
94
+
95
+ const EMPTY_COMPONENTS: ThreadComponents = {};
96
+
97
+ const ThreadComponentsContext =
98
+ createContext<ThreadComponents>(EMPTY_COMPONENTS);
99
+ // Startup exposes a loading placeholder thread; treat it as a new chat so
100
+ // the composer mounts centered. Loads after startup keep the docked layout.
101
+ const isNewChatView = (s: AssistantState) =>
102
+ s.thread.messages.length === 0 &&
103
+ (!s.thread.isLoading || s.threads.isLoading);
104
+
105
+ // A switched thread that is still fetching its history: skeleton, not welcome.
106
+ const isHistoryLoadingView = (s: AssistantState) =>
107
+ s.thread.messages.length === 0 &&
108
+ s.thread.isLoading &&
109
+ !s.thread.isDisabled &&
110
+ !s.threads.isLoading;
111
+
112
+ const ThreadHistorySkeleton: FC = () => (
113
+ <div
114
+ data-slot="aui_thread-history-skeleton"
115
+ role="status"
116
+ className="animate-in fade-in fill-mode-both flex flex-col gap-y-6 [animation-delay:150ms] [animation-duration:200ms]"
117
+ >
118
+ <span className="sr-only">Loading conversation</span>
119
+ <Skeleton className="ml-auto h-9 w-2/5 rounded-xl motion-reduce:animate-none" />
120
+ <div className="flex flex-col gap-y-2">
121
+ <Skeleton className="h-4 w-11/12 motion-reduce:animate-none" />
122
+ <Skeleton className="h-4 w-4/5 motion-reduce:animate-none" />
123
+ <Skeleton className="h-4 w-3/5 motion-reduce:animate-none" />
124
+ </div>
125
+ <Skeleton className="ml-auto h-9 w-1/3 rounded-xl motion-reduce:animate-none" />
126
+ <div className="flex flex-col gap-y-2">
127
+ <Skeleton className="h-4 w-10/12 motion-reduce:animate-none" />
128
+ <Skeleton className="h-4 w-2/3 motion-reduce:animate-none" />
129
+ </div>
130
+ </div>
131
+ );
132
+
133
+ export const Thread: FC<ThreadProps> = ({
134
+ components = EMPTY_COMPONENTS,
135
+ autoFocus = true,
136
+ }) => {
137
+ const isEmpty = useAuiState(isNewChatView);
138
+
139
+ return (
140
+ <ThreadComponentsContext.Provider value={components}>
141
+ <StockShapeProvider>
142
+ <ThreadRoot isEmpty={isEmpty} autoFocus={autoFocus} />
143
+ </StockShapeProvider>
144
+ </ThreadComponentsContext.Provider>
145
+ );
146
+ };
147
+
148
+ const ThreadRoot: FC<{ isEmpty: boolean; autoFocus: boolean }> = ({
149
+ isEmpty,
150
+ autoFocus,
151
+ }) => {
152
+ const { Welcome = ThreadWelcome, Footer = ThreadFooter } =
153
+ useContext(ThreadComponentsContext);
154
+
155
+ return (
156
+ <ThreadPrimitive.Root
157
+ className="aui-root aui-thread-root bg-surface @container flex h-full flex-col"
158
+ data-stock-thread=""
159
+ style={{
160
+ ["--thread-max-width" as string]: "44rem",
161
+ ["--composer-bg" as string]: "var(--card, var(--surface))",
162
+ ["--composer-radius" as string]: "1.5rem",
163
+ ["--composer-padding" as string]: "8px",
164
+ }}
165
+ >
166
+ <ThreadPrimitive.Viewport
167
+ turnAnchor="top"
168
+ data-slot="aui_thread-viewport"
169
+ className="relative flex flex-1 flex-col overflow-x-auto overflow-y-scroll scroll-smooth"
170
+ >
171
+ <div
172
+ className={cn(
173
+ "mx-auto flex w-full max-w-(--thread-max-width) flex-1 flex-col px-4 pt-4",
174
+ isEmpty && "justify-center",
175
+ )}
176
+ >
177
+ <AuiIf condition={isNewChatView}>
178
+ <Welcome />
179
+ </AuiIf>
180
+ <AuiIf condition={isHistoryLoadingView}>
181
+ <ThreadHistorySkeleton />
182
+ </AuiIf>
183
+
184
+ <div
185
+ data-slot="aui_message-group"
186
+ className="mb-14 flex flex-col gap-y-6 empty:hidden"
187
+ >
188
+ <ThreadPrimitive.Messages>
189
+ {() => <ThreadMessage />}
190
+ </ThreadPrimitive.Messages>
191
+ </div>
192
+
193
+ <ThreadPrimitive.ViewportFooter
194
+ className={cn(
195
+ "aui-thread-viewport-footer bg-surface flex flex-col gap-4 overflow-visible pb-2 md:pb-3",
196
+ !isEmpty &&
197
+ "sticky bottom-0 mt-auto rounded-t-(--composer-radius)",
198
+ )}
199
+ >
200
+ <ThreadScrollToBottom />
201
+ <ThreadFollowupSuggestions />
202
+ <Composer autoFocus={autoFocus} />
203
+ <Footer />
204
+ <AuiIf condition={(s) => isNewChatView(s) && s.composer.isEmpty}>
205
+ <ThreadSuggestions />
206
+ </AuiIf>
207
+ </ThreadPrimitive.ViewportFooter>
208
+ {isEmpty && (
209
+ <div className="pointer-events-none absolute inset-x-0 bottom-0 px-4 pb-2">
210
+ <SkinCredit />
211
+ </div>
212
+ )}
213
+ </div>
214
+ </ThreadPrimitive.Viewport>
215
+ </ThreadPrimitive.Root>
216
+ );
217
+ };
218
+
219
+ const ThreadMessage: FC = () => {
220
+ const { AssistantMessage: AssistantMessageComponent = AssistantMessage } =
221
+ useContext(ThreadComponentsContext);
222
+ const role = useAuiState((s) => s.message.role);
223
+ const isEditing = useAuiState((s) => s.message.composer.isEditing);
224
+
225
+ if (isEditing) return <EditComposer />;
226
+ if (role === "user") return <UserMessage />;
227
+ return <AssistantMessageComponent />;
228
+ };
229
+
230
+ const ThreadScrollToBottom: FC = () => {
231
+ return (
232
+ <ThreadPrimitive.ScrollToBottom asChild>
233
+ <TooltipIconButton
234
+ tooltip="Scroll to bottom"
235
+ variant="outline"
236
+ className="aui-thread-scroll-to-bottom border-hair bg-surface hover:bg-surface-2 absolute -top-12 z-10 self-center rounded-full p-4 disabled:invisible"
237
+ >
238
+ <ArrowDownIcon />
239
+ </TooltipIconButton>
240
+ </ThreadPrimitive.ScrollToBottom>
241
+ );
242
+ };
243
+
244
+
245
+ // Branding footer: "powered by digichat" in normal flow below the composer
246
+ // once messages exist. Empty threads get the same line pinned to the page
247
+ // bottom (see the absolute block after ViewportFooter). Hosts can still
248
+ // override the whole Footer slot.
249
+ const ThreadFooter: FC = () => (
250
+ <AuiIf condition={(s) => !s.thread.isEmpty}>
251
+ <SkinCredit />
252
+ </AuiIf>
253
+ );
254
+
255
+ const ThreadWelcome: FC = () => {
256
+ return (
257
+ <div className="aui-thread-welcome-root mb-6 flex flex-col items-center gap-2 px-4 text-center">
258
+ <h1 className="aui-thread-welcome-message-inner fade-in slide-in-from-bottom-1 animate-in fill-mode-both text-2xl font-medium duration-(--dur-arrive)">
259
+ Ask the stack.
260
+ </h1>
261
+ <p className="aui-thread-welcome-copy fade-in animate-in fill-mode-both text-sm text-ink-mute duration-(--dur-arrive)">
262
+ It reads the configured docs, then answers.
263
+ </p>
264
+ </div>
265
+ );
266
+ };
267
+
268
+ const ThreadSuggestions: FC = () => {
269
+ // Keyed by the cycle's group offset so a new group remounts and re-runs the
270
+ // chips' entrance fade; hover/focus handlers hold the cycle while it is read.
271
+ const { groupKey, handlers } = useSuggestionGroup();
272
+ return (
273
+ <div
274
+ key={groupKey}
275
+ className="aui-thread-welcome-suggestions flex w-full flex-wrap items-center justify-center gap-2 px-4"
276
+ {...handlers}
277
+ >
278
+ <ThreadPrimitive.Suggestions>
279
+ {() => <ThreadSuggestionItem />}
280
+ </ThreadPrimitive.Suggestions>
281
+ </div>
282
+ );
283
+ };
284
+
285
+ const ThreadSuggestionItem: FC = () => {
286
+ return (
287
+ <div className="aui-thread-welcome-suggestion-display fade-in slide-in-from-bottom-2 animate-in fill-mode-both duration-(--duration-hover)">
288
+ <SuggestionPrimitive.Trigger send asChild>
289
+ <Button
290
+ variant="ghost"
291
+ className="aui-thread-welcome-suggestion text-ink hover:bg-surface-2 border-hair h-auto gap-1.5 rounded-md border px-3.5 py-1.5 text-sm font-normal whitespace-nowrap transition-colors"
292
+ >
293
+ <SuggestionPrimitive.Title className="aui-thread-welcome-suggestion-text-1" />
294
+ <SuggestionPrimitive.Description className="aui-thread-welcome-suggestion-text-2 empty:hidden" />
295
+ </Button>
296
+ </SuggestionPrimitive.Trigger>
297
+ </div>
298
+ );
299
+ };
300
+
301
+ const Composer: FC<{ autoFocus: boolean }> = ({ autoFocus }) => {
302
+ // Embed free-tier / BYOK hold: StockSendGateProvider supplies onSubmit that
303
+ // preventDefaults before composer.send() so POST /api/chat never fires.
304
+ const gateSubmit = useStockComposerGateSubmit();
305
+ return (
306
+ <ComposerPrimitive.Root
307
+ className="aui-composer-root relative flex w-full flex-col"
308
+ onSubmit={gateSubmit}
309
+ >
310
+ <ComposerPrimitive.AttachmentDropzone asChild>
311
+ <div
312
+ data-slot="aui_composer-shell"
313
+ className="border-hair data-[dragging=true]:border-accent focus-within:border-hair-2 flex w-full cursor-text flex-col gap-2 rounded-(--composer-radius) border bg-(--composer-bg) p-(--composer-padding) transition-[border-color] duration-(--dur-tap) data-[dragging=true]:border-dashed data-[dragging=true]:bg-[color-mix(in_oklab,var(--accent)_50%,var(--bg))]"
314
+ >
315
+ <ComposerAttachments />
316
+ <ComposerPrimitive.Input
317
+ placeholder="Send a message..."
318
+ className="aui-composer-input caret-primary placeholder:text-ink-mute max-h-48 min-h-10 w-full resize-none bg-transparent px-2.5 py-1 text-base leading-6 outline-none"
319
+ rows={1}
320
+ autoFocus={autoFocus}
321
+ enterKeyHint="send"
322
+ aria-label="Message input"
323
+ />
324
+ <ComposerAction />
325
+ </div>
326
+ </ComposerPrimitive.AttachmentDropzone>
327
+ </ComposerPrimitive.Root>
328
+ );
329
+ };
330
+
331
+ const ComposerAction: FC = () => {
332
+ return (
333
+ <div className="aui-composer-action-wrapper relative flex items-center justify-between">
334
+ <ComposerAddAttachment />
335
+ <div className="flex items-center gap-1.5">
336
+ <AuiIf condition={(s) => s.thread.capabilities.dictation}>
337
+ <AuiIf condition={(s) => s.composer.dictation == null}>
338
+ <ComposerPrimitive.Dictate asChild>
339
+ <TooltipIconButton
340
+ tooltip="Voice input"
341
+ side="bottom"
342
+ type="button"
343
+ variant="ghost"
344
+ size="icon"
345
+ className="aui-composer-dictate text-ink-mute hover:text-ink size-7 rounded-full"
346
+ aria-label="Start voice input"
347
+ >
348
+ <MicIcon className="aui-composer-dictate-icon size-4" />
349
+ </TooltipIconButton>
350
+ </ComposerPrimitive.Dictate>
351
+ </AuiIf>
352
+ <AuiIf condition={(s) => s.composer.dictation != null}>
353
+ <ComposerPrimitive.StopDictation asChild>
354
+ <TooltipIconButton
355
+ tooltip="Stop dictation"
356
+ side="bottom"
357
+ type="button"
358
+ variant="ghost"
359
+ size="icon"
360
+ className="aui-composer-stop-dictation text-danger size-7 rounded-full"
361
+ aria-label="Stop voice input"
362
+ >
363
+ <SquareIcon className="aui-composer-stop-dictation-icon size-3.5 animate-pulse fill-current" />
364
+ </TooltipIconButton>
365
+ </ComposerPrimitive.StopDictation>
366
+ </AuiIf>
367
+ </AuiIf>
368
+ <AuiIf condition={(s) => !s.thread.isRunning}>
369
+ <ComposerPrimitive.Send asChild>
370
+ <TooltipIconButton
371
+ tooltip="Send message"
372
+ side="bottom"
373
+ type="button"
374
+ variant="default"
375
+ size="icon"
376
+ className="aui-composer-send size-7 rounded-full"
377
+ aria-label="Send message"
378
+ >
379
+ <ArrowUpIcon className="aui-composer-send-icon size-4" />
380
+ </TooltipIconButton>
381
+ </ComposerPrimitive.Send>
382
+ </AuiIf>
383
+ <AuiIf condition={(s) => s.thread.isRunning}>
384
+ <ComposerPrimitive.Cancel asChild>
385
+ <Button
386
+ type="button"
387
+ variant="default"
388
+ size="icon"
389
+ className="aui-composer-cancel size-7 rounded-full"
390
+ aria-label="Stop generating"
391
+ >
392
+ <SquareIcon className="aui-composer-cancel-icon size-3.5 fill-current" />
393
+ </Button>
394
+ </ComposerPrimitive.Cancel>
395
+ </AuiIf>
396
+ </div>
397
+ </div>
398
+ );
399
+ };
400
+
401
+ const AssistantMessage: FC = () => {
402
+ const {
403
+ ToolFallback: ToolFallbackComponent,
404
+ ToolGroup,
405
+ ReasoningGroup,
406
+ } = useContext(ThreadComponentsContext);
407
+ const hasContent = useAuiState((s) => messageHasContent(s.message.parts));
408
+
409
+ const ACTION_BAR_PT = "pt-1.5";
410
+ // Keep the action bar inside the contained root's paint box, then cancel its reserved space in flow.
411
+ const ACTION_BAR_HEIGHT = `min-h-7.5 ${ACTION_BAR_PT}`;
412
+
413
+ return (
414
+ <MessagePrimitive.Root
415
+ data-slot="aui_assistant-message-root"
416
+ data-role="assistant"
417
+ className="fade-in slide-in-from-bottom-1 animate-in relative -mb-7.5 pb-7.5 duration-(--dur-fast)"
418
+ >
419
+ <div
420
+ data-slot="aui_assistant-message-content"
421
+ className="text-ink px-2 leading-relaxed wrap-break-word"
422
+ >
423
+ {/* The base skin's trace (work chain, reasoning box, tool group and
424
+ assistant-ui's tool cards), shared so the stock thread traces the
425
+ same way; text, files and the indicator stay the stock look. */}
426
+ <AssistantTrace
427
+ ToolFallback={ToolFallbackComponent}
428
+ ToolGroup={ToolGroup}
429
+ ReasoningGroup={ReasoningGroup}
430
+ renderPart={({ part }) => {
431
+ switch (part.type) {
432
+ case "text":
433
+ return <MarkdownText />;
434
+ case "data":
435
+ return part.dataRendererUI;
436
+ case "file":
437
+ return (
438
+ <div data-slot="aui_assistant-message-file" className="py-1">
439
+ <File {...part} />
440
+ </div>
441
+ );
442
+ case "image":
443
+ return (
444
+ <div data-slot="aui_assistant-message-image" className="py-1">
445
+ <Image {...part} />
446
+ </div>
447
+ );
448
+ case "indicator":
449
+ // One loading affordance per turn: once anything real has
450
+ // arrived the work chain takes over.
451
+ return hasContent ? null : (
452
+ <span
453
+ data-slot="aui_assistant-message-indicator"
454
+ role="status"
455
+ className="inline-flex items-center"
456
+ >
457
+ <DotMatrix state="loading" decorative className="size-4" />
458
+ <span className="sr-only">Assistant is working</span>
459
+ </span>
460
+ );
461
+ default:
462
+ return null;
463
+ }
464
+ }}
465
+ />
466
+ <MessageError />
467
+ </div>
468
+
469
+ <div
470
+ data-slot="aui_assistant-message-footer"
471
+ className={cn("ms-2 flex items-center", ACTION_BAR_HEIGHT)}
472
+ >
473
+ <BranchPicker />
474
+ <AssistantActionBar />
475
+ </div>
476
+ </MessagePrimitive.Root>
477
+ );
478
+ };
479
+
480
+ const AssistantActionBar: FC = () => {
481
+ return (
482
+ <ActionBarPrimitive.Root
483
+ hideWhenRunning
484
+ autohide="not-last"
485
+ className="aui-assistant-action-bar-root text-ink-mute animate-in fade-in col-start-3 row-start-2 -ms-1 flex gap-1 duration-(--duration-hover)"
486
+ >
487
+ <ActionBarPrimitive.Copy asChild>
488
+ <TooltipIconButton tooltip="Copy">
489
+ <AuiIf condition={(s) => s.message.isCopied}>
490
+ <CheckIcon className="animate-in zoom-in-50 fade-in duration-(--duration-hover) ease-out" />
491
+ </AuiIf>
492
+ <AuiIf condition={(s) => !s.message.isCopied}>
493
+ <CopyIcon className="animate-in zoom-in-75 fade-in duration-(--dur-fast)" />
494
+ </AuiIf>
495
+ </TooltipIconButton>
496
+ </ActionBarPrimitive.Copy>
497
+ <ActionBarPrimitive.Reload asChild>
498
+ <TooltipIconButton tooltip="Refresh">
499
+ <RefreshCwIcon />
500
+ </TooltipIconButton>
501
+ </ActionBarPrimitive.Reload>
502
+ <MessageExportMenu
503
+ trigger={
504
+ <TooltipIconButton tooltip="More" className="data-[state=open]:bg-surface-2">
505
+ <MoreHorizontalIcon />
506
+ </TooltipIconButton>
507
+ }
508
+ icon={<DownloadIcon className="size-4" />}
509
+ contentClassName="aui-action-bar-more-content border-hair bg-surface-2 text-ink data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 data-[state=open]:animate-in data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=closed]:animate-out data-[side=bottom]:slide-in-from-top-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 z-50 min-w-[8rem] overflow-hidden rounded-xl border p-1.5"
510
+ itemClassName="aui-action-bar-more-item hover:bg-surface-2 hover:text-ink focus:bg-surface-2 focus:text-ink data-[state=open]:text-ink flex cursor-pointer items-center gap-2 rounded-lg px-2.5 py-1.5 text-sm outline-none select-none"
511
+ />
512
+ </ActionBarPrimitive.Root>
513
+ );
514
+ };
515
+
516
+ const UserFilePart: FileMessagePartComponent = (part) => (
517
+ <div data-slot="aui_user-message-file" className="py-1">
518
+ <File {...part} />
519
+ </div>
520
+ );
521
+
522
+ const UserImagePart: ImageMessagePartComponent = (part) => (
523
+ <div data-slot="aui_user-message-image" className="py-1">
524
+ <Image {...part} />
525
+ </div>
526
+ );
527
+
528
+ const UserMessage: FC = () => {
529
+ const { userAlign } = useDeployUi();
530
+ const alignEnd = userAlign === "right";
531
+ return (
532
+ <MessagePrimitive.Root
533
+ data-slot="aui_user-message-root"
534
+ data-user-align={userAlign}
535
+ className={cn(
536
+ "fade-in slide-in-from-bottom-1 animate-in grid auto-rows-auto content-start gap-y-2 px-2 duration-(--dur-fast)",
537
+ alignEnd
538
+ ? "grid-cols-[minmax(72px,1fr)_auto] [&:where(>*)]:col-start-2"
539
+ : "grid-cols-[auto_minmax(72px,1fr)] [&:where(>*)]:col-start-1",
540
+ )}
541
+ data-role="user"
542
+ >
543
+ <UserMessageAttachments />
544
+
545
+ <div
546
+ className={cn(
547
+ "aui-user-message-content-wrapper relative min-w-0",
548
+ alignEnd ? "col-start-2" : "col-start-1",
549
+ )}
550
+ >
551
+ <div className="aui-user-message-content peer bg-surface-2 text-ink rounded-(--composer-radius) px-4 py-2 wrap-break-word empty:hidden">
552
+ <MessagePrimitive.Parts
553
+ components={{ File: UserFilePart, Image: UserImagePart }}
554
+ />
555
+ </div>
556
+ <div className="aui-user-action-bar-wrapper absolute start-0 top-1/2 -translate-x-full -translate-y-1/2 pe-2 peer-empty:hidden rtl:translate-x-full">
557
+ <UserActionBar />
558
+ </div>
559
+ </div>
560
+
561
+ <BranchPicker
562
+ data-slot="aui_user-branch-picker"
563
+ className="col-span-full col-start-1 row-start-3 -me-1 justify-end"
564
+ />
565
+ </MessagePrimitive.Root>
566
+ );
567
+ };
568
+
569
+ const UserActionBar: FC = () => {
570
+ return (
571
+ <ActionBarPrimitive.Root
572
+ hideWhenRunning
573
+ autohide="not-last"
574
+ className="aui-user-action-bar-root flex flex-col items-end"
575
+ >
576
+ <ActionBarPrimitive.Edit asChild>
577
+ <TooltipIconButton tooltip="Edit" className="aui-user-action-edit">
578
+ <PencilIcon />
579
+ </TooltipIconButton>
580
+ </ActionBarPrimitive.Edit>
581
+ </ActionBarPrimitive.Root>
582
+ );
583
+ };
584
+
585
+ const EditComposer: FC = () => {
586
+ return (
587
+ <MessagePrimitive.Root
588
+ data-slot="aui_edit-composer-wrapper"
589
+ className="flex flex-col px-2 [contain-intrinsic-size:auto_200px] [content-visibility:auto]"
590
+ >
591
+ <ComposerPrimitive.Root className="aui-edit-composer-root border-hair ms-auto flex w-full max-w-[85%] cursor-text flex-col rounded-(--composer-radius) border bg-(--composer-bg)">
592
+ <ComposerPrimitive.Input
593
+ className="aui-edit-composer-input text-ink min-h-14 w-full resize-none bg-transparent px-4 pt-3 pb-1 text-base outline-none"
594
+ autoFocus
595
+ />
596
+ <div className="aui-edit-composer-footer mx-2.5 mb-2.5 flex items-center gap-1.5 self-end">
597
+ <ComposerPrimitive.Cancel asChild>
598
+ <Button
599
+ variant="ghost"
600
+ size="sm"
601
+ className="h-8 px-3.5"
602
+ >
603
+ Cancel
604
+ </Button>
605
+ </ComposerPrimitive.Cancel>
606
+ <ComposerPrimitive.Send asChild>
607
+ <Button size="sm" className="h-8 px-3.5">
608
+ Update
609
+ </Button>
610
+ </ComposerPrimitive.Send>
611
+ </div>
612
+ </ComposerPrimitive.Root>
613
+ </MessagePrimitive.Root>
614
+ );
615
+ };
616
+
617
+ const BranchPicker: FC<BranchPickerPrimitive.Root.Props> = ({
618
+ className,
619
+ ...rest
620
+ }) => {
621
+ return (
622
+ <BranchPickerPrimitive.Root
623
+ hideWhenSingleBranch
624
+ className={cn(
625
+ "aui-branch-picker-root text-ink-mute -ms-2 me-2 inline-flex items-center text-xs",
626
+ className,
627
+ )}
628
+ {...rest}
629
+ >
630
+ <BranchPickerPrimitive.Previous asChild>
631
+ <TooltipIconButton tooltip="Previous">
632
+ <ChevronLeftIcon />
633
+ </TooltipIconButton>
634
+ </BranchPickerPrimitive.Previous>
635
+ <span className="aui-branch-picker-state font-medium">
636
+ <BranchPickerPrimitive.Number /> / <BranchPickerPrimitive.Count />
637
+ </span>
638
+ <BranchPickerPrimitive.Next asChild>
639
+ <TooltipIconButton tooltip="Next">
640
+ <ChevronRightIcon />
641
+ </TooltipIconButton>
642
+ </BranchPickerPrimitive.Next>
643
+ </BranchPickerPrimitive.Root>
644
+ );
645
+ };
@@ -0,0 +1,6 @@
1
+ /** Raw backend tool ids for tool-row titles (one-to-one with the backend). */
2
+
3
+ export function toolRowTitle(toolName: string): string {
4
+ const name = toolName.trim();
5
+ return name || "tool";
6
+ }