@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,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/panels/quick-search.ts"],
4
+ "sourcesContent": [
5
+ "/// <reference lib=\"dom\" />\n/**\n * The Palette — one omnibox, several modes (UX-REDESIGN-PLAN §5.4).\n *\n * This file used to be a filename-substring finder with one hidden domain swap in it: with no\n * project open the same trigger, the same chrome and the same placeholder silently listed recent\n * PROJECTS instead. It is now the surface the whole shell shrinks into — the place a capability\n * goes when it is retired from the chrome (§2 principle 9), which only works if everything is\n * reachable here by name, with its chord printed beside it.\n *\n * Four properties earn that:\n *\n * 1. **Modes are named, prefixed and enumerable.** `>` commands, `@` document nodes, plain text files,\n * and `?` lists them. The mode is echoed as a REMOVABLE CHIP, so the no-project case is a stated\n * `Recent Projects` mode rather than a swap you have to infer. `PALETTE_MODES` is the namespace:\n * P4's Problems and P7's content search are new members, not a new widget.\n * 2. **Files are matched by fuzzy subsequence over the FULL PATH.** `pgblog` finds\n * `pages/blog/index.md`. The backend glob (`**\\/*q*.{json,md}`) can only do a basename\n * substring, so the palette asks it once for the document set and ranks locally — which is also\n * what lets the ranking prefer a basename hit, a word boundary and a consecutive run, in that\n * order.\n * 3. **Every row prints its binding.** That is how a large surface stays discoverable without adding\n * chrome, and it is the mechanism by which the palette teaches the keyboard it replaced.\n * 4. **An unavailable command is GREYED, not hidden**, with its `requires` sentence as the subtitle\n * (§2 principle 4). \"Why can't I\" is the question a palette is uniquely good at answering, and a\n * row that vanishes answers it with silence.\n *\n * The exported names still read `…QuickSearch` because `src/studio.ts` and `src/panels/empty-state.\n * ts` import them and neither is this workstream's file. They are the palette's; the rename is one\n * find-replace in those two call sites.\n */\n\nimport { html, render as litRender, nothing } from \"lit-html\";\nimport { classMap } from \"lit-html/directives/class-map.js\";\nimport { live } from \"lit-html/directives/live.js\";\nimport { ref } from \"lit-html/directives/ref.js\";\nimport { getPlatform } from \"../platform\";\nimport { flattenTree, nodeLabel, projectState } from \"../store\";\nimport { documentExtensions, formatByExtension, loadFormats } from \"../format/format-host\";\nimport { openFileInTab } from \"../files/files\";\nimport { getRecentFiles, getRecentProjects, trackRecentFile } from \"../recent-projects\";\nimport { getLayerSlot } from \"../ui/layers\";\nimport { activeTab } from \"../workspace/workspace\";\nimport { activeRegistry } from \"../commands/active-registry\";\nimport type { PaletteMode } from \"../commands/defaults\";\nimport type { AnyCommand, CommandRegistry } from \"../commands/registry\";\nimport type { JxMutableNode } from \"@jxsuite/schema/types\";\nimport type { JxPath } from \"../state\";\n\nexport type { PaletteMode } from \"../commands/defaults\";\n\n// ─── The mode namespace ───────────────────────────────────────────────────────\n\n/** One palette mode: its prefix, the chip it echoes, and what it says when it is empty. */\nexport interface PaletteModeSpec {\n mode: PaletteMode;\n /** The one character that switches into this mode from any other. `\"\"` = the plain mode. */\n prefix: string;\n /** The removable chip's text, and the row label in `?`. */\n chip: string;\n placeholder: string;\n /** What `?` prints under the mode's name. One sentence, no noun phrases (§2 principle 6). */\n description: string;\n}\n\n/**\n * Every mode, in the order `?` lists them.\n *\n * Declared as data rather than as a switch because three consumers read it: the prefix parser, the\n * chip, and the `?` listing itself — which is what makes the palette able to teach its own\n * namespace instead of hiding it in a docs page.\n */\nexport const PALETTE_MODES: readonly PaletteModeSpec[] = [\n {\n mode: \"files\",\n prefix: \"\",\n chip: \"Files\",\n placeholder: \"Go to a file…\",\n description: \"Open a file by any part of its path — pgblog finds pages/blog/index.md.\",\n },\n {\n mode: \"commands\",\n prefix: \">\",\n chip: \"Commands\",\n placeholder: \"Run a command…\",\n description: \"Run anything Studio can do, with its keyboard shortcut printed beside it.\",\n },\n {\n mode: \"nodes\",\n prefix: \"@\",\n chip: \"Symbols\",\n placeholder: \"Go to an element in this document…\",\n description: \"Select an element in the open document by its Outline name.\",\n },\n {\n mode: \"projects\",\n prefix: \"\",\n chip: \"Recent Projects\",\n placeholder: \"Open a recent project…\",\n description: \"Reopen a project you have had open before.\",\n },\n {\n mode: \"picker\",\n prefix: \"?\",\n chip: \"Modes\",\n placeholder: \"Type ? for modes, > for commands, @ for elements…\",\n description: \"List these modes.\",\n },\n];\n\nconst MODE_SPEC = new Map(PALETTE_MODES.map((spec) => [spec.mode, spec]));\n\n/** The modes a prefix character switches into. `files` and `projects` have no prefix. */\nconst PREFIXED_MODES = PALETTE_MODES.filter((spec) => spec.prefix !== \"\");\n\n/** The spec for a mode. Total: every {@link PaletteMode} is declared above. */\nexport function modeSpec(mode: PaletteMode): PaletteModeSpec {\n return MODE_SPEC.get(mode) ?? PALETTE_MODES[0]!;\n}\n\n/**\n * The mode a raw input actually addresses.\n *\n * Three rules, in order:\n *\n * - A leading prefix character wins, whatever the palette was opened as — that is what `>` and `@`\n * are FOR, and it is why the prefix is stripped out of the query and into the chip.\n * - `picker` with an empty query lists the modes; `picker` with anything typed means files, because\n * ⌘K then typing a filename is the gesture every omnibox has trained people to expect.\n * - Files with no project open is `Recent Projects`. This is the one substitution the old widget made\n * silently; here the chip says so, and `Project: Open Recent…` names it from the outside.\n */\nexport function resolvePaletteMode(\n requested: PaletteMode,\n raw: string,\n projectOpen: boolean,\n): { mode: PaletteMode; query: string } {\n const prefixed = PREFIXED_MODES.find((spec) => raw.startsWith(spec.prefix));\n if (prefixed) {\n return resolvePaletteMode(prefixed.mode, raw.slice(1), projectOpen);\n }\n let mode = requested;\n if (mode === \"picker\" && raw.trim() !== \"\") {\n mode = \"files\";\n }\n if (mode === \"files\" && !projectOpen) {\n mode = \"projects\";\n }\n return { mode, query: raw };\n}\n\n// ─── Fuzzy subsequence ranking ────────────────────────────────────────────────\n\n/** Characters after which a match counts as starting a word — the boundaries a path has. */\nconst BOUNDARY = new Set([\"/\", \"-\", \"_\", \".\", \" \"]);\n\n/**\n * Score `text` against `query` as a subsequence, or `null` when it is not one.\n *\n * Higher is better. The weights encode what a person means when they type six characters at a file\n * tree: a consecutive run is worth much more than scattered letters, a match that starts a path\n * segment is worth more than one mid-word, and — decisively — a match inside the BASENAME beats one\n * in a directory, so typing `index` does not bury `index.md` under `pages/index-partials/x.md`.\n *\n * An empty query scores 0 and matches everything, which is what makes \"show me the recents\" and\n * \"show me every file\" the same code path.\n */\nexport function fuzzyScore(text: string, query: string): number | null {\n if (query === \"\") {\n return 0;\n }\n const haystack = text.toLowerCase();\n const needle = query.toLowerCase();\n const basenameStart = haystack.lastIndexOf(\"/\") + 1;\n let score = 0;\n let cursor = 0;\n let previousIndex = -2;\n for (const char of needle) {\n const index = haystack.indexOf(char, cursor);\n if (index === -1) {\n return null;\n }\n if (index === previousIndex + 1) {\n score += 8;\n }\n if (index === 0 || BOUNDARY.has(haystack[index - 1] ?? \"\")) {\n score += 6;\n }\n if (index >= basenameStart) {\n score += 4;\n }\n previousIndex = index;\n cursor = index + 1;\n }\n // Two tie-breaks, both small enough never to outrank a real structural signal: an earlier first\n // Match, and a shorter path — `pages/index.md` over `pages/blog/drafts/index.md`.\n return score - previousIndex * 0.01 - haystack.length * 0.001;\n}\n\n/** Rank candidates by {@link fuzzyScore}, dropping non-matches. Stable within equal scores. */\nexport function rankBy<T>(items: readonly T[], query: string, key: (item: T) => string): T[] {\n const scored: { item: T; score: number; index: number }[] = [];\n for (const [index, item] of items.entries()) {\n const score = fuzzyScore(key(item), query);\n if (score !== null) {\n scored.push({ index, item, score });\n }\n }\n return scored\n .toSorted((a, b) => b.score - a.score || a.index - b.index)\n .map((entry) => entry.item);\n}\n\n// ─── Argument prompts ─────────────────────────────────────────────────────────\n\n/** One offered value for a command's single argument. */\nexport interface PaletteArgChoice {\n value: unknown;\n label: string;\n}\n\n/** What the palette can do with a command's `args` schema. */\nexport type PaletteArgs =\n | { kind: \"none\" }\n | { kind: \"choice\"; name: string; choices: PaletteArgChoice[] }\n | { kind: \"unsupported\" };\n\ninterface ArgsSchemaShape {\n properties?: Record<string, { type?: string; enum?: readonly unknown[]; description?: string }>;\n required?: readonly string[];\n}\n\n/**\n * How a command's arguments are asked for.\n *\n * The palette can prompt for exactly one closed value space — an `enum` or a boolean — because that\n * is a LIST, and a list is the one thing this widget is. `canvas.setZoom { zoom: number }` and\n * `selection.set { path }` are `\"unsupported\"`, so command mode does not render them: a row that\n * cannot be completed is worse than an absent one, and both are reachable from the surface that\n * owns them (the zoom cluster, the canvas). This is a property of the SCHEMA, not a list of ids, so\n * a command that gains an enum argument becomes promptable without anyone editing this file.\n */\nexport function paletteArgs(command: AnyCommand): PaletteArgs {\n const schema = command.args as ArgsSchemaShape | undefined;\n const properties = schema?.properties;\n if (!schema || !properties) {\n return { kind: \"none\" };\n }\n const names = Object.keys(properties);\n if (names.length !== 1) {\n return { kind: \"unsupported\" };\n }\n const name = names[0]!;\n const property = properties[name]!;\n if (property.enum) {\n return {\n kind: \"choice\",\n name,\n choices: property.enum.map((value) => ({ label: String(value), value })),\n };\n }\n if (property.type === \"boolean\") {\n return {\n kind: \"choice\",\n name,\n choices: [\n { label: \"on\", value: true },\n { label: \"off\", value: false },\n ],\n };\n }\n return { kind: \"unsupported\" };\n}\n\n// ─── Recently-used commands ───────────────────────────────────────────────────\n\n/**\n * The ids the combobox relationship is built from (WAI-ARIA APG, combobox with listbox popup).\n *\n * The input already said `role=\"combobox\"`, but nothing connected it to the list beneath: no\n * `aria-controls`, so a screen reader could not find the popup, and no `aria-activedescendant`, so\n * arrowing through the results moved a visual highlight and announced nothing. `aria-expanded` was\n * the literal string `\"true\"`, which claims a popup is showing even when the query matched\n * nothing.\n */\nconst QUICK_SEARCH_LISTBOX_ID = \"quick-search-listbox\";\n\n/** A stable per-row id, so `aria-activedescendant` has something to point at. */\nfunction optionId(index: number): string {\n return `quick-search-option-${index}`;\n}\n\nconst RECENT_COMMANDS_KEY = \"jx-studio-recent-commands\";\nconst RECENT_COMMANDS_MAX = 6;\n\n/** The ids most recently run FROM THE PALETTE, newest first. Pinned above the rest of the list. */\nexport function getRecentCommands(): string[] {\n try {\n const raw: unknown = JSON.parse(localStorage.getItem(RECENT_COMMANDS_KEY) || \"[]\");\n return Array.isArray(raw) ? raw.filter((id) => typeof id === \"string\") : [];\n } catch {\n return [];\n }\n}\n\nfunction trackRecentCommand(id: string): void {\n const next = [id, ...getRecentCommands().filter((known) => known !== id)].slice(\n 0,\n RECENT_COMMANDS_MAX,\n );\n try {\n localStorage.setItem(RECENT_COMMANDS_KEY, JSON.stringify(next));\n } catch {\n // Storage full or unavailable — the command still ran, it is just not remembered.\n }\n}\n\n// ─── Rows ─────────────────────────────────────────────────────────────────────\n\ninterface FileRow {\n kind: \"file\";\n path: string;\n name: string;\n /** Directory part, shown as the subtitle. */\n detail: string;\n recent: boolean;\n}\ninterface ProjectRow {\n kind: \"project\";\n root: string;\n name: string;\n detail: string;\n}\ninterface CommandRow {\n kind: \"command\";\n id: string;\n /** `\"View: Zen Mode\"` — the palette's own naming convention (§5.1). */\n name: string;\n /** The `requires` sentence when disabled; otherwise empty. */\n detail: string;\n chord: string;\n enabled: boolean;\n recent: boolean;\n}\ninterface NodeRow {\n kind: \"node\";\n path: JxPath;\n name: string;\n detail: string;\n}\ninterface ModeRow {\n kind: \"mode\";\n mode: PaletteMode;\n name: string;\n detail: string;\n chord: string;\n}\ninterface ArgRow {\n kind: \"arg\";\n commandId: string;\n argName: string;\n value: unknown;\n name: string;\n detail: string;\n}\n\ntype PaletteRow = FileRow | ProjectRow | CommandRow | NodeRow | ModeRow | ArgRow;\n\n// ─── State ────────────────────────────────────────────────────────────────────\n\ninterface QuickCtx {\n openRecentProject: (root: string) => void | Promise<void>;\n}\n\nlet _ctx: QuickCtx | null = null;\nlet _open = false;\n/** The mode the palette was OPENED as; the effective one is derived with the query. */\nlet _requested: PaletteMode = \"picker\";\nlet _query = \"\";\nlet _selectedIndex = 0;\n/** The project's document set, fetched once per open. `null` while it has never been asked for. */\nlet _files: FileRow[] | null = null;\nlet _loading = false;\n/** The command awaiting its one argument, or `null`. */\nlet _pending: { command: AnyCommand; name: string; choices: PaletteArgChoice[] } | null = null;\n\nfunction getContainer() {\n return getLayerSlot(\"popover\", \"quick-search\");\n}\n\nexport function initQuickSearch(ctx?: QuickCtx) {\n _ctx = ctx ?? null;\n}\n\n/**\n * Open the palette in `mode`.\n *\n * The default is `\"files\"`, not the picker: every caller that names a mode names one (⌘K passes\n * `\"picker\"`, the pill's segments pass theirs), so the bare call is the \"open a page…\" gesture an\n * empty state offers — and that has to land on files rather than on a list of modes.\n *\n * @param mode Which mode to open in. `\"picker\"` (⌘K) lists the modes until something is typed.\n */\nexport function openQuickSearch(mode: PaletteMode = \"files\") {\n _open = true;\n _requested = mode;\n _query = \"\";\n _selectedIndex = 0;\n _pending = null;\n _files = null;\n renderOverlay();\n void ensureFiles();\n}\n\nexport function closeQuickSearch() {\n _open = false;\n _pending = null;\n renderOverlay();\n}\n\n/** Whether the palette is on screen — the fact the Command Bar's ⌘K affordance reflects. */\nexport function isQuickSearchOpen(): boolean {\n return _open;\n}\n\n/** The project root scoping the palette, or null when no project is open. */\nfunction scopeRoot(): string | null {\n return projectState ? (projectState.projectRoot ?? null) : null;\n}\n\nfunction hasProject(): boolean {\n return projectState != null;\n}\n\n/** The mode and query the current input resolves to. */\nfunction current(): { mode: PaletteMode; query: string } {\n return resolvePaletteMode(_requested, _query, hasProject());\n}\n\n// ─── Row sources ──────────────────────────────────────────────────────────────\n\nfunction dirPart(path: string) {\n const parts = path.split(\"/\");\n parts.pop();\n return parts.length > 0 ? parts.join(\"/\") : \"\";\n}\n\n/** Collapse a home-prefixed absolute path for compact display. */\nfunction shortenPath(path: string) {\n if (path.startsWith(\"/home/\")) {\n return `~/${path.split(\"/\").slice(3).join(\"/\")}`;\n }\n return path;\n}\n\n/**\n * Fetch the project's document set once per open.\n *\n * The empty query is deliberate: `searchFiles`'s glob is `**\\/*<query>*.{json,md,…}`, so an empty\n * one IS \"every document\", and asking for it once buys a client-side fuzzy match over full paths\n * that the glob could never express.\n */\nasync function ensureFiles(): Promise<void> {\n if (!_open || _files !== null || _loading || !hasProject()) {\n return;\n }\n _loading = true;\n renderOverlay();\n try {\n await loadFormats();\n const hits = await getPlatform().searchFiles(\"\", documentExtensions());\n _files = hits.map((hit) => ({\n kind: \"file\" as const,\n path: hit.path,\n name: hit.name ?? hit.path.split(\"/\").pop() ?? \"\",\n detail: dirPart(hit.path),\n recent: false,\n }));\n } catch {\n // A search backend that is down leaves the palette usable in every other mode; the files mode\n // Says \"No results\" rather than pretending the project is empty.\n _files = [];\n }\n _loading = false;\n renderOverlay();\n}\n\nfunction fileRows(query: string): FileRow[] {\n if (query.trim() === \"\") {\n return getRecentFiles(scopeRoot() ?? undefined).map((file) => ({\n kind: \"file\" as const,\n path: file.path,\n name: file.name,\n detail: dirPart(file.path),\n recent: true,\n }));\n }\n return rankBy(_files ?? [], query.trim(), (row) => row.path);\n}\n\nfunction projectRows(query: string): ProjectRow[] {\n const rows = getRecentProjects().map((project) => ({\n kind: \"project\" as const,\n root: project.root,\n name: project.name,\n detail: shortenPath(project.root),\n }));\n return rankBy(rows, query.trim(), (row) => `${row.name}/${row.root}`);\n}\n\n/**\n * Every command the registry holds, ranked — including the ones that cannot run right now.\n *\n * Visibility (`when`) still hides; enablement does not. That split is the whole of §2 principle 4:\n * a command that does not apply to this app at all is absent, and one that does not apply to this\n * MOMENT is greyed and says why.\n */\nfunction commandRows(registry: CommandRegistry, query: string): CommandRow[] {\n const recents = getRecentCommands();\n const rows: CommandRow[] = [];\n for (const command of registry.visible()) {\n if (paletteArgs(command).kind === \"unsupported\") {\n continue;\n }\n if (!(command.menus ?? [\"palette\"]).includes(\"palette\")) {\n continue;\n }\n rows.push({\n kind: \"command\",\n id: command.id,\n name: `${command.category}: ${command.title}`,\n detail: registry.disabledReason(command.id) ?? \"\",\n chord: registry.keymap.formatBinding(command.id) ?? \"\",\n enabled: registry.isEnabled(command.id),\n recent: recents.includes(command.id),\n });\n }\n const ranked = rankBy(rows, query.trim(), (row) => row.name);\n if (query.trim() !== \"\") {\n return ranked;\n }\n // Recents pin above the rest, newest first — the one ordering a palette owes a returning user.\n const pinned = recents\n .map((id) => ranked.find((row) => row.id === id))\n .filter((row): row is CommandRow => row !== undefined);\n return [...pinned, ...ranked.filter((row) => !pinned.includes(row))];\n}\n\nfunction nodeRows(query: string): NodeRow[] {\n const tab = activeTab.value;\n if (!tab) {\n return [];\n }\n const rows: NodeRow[] = flattenTree(tab.doc.document).map((row) => ({\n kind: \"node\" as const,\n path: row.path,\n name:\n row.nodeType === \"text\"\n ? String(row.node).slice(0, 60)\n : nodeLabel(row.node as JxMutableNode),\n detail: row.nodeType,\n }));\n return rankBy(rows, query.trim(), (row) => row.name);\n}\n\nfunction modeRows(): ModeRow[] {\n return PALETTE_MODES.filter((spec) => spec.mode !== \"picker\").map((spec) => ({\n kind: \"mode\" as const,\n mode: spec.mode,\n name: spec.chip,\n detail: spec.description,\n chord: spec.prefix,\n }));\n}\n\nfunction argRows(query: string): ArgRow[] {\n const pending = _pending!;\n const rows: ArgRow[] = pending.choices.map((choice) => ({\n kind: \"arg\" as const,\n commandId: pending.command.id,\n argName: pending.name,\n value: choice.value,\n name: choice.label,\n detail: `${pending.command.title} → ${pending.name}`,\n }));\n return rankBy(rows, query.trim(), (row) => row.name);\n}\n\n/** The rows for the current input, and whether they are a \"recent\" listing rather than a search. */\nfunction currentRows(): { rows: PaletteRow[]; showingRecent: boolean } {\n const { mode, query } = current();\n if (_pending) {\n return { rows: argRows(query), showingRecent: false };\n }\n switch (mode) {\n case \"commands\": {\n const registry = activeRegistry();\n return {\n rows: registry ? commandRows(registry, query) : [],\n showingRecent: query.trim() === \"\",\n };\n }\n case \"nodes\": {\n return { rows: nodeRows(query), showingRecent: false };\n }\n case \"projects\": {\n return { rows: projectRows(query), showingRecent: query.trim() === \"\" };\n }\n case \"picker\": {\n return { rows: modeRows(), showingRecent: false };\n }\n default: {\n return { rows: fileRows(query), showingRecent: query.trim() === \"\" };\n }\n }\n}\n\n// ─── Interaction ──────────────────────────────────────────────────────────────\n\nfunction onInput(e: Event) {\n const raw = (e.target as HTMLInputElement).value;\n const prefixed = PREFIXED_MODES.find((spec) => raw.startsWith(spec.prefix));\n if (prefixed) {\n // The prefix moves OUT of the input and into the chip, so the query the user reads back is the\n // Text they are searching for and Backspace has one obvious meaning at position zero.\n _requested = prefixed.mode;\n _query = raw.slice(1);\n } else {\n _query = raw;\n }\n _selectedIndex = 0;\n renderOverlay();\n void ensureFiles();\n}\n\n/** Drop the mode chip: back to the neutral picker, keeping what was typed. */\nfunction clearMode() {\n _requested = \"picker\";\n _pending = null;\n _selectedIndex = 0;\n renderOverlay();\n}\n\nfunction onKeydown(e: KeyboardEvent) {\n const { rows } = currentRows();\n switch (e.key) {\n case \"ArrowDown\": {\n e.preventDefault();\n _selectedIndex = Math.min(_selectedIndex + 1, rows.length - 1);\n renderOverlay();\n break;\n }\n case \"ArrowUp\": {\n e.preventDefault();\n _selectedIndex = Math.max(_selectedIndex - 1, 0);\n renderOverlay();\n break;\n }\n case \"Enter\": {\n e.preventDefault();\n if (rows[_selectedIndex]) {\n selectRow(rows[_selectedIndex]!);\n }\n break;\n }\n case \"Backspace\": {\n // At position zero the chip is the thing to the left of the caret, so this is the same\n // Gesture as deleting a character — and it is why the chip is removable at all.\n if (_query === \"\" && (_pending || _requested !== \"picker\")) {\n e.preventDefault();\n clearMode();\n }\n break;\n }\n case \"Escape\": {\n e.preventDefault();\n closeQuickSearch();\n break;\n }\n default: {\n break;\n }\n }\n}\n\nfunction enterMode(mode: PaletteMode) {\n _requested = mode;\n _query = \"\";\n _selectedIndex = 0;\n renderOverlay();\n void ensureFiles();\n}\n\nfunction runCommand(command: AnyCommand, args?: Record<string, unknown>) {\n const registry = activeRegistry();\n if (!registry) {\n return;\n }\n trackRecentCommand(command.id);\n closeQuickSearch();\n const report = (error: unknown) => {\n console.error(`palette: command \"${command.id}\" failed`, error);\n };\n // Both shapes, deliberately: `run` may throw synchronously (a coercion refusal from\n // `command-args.ts` does) or reject later. A palette that let either escape would take the\n // Keydown listener down with it, and the overlay is already closed by then.\n try {\n void Promise.resolve(registry.run(command.id, args)).catch(report);\n } catch (error) {\n report(error);\n }\n}\n\nfunction selectRow(row: PaletteRow) {\n switch (row.kind) {\n case \"project\": {\n closeQuickSearch();\n void _ctx?.openRecentProject(row.root);\n return;\n }\n case \"file\": {\n closeQuickSearch();\n trackRecentFile({ name: row.name, path: row.path, root: scopeRoot() ?? \"\" });\n void openFileInTab(row.path);\n return;\n }\n case \"mode\": {\n enterMode(row.mode);\n return;\n }\n case \"node\": {\n const registry = activeRegistry();\n closeQuickSearch();\n void registry?.run(\"selection.set\", { path: row.path });\n return;\n }\n case \"arg\": {\n runCommand(_pending!.command, { [row.argName]: row.value });\n return;\n }\n default: {\n selectCommandRow(row);\n }\n }\n}\n\nfunction selectCommandRow(row: CommandRow) {\n const registry = activeRegistry();\n const command = registry?.get(row.id);\n if (!registry || !command || !row.enabled) {\n // A greyed row is not a dead one: it stays on screen with its reason, and pressing Enter on it\n // Does nothing rather than closing the palette on a refusal the user never asked to see.\n return;\n }\n const args = paletteArgs(command);\n if (args.kind === \"choice\") {\n _pending = { choices: args.choices, command, name: args.name };\n _query = \"\";\n _selectedIndex = 0;\n renderOverlay();\n return;\n }\n runCommand(command);\n}\n\n// ─── Rendering ────────────────────────────────────────────────────────────────\n\nfunction fileIcon(name: string) {\n const ext = name.split(\".\").pop()?.toLowerCase();\n if (ext === \"json\") {\n return html`<sp-icon-file-code size=\"s\"></sp-icon-file-code>`;\n }\n if (ext && formatByExtension(ext)) {\n return html`<sp-icon-file-txt size=\"s\"></sp-icon-file-txt>`;\n }\n return html`<sp-icon-document size=\"s\"></sp-icon-document>`;\n}\n\nfunction rowIcon(row: PaletteRow) {\n switch (row.kind) {\n case \"project\": {\n return html`<sp-icon-folder-open size=\"s\"></sp-icon-folder-open>`;\n }\n case \"file\": {\n return fileIcon(row.name);\n }\n case \"command\": {\n return html`<sp-icon-play size=\"s\"></sp-icon-play>`;\n }\n case \"node\": {\n return html`<sp-icon-layers size=\"s\"></sp-icon-layers>`;\n }\n default: {\n return html`<sp-icon-chevron-right size=\"s\"></sp-icon-chevron-right>`;\n }\n }\n}\n\n/** The right-aligned cell: a chord, a prefix, or the recent badge. */\nfunction rowTrailing(row: PaletteRow, showingRecent: boolean) {\n if (row.kind === \"command\" && row.chord) {\n return html`<kbd class=\"palette-chord\">${row.chord}</kbd>`;\n }\n if (row.kind === \"mode\" && row.chord) {\n return html`<kbd class=\"palette-chord\">${row.chord}</kbd>`;\n }\n if (row.kind === \"command\" && row.recent) {\n return html`<span class=\"quick-search-badge\">recent</span>`;\n }\n return showingRecent ? html`<span class=\"quick-search-badge\">recent</span>` : nothing;\n}\n\n/** The chip echoing the active mode (or the command awaiting an argument), with its remove button. */\nfunction chipTemplate(mode: PaletteMode) {\n const label = _pending ? _pending.command.title : modeSpec(mode).chip;\n if (!_pending && mode === \"picker\") {\n return nothing;\n }\n return html`\n <span class=\"palette-chip\">\n ${label}\n <button\n class=\"palette-chip-remove\"\n type=\"button\"\n title=\"Clear mode (Backspace)\"\n aria-label=\"Clear mode\"\n @click=${clearMode}\n >\n ×\n </button>\n </span>\n `;\n}\n\n/** The sentence an empty result set shows. Never a noun phrase (§2 principle 6). */\nfunction emptyHint(mode: PaletteMode, query: string): string {\n if (_loading) {\n return \"Reading the project's files…\";\n }\n if (query.trim() !== \"\") {\n return \"No results\";\n }\n switch (mode) {\n case \"projects\": {\n return \"No recent projects — open one to get started\";\n }\n case \"nodes\": {\n return \"Open a document to jump to its elements\";\n }\n case \"commands\": {\n return \"Type to find any command in Studio\";\n }\n default: {\n return modeSpec(mode).placeholder;\n }\n }\n}\n\nfunction renderOverlay() {\n const container = getContainer();\n if (!_open) {\n litRender(nothing, container);\n return;\n }\n\n const { mode, query } = current();\n const { rows, showingRecent } = currentRows();\n const spec = modeSpec(mode);\n const placeholder = _pending ? `Choose a ${_pending.name}…` : spec.placeholder;\n const sectionLabel = _pending\n ? `${_pending.command.title} — ${_pending.name}`\n : mode === \"projects\"\n ? \"Recent projects\"\n : mode === \"commands\"\n ? \"Recently used\"\n : \"Recently opened\";\n\n const tpl = html`\n <div class=\"quick-search-overlay\" @click=${closeQuickSearch}>\n <div class=\"quick-search-panel\" @click=${(e: Event) => e.stopPropagation()}>\n <div class=\"palette-input-row\">\n ${chipTemplate(mode)}\n <input\n class=\"quick-search-input\"\n type=\"text\"\n role=\"combobox\"\n aria-controls=${QUICK_SEARCH_LISTBOX_ID}\n aria-expanded=${rows.length > 0}\n aria-activedescendant=${rows.length > 0 ? optionId(_selectedIndex) : nothing}\n aria-autocomplete=\"list\"\n aria-label=${placeholder}\n placeholder=${placeholder}\n .value=${live(_query)}\n @input=${onInput}\n @keydown=${onKeydown}\n ${ref((el) => {\n if (el) {\n requestAnimationFrame(() => (el as HTMLInputElement).focus());\n }\n })}\n />\n </div>\n <div class=\"quick-search-results\" role=\"listbox\" id=${QUICK_SEARCH_LISTBOX_ID}>\n ${\n rows.length === 0\n ? html`<div class=\"quick-search-empty\">${emptyHint(mode, query)}</div>`\n : nothing\n }\n ${\n showingRecent && rows.length > 0\n ? html`<div class=\"quick-search-section-label\">${sectionLabel}</div>`\n : nothing\n }\n ${rows.map(\n (row, i) => html`\n <div\n class=${classMap({\n \"quick-search-item\": true,\n disabled: row.kind === \"command\" && !row.enabled,\n selected: i === _selectedIndex,\n })}\n role=\"option\"\n id=${optionId(i)}\n aria-selected=${i === _selectedIndex}\n aria-disabled=${row.kind === \"command\" && !row.enabled}\n @click=${() => selectRow(row)}\n @mouseenter=${() => {\n _selectedIndex = i;\n renderOverlay();\n }}\n >\n <span class=\"quick-search-icon\">${rowIcon(row)}</span>\n <span class=\"quick-search-name\">${row.name}</span>\n <span class=\"quick-search-path\">${row.detail}</span>\n ${rowTrailing(row, showingRecent)}\n </div>\n `,\n )}\n </div>\n <div class=\"palette-hint\">\n <kbd>↑↓</kbd> move · <kbd>↵</kbd> run · <kbd>?</kbd> modes · <kbd>&gt;</kbd> commands ·\n <kbd>@</kbd> elements\n </div>\n </div>\n </div>\n `;\n\n litRender(tpl, container);\n}\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "D01DE0145FC9DB1664756E2164756E21",
9
+ "names": []
10
+ }