@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,219 +1,325 @@
|
|
|
1
1
|
/// <reference lib="dom" />
|
|
2
2
|
/**
|
|
3
|
-
* The Project Settings editor
|
|
3
|
+
* The Project Settings editor's flow: the grouped section list, the section body, and the Moved
|
|
4
|
+
* footnote, drawn inside the settings dialog (§17.1).
|
|
4
5
|
*
|
|
5
|
-
* Two columns
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* frame (`overlay.dialog:settings` → `pane.primary`) without one manifest STEP changing, which is
|
|
9
|
-
* the proof that the command boundary was drawn in the right place.
|
|
6
|
+
* Two columns. The list is the section registry in its three groups (General, Integrations,
|
|
7
|
+
* Advanced), so an extension's section joins the dialog by registering and leaves by going away;
|
|
8
|
+
* the body is whichever section is current, drawn by that section's own renderer.
|
|
10
9
|
*
|
|
11
10
|
* **This file is the FLOW; the markup is a document.** `surfaces/settings-pane.json` owns the two
|
|
12
|
-
* columns, the
|
|
13
|
-
* `surfaces/settings-pane.ts` mounts
|
|
14
|
-
*
|
|
15
|
-
* renderer gets the body
|
|
11
|
+
* columns, the lists' ARIA and keyboard, and every value in their style;
|
|
12
|
+
* `surfaces/settings-pane.ts` mounts it (studio-ui-guidelines.md §6, §9.3), and
|
|
13
|
+
* `settings/settings-dialog.ts` owns the dialog it is mounted into. What stays here is the part
|
|
14
|
+
* that is a decision: which sections there are, which one is current, which renderer gets the body,
|
|
15
|
+
* and what a renderer's failure says.
|
|
16
16
|
*
|
|
17
|
-
*
|
|
18
|
-
* when the tab enters this mode, and this module owns its reactivity from there — a subscription to
|
|
19
|
-
* the section registry and to the chosen section, so an extension's section appearing a tick later
|
|
20
|
-
* redraws the nav without the canvas being re-rendered.
|
|
21
|
-
*
|
|
22
|
-
* **It imports the registry, never the sections.** `canvas-render.ts` reaches this module, so
|
|
23
|
-
* anything it imports joins the canvas's import graph; the section RENDERERS are registered by
|
|
17
|
+
* **It imports the registry, never the sections.** The section RENDERERS are registered by
|
|
24
18
|
* `settings/settings-document.ts`, which the app loads when it registers its commands.
|
|
25
19
|
*
|
|
26
|
-
* Nothing here is stamped with a region of its own.
|
|
27
|
-
*
|
|
28
|
-
* `settings/contributed-section.ts` as `
|
|
29
|
-
*
|
|
20
|
+
* Nothing here is stamped with a region of its own. The dialog carries `overlay.dialog:settings`,
|
|
21
|
+
* and the entry rows and entry editor of a map-layout section are stamped by
|
|
22
|
+
* `settings/contributed-section.ts` under it, as `overlay.dialog:settings/entry:<key>` and
|
|
23
|
+
* `overlay.dialog:settings/editor`.
|
|
30
24
|
*
|
|
31
25
|
* @docs studio/projects/settings
|
|
32
26
|
*/
|
|
33
27
|
|
|
28
|
+
import { errorMessage } from "@jxsuite/schema/parse";
|
|
34
29
|
import {
|
|
30
|
+
groupedSettingsSections,
|
|
35
31
|
onSettingsDocumentChanged,
|
|
36
32
|
settingsSection,
|
|
37
33
|
settingsDocumentSection,
|
|
38
34
|
setSettingsSection,
|
|
39
|
-
sortedSettingsSections,
|
|
40
35
|
} from "../settings/section-registry";
|
|
41
36
|
import { mountSettingsPaneSurface } from "../surfaces/settings-pane";
|
|
42
|
-
import
|
|
43
|
-
import type {
|
|
37
|
+
import { workspaceInfo } from "../workspace/workspace-ids";
|
|
38
|
+
import type { SettingsPaneHandle, SettingsPaneValues } from "../surfaces/settings-pane";
|
|
39
|
+
import type { InspectorTabId } from "../shell";
|
|
40
|
+
import type { WorkspaceId } from "../workspace/workspace-ids";
|
|
41
|
+
import type { StylesView } from "../style/project-styles";
|
|
42
|
+
import type { PublishTab } from "../publish/publish-ids";
|
|
44
43
|
|
|
45
44
|
/** What the body says when the section that is current is registered by nobody. */
|
|
46
45
|
const NO_SECTIONS = "No settings sections.";
|
|
47
46
|
|
|
48
47
|
/**
|
|
49
|
-
*
|
|
48
|
+
* What left Project Settings for a workspace, in the order the footnote lists it (§17.1).
|
|
50
49
|
*
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
50
|
+
* Colors and fonts are the project's design tokens, which the Styles workspace edits beside the
|
|
51
|
+
* elements they style; hosting and the domain are where the site is published, which the Publish
|
|
52
|
+
* workspace owns. Head and SEO defaults did not leave (Advanced › Site head still edits them) but
|
|
53
|
+
* are also on Design's Page tab, which is where an author looks for a page's title. A reader who
|
|
54
|
+
* learned any of them here is told where it is rather than left to search for it. `place` is what
|
|
55
|
+
* the button says when it is not simply the workspace's title, and `inspector` is the Inspector tab
|
|
56
|
+
* that place IS: a button that says "Page tab" and only switches workspace would leave an author
|
|
57
|
+
* already in Design looking at the Element tab, with nothing visibly changed.
|
|
55
58
|
*/
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
59
|
+
const MOVED: readonly {
|
|
60
|
+
what: string;
|
|
61
|
+
workspace: WorkspaceId;
|
|
62
|
+
place?: string;
|
|
63
|
+
inspector?: InspectorTabId;
|
|
64
|
+
/** The Styles view the place IS, for a row that moved into one of them. */
|
|
65
|
+
view?: StylesView;
|
|
66
|
+
/** The Publish sub-tab the place IS: Hosting, for the adapter and the domain. */
|
|
67
|
+
publishTab?: PublishTab;
|
|
68
|
+
}[] = [
|
|
69
|
+
/* The design tokens are the Variables view, not whichever Styles view was last open: a button
|
|
70
|
+
that says "Variables" and lands on the element catalogue would have the author hunting. */
|
|
71
|
+
{ place: "Styles › Variables", view: "variables", what: "Colors and fonts", workspace: "styles" },
|
|
72
|
+
{
|
|
73
|
+
place: "Publish › Hosting",
|
|
74
|
+
publishTab: "hosting",
|
|
75
|
+
what: "Hosting and domain",
|
|
76
|
+
workspace: "publish",
|
|
77
|
+
},
|
|
78
|
+
{ inspector: "page", place: "Page tab", what: "Head and SEO defaults", workspace: "design" },
|
|
79
|
+
];
|
|
80
|
+
|
|
81
|
+
/** What the mounted editor is told to do by things only its host can do. */
|
|
82
|
+
export interface SettingsPaneOptions {
|
|
60
83
|
/**
|
|
61
|
-
*
|
|
62
|
-
*
|
|
63
|
-
* Held here as well so a CHANGE of element can reset {@link ActiveSettingsPane.rendered}: the body
|
|
64
|
-
* is what a section was drawn into, and a body that has been replaced holds nothing. A mount is
|
|
65
|
-
* asynchronous, so it is null for the first tick and `draw` returns at that —
|
|
66
|
-
* {@link renderSettingsPane} redraws once the mount settles.
|
|
84
|
+
* A Moved footnote's button: close the dialog and go to the named workspace, and to the named
|
|
85
|
+
* Inspector tab or Styles view there when the row names one.
|
|
67
86
|
*/
|
|
68
|
-
|
|
87
|
+
openMoved: (
|
|
88
|
+
workspace: WorkspaceId,
|
|
89
|
+
inspector?: InspectorTabId,
|
|
90
|
+
view?: StylesView,
|
|
91
|
+
publishTab?: PublishTab,
|
|
92
|
+
) => void;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/** The mounted editor. */
|
|
96
|
+
export interface SettingsPaneMount {
|
|
97
|
+
/** Settles once the columns are mounted and the current section has been drawn once. */
|
|
98
|
+
ready: Promise<void>;
|
|
99
|
+
/** Put the keyboard on the current section's row. */
|
|
100
|
+
focusActive: () => void;
|
|
69
101
|
/**
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
* Sections no longer share one container, and they cannot: a converted section mounts a document
|
|
73
|
-
* and clears what it is given, which destroys lit's `_$litPart$` markers — so the next lit
|
|
74
|
-
* section rendering into that same element throws on a part whose markers have left the document.
|
|
75
|
-
* It fails the other way too: lit renders BESIDE foreign nodes rather than replacing them, so a
|
|
76
|
-
* lit section drawn after a document one left both on screen at once. A fresh host per section is
|
|
77
|
-
* what makes the two kinds coexist, which is the whole of `studio-ui-guidelines.md` §9.3's
|
|
78
|
-
* surface-level rule applied to one dispatcher.
|
|
102
|
+
* Stop following the section registry while the dialog is closed. The editor stays built; a
|
|
103
|
+
* section registering or a project closing in the meantime is caught up on by {@link resume}.
|
|
79
104
|
*/
|
|
80
|
-
|
|
81
|
-
/**
|
|
82
|
-
|
|
83
|
-
/**
|
|
84
|
-
|
|
105
|
+
suspend: () => void;
|
|
106
|
+
/** Follow the registry again and redraw the current section: the dialog is being shown again. */
|
|
107
|
+
resume: () => void;
|
|
108
|
+
/** Take the editor down and unsubscribe. Idempotent. */
|
|
109
|
+
dispose: () => void;
|
|
85
110
|
}
|
|
86
111
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
/** A section row's element id — minted from the key, so the panel can name the row that chose it. */
|
|
112
|
+
/** A section row's element id: minted from the key, so the body can name the row that chose it. */
|
|
90
113
|
function tabIdFor(key: string): string {
|
|
91
114
|
return `settings-nav-${key}`;
|
|
92
115
|
}
|
|
93
116
|
|
|
94
|
-
/**
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
* Idempotent for the same host: canvas-render calls this on every render for this mode, and
|
|
98
|
-
* rebuilding the section body on each one would throw away an open inline form mid-keystroke.
|
|
99
|
-
*
|
|
100
|
-
* @param {CanvasSurface} surface - The pane whose stage hosts the editor
|
|
101
|
-
*/
|
|
102
|
-
export function renderSettingsPane(surface: CanvasSurface): void {
|
|
103
|
-
const { paneId, wrap: host } = surface;
|
|
104
|
-
if (_active.get(paneId)?.host !== host) {
|
|
105
|
-
detachSettingsPane(paneId);
|
|
106
|
-
const record: ActiveSettingsPane = {
|
|
107
|
-
body: null,
|
|
108
|
-
host,
|
|
109
|
-
off: onSettingsDocumentChanged(() => draw(paneId, true)),
|
|
110
|
-
rendered: null,
|
|
111
|
-
sectionHost: null,
|
|
112
|
-
surface: mountSettingsPaneSurface(host, values(), {
|
|
113
|
-
selectSection: (key: string) => {
|
|
114
|
-
setSettingsSection(key);
|
|
115
|
-
},
|
|
116
|
-
}),
|
|
117
|
-
};
|
|
118
|
-
_active.set(paneId, record);
|
|
119
|
-
/* A mount is asynchronous and the island does not exist until it lands, so the `draw` below
|
|
120
|
-
returns at `!panel.body`. THIS is the pass that first reaches a section renderer — and it
|
|
121
|
-
only runs while this record is still the pane's, because a mode change can detach it while
|
|
122
|
-
the mount is in flight. */
|
|
123
|
-
void record.surface.ready.then(() => {
|
|
124
|
-
if (_active.get(paneId) === record) {
|
|
125
|
-
draw(paneId, true);
|
|
126
|
-
}
|
|
127
|
-
});
|
|
128
|
-
}
|
|
129
|
-
draw(paneId, false);
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
/** Tear one pane's editor down — the mode-change and project-close path. */
|
|
133
|
-
export function detachSettingsPane(paneId: string): void {
|
|
134
|
-
const panel = _active.get(paneId);
|
|
135
|
-
if (!panel) {
|
|
136
|
-
return;
|
|
137
|
-
}
|
|
138
|
-
panel.off?.();
|
|
139
|
-
panel.surface.dispose();
|
|
140
|
-
_active.delete(paneId);
|
|
117
|
+
/** The footnote row a button's workspace string names, or `null` for one this module never offered. */
|
|
118
|
+
function movedRow(value: string): (typeof MOVED)[number] | null {
|
|
119
|
+
return MOVED.find((row) => row.workspace === value) ?? null;
|
|
141
120
|
}
|
|
142
121
|
|
|
143
122
|
/**
|
|
144
|
-
*
|
|
123
|
+
* Everything the document draws, decided here so the document decides nothing.
|
|
145
124
|
*
|
|
146
|
-
* @param {
|
|
147
|
-
* @returns {
|
|
125
|
+
* @param {string} failure The current section's failure sentence, or the empty string
|
|
126
|
+
* @returns {SettingsPaneValues}
|
|
148
127
|
*/
|
|
149
|
-
|
|
150
|
-
return _active.get(surface.paneId)?.host === surface.wrap;
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
/** Everything the document draws, decided here so the document decides nothing. */
|
|
154
|
-
function values() {
|
|
128
|
+
function values(failure: string): SettingsPaneValues {
|
|
155
129
|
const active = settingsDocumentSection();
|
|
130
|
+
const grouped = groupedSettingsSections();
|
|
156
131
|
return {
|
|
157
132
|
active,
|
|
158
133
|
activeTabId: tabIdFor(active),
|
|
159
134
|
empty: NO_SECTIONS,
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
135
|
+
failure,
|
|
136
|
+
groups: grouped.map((group) => ({
|
|
137
|
+
id: group.id,
|
|
138
|
+
label: group.label,
|
|
139
|
+
note: group.note,
|
|
140
|
+
sections: group.sections.map((section) => ({
|
|
141
|
+
key: section.key,
|
|
142
|
+
label: section.label,
|
|
143
|
+
tabId: tabIdFor(section.key),
|
|
144
|
+
})),
|
|
145
|
+
tabsLabel: group.note === "" ? group.label : `${group.label}, ${group.note.toLowerCase()}`,
|
|
146
|
+
titleId: `settings-group-${group.id}`,
|
|
166
147
|
})),
|
|
148
|
+
hasSection: settingsSection(active) !== undefined,
|
|
149
|
+
// The section's own sentence when it has one, its group's otherwise.
|
|
150
|
+
intro:
|
|
151
|
+
settingsSection(active)?.intro ||
|
|
152
|
+
(grouped.find((group) => group.sections.some((section) => section.key === active))?.intro ??
|
|
153
|
+
""),
|
|
154
|
+
moved: MOVED.map((row) => {
|
|
155
|
+
const { title } = workspaceInfo(row.workspace);
|
|
156
|
+
const place = row.place ?? title;
|
|
157
|
+
return {
|
|
158
|
+
linkLabel: `${row.what}: ${place}. Go to ${title}`,
|
|
159
|
+
place,
|
|
160
|
+
what: row.what,
|
|
161
|
+
workspace: row.workspace,
|
|
162
|
+
};
|
|
163
|
+
}),
|
|
167
164
|
};
|
|
168
165
|
}
|
|
169
166
|
|
|
170
167
|
/**
|
|
171
|
-
*
|
|
168
|
+
* Mount the editor into `host`, the settings dialog's pane slot, and keep it current.
|
|
169
|
+
*
|
|
170
|
+
* It subscribes to the section registry and to the chosen section, so an extension's section
|
|
171
|
+
* appearing a tick later redraws the nav, and a deep link to an entry inside the section already on
|
|
172
|
+
* screen redraws its body, without the host doing anything.
|
|
172
173
|
*
|
|
173
|
-
* @param {
|
|
174
|
-
*
|
|
175
|
-
*
|
|
174
|
+
* @param {HTMLElement} host
|
|
175
|
+
* @param {SettingsPaneOptions} options
|
|
176
|
+
* @returns {SettingsPaneMount}
|
|
176
177
|
*/
|
|
177
|
-
function
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
178
|
+
export function mountSettingsPane(
|
|
179
|
+
host: HTMLElement,
|
|
180
|
+
options: SettingsPaneOptions,
|
|
181
|
+
): SettingsPaneMount {
|
|
182
|
+
let disposed = false;
|
|
183
|
+
/** The island as {@link draw} last read it off the surface. */
|
|
184
|
+
let body: HTMLElement | null = null;
|
|
185
|
+
/**
|
|
186
|
+
* The element the ACTIVE section was drawn into, inside {@link body}.
|
|
187
|
+
*
|
|
188
|
+
* Sections do not share one container, and they cannot: a converted section mounts a document and
|
|
189
|
+
* clears what it is given, which destroys lit's `_$litPart$` markers, so the next lit section
|
|
190
|
+
* rendering into that same element throws on a part whose markers have left the document. A fresh
|
|
191
|
+
* host per section is what makes the two kinds coexist.
|
|
192
|
+
*/
|
|
193
|
+
let sectionHost: HTMLElement | null = null;
|
|
194
|
+
/** The section the body currently holds. */
|
|
195
|
+
let rendered: string | null = null;
|
|
196
|
+
/** The current section's failure sentence; cleared whenever it is drawn again. */
|
|
197
|
+
let failure = "";
|
|
198
|
+
/** Counts renders, so a late rejection from a superseded one cannot overwrite a newer answer. */
|
|
199
|
+
let generation = 0;
|
|
184
200
|
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
panel.sectionHost = null;
|
|
206
|
-
body.replaceChildren();
|
|
207
|
-
return;
|
|
201
|
+
const surface: SettingsPaneHandle = mountSettingsPaneSurface(host, values(failure), {
|
|
202
|
+
openMoved: (workspace: string) => {
|
|
203
|
+
const target = movedRow(workspace);
|
|
204
|
+
if (target !== null) {
|
|
205
|
+
options.openMoved(target.workspace, target.inspector, target.view, target.publishTab);
|
|
206
|
+
}
|
|
207
|
+
},
|
|
208
|
+
selectSection: (key: string) => {
|
|
209
|
+
setSettingsSection(key);
|
|
210
|
+
},
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
/** Say a section failed, where the section would have been. */
|
|
214
|
+
function fail(key: string, reason: string, at: number): void {
|
|
215
|
+
if (disposed || at !== generation) {
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
const label = settingsSection(key)?.label ?? key;
|
|
219
|
+
failure = `Could not show ${label}: ${reason}`;
|
|
220
|
+
surface.update(values(failure));
|
|
208
221
|
}
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Update the nav, then the body.
|
|
225
|
+
*
|
|
226
|
+
* @param {boolean} force Re-run the section renderer even when the section has not changed: true
|
|
227
|
+
* for a real state change (a nav click, a section registering, an entry selected by command).
|
|
228
|
+
*/
|
|
229
|
+
function draw(force: boolean): void {
|
|
230
|
+
if (disposed) {
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
const active = settingsDocumentSection();
|
|
234
|
+
const island = surface.body();
|
|
235
|
+
if (island !== body) {
|
|
236
|
+
body = island;
|
|
237
|
+
rendered = null;
|
|
238
|
+
}
|
|
239
|
+
if (!island || (!force && rendered === active)) {
|
|
240
|
+
surface.update(values(failure));
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
/* Read BEFORE the write: whether the section is changing is what decides the host, and
|
|
244
|
+
`rendered` is about to stop saying so. */
|
|
245
|
+
const changed = rendered !== active;
|
|
246
|
+
rendered = active;
|
|
247
|
+
failure = "";
|
|
248
|
+
surface.update(values(failure));
|
|
249
|
+
const section = settingsSection(active);
|
|
250
|
+
if (!section) {
|
|
251
|
+
/* Every section unregistered at once: a project closing while the dialog is open. The
|
|
252
|
+
document says so itself (`hasSection`), and the island is emptied so a renderer's leftovers
|
|
253
|
+
do not sit under the sentence explaining that there is nothing to draw. */
|
|
254
|
+
sectionHost = null;
|
|
255
|
+
island.replaceChildren();
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
/* A FRESH host whenever the section changes, and the same one for a forced redraw of the
|
|
259
|
+
section already showing: remounting that one would take the caret out of whatever field the
|
|
260
|
+
reader is typing in. */
|
|
261
|
+
if (changed || !sectionHost || sectionHost.parentElement !== island) {
|
|
262
|
+
sectionHost = document.createElement("div");
|
|
263
|
+
island.replaceChildren(sectionHost);
|
|
264
|
+
}
|
|
265
|
+
generation += 1;
|
|
266
|
+
const at = generation;
|
|
267
|
+
try {
|
|
268
|
+
const result = section.render(sectionHost);
|
|
269
|
+
if (result instanceof Promise) {
|
|
270
|
+
result.catch((error) => {
|
|
271
|
+
fail(active, errorMessage(error), at);
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
} catch (error) {
|
|
275
|
+
fail(active, errorMessage(error), at);
|
|
276
|
+
}
|
|
217
277
|
}
|
|
218
|
-
|
|
278
|
+
|
|
279
|
+
const follow = (): (() => void) =>
|
|
280
|
+
onSettingsDocumentChanged(() => {
|
|
281
|
+
draw(true);
|
|
282
|
+
});
|
|
283
|
+
/** The registry subscription, or null while the dialog is closed. */
|
|
284
|
+
let off: (() => void) | null = follow();
|
|
285
|
+
/* The island does not exist until the mount lands, so the first pass that reaches a section
|
|
286
|
+
renderer is this one. */
|
|
287
|
+
const ready = surface.ready.then(() => {
|
|
288
|
+
draw(true);
|
|
289
|
+
});
|
|
290
|
+
|
|
291
|
+
return {
|
|
292
|
+
dispose() {
|
|
293
|
+
if (disposed) {
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
disposed = true;
|
|
297
|
+
off?.();
|
|
298
|
+
off = null;
|
|
299
|
+
surface.dispose();
|
|
300
|
+
},
|
|
301
|
+
focusActive: () => {
|
|
302
|
+
surface.focusActive();
|
|
303
|
+
},
|
|
304
|
+
ready,
|
|
305
|
+
resume() {
|
|
306
|
+
if (disposed || off !== null) {
|
|
307
|
+
return;
|
|
308
|
+
}
|
|
309
|
+
off = follow();
|
|
310
|
+
/* Redrawn rather than trusted: anything may have moved while it was closed (a section
|
|
311
|
+
registered, the project closed or changed, the configuration edited in Styles). Into a
|
|
312
|
+
FRESH host, as every open drew into when each one built its own frame: several sections
|
|
313
|
+
keep their form state (a half-typed entry, a failed save's error) in a WeakMap keyed on
|
|
314
|
+
the host they were given, and an open is a new visit, so none of that may come back from
|
|
315
|
+
the last one, or from another project's. Only a redraw WHILE open keeps the host, which is
|
|
316
|
+
what keeps the caret in the field being typed in. */
|
|
317
|
+
sectionHost = null;
|
|
318
|
+
draw(true);
|
|
319
|
+
},
|
|
320
|
+
suspend() {
|
|
321
|
+
off?.();
|
|
322
|
+
off = null;
|
|
323
|
+
},
|
|
324
|
+
};
|
|
219
325
|
}
|