@jxsuite/studio 6.1.1 → 8.0.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 (785) hide show
  1. package/README.md +5 -5
  2. package/dist/chunks/2020-5wtzce5g.js +4 -0
  3. package/dist/chunks/{action-group-2mqby73c.js → action-group-4aan7g6g.js} +3 -3
  4. package/dist/chunks/adapter-5tphg7xe.js +4 -0
  5. package/dist/chunks/add-new-flow-psym14sn.js +4 -0
  6. package/dist/chunks/cf-account-picker-haqazq5r.js +4 -0
  7. package/dist/chunks/cf-settings-h2wrh6hq.js +4 -0
  8. package/dist/chunks/color-area-6rbra5dy.js +4 -0
  9. package/dist/chunks/color-field-gy56c94g.js +4 -0
  10. package/dist/chunks/color-m7r1vk54.js +4 -0
  11. package/dist/chunks/color-slider-sqqdyf6c.js +4 -0
  12. package/dist/chunks/combobox-72h32ejk.js +4 -0
  13. package/dist/chunks/components-r22xca09.js +4 -0
  14. package/dist/chunks/content-source-mmppmcyg.js +4 -0
  15. package/dist/chunks/convert-to-repeater-he70fc2b.js +4 -0
  16. package/dist/chunks/dialog-c4x05vyx.js +4 -0
  17. package/dist/chunks/editor-ccd9jwsa.js +4 -0
  18. package/dist/chunks/entry-commands-6qxz9e8p.js +4 -0
  19. package/dist/chunks/extension-sections-0egb88dm.js +4 -0
  20. package/dist/chunks/file-ops-qnab36ek.js +4 -0
  21. package/dist/chunks/files-rcn56qvm.js +4 -0
  22. package/dist/chunks/format-host-yxz0kjjs.js +4 -0
  23. package/dist/chunks/fs-events-d1qxq4z4.js +4 -0
  24. package/dist/chunks/grid-open-4z1g062t.js +4 -0
  25. package/dist/chunks/grid-view-qg1b5eqx.js +51 -0
  26. package/dist/chunks/icons-63bjtbs7.js +4 -0
  27. package/dist/chunks/iframe-entry-2zggzajv.js +5 -0
  28. package/dist/chunks/iframe-entry-76j8vwwx.js +5 -0
  29. package/dist/chunks/iframe-entry-99nr5zfb.js +5 -0
  30. package/dist/chunks/iframe-entry-pkgmcgp0.js +5 -0
  31. package/dist/chunks/iframe-host-ssv7kyj0.js +4 -0
  32. package/dist/chunks/{index-2veqmnhr.js → index-32eqzv1k.js} +3 -3
  33. package/dist/chunks/index-f0jn7nnp.js +4 -0
  34. package/dist/chunks/{javascript-8nbvs12s.js → javascript-pjp734q4.js} +3 -3
  35. package/dist/chunks/jsonMode-njkvsa02.js +13 -0
  36. package/dist/chunks/jx-validate-ttasrbh7.js +4 -0
  37. package/dist/chunks/layers-bgyr11tr.js +4 -0
  38. package/dist/chunks/layers-panel-7ez66zeq.js +4 -0
  39. package/dist/chunks/listbox-c421cf8c.js +4 -0
  40. package/dist/chunks/lit-html-v9gh687x.js +4 -0
  41. package/dist/chunks/media-library-sq468wts.js +4 -0
  42. package/dist/chunks/media-picker-shfe59pt.js +4 -0
  43. package/dist/chunks/menu-bdpzbfvs.js +4 -0
  44. package/dist/chunks/monaco-binding-vq1hgnn0.js +4 -0
  45. package/dist/chunks/monaco-buffer-3afgwvbp.js +4 -0
  46. package/dist/chunks/monaco-setup-xrd2cbkp.js +4 -0
  47. package/dist/chunks/notify-kzrjr3fv.js +4 -0
  48. package/dist/chunks/number-field-y62xq0ty.js +4 -0
  49. package/dist/chunks/parse-v77xtwv7.js +4 -0
  50. package/dist/chunks/platform-7v4rtd7m.js +4 -0
  51. package/dist/chunks/popover-b89sfej7.js +4 -0
  52. package/dist/chunks/publish-panel-2z9gw8ee.js +4 -0
  53. package/dist/chunks/publish-quick-qx2455cj.js +4 -0
  54. package/dist/chunks/publish-workspace-wrc1dgwx.js +4 -0
  55. package/dist/chunks/quick-search-n0t0eqxb.js +4 -0
  56. package/dist/chunks/references-9547rg5s.js +4 -0
  57. package/dist/chunks/right-panel-wsgnr9pn.js +4 -0
  58. package/dist/chunks/select-rzds841e.js +4 -0
  59. package/dist/chunks/source-control-kwktr9y6.js +4 -0
  60. package/dist/chunks/split-c9zfdgxf.js +4 -0
  61. package/dist/chunks/studio-03ct6yfv.js +9 -0
  62. package/dist/chunks/studio-07rcfje3.js +5 -0
  63. package/dist/chunks/studio-3e54qh39.js +7 -0
  64. package/dist/chunks/studio-3exxhz5g.js +5 -0
  65. package/dist/chunks/studio-3q40e3rj.js +5 -0
  66. package/dist/chunks/studio-3qeh9t0h.js +6 -0
  67. package/dist/chunks/studio-3qqjeep5.js +6 -0
  68. package/dist/chunks/studio-43sd2mam.js +4 -0
  69. package/dist/chunks/studio-4hp8pkyt.js +5 -0
  70. package/dist/chunks/studio-58xg6j2q.js +9 -0
  71. package/dist/chunks/studio-5g0rprdt.js +7 -0
  72. package/dist/chunks/studio-6m380wp7.js +5 -0
  73. package/dist/chunks/studio-80jyh1xh.js +4 -0
  74. package/dist/chunks/studio-83mk4bgg.js +9 -0
  75. package/dist/chunks/{studio-kggey1jt.js → studio-881z1xrx.js} +4 -4
  76. package/dist/chunks/studio-8m0y2qe7.js +5 -0
  77. package/dist/chunks/studio-8tr6cfrc.js +5 -0
  78. package/dist/chunks/studio-8vcvfs7r.js +6 -0
  79. package/dist/chunks/studio-9tmebf0s.js +5 -0
  80. package/dist/chunks/studio-a2bvaptz.js +5 -0
  81. package/dist/chunks/studio-b7y5mr30.js +5 -0
  82. package/dist/chunks/studio-bavb31r0.js +5 -0
  83. package/dist/chunks/studio-bbe4c90a.js +5 -0
  84. package/dist/chunks/studio-c05wdnt3.js +5 -0
  85. package/dist/chunks/studio-ccv2svc6.js +5 -0
  86. package/dist/chunks/studio-d5grtb9e.js +16 -0
  87. package/dist/chunks/studio-df0baea9.js +5 -0
  88. package/dist/chunks/studio-dgk4dqtx.js +7 -0
  89. package/dist/chunks/studio-e1g64q43.js +5 -0
  90. package/dist/chunks/studio-ed1hp6zf.js +6 -0
  91. package/dist/chunks/studio-ed3xx40h.js +7 -0
  92. package/dist/chunks/studio-f14e1zdj.js +5 -0
  93. package/dist/chunks/studio-fbhxxc5f.js +5 -0
  94. package/dist/chunks/studio-fyh0jc96.js +5 -0
  95. package/dist/chunks/studio-gcxk20n7.js +5 -0
  96. package/dist/chunks/studio-jaaz8ce9.js +5 -0
  97. package/dist/chunks/{studio-8grwxtqk.js → studio-jcnsdaep.js} +4 -4
  98. package/dist/chunks/studio-jsgf2q5k.js +7 -0
  99. package/dist/chunks/{studio-1q1sh2ax.js → studio-k3xxbagr.js} +3 -3
  100. package/dist/chunks/studio-k7evxqh4.js +5 -0
  101. package/dist/chunks/studio-kt3pjkwd.js +5 -0
  102. package/dist/chunks/studio-m8g16bgz.js +5 -0
  103. package/dist/chunks/studio-mn0476ag.js +5 -0
  104. package/dist/chunks/studio-mx1smyq0.js +5 -0
  105. package/dist/chunks/studio-n0c5h6mf.js +5 -0
  106. package/dist/chunks/{studio-rv11kfwa.js → studio-nh6d342n.js} +7 -7
  107. package/dist/chunks/studio-nqxqf8p2.js +4 -0
  108. package/dist/chunks/studio-p4nrkvqr.js +5 -0
  109. package/dist/chunks/{studio-h46vtzk8.js → studio-pbxa5fpc.js} +4 -4
  110. package/dist/chunks/studio-pgmvdv7z.js +7 -0
  111. package/dist/chunks/studio-ph84avkf.js +5 -0
  112. package/dist/chunks/{studio-wszjyh0j.js → studio-q0mvbaq6.js} +4 -4
  113. package/dist/chunks/studio-q0tccd43.js +5 -0
  114. package/dist/chunks/studio-q7rtx6zq.js +14 -0
  115. package/dist/chunks/{studio-pre0skq6.js → studio-qgh13jtz.js} +4 -4
  116. package/dist/chunks/studio-qmn1xc24.js +5 -0
  117. package/dist/chunks/studio-qwdqwkj0.js +5 -0
  118. package/dist/chunks/{studio-t6b6qe31.js → studio-r5qy30vx.js} +4 -4
  119. package/dist/chunks/studio-rj9eamf8.js +5 -0
  120. package/dist/chunks/studio-rptgsk96.js +5 -0
  121. package/dist/chunks/studio-rthyg42z.js +928 -0
  122. package/dist/chunks/studio-s19tp1xr.js +5 -0
  123. package/dist/chunks/studio-s32578pn.js +5 -0
  124. package/dist/chunks/studio-svb7yyve.js +5 -0
  125. package/dist/chunks/studio-syreb644.js +5 -0
  126. package/dist/chunks/studio-tf9jryb1.js +10 -0
  127. package/dist/chunks/studio-tfkznv39.js +5 -0
  128. package/dist/chunks/studio-tft6r105.js +5 -0
  129. package/dist/chunks/studio-txf2kysx.js +5 -0
  130. package/dist/chunks/studio-v8867ddv.js +12 -0
  131. package/dist/chunks/studio-vxq7fcvv.js +5 -0
  132. package/dist/chunks/studio-w4rz9hdk.js +5 -0
  133. package/dist/chunks/studio-wbcjbhy1.js +9 -0
  134. package/dist/chunks/studio-wc649wss.js +5 -0
  135. package/dist/chunks/studio-wys23mxz.js +5 -0
  136. package/dist/chunks/studio-x1x167jh.js +5 -0
  137. package/dist/chunks/studio-x9hsze61.js +5 -0
  138. package/dist/chunks/studio-y0n7yxea.js +9 -0
  139. package/dist/chunks/studio-y3ahhdpx.js +5 -0
  140. package/dist/chunks/studio-z97c48fk.js +5 -0
  141. package/dist/chunks/studio-zat62m0c.js +5 -0
  142. package/dist/chunks/studio-zcd2e7yz.js +5 -0
  143. package/dist/chunks/studio-zz9qe3rw.js +64 -0
  144. package/dist/chunks/swatch-group-ewh24n1f.js +4 -0
  145. package/dist/chunks/tabs-f5cw3tgp.js +4 -0
  146. package/dist/chunks/textfield-wewc8rq2.js +4 -0
  147. package/dist/chunks/toast-1gv0h53h.js +4 -0
  148. package/dist/chunks/toast-host-1yg5ar8d.js +4 -0
  149. package/dist/chunks/{toolbar-2nnzqhrj.js → toolbar-44cm5cta.js} +3 -3
  150. package/dist/chunks/tooltip-yypz28gq.js +4 -0
  151. package/dist/chunks/tree-9xa4hm7n.js +4 -0
  152. package/dist/chunks/tsMode-epyfz1hv.js +14 -0
  153. package/dist/chunks/workspace-dz7nxfhv.js +4 -0
  154. package/dist/chunks/workspace-home-xsd7hkjw.js +4 -0
  155. package/dist/chunks/ws-client-bv552sfx.js +4 -0
  156. package/dist/iframe-entry.js +20 -16
  157. package/dist/manifest.json +77 -63
  158. package/dist/studio.js +106 -107
  159. package/dist/workers/ts.worker.js +3 -3
  160. package/package.json +17 -16
  161. package/src/about/about-modal.ts +4 -3
  162. package/src/account/action-flow.ts +45 -38
  163. package/src/account-status.ts +7 -2
  164. package/src/browse/component-examples.ts +272 -0
  165. package/src/browse/library-commands.ts +64 -104
  166. package/src/browse/library-layouts.ts +270 -53
  167. package/src/browse/library-model.ts +194 -134
  168. package/src/browse/library-pane.ts +748 -440
  169. package/src/browse/library-preview.ts +161 -26
  170. package/src/browse/library-source.ts +308 -41
  171. package/src/browse/preview-root.ts +78 -0
  172. package/src/browse/preview-style.ts +155 -0
  173. package/src/canvas/asset-refs.ts +40 -10
  174. package/src/canvas/asset-resolve.ts +19 -23
  175. package/src/canvas/canvas-helpers.ts +7 -6
  176. package/src/canvas/canvas-live-render.ts +260 -77
  177. package/src/canvas/canvas-origin.ts +37 -12
  178. package/src/canvas/canvas-page-context.ts +112 -0
  179. package/src/canvas/canvas-patcher.ts +30 -30
  180. package/src/canvas/canvas-perf.ts +11 -5
  181. package/src/canvas/canvas-render.ts +175 -148
  182. package/src/canvas/canvas-surface.ts +5 -3
  183. package/src/canvas/canvas-utils.ts +147 -61
  184. package/src/canvas/dialog-path.ts +9 -4
  185. package/src/canvas/dialog-state.ts +1 -2
  186. package/src/canvas/diff-marks.ts +9 -16
  187. package/src/canvas/diff-toolbar.ts +8 -7
  188. package/src/canvas/edit-width-drag.ts +4 -1
  189. package/src/canvas/edit-width.ts +1 -3
  190. package/src/canvas/iframe-channel.ts +27 -13
  191. package/src/canvas/iframe-drop.ts +120 -12
  192. package/src/canvas/iframe-editable-root.ts +29 -16
  193. package/src/canvas/iframe-entry.ts +104 -75
  194. package/src/canvas/iframe-eval.ts +73 -49
  195. package/src/canvas/iframe-host.ts +269 -158
  196. package/src/canvas/iframe-inline-edit.ts +49 -30
  197. package/src/canvas/iframe-insert.ts +5 -4
  198. package/src/canvas/iframe-interaction.ts +30 -25
  199. package/src/canvas/iframe-keys.ts +11 -0
  200. package/src/canvas/iframe-overlay.ts +1 -1
  201. package/src/canvas/iframe-patch.ts +25 -21
  202. package/src/canvas/iframe-position.ts +12 -6
  203. package/src/canvas/iframe-protocol.ts +36 -21
  204. package/src/canvas/iframe-render.ts +84 -35
  205. package/src/canvas/iframe-slash.ts +24 -11
  206. package/src/canvas/iframe-subtree.ts +10 -3
  207. package/src/canvas/npm-modules.ts +22 -0
  208. package/src/canvas/path-mapping.ts +19 -12
  209. package/src/canvas/popover-path.ts +7 -3
  210. package/src/canvas/popover-state.ts +1 -2
  211. package/src/canvas/preview-navigate.ts +16 -0
  212. package/src/canvas/repeater-sources.ts +200 -0
  213. package/src/canvas/serialize-scope.ts +13 -5
  214. package/src/canvas/stage-scrollbar.ts +7 -2
  215. package/src/canvas/surface-registry.ts +27 -3
  216. package/src/collab/collab-commands.ts +7 -2
  217. package/src/collab/collab-session.ts +84 -45
  218. package/src/collab/collab-state.ts +4 -3
  219. package/src/collab/monaco-binding.ts +16 -13
  220. package/src/collab/monaco-cursors.ts +5 -2
  221. package/src/commands/app-commands.ts +16 -6
  222. package/src/commands/budget.ts +13 -11
  223. package/src/commands/command-args.ts +103 -71
  224. package/src/commands/context.ts +55 -28
  225. package/src/commands/defaults.ts +69 -45
  226. package/src/commands/keymap.ts +56 -43
  227. package/src/commands/levels.ts +14 -8
  228. package/src/commands/live-context.ts +9 -7
  229. package/src/commands/reference.ts +2 -1
  230. package/src/commands/registry.ts +22 -11
  231. package/src/commands/run-reported.ts +15 -10
  232. package/src/component-props.ts +46 -30
  233. package/src/content/collection-match.ts +11 -9
  234. package/src/content/collection-pages.ts +412 -0
  235. package/src/content/content-collections.ts +270 -0
  236. package/src/content/draft-state.ts +4 -3
  237. package/src/content/entry-commands.ts +54 -62
  238. package/src/content/entry-editor.ts +137 -32
  239. package/src/content/entry-fields.ts +25 -8
  240. package/src/content/entry-inspector.ts +225 -0
  241. package/src/content/entry-model.ts +38 -15
  242. package/src/content/entry-open.ts +80 -0
  243. package/src/content/entry-summaries.ts +440 -0
  244. package/src/content/file-record-ids.ts +80 -0
  245. package/src/content/file-records.ts +125 -0
  246. package/src/content/page-summaries.ts +129 -0
  247. package/src/content/record-entry.ts +201 -0
  248. package/src/content/writing-banner.ts +177 -0
  249. package/src/create/add-new-commands.ts +185 -0
  250. package/src/create/add-new-flow.ts +1116 -0
  251. package/src/create/add-new.ts +1014 -0
  252. package/src/create/element-name.ts +121 -0
  253. package/src/editor/canvas-context-menu.ts +1 -2
  254. package/src/editor/canvas-slash-bridge.ts +3 -6
  255. package/src/editor/content-slice.ts +16 -14
  256. package/src/editor/context-menu.ts +35 -22
  257. package/src/editor/convert-targets.ts +30 -35
  258. package/src/editor/convert-to-component.ts +78 -48
  259. package/src/editor/convert-to-repeater.ts +34 -22
  260. package/src/editor/editable-tags.ts +17 -2
  261. package/src/editor/file-drop-action.ts +29 -22
  262. package/src/editor/inline-edit-apply.ts +79 -17
  263. package/src/editor/inline-edit.ts +76 -50
  264. package/src/editor/inline-format.ts +59 -56
  265. package/src/editor/inline-link.ts +40 -15
  266. package/src/editor/insert-component.ts +91 -0
  267. package/src/editor/insert-zone-action.ts +14 -5
  268. package/src/editor/merge-tags.ts +58 -19
  269. package/src/editor/repeater-scope.ts +39 -28
  270. package/src/editor/shortcuts.ts +76 -42
  271. package/src/editor/slash-menu.ts +52 -14
  272. package/src/files/asset-versions.ts +4 -4
  273. package/src/files/components.ts +89 -20
  274. package/src/files/elements.ts +5 -6
  275. package/src/files/file-ops.ts +92 -41
  276. package/src/files/files.ts +248 -239
  277. package/src/files/fs-events.ts +18 -7
  278. package/src/files/media-meta.ts +97 -2
  279. package/src/files/media-paths.ts +3 -0
  280. package/src/files/media-types.ts +55 -0
  281. package/src/files/media-upload.ts +209 -52
  282. package/src/files/new-file-name.ts +156 -0
  283. package/src/files/serialize-document.ts +15 -5
  284. package/src/format/constraints.ts +1 -1
  285. package/src/format/convert-file.ts +27 -13
  286. package/src/format/format-choices.ts +2 -1
  287. package/src/format/format-host.ts +91 -50
  288. package/src/github/github-auth-status.ts +27 -3
  289. package/src/github/github-auth.ts +21 -11
  290. package/src/github/github-publish.ts +28 -23
  291. package/src/grid/cell-editors.ts +46 -31
  292. package/src/grid/cell-popovers.ts +5 -3
  293. package/src/grid/edit-buffer.ts +10 -9
  294. package/src/grid/grid-controller.ts +25 -23
  295. package/src/grid/grid-layout.ts +21 -5
  296. package/src/grid/grid-open.ts +3 -33
  297. package/src/grid/grid-panel.ts +65 -6
  298. package/src/grid/grid-reveal.ts +34 -0
  299. package/src/grid/grid-source.ts +9 -31
  300. package/src/grid/grid-view.ts +45 -23
  301. package/src/grid/redirects-grid.ts +14 -5
  302. package/src/grid/redirects.ts +16 -14
  303. package/src/grid/schema-columns.ts +25 -19
  304. package/src/grid/sources/connector-source.ts +47 -20
  305. package/src/grid/sources/content-source.ts +100 -31
  306. package/src/grid/sources/csv-file-source.ts +2 -2
  307. package/src/grid/tabulator-tables.d.ts +61 -34
  308. package/src/hosting/document.ts +2 -2
  309. package/src/hosting/stage.ts +7 -7
  310. package/src/i18n/i18n-commands.ts +3 -3
  311. package/src/media/media-commands.ts +181 -0
  312. package/src/media/media-library-model.ts +232 -0
  313. package/src/media/media-library.ts +1283 -0
  314. package/src/media/media-pane.ts +51 -20
  315. package/src/new-project/add-repo-modal.ts +20 -19
  316. package/src/new-project/import-tab.ts +10 -14
  317. package/src/new-project/location-fields.ts +2 -1
  318. package/src/new-project/new-project-modal.ts +12 -9
  319. package/src/packages/jxsuite-update.ts +4 -3
  320. package/src/packages/pull-package-sync.ts +26 -25
  321. package/src/page-params.ts +97 -68
  322. package/src/panels/activity-panel.ts +38 -14
  323. package/src/panels/ai-chat/attached-context.ts +13 -7
  324. package/src/panels/ai-chat/chat-markdown.ts +8 -8
  325. package/src/panels/ai-chat/chat-view.ts +80 -73
  326. package/src/panels/ai-chat/composer.ts +30 -33
  327. package/src/panels/ai-chat/sessions-view.ts +1 -2
  328. package/src/panels/ai-panel.ts +23 -20
  329. package/src/panels/block-action-bar.ts +57 -46
  330. package/src/panels/bottom-dock.ts +5 -3
  331. package/src/panels/canvas-dnd-bridge.ts +36 -26
  332. package/src/panels/chat-panel.ts +6 -6
  333. package/src/panels/collections-panel.ts +306 -0
  334. package/src/panels/component-preview.ts +35 -13
  335. package/src/panels/data-explorer.ts +63 -26
  336. package/src/panels/data-grid.ts +18 -11
  337. package/src/panels/dnd.ts +115 -138
  338. package/src/panels/editors.ts +52 -21
  339. package/src/panels/elements-panel.ts +19 -5
  340. package/src/panels/empty-state.ts +2 -2
  341. package/src/panels/events-panel.ts +84 -69
  342. package/src/panels/formula-workspace.ts +78 -54
  343. package/src/panels/frontmatter-fields.ts +33 -28
  344. package/src/panels/git-diff-open.ts +10 -6
  345. package/src/panels/head-panel.ts +488 -202
  346. package/src/panels/i18n-panel.ts +20 -12
  347. package/src/panels/imports-panel.ts +25 -47
  348. package/src/panels/jump-bar.ts +75 -31
  349. package/src/panels/layers-panel.ts +130 -101
  350. package/src/panels/left-panel.ts +25 -11
  351. package/src/panels/navigator-panels.ts +23 -11
  352. package/src/panels/pane-context.ts +140 -49
  353. package/src/panels/pane-grid.ts +55 -26
  354. package/src/panels/panel-registry.ts +36 -46
  355. package/src/panels/properties-panel.ts +182 -124
  356. package/src/panels/quick-search.ts +53 -31
  357. package/src/panels/right-panel.ts +201 -45
  358. package/src/panels/seo-modal.ts +54 -125
  359. package/src/panels/settings-menu.ts +63 -61
  360. package/src/panels/settings-pane.ts +268 -162
  361. package/src/panels/signals-panel.ts +156 -135
  362. package/src/panels/site-model.ts +367 -0
  363. package/src/panels/site-panel.ts +638 -0
  364. package/src/panels/statement-editor.ts +230 -140
  365. package/src/panels/style-panel.ts +253 -206
  366. package/src/panels/style-utils.ts +114 -51
  367. package/src/panels/stylebook-doc.ts +195 -60
  368. package/src/panels/stylebook-layers-panel.ts +48 -89
  369. package/src/panels/stylebook-panel.ts +60 -27
  370. package/src/panels/styles-panel.ts +327 -0
  371. package/src/panels/tab-drop.ts +27 -11
  372. package/src/panels/tab-strip.ts +143 -49
  373. package/src/platform-errors.ts +57 -43
  374. package/src/platform.ts +59 -31
  375. package/src/platforms/cloud.ts +373 -176
  376. package/src/platforms/default-platform.ts +14 -8
  377. package/src/platforms/devserver.ts +180 -142
  378. package/src/platforms/read-batcher.ts +16 -8
  379. package/src/project-list.ts +2 -1
  380. package/src/publish/deploy-checklist.ts +20 -9
  381. package/src/publish/pages-service.ts +66 -27
  382. package/src/publish/publish-changes.ts +491 -0
  383. package/src/publish/publish-commands.ts +88 -22
  384. package/src/publish/publish-ids.ts +49 -0
  385. package/src/publish/publish-panel.ts +10 -6
  386. package/src/publish/publish-quick.ts +148 -0
  387. package/src/publish/publish-workspace.ts +926 -0
  388. package/src/publish/source-control.ts +907 -0
  389. package/src/recent-projects.ts +15 -8
  390. package/src/resize-edges.ts +26 -36
  391. package/src/services/a11y-report.ts +26 -19
  392. package/src/services/agent-seed.ts +23 -11
  393. package/src/services/ai-ask.ts +9 -12
  394. package/src/services/ai-command-tools.ts +68 -62
  395. package/src/services/ai-import-tools.ts +80 -67
  396. package/src/services/ai-models.ts +17 -13
  397. package/src/services/ai-project-tools.ts +68 -32
  398. package/src/services/ai-session-store.ts +19 -10
  399. package/src/services/ai-system-prompt.ts +46 -20
  400. package/src/services/ai-tools.ts +71 -27
  401. package/src/services/ai-write-report.ts +20 -12
  402. package/src/services/ai-writes.ts +4 -4
  403. package/src/services/automation.ts +74 -51
  404. package/src/services/cem-export.ts +149 -58
  405. package/src/services/cf-settings.ts +4 -4
  406. package/src/services/clock.ts +6 -1
  407. package/src/services/code-services.ts +37 -31
  408. package/src/services/connection.ts +2 -2
  409. package/src/services/context-manager.ts +14 -10
  410. package/src/services/context-resolver.ts +20 -8
  411. package/src/services/data-service.ts +19 -15
  412. package/src/services/directory-picker.ts +20 -14
  413. package/src/services/document-assistant.ts +39 -19
  414. package/src/services/gated-registry.ts +10 -6
  415. package/src/services/harness/chat-reducer.ts +23 -1
  416. package/src/services/import-client.ts +91 -38
  417. package/src/services/import-seed.ts +8 -2
  418. package/src/services/jx-validate.ts +28 -31
  419. package/src/services/live-preview.ts +0 -0
  420. package/src/services/live-surfaces.ts +6 -3
  421. package/src/services/model-uri.ts +10 -2
  422. package/src/services/module-preloads.ts +12 -8
  423. package/src/services/monaco-buffer.ts +43 -24
  424. package/src/services/monaco-lazy.ts +7 -8
  425. package/src/services/monaco-setup.ts +23 -16
  426. package/src/services/notify.ts +44 -17
  427. package/src/services/popover-report.ts +25 -10
  428. package/src/services/preview-eval.ts +20 -8
  429. package/src/services/profile.ts +13 -6
  430. package/src/services/project-path.ts +13 -10
  431. package/src/services/references.ts +0 -0
  432. package/src/services/render-critic.ts +29 -9
  433. package/src/services/settings/definitions.ts +25 -14
  434. package/src/services/settings/kernel.ts +13 -4
  435. package/src/services/settings/write-queue.ts +9 -9
  436. package/src/services/token-lint.ts +12 -10
  437. package/src/services/tool-executor.ts +17 -5
  438. package/src/services/tool-outcomes.ts +44 -24
  439. package/src/services/trusted-types.ts +24 -7
  440. package/src/settings/contexts-section.ts +11 -8
  441. package/src/settings/contributed-section.ts +128 -70
  442. package/src/settings/css-vars-editor.ts +119 -32
  443. package/src/settings/defs-editor.ts +38 -35
  444. package/src/settings/developer-panels.ts +43 -0
  445. package/src/settings/extension-rows.ts +16 -8
  446. package/src/settings/extension-sections.ts +42 -14
  447. package/src/settings/extensions-section.ts +4 -1
  448. package/src/settings/general-settings.ts +101 -28
  449. package/src/settings/locales-section.ts +20 -12
  450. package/src/settings/preferences-dialog.ts +17 -7
  451. package/src/settings/preferences-keymap.ts +7 -5
  452. package/src/settings/preferences-sections.ts +11 -5
  453. package/src/settings/project-sections.ts +28 -11
  454. package/src/settings/schema-field-ui.ts +12 -1
  455. package/src/settings/section-registry.ts +116 -11
  456. package/src/settings/settings-dialog.ts +192 -0
  457. package/src/settings/settings-document.ts +186 -166
  458. package/src/shell/tree.ts +6 -5
  459. package/src/shell.ts +536 -477
  460. package/src/site-context.ts +101 -32
  461. package/src/state.ts +68 -57
  462. package/src/store.ts +54 -34
  463. package/src/studio.ts +219 -116
  464. package/src/style/live-preview.ts +1 -1
  465. package/src/style/project-styles.ts +40 -7
  466. package/src/style/stylebook-specimens.ts +89 -0
  467. package/src/style/stylebook-target.ts +26 -0
  468. package/src/style/tag-inheritance.ts +105 -0
  469. package/src/style/token-ref.ts +5 -4
  470. package/src/style/variables-focus.ts +61 -0
  471. package/src/style/variables-view.ts +235 -0
  472. package/src/surfaces/about.ts +18 -19
  473. package/src/surfaces/add-new.json +1482 -0
  474. package/src/surfaces/add-new.ts +325 -0
  475. package/src/surfaces/add-repo.ts +17 -19
  476. package/src/surfaces/ai-chat.ts +33 -38
  477. package/src/surfaces/ai-credentials-form.ts +6 -16
  478. package/src/surfaces/ai-managed-connect.ts +3 -4
  479. package/src/surfaces/ai-model-picker.ts +3 -5
  480. package/src/surfaces/block-action-bar.ts +22 -11
  481. package/src/surfaces/boot-failure.json +4 -3
  482. package/src/surfaces/boot-failure.ts +4 -5
  483. package/src/surfaces/bottom-dock.json +1 -1
  484. package/src/surfaces/bottom-dock.ts +9 -18
  485. package/src/surfaces/canvas-stage.json +30 -19
  486. package/src/surfaces/canvas-stage.ts +17 -16
  487. package/src/surfaces/cf-account-picker.ts +17 -18
  488. package/src/surfaces/collections-panel.json +615 -0
  489. package/src/surfaces/collections-panel.ts +168 -0
  490. package/src/surfaces/commandbar.json +241 -96
  491. package/src/surfaces/commandbar.ts +145 -105
  492. package/src/surfaces/convert-repeater.ts +17 -19
  493. package/src/surfaces/data-actions.ts +9 -7
  494. package/src/surfaces/dialog.ts +26 -28
  495. package/src/surfaces/diff-toolbar.ts +9 -7
  496. package/src/surfaces/empty-state.json +1 -1
  497. package/src/surfaces/empty-state.ts +7 -10
  498. package/src/surfaces/entry-editor.json +136 -0
  499. package/src/surfaces/entry-editor.ts +35 -11
  500. package/src/surfaces/entry-inspector.json +371 -0
  501. package/src/surfaces/entry-inspector.ts +143 -0
  502. package/src/surfaces/expression-editor.ts +11 -25
  503. package/src/surfaces/files-panel.ts +27 -14
  504. package/src/surfaces/formula-palette.ts +4 -5
  505. package/src/surfaces/github-auth.ts +16 -20
  506. package/src/surfaces/github-publish.ts +17 -22
  507. package/src/surfaces/grid-cell.ts +30 -31
  508. package/src/surfaces/grid-open.ts +10 -14
  509. package/src/surfaces/grid-panel.ts +13 -9
  510. package/src/surfaces/grid-replace.ts +13 -13
  511. package/src/surfaces/grid-views.ts +15 -18
  512. package/src/surfaces/inspector-dock.json +162 -14
  513. package/src/surfaces/inspector-dock.ts +59 -31
  514. package/src/surfaces/jump-bar.ts +5 -6
  515. package/src/surfaces/jxsuite-update.ts +16 -22
  516. package/src/surfaces/library-pane.json +670 -437
  517. package/src/surfaces/library-pane.ts +111 -77
  518. package/src/surfaces/logic-panel.ts +17 -30
  519. package/src/surfaces/logic-workspace.ts +13 -15
  520. package/src/surfaces/media-browser.json +62 -6
  521. package/src/surfaces/media-browser.ts +26 -11
  522. package/src/surfaces/media-field.json +1 -1
  523. package/src/surfaces/media-field.ts +4 -5
  524. package/src/surfaces/media-library.json +1586 -0
  525. package/src/surfaces/media-library.ts +282 -0
  526. package/src/surfaces/media-pane.ts +8 -7
  527. package/src/surfaces/media-pick-dialog.json +71 -0
  528. package/src/surfaces/media-pick-dialog.ts +132 -0
  529. package/src/surfaces/menu.ts +47 -23
  530. package/src/surfaces/navigator-dock.ts +11 -12
  531. package/src/surfaces/new-project.ts +27 -26
  532. package/src/surfaces/pane-context.json +144 -77
  533. package/src/surfaces/pane-context.ts +44 -25
  534. package/src/surfaces/pane-grid.ts +15 -10
  535. package/src/surfaces/panel-activity.ts +5 -6
  536. package/src/surfaces/panel-data.ts +3 -4
  537. package/src/surfaces/panel-deploy-checklist.json +12 -6
  538. package/src/surfaces/panel-deploy-checklist.ts +8 -7
  539. package/src/surfaces/panel-elements.ts +5 -7
  540. package/src/surfaces/panel-i18n.ts +5 -7
  541. package/src/surfaces/panel-imports.ts +6 -13
  542. package/src/surfaces/panel-outline.ts +25 -19
  543. package/src/surfaces/panel-page.json +72 -2
  544. package/src/surfaces/panel-page.ts +49 -25
  545. package/src/surfaces/panel-problems.ts +5 -7
  546. package/src/surfaces/panel-signals.json +1 -1
  547. package/src/surfaces/panel-signals.ts +25 -39
  548. package/src/surfaces/panel-stylebook-layers.json +71 -204
  549. package/src/surfaces/panel-stylebook-layers.ts +5 -29
  550. package/src/surfaces/preferences.json +120 -48
  551. package/src/surfaces/preferences.ts +29 -11
  552. package/src/surfaces/progress-modal.ts +15 -9
  553. package/src/surfaces/properties-panel.json +1 -1
  554. package/src/surfaces/properties-panel.ts +20 -42
  555. package/src/surfaces/publish-quick.json +428 -0
  556. package/src/surfaces/publish-quick.ts +165 -0
  557. package/src/surfaces/publish-workspace.json +2892 -0
  558. package/src/surfaces/publish-workspace.ts +391 -0
  559. package/src/surfaces/publish.ts +18 -18
  560. package/src/surfaces/push-plan.ts +7 -8
  561. package/src/surfaces/rail.json +1 -159
  562. package/src/surfaces/rail.ts +22 -79
  563. package/src/surfaces/reference-field.ts +11 -15
  564. package/src/surfaces/schema-builder.ts +16 -22
  565. package/src/surfaces/schema-form.json +10 -2
  566. package/src/surfaces/schema-form.ts +17 -25
  567. package/src/surfaces/secret-field.ts +9 -6
  568. package/src/surfaces/seo.json +1 -1
  569. package/src/surfaces/seo.ts +21 -15
  570. package/src/surfaces/settings-contexts.ts +9 -7
  571. package/src/surfaces/settings-contributed.json +5 -5
  572. package/src/surfaces/settings-contributed.ts +32 -12
  573. package/src/surfaces/settings-css-vars.json +44 -36
  574. package/src/surfaces/settings-css-vars.ts +82 -16
  575. package/src/surfaces/settings-defs.json +2 -2
  576. package/src/surfaces/settings-defs.ts +17 -21
  577. package/src/surfaces/settings-deploy.json +2 -15
  578. package/src/surfaces/settings-deploy.ts +9 -16
  579. package/src/surfaces/settings-dialog.json +51 -0
  580. package/src/surfaces/settings-dialog.ts +169 -0
  581. package/src/surfaces/settings-extensions.ts +5 -6
  582. package/src/surfaces/settings-head.ts +33 -39
  583. package/src/surfaces/settings-locales.ts +8 -20
  584. package/src/surfaces/settings-overview.json +3 -3
  585. package/src/surfaces/settings-overview.ts +14 -8
  586. package/src/surfaces/settings-packages.ts +8 -7
  587. package/src/surfaces/settings-pane.json +269 -46
  588. package/src/surfaces/settings-pane.ts +88 -36
  589. package/src/surfaces/settings-rawjson.ts +5 -6
  590. package/src/surfaces/shell.json +2 -1
  591. package/src/surfaces/shell.ts +1 -2
  592. package/src/surfaces/site-panel.json +1029 -0
  593. package/src/surfaces/site-panel.ts +233 -0
  594. package/src/surfaces/slash-menu.json +63 -21
  595. package/src/surfaces/slash-menu.ts +42 -9
  596. package/src/surfaces/statements.ts +13 -18
  597. package/src/surfaces/statusbar.ts +56 -29
  598. package/src/surfaces/style-panel.ts +18 -31
  599. package/src/surfaces/stylebook-chrome.ts +3 -5
  600. package/src/surfaces/styles-panel.json +735 -0
  601. package/src/surfaces/styles-panel.ts +195 -0
  602. package/src/surfaces/styles-variables.json +149 -0
  603. package/src/surfaces/styles-variables.ts +145 -0
  604. package/src/surfaces/tab-strip.json +4 -4
  605. package/src/surfaces/tab-strip.ts +14 -13
  606. package/src/surfaces/target-line.ts +6 -7
  607. package/src/surfaces/welcome.ts +6 -8
  608. package/src/surfaces/writing-banner.json +94 -0
  609. package/src/surfaces/writing-banner.ts +80 -0
  610. package/src/tabs/bare-repeaters.ts +101 -0
  611. package/src/tabs/patch-ops.ts +4 -3
  612. package/src/tabs/project-config.ts +32 -21
  613. package/src/tabs/selection.ts +36 -8
  614. package/src/tabs/tab.ts +99 -48
  615. package/src/tabs/transact.ts +98 -53
  616. package/src/types.ts +53 -43
  617. package/src/ui/ai-credentials-form.ts +10 -13
  618. package/src/ui/ai-model-picker.ts +3 -3
  619. package/src/ui/cf-account-picker.ts +7 -9
  620. package/src/ui/color-selector.ts +9 -5
  621. package/src/ui/dynamic-slot.ts +7 -8
  622. package/src/ui/expression-editor.ts +112 -105
  623. package/src/ui/form-controls.ts +104 -56
  624. package/src/ui/formula-catalog.ts +239 -230
  625. package/src/ui/formula-chips.ts +33 -18
  626. package/src/ui/layers.ts +57 -31
  627. package/src/ui/media-picker.ts +300 -47
  628. package/src/ui/popover-surface.ts +20 -12
  629. package/src/ui/progress-modal.ts +13 -8
  630. package/src/ui/regions.ts +14 -12
  631. package/src/ui/schema-form.ts +372 -97
  632. package/src/ui/surface.ts +71 -8
  633. package/src/ui/timing.ts +9 -0
  634. package/src/ui/value-source.ts +44 -31
  635. package/src/ui/virtual-window.ts +29 -3
  636. package/src/utils/base64.ts +6 -4
  637. package/src/utils/edit-display.ts +366 -111
  638. package/src/utils/element-selectors.ts +3 -2
  639. package/src/utils/google-fonts.ts +15 -14
  640. package/src/utils/inherited-style.ts +18 -20
  641. package/src/utils/link-target.ts +1 -1
  642. package/src/utils/local-day.ts +18 -0
  643. package/src/utils/preview-format.ts +25 -3
  644. package/src/utils/strip-events.ts +49 -22
  645. package/src/utils/studio-utils.ts +29 -14
  646. package/src/view.ts +2 -3
  647. package/src/workspace/pane-derive.ts +14 -16
  648. package/src/workspace/session.ts +81 -50
  649. package/src/workspace/tab-workspace.ts +137 -0
  650. package/src/workspace/workspace-back.ts +189 -0
  651. package/src/workspace/workspace-home.ts +133 -0
  652. package/src/workspace/workspace-ids.ts +129 -0
  653. package/src/workspace/workspace-switch.ts +372 -0
  654. package/src/workspace/workspace.ts +165 -47
  655. package/styles/shell-frame.css +30 -7
  656. package/styles/shell-frame.json +15 -3
  657. package/dist/chunks/2020-va2wwra4.js +0 -4
  658. package/dist/chunks/adapter-f93pafd7.js +0 -4
  659. package/dist/chunks/cf-account-picker-af1h381v.js +0 -4
  660. package/dist/chunks/cf-settings-125tdm0w.js +0 -4
  661. package/dist/chunks/color-area-jqhna8zy.js +0 -4
  662. package/dist/chunks/color-field-embq5ctg.js +0 -4
  663. package/dist/chunks/color-fpezvnkt.js +0 -4
  664. package/dist/chunks/color-slider-1qmw7wqy.js +0 -4
  665. package/dist/chunks/combobox-773hdzyj.js +0 -4
  666. package/dist/chunks/components-ax2f1fnn.js +0 -4
  667. package/dist/chunks/content-source-108aqtk1.js +0 -4
  668. package/dist/chunks/convert-to-repeater-ry5rmppr.js +0 -4
  669. package/dist/chunks/dialog-mtm9fq5t.js +0 -4
  670. package/dist/chunks/editor-pfgdmkb0.js +0 -4
  671. package/dist/chunks/entry-commands-t0k1q0kx.js +0 -4
  672. package/dist/chunks/extension-sections-6mwh2hf8.js +0 -4
  673. package/dist/chunks/file-ops-meej5mqf.js +0 -4
  674. package/dist/chunks/files-44vp8a2s.js +0 -4
  675. package/dist/chunks/format-host-7q1petb9.js +0 -4
  676. package/dist/chunks/fs-events-h2mwnxaz.js +0 -4
  677. package/dist/chunks/git-panel-zngbymvd.js +0 -4
  678. package/dist/chunks/grid-view-sx9vynsp.js +0 -51
  679. package/dist/chunks/icons-p44xhjf0.js +0 -4
  680. package/dist/chunks/iframe-entry-f7mqjwpm.js +0 -5
  681. package/dist/chunks/iframe-entry-haw7jkvz.js +0 -5
  682. package/dist/chunks/iframe-entry-z6qrytv3.js +0 -5
  683. package/dist/chunks/iframe-host-qk3ycq87.js +0 -4
  684. package/dist/chunks/index-wkyfjeqz.js +0 -4
  685. package/dist/chunks/jsonMode-s8kt9dsj.js +0 -13
  686. package/dist/chunks/jx-validate-psgd7vsx.js +0 -4
  687. package/dist/chunks/layers-panel-1kq2jyfk.js +0 -4
  688. package/dist/chunks/layers-xd92fg8d.js +0 -4
  689. package/dist/chunks/listbox-s8fkmnq8.js +0 -4
  690. package/dist/chunks/lit-html-ac4cwwr4.js +0 -4
  691. package/dist/chunks/media-picker-0svzkdyb.js +0 -4
  692. package/dist/chunks/menu-37d07z9m.js +0 -4
  693. package/dist/chunks/menu-5c55ea3d.js +0 -4
  694. package/dist/chunks/monaco-binding-z6r70pdt.js +0 -4
  695. package/dist/chunks/monaco-buffer-fz6gq5y7.js +0 -4
  696. package/dist/chunks/monaco-setup-q4axkgj7.js +0 -4
  697. package/dist/chunks/notify-0xgtn8q1.js +0 -4
  698. package/dist/chunks/number-field-gw7sq8rn.js +0 -4
  699. package/dist/chunks/parse-897fvqah.js +0 -4
  700. package/dist/chunks/platform-v1qctbe6.js +0 -4
  701. package/dist/chunks/popover-8htra4er.js +0 -4
  702. package/dist/chunks/publish-panel-ym1fmgq5.js +0 -4
  703. package/dist/chunks/quick-search-a54e6t5n.js +0 -4
  704. package/dist/chunks/references-gmqp82fs.js +0 -4
  705. package/dist/chunks/right-panel-v7t9awbk.js +0 -4
  706. package/dist/chunks/section-registry-vhyf3zsr.js +0 -4
  707. package/dist/chunks/select-n3v7gwas.js +0 -4
  708. package/dist/chunks/split-pff8f3ze.js +0 -4
  709. package/dist/chunks/studio-0bhx5hz6.js +0 -5
  710. package/dist/chunks/studio-0k1ddnyy.js +0 -6
  711. package/dist/chunks/studio-1b04pd0j.js +0 -64
  712. package/dist/chunks/studio-4dwbj6gb.js +0 -5
  713. package/dist/chunks/studio-4tanh828.js +0 -5
  714. package/dist/chunks/studio-55h4mstj.js +0 -4
  715. package/dist/chunks/studio-5tnvjkz4.js +0 -5
  716. package/dist/chunks/studio-60dqgb0c.js +0 -5
  717. package/dist/chunks/studio-61dp09qg.js +0 -9
  718. package/dist/chunks/studio-63epcrj2.js +0 -5
  719. package/dist/chunks/studio-74k29dy9.js +0 -5
  720. package/dist/chunks/studio-7vg6jcd3.js +0 -5
  721. package/dist/chunks/studio-7zx31knw.js +0 -9
  722. package/dist/chunks/studio-8bxk97km.js +0 -5
  723. package/dist/chunks/studio-933e30n4.js +0 -5
  724. package/dist/chunks/studio-98wnwhbg.js +0 -5
  725. package/dist/chunks/studio-9mccjwjh.js +0 -14
  726. package/dist/chunks/studio-a2ke1e4t.js +0 -5
  727. package/dist/chunks/studio-e3a2a6v3.js +0 -4
  728. package/dist/chunks/studio-e81q1vb9.js +0 -5
  729. package/dist/chunks/studio-epgrmqqm.js +0 -5
  730. package/dist/chunks/studio-ery42sqr.js +0 -4
  731. package/dist/chunks/studio-g1shz58g.js +0 -5
  732. package/dist/chunks/studio-gf0fz03c.js +0 -5
  733. package/dist/chunks/studio-gjtpe62q.js +0 -6
  734. package/dist/chunks/studio-gkskhg7m.js +0 -5
  735. package/dist/chunks/studio-gx4dnjzd.js +0 -5
  736. package/dist/chunks/studio-j03zga3y.js +0 -9
  737. package/dist/chunks/studio-jhpxeckz.js +0 -5
  738. package/dist/chunks/studio-k01r7ykp.js +0 -5
  739. package/dist/chunks/studio-kk7h30ne.js +0 -7
  740. package/dist/chunks/studio-kt1zqney.js +0 -5
  741. package/dist/chunks/studio-m3cwhvye.js +0 -5
  742. package/dist/chunks/studio-mcayt6hz.js +0 -5
  743. package/dist/chunks/studio-myjcghv3.js +0 -5
  744. package/dist/chunks/studio-n8bxwc3y.js +0 -4
  745. package/dist/chunks/studio-ngm8gvpb.js +0 -5
  746. package/dist/chunks/studio-nj5a01jy.js +0 -928
  747. package/dist/chunks/studio-pcgz8heb.js +0 -5
  748. package/dist/chunks/studio-qcsq0t15.js +0 -5
  749. package/dist/chunks/studio-qkstvve9.js +0 -5
  750. package/dist/chunks/studio-qv1pwd3c.js +0 -5
  751. package/dist/chunks/studio-rc6dvxjb.js +0 -7
  752. package/dist/chunks/studio-s8dmmz66.js +0 -5
  753. package/dist/chunks/studio-sp5xzbj4.js +0 -6
  754. package/dist/chunks/studio-szsjbj0g.js +0 -5
  755. package/dist/chunks/studio-t1xzawhr.js +0 -16
  756. package/dist/chunks/studio-tdcprbqb.js +0 -5
  757. package/dist/chunks/studio-vrmcjf9g.js +0 -7
  758. package/dist/chunks/studio-vyc0b4he.js +0 -10
  759. package/dist/chunks/studio-w0cgf6jg.js +0 -5
  760. package/dist/chunks/studio-w3hskzqk.js +0 -5
  761. package/dist/chunks/studio-xgrgcdyh.js +0 -9
  762. package/dist/chunks/studio-xz2yxfcb.js +0 -5
  763. package/dist/chunks/studio-y6n42tgs.js +0 -5
  764. package/dist/chunks/studio-yb560vxr.js +0 -5
  765. package/dist/chunks/studio-yn9f8vtx.js +0 -5
  766. package/dist/chunks/studio-yw05w8f0.js +0 -7
  767. package/dist/chunks/studio-z16sgavc.js +0 -5
  768. package/dist/chunks/studio-zey7zsdw.js +0 -12
  769. package/dist/chunks/studio-zyqn40w4.js +0 -5
  770. package/dist/chunks/swatch-group-8qh9a3bm.js +0 -4
  771. package/dist/chunks/tabs-jwthg40w.js +0 -4
  772. package/dist/chunks/textfield-spy3hc77.js +0 -4
  773. package/dist/chunks/toast-4d35zd64.js +0 -4
  774. package/dist/chunks/toast-host-8sjmfed3.js +0 -4
  775. package/dist/chunks/tooltip-fd6g9xy3.js +0 -4
  776. package/dist/chunks/tree-h19v1jfz.js +0 -4
  777. package/dist/chunks/tsMode-2frah6h1.js +0 -14
  778. package/dist/chunks/workspace-zt81g1ms.js +0 -4
  779. package/dist/chunks/ws-client-n2bh4hkf.js +0 -4
  780. package/src/panels/frontmatter-panel.ts +0 -701
  781. package/src/panels/git-panel.ts +0 -1120
  782. package/src/surfaces/doc-header.json +0 -776
  783. package/src/surfaces/doc-header.ts +0 -231
  784. package/src/surfaces/git-panel.json +0 -1880
  785. package/src/surfaces/git-panel.ts +0 -272
@@ -0,0 +1,121 @@
1
+ /**
2
+ * What makes a component's tag name usable, decided once.
3
+ *
4
+ * Two rules used to answer this and they disagreed: Convert to Component accepted
5
+ * `/^[a-z][a-z0-9]*(-[a-z0-9]+)+$/`, which refused `x-card.v2` and `my_el-x`, and the Library's
6
+ * component seed accepted `/^[a-z][\d.a-z]*-[\d.a-z-]*$/`, which allowed a trailing hyphen the
7
+ * first refused. Neither was the rule the browser applies, which is the only one that matters: a
8
+ * definition whose tag `customElements.define` rejects is a component nothing can register. So this
9
+ * module states HTML's own production — the [valid custom element
10
+ * name](https://html.spec.whatwg.org/multipage/custom-elements.html#valid-custom-element-name) —
11
+ * and every creation flow asks it: Add new (`create/add-new.ts`) and Convert to Component
12
+ * (`editor/convert-to-component.ts`).
13
+ *
14
+ * The DERIVER is the other half. A name the reader typed as a title ("Pricing table") becomes a tag
15
+ * (`pricing-table`), and a name with no hyphen gains a `site-` prefix rather than being refused,
16
+ * because "Hero" is a perfectly good thing to call a component and a refusal there teaches nothing
17
+ * but the syntax of a rule the app can satisfy itself (`specs/studio.md` §9.1.1).
18
+ *
19
+ * DOM-free, so the command records and the pure derivation can import it in a bare Bun process.
20
+ *
21
+ * @docs studio/design/components
22
+ */
23
+
24
+ import { slugify } from "../files/new-file-name";
25
+
26
+ /** The prefix a hyphenless slug gains, so the derived tag is a valid custom element name. */
27
+ export const TAG_PREFIX = "site-";
28
+
29
+ /**
30
+ * Names HTML reserves: they match the production but are SVG and MathML elements that predate it,
31
+ * so `customElements.define` refuses each one.
32
+ */
33
+ export const RESERVED_ELEMENT_NAMES: ReadonlySet<string> = new Set([
34
+ "annotation-xml",
35
+ "color-profile",
36
+ "font-face",
37
+ "font-face-format",
38
+ "font-face-name",
39
+ "font-face-src",
40
+ "font-face-uri",
41
+ "missing-glyph",
42
+ ]);
43
+
44
+ /**
45
+ * HTML's `PCENChar`: the characters a potential custom element name may hold after its first
46
+ * letter. ASCII upper case is deliberately absent, which is why a tag name is lower case.
47
+ */
48
+ const PCEN_RANGES: readonly (readonly [number, number])[] = [
49
+ [0xb7, 0xb7],
50
+ [0xc0, 0xd6],
51
+ [0xd8, 0xf6],
52
+ [0xf8, 0x3_7d],
53
+ [0x3_7f, 0x1f_ff],
54
+ [0x20_0c, 0x20_0d],
55
+ [0x20_3f, 0x20_40],
56
+ [0x20_70, 0x21_8f],
57
+ [0x2c_00, 0x2f_ef],
58
+ [0x30_01, 0xd7_ff],
59
+ [0xf9_00, 0xfd_cf],
60
+ [0xfd_f0, 0xff_fd],
61
+ [0x1_00_00, 0xe_ff_ff],
62
+ ];
63
+
64
+ /** A code point as a `u`-flag regular expression escape, so no invisible character is in source. */
65
+ function escapeCodePoint(cp: number): string {
66
+ return `${String.fromCodePoint(92)}u{${cp.toString(16)}}`;
67
+ }
68
+
69
+ /** The whole class body: ASCII first, then each range by its escaped ends. */
70
+ const PCEN_CHAR = [
71
+ String.raw`\-.0-9_a-z`,
72
+ ...PCEN_RANGES.map(([from, to]) => `${escapeCodePoint(from)}-${escapeCodePoint(to)}`),
73
+ ].join("");
74
+
75
+ /** One character that may appear after the first letter. */
76
+ const ONE_PCEN_CHAR = new RegExp(`^[${PCEN_CHAR}]$`, "u");
77
+
78
+ /**
79
+ * The sentence a tag name earns, or `""` when it is valid.
80
+ *
81
+ * Each sentence names the one thing to change, in the order a reader fixes them: say something,
82
+ * start with a letter, lose the character the browser refuses, add the hyphen, avoid a reserved
83
+ * name.
84
+ */
85
+ export function customElementNameProblem(name: string): string {
86
+ if (name === "") {
87
+ return "Enter a tag name.";
88
+ }
89
+ if (!/^[a-z]/.test(name)) {
90
+ return "A tag name starts with a lower-case letter.";
91
+ }
92
+ for (const char of name.slice(1)) {
93
+ if (!ONE_PCEN_CHAR.test(char)) {
94
+ return /[A-Z]/.test(char)
95
+ ? "A tag name is lower case."
96
+ : `“${char}” cannot appear in a tag name.`;
97
+ }
98
+ }
99
+ if (!name.includes("-")) {
100
+ return "A tag name needs a hyphen, such as my-card.";
101
+ }
102
+ if (RESERVED_ELEMENT_NAMES.has(name)) {
103
+ return `<${name}> is reserved by HTML.`;
104
+ }
105
+ return "";
106
+ }
107
+
108
+ /**
109
+ * The tag a display name derives to: slugified, its hyphens tidied, and prefixed with
110
+ * {@link TAG_PREFIX} when it would otherwise have no hyphen or would start with a digit.
111
+ *
112
+ * `"Pricing table"` → `pricing-table`, `"Hero"` → `site-hero`, `"2 columns"` → `site-2-columns`,
113
+ * and a name with nothing usable in it → `""`, which {@link customElementNameProblem} refuses.
114
+ */
115
+ export function deriveTagName(input: string): string {
116
+ const slug = slugify(input).replaceAll(/-+/g, "-").replaceAll(/^-|-$/g, "");
117
+ if (slug === "") {
118
+ return "";
119
+ }
120
+ return /^[a-z]/.test(slug) && slug.includes("-") ? slug : `${TAG_PREFIX}${slug}`;
121
+ }
@@ -15,7 +15,6 @@ import { dismissContextMenu, showContextMenu } from "./context-menu";
15
15
  import { bubbleInlinePath } from "../canvas/canvas-helpers";
16
16
  import { activeTab } from "../workspace/workspace";
17
17
  import type { CanvasContextMenuHandler } from "../canvas/iframe-host";
18
- import type { JxPath } from "../state";
19
18
 
20
19
  /**
21
20
  * Build the handler.
@@ -34,7 +33,7 @@ export function makeCanvasContextMenuHandler(): CanvasContextMenuHandler {
34
33
  }
35
34
  // Lift inline-element paths (a <strong> inside a <p>) to their block parent — right-clicking
36
35
  // Formatted text should act on the block, matching the legacy handler.
37
- const bubbled = bubbleInlinePath(activeTab.value?.doc.document, path as JxPath);
36
+ const bubbled = bubbleInlinePath(activeTab.value?.doc.document, path);
38
37
  // ShowContextMenu reads only preventDefault/clientX/clientY from the event, so a synthetic
39
38
  // MouseEvent carries the converted coords safely.
40
39
  const evt = new MouseEvent("contextmenu", { clientX, clientY });
@@ -18,11 +18,8 @@ export const canvasSlashHandler: CanvasSlashHandler = {
18
18
  opened. Typing "/" needs none — the author keeps typing into the iframe's contenteditable and
19
19
  the engine re-posts `slashShow` with the updated filter. A menu opened BY NAME
20
20
  (`insert.openSlashMenu`) has no "/…" run to type into, so without the field the only way past
21
- fifteen blocks is scrolling. */
21
+ fifteen blocks is scrolling. The menu reads `showFilter` for truthiness alone, so `false` and an
22
+ absent key are one state to it. */
22
23
  show: ({ rect, filter, showFilter, onSelect, onDismiss }) =>
23
- showSlashMenuAtRect(rect, filter, {
24
- onDismiss,
25
- onSelect,
26
- ...(showFilter === true ? { showFilter: true } : {}),
27
- }),
24
+ showSlashMenuAtRect(rect, filter, { onDismiss, onSelect, showFilter: showFilter === true }),
28
25
  };
@@ -14,11 +14,18 @@
14
14
  * @docs studio/editing/writing
15
15
  */
16
16
 
17
+ import { isString } from "@jxsuite/schema/guards";
17
18
  import type { JxMutableNode } from "@jxsuite/schema/types";
18
19
 
19
20
  /** A block's content as a children array — the form both storage shapes normalize to. */
20
21
  export type Content = (JxMutableNode | string)[];
21
22
 
23
+ /** A block's content in the form it is stored: `children` for markup, folded `textContent` else. */
24
+ export interface StoredContent {
25
+ children?: Content;
26
+ textContent?: string;
27
+ }
28
+
22
29
  /**
23
30
  * The content of `node` as a children array, whichever way it is stored.
24
31
  *
@@ -30,18 +37,16 @@ export function contentOf(node: JxMutableNode | undefined | null): Content {
30
37
  return [];
31
38
  }
32
39
  if (Array.isArray(node.children)) {
33
- return node.children as Content;
40
+ return node.children;
34
41
  }
35
- return typeof node.textContent === "string" && node.textContent.length > 0
36
- ? [node.textContent]
37
- : [];
42
+ return isString(node.textContent) && node.textContent.length > 0 ? [node.textContent] : [];
38
43
  }
39
44
 
40
45
  /** The rendered text length of a content array. */
41
46
  export function contentLength(children: Content): number {
42
47
  let n = 0;
43
48
  for (const child of children) {
44
- n += typeof child === "string" ? child.length : contentLength(contentOf(child));
49
+ n += isString(child) ? child.length : contentLength(contentOf(child));
45
50
  }
46
51
  return n;
47
52
  }
@@ -60,7 +65,7 @@ export function sliceContent(children: Content, start: number, end: number): Con
60
65
  if (pos >= end) {
61
66
  break;
62
67
  }
63
- if (typeof child === "string") {
68
+ if (isString(child)) {
64
69
  const childEnd = pos + child.length;
65
70
  if (childEnd > start) {
66
71
  const text = child.slice(
@@ -102,7 +107,7 @@ function withContent(node: JxMutableNode, children: Content): JxMutableNode {
102
107
  if (children.length === 0) {
103
108
  return { ...rest, textContent: "" };
104
109
  }
105
- if (children.length === 1 && typeof children[0] === "string") {
110
+ if (children.length === 1 && isString(children[0])) {
106
111
  return { ...rest, textContent: children[0] };
107
112
  }
108
113
  return { ...rest, children };
@@ -115,12 +120,12 @@ function withContent(node: JxMutableNode, children: Content): JxMutableNode {
115
120
  export function normalizeContent(children: Content): Content {
116
121
  const out: Content = [];
117
122
  for (const child of children) {
118
- if (typeof child === "string") {
123
+ if (isString(child)) {
119
124
  if (child.length === 0) {
120
125
  continue;
121
126
  }
122
127
  const prev = out.at(-1);
123
- if (typeof prev === "string") {
128
+ if (isString(prev)) {
124
129
  out[out.length - 1] = prev + child;
125
130
  continue;
126
131
  }
@@ -152,15 +157,12 @@ export function spliceAcross(
152
157
  }
153
158
 
154
159
  /** `{ children }` when the content carries markup, else the folded `{ textContent }` form. */
155
- export function toStored(children: Content): {
156
- children?: Content;
157
- textContent?: string;
158
- } {
160
+ export function toStored(children: Content): StoredContent {
159
161
  const normalized = normalizeContent(children);
160
162
  if (normalized.length === 0) {
161
163
  return { textContent: "" };
162
164
  }
163
- if (normalized.length === 1 && typeof normalized[0] === "string") {
165
+ if (normalized.length === 1 && isString(normalized[0])) {
164
166
  return { textContent: normalized[0] };
165
167
  }
166
168
  return { children: normalized };
@@ -21,10 +21,11 @@
21
21
  * is left here is the projection: the menu itself is the `menu` surface (`surfaces/menu.json`), a
22
22
  * `jx-menu` the kit gives its keyboard contract, its popover and its dismissal.
23
23
  */
24
- import { displayTagName } from "@jxsuite/schema/guards";
24
+ import { getNodeAtPath } from "@jxsuite/schema/doc-ops";
25
+ import { displayTagName, isNodeObject, isNonNullObject, isString } from "@jxsuite/schema/guards";
25
26
  import { jsonClone } from "../utils/studio-utils";
26
27
  import { htmlToJx } from "@jxsuite/markup/html-to-jx";
27
- import { childIndex, getNodeAtPath, parentElementPath } from "../store";
28
+ import { childIndex, parentElementPath } from "../store";
28
29
  import { activeTab, workspace } from "../workspace/workspace";
29
30
  import { isSelected, isSpliceablePath, primarySelection } from "../tabs/selection";
30
31
  import {
@@ -58,17 +59,15 @@ import type { AnyCommand, CommandRegistry } from "../commands/registry";
58
59
  import type { CommandContext } from "../commands/context";
59
60
  import type { Placement } from "../commands/levels";
60
61
  import type { JxPath } from "../state";
61
- import type { JxMutableNode, JxStyle } from "@jxsuite/schema/types";
62
-
63
- type JxNode = JxMutableNode;
62
+ import type { JxAttributeValue, JxMutableNode, JxStyle } from "@jxsuite/schema/types";
64
63
 
65
64
  // ─── Clipboard helpers ───────────────────────────────────────────────────────
66
65
 
67
- const JX_MIME = "web application/jx+json";
66
+ export const JX_MIME = "web application/jx+json";
68
67
 
69
- /** @param {JxNode | string} node */
70
- function nodeToHtml(node: JxNode | string): string {
71
- if (typeof node === "string") {
68
+ /** @param {JxMutableNode | string} node */
69
+ function nodeToHtml(node: JxMutableNode | string): string {
70
+ if (isString(node)) {
72
71
  return node;
73
72
  }
74
73
  /* A chosen tag cannot be serialised to one HTML string, so the copy takes the branch the
@@ -77,9 +76,10 @@ function nodeToHtml(node: JxNode | string): string {
77
76
  const tag = displayTagName(node.tagName).split("|")[0] || "div";
78
77
  let attrs = "";
79
78
  if (node.attributes) {
80
- for (const [k, v] of Object.entries(node.attributes)) {
79
+ // A document's attribute value is read as possibly JSON `null`, which is skipped with the refs.
80
+ for (const [k, v] of Object.entries<JxAttributeValue | null>(node.attributes)) {
81
81
  // Bound ($ref) attribute values have no static HTML representation — skip.
82
- if (typeof v === "object") {
82
+ if (v === null || isNonNullObject(v)) {
83
83
  continue;
84
84
  }
85
85
  attrs += v === "" ? ` ${k}` : ` ${k}="${String(v).replaceAll('"', "&quot;")}"`;
@@ -94,7 +94,7 @@ function nodeToHtml(node: JxNode | string): string {
94
94
  }
95
95
  }
96
96
  let inner = "";
97
- if (typeof node.textContent === "string") {
97
+ if (isString(node.textContent)) {
98
98
  inner = node.textContent;
99
99
  } else if (Array.isArray(node.children)) {
100
100
  inner = node.children.map((c) => nodeToHtml(c)).join("");
@@ -105,9 +105,9 @@ function nodeToHtml(node: JxNode | string): string {
105
105
  /**
106
106
  * Write a Jx node to the system clipboard with both jx+json and text/html types.
107
107
  *
108
- * @param {object} json
108
+ * @param {JxMutableNode} json
109
109
  */
110
- async function writeToClipboard(json: Record<string, unknown>) {
110
+ async function writeToClipboard(json: JxMutableNode) {
111
111
  workspace.clipboard = json;
112
112
  try {
113
113
  const jxBlob = new Blob([JSON.stringify(json)], { type: JX_MIME });
@@ -131,7 +131,7 @@ async function writeToClipboard(json: Record<string, unknown>) {
131
131
  /**
132
132
  * Read from the system clipboard. Returns Jx node(s) or null.
133
133
  *
134
- * @returns {Promise<JxNode[] | null>}
134
+ * @returns {Promise<JxMutableNode[] | null>}
135
135
  */
136
136
  async function readFromClipboard() {
137
137
  try {
@@ -139,16 +139,18 @@ async function readFromClipboard() {
139
139
  for (const item of items) {
140
140
  if (item.types.includes(JX_MIME)) {
141
141
  const blob = await item.getType(JX_MIME);
142
- const json = JSON.parse(await blob.text()) as JxNode;
142
+ /* SAFETY: `web application/jx+json` is Jx's own clipboard type, and `writeToClipboard` puts a
143
+ node there serialized with JSON.stringify; malformed text throws into the fallback below. */
144
+ const json = JSON.parse(await blob.text()) as JxMutableNode;
143
145
  return [json];
144
146
  }
145
147
  if (item.types.includes("text/html")) {
146
148
  const blob = await item.getType("text/html");
147
149
  const htmlStr = await blob.text();
148
150
  const nodes = htmlToJx(htmlStr);
149
- const jxNodes = nodes.map((n) =>
150
- typeof n === "string" ? { tagName: "p", textContent: n } : n,
151
- ) as JxNode[];
151
+ const jxNodes: JxMutableNode[] = nodes.map((n) =>
152
+ isString(n) ? { tagName: "p", textContent: n } : n,
153
+ );
152
154
  if (jxNodes.length > 0) {
153
155
  return jxNodes;
154
156
  }
@@ -158,8 +160,8 @@ async function readFromClipboard() {
158
160
  const text = await blob.text();
159
161
  // Try parsing as Jx JSON
160
162
  try {
161
- const parsed = JSON.parse(text) as JxNode;
162
- if (parsed && parsed.tagName) {
163
+ const parsed: unknown = JSON.parse(text);
164
+ if (isNodeObject(parsed) && parsed.tagName) {
163
165
  return [parsed];
164
166
  }
165
167
  } catch {
@@ -241,7 +243,12 @@ export async function pasteNode() {
241
243
  }
242
244
 
243
245
  if (selected && selected.length >= 2) {
246
+ // SAFETY: parentElementPath returns a path for any path of two or more segments, checked above.
244
247
  const pp = parentElementPath(selected) as JxPath;
248
+ /* SAFETY: a selection with a sibling position ends in `"children", <index>`, so this is the
249
+ numeric child index. A selected repeater template (`…, "map"`) or `$switch` case also has two
250
+ or more segments; callers do not exclude that case yet, so it reaches here with a string
251
+ segment exactly as before this cast. */
245
252
  const idx = childIndex(selected) as number;
246
253
  transactDoc(tab, (t) => {
247
254
  for (let i = 0; i < nodes.length; i++) {
@@ -408,7 +415,10 @@ export function elementCommands(deps: ElementCommandDeps): AnyCommand[] {
408
415
  if (!target || !nodes || nodes.length === 0) {
409
416
  return;
410
417
  }
418
+ /* SAFETY: this record runs only when enabled, and `spliceable` admits a target whose path
419
+ ends in `"children", <index>` — so it has a parent element path. */
411
420
  const parent = parentElementPath(target.path) as JxPath;
421
+ // SAFETY: the same `spliceable` check proved the last segment is a numeric child index.
412
422
  const idx = childIndex(target.path) as number;
413
423
  transactDoc(activeTab.value, (t) => {
414
424
  for (const [offset, node] of nodes.entries()) {
@@ -576,7 +586,10 @@ function insertSiblingParagraph(target: ElementMenuTarget | null, offset: number
576
586
  if (!target) {
577
587
  return;
578
588
  }
589
+ /* SAFETY: both callers are records enabled only by `spliceable`, which admits a target whose path
590
+ ends in `"children", <index>` — so it has a parent element path. */
579
591
  const parent = parentElementPath(target.path) as JxPath;
592
+ // SAFETY: the same `spliceable` check proved the last segment is a numeric child index.
580
593
  const idx = childIndex(target.path) as number;
581
594
  transactDoc(activeTab.value, (t) =>
582
595
  mutateInsertNode(t, parent, idx + offset, { children: [], tagName: "p" }),
@@ -681,7 +694,7 @@ function commandTarget(): ElementMenuTarget | null {
681
694
  if (!tab || !path) {
682
695
  return null;
683
696
  }
684
- const node = getNodeAtPath(tab.doc.document, path) as JxMutableNode | undefined;
697
+ const node = getNodeAtPath(tab.doc.document, path);
685
698
  return node ? { node, path } : null;
686
699
  }
687
700
 
@@ -1,34 +1,33 @@
1
1
  import elementsMeta from "../../data/elements-meta.json";
2
2
 
3
- export interface SlashCommand {
4
- label: string;
5
- tag: string;
6
- description: string;
7
- }
3
+ import { ELEMENT_DEFS } from "./editable-tags";
4
+ import type { SlashCommand } from "./inline-edit";
5
+
6
+ export type { SlashCommand } from "./inline-edit";
8
7
 
9
- const TAG_LABELS = {
10
- article: "Article",
11
- aside: "Aside",
12
- blockquote: "Blockquote",
13
- div: "Div",
14
- footer: "Footer",
15
- h1: "Heading 1",
16
- h2: "Heading 2",
17
- h3: "Heading 3",
18
- h4: "Heading 4",
19
- h5: "Heading 5",
20
- h6: "Heading 6",
21
- header: "Header",
22
- main: "Main",
23
- nav: "Nav",
24
- ol: "Numbered List",
25
- p: "Paragraph",
26
- search: "Search",
27
- section: "Section",
28
- ul: "Bulleted List",
29
- } as Record<string, string>;
8
+ const TAG_LABELS = new Map<string, string>([
9
+ ["article", "Article"],
10
+ ["aside", "Aside"],
11
+ ["blockquote", "Blockquote"],
12
+ ["div", "Div"],
13
+ ["footer", "Footer"],
14
+ ["h1", "Heading 1"],
15
+ ["h2", "Heading 2"],
16
+ ["h3", "Heading 3"],
17
+ ["h4", "Heading 4"],
18
+ ["h5", "Heading 5"],
19
+ ["h6", "Heading 6"],
20
+ ["header", "Header"],
21
+ ["main", "Main"],
22
+ ["nav", "Nav"],
23
+ ["ol", "Numbered List"],
24
+ ["p", "Paragraph"],
25
+ ["search", "Search"],
26
+ ["section", "Section"],
27
+ ["ul", "Bulleted List"],
28
+ ]);
30
29
 
31
- const groups = (elementsMeta.$convertGroups || {}) as Record<string, string[]>;
30
+ const groups: Readonly<Record<string, string[]>> = elementsMeta.$convertGroups;
32
31
 
33
32
  /**
34
33
  * Get the list of tags the current element can be converted to.
@@ -37,18 +36,14 @@ const groups = (elementsMeta.$convertGroups || {}) as Record<string, string[]>;
37
36
  * @param {boolean} isEmpty
38
37
  * @returns {SlashCommand[]}
39
38
  */
40
- export function getConvertTargets(currentTag: string, isEmpty: boolean) {
41
- const def = (elementsMeta.$defs as Record<string, Record<string, unknown>>)?.[currentTag] as
42
- | Record<string, unknown>
43
- | undefined;
39
+ export function getConvertTargets(currentTag: string, isEmpty: boolean): SlashCommand[] {
40
+ const def = ELEMENT_DEFS[currentTag];
44
41
  if (!def?.$convertTo) {
45
42
  return [];
46
43
  }
47
44
 
48
45
  const groupNames =
49
- isEmpty && def.$convertToWhenEmpty
50
- ? (def.$convertToWhenEmpty as string[])
51
- : [def.$convertTo as string];
46
+ isEmpty && def.$convertToWhenEmpty ? def.$convertToWhenEmpty : [def.$convertTo];
52
47
 
53
48
  const tags = new Set<string>();
54
49
  for (const name of groupNames) {
@@ -61,7 +56,7 @@ export function getConvertTargets(currentTag: string, isEmpty: boolean) {
61
56
 
62
57
  return [...tags].map((tag) => ({
63
58
  description: "",
64
- label: TAG_LABELS[tag] || tag.charAt(0).toUpperCase() + tag.slice(1),
59
+ label: TAG_LABELS.get(tag) || tag.charAt(0).toUpperCase() + tag.slice(1),
65
60
  tag,
66
61
  }));
67
62
  }