@jxsuite/studio 6.1.0 → 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-f2gkpy8d.js +4 -0
- 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-gybvv7a6.js → index-zpjmzqfk.js} +3 -3
- package/dist/chunks/{javascript-rnvdp3k4.js → javascript-m54mnwp6.js} +3 -3
- package/dist/chunks/jsonMode-w15cmrcm.js +13 -0
- 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-5g0ag7c0.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-pxg4ap1e.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-qbj760tx.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-anyrgzvb.js → studio-90pq9km1.js} +4 -4
- package/dist/chunks/studio-924p1tm1.js +6 -0
- package/dist/chunks/{studio-v2bvmbjj.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-txjjzrsm.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-0x3jyb8r.js → studio-tq0rtfwj.js} +4 -4
- package/dist/chunks/{studio-cpxkgjrj.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-y64hrt8p.js +12 -0
- 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-sf49ee9x.js +14 -0
- 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 +98 -98
- package/dist/workers/ts.worker.js +3 -3
- package/package.json +11 -11
- 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 +66 -42
- package/src/canvas/canvas-surface.ts +5 -3
- package/src/canvas/canvas-utils.ts +163 -64
- 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 +203 -118
- package/src/canvas/iframe-inline-edit.ts +69 -32
- package/src/canvas/iframe-insert.ts +5 -4
- package/src/canvas/iframe-interaction.ts +37 -26
- 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 +15 -16
- package/src/canvas/iframe-render.ts +41 -36
- 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/defaults.ts +4 -1
- package/src/commands/keymap.ts +47 -43
- package/src/commands/levels.ts +3 -3
- package/src/commands/live-context.ts +10 -8
- 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 +87 -47
- 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 +6 -1
- 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 +55 -22
- 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 +254 -216
- 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 +174 -127
- 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 +39 -77
- 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 +25 -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.json +126 -73
- package/src/surfaces/rail.ts +38 -12
- 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/tabs/typing.ts +31 -0
- 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 +103 -74
- 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 +47 -36
- package/dist/chunks/2020-nkxms0ay.js +0 -4
- package/dist/chunks/adapter-m948ab5f.js +0 -4
- package/dist/chunks/cf-account-picker-n8hr38v7.js +0 -4
- package/dist/chunks/cf-settings-356xdtne.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-yk3t844e.js +0 -4
- package/dist/chunks/content-source-bawmyc09.js +0 -4
- package/dist/chunks/convert-to-repeater-7wns8kf1.js +0 -4
- package/dist/chunks/dialog-mtm9fq5t.js +0 -4
- package/dist/chunks/editor-6sc8nacq.js +0 -4
- package/dist/chunks/entry-commands-8ay9fh81.js +0 -4
- package/dist/chunks/extension-sections-na7rj3nr.js +0 -4
- package/dist/chunks/file-ops-gye0qw56.js +0 -4
- package/dist/chunks/files-dmc2xvcq.js +0 -4
- package/dist/chunks/format-host-t76b53f8.js +0 -4
- package/dist/chunks/fs-events-cg4tpz06.js +0 -4
- package/dist/chunks/git-panel-yef7bshy.js +0 -4
- package/dist/chunks/grid-view-7tt4bxw1.js +0 -51
- package/dist/chunks/icons-qbh8akb1.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-tmz30gfp.js +0 -4
- package/dist/chunks/index-nag78a9h.js +0 -4
- package/dist/chunks/jsonMode-zhwsprqk.js +0 -13
- package/dist/chunks/jx-validate-3gbp5nkn.js +0 -4
- package/dist/chunks/layers-fvz99859.js +0 -4
- package/dist/chunks/layers-panel-gchmbf9p.js +0 -4
- package/dist/chunks/listbox-s8fkmnq8.js +0 -4
- package/dist/chunks/lit-html-9agdspkt.js +0 -4
- package/dist/chunks/media-picker-rhjvyy00.js +0 -4
- package/dist/chunks/menu-2e4y9j7b.js +0 -4
- package/dist/chunks/menu-37d07z9m.js +0 -4
- package/dist/chunks/monaco-binding-2jnhjjvr.js +0 -4
- package/dist/chunks/monaco-buffer-rp21359g.js +0 -4
- package/dist/chunks/monaco-setup-vhh7gayr.js +0 -4
- package/dist/chunks/notify-h3www560.js +0 -4
- package/dist/chunks/number-field-gw7sq8rn.js +0 -4
- package/dist/chunks/parse-897fvqah.js +0 -4
- package/dist/chunks/platform-hz34wcd7.js +0 -4
- package/dist/chunks/popover-8htra4er.js +0 -4
- package/dist/chunks/publish-panel-exsmjzyj.js +0 -4
- package/dist/chunks/quick-search-pgaqeh0m.js +0 -4
- package/dist/chunks/references-2cgdxnb8.js +0 -4
- package/dist/chunks/right-panel-jf856w5w.js +0 -4
- package/dist/chunks/section-registry-jnf8r5gy.js +0 -4
- package/dist/chunks/select-n3v7gwas.js +0 -4
- package/dist/chunks/split-pff8f3ze.js +0 -4
- package/dist/chunks/studio-0f55h9ye.js +0 -5
- package/dist/chunks/studio-0sqdhnew.js +0 -12
- package/dist/chunks/studio-19x1c75w.js +0 -5
- package/dist/chunks/studio-2sqcndak.js +0 -5
- package/dist/chunks/studio-3aey7dd3.js +0 -5
- package/dist/chunks/studio-3bpdkq2s.js +0 -5
- package/dist/chunks/studio-47y6fbpf.js +0 -5
- package/dist/chunks/studio-4m3826v2.js +0 -5
- package/dist/chunks/studio-4nx2dj1g.js +0 -4
- package/dist/chunks/studio-4xv5s47r.js +0 -9
- package/dist/chunks/studio-5g4t8v6w.js +0 -5
- package/dist/chunks/studio-5py436sf.js +0 -5
- package/dist/chunks/studio-77kt594t.js +0 -5
- package/dist/chunks/studio-8f87n763.js +0 -10
- package/dist/chunks/studio-8mb00b84.js +0 -5
- package/dist/chunks/studio-8p51gq2h.js +0 -6
- package/dist/chunks/studio-954ds834.js +0 -5
- package/dist/chunks/studio-9ft45c83.js +0 -9
- package/dist/chunks/studio-a2138x5k.js +0 -7
- package/dist/chunks/studio-a9yzstqj.js +0 -5
- package/dist/chunks/studio-acdksxx6.js +0 -5
- package/dist/chunks/studio-ar8jcf2y.js +0 -5
- package/dist/chunks/studio-bmn4mn9j.js +0 -7
- package/dist/chunks/studio-e7xxa0sj.js +0 -5
- package/dist/chunks/studio-ecaz25vk.js +0 -5
- package/dist/chunks/studio-ery42sqr.js +0 -4
- package/dist/chunks/studio-fzdywr6p.js +0 -9
- package/dist/chunks/studio-g5fmf0c1.js +0 -5
- package/dist/chunks/studio-g7nse7zb.js +0 -5
- package/dist/chunks/studio-geq1ea6k.js +0 -14
- package/dist/chunks/studio-ghkb32r8.js +0 -5
- package/dist/chunks/studio-ghrhy2y7.js +0 -5
- package/dist/chunks/studio-grawhey1.js +0 -5
- package/dist/chunks/studio-h0xgswew.js +0 -5
- package/dist/chunks/studio-h9c4p2tx.js +0 -5
- package/dist/chunks/studio-jyzj5cxs.js +0 -5
- package/dist/chunks/studio-mgx8yhnz.js +0 -64
- package/dist/chunks/studio-mpb04y1d.js +0 -6
- package/dist/chunks/studio-n17mty64.js +0 -5
- package/dist/chunks/studio-nwh2eqsk.js +0 -6
- package/dist/chunks/studio-q1h883bt.js +0 -16
- package/dist/chunks/studio-q4tv82h7.js +0 -9
- package/dist/chunks/studio-qpqa7vk3.js +0 -5
- package/dist/chunks/studio-qqz8e5gk.js +0 -5
- package/dist/chunks/studio-qvasen3f.js +0 -5
- package/dist/chunks/studio-rggdb3hm.js +0 -5
- package/dist/chunks/studio-sghy936h.js +0 -4
- package/dist/chunks/studio-skprc6ef.js +0 -5
- package/dist/chunks/studio-tt2nactf.js +0 -5
- package/dist/chunks/studio-tyasmc39.js +0 -5
- package/dist/chunks/studio-vk9ezads.js +0 -5
- package/dist/chunks/studio-vzacdfsc.js +0 -4
- package/dist/chunks/studio-w4c0xmrw.js +0 -5
- package/dist/chunks/studio-wfjqhhbk.js +0 -5
- package/dist/chunks/studio-wgh5kxpj.js +0 -5
- package/dist/chunks/studio-xasj0796.js +0 -5
- package/dist/chunks/studio-y78s8r2n.js +0 -5
- package/dist/chunks/studio-z8w183sh.js +0 -5
- package/dist/chunks/studio-zscd9ty4.js +0 -928
- package/dist/chunks/studio-zxp13sss.js +0 -7
- package/dist/chunks/studio-zygnmm01.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-gr0m4dzr.js +0 -14
- package/dist/chunks/workspace-m15qtcqp.js +0 -4
- package/dist/chunks/ws-client-nf61frr1.js +0 -4
package/src/surfaces/menu.ts
CHANGED
|
@@ -20,7 +20,6 @@
|
|
|
20
20
|
* @docs studio/interface/canvas
|
|
21
21
|
* @docs studio/interface/preferences
|
|
22
22
|
*/
|
|
23
|
-
import type { JxDocument } from "@jxsuite/schema/types";
|
|
24
23
|
import type { JxScope } from "@jxsuite/runtime/types";
|
|
25
24
|
import { ensureCaret } from "@jxsuite/ui/behaviors/menu";
|
|
26
25
|
import { reactive } from "../reactivity";
|
|
@@ -29,7 +28,7 @@ import { mountSurface, registerSurface } from "../ui/surface";
|
|
|
29
28
|
import { rectOf } from "../utils/geometry";
|
|
30
29
|
import menuDoc from "./menu.json";
|
|
31
30
|
|
|
32
|
-
registerSurface("menu", menuDoc
|
|
31
|
+
registerSurface("menu", menuDoc);
|
|
33
32
|
|
|
34
33
|
/**
|
|
35
34
|
* What a row prints: a projection of one command record, decided by the adapter that opens the
|
|
@@ -65,12 +64,12 @@ export interface OpenMenuOptions {
|
|
|
65
64
|
/** The menu's accessible name. */
|
|
66
65
|
label: string;
|
|
67
66
|
/** Where the panel opens, in viewport pixels, when `place` is not given. */
|
|
68
|
-
origin?:
|
|
67
|
+
origin?: ViewportPoint;
|
|
69
68
|
/**
|
|
70
69
|
* Where the panel opens as a function of its measured box: run once the popover is shown and
|
|
71
70
|
* again a frame later, so a menu that hangs off a control can put its bottom flush with a floor.
|
|
72
71
|
*/
|
|
73
|
-
place?: (box: DOMRect) =>
|
|
72
|
+
place?: (box: DOMRect) => ViewportPoint;
|
|
74
73
|
/** The lowest edge the menu and its submenus may reach; the viewport by default. */
|
|
75
74
|
floor?: () => number;
|
|
76
75
|
/**
|
|
@@ -113,6 +112,12 @@ export interface MenuHandle {
|
|
|
113
112
|
readonly setRows: (rows: readonly MenuRowProjection[]) => void;
|
|
114
113
|
}
|
|
115
114
|
|
|
115
|
+
/** A point in viewport pixels: where a floating panel's corner sits. */
|
|
116
|
+
export interface ViewportPoint {
|
|
117
|
+
x: number;
|
|
118
|
+
y: number;
|
|
119
|
+
}
|
|
120
|
+
|
|
116
121
|
type MenuElement = HTMLElement & {
|
|
117
122
|
open?: boolean;
|
|
118
123
|
x?: number;
|
|
@@ -140,7 +145,7 @@ type ProjectedRow = Omit<
|
|
|
140
145
|
};
|
|
141
146
|
|
|
142
147
|
/** The scope shape `menu.json` reads. */
|
|
143
|
-
interface MenuScope
|
|
148
|
+
interface MenuScope {
|
|
144
149
|
rows: ProjectedRow[];
|
|
145
150
|
label: string;
|
|
146
151
|
x: number;
|
|
@@ -167,7 +172,7 @@ export function placementOf(
|
|
|
167
172
|
* Where a menu with no coordinates of its own opens on an engine that cannot anchor it: below its
|
|
168
173
|
* opener, leading edges aligned — the same corner the placement names.
|
|
169
174
|
*/
|
|
170
|
-
function belowOpener(opener: HTMLElement | null | undefined):
|
|
175
|
+
function belowOpener(opener: HTMLElement | null | undefined): ViewportPoint {
|
|
171
176
|
if (!opener) {
|
|
172
177
|
return { x: 0, y: 0 };
|
|
173
178
|
}
|
|
@@ -205,17 +210,6 @@ function rowById(rows: readonly ProjectedRow[], id: string): ProjectedRow | unde
|
|
|
205
210
|
return undefined;
|
|
206
211
|
}
|
|
207
212
|
|
|
208
|
-
const ZERO_BOX = {
|
|
209
|
-
bottom: 0,
|
|
210
|
-
height: 0,
|
|
211
|
-
left: 0,
|
|
212
|
-
right: 0,
|
|
213
|
-
top: 0,
|
|
214
|
-
width: 0,
|
|
215
|
-
x: 0,
|
|
216
|
-
y: 0,
|
|
217
|
-
} as DOMRect;
|
|
218
|
-
|
|
219
213
|
/**
|
|
220
214
|
* Open a menu.
|
|
221
215
|
*
|
|
@@ -242,15 +236,20 @@ export function openMenu(options: OpenMenuOptions): MenuHandle {
|
|
|
242
236
|
options.onClosed?.(handle);
|
|
243
237
|
};
|
|
244
238
|
|
|
239
|
+
/* `place` is first asked before anything is laid out, so it is handed an empty box: a real
|
|
240
|
+
`DOMRect` whose every edge and dimension is zero. */
|
|
245
241
|
const initial = options.place
|
|
246
|
-
? options.place(
|
|
242
|
+
? options.place(new DOMRect())
|
|
247
243
|
: (options.origin ?? belowOpener(options.opener));
|
|
248
|
-
const scope: MenuScope = reactive({
|
|
244
|
+
const scope: MenuScope = reactive<MenuScope>({
|
|
249
245
|
floor: options.floor?.() ?? 0,
|
|
250
246
|
label: options.label,
|
|
251
247
|
placement: placementOf(options),
|
|
252
248
|
rows: options.rows.map((row) => project(row)),
|
|
253
249
|
select: (_scope: JxScope, event: Event) => {
|
|
250
|
+
/* SAFETY: `menu.json` binds this handler to `onselect` alone, and a row's `select` is raised
|
|
251
|
+
by the runtime's `dispatchEvent` statement in `jx-menu-item.json`, which always constructs
|
|
252
|
+
a `CustomEvent` whose `detail` is the row's value. */
|
|
254
253
|
const id = String((event as CustomEvent).detail);
|
|
255
254
|
const row = rowById(scope.rows, id);
|
|
256
255
|
if (!row) {
|
|
@@ -267,7 +266,7 @@ export function openMenu(options: OpenMenuOptions): MenuHandle {
|
|
|
267
266
|
},
|
|
268
267
|
x: initial.x,
|
|
269
268
|
y: initial.y,
|
|
270
|
-
})
|
|
269
|
+
});
|
|
271
270
|
|
|
272
271
|
/** Put the panel where `place` says, from its box as laid out now. */
|
|
273
272
|
const place = (): void => {
|
|
@@ -279,18 +278,25 @@ export function openMenu(options: OpenMenuOptions): MenuHandle {
|
|
|
279
278
|
scope.y = at.y;
|
|
280
279
|
};
|
|
281
280
|
|
|
281
|
+
/* Read through a call, not the property path: `close()` can abort the controller while the menu
|
|
282
|
+
is awaiting `jx-ready`, and a direct test after that `await` would be narrowed to the value the
|
|
283
|
+
test before it saw. */
|
|
284
|
+
const aborted = (): boolean => controller.signal.aborted;
|
|
285
|
+
|
|
282
286
|
const ready = (async () => {
|
|
283
287
|
const mounted = await mountSurface("menu", scope, slot, { signal: controller.signal });
|
|
284
|
-
if (
|
|
288
|
+
if (aborted()) {
|
|
285
289
|
// Closed before the document finished mounting; the runtime already disposed it.
|
|
286
290
|
return;
|
|
287
291
|
}
|
|
288
292
|
({ dispose } = mounted);
|
|
289
293
|
// The document's root IS the menu, and a custom element connects asynchronously: `jx-ready` is
|
|
290
294
|
// The menu saying its `popover` attribute is on and it may be shown.
|
|
295
|
+
// SAFETY: `menu.json`'s root definition carries `tagName: "jx-menu"`, so the mounted root is
|
|
296
|
+
// The kit's menu element, which reflects `open`, `x` and `y` and inherits `showPopover`.
|
|
291
297
|
menu = mounted.root as MenuElement;
|
|
292
298
|
menu.addEventListener("toggle", (event) => {
|
|
293
|
-
if (
|
|
299
|
+
if (event.newState === "closed") {
|
|
294
300
|
finish();
|
|
295
301
|
}
|
|
296
302
|
});
|
|
@@ -299,7 +305,7 @@ export function openMenu(options: OpenMenuOptions): MenuHandle {
|
|
|
299
305
|
menu!.addEventListener("jx-ready", () => resolve(), { once: true });
|
|
300
306
|
});
|
|
301
307
|
}
|
|
302
|
-
if (
|
|
308
|
+
if (aborted()) {
|
|
303
309
|
return;
|
|
304
310
|
}
|
|
305
311
|
const source =
|
|
@@ -16,14 +16,15 @@
|
|
|
16
16
|
* @docs studio/interface
|
|
17
17
|
*/
|
|
18
18
|
|
|
19
|
+
import { isJsonObject, isString } from "@jxsuite/schema/guards";
|
|
19
20
|
import { reactive } from "../reactivity";
|
|
20
21
|
import { mountSurface, registerSurface } from "../ui/surface";
|
|
21
22
|
import navigatorDockDoc from "./navigator-dock.json";
|
|
22
|
-
import type {
|
|
23
|
+
import type { JsonObject, JxElement } from "@jxsuite/schema/types";
|
|
23
24
|
import type { JxScope } from "@jxsuite/runtime/types";
|
|
24
25
|
import type { SurfaceHandle } from "../ui/surface";
|
|
25
26
|
|
|
26
|
-
registerSurface("navigator-dock", navigatorDockDoc
|
|
27
|
+
registerSurface("navigator-dock", navigatorDockDoc);
|
|
27
28
|
|
|
28
29
|
/** The panel showing, as the document draws it. */
|
|
29
30
|
export interface NavigatorPanelView {
|
|
@@ -65,19 +66,17 @@ export interface NavigatorDockHandle {
|
|
|
65
66
|
dispose: () => void;
|
|
66
67
|
}
|
|
67
68
|
|
|
68
|
-
interface NavigatorDockScope extends Record<string, unknown>, NavigatorDockValues {}
|
|
69
|
-
|
|
70
69
|
/** The `part` a node was declared with, or the empty string. */
|
|
71
70
|
function partOf(def: JxElement | string): string {
|
|
72
|
-
const part =
|
|
73
|
-
return
|
|
71
|
+
const part = isString(def) ? undefined : def.attributes?.["part"];
|
|
72
|
+
return isString(part) ? part : "";
|
|
74
73
|
}
|
|
75
74
|
|
|
76
75
|
/** The `$map` item a node was rendered inside, if it was rendered inside one. */
|
|
77
|
-
function mapItem(state: JxScope | undefined):
|
|
78
|
-
const map = state?.["$map"]
|
|
79
|
-
const item = map
|
|
80
|
-
return item
|
|
76
|
+
function mapItem(state: JxScope | undefined): JsonObject | null {
|
|
77
|
+
const map = state?.["$map"];
|
|
78
|
+
const item = isJsonObject(map) ? map["item"] : undefined;
|
|
79
|
+
return isJsonObject(item) ? item : null;
|
|
81
80
|
}
|
|
82
81
|
|
|
83
82
|
/**
|
|
@@ -91,7 +90,7 @@ export function mountNavigatorDock(
|
|
|
91
90
|
values: NavigatorDockValues,
|
|
92
91
|
options: NavigatorDockOptions,
|
|
93
92
|
): NavigatorDockHandle {
|
|
94
|
-
const scope = reactive<
|
|
93
|
+
const scope: NavigatorDockValues = reactive<NavigatorDockValues>({ panels: values.panels });
|
|
95
94
|
|
|
96
95
|
container.textContent = "";
|
|
97
96
|
// @ts-expect-error -- _$litPart$ is lit's private render-part marker, not in the DOM types
|
|
@@ -105,7 +104,7 @@ export function mountNavigatorDock(
|
|
|
105
104
|
return;
|
|
106
105
|
}
|
|
107
106
|
const key = mapItem(state)?.["key"];
|
|
108
|
-
if (
|
|
107
|
+
if (isString(key)) {
|
|
109
108
|
options.onContent(key, element);
|
|
110
109
|
}
|
|
111
110
|
},
|
|
@@ -31,22 +31,17 @@
|
|
|
31
31
|
* @docs studio/projects/create
|
|
32
32
|
*/
|
|
33
33
|
|
|
34
|
+
import { isString } from "@jxsuite/schema/guards";
|
|
34
35
|
import { reactive } from "../reactivity";
|
|
35
36
|
import { mountSurface, registerSurface } from "../ui/surface";
|
|
36
37
|
import { overlayRegion, REGION_ATTR } from "../ui/regions";
|
|
37
|
-
import { close
|
|
38
|
+
import { close, showModal } from "@jxsuite/ui/behaviors/dialog";
|
|
38
39
|
import { whenReady } from "./dialog";
|
|
39
40
|
import newProjectDoc from "./new-project.json";
|
|
40
|
-
import type { SurfaceHandle } from "../ui/surface";
|
|
41
|
-
import type {
|
|
41
|
+
import type { SurfaceHandle, SurfaceOption } from "../ui/surface";
|
|
42
|
+
import type { JxElement } from "@jxsuite/schema/types";
|
|
42
43
|
|
|
43
|
-
registerSurface("new-project", newProjectDoc
|
|
44
|
-
|
|
45
|
-
/** One row of a kit `jx-select`, and of the tab strip: a value and what it reads. */
|
|
46
|
-
export interface NewProjectRow {
|
|
47
|
-
value: string;
|
|
48
|
-
label: string;
|
|
49
|
-
}
|
|
44
|
+
registerSurface("new-project", newProjectDoc);
|
|
50
45
|
|
|
51
46
|
/** One card in the starter gallery — including the one that is not a starter. */
|
|
52
47
|
export interface NewProjectCard {
|
|
@@ -80,7 +75,7 @@ export interface NewProjectView {
|
|
|
80
75
|
showTabs: boolean;
|
|
81
76
|
/** The chosen tab's value, and the strip's rows. */
|
|
82
77
|
tab: string;
|
|
83
|
-
tabs:
|
|
78
|
+
tabs: SurfaceOption[];
|
|
84
79
|
/** Which body to draw. */
|
|
85
80
|
body: NewProjectBody;
|
|
86
81
|
/** The sentence above a closed AI gate: the two tabs ask for the same thing differently. */
|
|
@@ -110,10 +105,10 @@ export interface NewProjectView {
|
|
|
110
105
|
browsing: boolean;
|
|
111
106
|
browseLabel: string;
|
|
112
107
|
owner: string;
|
|
113
|
-
owners:
|
|
108
|
+
owners: SurfaceOption[];
|
|
114
109
|
/** `"private"` or `"public"` — a value rather than a flag, because a select holds one. */
|
|
115
110
|
visibility: string;
|
|
116
|
-
visibilities:
|
|
111
|
+
visibilities: SurfaceOption[];
|
|
117
112
|
/** The owner already has a repository of this name. Empty says nothing. */
|
|
118
113
|
repoTaken: string;
|
|
119
114
|
/** `Creates` or `Repository`, and the destination itself. */
|
|
@@ -127,12 +122,12 @@ export interface NewProjectView {
|
|
|
127
122
|
maxDepth: string;
|
|
128
123
|
maxPages: string;
|
|
129
124
|
breakpointMode: string;
|
|
130
|
-
breakpointModes:
|
|
125
|
+
breakpointModes: SurfaceOption[];
|
|
131
126
|
breakpointCount: string;
|
|
132
127
|
maxBreakpoints: string;
|
|
133
128
|
breakpointWidths: string;
|
|
134
129
|
breakpointRounding: string;
|
|
135
|
-
roundings:
|
|
130
|
+
roundings: SurfaceOption[];
|
|
136
131
|
/** What the chosen mode says will happen. */
|
|
137
132
|
breakpointHint: string;
|
|
138
133
|
aiNaming: boolean;
|
|
@@ -233,8 +228,7 @@ interface NewProjectFlags {
|
|
|
233
228
|
hasInstallUrl: boolean;
|
|
234
229
|
}
|
|
235
230
|
|
|
236
|
-
interface NewProjectScope
|
|
237
|
-
extends Record<string, unknown>, NewProjectView, NewProjectFlags, NewProjectActions {}
|
|
231
|
+
interface NewProjectScope extends NewProjectView, NewProjectFlags, NewProjectActions {}
|
|
238
232
|
|
|
239
233
|
/** The view plus the flags the document renders from. */
|
|
240
234
|
function derive(view: NewProjectView): NewProjectView & NewProjectFlags {
|
|
@@ -260,8 +254,8 @@ function derive(view: NewProjectView): NewProjectView & NewProjectFlags {
|
|
|
260
254
|
|
|
261
255
|
/** A node's authored `part`, which is how an island announces which one it is. */
|
|
262
256
|
function partOf(def: JxElement | string): string {
|
|
263
|
-
const part =
|
|
264
|
-
return
|
|
257
|
+
const part = isString(def) ? undefined : def.attributes?.["part"];
|
|
258
|
+
return isString(part) ? part : "";
|
|
265
259
|
}
|
|
266
260
|
|
|
267
261
|
/**
|
|
@@ -294,6 +288,10 @@ export function openNewProjectSurface(options: NewProjectSurfaceOptions): NewPro
|
|
|
294
288
|
closed = true;
|
|
295
289
|
options.actions.closed();
|
|
296
290
|
};
|
|
291
|
+
/* Read through a call, not the bare binding: `close()` can run while the mount is awaiting the
|
|
292
|
+
element, and a direct `closed` test after that `await` would be narrowed to the value the test
|
|
293
|
+
before it saw. */
|
|
294
|
+
const isClosed = (): boolean => closed;
|
|
297
295
|
|
|
298
296
|
/** The island boxes the document has announced, by part. Replaced as the bodies come and go. */
|
|
299
297
|
const boxes = new Map<string, HTMLElement>();
|
|
@@ -325,14 +323,14 @@ export function openNewProjectSurface(options: NewProjectSurfaceOptions): NewPro
|
|
|
325
323
|
}
|
|
326
324
|
};
|
|
327
325
|
|
|
328
|
-
const scope = reactive({
|
|
326
|
+
const scope: NewProjectScope = reactive<NewProjectScope>({
|
|
329
327
|
...derive(options.view),
|
|
330
328
|
...options.actions,
|
|
331
329
|
browse: () => {
|
|
332
330
|
options.actions.browse();
|
|
333
331
|
},
|
|
334
332
|
closed: finish,
|
|
335
|
-
})
|
|
333
|
+
});
|
|
336
334
|
|
|
337
335
|
let mounted: SurfaceHandle | null = null;
|
|
338
336
|
const ready = mountSurface("new-project", scope, slot, {
|
|
@@ -345,13 +343,16 @@ export function openNewProjectSurface(options: NewProjectSurfaceOptions): NewPro
|
|
|
345
343
|
},
|
|
346
344
|
}).then(async (surface) => {
|
|
347
345
|
mounted = surface;
|
|
346
|
+
/* SAFETY: `new-project.json`'s root definition carries `tagName: "jx-dialog"`, so the runtime
|
|
347
|
+
mounts an HTMLElement; a `Text` root only comes from a document whose root is a bare
|
|
348
|
+
string. */
|
|
348
349
|
const element = surface.root as HTMLElement;
|
|
349
|
-
if (
|
|
350
|
+
if (isClosed()) {
|
|
350
351
|
surface.dispose();
|
|
351
352
|
return element;
|
|
352
353
|
}
|
|
353
354
|
await whenReady(element);
|
|
354
|
-
if (
|
|
355
|
+
if (isClosed()) {
|
|
355
356
|
return element;
|
|
356
357
|
}
|
|
357
358
|
/* The region goes on the platform's own `<dialog>`, which is the one element here that HAS a
|
|
@@ -375,7 +376,7 @@ export function openNewProjectSurface(options: NewProjectSurfaceOptions): NewPro
|
|
|
375
376
|
const element = mounted?.root;
|
|
376
377
|
if (element instanceof HTMLElement) {
|
|
377
378
|
// The platform's close first, so focus goes back where it came from; then the document.
|
|
378
|
-
|
|
379
|
+
close(element);
|
|
379
380
|
}
|
|
380
381
|
// A mount that has not landed yet is disposed by `ready` when it does — `finish` tells it so.
|
|
381
382
|
mounted?.dispose();
|
|
@@ -394,8 +395,8 @@ export function openNewProjectSurface(options: NewProjectSurfaceOptions): NewPro
|
|
|
394
395
|
move. Measurement and a focus move are the two imperative things a surface may still do
|
|
395
396
|
(ui.md §2 rule 5). */
|
|
396
397
|
requestAnimationFrame(() => {
|
|
397
|
-
element.querySelector('[part="dialog"]')?.scrollTo
|
|
398
|
-
element.querySelector<HTMLElement>('[part="name"] [part="input"]')?.focus
|
|
398
|
+
element.querySelector('[part="dialog"]')?.scrollTo(0, 0);
|
|
399
|
+
element.querySelector<HTMLElement>('[part="name"] [part="input"]')?.focus();
|
|
399
400
|
});
|
|
400
401
|
},
|
|
401
402
|
host: slot,
|
|
@@ -28,21 +28,17 @@
|
|
|
28
28
|
* @docs studio/interface/tabs
|
|
29
29
|
*/
|
|
30
30
|
|
|
31
|
-
import { close
|
|
31
|
+
import { close, openAt } from "@jxsuite/ui/behaviors/popover";
|
|
32
|
+
import { isString } from "@jxsuite/schema/guards";
|
|
32
33
|
import { reactive } from "../reactivity";
|
|
33
34
|
import { mountSurface, registerSurface } from "../ui/surface";
|
|
34
35
|
import { rectOf } from "../utils/geometry";
|
|
35
36
|
import paneContextDoc from "./pane-context.json";
|
|
36
|
-
import type {
|
|
37
|
-
import type { SurfaceHandle } from "../ui/surface";
|
|
37
|
+
import type { JxElement } from "@jxsuite/schema/types";
|
|
38
|
+
import type { SurfaceHandle, SurfaceOption } from "../ui/surface";
|
|
39
|
+
import type { ViewportPoint } from "./menu";
|
|
38
40
|
|
|
39
|
-
registerSurface("pane-context", paneContextDoc
|
|
40
|
-
|
|
41
|
-
/** One row of a `jx-select`: the value it writes and the word it prints. */
|
|
42
|
-
export interface PaneContextOption {
|
|
43
|
-
value: string;
|
|
44
|
-
label: string;
|
|
45
|
-
}
|
|
41
|
+
registerSurface("pane-context", paneContextDoc);
|
|
46
42
|
|
|
47
43
|
/**
|
|
48
44
|
* One segment of a radio group — a size, a scheme, a view, a language.
|
|
@@ -74,7 +70,7 @@ export interface PaneContextParam {
|
|
|
74
70
|
name: string;
|
|
75
71
|
label: string;
|
|
76
72
|
value: string;
|
|
77
|
-
options:
|
|
73
|
+
options: SurfaceOption[];
|
|
78
74
|
}
|
|
79
75
|
|
|
80
76
|
/** One component test prop: a field, and the region id the screenshot pipeline addresses it by. */
|
|
@@ -108,7 +104,7 @@ export interface PaneContextView {
|
|
|
108
104
|
editorMode: "static" | "picker";
|
|
109
105
|
editorLabel: string;
|
|
110
106
|
editorValue: string;
|
|
111
|
-
editorOptions:
|
|
107
|
+
editorOptions: SurfaceOption[];
|
|
112
108
|
|
|
113
109
|
viewState: "shown" | "hidden";
|
|
114
110
|
views: PaneContextChoice[];
|
|
@@ -143,7 +139,7 @@ export interface PaneContextView {
|
|
|
143
139
|
zoomLabel: string;
|
|
144
140
|
fitState: "shown" | "hidden";
|
|
145
141
|
fitValue: string;
|
|
146
|
-
fitOptions:
|
|
142
|
+
fitOptions: SurfaceOption[];
|
|
147
143
|
}
|
|
148
144
|
|
|
149
145
|
/** What a control can ask the pane to do. Every one of them is a decision the flow owns. */
|
|
@@ -205,8 +201,7 @@ interface PopoverState {
|
|
|
205
201
|
resolvingOpen: boolean;
|
|
206
202
|
}
|
|
207
203
|
|
|
208
|
-
interface PaneContextScope
|
|
209
|
-
extends Record<string, unknown>, PaneContextView, PaneContextActions, PopoverState {
|
|
204
|
+
interface PaneContextScope extends PaneContextView, PaneContextActions, PopoverState {
|
|
210
205
|
/** The two panel doors the document calls, which the mount owns rather than the flow. */
|
|
211
206
|
openContext: (anchor: HTMLElement) => void;
|
|
212
207
|
openResolving: (anchor: HTMLElement) => void;
|
|
@@ -307,8 +302,8 @@ export function emptyPaneContextView(): PaneContextView {
|
|
|
307
302
|
* undefined at that moment and the two panels would both be filed under the same empty key.
|
|
308
303
|
*/
|
|
309
304
|
function attrOf(def: JxElement | string, name: string): string {
|
|
310
|
-
const value =
|
|
311
|
-
return
|
|
305
|
+
const value = isString(def) ? undefined : def.attributes?.[name];
|
|
306
|
+
return isString(value) ? value : "";
|
|
312
307
|
}
|
|
313
308
|
|
|
314
309
|
/**
|
|
@@ -325,7 +320,7 @@ function attrOf(def: JxElement | string, name: string): string {
|
|
|
325
320
|
* platform against the trigger it was opened from (ui.md §6) and these coordinates are ignored;
|
|
326
321
|
* they stand for the engines that cannot.
|
|
327
322
|
*/
|
|
328
|
-
function placeBelow(anchor: HTMLElement, panel: HTMLElement | null):
|
|
323
|
+
function placeBelow(anchor: HTMLElement, panel: HTMLElement | null): ViewportPoint {
|
|
329
324
|
const box = rectOf(anchor);
|
|
330
325
|
const width = panel ? rectOf(panel).width : 0;
|
|
331
326
|
const right = Math.max(0, box.right - width);
|
|
@@ -352,7 +347,7 @@ export function mountPaneContextSurface(
|
|
|
352
347
|
module finds an invoker from a panel — so two panes mounting this surface under one id would
|
|
353
348
|
hand the second pane's trigger the first pane's panel. */
|
|
354
349
|
const uid = `pane-context-${paneId}`;
|
|
355
|
-
const scope = reactive<PaneContextScope>({
|
|
350
|
+
const scope: PaneContextScope = reactive<PaneContextScope>({
|
|
356
351
|
...emptyPaneContextView(),
|
|
357
352
|
...actions,
|
|
358
353
|
contextOpen: false,
|
|
@@ -369,7 +364,7 @@ export function mountPaneContextSurface(
|
|
|
369
364
|
resolvingPopoverId: `${uid}-resolving`,
|
|
370
365
|
resolvingX: 0,
|
|
371
366
|
resolvingY: 0,
|
|
372
|
-
})
|
|
367
|
+
});
|
|
373
368
|
project(scope, view);
|
|
374
369
|
|
|
375
370
|
const nodes = new Map<string, HTMLElement>();
|
|
@@ -378,7 +373,7 @@ export function mountPaneContextSurface(
|
|
|
378
373
|
|
|
379
374
|
/** The panel a `data-popover` key names, once the document has drawn it. */
|
|
380
375
|
const panelOf = (kind: "context" | "resolving"): PopoverElement | null =>
|
|
381
|
-
|
|
376
|
+
nodes.get(`popover:${kind}`) ?? null;
|
|
382
377
|
|
|
383
378
|
/**
|
|
384
379
|
* Show a panel from its trigger, positioning it before and after the show.
|
|
@@ -391,7 +386,7 @@ export function mountPaneContextSurface(
|
|
|
391
386
|
if (!panel) {
|
|
392
387
|
return;
|
|
393
388
|
}
|
|
394
|
-
const write = (at:
|
|
389
|
+
const write = (at: ViewportPoint): void => {
|
|
395
390
|
if (kind === "context") {
|
|
396
391
|
scope.contextX = at.x;
|
|
397
392
|
scope.contextY = at.y;
|
|
@@ -418,7 +413,7 @@ export function mountPaneContextSurface(
|
|
|
418
413
|
}
|
|
419
414
|
const panel = panelOf(kind);
|
|
420
415
|
if (panel) {
|
|
421
|
-
|
|
416
|
+
close(panel);
|
|
422
417
|
}
|
|
423
418
|
};
|
|
424
419
|
|
|
@@ -454,7 +449,7 @@ export function mountPaneContextSurface(
|
|
|
454
449
|
`hidePopover()` queues its toggle: `canvas.setResolvingOpen { open: false }` has to be
|
|
455
450
|
true of `isResolvingOpen()` on the line after it, not a task later. */
|
|
456
451
|
element.addEventListener("toggle", (event) => {
|
|
457
|
-
const open =
|
|
452
|
+
const open = event.newState === "open";
|
|
458
453
|
if (kind === "context") {
|
|
459
454
|
scope.contextOpen = open;
|
|
460
455
|
} else {
|
|
@@ -483,7 +478,7 @@ export function mountPaneContextSurface(
|
|
|
483
478
|
},
|
|
484
479
|
/* A mount still in flight has nothing in the host to ask about, and answering "no" would make
|
|
485
480
|
the next repaint tear down the mount it is waiting for and start a second one. */
|
|
486
|
-
connected: () => !disposed && (mounted === null ||
|
|
481
|
+
connected: () => !disposed && (mounted === null || mounted.root.parentNode === host),
|
|
487
482
|
dispose() {
|
|
488
483
|
disposed = true;
|
|
489
484
|
hidePanel("context");
|
|
@@ -23,14 +23,15 @@
|
|
|
23
23
|
* @docs studio/interface
|
|
24
24
|
*/
|
|
25
25
|
|
|
26
|
+
import { isJsonObject, isString } from "@jxsuite/schema/guards";
|
|
26
27
|
import { reactive } from "../reactivity";
|
|
27
28
|
import { mountSurface, registerSurface } from "../ui/surface";
|
|
28
29
|
import paneGridDoc from "./pane-grid.json";
|
|
29
|
-
import type {
|
|
30
|
+
import type { JxElement } from "@jxsuite/schema/types";
|
|
30
31
|
import type { JxScope } from "@jxsuite/runtime/types";
|
|
31
32
|
import type { SurfaceHandle } from "../ui/surface";
|
|
32
33
|
|
|
33
|
-
registerSurface("pane-grid", paneGridDoc
|
|
34
|
+
registerSurface("pane-grid", paneGridDoc);
|
|
34
35
|
|
|
35
36
|
/**
|
|
36
37
|
* The `part` a pane's CELL carries.
|
|
@@ -80,7 +81,7 @@ const CELL_PARTS: ReadonlyMap<string, PaneCellPart> = new Map([
|
|
|
80
81
|
* Every field is a finished value. The document asks no question about a pane — not which index it
|
|
81
82
|
* is at, not how many there are — so a projection cannot disagree with what is drawn.
|
|
82
83
|
*/
|
|
83
|
-
export interface PaneGridRow
|
|
84
|
+
export interface PaneGridRow {
|
|
84
85
|
/** The pane id. The repeater's key, and what every action is addressed with. */
|
|
85
86
|
id: string;
|
|
86
87
|
/** `"shown"` for every row but the first. The `$switch` the leading splitter hangs off. */
|
|
@@ -165,7 +166,7 @@ export interface PaneGridSurface {
|
|
|
165
166
|
}
|
|
166
167
|
|
|
167
168
|
/** The scope `pane-grid.json` reads. */
|
|
168
|
-
interface PaneGridScope extends
|
|
169
|
+
interface PaneGridScope extends PaneGridDragState {
|
|
169
170
|
rows: PaneGridRow[];
|
|
170
171
|
/** `jx-split`'s `value`. */
|
|
171
172
|
paneSplit: number;
|
|
@@ -180,8 +181,8 @@ interface PaneGridScope extends Record<string, unknown>, PaneGridDragState {
|
|
|
180
181
|
|
|
181
182
|
/** The `part` a node's definition carries, or `""` for a text node or an unmarked element. */
|
|
182
183
|
function partOf(def: JxElement | string): string {
|
|
183
|
-
const part =
|
|
184
|
-
return
|
|
184
|
+
const part = isString(def) ? undefined : def.attributes?.["part"];
|
|
185
|
+
return isString(part) ? part : "";
|
|
185
186
|
}
|
|
186
187
|
|
|
187
188
|
/**
|
|
@@ -192,8 +193,10 @@ function partOf(def: JxElement | string): string {
|
|
|
192
193
|
* object the projection put in `rows`.
|
|
193
194
|
*/
|
|
194
195
|
function paneOf(state: JxScope | undefined): string {
|
|
195
|
-
const
|
|
196
|
-
|
|
196
|
+
const map = state?.["$map"];
|
|
197
|
+
const row = isJsonObject(map) ? map["item"] : undefined;
|
|
198
|
+
const id = isJsonObject(row) ? row["id"] : undefined;
|
|
199
|
+
return isString(id) ? id : "";
|
|
197
200
|
}
|
|
198
201
|
|
|
199
202
|
/**
|
|
@@ -215,7 +218,7 @@ export function mountPaneGridSurface(
|
|
|
215
218
|
actions: PaneGridActions,
|
|
216
219
|
): PaneGridSurface {
|
|
217
220
|
host.replaceChildren();
|
|
218
|
-
const scope = reactive<PaneGridScope>({
|
|
221
|
+
const scope: PaneGridScope = reactive<PaneGridScope>({
|
|
219
222
|
armed: false,
|
|
220
223
|
edgePane: "",
|
|
221
224
|
move: actions.move,
|
|
@@ -226,7 +229,7 @@ export function mountPaneGridSurface(
|
|
|
226
229
|
splitGap: split.gap,
|
|
227
230
|
splitMax: split.max,
|
|
228
231
|
splitMin: split.min,
|
|
229
|
-
})
|
|
232
|
+
});
|
|
230
233
|
|
|
231
234
|
let mounted: SurfaceHandle | null = null;
|
|
232
235
|
let disposed = false;
|
|
@@ -239,6 +242,8 @@ export function mountPaneGridSurface(
|
|
|
239
242
|
onNodeCreated: (element, _path, def, state) => {
|
|
240
243
|
const cellPart = CELL_PARTS.get(partOf(def));
|
|
241
244
|
if (cellPart) {
|
|
245
|
+
/* SAFETY: `pane-grid.json` declares no text children and no SVG, so every node carrying
|
|
246
|
+
one of the five cell parts is an HTML element the runtime created from a tagName. */
|
|
242
247
|
actions.cellPart(paneOf(state), cellPart, element as HTMLElement);
|
|
243
248
|
}
|
|
244
249
|
},
|
|
@@ -31,10 +31,9 @@ import { effect, effectScope, reactive } from "../reactivity";
|
|
|
31
31
|
import { mountSurface, registerSurface } from "../ui/surface";
|
|
32
32
|
import activityDoc from "./panel-activity.json";
|
|
33
33
|
import type { EffectScope } from "@vue/reactivity";
|
|
34
|
-
import type { JxDocument } from "@jxsuite/schema/types";
|
|
35
34
|
import type { SurfaceHandle } from "../ui/surface";
|
|
36
35
|
|
|
37
|
-
registerSurface("panel-activity", activityDoc
|
|
36
|
+
registerSurface("panel-activity", activityDoc);
|
|
38
37
|
|
|
39
38
|
/** One declared phase of an operation, as the surface reads it. */
|
|
40
39
|
export interface ActivityStepView {
|
|
@@ -98,7 +97,7 @@ export interface ActivitySurfaceDeps {
|
|
|
98
97
|
}
|
|
99
98
|
|
|
100
99
|
/** The scope the document reads: the projection, flattened, beside the three callbacks. */
|
|
101
|
-
interface ActivityScope
|
|
100
|
+
interface ActivityScope {
|
|
102
101
|
rows: ActivityRowView[];
|
|
103
102
|
hasRows: boolean;
|
|
104
103
|
hasFinished: boolean;
|
|
@@ -127,7 +126,7 @@ function standingIn(container: HTMLElement): boolean {
|
|
|
127
126
|
return false;
|
|
128
127
|
}
|
|
129
128
|
// Still mounting into this very container: a second call must not start a second mount.
|
|
130
|
-
return _handle === null ? _mount !== null :
|
|
129
|
+
return _handle === null ? _mount !== null : _handle.root.parentNode === container;
|
|
131
130
|
}
|
|
132
131
|
|
|
133
132
|
/**
|
|
@@ -142,7 +141,7 @@ export function mountActivitySurface(container: HTMLElement, deps: ActivitySurfa
|
|
|
142
141
|
}
|
|
143
142
|
disposeActivitySurface();
|
|
144
143
|
_container = container;
|
|
145
|
-
const scope = reactive<ActivityScope>({
|
|
144
|
+
const scope: ActivityScope = reactive<ActivityScope>({
|
|
146
145
|
cancel: deps.cancel,
|
|
147
146
|
clearFinished: deps.clearFinished,
|
|
148
147
|
clearLabel: "",
|
|
@@ -150,7 +149,7 @@ export function mountActivitySurface(container: HTMLElement, deps: ActivitySurfa
|
|
|
150
149
|
hasRows: false,
|
|
151
150
|
rows: [],
|
|
152
151
|
toggleLog: deps.toggleLog,
|
|
153
|
-
})
|
|
152
|
+
});
|
|
154
153
|
_scope = effectScope();
|
|
155
154
|
_scope.run(() => {
|
|
156
155
|
effect(() => {
|
|
@@ -22,10 +22,9 @@
|
|
|
22
22
|
import { reactive } from "../reactivity";
|
|
23
23
|
import { mountSurface, registerSurface } from "../ui/surface";
|
|
24
24
|
import dataTreeDoc from "./panel-data.json";
|
|
25
|
-
import type { JxDocument } from "@jxsuite/schema/types";
|
|
26
25
|
import type { SurfaceHandle } from "../ui/surface";
|
|
27
26
|
|
|
28
|
-
registerSurface("panel-data", dataTreeDoc
|
|
27
|
+
registerSurface("panel-data", dataTreeDoc);
|
|
29
28
|
|
|
30
29
|
/**
|
|
31
30
|
* One line of a value tree, as the document reads it.
|
|
@@ -69,7 +68,7 @@ export interface DataTreeActions {
|
|
|
69
68
|
}
|
|
70
69
|
|
|
71
70
|
/** The scope the document reads. */
|
|
72
|
-
interface DataTreeScope extends
|
|
71
|
+
interface DataTreeScope extends DataTreeActions {
|
|
73
72
|
rows: DataTreeRow[];
|
|
74
73
|
}
|
|
75
74
|
|
|
@@ -113,7 +112,7 @@ export function renderDataTreeSurface(
|
|
|
113
112
|
}
|
|
114
113
|
takeDown(host, existing);
|
|
115
114
|
host.textContent = "";
|
|
116
|
-
const scope = reactive({ rows, showMore: actions.showMore })
|
|
115
|
+
const scope: DataTreeScope = reactive<DataTreeScope>({ rows, showMore: actions.showMore });
|
|
117
116
|
const record: Mounted = { disposed: false, handle: null, scope };
|
|
118
117
|
mounts.set(host, record);
|
|
119
118
|
/* No race to arbitrate: a repaint arriving while this is in flight takes the branch above — a
|