@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,2531 @@
1
+ /* digichat chat grammar — first-party Thread + product skin (WS1/F1).
2
+ Moved into @digithings-ai/ui from the reference gallery's chatbot sheet
3
+ so the package owns its theme; the reference gallery now imports this
4
+ sheet back. Grammar is shared; the .aui-theme-stage specimen frame
5
+ (height/border) is gallery-only. */
6
+
7
+ /* Chatbot gallery + product `chrome.skin: digichat`.
8
+ Grammar is shared. The specimen frame (height/border) is gallery-only. */
9
+
10
+ .aui-theme-stage {
11
+ height: min(72vh, 46rem);
12
+ margin-top: 1.3rem;
13
+ overflow: hidden;
14
+ border: 1px solid var(--hair);
15
+ background: var(--bg);
16
+ }
17
+
18
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) {
19
+ --accent: var(--ink);
20
+ --on-accent: var(--bg);
21
+ --radius: 0;
22
+ --composer-radius: 0;
23
+ /* Sizing tokens (chat-digichat). Shared by every rule below and by the
24
+ gallery stage and the product skin alike. */
25
+ --dc-body-fs: 0.82rem; /* welcome copy + suggestion labels */
26
+ --dc-md-fs: 0.88rem; /* rendered markdown body */
27
+ --dc-msg-col: 1.25rem; /* marker / suggestion glyph column */
28
+ --dc-gap-1: 0.55rem;
29
+ --dc-gap-2: 0.45rem;
30
+ --dc-text-sm: 0.7rem; /* trace-row voice */
31
+ --dc-text-xs: 0.68rem; /* trace detail voice */
32
+ --dc-row-pad-y: 0.2rem;
33
+ --dc-composer-fs: 0.88rem;
34
+ --dc-composer-line: 1.375rem; /* one text row; also the caret row pitch */
35
+ --dc-composer-pad-y: 0.2rem;
36
+ --dc-composer-rows: 5;
37
+ --dc-composer-pad: 0.25rem 0.375rem; /* compact shell: 4px 6px */
38
+ --dc-composer-gap: 0.25rem;
39
+ --dc-composer-inset-x: 0.625rem;
40
+ --dc-chevron: 0.55rem;
41
+ --dc-icon: 0.75rem;
42
+ --dc-icon-lg: 0.85rem;
43
+ --dc-marker-w: 1.25rem;
44
+ --dc-marker-offset: 0.2rem;
45
+ --dc-viewport-pad-x: 0.9rem;
46
+ --dc-viewport-pad-top: 0.75rem;
47
+ --dc-group-gap: 0.85rem;
48
+ --dc-group-mb: 1rem;
49
+ --dc-chip-max-w: 16rem;
50
+ --dc-chip-gap: 0.35rem;
51
+ --dc-chip-pad: 0.15rem 0.45rem;
52
+ --dc-chip-fs: 0.66rem;
53
+ --dc-reasoning-max-h: 12rem;
54
+ --dc-dump-max-h: 8.5rem;
55
+ --dc-launcher-composer-max-h: 4.5rem;
56
+ --dc-json-max-h: 18rem;
57
+ --dc-sidebar-w: 11.5rem;
58
+ --dc-list-pad-x: 0.7rem;
59
+ --dc-label-fs: 0.62rem;
60
+ --dc-chrome-fs: 0.66rem;
61
+ --dc-item-fs: 0.78rem;
62
+ }
63
+
64
+ .aui-theme-stage > * {
65
+ height: 100%;
66
+ }
67
+
68
+ /* Registry Thread uses rounded-full / rounded-xl on chips, bubbles, send.
69
+ Flatten inside the stage only — do not fork those class names yet. */
70
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-root,
71
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-root *,
72
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .digichat-thread,
73
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .digichat-thread * {
74
+ border-radius: 0;
75
+ }
76
+
77
+ /* Increment 2 — welcome slot. Official `components.Welcome` in the footer,
78
+ immediately above the composer. Left-aligned title + body. Optional
79
+ example list — not chips, not a top-of-thread empty state. */
80
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-thread-welcome-root {
81
+ align-items: flex-start;
82
+ margin: 0;
83
+ padding: 0;
84
+ text-align: left;
85
+ }
86
+
87
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-thread-welcome-message-inner {
88
+ font-family: var(--font-mono);
89
+ font-weight: 400;
90
+ color: var(--ink);
91
+ }
92
+
93
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-thread-welcome-copy {
94
+ margin: 0.7rem 0 0;
95
+ /* Full thread-column width: the copy reads as paragraphs at hero scale
96
+ instead of a narrow column hugging the left edge. */
97
+ max-width: none;
98
+ font-family: var(--font-mono);
99
+ font-size: var(--dc-body-fs);
100
+ line-height: 1.45;
101
+ color: var(--ink-soft);
102
+ }
103
+
104
+ /* The not-yet-typed remainder of a line holds its space (the typewriter
105
+ reveals in place, nothing reflows), painted invisible. */
106
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-thread-welcome-ghost {
107
+ visibility: hidden;
108
+ }
109
+
110
+ /* Welcome body typewriter caret: same blink grammar as the composer block
111
+ caret, tinted with the tenant accent. Typing is client-only and degrades
112
+ to the full copy under prefers-reduced-motion; the infinite blink still
113
+ needs an explicit animation: none under reduce (contract test). */
114
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-thread-welcome-caret {
115
+ display: inline-block;
116
+ width: 0.55em;
117
+ height: 1.05em;
118
+ margin-left: 0.08em;
119
+ /* Net-zero width: the caret overlays the next hidden glyph instead of
120
+ pushing text, so appearing/retiring never rewraps the line. */
121
+ margin-right: -0.63em;
122
+ vertical-align: text-bottom;
123
+ background: var(--tenant-accent, var(--accent, var(--ink)));
124
+ animation: aui-caret-blink 1.06s steps(1) infinite;
125
+ }
126
+
127
+ @media (prefers-reduced-motion: reduce) {
128
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-thread-welcome-caret {
129
+ animation: none;
130
+ }
131
+ }
132
+
133
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-thread-welcome-suggestions {
134
+ display: flex;
135
+ flex-direction: column;
136
+ flex-wrap: nowrap;
137
+ align-items: stretch;
138
+ justify-content: flex-start;
139
+ gap: 0.1rem;
140
+ padding: 0;
141
+ }
142
+
143
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-thread-welcome-suggestion {
144
+ display: grid;
145
+ grid-template-columns: var(--dc-msg-col) minmax(0, 1fr);
146
+ align-items: center;
147
+ gap: var(--dc-gap-1);
148
+ width: 100%;
149
+ height: auto;
150
+ border: 0;
151
+ border-radius: 0;
152
+ background: transparent;
153
+ padding: var(--dc-row-pad-y) 0;
154
+ font-family: var(--font-mono);
155
+ font-size: var(--dc-body-fs);
156
+ font-weight: 400;
157
+ line-height: 1.45;
158
+ color: var(--ink-soft);
159
+ white-space: normal;
160
+ }
161
+
162
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-thread-welcome-suggestion:hover,
163
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-thread-welcome-suggestion:focus-visible {
164
+ background: transparent;
165
+ color: var(--ink);
166
+ outline: none;
167
+ }
168
+
169
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-thread-empty {
170
+ padding: 0;
171
+ }
172
+
173
+ /* Increment 3 — composer. Official ComposerPrimitive in Thread; restyle here.
174
+ Placeholder comes from chrome.placeholder. Radius already 0 on .aui-root *. */
175
+
176
+ /* Footer docks at the bottom. Empty-state copy lives inside it, above the
177
+ composer, so typing cannot shove the welcome around. */
178
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-thread-viewport-footer {
179
+ margin-top: auto;
180
+ gap: var(--dc-gap-1);
181
+ padding-bottom: var(--dc-gap-2);
182
+ }
183
+
184
+ /* The stock thread column uses px-4 / gap-y-6 / mb-14. Pull that air in so
185
+ turns, the welcome, and the composer share one inset. */
186
+ /* The stock thread column uses px-4 / gap-y-6 / mb-14. Pull that air in so
187
+ turns, the welcome, and the composer share one inset, and let density own
188
+ the turn-to-turn gap instead of the utility. */
189
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="aui_thread-viewport"] > div {
190
+ padding-inline: var(--dc-viewport-pad-x);
191
+ padding-top: var(--dc-viewport-pad-top);
192
+ }
193
+
194
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="aui_message-group"] {
195
+ gap: var(--density-gap-4, 0.75rem);
196
+ margin-bottom: var(--density-gap-3, 0.625rem);
197
+ }
198
+
199
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="aui_thread-viewport"] {
200
+ overflow-anchor: none;
201
+ scrollbar-gutter: stable;
202
+ overflow-x: hidden;
203
+ }
204
+
205
+ /* Scrollbars: square, and slimmer with depth. The thread is the outer
206
+ surface (10px), menus and the composer sit inside it (6px), and the
207
+ tool-call dumps are the deepest scroll (4px). Styling ::-webkit-scrollbar
208
+ also makes the thumb square on macOS, whose overlay bar is rounded.
209
+ The square webkit sizing belongs to the "always" mode: a styled
210
+ ::-webkit-scrollbar is a classic bar that reserves its own track and
211
+ never becomes an overlay, so "auto" mode must leave the native bar
212
+ untouched. */
213
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="aui_thread-viewport"] {
214
+ scrollbar-width: auto;
215
+ scrollbar-color: color-mix(in oklab, var(--ink-mute) 38%, transparent) transparent;
216
+ }
217
+
218
+ [data-thread-skin="digichat"][data-scrollbars="always"] [data-slot="aui_thread-viewport"]::-webkit-scrollbar {
219
+ width: 10px;
220
+ height: 10px;
221
+ }
222
+
223
+ /* The track and the corner are styled with the square bar: in Blink a
224
+ styled ::-webkit-scrollbar pseudo turns the native overlay into a classic
225
+ bar that reserves its own track, so it belongs to the always mode. */
226
+ [data-thread-skin="digichat"][data-scrollbars="always"] [data-slot="aui_thread-viewport"]::-webkit-scrollbar-track,
227
+ [data-thread-skin="digichat"][data-scrollbars="always"] [data-slot="aui_thread-viewport"]::-webkit-scrollbar-corner {
228
+ background: transparent;
229
+ }
230
+
231
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-composer-input,
232
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .dc-composer-menu-body {
233
+ scrollbar-width: thin;
234
+ scrollbar-color: color-mix(in oklab, var(--ink-mute) 30%, transparent) transparent;
235
+ scrollbar-gutter: stable;
236
+ }
237
+
238
+ [data-thread-skin="digichat"][data-scrollbars="always"] .aui-composer-input::-webkit-scrollbar,
239
+ [data-thread-skin="digichat"][data-scrollbars="always"] .dc-composer-menu-body::-webkit-scrollbar {
240
+ width: 6px;
241
+ height: 6px;
242
+ }
243
+
244
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="tool-fallback-dump"],
245
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="reasoning-text"],
246
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="tool-group-content"],
247
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-tool-fallback-args-value,
248
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-tool-fallback-result-content {
249
+ scrollbar-width: thin;
250
+ scrollbar-color: color-mix(in oklab, var(--ink-mute) 24%, transparent) transparent;
251
+ }
252
+
253
+ [data-thread-skin="digichat"][data-scrollbars="always"] [data-slot="tool-fallback-dump"]::-webkit-scrollbar,
254
+ [data-thread-skin="digichat"][data-scrollbars="always"] [data-slot="reasoning-text"]::-webkit-scrollbar,
255
+ [data-thread-skin="digichat"][data-scrollbars="always"] [data-slot="tool-group-content"]::-webkit-scrollbar,
256
+ [data-thread-skin="digichat"][data-scrollbars="always"] .aui-tool-fallback-args-value::-webkit-scrollbar,
257
+ [data-thread-skin="digichat"][data-scrollbars="always"] .aui-tool-fallback-result-content::-webkit-scrollbar {
258
+ width: 4px;
259
+ height: 4px;
260
+ }
261
+
262
+ [data-thread-skin="digichat"][data-scrollbars="always"] [data-slot="aui_thread-viewport"]::-webkit-scrollbar-thumb,
263
+ [data-thread-skin="digichat"][data-scrollbars="always"] .aui-composer-input::-webkit-scrollbar-thumb,
264
+ [data-thread-skin="digichat"][data-scrollbars="always"] .dc-composer-menu-body::-webkit-scrollbar-thumb,
265
+ [data-thread-skin="digichat"][data-scrollbars="always"] [data-slot="tool-fallback-dump"]::-webkit-scrollbar-thumb,
266
+ [data-thread-skin="digichat"][data-scrollbars="always"] [data-slot="reasoning-text"]::-webkit-scrollbar-thumb,
267
+ [data-thread-skin="digichat"][data-scrollbars="always"] [data-slot="tool-group-content"]::-webkit-scrollbar-thumb,
268
+ [data-thread-skin="digichat"][data-scrollbars="always"] .aui-tool-fallback-args-value::-webkit-scrollbar-thumb,
269
+ [data-thread-skin="digichat"][data-scrollbars="always"] .aui-tool-fallback-result-content::-webkit-scrollbar-thumb {
270
+ border-radius: 0;
271
+ background: color-mix(in oklab, var(--ink-mute) 32%, transparent);
272
+ }
273
+
274
+ [data-thread-skin="digichat"][data-scrollbars="always"] [data-slot="aui_thread-viewport"]::-webkit-scrollbar-thumb:hover,
275
+ [data-thread-skin="digichat"][data-scrollbars="always"] .aui-composer-input::-webkit-scrollbar-thumb:hover,
276
+ [data-thread-skin="digichat"][data-scrollbars="always"] .dc-composer-menu-body::-webkit-scrollbar-thumb:hover,
277
+ [data-thread-skin="digichat"][data-scrollbars="always"] [data-slot="tool-fallback-dump"]::-webkit-scrollbar-thumb:hover,
278
+ [data-thread-skin="digichat"][data-scrollbars="always"] [data-slot="reasoning-text"]::-webkit-scrollbar-thumb:hover,
279
+ [data-thread-skin="digichat"][data-scrollbars="always"] [data-slot="tool-group-content"]::-webkit-scrollbar-thumb:hover,
280
+ [data-thread-skin="digichat"][data-scrollbars="always"] .aui-tool-fallback-args-value::-webkit-scrollbar-thumb:hover,
281
+ [data-thread-skin="digichat"][data-scrollbars="always"] .aui-tool-fallback-result-content::-webkit-scrollbar-thumb:hover {
282
+ background: color-mix(in oklab, var(--ink-mute) 48%, transparent);
283
+ }
284
+
285
+ /* The menu keeps its bar in place: 6px track always shown, and the stable
286
+ gutter reserves that width so the thumb never sits over the row text. */
287
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .dc-composer-menu-body {
288
+ overflow-y: scroll;
289
+ scrollbar-gutter: stable;
290
+ }
291
+
292
+ /* data-scrollbars="auto" — the native overlay bar, shown only while the
293
+ surface is scrolling or the pointer is over it, and never reserving a
294
+ gutter. "always" keeps every rule above: 6px/10px/4px square bars in a
295
+ stable gutter. The square ::-webkit-scrollbar sizing is scoped to
296
+ "always" as well: a styled webkit scrollbar is a classic bar that
297
+ reserves its own track and never becomes an overlay, so in "auto" mode
298
+ no ::-webkit-scrollbar pseudo is styled at all.
299
+ The mode attribute rides on the thread root, next to data-thread-skin, so
300
+ every mode rule is keyed on that one element and names the mode value.
301
+ A mode rule keyed on an ancestor that only carries the skin (the app
302
+ shell sets data-thread-skin without the mode) would reach a thread in
303
+ "auto" mode and take the native bar away from it.
304
+ The custom overlay bars are switched off here so a surface never draws
305
+ the native bar and the component bar together. */
306
+ [data-thread-skin="digichat"][data-scrollbars="auto"]
307
+ [data-slot="aui_thread-viewport"] {
308
+ overflow-y: auto;
309
+ scrollbar-gutter: auto;
310
+ scrollbar-width: thin;
311
+ }
312
+
313
+ [data-thread-skin="digichat"][data-scrollbars="auto"]
314
+ .aui-composer-input,
315
+ [data-thread-skin="digichat"][data-scrollbars="auto"]
316
+ .dc-composer-menu-body {
317
+ overflow-y: auto;
318
+ scrollbar-gutter: auto;
319
+ scrollbar-width: thin;
320
+ }
321
+
322
+ [data-thread-skin="digichat"][data-scrollbars="auto"]
323
+ [data-slot="tool-fallback-dump"],
324
+ [data-thread-skin="digichat"][data-scrollbars="auto"]
325
+ [data-slot="reasoning-text"],
326
+ [data-thread-skin="digichat"][data-scrollbars="auto"]
327
+ [data-slot="tool-group-content"],
328
+ [data-thread-skin="digichat"][data-scrollbars="auto"]
329
+ .aui-tool-fallback-args-value,
330
+ [data-thread-skin="digichat"][data-scrollbars="auto"]
331
+ .aui-tool-fallback-result-content {
332
+ overflow-y: auto;
333
+ scrollbar-gutter: auto;
334
+ scrollbar-width: thin;
335
+ }
336
+
337
+ /* The palette list sits inside the composer root, inside the thread root, so
338
+ it is matched by ancestry from the carrier. The document-level html:has()
339
+ form would reach the palette of a thread in the other mode on a page that
340
+ carries both. */
341
+ [data-thread-skin="digichat"][data-scrollbars="auto"]
342
+ [data-slot="composer-trigger-popover-items"] {
343
+ overflow-y: auto;
344
+ scrollbar-gutter: auto;
345
+ scrollbar-width: thin;
346
+ }
347
+
348
+ /* One bar per surface: the React overlay bars are inert under "auto". */
349
+ [data-thread-skin="digichat"][data-scrollbars="auto"] .aui-overlay-scroll,
350
+ [data-thread-skin="digichat"][data-scrollbars="auto"] .dc-composer-menu-scroll {
351
+ display: none;
352
+ }
353
+
354
+ [data-slot="composer-trigger-popover-items"] {
355
+ scrollbar-width: thin;
356
+ scrollbar-color: color-mix(in oklab, var(--ink-mute) 30%, transparent) transparent;
357
+ scrollbar-gutter: stable;
358
+ }
359
+
360
+ [data-thread-skin="digichat"][data-scrollbars="always"] [data-slot="composer-trigger-popover-items"]::-webkit-scrollbar {
361
+ width: 6px;
362
+ height: 6px;
363
+ }
364
+
365
+ [data-thread-skin="digichat"][data-scrollbars="always"] [data-slot="composer-trigger-popover-items"]::-webkit-scrollbar-thumb {
366
+ border-radius: 0;
367
+ background: color-mix(in oklab, var(--ink-mute) 32%, transparent);
368
+ }
369
+
370
+ [data-thread-skin="digichat"][data-scrollbars="always"] [data-slot="composer-trigger-popover-items"]::-webkit-scrollbar-thumb:hover {
371
+ background: color-mix(in oklab, var(--ink-mute) 48%, transparent);
372
+ }
373
+
374
+ /* Always mode paints a square overlay bar; the native bar must not draw a
375
+ second, rounded capsule underneath it (Safari ignores the webkit shape).
376
+ The suppression is keyed on the thread root, the one element that carries
377
+ the mode, and it names the mode value: the auto rules switch the component
378
+ bars off, so an unscoped suppression here leaves those surfaces with no bar
379
+ at all, and a suppression keyed on an ancestor that only carries the skin
380
+ takes the native bar away from a thread that is in auto mode. */
381
+ [data-thread-skin="digichat"][data-scrollbars="always"] [data-slot="aui_thread-viewport"],
382
+ [data-thread-skin="digichat"][data-scrollbars="always"] .dc-composer-menu-body,
383
+ [data-thread-skin="digichat"][data-scrollbars="always"] [data-slot="reasoning-text"],
384
+ [data-thread-skin="digichat"][data-scrollbars="always"] [data-slot="composer-trigger-popover-items"] {
385
+ scrollbar-width: none;
386
+ }
387
+
388
+ [data-thread-skin="digichat"][data-scrollbars="always"] [data-slot="aui_thread-viewport"]::-webkit-scrollbar,
389
+ [data-thread-skin="digichat"][data-scrollbars="always"] .dc-composer-menu-body::-webkit-scrollbar,
390
+ [data-thread-skin="digichat"][data-scrollbars="always"] [data-slot="reasoning-text"]::-webkit-scrollbar,
391
+ [data-thread-skin="digichat"][data-scrollbars="always"] [data-slot="composer-trigger-popover-items"]::-webkit-scrollbar {
392
+ display: none;
393
+ width: 0;
394
+ height: 0;
395
+ }
396
+
397
+ .aui-overlay-scroll {
398
+ position: absolute;
399
+ top: 0;
400
+ right: 2px;
401
+ bottom: 0;
402
+ z-index: 5;
403
+ pointer-events: none;
404
+ }
405
+
406
+ .aui-overlay-thumb {
407
+ position: absolute;
408
+ right: 0;
409
+ left: 0;
410
+ border-radius: 0;
411
+ background: color-mix(in oklab, var(--ink-mute) 32%, transparent);
412
+ pointer-events: auto;
413
+ }
414
+
415
+ .aui-overlay-thumb:hover {
416
+ background: color-mix(in oklab, var(--ink-mute) 48%, transparent);
417
+ }
418
+
419
+ .dc-composer-menu-scroll {
420
+ position: absolute;
421
+ top: 0;
422
+ right: 2px;
423
+ bottom: 0;
424
+ width: 6px;
425
+ pointer-events: none;
426
+ }
427
+
428
+ .dc-composer-menu-thumb {
429
+ position: absolute;
430
+ right: 0;
431
+ width: 6px;
432
+ border-radius: 0;
433
+ background: color-mix(in oklab, var(--ink-mute) 32%, transparent);
434
+ pointer-events: auto;
435
+ }
436
+
437
+ .dc-composer-menu-thumb:hover {
438
+ background: color-mix(in oklab, var(--ink-mute) 48%, transparent);
439
+ }
440
+
441
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-composer-input {
442
+ font-family: var(--font-mono);
443
+ font-size: var(--dc-composer-fs);
444
+ line-height: var(--dc-composer-line);
445
+ padding-block: var(--dc-composer-pad-y);
446
+ min-height: calc(var(--dc-composer-line) + (2 * var(--dc-composer-pad-y)));
447
+ color: var(--ink);
448
+ field-sizing: content;
449
+ /* Long input wraps and the box grows to 5 rows, then scrolls (the old
450
+ overflow:hidden clipped everything past max-height with no scroll). */
451
+ max-height: calc(
452
+ var(--dc-composer-rows) * var(--dc-composer-line) + (2 * var(--dc-composer-pad-y))
453
+ );
454
+ overflow-x: hidden;
455
+ overflow-y: auto;
456
+ white-space: pre-wrap;
457
+ overflow-wrap: break-word;
458
+ box-sizing: border-box;
459
+ /* Wordmark cursor: a bar at text height, not a full-line block (the
460
+ block read as a too-tall column in the single-row composer). */
461
+ caret-color: transparent;
462
+ }
463
+
464
+ /* Painted block caret on every engine: the native caret goes transparent
465
+ and the overlay span tracks it, so the block is text-height and centred
466
+ rather than the full line box. */
467
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-block-caret {
468
+ display: none;
469
+ }
470
+
471
+ /* Composer footer: plain text, no rule and no boxes. Shows the selected
472
+ model, its provider and the last turn's context size. The model is the
473
+ only control and opens the settings menu. */
474
+ /* The text box is a complete box; the info row sits below it with the same
475
+ inline padding as the input text, not tucked under a missing edge. */
476
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="aui_composer-toolbar"] {
477
+ margin-top: 0.4rem;
478
+ padding-inline: var(--dc-composer-inset-x);
479
+ }
480
+ /* Send is as pale as an unlit context cell until there is text; enabled
481
+ brightens, hover brightens again. */
482
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-composer-send:disabled {
483
+ color: color-mix(in oklab, var(--ink-mute) 22%, transparent);
484
+ }
485
+
486
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-composer-send:not(:disabled) {
487
+ color: var(--ink-soft);
488
+ }
489
+
490
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-composer-send:not(:disabled):hover,
491
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-composer-send:not(:disabled):focus-visible {
492
+ color: var(--ink);
493
+ }
494
+
495
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-context-meter {
496
+ display: inline-flex;
497
+ align-items: center;
498
+ gap: 1px;
499
+ }
500
+
501
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-context-meter-wrap {
502
+ position: relative;
503
+ display: inline-flex;
504
+ align-items: center;
505
+ }
506
+
507
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-context-meter {
508
+ outline: none;
509
+ }
510
+
511
+ /* Hover/focus legend, opening upward from the bar. */
512
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-context-card {
513
+ display: none;
514
+ position: absolute;
515
+ right: 0;
516
+ bottom: calc(100% + 8px);
517
+ z-index: 30;
518
+ width: max-content;
519
+ min-width: 10.5rem;
520
+ max-width: 16rem;
521
+ padding: 0.45rem 0.55rem;
522
+ box-sizing: border-box;
523
+ background: var(--bg);
524
+ border: 1px solid var(--hair);
525
+ box-shadow: 0 4px 16px rgb(0 0 0 / 35%);
526
+ font-family: var(--font-mono);
527
+ font-size: 0.64rem;
528
+ line-height: 1.55;
529
+ color: var(--ink-soft);
530
+ }
531
+
532
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-context-meter-wrap:hover .aui-context-card,
533
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-context-meter-wrap:focus-within .aui-context-card {
534
+ display: block;
535
+ }
536
+
537
+ /* Breakdown bar: the 5×5 grid stretched to a row, segmented by type. */
538
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-context-card-bar {
539
+ display: flex;
540
+ gap: 1px;
541
+ margin: 0.3rem 0 0.35rem;
542
+ }
543
+
544
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-context-bar-cell {
545
+ width: 4px;
546
+ height: 6px;
547
+ background: color-mix(in oklab, var(--ink-mute) 14%, transparent);
548
+ }
549
+
550
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-context-bar-cell.is-system,
551
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-context-swatch.is-system {
552
+ background: var(--ink);
553
+ }
554
+
555
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-context-bar-cell.is-tools,
556
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-context-swatch.is-tools {
557
+ background: color-mix(in oklab, var(--ink) 60%, transparent);
558
+ }
559
+
560
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-context-bar-cell.is-user,
561
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-context-swatch.is-user {
562
+ background: color-mix(in oklab, var(--ink) 35%, transparent);
563
+ }
564
+
565
+ /* Usage meter: the gate's turn budget in the same cube bar. It fills with
566
+ the used fraction — empty for a fresh visitor, full for a spent budget —
567
+ so it reads the way the context bar reads. */
568
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-usage-meter .aui-context-bar-cell.is-usage {
569
+ background: var(--ink);
570
+ }
571
+
572
+ /* The fill scale both bars share: amber past half spent, orange past four
573
+ fifths, red past nine tenths. Scoped to the lit cells so an unlit grid
574
+ stays quiet, and to the bar itself so the legend swatches keep the
575
+ colours that explain the context split. */
576
+ :is(.aui-theme-stage, [data-thread-skin="digichat"])
577
+ .aui-context-meter-wrap.is-warn
578
+ .aui-context-meter
579
+ > .aui-context-bar-cell:is(.is-system, .is-tools, .is-user, .is-usage) {
580
+ background: var(--warn);
581
+ }
582
+
583
+ :is(.aui-theme-stage, [data-thread-skin="digichat"])
584
+ .aui-context-meter-wrap.is-hot
585
+ .aui-context-meter
586
+ > .aui-context-bar-cell:is(.is-system, .is-tools, .is-user, .is-usage) {
587
+ background: color-mix(in oklab, var(--warn) 45%, var(--danger));
588
+ }
589
+
590
+ :is(.aui-theme-stage, [data-thread-skin="digichat"])
591
+ .aui-context-meter-wrap.is-critical
592
+ .aui-context-meter
593
+ > .aui-context-bar-cell:is(.is-system, .is-tools, .is-user, .is-usage) {
594
+ background: var(--danger);
595
+ }
596
+
597
+ /* The number in the card takes the tone of the bar it describes. */
598
+ :is(.aui-theme-stage, [data-thread-skin="digichat"])
599
+ .aui-context-meter-wrap.is-critical
600
+ .aui-context-card-total
601
+ > span:last-child {
602
+ color: var(--danger);
603
+ }
604
+
605
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-context-legend {
606
+ display: inline-flex;
607
+ align-items: center;
608
+ gap: 0.3rem;
609
+ }
610
+
611
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-context-swatch {
612
+ display: inline-block;
613
+ width: 5px;
614
+ height: 5px;
615
+ }
616
+
617
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-context-card-row {
618
+ display: flex;
619
+ justify-content: space-between;
620
+ gap: 0.75rem;
621
+ white-space: nowrap;
622
+ }
623
+
624
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-context-card-row > span {
625
+ min-width: 0;
626
+ }
627
+
628
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-context-card-row > span:last-child {
629
+ overflow: hidden;
630
+ text-overflow: ellipsis;
631
+ color: var(--ink);
632
+ }
633
+
634
+ /* The branding line takes the same tone as an unlit context cell. */
635
+ .aui-skin-credit {
636
+ color: color-mix(in oklab, var(--ink-mute) 22%, transparent);
637
+ }
638
+
639
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-composer-toolbar-inner {
640
+ display: flex;
641
+ flex-wrap: wrap;
642
+ align-items: center;
643
+ gap: 0.32rem;
644
+ font-family: var(--font-mono);
645
+ font-size: var(--dc-text-xs, 0.68rem);
646
+ line-height: 1.25;
647
+ color: color-mix(in oklab, var(--ink-soft) 72%, transparent);
648
+ }
649
+
650
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-composer-meta {
651
+ color: inherit;
652
+ white-space: nowrap;
653
+ }
654
+
655
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-composer-meta-action {
656
+ border: 0;
657
+ background: transparent;
658
+ padding: 0;
659
+ font: inherit;
660
+ color: inherit;
661
+ cursor: pointer;
662
+ }
663
+
664
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-composer-meta-action:hover,
665
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-composer-meta-action:focus-visible {
666
+ text-decoration: none;
667
+ outline: none;
668
+ }
669
+
670
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-composer-meta-sep {
671
+ color: color-mix(in oklab, var(--ink-soft) 55%, transparent);
672
+ }
673
+
674
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-composer-meta-spacer {
675
+ flex: 1 1 auto;
676
+ }
677
+
678
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-composer-context {
679
+ font-variant-numeric: tabular-nums;
680
+ }
681
+
682
+ /* Painted block caret on every engine: a text-height block centred in the
683
+ line (the native block is the full 22px line and reads too tall). The
684
+ native caret is transparent; block-caret.tsx tracks and paints this one. */
685
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-composer-input {
686
+ caret-color: transparent !important;
687
+ }
688
+
689
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-block-caret {
690
+ --caret-pad-left: 0.375rem;
691
+ display: none;
692
+ position: absolute;
693
+ width: 1ch;
694
+ height: 1em;
695
+ left: calc(var(--caret-col, 0) * 1ch + var(--caret-pad-left));
696
+ top: calc(var(--caret-row, 0) * var(--dc-composer-line) + var(--caret-pad-top, 0px));
697
+ background: var(--ink);
698
+ font-family: var(--font-mono);
699
+ font-size: var(--dc-composer-fs);
700
+ pointer-events: none;
701
+ animation: aui-caret-blink 1.06s steps(1) infinite;
702
+ }
703
+
704
+ /* Paint the fake caret only while the composer input is actually focused;
705
+ an unfocused textbox must not look like it has a caret. */
706
+ :is(.aui-theme-stage, [data-thread-skin="digichat"])
707
+ .aui-composer-input:focus
708
+ + .aui-block-caret,
709
+ :is(.aui-theme-stage, [data-thread-skin="digichat"])
710
+ .aui-composer-input-wrap:focus-within
711
+ .aui-block-caret {
712
+ display: block;
713
+ }
714
+
715
+ :is(.aui-theme-stage, [data-thread-skin="digichat"])
716
+ [data-layout="expanded"]
717
+ .aui-block-caret {
718
+ --caret-pad-left: var(--dc-composer-inset-x);
719
+ --caret-pad-top: var(--dc-composer-pad-y);
720
+ }
721
+
722
+ @media (prefers-reduced-motion: reduce) {
723
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-block-caret {
724
+ animation: none;
725
+ }
726
+ }
727
+
728
+ @keyframes aui-caret-blink {
729
+ 0%,
730
+ 49% {
731
+ opacity: 1;
732
+ }
733
+ 50%,
734
+ 100% {
735
+ opacity: 0;
736
+ }
737
+ }
738
+
739
+ /* Placeholder may not wrap (that inflated empty height). Do not lock a
740
+ shorter height than the typed one-line box — :placeholder-shown
741
+ height: 1.375rem !important was the first-keystroke jump. */
742
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-composer-input:placeholder-shown,
743
+ .digichat-launcher .aui-composer-input:placeholder-shown {
744
+ overflow: hidden;
745
+ white-space: nowrap;
746
+ }
747
+
748
+ .digichat-launcher .aui-composer-input {
749
+ line-height: var(--dc-composer-line, 1.375rem);
750
+ padding-block: var(--dc-composer-pad-y, 0.2rem);
751
+ min-height: calc(
752
+ var(--dc-composer-line, 1.375rem) + (2 * var(--dc-composer-pad-y, 0.2rem))
753
+ );
754
+ field-sizing: content;
755
+ overflow: hidden;
756
+ box-sizing: border-box;
757
+ }
758
+
759
+ .digichat-launcher .aui-composer-input:placeholder-shown::placeholder {
760
+ overflow: hidden;
761
+ text-overflow: ellipsis;
762
+ white-space: nowrap;
763
+ }
764
+
765
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-composer-input::placeholder {
766
+ color: var(--ink-mute);
767
+ }
768
+
769
+ /* Compact / popup: one text row until a newline. Override registry min-h-7,
770
+ leading-7, gap-2, and --composer-padding: 8px. Empty and one-line typed
771
+ share min-height: 1lh — do not shorten :placeholder-shown. */
772
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="aui_composer-shell"][data-layout="compact"],
773
+ .digichat-launcher [data-slot="aui_composer-shell"][data-layout="compact"] {
774
+ --composer-padding: 0.25rem;
775
+ gap: 0;
776
+ padding: var(--dc-composer-pad, 0.25rem 0.375rem);
777
+ }
778
+
779
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="aui_composer-shell"][data-layout="compact"] .aui-composer-main,
780
+ .digichat-launcher [data-slot="aui_composer-shell"][data-layout="compact"] .aui-composer-main {
781
+ align-items: center;
782
+ gap: var(--dc-composer-gap, 0.25rem);
783
+ }
784
+
785
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="aui_composer-shell"][data-layout="compact"] .aui-composer-input,
786
+ .digichat-launcher [data-slot="aui_composer-shell"][data-layout="compact"] .aui-composer-input {
787
+ box-sizing: border-box;
788
+ field-sizing: content;
789
+ min-height: 1lh;
790
+ padding-block: 0;
791
+ line-height: var(--dc-composer-line, 1.375rem);
792
+ overflow-x: hidden;
793
+ overflow-y: hidden;
794
+ }
795
+
796
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="aui_composer-shell"][data-layout="compact"] .aui-composer-input:placeholder-shown,
797
+ .digichat-launcher [data-slot="aui_composer-shell"][data-layout="compact"] .aui-composer-input:placeholder-shown {
798
+ /* Same 1lh as a typed one-line. field-sizing: content + nowrap fills
799
+ max-height (4.5rem in the launcher) while empty. */
800
+ field-sizing: fixed;
801
+ height: 1lh;
802
+ min-height: 1lh;
803
+ max-height: 1lh;
804
+ white-space: nowrap;
805
+ overflow: hidden;
806
+ text-overflow: ellipsis;
807
+ }
808
+
809
+ /* web-theme.css paints :focus-visible as a 2px offset box. Do not. */
810
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-composer-input:focus,
811
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-composer-input:focus-visible,
812
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-edit-composer-input:focus,
813
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-edit-composer-input:focus-visible {
814
+ outline: none;
815
+ box-shadow: none;
816
+ }
817
+
818
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-edit-composer-root {
819
+ border: none;
820
+ background: transparent;
821
+ box-shadow: none;
822
+ }
823
+
824
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-edit-composer-input {
825
+ font-family: var(--font-mono);
826
+ font-size: var(--dc-composer-fs);
827
+ color: var(--ink);
828
+ caret-color: var(--ink);
829
+ caret-shape: block;
830
+ }
831
+
832
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="aui_composer-shell"] {
833
+ border-color: var(--hair);
834
+ --composer-bg: transparent;
835
+ background: transparent;
836
+ }
837
+
838
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="aui_composer-shell"]:focus-within {
839
+ border-color: var(--hair);
840
+ }
841
+
842
+ /* Cube chrome: no fill. Disabled cubes stay mute; enabled a bit brighter;
843
+ hover / focus only brightens the cubes — never a white keycap.
844
+ Composer dropzone is cursor-text; clickable cubes must not inherit it. */
845
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) :is(
846
+ .aui-thread-welcome-suggestion,
847
+ .aui-composer-send,
848
+ .aui-composer-cancel,
849
+ .aui-composer-add-attachment,
850
+ .aui-composer-dictate,
851
+ .aui-thread-scroll-to-bottom,
852
+ .aui-assistant-action-bar-root button,
853
+ .aui-branch-picker-root button,
854
+ .aui-user-action-bar-root button,
855
+ .aui-code-header-root button,
856
+ .aui-attachment-chip-remove,
857
+ .aui-chrome-thread-list-new,
858
+ .aui-chrome-thread-list-item
859
+ ),
860
+ .digichat-launcher :is(
861
+ .aui-thread-welcome-suggestion,
862
+ .aui-composer-send,
863
+ .aui-composer-cancel,
864
+ .aui-composer-add-attachment,
865
+ .aui-composer-dictate,
866
+ .aui-thread-scroll-to-bottom,
867
+ .aui-assistant-action-bar-root button,
868
+ .aui-branch-picker-root button,
869
+ .aui-user-action-bar-root button,
870
+ .aui-code-header-root button,
871
+ .aui-attachment-chip-remove,
872
+ .digichat-launcher__close,
873
+ .digichat-launcher__new
874
+ ) {
875
+ cursor: pointer;
876
+ }
877
+
878
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) :is(
879
+ .aui-composer-send,
880
+ .aui-composer-cancel,
881
+ .aui-composer-add-attachment,
882
+ .aui-composer-dictate,
883
+ .aui-thread-scroll-to-bottom,
884
+ .aui-assistant-action-bar-root button,
885
+ .aui-branch-picker-root button,
886
+ .aui-user-action-bar-root button,
887
+ .aui-code-header-root button,
888
+ .aui-attachment-chip-remove
889
+ ),
890
+ .digichat-launcher :is(
891
+ .aui-composer-send,
892
+ .aui-composer-cancel,
893
+ .aui-composer-add-attachment,
894
+ .aui-composer-dictate,
895
+ .aui-thread-scroll-to-bottom,
896
+ .aui-assistant-action-bar-root button,
897
+ .aui-branch-picker-root button,
898
+ .aui-user-action-bar-root button,
899
+ .aui-code-header-root button,
900
+ .aui-attachment-chip-remove,
901
+ .digichat-launcher__close,
902
+ .digichat-launcher__new
903
+ ) {
904
+ background: transparent;
905
+ background-color: transparent;
906
+ box-shadow: none;
907
+ color: var(--ink-mute);
908
+ animation: none;
909
+ }
910
+
911
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) :is(
912
+ .aui-composer-send,
913
+ .aui-composer-cancel,
914
+ .aui-composer-dictate,
915
+ .aui-thread-scroll-to-bottom,
916
+ .aui-assistant-action-bar-root button,
917
+ .aui-branch-picker-root button,
918
+ .aui-user-action-bar-root button,
919
+ .aui-code-header-root button,
920
+ .aui-attachment-chip-remove
921
+ ):hover,
922
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) :is(
923
+ .aui-composer-send,
924
+ .aui-composer-cancel,
925
+ .aui-composer-dictate,
926
+ .aui-thread-scroll-to-bottom,
927
+ .aui-assistant-action-bar-root button,
928
+ .aui-branch-picker-root button,
929
+ .aui-user-action-bar-root button,
930
+ .aui-code-header-root button,
931
+ .aui-attachment-chip-remove
932
+ ):focus-visible,
933
+ .digichat-launcher :is(
934
+ .aui-composer-send,
935
+ .aui-composer-cancel,
936
+ .aui-composer-dictate,
937
+ .aui-thread-scroll-to-bottom,
938
+ .aui-assistant-action-bar-root button,
939
+ .aui-branch-picker-root button,
940
+ .aui-user-action-bar-root button,
941
+ .aui-code-header-root button,
942
+ .aui-attachment-chip-remove
943
+ ):hover,
944
+ .digichat-launcher :is(
945
+ .aui-composer-send,
946
+ .aui-composer-cancel,
947
+ .aui-composer-dictate,
948
+ .aui-thread-scroll-to-bottom,
949
+ .aui-assistant-action-bar-root button,
950
+ .aui-branch-picker-root button,
951
+ .aui-user-action-bar-root button,
952
+ .aui-code-header-root button,
953
+ .aui-attachment-chip-remove
954
+ ):focus-visible {
955
+ background: transparent;
956
+ background-color: transparent;
957
+ box-shadow: none;
958
+ color: var(--ink);
959
+ }
960
+
961
+ /* Chrome cubes inherit the button color. The global `[data-slot="dot-matrix"]
962
+ { color: var(--ink) }` otherwise paints attach with the same --ink as
963
+ `caret-color` / `caret-shape: block` on `.aui-composer-input`, so the
964
+ blinking block caret and the plus cubes pulse together. */
965
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) :is(
966
+ .aui-composer-send,
967
+ .aui-composer-cancel,
968
+ .aui-composer-add-attachment,
969
+ .aui-composer-dictate,
970
+ .aui-thread-scroll-to-bottom,
971
+ .aui-assistant-action-bar-root button,
972
+ .aui-branch-picker-root button,
973
+ .aui-user-action-bar-root button,
974
+ .aui-code-header-root button,
975
+ .aui-attachment-chip-remove
976
+ ) [data-slot="dot-matrix"],
977
+ .digichat-launcher :is(
978
+ .aui-composer-send,
979
+ .aui-composer-cancel,
980
+ .aui-composer-add-attachment,
981
+ .aui-composer-dictate,
982
+ .aui-thread-scroll-to-bottom,
983
+ .aui-assistant-action-bar-root button,
984
+ .aui-branch-picker-root button,
985
+ .aui-user-action-bar-root button,
986
+ .aui-code-header-root button,
987
+ .aui-attachment-chip-remove,
988
+ .digichat-launcher__close
989
+ ) [data-slot="dot-matrix"] {
990
+ color: inherit;
991
+ animation: none;
992
+ }
993
+
994
+ /* Attach stays mute unless hovered or pressed — not :focus-within / caret. */
995
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-composer-add-attachment,
996
+ .digichat-launcher .aui-composer-add-attachment {
997
+ position: relative;
998
+ z-index: 1;
999
+ color: var(--ink-mute);
1000
+ caret-color: transparent;
1001
+ animation: none;
1002
+ }
1003
+
1004
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-composer-add-attachment:hover,
1005
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-composer-add-attachment:active,
1006
+ .digichat-launcher .aui-composer-add-attachment:hover,
1007
+ .digichat-launcher .aui-composer-add-attachment:active {
1008
+ background: transparent;
1009
+ color: var(--ink);
1010
+ }
1011
+
1012
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="aui_composer-shell"]:focus-within .aui-composer-add-attachment,
1013
+ .digichat-launcher [data-slot="aui_composer-shell"]:focus-within .aui-composer-add-attachment {
1014
+ color: var(--ink-mute);
1015
+ animation: none;
1016
+ }
1017
+
1018
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-composer-input,
1019
+ .digichat-launcher .aui-composer-input {
1020
+ cursor: text;
1021
+ /* Vertical scroll once the box hits its 5-row max-height. */
1022
+ overflow-x: hidden;
1023
+ overflow-y: auto;
1024
+ }
1025
+
1026
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-composer-send {
1027
+ border: 0;
1028
+ opacity: 1;
1029
+ }
1030
+
1031
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-composer-send:disabled {
1032
+ color: color-mix(in oklab, var(--ink-mute) 22%, transparent);
1033
+ opacity: 1;
1034
+ }
1035
+
1036
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-composer-send:not(:disabled) {
1037
+ background: transparent;
1038
+ color: var(--ink-soft);
1039
+ border-color: transparent;
1040
+ }
1041
+
1042
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-composer-send:not(:disabled):hover,
1043
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-composer-send:not(:disabled):focus-visible {
1044
+ background: transparent;
1045
+ color: var(--ink);
1046
+ }
1047
+
1048
+ .aui-theme-stage[data-composer-layout="compact"] {
1049
+ height: min(52vh, 34rem);
1050
+ }
1051
+
1052
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-composer-cancel {
1053
+ background: transparent;
1054
+ color: var(--ink-mute);
1055
+ }
1056
+
1057
+ /* Increment 4 — transcript. ChatMessage grammar: both left. User keeps
1058
+ the `>` cube; assistant has no role mark. */
1059
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-msg {
1060
+ align-items: flex-start;
1061
+ }
1062
+
1063
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-msg-marker {
1064
+ display: inline-flex;
1065
+ align-items: center;
1066
+ justify-content: center;
1067
+ width: var(--dc-marker-w);
1068
+ margin-top: var(--dc-marker-offset);
1069
+ color: var(--ink);
1070
+ user-select: none;
1071
+ }
1072
+
1073
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-thread-welcome-suggestion .aui-msg-marker {
1074
+ margin-top: 0.12rem;
1075
+ }
1076
+
1077
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-thread-welcome-suggestion-mark,
1078
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-thread-followup-suggestion-mark {
1079
+ color: var(--ink-mute);
1080
+ }
1081
+
1082
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-thread-followup-suggestion {
1083
+ display: inline-flex;
1084
+ align-items: center;
1085
+ gap: 0.4rem;
1086
+ }
1087
+
1088
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-user-message-content {
1089
+ font-family: var(--font-mono);
1090
+ font-size: 0.88rem;
1091
+ line-height: var(--density-leading, 1.6);
1092
+ letter-spacing: var(--density-tracking, 0em);
1093
+ color: var(--ink);
1094
+ white-space: pre-wrap;
1095
+ background: transparent;
1096
+ padding: 0;
1097
+ }
1098
+
1099
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-assistant-message-content,
1100
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-assistant-message-content .aui-md {
1101
+ font-family: var(--font-mono);
1102
+ font-size: 0.88rem;
1103
+ line-height: var(--density-leading, 1.6);
1104
+ letter-spacing: var(--density-tracking, 0em);
1105
+ color: var(--ink-soft);
1106
+ /* Outside markers / fence frames paint in padding. A y-scroll viewport
1107
+ computes overflow-x to auto and would clip hanging ink. */
1108
+ overflow: visible;
1109
+ }
1110
+
1111
+ /* DENSITY: the assistant turn is one flex stack. Reasoning, tool groups and the
1112
+ answer are spaced by this gap — no element in here carries a stack margin. */
1113
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-assistant-message-content {
1114
+ display: flex;
1115
+ flex-direction: column;
1116
+ gap: var(--density-gap-2, 0.5rem);
1117
+ }
1118
+
1119
+ /* The answer's own outer margins would land on top of that gap, so the stack
1120
+ owns the edges and markdown only spaces its internal blocks. */
1121
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-assistant-message-content .aui-md > :first-child {
1122
+ margin-top: 0;
1123
+ }
1124
+
1125
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-assistant-message-content .aui-md > :last-child {
1126
+ margin-bottom: 0;
1127
+ }
1128
+
1129
+ /* Markdown stream cursor: block bar, same as the composer caret. */
1130
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) :where(.aui-md[data-status="running"]):empty::after,
1131
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) :where(.aui-md[data-status="running"])
1132
+ > :where(:not(ol):not(ul):not(pre)):last-child::after,
1133
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) :where(.aui-md[data-status="running"]) > pre:last-child code::after,
1134
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) :where(.aui-md[data-status="running"])
1135
+ > :where(:is(ol, ul):last-child)
1136
+ > :where(li:last-child:not(:has(* > li)))::after,
1137
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) :where(.aui-md[data-status="running"])
1138
+ > :where(:is(ol, ul):last-child)
1139
+ > :where(li:last-child)
1140
+ > :where(:is(ol, ul):last-child)
1141
+ > :where(li:last-child:not(:has(* > li)))::after,
1142
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) :where(.aui-md[data-status="running"])
1143
+ > :where(:is(ol, ul):last-child)
1144
+ > :where(li:last-child)
1145
+ > :where(:is(ol, ul):last-child)
1146
+ > :where(li:last-child)
1147
+ > :where(:is(ol, ul):last-child)
1148
+ > :where(li:last-child)::after {
1149
+ --aui-content: none;
1150
+ content: "";
1151
+ display: inline-block;
1152
+ width: 0.48em;
1153
+ height: 1em;
1154
+ margin-left: 0.12em;
1155
+ margin-right: 0;
1156
+ vertical-align: -0.12em;
1157
+ background: var(--ink);
1158
+ font-family: inherit;
1159
+ animation: aui-msg-caret-blink 1.1s steps(1) infinite;
1160
+ }
1161
+
1162
+ @keyframes aui-msg-caret-blink {
1163
+ 50% {
1164
+ opacity: 0;
1165
+ }
1166
+ }
1167
+
1168
+ @media (prefers-reduced-motion: reduce) {
1169
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) :where(.aui-md[data-status="running"]):empty::after,
1170
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) :where(.aui-md[data-status="running"])
1171
+ > :where(:not(ol):not(ul):not(pre)):last-child::after,
1172
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) :where(.aui-md[data-status="running"]) > pre:last-child code::after,
1173
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) :where(.aui-md[data-status="running"])
1174
+ > :where(:is(ol, ul):last-child)
1175
+ > :where(li:last-child:not(:has(* > li)))::after,
1176
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) :where(.aui-md[data-status="running"])
1177
+ > :where(:is(ol, ul):last-child)
1178
+ > :where(li:last-child)
1179
+ > :where(:is(ol, ul):last-child)
1180
+ > :where(li:last-child:not(:has(* > li)))::after,
1181
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) :where(.aui-md[data-status="running"])
1182
+ > :where(:is(ol, ul):last-child)
1183
+ > :where(li:last-child)
1184
+ > :where(:is(ol, ul):last-child)
1185
+ > :where(li:last-child)
1186
+ > :where(:is(ol, ul):last-child)
1187
+ > :where(li:last-child)::after {
1188
+ animation: none;
1189
+ }
1190
+ }
1191
+
1192
+ /* Increment 6 — cube matrix. Snap on/off; color by data-state. */
1193
+ :is(.aui-theme-stage, [data-thread-skin="digichat"], .cube-matrix-legend) [data-slot="dot-matrix"] {
1194
+ color: var(--ink);
1195
+ vertical-align: -0.15em;
1196
+ }
1197
+
1198
+ :is(.aui-theme-stage, [data-thread-skin="digichat"], .cube-matrix-legend) [data-slot="dot-matrix"][data-state="idle"] {
1199
+ color: var(--ink-mute);
1200
+ }
1201
+
1202
+ :is(.aui-theme-stage, [data-thread-skin="digichat"], .cube-matrix-legend) [data-slot="dot-matrix"][data-state="warning"] {
1203
+ color: var(--warn);
1204
+ }
1205
+
1206
+ :is(.aui-theme-stage, [data-thread-skin="digichat"], .cube-matrix-legend) [data-slot="dot-matrix"][data-state="error"] {
1207
+ color: var(--danger);
1208
+ }
1209
+
1210
+ :is(.aui-theme-stage, [data-thread-skin="digichat"], .cube-matrix-legend) [data-slot="dot-matrix"][data-state="success"] {
1211
+ color: var(--up);
1212
+ }
1213
+
1214
+ :is(.aui-theme-stage, [data-thread-skin="digichat"], .cube-matrix-legend) [data-slot="dot-matrix"] {
1215
+ position: relative;
1216
+ }
1217
+
1218
+ :is(.aui-theme-stage, [data-thread-skin="digichat"], .cube-matrix-legend) [data-slot="dot-matrix-grid"] {
1219
+ display: block;
1220
+ width: 100%;
1221
+ height: 100%;
1222
+ max-width: 100%;
1223
+ max-height: 100%;
1224
+ overflow: visible;
1225
+ }
1226
+
1227
+ /* Unlit cells are omitted from the SVG. Only lit cubes paint — no grid. */
1228
+ :is(.aui-theme-stage, [data-thread-skin="digichat"], .cube-matrix-legend) [data-slot="dot-matrix-dot"] {
1229
+ stroke: none;
1230
+ }
1231
+
1232
+ /* Status glyphs only. The disclosure caret is nested, and stays 0.55rem. */
1233
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="aui_work-status-marker"] [data-slot="dot-matrix"],
1234
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="tool-fallback-trigger"] > [data-slot="dot-matrix"],
1235
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-message-error-root [data-slot="dot-matrix"],
1236
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="reasoning-trigger"] [data-slot="dot-matrix"] {
1237
+ /* 12px marker: loading-row.source.test.ts pins these two declarations. */
1238
+ width: 0.75rem;
1239
+ height: 0.75rem;
1240
+ }
1241
+
1242
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-attachment-chip [data-slot="dot-matrix"] {
1243
+ width: var(--dc-icon-lg);
1244
+ height: var(--dc-icon-lg);
1245
+ }
1246
+
1247
+ /* ── The one loading row (#4459) ───────────────────────────────────────────
1248
+ The pre-response loader and the Working / Worked header are the same row
1249
+ (`.aui-work-status` + `WorkStatusLead`): a 12px marker, mono 0.7rem,
1250
+ `--ink-mute`, flush left, 0.45rem to the label. The handoff changes the
1251
+ words in `aui_work-status-label`; the marker does not move. */
1252
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="aui_assistant-message-indicator"].aui-work-status,
1253
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="aui_work-chain-trigger"].aui-work-status {
1254
+ display: flex;
1255
+ box-sizing: border-box;
1256
+ width: fit-content;
1257
+ max-width: 100%;
1258
+ align-items: center;
1259
+ justify-content: flex-start;
1260
+ /* gap + font-size stay literal: loading-row.source.test.ts and
1261
+ trace-spacing.source.test.ts pin this shared row box. */
1262
+ gap: 0.45rem;
1263
+ margin: 0;
1264
+ padding: 0;
1265
+ border: 0;
1266
+ background: transparent;
1267
+ box-shadow: none;
1268
+ appearance: none;
1269
+ font-family: var(--font-mono);
1270
+ font-size: 0.7rem;
1271
+ font-weight: 400;
1272
+ line-height: 1;
1273
+ letter-spacing: 0.02em;
1274
+ color: var(--ink-mute);
1275
+ text-align: start;
1276
+ min-height: var(--dc-icon);
1277
+ }
1278
+
1279
+ /* The pre-response row must not be shoved down when the work chain mounts.
1280
+ The assistant content is a flex column with a 0.5rem gap, and the chain's
1281
+ part comes before the indicator in the message stream: the moment the chain
1282
+ mounts it becomes the first flow child and the gap alone pushes the marker
1283
+ down by 8px — the visible jump at the handoff, before any tool row settles.
1284
+ Pin the row to the content's top edge and keep the content's height while
1285
+ the row is on its own, so the chain grows underneath the marker and the
1286
+ swap moves nothing (#4459). Scoped to the digichat skin: the base skin
1287
+ renders the indicator without the `hasContent` guard, so overlaying it
1288
+ there would hide a live chain trigger. */
1289
+ [data-thread-skin="digichat"]
1290
+ [data-slot="aui_assistant-message-content"]:has(
1291
+ > [data-slot="aui_assistant-message-indicator"]
1292
+ ) {
1293
+ position: relative;
1294
+ min-height: 0.75rem;
1295
+ }
1296
+
1297
+ [data-thread-skin="digichat"]
1298
+ [data-slot="aui_assistant-message-content"]
1299
+ > [data-slot="aui_assistant-message-indicator"] {
1300
+ position: absolute;
1301
+ inset-block-start: 0;
1302
+ inset-inline-start: 0;
1303
+ margin: 0;
1304
+ }
1305
+
1306
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="aui_work-status-marker"] {
1307
+ display: inline-flex;
1308
+ width: var(--dc-icon);
1309
+ height: var(--dc-icon);
1310
+ flex: 0 0 var(--dc-icon);
1311
+ align-items: center;
1312
+ justify-content: center;
1313
+ }
1314
+
1315
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="aui_work-status-marker"] [data-slot="dot-matrix"] {
1316
+ width: var(--dc-icon);
1317
+ height: var(--dc-icon);
1318
+ }
1319
+
1320
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="aui_work-status-label"] {
1321
+ flex: 0 1 auto;
1322
+ min-width: 0;
1323
+ margin: 0;
1324
+ padding: 0;
1325
+ font-size: inherit;
1326
+ font-weight: 400;
1327
+ line-height: inherit;
1328
+ letter-spacing: inherit;
1329
+ color: inherit;
1330
+ }
1331
+
1332
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-message-error-root {
1333
+ align-items: flex-start;
1334
+ gap: var(--dc-gap-2);
1335
+ /* DIG-4459: boxed and red-tinted like other chat products; the shared
1336
+ .aui-chat-notice rules below carry the box. */
1337
+ color: var(--ink-soft);
1338
+ font-family: var(--font-mono);
1339
+ font-size: var(--dc-text-sm, 0.7rem);
1340
+ line-height: 1.35;
1341
+ letter-spacing: 0.02em;
1342
+ }
1343
+
1344
+ /* The row is muted like the rest of the trace; the red cross and the retry
1345
+ action carry the failure. */
1346
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-message-error-root .aui-message-error-message {
1347
+ color: inherit;
1348
+ }
1349
+
1350
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-message-error-root [data-slot="dot-matrix"] {
1351
+ margin-top: 0.12rem;
1352
+ }
1353
+
1354
+ .cube-matrix-legend-groups {
1355
+ display: flex;
1356
+ flex-direction: column;
1357
+ gap: 1.1rem;
1358
+ }
1359
+
1360
+ .cube-matrix-legend {
1361
+ display: flex;
1362
+ flex-wrap: wrap;
1363
+ gap: 1.25rem 1.5rem;
1364
+ margin: 1.3rem 0 0;
1365
+ padding: 0;
1366
+ list-style: none;
1367
+ }
1368
+
1369
+ .cube-matrix-legend-groups .cube-matrix-legend:first-child {
1370
+ margin-top: 1.3rem;
1371
+ }
1372
+
1373
+ .cube-matrix-legend-groups .cube-matrix-legend + .cube-matrix-legend {
1374
+ margin-top: 0;
1375
+ padding-top: 1.1rem;
1376
+ border-top: 1px solid var(--hair);
1377
+ }
1378
+
1379
+ .cube-matrix-legend-item {
1380
+ display: flex;
1381
+ width: 4.75rem;
1382
+ flex-direction: column;
1383
+ align-items: center;
1384
+ gap: 0.45rem;
1385
+ }
1386
+
1387
+ .cube-matrix-legend [data-slot="dot-matrix"] {
1388
+ width: 1.75rem;
1389
+ height: 1.75rem;
1390
+ }
1391
+
1392
+ .cube-matrix-legend-caption {
1393
+ font-family: var(--font-mono);
1394
+ font-size: var(--dc-text-xs, 0.68rem);
1395
+ letter-spacing: 0.06em;
1396
+ text-transform: lowercase;
1397
+ color: var(--ink-mute);
1398
+ }
1399
+
1400
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-assistant-action-bar-root button,
1401
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-user-action-bar-root button,
1402
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-branch-picker-root button {
1403
+ color: var(--ink-mute);
1404
+ }
1405
+
1406
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-assistant-action-bar-root button:hover,
1407
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-user-action-bar-root button:hover,
1408
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-branch-picker-root button:hover,
1409
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-branch-picker-root button:focus-visible,
1410
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-assistant-action-bar-root button[data-state="open"] {
1411
+ background: transparent;
1412
+ color: var(--ink);
1413
+ }
1414
+
1415
+ /* Portaled More menu sits outside .aui-root. html:has() so catalog skins
1416
+ keep their own menus when product imports this sheet. */
1417
+ :is(html:has(.aui-theme-stage), html:has([data-thread-skin="digichat"])) .aui-action-bar-more-content {
1418
+ border-radius: 0;
1419
+ border: 1px solid var(--hair);
1420
+ background: var(--bg);
1421
+ color: var(--ink-mute);
1422
+ box-shadow: none;
1423
+ }
1424
+
1425
+ :is(html:has(.aui-theme-stage), html:has([data-thread-skin="digichat"])) .aui-composer-trigger-popover {
1426
+ border-radius: 0;
1427
+ border: 1px solid var(--hair);
1428
+ background: var(--bg);
1429
+ color: var(--ink);
1430
+ box-shadow: none;
1431
+ }
1432
+
1433
+ :is(html:has(.aui-theme-stage), html:has([data-thread-skin="digichat"])) .aui-action-bar-more-item {
1434
+ border-radius: 0;
1435
+ font-family: var(--font-mono);
1436
+ font-size: var(--dc-text-xs, 0.68rem);
1437
+ line-height: 1.3;
1438
+ color: var(--ink-mute);
1439
+ background: transparent;
1440
+ }
1441
+
1442
+ :is(html:has(.aui-theme-stage), html:has([data-thread-skin="digichat"])) .aui-action-bar-more-item:hover,
1443
+ :is(html:has(.aui-theme-stage), html:has([data-thread-skin="digichat"])) .aui-action-bar-more-item:focus,
1444
+ :is(html:has(.aui-theme-stage), html:has([data-thread-skin="digichat"])) .aui-action-bar-more-item:focus-visible,
1445
+ :is(html:has(.aui-theme-stage), html:has([data-thread-skin="digichat"])) .aui-action-bar-more-item[data-highlighted],
1446
+ :is(html:has(.aui-theme-stage), html:has([data-thread-skin="digichat"])) .aui-action-bar-more-item[data-state="open"] {
1447
+ background: transparent;
1448
+ background-color: transparent;
1449
+ color: var(--ink);
1450
+ outline: none;
1451
+ box-shadow: none;
1452
+ }
1453
+
1454
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-composer-trigger-popover,
1455
+ :is(html:has(.aui-theme-stage), html:has([data-thread-skin="digichat"])) .aui-composer-trigger-popover {
1456
+ border-radius: 0;
1457
+ border: 1px solid var(--hair);
1458
+ background: var(--bg);
1459
+ color: var(--ink);
1460
+ box-shadow: none;
1461
+ font-family: var(--font-mono);
1462
+ }
1463
+
1464
+ /* The highlighted row, in the slash palette and on every composer menu page
1465
+ (data-cursor), is marked by one lighter wash mixed from the menu's own
1466
+ colours, the same as the other skins (chat-skin-palette.css). --accent is
1467
+ not used: brand accents repoint it to a saturated colour. */
1468
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-composer-trigger-popover [data-highlighted],
1469
+ :is(html:has(.aui-theme-stage), html:has([data-thread-skin="digichat"])) .aui-composer-trigger-popover [data-highlighted],
1470
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .dc-composer-menu [data-cursor="true"],
1471
+ :is(html:has(.aui-theme-stage), html:has([data-thread-skin="digichat"])) .dc-composer-menu [data-cursor="true"] {
1472
+ background: color-mix(in oklab, var(--ink) 9%, var(--bg));
1473
+ color: var(--ink);
1474
+ outline: none;
1475
+ }
1476
+
1477
+ /* Selected row: a 3x3 cube diamond, the same grid motif as the context
1478
+ meter, instead of the dropdown radio disc. */
1479
+ .aui-menu-mark {
1480
+ display: grid;
1481
+ grid-template-columns: repeat(3, 2px);
1482
+ grid-auto-rows: 2px;
1483
+ gap: 1px;
1484
+ }
1485
+
1486
+ .aui-menu-mark-cell {
1487
+ background: color-mix(in oklab, var(--ink-mute) 22%, transparent);
1488
+ }
1489
+
1490
+ .aui-menu-mark-cell.is-on {
1491
+ background: currentColor;
1492
+ }
1493
+
1494
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-embed-settings],
1495
+ :is(html:has(.aui-theme-stage), html:has([data-thread-skin="digichat"])) [data-embed-settings],
1496
+ [data-thread-skin="digichat"][data-embed-settings],
1497
+ :is(html:has(.aui-theme-stage), html:has([data-thread-skin="digichat"])) .dc-composer-menu {
1498
+ border-radius: 0;
1499
+ border-color: var(--hair);
1500
+ background: var(--bg);
1501
+ color: var(--ink);
1502
+ box-shadow: none;
1503
+ font-family: var(--font-mono);
1504
+ backdrop-filter: none;
1505
+ -webkit-backdrop-filter: none;
1506
+ }
1507
+
1508
+ /* App chrome clears --bg on the thread and the footer so those surfaces sit
1509
+ on the canvas. Both command lists are positioned inside that footer, so
1510
+ var(--bg) is transparent and the welcome paints through every list, not
1511
+ only /theme. --term-bg is the canvas colour and is not cleared. Gallery
1512
+ and embed keep the var(--bg) rule above. */
1513
+ [data-stock-product][data-thread-skin="digichat"][data-chrome-mode="app"] .aui-composer-trigger-popover,
1514
+ [data-stock-product][data-thread-skin="digichat"][data-chrome-mode="app"] .dc-composer-menu {
1515
+ background: var(--term-bg);
1516
+ }
1517
+
1518
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-embed-settings] h2,
1519
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-embed-settings] label,
1520
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-embed-settings] button,
1521
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-embed-settings] p {
1522
+ font-family: var(--font-mono);
1523
+ color: var(--ink);
1524
+ }
1525
+
1526
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-embed-settings] select {
1527
+ border-radius: 0;
1528
+ border-color: var(--hair);
1529
+ background: var(--bg);
1530
+ color: var(--ink);
1531
+ font-family: var(--font-mono);
1532
+ }
1533
+
1534
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-user-action-bar-slot {
1535
+ width: 1.5rem;
1536
+ min-height: 1.5rem;
1537
+ }
1538
+ /* Increment 5 — reasoning. Ghost disclosure, square caret, hairline rail.
1539
+ The disclosure keeps the upstream 200ms collapse: switching it off made the
1540
+ chain snap shut between two tool calls. */
1541
+
1542
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="reasoning-trigger"] {
1543
+ max-width: none;
1544
+ /* The row hugs its content: a button is centred by default, which is what
1545
+ put the title in the middle and the arrow at the far edge. */
1546
+ width: fit-content;
1547
+ text-align: left;
1548
+ align-items: center;
1549
+ gap: var(--dc-gap-2);
1550
+ padding: 0;
1551
+ font-family: var(--font-mono);
1552
+ font-size: var(--dc-text-sm, 0.7rem);
1553
+ letter-spacing: 0.02em;
1554
+ color: var(--ink-mute);
1555
+ text-transform: lowercase;
1556
+ outline: none;
1557
+ box-shadow: none;
1558
+ transform: none;
1559
+ transition: none;
1560
+ }
1561
+
1562
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="reasoning-trigger"]:active,
1563
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="tool-fallback-trigger"]:active {
1564
+ transform: none;
1565
+ }
1566
+
1567
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="reasoning-trigger"]:hover {
1568
+ color: var(--ink-soft);
1569
+ }
1570
+
1571
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="reasoning-trigger"]:focus,
1572
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="reasoning-trigger"]:focus-visible {
1573
+ outline: none;
1574
+ box-shadow: none;
1575
+ }
1576
+
1577
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-reasoning-trigger-icon {
1578
+ display: inline-flex;
1579
+ width: var(--dc-icon);
1580
+ height: var(--dc-icon);
1581
+ flex-shrink: 0;
1582
+ }
1583
+
1584
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="reasoning-trigger"],
1585
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="tool-group-trigger"] {
1586
+ /* The trace is one voice: the same mono, the same size, the same muted ink
1587
+ on the chain header, the reasoning row, the tool-group row and the tool
1588
+ rows. */
1589
+ width: fit-content;
1590
+ max-width: 100%;
1591
+ text-align: left;
1592
+ align-items: center;
1593
+ gap: var(--dc-gap-2);
1594
+ padding: 0;
1595
+ font-family: var(--font-mono);
1596
+ font-size: var(--dc-text-sm, 0.7rem);
1597
+ letter-spacing: 0.02em;
1598
+ color: var(--ink-mute);
1599
+ text-transform: lowercase;
1600
+ outline: none;
1601
+ box-shadow: none;
1602
+ }
1603
+
1604
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="reasoning-trigger-label"],
1605
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="tool-group-trigger-label"] {
1606
+ flex: 0 1 auto;
1607
+ min-width: 0;
1608
+ background: none;
1609
+ animation: none;
1610
+ font-size: inherit;
1611
+ font-weight: 400;
1612
+ color: inherit;
1613
+ }
1614
+
1615
+ /* Same caret on every trace disclosure. Closed points right. Open rotates
1616
+ the cube svg only (`dot-matrix-grid`), and only when this row's trigger
1617
+ is open. The wrapper and its screen-reader name stay put: a transform on
1618
+ either turns the words. */
1619
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="disclosure-chevron"] {
1620
+ display: inline-flex;
1621
+ position: relative;
1622
+ /* Width/height stay literal: disclosure-chevron.source.test.ts pins them. */
1623
+ width: 0.55rem;
1624
+ height: 0.55rem;
1625
+ flex: 0 0 0.55rem;
1626
+ align-items: center;
1627
+ justify-content: center;
1628
+ color: inherit;
1629
+ transform: none;
1630
+ animation: none;
1631
+ }
1632
+
1633
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="disclosure-chevron"] [data-slot="dot-matrix"] {
1634
+ width: var(--dc-chevron);
1635
+ height: var(--dc-chevron);
1636
+ max-width: var(--dc-chevron);
1637
+ max-height: var(--dc-chevron);
1638
+ transform: none;
1639
+ animation: none;
1640
+ }
1641
+
1642
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="disclosure-chevron"] [data-slot="dot-matrix-grid"] {
1643
+ display: block;
1644
+ width: 100%;
1645
+ height: 100%;
1646
+ max-width: 100%;
1647
+ max-height: 100%;
1648
+ transform: rotate(0deg);
1649
+ transform-origin: 50% 50%;
1650
+ transition: transform 150ms ease;
1651
+ animation: none;
1652
+ }
1653
+
1654
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [aria-expanded="true"] > [data-slot="disclosure-chevron"] [data-slot="dot-matrix-grid"],
1655
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-panel-open] > [data-slot="disclosure-chevron"] [data-slot="dot-matrix-grid"],
1656
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-state="open"] > [data-slot="disclosure-chevron"] [data-slot="dot-matrix-grid"] {
1657
+ transform: rotate(90deg);
1658
+ }
1659
+
1660
+ @media (prefers-reduced-motion: reduce) {
1661
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="disclosure-chevron"] [data-slot="dot-matrix-grid"] {
1662
+ transition: none;
1663
+ }
1664
+ }
1665
+
1666
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="reasoning-content"],
1667
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="tool-fallback-content"],
1668
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="tool-fallback-content"] > div,
1669
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="reasoning-text"] {
1670
+ animation: none;
1671
+ transition: none;
1672
+ }
1673
+
1674
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="tool-group-trigger"] {
1675
+ gap: var(--dc-chip-gap);
1676
+ padding: 0;
1677
+ font-family: var(--font-mono);
1678
+ font-size: 0.7rem;
1679
+ letter-spacing: calc(var(--density-tracking-mono, 0.01em) + 0.01em);
1680
+ color: var(--ink-mute);
1681
+ text-transform: lowercase;
1682
+ outline: none;
1683
+ box-shadow: none;
1684
+ transform: none;
1685
+ }
1686
+
1687
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="tool-group-trigger"]:hover {
1688
+ color: var(--ink-soft);
1689
+ }
1690
+
1691
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="tool-group-trigger-loader"] {
1692
+ display: inline-flex;
1693
+ width: var(--dc-icon);
1694
+ height: var(--dc-icon);
1695
+ align-items: center;
1696
+ justify-content: center;
1697
+ overflow: hidden;
1698
+ }
1699
+
1700
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="tool-group-trigger-loader"] [data-slot="dot-matrix"],
1701
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="tool-group-trigger-loader"] [data-slot="dot-matrix-grid"] {
1702
+ width: var(--dc-icon);
1703
+ height: var(--dc-icon);
1704
+ max-width: var(--dc-icon);
1705
+ max-height: var(--dc-icon);
1706
+ }
1707
+
1708
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="tool-group-trigger-label"] {
1709
+ font-weight: 400;
1710
+ }
1711
+
1712
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="reasoning-fade"] {
1713
+ display: none;
1714
+ }
1715
+
1716
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="reasoning-content"] {
1717
+ font-size: 0.68rem;
1718
+ line-height: var(--density-leading-tight, 1.4);
1719
+ letter-spacing: var(--density-tracking-mono, 0.01em);
1720
+ color: var(--ink-mute);
1721
+ }
1722
+
1723
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="reasoning-text"] {
1724
+ max-height: 12rem;
1725
+ /* DENSITY: the header/body relationship is one gap (header-gap alias), and
1726
+ `padding-block` below is the only vertical padding the body gets. */
1727
+ margin-top: var(--trace-header-gap, 0.25rem);
1728
+ padding-block: var(--trace-body-pad, 0.125rem);
1729
+ padding-inline: var(--trace-body-indent, 0.75rem) 0;
1730
+ border-left: 1px solid var(--hair);
1731
+ font-family: var(--font-mono);
1732
+ font-size: 0.68rem;
1733
+ line-height: var(--density-leading-tight, 1.4);
1734
+ letter-spacing: var(--density-tracking-mono, 0.01em);
1735
+ color: var(--ink-mute);
1736
+ }
1737
+
1738
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="reasoning-text"] .aui-md,
1739
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="reasoning-text"] .aui-reasoning-text-content {
1740
+ font-size: 0.68rem;
1741
+ line-height: var(--density-leading-tight, 1.4);
1742
+ letter-spacing: var(--density-tracking-mono, 0.01em);
1743
+ color: var(--ink-mute);
1744
+ }
1745
+
1746
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="reasoning-text"] .aui-reasoning-text-content > * + * {
1747
+ margin-top: var(--density-gap-1, 0.25rem);
1748
+ }
1749
+
1750
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="reasoning-text"] .aui-reasoning-text-content > :first-child {
1751
+ margin-top: 0;
1752
+ }
1753
+
1754
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="reasoning-text"] .aui-reasoning-text-content > :last-child {
1755
+ margin-bottom: 0;
1756
+ }
1757
+
1758
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="aui_work-chain-trigger"] {
1759
+ /* Box metrics live on `.aui-work-status`, shared with the pre-response
1760
+ loader. This only adds the header's own voice. */
1761
+ text-transform: lowercase;
1762
+ outline: none;
1763
+ cursor: pointer;
1764
+ }
1765
+
1766
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="aui_work-chain-trigger"]:hover {
1767
+ color: var(--ink-soft);
1768
+ }
1769
+
1770
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="tool-fallback-trigger"] {
1771
+ align-items: center;
1772
+ width: fit-content;
1773
+ text-align: left;
1774
+ gap: 0.45rem;
1775
+ padding: 0;
1776
+ font-family: var(--font-mono);
1777
+ font-size: 0.7rem;
1778
+ letter-spacing: calc(var(--density-tracking-mono, 0.01em) + 0.01em);
1779
+ color: var(--ink-mute);
1780
+ transform: none;
1781
+ transition: none;
1782
+ }
1783
+
1784
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="tool-fallback-trigger"]:hover {
1785
+ color: var(--ink-soft);
1786
+ }
1787
+
1788
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="tool-fallback-trigger-label"] {
1789
+ flex: 0 1 auto;
1790
+ min-width: 0;
1791
+ font-weight: 400;
1792
+ font-size: inherit;
1793
+ padding-top: 0;
1794
+ }
1795
+
1796
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="tool-fallback-duration"] {
1797
+ font-family: var(--font-mono);
1798
+ font-size: var(--dc-text-xs, 0.68rem);
1799
+ color: var(--ink-mute);
1800
+ }
1801
+
1802
+ /* The tool chain's flex rhythm lives once, in chat-aui.css. This sheet keeps
1803
+ only the skin's own voice for the fallback body. */
1804
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="tool-fallback-content"] {
1805
+ font-size: var(--dc-text-xs, 0.68rem);
1806
+ color: var(--ink-mute);
1807
+ }
1808
+
1809
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="tool-fallback-result"],
1810
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="tool-fallback-error"] {
1811
+ border-top: 1px solid var(--hair);
1812
+ }
1813
+
1814
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-tool-fallback-args-header,
1815
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-tool-fallback-result-header,
1816
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-tool-fallback-error-header {
1817
+ margin: 0;
1818
+ font-family: var(--font-mono);
1819
+ font-size: var(--dc-text-xs, 0.68rem);
1820
+ font-weight: 400;
1821
+ letter-spacing: calc(var(--density-tracking-mono, 0.01em) + 0.03em);
1822
+ text-transform: lowercase;
1823
+ color: var(--ink-mute);
1824
+ }
1825
+
1826
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-tool-fallback-args-value,
1827
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-tool-fallback-result-content,
1828
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-tool-fallback-error-reason,
1829
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="tool-fallback-dump"] {
1830
+ margin: 0;
1831
+ background: transparent;
1832
+ padding: 0;
1833
+ border: none;
1834
+ border-radius: 0;
1835
+ font-family: var(--font-mono);
1836
+ font-size: 0.68rem;
1837
+ line-height: var(--density-leading-tight, 1.4);
1838
+ letter-spacing: var(--density-tracking-mono, 0.01em);
1839
+ color: var(--ink-soft);
1840
+ /* DIG-4459: arguments are never cut; long ones scroll inside an 18rem
1841
+ area (no expand button). */
1842
+ overflow: auto;
1843
+ overscroll-behavior: contain;
1844
+ scrollbar-width: thin;
1845
+ }
1846
+
1847
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="tool-fallback-dump"] {
1848
+ max-height: var(--dc-dump-max-h);
1849
+ }
1850
+
1851
+ /* Increment 7 — markdown / code. Hairline frames, no card wash.
1852
+ DENSITY: block rhythm reads the gap scale, so paragraph/list spacing scales
1853
+ with the mode instead of pinning one rem value for every density. */
1854
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-md-h1,
1855
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-md-h2,
1856
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-md-h3,
1857
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-md-h4,
1858
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-md-h5,
1859
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-md-h6 {
1860
+ margin-top: var(--density-gap-2, 0.5rem);
1861
+ margin-bottom: var(--density-gap-1, 0.25rem);
1862
+ font-size: inherit;
1863
+ font-weight: 500;
1864
+ color: var(--ink);
1865
+ }
1866
+
1867
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-md-p {
1868
+ margin-top: var(--density-gap-2, 0.5rem);
1869
+ margin-bottom: var(--density-gap-2, 0.5rem);
1870
+ line-height: var(--density-leading, 1.6);
1871
+ letter-spacing: var(--density-tracking, 0em);
1872
+ }
1873
+
1874
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-md-li {
1875
+ line-height: var(--density-leading, 1.6);
1876
+ letter-spacing: var(--density-tracking, 0em);
1877
+ }
1878
+
1879
+ /* One li gap, from the list's own stack — not from a `[&>li]:mt-1` utility. */
1880
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-md-li + .aui-md-li {
1881
+ margin-top: var(--density-gap-1, 0.25rem);
1882
+ }
1883
+
1884
+ /* Tailwind preflight zeroes ul/ol padding. `ms-*` leaves outside markers in
1885
+ the margin, which a scrollport + content-visibility paint containment clip
1886
+ (ol digits gone, ul discs nicked). Keep markers in padding. */
1887
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-md-ul,
1888
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-md-ol {
1889
+ margin-block: var(--density-gap-2, 0.5rem);
1890
+ margin-inline-start: 0;
1891
+ /* Indents stay literal: gallery-thread.source.test.ts pins the source text. */
1892
+ padding-inline-start: 1.75rem;
1893
+ list-style-position: outside;
1894
+ }
1895
+
1896
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-md-ul {
1897
+ list-style-type: disc;
1898
+ }
1899
+
1900
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-md-ol {
1901
+ padding-inline-start: 2rem;
1902
+ list-style-type: decimal;
1903
+ }
1904
+
1905
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-md-a {
1906
+ color: var(--ink-soft);
1907
+ text-decoration-color: var(--hair-2);
1908
+ }
1909
+
1910
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-md-a:hover {
1911
+ color: var(--ink);
1912
+ }
1913
+
1914
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-md-blockquote {
1915
+ margin: var(--density-gap-2, 0.5rem) 0;
1916
+ padding: 0 0 0 0.85rem;
1917
+ border: none;
1918
+ border-left: 1px solid var(--hair);
1919
+ color: var(--ink-mute);
1920
+ }
1921
+
1922
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-md-strong {
1923
+ font-weight: 500;
1924
+ color: var(--ink);
1925
+ }
1926
+
1927
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-code-header-root {
1928
+ margin-top: var(--density-gap-2, 0.5rem);
1929
+ padding: 0.3rem 0.55rem;
1930
+ border: 1px solid var(--hair);
1931
+ border-bottom: none;
1932
+ border-radius: 0;
1933
+ background: transparent;
1934
+ }
1935
+
1936
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-code-header-language {
1937
+ font-family: var(--font-mono);
1938
+ font-size: var(--dc-text-xs, 0.68rem);
1939
+ font-weight: 400;
1940
+ letter-spacing: calc(var(--density-tracking-mono, 0.01em) + 0.05em);
1941
+ color: var(--ink-mute);
1942
+ }
1943
+
1944
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-code-header-root button,
1945
+ .digichat-launcher .aui-code-header-root button {
1946
+ color: var(--ink-mute);
1947
+ }
1948
+
1949
+ /* Fence copy is a cube, not a keycap — hover only brightens, no wash. */
1950
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-code-header-root button:hover,
1951
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-code-header-root button:focus-visible,
1952
+ .digichat-launcher .aui-code-header-root button:hover,
1953
+ .digichat-launcher .aui-code-header-root button:focus-visible {
1954
+ background: transparent;
1955
+ background-color: transparent;
1956
+ color: var(--ink);
1957
+ }
1958
+
1959
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-md-pre {
1960
+ margin: 0;
1961
+ padding: 0.55rem 0.65rem 0.65rem;
1962
+ border: 1px solid var(--hair);
1963
+ border-radius: 0;
1964
+ background: transparent;
1965
+ font-size: 0.78rem;
1966
+ line-height: var(--density-leading-tight, 1.4);
1967
+ letter-spacing: var(--density-tracking-mono, 0.01em);
1968
+ color: var(--ink-soft);
1969
+ max-width: 100%;
1970
+ overflow-x: auto;
1971
+ }
1972
+
1973
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-md-inline-code {
1974
+ padding: 0 0.2em;
1975
+ border: 1px solid var(--hair);
1976
+ border-radius: 0;
1977
+ background: transparent;
1978
+ font-size: 0.92em;
1979
+ color: var(--ink);
1980
+ }
1981
+
1982
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-md-table-wrapper {
1983
+ margin: var(--density-gap-2, 0.5rem) 0;
1984
+ max-width: 100%;
1985
+ overflow-x: auto;
1986
+ }
1987
+
1988
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-md-th {
1989
+ padding: var(--density-gap-1, 0.25rem) 0.7rem var(--density-gap-1, 0.25rem) 0;
1990
+ border: none;
1991
+ border-bottom: 1px solid var(--hair);
1992
+ border-radius: 0;
1993
+ background: transparent;
1994
+ font-weight: 400;
1995
+ font-size: 0.68rem;
1996
+ letter-spacing: calc(var(--density-tracking-mono, 0.01em) + 0.03em);
1997
+ text-transform: lowercase;
1998
+ color: var(--ink-mute);
1999
+ }
2000
+
2001
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-md-td {
2002
+ padding: var(--density-gap-1, 0.25rem) 0.7rem var(--density-gap-1, 0.25rem) 0;
2003
+ border: none;
2004
+ border-bottom: 1px solid var(--hair);
2005
+ line-height: var(--density-leading, 1.6);
2006
+ color: var(--ink-soft);
2007
+ }
2008
+
2009
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-md-th:last-child,
2010
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-md-td:last-child {
2011
+ padding-right: 0;
2012
+ }
2013
+
2014
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-md-tr:last-child .aui-md-td {
2015
+ border-bottom: none;
2016
+ }
2017
+
2018
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-md-hr {
2019
+ border-color: var(--hair);
2020
+ }
2021
+
2022
+ /* Increment 9 — attachments. Filename chip, not a thumbnail tile. */
2023
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-attachment-chip {
2024
+ display: inline-flex;
2025
+ max-width: var(--dc-chip-max-w);
2026
+ align-items: center;
2027
+ gap: var(--dc-chip-gap);
2028
+ padding: var(--dc-chip-pad);
2029
+ border: 1px solid var(--hair);
2030
+ background: transparent;
2031
+ font-family: var(--font-mono);
2032
+ font-size: var(--dc-chip-fs);
2033
+ line-height: 1.3;
2034
+ color: var(--ink-soft);
2035
+ }
2036
+
2037
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-attachment-chip-hit {
2038
+ display: inline-flex;
2039
+ min-width: 0;
2040
+ outline: none;
2041
+ }
2042
+
2043
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-attachment-chip-name {
2044
+ color: var(--ink-soft);
2045
+ }
2046
+
2047
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-attachment-chip-type::before {
2048
+ content: "· ";
2049
+ color: var(--ink-mute);
2050
+ }
2051
+
2052
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-attachment-chip-type {
2053
+ color: var(--ink-mute);
2054
+ }
2055
+
2056
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-attachment-chip-remove {
2057
+ display: inline-flex;
2058
+ flex-shrink: 0;
2059
+ align-items: center;
2060
+ justify-content: center;
2061
+ padding: 0;
2062
+ border: 0;
2063
+ background: transparent;
2064
+ color: var(--ink-mute);
2065
+ cursor: pointer;
2066
+ }
2067
+
2068
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-attachment-chip-remove:hover {
2069
+ color: var(--ink);
2070
+ }
2071
+
2072
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-attachment-root.is-error .aui-attachment-chip {
2073
+ border-color: var(--danger);
2074
+ color: var(--danger);
2075
+ }
2076
+
2077
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-composer-add-attachment:hover,
2078
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-composer-add-attachment:active {
2079
+ background: transparent;
2080
+ color: var(--ink);
2081
+ }
2082
+
2083
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="aui_composer-shell"][data-dragging="true"] {
2084
+ border-style: dashed;
2085
+ border-color: var(--hair);
2086
+ background: transparent;
2087
+ }
2088
+
2089
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-user-message-attachments {
2090
+ margin-bottom: 0.35rem;
2091
+ }
2092
+
2093
+ /* Portaled image preview sits outside .aui-root. */
2094
+ :is(html:has(.aui-theme-stage), html:has([data-thread-skin="digichat"])) .aui-attachment-preview-dialog-content {
2095
+ border-radius: 0;
2096
+ border: 1px solid var(--hair);
2097
+ background: var(--bg);
2098
+ box-shadow: none;
2099
+ padding: 0.55rem;
2100
+ }
2101
+
2102
+ :is(html:has(.aui-theme-stage), html:has([data-thread-skin="digichat"])) .aui-attachment-preview-dialog-content [data-slot="dialog-close"] {
2103
+ border-radius: 0;
2104
+ background: transparent;
2105
+ color: var(--ink-mute);
2106
+ box-shadow: none;
2107
+ opacity: 1;
2108
+ }
2109
+
2110
+ :is(html:has(.aui-theme-stage), html:has([data-thread-skin="digichat"])) .aui-attachment-preview-dialog-content [data-slot="dialog-close"]:hover {
2111
+ background: color-mix(in srgb, var(--ink) 8%, transparent);
2112
+ color: var(--ink);
2113
+ }
2114
+
2115
+ :is(html:has(.aui-theme-stage), html:has([data-thread-skin="digichat"])) [data-slot="dialog-overlay"] {
2116
+ background: color-mix(in srgb, var(--ink) 28%, transparent);
2117
+ }
2118
+
2119
+ /* Increment 10 — chrome. Desk list + contained launcher. */
2120
+ .aui-theme-stage.aui-chrome-desk {
2121
+ height: min(72vh, 46rem);
2122
+ }
2123
+
2124
+ .aui-chrome-desk-split {
2125
+ display: grid;
2126
+ grid-template-columns: var(--dc-sidebar-w, 11.5rem) minmax(0, 1fr);
2127
+ height: 100%;
2128
+ min-height: 0;
2129
+ }
2130
+
2131
+ .aui-chrome-thread-list {
2132
+ display: flex;
2133
+ min-width: 0;
2134
+ min-height: 0;
2135
+ flex-direction: column;
2136
+ border-right: 1px solid var(--hair);
2137
+ background: var(--bg);
2138
+ }
2139
+
2140
+ .aui-chrome-thread-list-head {
2141
+ display: flex;
2142
+ flex-shrink: 0;
2143
+ align-items: center;
2144
+ justify-content: space-between;
2145
+ gap: var(--dc-gap-2, 0.45rem);
2146
+ padding: var(--dc-gap-1, 0.55rem) var(--dc-list-pad-x, 0.7rem);
2147
+ border-bottom: 1px solid var(--hair);
2148
+ }
2149
+
2150
+ .aui-chrome-thread-list-label {
2151
+ font-family: var(--font-mono);
2152
+ font-size: var(--dc-label-fs, 0.62rem);
2153
+ letter-spacing: 0.06em;
2154
+ text-transform: lowercase;
2155
+ color: var(--ink-mute);
2156
+ }
2157
+
2158
+ .aui-chrome-thread-list-new {
2159
+ padding: 0;
2160
+ border: 0;
2161
+ background: transparent;
2162
+ font-family: var(--font-mono);
2163
+ font-size: var(--dc-chrome-fs, 0.66rem);
2164
+ letter-spacing: 0.02em;
2165
+ color: var(--ink-mute);
2166
+ cursor: pointer;
2167
+ }
2168
+
2169
+ .aui-chrome-thread-list-new:hover {
2170
+ color: var(--ink);
2171
+ }
2172
+
2173
+ .aui-chrome-thread-list-root {
2174
+ display: flex;
2175
+ min-height: 0;
2176
+ flex: 1;
2177
+ flex-direction: column;
2178
+ overflow-y: auto;
2179
+ padding: 0.25rem 0;
2180
+ }
2181
+
2182
+ .aui-chrome-thread-list-row {
2183
+ border-radius: 0;
2184
+ }
2185
+
2186
+ .aui-chrome-thread-list-item {
2187
+ display: block;
2188
+ width: 100%;
2189
+ overflow: hidden;
2190
+ padding: 0.4rem var(--dc-list-pad-x, 0.7rem);
2191
+ border: 0;
2192
+ background: transparent;
2193
+ font-family: var(--font-mono);
2194
+ font-size: var(--dc-item-fs, 0.78rem);
2195
+ text-align: left;
2196
+ text-overflow: ellipsis;
2197
+ white-space: nowrap;
2198
+ color: var(--ink);
2199
+ cursor: pointer;
2200
+ }
2201
+
2202
+ .aui-chrome-thread-list-item:hover {
2203
+ background: color-mix(in srgb, var(--ink) 6%, transparent);
2204
+ }
2205
+
2206
+ .aui-chrome-thread-list-item[data-active],
2207
+ .aui-chrome-thread-list-item[data-active="true"] {
2208
+ background: color-mix(in srgb, var(--ink) 8%, transparent);
2209
+ }
2210
+
2211
+ .aui-theme-stage.aui-chrome-launcher-stage {
2212
+ position: relative;
2213
+ height: min(72vh, 46rem);
2214
+ overflow: hidden;
2215
+ }
2216
+
2217
+ .aui-theme-stage.aui-chrome-launcher-stage > .digichat-launcher {
2218
+ height: auto;
2219
+ }
2220
+
2221
+ .aui-chrome-launcher-stage .digichat-launcher__trigger {
2222
+ backdrop-filter: none;
2223
+ -webkit-backdrop-filter: none;
2224
+ background: var(--bg);
2225
+ }
2226
+
2227
+ .aui-chrome-launcher-stage .digichat-launcher__trigger:hover,
2228
+ .aui-chrome-launcher-stage .digichat-launcher__trigger:focus-visible {
2229
+ background: var(--bg);
2230
+ }
2231
+
2232
+ .aui-chrome-launcher-stage .digichat-launcher__panel {
2233
+ background: var(--bg);
2234
+ line-height: 1.45;
2235
+ }
2236
+
2237
+ .aui-chrome-launcher-stage .digichat-launcher__close svg {
2238
+ stroke-linecap: square;
2239
+ }
2240
+
2241
+ .aui-chrome-launcher-stage .digichat-launcher__body {
2242
+ background: var(--bg);
2243
+ line-height: 1.45;
2244
+ }
2245
+
2246
+ .aui-chrome-launcher-stage .digichat-launcher__body .aui-root {
2247
+ height: 100%;
2248
+ }
2249
+
2250
+ .aui-chrome-launcher-stage .aui-composer-root {
2251
+ flex: none;
2252
+ }
2253
+
2254
+ .aui-chrome-launcher-stage .aui-composer-input {
2255
+ max-height: var(--dc-launcher-composer-max-h, 4.5rem);
2256
+ }
2257
+
2258
+ /* digichat popup only — dark canvas + ink, not a light shadcn popover. */
2259
+ .digichat-launcher,
2260
+ .digichat-launcher__panel,
2261
+ .digichat-launcher__body,
2262
+ .digichat-launcher .aui-root,
2263
+ .digichat-launcher .aui-thread-viewport-footer {
2264
+ --background: var(--bg);
2265
+ --foreground: var(--ink);
2266
+ --popover: var(--bg);
2267
+ --popover-foreground: var(--ink);
2268
+ --card: var(--bg);
2269
+ --card-foreground: var(--ink);
2270
+ --composer-bg: var(--bg);
2271
+ --color-background: var(--bg);
2272
+ --color-foreground: var(--ink);
2273
+ --color-popover: var(--bg);
2274
+ --color-popover-foreground: var(--ink);
2275
+ --color-card: var(--bg);
2276
+ background: var(--bg);
2277
+ color: var(--ink);
2278
+ }
2279
+
2280
+ .digichat-launcher [data-slot="aui_composer-shell"] {
2281
+ gap: var(--dc-composer-gap, 0.25rem);
2282
+ --composer-bg: transparent;
2283
+ background: transparent;
2284
+ }
2285
+
2286
+ /* Portaled attach / more / tooltip / dialog must stack above the launcher
2287
+ pane (z-index: 70). Default shadcn / radix layers are z-50. */
2288
+ :is(html:has(.aui-theme-stage), html:has([data-thread-skin="digichat"])) [data-slot="tooltip-content"],
2289
+ :is(html:has(.aui-theme-stage), html:has([data-thread-skin="digichat"])) [data-slot="dialog-overlay"],
2290
+ :is(html:has(.aui-theme-stage), html:has([data-thread-skin="digichat"])) [data-slot="dialog-content"],
2291
+ :is(html:has(.aui-theme-stage), html:has([data-thread-skin="digichat"])) [data-slot="dropdown-menu-content"],
2292
+ :is(html:has(.aui-theme-stage), html:has([data-thread-skin="digichat"])) [data-slot="popover-content"],
2293
+ :is(html:has(.aui-theme-stage), html:has([data-thread-skin="digichat"])) .aui-action-bar-more-content,
2294
+ :is(html:has(.aui-theme-stage), html:has([data-thread-skin="digichat"])) .aui-attachment-preview-dialog-content,
2295
+ :is(html:has(.aui-theme-stage), html:has([data-thread-skin="digichat"])) .aui-composer-trigger-popover {
2296
+ z-index: 110;
2297
+ }
2298
+
2299
+ /* Isolated /chatbot gallery is monochrome. Tokens still ship teal
2300
+ --accent / --ring; portaled menus and ::selection read those from :root. */
2301
+ html:has(.aui-theme-stage) {
2302
+ --accent: var(--ink);
2303
+ --accent-weak: color-mix(in srgb, var(--ink) 14%, transparent);
2304
+ --on-accent: var(--bg);
2305
+ --color-accent: var(--ink);
2306
+ --color-accent-foreground: var(--bg);
2307
+ --color-primary: var(--ink);
2308
+ --color-primary-foreground: var(--bg);
2309
+ --color-ring: var(--ink);
2310
+ --ring: var(--ink);
2311
+ }
2312
+
2313
+ html:has(.aui-theme-stage) ::selection {
2314
+ background: color-mix(in srgb, var(--ink) 22%, transparent);
2315
+ color: var(--ink);
2316
+ }
2317
+
2318
+ html:has(.aui-theme-stage) :focus-visible {
2319
+ outline-color: var(--ink);
2320
+ }
2321
+
2322
+ /* Portals leave .aui-root. Tooltip used bg-foreground (ink) so it read as
2323
+ a white box with black text. Skin every floating layer to --bg / --ink. */
2324
+ :is(html:has(.aui-theme-stage), html:has([data-thread-skin="digichat"])) [data-slot="tooltip-content"],
2325
+ :is(html:has(.aui-theme-stage), html:has([data-thread-skin="digichat"])) [data-slot="dialog-content"],
2326
+ :is(html:has(.aui-theme-stage), html:has([data-thread-skin="digichat"])) [data-slot="dropdown-menu-content"],
2327
+ :is(html:has(.aui-theme-stage), html:has([data-thread-skin="digichat"])) [data-slot="popover-content"],
2328
+ :is(html:has(.aui-theme-stage), html:has([data-thread-skin="digichat"])) .aui-action-bar-more-content,
2329
+ :is(html:has(.aui-theme-stage), html:has([data-thread-skin="digichat"])) .aui-attachment-preview-dialog-content {
2330
+ background: var(--bg);
2331
+ color: var(--ink);
2332
+ border-color: var(--hair);
2333
+ border-radius: 0;
2334
+ box-shadow: none;
2335
+ }
2336
+
2337
+ :is(html:has(.aui-theme-stage), html:has([data-thread-skin="digichat"])) [data-slot="tooltip-content"] {
2338
+ border: 1px solid var(--hair);
2339
+ }
2340
+
2341
+ /* Product tooltip.tsx omits Arrow. Hide leftovers: Radix wraps the svg in a
2342
+ plain span (no data-radix-popper-arrow-wrapper anymore); shadcn diamonds
2343
+ use rotate-45 without "arrow" in the class name. */
2344
+ :is(html:has(.aui-theme-stage), html:has([data-thread-skin="digichat"])) [data-slot="tooltip-content"] svg,
2345
+ :is(html:has(.aui-theme-stage), html:has([data-thread-skin="digichat"])) [data-slot="tooltip-content"] [class*="arrow"],
2346
+ :is(html:has(.aui-theme-stage), html:has([data-thread-skin="digichat"])) [data-slot="tooltip-content"] [data-radix-popper-arrow-wrapper] {
2347
+ display: none;
2348
+ }
2349
+
2350
+ :is(html:has(.aui-theme-stage), html:has([data-thread-skin="digichat"])) [data-slot="tooltip-content"] ::selection,
2351
+ :is(html:has(.aui-theme-stage), html:has([data-thread-skin="digichat"])) [data-slot="dialog-content"] ::selection,
2352
+ :is(html:has(.aui-theme-stage), html:has([data-thread-skin="digichat"])) [data-slot="dropdown-menu-content"] ::selection,
2353
+ :is(html:has(.aui-theme-stage), html:has([data-thread-skin="digichat"])) [data-slot="popover-content"] ::selection,
2354
+ :is(html:has(.aui-theme-stage), html:has([data-thread-skin="digichat"])) .aui-action-bar-more-content ::selection {
2355
+ background: color-mix(in srgb, var(--ink) 22%, transparent);
2356
+ color: var(--ink);
2357
+ }
2358
+
2359
+ :is(html:has(.aui-theme-stage), html:has([data-thread-skin="digichat"])) [data-slot="dropdown-menu-content"] [role="menuitem"]:hover,
2360
+ :is(html:has(.aui-theme-stage), html:has([data-thread-skin="digichat"])) [data-slot="dropdown-menu-content"] [role="menuitem"]:focus,
2361
+ :is(html:has(.aui-theme-stage), html:has([data-thread-skin="digichat"])) [data-slot="dropdown-menu-content"] [role="menuitem"][data-highlighted],
2362
+ :is(html:has(.aui-theme-stage), html:has([data-thread-skin="digichat"])) [data-slot="popover-content"] [role="menuitem"]:hover,
2363
+ :is(html:has(.aui-theme-stage), html:has([data-thread-skin="digichat"])) [data-slot="popover-content"] [role="menuitem"][data-highlighted] {
2364
+ background: transparent;
2365
+ background-color: transparent;
2366
+ color: var(--ink);
2367
+ }
2368
+
2369
+ /* Boot handoff choreography. The stock product flips these attributes when
2370
+ the boot starts handing off (`?handoff=` lab switch) so the chat re-enters
2371
+ on the same beat instead of cutting in statically behind the overlay. */
2372
+ @keyframes dboot-handoff-in {
2373
+ from {
2374
+ opacity: 0;
2375
+ transform: translateY(8px);
2376
+ }
2377
+ to {
2378
+ opacity: 1;
2379
+ transform: none;
2380
+ }
2381
+ }
2382
+
2383
+ @keyframes dboot-handoff-drift {
2384
+ from {
2385
+ opacity: 0;
2386
+ transform: translateY(4px);
2387
+ }
2388
+ to {
2389
+ opacity: 1;
2390
+ transform: none;
2391
+ }
2392
+ }
2393
+
2394
+ /* Bottom-up entrance after the boot: composer first, then the example rows
2395
+ from the LAST one upward (nth-last-child delays so any count works), then
2396
+ the welcome body, then the welcome headline - the stack slides in from the
2397
+ bottom up. */
2398
+ [data-stock-product][data-boot-reveal="true"] .aui-composer-root {
2399
+ animation: dboot-handoff-in 320ms cubic-bezier(0.2, 0.7, 0.3, 1) both;
2400
+ }
2401
+
2402
+ [data-stock-product][data-boot-reveal="true"] .aui-thread-welcome-suggestion {
2403
+ animation: dboot-handoff-in 320ms cubic-bezier(0.2, 0.7, 0.3, 1) both;
2404
+ animation-delay: 80ms;
2405
+ }
2406
+
2407
+ [data-stock-product][data-boot-reveal="true"] .aui-thread-welcome-suggestion:nth-last-child(2) {
2408
+ animation-delay: 140ms;
2409
+ }
2410
+
2411
+ [data-stock-product][data-boot-reveal="true"] .aui-thread-welcome-suggestion:nth-last-child(3) {
2412
+ animation-delay: 200ms;
2413
+ }
2414
+
2415
+ [data-stock-product][data-boot-reveal="true"] .aui-thread-welcome-suggestion:nth-last-child(4) {
2416
+ animation-delay: 260ms;
2417
+ }
2418
+
2419
+ [data-stock-product][data-boot-reveal="true"] .aui-thread-welcome-suggestion:nth-last-child(5) {
2420
+ animation-delay: 320ms;
2421
+ }
2422
+
2423
+ [data-stock-product][data-boot-reveal="true"] .aui-thread-welcome-copy {
2424
+ animation: dboot-handoff-in 320ms cubic-bezier(0.2, 0.7, 0.3, 1) both;
2425
+ animation-delay: 420ms;
2426
+ }
2427
+
2428
+ [data-stock-product][data-boot-reveal="true"] .aui-thread-welcome-message-inner {
2429
+ animation: dboot-handoff-in 320ms cubic-bezier(0.2, 0.7, 0.3, 1) both;
2430
+ animation-delay: 500ms;
2431
+ }
2432
+
2433
+ [data-stock-product][data-boot-drift="true"] .aui-thread-empty,
2434
+ [data-stock-product][data-boot-drift="true"] .aui-composer-root {
2435
+ animation: dboot-handoff-drift 380ms cubic-bezier(0.2, 0.7, 0.3, 1) both;
2436
+ }
2437
+
2438
+ @media (prefers-reduced-motion: reduce) {
2439
+ [data-stock-product][data-boot-reveal="true"] .aui-thread-welcome-message-inner,
2440
+ [data-stock-product][data-boot-reveal="true"] .aui-thread-welcome-copy,
2441
+ [data-stock-product][data-boot-reveal="true"] .aui-thread-welcome-suggestion,
2442
+ [data-stock-product][data-boot-reveal="true"] .aui-composer-root,
2443
+ [data-stock-product][data-boot-drift="true"] .aui-thread-empty,
2444
+ [data-stock-product][data-boot-drift="true"] .aui-composer-root {
2445
+ animation: none;
2446
+ }
2447
+ }
2448
+
2449
+ /* Pre-reveal hold: until the bottom-up entrance starts, the hero pieces stay
2450
+ invisible - during the boot (and while a warm container settles) only the
2451
+ footer shows. The entrance then slides each piece in, bottom-up. */
2452
+ [data-stock-product]:not([data-boot-reveal="true"]) .aui-thread-welcome-message-inner,
2453
+ [data-stock-product]:not([data-boot-reveal="true"]) .aui-thread-welcome-copy,
2454
+ [data-stock-product]:not([data-boot-reveal="true"]) .aui-thread-welcome-suggestion,
2455
+ [data-stock-product]:not([data-boot-reveal="true"]) .aui-composer-root {
2456
+ opacity: 0;
2457
+ }
2458
+
2459
+ /* ── Chat notices (DIG-4459) ──────────────────────────────────────────────
2460
+ One box for what the backend says outside the answer: the failed turn
2461
+ (ErrorPrimitive.Root), a failed tool call (under its arguments) and a
2462
+ status line. Error is red-tinted, status neutral; both mono like the
2463
+ trace. */
2464
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-chat-notice {
2465
+ display: flex;
2466
+ align-items: flex-start;
2467
+ gap: var(--dc-gap-2);
2468
+ padding: var(--dc-gap-1) var(--dc-list-pad-x);
2469
+ border-radius: 0;
2470
+ font-family: var(--font-mono);
2471
+ font-size: var(--dc-text-sm, 0.7rem);
2472
+ line-height: 1.4;
2473
+ letter-spacing: 0.02em;
2474
+ }
2475
+
2476
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-chat-notice[data-tone="error"] {
2477
+ /* Faded red (Chris, 21 Oct): the danger hue pulled 28% toward the muted
2478
+ ink (HSL saturation 0.76 → 0.49), a 5% wash and a 24% hairline. The
2479
+ same rules serve dark and light: the vars switch per theme. */
2480
+ --notice-danger: color-mix(in srgb, var(--danger) 72%, var(--ink-mute));
2481
+ border: 1px solid color-mix(in srgb, var(--notice-danger) 24%, transparent);
2482
+ background: color-mix(in srgb, var(--notice-danger) 5%, transparent);
2483
+ color: var(--ink-soft);
2484
+ }
2485
+
2486
+ /* Title: the faded red nudged toward the ink so it clears WCAG AA on the
2487
+ wash in both themes (dark ≈ 5.9:1, light ≈ 4.7:1). */
2488
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-chat-notice[data-tone="error"] .aui-chat-notice-title {
2489
+ color: color-mix(in srgb, var(--notice-danger) 80%, var(--ink));
2490
+ }
2491
+
2492
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-chat-notice[data-tone="status"] {
2493
+ border: 1px solid var(--hair);
2494
+ background: color-mix(in oklab, var(--ink-mute) 6%, transparent);
2495
+ color: var(--ink-mute);
2496
+ }
2497
+
2498
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-chat-notice-detail {
2499
+ color: var(--ink-soft);
2500
+ font-size: var(--dc-chip-fs);
2501
+ }
2502
+
2503
+ /* Inside the tool box the notice is the last section: it keeps its tint but
2504
+ sits flush with the frame instead of floating inside it. */
2505
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="tool-fallback-error"].aui-chat-notice {
2506
+ flex-direction: row;
2507
+ border-width: 1px 0 0 0;
2508
+ }
2509
+
2510
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-json-view,
2511
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-chat-notice-detail {
2512
+ overflow: auto;
2513
+ overscroll-behavior: contain;
2514
+ max-height: var(--dc-json-max-h);
2515
+ }
2516
+
2517
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-json-key { color: color-mix(in oklab, var(--ink) 80%, #6aa9ff); }
2518
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-json-string { color: color-mix(in oklab, var(--ink-soft) 70%, #5fbf8a); }
2519
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-json-number { color: color-mix(in oklab, var(--ink-soft) 70%, #e0a84f); }
2520
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) .aui-json-literal { color: color-mix(in oklab, var(--ink-soft) 70%, #b48ef0); }
2521
+
2522
+ /* DENSITY: the assistant footer reserves the action bar's row (min-h-7.5 +
2523
+ pt-1.5, ~30px) only while it has something to show. On earlier turns the
2524
+ bar autohides (`autohide="not-last"`) and the branch picker hides on a single
2525
+ branch, so an empty footer collapses and the message-group gap alone spaces
2526
+ assistant → user. When the bar appears (hover, or always on the last turn)
2527
+ the footer takes its row back in flow, so it never overlaps the next turn. */
2528
+ :is(.aui-theme-stage, [data-thread-skin="digichat"]) [data-slot="aui_assistant-message-footer"]:not(:has(> *)) {
2529
+ min-height: 0;
2530
+ padding-top: 0;
2531
+ }