@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
@@ -12,14 +12,18 @@
12
12
  * was fixed.
13
13
  *
14
14
  * What is left is the flow, which is all this module ever owned that mattered: what the default
15
- * name is, what makes a name usable, whether the document actually took the reference, and what is
16
- * written to disk once it has.
15
+ * name is, whether the document actually took the reference, and what is written to disk once it
16
+ * has. What makes a name usable is no longer this module's: it is HTML's valid custom element name,
17
+ * stated once in `create/element-name.ts` and asked by Add new's Component kind too, which runs
18
+ * {@link convertSelectionToComponent} for **Start from: Current selection** (`specs/studio.md`
19
+ * §9.1.1).
17
20
  *
18
21
  * @docs studio/design/components
19
22
  */
20
- import { displayTagName } from "@jxsuite/schema/guards";
23
+ import { displayTagName, isNonNullObject } from "@jxsuite/schema/guards";
21
24
  import { errorMessage } from "@jxsuite/schema/parse";
22
- import { childIndex, getNodeAtPath, parentElementPath } from "../store";
25
+ import { getNodeAtPath } from "@jxsuite/schema/doc-ops";
26
+ import { childIndex, parentElementPath } from "../store";
23
27
  import { primarySelection } from "../tabs/selection";
24
28
  import { activeTab } from "../workspace/workspace";
25
29
  import { transact } from "../tabs/transact";
@@ -30,33 +34,62 @@ import { serializeJson } from "@jxsuite/schema/json-layout";
30
34
  import { notify } from "../services/notify";
31
35
  import { showPromptDialog } from "../ui/layers";
32
36
  import { validateComponentSlots } from "../services/cem-export";
37
+ import { customElementNameProblem, deriveTagName } from "../create/element-name";
33
38
 
34
- import type { JxMutableNode } from "@jxsuite/schema/types";
39
+ import type { JxMutableNode, JxPath } from "@jxsuite/schema/types";
35
40
 
36
- const VALID_NAME = /^[a-z][a-z0-9]*(-[a-z0-9]+)+$/;
37
-
38
- /** Convert the currently selected element into a reusable component. */
39
- export async function convertToComponent() {
41
+ /**
42
+ * The selected element a conversion would lift out, or `null` when there is none to convert.
43
+ *
44
+ * The root is not convertible (it is the document, not an element in it), and neither is a
45
+ * selection the document cannot resolve to a node with a tag. Exported so Add new can say WHY its
46
+ * Current selection choice is disabled rather than offering a button that does nothing.
47
+ */
48
+ export function convertibleSelection(): { path: JxPath; node: JxMutableNode } | null {
40
49
  const tab = activeTab.value;
41
50
  const selected = primarySelection(tab?.session.selection);
42
51
  if (!tab || !selected || selected.length < 2) {
43
- return;
52
+ return null;
44
53
  }
45
-
46
54
  const node = getNodeAtPath(tab.doc.document, selected);
47
55
  if (!node || !node.tagName) {
48
- return;
56
+ return null;
49
57
  }
58
+ return { node, path: selected };
59
+ }
50
60
 
51
- const defaultName = deriveDefaultName(node);
52
- const chosen = await promptComponentName(defaultName);
61
+ /** Convert the currently selected element into a reusable component. */
62
+ export async function convertToComponent() {
63
+ const subject = convertibleSelection();
64
+ if (!subject) {
65
+ return;
66
+ }
67
+ const chosen = await promptComponentName(deriveDefaultName(subject.node));
53
68
  if (!chosen) {
54
69
  return;
55
70
  }
56
71
  /* The prompt resolves the TRIMMED value; the case fold is this module's, because it is the case
57
72
  fold `validateName` already judged the name in. A tag name is lower-case by the same rule that
58
73
  made `Hero-Block` default to `hero-block`. */
59
- const name = chosen.toLowerCase();
74
+ await convertSelectionToComponent(chosen.toLowerCase());
75
+ }
76
+
77
+ /**
78
+ * Replace the selected element with an instance of a new component named `name`, and write the
79
+ * component's definition to `components/<name>.json`.
80
+ *
81
+ * The caller has validated `name` (`create/element-name.ts`). The reference goes into the document
82
+ * FIRST, in one transaction, and the file is written only if that transaction landed — see below.
83
+ *
84
+ * @returns The component file's path, or `null` when nothing was converted or the write failed.
85
+ */
86
+ export async function convertSelectionToComponent(name: string): Promise<string | null> {
87
+ const tab = activeTab.value;
88
+ const subject = convertibleSelection();
89
+ if (!tab || !subject) {
90
+ return null;
91
+ }
92
+ const { node, path: selected } = subject;
60
93
 
61
94
  // Extract component definition
62
95
  const componentDef = extractComponentDef(node);
@@ -71,10 +104,16 @@ export async function convertToComponent() {
71
104
  const converted = transact(tab, (doc) => {
72
105
  // Navigate to parent's children array and replace the node
73
106
  const pp = parentElementPath(selectionPath) ?? [];
107
+ /* SAFETY: an element with a sibling position ends in `"children", <index>`, so this is the
108
+ numeric child index. A selected repeater template (`…, "map"`) or `$switch` case also passes
109
+ the two-segment check above; callers do not exclude that case yet, so it reaches here with a
110
+ string segment exactly as before this cast. */
74
111
  const idx = childIndex(selectionPath) as number;
75
112
  let parent = doc;
76
- // Paths address nodes by construction (same contract as getNodeAtPath).
77
113
  for (const seg of pp) {
114
+ /* SAFETY: `pp` is the parent element's path, and a `JxPath` alternates node keys with
115
+ `"children"` and an index, so walking it from the root lands on a node (the same contract as
116
+ getNodeAtPath). */
78
117
  parent = parent[seg] as JxMutableNode;
79
118
  }
80
119
  if (!Array.isArray(parent.children)) {
@@ -87,8 +126,7 @@ export async function convertToComponent() {
87
126
  doc.$elements = [];
88
127
  }
89
128
  const alreadyReferenced = doc.$elements.some(
90
- (/** @type {JxMutableNode | string | { $ref: string }} */ el) =>
91
- el && typeof el === "object" && "$ref" in el && el.$ref === refPath,
129
+ (el) => isNonNullObject(el) && "$ref" in el && el.$ref === refPath,
92
130
  );
93
131
  if (!alreadyReferenced) {
94
132
  doc.$elements.push({ $ref: refPath });
@@ -101,7 +139,7 @@ export async function convertToComponent() {
101
139
  document the author was told had been changed. The gate raises its own toast saying why the
102
140
  edit is paused; the honest thing to add to it is nothing at all. */
103
141
  if (!converted) {
104
- return;
142
+ return null;
105
143
  }
106
144
 
107
145
  // Write component file and refresh registry
@@ -124,27 +162,31 @@ export async function convertToComponent() {
124
162
  tier: "problem",
125
163
  });
126
164
  }
165
+ return componentFile;
127
166
  } catch (error) {
128
167
  notify.error(`Could not save the <${name}> component.`, {
129
168
  detail: errorMessage(error),
130
169
  path: componentFile,
131
170
  source: "Components",
132
171
  });
172
+ return null;
133
173
  }
134
174
  }
135
175
 
136
176
  /**
137
- * Derive a default tag name from a node.
138
- *
139
- * @param {JxMutableNode} node
140
- * @returns {string}
177
+ * The default tag name for a node: its `$id` when it has one, else its tag, through the shared
178
+ * deriver — so `$id: "Hero"` proposes `site-hero` and a `<section>` proposes `site-section`, the
179
+ * same answer Add new gives a component typed as "Hero".
141
180
  */
142
181
  function deriveDefaultName(node: JxMutableNode) {
143
- if (node.$id && node.$id.includes("-")) {
144
- return node.$id.toLowerCase();
182
+ if (node.$id) {
183
+ const fromId = deriveTagName(node.$id);
184
+ if (fromId !== "") {
185
+ return fromId;
186
+ }
145
187
  }
146
188
  const tag = (displayTagName(node.tagName) || "div").toLowerCase();
147
- return tag.includes("-") ? tag : `jx-${tag}`;
189
+ return tag.includes("-") ? tag : deriveTagName(tag);
148
190
  }
149
191
 
150
192
  /**
@@ -164,30 +206,18 @@ function extractComponentDef(node: JxMutableNode) {
164
206
  }
165
207
 
166
208
  /**
167
- * Validate a component name against naming rules and existing registry.
168
- *
169
- * @param {string} val
170
- * @returns {{ valid: boolean; error: string }}
209
+ * The refusal a component name earns, or `""`: HTML's valid custom element name, then uniqueness
210
+ * against the registry.
171
211
  */
172
- function validateName(val: string) {
212
+ function validateName(val: string): string {
173
213
  const name = val.trim().toLowerCase();
174
- if (!name.includes("-")) {
175
- return {
176
- error: "Name must contain a hyphen (e.g. my-component)",
177
- valid: false,
178
- };
179
- }
180
- if (!VALID_NAME.test(name)) {
181
- return {
182
- error: "Lowercase letters, digits, and hyphens only",
183
- valid: false,
184
- };
185
- }
186
- const exists = componentRegistry.some((c) => c.tagName === name);
187
- if (exists) {
188
- return { error: `Component <${name}> already exists`, valid: false };
214
+ const problem = customElementNameProblem(name);
215
+ if (problem !== "") {
216
+ return problem;
189
217
  }
190
- return { error: "", valid: true };
218
+ return componentRegistry.some((c) => c.tagName === name)
219
+ ? `Component <${name}> already exists`
220
+ : "";
191
221
  }
192
222
 
193
223
  /**
@@ -206,7 +236,7 @@ function promptComponentName(defaultName: string): Promise<string | null> {
206
236
  confirmLabel: "Convert",
207
237
  message: "Enter a hyphenated tag name for the new component.",
208
238
  placeholder: "my-component",
209
- validate: (value) => validateName(value).error,
239
+ validate: validateName,
210
240
  value: defaultName,
211
241
  });
212
242
  }
@@ -12,7 +12,9 @@
12
12
  *
13
13
  * @docs studio/design/repeaters
14
14
  */
15
- import { childIndex, childList, getNodeAtPath, parentElementPath } from "../store";
15
+ import { getNodeAtPath } from "@jxsuite/schema/doc-ops";
16
+ import { isJsonObject, isPrototypeDef } from "@jxsuite/schema/guards";
17
+ import { childIndex, childList, parentElementPath } from "../store";
16
18
  import { primarySelection } from "../tabs/selection";
17
19
  import { activeTab } from "../workspace/workspace";
18
20
  import { transactDoc } from "../tabs/transact";
@@ -22,15 +24,18 @@ import { fetchPluginSchema } from "../services/code-services";
22
24
  import { CREATE_NEW_SOURCE, openConvertRepeaterSurface } from "../surfaces/convert-repeater";
23
25
 
24
26
  import type { ConvertRepeaterView } from "../surfaces/convert-repeater";
25
- import type { JxMutableNode } from "@jxsuite/schema/types";
27
+ import type { JxMutableNode, JxRef, JxStateDefinition } from "@jxsuite/schema/types";
26
28
 
27
29
  /** What a name has to look like to become a state definition. */
28
30
  const IDENTIFIER = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/;
29
31
 
32
+ /** A document's state definitions, by name. */
33
+ type StateDefs = Readonly<Record<string, JxStateDefinition>>;
34
+
30
35
  interface RepeaterConfig {
31
- items: { $ref: string } | unknown[];
32
- filter?: { $ref: string };
33
- sort?: { $ref: string };
36
+ items: JxRef;
37
+ filter?: JxRef;
38
+ sort?: JxRef;
34
39
  newDef?: { name: string };
35
40
  }
36
41
 
@@ -65,14 +70,18 @@ export async function convertToRepeater() {
65
70
  if (!pp) {
66
71
  return;
67
72
  }
73
+ /* SAFETY: the command is enabled only when every selected path is spliceable
74
+ (`structurallyEditable` in commands/defaults.ts), so `path` ends in `"children", <index>`. */
68
75
  const idx = childIndex(path) as number;
69
76
  const parent = getNodeAtPath(doc, pp);
70
77
  if (!parent?.children) {
71
78
  return;
72
79
  }
73
- const element = childList(parent)[idx];
80
+ /* SAFETY: a selection addresses an element node (the canvas selects elements, and an outline
81
+ text row is not a selectable item), and this reads the selected slot of its parent. */
82
+ const element = childList(parent)[idx] as JxMutableNode;
74
83
 
75
- const repeater: Record<string, unknown> = {
84
+ const repeater: JxMutableNode = {
76
85
  $prototype: "Array",
77
86
  items: config.items,
78
87
  map: element,
@@ -84,9 +93,11 @@ export async function convertToRepeater() {
84
93
  repeater.sort = config.sort;
85
94
  }
86
95
 
87
- // Replace the selected element in place with the array pseudo-element — no wrapper div. The
88
- // Repeated items render directly among the original parent's children.
89
- (parent.children as (string | JxMutableNode)[])[idx] = repeater as unknown as JxMutableNode;
96
+ /* Replace the selected element in place with the array pseudo-element — no wrapper div. The
97
+ repeated items render directly among the original parent's children.
98
+ SAFETY: a document is normalized to the member form when it loads into a tab
99
+ (`normalizeArrayChildren`), so a present `children` is an array, never a bare repeater. */
100
+ (parent.children as (string | JxMutableNode)[])[idx] = repeater;
90
101
  });
91
102
  }
92
103
 
@@ -98,18 +109,19 @@ export async function convertToRepeater() {
98
109
  * returns in its schema — so it is asked for once per definition, and only for the ones the first
99
110
  * three did not already claim.
100
111
  */
101
- async function arraySourceNames(defs: Record<string, unknown>): Promise<string[]> {
112
+ async function arraySourceNames(defs: StateDefs): Promise<string[]> {
102
113
  const named = Object.entries(defs)
103
- .filter(([, d]) => {
104
- const def = d as Record<string, unknown> | null;
105
- return def?.type === "array" || Array.isArray(def?.default) || def?.$prototype === "Array";
106
- })
114
+ .filter(
115
+ ([, def]) =>
116
+ isJsonObject(def) &&
117
+ (def.type === "array" || Array.isArray(def.default) || def.$prototype === "Array"),
118
+ )
107
119
  .map(([name]) => name);
108
120
 
109
121
  const docPath = activeTab.value?.documentPath;
110
- for (const [name, d] of Object.entries(defs)) {
111
- const def = d as Record<string, unknown> | null;
112
- if (!def?.$prototype || def.$prototype === "Function" || def.$prototype === "Array") {
122
+ for (const [name, def] of Object.entries(defs)) {
123
+ // Only a named, non-Function, non-Array prototype can be a plugin whose schema says it returns one.
124
+ if (!isPrototypeDef(def) || !def.$prototype || def.$prototype === "Array") {
113
125
  continue;
114
126
  }
115
127
  if (named.includes(name)) {
@@ -117,8 +129,8 @@ async function arraySourceNames(defs: Record<string, unknown>): Promise<string[]
117
129
  }
118
130
  const schema = await fetchPluginSchema(
119
131
  {
120
- ...(def.$src != null && { $src: def.$src as string }),
121
- $prototype: def.$prototype as string,
132
+ ...(def.$src != null && { $src: def.$src }),
133
+ $prototype: def.$prototype,
122
134
  },
123
135
  { ...(docPath != null && { documentPath: docPath }) },
124
136
  );
@@ -136,10 +148,10 @@ async function arraySourceNames(defs: Record<string, unknown>): Promise<string[]
136
148
  * name keeps the dialog open with the reason under the field — the flow's state machine, which is
137
149
  * the half the surface deliberately does not have.
138
150
  *
139
- * @param {Record<string, unknown>} defs
151
+ * @param {StateDefs} defs
140
152
  * @returns {Promise<RepeaterConfig | null>}
141
153
  */
142
- async function promptRepeaterConfig(defs: Record<string, unknown>): Promise<RepeaterConfig | null> {
154
+ async function promptRepeaterConfig(defs: StateDefs): Promise<RepeaterConfig | null> {
143
155
  const sources = await arraySourceNames(defs);
144
156
  const functions = Object.entries(defs)
145
157
  .filter(([, d]) => defCategory(d) === "function")
@@ -21,11 +21,26 @@
21
21
  */
22
22
 
23
23
  import elementsMeta from "../../data/elements-meta.json";
24
+ import type { InlineAction } from "./inline-edit";
24
25
 
25
- interface ElementDef {
26
+ /** The fields of one `elements-meta.json` `$defs` entry the editor reads. */
27
+ export interface ElementMeta {
28
+ /** Tags this element accepts as inline children; containers declare `[]`. */
26
29
  $inlineChildren?: string[];
30
+ /** The formatting verbs the block action bar offers, or the tag whose list this one shares. */
31
+ $inlineActions?: InlineAction[] | string;
32
+ /** The `$convertGroups` group this element converts within. */
33
+ $convertTo?: string;
34
+ /** The groups offered instead of `$convertTo` while the element is empty. */
35
+ $convertToWhenEmpty?: string[];
27
36
  }
28
37
 
38
+ /**
39
+ * The studio's element metadata by tag. The JSON is bundled with the studio, so the compiler checks
40
+ * every entry against {@link ElementMeta} here, once, instead of each reader asserting it.
41
+ */
42
+ export const ELEMENT_DEFS: Readonly<Record<string, ElementMeta>> = elementsMeta.$defs;
43
+
29
44
  /**
30
45
  * Tags the studio's own metadata says accept inline children.
31
46
  *
@@ -36,7 +51,7 @@ interface ElementDef {
36
51
  const EXCLUDED = new Set(["pre"]);
37
52
 
38
53
  export const BUILTIN_EDITABLE_TAGS: ReadonlySet<string> = new Set(
39
- Object.entries(elementsMeta.$defs as Record<string, ElementDef>)
54
+ Object.entries(ELEMENT_DEFS)
40
55
  .filter(([tag, def]) => !EXCLUDED.has(tag) && (def.$inlineChildren?.length ?? 0) > 0)
41
56
  .map(([tag]) => tag),
42
57
  );
@@ -22,6 +22,8 @@ import { componentRegistry } from "../files/components";
22
22
  import { uploadAssets } from "../files/media-upload";
23
23
  import { applyDropInstruction } from "../panels/dnd";
24
24
  import { mutateUpdateAttribute, mutateUpdateProp, transactDoc } from "../tabs/transact";
25
+ import { isNumber } from "@jxsuite/schema/guards";
26
+ import type { ComponentEntry } from "../files/components";
25
27
  import type { UploadedAsset } from "../files/media-upload";
26
28
  import type { DropPreview, FileDropHit } from "../canvas/iframe-protocol";
27
29
  import type { JxPath } from "../state";
@@ -30,12 +32,12 @@ import type { JxMutableNode } from "@jxsuite/schema/types";
30
32
  import { isMediaFormat } from "../utils/studio-utils";
31
33
 
32
34
  /** Where an asset's URL goes when it replaces an existing element's picture. */
33
- const REPLACE_ATTRS: Record<string, "src" | "poster"> = {
34
- img: "src",
35
- source: "src",
35
+ const REPLACE_ATTRS = new Map<string, "src" | "poster">([
36
+ ["img", "src"],
37
+ ["source", "src"],
36
38
  // A <video>'s own `src` is the movie; dropping an image on one sets its poster frame instead.
37
- video: "poster",
38
- };
39
+ ["video", "poster"],
40
+ ]);
39
41
 
40
42
  /** What a drop resolves to once the parent has applied its semantics. */
41
43
  export type FileDropTarget =
@@ -43,11 +45,8 @@ export type FileDropTarget =
43
45
  | { mode: "replace-prop"; path: JxPath; prop: string }
44
46
  | { mode: "insert" };
45
47
 
46
- /** A component prop the registry declares as an image, for {@link resolveFileDropTarget}. */
47
- interface RegistryEntry {
48
- tagName: string;
49
- props?: { name: string; format?: unknown; [k: string]: unknown }[];
50
- }
48
+ /** The part of a registry entry {@link resolveFileDropTarget} reads: its tag and declared props. */
49
+ type RegistryEntry = Pick<ComponentEntry, "tagName" | "props">;
51
50
 
52
51
  /**
53
52
  * Decide whether a drop replaces an existing picture or inserts a new element.
@@ -66,15 +65,15 @@ export function resolveFileDropTarget(
66
65
  if (!hit || kind !== "image") {
67
66
  return { mode: "insert" };
68
67
  }
69
- const attr = REPLACE_ATTRS[hit.tagName];
68
+ const attr = REPLACE_ATTRS.get(hit.tagName);
70
69
  if (attr) {
71
- return { attr, mode: "replace-attr", path: hit.path as JxPath };
70
+ return { attr, mode: "replace-attr", path: hit.path };
72
71
  }
73
72
  if (hit.tagName.includes("-")) {
74
73
  const entry = registry.find((c) => c.tagName === hit.tagName);
75
74
  const imageProps = (entry?.props ?? []).filter((p) => isMediaFormat(p.format));
76
75
  if (imageProps.length === 1) {
77
- return { mode: "replace-prop", path: hit.path as JxPath, prop: imageProps[0]!.name };
76
+ return { mode: "replace-prop", path: hit.path, prop: imageProps[0]!.name };
78
77
  }
79
78
  }
80
79
  return { mode: "insert" };
@@ -84,24 +83,32 @@ export function resolveFileDropTarget(
84
83
  * The node an uploaded asset becomes when inserted. Images get a plain `<img>` (the build's
85
84
  * optimizer picks it up); playable media gets native controls so it is usable straight away;
86
85
  * anything else becomes a download link, which is the only sensible generic rendering.
86
+ *
87
+ * **An image arrives with no `alt` at all, never an empty one.** `alt=""` is a claim (the image is
88
+ * decorative, and a screen reader skips it), and a drop cannot know it: stamping it made every
89
+ * dropped picture invisible to assistive technology and silenced the accessibility report's
90
+ * `img-alt-missing`, the one check that would have asked. Leaving it out is what gets the image
91
+ * flagged, and the drop selects the new element (`applyDropInstruction`), so the Inspector is
92
+ * already on the field the author has to fill. Neither is the file name a description: `IMG_0412`
93
+ * read aloud is noise, not an alternative.
87
94
  */
88
95
  export function elementForAsset(asset: UploadedAsset): JxMutableNode {
89
96
  switch (asset.kind) {
90
97
  case "image": {
91
- return { attributes: { alt: "", src: asset.ref }, tagName: "img" } as JxMutableNode;
98
+ return { attributes: { src: asset.ref }, tagName: "img" };
92
99
  }
93
100
  case "video": {
94
- return { attributes: { controls: "", src: asset.ref }, tagName: "video" } as JxMutableNode;
101
+ return { attributes: { controls: "", src: asset.ref }, tagName: "video" };
95
102
  }
96
103
  case "audio": {
97
- return { attributes: { controls: "", src: asset.ref }, tagName: "audio" } as JxMutableNode;
104
+ return { attributes: { controls: "", src: asset.ref }, tagName: "audio" };
98
105
  }
99
106
  default: {
100
107
  return {
101
108
  attributes: { href: asset.ref },
102
109
  tagName: "a",
103
110
  textContent: asset.name,
104
- } as JxMutableNode;
111
+ };
105
112
  }
106
113
  }
107
114
  }
@@ -114,13 +121,13 @@ export function elementForAsset(asset: UploadedAsset): JxMutableNode {
114
121
  * they were dropped. `make-child` appends, which is already ordered.
115
122
  */
116
123
  export function nthDropPath(preview: DropPreview, n: number): JxPath {
117
- const path = [...preview.targetPath];
124
+ const path: JxPath = [...preview.targetPath];
118
125
  const tail = path.at(-1);
119
- if (n === 0 || typeof tail !== "number") {
120
- return path as JxPath;
126
+ if (n === 0 || !isNumber(tail)) {
127
+ return path;
121
128
  }
122
129
  path[path.length - 1] = tail + n;
123
- return path as JxPath;
130
+ return path;
124
131
  }
125
132
 
126
133
  /**
@@ -160,7 +167,7 @@ export async function applyFileDrop(
160
167
  if (preview) {
161
168
  applyDropInstruction(tab, { type: preview.instruction }, srcData, nthDropPath(preview, i));
162
169
  } else {
163
- applyDropInstruction(tab, { type: "make-child" }, srcData, [] as unknown as JxPath);
170
+ applyDropInstruction(tab, { type: "make-child" }, srcData, []);
164
171
  }
165
172
  }
166
173
  }