@openspecui/web 3.9.0 → 3.11.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 (619) hide show
  1. package/dist/assets/{BufferResource-D3AKV5w_.js → BufferResource-C08dlE1_.js} +1 -1
  2. package/dist/assets/CanvasRenderer-Cntd8ry7.js +1 -0
  3. package/dist/assets/{Geometry-C-MCm9EO.js → Geometry-Dr8DqqDe.js} +1 -1
  4. package/dist/assets/{ImageSource-B22J1qWQ.js → ImageSource-CGpyv_SH.js} +1 -1
  5. package/dist/assets/{RenderTargetSystem-a2OW-r9i.js → RenderTargetSystem-COjjAuAB.js} +1 -1
  6. package/dist/assets/WebGLRenderer-DZEgkU7P.js +1 -0
  7. package/dist/assets/WebGPURenderer-DtnLusyN.js +1 -0
  8. package/dist/assets/add-DoVE8GY7.js +1 -0
  9. package/dist/assets/add-note-CWFgco4Z.js +1 -0
  10. package/dist/assets/add-playlist-CcOrN2f2.js +1 -0
  11. package/dist/assets/add-user-DX0Eywi4.js +1 -0
  12. package/dist/assets/airplay-Cn8zJk1w.js +1 -0
  13. package/dist/assets/{angular-html-JCbR6NhA.js → angular-html-DRwRMfwy.js} +1 -1
  14. package/dist/assets/{angular-ts-CNWwWDzo.js → angular-ts-eNLzy5MM.js} +1 -1
  15. package/dist/assets/{apl--EneV-pF.js → apl-DCKZGJwU.js} +1 -1
  16. package/dist/assets/arrow-collapse-C7ZIzYk9.js +1 -0
  17. package/dist/assets/arrow-collapse-in-Ccsen9kh.js +1 -0
  18. package/dist/assets/arrow-down-C9z5oBQ2.js +1 -0
  19. package/dist/assets/arrow-expand-BeEEym4e.js +1 -0
  20. package/dist/assets/arrow-expand-out-DjS8Havw.js +1 -0
  21. package/dist/assets/arrow-left-FPT5WhLa.js +1 -0
  22. package/dist/assets/arrow-right-c774CXK7.js +1 -0
  23. package/dist/assets/arrow-up-BVPQ_jz2.js +1 -0
  24. package/dist/assets/{astro-BbXT629y.js → astro-EVzibiTP.js} +1 -1
  25. package/dist/assets/audio-preview-DF-g2nKV.js +1 -0
  26. package/dist/assets/{blade-DCeMo3Gz.js → blade-BlgBU4xi.js} +1 -1
  27. package/dist/assets/bookmark-xq6HKihJ.js +1 -0
  28. package/dist/assets/browserAll-C0q2DkVO.js +1 -0
  29. package/dist/assets/{bsl-baasCE8P.js → bsl-ROP5CocM.js} +1 -1
  30. package/dist/assets/{c-B5E81XOM.js → c-CYXkGxNJ.js} +1 -1
  31. package/dist/assets/{cairo-BkvliMUx.js → cairo-Y91V9cKj.js} +1 -1
  32. package/dist/assets/camera-DcgmsZFY.js +1 -0
  33. package/dist/assets/chapters-CWCRU4NE.js +1 -0
  34. package/dist/assets/chat-CjBvkjJQ.js +1 -0
  35. package/dist/assets/chat-collapse-D7uSBds2.js +1 -0
  36. package/dist/assets/chevron-down-DnbqQaM_.js +1 -0
  37. package/dist/assets/chevron-left-BLH8sfz-.js +1 -0
  38. package/dist/assets/chevron-right-Cx9jMJWP.js +1 -0
  39. package/dist/assets/chevron-up-ZO9wrLsS.js +1 -0
  40. package/dist/assets/chromecast-BINNmv53.js +1 -0
  41. package/dist/assets/chunk-XC5AOFRA-DNdxRVGN.js +1 -0
  42. package/dist/assets/chunk-XPDWGPRV-G9jotk_X.js +1 -0
  43. package/dist/assets/client-CNtwgWOm.js +9 -0
  44. package/dist/assets/clip-C8Wd7-v1.js +1 -0
  45. package/dist/assets/closed-captions-Cz7lecqe.js +1 -0
  46. package/dist/assets/closed-captions-on-BTsU9xHi.js +1 -0
  47. package/dist/assets/{cobol-DFA-05z0.js → cobol-DwyfNZUw.js} +1 -1
  48. package/dist/assets/{coffee-BIEZ2_PA.js → coffee-B8v2Wa7-.js} +1 -1
  49. package/dist/assets/comment-B3rCor45.js +1 -0
  50. package/dist/assets/common-DiWYGJu_.js +22 -0
  51. package/dist/assets/computer-BGdi_vvC.js +1 -0
  52. package/dist/assets/{cpp-DYT7t0SZ.js → cpp-ljtJvfZQ.js} +1 -1
  53. package/dist/assets/{crystal-OPLKg2mT.js → crystal-D8eXAHcv.js} +1 -1
  54. package/dist/assets/{css-B1O5LeXo.js → css-xQqtr90G.js} +1 -1
  55. package/dist/assets/cursor-editorTextHighlight-kG3uUOwL.svg +8 -0
  56. package/dist/assets/device-CxeIuxPi.js +1 -0
  57. package/dist/assets/dist-B_uzjHQN.js +1 -0
  58. package/dist/assets/dist-CRlC9_e7.js +1 -0
  59. package/dist/assets/{dist-B3TCWeQI.js → dist-CaORa3GR.js} +1 -1
  60. package/dist/assets/{dist-DB2qgDuh.js → dist-CaejG1dm.js} +1 -1
  61. package/dist/assets/dist-CcLC6JdJ.js +1 -0
  62. package/dist/assets/dist-CfJPknqn.js +1 -0
  63. package/dist/assets/dist-CjSC6Iz-.js +1 -0
  64. package/dist/assets/dist-Co2y3Dp-.js +1 -0
  65. package/dist/assets/{dist-0COy00zm.js → dist-Ct1D1r3D.js} +1 -1
  66. package/dist/assets/dist-D0kk4OnI.js +1 -0
  67. package/dist/assets/{dist-CCRZBEfv.js → dist-D65w4-0d.js} +1 -1
  68. package/dist/assets/dist-D7t0ICkd.js +1 -0
  69. package/dist/assets/{dist-BlZibS7L.js → dist-DBzjiykV.js} +1 -1
  70. package/dist/assets/dist-DSHRZu7v.js +1 -0
  71. package/dist/assets/dist-Deq3d3tg.js +1 -0
  72. package/dist/assets/{dist-DK_X22KS.js → dist-DhToCcpI.js} +1 -1
  73. package/dist/assets/dist-DqB_uiSZ.js +1 -0
  74. package/dist/assets/{dist-Dwec7KIH.js → dist-DtDYJdOe.js} +1 -1
  75. package/dist/assets/{dist-DygtUgm8.js → dist-YdUjCFVN.js} +1 -1
  76. package/dist/assets/{dist-yu78ax1a.js → dist-jDblB_T7.js} +1 -1
  77. package/dist/assets/dist-jEMUT-cO.js +1 -0
  78. package/dist/assets/{dist-C4ldnarW.js → dist-lNuHRy_r.js} +1 -1
  79. package/dist/assets/{dockerfile-Ci0-ApQC.js → dockerfile-B9WyxmEu.js} +1 -1
  80. package/dist/assets/download-Cce-H-ZM.js +1 -0
  81. package/dist/assets/{edge-B_Hxxh_T.js → edge-BF9yTvjv.js} +1 -1
  82. package/dist/assets/{elixir-CexTPAef.js → elixir-B_B5En4k.js} +1 -1
  83. package/dist/assets/{elm-DVPcuGsD.js → elm-gyEPvRKn.js} +1 -1
  84. package/dist/assets/episodes-BvkaMZ8-.js +1 -0
  85. package/dist/assets/{erb-DK41lvap.js → erb-CrCiRjX6.js} +1 -1
  86. package/dist/assets/{erlang-vfCdWglx.js → erlang-Bt6NlFdF.js} +1 -1
  87. package/dist/assets/errors-DVESjK3y.js +1 -0
  88. package/dist/assets/eye-D5-_oy4W.js +1 -0
  89. package/dist/assets/{factor-DMvifS-k.js → factor-DRSLM7tp.js} +1 -1
  90. package/dist/assets/fast-backward-D9dXd1Qy.js +1 -0
  91. package/dist/assets/fast-forward-CYUMds_X.js +1 -0
  92. package/dist/assets/flag-Dtmr-9b8.js +1 -0
  93. package/dist/assets/{fortran-fixed-form-eRZkDVxE.js → fortran-fixed-form-BlyL6vAi.js} +1 -1
  94. package/dist/assets/{fsharp-lKBUVRnt.js → fsharp-CPUyN5V2.js} +1 -1
  95. package/dist/assets/fullscreen-CmB1c4--.js +1 -0
  96. package/dist/assets/fullscreen-arrow-C3VfgtaN.js +1 -0
  97. package/dist/assets/fullscreen-arrow-exit-DqOXxDMG.js +1 -0
  98. package/dist/assets/fullscreen-exit-DU7tI9hu.js +1 -0
  99. package/dist/assets/{gdresource-C_R0x-CQ.js → gdresource-3p4mNHpb.js} +1 -1
  100. package/dist/assets/{getTextureBatchBindGroup-MoChLDk_.js → getTextureBatchBindGroup-BfHjyiAV.js} +1 -1
  101. package/dist/assets/ghostty-web-CxzCiCWn.js +13 -0
  102. package/dist/assets/{git-commit-SMAxcXsl.js → git-commit-BUEnSUuI.js} +1 -1
  103. package/dist/assets/{git-rebase-QkxbQN1W.js → git-rebase-C31Q9wLE.js} +1 -1
  104. package/dist/assets/{glimmer-js-Ci9Jniu_.js → glimmer-js-C52Y4fUH.js} +1 -1
  105. package/dist/assets/{glimmer-ts-f6mheIFE.js → glimmer-ts-BWcx8nGq.js} +1 -1
  106. package/dist/assets/{glsl-CE_tGyBF.js → glsl-B14Nf0bw.js} +1 -1
  107. package/dist/assets/{graphql-DMHKd7V7.js → graphql-sQJ6gIy3.js} +1 -1
  108. package/dist/assets/{hack-Bd7yRRDg.js → hack-B3o_6UdT.js} +1 -1
  109. package/dist/assets/{haml-B-zh4HcV.js → haml-b85W5NJa.js} +1 -1
  110. package/dist/assets/{handlebars-73p99hU2.js → handlebars-D0WfzX4P.js} +1 -1
  111. package/dist/assets/heart-C5fn_wNi.js +1 -0
  112. package/dist/assets/{html-dLhzswBO.js → html-BUh_K1Ws.js} +1 -1
  113. package/dist/assets/{html-derivative-CRPsQPjv.js → html-derivative-CI0a_UC2.js} +1 -1
  114. package/dist/assets/{http-BmUbDDZ3.js → http-D2LmS59K.js} +1 -1
  115. package/dist/assets/{hurl-D8J5iekO.js → hurl-COx-msQh.js} +1 -1
  116. package/dist/assets/{hxml-BNnDhNNK.js → hxml-PXekqTur.js} +1 -1
  117. package/dist/assets/image-preview-BvROjYK5.js +1 -0
  118. package/dist/assets/image-preview-DbXbUOzB.css +1 -0
  119. package/dist/assets/info-BSFfpD3X.js +1 -0
  120. package/dist/assets/init-CXvIgPy6.js +1 -0
  121. package/dist/assets/{java-BMDGffNu.js → java-CY_ZDz_b.js} +1 -1
  122. package/dist/assets/{javascript-Dbc2F9Uj.js → javascript-CVtEj2Ax.js} +1 -1
  123. package/dist/assets/{jinja-ByHiV4iy.js → jinja-DqDhfavg.js} +1 -1
  124. package/dist/assets/{jison-BTOyGOJM.js → jison-AZhthQMg.js} +1 -1
  125. package/dist/assets/{json-BhpxJ_uj.js → json-C5SgWOeO.js} +1 -1
  126. package/dist/assets/{jsx-CPDjNUh8.js → jsx-lP4LEWkV.js} +1 -1
  127. package/dist/assets/jsx-runtime-1jQlXmIx.js +1 -0
  128. package/dist/assets/{julia-Cl6n8WOO.js → julia-Cj513uz1.js} +1 -1
  129. package/dist/assets/language-C_l1DBQe.js +1 -0
  130. package/dist/assets/{latex-C0_SOykc.js → latex-DwZK1V4M.js} +1 -1
  131. package/dist/assets/link-DH5zaMZ1.js +1 -0
  132. package/dist/assets/{liquid-Cr1xVqMM.js → liquid-Bq0P5vJ7.js} +1 -1
  133. package/dist/assets/lock-closed-BUf3MBxW.js +1 -0
  134. package/dist/assets/lock-open-BQ4FTuPQ.js +1 -0
  135. package/dist/assets/{lua-BWPGgBUj.js → lua-C-xH-Hms.js} +1 -1
  136. package/dist/assets/main-DjDAttzm.js +1646 -0
  137. package/dist/assets/main-Dyvh_8NL.css +1 -0
  138. package/dist/assets/{marko-BPXt0CD8.js → marko-B0ZA9L6u.js} +1 -1
  139. package/dist/assets/{mdc-CIsV3UeT.js → mdc-BjV-9MeS.js} +1 -1
  140. package/dist/assets/media-preview-D7f05nnk.css +1 -0
  141. package/dist/assets/media-preview-DWkSTGaX.js +2 -0
  142. package/dist/assets/media-ui-VgHJ-PHx.js +2 -0
  143. package/dist/assets/menu-horizontal-B6s-1vTa.js +1 -0
  144. package/dist/assets/menu-vertical-CWyBtj8F.js +1 -0
  145. package/dist/assets/microphone-BY0rFANt.js +1 -0
  146. package/dist/assets/mobile-BrxUhnS0.js +1 -0
  147. package/dist/assets/modulepreload-polyfill-CXK8biUa.js +1 -0
  148. package/dist/assets/moon-DnE1rK16.js +1 -0
  149. package/dist/assets/music-DgWl84sr.js +1 -0
  150. package/dist/assets/music-off-BIZK0PLj.js +1 -0
  151. package/dist/assets/mute-Wv31sLaT.js +1 -0
  152. package/dist/assets/next-Cl9F67W2.js +1 -0
  153. package/dist/assets/{nginx-CxaJu6Pj.js → nginx-BlGA_Yc6.js} +1 -1
  154. package/dist/assets/{nim-DEeX4yt_.js → nim-BRY7cBHe.js} +1 -1
  155. package/dist/assets/notification-DO_HNWPB.js +1 -0
  156. package/dist/assets/{nsis-BbRIeGvl.js → nsis-BOISW3t0.js} +1 -1
  157. package/dist/assets/odometer-ByhVM-4K.js +1 -0
  158. package/dist/assets/pause-D49Xseka.js +1 -0
  159. package/dist/assets/pdf-preview-C7gTFuZg.js +55 -0
  160. package/dist/assets/pdf-preview-DatbxdFW.css +1 -0
  161. package/dist/assets/pdf.worker.min-iDqQPrd3.mjs +31 -0
  162. package/dist/assets/pdf_viewer-C0F_ZnIy.js +501 -0
  163. package/dist/assets/{perl-nNEiznlj.js → perl-ZYxvPTl8.js} +1 -1
  164. package/dist/assets/{php-CFhEnfPT.js → php-BkicJQpQ.js} +1 -1
  165. package/dist/assets/picture-in-picture-DN7RmJ3z.js +1 -0
  166. package/dist/assets/picture-in-picture-exit-BwgCZZdp.js +1 -0
  167. package/dist/assets/play-CVvMlNWu.js +1 -0
  168. package/dist/assets/playback-speed-circle-CWnhxJ8o.js +1 -0
  169. package/dist/assets/playlist-CNLCJZTu.js +1 -0
  170. package/dist/assets/preload-helper-DgFuoWHe.js +1 -0
  171. package/dist/assets/previous-GulzH3pC.js +1 -0
  172. package/dist/assets/prod-B_gvu_Yr.js +5 -0
  173. package/dist/assets/prod-H1gIJ3Nt.js +1 -0
  174. package/dist/assets/provider-BoUAVVe0.js +1 -0
  175. package/dist/assets/provider-CfNWDDig.js +1 -0
  176. package/dist/assets/provider-Cj58hbuJ.js +1 -0
  177. package/dist/assets/provider-gmPj3q5A.js +1 -0
  178. package/dist/assets/{pug-B1jWkhMW.js → pug-CtobE3oR.js} +1 -1
  179. package/dist/assets/{pug-D1ZtszdL.js → pug-RUWq2f7J.js} +1 -1
  180. package/dist/assets/{qml-B3LbNeX2.js → qml-bFAbyxEk.js} +1 -1
  181. package/dist/assets/question-mark-Yk1OEoxM.js +1 -0
  182. package/dist/assets/queue-list-CDf4dIe8.js +1 -0
  183. package/dist/assets/{r-Ck8dtqom.js → r-BuzK-O4X.js} +1 -1
  184. package/dist/assets/radio-button-BHXtnVsK.js +1 -0
  185. package/dist/assets/radio-button-selected-Cbcd4nNT.js +1 -0
  186. package/dist/assets/{razor-w-TbBbA8.js → razor-BdPQn0FN.js} +1 -1
  187. package/dist/assets/{regexp-CEXR86Sj.js → regexp-zEw_f83a.js} +1 -1
  188. package/dist/assets/register-BoElj7Sn.js +1 -0
  189. package/dist/assets/repeat-D7Y2Sa5U.js +1 -0
  190. package/dist/assets/repeat-on-BN1EX623.js +1 -0
  191. package/dist/assets/repeat-square-CIKm5EZg.js +1 -0
  192. package/dist/assets/repeat-square-on-Bm9kAL2k.js +1 -0
  193. package/dist/assets/replay-CvqkHACU.js +1 -0
  194. package/dist/assets/rotate-DQS0vFC1.js +1 -0
  195. package/dist/assets/{rst-Car5kf30.js → rst-DKhAJU51.js} +1 -1
  196. package/dist/assets/{ruby-B-t6QsyD.js → ruby-B0E3lf9H.js} +1 -1
  197. package/dist/assets/{sas-Z6d1rhi6.js → sas-DURk68cf.js} +1 -1
  198. package/dist/assets/{scss-oo-ZAauB.js → scss-CpCId5ps.js} +1 -1
  199. package/dist/assets/search-CBnr1jD1.js +1 -0
  200. package/dist/assets/seek-backward-10-Dal7obVE.js +1 -0
  201. package/dist/assets/seek-backward-15-AD99eQGo.js +1 -0
  202. package/dist/assets/seek-backward-30-BbQ03-Ol.js +1 -0
  203. package/dist/assets/seek-backward-CCYby5n0.js +1 -0
  204. package/dist/assets/seek-forward-10-BC1NwmUo.js +1 -0
  205. package/dist/assets/seek-forward-15-mkoNS39i.js +1 -0
  206. package/dist/assets/seek-forward-30-C0SVx7IG.js +1 -0
  207. package/dist/assets/seek-forward-Dcui_2xm.js +1 -0
  208. package/dist/assets/send-psIzrYYB.js +1 -0
  209. package/dist/assets/settings-Nify7EqC.js +1 -0
  210. package/dist/assets/settings-menu-D2-gAGst.js +1 -0
  211. package/dist/assets/settings-switch-BMn7TM1n.js +1 -0
  212. package/dist/assets/{shaderlab-DhaYSNG2.js → shaderlab-F_37C8HY.js} +1 -1
  213. package/dist/assets/share-DLPac_kH.js +1 -0
  214. package/dist/assets/share-arrow-EKjK6iyY.js +1 -0
  215. package/dist/assets/{shellscript-CClMYwDv.js → shellscript-C9ppp5mf.js} +1 -1
  216. package/dist/assets/{shellsession-CkCvm7zV.js → shellsession-Bz7lU47b.js} +1 -1
  217. package/dist/assets/shuffle-BZZrchzY.js +1 -0
  218. package/dist/assets/shuffle-on-CmbwVSk9.js +1 -0
  219. package/dist/assets/{soy-Crg2Ekyt.js → soy-BhKWbuAF.js} +1 -1
  220. package/dist/assets/{sparql-CbwLv0Nv.js → sparql-C2li3eXU.js} +1 -1
  221. package/dist/assets/{sql-BzeuYDM3.js → sql-BOLSSU4F.js} +1 -1
  222. package/dist/assets/srt-parser-BGnlNAv_.js +2 -0
  223. package/dist/assets/ssa-parser-BAAtRpeE.js +5 -0
  224. package/dist/assets/{stata-aB59aUx6.js → stata-BT_KvsDz.js} +1 -1
  225. package/dist/assets/std-D4K7rQfG.js +1 -0
  226. package/dist/assets/stop-DNHv8PGN.js +1 -0
  227. package/dist/assets/subtitles-25d83-RU.js +1 -0
  228. package/dist/assets/sun-CH-KcQGq.js +1 -0
  229. package/dist/assets/{svelte-B9KhS2Xg.js → svelte-CDr7VO4q.js} +1 -1
  230. package/dist/assets/{templ-DpUl8Z5L.js → templ-nVp5md9X.js} +1 -1
  231. package/dist/assets/{tex-Dv1X6yMO.js → tex-D_8z9IZF.js} +1 -1
  232. package/dist/assets/theatre-mode-SFx-qJwc.js +1 -0
  233. package/dist/assets/theatre-mode-exit-DYtbjRZd.js +1 -0
  234. package/dist/assets/thumbs-down-CoVX0Rsq.js +1 -0
  235. package/dist/assets/thumbs-up-BGpjKY61.js +1 -0
  236. package/dist/assets/timer-B-qx-F3A.js +1 -0
  237. package/dist/assets/transcript-B9ID7SG_.js +1 -0
  238. package/dist/assets/trpc-CSBEzIgb.js +1 -0
  239. package/dist/assets/{ts-tags-DZ6TGics.js → ts-tags-B9PwlsPz.js} +1 -1
  240. package/dist/assets/{tsx-DOuiELRM.js → tsx-CsYF3fAD.js} +1 -1
  241. package/dist/assets/tv-CC87_vzg.js +1 -0
  242. package/dist/assets/{twig-Btxas3qH.js → twig-DhcsZkOG.js} +1 -1
  243. package/dist/assets/{typescript-N3s0tPxq.js → typescript-BmTNzuQ_.js} +1 -1
  244. package/dist/assets/user-redMLfx7.js +1 -0
  245. package/dist/assets/video-preview-CChWJOsP.js +1 -0
  246. package/dist/assets/volume-high-D_Nod9kV.js +1 -0
  247. package/dist/assets/volume-low-C5d45KrM.js +1 -0
  248. package/dist/assets/{vue-_OK103Ep.js → vue-9hbz3kVV.js} +1 -1
  249. package/dist/assets/{vue-html-BPOZfEpa.js → vue-html-DeYWClYd.js} +1 -1
  250. package/dist/assets/{vue-vine-BwY1fUKp.js → vue-vine-0B8BRjOA.js} +1 -1
  251. package/dist/assets/webworkerAll-DhUUBZ9J.js +1 -0
  252. package/dist/assets/x-mark-CK6Q9f3e.js +1 -0
  253. package/dist/assets/{xml-DG7tGi3r.js → xml-DANbtZOH.js} +1 -1
  254. package/dist/assets/{xsl-D52MvYic.js → xsl-Dxfe-dB3.js} +1 -1
  255. package/dist/assets/{yaml-8pzj-_Su.js → yaml-hgQ2rJ8K.js} +1 -1
  256. package/dist/audio-preview.html +25 -0
  257. package/dist/image-preview.html +24 -0
  258. package/dist/index.html +15 -11
  259. package/dist/pdf-preview.html +25 -0
  260. package/dist/video-preview.html +25 -0
  261. package/dist-ssg/client/.vite/ssr-manifest.json +33 -15
  262. package/dist-ssg/client/assets/CanvasRenderer-D3Q5_w9A.js +1 -0
  263. package/dist-ssg/client/assets/WebGLRenderer-D9oc2qKY.js +1 -0
  264. package/dist-ssg/client/assets/WebGPURenderer-C5zSqQBE.js +1 -0
  265. package/dist-ssg/client/assets/browserAll-CIBhnrSW.js +1 -0
  266. package/dist-ssg/client/assets/{dist-5pmc42qO.js → dist-B0rNAJNr.js} +1 -1
  267. package/dist-ssg/client/assets/dist-BSCnmcZh.js +1 -0
  268. package/dist-ssg/client/assets/{dist-CA5DVY2w.js → dist-B_e3vKVI.js} +1 -1
  269. package/dist-ssg/client/assets/dist-C1zSmOmx.js +1 -0
  270. package/dist-ssg/client/assets/{dist-DRwsq_6M.js → dist-C8h2jqYd.js} +1 -1
  271. package/dist-ssg/client/assets/{dist-TgoGtlf0.js → dist-CIDagwl8.js} +1 -1
  272. package/dist-ssg/client/assets/dist-CXNNfjwS.js +1 -0
  273. package/dist-ssg/client/assets/{dist-CUDhi1ei.js → dist-Ct0osEG9.js} +1 -1
  274. package/dist-ssg/client/assets/{dist-C2Sop3cf.js → dist-DYA7aYgJ.js} +1 -1
  275. package/dist-ssg/client/assets/{dist-COHrsH1A.js → dist-nDVKH9rz.js} +1 -1
  276. package/dist-ssg/client/assets/{dist-DF0-eUAB.js → dist-xlAWlzHU.js} +1 -1
  277. package/dist-ssg/client/assets/{dist-CdlQGwSo.js → dist-zooxroSS.js} +1 -1
  278. package/dist-ssg/client/assets/{ghostty-web-B5BYD1FV.js → ghostty-web-MvkhtIaS.js} +1 -1
  279. package/dist-ssg/client/assets/index-D2aBuJqY.css +1 -0
  280. package/dist-ssg/client/assets/{index.ssg-CFeB0ImU.js → index.ssg-Dp15bsQU.js} +149 -149
  281. package/dist-ssg/client/assets/{init-BoLRSoMk.js → init-CbwghP3k.js} +1 -1
  282. package/dist-ssg/client/assets/trpc-BccI0xyZ.js +1 -0
  283. package/dist-ssg/client/assets/webworkerAll-CYURuxHF.js +1 -0
  284. package/dist-ssg/client/index.ssg.html +2 -2
  285. package/dist-ssg/server/entry-server.js +839 -273
  286. package/package.json +9 -6
  287. package/dist/assets/CanvasRenderer-FPfL9ZTd.js +0 -1
  288. package/dist/assets/WebGLRenderer-MAViiHZM.js +0 -1
  289. package/dist/assets/WebGPURenderer-BTs4iUDJ.js +0 -1
  290. package/dist/assets/browserAll-BrCpXy8F.js +0 -1
  291. package/dist/assets/dist-6OABjv-w.js +0 -1
  292. package/dist/assets/dist-B6Tdxx2M.js +0 -1
  293. package/dist/assets/dist-ByROe2mk.js +0 -1
  294. package/dist/assets/dist-CL664tGJ.js +0 -1
  295. package/dist/assets/dist-CNPeR4Pz.js +0 -1
  296. package/dist/assets/dist-CUXEJ56i.js +0 -1
  297. package/dist/assets/dist-CxEKNYqH.js +0 -1
  298. package/dist/assets/dist-D_kRWvjc.js +0 -1
  299. package/dist/assets/dist-DdNBXL_R.js +0 -1
  300. package/dist/assets/dist-DoKbVA83.js +0 -1
  301. package/dist/assets/dist-EJjOo0if.js +0 -1
  302. package/dist/assets/dist-MqSTP1IH.js +0 -1
  303. package/dist/assets/ghostty-web-PwpXfIYz.js +0 -13
  304. package/dist/assets/index-6J-oF_Ui.js +0 -1654
  305. package/dist/assets/index-CSo2hsDq.css +0 -1
  306. package/dist/assets/init-DzZk7m7r.js +0 -1
  307. package/dist/assets/trpc-buLTPM4j.js +0 -1
  308. package/dist/assets/webworkerAll-D4aUBsFv.js +0 -1
  309. package/dist-ssg/client/assets/CanvasRenderer-Cl0iebcM.js +0 -1
  310. package/dist-ssg/client/assets/WebGLRenderer-D1L_66kz.js +0 -1
  311. package/dist-ssg/client/assets/WebGPURenderer-GnxaJPyT.js +0 -1
  312. package/dist-ssg/client/assets/browserAll-wfYAjP5o.js +0 -1
  313. package/dist-ssg/client/assets/dist-BAJHUZ0g.js +0 -1
  314. package/dist-ssg/client/assets/dist-BvCGGujU.js +0 -1
  315. package/dist-ssg/client/assets/dist-DCB1Hxb5.js +0 -1
  316. package/dist-ssg/client/assets/index-CrZEd8bY.css +0 -1
  317. package/dist-ssg/client/assets/trpc-CdH8LrJC.js +0 -1
  318. package/dist-ssg/client/assets/webworkerAll-CJ3LFlvS.js +0 -1
  319. /package/dist/assets/{__vite-browser-external-2447137e-BjPw0NZ_.js → __vite-browser-external-2447137e-DSmEJFXS.js} +0 -0
  320. /package/dist/assets/{abap-Bu0T6Al_.js → abap-CIVploVa.js} +0 -0
  321. /package/dist/assets/{actionscript-3-CRpSnB5s.js → actionscript-3-BOT81qbB.js} +0 -0
  322. /package/dist/assets/{ada-CFBoRA9T.js → ada-CRwAfJoy.js} +0 -0
  323. /package/dist/assets/{andromeeda-DgY5bL_s.js → andromeeda-mLkPyWfB.js} +0 -0
  324. /package/dist/assets/{apache-R7xc0G73.js → apache-DtNAck0z.js} +0 -0
  325. /package/dist/assets/{apex-DEkce9NE.js → apex-Bj7wG4q1.js} +0 -0
  326. /package/dist/assets/{apl-CJPt5sW7.js → apl-C5q1JUQ9.js} +0 -0
  327. /package/dist/assets/{applescript-C_3LmUl6.js → applescript-BQKDn04f.js} +0 -0
  328. /package/dist/assets/{ara-CV-W5Hgd.js → ara-BNT_CvyP.js} +0 -0
  329. /package/dist/assets/{asciiarmor-D0oCypDs.js → asciiarmor-BILZohWd.js} +0 -0
  330. /package/dist/assets/{asciidoc-D-6cF97z.js → asciidoc-B0485J9X.js} +0 -0
  331. /package/dist/assets/{asm-DYZMpR5h.js → asm-C2znhxd3.js} +0 -0
  332. /package/dist/assets/{asn1-8xgVfRoq.js → asn1-DI_FTWHM.js} +0 -0
  333. /package/dist/assets/{asterisk-B5kv5AQp.js → asterisk-CoYCo1jb.js} +0 -0
  334. /package/dist/assets/{aurora-x-CzNZBXLA.js → aurora-x-VoXHDv1B.js} +0 -0
  335. /package/dist/assets/{awk-CtGnqBgi.js → awk-BbTIDvOU.js} +0 -0
  336. /package/dist/assets/{ayu-dark-BEuJhx09.js → ayu-dark-BTK5Tfht.js} +0 -0
  337. /package/dist/assets/{ballerina-FF_I4_FO.js → ballerina-dRxGI8s4.js} +0 -0
  338. /package/dist/assets/{bat-BrvgUmWp.js → bat-BO6lv9SU.js} +0 -0
  339. /package/dist/assets/{beancount-BXL8T_UG.js → beancount-oq4SVsFS.js} +0 -0
  340. /package/dist/assets/{berry-CIKKfJQu.js → berry-CXRUyStP.js} +0 -0
  341. /package/dist/assets/{bibtex-Cjz3iUeg.js → bibtex-M8Wf0hPR.js} +0 -0
  342. /package/dist/assets/{bicep-BcfLCnJ8.js → bicep-DVkXDr0Y.js} +0 -0
  343. /package/dist/assets/{brainfuck-Dh7M1Ucz.js → brainfuck-CYletLv0.js} +0 -0
  344. /package/dist/assets/{cadence-C8mWZDXU.js → cadence-B0XH_PKy.js} +0 -0
  345. /package/dist/assets/{catppuccin-frappe-DenhEhc7.js → catppuccin-frappe-DhEuGbek.js} +0 -0
  346. /package/dist/assets/{catppuccin-latte-DBjZqKjK.js → catppuccin-latte-vkF8zGxA.js} +0 -0
  347. /package/dist/assets/{catppuccin-macchiato-DsXr7TPP.js → catppuccin-macchiato-Y7LgIKdI.js} +0 -0
  348. /package/dist/assets/{catppuccin-mocha-DmPmnX9r.js → catppuccin-mocha-B0udSjIm.js} +0 -0
  349. /package/dist/assets/{chunk-BEqpzyXh.js → chunk-VBW0iQ51.js} +0 -0
  350. /package/dist/assets/{clarity-CSJ2rDuE.js → clarity-DDiR-2NO.js} +0 -0
  351. /package/dist/assets/{clike-zYz_LEkw.js → clike-BJQXzji6.js} +0 -0
  352. /package/dist/assets/{clojure-CdWlIeQh.js → clojure-BTMF0bWr.js} +0 -0
  353. /package/dist/assets/{clojure-BcrkjbX1.js → clojure-snlX0Q6G.js} +0 -0
  354. /package/dist/assets/{cmake-BHzgnx8G.js → cmake-CsF3WHAq.js} +0 -0
  355. /package/dist/assets/{cmake-wWuF5ifR.js → cmake-Jt1LPs3Y.js} +0 -0
  356. /package/dist/assets/{cobol-D3WLbLVy.js → cobol-Bp7hDZyh.js} +0 -0
  357. /package/dist/assets/{codeowners-DEui52l1.js → codeowners-D0_uS0CW.js} +0 -0
  358. /package/dist/assets/{codeql-DV6BvMBu.js → codeql-BedCyGW_.js} +0 -0
  359. /package/dist/assets/{coffeescript-DRtt-5a2.js → coffeescript-CAuf1hwk.js} +0 -0
  360. /package/dist/assets/{common-lisp-xYiRwqZH.js → common-lisp-D5FvNe7i.js} +0 -0
  361. /package/dist/assets/{commonlisp-DJV75lsU.js → commonlisp-CTI5EoKD.js} +0 -0
  362. /package/dist/assets/{coq-C_yPIhZC.js → coq-8fYOFE_L.js} +0 -0
  363. /package/dist/assets/{crystal-C7mEw92C.js → crystal-C3-bEPdz.js} +0 -0
  364. /package/dist/assets/{csharp-_SaU5MOa.js → csharp-CRgWAKTP.js} +0 -0
  365. /package/dist/assets/{css-_6KgQwpu.js → css-DOOfdS_P.js} +0 -0
  366. /package/dist/assets/{csv-DkOKkcud.js → csv-BvaZ2T8c.js} +0 -0
  367. /package/dist/assets/{cue-Bc7aFG0x.js → cue-CuSO7twe.js} +0 -0
  368. /package/dist/assets/{cypher-DJ7FXmKn.js → cypher-Csc02QHL.js} +0 -0
  369. /package/dist/assets/{cypher-B3uWx7jm.js → cypher-D3PQ91Qx.js} +0 -0
  370. /package/dist/assets/{d-C_e6FFTd.js → d-CnB930ZR.js} +0 -0
  371. /package/dist/assets/{d-D3kOh3JF.js → d-Czsz-1nb.js} +0 -0
  372. /package/dist/assets/{dark-plus-CR_9xkOf.js → dark-plus-CESRMc3w.js} +0 -0
  373. /package/dist/assets/{dart-DpnlYij3.js → dart-BIgn-HM9.js} +0 -0
  374. /package/dist/assets/{dax-BGp0L71d.js → dax-pHt8u_2B.js} +0 -0
  375. /package/dist/assets/{desktop-9sZJLqKg.js → desktop-Cf3zYveK.js} +0 -0
  376. /package/dist/assets/{diff-Eg5NxGYi.js → diff-CatgE3dT.js} +0 -0
  377. /package/dist/assets/{diff-CoamybWh.js → diff-DTEjW6Ec.js} +0 -0
  378. /package/dist/assets/{dist-UN0VvTJo.js → dist-vqrjFRzf.js} +0 -0
  379. /package/dist/assets/{docker-B1k24ONt.js → docker-BxryWGFh.js} +0 -0
  380. /package/dist/assets/{dotenv-37x23HEd.js → dotenv-Ce5U7oib.js} +0 -0
  381. /package/dist/assets/{dracula-CxQ11msU.js → dracula-DAC2eyrV.js} +0 -0
  382. /package/dist/assets/{dracula-soft-DZQDoc4v.js → dracula-soft-CzyQJAj9.js} +0 -0
  383. /package/dist/assets/{dream-maker-kAD9OQQF.js → dream-maker-CnxFHZvN.js} +0 -0
  384. /package/dist/assets/{dtd-BjGQwMWL.js → dtd-DQ2nGp1I.js} +0 -0
  385. /package/dist/assets/{dylan-B9W3X2GI.js → dylan-Bje9X1q4.js} +0 -0
  386. /package/dist/assets/{ebnf-d5D0otVn.js → ebnf-DEiu6Mj6.js} +0 -0
  387. /package/dist/assets/{ecl-C5Q_IBPt.js → ecl-CcozsAMR.js} +0 -0
  388. /package/dist/assets/{eiffel-BQA_6I3b.js → eiffel-CZRTum_1.js} +0 -0
  389. /package/dist/assets/{elm-unPS17vB.js → elm-Cgd7AVBx.js} +0 -0
  390. /package/dist/assets/{emacs-lisp-VSqiU67A.js → emacs-lisp-8ncNO10u.js} +0 -0
  391. /package/dist/assets/{erlang-R8nOsUTx.js → erlang-BPW5ALQf.js} +0 -0
  392. /package/dist/assets/{everforest-dark-B5yeWra_.js → everforest-dark-WRGJyDpD.js} +0 -0
  393. /package/dist/assets/{everforest-light-B4NKIpuT.js → everforest-light-DfrVdsO0.js} +0 -0
  394. /package/dist/assets/{fcl-CVAfW9wK.js → fcl-Bv0H-MfR.js} +0 -0
  395. /package/dist/assets/{fennel-CFfxI1rI.js → fennel-Cb9koYyA.js} +0 -0
  396. /package/dist/assets/{fish-DwEMo9K0.js → fish-Bqbms_J3.js} +0 -0
  397. /package/dist/assets/{fluent-Dsn20KHK.js → fluent-BpgGq6W4.js} +0 -0
  398. /package/dist/assets/{forth-DHbsK8X8.js → forth-CFHh7lFN.js} +0 -0
  399. /package/dist/assets/{fortran-4jMwxW9-.js → fortran-CAaqh7IE.js} +0 -0
  400. /package/dist/assets/{fortran-free-form-dGWJP-PE.js → fortran-free-form-D7-gzSM8.js} +0 -0
  401. /package/dist/assets/{gas-zC_XGrQT.js → gas-BXzla7cs.js} +0 -0
  402. /package/dist/assets/{gdscript-CW6S_vBb.js → gdscript-rt9_TXru.js} +0 -0
  403. /package/dist/assets/{gdshader-BqnlaYeo.js → gdshader-crF0MxG8.js} +0 -0
  404. /package/dist/assets/{genie-DpK7PEre.js → genie-n4manvaZ.js} +0 -0
  405. /package/dist/assets/{gherkin-CPBQou3u.js → gherkin-CjaNPZBr.js} +0 -0
  406. /package/dist/assets/{gherkin-Do-rHwCg.js → gherkin-CuiH0tfp.js} +0 -0
  407. /package/dist/assets/{github-dark-BNWfKer2.js → github-dark-DLGWmEyp.js} +0 -0
  408. /package/dist/assets/{github-dark-default-Dd3JR36E.js → github-dark-default-COxVH7oN.js} +0 -0
  409. /package/dist/assets/{github-dark-dimmed-CtNE8tZH.js → github-dark-dimmed-DvctdGH5.js} +0 -0
  410. /package/dist/assets/{github-dark-high-contrast-DmAdH_w8.js → github-dark-high-contrast-B5e5f6Wv.js} +0 -0
  411. /package/dist/assets/{github-light-CUv7VR5J.js → github-light-TJTPBbm1.js} +0 -0
  412. /package/dist/assets/{github-light-default-CZlC_y8X.js → github-light-default-DC_TACoY.js} +0 -0
  413. /package/dist/assets/{github-light-high-contrast-Cpzf_dNN.js → github-light-high-contrast-DvNa2h0A.js} +0 -0
  414. /package/dist/assets/{gleam-DC5ARhDs.js → gleam-GMotk68v.js} +0 -0
  415. /package/dist/assets/{gnuplot-DSp3nTIV.js → gnuplot-PmulD7a0.js} +0 -0
  416. /package/dist/assets/{go-qASC_aC8.js → go-BD7Erf5u.js} +0 -0
  417. /package/dist/assets/{groovy-CAKGLWL8.js → groovy-BJHHaekH.js} +0 -0
  418. /package/dist/assets/{groovy-Cqopym0q.js → groovy-CQ51TE23.js} +0 -0
  419. /package/dist/assets/{gruvbox-dark-hard-Dlubl6r4.js → gruvbox-dark-hard-DMHKOM26.js} +0 -0
  420. /package/dist/assets/{gruvbox-dark-medium-Bys2crvl.js → gruvbox-dark-medium-CHM96JoK.js} +0 -0
  421. /package/dist/assets/{gruvbox-dark-soft-D5JVdD_T.js → gruvbox-dark-soft-BXZKbIog.js} +0 -0
  422. /package/dist/assets/{gruvbox-light-hard-okzwij0Q.js → gruvbox-light-hard-D6IrNyel.js} +0 -0
  423. /package/dist/assets/{gruvbox-light-medium-CKptZdRG.js → gruvbox-light-medium-BJbnlMJn.js} +0 -0
  424. /package/dist/assets/{gruvbox-light-soft-DVSSH44h.js → gruvbox-light-soft-BgH5zDdq.js} +0 -0
  425. /package/dist/assets/{haskell-imzbNPgF.js → haskell-BdLQbrXE.js} +0 -0
  426. /package/dist/assets/{haskell-BKk-Kl5_.js → haskell-YfIOUUBK.js} +0 -0
  427. /package/dist/assets/{haxe-BPFrQPtj.js → haxe-B256JjEJ.js} +0 -0
  428. /package/dist/assets/{haxe-Doh225Ku.js → haxe-BR_oGt5J.js} +0 -0
  429. /package/dist/assets/{hcl-BH96BnDR.js → hcl-z6UKeceE.js} +0 -0
  430. /package/dist/assets/{hjson-BMjtlQGM.js → hjson-B4eAwwls.js} +0 -0
  431. /package/dist/assets/{hlsl-g9gCsmqR.js → hlsl-D0l9oydz.js} +0 -0
  432. /package/dist/assets/{houston-CL5fNb0m.js → houston-B0KYClEN.js} +0 -0
  433. /package/dist/assets/{http-j4R5uEso.js → http-D4AikK5M.js} +0 -0
  434. /package/dist/assets/{hy-C4Qxxvge.js → hy-BffdPpaq.js} +0 -0
  435. /package/dist/assets/{idl-l9d1__Hj.js → idl-BhLYYWfC.js} +0 -0
  436. /package/dist/assets/{imba-BMCGEjtx.js → imba-CeA-T7p1.js} +0 -0
  437. /package/dist/assets/{ini-CiVvBUuJ.js → ini-CR4FPmWV.js} +0 -0
  438. /package/dist/assets/{javascript-BcqCeS4O.js → javascript-DoCiwYd8.js} +0 -0
  439. /package/dist/assets/{json5-CLu_sBvv.js → json5-C27Vp2xe.js} +0 -0
  440. /package/dist/assets/{jsonc-BtCrUwnt.js → jsonc-BVh3vxUv.js} +0 -0
  441. /package/dist/assets/{jsonl-DCgn6lTZ.js → jsonl-D15CZ_EL.js} +0 -0
  442. /package/dist/assets/{jsonnet-f86dBoR6.js → jsonnet-DhFVDxfq.js} +0 -0
  443. /package/dist/assets/{jssm-C9wYN-Un.js → jssm-0SEG_l0W.js} +0 -0
  444. /package/dist/assets/{julia-BU0qBb1w.js → julia-TGuXb-4v.js} +0 -0
  445. /package/dist/assets/{kanagawa-dragon-j2mqGXO-.js → kanagawa-dragon-B1itLu88.js} +0 -0
  446. /package/dist/assets/{kanagawa-lotus-DkcquZHv.js → kanagawa-lotus-Dl28Njgk.js} +0 -0
  447. /package/dist/assets/{kanagawa-wave-CC8Oc_s3.js → kanagawa-wave-BCpJajEn.js} +0 -0
  448. /package/dist/assets/{kdl-DzBG_i-5.js → kdl-B_tNS5SW.js} +0 -0
  449. /package/dist/assets/{kotlin-DIZwIusw.js → kotlin-pIweK0Tp.js} +0 -0
  450. /package/dist/assets/{kusto-DNbnBPvH.js → kusto-CqxEvpDG.js} +0 -0
  451. /package/dist/assets/{laserwave-CVoxTCdH.js → laserwave-BsFEN8Kz.js} +0 -0
  452. /package/dist/assets/{lean-Dlfurqwe.js → lean-DC7SPxbi.js} +0 -0
  453. /package/dist/assets/{less-BZZ-PLfd.js → less-Cgo6VXQL.js} +0 -0
  454. /package/dist/assets/{light-plus-BeMZ11-X.js → light-plus-DFxEhcsH.js} +0 -0
  455. /package/dist/assets/{livescript-uk34VDGK.js → livescript-C-wu00Ej.js} +0 -0
  456. /package/dist/assets/{llvm-CdR1gjlo.js → llvm-CmGPTzZ_.js} +0 -0
  457. /package/dist/assets/{log-iTn25_BO.js → log-BYyZvwT6.js} +0 -0
  458. /package/dist/assets/{logo-BcHhJD22.js → logo-RPed3OZI.js} +0 -0
  459. /package/dist/assets/{lua-ClQGOv84.js → lua-CGv6iOiJ.js} +0 -0
  460. /package/dist/assets/{luau-4FcpJ0Mb.js → luau-C6H01j1p.js} +0 -0
  461. /package/dist/assets/{make-BG0ZJ6Bw.js → make-Bp_ym9Ei.js} +0 -0
  462. /package/dist/assets/{markdown-jQZFZ3m0.js → markdown-UHPJkTEn.js} +0 -0
  463. /package/dist/assets/{material-theme-C5C8C9wY.js → material-theme-Cmydairr.js} +0 -0
  464. /package/dist/assets/{material-theme-darker-CxXF5p3u.js → material-theme-darker-focsTHXN.js} +0 -0
  465. /package/dist/assets/{material-theme-lighter-CN3_ew41.js → material-theme-lighter-BISf6XMH.js} +0 -0
  466. /package/dist/assets/{material-theme-ocean-DOr1uqH8.js → material-theme-ocean-Bzktmjor.js} +0 -0
  467. /package/dist/assets/{material-theme-palenight-BjejtMhX.js → material-theme-palenight-My1fd_35.js} +0 -0
  468. /package/dist/assets/{mathematica-BDmKpvRN.js → mathematica-C8bAvxin.js} +0 -0
  469. /package/dist/assets/{matlab-DeaiNlNF.js → matlab-CBx34vf_.js} +0 -0
  470. /package/dist/assets/{mbox-T5kA6jAQ.js → mbox-BYumpJj6.js} +0 -0
  471. /package/dist/assets/{mdx-ST4v-vi3.js → mdx-YGW2G4Uv.js} +0 -0
  472. /package/dist/assets/{mermaid-BAjGqWD-.js → mermaid-wzZJmzgK.js} +0 -0
  473. /package/dist/assets/{min-dark-DhWD_LA8.js → min-dark-Dxk-ityX.js} +0 -0
  474. /package/dist/assets/{min-light-TFk_TRdA.js → min-light-DsAIUNE7.js} +0 -0
  475. /package/dist/assets/{mipsasm-Cs1MOJEB.js → mipsasm-B8w8xWxH.js} +0 -0
  476. /package/dist/assets/{mirc-DRRKKkcJ.js → mirc-Dhg1_lkg.js} +0 -0
  477. /package/dist/assets/{mllike-iZXopbca.js → mllike-DekHTKRS.js} +0 -0
  478. /package/dist/assets/{modelica-DP8T2DKM.js → modelica-CcMbWJDy.js} +0 -0
  479. /package/dist/assets/{mojo-Dhum44Vp.js → mojo-BNCZEj9n.js} +0 -0
  480. /package/dist/assets/{monokai-zQwYTSXE.js → monokai-F_b0DFq1.js} +0 -0
  481. /package/dist/assets/{move-DDQwygay.js → move-okvFAmHH.js} +0 -0
  482. /package/dist/assets/{mscgen-DXIRw2qg.js → mscgen-D26dCiP0.js} +0 -0
  483. /package/dist/assets/{mumps-BKUS05-y.js → mumps-BJZx4oNt.js} +0 -0
  484. /package/dist/assets/{narrat-DbhadX58.js → narrat-CFbdikxO.js} +0 -0
  485. /package/dist/assets/{nextflow-Knih_yDk.js → nextflow-DzKS-iEs.js} +0 -0
  486. /package/dist/assets/{nginx-CzYOtr2G.js → nginx-PPx_WycM.js} +0 -0
  487. /package/dist/assets/{night-owl-DLGGnVs3.js → night-owl-qACT83C1.js} +0 -0
  488. /package/dist/assets/{nix-Baz5UHw4.js → nix-C9Hi1nKD.js} +0 -0
  489. /package/dist/assets/{nord-C3wm8E4I.js → nord-CH3RDbQu.js} +0 -0
  490. /package/dist/assets/{ntriples-ZgZuaYbW.js → ntriples--kmqf5za.js} +0 -0
  491. /package/dist/assets/{nushell-D5-473hD.js → nushell-DIaYF6Ou.js} +0 -0
  492. /package/dist/assets/{objective-c-BI6SNMJ5.js → objective-c-CGGdYinr.js} +0 -0
  493. /package/dist/assets/{objective-cpp-DAlvnJVe.js → objective-cpp-BjWDdNsO.js} +0 -0
  494. /package/dist/assets/{ocaml-CEGFuihZ.js → ocaml-D81Jtht8.js} +0 -0
  495. /package/dist/assets/{octave-CnOndUN3.js → octave-CAcJQTlE.js} +0 -0
  496. /package/dist/assets/{one-dark-pro-B6FJ0zvF.js → one-dark-pro-B-ww0r1B.js} +0 -0
  497. /package/dist/assets/{one-light-B2XUBJF_.js → one-light-BPbLaA51.js} +0 -0
  498. /package/dist/assets/{openscad-t-6iF15O.js → openscad-B0c464sF.js} +0 -0
  499. /package/dist/assets/{oz-DjW322Rn.js → oz-ARD1A4_T.js} +0 -0
  500. /package/dist/assets/{pascal-BdeW5uRX.js → pascal-DK7Ai13I.js} +0 -0
  501. /package/dist/assets/{pascal-BHLTdjhR.js → pascal-DT0zMytF.js} +0 -0
  502. /package/dist/assets/{perl-_CDvIe1D.js → perl-C687o_bL.js} +0 -0
  503. /package/dist/assets/{pig-inWo_B4W.js → pig-C8e4kEQV.js} +0 -0
  504. /package/dist/assets/{pkl-zHHuHn_z.js → pkl-LMui8nOx.js} +0 -0
  505. /package/dist/assets/{plastic-BRO-85T7.js → plastic-Dz26KdRC.js} +0 -0
  506. /package/dist/assets/{plsql-VRcuhvv-.js → plsql-B49Stwj8.js} +0 -0
  507. /package/dist/assets/{po-CResul3s.js → po-DJ8fyyzx.js} +0 -0
  508. /package/dist/assets/{poimandres-DCo9RR46.js → poimandres-DCUkkKHL.js} +0 -0
  509. /package/dist/assets/{polar-CakhKjn-.js → polar-2GyBpdLT.js} +0 -0
  510. /package/dist/assets/{postcss-BtHn3WbL.js → postcss-Bhprukf5.js} +0 -0
  511. /package/dist/assets/{powerquery-1rYvKCYD.js → powerquery-DfuTdzd8.js} +0 -0
  512. /package/dist/assets/{powershell-CO5KWJsy.js → powershell-C2Y_oyRr.js} +0 -0
  513. /package/dist/assets/{powershell-DE8KuUJ5.js → powershell-YtOHKxmJ.js} +0 -0
  514. /package/dist/assets/{prisma-Z141y9Vf.js → prisma-Ce3LhkhD.js} +0 -0
  515. /package/dist/assets/{prolog-Dxo_24BF.js → prolog-B2_CLi2F.js} +0 -0
  516. /package/dist/assets/{properties-CjVp4a6M.js → properties-DmYRuvnA.js} +0 -0
  517. /package/dist/assets/{proto-BFlW3M8m.js → proto-BTb-udmG.js} +0 -0
  518. /package/dist/assets/{protobuf-DybFT2KT.js → protobuf-CD6bEuFl.js} +0 -0
  519. /package/dist/assets/{puppet-CEsvHObS.js → puppet-C1Die36f.js} +0 -0
  520. /package/dist/assets/{puppet-Dw_NDgko.js → puppet-CsErpTW6.js} +0 -0
  521. /package/dist/assets/{purescript-BICOMc_6.js → purescript-DrZcHieW.js} +0 -0
  522. /package/dist/assets/{python-2pwcWoy7.js → python-DJuj1ZhC.js} +0 -0
  523. /package/dist/assets/{python-B0QK5ArY.js → python-JifBw8Pd.js} +0 -0
  524. /package/dist/assets/{q-C47l8kdS.js → q-DKzQvbt-.js} +0 -0
  525. /package/dist/assets/{qmldir-CPo3sDuO.js → qmldir-B22UuinR.js} +0 -0
  526. /package/dist/assets/{qss-D8trd40O.js → qss-CWapWRD3.js} +0 -0
  527. /package/dist/assets/{r-BmcXGVZ5.js → r-DUDpJ6Ff.js} +0 -0
  528. /package/dist/assets/{racket-BfOZs-VM.js → racket-Bf0hA9MY.js} +0 -0
  529. /package/dist/assets/{raku-lci39Tgk.js → raku-CXw4nqUw.js} +0 -0
  530. /package/dist/assets/{red-Ih7tMgXP.js → red-CzNC31na.js} +0 -0
  531. /package/dist/assets/{reg-K8cH8FkV.js → reg-CHCsNg7g.js} +0 -0
  532. /package/dist/assets/{rel-DxH5YkUl.js → rel-Ow-K5mDh.js} +0 -0
  533. /package/dist/assets/{riscv-DNTTjOwX.js → riscv-CtcsvWbN.js} +0 -0
  534. /package/dist/assets/{rose-pine-CBcSv8_z.js → rose-pine-DJ7LyBAT.js} +0 -0
  535. /package/dist/assets/{rose-pine-dawn-DsFTrjAP.js → rose-pine-dawn-C3kUPo7D.js} +0 -0
  536. /package/dist/assets/{rose-pine-moon-DSRrHXqB.js → rose-pine-moon-D5SxMAqW.js} +0 -0
  537. /package/dist/assets/{rosmsg-D94pSJ6t.js → rosmsg-a4V7Aj7O.js} +0 -0
  538. /package/dist/assets/{rpm-Cm0x5xT_.js → rpm-qoLWOnFN.js} +0 -0
  539. /package/dist/assets/{ruby-Dl-I4pxG.js → ruby-FGrV8nFX.js} +0 -0
  540. /package/dist/assets/{rust-BaX7heYs.js → rust-Cb9YKWSH.js} +0 -0
  541. /package/dist/assets/{sas-Bxkg4GVX.js → sas-BWqJ1mab.js} +0 -0
  542. /package/dist/assets/{sass-MHYUMeyd.js → sass-D7eOJrmY.js} +0 -0
  543. /package/dist/assets/{scala-0toQGra_.js → scala-DiHVSd0P.js} +0 -0
  544. /package/dist/assets/{scheme-CO3zogua.js → scheme-D9O3un-H.js} +0 -0
  545. /package/dist/assets/{scheme-B5NPj6KX.js → scheme-DqmxMK_5.js} +0 -0
  546. /package/dist/assets/{sdbl-lyJ_q2qY.js → sdbl-DcdijJCo.js} +0 -0
  547. /package/dist/assets/{shell-gYrTvBTP.js → shell-B1pKmMgB.js} +0 -0
  548. /package/dist/assets/{sieve-COX4Kn1X.js → sieve-D6RnHXa8.js} +0 -0
  549. /package/dist/assets/{simple-mode-kdHrpFjq.js → simple-mode-DW6rCJL0.js} +0 -0
  550. /package/dist/assets/{slack-dark-DJYHgMC5.js → slack-dark-q967N1Vs.js} +0 -0
  551. /package/dist/assets/{slack-ochin-DMZh8xHM.js → slack-ochin-a6A0wbgW.js} +0 -0
  552. /package/dist/assets/{smalltalk-Dma1z5eE.js → smalltalk-Bg8P7Hpz.js} +0 -0
  553. /package/dist/assets/{smalltalk-DS2N8CIT.js → smalltalk-vFEqincc.js} +0 -0
  554. /package/dist/assets/{snazzy-light-CWz9pGNQ.js → snazzy-light-CZMs_LkS.js} +0 -0
  555. /package/dist/assets/{solarized-dark-D9XpTy8q.js → solarized-dark-BGr8h_-s.js} +0 -0
  556. /package/dist/assets/{solarized-light-CbOIwuI-.js → solarized-light-BYRl8cvt.js} +0 -0
  557. /package/dist/assets/{solidity-Dt295RBh.js → solidity-CiPHtV-S.js} +0 -0
  558. /package/dist/assets/{solr-BvhcdkNH.js → solr-DCTMbxYh.js} +0 -0
  559. /package/dist/assets/{sparql-gX7W9xeh.js → sparql-D3342bJj.js} +0 -0
  560. /package/dist/assets/{splunk-DPuGGZIX.js → splunk-CnQhHYV7.js} +0 -0
  561. /package/dist/assets/{spreadsheet-BnlQRxWz.js → spreadsheet-D5vgGBWN.js} +0 -0
  562. /package/dist/assets/{sql-CwA10oIk.js → sql-C34SerfO.js} +0 -0
  563. /package/dist/assets/{ssh-config-81Puc665.js → ssh-config-DxyN4D39.js} +0 -0
  564. /package/dist/assets/{stex-DhLUylSV.js → stex-CIr7vrJc.js} +0 -0
  565. /package/dist/assets/{stylus-DBx-JbUM.js → stylus-BGkOI8rZ.js} +0 -0
  566. /package/dist/assets/{stylus-9ZGSp3KB.js → stylus-uKe9pX_z.js} +0 -0
  567. /package/dist/assets/{swift-CurfpLXH.js → swift-BwGtfoET.js} +0 -0
  568. /package/dist/assets/{swift-LIGMYdoY.js → swift-DYZLJadl.js} +0 -0
  569. /package/dist/assets/{synthwave-84-BnPKtV8a.js → synthwave-84-CwulpOa6.js} +0 -0
  570. /package/dist/assets/{system-verilog-DhhazFNi.js → system-verilog-Dp661CvP.js} +0 -0
  571. /package/dist/assets/{systemd-Cvp21r3-.js → systemd-kktSp3-B.js} +0 -0
  572. /package/dist/assets/{talonscript-Ex_ZAXWk.js → talonscript-Nc_j5bsE.js} +0 -0
  573. /package/dist/assets/{tasl-C6wcXx0u.js → tasl-C9qCYaij.js} +0 -0
  574. /package/dist/assets/{tcl-CMtw19Y3.js → tcl-7dXGLOIP.js} +0 -0
  575. /package/dist/assets/{tcl-BPvzXR-t.js → tcl-CJ_CtVRZ.js} +0 -0
  576. /package/dist/assets/{terraform-BFKovB2a.js → terraform-n2Mjymla.js} +0 -0
  577. /package/dist/assets/{textile-BUq3vgBH.js → textile-BwILayi5.js} +0 -0
  578. /package/dist/assets/{tiddlywiki-DRR6E4hS.js → tiddlywiki-CBwaBkZo.js} +0 -0
  579. /package/dist/assets/{tiki-C1XMixgx.js → tiki-DrYLgX3z.js} +0 -0
  580. /package/dist/assets/{tokyo-night-ByryBNMy.js → tokyo-night-CTu41Jiz.js} +0 -0
  581. /package/dist/assets/{toml-BQjoWSzq.js → toml-B15mRAoh.js} +0 -0
  582. /package/dist/assets/{toml-2TD737C5.js → toml-mjAKlhgf.js} +0 -0
  583. /package/dist/assets/{troff-DbgTp3Cj.js → troff-1GwZ4_kM.js} +0 -0
  584. /package/dist/assets/{tsv-B4GEmyrY.js → tsv-C9lzu5HK.js} +0 -0
  585. /package/dist/assets/{ttcn-1OxchGWH.js → ttcn-Rt4tcn5J.js} +0 -0
  586. /package/dist/assets/{ttcn-cfg-CC8OhyHu.js → ttcn-cfg-B2QycmWC.js} +0 -0
  587. /package/dist/assets/{turtle-D1WjVU4-.js → turtle-B99g2iYO.js} +0 -0
  588. /package/dist/assets/{turtle-CrO-XU5O.js → turtle-vnW9ZH2N.js} +0 -0
  589. /package/dist/assets/{typespec-BlhpafUo.js → typespec-CQo-8V96.js} +0 -0
  590. /package/dist/assets/{typst-BFytn-nF.js → typst-CcuHmJkn.js} +0 -0
  591. /package/dist/assets/{v-QsV0mqFY.js → v-B-DRpDLN.js} +0 -0
  592. /package/dist/assets/{vala-2OEMaeCr.js → vala-VuvWDMVG.js} +0 -0
  593. /package/dist/assets/{vb-Bf-XXYNJ.js → vb-BNGsVLgX.js} +0 -0
  594. /package/dist/assets/{vb-D9JlZMQx.js → vb-uGgKumq9.js} +0 -0
  595. /package/dist/assets/{vbscript-HeSyWuOi.js → vbscript-C3L-Slq1.js} +0 -0
  596. /package/dist/assets/{velocity-CUkiDsJQ.js → velocity-B5fLEzdR.js} +0 -0
  597. /package/dist/assets/{verilog-D04WYu-9.js → verilog-Cs3u3WKB.js} +0 -0
  598. /package/dist/assets/{verilog-BFxB5RAN.js → verilog-T4dM3A9w.js} +0 -0
  599. /package/dist/assets/{vesper-RapGiuFK.js → vesper-DKfkBFNi.js} +0 -0
  600. /package/dist/assets/{vhdl-BJUXQE-6.js → vhdl-Bdbtaye2.js} +0 -0
  601. /package/dist/assets/{vhdl-BmN7pPc4.js → vhdl-D8g93jeS.js} +0 -0
  602. /package/dist/assets/{viml-CgKKOlcK.js → viml-D75b9QT4.js} +0 -0
  603. /package/dist/assets/{vitesse-black-CK3sbzcK.js → vitesse-black-C8ZVPNNc.js} +0 -0
  604. /package/dist/assets/{vitesse-dark-D1-w1Fr7.js → vitesse-dark-Q3oZDeXO.js} +0 -0
  605. /package/dist/assets/{vitesse-light-D7Ky4DHb.js → vitesse-light-BU9zjuoG.js} +0 -0
  606. /package/dist/assets/{vyper-DyC3s8t1.js → vyper-I128n63H.js} +0 -0
  607. /package/dist/assets/{wasm-D0KG-h38.js → wasm-DFtcXgiA.js} +0 -0
  608. /package/dist/assets/{wasm-HmdyAy9e.js → wasm-TauBo8uk.js} +0 -0
  609. /package/dist/assets/{webidl-advQMGTP.js → webidl-BMlkVTYq.js} +0 -0
  610. /package/dist/assets/{wenyan-2PUFg5JI.js → wenyan-Tj1RZlPx.js} +0 -0
  611. /package/dist/assets/{wgsl-CN7jA0x_.js → wgsl-DuCaFBOG.js} +0 -0
  612. /package/dist/assets/{wikitext-jh9pTKmw.js → wikitext-B5Bd3rJ6.js} +0 -0
  613. /package/dist/assets/{wit-DlUr23eQ.js → wit-CK_K8sxN.js} +0 -0
  614. /package/dist/assets/{wolfram-BunKvAKE.js → wolfram-O7u88fnu.js} +0 -0
  615. /package/dist/assets/{xquery-CNzoFgd7.js → xquery-BHRymSKf.js} +0 -0
  616. /package/dist/assets/{yacas-BsmlDKac.js → yacas-B2Ltfl3H.js} +0 -0
  617. /package/dist/assets/{z80-Bnez4vZ_.js → z80-DJxBw9IF.js} +0 -0
  618. /package/dist/assets/{zenscript-NGWkhbj8.js → zenscript-B7bdmrQw.js} +0 -0
  619. /package/dist/assets/{zig-B-X7Vv3F.js → zig-CcTUrp-O.js} +0 -0
@@ -43947,6 +43947,23 @@ var Copy = createLucideIcon("Copy", [["rect", {
43947
43947
  d: "M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2",
43948
43948
  key: "zix9uf"
43949
43949
  }]]);
43950
+ var Download = createLucideIcon("Download", [
43951
+ ["path", {
43952
+ d: "M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",
43953
+ key: "ih7n3h"
43954
+ }],
43955
+ ["polyline", {
43956
+ points: "7 10 12 15 17 10",
43957
+ key: "2ggqvy"
43958
+ }],
43959
+ ["line", {
43960
+ x1: "12",
43961
+ x2: "12",
43962
+ y1: "15",
43963
+ y2: "3",
43964
+ key: "1vk2je"
43965
+ }]
43966
+ ]);
43950
43967
  var EllipsisVertical = createLucideIcon("EllipsisVertical", [
43951
43968
  ["circle", {
43952
43969
  cx: "12",
@@ -43967,6 +43984,24 @@ var EllipsisVertical = createLucideIcon("EllipsisVertical", [
43967
43984
  key: "lyex9k"
43968
43985
  }]
43969
43986
  ]);
43987
+ var Expand = createLucideIcon("Expand", [
43988
+ ["path", {
43989
+ d: "m21 21-6-6m6 6v-4.8m0 4.8h-4.8",
43990
+ key: "1c15vz"
43991
+ }],
43992
+ ["path", {
43993
+ d: "M3 16.2V21m0 0h4.8M3 21l6-6",
43994
+ key: "1fsnz2"
43995
+ }],
43996
+ ["path", {
43997
+ d: "M21 7.8V3m0 0h-4.8M21 3l-6 6",
43998
+ key: "hawz9i"
43999
+ }],
44000
+ ["path", {
44001
+ d: "M3 7.8V3m0 0h4.8M3 3l6 6",
44002
+ key: "u9ee12"
44003
+ }]
44004
+ ]);
43970
44005
  var FileCode2 = createLucideIcon("FileCode2", [
43971
44006
  ["path", {
43972
44007
  d: "M4 22h14a2 2 0 0 0 2-2V7l-5-5H6a2 2 0 0 0-2 2v4",
@@ -44333,6 +44368,24 @@ var Menu = createLucideIcon("Menu", [
44333
44368
  key: "yk5zj1"
44334
44369
  }]
44335
44370
  ]);
44371
+ var Minimize = createLucideIcon("Minimize", [
44372
+ ["path", {
44373
+ d: "M8 3v3a2 2 0 0 1-2 2H3",
44374
+ key: "hohbtr"
44375
+ }],
44376
+ ["path", {
44377
+ d: "M21 8h-3a2 2 0 0 1-2-2V3",
44378
+ key: "5jw1f3"
44379
+ }],
44380
+ ["path", {
44381
+ d: "M3 16h3a2 2 0 0 1 2 2v3",
44382
+ key: "198tvr"
44383
+ }],
44384
+ ["path", {
44385
+ d: "M16 21v-3a2 2 0 0 1 2-2h3",
44386
+ key: "ph8mxp"
44387
+ }]
44388
+ ]);
44336
44389
  var Minus = createLucideIcon("Minus", [["path", {
44337
44390
  d: "M5 12h14",
44338
44391
  key: "1ays0h"
@@ -44484,6 +44537,40 @@ var Settings = createLucideIcon("Settings", [["path", {
44484
44537
  r: "3",
44485
44538
  key: "1v7zrd"
44486
44539
  }]]);
44540
+ var Share2 = createLucideIcon("Share2", [
44541
+ ["circle", {
44542
+ cx: "18",
44543
+ cy: "5",
44544
+ r: "3",
44545
+ key: "gq8acd"
44546
+ }],
44547
+ ["circle", {
44548
+ cx: "6",
44549
+ cy: "12",
44550
+ r: "3",
44551
+ key: "w7nqdw"
44552
+ }],
44553
+ ["circle", {
44554
+ cx: "18",
44555
+ cy: "19",
44556
+ r: "3",
44557
+ key: "1xt0gg"
44558
+ }],
44559
+ ["line", {
44560
+ x1: "8.59",
44561
+ x2: "15.42",
44562
+ y1: "13.51",
44563
+ y2: "17.49",
44564
+ key: "47mynk"
44565
+ }],
44566
+ ["line", {
44567
+ x1: "15.41",
44568
+ x2: "8.59",
44569
+ y1: "6.51",
44570
+ y2: "10.49",
44571
+ key: "1n3mei"
44572
+ }]
44573
+ ]);
44487
44574
  var ShieldCheck = createLucideIcon("ShieldCheck", [["path", {
44488
44575
  d: "M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",
44489
44576
  key: "oel41y"
@@ -44689,6 +44776,13 @@ var TriangleAlert = createLucideIcon("TriangleAlert", [
44689
44776
  key: "p32p05"
44690
44777
  }]
44691
44778
  ]);
44779
+ var Undo2 = createLucideIcon("Undo2", [["path", {
44780
+ d: "M9 14 4 9l5-5",
44781
+ key: "102s5s"
44782
+ }], ["path", {
44783
+ d: "M4 9h10.5a5.5 5.5 0 0 1 5.5 5.5a5.5 5.5 0 0 1-5.5 5.5H11",
44784
+ key: "f3b9sd"
44785
+ }]]);
44692
44786
  var Unlink2 = createLucideIcon("Unlink2", [["path", {
44693
44787
  d: "M15 7h2a5 5 0 0 1 0 10h-2m-6 0H7A5 5 0 0 1 7 7h2",
44694
44788
  key: "1re2ne"
@@ -96471,6 +96565,68 @@ function OpsxDetailStatePanel({ message, tone = "default" }) {
96471
96565
  });
96472
96566
  }
96473
96567
  //#endregion
96568
+ //#region src/components/button.tsx
96569
+ var variantClassNames = {
96570
+ primary: "bg-primary text-primary-foreground hover:bg-primary/90",
96571
+ secondary: "border-border bg-background text-foreground border hover:bg-muted",
96572
+ ghost: "text-foreground hover:bg-muted",
96573
+ destructive: "bg-red-600 text-white hover:bg-red-700 focus-visible:ring-red-500 dark:bg-red-600 dark:hover:bg-red-700"
96574
+ };
96575
+ var activityVariantClassNames = {
96576
+ primary: "bg-primary/10 text-primary hover:bg-primary/10",
96577
+ secondary: "border-primary/40 bg-primary/10 text-primary border hover:bg-primary/10",
96578
+ ghost: "bg-primary/10 text-primary hover:bg-primary/10",
96579
+ destructive: "bg-red-600/10 text-red-600 hover:bg-red-600/10 dark:text-red-400"
96580
+ };
96581
+ var sizeClassNames = {
96582
+ sm: "gap-1.5 rounded-md px-3 py-1.5 text-xs",
96583
+ md: "gap-2 rounded-md px-4 py-2 text-sm",
96584
+ "icon-sm": "h-7 w-7 rounded-md p-0",
96585
+ "icon-md": "h-9 w-9 rounded-md p-0"
96586
+ };
96587
+ var Button = (0, import_react.forwardRef)(function Button({ variant = "primary", size = "md", activity = false, disabled = false, type = "button", className, onClick, "aria-disabled": ariaDisabled, ...props }, ref) {
96588
+ const handleClick = (event) => {
96589
+ if (activity) {
96590
+ event.preventDefault();
96591
+ event.stopPropagation();
96592
+ return;
96593
+ }
96594
+ onClick?.(event);
96595
+ };
96596
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
96597
+ ref,
96598
+ type,
96599
+ disabled,
96600
+ "aria-disabled": ariaDisabled ?? (activity ? true : void 0),
96601
+ "data-activity": activity ? "true" : void 0,
96602
+ onClick: handleClick,
96603
+ className: cn$1("inline-flex shrink-0 items-center justify-center font-medium outline-none transition-colors", "focus-visible:ring-primary focus-visible:ring-1", disabled ? "cursor-not-allowed opacity-50" : activity ? "cursor-default" : "cursor-pointer", activity ? activityVariantClassNames[variant] : variantClassNames[variant], sizeClassNames[size], className),
96604
+ ...props
96605
+ });
96606
+ });
96607
+ //#endregion
96608
+ //#region src/components/button-group.tsx
96609
+ /**
96610
+ * Compact segmented buttons with single-select behavior.
96611
+ */
96612
+ function ButtonGroup({ value, options, onChange, className = "", tone = "default" }) {
96613
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
96614
+ className: `inline-flex w-fit max-w-full shrink-0 self-start overflow-hidden rounded-md border ${tone === "terminal" ? "border-terminal-foreground/25 bg-terminal/70 text-terminal-foreground" : "border-border bg-card"} ${className}`,
96615
+ children: options.map((option, index) => {
96616
+ const active = option.value === value;
96617
+ const stateClassName = active ? "bg-primary text-primary-foreground" : tone === "terminal" ? "text-terminal-foreground/72 hover:bg-terminal-foreground/10 hover:text-terminal-foreground" : "text-muted-foreground hover:bg-muted/60 hover:text-foreground";
96618
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
96619
+ type: "button",
96620
+ disabled: option.disabled,
96621
+ onClick: () => onChange(option.value),
96622
+ "aria-pressed": active,
96623
+ className: `inline-flex items-center justify-center gap-1.5 px-3 py-1.5 text-xs font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-50 ${index > 0 ? tone === "terminal" ? "border-terminal-foreground/20 border-l" : "border-border border-l" : ""} ${stateClassName}`,
96624
+ children: option.label
96625
+ }, option.value);
96626
+ })
96627
+ });
96628
+ }
96629
+ //#endregion
96474
96630
  //#region src/lib/codemirror-markdown-preview.ts
96475
96631
  /**
96476
96632
  * CodeMirror 6 Markdown Live Preview Extension
@@ -113479,11 +113635,16 @@ ReactCodeMirror.displayName = "CodeMirror";
113479
113635
  * - Markdown 文件支持实时预览(隐藏语法标记)
113480
113636
  * - 移动端友好
113481
113637
  */
113482
- /** 根据文件名推断语言类型 */
113483
- function detectLanguage(filename) {
113638
+ function isMarkdownFilename(filename) {
113639
+ if (!filename) return false;
113640
+ const lower = filename.toLowerCase();
113641
+ return lower.endsWith(".md") || lower.endsWith(".markdown") || lower.endsWith(".mdown") || lower.endsWith(".mkd");
113642
+ }
113643
+ /** 根据文件名推断常见语言类型 */
113644
+ function detectBuiltinLanguage(filename) {
113484
113645
  if (!filename) return "plain";
113485
113646
  const lower = filename.toLowerCase();
113486
- if (lower.endsWith(".md")) return "markdown";
113647
+ if (isMarkdownFilename(lower)) return "markdown";
113487
113648
  if (lower.endsWith(".ts") || lower.endsWith(".tsx")) return "typescript";
113488
113649
  if (lower.endsWith(".js") || lower.endsWith(".jsx")) return "javascript";
113489
113650
  if (lower.endsWith(".json")) return "json";
@@ -113491,7 +113652,7 @@ function detectLanguage(filename) {
113491
113652
  return "plain";
113492
113653
  }
113493
113654
  /** 根据语言类型返回 CodeMirror 扩展 */
113494
- function getLanguageExtensions(language, filename) {
113655
+ function getBuiltinLanguageExtensions(language, filename) {
113495
113656
  switch (language) {
113496
113657
  case "markdown": return [markdown({
113497
113658
  base: markdownLanguage,
@@ -113507,6 +113668,10 @@ function getLanguageExtensions(language, filename) {
113507
113668
  default: return [];
113508
113669
  }
113509
113670
  }
113671
+ function matchFilenameLanguage(filename) {
113672
+ if (!filename) return null;
113673
+ return LanguageDescription.matchFilename(languages, filename);
113674
+ }
113510
113675
  function resolveBundleTheme(theme, isDarkMode) {
113511
113676
  switch (theme) {
113512
113677
  case "github": return isDarkMode ? githubDark : githubLight;
@@ -113530,13 +113695,53 @@ function resolveBundleTheme(theme, isDarkMode) {
113530
113695
  * // 可编辑的代码编辑器
113531
113696
  * <CodeEditor value={code} onChange={setCode} language="typescript" />
113532
113697
  */
113533
- function CodeEditor({ value, onChange, readOnly = false, language, filename, lineNumbers = true, lineWrapping = true, fontSize = 13, className = "", style, placeholder, editorMinHeight = "240px" }) {
113534
- const resolvedLanguage = language ?? detectLanguage(filename);
113698
+ function CodeEditor({ value, onChange, onSaveShortcut, readOnly = false, language, filename, lineNumbers = true, lineWrapping = true, fontSize = 13, className = "", style, placeholder, editorMinHeight = "240px" }) {
113535
113699
  const isDarkMode = useDarkMode();
113536
113700
  const { data: config } = useConfigSubscription();
113537
113701
  const codeEditorTheme = config?.codeEditor?.theme ?? "github";
113702
+ const [filenameLanguageExtensions, setFilenameLanguageExtensions] = (0, import_react.useState)([]);
113703
+ (0, import_react.useEffect)(() => {
113704
+ let cancelled = false;
113705
+ if (language) {
113706
+ setFilenameLanguageExtensions([]);
113707
+ return;
113708
+ }
113709
+ const builtinLanguage = detectBuiltinLanguage(filename);
113710
+ if (builtinLanguage !== "plain") {
113711
+ setFilenameLanguageExtensions(getBuiltinLanguageExtensions(builtinLanguage, filename));
113712
+ return;
113713
+ }
113714
+ const matchedLanguage = matchFilenameLanguage(filename);
113715
+ if (!matchedLanguage) {
113716
+ setFilenameLanguageExtensions([]);
113717
+ return;
113718
+ }
113719
+ if (matchedLanguage.support) {
113720
+ setFilenameLanguageExtensions([matchedLanguage.support.extension]);
113721
+ return;
113722
+ }
113723
+ setFilenameLanguageExtensions([]);
113724
+ matchedLanguage.load().then((support) => {
113725
+ if (cancelled) return;
113726
+ setFilenameLanguageExtensions([support.extension]);
113727
+ }).catch(() => {
113728
+ if (cancelled) return;
113729
+ setFilenameLanguageExtensions([]);
113730
+ });
113731
+ return () => {
113732
+ cancelled = true;
113733
+ };
113734
+ }, [language, filename]);
113735
+ const languageExtensions = (0, import_react.useMemo)(() => {
113736
+ if (!language) return filenameLanguageExtensions;
113737
+ return getBuiltinLanguageExtensions(language, filename);
113738
+ }, [
113739
+ language,
113740
+ filename,
113741
+ filenameLanguageExtensions
113742
+ ]);
113538
113743
  const extensions = (0, import_react.useMemo)(() => {
113539
- const exts = [EditorState.readOnly.of(readOnly), ...getLanguageExtensions(resolvedLanguage, filename)];
113744
+ const exts = [EditorState.readOnly.of(readOnly), ...languageExtensions];
113540
113745
  exts.push(resolveBundleTheme(codeEditorTheme, isDarkMode));
113541
113746
  exts.push(EditorView.theme({
113542
113747
  ".cm-line": { lineHeight: "21px" },
@@ -113561,16 +113766,24 @@ function CodeEditor({ value, onChange, readOnly = false, language, filename, lin
113561
113766
  exts.push(keymap.of([{
113562
113767
  key: "Mod-a",
113563
113768
  run: selectAll
113769
+ }, {
113770
+ key: "Mod-s",
113771
+ preventDefault: true,
113772
+ run: () => {
113773
+ if (readOnly || !onSaveShortcut) return false;
113774
+ onSaveShortcut();
113775
+ return true;
113776
+ }
113564
113777
  }]));
113565
113778
  if (lineWrapping) exts.push(EditorView.lineWrapping);
113566
113779
  return exts;
113567
113780
  }, [
113568
- resolvedLanguage,
113569
- filename,
113781
+ languageExtensions,
113570
113782
  readOnly,
113571
113783
  lineWrapping,
113572
113784
  codeEditorTheme,
113573
- isDarkMode
113785
+ isDarkMode,
113786
+ onSaveShortcut
113574
113787
  ]);
113575
113788
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ReactCodeMirror, {
113576
113789
  value,
@@ -114154,7 +114367,7 @@ function FileExplorer({ entries, selectedPath, onSelect, breadcrumbRoot, headerL
114154
114367
  })]
114155
114368
  });
114156
114369
  }
114157
- function FileExplorerCodeEditor({ file, value, readOnly = true, onChange, lineWrapping, editorMinHeight }) {
114370
+ function FileExplorerCodeEditor({ file, value, readOnly = true, onChange, onSaveShortcut, lineWrapping, editorMinHeight }) {
114158
114371
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CodeEditor, {
114159
114372
  value,
114160
114373
  filename: file.path,
@@ -114162,209 +114375,11 @@ function FileExplorerCodeEditor({ file, value, readOnly = true, onChange, lineWr
114162
114375
  lineWrapping,
114163
114376
  className: "min-h-0 flex-1",
114164
114377
  editorMinHeight,
114165
- onChange
114378
+ onChange,
114379
+ onSaveShortcut
114166
114380
  }, file.path);
114167
114381
  }
114168
114382
  //#endregion
114169
- //#region src/components/scroll-spy.ts
114170
- function hasVerticalScrollBehavior(overflowY) {
114171
- return overflowY === "auto" || overflowY === "scroll" || overflowY === "overlay";
114172
- }
114173
- function findVerticalScrollContainer(node, options = {}) {
114174
- const { allowNonScrollable = false } = options;
114175
- let current = node?.parentElement ?? null;
114176
- while (current) {
114177
- if (hasVerticalScrollBehavior(window.getComputedStyle(current).overflowY)) {
114178
- if (allowNonScrollable || current.scrollHeight > current.clientHeight) return current;
114179
- }
114180
- current = current.parentElement;
114181
- }
114182
- return null;
114183
- }
114184
- function scrollViewportBounds(root) {
114185
- if (root) {
114186
- const rect = root.getBoundingClientRect();
114187
- return {
114188
- top: rect.top,
114189
- bottom: rect.bottom
114190
- };
114191
- }
114192
- return {
114193
- top: 0,
114194
- bottom: window.innerHeight
114195
- };
114196
- }
114197
- function measureAvailableViewportHeight(node, root = findVerticalScrollContainer(node, { allowNonScrollable: true })) {
114198
- if (typeof window === "undefined" || !node) return null;
114199
- const nodeRect = node.getBoundingClientRect();
114200
- const viewport = scrollViewportBounds(root);
114201
- return Math.max(Math.floor(viewport.bottom - Math.max(nodeRect.top, viewport.top)), 0);
114202
- }
114203
- function useViewportConstrainedHeight({ target, enabled = true }) {
114204
- const [height, setHeight] = (0, import_react.useState)(null);
114205
- (0, import_react.useLayoutEffect)(() => {
114206
- if (!enabled || typeof window === "undefined") {
114207
- setHeight(null);
114208
- return;
114209
- }
114210
- if (!target) {
114211
- setHeight(null);
114212
- return;
114213
- }
114214
- let resizeObserver = null;
114215
- let scrollRoot = null;
114216
- let scrollTarget = window;
114217
- const setConstrainedHeight = (nextHeight) => {
114218
- setHeight((currentHeight) => currentHeight === nextHeight ? currentHeight : nextHeight);
114219
- };
114220
- const bindScrollRoot = (nextRoot) => {
114221
- if (scrollRoot === nextRoot) return;
114222
- scrollTarget.removeEventListener("scroll", handleUpdate);
114223
- if (resizeObserver && scrollRoot) resizeObserver.unobserve(scrollRoot);
114224
- scrollRoot = nextRoot;
114225
- scrollTarget = nextRoot ?? window;
114226
- scrollTarget.addEventListener("scroll", handleUpdate, { passive: true });
114227
- if (resizeObserver && scrollRoot) resizeObserver.observe(scrollRoot);
114228
- };
114229
- const handleUpdate = () => {
114230
- const nextRoot = findVerticalScrollContainer(target, { allowNonScrollable: true });
114231
- bindScrollRoot(nextRoot);
114232
- setConstrainedHeight(measureAvailableViewportHeight(target, nextRoot));
114233
- };
114234
- if (typeof ResizeObserver !== "undefined") {
114235
- resizeObserver = new ResizeObserver(() => {
114236
- handleUpdate();
114237
- });
114238
- resizeObserver.observe(target);
114239
- if (target.parentElement) resizeObserver.observe(target.parentElement);
114240
- }
114241
- handleUpdate();
114242
- window.addEventListener("resize", handleUpdate);
114243
- return () => {
114244
- window.removeEventListener("resize", handleUpdate);
114245
- scrollTarget.removeEventListener("scroll", handleUpdate);
114246
- resizeObserver?.disconnect();
114247
- };
114248
- }, [enabled, target]);
114249
- return height;
114250
- }
114251
- //#endregion
114252
- //#region src/components/folder-editor-viewer.tsx
114253
- function FolderEditorViewer({ changeId, archived = false, files: providedFiles }) {
114254
- const { data: files, isLoading, error } = archived ? useArchiveFilesSubscription(changeId) : useChangeFilesSubscription(changeId);
114255
- const [selectedPath, setSelectedPath] = (0, import_react.useState)(null);
114256
- const [viewportNode, setViewportNode] = (0, import_react.useState)(null);
114257
- const viewportHeight = useViewportConstrainedHeight({
114258
- target: viewportNode,
114259
- enabled: viewportNode !== null
114260
- });
114261
- const sortedEntries = (0, import_react.useMemo)(() => {
114262
- if (providedFiles) return [...providedFiles];
114263
- if (!files) return [];
114264
- return [...files];
114265
- }, [files, providedFiles]);
114266
- (0, import_react.useEffect)(() => {
114267
- if (!sortedEntries.length) {
114268
- setSelectedPath(null);
114269
- return;
114270
- }
114271
- if (!sortedEntries.find((entry) => entry.path === selectedPath && entry.type === "file")) setSelectedPath(sortedEntries.find((entry) => entry.type === "file")?.path ?? null);
114272
- }, [sortedEntries, selectedPath]);
114273
- if (!providedFiles && isLoading) return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
114274
- className: "border-border bg-muted/20 flex h-[400px] items-center justify-center rounded-md border",
114275
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(LoaderCircle, { className: "text-muted-foreground h-6 w-6 animate-spin" })
114276
- });
114277
- if (error) return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
114278
- className: "border-destructive/50 bg-destructive/10 text-destructive rounded-md border p-4 text-sm",
114279
- children: ["Failed to load files: ", error.message]
114280
- });
114281
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("section", {
114282
- "data-tab-scroll-root": "true",
114283
- className: "scrollbar-thin scrollbar-track-transparent min-h-0 flex-1 overflow-auto",
114284
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
114285
- className: "pr-1",
114286
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
114287
- ref: setViewportNode,
114288
- className: "flex min-h-0 flex-col",
114289
- style: viewportHeight != null ? { height: `${viewportHeight}px` } : void 0,
114290
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(FileExplorer, {
114291
- entries: sortedEntries,
114292
- selectedPath,
114293
- onSelect: setSelectedPath,
114294
- emptyState: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: "No files found for this change." }),
114295
- renderEditor: (activeFile) => activeFile ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(FileExplorerCodeEditor, {
114296
- file: activeFile,
114297
- value: activeFile.content ?? "",
114298
- readOnly: true,
114299
- editorMinHeight: "0px"
114300
- }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
114301
- className: "text-muted-foreground flex h-full items-center justify-center",
114302
- children: "Select a file to view"
114303
- })
114304
- })
114305
- })
114306
- })
114307
- });
114308
- }
114309
- //#endregion
114310
- //#region src/components/opsx/artifact-document-shell.tsx
114311
- var statusConfig = {
114312
- done: {
114313
- label: "Done",
114314
- className: "text-emerald-500",
114315
- icon: CircleCheck
114316
- },
114317
- ready: {
114318
- label: "Ready",
114319
- className: "text-sky-500",
114320
- icon: Circle$1
114321
- },
114322
- blocked: {
114323
- label: "Blocked",
114324
- className: "text-amber-500",
114325
- icon: TriangleAlert
114326
- }
114327
- };
114328
- function OpsxArtifactStatusBadge({ status }) {
114329
- const config = statusConfig[status];
114330
- const StatusIcon = config.icon;
114331
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", {
114332
- className: `inline-flex shrink-0 items-center gap-1.5 text-xs font-medium ${config.className}`,
114333
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(StatusIcon, { className: "h-4 w-4" }), config.label]
114334
- });
114335
- }
114336
- function OpsxArtifactTabStatusIcon({ status }) {
114337
- const StatusIcon = statusConfig[status].icon;
114338
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(StatusIcon, { className: `h-3.5 w-3.5 ${statusConfig[status].className}` });
114339
- }
114340
- function OpsxArtifactDocumentShell({ id, path, status, missingDeps, meta, children }) {
114341
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", {
114342
- className: "border-border bg-muted/25 mb-5 rounded-md border px-4 py-3",
114343
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
114344
- className: "flex flex-wrap items-start justify-between gap-3",
114345
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
114346
- className: "min-w-0 space-y-1",
114347
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
114348
- className: "font-medium",
114349
- children: id
114350
- }), path ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
114351
- className: "text-muted-foreground break-all text-xs",
114352
- children: path
114353
- }) : null]
114354
- }), status ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(OpsxArtifactStatusBadge, { status }) : meta]
114355
- }), status === "blocked" && missingDeps?.length ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
114356
- className: "mt-3 flex items-start gap-2 rounded-md border border-amber-500/50 bg-amber-500/10 px-3 py-2 text-xs text-amber-700",
114357
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(TriangleAlert, { className: "h-4 w-4 shrink-0" }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
114358
- className: "font-medium",
114359
- children: "Blocked by missing dependencies"
114360
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
114361
- className: "mt-1",
114362
- children: missingDeps.join(", ")
114363
- })] })]
114364
- }) : null]
114365
- }), children] });
114366
- }
114367
- //#endregion
114368
114383
  //#region src/components/anchor-scroll.ts
114369
114384
  /**
114370
114385
  * Utilities for hash-anchor navigation inside nested scroll containers.
@@ -114425,46 +114440,6 @@ function navigateHashAnchor(anchorElement, hash) {
114425
114440
  return true;
114426
114441
  }
114427
114442
  //#endregion
114428
- //#region src/components/button.tsx
114429
- var variantClassNames = {
114430
- primary: "bg-primary text-primary-foreground hover:bg-primary/90",
114431
- secondary: "border-border bg-background text-foreground border hover:bg-muted",
114432
- ghost: "text-foreground hover:bg-muted",
114433
- destructive: "bg-red-600 text-white hover:bg-red-700 focus-visible:ring-red-500 dark:bg-red-600 dark:hover:bg-red-700"
114434
- };
114435
- var activityVariantClassNames = {
114436
- primary: "bg-primary/10 text-primary hover:bg-primary/10",
114437
- secondary: "border-primary/40 bg-primary/10 text-primary border hover:bg-primary/10",
114438
- ghost: "bg-primary/10 text-primary hover:bg-primary/10",
114439
- destructive: "bg-red-600/10 text-red-600 hover:bg-red-600/10 dark:text-red-400"
114440
- };
114441
- var sizeClassNames = {
114442
- sm: "gap-1.5 rounded-md px-3 py-1.5 text-xs",
114443
- md: "gap-2 rounded-md px-4 py-2 text-sm",
114444
- "icon-sm": "h-7 w-7 rounded-md p-0",
114445
- "icon-md": "h-9 w-9 rounded-md p-0"
114446
- };
114447
- var Button = (0, import_react.forwardRef)(function Button({ variant = "primary", size = "md", activity = false, disabled = false, type = "button", className, onClick, "aria-disabled": ariaDisabled, ...props }, ref) {
114448
- const handleClick = (event) => {
114449
- if (activity) {
114450
- event.preventDefault();
114451
- event.stopPropagation();
114452
- return;
114453
- }
114454
- onClick?.(event);
114455
- };
114456
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
114457
- ref,
114458
- type,
114459
- disabled,
114460
- "aria-disabled": ariaDisabled ?? (activity ? true : void 0),
114461
- "data-activity": activity ? "true" : void 0,
114462
- onClick: handleClick,
114463
- className: cn$1("inline-flex shrink-0 items-center justify-center font-medium outline-none transition-colors", "focus-visible:ring-primary focus-visible:ring-1", disabled ? "cursor-not-allowed opacity-50" : activity ? "cursor-default" : "cursor-pointer", activity ? activityVariantClassNames[variant] : variantClassNames[variant], sizeClassNames[size], className),
114464
- ...props
114465
- });
114466
- });
114467
- //#endregion
114468
114443
  //#region src/lib/document-translation-session-state.ts
114469
114444
  var DOCUMENT_TRANSLATION_SESSION_STORAGE_KEY = "openspecui:document-translation:mode";
114470
114445
  var DEFAULT_ACTIVATION = "source";
@@ -150423,6 +150398,619 @@ var viewerStyles = String.raw`
150423
150398
  /* MarkdownViewer keeps layout hooks local; shared ToC geometry lives in index.css. */
150424
150399
  `;
150425
150400
  //#endregion
150401
+ //#region src/components/scroll-spy.ts
150402
+ function hasVerticalScrollBehavior(overflowY) {
150403
+ return overflowY === "auto" || overflowY === "scroll" || overflowY === "overlay";
150404
+ }
150405
+ function findVerticalScrollContainer(node, options = {}) {
150406
+ const { allowNonScrollable = false } = options;
150407
+ let current = node?.parentElement ?? null;
150408
+ while (current) {
150409
+ if (hasVerticalScrollBehavior(window.getComputedStyle(current).overflowY)) {
150410
+ if (allowNonScrollable || current.scrollHeight > current.clientHeight) return current;
150411
+ }
150412
+ current = current.parentElement;
150413
+ }
150414
+ return null;
150415
+ }
150416
+ function scrollViewportBounds(root) {
150417
+ if (root) {
150418
+ const rect = root.getBoundingClientRect();
150419
+ return {
150420
+ top: rect.top,
150421
+ bottom: rect.bottom
150422
+ };
150423
+ }
150424
+ return {
150425
+ top: 0,
150426
+ bottom: window.innerHeight
150427
+ };
150428
+ }
150429
+ function measureAvailableViewportHeight(node, root = findVerticalScrollContainer(node, { allowNonScrollable: true })) {
150430
+ if (typeof window === "undefined" || !node) return null;
150431
+ const nodeRect = node.getBoundingClientRect();
150432
+ const viewport = scrollViewportBounds(root);
150433
+ return Math.max(Math.floor(viewport.bottom - Math.max(nodeRect.top, viewport.top)), 0);
150434
+ }
150435
+ function useViewportConstrainedHeight({ target, enabled = true }) {
150436
+ const [height, setHeight] = (0, import_react.useState)(null);
150437
+ (0, import_react.useLayoutEffect)(() => {
150438
+ if (!enabled || typeof window === "undefined") {
150439
+ setHeight(null);
150440
+ return;
150441
+ }
150442
+ if (!target) {
150443
+ setHeight(null);
150444
+ return;
150445
+ }
150446
+ let resizeObserver = null;
150447
+ let scrollRoot = null;
150448
+ let scrollTarget = window;
150449
+ const setConstrainedHeight = (nextHeight) => {
150450
+ setHeight((currentHeight) => currentHeight === nextHeight ? currentHeight : nextHeight);
150451
+ };
150452
+ const bindScrollRoot = (nextRoot) => {
150453
+ if (scrollRoot === nextRoot) return;
150454
+ scrollTarget.removeEventListener("scroll", handleUpdate);
150455
+ if (resizeObserver && scrollRoot) resizeObserver.unobserve(scrollRoot);
150456
+ scrollRoot = nextRoot;
150457
+ scrollTarget = nextRoot ?? window;
150458
+ scrollTarget.addEventListener("scroll", handleUpdate, { passive: true });
150459
+ if (resizeObserver && scrollRoot) resizeObserver.observe(scrollRoot);
150460
+ };
150461
+ const handleUpdate = () => {
150462
+ const nextRoot = findVerticalScrollContainer(target, { allowNonScrollable: true });
150463
+ bindScrollRoot(nextRoot);
150464
+ setConstrainedHeight(measureAvailableViewportHeight(target, nextRoot));
150465
+ };
150466
+ if (typeof ResizeObserver !== "undefined") {
150467
+ resizeObserver = new ResizeObserver(() => {
150468
+ handleUpdate();
150469
+ });
150470
+ resizeObserver.observe(target);
150471
+ if (target.parentElement) resizeObserver.observe(target.parentElement);
150472
+ }
150473
+ handleUpdate();
150474
+ window.addEventListener("resize", handleUpdate);
150475
+ return () => {
150476
+ window.removeEventListener("resize", handleUpdate);
150477
+ scrollTarget.removeEventListener("scroll", handleUpdate);
150478
+ resizeObserver?.disconnect();
150479
+ };
150480
+ }, [enabled, target]);
150481
+ return height;
150482
+ }
150483
+ //#endregion
150484
+ //#region src/lib/file-preview.ts
150485
+ async function prepareEntityFilePreview(input) {
150486
+ if (isStaticMode()) return null;
150487
+ const preview = await (input.archived ? trpcClient.archive.prepareFilePreview.query({
150488
+ id: input.changeId,
150489
+ path: input.path
150490
+ }) : trpcClient.change.prepareFilePreview.query({
150491
+ id: input.changeId,
150492
+ path: input.path
150493
+ }));
150494
+ const apiBaseUrl = getApiBaseUrl();
150495
+ if (!apiBaseUrl) return preview;
150496
+ const prefix = (path) => `${apiBaseUrl}${path}`;
150497
+ return {
150498
+ ...preview,
150499
+ resourcePathname: preview.resourcePathname ? prefix(preview.resourcePathname) : null,
150500
+ entryPathname: prefix(preview.entryPathname),
150501
+ urlPath: prefix(preview.urlPath)
150502
+ };
150503
+ }
150504
+ async function writeEntityFile(input) {
150505
+ if (input.archived) {
150506
+ await trpcClient.archive.writeFile.mutate({
150507
+ id: input.changeId,
150508
+ path: input.path,
150509
+ content: input.content
150510
+ });
150511
+ return;
150512
+ }
150513
+ await trpcClient.change.writeFile.mutate({
150514
+ id: input.changeId,
150515
+ path: input.path,
150516
+ content: input.content
150517
+ });
150518
+ }
150519
+ //#endregion
150520
+ //#region src/components/folder-editor-viewer.tsx
150521
+ function isFileEntry(file) {
150522
+ return file?.type === "file";
150523
+ }
150524
+ function isTextLikeFile(file) {
150525
+ return isFileEntry(file) && file.content !== void 0 && file.content !== null;
150526
+ }
150527
+ function normalizeExplorerFile(file) {
150528
+ return {
150529
+ ...file,
150530
+ content: file.content ?? void 0
150531
+ };
150532
+ }
150533
+ function canPreviewInline(file) {
150534
+ return isFileEntry(file) && file.previewKind === "markdown";
150535
+ }
150536
+ function canPreviewRemote(file) {
150537
+ return isFileEntry(file) && [
150538
+ "html",
150539
+ "image",
150540
+ "audio",
150541
+ "video",
150542
+ "pdf"
150543
+ ].includes(file.previewKind ?? "");
150544
+ }
150545
+ function canPreviewFile(file) {
150546
+ return canPreviewInline(file) || canPreviewRemote(file);
150547
+ }
150548
+ function isPreviewOnlyFile(file) {
150549
+ return isFileEntry(file) && [
150550
+ "image",
150551
+ "audio",
150552
+ "video",
150553
+ "pdf"
150554
+ ].includes(file.previewKind ?? "");
150555
+ }
150556
+ function resolveDefaultMode(file, inStaticMode) {
150557
+ if (!file) return "read";
150558
+ if (!inStaticMode && isPreviewOnlyFile(file)) return "preview";
150559
+ return "read";
150560
+ }
150561
+ function clampPreviewHeight(viewportHeight) {
150562
+ if (viewportHeight == null) return 480;
150563
+ return Math.max(320, Math.min(viewportHeight - 112, 920));
150564
+ }
150565
+ function resolveRemotePreviewFrameStyle(frameHeight) {
150566
+ if (frameHeight == null) return void 0;
150567
+ return {
150568
+ minHeight: "min(320px, 100%)",
150569
+ height: "100%",
150570
+ maxHeight: `${frameHeight}px`
150571
+ };
150572
+ }
150573
+ function canSaveDraft(file, hasDirtyDraft, savingPath) {
150574
+ return !!file && hasDirtyDraft && savingPath !== file.path;
150575
+ }
150576
+ function appendPreviewTheme(url, isDarkMode) {
150577
+ const nextUrl = new URL(url, window.location.href);
150578
+ nextUrl.searchParams.set("theme", isDarkMode ? "dark" : "light");
150579
+ return nextUrl.toString();
150580
+ }
150581
+ function resolvePreviewFrameUrl(preview, isDarkMode) {
150582
+ return preview.previewKind === "html" ? preview.urlPath : appendPreviewTheme(preview.urlPath, isDarkMode);
150583
+ }
150584
+ function triggerDownload(url, fileName) {
150585
+ const anchor = document.createElement("a");
150586
+ anchor.href = url;
150587
+ anchor.download = fileName;
150588
+ anchor.rel = "noreferrer noopener";
150589
+ anchor.click();
150590
+ }
150591
+ async function sharePreview(input) {
150592
+ if (navigator.share) {
150593
+ await navigator.share({
150594
+ title: input.title,
150595
+ url: input.url
150596
+ });
150597
+ return true;
150598
+ }
150599
+ await navigator.clipboard.writeText(input.url);
150600
+ return false;
150601
+ }
150602
+ function PreviewPane({ file, preview, loading, error, className = "", frameHeight, isDarkMode }) {
150603
+ if (file.previewKind === "markdown") return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
150604
+ className: `min-h-0 h-full flex-1 overflow-hidden ${className}`,
150605
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(MarkdownViewer, {
150606
+ markdown: file.content ?? "",
150607
+ path: file.path,
150608
+ className: "h-full"
150609
+ })
150610
+ });
150611
+ if (loading) return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
150612
+ className: "text-muted-foreground flex h-full items-center justify-center gap-2 text-sm",
150613
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(LoaderCircle, { className: "h-4 w-4 animate-spin" }), "Preparing preview..."]
150614
+ });
150615
+ if (error) return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
150616
+ className: "text-destructive flex h-full items-center justify-center px-4 text-sm",
150617
+ children: error
150618
+ });
150619
+ if (!preview) return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
150620
+ className: "text-muted-foreground flex h-full items-center justify-center px-4 text-sm",
150621
+ children: "Preview unavailable."
150622
+ });
150623
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
150624
+ className: `bg-background min-h-0 h-full overflow-hidden ${className}`,
150625
+ style: resolveRemotePreviewFrameStyle(frameHeight),
150626
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("iframe", {
150627
+ src: resolvePreviewFrameUrl(preview, isDarkMode),
150628
+ title: `Preview ${file.path}`,
150629
+ className: "block h-full w-full border-0"
150630
+ }, `${resolvePreviewFrameUrl(preview, isDarkMode)}:${isDarkMode ? "dark" : "light"}`)
150631
+ });
150632
+ }
150633
+ function FolderEditorViewer({ changeId, archived = false, files: providedFiles }) {
150634
+ const inStaticMode = isStaticMode();
150635
+ const isDarkMode = useDarkMode();
150636
+ const { data: files, isLoading, error } = archived ? useArchiveFilesSubscription(changeId) : useChangeFilesSubscription(changeId);
150637
+ const [selectedPath, setSelectedPath] = (0, import_react.useState)(null);
150638
+ const [viewportNode, setViewportNode] = (0, import_react.useState)(null);
150639
+ const [mode, setMode] = (0, import_react.useState)("read");
150640
+ const [draftContent, setDraftContent] = (0, import_react.useState)({});
150641
+ const [savingPath, setSavingPath] = (0, import_react.useState)(null);
150642
+ const [previewByPath, setPreviewByPath] = (0, import_react.useState)({});
150643
+ const [previewLoadingPath, setPreviewLoadingPath] = (0, import_react.useState)(null);
150644
+ const [previewErrorByPath, setPreviewErrorByPath] = (0, import_react.useState)({});
150645
+ const [previewMaximized, setPreviewMaximized] = (0, import_react.useState)(false);
150646
+ const [shareFeedback, setShareFeedback] = (0, import_react.useState)(null);
150647
+ const viewportHeight = useViewportConstrainedHeight({
150648
+ target: viewportNode,
150649
+ enabled: viewportNode !== null
150650
+ });
150651
+ const sortedEntries = (0, import_react.useMemo)(() => {
150652
+ if (providedFiles) return [...providedFiles];
150653
+ if (!files) return [];
150654
+ return [...files];
150655
+ }, [files, providedFiles]);
150656
+ const activeFile = (0, import_react.useMemo)(() => {
150657
+ if (!selectedPath) return null;
150658
+ const entry = sortedEntries.find((item) => item.path === selectedPath);
150659
+ return isFileEntry(entry) ? entry : null;
150660
+ }, [selectedPath, sortedEntries]);
150661
+ const activeDraft = activeFile ? draftContent[activeFile.path] ?? activeFile.content ?? "" : "";
150662
+ const editEnabled = !inStaticMode && isTextLikeFile(activeFile) && !isPreviewOnlyFile(activeFile);
150663
+ const readEnabled = !isPreviewOnlyFile(activeFile);
150664
+ const previewEnabled = !inStaticMode && canPreviewFile(activeFile);
150665
+ const hasDirtyDraft = !!activeFile && isTextLikeFile(activeFile) && activeDraft !== (activeFile.content ?? "");
150666
+ const remotePreviewHeight = clampPreviewHeight(viewportHeight);
150667
+ (0, import_react.useEffect)(() => {
150668
+ if (!sortedEntries.length) {
150669
+ setSelectedPath(null);
150670
+ return;
150671
+ }
150672
+ if (!sortedEntries.find((entry) => entry.path === selectedPath && entry.type === "file")) setSelectedPath(sortedEntries.find((entry) => entry.type === "file")?.path ?? null);
150673
+ }, [sortedEntries, selectedPath]);
150674
+ (0, import_react.useEffect)(() => {
150675
+ const nextDefaultMode = resolveDefaultMode(activeFile, inStaticMode);
150676
+ if (mode === "edit" && !editEnabled) {
150677
+ setMode(nextDefaultMode);
150678
+ return;
150679
+ }
150680
+ if (mode === "preview" && !previewEnabled) {
150681
+ setMode(nextDefaultMode);
150682
+ return;
150683
+ }
150684
+ if (mode === "read" && !readEnabled) setMode(nextDefaultMode);
150685
+ }, [
150686
+ activeFile,
150687
+ editEnabled,
150688
+ inStaticMode,
150689
+ mode,
150690
+ previewEnabled,
150691
+ readEnabled
150692
+ ]);
150693
+ (0, import_react.useEffect)(() => {
150694
+ const nextDefaultMode = resolveDefaultMode(activeFile, inStaticMode);
150695
+ setMode((currentMode) => {
150696
+ if (currentMode === nextDefaultMode) return currentMode;
150697
+ if (currentMode === "edit" && editEnabled) return currentMode;
150698
+ if (currentMode === "preview" && previewEnabled) return currentMode;
150699
+ if (currentMode === "read" && readEnabled) return currentMode;
150700
+ return nextDefaultMode;
150701
+ });
150702
+ }, [
150703
+ activeFile?.path,
150704
+ editEnabled,
150705
+ inStaticMode,
150706
+ previewEnabled,
150707
+ readEnabled
150708
+ ]);
150709
+ (0, import_react.useEffect)(() => {
150710
+ if (!canPreviewRemote(activeFile) || mode !== "preview") setPreviewMaximized(false);
150711
+ }, [activeFile, mode]);
150712
+ (0, import_react.useEffect)(() => {
150713
+ if (shareFeedback === null) return;
150714
+ const timer = window.setTimeout(() => {
150715
+ setShareFeedback(null);
150716
+ }, 1800);
150717
+ return () => {
150718
+ window.clearTimeout(timer);
150719
+ };
150720
+ }, [shareFeedback]);
150721
+ (0, import_react.useEffect)(() => {
150722
+ if (!activeFile || mode !== "preview" || !canPreviewRemote(activeFile)) return;
150723
+ if (previewByPath[activeFile.path] !== void 0) return;
150724
+ let cancelled = false;
150725
+ setPreviewLoadingPath(activeFile.path);
150726
+ setPreviewErrorByPath((current) => ({
150727
+ ...current,
150728
+ [activeFile.path]: null
150729
+ }));
150730
+ prepareEntityFilePreview({
150731
+ changeId,
150732
+ archived,
150733
+ path: activeFile.path
150734
+ }).then((preview) => {
150735
+ if (cancelled) return;
150736
+ setPreviewByPath((current) => ({
150737
+ ...current,
150738
+ [activeFile.path]: preview
150739
+ }));
150740
+ }).catch((cause) => {
150741
+ if (cancelled) return;
150742
+ setPreviewErrorByPath((current) => ({
150743
+ ...current,
150744
+ [activeFile.path]: cause instanceof Error ? cause.message : String(cause)
150745
+ }));
150746
+ setPreviewByPath((current) => ({
150747
+ ...current,
150748
+ [activeFile.path]: null
150749
+ }));
150750
+ }).finally(() => {
150751
+ if (cancelled) return;
150752
+ setPreviewLoadingPath((current) => current === activeFile.path ? null : current);
150753
+ });
150754
+ return () => {
150755
+ cancelled = true;
150756
+ };
150757
+ }, [
150758
+ activeFile,
150759
+ archived,
150760
+ changeId,
150761
+ mode,
150762
+ previewByPath
150763
+ ]);
150764
+ if (!providedFiles && isLoading) return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
150765
+ className: "bg-muted/20 flex h-[400px] items-center justify-center",
150766
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(LoaderCircle, { className: "text-muted-foreground h-6 w-6 animate-spin" })
150767
+ });
150768
+ if (error) return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
150769
+ className: "bg-destructive/10 text-destructive p-4 text-sm",
150770
+ children: ["Failed to load files: ", error.message]
150771
+ });
150772
+ const preview = activeFile ? previewByPath[activeFile.path] ?? null : null;
150773
+ const previewError = activeFile ? previewErrorByPath[activeFile.path] ?? null : null;
150774
+ const previewDownloadUrl = activeFile && preview ? activeFile.previewKind === "html" ? preview.entryPathname : preview.resourcePathname : null;
150775
+ const previewShareUrl = activeFile && preview && canPreviewRemote(activeFile) ? resolvePreviewFrameUrl(preview, isDarkMode) : null;
150776
+ const saveActiveDraft = () => {
150777
+ if (!isTextLikeFile(activeFile)) return;
150778
+ if (!canSaveDraft(activeFile, hasDirtyDraft, savingPath)) return;
150779
+ setSavingPath(activeFile.path);
150780
+ writeEntityFile({
150781
+ changeId,
150782
+ archived,
150783
+ path: activeFile.path,
150784
+ content: activeDraft
150785
+ }).finally(() => {
150786
+ setSavingPath((current) => current === activeFile.path ? null : current);
150787
+ });
150788
+ };
150789
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", {
150790
+ "data-tab-scroll-root": "true",
150791
+ className: "scrollbar-thin scrollbar-track-transparent min-h-0 flex-1 overflow-auto",
150792
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
150793
+ className: "pr-1",
150794
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
150795
+ ref: setViewportNode,
150796
+ className: "flex min-h-0 flex-col",
150797
+ style: viewportHeight != null ? { height: `${viewportHeight}px` } : void 0,
150798
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(FileExplorer, {
150799
+ entries: sortedEntries,
150800
+ selectedPath,
150801
+ onSelect: setSelectedPath,
150802
+ emptyState: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: "No files found for this change." }),
150803
+ renderEditor: (currentFile) => {
150804
+ if (!isFileEntry(currentFile)) return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
150805
+ className: "text-muted-foreground flex h-full items-center justify-center",
150806
+ children: "Select a file to view"
150807
+ });
150808
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
150809
+ className: "flex min-h-0 flex-1 flex-col",
150810
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
150811
+ className: "border-border/60 bg-muted/20 flex flex-wrap items-center justify-between gap-3 border-b px-3 py-2",
150812
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(ButtonGroup, {
150813
+ value: mode,
150814
+ onChange: setMode,
150815
+ options: [
150816
+ {
150817
+ value: "read",
150818
+ label: "Read",
150819
+ disabled: !readEnabled
150820
+ },
150821
+ {
150822
+ value: "edit",
150823
+ label: "Edit",
150824
+ disabled: !editEnabled
150825
+ },
150826
+ {
150827
+ value: "preview",
150828
+ label: "Preview",
150829
+ disabled: !previewEnabled
150830
+ }
150831
+ ]
150832
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
150833
+ className: "flex items-center gap-2",
150834
+ children: mode === "edit" ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Button, {
150835
+ variant: "secondary",
150836
+ size: "sm",
150837
+ disabled: !hasDirtyDraft,
150838
+ onClick: () => {
150839
+ if (!isTextLikeFile(activeFile)) return;
150840
+ setDraftContent((current) => ({
150841
+ ...current,
150842
+ [activeFile.path]: activeFile.content ?? ""
150843
+ }));
150844
+ },
150845
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Undo2, { className: "h-3.5 w-3.5" }), "Revert"]
150846
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Button, {
150847
+ variant: "primary",
150848
+ size: "sm",
150849
+ disabled: !hasDirtyDraft || savingPath === currentFile.path,
150850
+ onClick: saveActiveDraft,
150851
+ children: [savingPath === currentFile.path ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(LoaderCircle, { className: "h-3.5 w-3.5 animate-spin" }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Save, { className: "h-3.5 w-3.5" }), "Save"]
150852
+ })] }) : mode === "preview" && canPreviewRemote(activeFile) ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
150853
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Button, {
150854
+ variant: "secondary",
150855
+ size: "sm",
150856
+ onClick: () => {
150857
+ setPreviewByPath((current) => {
150858
+ const next = { ...current };
150859
+ delete next[currentFile.path];
150860
+ return next;
150861
+ });
150862
+ },
150863
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(RefreshCw, { className: "h-3.5 w-3.5" }), "Refresh"]
150864
+ }),
150865
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Button, {
150866
+ variant: "secondary",
150867
+ size: "sm",
150868
+ onClick: () => {
150869
+ setPreviewMaximized((current) => !current);
150870
+ },
150871
+ children: [previewMaximized ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Minimize, { className: "h-3.5 w-3.5" }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Expand, { className: "h-3.5 w-3.5" }), previewMaximized ? "Exit Maximize" : "Maximize"]
150872
+ }),
150873
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Button, {
150874
+ variant: "secondary",
150875
+ size: "sm",
150876
+ disabled: !previewDownloadUrl,
150877
+ onClick: () => {
150878
+ if (!previewDownloadUrl) return;
150879
+ triggerDownload(previewDownloadUrl, currentFile.path.split("/").pop() ?? "preview");
150880
+ },
150881
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Download, { className: "h-3.5 w-3.5" }), "Download"]
150882
+ }),
150883
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Button, {
150884
+ variant: "secondary",
150885
+ size: "sm",
150886
+ disabled: !previewShareUrl,
150887
+ onClick: () => {
150888
+ if (!previewShareUrl) return;
150889
+ sharePreview({
150890
+ url: previewShareUrl,
150891
+ title: currentFile.path
150892
+ }).then((shared) => {
150893
+ setShareFeedback(shared ? "shared" : "copied");
150894
+ });
150895
+ },
150896
+ children: [shareFeedback === "shared" || shareFeedback === "copied" ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Check, { className: "h-3.5 w-3.5" }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Share2, { className: "h-3.5 w-3.5" }), shareFeedback === "shared" ? "Shared" : shareFeedback === "copied" ? "Copied" : "Share"]
150897
+ })
150898
+ ] }) : null
150899
+ })]
150900
+ }), !readEnabled && !editEnabled && !previewEnabled ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
150901
+ className: "text-muted-foreground flex min-h-0 flex-1 items-center justify-center px-4 text-sm",
150902
+ children: "Preview for this file type is only available in live mode."
150903
+ }) : mode === "preview" ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
150904
+ className: "min-h-0 flex-1 overflow-hidden",
150905
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(PreviewPane, {
150906
+ file: currentFile,
150907
+ preview,
150908
+ loading: previewLoadingPath === currentFile.path,
150909
+ error: previewError,
150910
+ frameHeight: canPreviewRemote(currentFile) ? remotePreviewHeight : void 0,
150911
+ isDarkMode
150912
+ })
150913
+ }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(FileExplorerCodeEditor, {
150914
+ file: normalizeExplorerFile(currentFile),
150915
+ value: mode === "edit" ? activeDraft : currentFile.content ?? "",
150916
+ readOnly: mode !== "edit",
150917
+ editorMinHeight: "0px",
150918
+ onSaveShortcut: mode === "edit" ? saveActiveDraft : void 0,
150919
+ onChange: mode === "edit" ? (value) => {
150920
+ setDraftContent((current) => ({
150921
+ ...current,
150922
+ [currentFile.path]: value
150923
+ }));
150924
+ } : void 0
150925
+ })]
150926
+ });
150927
+ }
150928
+ })
150929
+ })
150930
+ }), activeFile && canPreviewRemote(activeFile) && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Dialog, {
150931
+ open: previewMaximized,
150932
+ title: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
150933
+ className: "text-sm font-medium",
150934
+ children: activeFile.path
150935
+ }),
150936
+ onClose: () => setPreviewMaximized(false),
150937
+ className: "max-w-6xl rounded-none border-0 shadow-none [--openspec-dialog-radius:0px]",
150938
+ bodyClassName: "p-0",
150939
+ contentClassName: "px-3 py-3",
150940
+ maxHeight: "96vh",
150941
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
150942
+ className: "flex h-[80vh] min-h-[420px] max-h-[88vh] min-w-0 flex-col overflow-hidden",
150943
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(PreviewPane, {
150944
+ file: activeFile,
150945
+ preview,
150946
+ loading: previewLoadingPath === activeFile.path,
150947
+ error: previewError,
150948
+ className: "rounded-none",
150949
+ isDarkMode
150950
+ })
150951
+ })
150952
+ })]
150953
+ });
150954
+ }
150955
+ //#endregion
150956
+ //#region src/components/opsx/artifact-document-shell.tsx
150957
+ var statusConfig = {
150958
+ done: {
150959
+ label: "Done",
150960
+ className: "text-emerald-500",
150961
+ icon: CircleCheck
150962
+ },
150963
+ ready: {
150964
+ label: "Ready",
150965
+ className: "text-sky-500",
150966
+ icon: Circle$1
150967
+ },
150968
+ blocked: {
150969
+ label: "Blocked",
150970
+ className: "text-amber-500",
150971
+ icon: TriangleAlert
150972
+ }
150973
+ };
150974
+ function OpsxArtifactStatusBadge({ status }) {
150975
+ const config = statusConfig[status];
150976
+ const StatusIcon = config.icon;
150977
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", {
150978
+ className: `inline-flex shrink-0 items-center gap-1.5 text-xs font-medium ${config.className}`,
150979
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(StatusIcon, { className: "h-4 w-4" }), config.label]
150980
+ });
150981
+ }
150982
+ function OpsxArtifactTabStatusIcon({ status }) {
150983
+ const StatusIcon = statusConfig[status].icon;
150984
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(StatusIcon, { className: `h-3.5 w-3.5 ${statusConfig[status].className}` });
150985
+ }
150986
+ function OpsxArtifactDocumentShell({ id, path, status, missingDeps, meta, children }) {
150987
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", {
150988
+ className: "border-border bg-muted/25 mb-5 rounded-md border px-4 py-3",
150989
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
150990
+ className: "flex flex-wrap items-start justify-between gap-3",
150991
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
150992
+ className: "min-w-0 space-y-1",
150993
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
150994
+ className: "font-medium",
150995
+ children: id
150996
+ }), path ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
150997
+ className: "text-muted-foreground break-all text-xs",
150998
+ children: path
150999
+ }) : null]
151000
+ }), status ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(OpsxArtifactStatusBadge, { status }) : meta]
151001
+ }), status === "blocked" && missingDeps?.length ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
151002
+ className: "mt-3 flex items-start gap-2 rounded-md border border-amber-500/50 bg-amber-500/10 px-3 py-2 text-xs text-amber-700",
151003
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(TriangleAlert, { className: "h-4 w-4 shrink-0" }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
151004
+ className: "font-medium",
151005
+ children: "Blocked by missing dependencies"
151006
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
151007
+ className: "mt-1",
151008
+ children: missingDeps.join(", ")
151009
+ })] })]
151010
+ }) : null]
151011
+ }), children] });
151012
+ }
151013
+ //#endregion
150426
151014
  //#region src/components/opsx/opsx-markdown-files-viewer.tsx
150427
151015
  function getMarkdownFiles(files) {
150428
151016
  return files.filter((file) => file.type === "file" && file.content !== void 0 && file.path.endsWith(".md"));
@@ -151134,28 +151722,6 @@ function ChangeView() {
151134
151722
  });
151135
151723
  }
151136
151724
  //#endregion
151137
- //#region src/components/button-group.tsx
151138
- /**
151139
- * Compact segmented buttons with single-select behavior.
151140
- */
151141
- function ButtonGroup({ value, options, onChange, className = "", tone = "default" }) {
151142
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
151143
- className: `inline-flex w-fit max-w-full shrink-0 self-start overflow-hidden rounded-md border ${tone === "terminal" ? "border-terminal-foreground/25 bg-terminal/70 text-terminal-foreground" : "border-border bg-card"} ${className}`,
151144
- children: options.map((option, index) => {
151145
- const active = option.value === value;
151146
- const stateClassName = active ? "bg-primary text-primary-foreground" : tone === "terminal" ? "text-terminal-foreground/72 hover:bg-terminal-foreground/10 hover:text-terminal-foreground" : "text-muted-foreground hover:bg-muted/60 hover:text-foreground";
151147
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
151148
- type: "button",
151149
- disabled: option.disabled,
151150
- onClick: () => onChange(option.value),
151151
- "aria-pressed": active,
151152
- className: `inline-flex items-center justify-center gap-1.5 px-3 py-1.5 text-xs font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-50 ${index > 0 ? tone === "terminal" ? "border-terminal-foreground/20 border-l" : "border-border border-l" : ""} ${stateClassName}`,
151153
- children: option.label
151154
- }, option.value);
151155
- })
151156
- });
151157
- }
151158
- //#endregion
151159
151725
  //#region src/components/cli-terminal.tsx
151160
151726
  /**
151161
151727
  * Pure terminal renderer. Accepts ANSI-aware ASCII lines or raw ReactNode lines.