@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
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
* @docs studio/interface/canvas
|
|
35
35
|
*/
|
|
36
36
|
|
|
37
|
-
import { displayTagName } from "@jxsuite/schema/guards";
|
|
37
|
+
import { displayTagName, isMappedArray, isNonNullObject, isNumber } from "@jxsuite/schema/guards";
|
|
38
38
|
import { focusItem } from "@jxsuite/ui/behaviors/action-group";
|
|
39
39
|
import { draggable } from "@atlaskit/pragmatic-drag-and-drop/element/adapter";
|
|
40
40
|
import { disableNativeDragPreview } from "@atlaskit/pragmatic-drag-and-drop/element/disable-native-drag-preview";
|
|
@@ -49,6 +49,7 @@ import {
|
|
|
49
49
|
} from "../store";
|
|
50
50
|
import { activeTab } from "../workspace/workspace";
|
|
51
51
|
import { activeCanvasSurface, stageContaining } from "../canvas/canvas-surface";
|
|
52
|
+
import { stageOf } from "../canvas/surface-registry";
|
|
52
53
|
import { panelOfSurface } from "../canvas/canvas-helpers";
|
|
53
54
|
import { primarySelection, structuralBatch } from "../tabs/selection";
|
|
54
55
|
import {
|
|
@@ -229,13 +230,13 @@ function barPosition(anchor: {
|
|
|
229
230
|
"the stage showing the active tab", which was the same answer only while a tab could be on
|
|
230
231
|
screen in one place; with a document displayed in two panes it picked whichever came first in
|
|
231
232
|
the grid, and clipped the bar against a stage the author is not typing in.
|
|
232
|
-
…and against the box that SCROLLS, where the stage has one
|
|
233
|
-
|
|
234
|
-
still inside the stage while nobody can see it — and the bar
|
|
235
|
-
pointing at a node
|
|
236
|
-
the viewport, as it always was. */
|
|
233
|
+
…and against the box that SCROLLS, where the stage has one: Edit's page scroller. Over a
|
|
234
|
+
collection entry the writing banner stands above it in the same stage cell, so a node
|
|
235
|
+
scrolled up under the banner is still inside the stage while nobody can see it — and the bar
|
|
236
|
+
would float over the banner, pointing at a node it covers. Everywhere else there is no
|
|
237
|
+
scroller and the stage is the viewport, as it always was. */
|
|
237
238
|
const surface = activeCanvasSurface();
|
|
238
|
-
const viewport = panelOfSurface(surface)?.scrollContainer ?? surface
|
|
239
|
+
const viewport = panelOfSurface(surface)?.scrollContainer ?? stageOf(surface);
|
|
239
240
|
const box = viewport ? rectOf(viewport) : null;
|
|
240
241
|
if (box && (anchor.top + anchor.height < box.top || anchor.top > box.bottom)) {
|
|
241
242
|
return null;
|
|
@@ -243,9 +244,9 @@ function barPosition(anchor: {
|
|
|
243
244
|
/* ABOVE the anchor where the bar fits above it INSIDE that viewport, and BELOW it where it does
|
|
244
245
|
not. The flip used to be decided against a flat 80 in WINDOW coordinates, the app's own top
|
|
245
246
|
chrome, which is the same answer only while the viewport starts near the top of the window.
|
|
246
|
-
Edit's scroller
|
|
247
|
-
its bottom was still on screen put the bar ON the
|
|
248
|
-
|
|
247
|
+
Edit's scroller can start under the writing banner, so an anchor whose top had scrolled under
|
|
248
|
+
it while its bottom was still on screen put the bar ON the banner, taking its clicks. Flipped
|
|
249
|
+
is better than hidden: the element is visible, so its bar should be, and
|
|
249
250
|
past the clip above the anchor's bottom edge is inside the viewport, so the flipped bar is too.
|
|
250
251
|
The fallback is that same 80px of chrome, for a stage no pass has measured yet. */
|
|
251
252
|
const ceiling = box ? box.top : 80 - BAR_CLEARANCE;
|
|
@@ -256,7 +257,7 @@ function barPosition(anchor: {
|
|
|
256
257
|
/* Below it, and kept INSIDE the viewport: an element taller than what is left of the scroller has
|
|
257
258
|
its bottom edge off screen, and the bar would follow it there — over the status bar, or over
|
|
258
259
|
whatever the pane below is showing. Clamped, it stands on that element's last visible strip,
|
|
259
|
-
still pointing at it and still
|
|
260
|
+
still pointing at it and still inside the scroller. */
|
|
260
261
|
const below = anchor.top + anchor.height + 4;
|
|
261
262
|
return {
|
|
262
263
|
left: anchor.left,
|
|
@@ -324,23 +325,28 @@ export function formatCommands(): AnyCommand[] {
|
|
|
324
325
|
title: string,
|
|
325
326
|
icon: string,
|
|
326
327
|
keybinding?: string,
|
|
327
|
-
): AnyCommand =>
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
328
|
+
): AnyCommand => {
|
|
329
|
+
const entry: AnyCommand = {
|
|
330
|
+
category: "Edit",
|
|
331
|
+
group: "6_format",
|
|
332
|
+
icon,
|
|
333
|
+
id: `format.${command}`,
|
|
334
|
+
keyScope: "caret",
|
|
335
|
+
level: "selection",
|
|
336
|
+
menus: ["blockbar/format", "palette"],
|
|
337
|
+
requires: "a text caret in the canvas",
|
|
338
|
+
run: () => {
|
|
339
|
+
postApplyFormat({ command });
|
|
340
|
+
},
|
|
341
|
+
title,
|
|
342
|
+
undo: "document",
|
|
343
|
+
when: (ctx: CommandContext) => ctx.caret.inCanvas,
|
|
344
|
+
};
|
|
345
|
+
if (keybinding !== undefined) {
|
|
346
|
+
entry.keybinding = keybinding;
|
|
347
|
+
}
|
|
348
|
+
return entry;
|
|
349
|
+
};
|
|
344
350
|
|
|
345
351
|
return [
|
|
346
352
|
record("bold", "Bold", "text-b", "mod+b"),
|
|
@@ -493,7 +499,7 @@ function structuralTarget(path: JxPath | null = commandTargetPath()): Structural
|
|
|
493
499
|
}
|
|
494
500
|
const index = childIndex(path);
|
|
495
501
|
const parentPath = parentElementPath(path);
|
|
496
|
-
if (
|
|
502
|
+
if (!isNumber(index) || !parentPath) {
|
|
497
503
|
return null;
|
|
498
504
|
}
|
|
499
505
|
const parentNode = getNodeAtPath(tab.doc.document, parentPath);
|
|
@@ -510,7 +516,7 @@ function structuralTarget(path: JxPath | null = commandTargetPath()): Structural
|
|
|
510
516
|
* block, not a container, and nesting a block inside it produces invalid markup.
|
|
511
517
|
*/
|
|
512
518
|
function isContainerNode(node: JxMutableNode | string | null | undefined): boolean {
|
|
513
|
-
if (!node
|
|
519
|
+
if (!isNonNullObject(node)) {
|
|
514
520
|
return false;
|
|
515
521
|
}
|
|
516
522
|
if (VOID_ELEMENTS.has((displayTagName(node.tagName) || "div").toLowerCase())) {
|
|
@@ -521,11 +527,10 @@ function isContainerNode(node: JxMutableNode | string | null | undefined): boole
|
|
|
521
527
|
return false;
|
|
522
528
|
}
|
|
523
529
|
if (!Array.isArray(children)) {
|
|
524
|
-
return (children
|
|
530
|
+
return isMappedArray(children);
|
|
525
531
|
}
|
|
526
532
|
return (
|
|
527
|
-
children.length === 0 ||
|
|
528
|
-
children.some((c) => typeof c === "object" && c !== null && !isInlineElement(c, node))
|
|
533
|
+
children.length === 0 || children.some((c) => isNonNullObject(c) && !isInlineElement(c, node))
|
|
529
534
|
);
|
|
530
535
|
}
|
|
531
536
|
|
|
@@ -549,7 +554,7 @@ function canMoveOut(): boolean {
|
|
|
549
554
|
return (
|
|
550
555
|
target !== null &&
|
|
551
556
|
parentElementPath(target.parentPath) !== null &&
|
|
552
|
-
|
|
557
|
+
isNumber(childIndex(target.parentPath))
|
|
553
558
|
);
|
|
554
559
|
}
|
|
555
560
|
|
|
@@ -598,7 +603,7 @@ function moveTargetOut(): void {
|
|
|
598
603
|
}
|
|
599
604
|
const grandparent = parentElementPath(target.parentPath);
|
|
600
605
|
const parentIndex = childIndex(target.parentPath);
|
|
601
|
-
if (!grandparent ||
|
|
606
|
+
if (!grandparent || !isNumber(parentIndex)) {
|
|
602
607
|
return;
|
|
603
608
|
}
|
|
604
609
|
transactDoc(target.tab, (t) => mutateMoveNode(t, target.path, grandparent, parentIndex + 1));
|
|
@@ -1040,7 +1045,7 @@ export function showCommandOverflow(
|
|
|
1040
1045
|
commands.map((command, index) => {
|
|
1041
1046
|
const chord = registry.keymap.formatBinding(command.id);
|
|
1042
1047
|
const reason = registry.disabledReason(command.id);
|
|
1043
|
-
|
|
1048
|
+
const row: MenuRowProjection = {
|
|
1044
1049
|
destructive: command.destructive === true,
|
|
1045
1050
|
disabled: reason !== undefined,
|
|
1046
1051
|
dividerAbove: index > 0 && command.destructive === true,
|
|
@@ -1049,9 +1054,14 @@ export function showCommandOverflow(
|
|
|
1049
1054
|
runCommand(registry, command.id, target);
|
|
1050
1055
|
},
|
|
1051
1056
|
title: command.title,
|
|
1052
|
-
...(chord ? { chord } : {}),
|
|
1053
|
-
...(reason === undefined ? {} : { requires: reason }),
|
|
1054
1057
|
};
|
|
1058
|
+
if (chord) {
|
|
1059
|
+
row.chord = chord;
|
|
1060
|
+
}
|
|
1061
|
+
if (reason !== undefined) {
|
|
1062
|
+
row.requires = reason;
|
|
1063
|
+
}
|
|
1064
|
+
return row;
|
|
1055
1065
|
});
|
|
1056
1066
|
const rows = target ? withCommandTarget(target, project) : project();
|
|
1057
1067
|
_overflowHandle = openMenu({
|
|
@@ -1079,7 +1089,7 @@ export function showCommandOverflow(
|
|
|
1079
1089
|
function returnFocusToCanvas(): void {
|
|
1080
1090
|
// The FOCUSED pane's stage: the keyboard came from there and is going back there. Resolving it
|
|
1081
1091
|
// From the active tab answered with whichever pane displays that document first.
|
|
1082
|
-
const stage = activeCanvasSurface()
|
|
1092
|
+
const stage = stageOf(activeCanvasSurface());
|
|
1083
1093
|
const iframe = stage?.querySelector<HTMLElement>("iframe.jx-canvas-iframe");
|
|
1084
1094
|
(iframe ?? stage)?.focus();
|
|
1085
1095
|
}
|
|
@@ -1118,9 +1128,9 @@ export function handleBlockBarEntryKey(e: KeyboardEvent): void {
|
|
|
1118
1128
|
* The tags this node may be converted into — empty for a component instance and for a repeater,
|
|
1119
1129
|
* whose content is a `map` template rather than a tag.
|
|
1120
1130
|
*
|
|
1121
|
-
* @param {JxMutableNode | null} node
|
|
1131
|
+
* @param {JxMutableNode | null | undefined} node
|
|
1122
1132
|
*/
|
|
1123
|
-
function convertTargetsFor(node: JxMutableNode | null): SlashCommand[] {
|
|
1133
|
+
function convertTargetsFor(node: JxMutableNode | null | undefined): SlashCommand[] {
|
|
1124
1134
|
if (!node) {
|
|
1125
1135
|
return [];
|
|
1126
1136
|
}
|
|
@@ -1130,10 +1140,11 @@ function convertTargetsFor(node: JxMutableNode | null): SlashCommand[] {
|
|
|
1130
1140
|
return [];
|
|
1131
1141
|
}
|
|
1132
1142
|
const children = childList(node);
|
|
1143
|
+
const [first] = children;
|
|
1133
1144
|
const isEmpty =
|
|
1134
1145
|
!node.textContent &&
|
|
1135
1146
|
(children.length === 0 ||
|
|
1136
|
-
(children.length === 1 &&
|
|
1147
|
+
(children.length === 1 && isNonNullObject(first) && first.tagName === "br"));
|
|
1137
1148
|
return getConvertTargets((literal || "div").toLowerCase(), isEmpty);
|
|
1138
1149
|
}
|
|
1139
1150
|
|
|
@@ -1173,7 +1184,7 @@ function openConvertMenu(anchor: HTMLElement): void {
|
|
|
1173
1184
|
*/
|
|
1174
1185
|
function openMergeTagMenu(anchor: HTMLElement): void {
|
|
1175
1186
|
const tab = activeTab.value;
|
|
1176
|
-
const state =
|
|
1187
|
+
const state = tab?.doc.document.state ?? {};
|
|
1177
1188
|
// The live resolved scope lives inside the iframe realm and is not threaded out, so the parent
|
|
1178
1189
|
// Offers only top-level `state.*` tokens (buildMergeTags tolerates the null scopes).
|
|
1179
1190
|
const tags = buildMergeTags(state, null, null);
|
|
@@ -1186,7 +1197,7 @@ function openMergeTagMenu(anchor: HTMLElement): void {
|
|
|
1186
1197
|
if (arrayNode && tab) {
|
|
1187
1198
|
const tokens = resolveRepeaterItemFields(
|
|
1188
1199
|
arrayNode,
|
|
1189
|
-
tab.doc.document.state
|
|
1200
|
+
tab.doc.document.state,
|
|
1190
1201
|
projectState?.projectConfig,
|
|
1191
1202
|
);
|
|
1192
1203
|
tags.push(...buildRepeaterTagsFromFields(tokens));
|
|
@@ -1262,8 +1273,8 @@ function hideBar(): void {
|
|
|
1262
1273
|
* The document + selection the bar is currently suppressed FOR, or null while it is free to draw.
|
|
1263
1274
|
*
|
|
1264
1275
|
* **Why a key and not a boolean.** The bar is `position: fixed` and clamped into the window, so it
|
|
1265
|
-
* can sit over the
|
|
1266
|
-
*
|
|
1276
|
+
* can sit over the pane context bar, the Inspector and the docks; an author working in the
|
|
1277
|
+
* Inspector's Logic tab reported it "blocking a part of the interface that the user needs to
|
|
1267
1278
|
* utilize". Hiding it on a chrome pointerdown is half an answer — {@link dismissBlockActionBar}
|
|
1268
1279
|
* alone would flash back on the very next repaint, because the bar is re-rendered from the
|
|
1269
1280
|
* `toolbarRefresh` seam on every selection snapshot and from `renderOnly("overlays")` on zoom/pan.
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
* registered from here, like every other tab of this dock.
|
|
38
38
|
*/
|
|
39
39
|
|
|
40
|
-
import { render
|
|
40
|
+
import { render, nothing } from "lit-html";
|
|
41
41
|
import { effect, effectScope } from "../reactivity";
|
|
42
42
|
import {
|
|
43
43
|
BOTTOM_TAB_IDS,
|
|
@@ -141,6 +141,8 @@ export function activeBottomPanel(ctx: CommandContext = panelContext()): PanelRe
|
|
|
141
141
|
*/
|
|
142
142
|
function bottomContext(): NavigatorPanelContext {
|
|
143
143
|
return {
|
|
144
|
+
/* SAFETY: no Bottom dock panel reads `deps` (see above): Problems and Activity render from their
|
|
145
|
+
own stores and Logic from `activeTab`, so this empty stand-in is never dereferenced. */
|
|
144
146
|
deps: {} as NavigatorPanelDeps,
|
|
145
147
|
doc: null,
|
|
146
148
|
rerender: renderBottomDock,
|
|
@@ -296,7 +298,7 @@ function paintBody(): void {
|
|
|
296
298
|
return;
|
|
297
299
|
}
|
|
298
300
|
const active = activeBottomPanel();
|
|
299
|
-
|
|
301
|
+
render(
|
|
300
302
|
active
|
|
301
303
|
? active.render(bottomContext())
|
|
302
304
|
: emptyState(host, { message: "Nothing to show here yet." }),
|
|
@@ -394,7 +396,7 @@ export function unmountBottomDock(): void {
|
|
|
394
396
|
_host.removeAttribute(REGION_ATTR);
|
|
395
397
|
/* The document's dispose removed its own root; this clears anything a caller left beside it,
|
|
396
398
|
so the host is `:empty` again and the shell's sheet takes the dock out of the grid. */
|
|
397
|
-
|
|
399
|
+
render(nothing, _host);
|
|
398
400
|
_host.textContent = "";
|
|
399
401
|
runAfterRender(_host);
|
|
400
402
|
_host = null;
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
*/
|
|
26
26
|
|
|
27
27
|
import { monitorForElements } from "@atlaskit/pragmatic-drag-and-drop/element/adapter";
|
|
28
|
-
import { displayTagName } from "@jxsuite/schema/guards";
|
|
28
|
+
import { displayTagName, isString } from "@jxsuite/schema/guards";
|
|
29
29
|
import {
|
|
30
30
|
beginDragSession,
|
|
31
31
|
clearDropIndicator,
|
|
@@ -42,19 +42,15 @@ import { parentCursorToIframe } from "../canvas/iframe-overlay";
|
|
|
42
42
|
import { clearDragGhost, moveDragGhost, setDragGhost } from "./drag-ghost";
|
|
43
43
|
import { getNodeAtPath } from "../store";
|
|
44
44
|
import { activeTab } from "../workspace/workspace";
|
|
45
|
-
import type {
|
|
45
|
+
import type { HostState } from "../canvas/iframe-host";
|
|
46
|
+
import type { ElementDragPayload } from "@atlaskit/pragmatic-drag-and-drop/element/adapter";
|
|
46
47
|
import type { Tab } from "../tabs/tab";
|
|
47
48
|
import type { DragSrcKind, ParentToIframe } from "../canvas/iframe-protocol";
|
|
48
49
|
import type { JxMutableNode } from "@jxsuite/schema/types";
|
|
49
|
-
|
|
50
|
-
/** A parent-viewport pointer position (pragmatic's `location.current.input`). */
|
|
51
|
-
interface Cursor {
|
|
52
|
-
x: number;
|
|
53
|
-
y: number;
|
|
54
|
-
}
|
|
50
|
+
import type { ViewportPoint } from "../surfaces/menu";
|
|
55
51
|
|
|
56
52
|
interface MonitorDragArgs {
|
|
57
|
-
source: { data:
|
|
53
|
+
source: { data: ElementDragPayload["data"] };
|
|
58
54
|
location: {
|
|
59
55
|
current: { input: { clientX: number; clientY: number } };
|
|
60
56
|
// Pragmatic resets `current` back to `initial` when a drag is CANCELLED (Escape / dropped on no
|
|
@@ -64,6 +60,12 @@ interface MonitorDragArgs {
|
|
|
64
60
|
};
|
|
65
61
|
}
|
|
66
62
|
|
|
63
|
+
/** The two leg messages one cursor position yields. */
|
|
64
|
+
export interface DragMessages {
|
|
65
|
+
move: ParentToIframe;
|
|
66
|
+
drop: ParentToIframe;
|
|
67
|
+
}
|
|
68
|
+
|
|
67
69
|
/**
|
|
68
70
|
* PURE: build the `dragMove` + `drop` parent→iframe messages for a cursor, given the session id and
|
|
69
71
|
* the target iframe's EMPIRICAL `scale` + `rect` (both injected so this is testable without a DOM).
|
|
@@ -72,11 +74,11 @@ interface MonitorDragArgs {
|
|
|
72
74
|
* the move-preview and the authoritative drop never use a divergent coordinate transform.
|
|
73
75
|
*/
|
|
74
76
|
export function buildDragMessages(
|
|
75
|
-
cursor:
|
|
77
|
+
cursor: ViewportPoint,
|
|
76
78
|
dragSeq: number,
|
|
77
79
|
scale: number,
|
|
78
80
|
iframeRect: { left: number; top: number },
|
|
79
|
-
):
|
|
81
|
+
): DragMessages {
|
|
80
82
|
const local = parentCursorToIframe(cursor, iframeRect, scale);
|
|
81
83
|
return {
|
|
82
84
|
drop: { cursor: local, dragSeq, kind: "drop" },
|
|
@@ -85,7 +87,7 @@ export function buildDragMessages(
|
|
|
85
87
|
}
|
|
86
88
|
|
|
87
89
|
/** The cursor of a monitor event in parent-viewport coords. */
|
|
88
|
-
function cursorOf(location: MonitorDragArgs["location"]):
|
|
90
|
+
function cursorOf(location: MonitorDragArgs["location"]): ViewportPoint {
|
|
89
91
|
return { x: location.current.input.clientX, y: location.current.input.clientY };
|
|
90
92
|
}
|
|
91
93
|
|
|
@@ -97,11 +99,16 @@ function cursorOf(location: MonitorDragArgs["location"]): Cursor {
|
|
|
97
99
|
* the iframe's `canDrop` rejects ancestor/self targets). Anything else (e.g. a row missing a path)
|
|
98
100
|
* is ignored.
|
|
99
101
|
*/
|
|
100
|
-
function dragSrcOf(data:
|
|
102
|
+
function dragSrcOf(data: ElementDragPayload["data"]): DragSrcKind | null {
|
|
101
103
|
if (data.type === "block") {
|
|
102
|
-
|
|
104
|
+
/* SAFETY: every minter of a "block" payload sets `fragment` to the JxMutableNode it inserts;
|
|
105
|
+
only a string tag is read off it, and anything else crosses as no tag (placed as a block). */
|
|
106
|
+
const tag = (data.fragment as JxMutableNode | undefined)?.tagName;
|
|
107
|
+
return isString(tag) ? { tag, type: "block" } : { type: "block" };
|
|
103
108
|
}
|
|
104
109
|
if (data.type === "tree-node" && Array.isArray(data.path)) {
|
|
110
|
+
/* SAFETY: both minters of a "tree-node" payload, an Outline row's `getInitialData` and the block
|
|
111
|
+
action bar's drag handle, set `path` to the dragged node's JxPath. */
|
|
105
112
|
return { path: data.path as (string | number)[], type: "tree-node" };
|
|
106
113
|
}
|
|
107
114
|
return null;
|
|
@@ -120,20 +127,22 @@ function dragSrcOf(data: Record<string, unknown>): DragSrcKind | null {
|
|
|
120
127
|
*
|
|
121
128
|
* @param {Tab | null} tab The document the source path is addressed in.
|
|
122
129
|
* @param {DragSrcKind} src
|
|
123
|
-
* @param {
|
|
130
|
+
* @param {ElementDragPayload["data"]} data
|
|
124
131
|
* @returns {string}
|
|
125
132
|
*/
|
|
126
133
|
export function ghostLabel(
|
|
127
134
|
tab: Tab | null,
|
|
128
135
|
src: DragSrcKind,
|
|
129
|
-
data:
|
|
136
|
+
data: ElementDragPayload["data"],
|
|
130
137
|
): string {
|
|
131
138
|
if (src.type === "block") {
|
|
139
|
+
/* SAFETY: every "block" payload minter (the palette and component cards in dnd.ts, the asset
|
|
140
|
+
file drop) sets `fragment` to the JxMutableNode the drop inserts. */
|
|
132
141
|
const fragment = data.fragment as JxMutableNode | undefined;
|
|
133
142
|
return displayTagName(fragment?.tagName) || "block";
|
|
134
143
|
}
|
|
135
|
-
const doc = tab?.doc.document
|
|
136
|
-
const node = doc ?
|
|
144
|
+
const doc = tab?.doc.document;
|
|
145
|
+
const node = doc ? getNodeAtPath(doc, src.path) : undefined;
|
|
137
146
|
return displayTagName(node?.tagName) || "node";
|
|
138
147
|
}
|
|
139
148
|
|
|
@@ -150,9 +159,9 @@ const DROP_RESULT_TIMEOUT = 250;
|
|
|
150
159
|
*/
|
|
151
160
|
interface CoordSession {
|
|
152
161
|
src: DragSrcKind;
|
|
153
|
-
srcData:
|
|
162
|
+
srcData: ElementDragPayload["data"];
|
|
154
163
|
/** The host whose iframe currently holds the session, or null while off-canvas. */
|
|
155
|
-
host:
|
|
164
|
+
host: HostState | null;
|
|
156
165
|
/** The session id the bound host was started with (for move/drop tagging). */
|
|
157
166
|
seq: number;
|
|
158
167
|
/** The drag ghost's label (computed once at start; the dragged thing doesn't change). */
|
|
@@ -161,9 +170,9 @@ interface CoordSession {
|
|
|
161
170
|
|
|
162
171
|
/** Begin a session bound to `host`: bump+post dragStart, show the ghost, record the seq. */
|
|
163
172
|
function startSession(
|
|
164
|
-
host:
|
|
173
|
+
host: HostState,
|
|
165
174
|
src: DragSrcKind,
|
|
166
|
-
srcData:
|
|
175
|
+
srcData: ElementDragPayload["data"],
|
|
167
176
|
): CoordSession {
|
|
168
177
|
const seq = beginDragSession(host, src, srcData);
|
|
169
178
|
// The label names a node in the TARGET pane's document — `host` is the artboard the cursor is
|
|
@@ -180,7 +189,7 @@ function startSession(
|
|
|
180
189
|
* new panel's iframe drives the rest.
|
|
181
190
|
* - No host (inside→outside) → dragEnd the old + unbind; the ghost keeps following off-canvas.
|
|
182
191
|
*/
|
|
183
|
-
function sessionDrag(session: CoordSession, cursor:
|
|
192
|
+
function sessionDrag(session: CoordSession, cursor: ViewportPoint): void {
|
|
184
193
|
moveDragGhost(cursor.x, cursor.y);
|
|
185
194
|
const target = liveDragHostAt(cursor);
|
|
186
195
|
if (target === session.host) {
|
|
@@ -212,7 +221,7 @@ function sessionDrag(session: CoordSession, cursor: Cursor): void {
|
|
|
212
221
|
* the affordances if no reply arrives (iframe reloaded mid-drag). Drops off-canvas release retained
|
|
213
222
|
* data.
|
|
214
223
|
*/
|
|
215
|
-
function sessionDrop(session: CoordSession, cursor:
|
|
224
|
+
function sessionDrop(session: CoordSession, cursor: ViewportPoint): void {
|
|
216
225
|
const target = liveDragHostAt(cursor);
|
|
217
226
|
// Migrate first if the drop landed on a different panel than the last move bound.
|
|
218
227
|
if (target && target !== session.host) {
|
|
@@ -281,7 +290,7 @@ export function registerCanvasDndBridge(): () => void {
|
|
|
281
290
|
let session: CoordSession | null = null;
|
|
282
291
|
// The in-flight pragmatic source (set in onDragStart, cleared in onDrop) so a nativeDragEnter can
|
|
283
292
|
// Bind a session for a drag whose cursor entered an iframe before the parent ever bound a host.
|
|
284
|
-
let pending:
|
|
293
|
+
let pending: Pick<CoordSession, "src" | "srcData"> | null = null;
|
|
285
294
|
|
|
286
295
|
// Bind/migrate the live pragmatic session when its NATIVE stream enters an unclaimed iframe:
|
|
287
296
|
// Chromium delivers dragover to the frame under the cursor, so a drag from the palette/layers
|
|
@@ -353,7 +362,8 @@ export function registerCanvasDndBridge(): () => void {
|
|
|
353
362
|
return;
|
|
354
363
|
}
|
|
355
364
|
pending = null;
|
|
356
|
-
|
|
365
|
+
// Pragmatic's DragLocation always carries an `input`, cancelled drags included.
|
|
366
|
+
const cursor = cursorOf(location);
|
|
357
367
|
if (!session) {
|
|
358
368
|
// Never bound a host (dropped off every canvas) — just hide the ghost; nothing to apply.
|
|
359
369
|
clearDragGhost();
|
package/src/panels/chat-panel.ts
CHANGED
|
@@ -19,12 +19,12 @@
|
|
|
19
19
|
*
|
|
20
20
|
* **The assistant's SURFACE document is what this module defers.** Mounting `surfaces/ai-chat.ts`
|
|
21
21
|
* costs a traced 100–290 ms of connectedCallback at boot (its island projections; see
|
|
22
|
-
* `scripts/perf/REPORT.md`), paid on every window open although the document is invisible until
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
22
|
+
* `scripts/perf/REPORT.md`), paid on every window open although the document is invisible until the
|
|
23
|
+
* tab is picked. Binding is the same seam (`bindAiPanelHost`) and it is now deferred to the first
|
|
24
|
+
* time the Assistant tab is actually shown or revealed: `renderAiPanel` no-ops while the surface is
|
|
25
|
+
* null, and the surface's own watcher projects whatever the machinery wrote before that point, so a
|
|
26
|
+
* prompt seeded into a boot the reader never spends in the tab is not lost — it is one more message
|
|
27
|
+
* waiting when the body first appears.
|
|
28
28
|
*
|
|
29
29
|
* **This module is the SEAM, and it has no markup of its own.** The assistant is a Jx document
|
|
30
30
|
* (`surfaces/ai-chat.json`), and a document CLEARS the host it is given — so it needs a container
|