@vite-hub/ui 0.0.3 → 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 (433) hide show
  1. package/README.md +27 -7
  2. package/dist/{andromeeda-DnSv6o6l.js → andromeeda-BASpqCeJ.js} +1 -1
  3. package/dist/attachment-B3dXC7jM.js +71 -0
  4. package/dist/attachment-BBndG9_P.d.ts +88 -0
  5. package/dist/attachment.d.ts +2 -0
  6. package/dist/attachment.js +2 -0
  7. package/dist/{aurora-x-XJ5I8rFc.js → aurora-x-DugsLcii.js} +1 -1
  8. package/dist/avatar-stack-DM6HRnc0.js +63 -0
  9. package/dist/avatar-stack-DXmCQhxd.d.ts +59 -0
  10. package/dist/avatar-stack.d.ts +2 -0
  11. package/dist/avatar-stack.js +2 -0
  12. package/dist/{ayu-dark-CBRGL64-.js → ayu-dark-BT3qdi3o.js} +1 -1
  13. package/dist/{ayu-light-BlrCS3Ih.js → ayu-light-BVZyHoh9.js} +1 -1
  14. package/dist/{ayu-mirage-CqpTmLcF.js → ayu-mirage-XFwUVZQZ.js} +1 -1
  15. package/dist/bubble-BJH2rfii.d.ts +72 -0
  16. package/dist/bubble-BPyFQlW7.js +53 -0
  17. package/dist/bubble.d.ts +2 -0
  18. package/dist/bubble.js +2 -0
  19. package/dist/catppuccin-frappe-D20KODDN.js +4 -0
  20. package/dist/catppuccin-latte-eGLVHIUJ.js +4 -0
  21. package/dist/catppuccin-macchiato-bQGch4PY.js +4 -0
  22. package/dist/catppuccin-mocha-Bes8-0Mr.js +4 -0
  23. package/dist/chat-B9HlZWA2.d.ts +50 -0
  24. package/dist/chat-BoFHlu9V.js +73 -0
  25. package/dist/chat-message-BNK9G7xF.js +51 -0
  26. package/dist/chat-message-mpDmZbIC.d.ts +28 -0
  27. package/dist/chat-message.d.ts +2 -0
  28. package/dist/chat-message.js +2 -0
  29. package/dist/chat-session-D6C7VJBR.d.ts +29 -0
  30. package/dist/chat-session-DYEHB1HC.js +38 -0
  31. package/dist/chat-session.d.ts +2 -0
  32. package/dist/chat-session.js +2 -0
  33. package/dist/chat.d.ts +2 -0
  34. package/dist/chat.js +2 -0
  35. package/dist/code-block-Br-02hn-.js +139 -0
  36. package/dist/code-block.d.ts +2 -0
  37. package/dist/code-block.js +3 -0
  38. package/dist/code-view-J4OsgEdh.js +158 -0
  39. package/dist/code-view-vDM-hph-.d.ts +4091 -0
  40. package/dist/code-view.d.ts +2 -0
  41. package/dist/code-view.js +2 -0
  42. package/dist/comment-layer-CBlxJ8eK.js +1113 -0
  43. package/dist/comments-C08J3z4e.js +456 -0
  44. package/dist/comments-ChNJkV1d.d.ts +108 -0
  45. package/dist/comments-Cq5eewsu.d.ts +537 -0
  46. package/dist/comments.d.ts +2 -0
  47. package/dist/comments.js +2 -0
  48. package/dist/{config-BwhBDTjC.d.ts → config-Bux_AJzm.d.ts} +0 -1
  49. package/dist/{config-CzOjpPth.js → config-bHqE4JOs.js} +2 -7
  50. package/dist/connection-status-CzuWBENf.js +65 -0
  51. package/dist/connection-status-DjGBw6xX.d.ts +39 -0
  52. package/dist/connection-status.d.ts +2 -0
  53. package/dist/connection-status.js +2 -0
  54. package/dist/{dark-plus-BCxGtnt0.js → dark-plus-BGuiqa1B.js} +1 -1
  55. package/dist/{dracula-fPErIccy.js → dracula-0CVA2XY5.js} +1 -1
  56. package/dist/{dracula-soft-BrQbqXs8.js → dracula-soft-Dk9bpbVU.js} +1 -1
  57. package/dist/error-diagnostics-B4hMpJRL.js +13 -0
  58. package/dist/{everforest-dark-gTeBQCos.js → everforest-dark-CRjTbhh5.js} +1 -1
  59. package/dist/{everforest-light-DUjxsp-2.js → everforest-light-CEeYFLn8.js} +1 -1
  60. package/dist/file-diff.d.ts +2 -0
  61. package/dist/file-diff.js +2 -0
  62. package/dist/file-tree-C1pv4_AI.js +9307 -0
  63. package/dist/file-tree-Ctb8hZ_g.d.ts +459 -0
  64. package/dist/file-tree.d.ts +2 -0
  65. package/dist/file-tree.js +2 -0
  66. package/dist/file-view.d.ts +2 -0
  67. package/dist/file-view.js +2 -0
  68. package/dist/{getSingularPatch-D0VFiyjB.js → getSingularPatch-Dsb8EgxR.js} +191 -116
  69. package/dist/{github-dark-Dg1hl_QD.js → github-dark-BXgKmOw_.js} +1 -1
  70. package/dist/{github-dark-default-Dym2P842.js → github-dark-default-DzJQXksd.js} +1 -1
  71. package/dist/{github-dark-dimmed-7iDMx266.js → github-dark-dimmed-B1pEmGtS.js} +1 -1
  72. package/dist/{github-dark-high-contrast-DkV2fyPG.js → github-dark-high-contrast-BkHIa6jc.js} +1 -1
  73. package/dist/{github-light-BQKYgor9.js → github-light-BKRlUbaB.js} +1 -1
  74. package/dist/{github-light-default-BZhIfzqQ.js → github-light-default-BU3eYkzs.js} +1 -1
  75. package/dist/{github-light-high-contrast-C7zHfx4C.js → github-light-high-contrast-B3MumDcI.js} +1 -1
  76. package/dist/{gruvbox-dark-hard-CQiwpF03.js → gruvbox-dark-hard-B0ecF443.js} +1 -1
  77. package/dist/{gruvbox-dark-medium-BKe6XKBS.js → gruvbox-dark-medium-BQnpC39k.js} +1 -1
  78. package/dist/{gruvbox-dark-soft-Cz6U6pa4.js → gruvbox-dark-soft-DFZUgESr.js} +1 -1
  79. package/dist/{gruvbox-light-hard-DgU_i19B.js → gruvbox-light-hard-CuB_LOJr.js} +1 -1
  80. package/dist/{gruvbox-light-medium-D64I06ER.js → gruvbox-light-medium-idDHgxjs.js} +1 -1
  81. package/dist/{gruvbox-light-soft-B-YxAs1L.js → gruvbox-light-soft-CfWH49MY.js} +1 -1
  82. package/dist/headless.d.ts +14 -14
  83. package/dist/headless.js +3 -333
  84. package/dist/highlighted-code-Ck4zexJX.js +90 -0
  85. package/dist/highlighted-code-Dzf6o54i.d.ts +112 -0
  86. package/dist/{horizon-bright-CPyV7XIA.js → horizon-bright-Ba6M8QSV.js} +1 -1
  87. package/dist/{horizon-DYoumREk.js → horizon-h92C5OlZ.js} +1 -1
  88. package/dist/{houston-B3NWfq0V.js → houston-EQnPegWq.js} +1 -1
  89. package/dist/image-preview-VfknBEFu.js +102 -0
  90. package/dist/index-DcH0QSI5.d.ts +61 -0
  91. package/dist/index.d.ts +34 -6378
  92. package/dist/index.js +27 -12338
  93. package/dist/kanagawa-dragon-DgDvwi3B.js +4 -0
  94. package/dist/kanagawa-lotus-BgoQro20.js +4 -0
  95. package/dist/kanagawa-wave-DgXEowHs.js +4 -0
  96. package/dist/{laserwave-DkfjiLxA.js → laserwave-IxBH_3yW.js} +1 -1
  97. package/dist/{light-plus-DuO6rXxZ.js → light-plus-S8JBx6is.js} +1 -1
  98. package/dist/markdown-BoLBN0qH.js +197 -0
  99. package/dist/markdown-Dse5ldJe.d.ts +47 -0
  100. package/dist/markdown.d.ts +2 -0
  101. package/dist/markdown.js +2 -0
  102. package/dist/marker-Di2ZG_k1.js +23 -0
  103. package/dist/marker-ea-tvx-J.d.ts +35 -0
  104. package/dist/marker.d.ts +2 -0
  105. package/dist/marker.js +2 -0
  106. package/dist/{material-theme-C_YrwKEa.js → material-theme-D1f3HBq-.js} +1 -1
  107. package/dist/{material-theme-darker-DB3YVCla.js → material-theme-darker-ExzYhT0j.js} +1 -1
  108. package/dist/{material-theme-lighter-D2fgNrBK.js → material-theme-lighter-D6gH9nnA.js} +1 -1
  109. package/dist/{material-theme-ocean-DVy172Rs.js → material-theme-ocean-D1w5BPAa.js} +1 -1
  110. package/dist/{material-theme-palenight-uMMwIfpG.js → material-theme-palenight-CkqWmVpF.js} +1 -1
  111. package/dist/message-CW_paC1k.d.ts +35 -0
  112. package/dist/message-DiyBthIq.js +23 -0
  113. package/dist/message-parts-BBFUkluC.d.ts +28 -0
  114. package/dist/message-parts-DQnfioAH.js +38 -0
  115. package/dist/message-parts.d.ts +2 -0
  116. package/dist/message-parts.js +2 -0
  117. package/dist/message-scroller-CX6NJTdm.js +335 -0
  118. package/dist/message.d.ts +2 -0
  119. package/dist/message.js +2 -0
  120. package/dist/{min-dark-C7Ec8I_2.js → min-dark-npsJH98j.js} +1 -1
  121. package/dist/{min-light-Be6foA7m.js → min-light-DUk1XsVt.js} +1 -1
  122. package/dist/monokai-CfFRWUNl.js +4 -0
  123. package/dist/multi-file-diff.d.ts +2 -0
  124. package/dist/multi-file-diff.js +2 -0
  125. package/dist/{night-owl-CqqbiLON.js → night-owl-BS7V-av_.js} +1 -1
  126. package/dist/{night-owl-light-B9vYgGRt.js → night-owl-light-CZtRawYE.js} +1 -1
  127. package/dist/{nord-BZ9DVmcN.js → nord-BFh54Nqz.js} +1 -1
  128. package/dist/nuxt.d.ts +8 -5
  129. package/dist/nuxt.js +136 -22
  130. package/dist/one-dark-pro-zDovGosB.js +4 -0
  131. package/dist/{one-light-CzxBC38_.js → one-light-gmHK3iK6.js} +1 -1
  132. package/dist/patch-diff.d.ts +2 -0
  133. package/dist/patch-diff.js +2 -0
  134. package/dist/{pierre-code-view-DYpF5M8R.js → pierre-code-view-T7V67hwT.js} +7209 -15318
  135. package/dist/{plastic-BGkJ2das.js → plastic-DtdaCjub.js} +1 -1
  136. package/dist/{poimandres-CpnMgZuc.js → poimandres-Hdda6aHK.js} +1 -1
  137. package/dist/primitive-rail.d.ts +222 -0
  138. package/dist/primitive-rail.js +348 -0
  139. package/dist/prompt-input-BbnCb80O.js +299 -0
  140. package/dist/prompt-input-Cy_Ue6B5.d.ts +93 -0
  141. package/dist/prompt-input.d.ts +2 -0
  142. package/dist/prompt-input.js +2 -0
  143. package/dist/red-VqZFRByZ.js +4 -0
  144. package/dist/rose-pine-DiTkEueR.js +4 -0
  145. package/dist/rose-pine-dawn-tfo5y2X0.js +4 -0
  146. package/dist/rose-pine-moon-C0gON9XN.js +4 -0
  147. package/dist/runtime/nuxt-plugin.js +3 -1
  148. package/dist/runtime-type-DlCscMfw.js +59 -0
  149. package/dist/{slack-dark-BS2AOOdo.js → slack-dark-v8P_eXr6.js} +1 -1
  150. package/dist/{slack-ochin-Nc7Cucwk.js → slack-ochin-D8SyEdKz.js} +1 -1
  151. package/dist/slot-part-C7Ocxn3b.js +20 -0
  152. package/dist/{snazzy-light-C2ghKZXY.js → snazzy-light-BtkQkvXb.js} +1 -1
  153. package/dist/solarized-dark-B8nAdMfM.js +4 -0
  154. package/dist/solarized-light-B-3F1INj.js +4 -0
  155. package/dist/styles.css +2134 -2034
  156. package/dist/sync-status-BpxYdZIJ.js +48 -0
  157. package/dist/sync-status-refELOZn.d.ts +25 -0
  158. package/dist/sync-status.d.ts +2 -0
  159. package/dist/sync-status.js +2 -0
  160. package/dist/{synthwave-84-CPtGYwOz.js → synthwave-84-DcsXCF_c.js} +1 -1
  161. package/dist/{tokyo-night-BKYoawWu.js → tokyo-night-Bvpqduda.js} +1 -1
  162. package/dist/tool-list-BdSr5CT4.js +150 -0
  163. package/dist/tool-list-E7CA52rz.d.ts +31 -0
  164. package/dist/tool-list.d.ts +2 -0
  165. package/dist/tool-list.js +2 -0
  166. package/dist/trace-V7rM3Pyd.d.ts +62 -0
  167. package/dist/trace-llBCDiSW.js +70 -0
  168. package/dist/trace-run-BIQ17CED.js +98 -0
  169. package/dist/trace-run-COeXn46Z.d.ts +28 -0
  170. package/dist/trace-run.d.ts +2 -0
  171. package/dist/trace-run.js +2 -0
  172. package/dist/trace.d.ts +2 -0
  173. package/dist/trace.js +2 -0
  174. package/dist/types-CqDwuJAm.d.ts +33 -0
  175. package/dist/unresolved-file.d.ts +2 -0
  176. package/dist/unresolved-file.js +2 -0
  177. package/dist/{vesper-ClvmKzqD.js → vesper-CfxmMOy3.js} +1 -1
  178. package/dist/vite.d.ts +3 -5
  179. package/dist/{vitesse-black-BY6Qtyq-.js → vitesse-black-D9-_1mjV.js} +1 -1
  180. package/dist/{vitesse-dark-BT-v_EgR.js → vitesse-dark-DlSMLlr9.js} +1 -1
  181. package/dist/{vitesse-light-Box8ZFz6.js → vitesse-light-KRWWWztf.js} +1 -1
  182. package/package.json +176 -26
  183. package/dist/abap-LtYK6g-v.js +0 -3
  184. package/dist/actionscript-3-Czo0lKSf.js +0 -3
  185. package/dist/ada-twHwrVWN.js +0 -3
  186. package/dist/angular-html-Ct-40ew8.js +0 -33
  187. package/dist/angular-ts-D6akBVit.js +0 -27
  188. package/dist/apache-BIl2qPOf.js +0 -3
  189. package/dist/apex-BkQQFAhi.js +0 -3
  190. package/dist/apl-Cxjn4xYu.js +0 -17
  191. package/dist/applescript-CJ80B5XJ.js +0 -3
  192. package/dist/ara-IxnQjO6j.js +0 -3
  193. package/dist/asciidoc-Dsw6zvwf.js +0 -3
  194. package/dist/asm-wBDSgBbA.js +0 -3
  195. package/dist/astro-BPVTb8uX.js +0 -19
  196. package/dist/awk-D6dA05Ye.js +0 -3
  197. package/dist/ballerina-DIdXD2KH.js +0 -3
  198. package/dist/bat-hQslfzu-.js +0 -3
  199. package/dist/beancount-CXtOQ8oS.js +0 -3
  200. package/dist/berry-CgA2ea0_.js +0 -3
  201. package/dist/bibtex-BzgdqG3s.js +0 -3
  202. package/dist/bicep-CZ338dSk.js +0 -3
  203. package/dist/bird2-GLyzhwkD.js +0 -3
  204. package/dist/blade-0LMawyyw.js +0 -21
  205. package/dist/bsl-0NWGiiFE.js +0 -6
  206. package/dist/c-Dc0_AVM6.js +0 -6
  207. package/dist/c3-BLXk7BLN.js +0 -3
  208. package/dist/cadence-B1ELWULD.js +0 -3
  209. package/dist/cairo-DjG4M3vq.js +0 -6
  210. package/dist/catppuccin-frappe-COUg_LSX.js +0 -4
  211. package/dist/catppuccin-latte-r30LFfsa.js +0 -4
  212. package/dist/catppuccin-macchiato-D-EwZyPh.js +0 -4
  213. package/dist/catppuccin-mocha-C6RD5yh3.js +0 -4
  214. package/dist/clarity-2iIoRiLx.js +0 -3
  215. package/dist/clojure-DDsQ0FaV.js +0 -3
  216. package/dist/cmake-DPsCB_V6.js +0 -3
  217. package/dist/cobol-CocL1RYn.js +0 -11
  218. package/dist/codeowners-CxEKPWu0.js +0 -3
  219. package/dist/codeql-BwdvwJnv.js +0 -3
  220. package/dist/coffee-DtqnQNu5.js +0 -6
  221. package/dist/common-lisp-DJtwvW4V.js +0 -3
  222. package/dist/coq-Ds6Ye5el.js +0 -3
  223. package/dist/cpp-Mb4ikSI3.js +0 -25
  224. package/dist/crystal-D4OMbAh_.js +0 -19
  225. package/dist/csharp-CFKaLbHg.js +0 -3
  226. package/dist/css-DTzmO9U0.js +0 -6
  227. package/dist/csv-DqIVFkK7.js +0 -3
  228. package/dist/cue-B5KneM5p.js +0 -3
  229. package/dist/cypher-D8Bb8Cq2.js +0 -3
  230. package/dist/d-BQY8TDgQ.js +0 -3
  231. package/dist/dart-C6DUdjib.js +0 -3
  232. package/dist/dax-S-Noo-ku.js +0 -3
  233. package/dist/desktop-BgOb7Aj4.js +0 -3
  234. package/dist/diff-Blb4MjsC.js +0 -3
  235. package/dist/docker-PC1tuYpa.js +0 -3
  236. package/dist/dotenv-Dkdv7Sm2.js +0 -3
  237. package/dist/dream-maker-CngiPd8U.js +0 -3
  238. package/dist/edge-DrFNu-N9.js +0 -13
  239. package/dist/elixir-OpZyQ8Ht.js +0 -6
  240. package/dist/elm-CjX_545P.js +0 -6
  241. package/dist/emacs-lisp-DxhFFVu_.js +0 -3
  242. package/dist/erb-trZRdc47.js +0 -11
  243. package/dist/erlang-BJeTH9QH.js +0 -6
  244. package/dist/fennel-B3wtZRne.js +0 -3
  245. package/dist/fish-D7qAeWQz.js +0 -3
  246. package/dist/fluent-BjfpB34g.js +0 -3
  247. package/dist/fortran-fixed-form-B_eBTsj9.js +0 -6
  248. package/dist/fortran-free-form-yxJ7igsv.js +0 -3
  249. package/dist/fsharp-UvrT6oWG.js +0 -6
  250. package/dist/gdresource-Dl9wvKCd.js +0 -11
  251. package/dist/gdscript-jjgTGGzd.js +0 -3
  252. package/dist/gdshader-D7JfdFV3.js +0 -3
  253. package/dist/genie-DnK2KWIP.js +0 -3
  254. package/dist/gherkin-D6Lr12YQ.js +0 -3
  255. package/dist/git-commit-2LMniMoO.js +0 -6
  256. package/dist/git-rebase-DUOURRPN.js +0 -6
  257. package/dist/gleam-CTllUdfC.js +0 -3
  258. package/dist/glimmer-js-D_32hFh8.js +0 -15
  259. package/dist/glimmer-ts-CVt002zd.js +0 -15
  260. package/dist/glsl-pHhzolba.js +0 -8
  261. package/dist/gn-DDjbVPF4.js +0 -3
  262. package/dist/gnuplot-DgWvVXI8.js +0 -3
  263. package/dist/go-aXtTCanQ.js +0 -3
  264. package/dist/graphql-BjqekQIR.js +0 -17
  265. package/dist/groovy-Bw2Ku4bU.js +0 -3
  266. package/dist/hack-BITNGzgt.js +0 -11
  267. package/dist/haml-DVwRP8W9.js +0 -13
  268. package/dist/handlebars-T3TJj8Il.js +0 -15
  269. package/dist/haskell-CfGsE1Cf.js +0 -3
  270. package/dist/haxe-B0odltAZ.js +0 -3
  271. package/dist/hcl-DHg_Osgo.js +0 -3
  272. package/dist/hjson-Cuaphql8.js +0 -3
  273. package/dist/hlsl-BJLUNfne.js +0 -3
  274. package/dist/html-CamevgpM.js +0 -13
  275. package/dist/html-derivative-jMOJf6rB.js +0 -6
  276. package/dist/http-BEHztmFP.js +0 -15
  277. package/dist/hurl-LmFBxrwm.js +0 -13
  278. package/dist/hxml-BQ4V4Tez.js +0 -6
  279. package/dist/hy-CJKxDzbh.js +0 -3
  280. package/dist/imba-96qKoJCa.js +0 -3
  281. package/dist/ini-C24lZfdM.js +0 -3
  282. package/dist/java-Cfowl-Ex.js +0 -6
  283. package/dist/javascript-C4sF7sej.js +0 -6
  284. package/dist/jinja-CCAEwzP4.js +0 -10
  285. package/dist/jison-BKCoBkyT.js +0 -6
  286. package/dist/json-E4f3l6hr.js +0 -6
  287. package/dist/json5-xULSgPQI.js +0 -3
  288. package/dist/jsonc-Cu6rqcrJ.js +0 -3
  289. package/dist/jsonl-Bp0qqr10.js +0 -3
  290. package/dist/jsonnet-BafgE6cE.js +0 -3
  291. package/dist/jssm-Dx5A5sBR.js +0 -3
  292. package/dist/jsx-BZjOirBP.js +0 -6
  293. package/dist/julia-nEdJo0dp.js +0 -17
  294. package/dist/just-Brtw3q7S.js +0 -19
  295. package/dist/kanagawa-dragon-DExkuQAs.js +0 -4
  296. package/dist/kanagawa-lotus-qdYh7_RY.js +0 -4
  297. package/dist/kanagawa-wave-CSW_hADG.js +0 -4
  298. package/dist/kdl-DkTyxPcj.js +0 -3
  299. package/dist/kotlin-BHE8CoV9.js +0 -3
  300. package/dist/kusto-6FdaWTzR.js +0 -3
  301. package/dist/latex-QHQNiZDD.js +0 -6
  302. package/dist/lean-BwOKScIt.js +0 -3
  303. package/dist/less-BzbdhFUi.js +0 -3
  304. package/dist/liquid-DYQ7uW5u.js +0 -15
  305. package/dist/llvm-uY68ROGz.js +0 -3
  306. package/dist/log-Dad54gsi.js +0 -3
  307. package/dist/logo-DTXV8SKw.js +0 -3
  308. package/dist/lua-BhkUWs1q.js +0 -8
  309. package/dist/luau-YC4aaMmR.js +0 -3
  310. package/dist/make-B2ukzWs3.js +0 -3
  311. package/dist/markdown-CkmxmzqY.js +0 -3
  312. package/dist/marko-BHWvxp04.js +0 -15
  313. package/dist/matlab-CfRK6IMC.js +0 -3
  314. package/dist/mdc-Dg7VPYLa.js +0 -13
  315. package/dist/mdx-BK9ZufRc.js +0 -3
  316. package/dist/mermaid-r7OoIYpE.js +0 -3
  317. package/dist/mipsasm-EL46Y4Xg.js +0 -3
  318. package/dist/mojo-YCzvCoMT.js +0 -3
  319. package/dist/monokai-CREPpJ3k.js +0 -4
  320. package/dist/moonbit-B_9L5rST.js +0 -3
  321. package/dist/move-Dqi5fhOb.js +0 -3
  322. package/dist/narrat-D9rrR0H5.js +0 -3
  323. package/dist/nextflow-CgUAk9iA.js +0 -6
  324. package/dist/nextflow-groovy-CdFFX-gF.js +0 -3
  325. package/dist/nginx-Q-E8IJvs.js +0 -6
  326. package/dist/nim-CNcTuF14.js +0 -21
  327. package/dist/nix-Bm1Ax-Z3.js +0 -7
  328. package/dist/nushell-r7hBzeS_.js +0 -3
  329. package/dist/objective-c-6dJF64Dt.js +0 -3
  330. package/dist/objective-cpp-_ooRQ-PY.js +0 -3
  331. package/dist/ocaml-vm1Y8An6.js +0 -3
  332. package/dist/odin-vjOJSyfV.js +0 -3
  333. package/dist/one-dark-pro-Ev8UPkf4.js +0 -4
  334. package/dist/openscad-jn-f1Ocl.js +0 -3
  335. package/dist/pascal-D8-gNZ2I.js +0 -3
  336. package/dist/perl-Bbgb6Twx.js +0 -17
  337. package/dist/php-CBOR45_G.js +0 -19
  338. package/dist/pkl-C7lWzykI.js +0 -3
  339. package/dist/plsql-DCNXypXO.js +0 -3
  340. package/dist/po-IjpR1yHO.js +0 -3
  341. package/dist/polar-4pN1JrJ8.js +0 -3
  342. package/dist/postcss-D1gKt4z_.js +0 -3
  343. package/dist/powerquery-SrvS_NBM.js +0 -3
  344. package/dist/powershell-CpTLv_ai.js +0 -3
  345. package/dist/prisma-BWfa4-tI.js +0 -3
  346. package/dist/prolog-Bacii3Ue.js +0 -3
  347. package/dist/proto-ClkOcAW0.js +0 -3
  348. package/dist/pug-Cn_U_o_I.js +0 -13
  349. package/dist/puppet-CQlPp728.js +0 -3
  350. package/dist/purescript-CLpaGMbw.js +0 -3
  351. package/dist/python-BjnOIxPe.js +0 -3
  352. package/dist/qml-DNlrbxJT.js +0 -6
  353. package/dist/qmldir-Dz8ttxjf.js +0 -3
  354. package/dist/qss-Iltvkn1C.js +0 -3
  355. package/dist/r-VqTZMNY_.js +0 -6
  356. package/dist/racket-DRv7j6nv.js +0 -3
  357. package/dist/raku-DI9yGpeW.js +0 -3
  358. package/dist/razor-Bw2un3e8.js +0 -11
  359. package/dist/red-EHiRGXSv.js +0 -4
  360. package/dist/reg-DpJf71oO.js +0 -3
  361. package/dist/regexp-5HbFqwky.js +0 -6
  362. package/dist/rel-BT0iIKKw.js +0 -3
  363. package/dist/riscv-CvzikGLb.js +0 -3
  364. package/dist/ron-DzAo6FTJ.js +0 -3
  365. package/dist/rose-pine-DTI-z1Qp.js +0 -4
  366. package/dist/rose-pine-dawn-BIiGXpWs.js +0 -4
  367. package/dist/rose-pine-moon-DU4wt90U.js +0 -4
  368. package/dist/rosmsg-CyYq6XdT.js +0 -3
  369. package/dist/rst-BZPDb03W.js +0 -23
  370. package/dist/ruby-BbVp0_gQ.js +0 -31
  371. package/dist/rust-COBzcmTx.js +0 -3
  372. package/dist/sas-DSkdG4wF.js +0 -6
  373. package/dist/sass-DI2zJwx7.js +0 -3
  374. package/dist/scala-CtSYTRYT.js +0 -3
  375. package/dist/scheme-D3A2QBtM.js +0 -3
  376. package/dist/scss-BQ7uffpQ.js +0 -8
  377. package/dist/sdbl-CdQg5gu1.js +0 -3
  378. package/dist/shaderlab-CWP9wBCf.js +0 -6
  379. package/dist/shellscript-B42c0JAn.js +0 -6
  380. package/dist/shellsession-Oc9-NqAv.js +0 -6
  381. package/dist/smalltalk-BEQkVl4K.js +0 -3
  382. package/dist/solarized-dark-UHgjRWhr.js +0 -4
  383. package/dist/solarized-light-B-Zcwve2.js +0 -4
  384. package/dist/solidity-lB9VjfB9.js +0 -3
  385. package/dist/soy-tgh9u9aW.js +0 -6
  386. package/dist/sparql-B4t0ZbEe.js +0 -6
  387. package/dist/splunk-xP_ZjUH2.js +0 -3
  388. package/dist/sql-CrPlEQn4.js +0 -6
  389. package/dist/ssh-config-DXFPABYp.js +0 -3
  390. package/dist/stata-D_KqT8cj.js +0 -6
  391. package/dist/stylus-ZZDn1yUO.js +0 -3
  392. package/dist/surrealql-C0KhgoyZ.js +0 -6
  393. package/dist/svelte-DuHT0xxw.js +0 -15
  394. package/dist/swift-BTPQlRLK.js +0 -3
  395. package/dist/system-verilog-BEoxaBuU.js +0 -3
  396. package/dist/systemd-DFbUltlW.js +0 -3
  397. package/dist/talonscript-CLxaFu-b.js +0 -3
  398. package/dist/tasl-_AAbKiWM.js +0 -3
  399. package/dist/tcl-DLe0Tsfm.js +0 -3
  400. package/dist/templ-DF54artD.js +0 -13
  401. package/dist/terraform-v0KN9QQh.js +0 -3
  402. package/dist/tex-Bbhb8xAP.js +0 -6
  403. package/dist/toml-B7BHZIqX.js +0 -3
  404. package/dist/ts-tags-DH1AB-Ri.js +0 -59
  405. package/dist/tsv-BorGVq2Z.js +0 -3
  406. package/dist/tsx-BR8s1Lhs.js +0 -6
  407. package/dist/turtle-BEG5g_eT.js +0 -3
  408. package/dist/twig-DziFF7iU.js +0 -19
  409. package/dist/typescript-D8TR6ff2.js +0 -6
  410. package/dist/typespec-C_R5TbvO.js +0 -3
  411. package/dist/typst-BV9w0z8-.js +0 -3
  412. package/dist/v-DfbeXLo8.js +0 -3
  413. package/dist/vala-BnnASFsX.js +0 -3
  414. package/dist/vb-DU29mvss.js +0 -3
  415. package/dist/verilog-BW5U03XW.js +0 -3
  416. package/dist/vhdl-Co2XFKY7.js +0 -3
  417. package/dist/viml-BReTXeDA.js +0 -3
  418. package/dist/vue-BRy8iDCZ.js +0 -31
  419. package/dist/vue-html-B24bjO_3.js +0 -6
  420. package/dist/vue-vine-l7O7Mg81.js +0 -19
  421. package/dist/vyper-C6KGx0YU.js +0 -3
  422. package/dist/wasm-BRCjOXGL.js +0 -7
  423. package/dist/wasm-gNIKwGlD.js +0 -3
  424. package/dist/wenyan-BeysbCrW.js +0 -3
  425. package/dist/wgsl-1s5rV5xS.js +0 -3
  426. package/dist/wikitext-wjhjmmzD.js +0 -3
  427. package/dist/wit-CeQiCbz_.js +0 -3
  428. package/dist/wolfram-CcZPfnLd.js +0 -3
  429. package/dist/xml-CduVPlYa.js +0 -8
  430. package/dist/xsl-BeH_vLTK.js +0 -6
  431. package/dist/yaml-Cb0uRU1q.js +0 -6
  432. package/dist/zenscript-BoijL7rl.js +0 -3
  433. package/dist/zig-lTQvxhLD.js +0 -3
package/dist/styles.css CHANGED
@@ -1,5 +1,11 @@
1
+ /* Pin the layer order, so utility classes on a part override its defaults below, and those override comark-chat's and Tailwind's base styles. */
2
+ @layer theme, base, comark, components, utilities;
3
+ /* comark-chat also adds these on mount; importing them keeps server-rendered messages from shifting. */
4
+ @import "comark-chat/style.css";
5
+
1
6
  :root {
2
- --vh-ui-radius: var(--ui-radius, 0.5rem);
7
+ /* Nuxt UI's --ui-radius is its smallest step (rounded-sm). Every radius here derives from rounded-lg, twice that step, so a part follows the app's --ui-radius. */
8
+ --vh-ui-radius: calc(var(--ui-radius, 0.25rem) * 2);
3
9
  --vh-ui-border: var(--ui-border, color-mix(in oklab, currentColor 14%, transparent));
4
10
  --vh-ui-muted: var(--ui-text-muted, color-mix(in oklab, currentColor 68%, transparent));
5
11
  --vh-ui-dimmed: var(--ui-text-muted, color-mix(in oklab, currentColor 68%, transparent));
@@ -7,95 +13,34 @@
7
13
  --vh-ui-bg: var(--ui-bg, Canvas);
8
14
  --vh-ui-bg-muted: var(--ui-bg-muted, color-mix(in oklab, Canvas 94%, currentColor));
9
15
  --vh-ui-bg-elevated: var(--ui-bg-elevated, color-mix(in oklab, Canvas 96%, currentColor));
16
+ --vh-ui-bg-accented: var(--ui-bg-accented, color-mix(in oklab, Canvas 90%, currentColor));
17
+ --vh-ui-highlighted: var(--ui-text-highlighted, currentColor);
10
18
  --vh-ui-error: var(--ui-error, #df3030);
11
19
  --vh-ui-info: var(--ui-info, #2563eb);
12
20
  --vh-ui-success: var(--ui-success, #16a34a);
13
21
  --vh-ui-warning: var(--ui-warning, #ad6500);
22
+ --vh-ui-highlighted: var(--ui-text-highlighted, currentColor);
23
+ --vh-ui-inverted: var(--ui-text-inverted, Canvas);
24
+ --vh-ui-primary: var(--ui-primary, #2563eb);
25
+ --vh-ui-ring: color-mix(in oklab, var(--vh-ui-primary) 50%, transparent);
14
26
  }
15
27
 
16
- .vh-chat {
17
- min-height: 0;
18
- position: relative;
19
- }
20
-
21
- .vh-session {
22
- display: grid;
23
- grid-template-rows: auto minmax(0, 1fr) auto;
24
- min-height: 0;
25
- }
26
-
27
- .vh-session__header {
28
- border-block-end: 1px solid var(--vh-ui-border);
29
- padding: 0.75rem 1rem;
30
- }
31
-
32
- .vh-session__title {
33
- font-size: 0.9375rem;
34
- font-weight: 600;
35
- margin: 0;
36
- }
37
-
38
- .vh-session__chat {
39
- min-height: 0;
40
- }
41
-
42
- .vh-chat__viewport {
43
- height: 100%;
44
- min-height: 0;
45
- overflow-y: auto;
46
- overscroll-behavior-y: contain;
47
- scrollbar-gutter: stable;
48
- }
49
-
50
- .vh-chat__content {
51
- display: flex;
52
- flex-direction: column;
53
- gap: 1.25rem;
54
- margin-inline: auto;
55
- max-width: 48rem;
56
- min-height: 100%;
57
- padding: var(--vh-chat-content-padding, 1.5rem 1rem 6rem);
58
- }
59
-
60
- .vh-chat__composer {
61
- bottom: 0;
62
- inset-inline: 0;
63
- padding: var(--vh-chat-composer-padding, 2rem 1rem 1rem);
64
- pointer-events: none;
65
- position: absolute;
66
- z-index: 3;
67
- }
68
-
69
- .vh-chat__composer::before {
70
- -webkit-backdrop-filter: blur(10px);
71
- backdrop-filter: blur(10px);
72
- background: linear-gradient(to bottom, transparent, color-mix(in oklab, var(--vh-ui-bg) 86%, transparent) 45%, var(--vh-ui-bg) 100%);
73
- content: "";
74
- inset: 0;
75
- -webkit-mask-image: linear-gradient(to bottom, transparent, black 2rem);
76
- mask-image: linear-gradient(to bottom, transparent, black 2rem);
77
- pointer-events: none;
78
- position: absolute;
79
- }
80
-
81
- .vh-chat__composer > * {
82
- pointer-events: auto;
83
- position: relative;
84
- }
85
-
28
+ /*
29
+ * These rules restyle Nuxt UI components: the Markdown elements inside the typeset, the scroll button, the image dialog,
30
+ * and the primitive rail items, which the Console renders with Nuxt UI buttons and links.
31
+ * Nuxt UI styles them with utility classes, so these rules stay outside a layer to win over those classes.
32
+ */
86
33
  .vh-chat:has(.vh-chat__composer) .vh-chat__scroll-button {
87
34
  bottom: var(--vh-chat-scroll-button-offset, 7rem);
88
35
  }
89
36
 
90
37
  .vh-chat__scroll-button {
91
38
  align-items: center;
92
- -webkit-backdrop-filter: blur(12px) saturate(1.14);
93
- backdrop-filter: blur(12px) saturate(1.14);
94
- background: color-mix(in srgb, var(--vh-ui-bg) 80%, transparent);
39
+ background: var(--vh-ui-bg-elevated);
95
40
  border: 1px solid var(--vh-ui-border);
96
41
  border-radius: 999px;
97
42
  bottom: 1rem;
98
- box-shadow: 0 1px 3px color-mix(in oklab, black 12%, transparent);
43
+ box-shadow: 0 1px 3px color-mix(in oklab, black 14%, transparent);
99
44
  color: var(--vh-ui-muted);
100
45
  cursor: pointer;
101
46
  display: flex;
@@ -110,32 +55,12 @@
110
55
  z-index: 2;
111
56
  }
112
57
 
113
- .vh-chat__scroll-button:hover {
114
- color: var(--vh-ui-text);
115
- }
116
-
117
- @supports not ((-webkit-backdrop-filter: blur(1px)) or (backdrop-filter: blur(1px))) {
118
- .vh-chat__scroll-button {
119
- background: var(--vh-ui-bg);
58
+ @media (hover: hover) {
59
+ .vh-chat__scroll-button:hover {
60
+ color: var(--vh-ui-text);
120
61
  }
121
62
  }
122
63
 
123
- .vh-message-parts {
124
- display: flex;
125
- flex-direction: column;
126
- gap: 0.75rem;
127
- min-width: 0;
128
- }
129
-
130
- .vh-typeset {
131
- --vh-typeset-flow: 0.85em;
132
- --vh-typeset-leading: 1.65;
133
- font-size: 0.9375rem;
134
- line-height: var(--vh-typeset-leading);
135
- min-width: 0;
136
- overflow-wrap: anywhere;
137
- }
138
-
139
64
  .vh-typeset > * {
140
65
  margin-block: 0;
141
66
  }
@@ -212,2351 +137,2526 @@
212
137
  contain: layout style;
213
138
  }
214
139
 
215
- .vh-attachment,
216
- .vh-prompt__attachment {
217
- align-items: center;
218
- background: var(--vh-ui-bg-elevated);
219
- border: 1px solid var(--vh-ui-border);
220
- border-radius: var(--vh-ui-radius);
221
- color: inherit;
222
- display: inline-flex;
223
- gap: 0.5rem;
224
- max-width: 16rem;
225
- padding: 0.375rem;
226
- text-decoration: none;
140
+ .vh-typeset p:has(> .vh-image-preview:only-child) {
141
+ display: inline-block;
142
+ margin: 0.5rem 0.5rem 0 0;
143
+ max-width: calc(50% - 0.5rem);
144
+ vertical-align: top;
227
145
  }
228
146
 
229
- .vh-attachment__preview {
230
- aspect-ratio: 1;
231
- border-radius: calc(var(--vh-ui-radius) * 0.7);
232
- height: 2.5rem;
233
- object-fit: cover;
147
+ .vh-image-overlay {
148
+ background: rgb(0 0 0 / 80%);
149
+ z-index: 59;
234
150
  }
235
151
 
236
- .vh-attachment__name {
237
- overflow: hidden;
238
- text-overflow: ellipsis;
239
- white-space: nowrap;
152
+ .vh-image-dialog {
153
+ background: transparent;
154
+ border-radius: 0;
155
+ box-shadow: none;
156
+ max-height: 92dvh;
157
+ max-width: 92vw;
158
+ overflow: visible;
159
+ width: max-content;
160
+ z-index: 60;
240
161
  }
241
162
 
242
- .vh-tool-value,
243
- .vh-trace__attributes {
244
- font-size: 0.75rem;
245
- margin: 0;
246
- max-height: 18rem;
247
- overflow: auto;
248
- white-space: pre-wrap;
163
+ .vh-image-dialog__action {
164
+ color: white;
165
+ flex: none;
249
166
  }
250
167
 
251
- .vh-prompt__attachments {
252
- display: flex;
253
- flex-wrap: wrap;
254
- gap: 0.5rem;
168
+ .vh-image-dialog__action:hover {
169
+ background: rgb(255 255 255 / 10%);
255
170
  }
256
171
 
257
- .vh-prompt__attachment button {
258
- appearance: none;
259
- background: transparent;
260
- border: 0;
261
- color: var(--vh-ui-muted);
262
- cursor: pointer;
263
- font: inherit;
172
+ /*
173
+ * Primitive rail: the narrow icon column that ViteHub docs and the Console share.
174
+ * The rail always takes 3.5rem of the layout. Its surface expands over the next element to show the labels,
175
+ * so the page never moves. Icons keep their position: each item starts with an icon box the size of the collapsed square.
176
+ */
177
+ .vh-primitive-rail {
178
+ /* The inset centers the square in the rail width minus the 1px border. */
179
+ --vh-primitive-rail-inset: calc((3.5rem - 1px - var(--vh-primitive-rail-item)) / 2);
180
+ --vh-primitive-rail-item: 2.25rem;
181
+ box-sizing: border-box;
182
+ flex: none;
183
+ height: 100%;
184
+ min-height: 0;
185
+ position: relative;
186
+ width: 3.5rem;
187
+ /* Above the next element in the page, below the site header and the popovers. */
188
+ z-index: 10;
264
189
  }
265
190
 
266
- .vh-prompt__attachment--image {
267
- border-radius: calc(var(--vh-ui-radius) * 1.25);
268
- flex: 0 0 4rem;
269
- height: 4rem;
191
+ .vh-primitive-rail__surface {
192
+ background: var(--vh-ui-bg-muted);
193
+ border-inline-end: 1px solid var(--vh-ui-border);
194
+ box-sizing: border-box;
195
+ display: flex;
196
+ flex-direction: column;
197
+ gap: 0.25rem;
198
+ inset-block: 0;
199
+ inset-inline-start: 0;
270
200
  overflow: hidden;
271
- padding: 0;
272
- position: relative;
273
- width: 4rem;
201
+ padding-block: 0.5rem;
202
+ position: absolute;
203
+ width: 100%;
274
204
  }
275
205
 
276
- .vh-prompt__attachment-preview {
277
- height: 100%;
278
- object-fit: cover;
279
- width: 100%;
206
+ .vh-primitive-rail[data-expanded] .vh-primitive-rail__surface {
207
+ width: 13.5rem;
280
208
  }
281
209
 
282
- .vh-prompt__attachment--image button {
283
- align-items: center;
284
- background: color-mix(in oklab, black 65%, transparent);
285
- border-radius: 9999px;
286
- color: white;
287
- display: flex;
288
- height: 1.25rem;
289
- justify-content: center;
290
- line-height: 1;
291
- position: absolute;
292
- right: 0.25rem;
293
- top: 0.25rem;
294
- width: 1.25rem;
210
+ .dark .vh-primitive-rail__surface {
211
+ background: #000;
295
212
  }
296
213
 
297
- .vh-prompt__footer {
298
- align-items: center;
214
+ .vh-primitive-rail__header,
215
+ .vh-primitive-rail__footer {
299
216
  display: flex;
300
- gap: 0.5rem;
301
- width: 100%;
217
+ flex: none;
218
+ flex-direction: column;
219
+ gap: 0.125rem;
220
+ padding-inline: var(--vh-primitive-rail-inset);
302
221
  }
303
222
 
304
- .vh-prompt__spacer {
305
- flex: 1;
223
+ .vh-primitive-rail__body {
224
+ display: flex;
225
+ flex: 1 1 auto;
226
+ flex-direction: column;
227
+ min-height: 0;
228
+ overflow-x: hidden;
229
+ overflow-y: auto;
230
+ overscroll-behavior: contain;
231
+ padding-inline: var(--vh-primitive-rail-inset);
232
+ scrollbar-width: none;
306
233
  }
307
234
 
308
- .vh-trace {
309
- border: 1px solid var(--vh-ui-border);
310
- border-radius: var(--vh-ui-radius);
235
+ .vh-primitive-rail__body::-webkit-scrollbar {
236
+ display: none;
311
237
  }
312
238
 
313
- .vh-trace__trigger,
314
- .vh-trace__step-heading {
315
- align-items: center;
239
+ /* Items in a group are 0.125rem apart. Groups are 1rem apart, with the rule in the middle. */
240
+ .vh-primitive-rail__group {
316
241
  display: flex;
317
- gap: 0.75rem;
318
- justify-content: space-between;
242
+ flex: none;
243
+ flex-direction: column;
244
+ gap: 0.125rem;
245
+ padding-block: 0.5rem;
246
+ position: relative;
319
247
  }
320
248
 
321
- .vh-trace__duration {
322
- color: var(--vh-ui-dimmed);
323
- font-size: 0.75rem;
249
+ /* The rule stays centered under the icons when the rail expands. */
250
+ .vh-primitive-rail__group + .vh-primitive-rail__group::before {
251
+ background: var(--vh-ui-border);
252
+ content: "";
253
+ height: 1px;
254
+ inset-block-start: 0;
255
+ inset-inline-start: calc(var(--vh-primitive-rail-item) / 2 - 0.625rem);
256
+ position: absolute;
257
+ width: 1.25rem;
324
258
  }
325
259
 
326
- .vh-trace__trigger {
260
+ /* The item fills the column, so it is a square when the rail is collapsed and a row when it is expanded. */
261
+ .vh-primitive-rail__item {
262
+ align-items: center;
327
263
  appearance: none;
328
264
  background: transparent;
329
265
  border: 0;
330
- color: inherit;
266
+ border-radius: calc(var(--vh-ui-radius) * 0.75);
267
+ box-sizing: border-box;
268
+ color: var(--vh-ui-muted);
331
269
  cursor: pointer;
332
- padding: 0.75rem;
333
- text-align: start;
270
+ display: flex;
271
+ flex: none;
272
+ font: inherit;
273
+ height: var(--vh-primitive-rail-item);
274
+ justify-content: flex-start;
275
+ margin: 0;
276
+ overflow: hidden;
277
+ padding: 0;
278
+ text-decoration: none;
279
+ transition:
280
+ background-color 150ms ease,
281
+ color 150ms ease;
334
282
  width: 100%;
335
283
  }
336
284
 
337
- .vh-trace__title {
338
- flex: 1;
285
+ .vh-primitive-rail__icon {
286
+ align-items: center;
287
+ display: flex;
288
+ flex: none;
289
+ height: 100%;
290
+ justify-content: center;
291
+ width: var(--vh-primitive-rail-item);
339
292
  }
340
293
 
341
- .vh-trace__steps {
342
- border-block-start: 1px solid var(--vh-ui-border);
343
- display: grid;
294
+ /* The label shows only when the rail is expanded. The item's aria-label holds the same text. */
295
+ .vh-primitive-rail__label {
296
+ flex: 1 1 auto;
297
+ font-size: 0.8125rem;
298
+ font-weight: 500;
299
+ line-height: 1.25rem;
300
+ min-width: 0;
301
+ opacity: 0;
302
+ overflow: hidden;
303
+ padding-inline-end: 0.5rem;
304
+ text-align: start;
305
+ text-overflow: ellipsis;
306
+ transition: opacity 150ms ease;
307
+ white-space: nowrap;
344
308
  }
345
309
 
346
- .vh-trace__step {
347
- padding: 0.75rem;
310
+ .vh-primitive-rail[data-expanded] .vh-primitive-rail__label {
311
+ opacity: 1;
348
312
  }
349
313
 
350
- .vh-trace__step + .vh-trace__step {
351
- border-block-start: 1px solid var(--vh-ui-border);
314
+ /* Under reduced motion the surface opens and closes at once. The labels still fade. */
315
+ @media (prefers-reduced-motion: no-preference) {
316
+ .vh-primitive-rail__surface {
317
+ transition: width 150ms cubic-bezier(0.2, 0, 0, 1);
318
+ }
352
319
  }
353
320
 
354
- .vh-invocation-list {
355
- min-height: 0;
356
- min-width: 0;
357
- overflow-y: auto;
358
- overscroll-behavior-y: contain;
359
- scrollbar-gutter: stable;
321
+ /* Escape and a menu trigger close the rail at once, so a menu opens next to an icon that does not move. */
322
+ .vh-primitive-rail[data-dismissed] .vh-primitive-rail__surface {
323
+ transition: none;
360
324
  }
361
325
 
362
- .vh-invocation-list ul {
363
- display: grid;
364
- gap: 0.125rem;
365
- list-style: none;
366
- margin: 0;
367
- padding: 0;
326
+ .vh-primitive-rail__item:focus-visible {
327
+ color: var(--vh-ui-highlighted);
328
+ outline: 2px solid var(--vh-ui-highlighted);
329
+ outline-offset: -2px;
368
330
  }
369
331
 
370
- .vh-invocation-list__groups {
371
- display: grid;
372
- gap: 0.25rem;
332
+ .vh-primitive-rail__item[aria-current="page"] {
333
+ background: var(--vh-ui-bg-accented);
334
+ color: var(--vh-ui-highlighted);
373
335
  }
374
336
 
375
- .vh-invocation-list__group {
376
- min-width: 0;
337
+ .vh-primitive-rail__item:disabled {
338
+ cursor: default;
339
+ opacity: 0.6;
377
340
  }
378
341
 
379
- .vh-invocation-list__group-heading {
380
- align-items: center;
381
- color: color-mix(in oklab, var(--vh-ui-muted) 88%, var(--vh-ui-text));
382
- display: flex;
383
- font-size: 0.6875rem;
384
- font-weight: 650;
385
- gap: 0.375rem;
386
- letter-spacing: 0.04em;
387
- min-height: 1.75rem;
388
- padding: 0.25rem 0.75rem;
389
- text-transform: uppercase;
390
- user-select: none;
391
- }
342
+ @media (hover: hover) {
343
+ .vh-primitive-rail__item:hover {
344
+ background: var(--vh-ui-bg-elevated);
345
+ color: var(--vh-ui-highlighted);
346
+ }
392
347
 
393
- .vh-invocation-list__group--collapsible > summary {
394
- cursor: pointer;
395
- list-style: none;
348
+ .vh-primitive-rail__item[aria-current="page"]:hover {
349
+ background: var(--vh-ui-bg-accented);
350
+ }
396
351
  }
397
352
 
398
- .vh-invocation-list__group--collapsible > summary::-webkit-details-marker {
399
- display: none;
353
+ /* Touch targets grow to 2.75rem. The icon keeps its size, and the rail keeps its width. */
354
+ @media (pointer: coarse) {
355
+ .vh-primitive-rail {
356
+ --vh-primitive-rail-item: 2.75rem;
357
+ }
400
358
  }
401
359
 
402
- .vh-invocation-list__group--collapsible > summary::before {
403
- border-block-end: 1.5px solid currentColor;
404
- border-inline-end: 1.5px solid currentColor;
405
- content: "";
360
+ .vh-primitive-icon {
361
+ display: block;
406
362
  flex: none;
407
- height: 0.375rem;
408
- margin-inline: 0.125rem 0.25rem;
409
- transform: rotate(-45deg);
410
- width: 0.375rem;
363
+ height: 1.125rem;
364
+ width: 1.125rem;
411
365
  }
412
366
 
413
- .vh-invocation-list__group--collapsible[open] > summary::before {
414
- transform: rotate(45deg) translateY(-0.0625rem);
367
+ .vh-primitive-icon__motion {
368
+ transform-box: view-box;
369
+ transform-origin: var(--vh-primitive-icon-origin, 12px 12px);
415
370
  }
416
371
 
417
- .vh-invocation-list__group--collapsible > summary:hover {
418
- color: var(--vh-ui-text);
372
+ /* Each icon moves once when a pointer enters or keyboard focus arrives. Nothing moves while idle. */
373
+ @media (prefers-reduced-motion: no-preference) {
374
+ .vh-primitive-rail__item:focus-visible .vh-primitive-icon__motion {
375
+ animation: vh-primitive-icon 320ms cubic-bezier(0.22, 1, 0.36, 1);
376
+ }
419
377
  }
420
378
 
421
- .vh-invocation-list__group--collapsible > summary:focus-visible {
422
- border-radius: calc(var(--vh-ui-radius) * 0.8);
423
- outline: 2px solid color-mix(in oklab, var(--ui-primary, #2563eb) 52%, transparent);
424
- outline-offset: -2px;
379
+ @media (hover: hover) and (prefers-reduced-motion: no-preference) {
380
+ .vh-primitive-rail__item:hover .vh-primitive-icon__motion {
381
+ animation: vh-primitive-icon 320ms cubic-bezier(0.22, 1, 0.36, 1);
382
+ }
425
383
  }
426
384
 
427
- .vh-invocation-list__group-label {
428
- flex: 1;
429
- min-width: 0;
385
+ @keyframes vh-primitive-icon {
386
+ 50% {
387
+ opacity: var(--vh-primitive-icon-opacity, 1);
388
+ transform: var(--vh-primitive-icon-motion, none);
389
+ }
430
390
  }
431
391
 
432
- .vh-invocation-list__group-count {
433
- color: var(--vh-ui-dimmed);
434
- font-variant-numeric: tabular-nums;
435
- font-weight: 550;
436
- letter-spacing: 0;
392
+ .vh-primitive-icon[data-icon="agent"] {
393
+ --vh-primitive-icon-motion: scaleY(0.2);
394
+ --vh-primitive-icon-origin: 12px 14.5px;
437
395
  }
438
396
 
439
- .vh-invocation-list ul.vh-invocation-list__virtual {
440
- display: block;
441
- position: relative;
442
- width: 100%;
397
+ .vh-primitive-icon[data-icon="auth"] {
398
+ --vh-primitive-icon-motion: translateY(-1.5px);
443
399
  }
444
400
 
445
- .vh-invocation-list__virtual > li {
446
- inset-inline: 0;
447
- padding-block-end: 0.125rem;
448
- position: absolute;
449
- top: 0;
401
+ .vh-primitive-icon[data-icon="blob"] {
402
+ --vh-primitive-icon-motion: translate(1px, -1px);
450
403
  }
451
404
 
452
- .vh-invocation-list__item {
453
- appearance: none;
454
- background: transparent;
455
- border: 0;
456
- border-radius: calc(var(--vh-ui-radius) * 1.15);
457
- box-sizing: border-box;
458
- color: inherit;
459
- cursor: pointer;
460
- display: grid;
461
- gap: 0.3rem;
462
- height: 100%;
463
- min-height: 4.875rem;
464
- padding: 0.65rem 0.75rem;
465
- text-align: start;
466
- transition: background-color 120ms ease, color 120ms ease;
467
- width: 100%;
405
+ .vh-primitive-icon[data-icon="browser"] {
406
+ --vh-primitive-icon-motion: translate(1.5px, 1.5px);
468
407
  }
469
408
 
470
- .vh-invocation-list__virtual .vh-invocation-list__item {
471
- grid-template-rows: repeat(4, minmax(0, auto));
472
- overflow: hidden;
409
+ .vh-primitive-icon[data-icon="channel"] {
410
+ --vh-primitive-icon-motion: translateX(1.5px);
473
411
  }
474
412
 
475
- .vh-invocation-list__item:hover {
476
- background: color-mix(in oklab, var(--vh-ui-bg-elevated) 72%, transparent);
413
+ .vh-primitive-icon[data-icon="connection"] {
414
+ --vh-primitive-icon-motion: translateY(1.5px);
477
415
  }
478
416
 
479
- .vh-invocation-list__item:focus-visible {
480
- outline: 2px solid color-mix(in oklab, var(--ui-primary, #2563eb) 52%, transparent);
481
- outline-offset: -2px;
417
+ .vh-primitive-icon[data-icon="content"] {
418
+ --vh-primitive-icon-motion: translateX(1.5px);
482
419
  }
483
420
 
484
- .vh-invocation-list__item[aria-current="true"] {
485
- background: var(--ui-bg-elevated, var(--vh-ui-bg-elevated));
486
- box-shadow: inset 0 0 0 1px var(--vh-ui-border);
421
+ .vh-primitive-icon[data-icon="database"] {
422
+ --vh-primitive-icon-motion: translateY(-1.5px);
487
423
  }
488
424
 
489
- .vh-invocation-list__context,
490
- .vh-invocation-list__state,
491
- .vh-invocation-list__meta,
492
- .vh-invocation-list__harness {
493
- align-items: center;
494
- display: flex;
495
- min-width: 0;
425
+ .vh-primitive-icon[data-icon="development"] {
426
+ --vh-primitive-icon-motion: rotate(14deg);
496
427
  }
497
428
 
498
- .vh-invocation-list__context {
499
- color: color-mix(in oklab, var(--vh-ui-muted) 88%, var(--vh-ui-text));
500
- gap: 0.4rem;
429
+ .vh-primitive-icon[data-icon="email"] {
430
+ --vh-primitive-icon-motion: translateY(1.5px);
501
431
  }
502
432
 
503
- .vh-invocation-list__project-icon,
504
- .vh-invocation-list__state-icon {
505
- align-items: center;
506
- display: inline-flex;
507
- flex: none;
508
- justify-content: center;
433
+ .vh-primitive-icon[data-icon="env"] {
434
+ --vh-primitive-icon-motion: rotate(-16deg);
435
+ --vh-primitive-icon-origin: 8px 16px;
509
436
  }
510
437
 
511
- .vh-invocation-list__project-icon svg {
512
- height: 1rem;
513
- stroke: currentColor;
514
- stroke-width: 1.75;
515
- width: 1rem;
438
+ .vh-primitive-icon[data-icon="hosts"] {
439
+ --vh-primitive-icon-motion: translateY(-1.5px);
516
440
  }
517
441
 
518
- .vh-invocation-list__project {
519
- flex: 1;
520
- font-size: 0.75rem;
521
- min-width: 0;
522
- overflow: hidden;
523
- text-overflow: ellipsis;
524
- white-space: nowrap;
442
+ .vh-primitive-icon[data-icon="kv"] {
443
+ --vh-primitive-icon-motion: translateX(1.5px);
525
444
  }
526
445
 
527
- .vh-invocation-list__state {
528
- color: color-mix(in oklab, var(--vh-ui-muted) 88%, var(--vh-ui-text));
529
- flex: none;
530
- font-size: 0.6875rem;
531
- gap: 0.3rem;
446
+ .vh-primitive-icon[data-icon="queue"] {
447
+ --vh-primitive-icon-motion: translateX(2px);
532
448
  }
533
449
 
534
- .vh-invocation-list__state time {
535
- color: color-mix(in oklab, currentColor 82%, var(--vh-ui-text));
450
+ .vh-primitive-icon[data-icon="rate-limit"] {
451
+ --vh-primitive-icon-motion: rotate(-70deg);
452
+ --vh-primitive-icon-origin: 12px 15px;
536
453
  }
537
454
 
538
- .vh-invocation-list__state-icon svg {
539
- height: 0.875rem;
540
- stroke: currentColor;
541
- stroke-width: 1.8;
542
- width: 0.875rem;
455
+ .vh-primitive-icon[data-icon="realtime"] {
456
+ --vh-primitive-icon-motion: scale(1.12);
457
+ --vh-primitive-icon-opacity: 0.4;
543
458
  }
544
459
 
545
- .vh-invocation-list__item[data-status="running"] .vh-invocation-list__state {
546
- color: color-mix(in oklab, var(--vh-ui-info) 42%, var(--vh-ui-text));
460
+ .vh-primitive-icon[data-icon="reference"] {
461
+ --vh-primitive-icon-motion: skewY(-8deg);
462
+ --vh-primitive-icon-origin: 12px 12px;
547
463
  }
548
464
 
549
- .vh-invocation-list__item[data-status="running"] .vh-invocation-list__state-icon svg {
550
- animation: vh-invocation-status-spin 800ms linear infinite;
465
+ .vh-primitive-icon[data-icon="sandbox"] {
466
+ --vh-primitive-icon-motion: scale(0.7);
551
467
  }
552
468
 
553
- @keyframes vh-invocation-status-spin {
554
- to {
555
- transform: rotate(360deg);
556
- }
469
+ .vh-primitive-icon[data-icon="schedule"] {
470
+ --vh-primitive-icon-motion: translateX(4.5px);
557
471
  }
558
472
 
559
- .vh-invocation-list__item[data-status="completed"] .vh-invocation-list__state {
560
- color: color-mix(in oklab, var(--vh-ui-success) 42%, var(--vh-ui-text));
473
+ .vh-primitive-icon[data-icon="shell"] {
474
+ --vh-primitive-icon-opacity: 0;
561
475
  }
562
476
 
563
- .vh-invocation-list__item[data-status="failed"] .vh-invocation-list__state,
564
- .vh-invocation-list__item[data-status="failed"] .vh-invocation-list__description {
565
- color: color-mix(in oklab, var(--vh-ui-error) 42%, var(--vh-ui-text));
477
+ .vh-primitive-icon[data-icon="source"] {
478
+ --vh-primitive-icon-motion: translateY(1.5px);
566
479
  }
567
480
 
568
- .vh-invocation-list__title {
569
- font-size: 0.875rem;
570
- font-weight: 560;
571
- line-height: 1.35;
572
- overflow: hidden;
573
- text-overflow: ellipsis;
574
- white-space: nowrap;
481
+ .vh-primitive-icon[data-icon="start"] {
482
+ --vh-primitive-icon-motion: skewY(-10deg);
483
+ --vh-primitive-icon-origin: 6px 8px;
575
484
  }
576
485
 
577
- .vh-invocation-list__meta {
578
- color: color-mix(in oklab, var(--vh-ui-muted) 88%, var(--vh-ui-text));
579
- font-size: 0.6875rem;
580
- gap: 0.5rem;
486
+ .vh-primitive-icon[data-icon="ui"] {
487
+ --vh-primitive-icon-motion: translate(-1px, -1px);
581
488
  }
582
489
 
583
- .vh-invocation-list__branch {
584
- flex: 1;
585
- min-width: 0;
586
- overflow: hidden;
587
- text-overflow: ellipsis;
588
- white-space: nowrap;
490
+ .vh-primitive-icon[data-icon="usage"] {
491
+ --vh-primitive-icon-motion: scaleY(0.75);
492
+ --vh-primitive-icon-origin: 12px 16px;
589
493
  }
590
494
 
591
- .vh-invocation-list__harness {
592
- flex: none;
593
- gap: 0.25rem;
495
+ .vh-primitive-icon[data-icon="workflow"] {
496
+ --vh-primitive-icon-motion: translateX(1.5px);
594
497
  }
595
498
 
596
- .vh-invocation-list__harness > span {
597
- align-items: center;
598
- display: inline-flex;
499
+ .vh-primitive-icon[data-icon="workspace"] {
500
+ --vh-primitive-icon-motion: translateY(-1px);
599
501
  }
600
502
 
601
- .vh-invocation-list__harness svg {
602
- height: 0.9rem;
603
- stroke: currentColor;
604
- stroke-linecap: round;
605
- stroke-linejoin: round;
606
- stroke-width: 1.65;
607
- width: 0.9rem;
608
- }
503
+ /*
504
+ * shadcn/ui agentic parts: Message, Bubble, Marker, Trace, and Attachment.
505
+ * These rules translate the default classes of https://ui.shadcn.com/docs/components/trace and its siblings to Nuxt UI tokens:
506
+ * foreground is --ui-text-highlighted, muted-foreground is --ui-text-muted, secondary and muted are --ui-bg-elevated and --ui-bg-muted,
507
+ * primary-foreground is --ui-text-inverted, and destructive is --ui-error.
508
+ * They live in the components layer, so a utility class on a part, such as `class="max-w-sm"`, overrides them.
509
+ */
510
+ @layer components {
511
+ /* shadcn/ui sweeps a shimmer over running and uploading titles. ViteHub avoids continuously repainting animations, so the title text carries that state. */
609
512
 
610
- .vh-invocation-list__description {
611
- font-size: 0.6875rem;
612
- overflow: hidden;
613
- text-overflow: ellipsis;
614
- white-space: nowrap;
615
- }
513
+ /* Message */
616
514
 
617
- .vh-invocation-list__empty,
618
- .vh-invocation-list__loading {
619
- color: var(--vh-ui-dimmed);
620
- font-size: 0.8125rem;
621
- margin: 1rem 0;
622
- text-align: center;
623
- }
515
+ :is([data-slot="message-group"], [data-slot="bubble-group"]) {
516
+ display: flex;
517
+ flex-direction: column;
518
+ gap: 0.5rem;
519
+ min-width: 0;
520
+ }
624
521
 
625
- .vh-invocation-list__loading {
626
- background: color-mix(in oklab, var(--vh-ui-bg) 88%, transparent);
627
- bottom: 0;
628
- margin: 0;
629
- padding: 0.6rem;
630
- position: sticky;
631
- }
522
+ [data-slot="message"][data-align] {
523
+ display: flex;
524
+ font-size: 0.875rem;
525
+ gap: 0.5rem;
526
+ line-height: 1.25rem;
527
+ min-width: 0;
528
+ position: relative;
529
+ width: 100%;
530
+ }
632
531
 
633
- .vh-invocation-session {
634
- background: var(--vh-ui-bg);
635
- container-type: inline-size;
636
- display: grid;
637
- grid-template-rows: auto minmax(0, 1fr);
638
- height: 100%;
639
- min-height: 0;
640
- min-width: 0;
641
- overflow: hidden;
642
- }
532
+ [data-slot="message"][data-align="end"] {
533
+ flex-direction: row-reverse;
534
+ }
643
535
 
644
- .vh-invocation-session--headerless {
645
- grid-template-rows: minmax(0, 1fr);
646
- }
536
+ [data-slot="message-avatar"] {
537
+ align-items: center;
538
+ align-self: flex-end;
539
+ background: var(--vh-ui-bg-elevated);
540
+ border-radius: 9999px;
541
+ display: flex;
542
+ flex-shrink: 0;
543
+ justify-content: center;
544
+ min-width: 2rem;
545
+ overflow: hidden;
546
+ width: fit-content;
547
+ }
647
548
 
648
- .vh-invocation-header {
649
- align-items: center;
650
- border-block-end: 1px solid var(--vh-ui-border);
651
- display: flex;
652
- gap: 0.75rem;
653
- justify-content: space-between;
654
- min-height: 3.25rem;
655
- padding: 0.55rem 0.8rem;
656
- }
549
+ [data-slot="message"][data-align]:has([data-slot="message-footer"]) [data-slot="message-avatar"] {
550
+ translate: 0 -2rem;
551
+ }
657
552
 
658
- .vh-invocation-header__breadcrumb {
659
- align-items: center;
660
- display: flex;
661
- gap: 0.55rem;
662
- min-width: 0;
663
- }
553
+ [data-slot="message-content"] {
554
+ display: flex;
555
+ flex-direction: column;
556
+ gap: 0.625rem;
557
+ min-width: 0;
558
+ overflow-wrap: break-word;
559
+ width: 100%;
560
+ }
664
561
 
665
- .vh-invocation-header__project-icon {
666
- align-items: center;
667
- color: var(--vh-ui-muted);
668
- display: inline-flex;
669
- flex: none;
670
- }
562
+ [data-slot="message"][data-align="end"] [data-slot="message-content"] > [data-slot] {
563
+ align-self: flex-end;
564
+ }
671
565
 
672
- .vh-invocation-header__project-icon svg {
673
- height: 1rem;
674
- stroke: currentColor;
675
- stroke-width: 1.75;
676
- width: 1rem;
677
- }
566
+ :is([data-slot="message-header"], [data-slot="message-footer"]) {
567
+ align-items: center;
568
+ color: var(--vh-ui-muted);
569
+ display: flex;
570
+ font-size: 0.75rem;
571
+ font-weight: 500;
572
+ line-height: 1rem;
573
+ max-width: 100%;
574
+ min-width: 0;
575
+ padding-inline: 0.75rem;
576
+ }
678
577
 
679
- .vh-invocation-header__project,
680
- .vh-invocation-header__separator {
681
- color: var(--vh-ui-muted);
682
- flex: none;
683
- font-size: 0.8125rem;
684
- }
578
+ /* Without a framed bubble, the header and footer line up with the unframed content. */
579
+ [data-slot="message"][data-align]:is(:has([data-variant="ghost"]), :not(:has([data-slot="bubble"]))) :is([data-slot="message-header"], [data-slot="message-footer"]) {
580
+ padding-inline: 0;
581
+ }
685
582
 
686
- .vh-invocation-header h2 {
687
- font-size: 0.875rem;
688
- font-weight: 600;
689
- line-height: 1.35;
690
- margin: 0;
691
- min-width: 0;
692
- overflow: hidden;
693
- text-overflow: ellipsis;
694
- white-space: nowrap;
695
- }
583
+ [data-slot="message"][data-align="end"] [data-slot="message-footer"] {
584
+ justify-content: flex-end;
585
+ }
696
586
 
697
- .vh-invocation-thread {
698
- height: 100%;
699
- min-height: 0;
700
- min-width: 0;
701
- overflow-y: auto;
702
- overscroll-behavior-y: contain;
703
- scrollbar-gutter: stable;
704
- }
587
+ /* Bubble */
705
588
 
706
- .vh-invocation-thread__content {
707
- margin-inline: auto;
708
- max-width: 54rem;
709
- min-height: 100%;
710
- padding: 1.5rem 2rem 4rem;
711
- }
589
+ [data-slot="bubble"] {
590
+ display: flex;
591
+ flex-direction: column;
592
+ gap: 0.25rem;
593
+ max-width: 80%;
594
+ min-width: 0;
595
+ position: relative;
596
+ width: fit-content;
597
+ }
712
598
 
713
- .vh-invocation-session__error {
714
- background: color-mix(in oklab, var(--vh-ui-error) 7%, transparent);
715
- border: 1px solid color-mix(in oklab, var(--vh-ui-error) 22%, transparent);
716
- border-radius: var(--vh-ui-radius);
717
- color: var(--vh-ui-error);
718
- display: grid;
719
- font-size: 0.8125rem;
720
- gap: 0.2rem;
721
- margin-block-end: 1.5rem;
722
- padding: 0.75rem 0.875rem;
723
- }
599
+ :is([data-slot="bubble"][data-align="end"], [data-slot="message"][data-align="end"] [data-slot="bubble"]) {
600
+ align-self: flex-end;
601
+ }
724
602
 
725
- .vh-invocation-activities {
726
- display: flex;
727
- flex-direction: column;
728
- gap: 0.0625rem;
729
- list-style: none;
730
- margin: 0;
731
- padding: 0;
732
- }
603
+ [data-slot="bubble"][data-variant="ghost"] {
604
+ max-width: 100%;
605
+ }
733
606
 
734
- .vh-invocation-message {
735
- min-width: 0;
736
- }
607
+ [data-slot="bubble-content"] {
608
+ border: 1px solid transparent;
609
+ border-radius: calc(var(--vh-ui-radius) * 1.5);
610
+ font-size: 0.875rem;
611
+ line-height: 1.625;
612
+ max-width: 100%;
613
+ min-width: 0;
614
+ overflow: hidden;
615
+ overflow-wrap: break-word;
616
+ padding: 0.5rem 0.75rem;
617
+ width: fit-content;
618
+ }
737
619
 
738
- .vh-invocation-message[data-role="assistant"] {
739
- padding: 0.125rem 0.25rem 0.5rem;
740
- }
620
+ [data-slot="bubble"][data-align="end"] > [data-slot="bubble-content"] {
621
+ align-self: flex-end;
622
+ }
741
623
 
742
- .vh-invocation-message[data-role="user"] {
743
- background: var(--vh-ui-bg-elevated);
744
- border-radius: 1rem;
745
- margin-block: 0.5rem 1rem;
746
- margin-inline-start: 20%;
747
- padding: 0.75rem;
748
- }
624
+ :is(a, button)[data-slot="bubble-content"] {
625
+ color: inherit;
626
+ cursor: pointer;
627
+ font: inherit;
628
+ outline: none;
629
+ text-align: left;
630
+ text-decoration: none;
631
+ transition: background-color 150ms, color 150ms;
632
+ }
749
633
 
750
- .vh-invocation-message__body {
751
- font-size: 0.9375rem;
752
- line-height: 1.65;
753
- }
634
+ :is(a, button)[data-slot="bubble-content"]:focus-visible {
635
+ border-color: var(--vh-ui-primary);
636
+ box-shadow: 0 0 0 3px var(--vh-ui-ring);
637
+ }
754
638
 
755
- .vh-invocation-message__content {
756
- min-width: 0;
757
- }
639
+ [data-slot="bubble"][data-variant="default"] > [data-slot="bubble-content"] {
640
+ background: var(--vh-ui-primary);
641
+ color: var(--vh-ui-inverted);
642
+ }
758
643
 
759
- .vh-invocation-message__content[data-collapsed="true"] {
760
- -webkit-mask-image: linear-gradient(to bottom, black calc(100% - 1.75rem), transparent);
761
- mask-image: linear-gradient(to bottom, black calc(100% - 1.75rem), transparent);
762
- max-height: 10.5rem;
763
- overflow: hidden;
764
- }
644
+ /* Hover colors apply only where a pointer can hover, so a tap on a touch screen does not leave them on, as on the primitive rail. */
645
+ @media (hover: hover) {
646
+ [data-slot="bubble"][data-variant="default"] > :is(a, button)[data-slot="bubble-content"]:hover {
647
+ background: color-mix(in oklab, var(--vh-ui-primary) 80%, transparent);
648
+ }
649
+ }
765
650
 
766
- .vh-invocation-message__more {
767
- appearance: none;
768
- background: transparent;
769
- border: 0;
770
- color: var(--vh-ui-muted);
771
- cursor: pointer;
772
- font: inherit;
773
- font-size: 0.75rem;
774
- margin-block-start: 0.35rem;
775
- padding: 0;
776
- text-decoration: underline dotted;
777
- text-underline-offset: 0.25rem;
778
- }
651
+ [data-slot="bubble"][data-variant="secondary"] > [data-slot="bubble-content"] {
652
+ background: var(--vh-ui-bg-elevated);
653
+ color: var(--vh-ui-highlighted);
654
+ }
779
655
 
780
- .vh-invocation-message__more:hover,
781
- .vh-invocation-message__more:focus-visible {
782
- color: var(--vh-ui-text);
783
- }
656
+ [data-slot="bubble"][data-variant="muted"] > [data-slot="bubble-content"] {
657
+ background: var(--vh-ui-bg-muted);
658
+ }
784
659
 
785
- .vh-invocation-message[data-role="assistant"] .vh-invocation-message__body,
786
- .vh-invocation-message[data-role="user"] .vh-invocation-message__body {
787
- --vh-typeset-flow: 0.65rem;
788
- font-size: 0.875rem;
789
- line-height: 1.625;
790
- }
660
+ @media (hover: hover) {
661
+ [data-slot="bubble"]:is([data-variant="secondary"], [data-variant="muted"]) > :is(a, button)[data-slot="bubble-content"]:hover {
662
+ background: color-mix(in oklab, var(--vh-ui-bg-elevated), var(--vh-ui-highlighted) 5%);
663
+ }
664
+ }
791
665
 
792
- .vh-invocation-message[data-role="assistant"] .vh-invocation-message__body {
793
- margin-inline: 0;
794
- padding-inline: 0;
795
- }
666
+ [data-slot="bubble"][data-variant="tinted"] > [data-slot="bubble-content"] {
667
+ background: color-mix(in oklab, var(--vh-ui-primary) 14%, var(--vh-ui-bg));
668
+ color: var(--vh-ui-highlighted);
669
+ }
796
670
 
797
- .vh-invocation-event {
798
- border-radius: 0.375rem;
799
- color: var(--vh-ui-muted);
800
- }
671
+ @media (hover: hover) {
672
+ [data-slot="bubble"][data-variant="tinted"] > :is(a, button)[data-slot="bubble-content"]:hover {
673
+ background: color-mix(in oklab, var(--vh-ui-primary) 22%, var(--vh-ui-bg));
674
+ }
675
+ }
801
676
 
802
- .vh-invocation-activity[data-kind="system"] {
803
- background: color-mix(in oklab, var(--vh-ui-bg-elevated) 52%, transparent);
804
- border: 1px solid var(--vh-ui-border);
805
- border-radius: calc(var(--vh-ui-radius) * 1.1);
806
- margin-block: 0.3rem;
807
- padding: 0.4rem 0.5rem;
808
- }
677
+ [data-slot="bubble"][data-variant="outline"] > [data-slot="bubble-content"] {
678
+ background: var(--vh-ui-bg);
679
+ border-color: var(--vh-ui-border);
680
+ }
809
681
 
810
- .vh-invocation-preparation {
811
- background: color-mix(in oklab, var(--vh-ui-bg-elevated) 28%, transparent);
812
- border: 1px solid var(--vh-ui-border);
813
- border-radius: calc(var(--vh-ui-radius) * 1.1);
814
- list-style: none;
815
- margin-block: 0.3rem 1rem;
816
- overflow: hidden;
817
- }
682
+ [data-slot="bubble"][data-variant="ghost"] > [data-slot="bubble-content"] {
683
+ background: transparent;
684
+ border: none;
685
+ border-radius: 0;
686
+ padding: 0;
687
+ }
818
688
 
819
- .vh-invocation-preparation__details,
820
- .vh-invocation-preparation__summary {
821
- width: 100%;
822
- }
689
+ @media (hover: hover) {
690
+ [data-slot="bubble"]:is([data-variant="outline"], [data-variant="ghost"]) > :is(a, button)[data-slot="bubble-content"]:hover {
691
+ background: var(--vh-ui-bg-elevated);
692
+ color: var(--vh-ui-highlighted);
693
+ }
694
+ }
823
695
 
824
- .vh-invocation-preparation__summary {
825
- align-items: center;
826
- color: var(--vh-ui-muted);
827
- cursor: pointer;
828
- display: flex;
829
- gap: 0.25rem;
830
- list-style: none;
831
- min-height: 1.75rem;
832
- padding: 0.125rem 0.375rem;
833
- user-select: none;
834
- }
696
+ [data-slot="bubble"][data-variant="destructive"] > [data-slot="bubble-content"] {
697
+ background: color-mix(in oklab, var(--vh-ui-error) 12%, transparent);
698
+ color: var(--vh-ui-error);
699
+ }
835
700
 
836
- .vh-invocation-preparation__summary::-webkit-details-marker {
837
- display: none;
838
- }
701
+ @media (hover: hover) {
702
+ [data-slot="bubble"][data-variant="destructive"] > :is(a, button)[data-slot="bubble-content"]:hover {
703
+ background: color-mix(in oklab, var(--vh-ui-error) 20%, transparent);
704
+ }
705
+ }
839
706
 
840
- .vh-invocation-preparation__summary:focus-visible {
841
- outline: 2px solid color-mix(in oklab, var(--ui-primary, #2563eb) 55%, transparent);
842
- outline-offset: -2px;
843
- }
707
+ [data-slot="bubble-reactions"] {
708
+ align-items: center;
709
+ background: var(--vh-ui-bg-elevated);
710
+ border-radius: 9999px;
711
+ box-shadow: 0 0 0 3px var(--vh-ui-bg);
712
+ display: flex;
713
+ flex-shrink: 0;
714
+ font-size: 0.875rem;
715
+ gap: 0.25rem;
716
+ justify-content: center;
717
+ padding: 0.125rem 0.375rem;
718
+ position: absolute;
719
+ width: fit-content;
720
+ z-index: 10;
721
+ }
844
722
 
845
- .vh-invocation-preparation__summary > strong {
846
- color: var(--vh-ui-text);
847
- flex: 0 0 auto;
848
- font-size: 0.75rem;
849
- font-weight: 550;
850
- }
723
+ [data-slot="bubble-reactions"]:has(button) {
724
+ padding: 0;
725
+ }
851
726
 
852
- .vh-invocation-preparation__summary > code {
853
- color: var(--vh-ui-dimmed);
854
- flex: 1;
855
- font-size: 0.6875rem;
856
- min-width: 0;
857
- overflow: hidden;
858
- text-overflow: ellipsis;
859
- white-space: nowrap;
860
- }
727
+ [data-slot="bubble-reactions"][data-side="top"] {
728
+ top: 0;
729
+ translate: 0 -75%;
730
+ }
861
731
 
862
- .vh-invocation-preparation__summary > small {
863
- color: var(--vh-ui-dimmed);
864
- flex: 0 0 auto;
865
- font-size: 0.625rem;
866
- }
732
+ [data-slot="bubble-reactions"][data-side="bottom"] {
733
+ bottom: 0;
734
+ translate: 0 75%;
735
+ }
867
736
 
868
- .vh-invocation-preparation__disclosure {
869
- height: 0.75rem;
870
- opacity: 0.65;
871
- stroke: currentColor;
872
- stroke-width: 2;
873
- transition: transform 140ms ease;
874
- width: 0.75rem;
875
- }
737
+ [data-slot="bubble-reactions"][data-align="start"] {
738
+ left: 0.75rem;
739
+ }
876
740
 
877
- .vh-invocation-preparation__details[open] .vh-invocation-preparation__disclosure {
878
- transform: rotate(180deg);
879
- }
741
+ [data-slot="bubble-reactions"][data-align="end"] {
742
+ right: 0.75rem;
743
+ }
880
744
 
881
- .vh-invocation-preparation__steps {
882
- display: grid;
883
- list-style: none;
884
- margin: 0;
885
- padding: 0 0 0.1875rem;
886
- }
745
+ /* Marker */
746
+
747
+ [data-slot="marker"] {
748
+ align-items: center;
749
+ color: var(--vh-ui-muted);
750
+ display: flex;
751
+ font-size: 0.875rem;
752
+ gap: 0.5rem;
753
+ line-height: 1.25rem;
754
+ min-height: 1rem;
755
+ position: relative;
756
+ text-align: left;
757
+ width: 100%;
758
+ }
887
759
 
888
- .vh-invocation-preparation__steps > li {
889
- align-items: center;
890
- color: var(--vh-ui-muted);
891
- display: grid;
892
- gap: 0.25rem;
893
- grid-template-columns: auto auto minmax(0, 1fr) auto;
894
- min-height: 1.5rem;
895
- padding: 0 0.375rem;
896
- }
760
+ [data-slot="marker"] :is(svg, .iconify):not([class*="size-"]),
761
+ [data-slot="marker-icon"] {
762
+ flex-shrink: 0;
763
+ height: 1rem;
764
+ width: 1rem;
765
+ }
897
766
 
898
- .vh-invocation-preparation__body,
899
- .vh-invocation-preparation__steps .vh-invocation-event__notice {
900
- grid-column: 2 / -1;
901
- margin: 0 0 0.375rem;
902
- }
767
+ :is(a[data-slot="marker"], [data-slot="marker-content"] > a) {
768
+ color: inherit;
769
+ text-decoration: underline;
770
+ text-underline-offset: 3px;
771
+ }
903
772
 
904
- .vh-invocation-preparation__body {
905
- color: var(--vh-ui-dimmed);
906
- font-size: 0.75rem;
907
- white-space: pre-wrap;
908
- }
773
+ @media (hover: hover) {
774
+ :is(a[data-slot="marker"], [data-slot="marker-content"] > a):hover {
775
+ color: var(--vh-ui-highlighted);
776
+ }
777
+ }
909
778
 
910
- .vh-invocation-preparation__steps strong {
911
- color: var(--vh-ui-text);
912
- flex: 0 0 auto;
913
- font-size: 0.75rem;
914
- font-weight: 500;
915
- }
779
+ [data-slot="marker"][data-variant="separator"]::before,
780
+ [data-slot="marker"][data-variant="separator"]::after {
781
+ background: var(--vh-ui-border);
782
+ content: "";
783
+ flex: 1;
784
+ height: 1px;
785
+ min-width: 0;
786
+ }
916
787
 
917
- .vh-invocation-preparation__steps code {
918
- color: var(--vh-ui-dimmed);
919
- flex: 0 1 auto;
920
- font-size: 0.6875rem;
921
- min-width: 0;
922
- overflow: hidden;
923
- text-overflow: ellipsis;
924
- white-space: nowrap;
925
- }
788
+ [data-slot="marker"][data-variant="separator"]::before {
789
+ margin-right: 0.25rem;
790
+ }
926
791
 
927
- .vh-invocation-preparation__context {
928
- align-items: center;
929
- color: var(--vh-ui-dimmed);
930
- display: inline-flex;
931
- flex: 0 1 auto;
932
- font-size: 0.6875rem;
933
- gap: 0.25rem;
934
- min-width: 0;
935
- overflow: hidden;
936
- white-space: nowrap;
937
- }
792
+ [data-slot="marker"][data-variant="separator"]::after {
793
+ margin-left: 0.25rem;
794
+ }
938
795
 
939
- .vh-invocation-preparation__summary > .vh-invocation-preparation__context {
940
- flex: 1;
941
- }
796
+ [data-slot="marker"][data-variant="border"] {
797
+ border-bottom: 1px solid var(--vh-ui-border);
798
+ padding-bottom: 0.5rem;
799
+ }
942
800
 
943
- .vh-invocation-preparation__context code {
944
- flex: 0 1 auto;
945
- }
801
+ [data-slot="marker-content"] {
802
+ min-width: 0;
803
+ overflow-wrap: break-word;
804
+ }
946
805
 
947
- .vh-invocation-preparation__context a {
948
- color: inherit;
949
- flex: 0 0 auto;
950
- text-decoration: none;
951
- }
806
+ [data-slot="marker"][data-variant="separator"] [data-slot="marker-content"] {
807
+ flex: none;
808
+ text-align: center;
809
+ }
952
810
 
953
- .vh-invocation-preparation__context a:hover,
954
- .vh-invocation-preparation__context a:focus-visible {
955
- color: var(--vh-ui-text);
956
- text-decoration: underline;
957
- text-underline-offset: 0.2em;
958
- }
811
+ /* Trace */
959
812
 
960
- .vh-invocation-preparation__action {
961
- align-items: center;
962
- appearance: none;
963
- background: transparent;
964
- border: 0;
965
- border-radius: 0.25rem;
966
- color: var(--vh-ui-muted);
967
- cursor: pointer;
968
- display: inline-flex;
969
- flex: 0 0 1.25rem;
970
- height: 1.25rem;
971
- justify-content: center;
972
- padding: 0;
973
- text-decoration: none;
974
- width: 1.25rem;
975
- }
813
+ [data-slot="trace"] {
814
+ display: flex;
815
+ flex-direction: column;
816
+ gap: 0.5rem;
817
+ min-width: 0;
818
+ width: 100%;
819
+ }
976
820
 
977
- .vh-invocation-preparation__action:hover,
978
- .vh-invocation-preparation__action:focus-visible {
979
- color: var(--vh-ui-text);
980
- outline: none;
981
- }
821
+ [data-slot="trace"] > :has(> [data-slot="trace-line"]) {
822
+ border-radius: calc(var(--vh-ui-radius) * 0.75);
823
+ display: flex;
824
+ max-width: 100%;
825
+ min-width: 0;
826
+ outline: none;
827
+ text-align: left;
828
+ width: fit-content;
829
+ }
982
830
 
983
- .vh-invocation-preparation__action .vh-invocation-event__icon {
984
- height: 1rem;
985
- width: 1rem;
986
- }
831
+ [data-slot="trace"] > :has(> [data-slot="trace-line"]):focus-visible {
832
+ box-shadow: 0 0 0 3px var(--vh-ui-ring);
833
+ }
987
834
 
988
- .vh-invocation-preparation__action .vh-invocation-event__icon svg {
989
- height: 0.8rem;
990
- width: 0.8rem;
991
- }
835
+ [data-slot="trace-line"] {
836
+ align-items: center;
837
+ color: var(--vh-ui-muted);
838
+ display: flex;
839
+ font-size: 0.875rem;
840
+ gap: 0.5rem;
841
+ line-height: 1.25rem;
842
+ max-width: 100%;
843
+ min-width: 0;
844
+ transition: color 150ms;
845
+ width: fit-content;
846
+ }
992
847
 
993
- .vh-invocation-activity[data-inspectable="true"] .vh-invocation-event__summary {
994
- cursor: pointer;
995
- }
848
+ :is(a, button) [data-slot="trace-line"] {
849
+ cursor: pointer;
850
+ }
996
851
 
997
- .vh-invocation-lifecycle {
998
- background: color-mix(in oklab, var(--vh-ui-bg-elevated) 28%, transparent);
999
- border: 1px solid var(--vh-ui-border);
1000
- border-radius: calc(var(--vh-ui-radius) * 1.1);
1001
- list-style: none;
1002
- margin-block: 0.3rem 1rem;
1003
- overflow: hidden;
1004
- }
852
+ @media (hover: hover) {
853
+ :is(a, button):hover [data-slot="trace-line"] {
854
+ color: var(--vh-ui-highlighted);
855
+ }
856
+ }
1005
857
 
1006
- .vh-invocation-lifecycle__rows {
1007
- display: grid;
1008
- list-style: none;
1009
- margin: 0;
1010
- padding: 0.1875rem 0;
1011
- }
858
+ [data-slot="trace-line"][data-status="error"],
859
+ :is(a, button):hover [data-slot="trace-line"][data-status="error"] {
860
+ color: var(--vh-ui-error);
861
+ }
1012
862
 
1013
- .vh-invocation-lifecycle__rows > li {
1014
- min-width: 0;
1015
- }
863
+ [data-slot="trace-line"][data-status="pending"] {
864
+ opacity: 0.6;
865
+ }
1016
866
 
1017
- .vh-invocation-lifecycle__row {
1018
- align-items: center;
1019
- appearance: none;
1020
- background: transparent;
1021
- border: 0;
1022
- color: var(--vh-ui-muted);
1023
- display: flex;
1024
- font: inherit;
1025
- gap: 0.25rem;
1026
- min-height: 1.5rem;
1027
- min-width: 0;
1028
- padding: 0 0.375rem;
1029
- text-align: start;
1030
- width: 100%;
1031
- }
867
+ [data-slot="trace-icon"] {
868
+ align-items: center;
869
+ display: flex;
870
+ flex-shrink: 0;
871
+ height: 1rem;
872
+ justify-content: center;
873
+ width: 1rem;
874
+ }
1032
875
 
1033
- button.vh-invocation-lifecycle__row {
1034
- cursor: pointer;
1035
- }
876
+ [data-slot="trace-icon"] svg {
877
+ pointer-events: none;
878
+ }
1036
879
 
1037
- button.vh-invocation-lifecycle__row:hover,
1038
- button.vh-invocation-lifecycle__row:focus-visible {
1039
- color: var(--vh-ui-text);
1040
- }
880
+ [data-slot="trace-icon"] :is(svg, .iconify):not([class*="size-"]) {
881
+ height: 1rem;
882
+ width: 1rem;
883
+ }
1041
884
 
1042
- button.vh-invocation-lifecycle__row:focus-visible {
1043
- outline: 1px solid color-mix(in oklab, var(--ui-primary, #2563eb) 55%, transparent);
1044
- outline-offset: -1px;
1045
- }
885
+ [data-slot="trace-title"] ~ [data-slot="trace-icon"] {
886
+ margin-left: -0.25rem;
887
+ }
1046
888
 
1047
- .vh-invocation-lifecycle__title {
1048
- color: var(--vh-ui-text);
1049
- flex: 0 0 auto;
1050
- font-size: 0.75rem;
1051
- font-weight: 500;
1052
- }
889
+ [data-slot="trace-title"] {
890
+ min-width: 0;
891
+ overflow: hidden;
892
+ text-overflow: ellipsis;
893
+ white-space: nowrap;
894
+ }
1053
895
 
1054
- .vh-invocation-lifecycle__detail {
1055
- color: var(--vh-ui-dimmed);
1056
- flex: 1;
1057
- font-size: 0.6875rem;
1058
- min-width: 0;
1059
- overflow: hidden;
1060
- text-overflow: ellipsis;
1061
- white-space: nowrap;
1062
- }
896
+ [data-slot="trace-description"] {
897
+ color: color-mix(in oklab, var(--vh-ui-muted) 70%, transparent);
898
+ flex-shrink: 0;
899
+ font-variant-numeric: tabular-nums;
900
+ }
1063
901
 
1064
- .vh-invocation-lifecycle__failure {
1065
- color: var(--vh-ui-error);
1066
- flex: 1;
1067
- font-size: 0.6875rem;
1068
- min-width: 0;
1069
- }
902
+ [data-slot="trace-collapsible"] {
903
+ display: flex;
904
+ flex-direction: column;
905
+ min-width: 0;
906
+ width: 100%;
907
+ }
1070
908
 
1071
- .vh-invocation-lifecycle__emoji {
1072
- align-items: center;
1073
- display: inline-flex;
1074
- flex: 0 0 1.25rem;
1075
- font-size: 0.75rem;
1076
- height: 1.25rem;
1077
- justify-content: center;
1078
- line-height: 1;
1079
- width: 1.25rem;
1080
- }
909
+ [data-slot="trace-collapsible-trigger"] {
910
+ align-items: center;
911
+ background: transparent;
912
+ border: 0;
913
+ border-radius: calc(var(--vh-ui-radius) * 0.75);
914
+ color: var(--vh-ui-muted);
915
+ cursor: pointer;
916
+ display: flex;
917
+ font: inherit;
918
+ gap: 0.25rem;
919
+ max-width: 100%;
920
+ min-width: 0;
921
+ outline: none;
922
+ padding: 0;
923
+ text-align: left;
924
+ transition: color 150ms;
925
+ width: fit-content;
926
+ }
1081
927
 
1082
- .vh-invocation-lifecycle__label {
1083
- background: var(--vh-invocation-label-bg, var(--vh-ui-border));
1084
- border: 1px solid color-mix(in srgb, var(--vh-invocation-label-bg, var(--vh-ui-border)) 80%, #000000);
1085
- border-radius: 999px;
1086
- color: var(--vh-invocation-label-fg, var(--vh-ui-text));
1087
- flex: 0 1 auto;
1088
- font-size: 0.625rem;
1089
- font-weight: 550;
1090
- line-height: 1rem;
1091
- max-width: 100%;
1092
- overflow: hidden;
1093
- padding-inline: 0.4rem;
1094
- text-overflow: ellipsis;
1095
- white-space: nowrap;
1096
- }
928
+ @media (hover: hover) {
929
+ [data-slot="trace-collapsible-trigger"]:hover {
930
+ color: var(--vh-ui-highlighted);
931
+ }
932
+ }
1097
933
 
1098
- [data-slot="invocation"] [data-activity-id][data-selected="true"] {
1099
- background: color-mix(in oklab, var(--vh-ui-info) 9%, transparent);
1100
- border-radius: calc(var(--vh-ui-radius) * 0.85);
1101
- outline: 2px solid color-mix(in oklab, var(--vh-ui-info) 42%, transparent);
1102
- outline-offset: 2px;
1103
- scroll-margin-block: 5rem;
1104
- }
934
+ [data-slot="trace-collapsible-trigger"]:focus-visible {
935
+ box-shadow: 0 0 0 3px var(--vh-ui-ring);
936
+ }
1105
937
 
1106
- .vh-invocation-event__summary {
1107
- align-items: center;
1108
- border-radius: inherit;
1109
- cursor: pointer;
1110
- display: flex;
1111
- gap: 0.375rem;
1112
- min-height: 1.5rem;
1113
- padding: 0.125rem;
1114
- transition: background-color 140ms ease, color 140ms ease;
1115
- }
938
+ [data-slot="trace-collapsible-trigger"]:has([data-status="error"]) {
939
+ color: var(--vh-ui-error);
940
+ }
1116
941
 
1117
- button.vh-invocation-event__summary {
1118
- appearance: none;
1119
- background: transparent;
1120
- border: 0;
1121
- color: inherit;
1122
- font: inherit;
1123
- text-align: start;
1124
- width: 100%;
1125
- }
942
+ [data-trace-chevron] svg {
943
+ stroke: currentColor;
944
+ stroke-width: 2;
945
+ transition: rotate 150ms;
946
+ }
1126
947
 
1127
- .vh-invocation-event__summary::-webkit-details-marker {
1128
- display: none;
1129
- }
948
+ [data-slot="trace-collapsible-trigger"][aria-expanded="true"] [data-trace-chevron] svg {
949
+ rotate: 90deg;
950
+ }
1130
951
 
1131
- .vh-invocation-event__summary:focus-visible {
1132
- background: color-mix(in oklab, var(--vh-ui-bg-elevated) 55%, transparent);
1133
- color: inherit;
1134
- outline: 1px solid color-mix(in oklab, var(--ui-primary, #2563eb) 55%, transparent);
1135
- outline-offset: 1px;
1136
- }
952
+ [data-slot="trace-collapsible-content"] {
953
+ min-width: 0;
954
+ overflow: hidden;
955
+ }
1137
956
 
1138
- details.vh-invocation-event > .vh-invocation-event__summary:hover {
1139
- color: var(--vh-ui-text);
1140
- }
957
+ [data-slot="trace-collapsible-content"][data-state="open"] {
958
+ animation: vh-trace-open 200ms ease-out;
959
+ }
1141
960
 
1142
- .vh-invocation-event__icon {
1143
- align-items: center;
1144
- display: inline-flex;
1145
- flex: 0 0 1.25rem;
1146
- height: 1.25rem;
1147
- justify-content: center;
1148
- position: relative;
1149
- width: 1.25rem;
1150
- }
961
+ [data-slot="trace-collapsible-content"][data-state="closed"] {
962
+ animation: vh-trace-close 200ms ease-out;
963
+ }
1151
964
 
1152
- .vh-invocation-event__icon svg {
1153
- height: 0.875rem;
1154
- opacity: 0.65;
1155
- stroke: currentColor;
1156
- stroke-width: 1.65;
1157
- width: 0.875rem;
1158
- }
965
+ @keyframes vh-trace-open {
966
+ from {
967
+ height: 0;
968
+ }
969
+ to {
970
+ height: var(--reka-collapsible-content-height);
971
+ }
972
+ }
1159
973
 
1160
- .vh-invocation-event__icon[data-icon="activity"] > svg:first-child {
1161
- stroke-width: 5;
1162
- }
974
+ @keyframes vh-trace-close {
975
+ from {
976
+ height: var(--reka-collapsible-content-height);
977
+ }
978
+ to {
979
+ height: 0;
980
+ }
981
+ }
1163
982
 
1164
- .vh-invocation-event__failure-icon {
1165
- background: var(--vh-ui-bg);
1166
- border-radius: 999px;
1167
- bottom: -0.05rem;
1168
- color: var(--vh-ui-text);
1169
- height: 0.65rem !important;
1170
- opacity: 0.86 !important;
1171
- position: absolute;
1172
- right: -0.05rem;
1173
- stroke: none !important;
1174
- width: 0.65rem !important;
1175
- }
983
+ @media (prefers-reduced-motion: reduce) {
984
+ [data-slot="trace-collapsible-content"] {
985
+ animation: none !important;
986
+ }
987
+ }
1176
988
 
1177
- .vh-invocation-event__title {
1178
- flex: none;
1179
- font-size: 0.75rem;
1180
- font-weight: 550;
1181
- line-height: 1.25rem;
1182
- }
989
+ [data-slot="trace-collapsible-content-inner"] {
990
+ border-left: 1px solid var(--vh-ui-border);
991
+ color: var(--vh-ui-muted);
992
+ line-height: 1.625;
993
+ margin: 0.5rem 0 0.25rem calc(0.5rem - 1px);
994
+ min-width: 0;
995
+ overflow-wrap: break-word;
996
+ padding-left: 1rem;
997
+ padding-right: 0.25rem;
998
+ }
1183
999
 
1184
- .vh-invocation-event__suffix {
1185
- color: var(--vh-ui-dimmed);
1186
- flex: 1;
1187
- font-size: 0.75rem;
1188
- font-weight: 400;
1189
- min-width: 0;
1190
- overflow: hidden;
1191
- text-overflow: ellipsis;
1192
- white-space: nowrap;
1193
- }
1000
+ /* Attachment */
1194
1001
 
1195
- .vh-invocation-event__disclosure {
1196
- color: var(--vh-ui-dimmed);
1197
- flex: 0 0 0.75rem;
1198
- height: 0.75rem;
1199
- opacity: 0.65;
1200
- transform: rotate(0);
1201
- transition: opacity 140ms ease, transform 140ms ease;
1202
- width: 0.75rem;
1203
- }
1002
+ [data-slot="attachment"] {
1003
+ background: var(--vh-ui-bg);
1004
+ border: 1px solid var(--vh-ui-border);
1005
+ border-radius: calc(var(--vh-ui-radius) * 1.5);
1006
+ color: var(--vh-ui-text);
1007
+ display: flex;
1008
+ flex-shrink: 0;
1009
+ flex-wrap: wrap;
1010
+ max-width: 100%;
1011
+ min-width: 0;
1012
+ position: relative;
1013
+ transition: background-color 150ms, border-color 150ms;
1014
+ width: fit-content;
1015
+ }
1204
1016
 
1205
- .vh-invocation-event[open] .vh-invocation-event__disclosure {
1206
- transform: rotate(180deg);
1207
- }
1017
+ /* The trigger covers the attachment and hides its own outline, so the attachment shows the ring of the other parts. */
1018
+ [data-slot="attachment"]:has([data-slot="attachment-trigger"]:focus-visible) {
1019
+ box-shadow: 0 0 0 3px var(--vh-ui-ring);
1020
+ }
1208
1021
 
1209
- .vh-invocation-work {
1210
- margin-block-end: 1rem;
1211
- padding-block-start: 0.25rem;
1212
- }
1022
+ [data-slot="attachment"]:has(> a, > button):hover {
1023
+ background: color-mix(in oklab, var(--vh-ui-bg-elevated) 50%, var(--vh-ui-bg));
1024
+ }
1213
1025
 
1214
- .vh-invocation-work__details {
1215
- color: var(--vh-ui-muted);
1216
- }
1026
+ [data-slot="attachment"][data-state="error"] {
1027
+ border-color: color-mix(in oklab, var(--vh-ui-error) 30%, transparent);
1028
+ }
1217
1029
 
1218
- .vh-invocation-work__summary {
1219
- align-items: center;
1220
- border-radius: 0.375rem;
1221
- cursor: pointer;
1222
- display: flex;
1223
- gap: 0.25rem;
1224
- line-height: 1.25rem;
1225
- list-style: none;
1226
- padding: 0 0.25rem;
1227
- user-select: none;
1228
- width: fit-content;
1229
- }
1030
+ [data-slot="attachment"][data-state="idle"] {
1031
+ border-style: dashed;
1032
+ }
1230
1033
 
1231
- .vh-invocation-work__summary::-webkit-details-marker {
1232
- display: none;
1233
- }
1034
+ [data-slot="attachment"][data-size="default"] {
1035
+ font-size: 0.875rem;
1036
+ gap: 0.5rem;
1037
+ line-height: 1.25rem;
1038
+ }
1234
1039
 
1235
- .vh-invocation-work__summary:focus-visible {
1236
- box-shadow: inset 0 0 0 2px color-mix(in oklab, var(--ui-primary, #2563eb) 70%, transparent);
1237
- outline: none;
1238
- }
1040
+ [data-slot="attachment"][data-size="default"]:has([data-slot="attachment-media"]) {
1041
+ padding: 0.5rem;
1042
+ }
1239
1043
 
1240
- .vh-invocation-work__divider {
1241
- border-block-start: 1px solid color-mix(in oklab, var(--vh-ui-border) 60%, transparent);
1242
- margin-block-start: 0.5rem;
1243
- }
1044
+ [data-slot="attachment"][data-size="default"]:has([data-slot="attachment-content"]) {
1045
+ padding: 0.5rem 0.625rem;
1046
+ }
1244
1047
 
1245
- .vh-invocation-work__title {
1246
- font-size: 0.75rem;
1247
- font-variant-numeric: tabular-nums;
1248
- }
1048
+ [data-slot="attachment"][data-size="sm"] {
1049
+ font-size: 0.75rem;
1050
+ gap: 0.625rem;
1051
+ line-height: 1rem;
1052
+ }
1249
1053
 
1250
- .vh-invocation-work__disclosure {
1251
- height: 0.875rem;
1252
- opacity: 0.7;
1253
- stroke: currentColor;
1254
- stroke-width: 2;
1255
- transition: transform 150ms ease;
1256
- width: 0.875rem;
1257
- }
1054
+ [data-slot="attachment"][data-size="sm"]:has([data-slot="attachment-media"]) {
1055
+ padding: 0.375rem;
1056
+ }
1258
1057
 
1259
- .vh-invocation-work__details[open] .vh-invocation-work__disclosure {
1260
- transform: rotate(180deg);
1261
- }
1058
+ [data-slot="attachment"][data-size="sm"]:has([data-slot="attachment-content"]) {
1059
+ padding: 0.375rem 0.5rem;
1060
+ }
1262
1061
 
1263
- .vh-invocation-work__activities {
1264
- display: flex;
1265
- flex-direction: column;
1266
- gap: 0.0625rem;
1267
- list-style: none;
1268
- margin: 1rem 0 0;
1269
- padding: 0;
1270
- }
1062
+ [data-slot="attachment"][data-size="xs"] {
1063
+ border-radius: var(--vh-ui-radius);
1064
+ font-size: 0.75rem;
1065
+ gap: 0.375rem;
1066
+ line-height: 1rem;
1067
+ }
1271
1068
 
1272
- .vh-invocation-work__details:not([open]) > .vh-invocation-work__activities {
1273
- display: none;
1274
- }
1069
+ [data-slot="attachment"][data-size="xs"]:has([data-slot="attachment-media"]) {
1070
+ padding: 0.25rem;
1071
+ }
1275
1072
 
1276
- .vh-invocation-event__body,
1277
- .vh-invocation-command,
1278
- .vh-invocation-event__diffs,
1279
- .vh-invocation-event__payloads {
1280
- border-inline-start: 1px solid var(--vh-ui-border);
1281
- margin: 0.25rem 0 0 1.75rem;
1282
- max-height: 16rem;
1283
- overflow: auto;
1284
- padding-inline-start: 0.75rem;
1285
- }
1073
+ [data-slot="attachment"][data-size="xs"]:has([data-slot="attachment-content"]) {
1074
+ padding: 0.25rem 0.375rem;
1075
+ }
1286
1076
 
1287
- .vh-invocation-event__payloads {
1288
- display: grid;
1289
- gap: 0.625rem;
1290
- }
1077
+ [data-slot="attachment"][data-orientation="horizontal"] {
1078
+ align-items: center;
1079
+ min-width: 10rem;
1080
+ }
1291
1081
 
1292
- .vh-invocation-event__payload {
1293
- border: 1px solid color-mix(in oklab, var(--vh-ui-border) 78%, transparent);
1294
- border-radius: calc(var(--vh-ui-radius) * 0.9);
1295
- min-width: 0;
1296
- overflow: hidden;
1297
- }
1082
+ [data-slot="attachment"][data-orientation="vertical"] {
1083
+ flex-direction: column;
1084
+ width: 6rem;
1085
+ }
1298
1086
 
1299
- .vh-invocation-event__payload > summary {
1300
- align-items: center;
1301
- background: color-mix(in oklab, var(--vh-ui-bg-elevated) 65%, transparent);
1302
- cursor: pointer;
1303
- display: grid;
1304
- gap: 0.5rem;
1305
- grid-template-columns: auto minmax(0, 1fr) auto;
1306
- list-style: none;
1307
- min-height: 2.25rem;
1308
- padding: 0.45rem 0.65rem;
1309
- }
1087
+ [data-slot="attachment"][data-orientation="vertical"]:has([data-slot="attachment-content"]) {
1088
+ width: 7.5rem;
1089
+ }
1310
1090
 
1311
- .vh-invocation-event__payload > summary::-webkit-details-marker {
1312
- display: none;
1313
- }
1091
+ [data-slot="attachment-media"] {
1092
+ align-items: center;
1093
+ aspect-ratio: 1;
1094
+ background: var(--vh-ui-bg-elevated);
1095
+ border-radius: var(--vh-ui-radius);
1096
+ color: var(--vh-ui-highlighted);
1097
+ display: flex;
1098
+ flex-shrink: 0;
1099
+ justify-content: center;
1100
+ overflow: hidden;
1101
+ position: relative;
1102
+ width: 2.5rem;
1103
+ }
1314
1104
 
1315
- .vh-invocation-event__payload > summary:focus-visible {
1316
- outline: 2px solid color-mix(in oklab, var(--vh-ui-info) 55%, transparent);
1317
- outline-offset: -2px;
1318
- }
1105
+ [data-slot="attachment"][data-orientation="vertical"] [data-slot="attachment-media"] {
1106
+ width: 100%;
1107
+ }
1319
1108
 
1320
- .vh-invocation-event__payload > summary strong {
1321
- color: var(--vh-ui-dimmed);
1322
- font-size: 0.6875rem;
1323
- font-weight: 650;
1324
- letter-spacing: 0.08em;
1325
- text-transform: uppercase;
1326
- }
1109
+ [data-slot="attachment"][data-size="sm"] [data-slot="attachment-media"] {
1110
+ width: 2rem;
1111
+ }
1327
1112
 
1328
- .vh-invocation-event__payload > summary code {
1329
- color: var(--vh-ui-muted);
1330
- font: 0.75rem/1.4 ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
1331
- overflow: hidden;
1332
- text-overflow: ellipsis;
1333
- white-space: nowrap;
1334
- }
1113
+ [data-slot="attachment"][data-size="xs"] [data-slot="attachment-media"] {
1114
+ border-radius: calc(var(--vh-ui-radius) * 0.75);
1115
+ width: 1.75rem;
1116
+ }
1335
1117
 
1336
- .vh-invocation-event__payload[open] > summary .vh-invocation-event__disclosure {
1337
- transform: rotate(180deg);
1338
- }
1118
+ [data-slot="attachment"][data-state="error"] [data-slot="attachment-media"] {
1119
+ background: color-mix(in oklab, var(--vh-ui-error) 10%, transparent);
1120
+ color: var(--vh-ui-error);
1121
+ }
1339
1122
 
1340
- .vh-invocation-payload__content {
1341
- border-block-start: 1px solid color-mix(in oklab, var(--vh-ui-border) 72%, transparent);
1342
- padding: 0.6rem;
1343
- }
1123
+ [data-slot="attachment-media"] svg {
1124
+ pointer-events: none;
1125
+ }
1344
1126
 
1345
- .vh-invocation-payload__toolbar {
1346
- align-items: center;
1347
- display: flex;
1348
- flex-wrap: wrap;
1349
- gap: 0.4rem;
1350
- margin-block-end: 0.55rem;
1351
- }
1127
+ [data-slot="attachment-media"] :is(svg, .iconify):not([class*="size-"]) {
1128
+ height: 1rem;
1129
+ width: 1rem;
1130
+ }
1352
1131
 
1353
- .vh-invocation-payload__modes {
1354
- background: color-mix(in oklab, var(--vh-ui-bg-muted) 76%, transparent);
1355
- border-radius: calc(var(--vh-ui-radius) * 0.72);
1356
- display: inline-flex;
1357
- padding: 0.125rem;
1358
- }
1132
+ [data-slot="attachment"][data-orientation="vertical"] [data-slot="attachment-media"] :is(svg, .iconify):not([class*="size-"]) {
1133
+ height: 1.5rem;
1134
+ width: 1.5rem;
1135
+ }
1359
1136
 
1360
- .vh-invocation-payload__toolbar button {
1361
- background: transparent;
1362
- border: 0;
1363
- border-radius: calc(var(--vh-ui-radius) * 0.6);
1364
- color: var(--vh-ui-muted);
1365
- cursor: pointer;
1366
- font: inherit;
1367
- font-size: 0.6875rem;
1368
- min-height: 1.75rem;
1369
- padding: 0.25rem 0.5rem;
1137
+ [data-slot="attachment"][data-size="xs"] [data-slot="attachment-media"] :is(svg, .iconify):not([class*="size-"]) {
1138
+ height: 0.875rem;
1139
+ width: 0.875rem;
1140
+ }
1141
+
1142
+ [data-slot="attachment-media"][data-variant="image"] {
1143
+ opacity: 0.6;
1144
+ }
1145
+
1146
+ [data-slot="attachment"]:is([data-state="done"], [data-state="idle"]) [data-slot="attachment-media"][data-variant="image"] {
1147
+ opacity: 1;
1148
+ }
1149
+
1150
+ [data-slot="attachment-media"][data-variant="image"] > img {
1151
+ aspect-ratio: 1;
1152
+ object-fit: cover;
1153
+ width: 100%;
1154
+ }
1155
+
1156
+ [data-slot="attachment-content"] {
1157
+ flex: 1;
1158
+ line-height: 1.25;
1159
+ max-width: 100%;
1160
+ min-width: 0;
1161
+ }
1162
+
1163
+ [data-slot="attachment"][data-orientation="vertical"] [data-slot="attachment-content"] {
1164
+ padding-inline: 0.25rem;
1165
+ }
1166
+
1167
+ [data-slot="attachment-title"] {
1168
+ display: block;
1169
+ font-weight: 500;
1170
+ max-width: 100%;
1171
+ min-width: 0;
1172
+ overflow: hidden;
1173
+ text-overflow: ellipsis;
1174
+ white-space: nowrap;
1175
+ }
1176
+
1177
+ [data-slot="attachment-description"] {
1178
+ color: var(--vh-ui-muted);
1179
+ display: block;
1180
+ font-size: 0.75rem;
1181
+ line-height: 1rem;
1182
+ margin-top: 0.125rem;
1183
+ max-width: 100%;
1184
+ min-width: 0;
1185
+ overflow: hidden;
1186
+ text-overflow: ellipsis;
1187
+ white-space: nowrap;
1188
+ }
1189
+
1190
+ [data-slot="attachment"][data-state="error"] [data-slot="attachment-description"] {
1191
+ color: color-mix(in oklab, var(--vh-ui-error) 80%, transparent);
1192
+ }
1193
+
1194
+ [data-slot="attachment-actions"] {
1195
+ align-items: center;
1196
+ display: flex;
1197
+ flex-shrink: 0;
1198
+ position: relative;
1199
+ z-index: 20;
1200
+ }
1201
+
1202
+ [data-slot="attachment"][data-orientation="vertical"] [data-slot="attachment-actions"] {
1203
+ gap: 0.25rem;
1204
+ position: absolute;
1205
+ right: 0.75rem;
1206
+ top: 0.75rem;
1207
+ }
1208
+
1209
+ [data-slot="attachment-trigger"] {
1210
+ background: transparent;
1211
+ border: 0;
1212
+ border-radius: inherit;
1213
+ cursor: pointer;
1214
+ inset: 0;
1215
+ outline: none;
1216
+ padding: 0;
1217
+ position: absolute;
1218
+ z-index: 10;
1219
+ }
1220
+
1221
+ [data-slot="attachment-group"] {
1222
+ display: flex;
1223
+ gap: 0.75rem;
1224
+ min-width: 0;
1225
+ overflow-x: auto;
1226
+ overscroll-behavior-x: contain;
1227
+ padding-block: 0.25rem;
1228
+ scroll-padding-inline: 0.25rem;
1229
+ scroll-snap-type: x mandatory;
1230
+ scrollbar-width: none;
1231
+ }
1232
+
1233
+ [data-slot="attachment-group"] > [data-slot="attachment"] {
1234
+ flex: none;
1235
+ scroll-snap-align: start;
1236
+ }
1370
1237
  }
1371
1238
 
1372
- .vh-invocation-payload__toolbar button:is(:hover, [aria-pressed="true"]) {
1373
- background: var(--vh-ui-bg-elevated);
1374
- color: var(--vh-ui-text);
1375
- }
1239
+ /* shadcn/ui CodeBlock and Message Scroller parts, with the same token mapping as the parts above. */
1240
+ @layer components {
1241
+ /* Code Block */
1242
+
1243
+ [data-slot="code-block"] {
1244
+ border: 1px solid var(--vh-ui-border);
1245
+ border-radius: var(--vh-ui-radius);
1246
+ color: var(--vh-ui-highlighted);
1247
+ display: flex;
1248
+ flex-direction: column;
1249
+ font-size: 0.875rem;
1250
+ line-height: 1.25rem;
1251
+ min-width: 0;
1252
+ overflow: hidden;
1253
+ position: relative;
1254
+ width: 100%;
1255
+ }
1256
+
1257
+ :root.dark [data-slot="code-block"] {
1258
+ background: color-mix(in oklab, var(--vh-ui-bg-elevated) 40%, transparent);
1259
+ }
1260
+
1261
+ [data-slot="code-block"]:has(> [data-slot="code-block-content"]:focus-visible) {
1262
+ border-color: var(--vh-ui-primary);
1263
+ box-shadow: 0 0 0 3px var(--vh-ui-ring);
1264
+ }
1265
+
1266
+ [data-slot="code-block"][data-size="sm"] {
1267
+ font-size: 0.75rem;
1268
+ line-height: 1rem;
1269
+ }
1270
+
1271
+ [data-slot="code-block"][data-variant="destructive"] {
1272
+ border-color: color-mix(in oklab, var(--vh-ui-error) 30%, transparent);
1273
+ color: var(--vh-ui-error);
1274
+ }
1275
+
1276
+ [data-slot="code-block-header"],
1277
+ [data-slot="code-block-footer"] {
1278
+ align-items: center;
1279
+ color: var(--vh-ui-muted);
1280
+ display: flex;
1281
+ flex-shrink: 0;
1282
+ gap: 0.5rem;
1283
+ min-width: 0;
1284
+ padding-inline: 0.75rem;
1285
+ }
1286
+
1287
+ [data-slot="code-block-header"] {
1288
+ padding-top: 0.75rem;
1289
+ }
1290
+
1291
+ [data-slot="code-block-footer"] {
1292
+ padding-bottom: 0.75rem;
1293
+ }
1294
+
1295
+ [data-slot="code-block"][data-size="sm"] :is([data-slot="code-block-header"], [data-slot="code-block-footer"]) {
1296
+ padding-inline: 0.625rem;
1297
+ }
1298
+
1299
+ [data-slot="code-block"][data-size="sm"] [data-slot="code-block-header"] {
1300
+ padding-top: 0.625rem;
1301
+ }
1302
+
1303
+ [data-slot="code-block"][data-size="sm"] [data-slot="code-block-footer"] {
1304
+ padding-bottom: 0.625rem;
1305
+ }
1306
+
1307
+ [data-slot="code-block"][data-variant="destructive"] :is([data-slot="code-block-header"], [data-slot="code-block-title"]) {
1308
+ color: var(--vh-ui-error);
1309
+ }
1310
+
1311
+ [data-slot="code-block-title"] {
1312
+ color: var(--vh-ui-highlighted);
1313
+ font-family: var(--font-sans, inherit);
1314
+ font-size: 0.875rem;
1315
+ font-weight: 500;
1316
+ line-height: 1.25rem;
1317
+ min-width: 0;
1318
+ overflow: hidden;
1319
+ text-overflow: ellipsis;
1320
+ white-space: nowrap;
1321
+ }
1322
+
1323
+ [data-slot="code-block"][data-size="sm"] [data-slot="code-block-title"] {
1324
+ font-size: 0.75rem;
1325
+ line-height: 1rem;
1326
+ }
1327
+
1328
+ [data-slot="code-block-title"] :is(svg, .iconify) {
1329
+ display: inline-block;
1330
+ margin-inline-end: 0.375rem;
1331
+ pointer-events: none;
1332
+ vertical-align: middle;
1333
+ }
1334
+
1335
+ [data-slot="code-block-title"] :is(svg, .iconify):not([class*="size-"]) {
1336
+ height: 0.875rem;
1337
+ width: 0.875rem;
1338
+ }
1339
+
1340
+ [data-slot="code-block-actions"] {
1341
+ align-items: center;
1342
+ display: flex;
1343
+ flex-shrink: 0;
1344
+ gap: 0.25rem;
1345
+ margin: -0.25rem -0.375rem -0.25rem auto;
1346
+ }
1347
+
1348
+ /* Actions placed directly in the block float over the code and show on hover or focus. */
1349
+ [data-slot="code-block"] > [data-slot="code-block-actions"] {
1350
+ margin: 0;
1351
+ opacity: 0;
1352
+ position: absolute;
1353
+ right: 0.5rem;
1354
+ top: 0.5rem;
1355
+ transition: opacity 150ms ease;
1356
+ z-index: 10;
1357
+ }
1358
+
1359
+ [data-slot="code-block"]:is(:hover, :focus-within) > [data-slot="code-block-actions"] {
1360
+ opacity: 1;
1361
+ }
1362
+
1363
+ @media (pointer: coarse) {
1364
+ [data-slot="code-block"] > [data-slot="code-block-actions"] {
1365
+ opacity: 1;
1366
+ }
1367
+ }
1368
+
1369
+ [data-slot="code-block"][data-size="sm"] > [data-slot="code-block-actions"] {
1370
+ right: 0.375rem;
1371
+ top: 0.375rem;
1372
+ }
1373
+
1374
+ [data-slot="code-block"] > [data-slot="code-block-actions"] > button {
1375
+ background: var(--vh-ui-bg);
1376
+ box-shadow: 0 0 0 1px color-mix(in oklab, var(--vh-ui-highlighted) 10%, transparent);
1377
+ }
1378
+
1379
+ [data-slot="code-block-copy-status"] {
1380
+ clip-path: inset(50%);
1381
+ height: 1px;
1382
+ overflow: hidden;
1383
+ position: absolute;
1384
+ white-space: nowrap;
1385
+ width: 1px;
1386
+ }
1387
+
1388
+ [data-slot="code-block-content"] {
1389
+ font-family: var(--font-mono, ui-monospace, monospace);
1390
+ line-height: 1.625;
1391
+ margin: 0;
1392
+ min-height: 0;
1393
+ min-width: 0;
1394
+ outline: none;
1395
+ overflow: auto;
1396
+ padding: 0.75rem;
1397
+ scrollbar-width: thin;
1398
+ text-align: start;
1399
+ }
1400
+
1401
+ [data-slot="code-block"]:has(> [data-slot="code-block-header"]) > [data-slot="code-block-content"] {
1402
+ padding-top: 0.5rem;
1403
+ }
1404
+
1405
+ [data-slot="code-block"]:has(> [data-slot="code-block-footer"]) > [data-slot="code-block-content"] {
1406
+ padding-bottom: 0.5rem;
1407
+ }
1408
+
1409
+ [data-slot="code-block"][data-size="sm"] > [data-slot="code-block-content"] {
1410
+ padding: 0.625rem;
1411
+ }
1412
+
1413
+ [data-slot="code-block"][data-size="sm"]:has(> [data-slot="code-block-header"]) > [data-slot="code-block-content"] {
1414
+ padding-top: 0.375rem;
1415
+ }
1416
+
1417
+ [data-slot="code-block-content"][data-wrap] {
1418
+ overflow-wrap: break-word;
1419
+ white-space: pre-wrap;
1420
+ }
1421
+
1422
+ [data-slot="code-block-code"] {
1423
+ align-content: start;
1424
+ background: none;
1425
+ border: 0;
1426
+ display: grid;
1427
+ font: inherit;
1428
+ min-height: 1lh;
1429
+ min-width: max-content;
1430
+ padding: 0;
1431
+ }
1376
1432
 
1377
- .vh-invocation-payload__toolbar button:focus-visible,
1378
- .vh-invocation-payload__search input:focus-visible {
1379
- outline: 2px solid color-mix(in oklab, var(--vh-ui-info) 55%, transparent);
1380
- outline-offset: 1px;
1381
- }
1433
+ [data-numbered] > [data-slot="code-block-code"] {
1434
+ grid-template-columns: auto 1fr;
1435
+ }
1382
1436
 
1383
- .vh-invocation-payload__search {
1384
- flex: 1 1 8rem;
1385
- }
1437
+ [data-wrap] > [data-slot="code-block-code"] {
1438
+ min-width: 0;
1439
+ }
1386
1440
 
1387
- .vh-invocation-payload__search input {
1388
- background: var(--vh-ui-bg);
1389
- border: 1px solid var(--vh-ui-border);
1390
- border-radius: calc(var(--vh-ui-radius) * 0.72);
1391
- color: var(--vh-ui-text);
1392
- font: inherit;
1393
- font-size: 0.6875rem;
1394
- min-height: 1.75rem;
1395
- padding: 0.25rem 0.5rem;
1396
- width: 100%;
1397
- }
1441
+ [data-slot="code-block-line"] {
1442
+ display: block;
1443
+ margin-inline: -0.75rem;
1444
+ min-height: 1lh;
1445
+ padding-inline: 0.75rem;
1446
+ position: relative;
1447
+ }
1398
1448
 
1399
- .vh-invocation-payload__copy {
1400
- margin-inline-start: auto;
1401
- }
1449
+ [data-slot="code-block"][data-size="sm"] [data-slot="code-block-line"] {
1450
+ margin-inline: -0.625rem;
1451
+ padding-inline: 0.625rem;
1452
+ }
1402
1453
 
1403
- .vh-invocation-payload__content > pre {
1404
- background: color-mix(in oklab, var(--vh-ui-bg-elevated) 65%, transparent);
1405
- border-radius: calc(var(--vh-ui-radius) * 0.72);
1406
- color: var(--vh-ui-text);
1407
- font: 0.75rem/1.55 ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
1408
- margin: 0;
1409
- max-height: 18rem;
1410
- overflow: auto;
1411
- padding: 0.625rem 0.75rem;
1412
- white-space: pre-wrap;
1413
- word-break: break-word;
1414
- }
1454
+ [data-slot="code-block-line"]::before {
1455
+ color: var(--vh-ui-muted);
1456
+ min-width: 1.5rem;
1457
+ text-align: end;
1458
+ }
1415
1459
 
1416
- .vh-invocation-payload__tree,
1417
- .vh-invocation-payload__tree ul,
1418
- .vh-invocation-payload__matches {
1419
- display: grid;
1420
- gap: 0.2rem;
1421
- list-style: none;
1422
- margin: 0;
1423
- padding: 0;
1424
- }
1460
+ [data-slot="code-block-line"]::after {
1461
+ color: var(--vh-ui-muted);
1462
+ left: 0.25rem;
1463
+ position: absolute;
1464
+ top: 0;
1465
+ user-select: none;
1466
+ }
1425
1467
 
1426
- .vh-invocation-payload__tree ul {
1427
- border-inline-start: 1px solid var(--vh-ui-border);
1428
- margin: 0.2rem 0 0 0.45rem;
1429
- padding-inline-start: 0.75rem;
1430
- }
1468
+ [data-numbered] [data-slot="code-block-line"] {
1469
+ column-gap: 0.75rem;
1470
+ counter-increment: line;
1471
+ display: grid;
1472
+ grid-column: span 2;
1473
+ grid-template-columns: subgrid;
1474
+ }
1431
1475
 
1432
- .vh-invocation-payload__branch summary,
1433
- .vh-invocation-payload__leaf {
1434
- align-items: baseline;
1435
- display: flex;
1436
- gap: 0.45rem;
1437
- min-height: 1.4rem;
1438
- }
1476
+ [data-numbered] [data-slot="code-block-line"]::before {
1477
+ content: counter(line);
1478
+ content: counter(line) / "";
1479
+ user-select: none;
1480
+ }
1439
1481
 
1440
- .vh-invocation-payload__branch summary {
1441
- color: var(--vh-ui-dimmed);
1442
- cursor: pointer;
1443
- font-size: 0.6875rem;
1444
- }
1482
+ [data-slot="code-block-line"]:is([data-variant="added"], [data-variant="highlighted"]) {
1483
+ background: var(--vh-ui-bg-elevated);
1484
+ }
1445
1485
 
1446
- .vh-invocation-payload__key,
1447
- .vh-invocation-payload__value,
1448
- .vh-invocation-payload__matches code {
1449
- font: 0.71875rem/1.45 ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
1450
- }
1486
+ [data-slot="code-block-line"][data-variant="added"]::after {
1487
+ content: "+";
1488
+ }
1451
1489
 
1452
- .vh-invocation-payload__key {
1453
- color: var(--vh-ui-info);
1454
- }
1490
+ [data-slot="code-block-line"][data-variant="removed"] {
1491
+ background: color-mix(in oklab, var(--vh-ui-error) 10%, transparent);
1492
+ }
1455
1493
 
1456
- .vh-invocation-payload__value {
1457
- color: var(--vh-ui-text);
1458
- overflow-wrap: anywhere;
1459
- }
1494
+ [data-slot="code-block-line"][data-variant="removed"]::after {
1495
+ color: var(--vh-ui-error);
1496
+ content: "−";
1497
+ }
1460
1498
 
1461
- .vh-invocation-payload__value[data-type="string"] {
1462
- color: var(--vh-ui-success);
1463
- }
1499
+ [data-slot="code-block-line-content"] {
1500
+ min-width: 0;
1501
+ }
1464
1502
 
1465
- .vh-invocation-payload__matches li {
1466
- display: grid;
1467
- gap: 0.15rem;
1468
- grid-template-columns: minmax(7rem, 0.45fr) minmax(0, 1fr);
1469
- }
1503
+ /* useHighlightedCode() gives every token both theme colors as CSS variables. */
1504
+ [data-slot="code-block-line-content"] span[style*="--shiki-light"] {
1505
+ color: var(--shiki-light);
1506
+ }
1470
1507
 
1471
- .vh-invocation-payload__matches code:first-child {
1472
- color: var(--vh-ui-info);
1473
- overflow-wrap: anywhere;
1474
- }
1508
+ :root.dark [data-slot="code-block-line-content"] span[style*="--shiki-dark"] {
1509
+ color: var(--shiki-dark);
1510
+ }
1475
1511
 
1476
- .vh-invocation-payload__matches code:last-child {
1477
- color: var(--vh-ui-text);
1478
- overflow-wrap: anywhere;
1479
- }
1512
+ /* Message Scroller */
1480
1513
 
1481
- .vh-invocation-payload__empty {
1482
- color: var(--vh-ui-dimmed);
1483
- font-size: 0.75rem;
1484
- margin: 0;
1485
- padding: 0.5rem;
1486
- text-align: center;
1487
- }
1514
+ [data-slot="message-scroller"] {
1515
+ display: flex;
1516
+ flex-direction: column;
1517
+ height: 100%;
1518
+ min-height: 0;
1519
+ overflow: hidden;
1520
+ position: relative;
1521
+ width: 100%;
1522
+ }
1488
1523
 
1489
- .vh-invocation-delivery__body {
1490
- color: var(--vh-ui-text);
1491
- margin: 0.125rem 0 0 2rem;
1492
- max-width: 42rem;
1493
- padding-block-end: 0.75rem;
1494
- }
1524
+ [data-slot="message-scroller-viewport"] {
1525
+ height: 100%;
1526
+ min-height: 0;
1527
+ min-width: 0;
1528
+ overflow-y: auto;
1529
+ overscroll-behavior: contain;
1530
+ scrollbar-gutter: stable;
1531
+ scrollbar-width: thin;
1532
+ width: 100%;
1533
+ }
1495
1534
 
1496
- .vh-invocation-delivery__body .vh-invocation-event__markdown {
1497
- font-size: 0.875rem;
1498
- line-height: 1.625;
1499
- }
1535
+ [data-slot="message-scroller-content"] {
1536
+ display: flex;
1537
+ flex-direction: column;
1538
+ gap: 1.5rem;
1539
+ height: max-content;
1540
+ min-height: 100%;
1541
+ }
1500
1542
 
1501
- .vh-invocation-event__body,
1502
- .vh-invocation-command {
1503
- background: transparent;
1504
- }
1543
+ [data-slot="message-scroller-item"] {
1544
+ flex-shrink: 0;
1545
+ min-width: 0;
1546
+ }
1505
1547
 
1506
- .vh-invocation-event__markdown {
1507
- color: inherit;
1508
- font-size: 0.8125rem;
1509
- padding: 0.25rem 0;
1510
- }
1548
+ [data-slot="message-scroller-button"] {
1549
+ align-items: center;
1550
+ background: var(--vh-ui-bg);
1551
+ border: 1px solid var(--vh-ui-border);
1552
+ border-radius: var(--vh-ui-radius);
1553
+ bottom: 1rem;
1554
+ color: var(--vh-ui-highlighted);
1555
+ cursor: pointer;
1556
+ display: flex;
1557
+ height: 2rem;
1558
+ justify-content: center;
1559
+ left: 50%;
1560
+ position: absolute;
1561
+ transition: background-color 150ms ease;
1562
+ transform: translateX(-50%);
1563
+ width: 2rem;
1564
+ }
1511
1565
 
1512
- .vh-invocation-event__notice {
1513
- color: var(--vh-ui-warning, #d97706);
1514
- font-size: 0.75rem;
1515
- margin: 0.5rem 0 0 1.75rem;
1516
- }
1566
+ @media (hover: hover) {
1567
+ [data-slot="message-scroller-button"]:hover {
1568
+ background: var(--vh-ui-bg-elevated);
1569
+ }
1570
+ }
1517
1571
 
1518
- .vh-invocation-command__bar {
1519
- align-items: flex-start;
1520
- display: flex;
1521
- gap: 1rem;
1522
- justify-content: space-between;
1523
- padding: 0.25rem 0;
1524
- }
1572
+ [data-slot="message-scroller-button"]:focus-visible {
1573
+ box-shadow: 0 0 0 3px var(--vh-ui-ring);
1574
+ outline: none;
1575
+ }
1525
1576
 
1526
- .vh-invocation-command__bar code {
1527
- color: inherit;
1528
- font-size: 0.75rem;
1529
- overflow-wrap: anywhere;
1530
- white-space: pre-wrap;
1577
+ [data-slot="message-scroller-button"][hidden] {
1578
+ display: none;
1579
+ }
1531
1580
  }
1532
1581
 
1533
- .vh-invocation-command__bar span,
1534
- .vh-invocation-command__cwd {
1535
- color: var(--vh-ui-dimmed);
1536
- font-size: 0.6875rem;
1537
- }
1582
+ /* Prompt Input and message parts, composed from the shadcn/ui parts above. */
1583
+ @layer components {
1584
+ [data-slot="prompt-input"] {
1585
+ width: 100%;
1586
+ }
1538
1587
 
1539
- .vh-invocation-command__bar span[data-failed="true"] {
1540
- color: var(--vh-ui-text);
1541
- font-weight: 600;
1542
- }
1588
+ [data-slot="prompt-input-group"] {
1589
+ background: var(--vh-ui-bg);
1590
+ border: 1px solid var(--vh-ui-border);
1591
+ border-radius: calc(var(--vh-ui-radius) * 2);
1592
+ display: flex;
1593
+ flex-direction: column;
1594
+ min-width: 0;
1595
+ transition: border-color 150ms ease, box-shadow 150ms ease;
1596
+ }
1543
1597
 
1544
- .vh-invocation-command__cwd {
1545
- padding: 0.25rem 0;
1546
- }
1598
+ [data-slot="prompt-input-group"]:has([data-slot="prompt-input-textarea"]:focus-visible) {
1599
+ border-color: color-mix(in oklab, var(--vh-ui-highlighted) 28%, transparent);
1600
+ box-shadow: 0 0 0 3px color-mix(in oklab, var(--vh-ui-highlighted) 6%, transparent);
1601
+ }
1547
1602
 
1548
- .vh-invocation-command pre {
1549
- color: inherit;
1550
- font-size: 0.75rem;
1551
- margin: 0;
1552
- max-height: 16rem;
1553
- overflow: auto;
1554
- padding: 0.5rem 0;
1555
- white-space: pre-wrap;
1556
- }
1603
+ [data-slot="prompt-input-attachments"] {
1604
+ padding: 0.5rem 0.5rem 0;
1605
+ }
1557
1606
 
1558
- .vh-invocation-inspector {
1559
- background: var(--vh-ui-bg);
1560
- border-inline-start: 1px solid var(--vh-ui-border);
1561
- container-type: inline-size;
1562
- display: grid;
1563
- grid-template-rows: auto minmax(0, 1fr);
1564
- height: 100%;
1565
- min-height: 0;
1566
- min-width: 0;
1567
- overflow: hidden;
1568
- }
1607
+ [data-slot="prompt-input-textarea"] {
1608
+ background: transparent;
1609
+ border: 0;
1610
+ color: var(--vh-ui-highlighted);
1611
+ field-sizing: content;
1612
+ font: inherit;
1613
+ font-size: 0.875rem;
1614
+ line-height: 1.5rem;
1615
+ max-height: 12rem;
1616
+ min-height: 3.5rem;
1617
+ outline: none;
1618
+ padding: 0.75rem 0.875rem 0.25rem;
1619
+ resize: none;
1620
+ width: 100%;
1621
+ }
1569
1622
 
1570
- .vh-invocation-inspector > header {
1571
- align-items: center;
1572
- border-block-end: 1px solid var(--vh-ui-border);
1573
- display: flex;
1574
- gap: 0.75rem;
1575
- justify-content: space-between;
1576
- min-height: 3.5rem;
1577
- padding: 0.6rem 0.9rem;
1578
- }
1623
+ /* iOS Safari zooms into a focused field with text under 16px. Touch screens get at least 16px, whatever the root font size; mouse-only devices keep 14px. */
1624
+ @media (any-pointer: coarse) {
1625
+ [data-slot="prompt-input-textarea"] {
1626
+ font-size: max(1rem, 16px);
1627
+ }
1628
+ }
1579
1629
 
1580
- .vh-invocation-inspector > header h3 {
1581
- font-size: 0.875rem;
1582
- font-weight: 650;
1583
- line-height: 1.25;
1584
- margin: 0.1rem 0 0;
1585
- }
1630
+ [data-slot="prompt-input-textarea"]::placeholder {
1631
+ color: var(--vh-ui-muted);
1632
+ }
1586
1633
 
1587
- .vh-invocation-inspector > header p {
1588
- color: var(--vh-ui-dimmed);
1589
- font-size: 0.625rem;
1590
- font-weight: 600;
1591
- letter-spacing: 0.055em;
1592
- margin: 0;
1593
- text-transform: uppercase;
1594
- }
1634
+ [data-slot="prompt-input-toolbar"] {
1635
+ align-items: center;
1636
+ display: flex;
1637
+ gap: 0.375rem;
1638
+ min-width: 0;
1639
+ padding: 0.25rem 0.5rem 0.5rem;
1640
+ }
1595
1641
 
1596
- .vh-invocation-inspector__content {
1597
- min-height: 0;
1598
- overflow-y: auto;
1599
- overscroll-behavior-y: contain;
1600
- padding: 0 1rem 2rem;
1601
- scrollbar-gutter: stable;
1642
+ [data-slot="prompt-input-spacer"] {
1643
+ flex: 1;
1644
+ }
1602
1645
  }
1603
1646
 
1604
- .vh-invocation-inspector__content > section {
1605
- padding-block: 1rem 0.2rem;
1606
- }
1647
+ /* Collaboration: AvatarStack, ConnectionStatus, SyncStatus, and the carets of TipTap's CollaborationCaret. */
1648
+ @layer components {
1649
+ [data-slot="avatar-stack"] {
1650
+ --vh-avatar-size: 2rem;
1651
+ align-items: center;
1652
+ display: inline-flex;
1653
+ isolation: isolate;
1654
+ }
1607
1655
 
1608
- .vh-invocation-inspector__content > section:first-child {
1609
- padding-block-start: 1rem;
1610
- }
1656
+ [data-slot="avatar-stack"][data-size="sm"] {
1657
+ --vh-avatar-size: 1.5rem;
1658
+ }
1611
1659
 
1612
- .vh-invocation-inspector__content > section > h4 {
1613
- color: var(--vh-ui-muted);
1614
- font-size: 0.625rem;
1615
- font-weight: 650;
1616
- letter-spacing: 0.075em;
1617
- margin: 0 0 0.6rem;
1618
- text-transform: uppercase;
1619
- }
1660
+ [data-slot="avatar-stack"][data-size="lg"] {
1661
+ --vh-avatar-size: 2.5rem;
1662
+ }
1620
1663
 
1621
- .vh-invocation-inspector__status {
1622
- align-items: center;
1623
- background: color-mix(in oklab, var(--vh-ui-bg-elevated) 72%, transparent);
1624
- border: 1px solid var(--vh-ui-border);
1625
- border-radius: 999px;
1626
- display: flex;
1627
- gap: 0.35rem;
1628
- min-height: 1.75rem;
1629
- padding: 0.2rem 0.5rem 0.2rem 0.35rem;
1630
- width: fit-content;
1631
- }
1664
+ :is([data-slot="avatar-stack-item"], [data-slot="avatar-stack-count"]) {
1665
+ align-items: center;
1666
+ background: var(--vh-ui-bg-accented);
1667
+ border-radius: 9999px;
1668
+ box-shadow: 0 0 0 2px var(--vh-ui-bg);
1669
+ color: var(--vh-ui-highlighted);
1670
+ display: inline-flex;
1671
+ flex: none;
1672
+ font-size: calc(var(--vh-avatar-size) * 0.4);
1673
+ font-weight: 500;
1674
+ height: var(--vh-avatar-size);
1675
+ justify-content: center;
1676
+ line-height: 1;
1677
+ overflow: hidden;
1678
+ user-select: none;
1679
+ width: var(--vh-avatar-size);
1680
+ }
1632
1681
 
1633
- .vh-invocation-inspector__status strong {
1634
- font-size: 0.6875rem;
1635
- font-weight: 650;
1636
- }
1682
+ :is([data-slot="avatar-stack-item"], [data-slot="avatar-stack-count"]) + :is([data-slot="avatar-stack-item"], [data-slot="avatar-stack-count"]) {
1683
+ margin-inline-start: calc(var(--vh-avatar-size) * -0.15);
1684
+ }
1637
1685
 
1638
- .vh-invocation-inspector__status small {
1639
- color: var(--vh-ui-dimmed);
1640
- font-size: 0.625rem;
1641
- font-variant-numeric: tabular-nums;
1642
- }
1686
+ [data-slot="avatar-stack-count"] {
1687
+ color: var(--vh-ui-muted);
1688
+ font-size: calc(var(--vh-avatar-size) * 0.34);
1689
+ }
1643
1690
 
1644
- .vh-invocation-inspector__status small::before {
1645
- color: var(--vh-ui-border);
1646
- content: "·";
1647
- margin-inline-end: 0.35rem;
1648
- }
1691
+ /* The outline ring takes the person's presence color, so each face matches its caret. */
1692
+ [data-slot="avatar-stack"][data-variant="outline"] [data-slot="avatar-stack-item"] {
1693
+ box-shadow: 0 0 0 2px var(--vh-ui-bg), 0 0 0 4px var(--vh-avatar-color, var(--vh-ui-border));
1694
+ }
1649
1695
 
1650
- .vh-invocation-inspector__status-icon {
1651
- align-items: center;
1652
- color: var(--vh-ui-muted);
1653
- display: inline-flex;
1654
- flex: none;
1655
- justify-content: center;
1656
- }
1696
+ [data-slot="avatar-stack"][data-variant="outline"] :is([data-slot="avatar-stack-item"], [data-slot="avatar-stack-count"]) + :is([data-slot="avatar-stack-item"], [data-slot="avatar-stack-count"]) {
1697
+ margin-inline-start: calc(var(--vh-avatar-size) * 0.05);
1698
+ }
1657
1699
 
1658
- .vh-invocation-inspector__status-icon svg {
1659
- height: 0.875rem;
1660
- stroke: currentColor;
1661
- stroke-width: 2;
1662
- width: 0.875rem;
1663
- }
1700
+ [data-slot="avatar-stack-image"] {
1701
+ height: 100%;
1702
+ object-fit: cover;
1703
+ width: 100%;
1704
+ }
1664
1705
 
1665
- .vh-invocation-inspector[data-status="running"] .vh-invocation-inspector__status {
1666
- color: color-mix(in oklab, var(--vh-ui-info) 42%, var(--vh-ui-text));
1667
- }
1706
+ :is([data-slot="connection-status"], [data-slot="sync-status"]) {
1707
+ align-items: center;
1708
+ color: var(--vh-ui-muted);
1709
+ display: inline-flex;
1710
+ font-size: 0.75rem;
1711
+ gap: 0.375rem;
1712
+ line-height: 1rem;
1713
+ white-space: nowrap;
1714
+ }
1668
1715
 
1669
- .vh-invocation-inspector[data-status="running"] .vh-invocation-inspector__status-icon svg {
1670
- animation: vh-invocation-status-spin 800ms linear infinite;
1671
- }
1716
+ :is([data-slot="connection-status-indicator"], [data-slot="sync-status-indicator"]) {
1717
+ background: var(--vh-ui-dimmed);
1718
+ border-radius: 9999px;
1719
+ flex: none;
1720
+ height: 0.5rem;
1721
+ position: relative;
1722
+ width: 0.5rem;
1723
+ }
1672
1724
 
1673
- .vh-invocation-inspector[data-status="completed"] .vh-invocation-inspector__status {
1674
- color: color-mix(in oklab, var(--vh-ui-success) 42%, var(--vh-ui-text));
1675
- }
1725
+ :is([data-slot="connection-status-indicator"][data-status="connected"], [data-slot="sync-status-indicator"][data-status="synchronized"]) {
1726
+ background: var(--vh-ui-success);
1727
+ }
1676
1728
 
1677
- .vh-invocation-inspector[data-status="failed"] .vh-invocation-inspector__status {
1678
- color: color-mix(in oklab, var(--vh-ui-error) 42%, var(--vh-ui-text));
1679
- }
1729
+ :is([data-slot="connection-status-indicator"][data-status="reconnecting"], [data-slot="sync-status-indicator"][data-status="synchronizing"]) {
1730
+ background: var(--vh-ui-warning);
1731
+ }
1680
1732
 
1681
- .vh-invocation-inspector[data-status="pending"] .vh-invocation-inspector__status {
1682
- color: color-mix(in oklab, var(--vh-ui-warning) 42%, var(--vh-ui-text));
1683
- }
1733
+ [data-slot="sync-status-indicator"][data-status="error"] {
1734
+ background: var(--vh-ui-error);
1735
+ }
1684
1736
 
1685
- .vh-invocation-inspector__identity h4 {
1686
- color: var(--vh-ui-text);
1687
- font-size: 1rem;
1688
- font-weight: 650;
1689
- letter-spacing: -0.015em;
1690
- line-height: 1.35;
1691
- margin: 0.8rem 0 0;
1692
- text-transform: none;
1693
- }
1737
+ :is([data-slot="connection-status"][data-status="reconnecting"], [data-slot="sync-status"][data-status="error"]) {
1738
+ color: var(--vh-ui-highlighted);
1739
+ }
1694
1740
 
1695
- .vh-invocation-inspector__identity p {
1696
- color: var(--vh-ui-dimmed);
1697
- font-size: 0.75rem;
1698
- line-height: 1.45;
1699
- margin: 0.25rem 0 0;
1700
- overflow-wrap: anywhere;
1701
- }
1741
+ /* A pending state pings, as Kibo UI's StatusIndicator does. */
1742
+ :is([data-slot="connection-status-indicator"]:not([data-status="connected"]), [data-slot="sync-status-indicator"]:is([data-status="loading"], [data-status="synchronizing"]))::after {
1743
+ animation: vh-status-ping 1.5s cubic-bezier(0, 0, 0.2, 1) infinite;
1744
+ background: inherit;
1745
+ border-radius: inherit;
1746
+ content: "";
1747
+ inset: 0;
1748
+ position: absolute;
1749
+ }
1702
1750
 
1703
- .vh-invocation-inspector__agent {
1704
- align-items: center;
1705
- color: var(--vh-ui-dimmed);
1706
- display: flex;
1707
- font-size: 0.6875rem;
1708
- gap: 0.35rem;
1709
- margin-block-start: 0.75rem;
1710
- }
1751
+ @keyframes vh-status-ping {
1752
+ 75%,
1753
+ 100% {
1754
+ opacity: 0;
1755
+ transform: scale(2.25);
1756
+ }
1757
+ }
1711
1758
 
1712
- .vh-invocation-inspector__agent code {
1713
- color: var(--vh-ui-muted);
1714
- font-size: 0.6875rem;
1715
- }
1759
+ @media (prefers-reduced-motion: reduce) {
1760
+ :is([data-slot="connection-status-indicator"], [data-slot="sync-status-indicator"])::after {
1761
+ animation: none;
1762
+ }
1763
+ }
1716
1764
 
1717
- .vh-invocation-inspector__error,
1718
- .vh-invocation-inspector__notice {
1719
- border: 1px solid color-mix(in oklab, currentColor 18%, transparent);
1720
- border-radius: calc(var(--vh-ui-radius) * 1.1);
1721
- margin-block-start: 0.9rem;
1722
- padding: 0.7rem 0.75rem;
1723
- }
1765
+ /* TipTap's CollaborationCaret markup, which Realtime's RealtimeCaret also renders. The inline style sets the color. */
1766
+ .collaboration-carets__caret {
1767
+ border-inline: 1px solid;
1768
+ margin-inline: -1px;
1769
+ pointer-events: none;
1770
+ position: relative;
1771
+ word-break: normal;
1772
+ }
1724
1773
 
1725
- .vh-invocation-inspector__error {
1726
- background: color-mix(in oklab, var(--vh-ui-error) 7%, transparent);
1727
- color: var(--vh-ui-error);
1774
+ .collaboration-carets__label {
1775
+ border-radius: calc(var(--vh-ui-radius) * 0.5) calc(var(--vh-ui-radius) * 0.5) calc(var(--vh-ui-radius) * 0.5) 0;
1776
+ color: #fff;
1777
+ font-size: 0.75rem;
1778
+ font-style: normal;
1779
+ font-weight: 600;
1780
+ inset-inline-start: -1px;
1781
+ line-height: 1.25;
1782
+ padding: 0.0625rem 0.375rem;
1783
+ position: absolute;
1784
+ top: -1.4em;
1785
+ user-select: none;
1786
+ white-space: nowrap;
1787
+ }
1728
1788
  }
1729
1789
 
1730
- .vh-invocation-inspector__notice {
1731
- background: color-mix(in oklab, var(--ui-warning, #a16207) 7%, transparent);
1732
- border: 0;
1733
- border-inline-start: 2px solid color-mix(in oklab, currentColor 55%, transparent);
1734
- border-radius: 0;
1735
- color: var(--ui-warning, #a16207);
1736
- margin-block-start: 1rem;
1737
- padding: 0.6rem 0.7rem;
1738
- }
1790
+ /* Comments: CommentLayer and the parts it is built from. Figma's comment mode, with the shadcn/ui data-slot convention. */
1791
+ @layer components {
1792
+ [data-slot="comment-layer"] {
1793
+ inset: 0;
1794
+ pointer-events: none;
1795
+ position: fixed;
1796
+ z-index: 2147483000;
1797
+ }
1739
1798
 
1740
- .vh-invocation-inspector__error strong,
1741
- .vh-invocation-inspector__notice strong {
1742
- font-size: 0.75rem;
1743
- font-weight: 650;
1744
- }
1799
+ [data-slot="comment-layer"] > * {
1800
+ pointer-events: auto;
1801
+ }
1745
1802
 
1746
- .vh-invocation-inspector__error p,
1747
- .vh-invocation-inspector__notice p {
1748
- color: inherit;
1749
- font-size: 0.6875rem;
1750
- margin: 0.2rem 0 0;
1751
- }
1803
+ /* The comment cursor: a speech bubble whose sharp corner is the spot of the pin. */
1804
+ [data-slot="comment-layer-overlay"] {
1805
+ cursor: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='28' height='28' viewBox='0 0 28 28'%3E%3Cpath d='M2 26V14a12 12 0 1 1 12 12H2z' fill='%23fff' stroke='%23111' stroke-width='1.5'/%3E%3C/svg%3E") 2 26, crosshair;
1806
+ inset: 0;
1807
+ position: absolute;
1808
+ }
1752
1809
 
1753
- .vh-invocation-error__details {
1754
- color: inherit;
1755
- font-size: 0.6875rem;
1756
- margin-block-start: 0.45rem;
1757
- }
1810
+ [data-slot="comment-layer-item"] {
1811
+ pointer-events: none;
1812
+ position: absolute;
1813
+ }
1758
1814
 
1759
- .vh-invocation-error__details summary {
1760
- cursor: pointer;
1761
- font-weight: 600;
1762
- }
1815
+ [data-slot="comment-layer-item"] > * {
1816
+ pointer-events: auto;
1817
+ }
1763
1818
 
1764
- .vh-invocation-error__details pre {
1765
- background: color-mix(in oklab, currentColor 6%, transparent);
1766
- border-radius: calc(var(--vh-ui-radius) * 0.75);
1767
- margin: 0.45rem 0 0;
1768
- max-height: 18rem;
1769
- overflow: auto;
1770
- padding: 0.6rem;
1771
- white-space: pre-wrap;
1772
- word-break: break-word;
1773
- }
1819
+ [data-slot="comment-pin"] {
1820
+ align-items: center;
1821
+ background: var(--vh-ui-primary);
1822
+ border: 2px solid var(--vh-ui-bg);
1823
+ border-radius: 9999px 9999px 9999px 0;
1824
+ box-shadow: 0 1px 4px rgb(0 0 0 / 0.3);
1825
+ color: var(--vh-ui-inverted);
1826
+ cursor: pointer;
1827
+ display: grid;
1828
+ height: 2rem;
1829
+ padding: 0;
1830
+ place-items: center;
1831
+ position: absolute;
1832
+ transform: translateY(-100%);
1833
+ transform-origin: bottom left;
1834
+ transition: scale 120ms ease;
1835
+ width: 2rem;
1836
+ }
1774
1837
 
1775
- .vh-invocation-inspector__metrics {
1776
- border-block: 1px solid var(--vh-ui-border);
1777
- display: grid;
1778
- gap: 0;
1779
- grid-template-columns: repeat(auto-fit, minmax(4.75rem, 1fr));
1780
- margin: 0;
1781
- }
1838
+ [data-slot="comment-pin"]:is(:hover, :focus-visible, [data-active="true"]) {
1839
+ scale: 1.1;
1840
+ }
1782
1841
 
1783
- .vh-invocation-inspector__metrics > div {
1784
- background: transparent;
1785
- border: 0;
1786
- border-radius: 0;
1787
- min-width: 0;
1788
- padding: 0.6rem 0.65rem;
1789
- }
1842
+ [data-slot="comment-pin"]:focus-visible {
1843
+ outline: 2px solid var(--vh-ui-ring);
1844
+ outline-offset: 2px;
1845
+ }
1790
1846
 
1791
- .vh-invocation-inspector__metrics > div + div {
1792
- border-inline-start: 1px solid var(--vh-ui-border);
1793
- }
1847
+ [data-slot="comment-pin"] [data-slot="avatar-stack"] {
1848
+ --vh-avatar-size: 1.625rem;
1849
+ }
1794
1850
 
1795
- .vh-invocation-inspector__metrics dt {
1796
- color: var(--vh-ui-dimmed);
1797
- font-size: 0.625rem;
1798
- line-height: 1.2;
1799
- }
1851
+ [data-slot="comment-pin"] [data-slot="avatar-stack-item"] {
1852
+ border-radius: inherit;
1853
+ box-shadow: none;
1854
+ }
1800
1855
 
1801
- .vh-invocation-inspector__metrics dd {
1802
- font-size: 0.8125rem;
1803
- font-variant-numeric: tabular-nums;
1804
- font-weight: 650;
1805
- margin: 0.25rem 0 0;
1806
- overflow-wrap: anywhere;
1807
- }
1856
+ [data-slot="comment-pin-number"] {
1857
+ background: var(--vh-ui-highlighted);
1858
+ border-radius: 9999px;
1859
+ color: var(--vh-ui-inverted);
1860
+ font-size: 0.625rem;
1861
+ font-weight: 600;
1862
+ line-height: 1;
1863
+ min-width: 1rem;
1864
+ padding: 0.15rem 0.25rem;
1865
+ position: absolute;
1866
+ right: -0.4rem;
1867
+ text-align: center;
1868
+ top: -0.4rem;
1869
+ }
1808
1870
 
1809
- .vh-invocation-timeline {
1810
- display: grid;
1811
- gap: 0.625rem;
1812
- }
1871
+ [data-slot="comment-pin"][data-status="resolved"] {
1872
+ filter: grayscale(1);
1873
+ opacity: 0.6;
1874
+ }
1813
1875
 
1814
- .vh-invocation-timeline__legend {
1815
- color: var(--vh-ui-dimmed);
1816
- display: flex;
1817
- font-size: 0.6875rem;
1818
- gap: 0.875rem;
1819
- }
1876
+ [data-slot="comment-pin"][data-draft="true"] {
1877
+ outline: 2px dashed var(--vh-ui-primary);
1878
+ outline-offset: 2px;
1879
+ }
1820
1880
 
1821
- .vh-invocation-timeline__legend span {
1822
- align-items: center;
1823
- display: inline-flex;
1824
- gap: 0.35rem;
1825
- }
1881
+ [data-slot="comment-layer-popover"] {
1882
+ background: var(--vh-ui-bg);
1883
+ border: 1px solid var(--vh-ui-border);
1884
+ border-radius: calc(var(--vh-ui-radius) * 1.5);
1885
+ box-shadow: 0 8px 24px rgb(0 0 0 / 0.16);
1886
+ color: var(--vh-ui-text);
1887
+ font-size: 0.875rem;
1888
+ left: 0.5rem;
1889
+ max-height: min(32rem, calc(100dvh - 2rem));
1890
+ max-width: calc(100vw - 1rem);
1891
+ overflow-y: auto;
1892
+ position: absolute;
1893
+ top: 0.5rem;
1894
+ width: 22.5rem;
1895
+ }
1826
1896
 
1827
- .vh-invocation-timeline__legend span::before {
1828
- background: var(--vh-ui-info);
1829
- border-radius: 999px;
1830
- content: "";
1831
- height: 0.45rem;
1832
- width: 0.45rem;
1833
- }
1897
+ [data-slot="comment-layer-item"][data-flip-x="true"] > [data-slot="comment-layer-popover"] {
1898
+ left: auto;
1899
+ right: 0.5rem;
1900
+ }
1834
1901
 
1835
- .vh-invocation-timeline__legend span[data-owner="vitehub"]::before {
1836
- background: var(--vh-ui-success);
1837
- }
1902
+ [data-slot="comment-layer-item"][data-flip-y="true"] > [data-slot="comment-layer-popover"] {
1903
+ bottom: 2.5rem;
1904
+ top: auto;
1905
+ }
1838
1906
 
1839
- .vh-invocation-timeline ol {
1840
- display: grid;
1841
- gap: 0.2rem;
1842
- list-style: none;
1843
- margin: 0;
1844
- padding: 0;
1845
- }
1907
+ [data-slot="comment-layer-popover"][data-preview="true"] {
1908
+ pointer-events: none;
1909
+ width: 18rem;
1910
+ }
1846
1911
 
1847
- .vh-invocation-timeline__row {
1848
- background: transparent;
1849
- border: 0;
1850
- border-radius: calc(var(--vh-ui-radius) * 0.9);
1851
- color: inherit;
1852
- cursor: pointer;
1853
- display: block;
1854
- font: inherit;
1855
- min-width: 0;
1856
- outline: 2px solid transparent;
1857
- outline-offset: -2px;
1858
- padding: 0.45rem 0.5rem;
1859
- text-align: start;
1860
- transition: background-color 160ms cubic-bezier(0.23, 1, 0.32, 1);
1861
- width: 100%;
1862
- }
1912
+ [data-slot="comment-layer-popover"][data-floating="true"] {
1913
+ bottom: 4.5rem;
1914
+ left: auto;
1915
+ position: fixed;
1916
+ right: 1rem;
1917
+ top: auto;
1918
+ }
1863
1919
 
1864
- .vh-invocation-timeline__row:focus-visible {
1865
- outline-color: color-mix(in oklab, var(--vh-ui-info) 55%, transparent);
1866
- }
1920
+ [data-slot="comment-composer"] {
1921
+ align-items: flex-start;
1922
+ display: flex;
1923
+ gap: 0.5rem;
1924
+ padding: 0.5rem;
1925
+ }
1867
1926
 
1868
- .vh-invocation-timeline__heading {
1869
- align-items: baseline;
1870
- display: flex;
1871
- gap: 0.75rem;
1872
- justify-content: space-between;
1873
- min-width: 0;
1874
- }
1927
+ [data-slot="comment-composer-box"] {
1928
+ flex: 1;
1929
+ min-width: 0;
1930
+ position: relative;
1931
+ }
1875
1932
 
1876
- .vh-invocation-timeline__heading strong,
1877
- .vh-invocation-timeline__detail {
1878
- overflow: hidden;
1879
- text-overflow: ellipsis;
1880
- white-space: nowrap;
1881
- }
1933
+ [data-slot="comment-composer"] [data-slot="prompt-input-textarea"] {
1934
+ min-height: 2.25rem;
1935
+ padding-block: 0.5rem 0.125rem;
1936
+ }
1882
1937
 
1883
- .vh-invocation-timeline__heading strong {
1884
- color: var(--vh-ui-text);
1885
- font-size: 0.75rem;
1886
- font-weight: 580;
1887
- }
1938
+ [data-slot="comment-composer"][data-shake="shake"] {
1939
+ animation: vh-comment-shake 400ms cubic-bezier(0.36, 0.07, 0.19, 0.97) both;
1940
+ }
1888
1941
 
1889
- .vh-invocation-timeline__heading time {
1890
- color: var(--vh-ui-dimmed);
1891
- flex: none;
1892
- font: 0.6875rem/1.4 ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
1893
- font-variant-numeric: tabular-nums;
1894
- }
1942
+ [data-slot="comment-composer"][data-shake="flash"] [data-slot="prompt-input-group"] {
1943
+ animation: vh-comment-flash 450ms ease both;
1944
+ }
1895
1945
 
1896
- .vh-invocation-timeline__detail {
1897
- color: var(--vh-ui-dimmed);
1898
- display: block;
1899
- font-size: 0.6875rem;
1900
- margin-block-start: 0.15rem;
1901
- }
1946
+ @keyframes vh-comment-shake {
1947
+ 10%,
1948
+ 90% {
1949
+ transform: translateX(-1px);
1950
+ }
1951
+ 20%,
1952
+ 80% {
1953
+ transform: translateX(3px);
1954
+ }
1955
+ 30%,
1956
+ 50%,
1957
+ 70% {
1958
+ transform: translateX(-5px);
1959
+ }
1960
+ 40%,
1961
+ 60% {
1962
+ transform: translateX(5px);
1963
+ }
1964
+ }
1902
1965
 
1903
- .vh-invocation-timeline__row:is(:hover, :focus-visible) .vh-invocation-timeline__heading strong,
1904
- .vh-invocation-timeline__row:is(:hover, :focus-visible) .vh-invocation-timeline__detail {
1905
- overflow: visible;
1906
- white-space: normal;
1907
- }
1966
+ @keyframes vh-comment-flash {
1967
+ 0%,
1968
+ 60% {
1969
+ border-color: var(--vh-ui-error);
1970
+ box-shadow: 0 0 0 3px color-mix(in oklab, var(--vh-ui-error) 25%, transparent);
1971
+ }
1972
+ }
1908
1973
 
1909
- .vh-invocation-timeline__track {
1910
- background: color-mix(in oklab, var(--vh-ui-border) 60%, transparent);
1911
- border-radius: 999px;
1912
- height: 0.25rem;
1913
- margin-block-start: 0.4rem;
1914
- overflow: hidden;
1915
- position: relative;
1916
- }
1974
+ @media (prefers-reduced-motion: reduce) {
1975
+ [data-slot="comment-composer"][data-shake="shake"] {
1976
+ animation: none;
1977
+ }
1917
1978
 
1918
- .vh-invocation-timeline__track span {
1919
- background: var(--vh-ui-info);
1920
- border-radius: inherit;
1921
- inset-block: 0;
1922
- position: absolute;
1923
- }
1979
+ [data-slot="comment-pin"] {
1980
+ transition: none;
1981
+ }
1982
+ }
1924
1983
 
1925
- .vh-invocation-timeline__row[data-owner="vitehub"] .vh-invocation-timeline__track span {
1926
- background: var(--vh-ui-success);
1927
- }
1984
+ [data-slot="comment-composer-mentions"] {
1985
+ background: var(--vh-ui-bg);
1986
+ border: 1px solid var(--vh-ui-border);
1987
+ border-radius: var(--vh-ui-radius);
1988
+ box-shadow: 0 4px 16px rgb(0 0 0 / 0.12);
1989
+ left: 0;
1990
+ list-style: none;
1991
+ margin: 0.25rem 0 0;
1992
+ padding: 0.25rem;
1993
+ position: absolute;
1994
+ top: 100%;
1995
+ width: 100%;
1996
+ z-index: 1;
1997
+ }
1928
1998
 
1929
- @media (hover: hover) and (pointer: fine) {
1930
- .vh-invocation-timeline__row:hover {
1931
- background: color-mix(in oklab, var(--vh-ui-bg-elevated) 72%, transparent);
1999
+ [data-slot="comment-composer-mention"] {
2000
+ border-radius: calc(var(--vh-ui-radius) * 0.75);
2001
+ cursor: pointer;
2002
+ padding: 0.375rem 0.5rem;
1932
2003
  }
1933
- }
1934
2004
 
1935
- .vh-invocation-inspector__groups {
1936
- display: grid;
1937
- gap: 1.1rem;
1938
- }
2005
+ [data-slot="comment-composer-mention"][aria-selected="true"] {
2006
+ background: var(--vh-ui-bg-accented);
2007
+ }
1939
2008
 
1940
- .vh-invocation-inspector__group {
1941
- border: 0;
1942
- min-width: 0;
1943
- padding: 0;
1944
- }
2009
+ [data-slot="comment-composer-error"] {
2010
+ color: var(--vh-ui-error);
2011
+ font-size: 0.75rem;
2012
+ margin: 0.375rem 0 0;
2013
+ }
2014
+
2015
+ [data-slot="comment-thread"] {
2016
+ display: flex;
2017
+ flex-direction: column;
2018
+ }
1945
2019
 
1946
- .vh-invocation-inspector__group + .vh-invocation-inspector__group {
1947
- border-block-start: 0;
1948
- }
2020
+ [data-slot="comment-thread-header"] {
2021
+ align-items: center;
2022
+ border-block-end: 1px solid var(--vh-ui-border);
2023
+ display: flex;
2024
+ gap: 0.25rem;
2025
+ padding: 0.375rem 0.5rem 0.375rem 0.75rem;
2026
+ }
1949
2027
 
1950
- .vh-invocation-inspector__group--execution {
1951
- background:
1952
- radial-gradient(circle at 95% 0%, color-mix(in oklab, var(--ui-primary, #2563eb) 9%, transparent), transparent 48%),
1953
- color-mix(in oklab, var(--vh-ui-bg-elevated) 54%, transparent);
1954
- border: 1px solid color-mix(in oklab, var(--vh-ui-border) 78%, transparent);
1955
- border-radius: calc(var(--vh-ui-radius) * 1.2);
1956
- padding: 0.8rem;
1957
- }
2028
+ [data-slot="comment-thread-title"] {
2029
+ color: var(--vh-ui-highlighted);
2030
+ font-weight: 600;
2031
+ }
1958
2032
 
1959
- .vh-invocation-execution {
1960
- display: grid;
1961
- gap: 0.65rem;
1962
- margin-block-start: 0.65rem;
1963
- }
2033
+ [data-slot="comment-thread-spacer"] {
2034
+ flex: 1;
2035
+ }
1964
2036
 
1965
- .vh-invocation-execution__model {
1966
- align-items: center;
1967
- display: grid;
1968
- gap: 0.7rem;
1969
- grid-template-columns: 2.35rem minmax(0, 1fr);
1970
- min-width: 0;
1971
- }
2037
+ [data-slot="comment-thread-messages"] {
2038
+ display: flex;
2039
+ flex-direction: column;
2040
+ max-height: 22rem;
2041
+ overflow-y: auto;
2042
+ }
1972
2043
 
1973
- .vh-invocation-execution__model > div {
1974
- display: grid;
1975
- gap: 0.08rem;
1976
- min-width: 0;
1977
- }
2044
+ [data-slot="comment-thread-quote"] {
2045
+ border-inline-start: 2px solid var(--vh-ui-border);
2046
+ color: var(--vh-ui-muted);
2047
+ margin: 0.75rem 0.75rem 0;
2048
+ padding-inline-start: 0.625rem;
2049
+ }
1978
2050
 
1979
- .vh-invocation-execution__model strong {
1980
- color: var(--vh-ui-text);
1981
- font-size: 0.875rem;
1982
- font-weight: 670;
1983
- letter-spacing: -0.015em;
1984
- line-height: 1.3;
1985
- overflow: hidden;
1986
- text-overflow: ellipsis;
1987
- white-space: nowrap;
1988
- }
2051
+ :is([data-slot="comment-thread-detached"], [data-slot="comment-thread-count"]) {
2052
+ color: var(--vh-ui-muted);
2053
+ font-size: 0.75rem;
2054
+ margin: 0.5rem 0.75rem 0;
2055
+ }
1989
2056
 
1990
- .vh-invocation-execution__model span {
1991
- color: var(--vh-ui-dimmed);
1992
- font-size: 0.6875rem;
1993
- }
2057
+ [data-slot="comment-reply"] {
2058
+ display: flex;
2059
+ gap: 0.5rem;
2060
+ padding: 0.75rem;
2061
+ }
1994
2062
 
1995
- .vh-invocation-brand__logo,
1996
- .vh-invocation-brand__fallback {
1997
- display: block;
1998
- flex: none;
1999
- }
2063
+ [data-slot="comment-reply-content"] {
2064
+ flex: 1;
2065
+ min-width: 0;
2066
+ }
2000
2067
 
2001
- .vh-invocation-brand__logo {
2002
- fill: currentColor;
2003
- height: 1rem;
2004
- width: 1rem;
2005
- }
2068
+ [data-slot="comment-reply-header"] {
2069
+ align-items: baseline;
2070
+ display: flex;
2071
+ flex-wrap: wrap;
2072
+ gap: 0.375rem;
2073
+ }
2006
2074
 
2007
- .vh-invocation-execution__provider-logo {
2008
- color: #7624f4;
2009
- }
2075
+ [data-slot="comment-reply-author"] {
2076
+ color: var(--vh-ui-highlighted);
2077
+ font-weight: 500;
2078
+ }
2010
2079
 
2011
- .vh-invocation-execution__model-logo,
2012
- .vh-invocation-brand__fallback.vh-invocation-execution__model-logo {
2013
- height: 2.35rem;
2014
- width: 2.35rem;
2015
- }
2080
+ :is([data-slot="comment-reply-time"], [data-slot="comment-reply-edited"], [data-slot="comment-reply-actor"]) {
2081
+ color: var(--vh-ui-muted);
2082
+ font-size: 0.75rem;
2083
+ }
2016
2084
 
2017
- .vh-invocation-brand__fallback {
2018
- align-items: center;
2019
- background: color-mix(in oklab, var(--ui-primary, #2563eb) 10%, var(--vh-ui-bg));
2020
- border: 1px solid color-mix(in oklab, var(--ui-primary, #2563eb) 20%, var(--vh-ui-border));
2021
- border-radius: calc(var(--vh-ui-radius) * 0.9);
2022
- color: var(--vh-ui-muted);
2023
- font-size: 0.65rem;
2024
- font-weight: 700;
2025
- justify-content: center;
2026
- }
2085
+ [data-slot="comment-reply-body"] {
2086
+ overflow-wrap: anywhere;
2087
+ }
2027
2088
 
2028
- .vh-invocation-execution__route {
2029
- align-items: center;
2030
- color: var(--vh-ui-dimmed);
2031
- display: flex;
2032
- font-size: 0.6875rem;
2033
- gap: 0.35rem;
2034
- margin-inline-start: 3.05rem;
2035
- }
2089
+ [data-slot="comment-reply-actions"] {
2090
+ display: flex;
2091
+ opacity: 0;
2092
+ transition: opacity 120ms ease;
2093
+ }
2036
2094
 
2037
- .vh-invocation-execution__route strong {
2038
- color: var(--vh-ui-muted);
2039
- font-weight: 600;
2040
- }
2095
+ [data-slot="comment-reply"]:is(:hover, :focus-within) [data-slot="comment-reply-actions"] {
2096
+ opacity: 1;
2097
+ }
2041
2098
 
2042
- .vh-invocation-tool-list {
2043
- border-block: 1px solid var(--vh-ui-border);
2044
- list-style: none;
2045
- margin: 0.55rem 0 0;
2046
- padding: 0;
2047
- }
2099
+ /* A touch screen has no hover, so Edit and Delete always show on a device with one, also on a laptop whose main pointer is a mouse. */
2100
+ @media (any-pointer: coarse) {
2101
+ [data-slot="comment-reply-actions"] {
2102
+ opacity: 1;
2103
+ }
2104
+ }
2048
2105
 
2049
- .vh-invocation-tool-list > li {
2050
- min-width: 0;
2051
- padding: 0.55rem 0.15rem 0.6rem;
2052
- }
2106
+ [data-slot="comment-reply"][data-compact="true"] [data-slot="comment-reply-body"] {
2107
+ display: -webkit-box;
2108
+ -webkit-box-orient: vertical;
2109
+ -webkit-line-clamp: 3;
2110
+ overflow: hidden;
2111
+ }
2053
2112
 
2054
- .vh-invocation-tool-list > li + li {
2055
- border-block-start: 1px solid color-mix(in oklab, var(--vh-ui-border) 72%, transparent);
2056
- }
2113
+ [data-slot="comment-reply"][data-editing="true"] [data-slot="comment-composer"] {
2114
+ padding: 0.25rem 0 0;
2115
+ }
2057
2116
 
2058
- .vh-invocation-tool-list > li[data-used="false"] {
2059
- opacity: 0.66;
2060
- }
2117
+ [data-slot="comment-toolbar"] {
2118
+ align-items: center;
2119
+ background: var(--vh-ui-bg);
2120
+ border: 1px solid var(--vh-ui-border);
2121
+ border-radius: 9999px;
2122
+ bottom: 1rem;
2123
+ box-shadow: 0 4px 16px rgb(0 0 0 / 0.16);
2124
+ display: flex;
2125
+ gap: 0.25rem;
2126
+ left: 50%;
2127
+ padding: 0.25rem;
2128
+ position: fixed;
2129
+ transform: translateX(-50%);
2130
+ }
2061
2131
 
2062
- .vh-invocation-tool-list__heading {
2063
- align-items: baseline;
2064
- display: grid;
2065
- gap: 0.75rem;
2066
- grid-template-columns: minmax(0, 1fr) auto;
2067
- }
2132
+ [data-slot="comment-filters"] {
2133
+ display: flex;
2134
+ flex-wrap: wrap;
2135
+ gap: 0.25rem;
2136
+ }
2068
2137
 
2069
- .vh-invocation-tool-list__heading code {
2070
- color: var(--vh-ui-text);
2071
- font-size: 0.6875rem;
2072
- font-weight: 580;
2073
- overflow-wrap: anywhere;
2074
- }
2138
+ [data-slot="comment-list"] {
2139
+ background: var(--vh-ui-bg);
2140
+ border-inline-start: 1px solid var(--vh-ui-border);
2141
+ bottom: 0;
2142
+ color: var(--vh-ui-text);
2143
+ display: flex;
2144
+ flex-direction: column;
2145
+ font-size: 0.875rem;
2146
+ max-width: 100vw;
2147
+ overflow-y: auto;
2148
+ position: fixed;
2149
+ right: 0;
2150
+ top: 0;
2151
+ width: 20rem;
2152
+ }
2075
2153
 
2076
- .vh-invocation-tool-list__count {
2077
- color: var(--vh-ui-dimmed);
2078
- font: 0.6875rem/1.3 ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
2079
- font-variant-numeric: tabular-nums;
2080
- min-width: 1.5rem;
2081
- text-align: end;
2082
- }
2154
+ [data-slot="comment-list-header"] {
2155
+ border-block-end: 1px solid var(--vh-ui-border);
2156
+ display: flex;
2157
+ flex-direction: column;
2158
+ gap: 0.5rem;
2159
+ padding: 0.75rem;
2160
+ }
2083
2161
 
2084
- .vh-invocation-tool-list > li[data-used="true"] .vh-invocation-tool-list__count {
2085
- background: color-mix(in oklab, var(--vh-ui-success) 11%, transparent);
2086
- border-radius: 999px;
2087
- color: color-mix(in oklab, var(--vh-ui-success) 60%, var(--vh-ui-text));
2088
- padding: 0.08rem 0.4rem;
2089
- }
2090
-
2091
- .vh-invocation-tool-list p {
2092
- color: var(--vh-ui-dimmed);
2093
- display: -webkit-box;
2094
- font-size: 0.65625rem;
2095
- -webkit-box-orient: vertical;
2096
- -webkit-line-clamp: 2;
2097
- line-height: 1.45;
2098
- margin: 0.22rem 2.25rem 0 0;
2099
- overflow: hidden;
2100
- }
2162
+ [data-slot="comment-list-scopes"] {
2163
+ display: flex;
2164
+ gap: 0.25rem;
2165
+ }
2101
2166
 
2102
- .vh-invocation-inspector__group-heading {
2103
- align-items: center;
2104
- color: var(--vh-ui-muted);
2105
- display: flex;
2106
- gap: 0.45rem;
2107
- min-height: 1.25rem;
2108
- min-width: 0;
2109
- }
2167
+ [data-slot="comment-list-empty"] {
2168
+ color: var(--vh-ui-muted);
2169
+ margin: 0;
2170
+ padding: 1rem 0.75rem;
2171
+ }
2110
2172
 
2111
- .vh-invocation-inspector__group-heading strong {
2112
- color: var(--vh-ui-text);
2113
- flex: 1;
2114
- font-size: 0.75rem;
2115
- font-weight: 600;
2116
- min-width: 0;
2117
- }
2173
+ [data-slot="comment-list-items"] {
2174
+ list-style: none;
2175
+ margin: 0;
2176
+ padding: 0;
2177
+ }
2118
2178
 
2119
- .vh-invocation-inspector__group-heading small {
2120
- color: var(--vh-ui-dimmed);
2121
- font-size: 0.625rem;
2122
- font-variant-numeric: tabular-nums;
2123
- }
2179
+ [data-slot="comment-list-item"] {
2180
+ align-items: flex-start;
2181
+ border-block-end: 1px solid var(--vh-ui-border);
2182
+ color: inherit;
2183
+ display: flex;
2184
+ gap: 0.5rem;
2185
+ padding: 0.625rem 0.75rem;
2186
+ text-decoration: none;
2187
+ }
2124
2188
 
2125
- summary.vh-invocation-inspector__group-heading,
2126
- .vh-invocation-inspector__item-disclosure summary {
2127
- cursor: pointer;
2128
- list-style: none;
2129
- }
2189
+ [data-slot="comment-list-item"]:is(:hover, :focus-visible, [aria-current="true"]) {
2190
+ background: var(--vh-ui-bg-elevated);
2191
+ }
2130
2192
 
2131
- summary.vh-invocation-inspector__group-heading::-webkit-details-marker,
2132
- .vh-invocation-inspector__item-disclosure summary::-webkit-details-marker {
2133
- display: none;
2134
- }
2193
+ [data-slot="comment-list-item"][data-status="resolved"] {
2194
+ opacity: 0.65;
2195
+ }
2135
2196
 
2136
- summary.vh-invocation-inspector__group-heading:focus-visible,
2137
- .vh-invocation-inspector__item-disclosure summary:focus-visible {
2138
- border-radius: calc(var(--vh-ui-radius) * 0.8);
2139
- outline: 2px solid color-mix(in oklab, var(--ui-primary, #2563eb) 55%, transparent);
2140
- outline-offset: 2px;
2141
- }
2197
+ [data-slot="comment-list-number"] {
2198
+ color: var(--vh-ui-muted);
2199
+ flex: none;
2200
+ font-size: 0.75rem;
2201
+ min-width: 1.25rem;
2202
+ padding-top: 0.25rem;
2203
+ }
2142
2204
 
2143
- .vh-invocation-inspector__chevron {
2144
- height: 0.8rem;
2145
- stroke: currentColor;
2146
- stroke-width: 2;
2147
- transition: transform 150ms ease;
2148
- width: 0.8rem;
2149
- }
2205
+ [data-slot="comment-list-body"] {
2206
+ display: flex;
2207
+ flex: 1;
2208
+ flex-direction: column;
2209
+ gap: 0.125rem;
2210
+ min-width: 0;
2211
+ }
2150
2212
 
2151
- .vh-invocation-inspector__disclosure[open] > summary .vh-invocation-inspector__chevron,
2152
- .vh-invocation-inspector__item-disclosure[open] > summary .vh-invocation-inspector__chevron {
2153
- transform: rotate(180deg);
2154
- }
2213
+ [data-slot="comment-list-text"] {
2214
+ -webkit-box-orient: vertical;
2215
+ -webkit-line-clamp: 2;
2216
+ display: -webkit-box;
2217
+ overflow: hidden;
2218
+ overflow-wrap: anywhere;
2219
+ }
2155
2220
 
2156
- .vh-invocation-inspector__list {
2157
- display: grid;
2158
- margin: 0.45rem 0 0;
2221
+ [data-slot="comment-list-meta"] {
2222
+ color: var(--vh-ui-muted);
2223
+ display: flex;
2224
+ flex-wrap: wrap;
2225
+ font-size: 0.75rem;
2226
+ gap: 0.25rem 0.5rem;
2227
+ }
2159
2228
  }
2160
2229
 
2161
- .vh-invocation-inspector__list > div {
2162
- align-items: center;
2163
- display: grid;
2164
- gap: 0.5rem;
2165
- grid-template-columns: minmax(4.5rem, 0.7fr) minmax(0, 1.3fr);
2166
- min-width: 0;
2167
- padding-block: 0.35rem;
2168
- }
2230
+ @layer components {
2231
+ [data-slot="comment-thread"]:focus-visible {
2232
+ outline: 2px solid var(--vh-ui-ring);
2233
+ outline-offset: -2px;
2234
+ }
2169
2235
 
2170
- .vh-invocation-inspector__list dt {
2171
- color: var(--vh-ui-dimmed);
2172
- font-size: 0.6875rem;
2173
- }
2236
+ [data-slot="comment-reply-confirm"] {
2237
+ align-items: center;
2238
+ display: flex;
2239
+ flex-wrap: wrap;
2240
+ gap: 0.5rem;
2241
+ margin-top: 0.5rem;
2242
+ }
2174
2243
 
2175
- .vh-invocation-inspector__list dd {
2176
- font-size: 0.6875rem;
2177
- margin: 0;
2178
- min-width: 0;
2179
- overflow-wrap: anywhere;
2180
- text-align: end;
2181
- }
2244
+ [data-slot="comment-reply-confirm"] > p {
2245
+ flex-basis: 100%;
2246
+ margin: 0;
2247
+ }
2182
2248
 
2183
- .vh-invocation-inspector__copy-list {
2184
- border: 1px solid var(--vh-ui-border);
2185
- border-radius: calc(var(--vh-ui-radius) * 1.05);
2186
- overflow: hidden;
2249
+ [data-slot="comment-reply-error"] {
2250
+ color: var(--vh-ui-error);
2251
+ font-size: 0.75rem;
2252
+ margin: 0.375rem 0 0;
2253
+ }
2187
2254
  }
2188
2255
 
2189
- .vh-invocation-inspector__copy {
2190
- align-items: center;
2191
- appearance: none;
2192
- background: transparent;
2193
- border: 0;
2194
- color: var(--vh-ui-muted);
2195
- cursor: pointer;
2196
- display: grid;
2197
- font: inherit;
2198
- gap: 0.5rem;
2199
- grid-template-columns: minmax(0, 1fr) auto 1rem;
2200
- min-height: 2.4rem;
2201
- padding: 0.45rem 0.65rem;
2202
- text-align: start;
2203
- transition:
2204
- background-color 120ms ease,
2205
- color 120ms ease;
2206
- width: 100%;
2207
- }
2256
+ /*
2257
+ * Chat, session, Markdown typeset, image preview, file views, primitive rail, and tool list.
2258
+ * They live in the components layer, so a utility class on a component, such as `<Chat class="h-96">`, overrides them.
2259
+ */
2260
+ @layer components {
2261
+ .vh-chat {
2262
+ display: grid;
2263
+ grid-template-rows: minmax(0, 1fr);
2264
+ height: 100%;
2265
+ min-height: 0;
2266
+ min-width: 0;
2267
+ overflow: hidden;
2268
+ position: relative;
2269
+ width: 100%;
2270
+ }
2208
2271
 
2209
- .vh-invocation-inspector__copy + .vh-invocation-inspector__copy {
2210
- border-block-start: 1px solid var(--vh-ui-border);
2211
- }
2272
+ .vh-session {
2273
+ display: grid;
2274
+ grid-template-rows: auto minmax(0, 1fr) auto;
2275
+ height: 100%;
2276
+ min-height: 0;
2277
+ min-width: 0;
2278
+ overflow: hidden;
2279
+ width: 100%;
2280
+ }
2212
2281
 
2213
- .vh-invocation-inspector__copy-label {
2214
- color: var(--vh-ui-text);
2215
- font-size: 0.75rem;
2216
- min-width: 0;
2217
- }
2282
+ .vh-session__header {
2283
+ border-block-end: 1px solid var(--vh-ui-border);
2284
+ padding: 0.75rem 1rem;
2285
+ }
2218
2286
 
2219
- .vh-invocation-inspector__copy-state {
2220
- color: var(--vh-ui-dimmed);
2221
- font-size: 0.625rem;
2222
- }
2287
+ .vh-session__title {
2288
+ font-size: 0.9375rem;
2289
+ font-weight: 600;
2290
+ margin: 0;
2291
+ }
2223
2292
 
2224
- .vh-invocation-inspector__copy:hover,
2225
- .vh-invocation-inspector__copy:focus-visible {
2226
- background: color-mix(in oklab, var(--vh-ui-bg-elevated) 70%, transparent);
2227
- color: var(--vh-ui-text);
2228
- }
2293
+ .vh-session__chat {
2294
+ height: 100%;
2295
+ min-height: 0;
2296
+ }
2229
2297
 
2230
- .vh-invocation-inspector__copy:focus-visible {
2231
- outline: 2px solid color-mix(in oklab, var(--ui-primary, #2563eb) 55%, transparent);
2232
- outline-offset: -2px;
2233
- }
2298
+ .vh-chat__viewport {
2299
+ height: 100%;
2300
+ min-height: 0;
2301
+ overflow-y: auto;
2302
+ overscroll-behavior-y: contain;
2303
+ scrollbar-gutter: stable;
2304
+ }
2234
2305
 
2235
- .vh-invocation-inspector__copy-icon {
2236
- align-items: center;
2237
- display: inline-flex;
2238
- justify-content: center;
2239
- }
2306
+ .vh-chat__content {
2307
+ display: flex;
2308
+ flex-direction: column;
2309
+ gap: 1.25rem;
2310
+ margin-inline: auto;
2311
+ max-width: 48rem;
2312
+ min-height: 100%;
2313
+ padding: var(--vh-chat-content-padding, 1.5rem 1rem 6rem);
2314
+ }
2240
2315
 
2241
- .vh-invocation-inspector__copy-icon svg {
2242
- height: 0.875rem;
2243
- stroke: currentColor;
2244
- stroke-width: 1.8;
2245
- width: 0.875rem;
2246
- }
2316
+ .vh-chat__composer {
2317
+ bottom: 0;
2318
+ inset-inline: 0;
2319
+ padding: var(--vh-chat-composer-padding, 1rem);
2320
+ pointer-events: none;
2321
+ position: absolute;
2322
+ z-index: 3;
2323
+ }
2247
2324
 
2248
- .vh-invocation-inspector__stack {
2249
- display: grid;
2250
- gap: 0.125rem;
2251
- margin-block-start: 0.45rem;
2252
- }
2325
+ .vh-chat__composer::before {
2326
+ background: color-mix(in oklab, var(--vh-ui-bg) 96%, transparent);
2327
+ border-block-start: 1px solid var(--vh-ui-border);
2328
+ content: "";
2329
+ inset: 0;
2330
+ pointer-events: none;
2331
+ position: absolute;
2332
+ }
2253
2333
 
2254
- .vh-agent-tool-list {
2255
- display: grid;
2256
- gap: 0.125rem;
2257
- margin-block-start: 0.45rem;
2258
- }
2334
+ .vh-chat__composer > * {
2335
+ margin-inline: auto;
2336
+ max-width: 48rem;
2337
+ pointer-events: auto;
2338
+ position: relative;
2339
+ width: 100%;
2340
+ }
2259
2341
 
2260
- .vh-agent-tool-list__item,
2261
- .vh-agent-tool-list__disclosure > summary {
2262
- align-items: center;
2263
- border-radius: calc(var(--vh-ui-radius) * 0.8);
2264
- display: flex;
2265
- gap: 0.5rem;
2266
- min-height: 1.8rem;
2267
- padding: 0.3rem 0.45rem;
2268
- }
2342
+ /* comark-chat draws message parts with the `--comark-*` tokens, so they take ViteHub's colors. */
2343
+ .vh-message-parts {
2344
+ --comark-accent: var(--vh-ui-bg-elevated);
2345
+ --comark-background: var(--vh-ui-bg);
2346
+ --comark-border: var(--vh-ui-border);
2347
+ --comark-font: inherit;
2348
+ --comark-foreground: var(--vh-ui-text);
2349
+ --comark-muted: var(--vh-ui-muted);
2350
+ --comark-ring: var(--vh-ui-ring);
2351
+ }
2269
2352
 
2270
- .vh-agent-tool-list__item code,
2271
- .vh-agent-tool-list__disclosure > summary code {
2272
- flex: none;
2273
- font-size: 0.6875rem;
2274
- overflow-wrap: anywhere;
2275
- }
2353
+ .vh-typeset {
2354
+ --vh-typeset-flow: 0.85em;
2355
+ --vh-typeset-leading: 1.65;
2356
+ font-size: 0.9375rem;
2357
+ line-height: var(--vh-typeset-leading);
2358
+ min-width: 0;
2359
+ overflow-wrap: anywhere;
2360
+ }
2276
2361
 
2277
- .vh-agent-tool-list__disclosure > summary {
2278
- cursor: pointer;
2279
- list-style: none;
2280
- }
2362
+ .vh-image-preview {
2363
+ appearance: none;
2364
+ aspect-ratio: 4 / 3;
2365
+ background: var(--vh-ui-bg-elevated);
2366
+ border: 1px solid var(--vh-ui-border);
2367
+ border-radius: var(--vh-ui-radius);
2368
+ color: var(--vh-ui-muted);
2369
+ cursor: zoom-in;
2370
+ display: inline-flex;
2371
+ align-items: center;
2372
+ justify-content: center;
2373
+ max-width: 100%;
2374
+ overflow: hidden;
2375
+ padding: 0;
2376
+ vertical-align: top;
2377
+ width: 13rem;
2378
+ }
2281
2379
 
2282
- .vh-agent-tool-list__disclosure > summary::-webkit-details-marker {
2283
- display: none;
2284
- }
2380
+ .vh-image-preview:focus-visible {
2381
+ outline: 2px solid currentColor;
2382
+ outline-offset: 3px;
2383
+ }
2285
2384
 
2286
- .vh-agent-tool-list__disclosure > summary:hover {
2287
- background: color-mix(in oklab, var(--vh-ui-bg-elevated) 70%, transparent);
2288
- }
2385
+ .vh-image-preview img {
2386
+ display: block;
2387
+ height: 100%;
2388
+ object-fit: cover;
2389
+ width: 100%;
2390
+ }
2289
2391
 
2290
- .vh-agent-tool-list__disclosure > summary:focus-visible {
2291
- outline: 2px solid color-mix(in oklab, var(--ui-primary, #2563eb) 55%, transparent);
2292
- outline-offset: 2px;
2293
- }
2392
+ .vh-image-preview--compact {
2393
+ aspect-ratio: 1;
2394
+ border: 0;
2395
+ height: 100%;
2396
+ width: 100%;
2397
+ }
2294
2398
 
2295
- .vh-agent-tool-list__disclosure > summary small {
2296
- color: var(--vh-ui-dimmed);
2297
- flex: 1;
2298
- font-size: 0.625rem;
2299
- min-width: 0;
2300
- overflow: hidden;
2301
- text-overflow: ellipsis;
2302
- white-space: nowrap;
2303
- }
2399
+ .vh-image-unavailable {
2400
+ font-size: 0.75rem;
2401
+ overflow-wrap: anywhere;
2402
+ padding: 0.5rem;
2403
+ }
2304
2404
 
2305
- .vh-agent-tool-list > [data-used="false"] {
2306
- opacity: 0.66;
2307
- }
2405
+ .vh-image-dialog__toolbar {
2406
+ align-items: center;
2407
+ border: 0;
2408
+ color: white;
2409
+ display: flex;
2410
+ flex: none;
2411
+ gap: 0.25rem;
2412
+ padding-bottom: 0.5rem;
2413
+ }
2308
2414
 
2309
- .vh-agent-tool-list__count {
2310
- align-items: center;
2311
- background: var(--vh-ui-bg-elevated);
2312
- border-radius: 999px;
2313
- color: var(--vh-ui-dimmed);
2314
- display: inline-flex;
2315
- flex: none;
2316
- font-size: 0.625rem;
2317
- justify-content: center;
2318
- min-width: 1.35rem;
2319
- padding: 0.1rem 0.3rem;
2320
- }
2415
+ .vh-image-dialog__name {
2416
+ flex: 1;
2417
+ font-size: 0.75rem;
2418
+ min-width: 0;
2419
+ overflow: hidden;
2420
+ text-overflow: ellipsis;
2421
+ white-space: nowrap;
2422
+ }
2321
2423
 
2322
- .vh-agent-tool-list > [data-used="true"] .vh-agent-tool-list__count {
2323
- background: color-mix(in oklab, var(--ui-primary, #2563eb) 14%, transparent);
2324
- color: var(--ui-primary, #2563eb);
2325
- }
2424
+ .vh-image-dialog__image {
2425
+ border-radius: var(--vh-ui-radius);
2426
+ display: block;
2427
+ max-height: calc(92dvh - 3rem);
2428
+ max-width: 92vw;
2429
+ object-fit: contain;
2430
+ }
2326
2431
 
2327
- .vh-agent-tool-list__chevron {
2328
- height: 0.8rem;
2329
- stroke: currentColor;
2330
- stroke-width: 2;
2331
- transition: transform 150ms ease;
2332
- width: 0.8rem;
2333
- }
2432
+ .vh-image-dialog__error {
2433
+ background: black;
2434
+ border-radius: var(--vh-ui-radius);
2435
+ color: white;
2436
+ font-size: 0.875rem;
2437
+ max-width: 24rem;
2438
+ padding: 2rem;
2439
+ }
2334
2440
 
2335
- .vh-agent-tool-list__disclosure[open] > summary .vh-agent-tool-list__chevron {
2336
- transform: rotate(180deg);
2337
- }
2441
+ [data-slot="invocation"] [data-activity-id][data-selected="true"] {
2442
+ background: color-mix(in oklab, var(--vh-ui-info) 9%, transparent);
2443
+ border-radius: calc(var(--vh-ui-radius) * 0.85);
2444
+ outline: 2px solid color-mix(in oklab, var(--vh-ui-info) 42%, transparent);
2445
+ outline-offset: 2px;
2446
+ scroll-margin-block: 5rem;
2447
+ }
2338
2448
 
2339
- .vh-agent-tool-list__body {
2340
- display: grid;
2341
- gap: 0.65rem;
2342
- padding: 0.35rem 0.45rem 0.75rem;
2343
- }
2449
+ .vh-code-view,
2450
+ .vh-diff,
2451
+ .vh-file,
2452
+ .vh-unresolved-file,
2453
+ .vh-file-tree {
2454
+ border: 1px solid var(--vh-ui-border);
2455
+ border-radius: var(--vh-ui-radius);
2456
+ display: block;
2457
+ overflow: hidden;
2458
+ }
2344
2459
 
2345
- .vh-agent-tool-list__body > p {
2346
- color: var(--vh-ui-muted);
2347
- font-size: 0.75rem;
2348
- line-height: 1.55;
2349
- margin: 0;
2350
- }
2460
+ .vh-code-view,
2461
+ .vh-diff,
2462
+ .vh-file,
2463
+ .vh-unresolved-file {
2464
+ --diffs-addition-base: var(--vh-ui-success);
2465
+ --diffs-bg: var(--vh-ui-bg);
2466
+ --diffs-bg-addition: color-mix(in oklab, var(--vh-ui-success) 12%, var(--vh-ui-bg));
2467
+ --diffs-bg-addition-emphasis: color-mix(in oklab, var(--vh-ui-success) 22%, var(--vh-ui-bg));
2468
+ --diffs-bg-buffer: var(--vh-ui-bg-muted);
2469
+ --diffs-bg-context: var(--vh-ui-bg);
2470
+ --diffs-bg-context-gutter: color-mix(in oklab, var(--vh-ui-bg-muted) 72%, var(--vh-ui-bg));
2471
+ --diffs-bg-deletion: color-mix(in oklab, var(--vh-ui-error) 12%, var(--vh-ui-bg));
2472
+ --diffs-bg-deletion-emphasis: color-mix(in oklab, var(--vh-ui-error) 22%, var(--vh-ui-bg));
2473
+ --diffs-bg-separator: var(--vh-ui-bg-muted);
2474
+ --diffs-deletion-base: var(--vh-ui-error);
2475
+ --diffs-fg: var(--vh-ui-text);
2476
+ --diffs-fg-conflict-marker: var(--vh-ui-muted);
2477
+ --diffs-fg-number: var(--vh-ui-dimmed);
2478
+ --diffs-font-family: var(--font-mono, ui-monospace, SFMono-Regular, Menlo, monospace);
2479
+ --diffs-font-size: 0.8125rem;
2480
+ --diffs-header-font-family: var(--font-sans, ui-sans-serif, system-ui, sans-serif);
2481
+ --diffs-modified-base: var(--vh-ui-info);
2482
+ background: var(--vh-ui-bg);
2483
+ color: var(--vh-ui-text);
2484
+ min-height: 4rem;
2485
+ }
2351
2486
 
2352
- .vh-agent-tool-list__schema strong {
2353
- color: var(--vh-ui-dimmed);
2354
- display: block;
2355
- font-size: 0.625rem;
2356
- margin-block-end: 0.35rem;
2357
- text-transform: uppercase;
2358
- }
2487
+ .vh-code-view {
2488
+ min-height: 12rem;
2489
+ }
2359
2490
 
2360
- .vh-agent-tool-list__schema pre {
2361
- background: color-mix(in oklab, var(--vh-ui-bg-elevated) 65%, transparent);
2362
- border: 1px solid var(--vh-ui-border);
2363
- border-radius: calc(var(--vh-ui-radius) * 0.8);
2364
- color: var(--vh-ui-muted);
2365
- font-size: 0.625rem;
2366
- line-height: 1.55;
2367
- margin: 0;
2368
- max-height: 18rem;
2369
- overflow: auto;
2370
- padding: 0.6rem 0.65rem;
2371
- white-space: pre;
2372
- }
2491
+ .vh-file-tree {
2492
+ height: 24rem;
2493
+ }
2373
2494
 
2374
- .vh-invocation-inspector__item,
2375
- .vh-invocation-inspector__item-disclosure summary {
2376
- align-items: center;
2377
- border-radius: calc(var(--vh-ui-radius) * 0.8);
2378
- display: flex;
2379
- gap: 0.45rem;
2380
- min-height: 1.8rem;
2381
- padding: 0.3rem 0.45rem;
2382
- }
2495
+ .vh-visually-hidden {
2496
+ clip: rect(0 0 0 0);
2497
+ clip-path: inset(50%);
2498
+ height: 1px;
2499
+ overflow: hidden;
2500
+ position: absolute;
2501
+ white-space: nowrap;
2502
+ width: 1px;
2503
+ }
2383
2504
 
2384
- .vh-invocation-inspector__item code,
2385
- .vh-invocation-inspector__item-disclosure summary code {
2386
- flex: 1;
2387
- font-size: 0.6875rem;
2388
- min-width: 0;
2389
- overflow-wrap: anywhere;
2390
- }
2505
+ @media (prefers-reduced-motion: reduce) {
2506
+ .vh-chat__viewport {
2507
+ scroll-behavior: auto;
2508
+ }
2509
+ }
2391
2510
 
2392
- .vh-invocation-inspector__item-disclosure summary:hover {
2393
- background: color-mix(in oklab, var(--vh-ui-bg-elevated) 70%, transparent);
2394
- }
2511
+ .vh-agent-tool-list {
2512
+ grid-template-columns: minmax(0, 1fr);
2513
+ display: grid;
2514
+ gap: 0.125rem;
2515
+ margin-block-start: 0.45rem;
2516
+ }
2395
2517
 
2396
- .vh-invocation-inspector__item-disclosure summary small {
2397
- color: var(--vh-ui-dimmed);
2398
- font-size: 0.625rem;
2399
- }
2518
+ .vh-agent-tool-list__item,
2519
+ .vh-agent-tool-list__disclosure > summary {
2520
+ align-items: center;
2521
+ border-radius: calc(var(--vh-ui-radius) * 0.8);
2522
+ display: flex;
2523
+ gap: 0.5rem;
2524
+ min-height: 1.8rem;
2525
+ padding: 0.3rem 0.45rem;
2526
+ }
2400
2527
 
2401
- .vh-invocation-inspector__items {
2402
- display: flex;
2403
- flex-wrap: wrap;
2404
- gap: 0.35rem;
2405
- list-style: none;
2406
- margin: 0.6rem 0 0;
2407
- padding: 0;
2408
- }
2528
+ .vh-agent-tool-list__item code,
2529
+ .vh-agent-tool-list__disclosure > summary code {
2530
+ flex: 0 1 auto;
2531
+ min-width: 0;
2532
+ font-size: 0.6875rem;
2533
+ overflow-wrap: anywhere;
2534
+ }
2409
2535
 
2410
- .vh-invocation-inspector__items li {
2411
- background: color-mix(in oklab, var(--vh-ui-bg-elevated) 72%, transparent);
2412
- border: 1px solid var(--vh-ui-border);
2413
- border-radius: calc(var(--vh-ui-radius) * 0.8);
2414
- color: var(--vh-ui-muted);
2415
- max-width: 100%;
2416
- padding: 0.25rem 0.45rem;
2417
- }
2536
+ .vh-agent-tool-list__disclosure > summary {
2537
+ cursor: pointer;
2538
+ list-style: none;
2539
+ }
2418
2540
 
2419
- .vh-invocation-inspector__items code {
2420
- display: block;
2421
- font-size: 0.6875rem;
2422
- overflow-wrap: anywhere;
2423
- }
2541
+ .vh-agent-tool-list__disclosure > summary::-webkit-details-marker {
2542
+ display: none;
2543
+ }
2424
2544
 
2425
- .vh-invocation-inspector__item-disclosure pre,
2426
- .vh-invocation-inspector__instructions {
2427
- background: color-mix(in oklab, var(--vh-ui-bg-elevated) 65%, transparent);
2428
- border: 1px solid var(--vh-ui-border);
2429
- border-radius: calc(var(--vh-ui-radius) * 0.8);
2430
- color: var(--vh-ui-muted);
2431
- font-size: 0.625rem;
2432
- line-height: 1.55;
2433
- margin: 0.4rem 0 0;
2434
- max-height: 18rem;
2435
- overflow: auto;
2436
- padding: 0.6rem 0.65rem;
2437
- white-space: pre-wrap;
2438
- }
2545
+ .vh-agent-tool-list__disclosure > summary:hover {
2546
+ background: color-mix(in oklab, var(--vh-ui-bg-elevated) 70%, transparent);
2547
+ }
2439
2548
 
2440
- .vh-invocation-inspector__instructions {
2441
- margin-block-start: 0.65rem;
2442
- }
2549
+ .vh-agent-tool-list__disclosure > summary:focus-visible {
2550
+ outline: 2px solid color-mix(in oklab, var(--ui-primary, #2563eb) 55%, transparent);
2551
+ outline-offset: 2px;
2552
+ }
2443
2553
 
2444
- @container (max-width: 19rem) {
2445
- .vh-invocation-inspector__metrics {
2446
- grid-template-columns: repeat(2, minmax(0, 1fr));
2554
+ .vh-agent-tool-list__item small,
2555
+ .vh-agent-tool-list__disclosure > summary small {
2556
+ color: var(--vh-ui-dimmed);
2557
+ flex: 1;
2558
+ font-size: 0.625rem;
2559
+ min-width: 0;
2560
+ overflow: hidden;
2561
+ text-overflow: ellipsis;
2562
+ white-space: nowrap;
2447
2563
  }
2448
2564
 
2449
- .vh-invocation-inspector__list > div {
2450
- grid-template-columns: minmax(0, 1fr);
2565
+ .vh-agent-tool-list__icon {
2566
+ color: var(--vh-ui-muted);
2567
+ display: inline-flex;
2568
+ flex: none;
2451
2569
  }
2452
2570
 
2453
- .vh-invocation-inspector__list dd {
2454
- text-align: start;
2571
+ .vh-agent-tool-list__icon > * {
2572
+ height: 0.875rem;
2573
+ width: 0.875rem;
2455
2574
  }
2456
- }
2457
2575
 
2458
- .vh-invocation-empty {
2459
- align-items: center;
2460
- color: var(--vh-ui-dimmed);
2461
- display: flex;
2462
- flex-direction: column;
2463
- gap: 0.6rem;
2464
- justify-content: center;
2465
- min-height: 16rem;
2466
- }
2576
+ .vh-agent-tool-list > [data-used="false"] {
2577
+ opacity: 0.66;
2578
+ }
2467
2579
 
2468
- .vh-invocation-empty p {
2469
- font-size: 0.8125rem;
2470
- margin: 0;
2471
- }
2580
+ .vh-agent-tool-list__count {
2581
+ appearance: none;
2582
+ background: transparent;
2583
+ border: 0;
2584
+ color: var(--vh-ui-dimmed);
2585
+ flex: none;
2586
+ font: inherit;
2587
+ font-size: 0.6875rem;
2588
+ margin-inline-start: auto;
2589
+ padding: 0;
2590
+ white-space: nowrap;
2591
+ }
2472
2592
 
2473
- @container (max-width: 600px) {
2474
- .vh-invocation-thread__content {
2475
- padding: 1.5rem 1rem 3rem;
2593
+ .vh-agent-tool-list > [data-used="true"] .vh-agent-tool-list__count {
2594
+ color: var(--vh-ui-muted);
2476
2595
  }
2477
2596
 
2478
- .vh-invocation-message[data-role="user"] {
2479
- margin-inline-start: 1rem;
2597
+ button.vh-agent-tool-list__count {
2598
+ cursor: pointer;
2599
+ text-decoration: underline dotted;
2600
+ text-underline-offset: 0.2rem;
2480
2601
  }
2481
- }
2482
2602
 
2483
- @media (max-width: 600px) {
2484
- .vh-invocation-thread__content {
2485
- padding: 1.5rem 1rem 3rem;
2603
+ button.vh-agent-tool-list__count:hover,
2604
+ button.vh-agent-tool-list__count:focus-visible {
2605
+ color: var(--vh-ui-text);
2486
2606
  }
2487
2607
 
2488
- .vh-invocation-message[data-role="user"] {
2489
- margin-inline-start: 1rem;
2608
+ .vh-agent-tool-list__chevron {
2609
+ height: 0.8rem;
2610
+ stroke: currentColor;
2611
+ stroke-width: 2;
2612
+ transition: transform 150ms ease;
2613
+ width: 0.8rem;
2490
2614
  }
2491
- }
2492
2615
 
2493
- .vh-code-view,
2494
- .vh-diff,
2495
- .vh-file,
2496
- .vh-unresolved-file,
2497
- .vh-file-tree {
2498
- border: 1px solid var(--vh-ui-border);
2499
- border-radius: var(--vh-ui-radius);
2500
- display: block;
2501
- overflow: hidden;
2502
- }
2616
+ .vh-agent-tool-list__disclosure[open] > summary .vh-agent-tool-list__chevron {
2617
+ transform: rotate(180deg);
2618
+ }
2503
2619
 
2504
- .vh-code-view,
2505
- .vh-diff,
2506
- .vh-file,
2507
- .vh-unresolved-file {
2508
- --diffs-addition-base: var(--vh-ui-success);
2509
- --diffs-bg: var(--vh-ui-bg);
2510
- --diffs-bg-addition: color-mix(in oklab, var(--vh-ui-success) 12%, var(--vh-ui-bg));
2511
- --diffs-bg-addition-emphasis: color-mix(in oklab, var(--vh-ui-success) 22%, var(--vh-ui-bg));
2512
- --diffs-bg-buffer: var(--vh-ui-bg-muted);
2513
- --diffs-bg-context: var(--vh-ui-bg);
2514
- --diffs-bg-context-gutter: color-mix(in oklab, var(--vh-ui-bg-muted) 72%, var(--vh-ui-bg));
2515
- --diffs-bg-deletion: color-mix(in oklab, var(--vh-ui-error) 12%, var(--vh-ui-bg));
2516
- --diffs-bg-deletion-emphasis: color-mix(in oklab, var(--vh-ui-error) 22%, var(--vh-ui-bg));
2517
- --diffs-bg-separator: var(--vh-ui-bg-muted);
2518
- --diffs-deletion-base: var(--vh-ui-error);
2519
- --diffs-fg: var(--vh-ui-text);
2520
- --diffs-fg-conflict-marker: var(--vh-ui-muted);
2521
- --diffs-fg-number: var(--vh-ui-dimmed);
2522
- --diffs-font-family: var(--font-mono, ui-monospace, SFMono-Regular, Menlo, monospace);
2523
- --diffs-font-size: 0.8125rem;
2524
- --diffs-header-font-family: var(--font-sans, ui-sans-serif, system-ui, sans-serif);
2525
- --diffs-modified-base: var(--vh-ui-info);
2526
- background: var(--vh-ui-bg);
2527
- color: var(--vh-ui-text);
2528
- min-height: 4rem;
2529
- }
2530
-
2531
- .vh-code-view {
2532
- min-height: 12rem;
2533
- }
2534
-
2535
- .vh-file-tree {
2536
- height: 24rem;
2537
- }
2538
-
2539
- .vh-visually-hidden {
2540
- clip: rect(0 0 0 0);
2541
- clip-path: inset(50%);
2542
- height: 1px;
2543
- overflow: hidden;
2544
- position: absolute;
2545
- white-space: nowrap;
2546
- width: 1px;
2547
- }
2620
+ .vh-agent-tool-list__body {
2621
+ grid-template-columns: minmax(0, 1fr);
2622
+ display: grid;
2623
+ gap: 0.65rem;
2624
+ padding: 0.35rem 0.45rem 0.75rem;
2625
+ }
2548
2626
 
2549
- @media (prefers-reduced-motion: reduce) {
2550
- .vh-chat__viewport {
2551
- scroll-behavior: auto;
2627
+ .vh-agent-tool-list__body > p {
2628
+ color: var(--vh-ui-muted);
2629
+ font-size: 0.75rem;
2630
+ line-height: 1.55;
2631
+ margin: 0;
2552
2632
  }
2553
2633
 
2554
- .vh-invocation-list__item[data-status="running"] .vh-invocation-list__state-icon svg,
2555
- .vh-invocation-inspector[data-status="running"] .vh-invocation-inspector__status-icon svg {
2556
- animation: none;
2634
+ .vh-agent-tool-list__schema strong {
2635
+ color: var(--vh-ui-dimmed);
2636
+ display: block;
2637
+ font-size: 0.625rem;
2638
+ margin-block-end: 0.35rem;
2639
+ text-transform: uppercase;
2557
2640
  }
2558
2641
 
2559
- .vh-invocation-inspector__chevron {
2560
- transition: none;
2642
+ .vh-agent-tool-list__schema pre {
2643
+ background: color-mix(in oklab, var(--vh-ui-bg-elevated) 65%, transparent);
2644
+ border: 1px solid var(--vh-ui-border);
2645
+ border-radius: calc(var(--vh-ui-radius) * 0.8);
2646
+ color: var(--vh-ui-muted);
2647
+ font-size: 0.625rem;
2648
+ line-height: 1.55;
2649
+ margin: 0;
2650
+ max-height: 18rem;
2651
+ overflow: auto;
2652
+ padding: 0.6rem 0.65rem;
2653
+ white-space: pre;
2561
2654
  }
2655
+ .vh-agent-tool-list__body > p { white-space: pre-wrap; overflow-wrap: anywhere; }
2656
+
2657
+ .vh-agent-tool-list__properties { width: 100%; border-collapse: collapse; font-size: 0.6875rem; text-align: start; table-layout: fixed; }
2658
+ .vh-agent-tool-list__properties td, .vh-agent-tool-list__properties th { border-bottom: 1px solid var(--vh-ui-border); padding: 0.375rem; vertical-align: top; overflow-wrap: anywhere; }
2659
+ .vh-agent-tool-list__properties small { display: block; color: var(--vh-ui-muted); }
2660
+ .vh-agent-tool-list__schema pre { white-space: pre-wrap; overflow-wrap: anywhere; }
2661
+ .vh-agent-tool-list__unavailable { color: var(--vh-ui-muted); font-size: 0.6875rem; }
2562
2662
  }