@jxsuite/studio 4.1.0 → 5.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (612) hide show
  1. package/README.md +1 -1
  2. package/data/elements-meta.json +5 -15
  3. package/data/html-meta.json +51 -6
  4. package/dist/chunks/{2020-n6tfwnda.js → 2020-g79n01v9.js} +14 -14
  5. package/dist/chunks/action-group-sp6tna8v.js +118 -0
  6. package/dist/chunks/adapter-nj7tnjfn.js +13 -0
  7. package/dist/chunks/cf-account-picker-qwkm9zrf.js +495 -0
  8. package/dist/chunks/cf-settings-71bv5zn9.js +20 -0
  9. package/dist/chunks/color-area-v17df7b8.js +154 -0
  10. package/dist/chunks/color-field-anwybnkn.js +208 -0
  11. package/dist/chunks/color-slider-44ez96fc.js +79 -0
  12. package/dist/chunks/color-xgg3kfw7.js +35 -0
  13. package/dist/chunks/combobox-5e7jev23.js +236 -0
  14. package/dist/chunks/components-vj72gqtq.js +20 -0
  15. package/dist/chunks/content-source-5mex4x1h.js +46 -0
  16. package/dist/chunks/convert-to-repeater-n64h8znc.js +639 -0
  17. package/dist/chunks/dialog-s890b918.js +85 -0
  18. package/dist/chunks/editor-3qhbg51x.js +35 -0
  19. package/dist/chunks/entry-commands-234hjnqw.js +42 -0
  20. package/dist/chunks/extension-sections-3hpcambp.js +651 -0
  21. package/dist/chunks/file-ops-8yhd83xr.js +47 -0
  22. package/dist/chunks/files-hnxqxtsg.js +72 -0
  23. package/dist/chunks/format-host-779sfp2n.js +40 -0
  24. package/dist/chunks/fs-events-b88z7g4h.js +18 -0
  25. package/dist/chunks/git-panel-xwj8fpab.js +49 -0
  26. package/dist/chunks/icons-yy10wk9r.js +402 -0
  27. package/dist/chunks/iframe-entry-15g3n6xv.js +114 -0
  28. package/dist/chunks/iframe-entry-b27vq81n.js +203 -0
  29. package/dist/chunks/iframe-entry-nbyxee1y.js +154 -0
  30. package/dist/chunks/iframe-host-syr0f9sb.js +115 -0
  31. package/dist/chunks/{index-wcnt3r9g.js → index-mdmyx6s2.js} +11 -11
  32. package/dist/chunks/index-n4j7qxyr.js +109 -0
  33. package/dist/chunks/{javascript-q8kpmfah.js → javascript-xvrfrpkb.js} +8 -9
  34. package/dist/chunks/{jsonMode-dkr040ga.js → jsonMode-tyx2kj6p.js} +526 -527
  35. package/dist/chunks/jx-validate-j0wxk72w.js +15 -0
  36. package/dist/chunks/layers-ff81wthn.js +30 -0
  37. package/dist/chunks/layers-panel-pnnghw12.js +40 -0
  38. package/dist/chunks/listbox-6v2ac08j.js +44 -0
  39. package/dist/chunks/lit-html-m244w9nh.js +17 -0
  40. package/dist/chunks/media-picker-cqhhxhhe.js +33 -0
  41. package/dist/chunks/menu-9p2w46gj.js +15 -0
  42. package/dist/chunks/menu-q99sy9rf.js +285 -0
  43. package/dist/chunks/{monaco-binding-rj6xpx9y.js → monaco-binding-sw6en4dw.js} +12 -15
  44. package/dist/chunks/monaco-buffer-bhy3hb6m.js +24 -0
  45. package/dist/chunks/{monaco-setup-vx9bhp1d.js → monaco-setup-8r62fj6y.js} +27 -37
  46. package/dist/chunks/notify-628t0anh.js +21 -0
  47. package/dist/chunks/number-field-5cndyft8.js +72 -0
  48. package/dist/chunks/parse-0zx14y15.js +10 -0
  49. package/dist/chunks/platform-ts9cg1a4.js +15 -0
  50. package/dist/chunks/popover-47z3ytva.js +25 -0
  51. package/dist/chunks/publish-panel-5zt840sy.js +27 -0
  52. package/dist/chunks/quick-search-3748564r.js +45 -0
  53. package/dist/chunks/references-qvvxej7h.js +26 -0
  54. package/dist/chunks/right-panel-eccz92qt.js +45 -0
  55. package/dist/chunks/section-registry-5pq32t0q.js +25 -0
  56. package/dist/chunks/select-2r16ez41.js +49 -0
  57. package/dist/chunks/split-g7nm1rgb.js +191 -0
  58. package/dist/chunks/studio-0hqbpbd0.js +62 -0
  59. package/dist/chunks/{studio-kryvsw6j.js → studio-1k325pwf.js} +48 -48
  60. package/dist/chunks/{studio-b55y6ewx.js → studio-1knfqgy7.js} +58 -58
  61. package/dist/chunks/{studio-2b946z26.js → studio-1z1kcjv4.js} +3628 -6095
  62. package/dist/chunks/studio-3773086z.js +111 -0
  63. package/dist/chunks/{studio-4r1pv6zf.js → studio-38emantv.js} +22 -5
  64. package/dist/chunks/{studio-x813zp48.js → studio-3rz5md06.js} +30 -30
  65. package/dist/chunks/{studio-ynxwkrzd.js → studio-4wbb9ct0.js} +1953 -1785
  66. package/dist/chunks/studio-5te5tqng.js +81 -0
  67. package/dist/chunks/studio-5wt9nvhd.js +4763 -0
  68. package/dist/chunks/{studio-p4ngc046.js → studio-6ewqv390.js} +9 -9
  69. package/dist/chunks/{studio-9ab8gqsm.js → studio-6nzaktvy.js} +7 -7
  70. package/dist/chunks/studio-6xa21ej9.js +28 -0
  71. package/dist/chunks/{studio-5ehhackm.js → studio-727xh0e3.js} +19 -19
  72. package/dist/chunks/{studio-gcye7qka.js → studio-7e11jpa9.js} +21 -21
  73. package/dist/chunks/{studio-q7v10cg2.js → studio-7r42c6ca.js} +17 -7
  74. package/dist/chunks/studio-7xnmgv66.js +13615 -0
  75. package/dist/chunks/studio-8scdew0e.js +258 -0
  76. package/dist/chunks/{studio-fbf92ckf.js → studio-93zafjcm.js} +275 -163
  77. package/dist/chunks/{studio-dg7zyt5x.js → studio-98b3z07n.js} +1 -1
  78. package/dist/chunks/studio-a79k90n9.js +1162 -0
  79. package/dist/chunks/studio-aj37eer3.js +422 -0
  80. package/dist/chunks/studio-b0k5tqgp.js +2432 -0
  81. package/dist/chunks/studio-b4s9eykd.js +2811 -0
  82. package/dist/chunks/{studio-f3wqjtk5.js → studio-d0300636.js} +5076 -18
  83. package/dist/chunks/{studio-b9b6t1dg.js → studio-e1f24eff.js} +5664 -5666
  84. package/dist/chunks/studio-e1pgga3k.js +839 -0
  85. package/dist/chunks/{studio-g1wdche0.js → studio-esrxgwh6.js} +80 -80
  86. package/dist/chunks/{studio-q43a5y9h.js → studio-g3jevyjt.js} +16 -16
  87. package/dist/chunks/studio-gb13095a.js +2806 -0
  88. package/dist/chunks/{studio-3n4ndrzh.js → studio-h4nvnjvz.js} +303 -303
  89. package/dist/chunks/{studio-dm19q43r.js → studio-hhvs4sdg.js} +10 -10
  90. package/dist/chunks/{studio-x4qkdat5.js → studio-js8nv53n.js} +1749 -2481
  91. package/dist/chunks/{studio-qjy2z9bv.js → studio-jxp12rnj.js} +32 -137
  92. package/dist/chunks/{studio-trxrabqf.js → studio-k75n7vhp.js} +527 -283
  93. package/dist/chunks/{studio-q9jd1a60.js → studio-kcgff4r0.js} +15 -18
  94. package/dist/chunks/studio-kkqkcp3d.js +17668 -0
  95. package/dist/chunks/studio-mhhyamxf.js +763 -0
  96. package/dist/chunks/{studio-cft9r4r7.js → studio-nq5yf5mp.js} +22 -22
  97. package/dist/chunks/{studio-685s0ytq.js → studio-nqgawfks.js} +572 -572
  98. package/dist/chunks/studio-nzzpvzx9.js +185 -0
  99. package/dist/chunks/{studio-xrapxwwc.js → studio-p1dw8wfw.js} +55 -29
  100. package/dist/chunks/{studio-3bqpr0zh.js → studio-pxbgypmg.js} +299 -110
  101. package/dist/chunks/studio-q0a3yk4n.js +33 -0
  102. package/dist/chunks/{studio-wcy8trfx.js → studio-q3x06vmj.js} +23 -22
  103. package/dist/chunks/{studio-6yw4y3my.js → studio-qhhm6hbt.js} +8 -8
  104. package/dist/chunks/studio-qk4bfsq2.js +362 -0
  105. package/dist/chunks/{studio-msd847zn.js → studio-qk90fgqm.js} +361 -90
  106. package/dist/chunks/{studio-jkftxyvz.js → studio-r6nvacqs.js} +5861 -2154
  107. package/dist/chunks/{studio-53n8bp04.js → studio-r6xmmtfh.js} +1 -1
  108. package/dist/chunks/{studio-tvgyw9xw.js → studio-rnyf3f8e.js} +83 -250
  109. package/dist/chunks/studio-rs76k67r.js +12 -0
  110. package/dist/chunks/studio-sbjyc8bt.js +954 -0
  111. package/dist/chunks/{studio-1wagb550.js → studio-syg2tadj.js} +11 -11
  112. package/dist/chunks/{studio-t5wqwzdh.js → studio-tjjk7jvk.js} +1 -1
  113. package/dist/chunks/studio-tqgryxwg.js +1171 -0
  114. package/dist/chunks/studio-try13h8c.js +8448 -0
  115. package/dist/chunks/studio-vfq8qpjt.js +1219 -0
  116. package/dist/chunks/studio-vhv5tgxm.js +51 -0
  117. package/dist/chunks/{studio-ahn3pdgx.js → studio-vw7mzp6z.js} +52 -38
  118. package/dist/chunks/studio-wqpngpsk.js +174 -0
  119. package/dist/chunks/studio-wqz6dggm.js +1356 -0
  120. package/dist/chunks/{studio-92ab2jqe.js → studio-y9zedyjn.js} +14 -14
  121. package/dist/chunks/studio-yxa81f45.js +12 -0
  122. package/dist/chunks/studio-zdn2g6dt.js +148 -0
  123. package/dist/chunks/swatch-group-t0n6h2rn.js +139 -0
  124. package/dist/chunks/tabs-wbp1cdws.js +156 -0
  125. package/dist/chunks/textfield-abk6qyee.js +73 -0
  126. package/dist/chunks/toast-780pvfbv.js +27 -0
  127. package/dist/chunks/toast-host-3sqv46sn.js +116 -0
  128. package/dist/chunks/toolbar-xbh5bhtr.js +194 -0
  129. package/dist/chunks/tooltip-eptb614w.js +369 -0
  130. package/dist/chunks/tree-a73p0pqm.js +367 -0
  131. package/dist/chunks/{tsMode-76kr53q0.js → tsMode-jy4m86rv.js} +83 -85
  132. package/dist/chunks/workspace-t55jdjbx.js +69 -0
  133. package/dist/chunks/{ws-client-6shc5rze.js → ws-client-ny4zc51r.js} +20 -22
  134. package/dist/iframe-entry.js +1873 -673
  135. package/dist/studio.js +52757 -36535
  136. package/dist/workers/editor.worker.js +1040 -1085
  137. package/dist/workers/json.worker.js +1946 -1991
  138. package/dist/workers/ts.worker.js +4960 -5005
  139. package/index.html +1 -0
  140. package/package.json +18 -52
  141. package/src/about/about-modal.ts +72 -123
  142. package/src/browse/library-commands.ts +20 -49
  143. package/src/browse/library-layouts.ts +87 -218
  144. package/src/browse/library-pane.ts +406 -438
  145. package/src/canvas/canvas-helpers.ts +0 -49
  146. package/src/canvas/canvas-live-render.ts +25 -2
  147. package/src/canvas/canvas-render.ts +666 -231
  148. package/src/canvas/canvas-surface.ts +0 -1
  149. package/src/canvas/canvas-utils.ts +333 -113
  150. package/src/canvas/dialog-path.ts +76 -0
  151. package/src/canvas/dialog-state.ts +67 -0
  152. package/src/canvas/diff-marks.ts +252 -0
  153. package/src/canvas/diff-toolbar.ts +349 -0
  154. package/src/canvas/diff-view.ts +123 -0
  155. package/src/canvas/edit-width-drag.ts +187 -0
  156. package/src/canvas/edit-width.ts +150 -0
  157. package/src/canvas/iframe-entry.ts +125 -8
  158. package/src/canvas/iframe-host.ts +271 -15
  159. package/src/canvas/iframe-interaction.ts +133 -13
  160. package/src/canvas/iframe-patch.ts +7 -1
  161. package/src/canvas/iframe-position.ts +5 -6
  162. package/src/canvas/iframe-protocol.ts +106 -5
  163. package/src/canvas/iframe-render.ts +373 -5
  164. package/src/canvas/iframe-slash.ts +2 -2
  165. package/src/canvas/iframe-subtree.ts +5 -8
  166. package/src/canvas/path-mapping.ts +25 -3
  167. package/src/canvas/popover-path.ts +106 -0
  168. package/src/canvas/popover-state.ts +155 -0
  169. package/src/canvas/surface-registry.ts +21 -10
  170. package/src/collab/presence-chips.ts +51 -73
  171. package/src/commands/app-commands.ts +10 -0
  172. package/src/commands/budget.ts +12 -0
  173. package/src/commands/command-args.ts +404 -6
  174. package/src/commands/defaults.ts +44 -14
  175. package/src/commands/live-context.ts +11 -5
  176. package/src/commands/reference.ts +12 -2
  177. package/src/commands/registry.ts +177 -10
  178. package/src/commands/run-reported.ts +120 -0
  179. package/src/content/entry-commands.ts +16 -23
  180. package/src/content/entry-editor.ts +144 -101
  181. package/src/editor/canvas-slash-bridge.ts +2 -2
  182. package/src/editor/context-menu.ts +49 -200
  183. package/src/editor/convert-to-component.ts +42 -82
  184. package/src/editor/convert-to-repeater.ts +132 -173
  185. package/src/editor/inline-edit.ts +11 -0
  186. package/src/editor/shortcuts.ts +76 -49
  187. package/src/editor/slash-menu.ts +150 -157
  188. package/src/files/components.ts +39 -0
  189. package/src/files/file-ops.ts +117 -11
  190. package/src/files/files.ts +944 -660
  191. package/src/files/json-layout.ts +474 -0
  192. package/src/files/serialize-document.ts +8 -1
  193. package/src/format/convert-file.ts +16 -10
  194. package/src/format/format-host.ts +50 -1
  195. package/src/github/github-auth.ts +71 -29
  196. package/src/github/github-publish.ts +57 -65
  197. package/src/grid/cell-editors.ts +46 -4
  198. package/src/grid/cell-popovers.ts +65 -62
  199. package/src/grid/grid-open.ts +86 -64
  200. package/src/grid/grid-panel.ts +390 -469
  201. package/src/grid/redirects-grid.ts +40 -44
  202. package/src/hosting/layout.ts +2 -0
  203. package/src/i18n/i18n-commands.ts +137 -62
  204. package/src/media/media-pane.ts +83 -133
  205. package/src/new-project/add-repo-modal.ts +125 -176
  206. package/src/new-project/import-tab.ts +181 -252
  207. package/src/new-project/location-fields.ts +93 -160
  208. package/src/new-project/new-project-modal.ts +376 -367
  209. package/src/packages/jxsuite-update.ts +76 -18
  210. package/src/packages/pull-package-sync.ts +5 -1
  211. package/src/panels/activity-panel.ts +137 -104
  212. package/src/panels/ai-chat/chat-markdown.ts +15 -13
  213. package/src/panels/ai-chat/chat-view.ts +307 -472
  214. package/src/panels/ai-chat/composer.ts +175 -163
  215. package/src/panels/ai-chat/sessions-view.ts +31 -62
  216. package/src/panels/ai-panel.ts +213 -185
  217. package/src/panels/block-action-bar.ts +444 -645
  218. package/src/panels/bottom-dock.ts +112 -47
  219. package/src/panels/chat-panel.ts +19 -14
  220. package/src/panels/data-explorer.ts +141 -102
  221. package/src/panels/data-grid.ts +183 -150
  222. package/src/panels/dnd.ts +75 -20
  223. package/src/panels/editors.ts +26 -19
  224. package/src/panels/elements-panel.ts +243 -186
  225. package/src/panels/empty-state.ts +26 -42
  226. package/src/panels/events-panel.ts +950 -729
  227. package/src/panels/formula-workspace.ts +434 -207
  228. package/src/panels/frontmatter-fields.ts +185 -153
  229. package/src/panels/frontmatter-panel.ts +411 -187
  230. package/src/panels/git-diff-open.ts +148 -0
  231. package/src/panels/git-panel.ts +679 -605
  232. package/src/panels/head-panel.ts +617 -435
  233. package/src/panels/i18n-panel.ts +148 -135
  234. package/src/panels/imports-panel.ts +388 -414
  235. package/src/panels/jump-bar.ts +175 -147
  236. package/src/panels/layers-panel.ts +785 -671
  237. package/src/panels/left-panel.ts +166 -94
  238. package/src/panels/navigator-panels.ts +1 -1
  239. package/src/panels/pane-context.ts +529 -677
  240. package/src/panels/pane-grid.ts +265 -241
  241. package/src/panels/panel-registry.ts +15 -4
  242. package/src/panels/problems-panel.ts +181 -99
  243. package/src/panels/properties-panel.ts +1525 -966
  244. package/src/panels/provenance.ts +31 -113
  245. package/src/panels/quick-search.ts +223 -184
  246. package/src/panels/right-panel.ts +135 -169
  247. package/src/panels/seo-modal.ts +346 -167
  248. package/src/panels/settings-menu.ts +114 -661
  249. package/src/panels/settings-pane.ts +102 -86
  250. package/src/panels/signals-panel.ts +1318 -1172
  251. package/src/panels/statement-editor.ts +556 -428
  252. package/src/panels/style-panel.ts +1367 -630
  253. package/src/panels/style-utils.ts +36 -32
  254. package/src/panels/stylebook-doc.ts +30 -73
  255. package/src/panels/stylebook-layers-panel.ts +202 -109
  256. package/src/panels/stylebook-panel.ts +124 -88
  257. package/src/panels/tab-strip.ts +386 -288
  258. package/src/platforms/cloud.ts +106 -16
  259. package/src/platforms/devserver.ts +13 -0
  260. package/src/publish/deploy-checklist.ts +124 -78
  261. package/src/publish/publish-commands.ts +4 -12
  262. package/src/publish/publish-panel.ts +134 -328
  263. package/src/services/a11y-report.ts +100 -43
  264. package/src/services/ai-command-tools.ts +538 -0
  265. package/src/services/ai-project-tools.ts +8 -2
  266. package/src/services/ai-session-store.ts +6 -0
  267. package/src/services/ai-system-prompt.ts +112 -24
  268. package/src/services/ai-tools.ts +36 -212
  269. package/src/services/ai-write-report.ts +174 -0
  270. package/src/services/document-assistant.ts +59 -8
  271. package/src/services/idle.ts +16 -14
  272. package/src/services/live-surfaces.ts +237 -0
  273. package/src/services/model-uri.ts +75 -0
  274. package/src/services/notify.ts +63 -6
  275. package/src/services/popover-report.ts +325 -0
  276. package/src/services/surface-registry.ts +56 -0
  277. package/src/services/tool-executor.ts +6 -0
  278. package/src/settings/contexts-section.ts +301 -299
  279. package/src/settings/contributed-section.ts +361 -222
  280. package/src/settings/css-vars-editor.ts +320 -325
  281. package/src/settings/defs-editor.ts +572 -535
  282. package/src/settings/dependencies-editor.ts +79 -107
  283. package/src/settings/extension-commands.ts +379 -0
  284. package/src/settings/extension-rows.ts +113 -0
  285. package/src/settings/extensions-section.ts +287 -0
  286. package/src/settings/general-settings.ts +130 -181
  287. package/src/settings/head-editor.ts +10 -305
  288. package/src/settings/locales-section.ts +146 -196
  289. package/src/settings/preferences-accounts.ts +1 -1
  290. package/src/settings/preferences-dialog.ts +350 -330
  291. package/src/settings/project-sections.ts +108 -181
  292. package/src/settings/schema-field-ui.ts +11 -399
  293. package/src/settings/section-registry.ts +8 -1
  294. package/src/settings/settings-document.ts +31 -29
  295. package/src/shell/tree.ts +42 -87
  296. package/src/shell.ts +48 -36
  297. package/src/studio.ts +104 -69
  298. package/src/style/token-ref.ts +0 -39
  299. package/src/surfaces/about.json +263 -0
  300. package/src/surfaces/about.ts +163 -0
  301. package/src/surfaces/add-repo.json +486 -0
  302. package/src/surfaces/add-repo.ts +236 -0
  303. package/src/surfaces/ai-chat.json +2185 -0
  304. package/src/surfaces/ai-chat.ts +549 -0
  305. package/src/surfaces/ai-credentials-form.json +332 -0
  306. package/src/surfaces/ai-credentials-form.ts +151 -0
  307. package/src/surfaces/ai-managed-connect.json +108 -0
  308. package/src/surfaces/ai-managed-connect.ts +123 -0
  309. package/src/surfaces/ai-model-picker.json +114 -0
  310. package/src/surfaces/ai-model-picker.ts +139 -0
  311. package/src/surfaces/block-action-bar.json +640 -0
  312. package/src/surfaces/block-action-bar.ts +368 -0
  313. package/src/surfaces/bottom-dock.json +154 -0
  314. package/src/surfaces/bottom-dock.ts +125 -0
  315. package/src/surfaces/canvas-stage.json +444 -0
  316. package/src/surfaces/canvas-stage.ts +253 -0
  317. package/src/surfaces/cf-account-picker.json +300 -0
  318. package/src/surfaces/cf-account-picker.ts +214 -0
  319. package/src/surfaces/commandbar.json +985 -0
  320. package/src/{panels/toolbar.ts → surfaces/commandbar.ts} +417 -391
  321. package/src/surfaces/convert-repeater.json +309 -0
  322. package/src/surfaces/convert-repeater.ts +276 -0
  323. package/src/surfaces/data-actions.json +157 -0
  324. package/src/surfaces/data-actions.ts +115 -0
  325. package/src/surfaces/dialog.json +289 -0
  326. package/src/surfaces/dialog.ts +343 -0
  327. package/src/surfaces/diff-toolbar.json +266 -0
  328. package/src/surfaces/diff-toolbar.ts +139 -0
  329. package/src/surfaces/doc-header.json +739 -0
  330. package/src/surfaces/doc-header.ts +223 -0
  331. package/src/surfaces/empty-state.json +152 -0
  332. package/src/surfaces/empty-state.ts +173 -0
  333. package/src/surfaces/entry-editor.json +281 -0
  334. package/src/surfaces/entry-editor.ts +191 -0
  335. package/src/surfaces/expression-editor.json +977 -0
  336. package/src/surfaces/expression-editor.ts +266 -0
  337. package/src/surfaces/files-panel.json +592 -0
  338. package/src/surfaces/files-panel.ts +301 -0
  339. package/src/surfaces/formula-palette.json +364 -0
  340. package/src/surfaces/formula-palette.ts +340 -0
  341. package/src/surfaces/git-panel.json +1822 -0
  342. package/src/surfaces/git-panel.ts +272 -0
  343. package/src/surfaces/github-auth.json +112 -0
  344. package/src/surfaces/github-auth.ts +139 -0
  345. package/src/surfaces/github-publish.json +206 -0
  346. package/src/surfaces/github-publish.ts +169 -0
  347. package/src/surfaces/grid-cell.json +218 -0
  348. package/src/surfaces/grid-cell.ts +120 -0
  349. package/src/surfaces/grid-open.json +147 -0
  350. package/src/surfaces/grid-open.ts +87 -0
  351. package/src/surfaces/grid-panel.json +706 -0
  352. package/src/surfaces/grid-panel.ts +206 -0
  353. package/src/surfaces/grid-replace.json +179 -0
  354. package/src/surfaces/grid-replace.ts +89 -0
  355. package/src/surfaces/grid-views.json +446 -0
  356. package/src/surfaces/grid-views.ts +172 -0
  357. package/src/surfaces/inspector-dock.json +187 -0
  358. package/src/surfaces/inspector-dock.ts +161 -0
  359. package/src/surfaces/jump-bar.json +243 -0
  360. package/src/surfaces/jump-bar.ts +129 -0
  361. package/src/surfaces/jxsuite-update.json +146 -0
  362. package/src/surfaces/jxsuite-update.ts +149 -0
  363. package/src/surfaces/library-pane.json +1509 -0
  364. package/src/surfaces/library-pane.ts +363 -0
  365. package/src/surfaces/logic-panel.json +1949 -0
  366. package/src/surfaces/logic-panel.ts +369 -0
  367. package/src/surfaces/logic-workspace.json +685 -0
  368. package/src/surfaces/logic-workspace.ts +238 -0
  369. package/src/surfaces/media-browser.json +303 -0
  370. package/src/surfaces/media-browser.ts +145 -0
  371. package/src/surfaces/media-field.json +163 -0
  372. package/src/surfaces/media-field.ts +116 -0
  373. package/src/surfaces/media-pane.json +513 -0
  374. package/src/surfaces/media-pane.ts +197 -0
  375. package/src/surfaces/menu.json +232 -0
  376. package/src/surfaces/menu.ts +375 -0
  377. package/src/surfaces/navigator-dock.json +113 -0
  378. package/src/surfaces/navigator-dock.ts +130 -0
  379. package/src/surfaces/new-project.json +1654 -0
  380. package/src/surfaces/new-project.ts +411 -0
  381. package/src/surfaces/palette.json +535 -0
  382. package/src/surfaces/pane-context.json +1497 -0
  383. package/src/surfaces/pane-context.ts +513 -0
  384. package/src/surfaces/pane-grid.json +188 -0
  385. package/src/surfaces/pane-grid.ts +250 -0
  386. package/src/surfaces/panel-activity.json +563 -0
  387. package/src/surfaces/panel-activity.ts +187 -0
  388. package/src/surfaces/panel-data.json +141 -0
  389. package/src/surfaces/panel-data.ts +156 -0
  390. package/src/surfaces/panel-deploy-checklist.json +283 -0
  391. package/src/surfaces/panel-deploy-checklist.ts +175 -0
  392. package/src/surfaces/panel-elements.json +367 -0
  393. package/src/surfaces/panel-elements.ts +175 -0
  394. package/src/surfaces/panel-i18n.json +569 -0
  395. package/src/surfaces/panel-i18n.ts +212 -0
  396. package/src/surfaces/panel-imports.json +780 -0
  397. package/src/surfaces/panel-imports.ts +209 -0
  398. package/src/surfaces/panel-outline.json +734 -0
  399. package/src/surfaces/panel-outline.ts +326 -0
  400. package/src/surfaces/panel-page.json +1017 -0
  401. package/src/surfaces/panel-page.ts +240 -0
  402. package/src/surfaces/panel-problems.json +497 -0
  403. package/src/surfaces/panel-problems.ts +157 -0
  404. package/src/surfaces/panel-signals.json +1973 -0
  405. package/src/surfaces/panel-signals.ts +436 -0
  406. package/src/surfaces/panel-stylebook-layers.json +317 -0
  407. package/src/surfaces/panel-stylebook-layers.ts +155 -0
  408. package/src/surfaces/preferences.json +850 -0
  409. package/src/surfaces/preferences.ts +332 -0
  410. package/src/surfaces/progress-modal.json +110 -0
  411. package/src/surfaces/progress-modal.ts +150 -0
  412. package/src/surfaces/properties-panel.json +1578 -0
  413. package/src/surfaces/properties-panel.ts +337 -0
  414. package/src/surfaces/publish.json +945 -0
  415. package/src/surfaces/publish.ts +392 -0
  416. package/src/surfaces/push-plan.json +110 -0
  417. package/src/surfaces/push-plan.ts +87 -0
  418. package/src/surfaces/rail.json +255 -0
  419. package/src/surfaces/rail.ts +206 -0
  420. package/src/surfaces/reference-field.json +191 -0
  421. package/src/surfaces/reference-field.ts +168 -0
  422. package/src/surfaces/schema-builder.json +1011 -0
  423. package/src/surfaces/schema-builder.ts +181 -0
  424. package/src/surfaces/schema-form.json +1013 -0
  425. package/src/surfaces/schema-form.ts +287 -0
  426. package/src/surfaces/secret-field.json +60 -0
  427. package/src/surfaces/secret-field.ts +146 -0
  428. package/src/surfaces/seo.json +932 -0
  429. package/src/surfaces/seo.ts +334 -0
  430. package/src/surfaces/settings-contexts.json +538 -0
  431. package/src/surfaces/settings-contexts.ts +196 -0
  432. package/src/surfaces/settings-contributed.json +489 -0
  433. package/src/surfaces/settings-contributed.ts +199 -0
  434. package/src/surfaces/settings-css-vars.json +820 -0
  435. package/src/surfaces/settings-css-vars.ts +199 -0
  436. package/src/surfaces/settings-defs.json +1363 -0
  437. package/src/surfaces/settings-defs.ts +232 -0
  438. package/src/surfaces/settings-deploy.json +108 -0
  439. package/src/surfaces/settings-deploy.ts +135 -0
  440. package/src/surfaces/settings-extensions.json +486 -0
  441. package/src/surfaces/settings-extensions.ts +201 -0
  442. package/src/surfaces/settings-head.json +779 -0
  443. package/src/surfaces/settings-head.ts +397 -0
  444. package/src/surfaces/settings-locales.json +420 -0
  445. package/src/surfaces/settings-locales.ts +137 -0
  446. package/src/surfaces/settings-overview.json +423 -0
  447. package/src/surfaces/settings-overview.ts +218 -0
  448. package/src/surfaces/settings-packages.json +549 -0
  449. package/src/surfaces/settings-packages.ts +158 -0
  450. package/src/surfaces/settings-pane.json +147 -0
  451. package/src/surfaces/settings-pane.ts +150 -0
  452. package/src/surfaces/settings-rawjson.json +104 -0
  453. package/src/surfaces/settings-rawjson.ts +107 -0
  454. package/src/surfaces/shell.json +99 -0
  455. package/src/surfaces/shell.ts +30 -0
  456. package/src/surfaces/slash-menu.json +180 -0
  457. package/src/surfaces/slash-menu.ts +272 -0
  458. package/src/surfaces/statements.json +607 -0
  459. package/src/surfaces/statements.ts +238 -0
  460. package/src/surfaces/statusbar.json +94 -0
  461. package/src/{panels → surfaces}/statusbar.ts +164 -90
  462. package/src/surfaces/style-panel.json +1643 -0
  463. package/src/surfaces/style-panel.ts +338 -0
  464. package/src/surfaces/stylebook-chrome.json +122 -0
  465. package/src/surfaces/stylebook-chrome.ts +122 -0
  466. package/src/surfaces/tab-strip.json +448 -0
  467. package/src/surfaces/tab-strip.ts +200 -0
  468. package/src/surfaces/target-line.json +419 -0
  469. package/src/surfaces/target-line.ts +349 -0
  470. package/src/surfaces/toasts.json +189 -0
  471. package/src/surfaces/welcome.json +571 -0
  472. package/src/surfaces/welcome.ts +338 -0
  473. package/src/tabs/project-config.ts +111 -21
  474. package/src/tabs/tab.ts +52 -1
  475. package/src/types.ts +22 -0
  476. package/src/ui/ai-credentials-form.ts +104 -100
  477. package/src/ui/ai-managed-connect.ts +54 -36
  478. package/src/ui/ai-model-picker.ts +75 -47
  479. package/src/ui/cf-account-picker.ts +76 -141
  480. package/src/ui/color-selector.ts +80 -301
  481. package/src/ui/dynamic-slot.ts +43 -283
  482. package/src/ui/expression-editor.ts +797 -576
  483. package/src/ui/field-input.ts +8 -181
  484. package/src/ui/form-controls.ts +838 -366
  485. package/src/ui/formula-chips.ts +80 -85
  486. package/src/ui/kit.ts +33 -0
  487. package/src/ui/layers.ts +296 -593
  488. package/src/ui/media-picker.ts +203 -284
  489. package/src/ui/panel-resize.ts +251 -64
  490. package/src/ui/popover-surface.ts +153 -0
  491. package/src/ui/progress-modal.ts +22 -60
  492. package/src/ui/regions.ts +13 -7
  493. package/src/ui/schema-form.ts +906 -440
  494. package/src/ui/surface.ts +122 -0
  495. package/src/ui/unit-selector.ts +15 -131
  496. package/src/ui/value-source.ts +14 -0
  497. package/src/ui/virtual-window.ts +88 -9
  498. package/src/utils/canvas-media.ts +72 -0
  499. package/src/utils/edit-display.ts +7 -2
  500. package/src/utils/element-selectors.ts +69 -0
  501. package/src/utils/link-target.ts +2 -2
  502. package/src/utils/studio-utils.ts +0 -10
  503. package/src/view.ts +15 -0
  504. package/src/workspace/pane-derive.ts +36 -14
  505. package/src/workspace/workspace.ts +75 -6
  506. package/styles/canvas.css +72 -467
  507. package/styles/forced-colors.css +48 -82
  508. package/styles/forced-colors.json +41 -0
  509. package/styles/inspector.css +2 -1301
  510. package/styles/overlays.css +96 -2823
  511. package/styles/panels.css +6 -1423
  512. package/styles/shell-frame.css +272 -0
  513. package/styles/shell-frame.json +227 -0
  514. package/styles/shell.css +0 -1568
  515. package/styles/tokens.css +65 -136
  516. package/styles/tokens.json +84 -0
  517. package/dist/chunks/Overlay.dev-etqjwyf9.js +0 -23
  518. package/dist/chunks/adapter-jkcyhgtr.js +0 -14
  519. package/dist/chunks/cf-account-picker-en86v7x7.js +0 -163
  520. package/dist/chunks/cf-settings-45fgyx8y.js +0 -21
  521. package/dist/chunks/components-zmx10t62.js +0 -21
  522. package/dist/chunks/content-source-48xg86wj.js +0 -49
  523. package/dist/chunks/convert-to-repeater-43tfn7cs.js +0 -268
  524. package/dist/chunks/editor-cptq5jp1.js +0 -37
  525. package/dist/chunks/entry-commands-e63f1xc0.js +0 -46
  526. package/dist/chunks/extension-sections-txv08xxg.js +0 -311
  527. package/dist/chunks/file-ops-wbh4hhsx.js +0 -48
  528. package/dist/chunks/files-3kfkwhk4.js +0 -93
  529. package/dist/chunks/flow-qbfgrpeh.js +0 -634
  530. package/dist/chunks/focus-trap.esm-9t2drp0g.js +0 -1025
  531. package/dist/chunks/focus-visible-6eg70z18.js +0 -167
  532. package/dist/chunks/format-host-w16q81tf.js +0 -43
  533. package/dist/chunks/fs-events-hrrg328g.js +0 -21
  534. package/dist/chunks/git-panel-532whr1y.js +0 -59
  535. package/dist/chunks/index-zqxmqxmh.js +0 -109
  536. package/dist/chunks/jx-validate-8er6gbxy.js +0 -19
  537. package/dist/chunks/layers-panel-07hm7g5j.js +0 -67
  538. package/dist/chunks/layers-q75tj2mf.js +0 -45
  539. package/dist/chunks/lit-html-j055mkh8.js +0 -22
  540. package/dist/chunks/monaco-buffer-dqw0xxpx.js +0 -25
  541. package/dist/chunks/notify-yjm79n4s.js +0 -30
  542. package/dist/chunks/parse-24d0gay3.js +0 -19
  543. package/dist/chunks/platform-ba1j1gbh.js +0 -16
  544. package/dist/chunks/publish-panel-v9st96ja.js +0 -29
  545. package/dist/chunks/quick-search-zccjp6gv.js +0 -66
  546. package/dist/chunks/references-3qx8fkyp.js +0 -29
  547. package/dist/chunks/right-panel-vm3b6kwy.js +0 -46
  548. package/dist/chunks/section-registry-sx1ykvkw.js +0 -30
  549. package/dist/chunks/sp-overlay.dev-qgvhnxf4.js +0 -18
  550. package/dist/chunks/sp-popover.dev-n2etmqdp.js +0 -9
  551. package/dist/chunks/sp-progress-circle.dev-hryhj0es.js +0 -15
  552. package/dist/chunks/sp-tooltip.dev-4sastdnw.js +0 -15
  553. package/dist/chunks/sp-tray.dev-tkbscm06.js +0 -199
  554. package/dist/chunks/studio-0a5qrh01.js +0 -3
  555. package/dist/chunks/studio-0bq6eh7v.js +0 -12
  556. package/dist/chunks/studio-18j3bmcz.js +0 -14
  557. package/dist/chunks/studio-1ngbejft.js +0 -181
  558. package/dist/chunks/studio-4b5z1x43.js +0 -424
  559. package/dist/chunks/studio-4n2b5gzb.js +0 -357
  560. package/dist/chunks/studio-4rzyrtjz.js +0 -426
  561. package/dist/chunks/studio-5fx3g9jg.js +0 -4325
  562. package/dist/chunks/studio-5myknm0a.js +0 -1903
  563. package/dist/chunks/studio-7afd21nw.js +0 -67
  564. package/dist/chunks/studio-7nte2hj4.js +0 -613
  565. package/dist/chunks/studio-8jpzqk5s.js +0 -128
  566. package/dist/chunks/studio-8q517dfr.js +0 -24
  567. package/dist/chunks/studio-950k0dx6.js +0 -6939
  568. package/dist/chunks/studio-9n4mrmnb.js +0 -184
  569. package/dist/chunks/studio-a0tswy0w.js +0 -58
  570. package/dist/chunks/studio-ahnzd9rg.js +0 -23
  571. package/dist/chunks/studio-bgxt93ga.js +0 -62
  572. package/dist/chunks/studio-cmb03bg5.js +0 -13890
  573. package/dist/chunks/studio-d1ks410h.js +0 -175
  574. package/dist/chunks/studio-ef49pnzx.js +0 -387
  575. package/dist/chunks/studio-eqq1w638.js +0 -113
  576. package/dist/chunks/studio-ew0djmhg.js +0 -341
  577. package/dist/chunks/studio-gfgb8pe6.js +0 -1652
  578. package/dist/chunks/studio-h4rxscfc.js +0 -10
  579. package/dist/chunks/studio-jc994dnr.js +0 -1066
  580. package/dist/chunks/studio-kyh9avvv.js +0 -28
  581. package/dist/chunks/studio-m3hwn7y1.js +0 -120
  582. package/dist/chunks/studio-mtfnaqs9.js +0 -659
  583. package/dist/chunks/studio-n6j9t10q.js +0 -318
  584. package/dist/chunks/studio-n8b9wqwy.js +0 -291
  585. package/dist/chunks/studio-qcy05dp8.js +0 -1743
  586. package/dist/chunks/studio-qq6jym04.js +0 -53
  587. package/dist/chunks/studio-rdx8jcxy.js +0 -83
  588. package/dist/chunks/studio-rn9ta2mz.js +0 -111
  589. package/dist/chunks/studio-t7qb9db8.js +0 -665
  590. package/dist/chunks/studio-tmc5emrw.js +0 -8
  591. package/dist/chunks/studio-z6nw2ek2.js +0 -18
  592. package/dist/chunks/studio-zczps70q.js +0 -378
  593. package/dist/chunks/studio-zqazsct2.js +0 -1823
  594. package/dist/chunks/workspace-fjx52ryv.js +0 -89
  595. package/src/panels/activity-bar.ts +0 -251
  596. package/src/panels/panel-scheduler.ts +0 -219
  597. package/src/panels/style-inputs.ts +0 -237
  598. package/src/panels/target-line.ts +0 -274
  599. package/src/panels/welcome-screen.ts +0 -346
  600. package/src/ui/button-group.ts +0 -102
  601. package/src/ui/choice-field.ts +0 -72
  602. package/src/ui/field-row.ts +0 -249
  603. package/src/ui/formula-palette.ts +0 -213
  604. package/src/ui/icons.ts +0 -52
  605. package/src/ui/jx-theme.ts +0 -130
  606. package/src/ui/spectrum.ts +0 -340
  607. package/src/ui/value-selector.ts +0 -174
  608. package/src/ui/widgets.ts +0 -172
  609. /package/dist/chunks/{javascript-s56a8dpk.css → javascript-4abzjcy9.css} +0 -0
  610. /package/dist/chunks/{jsonMode-zr9sw0c7.css → jsonMode-vvmpmk34.css} +0 -0
  611. /package/dist/chunks/{monaco-setup-pav68602.css → monaco-setup-8vbyqnhr.css} +0 -0
  612. /package/dist/chunks/{tsMode-ef187txx.css → tsMode-hnxxb73h.css} +0 -0
@@ -0,0 +1,1162 @@
1
+ import {
2
+ getPlatform2
3
+ } from "./studio-6nzaktvy.js";
4
+ import {
5
+ flattenTree,
6
+ nodeLabel,
7
+ projectState
8
+ } from "./studio-6ewqv390.js";
9
+ import {
10
+ loadFormats2,
11
+ formatByExtension2,
12
+ documentExtensions2
13
+ } from "./studio-vw7mzp6z.js";
14
+ import {
15
+ activeTab2
16
+ } from "./studio-k75n7vhp.js";
17
+ import {
18
+ registerSurface,
19
+ mountSurface,
20
+ runReported,
21
+ runActiveReported,
22
+ getLayerSlot2
23
+ } from "./studio-vfq8qpjt.js";
24
+ import {
25
+ activeRegistry
26
+ } from "./studio-kkqkcp3d.js";
27
+ import {
28
+ reactive
29
+ } from "./studio-p1dw8wfw.js";
30
+ import {
31
+ getRecentProjects,
32
+ getRecentFiles,
33
+ trackRecentFile,
34
+ openFileInTab2
35
+ } from "./studio-b0k5tqgp.js";
36
+ // src/surfaces/palette.json
37
+ var palette_default = {
38
+ $schema: "https://jxsuite.com/schema/v1",
39
+ $id: "StudioPalette",
40
+ $description: 'The command palette: a `role="combobox"` field over the kit\'s `jx-listbox`, whose rows are `jx-option`s the host projects. `rows` is the ranked set for the current mode and query; `activeId` is the highlight, and it is ONE string — the id the field points `aria-activedescendant` at and the id the listbox is handed as `active`, so a key moves the caret without the rows reconciling and no row re-decides its own flag. The FIELD is not a `jx-combobox`: this one carries a mode chip inside its box, its Enter runs a command rather than committing a value, and its panel is a centred scrim rather than a popover under a control. Every gesture calls back into panels/quick-search.ts, which owns the modes, the ranking, the recents and what a row does.',
41
+ tagName: "div",
42
+ attributes: {
43
+ part: "palette"
44
+ },
45
+ style: {
46
+ display: "contents",
47
+ '& [part="overlay"]': {
48
+ position: "fixed",
49
+ inset: "0",
50
+ zIndex: "1000",
51
+ display: "flex",
52
+ justifyContent: "center",
53
+ paddingTop: "60px",
54
+ background: "rgba(0, 0, 0, 0.4)"
55
+ },
56
+ '& [part="panel"]': {
57
+ width: "560px",
58
+ maxWidth: "calc(100vw - 32px)",
59
+ maxHeight: "420px",
60
+ display: "flex",
61
+ flexDirection: "column",
62
+ alignSelf: "flex-start",
63
+ background: "var(--jx-bg-overlay)",
64
+ border: "1px solid var(--jx-border)",
65
+ borderRadius: "var(--jx-radius-md)",
66
+ boxShadow: "var(--jx-shadow-dialog)",
67
+ color: "var(--jx-fg)",
68
+ fontFamily: "var(--jx-font-sans)",
69
+ overflow: "hidden"
70
+ },
71
+ '& [part="input-row"]': {
72
+ display: "flex",
73
+ alignItems: "center",
74
+ gap: "var(--jx-space-3)",
75
+ paddingLeft: "var(--jx-space-4)",
76
+ background: "var(--jx-bg-input)",
77
+ borderBottom: "1px solid var(--jx-border)"
78
+ },
79
+ '& [part="chip-slot"], & [part="empty-slot"], & [part="section-slot"], & [part="trailing-slot"]': {
80
+ display: "contents"
81
+ },
82
+ '& [part="chip"]': {
83
+ display: "inline-flex",
84
+ alignItems: "center",
85
+ gap: "var(--jx-space-1)",
86
+ flexShrink: "0",
87
+ padding: "2px var(--jx-space-1) 2px var(--jx-space-3)",
88
+ borderRadius: "var(--jx-radius-sm)",
89
+ background: "var(--jx-accent-solid)",
90
+ color: "var(--jx-accent-fg)",
91
+ fontSize: "var(--jx-text-sm)"
92
+ },
93
+ '& [part="chip-remove"] > [part="control"]': {
94
+ color: "inherit",
95
+ opacity: "0.8",
96
+ ":hover": {
97
+ opacity: "1",
98
+ background: "transparent"
99
+ }
100
+ },
101
+ '& [part="input"]': {
102
+ flex: "1",
103
+ minWidth: "0",
104
+ padding: "var(--jx-space-4) var(--jx-space-5) var(--jx-space-4) var(--jx-space-1)",
105
+ font: "inherit",
106
+ fontSize: "var(--jx-text-lg)",
107
+ border: "none",
108
+ outline: "none",
109
+ background: "none",
110
+ color: "var(--jx-fg)",
111
+ "::placeholder": {
112
+ color: "var(--jx-fg-muted)"
113
+ },
114
+ ":focus-visible": {
115
+ outline: "var(--jx-focus-ring)",
116
+ outlineOffset: "-2px"
117
+ }
118
+ },
119
+ '& [part="results"]': {
120
+ $description: "The list is the kit's: a `jx-listbox` of `jx-option`, so the highlight is ONE id — `active`, the same string the field points `aria-activedescendant` at — and the listbox's sidecar is the single writer of every row's `selected`. What this surface still decides is density. The kit's row pads itself by `--jx-space-3`; the other half of the 16px optical margin the panel has always had sits here, on the list, so the heading, the rows and the empty sentence line up on one edge instead of each naming it.",
121
+ flex: "1",
122
+ paddingInline: "var(--jx-space-3)"
123
+ },
124
+ '& [part="option"] [part="label"]': {
125
+ fontWeight: "500"
126
+ },
127
+ '& [part="option"] [part="description"]': {
128
+ $description: "A `jx-select` row's note is a category at the END of the row, so the kit pushes it there with an auto margin. A palette row's note is a CONTINUATION of its name — the file's directory, the command's category — and the far edge belongs to the chord, which is how this surface teaches the keyboard it replaced. So the auto margin moves to the end slot.",
129
+ marginInlineStart: "0"
130
+ },
131
+ '& [part="option"] [part="end"]': {
132
+ marginInlineStart: "auto"
133
+ },
134
+ '& [part="option"][aria-disabled="true"]': {
135
+ $description: "An unavailable command is greyed with its `requires` sentence as the subtitle, and that sentence is the reason the row is on screen at all. The kit fades the whole row to 0.45, which would take a muted grey below any readable contrast — so the row keeps its ink and only the name and the glyph dim.",
136
+ opacity: "1"
137
+ },
138
+ '& [part="option"][aria-disabled="true"] [part="label"], & [part="option"][aria-disabled="true"] [part="icon"]': {
139
+ opacity: "0.45"
140
+ },
141
+ '& [part="chord"]': {
142
+ flexShrink: "0",
143
+ fontFamily: "inherit",
144
+ fontSize: "var(--jx-text-xs)",
145
+ color: "var(--jx-fg-muted)",
146
+ border: "1px solid var(--jx-border)",
147
+ borderRadius: "var(--jx-radius-sm)",
148
+ padding: "0 5px"
149
+ },
150
+ '& [part="option"][aria-selected="true"] [part="chord"]': {
151
+ color: "inherit",
152
+ borderColor: "currentColor"
153
+ },
154
+ '& [part="badge"]': {
155
+ fontSize: "var(--jx-text-xs)",
156
+ padding: "1px var(--jx-space-2)",
157
+ borderRadius: "var(--jx-radius-sm)",
158
+ background: "var(--jx-border)",
159
+ color: "var(--jx-fg-dim)"
160
+ },
161
+ '& [part="hint"]': {
162
+ padding: "var(--jx-space-2) var(--jx-space-5)",
163
+ borderTop: "1px solid var(--jx-border)",
164
+ color: "var(--jx-fg-muted)",
165
+ fontSize: "var(--jx-text-xs)"
166
+ },
167
+ '& [part="hint"] kbd': {
168
+ fontFamily: "inherit",
169
+ color: "var(--jx-fg-dim)"
170
+ }
171
+ },
172
+ $switch: {
173
+ $ref: "#/state/open"
174
+ },
175
+ cases: {
176
+ true: {
177
+ tagName: "div",
178
+ attributes: {
179
+ part: "overlay"
180
+ },
181
+ onclick: {
182
+ $prototype: "Function",
183
+ body: [
184
+ {
185
+ operator: "call",
186
+ target: {
187
+ $ref: "#/state/close"
188
+ },
189
+ value: []
190
+ }
191
+ ]
192
+ },
193
+ children: [
194
+ {
195
+ tagName: "div",
196
+ attributes: {
197
+ part: "panel"
198
+ },
199
+ onclick: {
200
+ $prototype: "Function",
201
+ body: [
202
+ {
203
+ stopPropagation: true
204
+ }
205
+ ]
206
+ },
207
+ children: [
208
+ {
209
+ tagName: "div",
210
+ attributes: {
211
+ part: "input-row"
212
+ },
213
+ children: [
214
+ {
215
+ tagName: "span",
216
+ attributes: {
217
+ part: "chip-slot",
218
+ role: "none"
219
+ },
220
+ $switch: {
221
+ $ref: "#/state/hasChip"
222
+ },
223
+ cases: {
224
+ true: {
225
+ tagName: "span",
226
+ attributes: {
227
+ part: "chip"
228
+ },
229
+ children: [
230
+ {
231
+ tagName: "span",
232
+ attributes: {
233
+ part: "chip-label"
234
+ },
235
+ textContent: "${state.chipLabel}"
236
+ },
237
+ {
238
+ tagName: "jx-action-button",
239
+ $props: {
240
+ label: "Clear mode",
241
+ hint: "Clear mode (Backspace)",
242
+ icon: "x",
243
+ size: "sm"
244
+ },
245
+ attributes: {
246
+ part: "chip-remove"
247
+ },
248
+ onclick: {
249
+ $prototype: "Function",
250
+ body: [
251
+ {
252
+ operator: "call",
253
+ target: {
254
+ $ref: "#/state/clearMode"
255
+ },
256
+ value: []
257
+ }
258
+ ]
259
+ }
260
+ }
261
+ ]
262
+ }
263
+ }
264
+ },
265
+ {
266
+ tagName: "input",
267
+ attributes: {
268
+ part: "input",
269
+ type: "text",
270
+ role: "combobox",
271
+ "aria-controls": "quick-search-listbox",
272
+ "aria-expanded": "${state.expanded ? 'true' : 'false'}",
273
+ "aria-activedescendant": "${state.activeId || null}",
274
+ "aria-autocomplete": "list",
275
+ "aria-label": "${state.placeholder}",
276
+ placeholder: "${state.placeholder}"
277
+ },
278
+ value: {
279
+ $ref: "#/state/query"
280
+ },
281
+ oninput: {
282
+ $prototype: "Function",
283
+ body: [
284
+ {
285
+ operator: "call",
286
+ target: {
287
+ $ref: "#/state/input"
288
+ },
289
+ value: [
290
+ {
291
+ $ref: "event#/target/value"
292
+ }
293
+ ]
294
+ }
295
+ ]
296
+ },
297
+ onkeydown: {
298
+ $prototype: "Function",
299
+ body: [
300
+ {
301
+ $switch: {
302
+ $ref: "event#/key"
303
+ },
304
+ cases: {
305
+ ArrowDown: [
306
+ {
307
+ preventDefault: true
308
+ },
309
+ {
310
+ operator: "call",
311
+ target: {
312
+ $ref: "#/state/move"
313
+ },
314
+ value: [1]
315
+ }
316
+ ],
317
+ ArrowUp: [
318
+ {
319
+ preventDefault: true
320
+ },
321
+ {
322
+ operator: "call",
323
+ target: {
324
+ $ref: "#/state/move"
325
+ },
326
+ value: [-1]
327
+ }
328
+ ],
329
+ Enter: [
330
+ {
331
+ preventDefault: true
332
+ },
333
+ {
334
+ operator: "call",
335
+ target: {
336
+ $ref: "#/state/activate"
337
+ },
338
+ value: []
339
+ }
340
+ ],
341
+ Escape: [
342
+ {
343
+ preventDefault: true
344
+ },
345
+ {
346
+ operator: "call",
347
+ target: {
348
+ $ref: "#/state/close"
349
+ },
350
+ value: []
351
+ }
352
+ ],
353
+ Backspace: [
354
+ {
355
+ $switch: {
356
+ $ref: "#/state/canClearMode"
357
+ },
358
+ cases: {
359
+ true: [
360
+ {
361
+ preventDefault: true
362
+ },
363
+ {
364
+ operator: "call",
365
+ target: {
366
+ $ref: "#/state/clearMode"
367
+ },
368
+ value: []
369
+ }
370
+ ]
371
+ }
372
+ }
373
+ ]
374
+ }
375
+ }
376
+ ]
377
+ }
378
+ }
379
+ ]
380
+ },
381
+ {
382
+ tagName: "jx-listbox",
383
+ attributes: {
384
+ part: "results",
385
+ id: "quick-search-listbox"
386
+ },
387
+ $props: {
388
+ label: "Results",
389
+ active: "${state.activeId}"
390
+ },
391
+ onselect: {
392
+ $prototype: "Function",
393
+ body: [
394
+ {
395
+ operator: "call",
396
+ target: {
397
+ $ref: "#/state/activateRow"
398
+ },
399
+ value: [
400
+ {
401
+ $ref: "event#/detail"
402
+ }
403
+ ]
404
+ }
405
+ ],
406
+ description: "One handler for every row, because a row's `select` bubbles. The detail is the row's `value`, which is the index it occupies in `rows` — the same number a hover names, and the number the id is built from."
407
+ },
408
+ children: [
409
+ {
410
+ tagName: "div",
411
+ attributes: {
412
+ part: "empty-slot",
413
+ role: "none"
414
+ },
415
+ $switch: {
416
+ $ref: "#/state/isEmpty"
417
+ },
418
+ cases: {
419
+ true: {
420
+ tagName: "div",
421
+ attributes: {
422
+ part: "empty"
423
+ },
424
+ textContent: "${state.emptyHint}"
425
+ }
426
+ }
427
+ },
428
+ {
429
+ tagName: "div",
430
+ attributes: {
431
+ part: "section-slot",
432
+ role: "none"
433
+ },
434
+ $switch: {
435
+ $ref: "#/state/showSection"
436
+ },
437
+ cases: {
438
+ true: {
439
+ tagName: "div",
440
+ attributes: {
441
+ part: "group-heading"
442
+ },
443
+ textContent: "${state.sectionLabel}"
444
+ }
445
+ }
446
+ },
447
+ {
448
+ $prototype: "Array",
449
+ items: {
450
+ $ref: "#/state/rows"
451
+ },
452
+ key: {
453
+ $ref: "$map/item/key"
454
+ },
455
+ map: {
456
+ tagName: "jx-option",
457
+ attributes: {
458
+ part: "option",
459
+ id: "quick-search-option-${$map.index}",
460
+ "data-kind": "${$map.item.kind}"
461
+ },
462
+ $props: {
463
+ value: "${$map.index}",
464
+ label: {
465
+ $ref: "$map/item/name"
466
+ },
467
+ description: {
468
+ $ref: "$map/item/detail"
469
+ },
470
+ disabled: {
471
+ $ref: "$map/item/disabled"
472
+ }
473
+ },
474
+ onmouseenter: {
475
+ $prototype: "Function",
476
+ body: [
477
+ {
478
+ operator: "call",
479
+ target: {
480
+ $ref: "#/state/hover"
481
+ },
482
+ value: [
483
+ {
484
+ $ref: "$map/index"
485
+ }
486
+ ]
487
+ }
488
+ ]
489
+ },
490
+ children: [
491
+ {
492
+ tagName: "jx-icon",
493
+ attributes: {
494
+ slot: "icon"
495
+ },
496
+ $props: {
497
+ name: {
498
+ $ref: "$map/item/icon"
499
+ }
500
+ }
501
+ },
502
+ {
503
+ tagName: "span",
504
+ attributes: {
505
+ slot: "end",
506
+ part: "trailing-slot"
507
+ },
508
+ $switch: {
509
+ $ref: "$map/item/trailing"
510
+ },
511
+ cases: {
512
+ chord: {
513
+ tagName: "kbd",
514
+ attributes: {
515
+ part: "chord"
516
+ },
517
+ textContent: "${$map.item.chord}"
518
+ },
519
+ recent: {
520
+ tagName: "span",
521
+ attributes: {
522
+ part: "badge"
523
+ },
524
+ textContent: "recent"
525
+ }
526
+ }
527
+ }
528
+ ]
529
+ }
530
+ }
531
+ ]
532
+ },
533
+ {
534
+ tagName: "div",
535
+ attributes: {
536
+ part: "hint"
537
+ },
538
+ children: [
539
+ {
540
+ tagName: "kbd",
541
+ textContent: "↑↓"
542
+ },
543
+ " move · ",
544
+ {
545
+ tagName: "kbd",
546
+ textContent: "↵"
547
+ },
548
+ " run · ",
549
+ {
550
+ tagName: "kbd",
551
+ textContent: "?"
552
+ },
553
+ " modes · ",
554
+ {
555
+ tagName: "kbd",
556
+ textContent: ">"
557
+ },
558
+ " commands · ",
559
+ {
560
+ tagName: "kbd",
561
+ textContent: "@"
562
+ },
563
+ " elements"
564
+ ]
565
+ }
566
+ ]
567
+ }
568
+ ]
569
+ }
570
+ }
571
+ };
572
+
573
+ // src/panels/quick-search.ts
574
+ var PALETTE_MODES = [
575
+ {
576
+ mode: "files",
577
+ prefix: "",
578
+ chip: "Files",
579
+ placeholder: "Go to a file…",
580
+ description: "Open a file by any part of its path — pgblog finds pages/blog/index.md."
581
+ },
582
+ {
583
+ mode: "commands",
584
+ prefix: ">",
585
+ chip: "Commands",
586
+ placeholder: "Run a command…",
587
+ description: "Run anything Studio can do, with its keyboard shortcut printed beside it."
588
+ },
589
+ {
590
+ mode: "nodes",
591
+ prefix: "@",
592
+ chip: "Symbols",
593
+ placeholder: "Go to an element in this document…",
594
+ description: "Select an element in the open document by its Outline name."
595
+ },
596
+ {
597
+ mode: "projects",
598
+ prefix: "",
599
+ chip: "Recent Projects",
600
+ placeholder: "Open a recent project…",
601
+ description: "Reopen a project you have had open before."
602
+ },
603
+ {
604
+ mode: "picker",
605
+ prefix: "?",
606
+ chip: "Modes",
607
+ placeholder: "Type ? for modes, > for commands, @ for elements…",
608
+ description: "List these modes."
609
+ }
610
+ ];
611
+ var MODE_SPEC = new Map(PALETTE_MODES.map((spec) => [spec.mode, spec]));
612
+ var PREFIXED_MODES = PALETTE_MODES.filter((spec) => spec.prefix !== "");
613
+ function modeSpec(mode) {
614
+ return MODE_SPEC.get(mode) ?? PALETTE_MODES[0];
615
+ }
616
+ function resolvePaletteMode(requested, raw, projectOpen) {
617
+ const prefixed = PREFIXED_MODES.find((spec) => raw.startsWith(spec.prefix));
618
+ if (prefixed) {
619
+ return resolvePaletteMode(prefixed.mode, raw.slice(1), projectOpen);
620
+ }
621
+ let mode = requested;
622
+ if (mode === "picker" && raw.trim() !== "") {
623
+ mode = "files";
624
+ }
625
+ if (mode === "files" && !projectOpen) {
626
+ mode = "projects";
627
+ }
628
+ return { mode, query: raw };
629
+ }
630
+ var BOUNDARY = new Set(["/", "-", "_", ".", " "]);
631
+ function fuzzyScore(text, query) {
632
+ if (query === "") {
633
+ return 0;
634
+ }
635
+ const haystack = text.toLowerCase();
636
+ const needle = query.toLowerCase();
637
+ const basenameStart = haystack.lastIndexOf("/") + 1;
638
+ let score = 0;
639
+ let cursor = 0;
640
+ let previousIndex = -2;
641
+ for (const char of needle) {
642
+ const index = haystack.indexOf(char, cursor);
643
+ if (index === -1) {
644
+ return null;
645
+ }
646
+ if (index === previousIndex + 1) {
647
+ score += 8;
648
+ }
649
+ if (index === 0 || BOUNDARY.has(haystack[index - 1] ?? "")) {
650
+ score += 6;
651
+ }
652
+ if (index >= basenameStart) {
653
+ score += 4;
654
+ }
655
+ previousIndex = index;
656
+ cursor = index + 1;
657
+ }
658
+ return score - previousIndex * 0.01 - haystack.length * 0.001;
659
+ }
660
+ function rankBy(items, query, key) {
661
+ const scored = [];
662
+ for (const [index, item] of items.entries()) {
663
+ const score = fuzzyScore(key(item), query);
664
+ if (score !== null) {
665
+ scored.push({ index, item, score });
666
+ }
667
+ }
668
+ return scored.toSorted((a, b) => b.score - a.score || a.index - b.index).map((entry) => entry.item);
669
+ }
670
+ function paletteArgs(command) {
671
+ const schema = command.args;
672
+ const properties = schema?.properties;
673
+ if (!schema || !properties) {
674
+ return { kind: "none" };
675
+ }
676
+ const names = Object.keys(properties);
677
+ if (names.length !== 1) {
678
+ return { kind: "unsupported" };
679
+ }
680
+ const name = names[0];
681
+ const property = properties[name];
682
+ if (property.enum) {
683
+ return {
684
+ kind: "choice",
685
+ name,
686
+ choices: property.enum.map((value) => ({ label: String(value), value }))
687
+ };
688
+ }
689
+ if (property.type === "boolean") {
690
+ return {
691
+ kind: "choice",
692
+ name,
693
+ choices: [
694
+ { label: "on", value: true },
695
+ { label: "off", value: false }
696
+ ]
697
+ };
698
+ }
699
+ return { kind: "unsupported" };
700
+ }
701
+ function optionId(index) {
702
+ return `quick-search-option-${index}`;
703
+ }
704
+ var RECENT_COMMANDS_KEY = "jx-studio-recent-commands";
705
+ var RECENT_COMMANDS_MAX = 6;
706
+ function getRecentCommands() {
707
+ try {
708
+ const raw = JSON.parse(localStorage.getItem(RECENT_COMMANDS_KEY) || "[]");
709
+ return Array.isArray(raw) ? raw.filter((id) => typeof id === "string") : [];
710
+ } catch {
711
+ return [];
712
+ }
713
+ }
714
+ function trackRecentCommand(id) {
715
+ const next = [id, ...getRecentCommands().filter((known) => known !== id)].slice(0, RECENT_COMMANDS_MAX);
716
+ try {
717
+ localStorage.setItem(RECENT_COMMANDS_KEY, JSON.stringify(next));
718
+ } catch {}
719
+ }
720
+ var _ctx = null;
721
+ var _open = false;
722
+ var _requested = "picker";
723
+ var _query = "";
724
+ var _selectedIndex = 0;
725
+ var _files = null;
726
+ var _loading = false;
727
+ var _pending = null;
728
+ function getContainer() {
729
+ return getLayerSlot2("popover", "quick-search");
730
+ }
731
+ function initQuickSearch2(ctx) {
732
+ _ctx = ctx ?? null;
733
+ }
734
+ function openQuickSearch2(mode = "files") {
735
+ _open = true;
736
+ _requested = mode;
737
+ _query = "";
738
+ _selectedIndex = 0;
739
+ _pending = null;
740
+ _files = null;
741
+ renderOverlay();
742
+ focusInput();
743
+ ensureFiles();
744
+ }
745
+ function closeQuickSearch() {
746
+ _open = false;
747
+ _pending = null;
748
+ renderOverlay();
749
+ }
750
+ function scopeRoot() {
751
+ return projectState ? projectState.projectRoot ?? null : null;
752
+ }
753
+ function hasProject() {
754
+ return projectState != null;
755
+ }
756
+ function current() {
757
+ return resolvePaletteMode(_requested, _query, hasProject());
758
+ }
759
+ function dirPart(path) {
760
+ const parts = path.split("/");
761
+ parts.pop();
762
+ return parts.length > 0 ? parts.join("/") : "";
763
+ }
764
+ function shortenPath(path) {
765
+ if (path.startsWith("/home/")) {
766
+ return `~/${path.split("/").slice(3).join("/")}`;
767
+ }
768
+ return path;
769
+ }
770
+ async function ensureFiles() {
771
+ if (!_open || _files !== null || _loading || !hasProject()) {
772
+ return;
773
+ }
774
+ _loading = true;
775
+ renderOverlay();
776
+ try {
777
+ await loadFormats2();
778
+ const hits = await getPlatform2().searchFiles("", documentExtensions2());
779
+ _files = hits.map((hit) => ({
780
+ kind: "file",
781
+ path: hit.path,
782
+ name: hit.name ?? hit.path.split("/").pop() ?? "",
783
+ detail: dirPart(hit.path),
784
+ recent: false
785
+ }));
786
+ } catch {
787
+ _files = [];
788
+ }
789
+ _loading = false;
790
+ renderOverlay();
791
+ }
792
+ function fileRows(query) {
793
+ if (query.trim() === "") {
794
+ return getRecentFiles(scopeRoot() ?? undefined).map((file) => ({
795
+ kind: "file",
796
+ path: file.path,
797
+ name: file.name,
798
+ detail: dirPart(file.path),
799
+ recent: true
800
+ }));
801
+ }
802
+ return rankBy(_files ?? [], query.trim(), (row) => row.path);
803
+ }
804
+ function projectRows(query) {
805
+ const rows = getRecentProjects().map((project) => ({
806
+ kind: "project",
807
+ root: project.root,
808
+ name: project.name,
809
+ detail: shortenPath(project.root)
810
+ }));
811
+ return rankBy(rows, query.trim(), (row) => `${row.name}/${row.root}`);
812
+ }
813
+ function commandRows(registry, query) {
814
+ const recents = getRecentCommands();
815
+ const rows = [];
816
+ for (const command of registry.visible()) {
817
+ if (paletteArgs(command).kind === "unsupported") {
818
+ continue;
819
+ }
820
+ if (!(command.menus ?? ["palette"]).includes("palette")) {
821
+ continue;
822
+ }
823
+ rows.push({
824
+ kind: "command",
825
+ id: command.id,
826
+ name: `${command.category}: ${command.title}`,
827
+ detail: registry.disabledReason(command.id) ?? "",
828
+ chord: registry.keymap.formatBinding(command.id) ?? "",
829
+ enabled: registry.isEnabled(command.id),
830
+ recent: recents.includes(command.id)
831
+ });
832
+ }
833
+ const ranked = rankBy(rows, query.trim(), (row) => row.name);
834
+ if (query.trim() !== "") {
835
+ return ranked;
836
+ }
837
+ const pinned = recents.map((id) => ranked.find((row) => row.id === id)).filter((row) => row !== undefined);
838
+ return [...pinned, ...ranked.filter((row) => !pinned.includes(row))];
839
+ }
840
+ function nodeRows(query) {
841
+ const tab = activeTab2.value;
842
+ if (!tab) {
843
+ return [];
844
+ }
845
+ const rows = flattenTree(tab.doc.document).map((row) => ({
846
+ kind: "node",
847
+ path: row.path,
848
+ name: row.nodeType === "text" ? String(row.node).slice(0, 60) : nodeLabel(row.node),
849
+ detail: row.nodeType
850
+ }));
851
+ return rankBy(rows, query.trim(), (row) => row.name);
852
+ }
853
+ function modeRows() {
854
+ return PALETTE_MODES.filter((spec) => spec.mode !== "picker").map((spec) => ({
855
+ kind: "mode",
856
+ mode: spec.mode,
857
+ name: spec.chip,
858
+ detail: spec.description,
859
+ chord: spec.prefix
860
+ }));
861
+ }
862
+ function argRows(query) {
863
+ const pending = _pending;
864
+ const rows = pending.choices.map((choice) => ({
865
+ kind: "arg",
866
+ commandId: pending.command.id,
867
+ argName: pending.name,
868
+ value: choice.value,
869
+ name: choice.label,
870
+ detail: `${pending.command.title} → ${pending.name}`
871
+ }));
872
+ return rankBy(rows, query.trim(), (row) => row.name);
873
+ }
874
+ function currentRows() {
875
+ const { mode, query } = current();
876
+ if (_pending) {
877
+ return { rows: argRows(query), showingRecent: false };
878
+ }
879
+ switch (mode) {
880
+ case "commands": {
881
+ const registry = activeRegistry();
882
+ return {
883
+ rows: registry ? commandRows(registry, query) : [],
884
+ showingRecent: query.trim() === ""
885
+ };
886
+ }
887
+ case "nodes": {
888
+ return { rows: nodeRows(query), showingRecent: false };
889
+ }
890
+ case "projects": {
891
+ return { rows: projectRows(query), showingRecent: query.trim() === "" };
892
+ }
893
+ case "picker": {
894
+ return { rows: modeRows(), showingRecent: false };
895
+ }
896
+ default: {
897
+ return { rows: fileRows(query), showingRecent: query.trim() === "" };
898
+ }
899
+ }
900
+ }
901
+ function onInput(raw) {
902
+ const prefixed = PREFIXED_MODES.find((spec) => raw.startsWith(spec.prefix));
903
+ if (prefixed) {
904
+ _requested = prefixed.mode;
905
+ _query = raw.slice(1);
906
+ } else {
907
+ _query = raw;
908
+ }
909
+ _selectedIndex = 0;
910
+ if (raw !== _query) {
911
+ scope().query = raw;
912
+ }
913
+ renderOverlay();
914
+ ensureFiles();
915
+ }
916
+ function clearMode() {
917
+ _requested = "picker";
918
+ _pending = null;
919
+ _selectedIndex = 0;
920
+ renderOverlay();
921
+ }
922
+ function enterMode(mode) {
923
+ _requested = mode;
924
+ _query = "";
925
+ _selectedIndex = 0;
926
+ renderOverlay();
927
+ ensureFiles();
928
+ }
929
+ function runCommand(command, args) {
930
+ const registry = activeRegistry();
931
+ if (!registry) {
932
+ return;
933
+ }
934
+ trackRecentCommand(command.id);
935
+ closeQuickSearch();
936
+ runReported(registry, command.id, args, "Palette");
937
+ }
938
+ function selectRow(row) {
939
+ switch (row.kind) {
940
+ case "project": {
941
+ closeQuickSearch();
942
+ _ctx?.openRecentProject(row.root);
943
+ return;
944
+ }
945
+ case "file": {
946
+ closeQuickSearch();
947
+ trackRecentFile({ name: row.name, path: row.path, root: scopeRoot() ?? "" });
948
+ openFileInTab2(row.path);
949
+ return;
950
+ }
951
+ case "mode": {
952
+ enterMode(row.mode);
953
+ return;
954
+ }
955
+ case "node": {
956
+ closeQuickSearch();
957
+ runActiveReported("selection.set", { path: row.path }, "Palette");
958
+ return;
959
+ }
960
+ case "arg": {
961
+ runCommand(_pending.command, { [row.argName]: row.value });
962
+ return;
963
+ }
964
+ default: {
965
+ selectCommandRow(row);
966
+ }
967
+ }
968
+ }
969
+ function selectCommandRow(row) {
970
+ const registry = activeRegistry();
971
+ const command = registry?.get(row.id);
972
+ if (!registry || !command || !row.enabled) {
973
+ return;
974
+ }
975
+ const args = paletteArgs(command);
976
+ if (args.kind === "choice") {
977
+ _pending = { choices: args.choices, command, name: args.name };
978
+ _query = "";
979
+ _selectedIndex = 0;
980
+ renderOverlay();
981
+ return;
982
+ }
983
+ runCommand(command);
984
+ }
985
+ function fileIcon(name) {
986
+ const ext = name.split(".").pop()?.toLowerCase();
987
+ if (ext === "json") {
988
+ return "file-code";
989
+ }
990
+ if (ext && formatByExtension2(ext)) {
991
+ return "file-text";
992
+ }
993
+ return "file";
994
+ }
995
+ function rowIcon(row) {
996
+ switch (row.kind) {
997
+ case "project": {
998
+ return "folder-open";
999
+ }
1000
+ case "file": {
1001
+ return fileIcon(row.name);
1002
+ }
1003
+ case "command": {
1004
+ return "play";
1005
+ }
1006
+ case "node": {
1007
+ return "stack";
1008
+ }
1009
+ default: {
1010
+ return "caret-right";
1011
+ }
1012
+ }
1013
+ }
1014
+ function rowTrailing(row, showingRecent) {
1015
+ if ((row.kind === "command" || row.kind === "mode") && row.chord) {
1016
+ return "chord";
1017
+ }
1018
+ if (row.kind === "command" && row.recent) {
1019
+ return "recent";
1020
+ }
1021
+ return showingRecent ? "recent" : "none";
1022
+ }
1023
+ function rowKey(row) {
1024
+ switch (row.kind) {
1025
+ case "project": {
1026
+ return `project:${row.root}`;
1027
+ }
1028
+ case "file": {
1029
+ return `file:${row.path}`;
1030
+ }
1031
+ case "command": {
1032
+ return `command:${row.id}`;
1033
+ }
1034
+ case "node": {
1035
+ return `node:${row.path.join("/")}`;
1036
+ }
1037
+ case "mode": {
1038
+ return `mode:${row.mode}`;
1039
+ }
1040
+ default: {
1041
+ return `arg:${row.value}`;
1042
+ }
1043
+ }
1044
+ }
1045
+ function emptyHint(mode, query) {
1046
+ if (_loading) {
1047
+ return "Reading the project's files…";
1048
+ }
1049
+ if (query.trim() !== "") {
1050
+ return "No results";
1051
+ }
1052
+ switch (mode) {
1053
+ case "projects": {
1054
+ return "No recent projects — open one to get started";
1055
+ }
1056
+ case "nodes": {
1057
+ return "Open a document to jump to its elements";
1058
+ }
1059
+ case "commands": {
1060
+ return "Type to find any command in Studio";
1061
+ }
1062
+ default: {
1063
+ return modeSpec(mode).placeholder;
1064
+ }
1065
+ }
1066
+ }
1067
+ registerSurface("palette", palette_default);
1068
+ var _scope = null;
1069
+ var _mount = null;
1070
+ var _rows = [];
1071
+ function scope() {
1072
+ _scope ??= reactive({
1073
+ activate: () => {
1074
+ const row = _rows[_selectedIndex];
1075
+ if (row) {
1076
+ selectRow(row);
1077
+ }
1078
+ },
1079
+ activateRow: (value) => {
1080
+ const row = _rows[Number(value)];
1081
+ if (row) {
1082
+ selectRow(row);
1083
+ }
1084
+ },
1085
+ activeId: "",
1086
+ canClearMode: false,
1087
+ chipLabel: "",
1088
+ clearMode,
1089
+ close: closeQuickSearch,
1090
+ emptyHint: "",
1091
+ expanded: false,
1092
+ hasChip: false,
1093
+ hover: (index) => {
1094
+ _selectedIndex = index;
1095
+ scope().activeId = optionId(index);
1096
+ },
1097
+ input: onInput,
1098
+ isEmpty: true,
1099
+ move: (delta) => {
1100
+ if (_rows.length === 0) {
1101
+ return;
1102
+ }
1103
+ _selectedIndex = Math.max(0, Math.min(_selectedIndex + delta, _rows.length - 1));
1104
+ scope().activeId = optionId(_selectedIndex);
1105
+ },
1106
+ open: false,
1107
+ placeholder: "",
1108
+ query: "",
1109
+ rows: [],
1110
+ sectionLabel: "",
1111
+ showSection: false
1112
+ });
1113
+ return _scope;
1114
+ }
1115
+ function focusInput() {
1116
+ setTimeout(() => {
1117
+ if (_open) {
1118
+ getContainer().querySelector('[part="input"]')?.focus();
1119
+ }
1120
+ }, 0);
1121
+ }
1122
+ function renderOverlay() {
1123
+ const state = scope();
1124
+ if (!_mount) {
1125
+ _mount = mountSurface("palette", state, getContainer());
1126
+ }
1127
+ state.open = _open;
1128
+ if (!_open) {
1129
+ _rows = [];
1130
+ return;
1131
+ }
1132
+ const { mode, query } = current();
1133
+ const { rows, showingRecent } = currentRows();
1134
+ const spec = modeSpec(mode);
1135
+ _rows = rows;
1136
+ state.placeholder = _pending ? `Choose a ${_pending.name}…` : spec.placeholder;
1137
+ state.hasChip = _pending !== null || mode !== "picker";
1138
+ state.chipLabel = _pending ? _pending.command.title : spec.chip;
1139
+ state.query = _query;
1140
+ state.canClearMode = _query === "" && (_pending !== null || _requested !== "picker");
1141
+ state.rows = rows.map((row) => ({
1142
+ chord: (row.kind === "command" || row.kind === "mode") && row.chord ? row.chord : "",
1143
+ detail: row.detail,
1144
+ disabled: row.kind === "command" && !row.enabled,
1145
+ icon: rowIcon(row),
1146
+ key: rowKey(row),
1147
+ kind: row.kind,
1148
+ name: row.name,
1149
+ trailing: rowTrailing(row, showingRecent)
1150
+ }));
1151
+ state.expanded = rows.length > 0;
1152
+ state.activeId = rows.length > 0 ? optionId(_selectedIndex) : "";
1153
+ state.isEmpty = rows.length === 0;
1154
+ state.emptyHint = emptyHint(mode, query);
1155
+ state.showSection = showingRecent && rows.length > 0;
1156
+ state.sectionLabel = _pending ? `${_pending.command.title} — ${_pending.name}` : mode === "projects" ? "Recent projects" : mode === "commands" ? "Recently used" : "Recently opened";
1157
+ }
1158
+
1159
+ export { initQuickSearch2, openQuickSearch2 };
1160
+
1161
+ //# debugId=EFFDF77A3587A37264756E2164756E21
1162
+ //# sourceMappingURL=studio-a79k90n9.js.map