@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,448 @@
1
+ "use client";
2
+
3
+ import { cn } from "../../../lib/utils";
4
+ import {
5
+ ActionBarPrimitive,
6
+ AuiIf,
7
+ AttachmentPrimitive,
8
+ BranchPickerPrimitive,
9
+ ComposerPrimitive,
10
+ MessagePrimitive,
11
+ ThreadPrimitive,
12
+ useAui,
13
+ } from "@assistant-ui/react";
14
+ import { type FC } from "react";
15
+ import { MessageExportMenu } from "../stock/message-export-menu";
16
+ import { TooltipIconButton } from "./tooltip-icon-button";
17
+ import { useAttachmentSrc } from "../stock/use-attachment-src";
18
+ import {
19
+ ArrowUpIcon,
20
+ AudioLines,
21
+ CheckIcon,
22
+ ChevronDownIcon,
23
+ ChevronLeftIcon,
24
+ ChevronRightIcon,
25
+ CopyIcon,
26
+ Download,
27
+ Mic,
28
+ MoreHorizontal,
29
+ PencilIcon,
30
+ PlusIcon,
31
+ RefreshCwIcon,
32
+ Share,
33
+ ThumbsDown,
34
+ ThumbsUp,
35
+ Volume2,
36
+ XIcon,
37
+ } from "lucide-react";
38
+ import { MarkdownText } from "../stock/markdown-text";
39
+ import { ToolFallback } from "../stock/tool-fallback.aui";
40
+ import { useViewDisclosure } from "../stock/deploy-ui-context";
41
+ import { SkinCredit, useComposerCopy } from "../stock";
42
+
43
+
44
+ export const ChatGPT: FC = () => {
45
+ const { placeholder } = useComposerCopy(
46
+ "Where should we begin?",
47
+ "Ask anything",
48
+ );
49
+ return (
50
+ <ThreadPrimitive.Root data-export-thread="" className="flex h-full flex-col items-stretch bg-white px-4 text-[#0d0d0d] dark:bg-[color:var(--chat-skin-canvas,#000)] dark:text-[#ececec]">
51
+ <AuiIf condition={(s) => s.thread.isEmpty}>
52
+ <EmptyState />
53
+ </AuiIf>
54
+
55
+ <AuiIf condition={(s) => !s.thread.isEmpty}>
56
+ <ThreadPrimitive.Viewport className="flex grow flex-col gap-8 overflow-y-scroll pt-16">
57
+ <ThreadPrimitive.Messages>
58
+ {({ message }) => {
59
+ if (message.composer.isEditing) return <EditComposer />;
60
+ if (message.role === "user") return <UserMessage />;
61
+ return <AssistantMessage />;
62
+ }}
63
+ </ThreadPrimitive.Messages>
64
+
65
+ <ThreadPrimitive.ViewportFooter className="sticky bottom-0 mx-auto mt-auto flex w-full max-w-3xl flex-col gap-2 overflow-visible rounded-t-3xl bg-white pb-1 dark:bg-[color:var(--chat-skin-canvas,#000)]">
66
+ <ThreadScrollToBottom />
67
+ <Composer placeholder={placeholder} />
68
+ <SkinCredit />
69
+ </ThreadPrimitive.ViewportFooter>
70
+ </ThreadPrimitive.Viewport>
71
+ </AuiIf>
72
+ </ThreadPrimitive.Root>
73
+ );
74
+ };
75
+
76
+ const EmptyState: FC = () => {
77
+ const { welcome, placeholder } = useComposerCopy(
78
+ "Where should we begin?",
79
+ "Ask anything",
80
+ );
81
+ return (
82
+ <div className="relative flex grow flex-col items-center justify-center px-4 pb-[16vh]">
83
+ <div className="mx-auto flex w-full max-w-3xl flex-col items-stretch gap-6">
84
+ <h1 className="text-center text-2xl leading-7 font-normal text-[#0d0d0d] dark:text-[#ececec]">
85
+ {welcome}
86
+ </h1>
87
+ <Composer placeholder={placeholder} />
88
+ </div>
89
+ <div className="pointer-events-none absolute inset-x-0 bottom-0 px-4 pb-2">
90
+ <SkinCredit />
91
+ </div>
92
+ </div>
93
+ );
94
+ };
95
+
96
+ const Composer: FC<{ placeholder: string }> = ({ placeholder }) => {
97
+ return (
98
+ <ComposerPrimitive.Root data-export-chrome="" className="group/composer flex w-full flex-col rounded-[28px] border border-[#e5e5e5] bg-white px-2 py-2 focus-within:border-[#d0d0d0] dark:border-transparent dark:bg-[#212121] dark:focus-within:border-transparent">
99
+ <AuiIf condition={(s) => s.composer.attachments.length > 0}>
100
+ <div className="flex flex-row flex-wrap gap-2 px-1 pt-1 pb-2">
101
+ <ComposerPrimitive.Attachments
102
+ components={{ Attachment: ChatGPTAttachmentUI }}
103
+ />
104
+ </div>
105
+ </AuiIf>
106
+
107
+ <div className="flex items-end gap-1">
108
+ <ComposerPrimitive.AddAttachment asChild>
109
+ <TooltipIconButton
110
+ type="button"
111
+ tooltip="Add photos & files"
112
+ side="top"
113
+ aria-label="Add attachment"
114
+ className="flex size-9 shrink-0 items-center justify-center rounded-full text-[#5d5d5d] transition-colors hover:bg-black/[0.07] hover:text-[#5d5d5d] dark:text-[#cdcdcd] dark:hover:bg-white/15 dark:hover:text-[#cdcdcd]"
115
+ >
116
+ <PlusIcon size={20} />
117
+ </TooltipIconButton>
118
+ </ComposerPrimitive.AddAttachment>
119
+
120
+ <ComposerPrimitive.Input
121
+ autoFocus
122
+ placeholder={placeholder}
123
+ rows={1}
124
+ className="max-h-52 min-h-9 flex-1 resize-none bg-transparent py-1.5 pr-2 pl-1 text-base text-[#0d0d0d] outline-none placeholder:text-[#8e8e8e] dark:text-[#ececec] dark:placeholder:text-[#8e8e8e]"
125
+ />
126
+
127
+ <div className="flex shrink-0 items-center gap-1">
128
+ <ComposerPrimaryAction />
129
+ </div>
130
+ </div>
131
+ </ComposerPrimitive.Root>
132
+ );
133
+ };
134
+
135
+ const ComposerPrimaryAction: FC = () => {
136
+ return (
137
+ <div className="flex items-center gap-1">
138
+ <AuiIf condition={(s) => s.thread.isRunning}>
139
+ <ComposerPrimitive.Cancel className="flex size-9 items-center justify-center rounded-full bg-[#0d0d0d] text-white dark:bg-white dark:text-black">
140
+ <div className="size-2.5 rounded-[2px] bg-current" />
141
+ </ComposerPrimitive.Cancel>
142
+ </AuiIf>
143
+
144
+ <AuiIf
145
+ condition={(s) => !s.thread.isRunning && s.composer.dictation != null}
146
+ >
147
+ <ComposerPrimitive.StopDictation
148
+ className="flex size-9 items-center justify-center rounded-full bg-[#0d0d0d] text-white dark:bg-white dark:text-black"
149
+ aria-label="Stop dictation"
150
+ >
151
+ <div className="size-2.5 animate-pulse rounded-[2px] bg-current" />
152
+ </ComposerPrimitive.StopDictation>
153
+ </AuiIf>
154
+
155
+ <AuiIf
156
+ condition={(s) =>
157
+ !s.thread.isRunning &&
158
+ s.composer.dictation == null &&
159
+ !s.composer.isEmpty
160
+ }
161
+ >
162
+ <ComposerPrimitive.Send className="flex size-9 items-center justify-center rounded-full bg-[#0d0d0d] text-white transition-opacity disabled:opacity-30 dark:bg-white dark:text-black">
163
+ <ArrowUpIcon className="size-6" />
164
+ </ComposerPrimitive.Send>
165
+ </AuiIf>
166
+
167
+ <AuiIf
168
+ condition={(s) =>
169
+ !s.thread.isRunning &&
170
+ s.composer.dictation == null &&
171
+ s.composer.isEmpty
172
+ }
173
+ >
174
+ <ComposerPrimitive.Dictate asChild>
175
+ <TooltipIconButton
176
+ tooltip="Dictate"
177
+ side="top"
178
+ aria-label="Dictate"
179
+ className="flex size-9 items-center justify-center rounded-full text-[#5d5d5d] transition-colors hover:bg-black/[0.07] hover:text-[#5d5d5d] dark:text-[#cdcdcd] dark:hover:bg-white/15 dark:hover:text-[#cdcdcd]"
180
+ >
181
+ <Mic className="size-5" />
182
+ </TooltipIconButton>
183
+ </ComposerPrimitive.Dictate>
184
+
185
+ <TooltipIconButton
186
+ type="button"
187
+ tooltip="Use voice mode"
188
+ side="top"
189
+ aria-hidden="true"
190
+ tabIndex={-1}
191
+ className="flex size-9 items-center justify-center rounded-full bg-[#0d0d0d] text-white hover:bg-[#0d0d0d] dark:bg-white dark:text-black dark:hover:bg-white"
192
+ >
193
+ <AudioLines className="size-5" />
194
+ </TooltipIconButton>
195
+ </AuiIf>
196
+ </div>
197
+ );
198
+ };
199
+
200
+ const ThreadScrollToBottom: FC = () => {
201
+ return (
202
+ <ThreadPrimitive.ScrollToBottom asChild>
203
+ <TooltipIconButton
204
+ tooltip="Scroll to bottom"
205
+ className="bg-background absolute -top-10 z-10 self-center rounded-full border p-2 disabled:invisible dark:border-white/15 dark:bg-[#2a2a2a]"
206
+ >
207
+ <ChevronDownIcon className="size-5" />
208
+ </TooltipIconButton>
209
+ </ThreadPrimitive.ScrollToBottom>
210
+ );
211
+ };
212
+
213
+ const UserMessage: FC = () => {
214
+ return (
215
+ <MessagePrimitive.Root data-role="user" className="relative mx-auto flex w-full max-w-3xl flex-col items-end gap-1">
216
+ <div className="flex flex-row flex-wrap justify-end gap-2">
217
+ <MessagePrimitive.Attachments
218
+ components={{ Attachment: ChatGPTAttachmentUI }}
219
+ />
220
+ </div>
221
+
222
+ <div className="max-w-[70%] rounded-[22px] bg-[#0d0d0d] px-4 py-2.5 leading-6 text-white dark:bg-[#ececec] dark:text-[#0d0d0d]">
223
+ <MessagePrimitive.Parts />
224
+ </div>
225
+
226
+ <div className="flex items-center gap-0.5">
227
+ <ActionBarPrimitive.Root data-export-chrome=""
228
+ hideWhenRunning
229
+ autohide="always"
230
+ autohideFloat="single-branch"
231
+ className="flex items-center"
232
+ >
233
+ <ActionBarPrimitive.Copy asChild>
234
+ <TooltipIconButton
235
+ tooltip="Copy"
236
+ side="top"
237
+ className={assistantActionClassName}
238
+ >
239
+ <AuiIf condition={(s) => s.message.isCopied}>
240
+ <CheckIcon className="size-5" />
241
+ </AuiIf>
242
+ <AuiIf condition={(s) => !s.message.isCopied}>
243
+ <CopyIcon className="size-5" />
244
+ </AuiIf>
245
+ </TooltipIconButton>
246
+ </ActionBarPrimitive.Copy>
247
+ <ActionBarPrimitive.Edit asChild>
248
+ <TooltipIconButton
249
+ tooltip="Edit"
250
+ side="top"
251
+ className={assistantActionClassName}
252
+ >
253
+ <PencilIcon className="size-5" />
254
+ </TooltipIconButton>
255
+ </ActionBarPrimitive.Edit>
256
+ </ActionBarPrimitive.Root>
257
+
258
+ <BranchPicker />
259
+ </div>
260
+ </MessagePrimitive.Root>
261
+ );
262
+ };
263
+
264
+ const EditComposer: FC = () => {
265
+ return (
266
+ <ComposerPrimitive.Root data-export-chrome="" className="mx-auto flex w-full max-w-3xl flex-col justify-end gap-1 rounded-3xl bg-[#e9e9e9]/50 dark:bg-[#323232]">
267
+ <ComposerPrimitive.Input className="text-foreground flex h-8 w-full resize-none bg-transparent p-5 pb-0 outline-none dark:text-white" />
268
+
269
+ <div className="m-3 mt-2 flex items-center justify-center gap-2 self-end">
270
+ <ComposerPrimitive.Cancel className="bg-background text-foreground hover:bg-muted rounded-full px-3 py-2 text-sm font-semibold dark:bg-zinc-900 dark:text-white dark:hover:bg-zinc-800">
271
+ Cancel
272
+ </ComposerPrimitive.Cancel>
273
+ <ComposerPrimitive.Send className="bg-primary text-primary-foreground hover:bg-primary/90 rounded-full px-3 py-2 text-sm font-semibold dark:bg-white dark:text-black dark:hover:bg-white/90">
274
+ Send
275
+ </ComposerPrimitive.Send>
276
+ </div>
277
+ </ComposerPrimitive.Root>
278
+ );
279
+ };
280
+
281
+ const assistantActionClassName =
282
+ "flex size-8 items-center justify-center rounded-lg text-[#5d5d5d] transition-colors hover:bg-black/[0.07] hover:text-[#5d5d5d] dark:text-[#cdcdcd] dark:hover:bg-white/15 dark:hover:text-[#cdcdcd]";
283
+
284
+ const AssistantMessage: FC = () => {
285
+ const disclosure = useViewDisclosure();
286
+ return (
287
+ <MessagePrimitive.Root data-role="assistant" className="relative mx-auto flex w-full max-w-3xl flex-col">
288
+ <div className="text-[#0d0d0d] dark:text-[#ececec]">
289
+ <MessagePrimitive.Parts>
290
+ {({ part }) => {
291
+ if (part.type === "text") return <MarkdownText />;
292
+ if (part.type === "tool-call")
293
+ return (
294
+ part.toolUI ?? (
295
+ <ToolFallback
296
+ key={disclosure.key}
297
+ {...part}
298
+ />
299
+ )
300
+ );
301
+ return null;
302
+ }}
303
+ </MessagePrimitive.Parts>
304
+ </div>
305
+
306
+ <div className="-ml-2 flex items-center pt-1">
307
+ <ActionBarPrimitive.Root data-export-chrome="" hideWhenRunning className="flex items-center">
308
+ <ActionBarPrimitive.Copy asChild>
309
+ <TooltipIconButton
310
+ tooltip="Copy"
311
+ side="top"
312
+ className={assistantActionClassName}
313
+ >
314
+ <AuiIf condition={(s) => s.message.isCopied}>
315
+ <CheckIcon className="size-5" />
316
+ </AuiIf>
317
+ <AuiIf condition={(s) => !s.message.isCopied}>
318
+ <CopyIcon className="size-5" />
319
+ </AuiIf>
320
+ </TooltipIconButton>
321
+ </ActionBarPrimitive.Copy>
322
+ <ActionBarPrimitive.FeedbackPositive asChild>
323
+ <TooltipIconButton
324
+ tooltip="Good response"
325
+ side="top"
326
+ className={assistantActionClassName}
327
+ >
328
+ <ThumbsUp className="size-5" />
329
+ </TooltipIconButton>
330
+ </ActionBarPrimitive.FeedbackPositive>
331
+ <ActionBarPrimitive.FeedbackNegative asChild>
332
+ <TooltipIconButton
333
+ tooltip="Bad response"
334
+ side="top"
335
+ className={assistantActionClassName}
336
+ >
337
+ <ThumbsDown className="size-5" />
338
+ </TooltipIconButton>
339
+ </ActionBarPrimitive.FeedbackNegative>
340
+ <ActionBarPrimitive.Speak asChild>
341
+ <TooltipIconButton
342
+ tooltip="Read aloud"
343
+ side="top"
344
+ className={assistantActionClassName}
345
+ >
346
+ <Volume2 className="size-5" />
347
+ </TooltipIconButton>
348
+ </ActionBarPrimitive.Speak>
349
+ <TooltipIconButton
350
+ tooltip="Share"
351
+ side="top"
352
+ className={assistantActionClassName}
353
+ >
354
+ <Share className="size-5" />
355
+ </TooltipIconButton>
356
+ <ActionBarPrimitive.Reload asChild>
357
+ <TooltipIconButton
358
+ tooltip="Regenerate"
359
+ side="top"
360
+ className={assistantActionClassName}
361
+ >
362
+ <RefreshCwIcon className="size-5" />
363
+ </TooltipIconButton>
364
+ </ActionBarPrimitive.Reload>
365
+ <MessageExportMenu
366
+ trigger={
367
+ <button
368
+ type="button"
369
+ aria-label="More"
370
+ className={cn(
371
+ assistantActionClassName,
372
+ "data-[state=open]:bg-black/[0.07] dark:data-[state=open]:bg-white/15",
373
+ )}
374
+ >
375
+ <MoreHorizontal className="size-5" />
376
+ </button>
377
+ }
378
+ icon={<Download className="size-5" />}
379
+ align="end"
380
+ contentClassName="bg-popover text-popover-foreground data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 data-[state=open]:animate-in data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=closed]:animate-out data-[side=bottom]:slide-in-from-top-2 z-50 min-w-40 overflow-hidden rounded-xl border p-1.5 shadow-md"
381
+ itemClassName="text-muted-foreground focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground flex cursor-pointer items-center gap-2.5 rounded-lg px-3 py-2 text-sm outline-none select-none"
382
+ />
383
+ </ActionBarPrimitive.Root>
384
+ <BranchPicker className="ml-1" />
385
+ </div>
386
+ </MessagePrimitive.Root>
387
+ );
388
+ };
389
+
390
+ const BranchPicker: FC<{ className?: string }> = ({ className }) => {
391
+ return (
392
+ <BranchPickerPrimitive.Root data-export-chrome=""
393
+ hideWhenSingleBranch
394
+ className={cn(
395
+ "text-muted-foreground inline-flex items-center text-sm font-semibold dark:text-[#b4b4b4]",
396
+ className,
397
+ )}
398
+ >
399
+ <BranchPickerPrimitive.Previous asChild>
400
+ <TooltipIconButton tooltip="Previous" className="text-[#b4b4b4]">
401
+ <ChevronLeftIcon className="size-5" />
402
+ </TooltipIconButton>
403
+ </BranchPickerPrimitive.Previous>
404
+ <BranchPickerPrimitive.Number />/<BranchPickerPrimitive.Count />
405
+ <BranchPickerPrimitive.Next asChild>
406
+ <TooltipIconButton tooltip="Next" className="text-[#b4b4b4]">
407
+ <ChevronRightIcon className="size-5" />
408
+ </TooltipIconButton>
409
+ </BranchPickerPrimitive.Next>
410
+ </BranchPickerPrimitive.Root>
411
+ );
412
+ };
413
+
414
+ const ChatGPTAttachmentUI: FC = () => {
415
+ const aui = useAui();
416
+ const isComposer = aui.attachment.source !== "message";
417
+ const src = useAttachmentSrc();
418
+
419
+ return (
420
+ <AttachmentPrimitive.Root className="group/attachment relative">
421
+ <div className="bg-secondary flex items-center gap-2 overflow-hidden rounded-2xl border dark:bg-white/5">
422
+ <AuiIf condition={(s) => s.attachment.type === "image"}>
423
+ {src ? (
424
+ <img
425
+ className="size-32 rounded-md object-cover"
426
+ alt="Attachment"
427
+ src={src}
428
+ />
429
+ ) : (
430
+ <div className="flex h-full w-12 items-center justify-center rounded-md">
431
+ <AttachmentPrimitive.unstable_Thumb className="text-xs" />
432
+ </div>
433
+ )}
434
+ </AuiIf>
435
+ <AuiIf condition={(s) => s.attachment.type !== "image"}>
436
+ <div className="bg-background flex h-full w-12 items-center justify-center rounded-[9px] text-[#6b6b6b] dark:bg-[#3a3a3a] dark:text-[#9a9a9a]">
437
+ <AttachmentPrimitive.unstable_Thumb className="text-xs" />
438
+ </div>
439
+ </AuiIf>
440
+ </div>
441
+ {isComposer && (
442
+ <AttachmentPrimitive.Remove className="absolute -top-1.5 -right-1.5 flex size-7 items-center justify-center rounded-full border border-[#e5e5e5] bg-white text-[#6b6b6b] transition-all hover:bg-[#f5f5f5] hover:text-[#0d0d0d] dark:border-[#3a3a3a] dark:bg-[#1a1a1a] dark:text-[#9a9a9a] dark:hover:bg-[#252525] dark:hover:text-white">
443
+ <XIcon className="size-5" />
444
+ </AttachmentPrimitive.Remove>
445
+ )}
446
+ </AttachmentPrimitive.Root>
447
+ );
448
+ };