@jxsuite/studio 6.1.1 → 8.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -5
- package/dist/chunks/2020-5wtzce5g.js +4 -0
- package/dist/chunks/{action-group-2mqby73c.js → action-group-4aan7g6g.js} +3 -3
- package/dist/chunks/adapter-5tphg7xe.js +4 -0
- package/dist/chunks/add-new-flow-psym14sn.js +4 -0
- package/dist/chunks/cf-account-picker-haqazq5r.js +4 -0
- package/dist/chunks/cf-settings-h2wrh6hq.js +4 -0
- package/dist/chunks/color-area-6rbra5dy.js +4 -0
- package/dist/chunks/color-field-gy56c94g.js +4 -0
- package/dist/chunks/color-m7r1vk54.js +4 -0
- package/dist/chunks/color-slider-sqqdyf6c.js +4 -0
- package/dist/chunks/combobox-72h32ejk.js +4 -0
- package/dist/chunks/components-r22xca09.js +4 -0
- package/dist/chunks/content-source-mmppmcyg.js +4 -0
- package/dist/chunks/convert-to-repeater-he70fc2b.js +4 -0
- package/dist/chunks/dialog-c4x05vyx.js +4 -0
- package/dist/chunks/editor-ccd9jwsa.js +4 -0
- package/dist/chunks/entry-commands-6qxz9e8p.js +4 -0
- package/dist/chunks/extension-sections-0egb88dm.js +4 -0
- package/dist/chunks/file-ops-qnab36ek.js +4 -0
- package/dist/chunks/files-rcn56qvm.js +4 -0
- package/dist/chunks/format-host-yxz0kjjs.js +4 -0
- package/dist/chunks/fs-events-d1qxq4z4.js +4 -0
- package/dist/chunks/grid-open-4z1g062t.js +4 -0
- package/dist/chunks/grid-view-qg1b5eqx.js +51 -0
- package/dist/chunks/icons-63bjtbs7.js +4 -0
- package/dist/chunks/iframe-entry-2zggzajv.js +5 -0
- package/dist/chunks/iframe-entry-76j8vwwx.js +5 -0
- package/dist/chunks/iframe-entry-99nr5zfb.js +5 -0
- package/dist/chunks/iframe-entry-pkgmcgp0.js +5 -0
- package/dist/chunks/iframe-host-ssv7kyj0.js +4 -0
- package/dist/chunks/{index-2veqmnhr.js → index-32eqzv1k.js} +3 -3
- package/dist/chunks/index-f0jn7nnp.js +4 -0
- package/dist/chunks/{javascript-8nbvs12s.js → javascript-pjp734q4.js} +3 -3
- package/dist/chunks/jsonMode-njkvsa02.js +13 -0
- package/dist/chunks/jx-validate-ttasrbh7.js +4 -0
- package/dist/chunks/layers-bgyr11tr.js +4 -0
- package/dist/chunks/layers-panel-7ez66zeq.js +4 -0
- package/dist/chunks/listbox-c421cf8c.js +4 -0
- package/dist/chunks/lit-html-v9gh687x.js +4 -0
- package/dist/chunks/media-library-sq468wts.js +4 -0
- package/dist/chunks/media-picker-shfe59pt.js +4 -0
- package/dist/chunks/menu-bdpzbfvs.js +4 -0
- package/dist/chunks/monaco-binding-vq1hgnn0.js +4 -0
- package/dist/chunks/monaco-buffer-3afgwvbp.js +4 -0
- package/dist/chunks/monaco-setup-xrd2cbkp.js +4 -0
- package/dist/chunks/notify-kzrjr3fv.js +4 -0
- package/dist/chunks/number-field-y62xq0ty.js +4 -0
- package/dist/chunks/parse-v77xtwv7.js +4 -0
- package/dist/chunks/platform-7v4rtd7m.js +4 -0
- package/dist/chunks/popover-b89sfej7.js +4 -0
- package/dist/chunks/publish-panel-2z9gw8ee.js +4 -0
- package/dist/chunks/publish-quick-qx2455cj.js +4 -0
- package/dist/chunks/publish-workspace-wrc1dgwx.js +4 -0
- package/dist/chunks/quick-search-n0t0eqxb.js +4 -0
- package/dist/chunks/references-9547rg5s.js +4 -0
- package/dist/chunks/right-panel-wsgnr9pn.js +4 -0
- package/dist/chunks/select-rzds841e.js +4 -0
- package/dist/chunks/source-control-kwktr9y6.js +4 -0
- package/dist/chunks/split-c9zfdgxf.js +4 -0
- package/dist/chunks/studio-03ct6yfv.js +9 -0
- package/dist/chunks/studio-07rcfje3.js +5 -0
- package/dist/chunks/studio-3e54qh39.js +7 -0
- package/dist/chunks/studio-3exxhz5g.js +5 -0
- package/dist/chunks/studio-3q40e3rj.js +5 -0
- package/dist/chunks/studio-3qeh9t0h.js +6 -0
- package/dist/chunks/studio-3qqjeep5.js +6 -0
- package/dist/chunks/studio-43sd2mam.js +4 -0
- package/dist/chunks/studio-4hp8pkyt.js +5 -0
- package/dist/chunks/studio-58xg6j2q.js +9 -0
- package/dist/chunks/studio-5g0rprdt.js +7 -0
- package/dist/chunks/studio-6m380wp7.js +5 -0
- package/dist/chunks/studio-80jyh1xh.js +4 -0
- package/dist/chunks/studio-83mk4bgg.js +9 -0
- package/dist/chunks/{studio-kggey1jt.js → studio-881z1xrx.js} +4 -4
- package/dist/chunks/studio-8m0y2qe7.js +5 -0
- package/dist/chunks/studio-8tr6cfrc.js +5 -0
- package/dist/chunks/studio-8vcvfs7r.js +6 -0
- package/dist/chunks/studio-9tmebf0s.js +5 -0
- package/dist/chunks/studio-a2bvaptz.js +5 -0
- package/dist/chunks/studio-b7y5mr30.js +5 -0
- package/dist/chunks/studio-bavb31r0.js +5 -0
- package/dist/chunks/studio-bbe4c90a.js +5 -0
- package/dist/chunks/studio-c05wdnt3.js +5 -0
- package/dist/chunks/studio-ccv2svc6.js +5 -0
- package/dist/chunks/studio-d5grtb9e.js +16 -0
- package/dist/chunks/studio-df0baea9.js +5 -0
- package/dist/chunks/studio-dgk4dqtx.js +7 -0
- package/dist/chunks/studio-e1g64q43.js +5 -0
- package/dist/chunks/studio-ed1hp6zf.js +6 -0
- package/dist/chunks/studio-ed3xx40h.js +7 -0
- package/dist/chunks/studio-f14e1zdj.js +5 -0
- package/dist/chunks/studio-fbhxxc5f.js +5 -0
- package/dist/chunks/studio-fyh0jc96.js +5 -0
- package/dist/chunks/studio-gcxk20n7.js +5 -0
- package/dist/chunks/studio-jaaz8ce9.js +5 -0
- package/dist/chunks/{studio-8grwxtqk.js → studio-jcnsdaep.js} +4 -4
- package/dist/chunks/studio-jsgf2q5k.js +7 -0
- package/dist/chunks/{studio-1q1sh2ax.js → studio-k3xxbagr.js} +3 -3
- package/dist/chunks/studio-k7evxqh4.js +5 -0
- package/dist/chunks/studio-kt3pjkwd.js +5 -0
- package/dist/chunks/studio-m8g16bgz.js +5 -0
- package/dist/chunks/studio-mn0476ag.js +5 -0
- package/dist/chunks/studio-mx1smyq0.js +5 -0
- package/dist/chunks/studio-n0c5h6mf.js +5 -0
- package/dist/chunks/{studio-rv11kfwa.js → studio-nh6d342n.js} +7 -7
- package/dist/chunks/studio-nqxqf8p2.js +4 -0
- package/dist/chunks/studio-p4nrkvqr.js +5 -0
- package/dist/chunks/{studio-h46vtzk8.js → studio-pbxa5fpc.js} +4 -4
- package/dist/chunks/studio-pgmvdv7z.js +7 -0
- package/dist/chunks/studio-ph84avkf.js +5 -0
- package/dist/chunks/{studio-wszjyh0j.js → studio-q0mvbaq6.js} +4 -4
- package/dist/chunks/studio-q0tccd43.js +5 -0
- package/dist/chunks/studio-q7rtx6zq.js +14 -0
- package/dist/chunks/{studio-pre0skq6.js → studio-qgh13jtz.js} +4 -4
- package/dist/chunks/studio-qmn1xc24.js +5 -0
- package/dist/chunks/studio-qwdqwkj0.js +5 -0
- package/dist/chunks/{studio-t6b6qe31.js → studio-r5qy30vx.js} +4 -4
- package/dist/chunks/studio-rj9eamf8.js +5 -0
- package/dist/chunks/studio-rptgsk96.js +5 -0
- package/dist/chunks/studio-rthyg42z.js +928 -0
- package/dist/chunks/studio-s19tp1xr.js +5 -0
- package/dist/chunks/studio-s32578pn.js +5 -0
- package/dist/chunks/studio-svb7yyve.js +5 -0
- package/dist/chunks/studio-syreb644.js +5 -0
- package/dist/chunks/studio-tf9jryb1.js +10 -0
- package/dist/chunks/studio-tfkznv39.js +5 -0
- package/dist/chunks/studio-tft6r105.js +5 -0
- package/dist/chunks/studio-txf2kysx.js +5 -0
- package/dist/chunks/studio-v8867ddv.js +12 -0
- package/dist/chunks/studio-vxq7fcvv.js +5 -0
- package/dist/chunks/studio-w4rz9hdk.js +5 -0
- package/dist/chunks/studio-wbcjbhy1.js +9 -0
- package/dist/chunks/studio-wc649wss.js +5 -0
- package/dist/chunks/studio-wys23mxz.js +5 -0
- package/dist/chunks/studio-x1x167jh.js +5 -0
- package/dist/chunks/studio-x9hsze61.js +5 -0
- package/dist/chunks/studio-y0n7yxea.js +9 -0
- package/dist/chunks/studio-y3ahhdpx.js +5 -0
- package/dist/chunks/studio-z97c48fk.js +5 -0
- package/dist/chunks/studio-zat62m0c.js +5 -0
- package/dist/chunks/studio-zcd2e7yz.js +5 -0
- package/dist/chunks/studio-zz9qe3rw.js +64 -0
- package/dist/chunks/swatch-group-ewh24n1f.js +4 -0
- package/dist/chunks/tabs-f5cw3tgp.js +4 -0
- package/dist/chunks/textfield-wewc8rq2.js +4 -0
- package/dist/chunks/toast-1gv0h53h.js +4 -0
- package/dist/chunks/toast-host-1yg5ar8d.js +4 -0
- package/dist/chunks/{toolbar-2nnzqhrj.js → toolbar-44cm5cta.js} +3 -3
- package/dist/chunks/tooltip-yypz28gq.js +4 -0
- package/dist/chunks/tree-9xa4hm7n.js +4 -0
- package/dist/chunks/tsMode-epyfz1hv.js +14 -0
- package/dist/chunks/workspace-dz7nxfhv.js +4 -0
- package/dist/chunks/workspace-home-xsd7hkjw.js +4 -0
- package/dist/chunks/ws-client-bv552sfx.js +4 -0
- package/dist/iframe-entry.js +20 -16
- package/dist/manifest.json +77 -63
- package/dist/studio.js +106 -107
- package/dist/workers/ts.worker.js +3 -3
- package/package.json +17 -16
- package/src/about/about-modal.ts +4 -3
- package/src/account/action-flow.ts +45 -38
- package/src/account-status.ts +7 -2
- package/src/browse/component-examples.ts +272 -0
- package/src/browse/library-commands.ts +64 -104
- package/src/browse/library-layouts.ts +270 -53
- package/src/browse/library-model.ts +194 -134
- package/src/browse/library-pane.ts +748 -440
- package/src/browse/library-preview.ts +161 -26
- package/src/browse/library-source.ts +308 -41
- package/src/browse/preview-root.ts +78 -0
- package/src/browse/preview-style.ts +155 -0
- package/src/canvas/asset-refs.ts +40 -10
- package/src/canvas/asset-resolve.ts +19 -23
- package/src/canvas/canvas-helpers.ts +7 -6
- package/src/canvas/canvas-live-render.ts +260 -77
- package/src/canvas/canvas-origin.ts +37 -12
- package/src/canvas/canvas-page-context.ts +112 -0
- package/src/canvas/canvas-patcher.ts +30 -30
- package/src/canvas/canvas-perf.ts +11 -5
- package/src/canvas/canvas-render.ts +175 -148
- package/src/canvas/canvas-surface.ts +5 -3
- package/src/canvas/canvas-utils.ts +147 -61
- package/src/canvas/dialog-path.ts +9 -4
- package/src/canvas/dialog-state.ts +1 -2
- package/src/canvas/diff-marks.ts +9 -16
- package/src/canvas/diff-toolbar.ts +8 -7
- package/src/canvas/edit-width-drag.ts +4 -1
- package/src/canvas/edit-width.ts +1 -3
- package/src/canvas/iframe-channel.ts +27 -13
- package/src/canvas/iframe-drop.ts +120 -12
- package/src/canvas/iframe-editable-root.ts +29 -16
- package/src/canvas/iframe-entry.ts +104 -75
- package/src/canvas/iframe-eval.ts +73 -49
- package/src/canvas/iframe-host.ts +269 -158
- package/src/canvas/iframe-inline-edit.ts +49 -30
- package/src/canvas/iframe-insert.ts +5 -4
- package/src/canvas/iframe-interaction.ts +30 -25
- package/src/canvas/iframe-keys.ts +11 -0
- package/src/canvas/iframe-overlay.ts +1 -1
- package/src/canvas/iframe-patch.ts +25 -21
- package/src/canvas/iframe-position.ts +12 -6
- package/src/canvas/iframe-protocol.ts +36 -21
- package/src/canvas/iframe-render.ts +84 -35
- package/src/canvas/iframe-slash.ts +24 -11
- package/src/canvas/iframe-subtree.ts +10 -3
- package/src/canvas/npm-modules.ts +22 -0
- package/src/canvas/path-mapping.ts +19 -12
- package/src/canvas/popover-path.ts +7 -3
- package/src/canvas/popover-state.ts +1 -2
- package/src/canvas/preview-navigate.ts +16 -0
- package/src/canvas/repeater-sources.ts +200 -0
- package/src/canvas/serialize-scope.ts +13 -5
- package/src/canvas/stage-scrollbar.ts +7 -2
- package/src/canvas/surface-registry.ts +27 -3
- package/src/collab/collab-commands.ts +7 -2
- package/src/collab/collab-session.ts +84 -45
- package/src/collab/collab-state.ts +4 -3
- package/src/collab/monaco-binding.ts +16 -13
- package/src/collab/monaco-cursors.ts +5 -2
- package/src/commands/app-commands.ts +16 -6
- package/src/commands/budget.ts +13 -11
- package/src/commands/command-args.ts +103 -71
- package/src/commands/context.ts +55 -28
- package/src/commands/defaults.ts +69 -45
- package/src/commands/keymap.ts +56 -43
- package/src/commands/levels.ts +14 -8
- package/src/commands/live-context.ts +9 -7
- package/src/commands/reference.ts +2 -1
- package/src/commands/registry.ts +22 -11
- package/src/commands/run-reported.ts +15 -10
- package/src/component-props.ts +46 -30
- package/src/content/collection-match.ts +11 -9
- package/src/content/collection-pages.ts +412 -0
- package/src/content/content-collections.ts +270 -0
- package/src/content/draft-state.ts +4 -3
- package/src/content/entry-commands.ts +54 -62
- package/src/content/entry-editor.ts +137 -32
- package/src/content/entry-fields.ts +25 -8
- package/src/content/entry-inspector.ts +225 -0
- package/src/content/entry-model.ts +38 -15
- package/src/content/entry-open.ts +80 -0
- package/src/content/entry-summaries.ts +440 -0
- package/src/content/file-record-ids.ts +80 -0
- package/src/content/file-records.ts +125 -0
- package/src/content/page-summaries.ts +129 -0
- package/src/content/record-entry.ts +201 -0
- package/src/content/writing-banner.ts +177 -0
- package/src/create/add-new-commands.ts +185 -0
- package/src/create/add-new-flow.ts +1116 -0
- package/src/create/add-new.ts +1014 -0
- package/src/create/element-name.ts +121 -0
- package/src/editor/canvas-context-menu.ts +1 -2
- package/src/editor/canvas-slash-bridge.ts +3 -6
- package/src/editor/content-slice.ts +16 -14
- package/src/editor/context-menu.ts +35 -22
- package/src/editor/convert-targets.ts +30 -35
- package/src/editor/convert-to-component.ts +78 -48
- package/src/editor/convert-to-repeater.ts +34 -22
- package/src/editor/editable-tags.ts +17 -2
- package/src/editor/file-drop-action.ts +29 -22
- package/src/editor/inline-edit-apply.ts +79 -17
- package/src/editor/inline-edit.ts +76 -50
- package/src/editor/inline-format.ts +59 -56
- package/src/editor/inline-link.ts +40 -15
- package/src/editor/insert-component.ts +91 -0
- package/src/editor/insert-zone-action.ts +14 -5
- package/src/editor/merge-tags.ts +58 -19
- package/src/editor/repeater-scope.ts +39 -28
- package/src/editor/shortcuts.ts +76 -42
- package/src/editor/slash-menu.ts +52 -14
- package/src/files/asset-versions.ts +4 -4
- package/src/files/components.ts +89 -20
- package/src/files/elements.ts +5 -6
- package/src/files/file-ops.ts +92 -41
- package/src/files/files.ts +248 -239
- package/src/files/fs-events.ts +18 -7
- package/src/files/media-meta.ts +97 -2
- package/src/files/media-paths.ts +3 -0
- package/src/files/media-types.ts +55 -0
- package/src/files/media-upload.ts +209 -52
- package/src/files/new-file-name.ts +156 -0
- package/src/files/serialize-document.ts +15 -5
- package/src/format/constraints.ts +1 -1
- package/src/format/convert-file.ts +27 -13
- package/src/format/format-choices.ts +2 -1
- package/src/format/format-host.ts +91 -50
- package/src/github/github-auth-status.ts +27 -3
- package/src/github/github-auth.ts +21 -11
- package/src/github/github-publish.ts +28 -23
- package/src/grid/cell-editors.ts +46 -31
- package/src/grid/cell-popovers.ts +5 -3
- package/src/grid/edit-buffer.ts +10 -9
- package/src/grid/grid-controller.ts +25 -23
- package/src/grid/grid-layout.ts +21 -5
- package/src/grid/grid-open.ts +3 -33
- package/src/grid/grid-panel.ts +65 -6
- package/src/grid/grid-reveal.ts +34 -0
- package/src/grid/grid-source.ts +9 -31
- package/src/grid/grid-view.ts +45 -23
- package/src/grid/redirects-grid.ts +14 -5
- package/src/grid/redirects.ts +16 -14
- package/src/grid/schema-columns.ts +25 -19
- package/src/grid/sources/connector-source.ts +47 -20
- package/src/grid/sources/content-source.ts +100 -31
- package/src/grid/sources/csv-file-source.ts +2 -2
- package/src/grid/tabulator-tables.d.ts +61 -34
- package/src/hosting/document.ts +2 -2
- package/src/hosting/stage.ts +7 -7
- package/src/i18n/i18n-commands.ts +3 -3
- package/src/media/media-commands.ts +181 -0
- package/src/media/media-library-model.ts +232 -0
- package/src/media/media-library.ts +1283 -0
- package/src/media/media-pane.ts +51 -20
- package/src/new-project/add-repo-modal.ts +20 -19
- package/src/new-project/import-tab.ts +10 -14
- package/src/new-project/location-fields.ts +2 -1
- package/src/new-project/new-project-modal.ts +12 -9
- package/src/packages/jxsuite-update.ts +4 -3
- package/src/packages/pull-package-sync.ts +26 -25
- package/src/page-params.ts +97 -68
- package/src/panels/activity-panel.ts +38 -14
- package/src/panels/ai-chat/attached-context.ts +13 -7
- package/src/panels/ai-chat/chat-markdown.ts +8 -8
- package/src/panels/ai-chat/chat-view.ts +80 -73
- package/src/panels/ai-chat/composer.ts +30 -33
- package/src/panels/ai-chat/sessions-view.ts +1 -2
- package/src/panels/ai-panel.ts +23 -20
- package/src/panels/block-action-bar.ts +57 -46
- package/src/panels/bottom-dock.ts +5 -3
- package/src/panels/canvas-dnd-bridge.ts +36 -26
- package/src/panels/chat-panel.ts +6 -6
- package/src/panels/collections-panel.ts +306 -0
- package/src/panels/component-preview.ts +35 -13
- package/src/panels/data-explorer.ts +63 -26
- package/src/panels/data-grid.ts +18 -11
- package/src/panels/dnd.ts +115 -138
- package/src/panels/editors.ts +52 -21
- package/src/panels/elements-panel.ts +19 -5
- package/src/panels/empty-state.ts +2 -2
- package/src/panels/events-panel.ts +84 -69
- package/src/panels/formula-workspace.ts +78 -54
- package/src/panels/frontmatter-fields.ts +33 -28
- package/src/panels/git-diff-open.ts +10 -6
- package/src/panels/head-panel.ts +488 -202
- package/src/panels/i18n-panel.ts +20 -12
- package/src/panels/imports-panel.ts +25 -47
- package/src/panels/jump-bar.ts +75 -31
- package/src/panels/layers-panel.ts +130 -101
- package/src/panels/left-panel.ts +25 -11
- package/src/panels/navigator-panels.ts +23 -11
- package/src/panels/pane-context.ts +140 -49
- package/src/panels/pane-grid.ts +55 -26
- package/src/panels/panel-registry.ts +36 -46
- package/src/panels/properties-panel.ts +182 -124
- package/src/panels/quick-search.ts +53 -31
- package/src/panels/right-panel.ts +201 -45
- package/src/panels/seo-modal.ts +54 -125
- package/src/panels/settings-menu.ts +63 -61
- package/src/panels/settings-pane.ts +268 -162
- package/src/panels/signals-panel.ts +156 -135
- package/src/panels/site-model.ts +367 -0
- package/src/panels/site-panel.ts +638 -0
- package/src/panels/statement-editor.ts +230 -140
- package/src/panels/style-panel.ts +253 -206
- package/src/panels/style-utils.ts +114 -51
- package/src/panels/stylebook-doc.ts +195 -60
- package/src/panels/stylebook-layers-panel.ts +48 -89
- package/src/panels/stylebook-panel.ts +60 -27
- package/src/panels/styles-panel.ts +327 -0
- package/src/panels/tab-drop.ts +27 -11
- package/src/panels/tab-strip.ts +143 -49
- package/src/platform-errors.ts +57 -43
- package/src/platform.ts +59 -31
- package/src/platforms/cloud.ts +373 -176
- package/src/platforms/default-platform.ts +14 -8
- package/src/platforms/devserver.ts +180 -142
- package/src/platforms/read-batcher.ts +16 -8
- package/src/project-list.ts +2 -1
- package/src/publish/deploy-checklist.ts +20 -9
- package/src/publish/pages-service.ts +66 -27
- package/src/publish/publish-changes.ts +491 -0
- package/src/publish/publish-commands.ts +88 -22
- package/src/publish/publish-ids.ts +49 -0
- package/src/publish/publish-panel.ts +10 -6
- package/src/publish/publish-quick.ts +148 -0
- package/src/publish/publish-workspace.ts +926 -0
- package/src/publish/source-control.ts +907 -0
- package/src/recent-projects.ts +15 -8
- package/src/resize-edges.ts +26 -36
- package/src/services/a11y-report.ts +26 -19
- package/src/services/agent-seed.ts +23 -11
- package/src/services/ai-ask.ts +9 -12
- package/src/services/ai-command-tools.ts +68 -62
- package/src/services/ai-import-tools.ts +80 -67
- package/src/services/ai-models.ts +17 -13
- package/src/services/ai-project-tools.ts +68 -32
- package/src/services/ai-session-store.ts +19 -10
- package/src/services/ai-system-prompt.ts +46 -20
- package/src/services/ai-tools.ts +71 -27
- package/src/services/ai-write-report.ts +20 -12
- package/src/services/ai-writes.ts +4 -4
- package/src/services/automation.ts +74 -51
- package/src/services/cem-export.ts +149 -58
- package/src/services/cf-settings.ts +4 -4
- package/src/services/clock.ts +6 -1
- package/src/services/code-services.ts +37 -31
- package/src/services/connection.ts +2 -2
- package/src/services/context-manager.ts +14 -10
- package/src/services/context-resolver.ts +20 -8
- package/src/services/data-service.ts +19 -15
- package/src/services/directory-picker.ts +20 -14
- package/src/services/document-assistant.ts +39 -19
- package/src/services/gated-registry.ts +10 -6
- package/src/services/harness/chat-reducer.ts +23 -1
- package/src/services/import-client.ts +91 -38
- package/src/services/import-seed.ts +8 -2
- package/src/services/jx-validate.ts +28 -31
- package/src/services/live-preview.ts +0 -0
- package/src/services/live-surfaces.ts +6 -3
- package/src/services/model-uri.ts +10 -2
- package/src/services/module-preloads.ts +12 -8
- package/src/services/monaco-buffer.ts +43 -24
- package/src/services/monaco-lazy.ts +7 -8
- package/src/services/monaco-setup.ts +23 -16
- package/src/services/notify.ts +44 -17
- package/src/services/popover-report.ts +25 -10
- package/src/services/preview-eval.ts +20 -8
- package/src/services/profile.ts +13 -6
- package/src/services/project-path.ts +13 -10
- package/src/services/references.ts +0 -0
- package/src/services/render-critic.ts +29 -9
- package/src/services/settings/definitions.ts +25 -14
- package/src/services/settings/kernel.ts +13 -4
- package/src/services/settings/write-queue.ts +9 -9
- package/src/services/token-lint.ts +12 -10
- package/src/services/tool-executor.ts +17 -5
- package/src/services/tool-outcomes.ts +44 -24
- package/src/services/trusted-types.ts +24 -7
- package/src/settings/contexts-section.ts +11 -8
- package/src/settings/contributed-section.ts +128 -70
- package/src/settings/css-vars-editor.ts +119 -32
- package/src/settings/defs-editor.ts +38 -35
- package/src/settings/developer-panels.ts +43 -0
- package/src/settings/extension-rows.ts +16 -8
- package/src/settings/extension-sections.ts +42 -14
- package/src/settings/extensions-section.ts +4 -1
- package/src/settings/general-settings.ts +101 -28
- package/src/settings/locales-section.ts +20 -12
- package/src/settings/preferences-dialog.ts +17 -7
- package/src/settings/preferences-keymap.ts +7 -5
- package/src/settings/preferences-sections.ts +11 -5
- package/src/settings/project-sections.ts +28 -11
- package/src/settings/schema-field-ui.ts +12 -1
- package/src/settings/section-registry.ts +116 -11
- package/src/settings/settings-dialog.ts +192 -0
- package/src/settings/settings-document.ts +186 -166
- package/src/shell/tree.ts +6 -5
- package/src/shell.ts +536 -477
- package/src/site-context.ts +101 -32
- package/src/state.ts +68 -57
- package/src/store.ts +54 -34
- package/src/studio.ts +219 -116
- package/src/style/live-preview.ts +1 -1
- package/src/style/project-styles.ts +40 -7
- package/src/style/stylebook-specimens.ts +89 -0
- package/src/style/stylebook-target.ts +26 -0
- package/src/style/tag-inheritance.ts +105 -0
- package/src/style/token-ref.ts +5 -4
- package/src/style/variables-focus.ts +61 -0
- package/src/style/variables-view.ts +235 -0
- package/src/surfaces/about.ts +18 -19
- package/src/surfaces/add-new.json +1482 -0
- package/src/surfaces/add-new.ts +325 -0
- package/src/surfaces/add-repo.ts +17 -19
- package/src/surfaces/ai-chat.ts +33 -38
- package/src/surfaces/ai-credentials-form.ts +6 -16
- package/src/surfaces/ai-managed-connect.ts +3 -4
- package/src/surfaces/ai-model-picker.ts +3 -5
- package/src/surfaces/block-action-bar.ts +22 -11
- package/src/surfaces/boot-failure.json +4 -3
- package/src/surfaces/boot-failure.ts +4 -5
- package/src/surfaces/bottom-dock.json +1 -1
- package/src/surfaces/bottom-dock.ts +9 -18
- package/src/surfaces/canvas-stage.json +30 -19
- package/src/surfaces/canvas-stage.ts +17 -16
- package/src/surfaces/cf-account-picker.ts +17 -18
- package/src/surfaces/collections-panel.json +615 -0
- package/src/surfaces/collections-panel.ts +168 -0
- package/src/surfaces/commandbar.json +241 -96
- package/src/surfaces/commandbar.ts +145 -105
- package/src/surfaces/convert-repeater.ts +17 -19
- package/src/surfaces/data-actions.ts +9 -7
- package/src/surfaces/dialog.ts +26 -28
- package/src/surfaces/diff-toolbar.ts +9 -7
- package/src/surfaces/empty-state.json +1 -1
- package/src/surfaces/empty-state.ts +7 -10
- package/src/surfaces/entry-editor.json +136 -0
- package/src/surfaces/entry-editor.ts +35 -11
- package/src/surfaces/entry-inspector.json +371 -0
- package/src/surfaces/entry-inspector.ts +143 -0
- package/src/surfaces/expression-editor.ts +11 -25
- package/src/surfaces/files-panel.ts +27 -14
- package/src/surfaces/formula-palette.ts +4 -5
- package/src/surfaces/github-auth.ts +16 -20
- package/src/surfaces/github-publish.ts +17 -22
- package/src/surfaces/grid-cell.ts +30 -31
- package/src/surfaces/grid-open.ts +10 -14
- package/src/surfaces/grid-panel.ts +13 -9
- package/src/surfaces/grid-replace.ts +13 -13
- package/src/surfaces/grid-views.ts +15 -18
- package/src/surfaces/inspector-dock.json +162 -14
- package/src/surfaces/inspector-dock.ts +59 -31
- package/src/surfaces/jump-bar.ts +5 -6
- package/src/surfaces/jxsuite-update.ts +16 -22
- package/src/surfaces/library-pane.json +670 -437
- package/src/surfaces/library-pane.ts +111 -77
- package/src/surfaces/logic-panel.ts +17 -30
- package/src/surfaces/logic-workspace.ts +13 -15
- package/src/surfaces/media-browser.json +62 -6
- package/src/surfaces/media-browser.ts +26 -11
- package/src/surfaces/media-field.json +1 -1
- package/src/surfaces/media-field.ts +4 -5
- package/src/surfaces/media-library.json +1586 -0
- package/src/surfaces/media-library.ts +282 -0
- package/src/surfaces/media-pane.ts +8 -7
- package/src/surfaces/media-pick-dialog.json +71 -0
- package/src/surfaces/media-pick-dialog.ts +132 -0
- package/src/surfaces/menu.ts +47 -23
- package/src/surfaces/navigator-dock.ts +11 -12
- package/src/surfaces/new-project.ts +27 -26
- package/src/surfaces/pane-context.json +144 -77
- package/src/surfaces/pane-context.ts +44 -25
- package/src/surfaces/pane-grid.ts +15 -10
- package/src/surfaces/panel-activity.ts +5 -6
- package/src/surfaces/panel-data.ts +3 -4
- package/src/surfaces/panel-deploy-checklist.json +12 -6
- package/src/surfaces/panel-deploy-checklist.ts +8 -7
- package/src/surfaces/panel-elements.ts +5 -7
- package/src/surfaces/panel-i18n.ts +5 -7
- package/src/surfaces/panel-imports.ts +6 -13
- package/src/surfaces/panel-outline.ts +25 -19
- package/src/surfaces/panel-page.json +72 -2
- package/src/surfaces/panel-page.ts +49 -25
- package/src/surfaces/panel-problems.ts +5 -7
- package/src/surfaces/panel-signals.json +1 -1
- package/src/surfaces/panel-signals.ts +25 -39
- package/src/surfaces/panel-stylebook-layers.json +71 -204
- package/src/surfaces/panel-stylebook-layers.ts +5 -29
- package/src/surfaces/preferences.json +120 -48
- package/src/surfaces/preferences.ts +29 -11
- package/src/surfaces/progress-modal.ts +15 -9
- package/src/surfaces/properties-panel.json +1 -1
- package/src/surfaces/properties-panel.ts +20 -42
- package/src/surfaces/publish-quick.json +428 -0
- package/src/surfaces/publish-quick.ts +165 -0
- package/src/surfaces/publish-workspace.json +2892 -0
- package/src/surfaces/publish-workspace.ts +391 -0
- package/src/surfaces/publish.ts +18 -18
- package/src/surfaces/push-plan.ts +7 -8
- package/src/surfaces/rail.json +1 -159
- package/src/surfaces/rail.ts +22 -79
- package/src/surfaces/reference-field.ts +11 -15
- package/src/surfaces/schema-builder.ts +16 -22
- package/src/surfaces/schema-form.json +10 -2
- package/src/surfaces/schema-form.ts +17 -25
- package/src/surfaces/secret-field.ts +9 -6
- package/src/surfaces/seo.json +1 -1
- package/src/surfaces/seo.ts +21 -15
- package/src/surfaces/settings-contexts.ts +9 -7
- package/src/surfaces/settings-contributed.json +5 -5
- package/src/surfaces/settings-contributed.ts +32 -12
- package/src/surfaces/settings-css-vars.json +44 -36
- package/src/surfaces/settings-css-vars.ts +82 -16
- package/src/surfaces/settings-defs.json +2 -2
- package/src/surfaces/settings-defs.ts +17 -21
- package/src/surfaces/settings-deploy.json +2 -15
- package/src/surfaces/settings-deploy.ts +9 -16
- package/src/surfaces/settings-dialog.json +51 -0
- package/src/surfaces/settings-dialog.ts +169 -0
- package/src/surfaces/settings-extensions.ts +5 -6
- package/src/surfaces/settings-head.ts +33 -39
- package/src/surfaces/settings-locales.ts +8 -20
- package/src/surfaces/settings-overview.json +3 -3
- package/src/surfaces/settings-overview.ts +14 -8
- package/src/surfaces/settings-packages.ts +8 -7
- package/src/surfaces/settings-pane.json +269 -46
- package/src/surfaces/settings-pane.ts +88 -36
- package/src/surfaces/settings-rawjson.ts +5 -6
- package/src/surfaces/shell.json +2 -1
- package/src/surfaces/shell.ts +1 -2
- package/src/surfaces/site-panel.json +1029 -0
- package/src/surfaces/site-panel.ts +233 -0
- package/src/surfaces/slash-menu.json +63 -21
- package/src/surfaces/slash-menu.ts +42 -9
- package/src/surfaces/statements.ts +13 -18
- package/src/surfaces/statusbar.ts +56 -29
- package/src/surfaces/style-panel.ts +18 -31
- package/src/surfaces/stylebook-chrome.ts +3 -5
- package/src/surfaces/styles-panel.json +735 -0
- package/src/surfaces/styles-panel.ts +195 -0
- package/src/surfaces/styles-variables.json +149 -0
- package/src/surfaces/styles-variables.ts +145 -0
- package/src/surfaces/tab-strip.json +4 -4
- package/src/surfaces/tab-strip.ts +14 -13
- package/src/surfaces/target-line.ts +6 -7
- package/src/surfaces/welcome.ts +6 -8
- package/src/surfaces/writing-banner.json +94 -0
- package/src/surfaces/writing-banner.ts +80 -0
- package/src/tabs/bare-repeaters.ts +101 -0
- package/src/tabs/patch-ops.ts +4 -3
- package/src/tabs/project-config.ts +32 -21
- package/src/tabs/selection.ts +36 -8
- package/src/tabs/tab.ts +99 -48
- package/src/tabs/transact.ts +98 -53
- package/src/types.ts +53 -43
- package/src/ui/ai-credentials-form.ts +10 -13
- package/src/ui/ai-model-picker.ts +3 -3
- package/src/ui/cf-account-picker.ts +7 -9
- package/src/ui/color-selector.ts +9 -5
- package/src/ui/dynamic-slot.ts +7 -8
- package/src/ui/expression-editor.ts +112 -105
- package/src/ui/form-controls.ts +104 -56
- package/src/ui/formula-catalog.ts +239 -230
- package/src/ui/formula-chips.ts +33 -18
- package/src/ui/layers.ts +57 -31
- package/src/ui/media-picker.ts +300 -47
- package/src/ui/popover-surface.ts +20 -12
- package/src/ui/progress-modal.ts +13 -8
- package/src/ui/regions.ts +14 -12
- package/src/ui/schema-form.ts +372 -97
- package/src/ui/surface.ts +71 -8
- package/src/ui/timing.ts +9 -0
- package/src/ui/value-source.ts +44 -31
- package/src/ui/virtual-window.ts +29 -3
- package/src/utils/base64.ts +6 -4
- package/src/utils/edit-display.ts +366 -111
- package/src/utils/element-selectors.ts +3 -2
- package/src/utils/google-fonts.ts +15 -14
- package/src/utils/inherited-style.ts +18 -20
- package/src/utils/link-target.ts +1 -1
- package/src/utils/local-day.ts +18 -0
- package/src/utils/preview-format.ts +25 -3
- package/src/utils/strip-events.ts +49 -22
- package/src/utils/studio-utils.ts +29 -14
- package/src/view.ts +2 -3
- package/src/workspace/pane-derive.ts +14 -16
- package/src/workspace/session.ts +81 -50
- package/src/workspace/tab-workspace.ts +137 -0
- package/src/workspace/workspace-back.ts +189 -0
- package/src/workspace/workspace-home.ts +133 -0
- package/src/workspace/workspace-ids.ts +129 -0
- package/src/workspace/workspace-switch.ts +372 -0
- package/src/workspace/workspace.ts +165 -47
- package/styles/shell-frame.css +30 -7
- package/styles/shell-frame.json +15 -3
- package/dist/chunks/2020-va2wwra4.js +0 -4
- package/dist/chunks/adapter-f93pafd7.js +0 -4
- package/dist/chunks/cf-account-picker-af1h381v.js +0 -4
- package/dist/chunks/cf-settings-125tdm0w.js +0 -4
- package/dist/chunks/color-area-jqhna8zy.js +0 -4
- package/dist/chunks/color-field-embq5ctg.js +0 -4
- package/dist/chunks/color-fpezvnkt.js +0 -4
- package/dist/chunks/color-slider-1qmw7wqy.js +0 -4
- package/dist/chunks/combobox-773hdzyj.js +0 -4
- package/dist/chunks/components-ax2f1fnn.js +0 -4
- package/dist/chunks/content-source-108aqtk1.js +0 -4
- package/dist/chunks/convert-to-repeater-ry5rmppr.js +0 -4
- package/dist/chunks/dialog-mtm9fq5t.js +0 -4
- package/dist/chunks/editor-pfgdmkb0.js +0 -4
- package/dist/chunks/entry-commands-t0k1q0kx.js +0 -4
- package/dist/chunks/extension-sections-6mwh2hf8.js +0 -4
- package/dist/chunks/file-ops-meej5mqf.js +0 -4
- package/dist/chunks/files-44vp8a2s.js +0 -4
- package/dist/chunks/format-host-7q1petb9.js +0 -4
- package/dist/chunks/fs-events-h2mwnxaz.js +0 -4
- package/dist/chunks/git-panel-zngbymvd.js +0 -4
- package/dist/chunks/grid-view-sx9vynsp.js +0 -51
- package/dist/chunks/icons-p44xhjf0.js +0 -4
- package/dist/chunks/iframe-entry-f7mqjwpm.js +0 -5
- package/dist/chunks/iframe-entry-haw7jkvz.js +0 -5
- package/dist/chunks/iframe-entry-z6qrytv3.js +0 -5
- package/dist/chunks/iframe-host-qk3ycq87.js +0 -4
- package/dist/chunks/index-wkyfjeqz.js +0 -4
- package/dist/chunks/jsonMode-s8kt9dsj.js +0 -13
- package/dist/chunks/jx-validate-psgd7vsx.js +0 -4
- package/dist/chunks/layers-panel-1kq2jyfk.js +0 -4
- package/dist/chunks/layers-xd92fg8d.js +0 -4
- package/dist/chunks/listbox-s8fkmnq8.js +0 -4
- package/dist/chunks/lit-html-ac4cwwr4.js +0 -4
- package/dist/chunks/media-picker-0svzkdyb.js +0 -4
- package/dist/chunks/menu-37d07z9m.js +0 -4
- package/dist/chunks/menu-5c55ea3d.js +0 -4
- package/dist/chunks/monaco-binding-z6r70pdt.js +0 -4
- package/dist/chunks/monaco-buffer-fz6gq5y7.js +0 -4
- package/dist/chunks/monaco-setup-q4axkgj7.js +0 -4
- package/dist/chunks/notify-0xgtn8q1.js +0 -4
- package/dist/chunks/number-field-gw7sq8rn.js +0 -4
- package/dist/chunks/parse-897fvqah.js +0 -4
- package/dist/chunks/platform-v1qctbe6.js +0 -4
- package/dist/chunks/popover-8htra4er.js +0 -4
- package/dist/chunks/publish-panel-ym1fmgq5.js +0 -4
- package/dist/chunks/quick-search-a54e6t5n.js +0 -4
- package/dist/chunks/references-gmqp82fs.js +0 -4
- package/dist/chunks/right-panel-v7t9awbk.js +0 -4
- package/dist/chunks/section-registry-vhyf3zsr.js +0 -4
- package/dist/chunks/select-n3v7gwas.js +0 -4
- package/dist/chunks/split-pff8f3ze.js +0 -4
- package/dist/chunks/studio-0bhx5hz6.js +0 -5
- package/dist/chunks/studio-0k1ddnyy.js +0 -6
- package/dist/chunks/studio-1b04pd0j.js +0 -64
- package/dist/chunks/studio-4dwbj6gb.js +0 -5
- package/dist/chunks/studio-4tanh828.js +0 -5
- package/dist/chunks/studio-55h4mstj.js +0 -4
- package/dist/chunks/studio-5tnvjkz4.js +0 -5
- package/dist/chunks/studio-60dqgb0c.js +0 -5
- package/dist/chunks/studio-61dp09qg.js +0 -9
- package/dist/chunks/studio-63epcrj2.js +0 -5
- package/dist/chunks/studio-74k29dy9.js +0 -5
- package/dist/chunks/studio-7vg6jcd3.js +0 -5
- package/dist/chunks/studio-7zx31knw.js +0 -9
- package/dist/chunks/studio-8bxk97km.js +0 -5
- package/dist/chunks/studio-933e30n4.js +0 -5
- package/dist/chunks/studio-98wnwhbg.js +0 -5
- package/dist/chunks/studio-9mccjwjh.js +0 -14
- package/dist/chunks/studio-a2ke1e4t.js +0 -5
- package/dist/chunks/studio-e3a2a6v3.js +0 -4
- package/dist/chunks/studio-e81q1vb9.js +0 -5
- package/dist/chunks/studio-epgrmqqm.js +0 -5
- package/dist/chunks/studio-ery42sqr.js +0 -4
- package/dist/chunks/studio-g1shz58g.js +0 -5
- package/dist/chunks/studio-gf0fz03c.js +0 -5
- package/dist/chunks/studio-gjtpe62q.js +0 -6
- package/dist/chunks/studio-gkskhg7m.js +0 -5
- package/dist/chunks/studio-gx4dnjzd.js +0 -5
- package/dist/chunks/studio-j03zga3y.js +0 -9
- package/dist/chunks/studio-jhpxeckz.js +0 -5
- package/dist/chunks/studio-k01r7ykp.js +0 -5
- package/dist/chunks/studio-kk7h30ne.js +0 -7
- package/dist/chunks/studio-kt1zqney.js +0 -5
- package/dist/chunks/studio-m3cwhvye.js +0 -5
- package/dist/chunks/studio-mcayt6hz.js +0 -5
- package/dist/chunks/studio-myjcghv3.js +0 -5
- package/dist/chunks/studio-n8bxwc3y.js +0 -4
- package/dist/chunks/studio-ngm8gvpb.js +0 -5
- package/dist/chunks/studio-nj5a01jy.js +0 -928
- package/dist/chunks/studio-pcgz8heb.js +0 -5
- package/dist/chunks/studio-qcsq0t15.js +0 -5
- package/dist/chunks/studio-qkstvve9.js +0 -5
- package/dist/chunks/studio-qv1pwd3c.js +0 -5
- package/dist/chunks/studio-rc6dvxjb.js +0 -7
- package/dist/chunks/studio-s8dmmz66.js +0 -5
- package/dist/chunks/studio-sp5xzbj4.js +0 -6
- package/dist/chunks/studio-szsjbj0g.js +0 -5
- package/dist/chunks/studio-t1xzawhr.js +0 -16
- package/dist/chunks/studio-tdcprbqb.js +0 -5
- package/dist/chunks/studio-vrmcjf9g.js +0 -7
- package/dist/chunks/studio-vyc0b4he.js +0 -10
- package/dist/chunks/studio-w0cgf6jg.js +0 -5
- package/dist/chunks/studio-w3hskzqk.js +0 -5
- package/dist/chunks/studio-xgrgcdyh.js +0 -9
- package/dist/chunks/studio-xz2yxfcb.js +0 -5
- package/dist/chunks/studio-y6n42tgs.js +0 -5
- package/dist/chunks/studio-yb560vxr.js +0 -5
- package/dist/chunks/studio-yn9f8vtx.js +0 -5
- package/dist/chunks/studio-yw05w8f0.js +0 -7
- package/dist/chunks/studio-z16sgavc.js +0 -5
- package/dist/chunks/studio-zey7zsdw.js +0 -12
- package/dist/chunks/studio-zyqn40w4.js +0 -5
- package/dist/chunks/swatch-group-8qh9a3bm.js +0 -4
- package/dist/chunks/tabs-jwthg40w.js +0 -4
- package/dist/chunks/textfield-spy3hc77.js +0 -4
- package/dist/chunks/toast-4d35zd64.js +0 -4
- package/dist/chunks/toast-host-8sjmfed3.js +0 -4
- package/dist/chunks/tooltip-fd6g9xy3.js +0 -4
- package/dist/chunks/tree-h19v1jfz.js +0 -4
- package/dist/chunks/tsMode-2frah6h1.js +0 -14
- package/dist/chunks/workspace-zt81g1ms.js +0 -4
- package/dist/chunks/ws-client-n2bh4hkf.js +0 -4
- package/src/panels/frontmatter-panel.ts +0 -701
- package/src/panels/git-panel.ts +0 -1120
- package/src/surfaces/doc-header.json +0 -776
- package/src/surfaces/doc-header.ts +0 -231
- package/src/surfaces/git-panel.json +0 -1880
- package/src/surfaces/git-panel.ts +0 -272
|
@@ -7,7 +7,8 @@
|
|
|
7
7
|
* a command, so what the document is handed is a PROJECTION of the registry rather than a list of
|
|
8
8
|
* buttons: `primary` is `forPlacement("commandbar/primary")` (capped at five by
|
|
9
9
|
* `scripts/check-chrome-budget.ts`), `docks` is the three dock records with the shell's state
|
|
10
|
-
* beside them, `
|
|
10
|
+
* beside them, `workspaces` is the five-workspace switcher with `shell.workspace` selected, the ⚙
|
|
11
|
+
* gear is the `settings/menu` placement, and the ⬢ Studio menu is
|
|
11
12
|
* `forPlacement("commandbar/overflow")` opened on the `menu` surface. With no project open the same
|
|
12
13
|
* document renders; the records' own `when` clauses empty it (§13.1: enablement is a predicate with
|
|
13
14
|
* a sentence, never a second template).
|
|
@@ -24,22 +25,23 @@
|
|
|
24
25
|
* is the platform's.
|
|
25
26
|
*
|
|
26
27
|
* **Retired, with a name, a chord and a residue** (`studio-ui-guidelines.md` §12.2): Open Project +
|
|
27
|
-
* New Project + recents → the pill and `Project: Open Recent…`; `Manage` →
|
|
28
|
-
* `Publish` → the `Publish:` family; `Sync
|
|
29
|
-
* in the pane context bar and is reachable
|
|
28
|
+
* New Project + recents → the pill and `Project: Open Recent…`; `Manage` → the Content workspace
|
|
29
|
+
* (`view.setWorkspace { workspace: "content" }`, ⌘2); `Publish` → the `Publish:` family; `Sync
|
|
30
|
+
* Project` → Source Control. The five-mode switcher lives in the pane context bar and is reachable
|
|
31
|
+
* as `View: Set Canvas Mode` in the palette.
|
|
30
32
|
*
|
|
31
33
|
* @docs studio/interface
|
|
32
34
|
*/
|
|
33
35
|
|
|
34
36
|
import { presenceProjection } from "../collab/presence-chips";
|
|
35
37
|
import { effect, effectScope, reactive } from "../reactivity";
|
|
36
|
-
import { activeTab } from "../workspace/workspace";
|
|
38
|
+
import { activeTab, workspace } from "../workspace/workspace";
|
|
37
39
|
import { primarySelection } from "../tabs/selection";
|
|
40
|
+
import { stylebookTarget } from "../style/stylebook-target";
|
|
38
41
|
import { shell } from "../shell";
|
|
39
42
|
import { openQuickSearch } from "../panels/quick-search";
|
|
40
|
-
import { showPromptDialog } from "../ui/layers";
|
|
41
43
|
import { getPlatform, hasPlatform } from "../platform";
|
|
42
|
-
import {
|
|
44
|
+
import { openUrlExternally } from "../canvas/preview-navigate";
|
|
43
45
|
import { armPreviewOverlay, flushPreviewOverlay } from "../preview/preview-overlay";
|
|
44
46
|
import { documentUrlPattern, dynamicRouteParams } from "../page-params";
|
|
45
47
|
import { getNodeAtPath, nodeLabel, projectState } from "../store";
|
|
@@ -49,6 +51,14 @@ import { notify } from "../services/notify";
|
|
|
49
51
|
import { mountSurface, registerSurface } from "../ui/surface";
|
|
50
52
|
import { rectOf } from "../utils/geometry";
|
|
51
53
|
import { openMenu } from "./menu";
|
|
54
|
+
import {
|
|
55
|
+
dismissSettingsMenu,
|
|
56
|
+
isSettingsMenuOpen,
|
|
57
|
+
openSettingsMenu,
|
|
58
|
+
SETTINGS_MENU_PLACEMENT,
|
|
59
|
+
} from "../panels/settings-menu";
|
|
60
|
+
import { WORKSPACES } from "../workspace/workspace-ids";
|
|
61
|
+
import type { WorkspaceId } from "../workspace/workspace-ids";
|
|
52
62
|
import commandbarDoc from "./commandbar.json";
|
|
53
63
|
import type { PresenceProjection } from "../collab/presence-chips";
|
|
54
64
|
import type { MenuHandle, MenuRowProjection } from "./menu";
|
|
@@ -57,9 +67,8 @@ import type { Tab } from "../tabs/tab";
|
|
|
57
67
|
import type { SiteBuildResult, SitePreviewResult, StudioPlatform } from "../types";
|
|
58
68
|
import type { CommandRegistry } from "../commands/registry";
|
|
59
69
|
import type { EffectScope } from "@vue/reactivity";
|
|
60
|
-
import type { JxDocument } from "@jxsuite/schema/types";
|
|
61
70
|
|
|
62
|
-
registerSurface("commandbar", commandbarDoc
|
|
71
|
+
registerSurface("commandbar", commandbarDoc);
|
|
63
72
|
|
|
64
73
|
/**
|
|
65
74
|
* What the Command Bar is handed at mount.
|
|
@@ -122,12 +131,22 @@ export interface DockProjection {
|
|
|
122
131
|
disabled: boolean;
|
|
123
132
|
}
|
|
124
133
|
|
|
125
|
-
/** One
|
|
126
|
-
export interface
|
|
127
|
-
id:
|
|
128
|
-
name: string;
|
|
129
|
-
active: boolean;
|
|
134
|
+
/** One workspace tab. */
|
|
135
|
+
export interface WorkspaceTabProjection {
|
|
136
|
+
id: WorkspaceId;
|
|
130
137
|
title: string;
|
|
138
|
+
icon: string;
|
|
139
|
+
/** The tab's tooltip: its title and chord, plus what its badge counts. */
|
|
140
|
+
tooltip: string;
|
|
141
|
+
/** The count drawn beside the title; empty for none, which hides the badge. */
|
|
142
|
+
badge: string;
|
|
143
|
+
/**
|
|
144
|
+
* What the badge counts, in words, as the tab's `aria-description`; empty for none. The badge is
|
|
145
|
+
* decorative, so this is how the count reaches a screen reader: the tab's NAME stays its title,
|
|
146
|
+
* which is what the label draws.
|
|
147
|
+
*/
|
|
148
|
+
description: string;
|
|
149
|
+
hasBadge: boolean;
|
|
131
150
|
}
|
|
132
151
|
|
|
133
152
|
/** One segment of the address bar. */
|
|
@@ -146,12 +165,20 @@ export interface SegmentProjection {
|
|
|
146
165
|
export type WindowControlLayout = "none" | "mac" | "other";
|
|
147
166
|
|
|
148
167
|
/** The document's scope: the projections, and the host functions its handlers `call`. */
|
|
149
|
-
interface CommandBarScope
|
|
168
|
+
interface CommandBarScope {
|
|
150
169
|
csd: WindowControlLayout;
|
|
151
170
|
menuVisible: boolean;
|
|
152
171
|
menuOpen: boolean;
|
|
153
|
-
|
|
154
|
-
|
|
172
|
+
workspacesVisible: boolean;
|
|
173
|
+
workspaces: WorkspaceTabProjection[];
|
|
174
|
+
/** The selected workspace tab's value: `shell.workspace`. */
|
|
175
|
+
workspace: string;
|
|
176
|
+
/** The quick-publish chevron beside the Publish tab: `publish.quick`, drawn when registered. */
|
|
177
|
+
quickVisible: boolean;
|
|
178
|
+
quickDisabled: boolean;
|
|
179
|
+
quickTooltip: string;
|
|
180
|
+
settingsVisible: boolean;
|
|
181
|
+
settingsOpen: boolean;
|
|
155
182
|
segments: SegmentProjection[];
|
|
156
183
|
chord: string;
|
|
157
184
|
hasChord: boolean;
|
|
@@ -162,9 +189,8 @@ interface CommandBarScope extends Record<string, unknown> {
|
|
|
162
189
|
run: (id: string) => void;
|
|
163
190
|
openSegment: (key: SegmentProjection["key"]) => void;
|
|
164
191
|
openPicker: () => void;
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
saveLayout: () => void;
|
|
192
|
+
setWorkspace: (id: string) => void;
|
|
193
|
+
openSettings: (anchor: EventTarget | null) => void;
|
|
168
194
|
openStudioMenu: (opener: HTMLElement) => void;
|
|
169
195
|
windowControl: (action: keyof WindowControls) => void;
|
|
170
196
|
}
|
|
@@ -194,6 +220,9 @@ const DOCKS = [
|
|
|
194
220
|
{ dock: "bottom", icon: "rows", id: "view.toggleBottomDock", mirror: false },
|
|
195
221
|
] as const;
|
|
196
222
|
|
|
223
|
+
/** The record the chevron beside the Publish tab renders. */
|
|
224
|
+
const QUICK_PUBLISH = "publish.quick";
|
|
225
|
+
|
|
197
226
|
/** The palette mode each segment of the address opens. */
|
|
198
227
|
const SEGMENT_MODES = { document: "files", project: "projects", selection: "nodes" } as const;
|
|
199
228
|
|
|
@@ -262,7 +291,7 @@ export function openInBrowserTarget(tab: Tab | null): BrowserTarget {
|
|
|
262
291
|
}
|
|
263
292
|
const params = dynamicRouteParams(documentPath);
|
|
264
293
|
if (params.length > 0) {
|
|
265
|
-
const chosen =
|
|
294
|
+
const chosen: Record<string, string> = tab?.session.ui.previewParams ?? {};
|
|
266
295
|
const missing = params.filter((name) => !chosen[name]);
|
|
267
296
|
if (missing.length > 0) {
|
|
268
297
|
const names = missing.map((name) => `:${name}`).join(", ");
|
|
@@ -280,22 +309,6 @@ export function openInBrowserTarget(tab: Tab | null): BrowserTarget {
|
|
|
280
309
|
return { path: route === "/" ? "/" : trailingSlash === "always" ? `${route}/` : route };
|
|
281
310
|
}
|
|
282
311
|
|
|
283
|
-
/**
|
|
284
|
-
* Hand a URL to the user's real browser.
|
|
285
|
-
*
|
|
286
|
-
* Reuses the seam the desktop launchers already register for Preview link clicks
|
|
287
|
-
* (`canvas/preview-navigate.ts`), which routes through the OS rather than navigating a webview with
|
|
288
|
-
* no address bar; the browser build falls back to a new tab.
|
|
289
|
-
*/
|
|
290
|
-
function openUrlExternally(url: string) {
|
|
291
|
-
const override = getPreviewNavigateHandler();
|
|
292
|
-
if (override) {
|
|
293
|
-
override(url);
|
|
294
|
-
return;
|
|
295
|
-
}
|
|
296
|
-
window.open(url, "_blank", "noopener,noreferrer");
|
|
297
|
-
}
|
|
298
|
-
|
|
299
312
|
/**
|
|
300
313
|
* Run `View: Open in Browser`, reporting the blocking reason when there is one.
|
|
301
314
|
*
|
|
@@ -482,8 +495,8 @@ const BUILD_SITE = "project.buildSite";
|
|
|
482
495
|
const OPEN_IN_BROWSER = "view.openInBrowser";
|
|
483
496
|
|
|
484
497
|
/** The sentence in an unknown thrown value. */
|
|
485
|
-
function errorText(
|
|
486
|
-
return
|
|
498
|
+
function errorText(cause: unknown): string {
|
|
499
|
+
return cause instanceof Error ? cause.message : String(cause);
|
|
487
500
|
}
|
|
488
501
|
|
|
489
502
|
/** The document's label: its path without the project root, which is already segment one. */
|
|
@@ -497,11 +510,21 @@ export function documentSegmentLabel(tab: Tab | null): string {
|
|
|
497
510
|
return root && trimmed.startsWith(`${root}/`) ? trimmed.slice(root.length + 1) : trimmed;
|
|
498
511
|
}
|
|
499
512
|
|
|
500
|
-
/**
|
|
513
|
+
/**
|
|
514
|
+
* The selection's label — the Outline's own `nodeLabel`, so the two never disagree.
|
|
515
|
+
*
|
|
516
|
+
* In the Styles workspace's Elements view the selection is a TAG (`stylebookTarget`), and the
|
|
517
|
+
* segment names it the way the status bar and the Style body do: `project.json › h1`, not the root
|
|
518
|
+
* node of the catalogue's document.
|
|
519
|
+
*/
|
|
501
520
|
export function selectionSegmentLabel(tab: Tab | null): string {
|
|
502
521
|
if (shell.layoutSelection) {
|
|
503
522
|
return "layout";
|
|
504
523
|
}
|
|
524
|
+
const tag = stylebookTarget(tab);
|
|
525
|
+
if (tag) {
|
|
526
|
+
return tag.replaceAll(" ", " › ");
|
|
527
|
+
}
|
|
505
528
|
const paths = tab?.session.selection ?? [];
|
|
506
529
|
const selection = primarySelection(paths);
|
|
507
530
|
if (!tab || !selection) {
|
|
@@ -515,30 +538,6 @@ export function selectionSegmentLabel(tab: Tab | null): string {
|
|
|
515
538
|
return nodeLabel(getNodeAtPath(tab.doc.document, selection));
|
|
516
539
|
}
|
|
517
540
|
|
|
518
|
-
/** Ask for a name, then run the command. Exported for the same reason `runOpenInBrowser` is. */
|
|
519
|
-
export async function saveLayoutPrompt(registry: CommandRegistry): Promise<void> {
|
|
520
|
-
const name = await showPromptDialog("Save layout", {
|
|
521
|
-
confirmLabel: "Save",
|
|
522
|
-
message: "Remembers this project's Navigator panel, dock widths and Inspector tab.",
|
|
523
|
-
placeholder: "Layout name",
|
|
524
|
-
});
|
|
525
|
-
if (name) {
|
|
526
|
-
await runReported(registry, "view.saveLayout", { name }, "Command Bar");
|
|
527
|
-
}
|
|
528
|
-
}
|
|
529
|
-
|
|
530
|
-
/** The double-click gesture, routed through the command so the rename has one implementation. */
|
|
531
|
-
export async function renameLayoutPrompt(
|
|
532
|
-
registry: CommandRegistry,
|
|
533
|
-
layout: string,
|
|
534
|
-
current: string,
|
|
535
|
-
): Promise<void> {
|
|
536
|
-
const name = await showPromptDialog("Rename layout", { confirmLabel: "Rename", value: current });
|
|
537
|
-
if (name) {
|
|
538
|
-
await runReported(registry, "view.renameLayout", { layout, name }, "Command Bar");
|
|
539
|
-
}
|
|
540
|
-
}
|
|
541
|
-
|
|
542
541
|
interface WindowControls {
|
|
543
542
|
minimize: () => void;
|
|
544
543
|
maximize: () => void;
|
|
@@ -546,11 +545,17 @@ 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 adapters that add
|
|
553
|
+
it is the desktop launcher's (`chromium/platform.ts` under the Electron shell), whose objects carry the `close`,
|
|
554
|
+
`maximize` and `minimize` functions this bar calls. */
|
|
555
|
+
return platform.windowControls as WindowControls | undefined;
|
|
551
556
|
}
|
|
552
557
|
|
|
553
|
-
// ─── The Command Center pill, the
|
|
558
|
+
// ─── The Command Center pill, the workspace tabs and the docks, projected ────
|
|
554
559
|
|
|
555
560
|
/**
|
|
556
561
|
* `◈ project › document › selection`: four facts about where you are, in non-collapsible chrome
|
|
@@ -579,25 +584,35 @@ function projectSegments(tab: Tab | null): SegmentProjection[] {
|
|
|
579
584
|
}
|
|
580
585
|
|
|
581
586
|
/**
|
|
582
|
-
* `
|
|
587
|
+
* `Design · Content · Media · Styles · Publish`: the five workspaces, as a tablist.
|
|
583
588
|
*
|
|
584
|
-
* Each tab RUNS `view.
|
|
585
|
-
* path
|
|
586
|
-
*
|
|
587
|
-
*
|
|
589
|
+
* Each tab RUNS `view.setWorkspace`, so the click, ⌘1–5, the palette row and a script all take the
|
|
590
|
+
* same path, and the selected tab is `shell.workspace` rather than a second record of it. Publish
|
|
591
|
+
* carries the count of uncommitted changes, which is what the workspace is there to deal with; at
|
|
592
|
+
* zero the badge is not drawn, because "0" is a number a reader has to read to learn nothing.
|
|
588
593
|
*/
|
|
589
|
-
function
|
|
594
|
+
function projectWorkspaces(registry: CommandRegistry | null): WorkspaceTabProjection[] {
|
|
590
595
|
// `get` first: a registry that has not been handed the shell's records yet (the skeleton the bar
|
|
591
596
|
// Paints before the bootstrap composes them) has no verb to ask about.
|
|
592
|
-
if (!registry?.get("view.
|
|
597
|
+
if (!registry?.get("view.setWorkspace") || !registry.isEnabled("view.setWorkspace")) {
|
|
593
598
|
return [];
|
|
594
599
|
}
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
id:
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
600
|
+
const dirty = shell.git.status?.files.length ?? 0;
|
|
601
|
+
return WORKSPACES.map((entry) => {
|
|
602
|
+
const badge = entry.id === "publish" && dirty > 0 ? String(dirty) : "";
|
|
603
|
+
const chord = registry.keymap.formatBinding(`workspace.focus.${entry.id}`);
|
|
604
|
+
const named = chord ? `${entry.title} (${chord})` : entry.title;
|
|
605
|
+
const description = badge ? `${badge} unpublished ${dirty === 1 ? "change" : "changes"}` : "";
|
|
606
|
+
return {
|
|
607
|
+
badge,
|
|
608
|
+
description,
|
|
609
|
+
hasBadge: badge !== "",
|
|
610
|
+
icon: entry.icon,
|
|
611
|
+
id: entry.id,
|
|
612
|
+
title: entry.title,
|
|
613
|
+
tooltip: description ? `${named}, ${description}` : named,
|
|
614
|
+
};
|
|
615
|
+
});
|
|
601
616
|
}
|
|
602
617
|
|
|
603
618
|
/** The primary verb cluster: exactly what declared `commandbar/primary`, in the registry's order. */
|
|
@@ -729,8 +744,6 @@ function state(): CommandBarScope {
|
|
|
729
744
|
csd: "none",
|
|
730
745
|
docks: [],
|
|
731
746
|
hasChord: false,
|
|
732
|
-
layouts: [],
|
|
733
|
-
layoutsVisible: false,
|
|
734
747
|
menuOpen: false,
|
|
735
748
|
menuVisible: false,
|
|
736
749
|
openPicker: () => {
|
|
@@ -739,37 +752,47 @@ function state(): CommandBarScope {
|
|
|
739
752
|
openSegment: (key) => {
|
|
740
753
|
openQuickSearch(SEGMENT_MODES[key]);
|
|
741
754
|
},
|
|
755
|
+
openSettings: (anchor: EventTarget | null) => {
|
|
756
|
+
if (!(anchor instanceof HTMLElement)) {
|
|
757
|
+
return;
|
|
758
|
+
}
|
|
759
|
+
openSettingsMenu(anchor, {
|
|
760
|
+
rerender: () => {
|
|
761
|
+
if (_state) {
|
|
762
|
+
_state.settingsOpen = isSettingsMenuOpen();
|
|
763
|
+
}
|
|
764
|
+
},
|
|
765
|
+
});
|
|
766
|
+
},
|
|
742
767
|
openStudioMenu,
|
|
743
768
|
presence: NO_PRESENCE,
|
|
744
769
|
presenceVisible: false,
|
|
745
770
|
primary: [],
|
|
746
|
-
renameLayout: (id) => {
|
|
747
|
-
const registry = activeRegistry();
|
|
748
|
-
const preset = shell.layouts.find((layout) => layout.id === id);
|
|
749
|
-
if (registry && preset) {
|
|
750
|
-
void renameLayoutPrompt(registry, id, preset.name);
|
|
751
|
-
}
|
|
752
|
-
},
|
|
753
771
|
run: (id) => {
|
|
754
772
|
const registry = activeRegistry();
|
|
755
773
|
if (registry?.isEnabled(id)) {
|
|
756
774
|
void runReported(registry, id, undefined, "Command Bar");
|
|
757
775
|
}
|
|
758
776
|
},
|
|
759
|
-
saveLayout: () => {
|
|
760
|
-
const registry = activeRegistry();
|
|
761
|
-
if (registry) {
|
|
762
|
-
void saveLayoutPrompt(registry);
|
|
763
|
-
}
|
|
764
|
-
},
|
|
765
777
|
segments: [],
|
|
766
|
-
|
|
767
|
-
|
|
778
|
+
/* Run from each tab's CLICK, not from the strip's `change`: `jx-tabs` dispatches no change for
|
|
779
|
+
the tab already selected, and activating the selected workspace again is how an author gets
|
|
780
|
+
its home back after closing it. Enter and Space click the tab too (manual activation). */
|
|
781
|
+
setWorkspace: (id) => {
|
|
782
|
+
void runActiveReported("view.setWorkspace", { workspace: id }, "Command Bar");
|
|
768
783
|
},
|
|
784
|
+
settingsOpen: false,
|
|
785
|
+
settingsVisible: false,
|
|
769
786
|
windowControl: (action) => {
|
|
770
787
|
windowControls()?.[action]();
|
|
771
788
|
},
|
|
772
|
-
|
|
789
|
+
quickDisabled: true,
|
|
790
|
+
quickTooltip: "",
|
|
791
|
+
quickVisible: false,
|
|
792
|
+
workspace: "",
|
|
793
|
+
workspaces: [],
|
|
794
|
+
workspacesVisible: false,
|
|
795
|
+
});
|
|
773
796
|
return _state;
|
|
774
797
|
}
|
|
775
798
|
|
|
@@ -784,8 +807,20 @@ function project(): void {
|
|
|
784
807
|
const controls = windowControls();
|
|
785
808
|
scope.csd = controls ? (isMacPlatform() ? "mac" : "other") : "none";
|
|
786
809
|
scope.menuVisible = registry !== null;
|
|
787
|
-
scope.
|
|
788
|
-
scope.
|
|
810
|
+
scope.workspaces = projectWorkspaces(registry);
|
|
811
|
+
scope.workspacesVisible = scope.workspaces.length > 0;
|
|
812
|
+
scope.workspace = shell.workspace;
|
|
813
|
+
/* The chevron is a rendering of `publish.quick`, beside the tablist that ends on Publish
|
|
814
|
+
(studio.md §22.2): drawn only with the tabs and only while the registry shows the record, and
|
|
815
|
+
disabled with its own reason rather than hidden when the project is not a repository. */
|
|
816
|
+
const quick = QUICK_PUBLISH;
|
|
817
|
+
scope.quickVisible =
|
|
818
|
+
scope.workspacesVisible && registry?.get(quick) !== undefined && registry.isVisible(quick);
|
|
819
|
+
scope.quickDisabled = !scope.quickVisible || !registry?.isEnabled(quick);
|
|
820
|
+
scope.quickTooltip = registry && scope.quickVisible ? commandTooltip(registry, quick) : "";
|
|
821
|
+
scope.settingsVisible =
|
|
822
|
+
registry !== null && registry.forPlacement(SETTINGS_MENU_PLACEMENT).length > 0;
|
|
823
|
+
scope.settingsOpen = isSettingsMenuOpen();
|
|
789
824
|
scope.segments = projectSegments(tab);
|
|
790
825
|
scope.chord = registry?.keymap.formatBinding("palette.open") ?? "";
|
|
791
826
|
scope.hasChord = scope.chord !== "";
|
|
@@ -812,7 +847,7 @@ export function mount(rootEl: HTMLElement, _ctx: ToolbarCtx = {}): void {
|
|
|
812
847
|
unmount();
|
|
813
848
|
_rootEl = rootEl;
|
|
814
849
|
if (windowControls()) {
|
|
815
|
-
rootEl.classList.add("
|
|
850
|
+
rootEl.classList.add("app-region-drag");
|
|
816
851
|
}
|
|
817
852
|
_scope = effectScope();
|
|
818
853
|
_scope.run(() => {
|
|
@@ -825,10 +860,14 @@ export function mount(rootEl: HTMLElement, _ctx: ToolbarCtx = {}): void {
|
|
|
825
860
|
void shell.docks.bottom.collapsed;
|
|
826
861
|
void shell.git.status;
|
|
827
862
|
void shell.layoutSelection;
|
|
828
|
-
// The
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
863
|
+
// The pill's selection segment names a Styles specimen's tag (`selectionSegmentLabel`).
|
|
864
|
+
void shell.stylebook.selection;
|
|
865
|
+
// The workspace tabs follow the shell, so a switch made by a chord, a script or a tab's
|
|
866
|
+
// Activation repaints the selected tab.
|
|
867
|
+
void shell.workspace;
|
|
868
|
+
// The project opening is what makes the workspace tabs (and the pill's project name) live:
|
|
869
|
+
// `projectState` is not reactive, and the reactive root it is opened beside is.
|
|
870
|
+
void workspace.projectRoot;
|
|
832
871
|
// The registry itself is reactive state: it is composed AFTER this mount runs, and reading it
|
|
833
872
|
// Here is what repaints the band from a skeleton into the real bar.
|
|
834
873
|
void activeRegistry();
|
|
@@ -861,6 +900,7 @@ export function mount(rootEl: HTMLElement, _ctx: ToolbarCtx = {}): void {
|
|
|
861
900
|
|
|
862
901
|
export function unmount(): void {
|
|
863
902
|
_menu?.close();
|
|
903
|
+
dismissSettingsMenu();
|
|
864
904
|
_scope?.stop();
|
|
865
905
|
_scope = null;
|
|
866
906
|
const pending = _mount;
|
|
@@ -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 {
|