@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.
- package/README.md +5 -5
- package/dist/chunks/2020-5wtzce5g.js +4 -0
- package/dist/chunks/{action-group-2mqby73c.js → action-group-4aan7g6g.js} +3 -3
- package/dist/chunks/adapter-5tphg7xe.js +4 -0
- package/dist/chunks/add-new-flow-psym14sn.js +4 -0
- package/dist/chunks/cf-account-picker-haqazq5r.js +4 -0
- package/dist/chunks/cf-settings-h2wrh6hq.js +4 -0
- package/dist/chunks/color-area-6rbra5dy.js +4 -0
- package/dist/chunks/color-field-gy56c94g.js +4 -0
- package/dist/chunks/color-m7r1vk54.js +4 -0
- package/dist/chunks/color-slider-sqqdyf6c.js +4 -0
- package/dist/chunks/combobox-72h32ejk.js +4 -0
- package/dist/chunks/components-r22xca09.js +4 -0
- package/dist/chunks/content-source-mmppmcyg.js +4 -0
- package/dist/chunks/convert-to-repeater-he70fc2b.js +4 -0
- package/dist/chunks/dialog-c4x05vyx.js +4 -0
- package/dist/chunks/editor-ccd9jwsa.js +4 -0
- package/dist/chunks/entry-commands-6qxz9e8p.js +4 -0
- package/dist/chunks/extension-sections-0egb88dm.js +4 -0
- package/dist/chunks/file-ops-qnab36ek.js +4 -0
- package/dist/chunks/files-rcn56qvm.js +4 -0
- package/dist/chunks/format-host-yxz0kjjs.js +4 -0
- package/dist/chunks/fs-events-d1qxq4z4.js +4 -0
- package/dist/chunks/grid-open-4z1g062t.js +4 -0
- package/dist/chunks/grid-view-qg1b5eqx.js +51 -0
- package/dist/chunks/icons-63bjtbs7.js +4 -0
- package/dist/chunks/iframe-entry-2zggzajv.js +5 -0
- package/dist/chunks/iframe-entry-76j8vwwx.js +5 -0
- package/dist/chunks/iframe-entry-99nr5zfb.js +5 -0
- package/dist/chunks/iframe-entry-pkgmcgp0.js +5 -0
- package/dist/chunks/iframe-host-ssv7kyj0.js +4 -0
- package/dist/chunks/{index-2veqmnhr.js → index-32eqzv1k.js} +3 -3
- package/dist/chunks/index-f0jn7nnp.js +4 -0
- package/dist/chunks/{javascript-8nbvs12s.js → javascript-pjp734q4.js} +3 -3
- package/dist/chunks/jsonMode-njkvsa02.js +13 -0
- package/dist/chunks/jx-validate-ttasrbh7.js +4 -0
- package/dist/chunks/layers-bgyr11tr.js +4 -0
- package/dist/chunks/layers-panel-7ez66zeq.js +4 -0
- package/dist/chunks/listbox-c421cf8c.js +4 -0
- package/dist/chunks/lit-html-v9gh687x.js +4 -0
- package/dist/chunks/media-library-sq468wts.js +4 -0
- package/dist/chunks/media-picker-shfe59pt.js +4 -0
- package/dist/chunks/menu-bdpzbfvs.js +4 -0
- package/dist/chunks/monaco-binding-vq1hgnn0.js +4 -0
- package/dist/chunks/monaco-buffer-3afgwvbp.js +4 -0
- package/dist/chunks/monaco-setup-xrd2cbkp.js +4 -0
- package/dist/chunks/notify-kzrjr3fv.js +4 -0
- package/dist/chunks/number-field-y62xq0ty.js +4 -0
- package/dist/chunks/parse-v77xtwv7.js +4 -0
- package/dist/chunks/platform-7v4rtd7m.js +4 -0
- package/dist/chunks/popover-b89sfej7.js +4 -0
- package/dist/chunks/publish-panel-2z9gw8ee.js +4 -0
- package/dist/chunks/publish-quick-qx2455cj.js +4 -0
- package/dist/chunks/publish-workspace-wrc1dgwx.js +4 -0
- package/dist/chunks/quick-search-n0t0eqxb.js +4 -0
- package/dist/chunks/references-9547rg5s.js +4 -0
- package/dist/chunks/right-panel-wsgnr9pn.js +4 -0
- package/dist/chunks/select-rzds841e.js +4 -0
- package/dist/chunks/source-control-kwktr9y6.js +4 -0
- package/dist/chunks/split-c9zfdgxf.js +4 -0
- package/dist/chunks/studio-03ct6yfv.js +9 -0
- package/dist/chunks/studio-07rcfje3.js +5 -0
- package/dist/chunks/studio-3e54qh39.js +7 -0
- package/dist/chunks/studio-3exxhz5g.js +5 -0
- package/dist/chunks/studio-3q40e3rj.js +5 -0
- package/dist/chunks/studio-3qeh9t0h.js +6 -0
- package/dist/chunks/studio-3qqjeep5.js +6 -0
- package/dist/chunks/studio-43sd2mam.js +4 -0
- package/dist/chunks/studio-4hp8pkyt.js +5 -0
- package/dist/chunks/studio-58xg6j2q.js +9 -0
- package/dist/chunks/studio-5g0rprdt.js +7 -0
- package/dist/chunks/studio-6m380wp7.js +5 -0
- package/dist/chunks/studio-80jyh1xh.js +4 -0
- package/dist/chunks/studio-83mk4bgg.js +9 -0
- package/dist/chunks/{studio-kggey1jt.js → studio-881z1xrx.js} +4 -4
- package/dist/chunks/studio-8m0y2qe7.js +5 -0
- package/dist/chunks/studio-8tr6cfrc.js +5 -0
- package/dist/chunks/studio-8vcvfs7r.js +6 -0
- package/dist/chunks/studio-9tmebf0s.js +5 -0
- package/dist/chunks/studio-a2bvaptz.js +5 -0
- package/dist/chunks/studio-b7y5mr30.js +5 -0
- package/dist/chunks/studio-bavb31r0.js +5 -0
- package/dist/chunks/studio-bbe4c90a.js +5 -0
- package/dist/chunks/studio-c05wdnt3.js +5 -0
- package/dist/chunks/studio-ccv2svc6.js +5 -0
- package/dist/chunks/studio-d5grtb9e.js +16 -0
- package/dist/chunks/studio-df0baea9.js +5 -0
- package/dist/chunks/studio-dgk4dqtx.js +7 -0
- package/dist/chunks/studio-e1g64q43.js +5 -0
- package/dist/chunks/studio-ed1hp6zf.js +6 -0
- package/dist/chunks/studio-ed3xx40h.js +7 -0
- package/dist/chunks/studio-f14e1zdj.js +5 -0
- package/dist/chunks/studio-fbhxxc5f.js +5 -0
- package/dist/chunks/studio-fyh0jc96.js +5 -0
- package/dist/chunks/studio-gcxk20n7.js +5 -0
- package/dist/chunks/studio-jaaz8ce9.js +5 -0
- package/dist/chunks/{studio-8grwxtqk.js → studio-jcnsdaep.js} +4 -4
- package/dist/chunks/studio-jsgf2q5k.js +7 -0
- package/dist/chunks/{studio-1q1sh2ax.js → studio-k3xxbagr.js} +3 -3
- package/dist/chunks/studio-k7evxqh4.js +5 -0
- package/dist/chunks/studio-kt3pjkwd.js +5 -0
- package/dist/chunks/studio-m8g16bgz.js +5 -0
- package/dist/chunks/studio-mn0476ag.js +5 -0
- package/dist/chunks/studio-mx1smyq0.js +5 -0
- package/dist/chunks/studio-n0c5h6mf.js +5 -0
- package/dist/chunks/{studio-rv11kfwa.js → studio-nh6d342n.js} +7 -7
- package/dist/chunks/studio-nqxqf8p2.js +4 -0
- package/dist/chunks/studio-p4nrkvqr.js +5 -0
- package/dist/chunks/{studio-h46vtzk8.js → studio-pbxa5fpc.js} +4 -4
- package/dist/chunks/studio-pgmvdv7z.js +7 -0
- package/dist/chunks/studio-ph84avkf.js +5 -0
- package/dist/chunks/{studio-wszjyh0j.js → studio-q0mvbaq6.js} +4 -4
- package/dist/chunks/studio-q0tccd43.js +5 -0
- package/dist/chunks/studio-q7rtx6zq.js +14 -0
- package/dist/chunks/{studio-pre0skq6.js → studio-qgh13jtz.js} +4 -4
- package/dist/chunks/studio-qmn1xc24.js +5 -0
- package/dist/chunks/studio-qwdqwkj0.js +5 -0
- package/dist/chunks/{studio-t6b6qe31.js → studio-r5qy30vx.js} +4 -4
- package/dist/chunks/studio-rj9eamf8.js +5 -0
- package/dist/chunks/studio-rptgsk96.js +5 -0
- package/dist/chunks/studio-rthyg42z.js +928 -0
- package/dist/chunks/studio-s19tp1xr.js +5 -0
- package/dist/chunks/studio-s32578pn.js +5 -0
- package/dist/chunks/studio-svb7yyve.js +5 -0
- package/dist/chunks/studio-syreb644.js +5 -0
- package/dist/chunks/studio-tf9jryb1.js +10 -0
- package/dist/chunks/studio-tfkznv39.js +5 -0
- package/dist/chunks/studio-tft6r105.js +5 -0
- package/dist/chunks/studio-txf2kysx.js +5 -0
- package/dist/chunks/studio-v8867ddv.js +12 -0
- package/dist/chunks/studio-vxq7fcvv.js +5 -0
- package/dist/chunks/studio-w4rz9hdk.js +5 -0
- package/dist/chunks/studio-wbcjbhy1.js +9 -0
- package/dist/chunks/studio-wc649wss.js +5 -0
- package/dist/chunks/studio-wys23mxz.js +5 -0
- package/dist/chunks/studio-x1x167jh.js +5 -0
- package/dist/chunks/studio-x9hsze61.js +5 -0
- package/dist/chunks/studio-y0n7yxea.js +9 -0
- package/dist/chunks/studio-y3ahhdpx.js +5 -0
- package/dist/chunks/studio-z97c48fk.js +5 -0
- package/dist/chunks/studio-zat62m0c.js +5 -0
- package/dist/chunks/studio-zcd2e7yz.js +5 -0
- package/dist/chunks/studio-zz9qe3rw.js +64 -0
- package/dist/chunks/swatch-group-ewh24n1f.js +4 -0
- package/dist/chunks/tabs-f5cw3tgp.js +4 -0
- package/dist/chunks/textfield-wewc8rq2.js +4 -0
- package/dist/chunks/toast-1gv0h53h.js +4 -0
- package/dist/chunks/toast-host-1yg5ar8d.js +4 -0
- package/dist/chunks/{toolbar-2nnzqhrj.js → toolbar-44cm5cta.js} +3 -3
- package/dist/chunks/tooltip-yypz28gq.js +4 -0
- package/dist/chunks/tree-9xa4hm7n.js +4 -0
- package/dist/chunks/tsMode-epyfz1hv.js +14 -0
- package/dist/chunks/workspace-dz7nxfhv.js +4 -0
- package/dist/chunks/workspace-home-xsd7hkjw.js +4 -0
- package/dist/chunks/ws-client-bv552sfx.js +4 -0
- package/dist/iframe-entry.js +20 -16
- package/dist/manifest.json +77 -63
- package/dist/studio.js +106 -107
- package/dist/workers/ts.worker.js +3 -3
- package/package.json +17 -16
- package/src/about/about-modal.ts +4 -3
- package/src/account/action-flow.ts +45 -38
- package/src/account-status.ts +7 -2
- package/src/browse/component-examples.ts +272 -0
- package/src/browse/library-commands.ts +64 -104
- package/src/browse/library-layouts.ts +270 -53
- package/src/browse/library-model.ts +194 -134
- package/src/browse/library-pane.ts +748 -440
- package/src/browse/library-preview.ts +161 -26
- package/src/browse/library-source.ts +308 -41
- package/src/browse/preview-root.ts +78 -0
- package/src/browse/preview-style.ts +155 -0
- package/src/canvas/asset-refs.ts +40 -10
- package/src/canvas/asset-resolve.ts +19 -23
- package/src/canvas/canvas-helpers.ts +7 -6
- package/src/canvas/canvas-live-render.ts +260 -77
- package/src/canvas/canvas-origin.ts +37 -12
- package/src/canvas/canvas-page-context.ts +112 -0
- package/src/canvas/canvas-patcher.ts +30 -30
- package/src/canvas/canvas-perf.ts +11 -5
- package/src/canvas/canvas-render.ts +175 -148
- package/src/canvas/canvas-surface.ts +5 -3
- package/src/canvas/canvas-utils.ts +147 -61
- package/src/canvas/dialog-path.ts +9 -4
- package/src/canvas/dialog-state.ts +1 -2
- package/src/canvas/diff-marks.ts +9 -16
- package/src/canvas/diff-toolbar.ts +8 -7
- package/src/canvas/edit-width-drag.ts +4 -1
- package/src/canvas/edit-width.ts +1 -3
- package/src/canvas/iframe-channel.ts +27 -13
- package/src/canvas/iframe-drop.ts +120 -12
- package/src/canvas/iframe-editable-root.ts +29 -16
- package/src/canvas/iframe-entry.ts +104 -75
- package/src/canvas/iframe-eval.ts +73 -49
- package/src/canvas/iframe-host.ts +269 -158
- package/src/canvas/iframe-inline-edit.ts +49 -30
- package/src/canvas/iframe-insert.ts +5 -4
- package/src/canvas/iframe-interaction.ts +30 -25
- package/src/canvas/iframe-keys.ts +11 -0
- package/src/canvas/iframe-overlay.ts +1 -1
- package/src/canvas/iframe-patch.ts +25 -21
- package/src/canvas/iframe-position.ts +12 -6
- package/src/canvas/iframe-protocol.ts +36 -21
- package/src/canvas/iframe-render.ts +84 -35
- package/src/canvas/iframe-slash.ts +24 -11
- package/src/canvas/iframe-subtree.ts +10 -3
- package/src/canvas/npm-modules.ts +22 -0
- package/src/canvas/path-mapping.ts +19 -12
- package/src/canvas/popover-path.ts +7 -3
- package/src/canvas/popover-state.ts +1 -2
- package/src/canvas/preview-navigate.ts +16 -0
- package/src/canvas/repeater-sources.ts +200 -0
- package/src/canvas/serialize-scope.ts +13 -5
- package/src/canvas/stage-scrollbar.ts +7 -2
- package/src/canvas/surface-registry.ts +27 -3
- package/src/collab/collab-commands.ts +7 -2
- package/src/collab/collab-session.ts +84 -45
- package/src/collab/collab-state.ts +4 -3
- package/src/collab/monaco-binding.ts +16 -13
- package/src/collab/monaco-cursors.ts +5 -2
- package/src/commands/app-commands.ts +16 -6
- package/src/commands/budget.ts +13 -11
- package/src/commands/command-args.ts +103 -71
- package/src/commands/context.ts +55 -28
- package/src/commands/defaults.ts +69 -45
- package/src/commands/keymap.ts +56 -43
- package/src/commands/levels.ts +14 -8
- package/src/commands/live-context.ts +9 -7
- package/src/commands/reference.ts +2 -1
- package/src/commands/registry.ts +22 -11
- package/src/commands/run-reported.ts +15 -10
- package/src/component-props.ts +46 -30
- package/src/content/collection-match.ts +11 -9
- package/src/content/collection-pages.ts +412 -0
- package/src/content/content-collections.ts +270 -0
- package/src/content/draft-state.ts +4 -3
- package/src/content/entry-commands.ts +54 -62
- package/src/content/entry-editor.ts +137 -32
- package/src/content/entry-fields.ts +25 -8
- package/src/content/entry-inspector.ts +225 -0
- package/src/content/entry-model.ts +38 -15
- package/src/content/entry-open.ts +80 -0
- package/src/content/entry-summaries.ts +440 -0
- package/src/content/file-record-ids.ts +80 -0
- package/src/content/file-records.ts +125 -0
- package/src/content/page-summaries.ts +129 -0
- package/src/content/record-entry.ts +201 -0
- package/src/content/writing-banner.ts +177 -0
- package/src/create/add-new-commands.ts +185 -0
- package/src/create/add-new-flow.ts +1116 -0
- package/src/create/add-new.ts +1014 -0
- package/src/create/element-name.ts +121 -0
- package/src/editor/canvas-context-menu.ts +1 -2
- package/src/editor/canvas-slash-bridge.ts +3 -6
- package/src/editor/content-slice.ts +16 -14
- package/src/editor/context-menu.ts +35 -22
- package/src/editor/convert-targets.ts +30 -35
- package/src/editor/convert-to-component.ts +78 -48
- package/src/editor/convert-to-repeater.ts +34 -22
- package/src/editor/editable-tags.ts +17 -2
- package/src/editor/file-drop-action.ts +29 -22
- package/src/editor/inline-edit-apply.ts +79 -17
- package/src/editor/inline-edit.ts +76 -50
- package/src/editor/inline-format.ts +59 -56
- package/src/editor/inline-link.ts +40 -15
- package/src/editor/insert-component.ts +91 -0
- package/src/editor/insert-zone-action.ts +14 -5
- package/src/editor/merge-tags.ts +58 -19
- package/src/editor/repeater-scope.ts +39 -28
- package/src/editor/shortcuts.ts +76 -42
- package/src/editor/slash-menu.ts +52 -14
- package/src/files/asset-versions.ts +4 -4
- package/src/files/components.ts +89 -20
- package/src/files/elements.ts +5 -6
- package/src/files/file-ops.ts +92 -41
- package/src/files/files.ts +248 -239
- package/src/files/fs-events.ts +18 -7
- package/src/files/media-meta.ts +97 -2
- package/src/files/media-paths.ts +3 -0
- package/src/files/media-types.ts +55 -0
- package/src/files/media-upload.ts +209 -52
- package/src/files/new-file-name.ts +156 -0
- package/src/files/serialize-document.ts +15 -5
- package/src/format/constraints.ts +1 -1
- package/src/format/convert-file.ts +27 -13
- package/src/format/format-choices.ts +2 -1
- package/src/format/format-host.ts +91 -50
- package/src/github/github-auth-status.ts +27 -3
- package/src/github/github-auth.ts +21 -11
- package/src/github/github-publish.ts +28 -23
- package/src/grid/cell-editors.ts +46 -31
- package/src/grid/cell-popovers.ts +5 -3
- package/src/grid/edit-buffer.ts +10 -9
- package/src/grid/grid-controller.ts +25 -23
- package/src/grid/grid-layout.ts +21 -5
- package/src/grid/grid-open.ts +3 -33
- package/src/grid/grid-panel.ts +65 -6
- package/src/grid/grid-reveal.ts +34 -0
- package/src/grid/grid-source.ts +9 -31
- package/src/grid/grid-view.ts +45 -23
- package/src/grid/redirects-grid.ts +14 -5
- package/src/grid/redirects.ts +16 -14
- package/src/grid/schema-columns.ts +25 -19
- package/src/grid/sources/connector-source.ts +47 -20
- package/src/grid/sources/content-source.ts +100 -31
- package/src/grid/sources/csv-file-source.ts +2 -2
- package/src/grid/tabulator-tables.d.ts +61 -34
- package/src/hosting/document.ts +2 -2
- package/src/hosting/stage.ts +7 -7
- package/src/i18n/i18n-commands.ts +3 -3
- package/src/media/media-commands.ts +181 -0
- package/src/media/media-library-model.ts +232 -0
- package/src/media/media-library.ts +1283 -0
- package/src/media/media-pane.ts +51 -20
- package/src/new-project/add-repo-modal.ts +20 -19
- package/src/new-project/import-tab.ts +10 -14
- package/src/new-project/location-fields.ts +2 -1
- package/src/new-project/new-project-modal.ts +12 -9
- package/src/packages/jxsuite-update.ts +4 -3
- package/src/packages/pull-package-sync.ts +26 -25
- package/src/page-params.ts +97 -68
- package/src/panels/activity-panel.ts +38 -14
- package/src/panels/ai-chat/attached-context.ts +13 -7
- package/src/panels/ai-chat/chat-markdown.ts +8 -8
- package/src/panels/ai-chat/chat-view.ts +80 -73
- package/src/panels/ai-chat/composer.ts +30 -33
- package/src/panels/ai-chat/sessions-view.ts +1 -2
- package/src/panels/ai-panel.ts +23 -20
- package/src/panels/block-action-bar.ts +57 -46
- package/src/panels/bottom-dock.ts +5 -3
- package/src/panels/canvas-dnd-bridge.ts +36 -26
- package/src/panels/chat-panel.ts +6 -6
- package/src/panels/collections-panel.ts +306 -0
- package/src/panels/component-preview.ts +35 -13
- package/src/panels/data-explorer.ts +63 -26
- package/src/panels/data-grid.ts +18 -11
- package/src/panels/dnd.ts +115 -138
- package/src/panels/editors.ts +52 -21
- package/src/panels/elements-panel.ts +19 -5
- package/src/panels/empty-state.ts +2 -2
- package/src/panels/events-panel.ts +84 -69
- package/src/panels/formula-workspace.ts +78 -54
- package/src/panels/frontmatter-fields.ts +33 -28
- package/src/panels/git-diff-open.ts +10 -6
- package/src/panels/head-panel.ts +488 -202
- package/src/panels/i18n-panel.ts +20 -12
- package/src/panels/imports-panel.ts +25 -47
- package/src/panels/jump-bar.ts +75 -31
- package/src/panels/layers-panel.ts +130 -101
- package/src/panels/left-panel.ts +25 -11
- package/src/panels/navigator-panels.ts +23 -11
- package/src/panels/pane-context.ts +140 -49
- package/src/panels/pane-grid.ts +55 -26
- package/src/panels/panel-registry.ts +36 -46
- package/src/panels/properties-panel.ts +182 -124
- package/src/panels/quick-search.ts +53 -31
- package/src/panels/right-panel.ts +201 -45
- package/src/panels/seo-modal.ts +54 -125
- package/src/panels/settings-menu.ts +63 -61
- package/src/panels/settings-pane.ts +268 -162
- package/src/panels/signals-panel.ts +156 -135
- package/src/panels/site-model.ts +367 -0
- package/src/panels/site-panel.ts +638 -0
- package/src/panels/statement-editor.ts +230 -140
- package/src/panels/style-panel.ts +253 -206
- package/src/panels/style-utils.ts +114 -51
- package/src/panels/stylebook-doc.ts +195 -60
- package/src/panels/stylebook-layers-panel.ts +48 -89
- package/src/panels/stylebook-panel.ts +60 -27
- package/src/panels/styles-panel.ts +327 -0
- package/src/panels/tab-drop.ts +27 -11
- package/src/panels/tab-strip.ts +143 -49
- package/src/platform-errors.ts +57 -43
- package/src/platform.ts +59 -31
- package/src/platforms/cloud.ts +373 -176
- package/src/platforms/default-platform.ts +14 -8
- package/src/platforms/devserver.ts +180 -142
- package/src/platforms/read-batcher.ts +16 -8
- package/src/project-list.ts +2 -1
- package/src/publish/deploy-checklist.ts +20 -9
- package/src/publish/pages-service.ts +66 -27
- package/src/publish/publish-changes.ts +491 -0
- package/src/publish/publish-commands.ts +88 -22
- package/src/publish/publish-ids.ts +49 -0
- package/src/publish/publish-panel.ts +10 -6
- package/src/publish/publish-quick.ts +148 -0
- package/src/publish/publish-workspace.ts +926 -0
- package/src/publish/source-control.ts +907 -0
- package/src/recent-projects.ts +15 -8
- package/src/resize-edges.ts +26 -36
- package/src/services/a11y-report.ts +26 -19
- package/src/services/agent-seed.ts +23 -11
- package/src/services/ai-ask.ts +9 -12
- package/src/services/ai-command-tools.ts +68 -62
- package/src/services/ai-import-tools.ts +80 -67
- package/src/services/ai-models.ts +17 -13
- package/src/services/ai-project-tools.ts +68 -32
- package/src/services/ai-session-store.ts +19 -10
- package/src/services/ai-system-prompt.ts +46 -20
- package/src/services/ai-tools.ts +71 -27
- package/src/services/ai-write-report.ts +20 -12
- package/src/services/ai-writes.ts +4 -4
- package/src/services/automation.ts +74 -51
- package/src/services/cem-export.ts +149 -58
- package/src/services/cf-settings.ts +4 -4
- package/src/services/clock.ts +6 -1
- package/src/services/code-services.ts +37 -31
- package/src/services/connection.ts +2 -2
- package/src/services/context-manager.ts +14 -10
- package/src/services/context-resolver.ts +20 -8
- package/src/services/data-service.ts +19 -15
- package/src/services/directory-picker.ts +20 -14
- package/src/services/document-assistant.ts +39 -19
- package/src/services/gated-registry.ts +10 -6
- package/src/services/harness/chat-reducer.ts +23 -1
- package/src/services/import-client.ts +91 -38
- package/src/services/import-seed.ts +8 -2
- package/src/services/jx-validate.ts +28 -31
- package/src/services/live-preview.ts +0 -0
- package/src/services/live-surfaces.ts +6 -3
- package/src/services/model-uri.ts +10 -2
- package/src/services/module-preloads.ts +12 -8
- package/src/services/monaco-buffer.ts +43 -24
- package/src/services/monaco-lazy.ts +7 -8
- package/src/services/monaco-setup.ts +23 -16
- package/src/services/notify.ts +44 -17
- package/src/services/popover-report.ts +25 -10
- package/src/services/preview-eval.ts +20 -8
- package/src/services/profile.ts +13 -6
- package/src/services/project-path.ts +13 -10
- package/src/services/references.ts +0 -0
- package/src/services/render-critic.ts +29 -9
- package/src/services/settings/definitions.ts +25 -14
- package/src/services/settings/kernel.ts +13 -4
- package/src/services/settings/write-queue.ts +9 -9
- package/src/services/token-lint.ts +12 -10
- package/src/services/tool-executor.ts +17 -5
- package/src/services/tool-outcomes.ts +44 -24
- package/src/services/trusted-types.ts +24 -7
- package/src/settings/contexts-section.ts +11 -8
- package/src/settings/contributed-section.ts +128 -70
- package/src/settings/css-vars-editor.ts +119 -32
- package/src/settings/defs-editor.ts +38 -35
- package/src/settings/developer-panels.ts +43 -0
- package/src/settings/extension-rows.ts +16 -8
- package/src/settings/extension-sections.ts +42 -14
- package/src/settings/extensions-section.ts +4 -1
- package/src/settings/general-settings.ts +101 -28
- package/src/settings/locales-section.ts +20 -12
- package/src/settings/preferences-dialog.ts +17 -7
- package/src/settings/preferences-keymap.ts +7 -5
- package/src/settings/preferences-sections.ts +11 -5
- package/src/settings/project-sections.ts +28 -11
- package/src/settings/schema-field-ui.ts +12 -1
- package/src/settings/section-registry.ts +116 -11
- package/src/settings/settings-dialog.ts +192 -0
- package/src/settings/settings-document.ts +186 -166
- package/src/shell/tree.ts +6 -5
- package/src/shell.ts +536 -477
- package/src/site-context.ts +101 -32
- package/src/state.ts +68 -57
- package/src/store.ts +54 -34
- package/src/studio.ts +219 -116
- package/src/style/live-preview.ts +1 -1
- package/src/style/project-styles.ts +40 -7
- package/src/style/stylebook-specimens.ts +89 -0
- package/src/style/stylebook-target.ts +26 -0
- package/src/style/tag-inheritance.ts +105 -0
- package/src/style/token-ref.ts +5 -4
- package/src/style/variables-focus.ts +61 -0
- package/src/style/variables-view.ts +235 -0
- package/src/surfaces/about.ts +18 -19
- package/src/surfaces/add-new.json +1482 -0
- package/src/surfaces/add-new.ts +325 -0
- package/src/surfaces/add-repo.ts +17 -19
- package/src/surfaces/ai-chat.ts +33 -38
- package/src/surfaces/ai-credentials-form.ts +6 -16
- package/src/surfaces/ai-managed-connect.ts +3 -4
- package/src/surfaces/ai-model-picker.ts +3 -5
- package/src/surfaces/block-action-bar.ts +22 -11
- package/src/surfaces/boot-failure.json +4 -3
- package/src/surfaces/boot-failure.ts +4 -5
- package/src/surfaces/bottom-dock.json +1 -1
- package/src/surfaces/bottom-dock.ts +9 -18
- package/src/surfaces/canvas-stage.json +30 -19
- package/src/surfaces/canvas-stage.ts +17 -16
- package/src/surfaces/cf-account-picker.ts +17 -18
- package/src/surfaces/collections-panel.json +615 -0
- package/src/surfaces/collections-panel.ts +168 -0
- package/src/surfaces/commandbar.json +241 -96
- package/src/surfaces/commandbar.ts +145 -105
- package/src/surfaces/convert-repeater.ts +17 -19
- package/src/surfaces/data-actions.ts +9 -7
- package/src/surfaces/dialog.ts +26 -28
- package/src/surfaces/diff-toolbar.ts +9 -7
- package/src/surfaces/empty-state.json +1 -1
- package/src/surfaces/empty-state.ts +7 -10
- package/src/surfaces/entry-editor.json +136 -0
- package/src/surfaces/entry-editor.ts +35 -11
- package/src/surfaces/entry-inspector.json +371 -0
- package/src/surfaces/entry-inspector.ts +143 -0
- package/src/surfaces/expression-editor.ts +11 -25
- package/src/surfaces/files-panel.ts +27 -14
- package/src/surfaces/formula-palette.ts +4 -5
- package/src/surfaces/github-auth.ts +16 -20
- package/src/surfaces/github-publish.ts +17 -22
- package/src/surfaces/grid-cell.ts +30 -31
- package/src/surfaces/grid-open.ts +10 -14
- package/src/surfaces/grid-panel.ts +13 -9
- package/src/surfaces/grid-replace.ts +13 -13
- package/src/surfaces/grid-views.ts +15 -18
- package/src/surfaces/inspector-dock.json +162 -14
- package/src/surfaces/inspector-dock.ts +59 -31
- package/src/surfaces/jump-bar.ts +5 -6
- package/src/surfaces/jxsuite-update.ts +16 -22
- package/src/surfaces/library-pane.json +670 -437
- package/src/surfaces/library-pane.ts +111 -77
- package/src/surfaces/logic-panel.ts +17 -30
- package/src/surfaces/logic-workspace.ts +13 -15
- package/src/surfaces/media-browser.json +62 -6
- package/src/surfaces/media-browser.ts +26 -11
- package/src/surfaces/media-field.json +1 -1
- package/src/surfaces/media-field.ts +4 -5
- package/src/surfaces/media-library.json +1586 -0
- package/src/surfaces/media-library.ts +282 -0
- package/src/surfaces/media-pane.ts +8 -7
- package/src/surfaces/media-pick-dialog.json +71 -0
- package/src/surfaces/media-pick-dialog.ts +132 -0
- package/src/surfaces/menu.ts +47 -23
- package/src/surfaces/navigator-dock.ts +11 -12
- package/src/surfaces/new-project.ts +27 -26
- package/src/surfaces/pane-context.json +144 -77
- package/src/surfaces/pane-context.ts +44 -25
- package/src/surfaces/pane-grid.ts +15 -10
- package/src/surfaces/panel-activity.ts +5 -6
- package/src/surfaces/panel-data.ts +3 -4
- package/src/surfaces/panel-deploy-checklist.json +12 -6
- package/src/surfaces/panel-deploy-checklist.ts +8 -7
- package/src/surfaces/panel-elements.ts +5 -7
- package/src/surfaces/panel-i18n.ts +5 -7
- package/src/surfaces/panel-imports.ts +6 -13
- package/src/surfaces/panel-outline.ts +25 -19
- package/src/surfaces/panel-page.json +72 -2
- package/src/surfaces/panel-page.ts +49 -25
- package/src/surfaces/panel-problems.ts +5 -7
- package/src/surfaces/panel-signals.json +1 -1
- package/src/surfaces/panel-signals.ts +25 -39
- package/src/surfaces/panel-stylebook-layers.json +71 -204
- package/src/surfaces/panel-stylebook-layers.ts +5 -29
- package/src/surfaces/preferences.json +120 -48
- package/src/surfaces/preferences.ts +29 -11
- package/src/surfaces/progress-modal.ts +15 -9
- package/src/surfaces/properties-panel.json +1 -1
- package/src/surfaces/properties-panel.ts +20 -42
- package/src/surfaces/publish-quick.json +428 -0
- package/src/surfaces/publish-quick.ts +165 -0
- package/src/surfaces/publish-workspace.json +2892 -0
- package/src/surfaces/publish-workspace.ts +391 -0
- package/src/surfaces/publish.ts +18 -18
- package/src/surfaces/push-plan.ts +7 -8
- package/src/surfaces/rail.json +1 -159
- package/src/surfaces/rail.ts +22 -79
- package/src/surfaces/reference-field.ts +11 -15
- package/src/surfaces/schema-builder.ts +16 -22
- package/src/surfaces/schema-form.json +10 -2
- package/src/surfaces/schema-form.ts +17 -25
- package/src/surfaces/secret-field.ts +9 -6
- package/src/surfaces/seo.json +1 -1
- package/src/surfaces/seo.ts +21 -15
- package/src/surfaces/settings-contexts.ts +9 -7
- package/src/surfaces/settings-contributed.json +5 -5
- package/src/surfaces/settings-contributed.ts +32 -12
- package/src/surfaces/settings-css-vars.json +44 -36
- package/src/surfaces/settings-css-vars.ts +82 -16
- package/src/surfaces/settings-defs.json +2 -2
- package/src/surfaces/settings-defs.ts +17 -21
- package/src/surfaces/settings-deploy.json +2 -15
- package/src/surfaces/settings-deploy.ts +9 -16
- package/src/surfaces/settings-dialog.json +51 -0
- package/src/surfaces/settings-dialog.ts +169 -0
- package/src/surfaces/settings-extensions.ts +5 -6
- package/src/surfaces/settings-head.ts +33 -39
- package/src/surfaces/settings-locales.ts +8 -20
- package/src/surfaces/settings-overview.json +3 -3
- package/src/surfaces/settings-overview.ts +14 -8
- package/src/surfaces/settings-packages.ts +8 -7
- package/src/surfaces/settings-pane.json +269 -46
- package/src/surfaces/settings-pane.ts +88 -36
- package/src/surfaces/settings-rawjson.ts +5 -6
- package/src/surfaces/shell.json +2 -1
- package/src/surfaces/shell.ts +1 -2
- package/src/surfaces/site-panel.json +1029 -0
- package/src/surfaces/site-panel.ts +233 -0
- package/src/surfaces/slash-menu.json +63 -21
- package/src/surfaces/slash-menu.ts +42 -9
- package/src/surfaces/statements.ts +13 -18
- package/src/surfaces/statusbar.ts +56 -29
- package/src/surfaces/style-panel.ts +18 -31
- package/src/surfaces/stylebook-chrome.ts +3 -5
- package/src/surfaces/styles-panel.json +735 -0
- package/src/surfaces/styles-panel.ts +195 -0
- package/src/surfaces/styles-variables.json +149 -0
- package/src/surfaces/styles-variables.ts +145 -0
- package/src/surfaces/tab-strip.json +4 -4
- package/src/surfaces/tab-strip.ts +14 -13
- package/src/surfaces/target-line.ts +6 -7
- package/src/surfaces/welcome.ts +6 -8
- package/src/surfaces/writing-banner.json +94 -0
- package/src/surfaces/writing-banner.ts +80 -0
- package/src/tabs/bare-repeaters.ts +101 -0
- package/src/tabs/patch-ops.ts +4 -3
- package/src/tabs/project-config.ts +32 -21
- package/src/tabs/selection.ts +36 -8
- package/src/tabs/tab.ts +99 -48
- package/src/tabs/transact.ts +98 -53
- package/src/types.ts +53 -43
- package/src/ui/ai-credentials-form.ts +10 -13
- package/src/ui/ai-model-picker.ts +3 -3
- package/src/ui/cf-account-picker.ts +7 -9
- package/src/ui/color-selector.ts +9 -5
- package/src/ui/dynamic-slot.ts +7 -8
- package/src/ui/expression-editor.ts +112 -105
- package/src/ui/form-controls.ts +104 -56
- package/src/ui/formula-catalog.ts +239 -230
- package/src/ui/formula-chips.ts +33 -18
- package/src/ui/layers.ts +57 -31
- package/src/ui/media-picker.ts +300 -47
- package/src/ui/popover-surface.ts +20 -12
- package/src/ui/progress-modal.ts +13 -8
- package/src/ui/regions.ts +14 -12
- package/src/ui/schema-form.ts +372 -97
- package/src/ui/surface.ts +71 -8
- package/src/ui/timing.ts +9 -0
- package/src/ui/value-source.ts +44 -31
- package/src/ui/virtual-window.ts +29 -3
- package/src/utils/base64.ts +6 -4
- package/src/utils/edit-display.ts +366 -111
- package/src/utils/element-selectors.ts +3 -2
- package/src/utils/google-fonts.ts +15 -14
- package/src/utils/inherited-style.ts +18 -20
- package/src/utils/link-target.ts +1 -1
- package/src/utils/local-day.ts +18 -0
- package/src/utils/preview-format.ts +25 -3
- package/src/utils/strip-events.ts +49 -22
- package/src/utils/studio-utils.ts +29 -14
- package/src/view.ts +2 -3
- package/src/workspace/pane-derive.ts +14 -16
- package/src/workspace/session.ts +81 -50
- package/src/workspace/tab-workspace.ts +137 -0
- package/src/workspace/workspace-back.ts +189 -0
- package/src/workspace/workspace-home.ts +133 -0
- package/src/workspace/workspace-ids.ts +129 -0
- package/src/workspace/workspace-switch.ts +372 -0
- package/src/workspace/workspace.ts +165 -47
- package/styles/shell-frame.css +30 -7
- package/styles/shell-frame.json +15 -3
- package/dist/chunks/2020-va2wwra4.js +0 -4
- package/dist/chunks/adapter-f93pafd7.js +0 -4
- package/dist/chunks/cf-account-picker-af1h381v.js +0 -4
- package/dist/chunks/cf-settings-125tdm0w.js +0 -4
- package/dist/chunks/color-area-jqhna8zy.js +0 -4
- package/dist/chunks/color-field-embq5ctg.js +0 -4
- package/dist/chunks/color-fpezvnkt.js +0 -4
- package/dist/chunks/color-slider-1qmw7wqy.js +0 -4
- package/dist/chunks/combobox-773hdzyj.js +0 -4
- package/dist/chunks/components-ax2f1fnn.js +0 -4
- package/dist/chunks/content-source-108aqtk1.js +0 -4
- package/dist/chunks/convert-to-repeater-ry5rmppr.js +0 -4
- package/dist/chunks/dialog-mtm9fq5t.js +0 -4
- package/dist/chunks/editor-pfgdmkb0.js +0 -4
- package/dist/chunks/entry-commands-t0k1q0kx.js +0 -4
- package/dist/chunks/extension-sections-6mwh2hf8.js +0 -4
- package/dist/chunks/file-ops-meej5mqf.js +0 -4
- package/dist/chunks/files-44vp8a2s.js +0 -4
- package/dist/chunks/format-host-7q1petb9.js +0 -4
- package/dist/chunks/fs-events-h2mwnxaz.js +0 -4
- package/dist/chunks/git-panel-zngbymvd.js +0 -4
- package/dist/chunks/grid-view-sx9vynsp.js +0 -51
- package/dist/chunks/icons-p44xhjf0.js +0 -4
- package/dist/chunks/iframe-entry-f7mqjwpm.js +0 -5
- package/dist/chunks/iframe-entry-haw7jkvz.js +0 -5
- package/dist/chunks/iframe-entry-z6qrytv3.js +0 -5
- package/dist/chunks/iframe-host-qk3ycq87.js +0 -4
- package/dist/chunks/index-wkyfjeqz.js +0 -4
- package/dist/chunks/jsonMode-s8kt9dsj.js +0 -13
- package/dist/chunks/jx-validate-psgd7vsx.js +0 -4
- package/dist/chunks/layers-panel-1kq2jyfk.js +0 -4
- package/dist/chunks/layers-xd92fg8d.js +0 -4
- package/dist/chunks/listbox-s8fkmnq8.js +0 -4
- package/dist/chunks/lit-html-ac4cwwr4.js +0 -4
- package/dist/chunks/media-picker-0svzkdyb.js +0 -4
- package/dist/chunks/menu-37d07z9m.js +0 -4
- package/dist/chunks/menu-5c55ea3d.js +0 -4
- package/dist/chunks/monaco-binding-z6r70pdt.js +0 -4
- package/dist/chunks/monaco-buffer-fz6gq5y7.js +0 -4
- package/dist/chunks/monaco-setup-q4axkgj7.js +0 -4
- package/dist/chunks/notify-0xgtn8q1.js +0 -4
- package/dist/chunks/number-field-gw7sq8rn.js +0 -4
- package/dist/chunks/parse-897fvqah.js +0 -4
- package/dist/chunks/platform-v1qctbe6.js +0 -4
- package/dist/chunks/popover-8htra4er.js +0 -4
- package/dist/chunks/publish-panel-ym1fmgq5.js +0 -4
- package/dist/chunks/quick-search-a54e6t5n.js +0 -4
- package/dist/chunks/references-gmqp82fs.js +0 -4
- package/dist/chunks/right-panel-v7t9awbk.js +0 -4
- package/dist/chunks/section-registry-vhyf3zsr.js +0 -4
- package/dist/chunks/select-n3v7gwas.js +0 -4
- package/dist/chunks/split-pff8f3ze.js +0 -4
- package/dist/chunks/studio-0bhx5hz6.js +0 -5
- package/dist/chunks/studio-0k1ddnyy.js +0 -6
- package/dist/chunks/studio-1b04pd0j.js +0 -64
- package/dist/chunks/studio-4dwbj6gb.js +0 -5
- package/dist/chunks/studio-4tanh828.js +0 -5
- package/dist/chunks/studio-55h4mstj.js +0 -4
- package/dist/chunks/studio-5tnvjkz4.js +0 -5
- package/dist/chunks/studio-60dqgb0c.js +0 -5
- package/dist/chunks/studio-61dp09qg.js +0 -9
- package/dist/chunks/studio-63epcrj2.js +0 -5
- package/dist/chunks/studio-74k29dy9.js +0 -5
- package/dist/chunks/studio-7vg6jcd3.js +0 -5
- package/dist/chunks/studio-7zx31knw.js +0 -9
- package/dist/chunks/studio-8bxk97km.js +0 -5
- package/dist/chunks/studio-933e30n4.js +0 -5
- package/dist/chunks/studio-98wnwhbg.js +0 -5
- package/dist/chunks/studio-9mccjwjh.js +0 -14
- package/dist/chunks/studio-a2ke1e4t.js +0 -5
- package/dist/chunks/studio-e3a2a6v3.js +0 -4
- package/dist/chunks/studio-e81q1vb9.js +0 -5
- package/dist/chunks/studio-epgrmqqm.js +0 -5
- package/dist/chunks/studio-ery42sqr.js +0 -4
- package/dist/chunks/studio-g1shz58g.js +0 -5
- package/dist/chunks/studio-gf0fz03c.js +0 -5
- package/dist/chunks/studio-gjtpe62q.js +0 -6
- package/dist/chunks/studio-gkskhg7m.js +0 -5
- package/dist/chunks/studio-gx4dnjzd.js +0 -5
- package/dist/chunks/studio-j03zga3y.js +0 -9
- package/dist/chunks/studio-jhpxeckz.js +0 -5
- package/dist/chunks/studio-k01r7ykp.js +0 -5
- package/dist/chunks/studio-kk7h30ne.js +0 -7
- package/dist/chunks/studio-kt1zqney.js +0 -5
- package/dist/chunks/studio-m3cwhvye.js +0 -5
- package/dist/chunks/studio-mcayt6hz.js +0 -5
- package/dist/chunks/studio-myjcghv3.js +0 -5
- package/dist/chunks/studio-n8bxwc3y.js +0 -4
- package/dist/chunks/studio-ngm8gvpb.js +0 -5
- package/dist/chunks/studio-nj5a01jy.js +0 -928
- package/dist/chunks/studio-pcgz8heb.js +0 -5
- package/dist/chunks/studio-qcsq0t15.js +0 -5
- package/dist/chunks/studio-qkstvve9.js +0 -5
- package/dist/chunks/studio-qv1pwd3c.js +0 -5
- package/dist/chunks/studio-rc6dvxjb.js +0 -7
- package/dist/chunks/studio-s8dmmz66.js +0 -5
- package/dist/chunks/studio-sp5xzbj4.js +0 -6
- package/dist/chunks/studio-szsjbj0g.js +0 -5
- package/dist/chunks/studio-t1xzawhr.js +0 -16
- package/dist/chunks/studio-tdcprbqb.js +0 -5
- package/dist/chunks/studio-vrmcjf9g.js +0 -7
- package/dist/chunks/studio-vyc0b4he.js +0 -10
- package/dist/chunks/studio-w0cgf6jg.js +0 -5
- package/dist/chunks/studio-w3hskzqk.js +0 -5
- package/dist/chunks/studio-xgrgcdyh.js +0 -9
- package/dist/chunks/studio-xz2yxfcb.js +0 -5
- package/dist/chunks/studio-y6n42tgs.js +0 -5
- package/dist/chunks/studio-yb560vxr.js +0 -5
- package/dist/chunks/studio-yn9f8vtx.js +0 -5
- package/dist/chunks/studio-yw05w8f0.js +0 -7
- package/dist/chunks/studio-z16sgavc.js +0 -5
- package/dist/chunks/studio-zey7zsdw.js +0 -12
- package/dist/chunks/studio-zyqn40w4.js +0 -5
- package/dist/chunks/swatch-group-8qh9a3bm.js +0 -4
- package/dist/chunks/tabs-jwthg40w.js +0 -4
- package/dist/chunks/textfield-spy3hc77.js +0 -4
- package/dist/chunks/toast-4d35zd64.js +0 -4
- package/dist/chunks/toast-host-8sjmfed3.js +0 -4
- package/dist/chunks/tooltip-fd6g9xy3.js +0 -4
- package/dist/chunks/tree-h19v1jfz.js +0 -4
- package/dist/chunks/tsMode-2frah6h1.js +0 -14
- package/dist/chunks/workspace-zt81g1ms.js +0 -4
- package/dist/chunks/ws-client-n2bh4hkf.js +0 -4
- package/src/panels/frontmatter-panel.ts +0 -701
- package/src/panels/git-panel.ts +0 -1120
- package/src/surfaces/doc-header.json +0 -776
- package/src/surfaces/doc-header.ts +0 -231
- package/src/surfaces/git-panel.json +0 -1880
- 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,
|
|
16
|
-
*
|
|
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 {
|
|
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
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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
|
-
|
|
52
|
-
|
|
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
|
-
|
|
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
|
-
(
|
|
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
|
-
*
|
|
138
|
-
*
|
|
139
|
-
*
|
|
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
|
|
144
|
-
|
|
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 :
|
|
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
|
-
*
|
|
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
|
-
|
|
175
|
-
|
|
176
|
-
|
|
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
|
|
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:
|
|
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 {
|
|
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:
|
|
32
|
-
filter?:
|
|
33
|
-
sort?:
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
88
|
-
|
|
89
|
-
|
|
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:
|
|
112
|
+
async function arraySourceNames(defs: StateDefs): Promise<string[]> {
|
|
102
113
|
const named = Object.entries(defs)
|
|
103
|
-
.filter(
|
|
104
|
-
|
|
105
|
-
|
|
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,
|
|
111
|
-
|
|
112
|
-
if (!def
|
|
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
|
|
121
|
-
$prototype: def.$prototype
|
|
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 {
|
|
151
|
+
* @param {StateDefs} defs
|
|
140
152
|
* @returns {Promise<RepeaterConfig | null>}
|
|
141
153
|
*/
|
|
142
|
-
async function promptRepeaterConfig(defs:
|
|
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
|
-
|
|
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(
|
|
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
|
|
34
|
-
img
|
|
35
|
-
source
|
|
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
|
|
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
|
-
/**
|
|
47
|
-
|
|
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
|
|
68
|
+
const attr = REPLACE_ATTRS.get(hit.tagName);
|
|
70
69
|
if (attr) {
|
|
71
|
-
return { attr, mode: "replace-attr", path: hit.path
|
|
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
|
|
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: {
|
|
98
|
+
return { attributes: { src: asset.ref }, tagName: "img" };
|
|
92
99
|
}
|
|
93
100
|
case "video": {
|
|
94
|
-
return { attributes: { controls: "", src: asset.ref }, tagName: "video" }
|
|
101
|
+
return { attributes: { controls: "", src: asset.ref }, tagName: "video" };
|
|
95
102
|
}
|
|
96
103
|
case "audio": {
|
|
97
|
-
return { attributes: { controls: "", src: asset.ref }, tagName: "audio" }
|
|
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
|
-
}
|
|
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 ||
|
|
120
|
-
return path
|
|
126
|
+
if (n === 0 || !isNumber(tail)) {
|
|
127
|
+
return path;
|
|
121
128
|
}
|
|
122
129
|
path[path.length - 1] = tail + n;
|
|
123
|
-
return path
|
|
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, []
|
|
170
|
+
applyDropInstruction(tab, { type: "make-child" }, srcData, []);
|
|
164
171
|
}
|
|
165
172
|
}
|
|
166
173
|
}
|