@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
|
@@ -15,23 +15,14 @@
|
|
|
15
15
|
* @docs studio/interface
|
|
16
16
|
*/
|
|
17
17
|
|
|
18
|
+
import { isString } from "@jxsuite/schema/guards";
|
|
18
19
|
import { reactive } from "../reactivity";
|
|
19
20
|
import { mountSurface, registerSurface } from "../ui/surface";
|
|
20
21
|
import bottomDockDoc from "./bottom-dock.json";
|
|
21
|
-
import type {
|
|
22
|
-
import type { SurfaceHandle } from "../ui/surface";
|
|
22
|
+
import type { JxElement } from "@jxsuite/schema/types";
|
|
23
|
+
import type { SurfaceHandle, SurfaceTab } from "../ui/surface";
|
|
23
24
|
|
|
24
|
-
registerSurface("bottom-dock", bottomDockDoc
|
|
25
|
-
|
|
26
|
-
/** One tab of the strip, as the document draws it. */
|
|
27
|
-
export interface BottomTabView {
|
|
28
|
-
/** The panel id — the row's identity, the strip's `selected` value, and `data-tab`. */
|
|
29
|
-
key: string;
|
|
30
|
-
/** The record's title with its badge already appended ("Problems 2"). */
|
|
31
|
-
label: string;
|
|
32
|
-
/** The tab element's own id, which the one panel names as its `aria-labelledby`. */
|
|
33
|
-
tabId: string;
|
|
34
|
-
}
|
|
25
|
+
registerSurface("bottom-dock", bottomDockDoc);
|
|
35
26
|
|
|
36
27
|
/** What the dock says right now. */
|
|
37
28
|
export interface BottomDockValues {
|
|
@@ -41,7 +32,7 @@ export interface BottomDockValues {
|
|
|
41
32
|
tabId: string;
|
|
42
33
|
/** `dock.bottom/panel:<id>`, or empty when no tab is showing and the body has no identity. */
|
|
43
34
|
bodyRegion: string;
|
|
44
|
-
tabs:
|
|
35
|
+
tabs: SurfaceTab[];
|
|
45
36
|
}
|
|
46
37
|
|
|
47
38
|
export interface BottomDockActions {
|
|
@@ -62,7 +53,7 @@ export interface BottomDockHandle {
|
|
|
62
53
|
dispose: () => void;
|
|
63
54
|
}
|
|
64
55
|
|
|
65
|
-
interface BottomDockScope extends
|
|
56
|
+
interface BottomDockScope extends BottomDockValues, BottomDockActions {}
|
|
66
57
|
|
|
67
58
|
function project(scope: BottomDockScope, values: BottomDockValues): void {
|
|
68
59
|
scope.tab = values.tab;
|
|
@@ -73,8 +64,8 @@ function project(scope: BottomDockScope, values: BottomDockValues): void {
|
|
|
73
64
|
|
|
74
65
|
/** The `part` a node was declared with, or the empty string. */
|
|
75
66
|
function partOf(def: JxElement | string): string {
|
|
76
|
-
const part =
|
|
77
|
-
return
|
|
67
|
+
const part = isString(def) ? undefined : def.attributes?.["part"];
|
|
68
|
+
return isString(part) ? part : "";
|
|
78
69
|
}
|
|
79
70
|
|
|
80
71
|
/**
|
|
@@ -90,7 +81,7 @@ export function mountBottomDockSurface(
|
|
|
90
81
|
actions: BottomDockActions,
|
|
91
82
|
options: BottomDockOptions,
|
|
92
83
|
): BottomDockHandle {
|
|
93
|
-
const scope = reactive<BottomDockScope>({ ...values, ...actions })
|
|
84
|
+
const scope: BottomDockScope = reactive<BottomDockScope>({ ...values, ...actions });
|
|
94
85
|
|
|
95
86
|
container.textContent = "";
|
|
96
87
|
// @ts-expect-error -- _$litPart$ is lit's private render-part marker, not in the DOM types
|
|
@@ -29,14 +29,15 @@
|
|
|
29
29
|
* @docs studio/interface/canvas
|
|
30
30
|
*/
|
|
31
31
|
|
|
32
|
+
import { isJsonObject, isString } from "@jxsuite/schema/guards";
|
|
32
33
|
import { reactive } from "../reactivity";
|
|
33
34
|
import { mountSurface, registerSurface } from "../ui/surface";
|
|
34
35
|
import canvasStageDoc from "./canvas-stage.json";
|
|
35
|
-
import type {
|
|
36
|
+
import type { JxElement } from "@jxsuite/schema/types";
|
|
36
37
|
import type { JxScope } from "@jxsuite/runtime/types";
|
|
37
38
|
import type { SurfaceHandle } from "../ui/surface";
|
|
38
39
|
|
|
39
|
-
registerSurface("canvas-stage", canvasStageDoc
|
|
40
|
+
registerSurface("canvas-stage", canvasStageDoc);
|
|
40
41
|
|
|
41
42
|
/** One artboard, as the document reads it. Every field is already a string or a boolean. */
|
|
42
43
|
export interface CanvasStagePanelItem {
|
|
@@ -104,7 +105,7 @@ export interface CanvasStageHandle {
|
|
|
104
105
|
}
|
|
105
106
|
|
|
106
107
|
/** The scope the document reads: {@link CanvasStageView} plus the one control it draws. */
|
|
107
|
-
interface CanvasStageScope extends
|
|
108
|
+
interface CanvasStageScope extends CanvasStageView {
|
|
108
109
|
pickPanel: (key: string) => void;
|
|
109
110
|
}
|
|
110
111
|
|
|
@@ -117,16 +118,16 @@ interface CanvasStageScope extends Record<string, unknown>, CanvasStageView {
|
|
|
117
118
|
* `data-side` tells the two width handles apart — the one part the document draws twice.
|
|
118
119
|
*/
|
|
119
120
|
function attrOf(def: JxElement | string, name: string): string {
|
|
120
|
-
const value =
|
|
121
|
-
return
|
|
121
|
+
const value = isString(def) ? undefined : def.attributes?.[name];
|
|
122
|
+
return isString(value) ? value : "";
|
|
122
123
|
}
|
|
123
124
|
|
|
124
125
|
/** The `key` of the `$map` item a node was rendered inside, or "". */
|
|
125
126
|
function itemKey(state: JxScope | undefined): string {
|
|
126
|
-
const
|
|
127
|
-
const
|
|
128
|
-
|
|
129
|
-
return
|
|
127
|
+
const map = state?.["$map"];
|
|
128
|
+
const item = isJsonObject(map) ? map["item"] : undefined;
|
|
129
|
+
const key = isJsonObject(item) ? item["key"] : "";
|
|
130
|
+
return isString(key) ? key : "";
|
|
130
131
|
}
|
|
131
132
|
|
|
132
133
|
/** The three parts an artboard is made of; everything else is a singleton host. */
|
|
@@ -180,7 +181,7 @@ export function mountCanvasStage(
|
|
|
180
181
|
"the iframe survives" means — so the record a fresh render builds is filled from here rather
|
|
181
182
|
than from a callback that will not fire again. */
|
|
182
183
|
const boards = new Map<string, Map<string, HTMLElement>>();
|
|
183
|
-
const scope = reactive<CanvasStageScope>({
|
|
184
|
+
const scope: CanvasStageScope = reactive<CanvasStageScope>({
|
|
184
185
|
frame: "boards",
|
|
185
186
|
framePart: "panzoom",
|
|
186
187
|
frameVars: "",
|
|
@@ -190,7 +191,7 @@ export function mountCanvasStage(
|
|
|
190
191
|
lead: "none",
|
|
191
192
|
panels: [],
|
|
192
193
|
pickPanel: actions.pickPanel,
|
|
193
|
-
})
|
|
194
|
+
});
|
|
194
195
|
project(scope, view);
|
|
195
196
|
|
|
196
197
|
let mounted: SurfaceHandle | null = null;
|
|
@@ -25,25 +25,19 @@
|
|
|
25
25
|
import { reactive } from "../reactivity";
|
|
26
26
|
import { mountSurface, registerSurface } from "../ui/surface";
|
|
27
27
|
import { overlayRegion, REGION_ATTR } from "../ui/regions";
|
|
28
|
-
import { close
|
|
28
|
+
import { close, showModal } from "@jxsuite/ui/behaviors/dialog";
|
|
29
29
|
import { whenReady } from "./dialog";
|
|
30
30
|
import pickerDoc from "./cf-account-picker.json";
|
|
31
31
|
import type { SurfaceHandle } from "../ui/surface";
|
|
32
|
-
import type {
|
|
32
|
+
import type { CfAccount } from "../publish/pages-service";
|
|
33
33
|
|
|
34
|
-
registerSurface("cf-account-picker", pickerDoc
|
|
35
|
-
|
|
36
|
-
/** One account the grant reaches, as the list draws it. */
|
|
37
|
-
export interface CfAccountPickerRow {
|
|
38
|
-
id: string;
|
|
39
|
-
name: string;
|
|
40
|
-
}
|
|
34
|
+
registerSurface("cf-account-picker", pickerDoc);
|
|
41
35
|
|
|
42
36
|
/** What the flow knows. Every one of these may change while the dialog is up. */
|
|
43
37
|
export interface CfAccountPickerView {
|
|
44
38
|
/** The listing is in flight. Its own state, because "not yet asked" is not "reaches nothing". */
|
|
45
39
|
loading: boolean;
|
|
46
|
-
accounts:
|
|
40
|
+
accounts: CfAccount[];
|
|
47
41
|
/** The last refusal — a listing that failed, or an account the broker would not accept. */
|
|
48
42
|
failure: string;
|
|
49
43
|
/** The id being committed, so its own row can say so rather than the whole list going grey. */
|
|
@@ -88,15 +82,14 @@ interface CfAccountPickerFlags {
|
|
|
88
82
|
}
|
|
89
83
|
|
|
90
84
|
/** One row, as the document reads it: what it says, and whether it may be pressed. */
|
|
91
|
-
interface CfAccountPickerScopeRow extends
|
|
85
|
+
interface CfAccountPickerScopeRow extends CfAccount {
|
|
92
86
|
/** This row's own button text — "Selecting…" while it is the one being committed. */
|
|
93
87
|
label: string;
|
|
94
88
|
/** Every row is disabled while any commit is in flight: one answer at a time. */
|
|
95
89
|
busy: boolean;
|
|
96
90
|
}
|
|
97
91
|
|
|
98
|
-
interface CfAccountPickerScope
|
|
99
|
-
extends Record<string, unknown>, CfAccountPickerView, CfAccountPickerFlags {
|
|
92
|
+
interface CfAccountPickerScope extends CfAccountPickerView, CfAccountPickerFlags {
|
|
100
93
|
choose: (id: string) => void;
|
|
101
94
|
retry: () => void;
|
|
102
95
|
closed: () => void;
|
|
@@ -150,8 +143,12 @@ export function openCfAccountPickerSurface(options: CfAccountPickerOptions): CfA
|
|
|
150
143
|
closed = true;
|
|
151
144
|
options.onClosed();
|
|
152
145
|
};
|
|
146
|
+
/* Read through a call, not the bare binding: `close()` can run while the mount is awaiting the
|
|
147
|
+
element, and a direct `closed` test after that `await` would be narrowed to the value the test
|
|
148
|
+
before it saw. */
|
|
149
|
+
const isClosed = (): boolean => closed;
|
|
153
150
|
|
|
154
|
-
const scope = reactive({
|
|
151
|
+
const scope: CfAccountPickerScope = reactive<CfAccountPickerScope>({
|
|
155
152
|
...derive({ accounts: [], choosing: "", failure: "", loading: true }),
|
|
156
153
|
choose: (id: string) => {
|
|
157
154
|
options.onChoose(id);
|
|
@@ -160,18 +157,20 @@ export function openCfAccountPickerSurface(options: CfAccountPickerOptions): CfA
|
|
|
160
157
|
retry: () => {
|
|
161
158
|
options.onRetry();
|
|
162
159
|
},
|
|
163
|
-
})
|
|
160
|
+
});
|
|
164
161
|
|
|
165
162
|
let mounted: SurfaceHandle | null = null;
|
|
166
163
|
const ready = mountSurface("cf-account-picker", scope, slot).then(async (surface) => {
|
|
167
164
|
mounted = surface;
|
|
165
|
+
/* SAFETY: `cf-account-picker.json`'s root definition is a `jx-dialog` element, so the runtime
|
|
166
|
+
mounts an HTMLElement; a `Text` root only comes from a document whose root is a bare string. */
|
|
168
167
|
const element = surface.root as HTMLElement;
|
|
169
|
-
if (
|
|
168
|
+
if (isClosed()) {
|
|
170
169
|
surface.dispose();
|
|
171
170
|
return element;
|
|
172
171
|
}
|
|
173
172
|
await whenReady(element);
|
|
174
|
-
if (
|
|
173
|
+
if (isClosed()) {
|
|
175
174
|
return element;
|
|
176
175
|
}
|
|
177
176
|
showModal(element);
|
|
@@ -186,7 +185,7 @@ export function openCfAccountPickerSurface(options: CfAccountPickerOptions): CfA
|
|
|
186
185
|
const element = mounted?.root;
|
|
187
186
|
if (element instanceof HTMLElement) {
|
|
188
187
|
// The platform's close first, so focus goes back where it came from; then the document.
|
|
189
|
-
|
|
188
|
+
close(element);
|
|
190
189
|
}
|
|
191
190
|
mounted?.dispose();
|
|
192
191
|
mounted = null;
|
|
@@ -57,9 +57,8 @@ import type { Tab } from "../tabs/tab";
|
|
|
57
57
|
import type { SiteBuildResult, SitePreviewResult, StudioPlatform } from "../types";
|
|
58
58
|
import type { CommandRegistry } from "../commands/registry";
|
|
59
59
|
import type { EffectScope } from "@vue/reactivity";
|
|
60
|
-
import type { JxDocument } from "@jxsuite/schema/types";
|
|
61
60
|
|
|
62
|
-
registerSurface("commandbar", commandbarDoc
|
|
61
|
+
registerSurface("commandbar", commandbarDoc);
|
|
63
62
|
|
|
64
63
|
/**
|
|
65
64
|
* What the Command Bar is handed at mount.
|
|
@@ -146,7 +145,7 @@ export interface SegmentProjection {
|
|
|
146
145
|
export type WindowControlLayout = "none" | "mac" | "other";
|
|
147
146
|
|
|
148
147
|
/** The document's scope: the projections, and the host functions its handlers `call`. */
|
|
149
|
-
interface CommandBarScope
|
|
148
|
+
interface CommandBarScope {
|
|
150
149
|
csd: WindowControlLayout;
|
|
151
150
|
menuVisible: boolean;
|
|
152
151
|
menuOpen: boolean;
|
|
@@ -262,7 +261,7 @@ export function openInBrowserTarget(tab: Tab | null): BrowserTarget {
|
|
|
262
261
|
}
|
|
263
262
|
const params = dynamicRouteParams(documentPath);
|
|
264
263
|
if (params.length > 0) {
|
|
265
|
-
const chosen =
|
|
264
|
+
const chosen: Record<string, string> = tab?.session.ui.previewParams ?? {};
|
|
266
265
|
const missing = params.filter((name) => !chosen[name]);
|
|
267
266
|
if (missing.length > 0) {
|
|
268
267
|
const names = missing.map((name) => `:${name}`).join(", ");
|
|
@@ -482,8 +481,8 @@ const BUILD_SITE = "project.buildSite";
|
|
|
482
481
|
const OPEN_IN_BROWSER = "view.openInBrowser";
|
|
483
482
|
|
|
484
483
|
/** The sentence in an unknown thrown value. */
|
|
485
|
-
function errorText(
|
|
486
|
-
return
|
|
484
|
+
function errorText(cause: unknown): string {
|
|
485
|
+
return cause instanceof Error ? cause.message : String(cause);
|
|
487
486
|
}
|
|
488
487
|
|
|
489
488
|
/** The document's label: its path without the project root, which is already segment one. */
|
|
@@ -546,8 +545,14 @@ interface WindowControls {
|
|
|
546
545
|
}
|
|
547
546
|
|
|
548
547
|
function windowControls(): WindowControls | undefined {
|
|
549
|
-
|
|
550
|
-
|
|
548
|
+
const platform = globalThis.__jxPlatform;
|
|
549
|
+
if (platform == null || !("windowControls" in platform)) {
|
|
550
|
+
return undefined;
|
|
551
|
+
}
|
|
552
|
+
/* SAFETY: the PAL interface deliberately leaves `windowControls` undeclared; the one adapter that
|
|
553
|
+
adds it is the desktop launcher's (`packages/desktop/src/platform.ts`), whose object carries the
|
|
554
|
+
`close`, `maximize` and `minimize` functions this bar calls. */
|
|
555
|
+
return platform.windowControls as WindowControls | undefined;
|
|
551
556
|
}
|
|
552
557
|
|
|
553
558
|
// ─── The Command Center pill, the layout tabs and the docks, projected ───────
|
|
@@ -769,7 +774,7 @@ function state(): CommandBarScope {
|
|
|
769
774
|
windowControl: (action) => {
|
|
770
775
|
windowControls()?.[action]();
|
|
771
776
|
},
|
|
772
|
-
})
|
|
777
|
+
});
|
|
773
778
|
return _state;
|
|
774
779
|
}
|
|
775
780
|
|
|
@@ -25,14 +25,13 @@
|
|
|
25
25
|
import { reactive } from "../reactivity";
|
|
26
26
|
import { mountSurface, registerSurface } from "../ui/surface";
|
|
27
27
|
import { overlayRegion, REGION_ATTR } from "../ui/regions";
|
|
28
|
-
import { close
|
|
28
|
+
import { close, showModal } from "@jxsuite/ui/behaviors/dialog";
|
|
29
29
|
import { selectValue } from "@jxsuite/ui/behaviors/textfield";
|
|
30
30
|
import { whenReady } from "./dialog";
|
|
31
31
|
import convertRepeaterDoc from "./convert-repeater.json";
|
|
32
|
-
import type { SurfaceHandle } from "../ui/surface";
|
|
33
|
-
import type { JxDocument } from "@jxsuite/schema/types";
|
|
32
|
+
import type { SurfaceHandle, SurfaceOption } from "../ui/surface";
|
|
34
33
|
|
|
35
|
-
registerSurface("convert-repeater", convertRepeaterDoc
|
|
34
|
+
registerSurface("convert-repeater", convertRepeaterDoc);
|
|
36
35
|
|
|
37
36
|
/**
|
|
38
37
|
* The items-source row that is not a definition: pick it and the dialog asks for a name instead.
|
|
@@ -42,12 +41,6 @@ registerSurface("convert-repeater", convertRepeaterDoc as unknown as JxDocument)
|
|
|
42
41
|
*/
|
|
43
42
|
export const CREATE_NEW_SOURCE = "__new__";
|
|
44
43
|
|
|
45
|
-
/** One row of either picker. */
|
|
46
|
-
export interface ConvertRepeaterOption {
|
|
47
|
-
value: string;
|
|
48
|
-
label: string;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
44
|
/** What the flow knows. Every one of these may change while the dialog is up. */
|
|
52
45
|
export interface ConvertRepeaterView {
|
|
53
46
|
/** State definitions that hold an array, in the order they were found. */
|
|
@@ -97,9 +90,9 @@ export interface ConvertRepeaterSurfaceHandle {
|
|
|
97
90
|
/** What the document discriminates on, and the rows it maps. Derived, never handed in. */
|
|
98
91
|
interface ConvertRepeaterFlags {
|
|
99
92
|
/** The source picker's rows: every array definition, then `Create new…`. */
|
|
100
|
-
sourceOptions:
|
|
93
|
+
sourceOptions: SurfaceOption[];
|
|
101
94
|
/** The filter and sort pickers' rows: `None`, then every function definition. */
|
|
102
|
-
functionOptions:
|
|
95
|
+
functionOptions: SurfaceOption[];
|
|
103
96
|
/** The chosen source is the sentinel, so the name field is drawn. */
|
|
104
97
|
creating: boolean;
|
|
105
98
|
/** There is at least one function to offer, so the two optional rows are drawn. */
|
|
@@ -108,8 +101,7 @@ interface ConvertRepeaterFlags {
|
|
|
108
101
|
invalid: boolean;
|
|
109
102
|
}
|
|
110
103
|
|
|
111
|
-
interface ConvertRepeaterScope
|
|
112
|
-
extends Record<string, unknown>, ConvertRepeaterView, ConvertRepeaterFlags {
|
|
104
|
+
interface ConvertRepeaterScope extends ConvertRepeaterView, ConvertRepeaterFlags {
|
|
113
105
|
pickSource: (value: string) => void;
|
|
114
106
|
setName: (value: string) => void;
|
|
115
107
|
pickFilter: (value: string) => void;
|
|
@@ -163,8 +155,12 @@ export function openConvertRepeaterSurface(
|
|
|
163
155
|
closed = true;
|
|
164
156
|
options.onClosed();
|
|
165
157
|
};
|
|
158
|
+
/* Read through a call, not the bare binding: `close()` can run while the mount is awaiting the
|
|
159
|
+
element, and a direct `closed` test after that `await` would be narrowed to the value the test
|
|
160
|
+
before it saw. */
|
|
161
|
+
const isClosed = (): boolean => closed;
|
|
166
162
|
|
|
167
|
-
const scope = reactive({
|
|
163
|
+
const scope: ConvertRepeaterScope = reactive<ConvertRepeaterScope>({
|
|
168
164
|
...derive(options.view),
|
|
169
165
|
closed: finish,
|
|
170
166
|
confirm: () => {
|
|
@@ -191,7 +187,7 @@ export function openConvertRepeaterSurface(
|
|
|
191
187
|
scope.newName = value;
|
|
192
188
|
options.onName(value);
|
|
193
189
|
},
|
|
194
|
-
})
|
|
190
|
+
});
|
|
195
191
|
|
|
196
192
|
let mounted: SurfaceHandle | null = null;
|
|
197
193
|
|
|
@@ -218,13 +214,15 @@ export function openConvertRepeaterSurface(
|
|
|
218
214
|
|
|
219
215
|
const ready = mountSurface("convert-repeater", scope, slot).then(async (surface) => {
|
|
220
216
|
mounted = surface;
|
|
217
|
+
/* SAFETY: `convert-repeater.json`'s root definition is a `jx-dialog` element, so the runtime
|
|
218
|
+
mounts an HTMLElement; a `Text` root only comes from a document whose root is a bare string. */
|
|
221
219
|
const element = surface.root as HTMLElement;
|
|
222
|
-
if (
|
|
220
|
+
if (isClosed()) {
|
|
223
221
|
surface.dispose();
|
|
224
222
|
return element;
|
|
225
223
|
}
|
|
226
224
|
await whenReady(element);
|
|
227
|
-
if (
|
|
225
|
+
if (isClosed()) {
|
|
228
226
|
return element;
|
|
229
227
|
}
|
|
230
228
|
showModal(element);
|
|
@@ -243,7 +241,7 @@ export function openConvertRepeaterSurface(
|
|
|
243
241
|
const element = mounted?.root;
|
|
244
242
|
if (element instanceof HTMLElement) {
|
|
245
243
|
// The platform's close first, so focus goes back where it came from; then the document.
|
|
246
|
-
|
|
244
|
+
close(element);
|
|
247
245
|
}
|
|
248
246
|
// A mount that has not landed yet is disposed by `ready` when it does — `finish` tells it so.
|
|
249
247
|
mounted?.dispose();
|
|
@@ -18,10 +18,9 @@
|
|
|
18
18
|
import { reactive } from "../reactivity";
|
|
19
19
|
import { mountSurface, registerSurface } from "../ui/surface";
|
|
20
20
|
import dataActionsDoc from "./data-actions.json";
|
|
21
|
-
import type { JxDocument } from "@jxsuite/schema/types";
|
|
22
21
|
import type { SurfaceHandle } from "../ui/surface";
|
|
23
22
|
|
|
24
|
-
registerSurface("data-actions", dataActionsDoc
|
|
23
|
+
registerSurface("data-actions", dataActionsDoc);
|
|
25
24
|
|
|
26
25
|
/** Everything the row draws. */
|
|
27
26
|
export interface DataActionsView {
|
|
@@ -52,7 +51,7 @@ export interface DataActionsSurfaceHandle {
|
|
|
52
51
|
dispose: () => void;
|
|
53
52
|
}
|
|
54
53
|
|
|
55
|
-
interface DataActionsScope extends
|
|
54
|
+
interface DataActionsScope extends DataActionsView, DataActionsCallbacks {}
|
|
56
55
|
|
|
57
56
|
/** Write a projection into the scope. */
|
|
58
57
|
function project(scope: DataActionsScope, view: DataActionsView): void {
|
|
@@ -78,7 +77,7 @@ export function mountDataActionsSurface(
|
|
|
78
77
|
view: DataActionsView,
|
|
79
78
|
actions: DataActionsCallbacks,
|
|
80
79
|
): DataActionsSurfaceHandle {
|
|
81
|
-
const scope = reactive<DataActionsScope>({
|
|
80
|
+
const scope: DataActionsScope = reactive<DataActionsScope>({
|
|
82
81
|
openGrid: actions.openGrid,
|
|
83
82
|
push: actions.push,
|
|
84
83
|
resultOk: "false",
|
|
@@ -89,18 +88,21 @@ export function mountDataActionsSurface(
|
|
|
89
88
|
testDisabled: false,
|
|
90
89
|
testLabel: "Test Connection",
|
|
91
90
|
testState: "hidden",
|
|
92
|
-
})
|
|
91
|
+
});
|
|
93
92
|
project(scope, view);
|
|
94
93
|
|
|
95
94
|
let mounted: SurfaceHandle | null = null;
|
|
96
95
|
let disposed = false;
|
|
97
96
|
const ready = mountSurface("data-actions", scope, host).then((surface) => {
|
|
97
|
+
/* SAFETY: `data-actions.json`'s root definition is a `div` element, so the runtime mounts an
|
|
98
|
+
HTMLElement; a `Text` root only comes from a document whose root is a bare string. */
|
|
99
|
+
const root = surface.root as HTMLElement;
|
|
98
100
|
if (disposed) {
|
|
99
101
|
surface.dispose();
|
|
100
|
-
return
|
|
102
|
+
return root;
|
|
101
103
|
}
|
|
102
104
|
mounted = surface;
|
|
103
|
-
return
|
|
105
|
+
return root;
|
|
104
106
|
});
|
|
105
107
|
|
|
106
108
|
return {
|
package/src/surfaces/dialog.ts
CHANGED
|
@@ -25,27 +25,12 @@
|
|
|
25
25
|
import { reactive } from "../reactivity";
|
|
26
26
|
import { mountSurface, registerSurface } from "../ui/surface";
|
|
27
27
|
import { overlayRegion, REGION_ATTR } from "../ui/regions";
|
|
28
|
-
import { close
|
|
28
|
+
import { close, showModal } from "@jxsuite/ui/behaviors/dialog";
|
|
29
29
|
import { selectValue } from "@jxsuite/ui/behaviors/textfield";
|
|
30
30
|
import dialogDoc from "./dialog.json";
|
|
31
|
-
import type { SurfaceHandle } from "../ui/surface";
|
|
32
|
-
import type { JxDocument } from "@jxsuite/schema/types";
|
|
31
|
+
import type { SurfaceHandle, SurfaceOption } from "../ui/surface";
|
|
33
32
|
|
|
34
|
-
registerSurface("dialog", dialogDoc
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* One option of a prompt's choice.
|
|
38
|
-
*
|
|
39
|
-
* There is no `selected` here, and its absence is the contract rather than an omission: `jx-select`
|
|
40
|
-
* is a native `<select>`, and the reader's first pick sets an option's dirtiness flag, after which
|
|
41
|
-
* the `selected` content attribute stops moving selectedness (`ui.md` §5.1). A projection that
|
|
42
|
-
* marked a row would be right until the first pick and wrong after it. The chosen row is named by
|
|
43
|
-
* `chosen`, once, beside the list.
|
|
44
|
-
*/
|
|
45
|
-
export interface DialogChoiceOption {
|
|
46
|
-
value: string;
|
|
47
|
-
label: string;
|
|
48
|
-
}
|
|
33
|
+
registerSurface("dialog", dialogDoc);
|
|
49
34
|
|
|
50
35
|
/** What a flow hands the surface. Everything is a projection; the flow keeps the state machine. */
|
|
51
36
|
export interface DialogSurfaceOptions {
|
|
@@ -61,8 +46,15 @@ export interface DialogSurfaceOptions {
|
|
|
61
46
|
message?: string;
|
|
62
47
|
/** Render a richer body into the document's island, once the element is ready. */
|
|
63
48
|
island?: (host: HTMLElement) => void;
|
|
64
|
-
/**
|
|
65
|
-
|
|
49
|
+
/**
|
|
50
|
+
* A `jx-select` above the field, and which of its rows is chosen. The rows carry no `selected`,
|
|
51
|
+
* and that absence is the contract rather than an omission: `jx-select` is a native `<select>`,
|
|
52
|
+
* and the reader's first pick sets an option's dirtiness flag, after which the `selected` content
|
|
53
|
+
* attribute stops moving selectedness (`ui.md` §5.1). A projection that marked a row would be
|
|
54
|
+
* right until the first pick and wrong after it. The chosen row is named by `chosen`, once,
|
|
55
|
+
* beside the list.
|
|
56
|
+
*/
|
|
57
|
+
choice?: { label: string; options: SurfaceOption[]; chosen: string };
|
|
66
58
|
/** The prompt's field. */
|
|
67
59
|
field?: {
|
|
68
60
|
value: string;
|
|
@@ -104,7 +96,7 @@ export interface DialogSurfacePatch {
|
|
|
104
96
|
placeholder?: string;
|
|
105
97
|
invalid?: boolean;
|
|
106
98
|
error?: string;
|
|
107
|
-
options?:
|
|
99
|
+
options?: SurfaceOption[];
|
|
108
100
|
chosen?: string;
|
|
109
101
|
}
|
|
110
102
|
|
|
@@ -118,7 +110,7 @@ export interface DialogSurfaceHandle {
|
|
|
118
110
|
close: () => void;
|
|
119
111
|
}
|
|
120
112
|
|
|
121
|
-
interface DialogScope
|
|
113
|
+
interface DialogScope {
|
|
122
114
|
headline: string;
|
|
123
115
|
confirmLabel: string;
|
|
124
116
|
secondaryLabel: string;
|
|
@@ -129,7 +121,7 @@ interface DialogScope extends Record<string, unknown> {
|
|
|
129
121
|
hasMessage: boolean;
|
|
130
122
|
hasChoice: boolean;
|
|
131
123
|
choiceLabel: string;
|
|
132
|
-
options:
|
|
124
|
+
options: SurfaceOption[];
|
|
133
125
|
hasField: boolean;
|
|
134
126
|
multiline: boolean;
|
|
135
127
|
rows: string;
|
|
@@ -195,7 +187,7 @@ export function openDialogSurface(options: DialogSurfaceOptions): DialogSurfaceH
|
|
|
195
187
|
slot.setAttribute(REGION_ATTR, overlayRegion("dialog", options.region));
|
|
196
188
|
options.layer.append(slot);
|
|
197
189
|
|
|
198
|
-
const scope = reactive<DialogScope>({
|
|
190
|
+
const scope: DialogScope = reactive<DialogScope>({
|
|
199
191
|
cancel: () => {
|
|
200
192
|
options.onCancel();
|
|
201
193
|
},
|
|
@@ -236,10 +228,14 @@ export function openDialogSurface(options: DialogSurfaceOptions): DialogSurfaceH
|
|
|
236
228
|
secondaryLabel: options.secondaryLabel ?? "",
|
|
237
229
|
size: options.size ?? "sm",
|
|
238
230
|
value: options.field?.value ?? "",
|
|
239
|
-
})
|
|
231
|
+
});
|
|
240
232
|
|
|
241
233
|
let handle: SurfaceHandle | null = null;
|
|
242
234
|
let closed = false;
|
|
235
|
+
/* Read through a call, not the bare binding: `close()` can run while the mount is awaiting the
|
|
236
|
+
element, and a direct `closed` test after that `await` would be narrowed to the value the test
|
|
237
|
+
before it saw. */
|
|
238
|
+
const isClosed = (): boolean => closed;
|
|
243
239
|
/* Closing while the element is still rendering must not leave `ready` waiting on a `jx-ready`
|
|
244
240
|
a disposed element will never send, so the wait races against the close. */
|
|
245
241
|
let abort: () => void = () => {};
|
|
@@ -248,14 +244,16 @@ export function openDialogSurface(options: DialogSurfaceOptions): DialogSurfaceH
|
|
|
248
244
|
});
|
|
249
245
|
const mounted = mountSurface("dialog", scope, slot);
|
|
250
246
|
const ready = mounted.then(async (surface) => {
|
|
247
|
+
/* SAFETY: `dialog.json`'s root definition is a `jx-dialog` element, so the runtime
|
|
248
|
+
mounts an HTMLElement; a `Text` root only comes from a document whose root is a bare string. */
|
|
251
249
|
const element = surface.root as HTMLElement;
|
|
252
|
-
if (
|
|
250
|
+
if (isClosed()) {
|
|
253
251
|
surface.dispose();
|
|
254
252
|
return element;
|
|
255
253
|
}
|
|
256
254
|
handle = surface;
|
|
257
255
|
await Promise.race([whenReady(element), aborted]);
|
|
258
|
-
if (
|
|
256
|
+
if (isClosed()) {
|
|
259
257
|
return element;
|
|
260
258
|
}
|
|
261
259
|
options.island?.(element.querySelector<HTMLElement>('[part="island"]') ?? element);
|
|
@@ -284,7 +282,7 @@ export function openDialogSurface(options: DialogSurfaceOptions): DialogSurfaceH
|
|
|
284
282
|
const element = handle?.root;
|
|
285
283
|
if (element instanceof HTMLElement) {
|
|
286
284
|
// The platform's close first, so focus goes back where it was; then the document goes.
|
|
287
|
-
|
|
285
|
+
close(element);
|
|
288
286
|
}
|
|
289
287
|
// A mount that has not landed yet is disposed by `ready` when it does.
|
|
290
288
|
handle?.dispose();
|
|
@@ -18,10 +18,9 @@
|
|
|
18
18
|
import { reactive } from "../reactivity";
|
|
19
19
|
import { mountSurface, registerSurface } from "../ui/surface";
|
|
20
20
|
import diffToolbarDoc from "./diff-toolbar.json";
|
|
21
|
-
import type { JxDocument } from "@jxsuite/schema/types";
|
|
22
21
|
import type { SurfaceHandle } from "../ui/surface";
|
|
23
22
|
|
|
24
|
-
registerSurface("diff-toolbar", diffToolbarDoc
|
|
23
|
+
registerSurface("diff-toolbar", diffToolbarDoc);
|
|
25
24
|
|
|
26
25
|
/** Everything the bar draws, as one value. Every field is already a string or a boolean. */
|
|
27
26
|
export interface DiffToolbarView {
|
|
@@ -66,7 +65,7 @@ export interface DiffToolbarSurfaceHandle {
|
|
|
66
65
|
}
|
|
67
66
|
|
|
68
67
|
/** The scope the document reads: {@link DiffToolbarView} plus the actions its controls call. */
|
|
69
|
-
interface DiffToolbarScope extends
|
|
68
|
+
interface DiffToolbarScope extends DiffToolbarView, DiffToolbarActions {}
|
|
70
69
|
|
|
71
70
|
/** Write a projection into the scope. */
|
|
72
71
|
function project(scope: DiffToolbarScope, view: DiffToolbarView): void {
|
|
@@ -98,7 +97,7 @@ export function mountDiffToolbarSurface(
|
|
|
98
97
|
actions: DiffToolbarActions,
|
|
99
98
|
): DiffToolbarSurfaceHandle {
|
|
100
99
|
host.replaceChildren();
|
|
101
|
-
const scope = reactive<DiffToolbarScope>({
|
|
100
|
+
const scope: DiffToolbarScope = reactive<DiffToolbarScope>({
|
|
102
101
|
codeChecked: "false",
|
|
103
102
|
countLabel: "",
|
|
104
103
|
degraded: "hidden",
|
|
@@ -113,18 +112,21 @@ export function mountDiffToolbarSurface(
|
|
|
113
112
|
stepper: "hidden",
|
|
114
113
|
viewMode: "choice",
|
|
115
114
|
visualChecked: "true",
|
|
116
|
-
})
|
|
115
|
+
});
|
|
117
116
|
project(scope, view);
|
|
118
117
|
|
|
119
118
|
let mounted: SurfaceHandle | null = null;
|
|
120
119
|
let disposed = false;
|
|
121
120
|
const ready = mountSurface("diff-toolbar", scope, host).then((surface) => {
|
|
121
|
+
/* SAFETY: `diff-toolbar.json`'s root definition is a `div` element, so the runtime mounts an
|
|
122
|
+
HTMLElement; a `Text` root only comes from a document whose root is a bare string. */
|
|
123
|
+
const root = surface.root as HTMLElement;
|
|
122
124
|
if (disposed) {
|
|
123
125
|
surface.dispose();
|
|
124
|
-
return
|
|
126
|
+
return root;
|
|
125
127
|
}
|
|
126
128
|
mounted = surface;
|
|
127
|
-
return
|
|
129
|
+
return root;
|
|
128
130
|
});
|
|
129
131
|
|
|
130
132
|
return {
|