@jxsuite/studio 2.0.1 → 2.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 (419) hide show
  1. package/canvas.html +21 -0
  2. package/dist/chunks/Overlay.dev-qfjzkms8.js +23 -0
  3. package/dist/chunks/{Overlay.dev-cszx7yn5.js.map → Overlay.dev-qfjzkms8.js.map} +1 -1
  4. package/dist/chunks/{adapter-z8fkmbmv.js → adapter-qfnesn5v.js} +2 -2
  5. package/dist/chunks/{cf-settings-mmyv436d.js → cf-settings-73sh5z4p.js} +3 -3
  6. package/dist/chunks/{components-799jpvhm.js → components-2bpqp4mq.js} +5 -7
  7. package/dist/chunks/{components-799jpvhm.js.map → components-2bpqp4mq.js.map} +1 -1
  8. package/dist/chunks/content-source-34gnkbnn.js +38 -0
  9. package/dist/chunks/content-source-34gnkbnn.js.map +9 -0
  10. package/dist/chunks/convert-to-repeater-t8kxre5s.js +258 -0
  11. package/dist/chunks/convert-to-repeater-t8kxre5s.js.map +10 -0
  12. package/dist/chunks/extension-sections-6mqydz35.js +301 -0
  13. package/dist/chunks/extension-sections-6mqydz35.js.map +11 -0
  14. package/dist/chunks/files-8kn321h1.js +70 -0
  15. package/dist/chunks/files-8kn321h1.js.map +9 -0
  16. package/dist/chunks/{format-host-8jxwts2p.js → format-host-mkwsmt8d.js} +3 -3
  17. package/dist/chunks/git-panel-tjbr191d.js +51 -0
  18. package/dist/chunks/git-panel-tjbr191d.js.map +9 -0
  19. package/dist/chunks/{index-baeg2x3y.js → index-7pxchcce.js} +4 -3
  20. package/dist/chunks/{index-baeg2x3y.js.map → index-7pxchcce.js.map} +3 -3
  21. package/dist/chunks/{jx-validate-qx8degj7.js → jx-validate-v6qgknrs.js} +3 -3
  22. package/dist/chunks/layers-panel-87pb25km.js +58 -0
  23. package/dist/chunks/layers-panel-87pb25km.js.map +9 -0
  24. package/dist/chunks/{monaco-setup-zjdp9zdw.js → monaco-setup-e0yh25j4.js} +4 -75
  25. package/dist/chunks/{monaco-setup-zjdp9zdw.js.map → monaco-setup-e0yh25j4.js.map} +3 -4
  26. package/dist/chunks/publish-panel-m0fcgdrt.js +21 -0
  27. package/dist/chunks/publish-panel-m0fcgdrt.js.map +9 -0
  28. package/dist/chunks/quick-search-rhs6cbsb.js +53 -0
  29. package/dist/chunks/quick-search-rhs6cbsb.js.map +9 -0
  30. package/dist/chunks/right-panel-zpdxd98t.js +37 -0
  31. package/dist/chunks/right-panel-zpdxd98t.js.map +9 -0
  32. package/dist/chunks/section-registry-zmckaxf4.js +30 -0
  33. package/dist/chunks/section-registry-zmckaxf4.js.map +9 -0
  34. package/dist/chunks/sp-overlay.dev-9ran0sfq.js +18 -0
  35. package/dist/chunks/sp-overlay.dev-9ran0sfq.js.map +9 -0
  36. package/dist/chunks/sp-popover.dev-rebmdncr.js +9 -0
  37. package/dist/chunks/sp-popover.dev-rebmdncr.js.map +9 -0
  38. package/dist/chunks/sp-progress-circle.dev-5vkppfkt.js +15 -0
  39. package/dist/chunks/sp-progress-circle.dev-5vkppfkt.js.map +9 -0
  40. package/dist/chunks/sp-tooltip.dev-ykqrg8h5.js +15 -0
  41. package/dist/chunks/sp-tooltip.dev-ykqrg8h5.js.map +9 -0
  42. package/dist/chunks/{sp-tray.dev-pb2fsd65.js → sp-tray.dev-ey59vfh7.js} +10 -8
  43. package/dist/chunks/{sp-tray.dev-pb2fsd65.js.map → sp-tray.dev-ey59vfh7.js.map} +2 -2
  44. package/dist/chunks/{studio-9qr6fq7p.js → studio-0rqqhrdy.js} +10 -378
  45. package/dist/chunks/{studio-9qr6fq7p.js.map → studio-0rqqhrdy.js.map} +4 -14
  46. package/dist/chunks/{studio-5x6tqqec.js → studio-2sj1jj3v.js} +10 -8
  47. package/dist/chunks/{studio-5x6tqqec.js.map → studio-2sj1jj3v.js.map} +2 -2
  48. package/dist/chunks/{studio-h3fw0wn8.js → studio-3fk1ac9z.js} +6 -4
  49. package/dist/chunks/{studio-h3fw0wn8.js.map → studio-3fk1ac9z.js.map} +2 -2
  50. package/dist/chunks/studio-41exgzhq.js +6690 -0
  51. package/dist/chunks/studio-41exgzhq.js.map +38 -0
  52. package/dist/chunks/{studio-7v2bpweq.js → studio-4mqb9a0j.js} +6 -4
  53. package/dist/chunks/{studio-7v2bpweq.js.map → studio-4mqb9a0j.js.map} +2 -2
  54. package/dist/chunks/studio-50k77cca.js +1787 -0
  55. package/dist/chunks/studio-50k77cca.js.map +18 -0
  56. package/dist/chunks/{studio-56v3zwk6.js → studio-6a0h7sne.js} +10 -8
  57. package/dist/chunks/{studio-56v3zwk6.js.map → studio-6a0h7sne.js.map} +2 -2
  58. package/dist/chunks/studio-6f0am8f2.js +53 -0
  59. package/dist/chunks/studio-6f0am8f2.js.map +10 -0
  60. package/dist/chunks/studio-6nmjc5qk.js +7002 -0
  61. package/dist/chunks/studio-6nmjc5qk.js.map +32 -0
  62. package/dist/chunks/studio-7afd21nw.js +67 -0
  63. package/dist/chunks/studio-7afd21nw.js.map +10 -0
  64. package/dist/chunks/{studio-xze4zrs1.js → studio-7bmdvzne.js} +2 -2
  65. package/dist/chunks/studio-7bmdvzne.js.map +10 -0
  66. package/dist/chunks/studio-8jpzqk5s.js +128 -0
  67. package/dist/chunks/studio-8jpzqk5s.js.map +10 -0
  68. package/dist/chunks/studio-94m77tgk.js +1482 -0
  69. package/dist/chunks/studio-94m77tgk.js.map +13 -0
  70. package/dist/chunks/studio-9je6w5sq.js +1000 -0
  71. package/dist/chunks/studio-9je6w5sq.js.map +16 -0
  72. package/dist/chunks/{studio-w7c6kvk7.js → studio-a7pzveq1.js} +2 -2
  73. package/dist/chunks/{studio-gs6kqdt1.js → studio-adn0z1k3.js} +14 -8
  74. package/dist/chunks/{studio-gs6kqdt1.js.map → studio-adn0z1k3.js.map} +3 -3
  75. package/dist/chunks/{studio-kr88ryr7.js → studio-bsxxx3x2.js} +17 -15
  76. package/dist/chunks/{studio-kr88ryr7.js.map → studio-bsxxx3x2.js.map} +7 -6
  77. package/dist/chunks/studio-bw5dz6km.js +608 -0
  78. package/dist/chunks/studio-bw5dz6km.js.map +21 -0
  79. package/dist/chunks/studio-c6s5getc.js +4232 -0
  80. package/dist/chunks/studio-c6s5getc.js.map +39 -0
  81. package/dist/chunks/studio-cjm7fdjf.js +451 -0
  82. package/dist/chunks/studio-cjm7fdjf.js.map +14 -0
  83. package/dist/chunks/{studio-cx91mnh8.js → studio-ckwz4d3x.js} +53 -53
  84. package/dist/chunks/{studio-cx91mnh8.js.map → studio-ckwz4d3x.js.map} +5 -5
  85. package/dist/chunks/studio-dg7zyt5x.js +28 -0
  86. package/dist/chunks/studio-dg7zyt5x.js.map +10 -0
  87. package/dist/chunks/studio-dzcyvvvz.js +166 -0
  88. package/dist/chunks/studio-dzcyvvvz.js.map +10 -0
  89. package/dist/chunks/{studio-7kqe41sa.js → studio-evkr5d3b.js} +15 -7
  90. package/dist/chunks/{studio-7kqe41sa.js.map → studio-evkr5d3b.js.map} +5 -4
  91. package/dist/chunks/studio-f12h6177.js +411 -0
  92. package/dist/chunks/studio-f12h6177.js.map +13 -0
  93. package/dist/chunks/studio-hbp1s8m9.js +1817 -0
  94. package/dist/chunks/studio-hbp1s8m9.js.map +14 -0
  95. package/dist/chunks/studio-k2sxjph5.js +15295 -0
  96. package/dist/chunks/studio-k2sxjph5.js.map +235 -0
  97. package/dist/chunks/studio-myje51t3.js +385 -0
  98. package/dist/chunks/studio-myje51t3.js.map +12 -0
  99. package/dist/chunks/studio-na6rwzhw.js +353 -0
  100. package/dist/chunks/studio-na6rwzhw.js.map +11 -0
  101. package/dist/chunks/{studio-4k0m4fmp.js → studio-p471gg5n.js} +126 -3
  102. package/dist/chunks/studio-p471gg5n.js.map +14 -0
  103. package/dist/chunks/{studio-9bjwf0d4.js → studio-rgwcpast.js} +5 -46
  104. package/dist/chunks/{studio-9bjwf0d4.js.map → studio-rgwcpast.js.map} +4 -5
  105. package/dist/chunks/{studio-esrewxap.js → studio-s519zc99.js} +3 -3
  106. package/dist/chunks/studio-sas7mt3k.js +75 -0
  107. package/dist/chunks/studio-sas7mt3k.js.map +10 -0
  108. package/dist/chunks/studio-t5wqwzdh.js +74 -0
  109. package/dist/chunks/studio-t5wqwzdh.js.map +10 -0
  110. package/dist/chunks/{studio-9qpspwfn.js → studio-temv5bw4.js} +5 -5
  111. package/dist/chunks/{studio-9qpspwfn.js.map → studio-temv5bw4.js.map} +1 -1
  112. package/dist/chunks/{studio-qkvt37c0.js → studio-tr20m8g8.js} +669 -18
  113. package/dist/chunks/studio-tr20m8g8.js.map +9 -0
  114. package/dist/chunks/{studio-v7jkjqng.js → studio-v96qfnww.js} +5514 -4291
  115. package/dist/chunks/studio-v96qfnww.js.map +54 -0
  116. package/dist/chunks/studio-vcetc91k.js +659 -0
  117. package/dist/chunks/studio-vcetc91k.js.map +10 -0
  118. package/dist/chunks/{studio-jm0z592w.js → studio-vmymjefp.js} +2972 -4937
  119. package/dist/chunks/studio-vmymjefp.js.map +98 -0
  120. package/dist/chunks/{studio-bghqfmea.js → studio-wwseqyw0.js} +2 -2
  121. package/dist/chunks/studio-x9hmy5kr.js +390 -0
  122. package/dist/chunks/studio-x9hmy5kr.js.map +10 -0
  123. package/dist/chunks/studio-xa0ce0n7.js +335 -0
  124. package/dist/chunks/studio-xa0ce0n7.js.map +10 -0
  125. package/dist/chunks/studio-xm3dbxvn.js +378 -0
  126. package/dist/chunks/studio-xm3dbxvn.js.map +19 -0
  127. package/dist/chunks/{studio-nqw433kv.js → studio-xmvbhg31.js} +2 -2
  128. package/dist/chunks/studio-zv37yrfa.js +1054 -0
  129. package/dist/chunks/studio-zv37yrfa.js.map +13 -0
  130. package/dist/chunks/{ws-client-q7hkz3j9.js → ws-client-654ts66j.js} +6 -4
  131. package/dist/chunks/ws-client-654ts66j.js.map +11 -0
  132. package/dist/iframe-entry.js +668 -230
  133. package/dist/studio.js +21080 -32585
  134. package/index.html +35 -4685
  135. package/package.json +17 -15
  136. package/src/about/about-modal.ts +42 -11
  137. package/src/browse/library-commands.ts +240 -0
  138. package/src/browse/library-layouts.ts +369 -0
  139. package/src/browse/library-model.ts +396 -0
  140. package/src/browse/library-pane.ts +1049 -0
  141. package/src/browse/library-preview.ts +252 -0
  142. package/src/browse/library-source.ts +150 -0
  143. package/src/canvas/canvas-helpers.ts +33 -9
  144. package/src/canvas/canvas-live-render.ts +45 -29
  145. package/src/canvas/canvas-patcher.ts +151 -31
  146. package/src/canvas/canvas-perf.ts +46 -7
  147. package/src/canvas/canvas-render.ts +1092 -220
  148. package/src/canvas/canvas-surface.ts +240 -0
  149. package/src/canvas/canvas-utils.ts +1166 -124
  150. package/src/canvas/iframe-drop.ts +2 -1
  151. package/src/canvas/iframe-entry.ts +241 -4
  152. package/src/canvas/iframe-host.ts +1226 -143
  153. package/src/canvas/iframe-inline-edit.ts +31 -0
  154. package/src/canvas/iframe-interaction.ts +76 -16
  155. package/src/canvas/iframe-keys.ts +107 -45
  156. package/src/canvas/iframe-overlay.ts +38 -1
  157. package/src/canvas/iframe-protocol.ts +137 -2
  158. package/src/canvas/iframe-render.ts +70 -2
  159. package/src/canvas/iframe-slash.ts +6 -0
  160. package/src/canvas/path-mapping.ts +56 -6
  161. package/src/canvas/surface-registry.ts +292 -0
  162. package/src/collab/collab-commands.ts +244 -0
  163. package/src/collab/collab-session.ts +198 -32
  164. package/src/collab/collab-state.ts +28 -2
  165. package/src/collab/presence-chips.ts +100 -9
  166. package/src/commands/active-registry.ts +42 -0
  167. package/src/commands/app-commands.ts +176 -0
  168. package/src/commands/budget.ts +158 -0
  169. package/src/commands/command-args.ts +253 -0
  170. package/src/commands/context.ts +387 -0
  171. package/src/commands/defaults.ts +580 -0
  172. package/src/commands/keymap.ts +571 -0
  173. package/src/commands/levels.ts +345 -0
  174. package/src/commands/live-context.ts +193 -0
  175. package/src/commands/reference.ts +227 -0
  176. package/src/commands/registry.ts +293 -0
  177. package/src/component-props.ts +3 -2
  178. package/src/content/draft-state.ts +106 -0
  179. package/src/content/entry-commands.ts +282 -0
  180. package/src/content/entry-editor.ts +327 -0
  181. package/src/content/entry-fields.ts +116 -0
  182. package/src/content/entry-model.ts +175 -0
  183. package/src/editor/canvas-context-menu.ts +17 -11
  184. package/src/editor/canvas-slash-bridge.ts +11 -4
  185. package/src/editor/context-menu.ts +804 -204
  186. package/src/editor/convert-to-component.ts +31 -10
  187. package/src/editor/convert-to-repeater.ts +3 -2
  188. package/src/editor/inline-edit-apply.ts +5 -5
  189. package/src/editor/inline-edit.ts +86 -50
  190. package/src/editor/insert-zone-action.ts +1 -1
  191. package/src/editor/shortcuts.ts +1043 -329
  192. package/src/editor/slash-menu.ts +1 -0
  193. package/src/files/elements.ts +166 -0
  194. package/src/files/file-ops.ts +178 -31
  195. package/src/files/files.ts +898 -268
  196. package/src/files/fs-events.ts +21 -0
  197. package/src/files/media-meta.ts +203 -0
  198. package/src/files/media-paths.ts +141 -0
  199. package/src/files/media-upload.ts +7 -3
  200. package/src/files/media-usage.ts +189 -0
  201. package/src/github/github-auth.ts +235 -33
  202. package/src/github/github-publish.ts +80 -21
  203. package/src/grid/grid-controller.ts +152 -12
  204. package/src/grid/grid-layout.ts +225 -20
  205. package/src/grid/grid-open.ts +120 -0
  206. package/src/grid/grid-panel.ts +554 -39
  207. package/src/grid/grid-source.ts +27 -1
  208. package/src/grid/redirects-grid.ts +599 -0
  209. package/src/grid/redirects.ts +398 -0
  210. package/src/grid/sources/content-source.ts +108 -2
  211. package/src/i18n/i18n-commands.ts +322 -0
  212. package/src/new-project/add-repo-modal.ts +8 -10
  213. package/src/new-project/import-tab.ts +7 -0
  214. package/src/new-project/location-fields.ts +9 -1
  215. package/src/new-project/new-project-modal.ts +221 -245
  216. package/src/packages/jxsuite-update.ts +97 -48
  217. package/src/packages/pull-package-sync.ts +18 -9
  218. package/src/page-params.ts +2 -1
  219. package/src/panels/activity-bar.ts +152 -91
  220. package/src/panels/activity-panel.ts +481 -0
  221. package/src/panels/ai-chat/chat-markdown.ts +8 -3
  222. package/src/panels/ai-chat/chat-view.ts +245 -18
  223. package/src/panels/ai-chat/composer.ts +31 -5
  224. package/src/panels/ai-chat/sessions-view.ts +17 -10
  225. package/src/panels/ai-panel.ts +279 -53
  226. package/src/panels/block-action-bar.ts +1115 -224
  227. package/src/panels/bottom-dock.ts +337 -0
  228. package/src/panels/canvas-dnd-bridge.ts +37 -8
  229. package/src/panels/chat-panel.ts +29 -12
  230. package/src/panels/data-explorer.ts +254 -112
  231. package/src/panels/data-grid.ts +10 -4
  232. package/src/panels/dnd.ts +28 -51
  233. package/src/panels/editors.ts +434 -107
  234. package/src/panels/elements-panel.ts +66 -2
  235. package/src/panels/empty-state.ts +112 -0
  236. package/src/panels/events-panel.ts +596 -82
  237. package/src/panels/formula-workspace.ts +408 -218
  238. package/src/panels/frontmatter-fields.ts +51 -10
  239. package/src/panels/frontmatter-panel.ts +357 -79
  240. package/src/panels/git-panel.ts +375 -164
  241. package/src/panels/head-panel.ts +791 -85
  242. package/src/panels/i18n-panel.ts +592 -0
  243. package/src/panels/imports-panel.ts +95 -85
  244. package/src/panels/jump-bar.ts +584 -0
  245. package/src/panels/layers-panel.ts +1106 -328
  246. package/src/panels/left-panel.ts +109 -204
  247. package/src/panels/navigator-panels.ts +131 -0
  248. package/src/panels/overlays.ts +7 -2
  249. package/src/panels/pane-context.ts +1477 -0
  250. package/src/panels/pane-grid.ts +406 -0
  251. package/src/panels/panel-registry.ts +340 -0
  252. package/src/panels/panel-scheduler.ts +75 -0
  253. package/src/panels/problems-panel.ts +234 -0
  254. package/src/panels/properties-panel.ts +946 -1139
  255. package/src/panels/provenance.ts +258 -0
  256. package/src/panels/quick-search.ts +791 -122
  257. package/src/panels/right-panel.ts +228 -102
  258. package/src/panels/seo-modal.ts +395 -0
  259. package/src/panels/settings-pane.ts +203 -0
  260. package/src/panels/signals-panel.ts +354 -137
  261. package/src/panels/statement-editor.ts +41 -25
  262. package/src/panels/statusbar.ts +342 -106
  263. package/src/panels/style-panel.ts +974 -463
  264. package/src/panels/style-utils.ts +3 -3
  265. package/src/panels/stylebook-doc.ts +4 -2
  266. package/src/panels/stylebook-layers-panel.ts +3 -2
  267. package/src/panels/stylebook-panel.ts +51 -26
  268. package/src/panels/tab-strip.ts +1058 -78
  269. package/src/panels/target-line.ts +274 -0
  270. package/src/panels/toolbar.ts +631 -484
  271. package/src/panels/welcome-screen.ts +301 -198
  272. package/src/platform-errors.ts +26 -3
  273. package/src/platform.ts +96 -2
  274. package/src/platforms/cloud.ts +71 -8
  275. package/src/platforms/devserver.ts +92 -29
  276. package/src/publish/deploy-checklist.ts +383 -0
  277. package/src/publish/pages-service.ts +10 -1
  278. package/src/publish/publish-commands.ts +218 -0
  279. package/src/publish/publish-panel.ts +110 -16
  280. package/src/recent-projects.ts +3 -2
  281. package/src/services/a11y-report.ts +505 -0
  282. package/src/services/ai-models.ts +30 -1
  283. package/src/services/ai-project-tools.ts +29 -10
  284. package/src/services/ai-system-prompt.ts +53 -14
  285. package/src/services/ai-tools.ts +39 -3
  286. package/src/services/ai-writes.ts +154 -0
  287. package/src/services/announce.ts +97 -0
  288. package/src/services/automation.ts +424 -175
  289. package/src/services/cem-export.ts +9 -4
  290. package/src/services/clock.ts +61 -0
  291. package/src/services/document-assistant.ts +36 -8
  292. package/src/services/idle.ts +179 -0
  293. package/src/services/import-client.ts +26 -0
  294. package/src/services/monaco-buffer.ts +627 -0
  295. package/src/services/monaco-lazy.ts +36 -0
  296. package/src/services/notify.ts +271 -0
  297. package/src/services/profile.ts +155 -0
  298. package/src/services/references.ts +0 -0
  299. package/src/services/token-lint.ts +3 -2
  300. package/src/services/tool-executor.ts +53 -7
  301. package/src/services/trusted-types.ts +123 -0
  302. package/src/settings/contexts-section.ts +427 -0
  303. package/src/settings/contributed-section.ts +149 -11
  304. package/src/settings/css-vars-editor.ts +306 -349
  305. package/src/settings/defs-editor.ts +93 -34
  306. package/src/settings/dependencies-editor.ts +7 -7
  307. package/src/settings/extension-sections.ts +37 -5
  308. package/src/settings/general-settings.ts +204 -121
  309. package/src/settings/locales-section.ts +347 -0
  310. package/src/settings/preferences-accounts.ts +140 -0
  311. package/src/settings/preferences-dialog.ts +620 -0
  312. package/src/settings/preferences-keymap.ts +270 -0
  313. package/src/settings/project-sections.ts +260 -0
  314. package/src/settings/section-registry.ts +169 -0
  315. package/src/settings/settings-document.ts +385 -0
  316. package/src/shell.ts +1549 -0
  317. package/src/site-context.ts +45 -20
  318. package/src/state.ts +14 -275
  319. package/src/store.ts +88 -43
  320. package/src/studio.ts +790 -346
  321. package/src/style/live-preview.ts +36 -0
  322. package/src/style/project-styles.ts +349 -0
  323. package/src/style/token-ref.ts +123 -0
  324. package/src/tabs/patch-ops.ts +16 -4
  325. package/src/tabs/project-config.ts +416 -0
  326. package/src/tabs/selection.ts +323 -0
  327. package/src/tabs/tab.ts +182 -47
  328. package/src/tabs/transact.ts +209 -28
  329. package/src/types.ts +68 -13
  330. package/src/ui/ai-credentials-form.ts +39 -35
  331. package/src/ui/ai-managed-connect.ts +7 -1
  332. package/src/ui/dynamic-slot.ts +224 -81
  333. package/src/ui/expression-editor.ts +71 -63
  334. package/src/ui/field-input.ts +4 -6
  335. package/src/ui/field-row.ts +215 -38
  336. package/src/ui/form-controls.ts +194 -7
  337. package/src/ui/layers.ts +492 -69
  338. package/src/ui/media-picker.ts +115 -25
  339. package/src/ui/panel-resize.ts +109 -91
  340. package/src/ui/progress-modal.ts +131 -50
  341. package/src/ui/regions.ts +462 -0
  342. package/src/ui/schema-form.ts +229 -45
  343. package/src/ui/spectrum.ts +24 -8
  344. package/src/ui/timing.ts +49 -0
  345. package/src/ui/value-selector.ts +20 -0
  346. package/src/ui/value-source.ts +348 -0
  347. package/src/ui/virtual-window.ts +400 -0
  348. package/src/utils/edit-display.ts +3 -2
  349. package/src/utils/inherited-style.ts +67 -37
  350. package/src/view.ts +64 -78
  351. package/src/workspace/pane-derive.ts +1258 -0
  352. package/src/workspace/session.ts +317 -0
  353. package/src/workspace/workspace.ts +1345 -23
  354. package/styles/canvas.css +653 -0
  355. package/styles/forced-colors.css +106 -0
  356. package/styles/inspector.css +1454 -0
  357. package/styles/overlays.css +2704 -0
  358. package/styles/panels.css +1701 -0
  359. package/styles/shell.css +1423 -0
  360. package/styles/tokens.css +151 -0
  361. package/dist/chunks/Overlay.dev-cszx7yn5.js +0 -22
  362. package/dist/chunks/extension-sections-qr3drkkw.js +0 -531
  363. package/dist/chunks/extension-sections-qr3drkkw.js.map +0 -12
  364. package/dist/chunks/files-j8a1t06k.js +0 -50
  365. package/dist/chunks/files-j8a1t06k.js.map +0 -9
  366. package/dist/chunks/git-panel-xtq5z81x.js +0 -28
  367. package/dist/chunks/git-panel-xtq5z81x.js.map +0 -9
  368. package/dist/chunks/layers-panel-ancn2wpq.js +0 -26
  369. package/dist/chunks/layers-panel-ancn2wpq.js.map +0 -9
  370. package/dist/chunks/settings-modal-17ttr96g.js +0 -29
  371. package/dist/chunks/settings-modal-17ttr96g.js.map +0 -9
  372. package/dist/chunks/sp-overlay.dev-earn5as8.js +0 -17
  373. package/dist/chunks/sp-overlay.dev-earn5as8.js.map +0 -9
  374. package/dist/chunks/sp-popover.dev-frxtfejn.js +0 -8
  375. package/dist/chunks/sp-popover.dev-frxtfejn.js.map +0 -9
  376. package/dist/chunks/sp-progress-circle.dev-7tvw34h8.js +0 -14
  377. package/dist/chunks/sp-progress-circle.dev-7tvw34h8.js.map +0 -9
  378. package/dist/chunks/sp-tooltip.dev-a9fywesm.js +0 -21
  379. package/dist/chunks/sp-tooltip.dev-a9fywesm.js.map +0 -10
  380. package/dist/chunks/studio-0xgs7xrs.js +0 -429
  381. package/dist/chunks/studio-0xgs7xrs.js.map +0 -13
  382. package/dist/chunks/studio-4d8hzcz5.js +0 -3427
  383. package/dist/chunks/studio-4d8hzcz5.js.map +0 -26
  384. package/dist/chunks/studio-4k0m4fmp.js.map +0 -13
  385. package/dist/chunks/studio-9smfzqhc.js +0 -19
  386. package/dist/chunks/studio-9smfzqhc.js.map +0 -10
  387. package/dist/chunks/studio-jm0z592w.js.map +0 -115
  388. package/dist/chunks/studio-m2t4mdg5.js +0 -1854
  389. package/dist/chunks/studio-m2t4mdg5.js.map +0 -18
  390. package/dist/chunks/studio-n4p11dfy.js +0 -853
  391. package/dist/chunks/studio-n4p11dfy.js.map +0 -12
  392. package/dist/chunks/studio-qkvt37c0.js.map +0 -9
  393. package/dist/chunks/studio-sjh1wt1a.js +0 -3744
  394. package/dist/chunks/studio-sjh1wt1a.js.map +0 -22
  395. package/dist/chunks/studio-v7jkjqng.js.map +0 -46
  396. package/dist/chunks/studio-xq0t7n5t.js +0 -140
  397. package/dist/chunks/studio-xq0t7n5t.js.map +0 -10
  398. package/dist/chunks/studio-xze4zrs1.js.map +0 -10
  399. package/dist/chunks/studio-yfcstdzy.js +0 -399
  400. package/dist/chunks/studio-yfcstdzy.js.map +0 -12
  401. package/dist/chunks/studio-zp7jncs8.js +0 -469
  402. package/dist/chunks/studio-zp7jncs8.js.map +0 -14
  403. package/dist/chunks/ws-client-q7hkz3j9.js.map +0 -11
  404. package/src/browse/browse-modal.ts +0 -69
  405. package/src/browse/browse.ts +0 -904
  406. package/src/canvas/canvas-diff.ts +0 -216
  407. package/src/canvas/nested-site-style.ts +0 -58
  408. package/src/new-project/design-fields.ts +0 -264
  409. package/src/new-project/templates.ts +0 -61
  410. package/src/panels/tab-bar.ts +0 -548
  411. package/src/settings/settings-modal.ts +0 -203
  412. /package/dist/chunks/{adapter-z8fkmbmv.js.map → adapter-qfnesn5v.js.map} +0 -0
  413. /package/dist/chunks/{cf-settings-mmyv436d.js.map → cf-settings-73sh5z4p.js.map} +0 -0
  414. /package/dist/chunks/{format-host-8jxwts2p.js.map → format-host-mkwsmt8d.js.map} +0 -0
  415. /package/dist/chunks/{jx-validate-qx8degj7.js.map → jx-validate-v6qgknrs.js.map} +0 -0
  416. /package/dist/chunks/{studio-w7c6kvk7.js.map → studio-a7pzveq1.js.map} +0 -0
  417. /package/dist/chunks/{studio-esrewxap.js.map → studio-s519zc99.js.map} +0 -0
  418. /package/dist/chunks/{studio-bghqfmea.js.map → studio-wwseqyw0.js.map} +0 -0
  419. /package/dist/chunks/{studio-nqw433kv.js.map → studio-xmvbhg31.js.map} +0 -0
@@ -0,0 +1,659 @@
1
+ import {
2
+ getRecentFiles,
3
+ getRecentProjects,
4
+ openFileInTab,
5
+ trackRecentFile
6
+ } from "./studio-94m77tgk.js";
7
+ import {
8
+ live
9
+ } from "./studio-xmvbhg31.js";
10
+ import {
11
+ activeRegistry,
12
+ activeTab,
13
+ getLayerSlot
14
+ } from "./studio-41exgzhq.js";
15
+ import {
16
+ classMap
17
+ } from "./studio-ckwz4d3x.js";
18
+ import {
19
+ ref
20
+ } from "./studio-p471gg5n.js";
21
+ import {
22
+ html,
23
+ nothing,
24
+ render
25
+ } from "./studio-5x5774ak.js";
26
+ import {
27
+ flattenTree,
28
+ nodeLabel,
29
+ projectState
30
+ } from "./studio-cjm7fdjf.js";
31
+ import {
32
+ documentExtensions,
33
+ formatByExtension,
34
+ loadFormats
35
+ } from "./studio-adn0z1k3.js";
36
+ import {
37
+ getPlatform
38
+ } from "./studio-sas7mt3k.js";
39
+
40
+ // src/panels/quick-search.ts
41
+ var PALETTE_MODES = [
42
+ {
43
+ mode: "files",
44
+ prefix: "",
45
+ chip: "Files",
46
+ placeholder: "Go to a file…",
47
+ description: "Open a file by any part of its path — pgblog finds pages/blog/index.md."
48
+ },
49
+ {
50
+ mode: "commands",
51
+ prefix: ">",
52
+ chip: "Commands",
53
+ placeholder: "Run a command…",
54
+ description: "Run anything Studio can do, with its keyboard shortcut printed beside it."
55
+ },
56
+ {
57
+ mode: "nodes",
58
+ prefix: "@",
59
+ chip: "Symbols",
60
+ placeholder: "Go to an element in this document…",
61
+ description: "Select an element in the open document by its Outline name."
62
+ },
63
+ {
64
+ mode: "projects",
65
+ prefix: "",
66
+ chip: "Recent Projects",
67
+ placeholder: "Open a recent project…",
68
+ description: "Reopen a project you have had open before."
69
+ },
70
+ {
71
+ mode: "picker",
72
+ prefix: "?",
73
+ chip: "Modes",
74
+ placeholder: "Type ? for modes, > for commands, @ for elements…",
75
+ description: "List these modes."
76
+ }
77
+ ];
78
+ var MODE_SPEC = new Map(PALETTE_MODES.map((spec) => [spec.mode, spec]));
79
+ var PREFIXED_MODES = PALETTE_MODES.filter((spec) => spec.prefix !== "");
80
+ function modeSpec(mode) {
81
+ return MODE_SPEC.get(mode) ?? PALETTE_MODES[0];
82
+ }
83
+ function resolvePaletteMode(requested, raw, projectOpen) {
84
+ const prefixed = PREFIXED_MODES.find((spec) => raw.startsWith(spec.prefix));
85
+ if (prefixed) {
86
+ return resolvePaletteMode(prefixed.mode, raw.slice(1), projectOpen);
87
+ }
88
+ let mode = requested;
89
+ if (mode === "picker" && raw.trim() !== "") {
90
+ mode = "files";
91
+ }
92
+ if (mode === "files" && !projectOpen) {
93
+ mode = "projects";
94
+ }
95
+ return { mode, query: raw };
96
+ }
97
+ var BOUNDARY = new Set(["/", "-", "_", ".", " "]);
98
+ function fuzzyScore(text, query) {
99
+ if (query === "") {
100
+ return 0;
101
+ }
102
+ const haystack = text.toLowerCase();
103
+ const needle = query.toLowerCase();
104
+ const basenameStart = haystack.lastIndexOf("/") + 1;
105
+ let score = 0;
106
+ let cursor = 0;
107
+ let previousIndex = -2;
108
+ for (const char of needle) {
109
+ const index = haystack.indexOf(char, cursor);
110
+ if (index === -1) {
111
+ return null;
112
+ }
113
+ if (index === previousIndex + 1) {
114
+ score += 8;
115
+ }
116
+ if (index === 0 || BOUNDARY.has(haystack[index - 1] ?? "")) {
117
+ score += 6;
118
+ }
119
+ if (index >= basenameStart) {
120
+ score += 4;
121
+ }
122
+ previousIndex = index;
123
+ cursor = index + 1;
124
+ }
125
+ return score - previousIndex * 0.01 - haystack.length * 0.001;
126
+ }
127
+ function rankBy(items, query, key) {
128
+ const scored = [];
129
+ for (const [index, item] of items.entries()) {
130
+ const score = fuzzyScore(key(item), query);
131
+ if (score !== null) {
132
+ scored.push({ index, item, score });
133
+ }
134
+ }
135
+ return scored.toSorted((a, b) => b.score - a.score || a.index - b.index).map((entry) => entry.item);
136
+ }
137
+ function paletteArgs(command) {
138
+ const schema = command.args;
139
+ const properties = schema?.properties;
140
+ if (!schema || !properties) {
141
+ return { kind: "none" };
142
+ }
143
+ const names = Object.keys(properties);
144
+ if (names.length !== 1) {
145
+ return { kind: "unsupported" };
146
+ }
147
+ const name = names[0];
148
+ const property = properties[name];
149
+ if (property.enum) {
150
+ return {
151
+ kind: "choice",
152
+ name,
153
+ choices: property.enum.map((value) => ({ label: String(value), value }))
154
+ };
155
+ }
156
+ if (property.type === "boolean") {
157
+ return {
158
+ kind: "choice",
159
+ name,
160
+ choices: [
161
+ { label: "on", value: true },
162
+ { label: "off", value: false }
163
+ ]
164
+ };
165
+ }
166
+ return { kind: "unsupported" };
167
+ }
168
+ var QUICK_SEARCH_LISTBOX_ID = "quick-search-listbox";
169
+ function optionId(index) {
170
+ return `quick-search-option-${index}`;
171
+ }
172
+ var RECENT_COMMANDS_KEY = "jx-studio-recent-commands";
173
+ var RECENT_COMMANDS_MAX = 6;
174
+ function getRecentCommands() {
175
+ try {
176
+ const raw = JSON.parse(localStorage.getItem(RECENT_COMMANDS_KEY) || "[]");
177
+ return Array.isArray(raw) ? raw.filter((id) => typeof id === "string") : [];
178
+ } catch {
179
+ return [];
180
+ }
181
+ }
182
+ function trackRecentCommand(id) {
183
+ const next = [id, ...getRecentCommands().filter((known) => known !== id)].slice(0, RECENT_COMMANDS_MAX);
184
+ try {
185
+ localStorage.setItem(RECENT_COMMANDS_KEY, JSON.stringify(next));
186
+ } catch {}
187
+ }
188
+ var _ctx = null;
189
+ var _open = false;
190
+ var _requested = "picker";
191
+ var _query = "";
192
+ var _selectedIndex = 0;
193
+ var _files = null;
194
+ var _loading = false;
195
+ var _pending = null;
196
+ function getContainer() {
197
+ return getLayerSlot("popover", "quick-search");
198
+ }
199
+ function initQuickSearch(ctx) {
200
+ _ctx = ctx ?? null;
201
+ }
202
+ function openQuickSearch(mode = "files") {
203
+ _open = true;
204
+ _requested = mode;
205
+ _query = "";
206
+ _selectedIndex = 0;
207
+ _pending = null;
208
+ _files = null;
209
+ renderOverlay();
210
+ ensureFiles();
211
+ }
212
+ function closeQuickSearch() {
213
+ _open = false;
214
+ _pending = null;
215
+ renderOverlay();
216
+ }
217
+ function isQuickSearchOpen() {
218
+ return _open;
219
+ }
220
+ function scopeRoot() {
221
+ return projectState ? projectState.projectRoot ?? null : null;
222
+ }
223
+ function hasProject() {
224
+ return projectState != null;
225
+ }
226
+ function current() {
227
+ return resolvePaletteMode(_requested, _query, hasProject());
228
+ }
229
+ function dirPart(path) {
230
+ const parts = path.split("/");
231
+ parts.pop();
232
+ return parts.length > 0 ? parts.join("/") : "";
233
+ }
234
+ function shortenPath(path) {
235
+ if (path.startsWith("/home/")) {
236
+ return `~/${path.split("/").slice(3).join("/")}`;
237
+ }
238
+ return path;
239
+ }
240
+ async function ensureFiles() {
241
+ if (!_open || _files !== null || _loading || !hasProject()) {
242
+ return;
243
+ }
244
+ _loading = true;
245
+ renderOverlay();
246
+ try {
247
+ await loadFormats();
248
+ const hits = await getPlatform().searchFiles("", documentExtensions());
249
+ _files = hits.map((hit) => ({
250
+ kind: "file",
251
+ path: hit.path,
252
+ name: hit.name ?? hit.path.split("/").pop() ?? "",
253
+ detail: dirPart(hit.path),
254
+ recent: false
255
+ }));
256
+ } catch {
257
+ _files = [];
258
+ }
259
+ _loading = false;
260
+ renderOverlay();
261
+ }
262
+ function fileRows(query) {
263
+ if (query.trim() === "") {
264
+ return getRecentFiles(scopeRoot() ?? undefined).map((file) => ({
265
+ kind: "file",
266
+ path: file.path,
267
+ name: file.name,
268
+ detail: dirPart(file.path),
269
+ recent: true
270
+ }));
271
+ }
272
+ return rankBy(_files ?? [], query.trim(), (row) => row.path);
273
+ }
274
+ function projectRows(query) {
275
+ const rows = getRecentProjects().map((project) => ({
276
+ kind: "project",
277
+ root: project.root,
278
+ name: project.name,
279
+ detail: shortenPath(project.root)
280
+ }));
281
+ return rankBy(rows, query.trim(), (row) => `${row.name}/${row.root}`);
282
+ }
283
+ function commandRows(registry, query) {
284
+ const recents = getRecentCommands();
285
+ const rows = [];
286
+ for (const command of registry.visible()) {
287
+ if (paletteArgs(command).kind === "unsupported") {
288
+ continue;
289
+ }
290
+ if (!(command.menus ?? ["palette"]).includes("palette")) {
291
+ continue;
292
+ }
293
+ rows.push({
294
+ kind: "command",
295
+ id: command.id,
296
+ name: `${command.category}: ${command.title}`,
297
+ detail: registry.disabledReason(command.id) ?? "",
298
+ chord: registry.keymap.formatBinding(command.id) ?? "",
299
+ enabled: registry.isEnabled(command.id),
300
+ recent: recents.includes(command.id)
301
+ });
302
+ }
303
+ const ranked = rankBy(rows, query.trim(), (row) => row.name);
304
+ if (query.trim() !== "") {
305
+ return ranked;
306
+ }
307
+ const pinned = recents.map((id) => ranked.find((row) => row.id === id)).filter((row) => row !== undefined);
308
+ return [...pinned, ...ranked.filter((row) => !pinned.includes(row))];
309
+ }
310
+ function nodeRows(query) {
311
+ const tab = activeTab.value;
312
+ if (!tab) {
313
+ return [];
314
+ }
315
+ const rows = flattenTree(tab.doc.document).map((row) => ({
316
+ kind: "node",
317
+ path: row.path,
318
+ name: row.nodeType === "text" ? String(row.node).slice(0, 60) : nodeLabel(row.node),
319
+ detail: row.nodeType
320
+ }));
321
+ return rankBy(rows, query.trim(), (row) => row.name);
322
+ }
323
+ function modeRows() {
324
+ return PALETTE_MODES.filter((spec) => spec.mode !== "picker").map((spec) => ({
325
+ kind: "mode",
326
+ mode: spec.mode,
327
+ name: spec.chip,
328
+ detail: spec.description,
329
+ chord: spec.prefix
330
+ }));
331
+ }
332
+ function argRows(query) {
333
+ const pending = _pending;
334
+ const rows = pending.choices.map((choice) => ({
335
+ kind: "arg",
336
+ commandId: pending.command.id,
337
+ argName: pending.name,
338
+ value: choice.value,
339
+ name: choice.label,
340
+ detail: `${pending.command.title} → ${pending.name}`
341
+ }));
342
+ return rankBy(rows, query.trim(), (row) => row.name);
343
+ }
344
+ function currentRows() {
345
+ const { mode, query } = current();
346
+ if (_pending) {
347
+ return { rows: argRows(query), showingRecent: false };
348
+ }
349
+ switch (mode) {
350
+ case "commands": {
351
+ const registry = activeRegistry();
352
+ return {
353
+ rows: registry ? commandRows(registry, query) : [],
354
+ showingRecent: query.trim() === ""
355
+ };
356
+ }
357
+ case "nodes": {
358
+ return { rows: nodeRows(query), showingRecent: false };
359
+ }
360
+ case "projects": {
361
+ return { rows: projectRows(query), showingRecent: query.trim() === "" };
362
+ }
363
+ case "picker": {
364
+ return { rows: modeRows(), showingRecent: false };
365
+ }
366
+ default: {
367
+ return { rows: fileRows(query), showingRecent: query.trim() === "" };
368
+ }
369
+ }
370
+ }
371
+ function onInput(e) {
372
+ const raw = e.target.value;
373
+ const prefixed = PREFIXED_MODES.find((spec) => raw.startsWith(spec.prefix));
374
+ if (prefixed) {
375
+ _requested = prefixed.mode;
376
+ _query = raw.slice(1);
377
+ } else {
378
+ _query = raw;
379
+ }
380
+ _selectedIndex = 0;
381
+ renderOverlay();
382
+ ensureFiles();
383
+ }
384
+ function clearMode() {
385
+ _requested = "picker";
386
+ _pending = null;
387
+ _selectedIndex = 0;
388
+ renderOverlay();
389
+ }
390
+ function onKeydown(e) {
391
+ const { rows } = currentRows();
392
+ switch (e.key) {
393
+ case "ArrowDown": {
394
+ e.preventDefault();
395
+ _selectedIndex = Math.min(_selectedIndex + 1, rows.length - 1);
396
+ renderOverlay();
397
+ break;
398
+ }
399
+ case "ArrowUp": {
400
+ e.preventDefault();
401
+ _selectedIndex = Math.max(_selectedIndex - 1, 0);
402
+ renderOverlay();
403
+ break;
404
+ }
405
+ case "Enter": {
406
+ e.preventDefault();
407
+ if (rows[_selectedIndex]) {
408
+ selectRow(rows[_selectedIndex]);
409
+ }
410
+ break;
411
+ }
412
+ case "Backspace": {
413
+ if (_query === "" && (_pending || _requested !== "picker")) {
414
+ e.preventDefault();
415
+ clearMode();
416
+ }
417
+ break;
418
+ }
419
+ case "Escape": {
420
+ e.preventDefault();
421
+ closeQuickSearch();
422
+ break;
423
+ }
424
+ default: {
425
+ break;
426
+ }
427
+ }
428
+ }
429
+ function enterMode(mode) {
430
+ _requested = mode;
431
+ _query = "";
432
+ _selectedIndex = 0;
433
+ renderOverlay();
434
+ ensureFiles();
435
+ }
436
+ function runCommand(command, args) {
437
+ const registry = activeRegistry();
438
+ if (!registry) {
439
+ return;
440
+ }
441
+ trackRecentCommand(command.id);
442
+ closeQuickSearch();
443
+ const report = (error) => {
444
+ console.error(`palette: command "${command.id}" failed`, error);
445
+ };
446
+ try {
447
+ Promise.resolve(registry.run(command.id, args)).catch(report);
448
+ } catch (error) {
449
+ report(error);
450
+ }
451
+ }
452
+ function selectRow(row) {
453
+ switch (row.kind) {
454
+ case "project": {
455
+ closeQuickSearch();
456
+ _ctx?.openRecentProject(row.root);
457
+ return;
458
+ }
459
+ case "file": {
460
+ closeQuickSearch();
461
+ trackRecentFile({ name: row.name, path: row.path, root: scopeRoot() ?? "" });
462
+ openFileInTab(row.path);
463
+ return;
464
+ }
465
+ case "mode": {
466
+ enterMode(row.mode);
467
+ return;
468
+ }
469
+ case "node": {
470
+ const registry = activeRegistry();
471
+ closeQuickSearch();
472
+ registry?.run("selection.set", { path: row.path });
473
+ return;
474
+ }
475
+ case "arg": {
476
+ runCommand(_pending.command, { [row.argName]: row.value });
477
+ return;
478
+ }
479
+ default: {
480
+ selectCommandRow(row);
481
+ }
482
+ }
483
+ }
484
+ function selectCommandRow(row) {
485
+ const registry = activeRegistry();
486
+ const command = registry?.get(row.id);
487
+ if (!registry || !command || !row.enabled) {
488
+ return;
489
+ }
490
+ const args = paletteArgs(command);
491
+ if (args.kind === "choice") {
492
+ _pending = { choices: args.choices, command, name: args.name };
493
+ _query = "";
494
+ _selectedIndex = 0;
495
+ renderOverlay();
496
+ return;
497
+ }
498
+ runCommand(command);
499
+ }
500
+ function fileIcon(name) {
501
+ const ext = name.split(".").pop()?.toLowerCase();
502
+ if (ext === "json") {
503
+ return html`<sp-icon-file-code size="s"></sp-icon-file-code>`;
504
+ }
505
+ if (ext && formatByExtension(ext)) {
506
+ return html`<sp-icon-file-txt size="s"></sp-icon-file-txt>`;
507
+ }
508
+ return html`<sp-icon-document size="s"></sp-icon-document>`;
509
+ }
510
+ function rowIcon(row) {
511
+ switch (row.kind) {
512
+ case "project": {
513
+ return html`<sp-icon-folder-open size="s"></sp-icon-folder-open>`;
514
+ }
515
+ case "file": {
516
+ return fileIcon(row.name);
517
+ }
518
+ case "command": {
519
+ return html`<sp-icon-play size="s"></sp-icon-play>`;
520
+ }
521
+ case "node": {
522
+ return html`<sp-icon-layers size="s"></sp-icon-layers>`;
523
+ }
524
+ default: {
525
+ return html`<sp-icon-chevron-right size="s"></sp-icon-chevron-right>`;
526
+ }
527
+ }
528
+ }
529
+ function rowTrailing(row, showingRecent) {
530
+ if (row.kind === "command" && row.chord) {
531
+ return html`<kbd class="palette-chord">${row.chord}</kbd>`;
532
+ }
533
+ if (row.kind === "mode" && row.chord) {
534
+ return html`<kbd class="palette-chord">${row.chord}</kbd>`;
535
+ }
536
+ if (row.kind === "command" && row.recent) {
537
+ return html`<span class="quick-search-badge">recent</span>`;
538
+ }
539
+ return showingRecent ? html`<span class="quick-search-badge">recent</span>` : nothing;
540
+ }
541
+ function chipTemplate(mode) {
542
+ const label = _pending ? _pending.command.title : modeSpec(mode).chip;
543
+ if (!_pending && mode === "picker") {
544
+ return nothing;
545
+ }
546
+ return html`
547
+ <span class="palette-chip">
548
+ ${label}
549
+ <button
550
+ class="palette-chip-remove"
551
+ type="button"
552
+ title="Clear mode (Backspace)"
553
+ aria-label="Clear mode"
554
+ @click=${clearMode}
555
+ >
556
+ ×
557
+ </button>
558
+ </span>
559
+ `;
560
+ }
561
+ function emptyHint(mode, query) {
562
+ if (_loading) {
563
+ return "Reading the project's files…";
564
+ }
565
+ if (query.trim() !== "") {
566
+ return "No results";
567
+ }
568
+ switch (mode) {
569
+ case "projects": {
570
+ return "No recent projects — open one to get started";
571
+ }
572
+ case "nodes": {
573
+ return "Open a document to jump to its elements";
574
+ }
575
+ case "commands": {
576
+ return "Type to find any command in Studio";
577
+ }
578
+ default: {
579
+ return modeSpec(mode).placeholder;
580
+ }
581
+ }
582
+ }
583
+ function renderOverlay() {
584
+ const container = getContainer();
585
+ if (!_open) {
586
+ render(nothing, container);
587
+ return;
588
+ }
589
+ const { mode, query } = current();
590
+ const { rows, showingRecent } = currentRows();
591
+ const spec = modeSpec(mode);
592
+ const placeholder = _pending ? `Choose a ${_pending.name}…` : spec.placeholder;
593
+ const sectionLabel = _pending ? `${_pending.command.title} — ${_pending.name}` : mode === "projects" ? "Recent projects" : mode === "commands" ? "Recently used" : "Recently opened";
594
+ const tpl = html`
595
+ <div class="quick-search-overlay" @click=${closeQuickSearch}>
596
+ <div class="quick-search-panel" @click=${(e) => e.stopPropagation()}>
597
+ <div class="palette-input-row">
598
+ ${chipTemplate(mode)}
599
+ <input
600
+ class="quick-search-input"
601
+ type="text"
602
+ role="combobox"
603
+ aria-controls=${QUICK_SEARCH_LISTBOX_ID}
604
+ aria-expanded=${rows.length > 0}
605
+ aria-activedescendant=${rows.length > 0 ? optionId(_selectedIndex) : nothing}
606
+ aria-autocomplete="list"
607
+ aria-label=${placeholder}
608
+ placeholder=${placeholder}
609
+ .value=${live(_query)}
610
+ @input=${onInput}
611
+ @keydown=${onKeydown}
612
+ ${ref((el) => {
613
+ if (el) {
614
+ requestAnimationFrame(() => el.focus());
615
+ }
616
+ })}
617
+ />
618
+ </div>
619
+ <div class="quick-search-results" role="listbox" id=${QUICK_SEARCH_LISTBOX_ID}>
620
+ ${rows.length === 0 ? html`<div class="quick-search-empty">${emptyHint(mode, query)}</div>` : nothing}
621
+ ${showingRecent && rows.length > 0 ? html`<div class="quick-search-section-label">${sectionLabel}</div>` : nothing}
622
+ ${rows.map((row, i) => html`
623
+ <div
624
+ class=${classMap({
625
+ "quick-search-item": true,
626
+ disabled: row.kind === "command" && !row.enabled,
627
+ selected: i === _selectedIndex
628
+ })}
629
+ role="option"
630
+ id=${optionId(i)}
631
+ aria-selected=${i === _selectedIndex}
632
+ aria-disabled=${row.kind === "command" && !row.enabled}
633
+ @click=${() => selectRow(row)}
634
+ @mouseenter=${() => {
635
+ _selectedIndex = i;
636
+ renderOverlay();
637
+ }}
638
+ >
639
+ <span class="quick-search-icon">${rowIcon(row)}</span>
640
+ <span class="quick-search-name">${row.name}</span>
641
+ <span class="quick-search-path">${row.detail}</span>
642
+ ${rowTrailing(row, showingRecent)}
643
+ </div>
644
+ `)}
645
+ </div>
646
+ <div class="palette-hint">
647
+ <kbd>↑↓</kbd> move · <kbd>↵</kbd> run · <kbd>?</kbd> modes · <kbd>&gt;</kbd> commands ·
648
+ <kbd>@</kbd> elements
649
+ </div>
650
+ </div>
651
+ </div>
652
+ `;
653
+ render(tpl, container);
654
+ }
655
+
656
+ export { PALETTE_MODES, modeSpec, resolvePaletteMode, fuzzyScore, rankBy, paletteArgs, getRecentCommands, initQuickSearch, openQuickSearch, closeQuickSearch, isQuickSearchOpen };
657
+
658
+ //# debugId=D01DE0145FC9DB1664756E2164756E21
659
+ //# sourceMappingURL=studio-vcetc91k.js.map