@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,243 @@
1
+ "use client";
2
+
3
+ import { useAuiState } from "@assistant-ui/react";
4
+
5
+ import {
6
+ CONTEXT_BAR_CELLS,
7
+ computeContextShares,
8
+ } from "./digichat-context-meter-shares";
9
+ import { meterTone } from "./digichat-meter-tone";
10
+
11
+ /**
12
+ * Context used, as the segmented digichat cube bar. The bar is the same
13
+ * one that used to sit inside the breakdown card: its lit span is the
14
+ * fraction of the model's window the last turn sent, coloured by
15
+ * system/tools/user. Hovering (or focusing) the bar opens the legend.
16
+ *
17
+ * The provider reports only the prompt total (inputTokens). The system /
18
+ * tools / user split is therefore an estimate: user text is counted from the
19
+ * thread, tool schemas get a flat per-tool allowance, and the remainder is
20
+ * the system prompt. Values carry a `~` so the card never implies precision
21
+ * the backend does not send.
22
+ *
23
+ * The split itself lives in `digichat-context-meter-shares.ts`: the three
24
+ * quantities are a partition of the reported total, so no share can print
25
+ * above 100 and the three always describe the same turn.
26
+ */
27
+
28
+ export const CONTEXT_WINDOWS: Record<string, number> = {
29
+ "deepseek/deepseek-v4.1-flash-1017": 1_048_576,
30
+ "deepseek/deepseek-v4.1-flash": 1_048_576,
31
+ "openai/gpt-oss-120b": 128_000,
32
+ "openai/gpt-6-luna": 1_050_000,
33
+ "google/gemini-3.5-flash-lite": 1_000_000,
34
+ "z-ai/glm-5.3-flash": 1_048_576,
35
+ "z-ai/glm-5.3": 1_000_000,
36
+ "qwen/qwen3.8-flash": 1_000_000,
37
+ "qwen/qwen3.8-27b": 262_144,
38
+ "google/gemma-4-31b-it": 262_144,
39
+ "google/gemini-3.8-flash": 1_048_576,
40
+ "xiaomi/mimo-v2.6-flash": 1_048_576,
41
+ "xiaomi/mimo-v2.6-pro": 1_048_576,
42
+ "minimax/minimax-m3": 200_000,
43
+ "z-ai/glm-4.7-flash": 200_000,
44
+ // models.dev context_window for gpt-5.6-terra (bare Foundry id and the openai/ slug).
45
+ "gpt-5.6-terra": 1_050_000,
46
+ "openai/gpt-5.6-terra": 1_050_000,
47
+ // The OpenAI models an Azure AI Foundry agent is usually deployed on. A
48
+ // deployment whose id is not listed here gets no bar at all (see the
49
+ // unknown-window rule below).
50
+ "gpt-4o": 128_000,
51
+ "gpt-4o-mini": 128_000,
52
+ "gpt-4.1": 1_047_576,
53
+ "gpt-4.1-mini": 1_047_576,
54
+ "gpt-4.1-nano": 1_047_576,
55
+ "o3": 200_000,
56
+ "o3-mini": 200_000,
57
+ "o4-mini": 200_000,
58
+ };
59
+
60
+ /**
61
+ * Tokens for a model id that has its own window. A built-in key such as
62
+ * `constructor` is not one.
63
+ */
64
+ export function contextWindowFor(modelId: string): number | undefined {
65
+ const id = modelId.trim();
66
+ if (!id || !Object.hasOwn(CONTEXT_WINDOWS, id)) return undefined;
67
+ return CONTEXT_WINDOWS[id];
68
+ }
69
+
70
+ const format = (n: number): string =>
71
+ n >= 1_000_000
72
+ ? `${(n / 1_000_000).toFixed(1)}m`
73
+ : n >= 1000
74
+ ? `${(n / 1000).toFixed(1)}k`
75
+ : String(n);
76
+
77
+ const textOf = (message: unknown): string => {
78
+ const parts = (message as { content?: unknown; parts?: unknown })?.parts;
79
+ if (Array.isArray(parts)) {
80
+ return parts
81
+ .filter(
82
+ (part): part is { type: string; text: string } =>
83
+ typeof part === "object" &&
84
+ part !== null &&
85
+ (part as { type?: unknown }).type === "text" &&
86
+ typeof (part as { text?: unknown }).text === "string",
87
+ )
88
+ .map((part) => part.text)
89
+ .join("");
90
+ }
91
+ const content = (message as { content?: unknown })?.content;
92
+ return typeof content === "string" ? content : "";
93
+ };
94
+
95
+ export function DigichatContextMeter({
96
+ model,
97
+ toolCount = 0,
98
+ }: {
99
+ model: string;
100
+ /** Connected MCP + catalog tool count, used for the schema estimate. */
101
+ toolCount?: number;
102
+ }) {
103
+ // Select primitives, never a fresh object: useAuiState compares with
104
+ // Object.is, and a new `{input, userChars}` every render loops forever.
105
+ const reportedInput = useAuiState((s) => {
106
+ const messages = s.thread.messages;
107
+ for (let index = messages.length - 1; index >= 0; index -= 1) {
108
+ const custom = (
109
+ messages[index]?.metadata as {
110
+ custom?: { usage?: { inputTokens?: unknown } };
111
+ }
112
+ )?.custom;
113
+ if (typeof custom?.usage?.inputTokens === "number") {
114
+ return custom.usage.inputTokens;
115
+ }
116
+ }
117
+ return undefined;
118
+ });
119
+ // The model the backend says it served the turn with. A tenant whose
120
+ // session model is empty (a Foundry agent) is named here instead.
121
+ const reportedModel = useAuiState((s) => {
122
+ const messages = s.thread.messages;
123
+ for (let index = messages.length - 1; index >= 0; index -= 1) {
124
+ const custom = (
125
+ messages[index]?.metadata as {
126
+ custom?: { usage?: { inputTokens?: unknown }; model?: unknown };
127
+ }
128
+ )?.custom;
129
+ if (
130
+ typeof custom?.usage?.inputTokens === "number" &&
131
+ typeof custom.model === "string"
132
+ ) {
133
+ return custom.model;
134
+ }
135
+ }
136
+ return undefined;
137
+ });
138
+ const userChars = useAuiState((s) => {
139
+ let total = 0;
140
+ for (const message of s.thread.messages) {
141
+ if ((message as { role?: string }).role === "user") {
142
+ total += textOf(message).length;
143
+ }
144
+ }
145
+ return total;
146
+ });
147
+
148
+ // A report with its own window is the model that served the turn.
149
+ // A report with no window leaves the session model, so OCC keeps the
150
+ // bar. The house session is empty until digigraph reports an id.
151
+ const reported = reportedModel?.trim() || "";
152
+ const session = model.trim();
153
+ const activeModel =
154
+ reported && contextWindowFor(reported) !== undefined ? reported : session;
155
+ const window = contextWindowFor(activeModel);
156
+ // No bar without a known window: the fill is a fraction of it.
157
+ if (window === undefined) return null;
158
+
159
+ // No fabricated fill: until a turn reports usage the grid stays empty.
160
+ const input = reportedInput ?? 0;
161
+ const label = `${format(input)} / ${format(window)} tokens`;
162
+ // The same amber/orange/red scale the usage meter uses: a full context is
163
+ // as much a limit as a spent turn budget. The tone tints the bar only; the
164
+ // legend keeps the system/tools/user colours that explain the split.
165
+ const tone = meterTone(window > 0 ? input / window : 0);
166
+
167
+ // The three shares are a partition of the reported total, so no share
168
+ // can print above 100 and the printed numbers describe the same turn.
169
+ const {
170
+ systemTokens,
171
+ toolTokens,
172
+ userTokens,
173
+ systemPct: sysPct,
174
+ toolPct: toolPct,
175
+ userPct: userPct,
176
+ systemCells: sysCells,
177
+ toolCells: toolCells,
178
+ userCells: userCells,
179
+ } = computeContextShares({ input, userChars, toolCount, window });
180
+
181
+ return (
182
+ <span className={`aui-context-meter-wrap ${tone}`.trim()}>
183
+ <span
184
+ className="aui-context-meter"
185
+ role="img"
186
+ tabIndex={0}
187
+ aria-label={`Context ${label}`}
188
+ >
189
+ {Array.from({ length: CONTEXT_BAR_CELLS }, (_, index) => {
190
+ const tone =
191
+ index < sysCells
192
+ ? "is-system"
193
+ : index < sysCells + toolCells
194
+ ? "is-tools"
195
+ : index < sysCells + toolCells + userCells
196
+ ? "is-user"
197
+ : "";
198
+ return (
199
+ <span
200
+ key={index}
201
+ className={tone ? `aui-context-bar-cell ${tone}` : "aui-context-bar-cell"}
202
+ />
203
+ );
204
+ })}
205
+ </span>
206
+ <span className="aui-context-card" role="tooltip">
207
+ <span className="aui-context-card-row aui-context-card-total">
208
+ <span>Context</span>
209
+ <span>
210
+ {format(input)} / {format(window)}
211
+ </span>
212
+ </span>
213
+ <span className="aui-context-card-row">
214
+ <span className="aui-context-legend">
215
+ <span className="aui-context-swatch is-system" aria-hidden />
216
+ System
217
+ </span>
218
+ <span>
219
+ ~{format(systemTokens)} · {sysPct}%
220
+ </span>
221
+ </span>
222
+ <span className="aui-context-card-row">
223
+ <span className="aui-context-legend">
224
+ <span className="aui-context-swatch is-tools" aria-hidden />
225
+ Tools
226
+ </span>
227
+ <span>
228
+ ~{format(toolTokens)} · {toolPct}%
229
+ </span>
230
+ </span>
231
+ <span className="aui-context-card-row">
232
+ <span className="aui-context-legend">
233
+ <span className="aui-context-swatch is-user" aria-hidden />
234
+ User
235
+ </span>
236
+ <span>
237
+ ~{format(userTokens)} · {userPct}%
238
+ </span>
239
+ </span>
240
+ </span>
241
+ </span>
242
+ );
243
+ }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Fill thresholds shared by the usage meter and the context meter.
3
+ *
4
+ * One scale for both bars: amber once more than half is spent, orange past
5
+ * four fifths, red past nine tenths. The colours themselves live in
6
+ * `chat-digichat.css` (`--warn` / `--danger`, mixed for the middle band), so
7
+ * a theme restyle never has to touch this module.
8
+ */
9
+ export const METER_WARN_AT = 0.6;
10
+ export const METER_HOT_AT = 0.8;
11
+ export const METER_CRITICAL_AT = 0.9;
12
+
13
+ export type MeterTone = "" | "is-warn" | "is-hot" | "is-critical";
14
+
15
+ /**
16
+ * The tone class for a fill ratio. Zero and anything non-finite stay
17
+ * untoned: an empty bar is not "nearly full", and a bar with no denominator
18
+ * must not borrow a warning colour.
19
+ */
20
+ export function meterTone(ratio: number): MeterTone {
21
+ if (!Number.isFinite(ratio) || ratio <= 0) return "";
22
+ if (ratio >= METER_CRITICAL_AT) return "is-critical";
23
+ if (ratio >= METER_HOT_AT) return "is-hot";
24
+ if (ratio >= METER_WARN_AT) return "is-warn";
25
+ return "";
26
+ }
@@ -0,0 +1,103 @@
1
+ "use client";
2
+
3
+ import { CONTEXT_BAR_CELLS } from "./digichat-context-meter-shares";
4
+ import { meterTone } from "./digichat-meter-tone";
5
+
6
+ export type UsageMeterValue = {
7
+ /** Turns the visitor has spent. */
8
+ used: number;
9
+ /** Turns the gate currently allows: the free budget, or the unlocked one. */
10
+ limit: number;
11
+ };
12
+
13
+ /**
14
+ * The trial gate's turn budget as the segmented digichat cube bar.
15
+ *
16
+ * The bar sits in the composer toolbar where the context meter would be. It
17
+ * is a gate number, not a token estimate: a tenant whose backend reports no
18
+ * usage (a Foundry agent) still has a budget to show, and one that does
19
+ * report usage still has turns that matter more than tokens.
20
+ *
21
+ * Shape: a small budget (the three free turns) gets one cell per turn, so
22
+ * each turn is visible as a cell. A large one (the unlocked hundred) fills
23
+ * the same 25-cell grid the context bar uses, proportionally. Both occupy the
24
+ * same toolbar slot, so unlocking does not move the row.
25
+ *
26
+ * The fill is deliberately the used fraction: the bar starts empty and grows
27
+ * as turns are spent, the way the context bar grows. Unlocking resets the
28
+ * fraction because the denominator changes, which is the point of the
29
+ * unlock, not a regression.
30
+ */
31
+ export function usageBarShape(
32
+ used: number,
33
+ limit: number,
34
+ ): { cells: number; lit: number } {
35
+ // A non-finite count has no place on the bar; treat it as unspent rather
36
+ // than letting NaN reach the aria-label or the cell count.
37
+ const finite = (value: number): number =>
38
+ Number.isFinite(value) ? value : 0;
39
+ const safeLimit = Math.max(0, Math.floor(finite(limit)));
40
+ const safeUsed = Math.max(0, Math.min(safeLimit, Math.floor(finite(used))));
41
+ if (safeLimit === 0) return { cells: 0, lit: 0 };
42
+ if (safeLimit <= CONTEXT_BAR_CELLS) {
43
+ return { cells: safeLimit, lit: safeUsed };
44
+ }
45
+ // Never zero-lit while a turn has been spent: a proportional fill that
46
+ // rounds to nothing would read as "no turns used". Never full until the
47
+ // budget is: at 99/100 one cell stays dark, so a full bar always means
48
+ // "no turns left".
49
+ if (safeUsed === 0) return { cells: CONTEXT_BAR_CELLS, lit: 0 };
50
+ if (safeUsed >= safeLimit) {
51
+ return { cells: CONTEXT_BAR_CELLS, lit: CONTEXT_BAR_CELLS };
52
+ }
53
+ const proportional = Math.round((safeUsed / safeLimit) * CONTEXT_BAR_CELLS);
54
+ return {
55
+ cells: CONTEXT_BAR_CELLS,
56
+ lit: Math.max(1, Math.min(CONTEXT_BAR_CELLS - 1, proportional)),
57
+ };
58
+ }
59
+
60
+ export function DigichatUsageMeter({ usage }: { usage: UsageMeterValue }) {
61
+ const { cells, lit } = usageBarShape(usage.used, usage.limit);
62
+ if (cells === 0) return null;
63
+
64
+ const finite = (value: number): number =>
65
+ Number.isFinite(value) ? value : 0;
66
+ const limit = Math.max(0, Math.floor(finite(usage.limit)));
67
+ const used = Math.max(0, Math.min(limit, Math.floor(finite(usage.used))));
68
+ const left = Math.max(0, limit - used);
69
+ const tone = meterTone(limit > 0 ? used / limit : 0);
70
+
71
+ return (
72
+ <span className={`aui-context-meter-wrap aui-usage-meter-wrap ${tone}`.trim()}>
73
+ <span
74
+ className={`aui-context-meter aui-usage-meter ${tone}`.trim()}
75
+ role="img"
76
+ tabIndex={0}
77
+ aria-label={`Turns: ${left} of ${limit} left`}
78
+ data-testid="embed-usage-meter"
79
+ >
80
+ {Array.from({ length: cells }, (_, index) => (
81
+ <span
82
+ key={index}
83
+ className={
84
+ index < lit ? "aui-context-bar-cell is-usage" : "aui-context-bar-cell"
85
+ }
86
+ />
87
+ ))}
88
+ </span>
89
+ <span className="aui-context-card" role="tooltip">
90
+ <span className="aui-context-card-row aui-context-card-total">
91
+ <span>Turns left</span>
92
+ <span>{left}</span>
93
+ </span>
94
+ <span className="aui-context-card-row">
95
+ <span>Used</span>
96
+ <span>
97
+ {used} / {limit}
98
+ </span>
99
+ </span>
100
+ </span>
101
+ </span>
102
+ );
103
+ }
@@ -0,0 +1,144 @@
1
+ "use client";
2
+
3
+ import "../../../styles/chat-core.css";
4
+ import "../../../styles/chat-widgets.css";
5
+ import "../../../styles/chat-aui.css";
6
+ import "../../../styles/chat-digichat.css";
7
+ import "../../../styles/digichat-boot-loader.css";
8
+
9
+ import { useCallback, type FormEvent } from "react";
10
+ import {
11
+ DigichatThread,
12
+ type ComposerLayout,
13
+ } from "../DigichatThread";
14
+
15
+ import {
16
+ useComposerCopy,
17
+ useSkinChrome,
18
+ } from "../stock/skin-chrome";
19
+ import {
20
+ useDeployUi,
21
+ useDisclosureUi,
22
+ } from "../stock/deploy-ui-context";
23
+ import { workVisibilityForView } from "../stock/skin-types";
24
+ import { useStockComposerGateSubmit } from "../stock/stock-send-gate";
25
+ import { useEmbedChatPrefsOptional } from "../stock/embed-chat-prefs";
26
+ import {
27
+ useSkinSlashPalette,
28
+ type DigichatSkinSlash,
29
+ } from "../stock/skin-slash-palette";
30
+ import { DigichatComposerToolbar } from "./digichat-composer-toolbar";
31
+
32
+ // The slash wiring types moved to the skin-agnostic palette module; the
33
+ // re-export keeps `@digithings-ai/ui/chat/skins` imports unchanged.
34
+ export type {
35
+ DigichatSkinSlash,
36
+ SkinPaletteApply,
37
+ SkinPaletteFrame,
38
+ SkinPaletteKind,
39
+ SkinSlashAction,
40
+ SkinSlashAdapterLike,
41
+ SkinSlashCommand,
42
+ SkinSlashExtraDef,
43
+ } from "../stock/skin-slash-palette";
44
+
45
+ export type DigichatSkinCopy = {
46
+ welcome?: string;
47
+ placeholder?: string;
48
+ suggestions?: readonly string[];
49
+ };
50
+
51
+ export type DigichatSkinOptions = {
52
+ /**
53
+ * Explicit override — a deployment can still force compact regardless of
54
+ * chrome mode. Omitted means the expanded composer everywhere.
55
+ */
56
+ composerLayout?: ComposerLayout;
57
+ /** Welcome/placeholder/suggestion copy (host: BASELINE_EMBED_* constants). */
58
+ copy?: DigichatSkinCopy;
59
+ /**
60
+ * Page-context attachment name (host: PAGE_CONTEXT_ATTACHMENT_NAME).
61
+ * Protocol default mirrors the app literal ("page-context.html").
62
+ */
63
+ hiddenAttachmentName?: string;
64
+ /** Product slash wiring; absent = slash/mention adapters stay disabled. */
65
+ slash?: DigichatSkinSlash;
66
+ /**
67
+ * Private session, set per session by the host. Hides reasoning text and
68
+ * tool-call output and shows the mode badge. Display-only: the model still
69
+ * produces the work, and the stores still hold the real text.
70
+ */
71
+ privateMode?: boolean;
72
+ };
73
+
74
+ /**
75
+ * First-party digichat Thread. Explicit ThreadSkinView branch — never fall
76
+ * through to product-page-assistant. Always left-aligned regardless of YAML.
77
+ */
78
+ /** Module-scope so it is a stable component reference, not recreated per render. */
79
+
80
+
81
+ export function DigichatSkin({
82
+ composerLayout,
83
+ copy,
84
+ // Protocol default mirrors the app's PAGE_CONTEXT_ATTACHMENT_NAME
85
+ // ("page-context.html"); hosts pass it explicitly.
86
+ hiddenAttachmentName = "page-context.html",
87
+ slash: slashWiring,
88
+ privateMode,
89
+ }: DigichatSkinOptions) {
90
+ const { welcome, welcomeBody, placeholder, suggestions } = useComposerCopy(
91
+ copy?.welcome ?? "",
92
+ copy?.placeholder ?? "",
93
+ );
94
+ const skinChrome = useSkinChrome();
95
+ const { pageContext } = skinChrome;
96
+ const reasoningUi = useDisclosureUi("reasoning");
97
+ const toolCallsUi = useDisclosureUi("toolCalls");
98
+ // The raw view level is what decides how much of the work is shown.
99
+ const deployUi = useDeployUi();
100
+ const workVisibility = workVisibilityForView(deployUi.view);
101
+ const gateSubmit = useStockComposerGateSubmit();
102
+ const prefs = useEmbedChatPrefsOptional();
103
+ // The `/` palette logic is shared with every other skin (SkinPaletteBridge).
104
+ const palette = useSkinSlashPalette({ slash: slashWiring, privateMode });
105
+ const paletteSubmit = palette.handleSubmit;
106
+
107
+ const onComposerSubmit = useCallback(
108
+ (event: FormEvent<HTMLFormElement>) => {
109
+ if (paletteSubmit(event)) return;
110
+ gateSubmit?.(event);
111
+ },
112
+ [paletteSubmit, gateSubmit],
113
+ );
114
+
115
+ return (
116
+ <DigichatThread
117
+ welcome={welcome}
118
+ welcomeBody={welcomeBody}
119
+ suggestions={
120
+ suggestions.length > 0 ? suggestions : (copy?.suggestions ?? [])
121
+ }
122
+ placeholder={placeholder}
123
+ onComposerSubmit={onComposerSubmit}
124
+ composerLayout={composerLayout ?? "expanded"}
125
+ slash={palette.slash}
126
+ mention={palette.mention}
127
+ hiddenAttachmentNames={
128
+ pageContext === "silent" ? [hiddenAttachmentName] : undefined
129
+ }
130
+ reasoningMode={reasoningUi.mode}
131
+ toolCallsMode={toolCallsUi.mode}
132
+ workVisibility={workVisibility}
133
+ privateMode={privateMode}
134
+ composerToolbar={
135
+ prefs && prefs.prefs.toolbar !== false ? (
136
+ <DigichatComposerToolbar prefs={prefs} />
137
+ ) : undefined
138
+ }
139
+ scrollbars={prefs?.prefs.scrollbars ?? "always"}
140
+ scrollMode={prefs?.prefs.scroll}
141
+ density={prefs?.prefs.density ?? "default"}
142
+ />
143
+ );
144
+ }
@@ -0,0 +1,29 @@
1
+ "use client";
2
+
3
+ import { Thread } from "../stock/thread.aui";
4
+ import { useComposerCopy } from "../stock";
5
+
6
+ /**
7
+ * Web facsimile of the official Expo React Native Assistant.
8
+ * The native starter is vendored at
9
+ * `reference/assistant-ui-templates/expo-react-native` and is not imported
10
+ * by Next.js (`react-native` / Expo stay out of the web bundle).
11
+ */
12
+ export function ExpoReactNative() {
13
+ const { title } = useComposerCopy("How can I help you today?", "Send a message...");
14
+ return (
15
+ <div className="flex h-full items-center justify-center bg-zinc-200 p-4">
16
+ <div className="flex h-[min(740px,100%)] w-[min(390px,100%)] flex-col overflow-hidden rounded-[2rem] border border-zinc-300 bg-white shadow-2xl">
17
+ <header className="flex shrink-0 items-center justify-between border-b border-zinc-200 px-4 py-3">
18
+ <div className="text-sm font-semibold tracking-tight">
19
+ {title || "assistant-ui"}
20
+ </div>
21
+ <div className="text-xs text-zinc-500">Expo</div>
22
+ </header>
23
+ <div className="min-h-0 flex-1 bg-white">
24
+ <Thread />
25
+ </div>
26
+ </div>
27
+ </div>
28
+ );
29
+ }