@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
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/// <reference lib="dom" />
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* Two direct views of `project.json`: Deploy (the build adapter) and Raw JSON (the file itself).
|
|
4
4
|
*
|
|
5
5
|
* They live together because each is a small, direct view of ONE `project.json` key and neither
|
|
6
6
|
* owns a dialog, a picker or a schema form: `build.adapter` (one enum), and the file itself.
|
|
@@ -12,8 +12,11 @@
|
|
|
12
12
|
* error plumbing both still share.
|
|
13
13
|
*
|
|
14
14
|
* **Raw JSON does not open a second editor.** It shows what is on disk and hands the author to the
|
|
15
|
-
* Code editor over the
|
|
16
|
-
*
|
|
15
|
+
* Code editor over the `project.json` tab (§17.1): the host says how, through `editAsCode`, because
|
|
16
|
+
* the section sits in the settings dialog and the tab it opens is the Styles workspace's.
|
|
17
|
+
*
|
|
18
|
+
* **Deploy is no longer a Project Settings section.** Hosting moved to the Publish workspace
|
|
19
|
+
* (§17.1's Moved footnote), which hosts `renderDeploySection`; the renderer is unchanged.
|
|
17
20
|
*
|
|
18
21
|
* **The markup left.** Each section is a Jx document over the kit — `surfaces/settings-deploy.json`
|
|
19
22
|
* and `surfaces/settings-rawjson.json`, mounted by the adapters beside them — and what is here is
|
|
@@ -29,9 +32,8 @@
|
|
|
29
32
|
*/
|
|
30
33
|
|
|
31
34
|
import { errorMessage } from "@jxsuite/schema/parse";
|
|
32
|
-
import { projectState
|
|
35
|
+
import { projectState } from "../store";
|
|
33
36
|
import { serializeProjectConfig } from "../tabs/project-config";
|
|
34
|
-
import { tabOfContainer } from "../canvas/canvas-surface";
|
|
35
37
|
import { updateSiteConfig } from "../site-context";
|
|
36
38
|
import { mountDeploySurface } from "../surfaces/settings-deploy";
|
|
37
39
|
import { mountRawJsonSurface } from "../surfaces/settings-rawjson";
|
|
@@ -40,9 +42,6 @@ import type { DeployActions, DeploySurfaceHandle, DeployValues } from "../surfac
|
|
|
40
42
|
import type { RawJsonSurfaceHandle, RawJsonValues } from "../surfaces/settings-rawjson";
|
|
41
43
|
import type { ProjectConfig } from "@jxsuite/schema/types";
|
|
42
44
|
|
|
43
|
-
/** The mode the Code editor draws under — `tabs/tab.ts`'s `EDITOR_KIND_BY_MODE` maps it to `code`. */
|
|
44
|
-
const CODE_MODE = "source";
|
|
45
|
-
|
|
46
45
|
/**
|
|
47
46
|
* The last failed write per rendered section container.
|
|
48
47
|
*
|
|
@@ -54,7 +53,7 @@ const errors = new WeakMap<HTMLElement, string>();
|
|
|
54
53
|
|
|
55
54
|
/** The live project configuration, or an empty one before a project is open. */
|
|
56
55
|
function config(): ProjectConfig {
|
|
57
|
-
return
|
|
56
|
+
return projectState?.projectConfig ?? {};
|
|
58
57
|
}
|
|
59
58
|
|
|
60
59
|
// ─── Deploy ───────────────────────────────────────────────────────────────────
|
|
@@ -151,6 +150,17 @@ export function renderDeploySection(container: HTMLElement): void {
|
|
|
151
150
|
);
|
|
152
151
|
}
|
|
153
152
|
|
|
153
|
+
/**
|
|
154
|
+
* Take the Deploy section out of a container its host is leaving (Publish › Hosting, when its pane
|
|
155
|
+
* is torn down). Idempotent.
|
|
156
|
+
*
|
|
157
|
+
* @param {HTMLElement} container
|
|
158
|
+
*/
|
|
159
|
+
export function disposeDeploySection(container: HTMLElement): void {
|
|
160
|
+
deployMounts.get(container)?.dispose();
|
|
161
|
+
deployMounts.delete(container);
|
|
162
|
+
}
|
|
163
|
+
|
|
154
164
|
// ─── Raw JSON ─────────────────────────────────────────────────────────────────
|
|
155
165
|
|
|
156
166
|
/** The surface mounted in each Raw JSON container. */
|
|
@@ -166,12 +176,19 @@ function rawJsonValues(): RawJsonValues {
|
|
|
166
176
|
return { json: serializeProjectConfig(config()) };
|
|
167
177
|
}
|
|
168
178
|
|
|
179
|
+
/** What the Raw JSON section asks its host to do. */
|
|
180
|
+
export interface RawJsonSectionActions {
|
|
181
|
+
/** Open `project.json` in the Code editor, leaving wherever the section is drawn. */
|
|
182
|
+
editAsCode: () => void;
|
|
183
|
+
}
|
|
184
|
+
|
|
169
185
|
/**
|
|
170
186
|
* `project.json` as it is written, and the way into editing it as text.
|
|
171
187
|
*
|
|
172
188
|
* @param {HTMLElement} container
|
|
189
|
+
* @param {RawJsonSectionActions} actions
|
|
173
190
|
*/
|
|
174
|
-
export function renderRawJsonSection(container: HTMLElement): void {
|
|
191
|
+
export function renderRawJsonSection(container: HTMLElement, actions: RawJsonSectionActions): void {
|
|
175
192
|
const standing = rawJsonMounts.get(container);
|
|
176
193
|
if (standing?.connected()) {
|
|
177
194
|
standing.update(rawJsonValues());
|
|
@@ -181,7 +198,7 @@ export function renderRawJsonSection(container: HTMLElement): void {
|
|
|
181
198
|
rawJsonMounts.set(
|
|
182
199
|
container,
|
|
183
200
|
mountRawJsonSurface(container, rawJsonValues(), {
|
|
184
|
-
editAsCode:
|
|
201
|
+
editAsCode: actions.editAsCode,
|
|
185
202
|
}),
|
|
186
203
|
);
|
|
187
204
|
}
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
14
|
import { isMediaFormat } from "../utils/studio-utils";
|
|
15
|
+
import { localDay } from "../utils/local-day";
|
|
15
16
|
|
|
16
17
|
export interface SchemaProperty {
|
|
17
18
|
type?: string;
|
|
@@ -26,6 +27,15 @@ export const FIELD_TYPES = ["string", "number", "boolean", "array", "object", "r
|
|
|
26
27
|
|
|
27
28
|
export const FORMAT_OPTIONS = ["", "image", "date", "color"];
|
|
28
29
|
|
|
30
|
+
/** What a new field's add row starts as. Spread it: every add row edits its own copy. */
|
|
31
|
+
export const BLANK_FIELD = { format: "", name: "", required: false, type: "string" };
|
|
32
|
+
|
|
33
|
+
/** One object field's unsubmitted nested field. */
|
|
34
|
+
export interface NestedFieldDraft {
|
|
35
|
+
name: string;
|
|
36
|
+
type: string;
|
|
37
|
+
}
|
|
38
|
+
|
|
29
39
|
/**
|
|
30
40
|
* Detect the studio field type from a JSON Schema property definition.
|
|
31
41
|
*
|
|
@@ -93,7 +103,8 @@ export function schemaForType(type: string, format?: string) {
|
|
|
93
103
|
*/
|
|
94
104
|
export function yamlDefault(type: string, format?: string) {
|
|
95
105
|
if (format === "date") {
|
|
96
|
-
|
|
106
|
+
// Today where the author is: a UTC "today" is tomorrow every evening west of Greenwich.
|
|
107
|
+
return localDay(new Date());
|
|
97
108
|
}
|
|
98
109
|
if (isMediaFormat(format)) {
|
|
99
110
|
return '""';
|
|
@@ -3,15 +3,16 @@
|
|
|
3
3
|
*
|
|
4
4
|
* `registerSettingsSection` is a **preserved public contract** (specs/extensions.md §9.1): an
|
|
5
5
|
* extension's `project` class declares a `$studio.settings` block and `settings/extension-sections`
|
|
6
|
-
* turns it into one of these records. Project Settings moved
|
|
7
|
-
* the pane (§17.1)
|
|
8
|
-
* CONFIGURATION, not to
|
|
9
|
-
* contribution point being touched.
|
|
6
|
+
* turns it into one of these records. Project Settings has moved host twice — a modal, then a
|
|
7
|
+
* document in the pane, and now a dialog again (§17.1) — and the registry moved with neither,
|
|
8
|
+
* because a section is a contribution to CONFIGURATION, not to whatever draws it. Splitting it out
|
|
9
|
+
* is what lets the host be replaced without the contribution point being touched.
|
|
10
10
|
*
|
|
11
|
-
* **This module holds no renderer and imports nothing.** That is load-bearing rather than tidy:
|
|
12
|
-
* `panels/settings-
|
|
13
|
-
* imports becomes part of the
|
|
14
|
-
* `settings/settings-document.ts`, which the app loads when it registers its
|
|
11
|
+
* **This module holds no renderer and imports nothing.** That is load-bearing rather than tidy: the
|
|
12
|
+
* gear menu (`panels/settings-menu.ts`) enumerates these sections from the top bar, so anything
|
|
13
|
+
* this module imports becomes part of the chrome's import graph. The section RENDERERS are
|
|
14
|
+
* registered by `settings/settings-document.ts`, which the app loads when it registers its
|
|
15
|
+
* commands.
|
|
15
16
|
*
|
|
16
17
|
* **What is requested and what is displayed are two variables, and unregistering touches neither.**
|
|
17
18
|
* The modal had one, and its `unregisterSettingsSection` reset it to `"general"` — which is half of
|
|
@@ -22,10 +23,57 @@
|
|
|
22
23
|
* the key comes back.
|
|
23
24
|
*/
|
|
24
25
|
|
|
26
|
+
/**
|
|
27
|
+
* The three groups the Project Settings nav is drawn in (§17.1), in display order.
|
|
28
|
+
*
|
|
29
|
+
* - **General** is what every author sets: the site's name, address and icon, and its languages.
|
|
30
|
+
* - **Integrations** is what an extension adds, and so where every contributed section lands unless
|
|
31
|
+
* it says otherwise (`specs/extensions.md` §9.1, `group`).
|
|
32
|
+
* - **Advanced** is the project's machinery, marked "For developers": rendering contexts, the site
|
|
33
|
+
* head, data shapes, packages and the raw file.
|
|
34
|
+
*
|
|
35
|
+
* `intro` is the sentence the body opens with while a section of that group is showing: what the
|
|
36
|
+
* group is FOR, so the reader learns that Advanced is the risky one from a sentence rather than
|
|
37
|
+
* from a two-word qualifier. General's sections need no preamble, so it has none.
|
|
38
|
+
*/
|
|
39
|
+
export const SETTINGS_GROUPS = [
|
|
40
|
+
{ id: "general", intro: "", label: "General", note: "" },
|
|
41
|
+
{
|
|
42
|
+
id: "integrations",
|
|
43
|
+
intro: "Turn on what your site needs. Each one adds its own options where you use it.",
|
|
44
|
+
label: "Integrations",
|
|
45
|
+
note: "",
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
id: "advanced",
|
|
49
|
+
intro: "Changes here affect every page. Most sites never need them.",
|
|
50
|
+
label: "Advanced",
|
|
51
|
+
note: "For developers",
|
|
52
|
+
},
|
|
53
|
+
] as const;
|
|
54
|
+
|
|
55
|
+
/** A settings group's id. */
|
|
56
|
+
export type SettingsGroupId = (typeof SETTINGS_GROUPS)[number]["id"];
|
|
57
|
+
|
|
58
|
+
/** Where a section with no `group` is listed: the extension default `extensions.md` §9.1 names. */
|
|
59
|
+
export const DEFAULT_SETTINGS_GROUP: SettingsGroupId = "integrations";
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Whether a value names one of {@link SETTINGS_GROUPS}.
|
|
63
|
+
*
|
|
64
|
+
* @param {unknown} value
|
|
65
|
+
* @returns {boolean}
|
|
66
|
+
*/
|
|
67
|
+
export function isSettingsGroupId(value: unknown): value is SettingsGroupId {
|
|
68
|
+
return SETTINGS_GROUPS.some((group) => group.id === value);
|
|
69
|
+
}
|
|
70
|
+
|
|
25
71
|
/** A Project Settings section: an inner-nav entry plus a renderer for the content area. */
|
|
26
72
|
export interface SettingsSection {
|
|
27
73
|
key: string;
|
|
28
74
|
label: string;
|
|
75
|
+
/** Which nav group lists the section. Absent means {@link DEFAULT_SETTINGS_GROUP}. */
|
|
76
|
+
group?: SettingsGroupId | undefined;
|
|
29
77
|
/**
|
|
30
78
|
* Nav icon name (reserved for future nav treatments).
|
|
31
79
|
*
|
|
@@ -37,7 +85,20 @@ export interface SettingsSection {
|
|
|
37
85
|
icon?: string | undefined;
|
|
38
86
|
/** Sort position — lower orders render higher in the inner nav. */
|
|
39
87
|
order: number;
|
|
40
|
-
|
|
88
|
+
/**
|
|
89
|
+
* The sentence the body opens with while THIS section shows, in place of its group's `intro`.
|
|
90
|
+
*
|
|
91
|
+
* A group's sentence says what the group is for, and a section that is not that (Content Types is
|
|
92
|
+
* a list of the project's collections, not something to turn on) says what it is instead. Absent
|
|
93
|
+
* or empty, the group's sentence stands.
|
|
94
|
+
*/
|
|
95
|
+
intro?: string | undefined;
|
|
96
|
+
/**
|
|
97
|
+
* Draw the section into `container`. A renderer that returns a promise is awaited, so a section
|
|
98
|
+
* whose first paint needs IO fails where the reader is looking: a rejection, like a throw, is
|
|
99
|
+
* shown in the body in place of the section (`panels/settings-pane.ts`).
|
|
100
|
+
*/
|
|
101
|
+
render: (container: HTMLElement) => void | Promise<void>;
|
|
41
102
|
}
|
|
42
103
|
|
|
43
104
|
/** Where a settings document lands when nobody named a section. */
|
|
@@ -110,9 +171,53 @@ export function sortedSettingsSections(): SettingsSection[] {
|
|
|
110
171
|
return [...sections.values()].toSorted((a, b) => a.order - b.order);
|
|
111
172
|
}
|
|
112
173
|
|
|
113
|
-
/**
|
|
174
|
+
/** One nav group and the sections listed under it. */
|
|
175
|
+
export interface SettingsSectionGroup {
|
|
176
|
+
id: SettingsGroupId;
|
|
177
|
+
label: string;
|
|
178
|
+
/** A qualifier drawn beside the label ("For developers"), or the empty string. */
|
|
179
|
+
note: string;
|
|
180
|
+
/** What the body opens with while one of this group's sections shows, or the empty string. */
|
|
181
|
+
intro: string;
|
|
182
|
+
sections: SettingsSection[];
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* The registered sections in their nav groups: groups in {@link SETTINGS_GROUPS} order, sections in
|
|
187
|
+
* `order` within each. A group with no section is left out, so an empty heading is never drawn.
|
|
188
|
+
*
|
|
189
|
+
* @returns {SettingsSectionGroup[]}
|
|
190
|
+
*/
|
|
191
|
+
export function groupedSettingsSections(): SettingsSectionGroup[] {
|
|
192
|
+
const sorted = sortedSettingsSections();
|
|
193
|
+
return SETTINGS_GROUPS.flatMap((group) => {
|
|
194
|
+
const listed = sorted.filter(
|
|
195
|
+
(section) => (section.group ?? DEFAULT_SETTINGS_GROUP) === group.id,
|
|
196
|
+
);
|
|
197
|
+
return listed.length === 0
|
|
198
|
+
? []
|
|
199
|
+
: [
|
|
200
|
+
{
|
|
201
|
+
id: group.id,
|
|
202
|
+
intro: group.intro,
|
|
203
|
+
label: group.label,
|
|
204
|
+
note: group.note,
|
|
205
|
+
sections: listed,
|
|
206
|
+
},
|
|
207
|
+
];
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Every registered section key, built-ins and contributions alike, in display order.
|
|
213
|
+
*
|
|
214
|
+
* Display order is the GROUPED order (General, then Integrations, then Advanced), so the gear's
|
|
215
|
+
* submenu and a refusal naming the registered keys list them as the reader sees them.
|
|
216
|
+
*
|
|
217
|
+
* @returns {string[]}
|
|
218
|
+
*/
|
|
114
219
|
export function settingsSectionKeys(): string[] {
|
|
115
|
-
return
|
|
220
|
+
return groupedSettingsSections().flatMap((group) => group.sections.map((section) => section.key));
|
|
116
221
|
}
|
|
117
222
|
|
|
118
223
|
/**
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
/// <reference lib="dom" />
|
|
2
|
+
/**
|
|
3
|
+
* Project Settings as a dialog (§17.1): the flow that opens it, mounts the settings editor into it,
|
|
4
|
+
* and takes both down.
|
|
5
|
+
*
|
|
6
|
+
* Project Settings was a document in the pane, the `project.json` tab under a `settings` editor
|
|
7
|
+
* mode. The five workspaces made that the wrong home: a tab belongs to exactly one workspace, and
|
|
8
|
+
* configuration belongs to all of them, so a settings TAB either pulled the author out of the
|
|
9
|
+
* workspace they were in or had to be special-cased in every one. A dialog is reachable from every
|
|
10
|
+
* workspace and leaves the one underneath where it was. What made the old modal a problem (a form
|
|
11
|
+
* that hid the canvas it was tuning) left with the design tokens, which are the Styles workspace's
|
|
12
|
+
* now; every section still here writes `project.json` as it is edited, through the one chokepoint
|
|
13
|
+
* (`tabs/project-config.ts`), so the dialog has nothing to confirm and its one answer is Close.
|
|
14
|
+
*
|
|
15
|
+
* **Which section shows is the registry's, not this module's.** `settings/section-registry.ts`
|
|
16
|
+
* holds the requested and the displayed section and outlives the dialog, which is what makes the
|
|
17
|
+
* dialog reopen where the author left it for the rest of the session.
|
|
18
|
+
*
|
|
19
|
+
* Modality, Escape and focus restoration are the platform's: a `jx-dialog` in the dialog layer,
|
|
20
|
+
* opened with `showModal()`, which puts focus back on whatever opened it when it closes.
|
|
21
|
+
*
|
|
22
|
+
* **The frame and the editor are built once per session** and kept, closed, in the dialog layer. A
|
|
23
|
+
* close suspends the editor (it stops following the section registry) and closes the platform's
|
|
24
|
+
* dialog; an open resumes it, which redraws the current section, and shows the same dialog again.
|
|
25
|
+
* Rebuilding both on every open was most of what opening Settings cost, and disposing them inside
|
|
26
|
+
* the dialog's own `cancel` handler removed a subtree that still held focus from the top layer,
|
|
27
|
+
* which the browser re-styled on the way out. {@link disposeSettingsDialog} is the teardown, and a
|
|
28
|
+
* frame whose layer was replaced under it is rebuilt rather than shown.
|
|
29
|
+
*
|
|
30
|
+
* @docs studio/projects/settings
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
import { activeRegistry } from "../commands/active-registry";
|
|
34
|
+
import { runActiveReported } from "../commands/run-reported";
|
|
35
|
+
import { mountSettingsPane } from "../panels/settings-pane";
|
|
36
|
+
import { openSettingsDialogSurface } from "../surfaces/settings-dialog";
|
|
37
|
+
import { layerHost } from "../ui/layers";
|
|
38
|
+
import type { SettingsPaneMount } from "../panels/settings-pane";
|
|
39
|
+
import type { SettingsDialogHandle } from "../surfaces/settings-dialog";
|
|
40
|
+
import type { InspectorTabId } from "../shell";
|
|
41
|
+
import type { WorkspaceId } from "../workspace/workspace-ids";
|
|
42
|
+
import type { StylesView } from "../style/project-styles";
|
|
43
|
+
import type { PublishTab } from "../publish/publish-ids";
|
|
44
|
+
|
|
45
|
+
/** The frame, built on the first open and kept across closes; `null` before then. */
|
|
46
|
+
interface SettingsFrame {
|
|
47
|
+
dialog: SettingsDialogHandle;
|
|
48
|
+
/** The editor in the frame's body, once the body has been created. */
|
|
49
|
+
pane: SettingsPaneMount | null;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
let _frame: SettingsFrame | null = null;
|
|
53
|
+
|
|
54
|
+
/** Whether the dialog is asked to be up: true from an open until the close that ends it. */
|
|
55
|
+
let _open = false;
|
|
56
|
+
|
|
57
|
+
/** {@link _open}, read through a call so a check after an `await` is not narrowed to before it. */
|
|
58
|
+
function isOpen(): boolean {
|
|
59
|
+
return _open;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/** Build the frame (it opens itself once mounted). */
|
|
63
|
+
function buildFrame(): SettingsFrame {
|
|
64
|
+
const frame: SettingsFrame = {
|
|
65
|
+
dialog: openSettingsDialogSurface({
|
|
66
|
+
body: (host) => {
|
|
67
|
+
frame.pane = mountSettingsPane(host, {
|
|
68
|
+
openMoved: (workspace, inspector, view, publishTab) => {
|
|
69
|
+
void openMoved(workspace, inspector, view, publishTab);
|
|
70
|
+
},
|
|
71
|
+
});
|
|
72
|
+
},
|
|
73
|
+
/* Escape or Close: the platform closed the dialog, so the flow follows. `close()` is
|
|
74
|
+
idempotent, so the flow's own close running first is fine. */
|
|
75
|
+
closed: () => {
|
|
76
|
+
if (_frame === frame) {
|
|
77
|
+
closeSettingsDialog();
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
layer: layerHost("dialog"),
|
|
81
|
+
}),
|
|
82
|
+
pane: null,
|
|
83
|
+
};
|
|
84
|
+
return frame;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Leave Settings for the workspace something moved to: the Moved footnote's buttons.
|
|
89
|
+
*
|
|
90
|
+
* Closed FIRST, so the workspace the author asked for is what they see and focus returns to the
|
|
91
|
+
* frame rather than to a row that is going away. A refusal (the switch is gated on an open project)
|
|
92
|
+
* is filed in Problems under this surface's name instead of being dropped.
|
|
93
|
+
*
|
|
94
|
+
* A row that names an Inspector tab ("Head and SEO defaults → Page tab") also shows the Inspector
|
|
95
|
+
* on that tab, AFTER the switch, because entering a workspace applies its frame preset and would
|
|
96
|
+
* otherwise put the dock back as the preset has it. The tab is a document-level view, so with no
|
|
97
|
+
* document open there is no tab to show and asking would only file a refusal; the dock is still
|
|
98
|
+
* opened, which is where the tab appears once one is.
|
|
99
|
+
*
|
|
100
|
+
* A row that names a Styles view ("Colors and fonts → Styles › Variables") runs `styles.open` with
|
|
101
|
+
* that view instead, which is the same workspace switch followed by the view.
|
|
102
|
+
*
|
|
103
|
+
* @param {WorkspaceId} workspace
|
|
104
|
+
* @param {InspectorTabId} [inspector]
|
|
105
|
+
* @param {StylesView} [view]
|
|
106
|
+
* @returns {Promise<void>} Settles once every command the row runs has settled
|
|
107
|
+
*/
|
|
108
|
+
async function openMoved(
|
|
109
|
+
workspace: WorkspaceId,
|
|
110
|
+
inspector?: InspectorTabId,
|
|
111
|
+
view?: StylesView,
|
|
112
|
+
publishTab?: PublishTab,
|
|
113
|
+
): Promise<void> {
|
|
114
|
+
closeSettingsDialog();
|
|
115
|
+
if (view !== undefined) {
|
|
116
|
+
await runActiveReported("styles.open", { view }, "Settings");
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
// Hosting is a Publish sub-tab, not the workspace's first: the button says where it lands.
|
|
120
|
+
if (publishTab !== undefined) {
|
|
121
|
+
await runActiveReported("publish.open", { tab: publishTab }, "Settings");
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
await runActiveReported("view.setWorkspace", { workspace }, "Settings");
|
|
125
|
+
if (inspector === undefined) {
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
await runActiveReported("view.setRightPanel", { open: true }, "Settings");
|
|
129
|
+
if (activeRegistry()?.isEnabled("view.setRightTab") === true) {
|
|
130
|
+
await runActiveReported("view.setRightTab", { tab: inspector }, "Settings");
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Open Project Settings, or leave it up when it already is.
|
|
136
|
+
*
|
|
137
|
+
* Re-opening while it is up does not stack a second dialog: the section the caller asked for has
|
|
138
|
+
* already been written to the registry, which redraws the editor that is showing.
|
|
139
|
+
*
|
|
140
|
+
* @returns {Promise<void>} Settles once the dialog is showing and the current section's row holds
|
|
141
|
+
* the keyboard
|
|
142
|
+
*/
|
|
143
|
+
export async function openSettingsDialog(): Promise<void> {
|
|
144
|
+
if (_open && _frame) {
|
|
145
|
+
await _frame.dialog.ready;
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
_open = true;
|
|
149
|
+
// A frame whose layer went away (a shell remount) is dead weight, not something to show.
|
|
150
|
+
if (_frame && !_frame.dialog.host.isConnected) {
|
|
151
|
+
disposeSettingsDialog();
|
|
152
|
+
_open = true;
|
|
153
|
+
}
|
|
154
|
+
let frame = _frame;
|
|
155
|
+
if (frame) {
|
|
156
|
+
frame.pane?.resume();
|
|
157
|
+
await frame.dialog.show();
|
|
158
|
+
} else {
|
|
159
|
+
frame = buildFrame();
|
|
160
|
+
_frame = frame;
|
|
161
|
+
await frame.dialog.ready;
|
|
162
|
+
}
|
|
163
|
+
/* Read after the wait, from the frame: the body is created while the dialog mounts, and a close
|
|
164
|
+
in between leaves the editor built but not to be focused. */
|
|
165
|
+
const mounted = frame.pane;
|
|
166
|
+
if (mounted === null || _frame !== frame || !isOpen()) {
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
await mounted.ready;
|
|
170
|
+
if (_frame === frame && isOpen()) {
|
|
171
|
+
mounted.focusActive();
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/** Close Project Settings if it is open. Idempotent. The frame stays built for the next open. */
|
|
176
|
+
export function closeSettingsDialog(): void {
|
|
177
|
+
if (!_open) {
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
_open = false;
|
|
181
|
+
_frame?.pane?.suspend();
|
|
182
|
+
_frame?.dialog.close();
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/** Close Project Settings and take its frame and editor down. Idempotent. */
|
|
186
|
+
export function disposeSettingsDialog(): void {
|
|
187
|
+
_open = false;
|
|
188
|
+
const frame = _frame;
|
|
189
|
+
_frame = null;
|
|
190
|
+
frame?.pane?.dispose();
|
|
191
|
+
frame?.dialog.dispose();
|
|
192
|
+
}
|