@jxsuite/studio 6.1.1 → 6.1.2
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/dist/chunks/{2020-va2wwra4.js → 2020-f2gkpy8d.js} +3 -3
- package/dist/chunks/{action-group-2mqby73c.js → action-group-4aan7g6g.js} +3 -3
- package/dist/chunks/adapter-4912g339.js +4 -0
- package/dist/chunks/cf-account-picker-wccaenh6.js +4 -0
- package/dist/chunks/cf-settings-br6105tr.js +4 -0
- package/dist/chunks/color-28ksk2qm.js +4 -0
- package/dist/chunks/color-area-0fj8a4ga.js +4 -0
- package/dist/chunks/color-field-xch8kx2g.js +4 -0
- package/dist/chunks/color-slider-jxd8v350.js +4 -0
- package/dist/chunks/combobox-p0efwjke.js +4 -0
- package/dist/chunks/components-db68vsn7.js +4 -0
- package/dist/chunks/content-source-1449qesq.js +4 -0
- package/dist/chunks/convert-to-repeater-5h457egj.js +4 -0
- package/dist/chunks/dialog-c4x05vyx.js +4 -0
- package/dist/chunks/editor-x9jn86a7.js +4 -0
- package/dist/chunks/entry-commands-may24cpt.js +4 -0
- package/dist/chunks/extension-sections-pvr14vxr.js +4 -0
- package/dist/chunks/file-ops-x9v54pcj.js +4 -0
- package/dist/chunks/files-j3knqf0s.js +4 -0
- package/dist/chunks/format-host-tyre2trb.js +4 -0
- package/dist/chunks/fs-events-64ma9htc.js +4 -0
- package/dist/chunks/git-panel-84ps5dex.js +4 -0
- package/dist/chunks/grid-view-d2wq9ezg.js +51 -0
- package/dist/chunks/icons-pnfz478q.js +4 -0
- package/dist/chunks/iframe-entry-fvbk89gm.js +5 -0
- package/dist/chunks/iframe-entry-jdcktez8.js +5 -0
- package/dist/chunks/iframe-entry-x0ygf2yr.js +5 -0
- package/dist/chunks/iframe-entry-zap785cw.js +5 -0
- package/dist/chunks/iframe-host-ck6vejt5.js +4 -0
- package/dist/chunks/index-b8xw3vy9.js +4 -0
- package/dist/chunks/{index-2veqmnhr.js → index-zpjmzqfk.js} +3 -3
- package/dist/chunks/{javascript-8nbvs12s.js → javascript-m54mnwp6.js} +3 -3
- package/dist/chunks/{jsonMode-s8kt9dsj.js → jsonMode-w15cmrcm.js} +8 -8
- package/dist/chunks/jx-validate-at3zn8wa.js +4 -0
- package/dist/chunks/layers-h4xp1pss.js +4 -0
- package/dist/chunks/layers-panel-m5hw1d7g.js +4 -0
- package/dist/chunks/listbox-e74qjyq6.js +4 -0
- package/dist/chunks/lit-html-8t8t3dnr.js +4 -0
- package/dist/chunks/media-picker-2cweexc5.js +4 -0
- package/dist/chunks/menu-n6yzswmy.js +4 -0
- package/dist/chunks/menu-ynw13y0s.js +4 -0
- package/dist/chunks/monaco-binding-7gx83x3r.js +4 -0
- package/dist/chunks/monaco-buffer-qzxn567r.js +4 -0
- package/dist/chunks/monaco-setup-gxf6656g.js +4 -0
- package/dist/chunks/notify-cj5zbrs2.js +4 -0
- package/dist/chunks/number-field-y62xq0ty.js +4 -0
- package/dist/chunks/parse-b7ddhr8m.js +4 -0
- package/dist/chunks/platform-3dfws9js.js +4 -0
- package/dist/chunks/popover-jt2gxmzs.js +4 -0
- package/dist/chunks/publish-panel-1gvxbj21.js +4 -0
- package/dist/chunks/quick-search-0dajrwqg.js +4 -0
- package/dist/chunks/references-49qgt404.js +4 -0
- package/dist/chunks/right-panel-jm1bwe53.js +4 -0
- package/dist/chunks/section-registry-6kwc4fky.js +4 -0
- package/dist/chunks/select-rzds841e.js +4 -0
- package/dist/chunks/split-n2gfpm5m.js +4 -0
- package/dist/chunks/{studio-1q1sh2ax.js → studio-0q988f9w.js} +3 -3
- package/dist/chunks/studio-0rt52vpq.js +5 -0
- package/dist/chunks/studio-18vgbhs5.js +5 -0
- package/dist/chunks/{studio-h46vtzk8.js → studio-1fxkaaea.js} +4 -4
- package/dist/chunks/studio-24mccdrj.js +5 -0
- package/dist/chunks/studio-2eh507zk.js +9 -0
- package/dist/chunks/studio-2hcbccfv.js +5 -0
- package/dist/chunks/studio-2j1cb95x.js +5 -0
- package/dist/chunks/studio-2jbs3rxv.js +5 -0
- package/dist/chunks/{studio-rv11kfwa.js → studio-485046te.js} +7 -7
- package/dist/chunks/studio-4h8k4dw9.js +5 -0
- package/dist/chunks/studio-5f6n18kx.js +5 -0
- package/dist/chunks/studio-5gthpky6.js +5 -0
- package/dist/chunks/studio-5ve6bbep.js +5 -0
- package/dist/chunks/studio-6ep3js6b.js +9 -0
- package/dist/chunks/studio-6wkmf3wz.js +9 -0
- package/dist/chunks/studio-841rf3cg.js +5 -0
- package/dist/chunks/studio-8gmwgheg.js +5 -0
- package/dist/chunks/studio-8qm0ep50.js +5 -0
- package/dist/chunks/{studio-8grwxtqk.js → studio-90pq9km1.js} +4 -4
- package/dist/chunks/studio-924p1tm1.js +6 -0
- package/dist/chunks/{studio-pre0skq6.js → studio-a3g98wjr.js} +4 -4
- package/dist/chunks/studio-a3shpz9y.js +5 -0
- package/dist/chunks/studio-amsbaaar.js +6 -0
- package/dist/chunks/studio-at5spjbc.js +7 -0
- package/dist/chunks/studio-b2xv945e.js +5 -0
- package/dist/chunks/studio-bn5nkafw.js +5 -0
- package/dist/chunks/studio-bw6q5xjf.js +9 -0
- package/dist/chunks/studio-c7q0t9x1.js +5 -0
- package/dist/chunks/studio-camnhc96.js +6 -0
- package/dist/chunks/studio-cffqvnzd.js +5 -0
- package/dist/chunks/studio-d81xfh1g.js +5 -0
- package/dist/chunks/studio-dgz8d0c1.js +5 -0
- package/dist/chunks/studio-efvfrsf8.js +5 -0
- package/dist/chunks/studio-er30bpcx.js +5 -0
- package/dist/chunks/studio-ezscgr64.js +5 -0
- package/dist/chunks/studio-ffrrncvz.js +5 -0
- package/dist/chunks/studio-fpphgn8y.js +10 -0
- package/dist/chunks/studio-j1kvhdjk.js +4 -0
- package/dist/chunks/{studio-vrmcjf9g.js → studio-j430n16g.js} +5 -5
- package/dist/chunks/studio-jjkg84nj.js +5 -0
- package/dist/chunks/studio-m0q32ars.js +4 -0
- package/dist/chunks/studio-m6bdst11.js +5 -0
- package/dist/chunks/studio-nv2cptd4.js +64 -0
- package/dist/chunks/studio-nwfrc98n.js +5 -0
- package/dist/chunks/studio-p1wgvp7r.js +5 -0
- package/dist/chunks/studio-pag2wncm.js +5 -0
- package/dist/chunks/studio-qvanvzfd.js +5 -0
- package/dist/chunks/studio-qwa64kt7.js +5 -0
- package/dist/chunks/studio-rk1zc4x3.js +928 -0
- package/dist/chunks/studio-se2r3ptc.js +5 -0
- package/dist/chunks/studio-sg2a0dh0.js +5 -0
- package/dist/chunks/studio-tjzjhe68.js +5 -0
- package/dist/chunks/{studio-wszjyh0j.js → studio-tq0rtfwj.js} +4 -4
- package/dist/chunks/{studio-kggey1jt.js → studio-v0jzqdjm.js} +4 -4
- package/dist/chunks/studio-v2w7q8r1.js +7 -0
- package/dist/chunks/studio-v5vjq1h0.js +4 -0
- package/dist/chunks/studio-v8aga3vp.js +14 -0
- package/dist/chunks/studio-vfcdrfmv.js +5 -0
- package/dist/chunks/studio-vmfkgdjf.js +5 -0
- package/dist/chunks/studio-wt1816jj.js +5 -0
- package/dist/chunks/studio-wz73q5kq.js +4 -0
- package/dist/chunks/studio-y04qtxvp.js +7 -0
- package/dist/chunks/studio-y21g8zzg.js +5 -0
- package/dist/chunks/{studio-zey7zsdw.js → studio-y64hrt8p.js} +7 -7
- package/dist/chunks/studio-ynn90f58.js +16 -0
- package/dist/chunks/studio-yxz682sx.js +5 -0
- package/dist/chunks/studio-zp7snvkq.js +5 -0
- package/dist/chunks/studio-zq4z6tm6.js +5 -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-c9fn075p.js +4 -0
- package/dist/chunks/toast-host-ke5z4ng7.js +4 -0
- package/dist/chunks/{toolbar-2nnzqhrj.js → toolbar-44cm5cta.js} +3 -3
- package/dist/chunks/tooltip-5v8ngwj2.js +4 -0
- package/dist/chunks/tree-mdq3v5cw.js +4 -0
- package/dist/chunks/{tsMode-2frah6h1.js → tsMode-sf49ee9x.js} +7 -7
- package/dist/chunks/workspace-jtfahpee.js +4 -0
- package/dist/chunks/ws-client-nze0k6mv.js +4 -0
- package/dist/iframe-entry.js +16 -16
- package/dist/manifest.json +63 -63
- package/dist/studio.js +97 -97
- package/package.json +6 -6
- 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/library-layouts.ts +8 -5
- package/src/browse/library-model.ts +18 -6
- package/src/browse/library-pane.ts +37 -21
- package/src/browse/library-preview.ts +14 -9
- package/src/browse/library-source.ts +1 -1
- package/src/canvas/asset-refs.ts +24 -9
- package/src/canvas/asset-resolve.ts +19 -23
- package/src/canvas/canvas-helpers.ts +7 -6
- package/src/canvas/canvas-live-render.ts +44 -53
- package/src/canvas/canvas-patcher.ts +30 -30
- package/src/canvas/canvas-perf.ts +11 -5
- package/src/canvas/canvas-render.ts +62 -41
- package/src/canvas/canvas-surface.ts +5 -3
- package/src/canvas/canvas-utils.ts +90 -49
- 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 +13 -12
- package/src/canvas/iframe-editable-root.ts +29 -16
- package/src/canvas/iframe-entry.ts +80 -63
- package/src/canvas/iframe-eval.ts +73 -49
- package/src/canvas/iframe-host.ts +135 -96
- 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-overlay.ts +1 -1
- package/src/canvas/iframe-patch.ts +18 -15
- package/src/canvas/iframe-position.ts +12 -6
- package/src/canvas/iframe-protocol.ts +12 -16
- package/src/canvas/iframe-render.ts +36 -34
- package/src/canvas/iframe-slash.ts +24 -11
- package/src/canvas/iframe-subtree.ts +6 -2
- 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/serialize-scope.ts +13 -5
- package/src/canvas/stage-scrollbar.ts +2 -1
- package/src/canvas/surface-registry.ts +21 -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/budget.ts +3 -3
- package/src/commands/command-args.ts +103 -71
- package/src/commands/context.ts +22 -20
- package/src/commands/keymap.ts +47 -43
- package/src/commands/levels.ts +3 -3
- package/src/commands/live-context.ts +7 -7
- package/src/commands/reference.ts +2 -1
- package/src/commands/registry.ts +12 -10
- package/src/commands/run-reported.ts +15 -10
- package/src/component-props.ts +46 -30
- package/src/content/collection-match.ts +5 -4
- package/src/content/draft-state.ts +4 -3
- package/src/content/entry-commands.ts +3 -2
- package/src/content/entry-editor.ts +29 -17
- package/src/content/entry-fields.ts +12 -7
- package/src/content/entry-model.ts +21 -12
- 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 +11 -5
- package/src/editor/convert-to-repeater.ts +34 -22
- package/src/editor/editable-tags.ts +17 -2
- package/src/editor/file-drop-action.ts +21 -22
- package/src/editor/inline-edit-apply.ts +35 -17
- package/src/editor/inline-edit.ts +66 -50
- package/src/editor/inline-format.ts +59 -56
- package/src/editor/inline-link.ts +40 -15
- package/src/editor/insert-zone-action.ts +1 -1
- package/src/editor/merge-tags.ts +58 -19
- package/src/editor/repeater-scope.ts +39 -28
- package/src/editor/shortcuts.ts +32 -20
- package/src/editor/slash-menu.ts +1 -6
- package/src/files/asset-versions.ts +4 -4
- package/src/files/components.ts +15 -10
- package/src/files/elements.ts +5 -6
- package/src/files/file-ops.ts +77 -36
- package/src/files/files.ts +90 -95
- package/src/files/media-meta.ts +2 -1
- package/src/files/media-paths.ts +3 -0
- package/src/files/serialize-document.ts +2 -2
- 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 +76 -50
- package/src/github/github-auth-status.ts +27 -3
- package/src/github/github-auth.ts +19 -9
- package/src/github/github-publish.ts +24 -20
- 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 +20 -22
- package/src/grid/grid-layout.ts +21 -5
- package/src/grid/grid-open.ts +3 -6
- package/src/grid/grid-panel.ts +11 -4
- package/src/grid/grid-source.ts +8 -8
- package/src/grid/grid-view.ts +14 -17
- 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 +25 -24
- package/src/grid/sources/csv-file-source.ts +2 -2
- package/src/grid/tabulator-tables.d.ts +55 -34
- package/src/hosting/stage.ts +7 -7
- package/src/i18n/i18n-commands.ts +1 -2
- package/src/media/media-pane.ts +4 -1
- 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 +17 -9
- package/src/panels/ai-chat/attached-context.ts +13 -7
- 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 +46 -35
- package/src/panels/bottom-dock.ts +5 -3
- package/src/panels/canvas-dnd-bridge.ts +31 -24
- package/src/panels/data-explorer.ts +62 -25
- package/src/panels/data-grid.ts +14 -11
- package/src/panels/dnd.ts +108 -118
- package/src/panels/editors.ts +52 -21
- package/src/panels/elements-panel.ts +10 -3
- package/src/panels/events-panel.ts +84 -69
- package/src/panels/formula-workspace.ts +76 -51
- package/src/panels/frontmatter-fields.ts +24 -19
- package/src/panels/frontmatter-panel.ts +44 -34
- package/src/panels/git-diff-open.ts +4 -4
- package/src/panels/git-panel.ts +49 -61
- package/src/panels/head-panel.ts +131 -111
- package/src/panels/i18n-panel.ts +10 -3
- package/src/panels/imports-panel.ts +23 -47
- package/src/panels/jump-bar.ts +48 -29
- package/src/panels/layers-panel.ts +97 -74
- package/src/panels/left-panel.ts +3 -3
- package/src/panels/pane-context.ts +31 -22
- package/src/panels/pane-grid.ts +49 -20
- package/src/panels/panel-registry.ts +22 -37
- package/src/panels/properties-panel.ts +175 -121
- package/src/panels/quick-search.ts +53 -31
- package/src/panels/right-panel.ts +3 -3
- package/src/panels/seo-modal.ts +13 -17
- package/src/panels/settings-menu.ts +15 -15
- package/src/panels/signals-panel.ts +153 -131
- package/src/panels/statement-editor.ts +230 -140
- package/src/panels/style-panel.ts +218 -205
- package/src/panels/style-utils.ts +114 -51
- package/src/panels/stylebook-doc.ts +57 -54
- package/src/panels/stylebook-layers-panel.ts +9 -9
- package/src/panels/stylebook-panel.ts +13 -17
- package/src/panels/tab-drop.ts +27 -11
- package/src/panels/tab-strip.ts +36 -26
- package/src/platform-errors.ts +57 -43
- package/src/platform.ts +58 -30
- package/src/platforms/cloud.ts +345 -175
- package/src/platforms/default-platform.ts +10 -4
- package/src/platforms/devserver.ts +129 -117
- package/src/platforms/read-batcher.ts +16 -8
- package/src/project-list.ts +2 -1
- package/src/publish/deploy-checklist.ts +8 -2
- package/src/publish/pages-service.ts +28 -13
- package/src/publish/publish-commands.ts +5 -4
- package/src/publish/publish-panel.ts +10 -6
- 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 +58 -31
- package/src/services/cem-export.ts +149 -58
- package/src/services/clock.ts +6 -1
- package/src/services/code-services.ts +37 -31
- 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 +18 -12
- 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 +8 -7
- 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 +79 -60
- package/src/settings/css-vars-editor.ts +37 -16
- package/src/settings/defs-editor.ts +38 -35
- package/src/settings/extension-rows.ts +16 -8
- package/src/settings/extension-sections.ts +23 -13
- package/src/settings/extensions-section.ts +4 -1
- package/src/settings/general-settings.ts +11 -8
- package/src/settings/locales-section.ts +20 -12
- package/src/settings/preferences-dialog.ts +9 -6
- package/src/settings/preferences-keymap.ts +7 -5
- package/src/settings/preferences-sections.ts +11 -5
- package/src/settings/project-sections.ts +1 -1
- package/src/settings/schema-field-ui.ts +9 -0
- package/src/settings/settings-document.ts +5 -5
- package/src/shell/tree.ts +6 -5
- package/src/shell.ts +104 -81
- package/src/site-context.ts +37 -22
- package/src/state.ts +41 -49
- package/src/store.ts +54 -34
- package/src/studio.ts +25 -75
- package/src/style/live-preview.ts +1 -1
- package/src/style/project-styles.ts +6 -7
- package/src/style/token-ref.ts +5 -4
- package/src/surfaces/about.ts +18 -19
- package/src/surfaces/add-repo.ts +17 -19
- package/src/surfaces/ai-chat.ts +31 -36
- 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.ts +4 -5
- package/src/surfaces/bottom-dock.ts +9 -18
- package/src/surfaces/canvas-stage.ts +12 -11
- package/src/surfaces/cf-account-picker.ts +17 -18
- package/src/surfaces/commandbar.ts +14 -9
- 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/doc-header.ts +10 -19
- package/src/surfaces/empty-state.ts +7 -10
- package/src/surfaces/entry-editor.ts +14 -11
- 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/git-panel.ts +7 -15
- 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.ts +13 -12
- package/src/surfaces/jump-bar.ts +5 -6
- package/src/surfaces/jxsuite-update.ts +16 -22
- package/src/surfaces/library-pane.ts +19 -20
- package/src/surfaces/logic-panel.ts +17 -30
- package/src/surfaces/logic-workspace.ts +13 -15
- package/src/surfaces/media-browser.ts +11 -10
- package/src/surfaces/media-field.ts +4 -5
- package/src/surfaces/media-pane.ts +8 -7
- package/src/surfaces/menu.ts +29 -23
- package/src/surfaces/navigator-dock.ts +11 -12
- package/src/surfaces/new-project.ts +27 -26
- package/src/surfaces/pane-context.ts +20 -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.ts +5 -6
- 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.ts +11 -18
- package/src/surfaces/panel-problems.ts +5 -7
- package/src/surfaces/panel-signals.ts +20 -34
- package/src/surfaces/panel-stylebook-layers.ts +5 -8
- package/src/surfaces/preferences.ts +21 -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.ts +18 -18
- package/src/surfaces/push-plan.ts +7 -8
- package/src/surfaces/rail.ts +13 -13
- package/src/surfaces/reference-field.ts +11 -15
- package/src/surfaces/schema-builder.ts +16 -22
- package/src/surfaces/schema-form.ts +15 -25
- package/src/surfaces/secret-field.ts +9 -6
- package/src/surfaces/seo.ts +21 -15
- package/src/surfaces/settings-contexts.ts +9 -7
- package/src/surfaces/settings-contributed.ts +14 -10
- package/src/surfaces/settings-css-vars.ts +5 -12
- package/src/surfaces/settings-defs.json +2 -2
- package/src/surfaces/settings-defs.ts +17 -21
- package/src/surfaces/settings-deploy.ts +8 -15
- 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.ts +5 -6
- package/src/surfaces/settings-packages.ts +8 -7
- package/src/surfaces/settings-pane.ts +9 -18
- package/src/surfaces/settings-rawjson.ts +5 -6
- package/src/surfaces/shell.ts +1 -2
- package/src/surfaces/slash-menu.ts +19 -9
- package/src/surfaces/statements.ts +13 -18
- package/src/surfaces/statusbar.ts +17 -14
- package/src/surfaces/style-panel.ts +18 -31
- package/src/surfaces/stylebook-chrome.ts +3 -5
- package/src/surfaces/tab-strip.ts +14 -13
- package/src/surfaces/target-line.ts +6 -7
- package/src/surfaces/welcome.ts +5 -7
- 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 +52 -41
- package/src/tabs/transact.ts +98 -53
- package/src/types.ts +32 -17
- 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 +57 -48
- package/src/ui/formula-catalog.ts +239 -230
- package/src/ui/formula-chips.ts +33 -18
- package/src/ui/layers.ts +44 -31
- package/src/ui/media-picker.ts +18 -9
- package/src/ui/popover-surface.ts +20 -12
- package/src/ui/progress-modal.ts +13 -8
- package/src/ui/regions.ts +7 -6
- package/src/ui/schema-form.ts +113 -70
- 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 +3 -2
- package/src/utils/base64.ts +3 -1
- package/src/utils/edit-display.ts +73 -73
- 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/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 +10 -12
- package/src/workspace/session.ts +53 -43
- package/src/workspace/workspace.ts +40 -36
- 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/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-t6b6qe31.js +0 -5
- package/dist/chunks/studio-tdcprbqb.js +0 -5
- 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-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/workspace-zt81g1ms.js +0 -4
- package/dist/chunks/ws-client-n2bh4hkf.js +0 -4
|
@@ -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 {
|
|
@@ -235,7 +236,7 @@ function barPosition(anchor: {
|
|
|
235
236
|
pointing at a node the card is covering. Everywhere else there is no scroller and the stage is
|
|
236
237
|
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;
|
|
@@ -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));
|
|
@@ -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;
|
|
@@ -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,13 @@ 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
|
return { type: "block" };
|
|
103
105
|
}
|
|
104
106
|
if (data.type === "tree-node" && Array.isArray(data.path)) {
|
|
107
|
+
/* SAFETY: both minters of a "tree-node" payload, an Outline row's `getInitialData` and the block
|
|
108
|
+
action bar's drag handle, set `path` to the dragged node's JxPath. */
|
|
105
109
|
return { path: data.path as (string | number)[], type: "tree-node" };
|
|
106
110
|
}
|
|
107
111
|
return null;
|
|
@@ -120,20 +124,22 @@ function dragSrcOf(data: Record<string, unknown>): DragSrcKind | null {
|
|
|
120
124
|
*
|
|
121
125
|
* @param {Tab | null} tab The document the source path is addressed in.
|
|
122
126
|
* @param {DragSrcKind} src
|
|
123
|
-
* @param {
|
|
127
|
+
* @param {ElementDragPayload["data"]} data
|
|
124
128
|
* @returns {string}
|
|
125
129
|
*/
|
|
126
130
|
export function ghostLabel(
|
|
127
131
|
tab: Tab | null,
|
|
128
132
|
src: DragSrcKind,
|
|
129
|
-
data:
|
|
133
|
+
data: ElementDragPayload["data"],
|
|
130
134
|
): string {
|
|
131
135
|
if (src.type === "block") {
|
|
136
|
+
/* SAFETY: every "block" payload minter (the palette and component cards in dnd.ts, the asset
|
|
137
|
+
file drop) sets `fragment` to the JxMutableNode the drop inserts. */
|
|
132
138
|
const fragment = data.fragment as JxMutableNode | undefined;
|
|
133
139
|
return displayTagName(fragment?.tagName) || "block";
|
|
134
140
|
}
|
|
135
|
-
const doc = tab?.doc.document
|
|
136
|
-
const node = doc ?
|
|
141
|
+
const doc = tab?.doc.document;
|
|
142
|
+
const node = doc ? getNodeAtPath(doc, src.path) : undefined;
|
|
137
143
|
return displayTagName(node?.tagName) || "node";
|
|
138
144
|
}
|
|
139
145
|
|
|
@@ -150,9 +156,9 @@ const DROP_RESULT_TIMEOUT = 250;
|
|
|
150
156
|
*/
|
|
151
157
|
interface CoordSession {
|
|
152
158
|
src: DragSrcKind;
|
|
153
|
-
srcData:
|
|
159
|
+
srcData: ElementDragPayload["data"];
|
|
154
160
|
/** The host whose iframe currently holds the session, or null while off-canvas. */
|
|
155
|
-
host:
|
|
161
|
+
host: HostState | null;
|
|
156
162
|
/** The session id the bound host was started with (for move/drop tagging). */
|
|
157
163
|
seq: number;
|
|
158
164
|
/** The drag ghost's label (computed once at start; the dragged thing doesn't change). */
|
|
@@ -161,9 +167,9 @@ interface CoordSession {
|
|
|
161
167
|
|
|
162
168
|
/** Begin a session bound to `host`: bump+post dragStart, show the ghost, record the seq. */
|
|
163
169
|
function startSession(
|
|
164
|
-
host:
|
|
170
|
+
host: HostState,
|
|
165
171
|
src: DragSrcKind,
|
|
166
|
-
srcData:
|
|
172
|
+
srcData: ElementDragPayload["data"],
|
|
167
173
|
): CoordSession {
|
|
168
174
|
const seq = beginDragSession(host, src, srcData);
|
|
169
175
|
// The label names a node in the TARGET pane's document — `host` is the artboard the cursor is
|
|
@@ -180,7 +186,7 @@ function startSession(
|
|
|
180
186
|
* new panel's iframe drives the rest.
|
|
181
187
|
* - No host (inside→outside) → dragEnd the old + unbind; the ghost keeps following off-canvas.
|
|
182
188
|
*/
|
|
183
|
-
function sessionDrag(session: CoordSession, cursor:
|
|
189
|
+
function sessionDrag(session: CoordSession, cursor: ViewportPoint): void {
|
|
184
190
|
moveDragGhost(cursor.x, cursor.y);
|
|
185
191
|
const target = liveDragHostAt(cursor);
|
|
186
192
|
if (target === session.host) {
|
|
@@ -212,7 +218,7 @@ function sessionDrag(session: CoordSession, cursor: Cursor): void {
|
|
|
212
218
|
* the affordances if no reply arrives (iframe reloaded mid-drag). Drops off-canvas release retained
|
|
213
219
|
* data.
|
|
214
220
|
*/
|
|
215
|
-
function sessionDrop(session: CoordSession, cursor:
|
|
221
|
+
function sessionDrop(session: CoordSession, cursor: ViewportPoint): void {
|
|
216
222
|
const target = liveDragHostAt(cursor);
|
|
217
223
|
// Migrate first if the drop landed on a different panel than the last move bound.
|
|
218
224
|
if (target && target !== session.host) {
|
|
@@ -281,7 +287,7 @@ export function registerCanvasDndBridge(): () => void {
|
|
|
281
287
|
let session: CoordSession | null = null;
|
|
282
288
|
// The in-flight pragmatic source (set in onDragStart, cleared in onDrop) so a nativeDragEnter can
|
|
283
289
|
// Bind a session for a drag whose cursor entered an iframe before the parent ever bound a host.
|
|
284
|
-
let pending:
|
|
290
|
+
let pending: Pick<CoordSession, "src" | "srcData"> | null = null;
|
|
285
291
|
|
|
286
292
|
// Bind/migrate the live pragmatic session when its NATIVE stream enters an unclaimed iframe:
|
|
287
293
|
// Chromium delivers dragover to the frame under the cursor, so a drag from the palette/layers
|
|
@@ -353,7 +359,8 @@ export function registerCanvasDndBridge(): () => void {
|
|
|
353
359
|
return;
|
|
354
360
|
}
|
|
355
361
|
pending = null;
|
|
356
|
-
|
|
362
|
+
// Pragmatic's DragLocation always carries an `input`, cancelled drags included.
|
|
363
|
+
const cursor = cursorOf(location);
|
|
357
364
|
if (!session) {
|
|
358
365
|
// Never bound a host (dropped off every canvas) — just hide the ghost; nothing to apply.
|
|
359
366
|
clearDragGhost();
|
|
@@ -2,6 +2,15 @@
|
|
|
2
2
|
// ─── Data Explorer ──────────────────────────────────────────────────────────
|
|
3
3
|
|
|
4
4
|
import { nothing } from "lit-html";
|
|
5
|
+
import {
|
|
6
|
+
isBigInt,
|
|
7
|
+
isBoolean,
|
|
8
|
+
isFunction,
|
|
9
|
+
isNonNullObject,
|
|
10
|
+
isNumber,
|
|
11
|
+
isString,
|
|
12
|
+
isSymbol,
|
|
13
|
+
} from "@jxsuite/schema/guards";
|
|
5
14
|
import { activeTab } from "../workspace/workspace";
|
|
6
15
|
import { booleanArg, stringArg, stringProperty } from "../commands/command-args";
|
|
7
16
|
import { renderDataTreeSurface } from "../surfaces/panel-data";
|
|
@@ -9,6 +18,8 @@ import { registerPanel } from "./panel-registry";
|
|
|
9
18
|
import type { PanelBody } from "./panel-registry";
|
|
10
19
|
import type { DataTreeRow } from "../surfaces/panel-data";
|
|
11
20
|
import type { AnyCommand, CommandRegistry } from "../commands/registry";
|
|
21
|
+
import type { CommandArgValues } from "../commands/command-args";
|
|
22
|
+
import type { ScopeRecord, ScopeValue } from "../editor/merge-tags";
|
|
12
23
|
|
|
13
24
|
/**
|
|
14
25
|
* The focused tab's expansion record, created on first write.
|
|
@@ -22,7 +33,7 @@ function rowsUi(): Record<string, boolean> | null {
|
|
|
22
33
|
if (!ui) {
|
|
23
34
|
return null;
|
|
24
35
|
}
|
|
25
|
-
return
|
|
36
|
+
return ui.dataRows;
|
|
26
37
|
}
|
|
27
38
|
|
|
28
39
|
/*
|
|
@@ -44,7 +55,7 @@ function limitsUi(): Record<string, number> | null {
|
|
|
44
55
|
if (!ui) {
|
|
45
56
|
return null;
|
|
46
57
|
}
|
|
47
|
-
return
|
|
58
|
+
return ui.dataLimits;
|
|
48
59
|
}
|
|
49
60
|
|
|
50
61
|
/** The cap for one marker: the default, plus whatever the reader has asked for. */
|
|
@@ -89,34 +100,60 @@ function moreRow(
|
|
|
89
100
|
};
|
|
90
101
|
}
|
|
91
102
|
|
|
92
|
-
/**
|
|
93
|
-
|
|
94
|
-
|
|
103
|
+
/**
|
|
104
|
+
* A value as the tree prints it, capped at `max` characters. `undefined` prints as nothing, and so
|
|
105
|
+
* do a function and a symbol: those are the values `JSON.stringify` answers with no text at all.
|
|
106
|
+
*/
|
|
107
|
+
function valueText(value: ScopeValue, max: number): string {
|
|
108
|
+
if (isString(value) && value.length > max) {
|
|
95
109
|
return `"${value.slice(0, max)}…"`;
|
|
96
110
|
}
|
|
97
|
-
return
|
|
111
|
+
return value === undefined || isFunction(value) || isSymbol(value) ? "" : JSON.stringify(value);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/** Each primitive kind, in the spelling `typeof` gives it, with the guard that establishes it. */
|
|
115
|
+
const PRIMITIVE_KINDS: readonly (readonly [string, (value: ScopeValue) => boolean])[] = [
|
|
116
|
+
["string", isString],
|
|
117
|
+
["number", isNumber],
|
|
118
|
+
["boolean", isBoolean],
|
|
119
|
+
["bigint", isBigInt],
|
|
120
|
+
["symbol", isSymbol],
|
|
121
|
+
["function", isFunction],
|
|
122
|
+
];
|
|
123
|
+
|
|
124
|
+
/** The `typeof` name of a value that is neither `null` nor an object. */
|
|
125
|
+
function primitiveKind(value: ScopeValue): string {
|
|
126
|
+
return PRIMITIVE_KINDS.find(([, test]) => test(value))?.[0] ?? "undefined";
|
|
98
127
|
}
|
|
99
128
|
|
|
100
129
|
/** Which colour a value takes. `null` and a summary label are the two the tree actually paints. */
|
|
101
|
-
function toneOf(value:
|
|
102
|
-
return value === null ? "null" :
|
|
130
|
+
function toneOf(value: ScopeValue): string {
|
|
131
|
+
return value === null ? "null" : primitiveKind(value);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* A value the tree can open: an array or a record. `isNonNullObject` is a `typeof "object"` test,
|
|
136
|
+
* so it already refuses a function; this predicate is what tells the type checker so.
|
|
137
|
+
*/
|
|
138
|
+
function isOpenable(value: ScopeValue): value is ScopeValue[] | ScopeRecord {
|
|
139
|
+
return isNonNullObject(value);
|
|
103
140
|
}
|
|
104
141
|
|
|
105
142
|
/** `Array(3)` or `{2}` — what a value you can open says while it is closed. */
|
|
106
|
-
function summaryLabel(value:
|
|
143
|
+
function summaryLabel(value: ScopeValue[] | ScopeRecord): string {
|
|
107
144
|
return Array.isArray(value) ? `Array(${value.length})` : `{${Object.keys(value).length}}`;
|
|
108
145
|
}
|
|
109
146
|
|
|
110
147
|
/** Unwrap a Vue ref (has .value and .__v_isRef) to get the underlying value. */
|
|
111
|
-
export function unwrapSignal(value:
|
|
112
|
-
if (value &&
|
|
113
|
-
return
|
|
148
|
+
export function unwrapSignal(value: ScopeValue): ScopeValue {
|
|
149
|
+
if (isOpenable(value) && !Array.isArray(value) && value.__v_isRef) {
|
|
150
|
+
return value.value;
|
|
114
151
|
}
|
|
115
152
|
return value;
|
|
116
153
|
}
|
|
117
154
|
|
|
118
155
|
/** Type label for a signal value in the data explorer. */
|
|
119
|
-
export function dataTypeLabel(value:
|
|
156
|
+
export function dataTypeLabel(value: ScopeValue): string {
|
|
120
157
|
const v = unwrapSignal(value);
|
|
121
158
|
if (v === null) {
|
|
122
159
|
return "null";
|
|
@@ -127,10 +164,10 @@ export function dataTypeLabel(value: unknown) {
|
|
|
127
164
|
if (Array.isArray(v)) {
|
|
128
165
|
return `Array(${v.length})`;
|
|
129
166
|
}
|
|
130
|
-
if (
|
|
167
|
+
if (isOpenable(v)) {
|
|
131
168
|
return `{${Object.keys(v).length}}`;
|
|
132
169
|
}
|
|
133
|
-
return
|
|
170
|
+
return primitiveKind(v);
|
|
134
171
|
}
|
|
135
172
|
|
|
136
173
|
/* THE VALUE LIST IS GONE, AND ITS ROWS ARE THE DEFINITION ROWS — `panels/signals-panel.ts`.
|
|
@@ -148,14 +185,14 @@ export function dataTypeLabel(value: unknown) {
|
|
|
148
185
|
* each carry their own indent. Nothing else changed: the caps are the same caps, the text is
|
|
149
186
|
* truncated at the same lengths, and a capped list still ends in a marker.
|
|
150
187
|
*
|
|
151
|
-
* @param {
|
|
188
|
+
* @param {ScopeValue} value The resolved value to read.
|
|
152
189
|
* @param {number} depth How deep this call already is; the indent is derived from it.
|
|
153
190
|
* @param {number} [maxDepth] The default depth cap, before whatever the reader has raised.
|
|
154
191
|
* @param {string} path This subtree's path, which is what a raised limit is remembered against.
|
|
155
192
|
* @returns {DataTreeRow[]}
|
|
156
193
|
*/
|
|
157
194
|
export function dataTreeRows(
|
|
158
|
-
value:
|
|
195
|
+
value: ScopeValue,
|
|
159
196
|
depth: number,
|
|
160
197
|
maxDepth = 5,
|
|
161
198
|
path = "",
|
|
@@ -182,21 +219,21 @@ export function dataTreeRows(
|
|
|
182
219
|
if (value === null || value === undefined) {
|
|
183
220
|
return [row("", String(value), "null", path)];
|
|
184
221
|
}
|
|
185
|
-
if (
|
|
222
|
+
if (!isOpenable(value)) {
|
|
186
223
|
return [row("", valueText(value, 200), toneOf(value), path)];
|
|
187
224
|
}
|
|
188
225
|
|
|
189
226
|
const array = Array.isArray(value);
|
|
190
|
-
const entries: [string, string,
|
|
227
|
+
const entries: [string, string, ScopeValue][] = array
|
|
191
228
|
? value.map((item, i) => [`${i}`, `[${i}] `, item])
|
|
192
|
-
: Object.keys(value).map((key) => [key, `${key}: `,
|
|
229
|
+
: Object.keys(value).map((key) => [key, `${key}: `, value[key]]);
|
|
193
230
|
const limit = array ? "items" : "keys";
|
|
194
231
|
const cap = capFor(path, limit, array ? 20 : 30);
|
|
195
232
|
|
|
196
233
|
const rows: DataTreeRow[] = [];
|
|
197
234
|
for (const [segment, label, item] of entries.slice(0, cap)) {
|
|
198
235
|
const childPath = `${path}/${segment}`;
|
|
199
|
-
if (item
|
|
236
|
+
if (!isOpenable(item)) {
|
|
200
237
|
rows.push(row(label, valueText(item, 80), toneOf(item), childPath));
|
|
201
238
|
continue;
|
|
202
239
|
}
|
|
@@ -222,14 +259,14 @@ export function dataTreeRows(
|
|
|
222
259
|
* repaint instead of this sweeping per host.
|
|
223
260
|
*
|
|
224
261
|
* @param {HTMLElement} host The node the tree is drawn into.
|
|
225
|
-
* @param {
|
|
262
|
+
* @param {ScopeValue} value What the canvas resolved this entry to.
|
|
226
263
|
* @param {string} path The subtree's path, which is what a raised limit is remembered against.
|
|
227
264
|
* @param {() => void} rerender Repaint the panel, so that a raised limit is drawn.
|
|
228
265
|
* @param {number} [maxDepth] The default depth cap, before whatever the reader has raised.
|
|
229
266
|
*/
|
|
230
267
|
export function paintDataTree(
|
|
231
268
|
host: HTMLElement,
|
|
232
|
-
value:
|
|
269
|
+
value: ScopeValue,
|
|
233
270
|
path: string,
|
|
234
271
|
rerender: () => void,
|
|
235
272
|
maxDepth = 5,
|
|
@@ -327,7 +364,7 @@ export function dataExplorerCommands(deps: DataExplorerCommandDeps): AnyCommand[
|
|
|
327
364
|
group: "5_data",
|
|
328
365
|
requires: "an open document that defines data",
|
|
329
366
|
when: (ctx) => ctx.document.open,
|
|
330
|
-
run: (_commandCtx, args) => {
|
|
367
|
+
run: (_commandCtx, args: CommandArgValues) => {
|
|
331
368
|
const name = stringArg("data.expandRow", args, "name");
|
|
332
369
|
const defined = definedDataNames();
|
|
333
370
|
if (!defined.includes(name)) {
|
|
@@ -336,7 +373,7 @@ export function dataExplorerCommands(deps: DataExplorerCommandDeps): AnyCommand[
|
|
|
336
373
|
`document — it defines: ${defined.length > 0 ? defined.join(", ") : "nothing"}`,
|
|
337
374
|
);
|
|
338
375
|
}
|
|
339
|
-
const { expanded } = args
|
|
376
|
+
const { expanded } = args;
|
|
340
377
|
// `expanded` defaults to true but is never COERCED: `{ expanded: "no" }` would otherwise
|
|
341
378
|
// Read as a collapse, which is the class of silent wrong answer this whole record exists
|
|
342
379
|
// To stop.
|
package/src/panels/data-grid.ts
CHANGED
|
@@ -26,7 +26,7 @@ import { openGridSourcePicker } from "../grid/grid-open";
|
|
|
26
26
|
import type { DataActionsSurfaceHandle, DataActionsView } from "../surfaces/data-actions";
|
|
27
27
|
import type { DialogSurfaceHandle } from "../surfaces/dialog";
|
|
28
28
|
import type { PushPlanSurfaceHandle, PushPlanView } from "../surfaces/push-plan";
|
|
29
|
-
import type { DataConnectionTestResult, DataPushResult } from "../types";
|
|
29
|
+
import type { DataConnectionTestResult, DataPushRequest, DataPushResult } from "../types";
|
|
30
30
|
import type { SectionActionsContext } from "../settings/contributed-section";
|
|
31
31
|
|
|
32
32
|
// ─── Grid opening (delegates to the grid-tab source picker) ──────────────────
|
|
@@ -75,7 +75,7 @@ function noteRows(texts: readonly string[], prefix: string) {
|
|
|
75
75
|
}
|
|
76
76
|
|
|
77
77
|
/** What the body lists: the dry run until it has been applied, then what actually happened. */
|
|
78
|
-
function planView(state: PushDialogState): PushPlanView {
|
|
78
|
+
function planView(state: Pick<PushDialogState, "dryRun" | "phase" | "result">): PushPlanView {
|
|
79
79
|
const shown = state.phase === "done" ? state.result : state.dryRun;
|
|
80
80
|
return {
|
|
81
81
|
errors: noteRows(shown?.errors ?? [], "error"),
|
|
@@ -129,27 +129,28 @@ export async function startPush(connection: string | undefined, onDone: () => vo
|
|
|
129
129
|
if (pushDialog) {
|
|
130
130
|
return;
|
|
131
131
|
}
|
|
132
|
-
|
|
132
|
+
/* The dialog's callbacks need the state record and the record needs the dialog's handle, so the
|
|
133
|
+
record is built first and completed with the handle below; it stays one object throughout. */
|
|
134
|
+
const pending: Omit<PushDialogState, "handle"> = {
|
|
133
135
|
connection,
|
|
134
136
|
dryRun: null,
|
|
135
|
-
handle: null as unknown as DialogSurfaceHandle,
|
|
136
137
|
onDone,
|
|
137
138
|
phase: "loading",
|
|
138
139
|
plan: null,
|
|
139
140
|
result: null,
|
|
140
141
|
};
|
|
141
|
-
|
|
142
|
+
const handle = openDialogSurface({
|
|
142
143
|
cancelLabel: "Cancel",
|
|
143
144
|
confirmLabel: "",
|
|
144
145
|
headline: connection ? `Push Schema — ${connection}` : "Push Schema",
|
|
145
146
|
island: (host) => {
|
|
146
|
-
|
|
147
|
+
pending.plan = mountPushPlanSurface(host, planView(pending));
|
|
147
148
|
},
|
|
148
149
|
layer: layerHost("dialog"),
|
|
149
150
|
message: "Compiling plan…",
|
|
150
151
|
onCancel: closePushDialog,
|
|
151
152
|
onClosed: () => {
|
|
152
|
-
if (pushDialog ===
|
|
153
|
+
if (pushDialog === pending) {
|
|
153
154
|
closePushDialog();
|
|
154
155
|
}
|
|
155
156
|
},
|
|
@@ -158,12 +159,14 @@ export async function startPush(connection: string | undefined, onDone: () => vo
|
|
|
158
159
|
},
|
|
159
160
|
region: "data/push",
|
|
160
161
|
});
|
|
162
|
+
const state: PushDialogState = Object.assign(pending, { handle });
|
|
161
163
|
pushDialog = state;
|
|
162
164
|
|
|
163
|
-
const
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
}
|
|
165
|
+
const request: DataPushRequest = { dryRun: true };
|
|
166
|
+
if (connection !== undefined) {
|
|
167
|
+
request.connection = connection;
|
|
168
|
+
}
|
|
169
|
+
const plan = await pushSchema(request);
|
|
167
170
|
if (pushDialog !== state) {
|
|
168
171
|
return;
|
|
169
172
|
}
|