@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,244 @@
1
+ "use client";
2
+
3
+ import {
4
+ memo,
5
+ useCallback,
6
+ useRef,
7
+ useState,
8
+ type FC,
9
+ type PropsWithChildren,
10
+ } from "react";
11
+ import { DisclosureChevron } from "../disclosure-chevron";
12
+ import { DotMatrix } from "../DotMatrix";
13
+ import { cva, type VariantProps } from "class-variance-authority";
14
+ import { useScrollLock } from "@assistant-ui/react";
15
+ import {
16
+ Collapsible,
17
+ CollapsibleContent,
18
+ CollapsibleTrigger,
19
+ } from "./ui/collapsible";
20
+ import { cn } from "../../../lib/utils";
21
+ import { useExportKeepMounted } from "../../../replay/export-mount";
22
+ import { useTraceT } from "../trace-i18n";
23
+ import { stockRadius, useStockShape } from "./stock-shape";
24
+
25
+ const ANIMATION_DURATION = 200;
26
+
27
+ const toolGroupVariants = cva("aui-tool-group-root group/tool-group w-full", {
28
+ variants: {
29
+ variant: {
30
+ outline: "border py-3",
31
+ ghost: "",
32
+ muted: "border-hair-2 bg-surface-2/30 border py-3",
33
+ },
34
+ },
35
+ defaultVariants: { variant: "outline" },
36
+ });
37
+
38
+ export type ToolGroupRootProps = Omit<
39
+ React.ComponentProps<typeof Collapsible>,
40
+ "open" | "onOpenChange"
41
+ > &
42
+ VariantProps<typeof toolGroupVariants> & {
43
+ open?: boolean;
44
+ onOpenChange?: (open: boolean) => void;
45
+ defaultOpen?: boolean;
46
+ /** Open while this group is still streaming, auto-close on completion. */
47
+ streamingOpen?: boolean;
48
+ };
49
+
50
+ function ToolGroupRoot({
51
+ className,
52
+ variant,
53
+ open: controlledOpen,
54
+ onOpenChange: controlledOnOpenChange,
55
+ defaultOpen = false,
56
+ streamingOpen = false,
57
+ children,
58
+ ...props
59
+ }: ToolGroupRootProps) {
60
+ const stock = useStockShape();
61
+ const collapsibleRef = useRef<HTMLDivElement>(null);
62
+ const [initialOpen] = useState(defaultOpen);
63
+ const [userOpen, setUserOpen] = useState<boolean | null>(null);
64
+ const lockScroll = useScrollLock(collapsibleRef, ANIMATION_DURATION);
65
+
66
+ const isControlled = controlledOpen !== undefined;
67
+ const isOpen = isControlled
68
+ ? controlledOpen
69
+ : (userOpen ?? (streamingOpen || initialOpen));
70
+
71
+ const handleOpenChange = useCallback(
72
+ (open: boolean) => {
73
+ lockScroll();
74
+ if (!isControlled) {
75
+ setUserOpen(open);
76
+ }
77
+ controlledOnOpenChange?.(open);
78
+ },
79
+ [lockScroll, isControlled, controlledOnOpenChange],
80
+ );
81
+
82
+ return (
83
+ <Collapsible
84
+ ref={collapsibleRef}
85
+ data-slot="tool-group-root"
86
+ data-variant={variant ?? "outline"}
87
+ open={isOpen}
88
+ onOpenChange={handleOpenChange}
89
+ className={cn(
90
+ toolGroupVariants({ variant }),
91
+ // assistant-ui's outline/muted tool group is rounded-lg.
92
+ (variant ?? "outline") !== "ghost" && stockRadius(stock, "rounded-lg"),
93
+ "group/tool-group-root",
94
+ className,
95
+ )}
96
+ style={
97
+ {
98
+ "--animation-duration": `${ANIMATION_DURATION}ms`,
99
+ } as React.CSSProperties
100
+ }
101
+ {...props}
102
+ >
103
+ {children}
104
+ </Collapsible>
105
+ );
106
+ }
107
+
108
+ function ToolGroupTrigger({
109
+ count,
110
+ active = false,
111
+ label,
112
+ className,
113
+ ...props
114
+ }: React.ComponentProps<typeof CollapsibleTrigger> & {
115
+ count: number;
116
+ active?: boolean;
117
+ label?: string;
118
+ }) {
119
+ const tr = useTraceT();
120
+ const text = label ?? tr.plural("toolCalls", count);
121
+
122
+ return (
123
+ <CollapsibleTrigger
124
+ data-slot="tool-group-trigger"
125
+ className={cn(
126
+ "aui-tool-group-trigger group/trigger flex origin-left items-center gap-2 text-sm transition-[color,scale] active:scale-[0.98]",
127
+ "group-data-[variant=ghost]/tool-group-root:text-ink-mute group-data-[variant=ghost]/tool-group-root:hover:text-ink group-data-[variant=ghost]/tool-group-root:py-1.5",
128
+ "group-data-[variant=outline]/tool-group-root:w-full group-data-[variant=outline]/tool-group-root:px-4",
129
+ "group-data-[variant=muted]/tool-group-root:w-full group-data-[variant=muted]/tool-group-root:px-4",
130
+ className,
131
+ )}
132
+ // The group is collapsed while the tools run, so the trigger is the only
133
+ // thing on screen that knows about it. The state is on the control, not
134
+ // in a second copy of its name.
135
+ aria-busy={active || undefined}
136
+ {...props}
137
+ >
138
+ {/* Pixel braces, the same 5×5 grid and the same box as the reasoning
139
+ bulb, still in both states so the label does not shift. */}
140
+ <span data-slot="tool-group-trigger-loader" className="aui-tool-group-trigger-loader inline-flex shrink-0">
141
+ {/* The chain header carries the running state. The trigger is named
142
+ by its text, so the glyph carries no name of its own, and the
143
+ running state is exposed on the trigger as aria-busy. */}
144
+ <DotMatrix state="tools" decorative className="!size-3 shrink-0" />
145
+ </span>
146
+ <span
147
+ data-slot="tool-group-trigger-label"
148
+ className={cn(
149
+ "aui-tool-group-trigger-label-wrapper inline-block min-w-[4rem] text-start text-xs leading-none font-medium",
150
+ "group-data-[variant=ghost]/tool-group-root:font-normal",
151
+ "group-data-[variant=outline]/tool-group-root:grow",
152
+ "group-data-[variant=muted]/tool-group-root:grow",
153
+ )}
154
+ >
155
+ {text}
156
+ </span>
157
+ <DisclosureChevron />
158
+ </CollapsibleTrigger>
159
+ );
160
+ }
161
+
162
+ function ToolGroupContent({
163
+ className,
164
+ children,
165
+ ...props
166
+ }: React.ComponentProps<typeof CollapsibleContent>) {
167
+ const keepMounted = useExportKeepMounted();
168
+ return (
169
+ <CollapsibleContent
170
+ keepMounted={keepMounted}
171
+ data-slot="tool-group-content"
172
+ className={cn(
173
+ "aui-tool-group-content relative overflow-hidden text-sm outline-none",
174
+ "group/collapsible-content ease-[cubic-bezier(0.32,0.72,0,1)] motion-reduce:animate-none",
175
+ "data-closed:animate-collapsible-up",
176
+ "data-open:animate-collapsible-down",
177
+ "data-closed:fill-mode-forwards",
178
+ "data-closed:pointer-events-none",
179
+ "[--tw-duration:var(--animation-duration)]",
180
+ className,
181
+ )}
182
+ {...props}
183
+ >
184
+ <div
185
+ className={cn(
186
+ "mt-2 flex flex-col gap-2",
187
+ "group-data-[variant=ghost]/tool-group-root:mt-1 group-data-[variant=ghost]/tool-group-root:gap-1",
188
+ "group-data-[variant=outline]/tool-group-root:mt-3 group-data-[variant=outline]/tool-group-root:border-t group-data-[variant=outline]/tool-group-root:px-4 group-data-[variant=outline]/tool-group-root:pt-3",
189
+ "group-data-[variant=muted]/tool-group-root:mt-3 group-data-[variant=muted]/tool-group-root:border-t group-data-[variant=muted]/tool-group-root:px-4 group-data-[variant=muted]/tool-group-root:pt-3",
190
+ "[&>*]:animate-in [&>*]:fade-in-0 [&>*]:blur-in-[2px] [&>*]:slide-in-from-top-1 [&>*]:animation-duration-(--animation-duration) [&>*]:ease-[cubic-bezier(0.32,0.72,0,1)]",
191
+ "[&>*]:motion-reduce:animate-none",
192
+ "[&>*:nth-child(2)]:[animation-delay:40ms]",
193
+ "[&>*:nth-child(3)]:[animation-delay:80ms]",
194
+ "[&>*:nth-child(4)]:[animation-delay:120ms]",
195
+ "[&>*:nth-child(n+5)]:[animation-delay:160ms]",
196
+ )}
197
+ >
198
+ {children}
199
+ </div>
200
+ </CollapsibleContent>
201
+ );
202
+ }
203
+
204
+ type ToolGroupComponent = FC<
205
+ PropsWithChildren<{ startIndex: number; endIndex: number }>
206
+ > & {
207
+ Root: typeof ToolGroupRoot;
208
+ Trigger: typeof ToolGroupTrigger;
209
+ Content: typeof ToolGroupContent;
210
+ };
211
+
212
+ const ToolGroupImpl: FC<
213
+ PropsWithChildren<{ startIndex: number; endIndex: number }>
214
+ > = ({ children, startIndex, endIndex }) => {
215
+ const toolCount = endIndex - startIndex + 1;
216
+
217
+ return (
218
+ <ToolGroupRoot>
219
+ <ToolGroupTrigger count={toolCount} />
220
+ <ToolGroupContent>{children}</ToolGroupContent>
221
+ </ToolGroupRoot>
222
+ );
223
+ };
224
+
225
+ /**
226
+ * @deprecated This wrapper targets the legacy `components.ToolGroup` prop
227
+ * on `<MessagePrimitive.Parts>`. Use `<MessagePrimitive.GroupedParts>` with
228
+ * a `groupBy` returning `"group-tool"` and compose `ToolGroupRoot` /
229
+ * `ToolGroupTrigger` / `ToolGroupContent` directly. See `thread.tsx`.
230
+ */
231
+ const ToolGroup = memo(ToolGroupImpl) as unknown as ToolGroupComponent;
232
+
233
+ ToolGroup.displayName = "ToolGroup";
234
+ ToolGroup.Root = ToolGroupRoot;
235
+ ToolGroup.Trigger = ToolGroupTrigger;
236
+ ToolGroup.Content = ToolGroupContent;
237
+
238
+ export {
239
+ ToolGroup,
240
+ ToolGroupRoot,
241
+ ToolGroupTrigger,
242
+ ToolGroupContent,
243
+ toolGroupVariants,
244
+ };
@@ -0,0 +1,120 @@
1
+ /**
2
+ * The tool set, expanded once (#tool-contract).
3
+ *
4
+ * The composer toolbar prints a tool count and `/tools` prints the rows behind
5
+ * it. They used to compute that set separately — the toolbar over
6
+ * `prefs.mcpServers` with its own formula, the menu over `allowedTools` plus a
7
+ * built-in substitution — and disagreed on the same deployment. This module is
8
+ * the only expansion: raw backend ids in, one row per server with its
9
+ * effective tools out, plus the count derived from the same rows.
10
+ *
11
+ * Every id here is a backend id. Nothing in this file humanises a name.
12
+ */
13
+
14
+ /** A row that can carry per-tool entries, as the host projects it. */
15
+ export type ToolSurfaceRowInput = {
16
+ id: string;
17
+ /** Individual tools under this row, raw backend ids. */
18
+ tools?: ReadonlyArray<{ id: string }>;
19
+ };
20
+
21
+ export type ToolSurfaceRow = {
22
+ id: string;
23
+ /** Effective tool ids under this row. Raw backend ids, never labels. */
24
+ tools: readonly string[];
25
+ /**
26
+ * True when `tools` is the house built-in set rather than a list the
27
+ * deployment named. A deployment that names no tools for a house service
28
+ * leaves the row governed by that service's switch, so its two built-ins
29
+ * are what the switch actually turns on and off
30
+ * (digigraph/src/digigraph/tool_policy.py).
31
+ */
32
+ builtin: boolean;
33
+ };
34
+
35
+ /**
36
+ * The tools a house switch carries, by backend id. Kept in step with
37
+ * digigraph's `_DISABLE_TOOL_ALIASES` (digigraph/src/digigraph/tool_policy.py):
38
+ * disabling `digisearch` strips both of its pair, disabling `digivault` strips
39
+ * both of its pair.
40
+ */
41
+ export const HOUSE_BUILTIN_TOOL_IDS: Readonly<Record<string, readonly string[]>> = {
42
+ digisearch: ["digisearch", "digisearch_fetch_all"],
43
+ digivault: ["digivault_search_notes", "digivault_get_note"],
44
+ };
45
+
46
+ /** The house service ids that carry a built-in pair. */
47
+ export const HOUSE_SERVER_IDS: ReadonlySet<string> = new Set(Object.keys(HOUSE_BUILTIN_TOOL_IDS));
48
+
49
+ /**
50
+ * One row per server, with the tools a deployment actually gets under it:
51
+ * the declared `tools` when the row names any, else the house built-in pair
52
+ * for that service id, else nothing.
53
+ */
54
+ export function expandToolRows(
55
+ rows: readonly ToolSurfaceRowInput[],
56
+ ): ToolSurfaceRow[] {
57
+ return rows.map((row) => {
58
+ const declared = (row.tools ?? []).map((tool) => tool.id.trim()).filter(Boolean);
59
+ if (declared.length) return { id: row.id.trim(), tools: declared, builtin: false };
60
+ const builtin = HOUSE_BUILTIN_TOOL_IDS[row.id.trim()] ?? [];
61
+ return {
62
+ id: row.id.trim(),
63
+ tools: builtin,
64
+ builtin: builtin.length > 0,
65
+ };
66
+ });
67
+ }
68
+
69
+ export type ToolSurfaceCount = {
70
+ servers: number;
71
+ tools: number;
72
+ };
73
+
74
+ /**
75
+ * The count the toolbar prints, derived from the rows `/tools` renders.
76
+ *
77
+ * A row counts once while it is on and carries at least one tool; a row with
78
+ * no tools is one tool, because a server nobody has broken down is still one
79
+ * thing the assistant can call.
80
+ */
81
+ export function countToolSurface(
82
+ rows: readonly ToolSurfaceRowInput[],
83
+ input: {
84
+ isOn: (rowId: string) => boolean;
85
+ isToolOn: (toolId: string) => boolean;
86
+ },
87
+ ): ToolSurfaceCount {
88
+ const counts: ToolSurfaceCount = { servers: 0, tools: 0 };
89
+ for (const row of expandToolRows(rows)) {
90
+ if (!input.isOn(row.id)) continue;
91
+ const enabled = row.tools.length
92
+ ? row.tools.filter((id) => input.isToolOn(id)).length
93
+ : 1;
94
+ if (enabled === 0) continue;
95
+ counts.servers += 1;
96
+ counts.tools += enabled;
97
+ }
98
+ return counts;
99
+ }
100
+
101
+ /**
102
+ * Whether a row is on. Kept here, not in the host, so the toolbar and the menu
103
+ * answer with the same rule: a house service follows its own switch, web
104
+ * search follows the tenant's, everything else falls back to the session
105
+ * toggle.
106
+ */
107
+ export function connectedToolIsOn(
108
+ id: string,
109
+ input: {
110
+ digisearch: boolean;
111
+ vault: boolean;
112
+ webSearch: boolean;
113
+ extraToolOn: (id: string) => boolean;
114
+ },
115
+ ): boolean {
116
+ if (id === "digisearch") return input.digisearch;
117
+ if (id === "digivault") return input.vault;
118
+ if (id === "websearch" || id === "web_search") return input.webSearch;
119
+ return input.extraToolOn(id);
120
+ }
@@ -0,0 +1,49 @@
1
+ "use client";
2
+
3
+ import { type ComponentPropsWithRef, forwardRef } from "react";
4
+
5
+ import {
6
+ Tooltip,
7
+ TooltipContent,
8
+ TooltipProvider,
9
+ TooltipTrigger,
10
+ } from "./ui/tooltip";
11
+ import { Button } from "./ui/button";
12
+ import { cn } from "../../../lib/utils";
13
+
14
+ export type TooltipIconButtonProps = ComponentPropsWithRef<typeof Button> & {
15
+ tooltip: string;
16
+ side?: "top" | "bottom" | "left" | "right";
17
+ };
18
+
19
+ export const TooltipIconButton = forwardRef<
20
+ HTMLButtonElement,
21
+ TooltipIconButtonProps
22
+ >(({ children, tooltip, side = "bottom", className, ...rest }, ref) => {
23
+ return (
24
+ <TooltipProvider>
25
+ <Tooltip>
26
+ <TooltipTrigger
27
+ render={
28
+ <Button
29
+ variant="ghost"
30
+ size="icon"
31
+ {...rest}
32
+ className={cn(
33
+ "aui-button-icon size-6 p-1 active:scale-90",
34
+ className,
35
+ )}
36
+ ref={ref}
37
+ />
38
+ }
39
+ >
40
+ {children}
41
+ <span className="aui-sr-only sr-only">{tooltip}</span>
42
+ </TooltipTrigger>
43
+ <TooltipContent side={side}>{tooltip}</TooltipContent>
44
+ </Tooltip>
45
+ </TooltipProvider>
46
+ );
47
+ });
48
+
49
+ TooltipIconButton.displayName = "TooltipIconButton";
@@ -0,0 +1,108 @@
1
+ "use client"
2
+
3
+ import * as React from "react"
4
+ import { Avatar as AvatarPrimitive } from "@base-ui/react/avatar"
5
+ import { cn } from "../../../../lib/utils"
6
+
7
+ function Avatar({
8
+ className,
9
+ size = "default",
10
+ ...props
11
+ }: AvatarPrimitive.Root.Props & {
12
+ size?: "default" | "sm" | "lg"
13
+ }) {
14
+ return (
15
+ <AvatarPrimitive.Root
16
+ data-slot="avatar"
17
+ data-size={size}
18
+ className={cn(
19
+ "group/avatar relative flex size-8 shrink-0 rounded-full select-none after:absolute after:inset-0 after:rounded-full after:border after:border-hair after:mix-blend-darken data-[size=lg]:size-10 data-[size=sm]:size-6 dark:after:mix-blend-lighten",
20
+ className
21
+ )}
22
+ {...props}
23
+ />
24
+ )
25
+ }
26
+
27
+ function AvatarImage({ className, ...props }: AvatarPrimitive.Image.Props) {
28
+ return (
29
+ <AvatarPrimitive.Image
30
+ data-slot="avatar-image"
31
+ className={cn(
32
+ "aspect-square size-full rounded-full object-cover",
33
+ className
34
+ )}
35
+ {...props}
36
+ />
37
+ )
38
+ }
39
+
40
+ function AvatarFallback({
41
+ className,
42
+ ...props
43
+ }: AvatarPrimitive.Fallback.Props) {
44
+ return (
45
+ <AvatarPrimitive.Fallback
46
+ data-slot="avatar-fallback"
47
+ className={cn(
48
+ "flex size-full items-center justify-center rounded-full bg-surface-2 text-sm text-ink-mute group-data-[size=sm]/avatar:text-xs",
49
+ className
50
+ )}
51
+ {...props}
52
+ />
53
+ )
54
+ }
55
+
56
+ function AvatarBadge({ className, ...props }: React.ComponentProps<"span">) {
57
+ return (
58
+ <span
59
+ data-slot="avatar-badge"
60
+ className={cn(
61
+ "absolute right-0 bottom-0 z-10 inline-flex items-center justify-center rounded-full bg-accent text-on-accent bg-blend-color ring-2 ring-surface select-none",
62
+ "group-data-[size=sm]/avatar:size-2 group-data-[size=sm]/avatar:[&>svg]:hidden",
63
+ "group-data-[size=default]/avatar:size-2.5 group-data-[size=default]/avatar:[&>svg]:size-2",
64
+ "group-data-[size=lg]/avatar:size-3 group-data-[size=lg]/avatar:[&>svg]:size-2",
65
+ className
66
+ )}
67
+ {...props}
68
+ />
69
+ )
70
+ }
71
+
72
+ function AvatarGroup({ className, ...props }: React.ComponentProps<"div">) {
73
+ return (
74
+ <div
75
+ data-slot="avatar-group"
76
+ className={cn(
77
+ "group/avatar-group flex -space-x-2 *:data-[slot=avatar]:ring-2 *:data-[slot=avatar]:ring-surface",
78
+ className
79
+ )}
80
+ {...props}
81
+ />
82
+ )
83
+ }
84
+
85
+ function AvatarGroupCount({
86
+ className,
87
+ ...props
88
+ }: React.ComponentProps<"div">) {
89
+ return (
90
+ <div
91
+ data-slot="avatar-group-count"
92
+ className={cn(
93
+ "relative flex size-8 shrink-0 items-center justify-center rounded-full bg-surface-2 text-sm text-ink-mute ring-2 ring-surface group-has-data-[size=lg]/avatar-group:size-10 group-has-data-[size=sm]/avatar-group:size-6 [&>svg]:size-4 group-has-data-[size=lg]/avatar-group:[&>svg]:size-5 group-has-data-[size=sm]/avatar-group:[&>svg]:size-3",
94
+ className
95
+ )}
96
+ {...props}
97
+ />
98
+ )
99
+ }
100
+
101
+ export {
102
+ Avatar,
103
+ AvatarImage,
104
+ AvatarFallback,
105
+ AvatarGroup,
106
+ AvatarGroupCount,
107
+ AvatarBadge,
108
+ }
@@ -0,0 +1,81 @@
1
+ "use client"
2
+
3
+ import { Button as ButtonPrimitive } from "@base-ui/react/button"
4
+ import { cva, type VariantProps } from "class-variance-authority"
5
+ import { cn } from "../../../../lib/utils"
6
+ import { useStockShape } from "../stock-shape"
7
+
8
+ const buttonVariants = cva(
9
+ "group/button inline-flex shrink-0 items-center justify-center rounded-none border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-colors outline-none select-none focus-visible:border-accent focus-visible:ring-3 focus-visible:ring-accent/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-danger aria-invalid:ring-3 aria-invalid:ring-danger/20 dark:aria-invalid:border-danger/50 dark:aria-invalid:ring-danger/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
10
+ {
11
+ variants: {
12
+ variant: {
13
+ default: "bg-accent text-on-accent hover:bg-accent/80",
14
+ outline:
15
+ "border-hair bg-surface hover:bg-surface-2 hover:text-ink aria-expanded:bg-surface-2 aria-expanded:text-ink dark:border-input dark:bg-surface-2/30 dark:hover:bg-surface-2/50",
16
+ secondary:
17
+ "bg-surface-2 text-ink hover:bg-[color-mix(in_oklch,var(--secondary),var(--foreground)_5%)] aria-expanded:bg-surface-2 aria-expanded:text-ink",
18
+ ghost:
19
+ "hover:bg-surface-2 hover:text-ink aria-expanded:bg-surface-2 aria-expanded:text-ink dark:hover:bg-surface-2/50",
20
+ destructive:
21
+ "bg-danger/10 text-danger hover:bg-danger/20 focus-visible:border-danger/40 focus-visible:ring-danger/20 dark:bg-danger/20 dark:hover:bg-danger/30 dark:focus-visible:ring-danger/40",
22
+ link: "text-accent underline-offset-4 hover:underline",
23
+ },
24
+ size: {
25
+ default:
26
+ "h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",
27
+ xs: "h-6 gap-1 rounded-none px-2 text-xs in-data-[slot=button-group]:rounded-none has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",
28
+ sm: "h-7 gap-1 rounded-none px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-none has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",
29
+ lg: "h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",
30
+ icon: "size-8",
31
+ "icon-xs":
32
+ "size-6 rounded-none in-data-[slot=button-group]:rounded-none [&_svg:not([class*='size-'])]:size-3",
33
+ "icon-sm":
34
+ "size-7 rounded-none in-data-[slot=button-group]:rounded-none",
35
+ "icon-lg": "size-9",
36
+ },
37
+ },
38
+ defaultVariants: {
39
+ variant: "default",
40
+ size: "default",
41
+ },
42
+ }
43
+ )
44
+
45
+ // assistant-ui's shadcn base-nova radii, applied only inside the stock Thread
46
+ // (see ../stock-shape.tsx). Other skins that reuse this button keep the square
47
+ // house radius from buttonVariants above.
48
+ const STOCK_BUTTON_RADIUS = {
49
+ default: "rounded-lg",
50
+ xs: "rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg",
51
+ sm: "rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg",
52
+ lg: "rounded-lg",
53
+ icon: "rounded-lg",
54
+ "icon-xs":
55
+ "rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg",
56
+ "icon-sm":
57
+ "rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg",
58
+ "icon-lg": "rounded-lg",
59
+ } as const
60
+
61
+ function Button({
62
+ className,
63
+ variant = "default",
64
+ size = "default",
65
+ ...props
66
+ }: ButtonPrimitive.Props & VariantProps<typeof buttonVariants>) {
67
+ const stock = useStockShape()
68
+ return (
69
+ <ButtonPrimitive
70
+ data-slot="button"
71
+ className={cn(
72
+ buttonVariants({ variant, size }),
73
+ stock && STOCK_BUTTON_RADIUS[size ?? "default"],
74
+ className
75
+ )}
76
+ {...props}
77
+ />
78
+ )
79
+ }
80
+
81
+ export { Button, buttonVariants }
@@ -0,0 +1,21 @@
1
+ "use client"
2
+
3
+ import { Collapsible as CollapsiblePrimitive } from "@base-ui/react/collapsible"
4
+
5
+ function Collapsible({ ...props }: CollapsiblePrimitive.Root.Props) {
6
+ return <CollapsiblePrimitive.Root data-slot="collapsible" {...props} />
7
+ }
8
+
9
+ function CollapsibleTrigger({ ...props }: CollapsiblePrimitive.Trigger.Props) {
10
+ return (
11
+ <CollapsiblePrimitive.Trigger data-slot="collapsible-trigger" {...props} />
12
+ )
13
+ }
14
+
15
+ function CollapsibleContent({ ...props }: CollapsiblePrimitive.Panel.Props) {
16
+ return (
17
+ <CollapsiblePrimitive.Panel data-slot="collapsible-content" {...props} />
18
+ )
19
+ }
20
+
21
+ export { Collapsible, CollapsibleTrigger, CollapsibleContent }