@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
|
@@ -8,20 +8,31 @@
|
|
|
8
8
|
* path.
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
+
import { isNonNullObject, isString } from "@jxsuite/schema/guards";
|
|
11
12
|
import { getFormats, loadExtensions, loadFormats } from "../format/format-host";
|
|
12
|
-
import {
|
|
13
|
+
import {
|
|
14
|
+
DEFAULT_SETTINGS_GROUP,
|
|
15
|
+
isSettingsGroupId,
|
|
16
|
+
registerSettingsSection,
|
|
17
|
+
unregisterSettingsSection,
|
|
18
|
+
} from "./section-registry";
|
|
13
19
|
import { renderContributedSection } from "./contributed-section";
|
|
14
20
|
import { dataSectionActions } from "../panels/data-grid";
|
|
15
21
|
import type { ExtensionContributionInfo } from "../types";
|
|
16
22
|
import type { JsonSchema } from "../ui/schema-form";
|
|
17
|
-
import type { SettingsContribution } from "./contributed-section";
|
|
23
|
+
import type { ContributedSectionOptions, SettingsContribution } from "./contributed-section";
|
|
24
|
+
import type { SettingsGroupId } from "./section-registry";
|
|
18
25
|
|
|
19
26
|
/** The `$studio.settings` block shape consumed here (nav metadata + the renderer inputs). */
|
|
20
27
|
interface StudioSettingsBlock {
|
|
21
28
|
icon?: string;
|
|
22
29
|
label?: string;
|
|
30
|
+
/** The nav group: `general`, `integrations` (the default) or `advanced`. */
|
|
31
|
+
group?: string;
|
|
23
32
|
order?: number;
|
|
24
33
|
layout?: "map" | "form";
|
|
34
|
+
/** The sentence the section body opens with, in place of its group's (extensions.md §9.1). */
|
|
35
|
+
intro?: string;
|
|
25
36
|
entry?: SettingsContribution["settings"]["entry"];
|
|
26
37
|
}
|
|
27
38
|
|
|
@@ -29,7 +40,9 @@ interface StudioSettingsBlock {
|
|
|
29
40
|
export interface DerivedSettingsSection {
|
|
30
41
|
key: string;
|
|
31
42
|
label: string;
|
|
43
|
+
group: SettingsGroupId;
|
|
32
44
|
icon?: string | undefined;
|
|
45
|
+
intro?: string | undefined;
|
|
33
46
|
order: number;
|
|
34
47
|
contribution: SettingsContribution;
|
|
35
48
|
}
|
|
@@ -49,34 +62,46 @@ const DEFAULT_SECTION_ORDER = 100;
|
|
|
49
62
|
export function deriveSettingsSection(
|
|
50
63
|
info: ExtensionContributionInfo,
|
|
51
64
|
): DerivedSettingsSection | null {
|
|
52
|
-
|
|
53
|
-
|
|
65
|
+
/* SAFETY: `$studio.settings` is the extensions.md §9.1 vocabulary, served verbatim from the
|
|
66
|
+
class descriptor; every member read below is optional and falls back through `??`, so an
|
|
67
|
+
omitted member degrades to the section defaults rather than reaching the renderer. */
|
|
68
|
+
const settings = info.studio?.settings as StudioSettingsBlock | null | undefined;
|
|
54
69
|
if (!settings) {
|
|
55
70
|
return null;
|
|
56
71
|
}
|
|
57
72
|
const { key } = info.project;
|
|
58
73
|
const layout = settings.layout ?? "form";
|
|
74
|
+
/* SAFETY: the backend fills `entrySchema` with `properties[<key>]` of the extension's shipped
|
|
75
|
+
project fragment (compiler `site/format-host.ts`), which is a JSON Schema by construction. */
|
|
59
76
|
const sectionSchema = (info.entrySchema ?? {}) as JsonSchema & {
|
|
60
77
|
additionalProperties?: JsonSchema | boolean;
|
|
61
78
|
};
|
|
62
79
|
const entrySchema =
|
|
63
80
|
layout === "map"
|
|
64
|
-
?
|
|
81
|
+
? isNonNullObject(sectionSchema.additionalProperties)
|
|
65
82
|
? sectionSchema.additionalProperties
|
|
66
83
|
: {}
|
|
67
|
-
:
|
|
84
|
+
: sectionSchema;
|
|
68
85
|
const label = settings.label ?? info.project.title ?? key;
|
|
86
|
+
const sectionSettings: SettingsContribution["settings"] = {};
|
|
87
|
+
if (settings.entry !== undefined) {
|
|
88
|
+
sectionSettings.entry = settings.entry;
|
|
89
|
+
}
|
|
90
|
+
if (settings.layout !== undefined) {
|
|
91
|
+
sectionSettings.layout = settings.layout;
|
|
92
|
+
}
|
|
69
93
|
return {
|
|
70
94
|
contribution: {
|
|
71
95
|
entrySchema,
|
|
72
96
|
key,
|
|
73
|
-
settings:
|
|
74
|
-
...(settings.entry === undefined ? {} : { entry: settings.entry }),
|
|
75
|
-
...(settings.layout === undefined ? {} : { layout: settings.layout }),
|
|
76
|
-
},
|
|
97
|
+
settings: sectionSettings,
|
|
77
98
|
title: label,
|
|
78
99
|
},
|
|
100
|
+
/* A group the nav does not draw falls back to the default rather than hiding the section:
|
|
101
|
+
an extension naming a group from a later vocabulary still gets its section listed. */
|
|
102
|
+
group: isSettingsGroupId(settings.group) ? settings.group : DEFAULT_SETTINGS_GROUP,
|
|
79
103
|
icon: settings.icon,
|
|
104
|
+
intro: isString(settings.intro) ? settings.intro : undefined,
|
|
80
105
|
key,
|
|
81
106
|
label,
|
|
82
107
|
order: settings.order ?? DEFAULT_SECTION_ORDER,
|
|
@@ -135,7 +160,9 @@ async function runSync(): Promise<void> {
|
|
|
135
160
|
}
|
|
136
161
|
const { contribution } = derived;
|
|
137
162
|
registerSettingsSection({
|
|
163
|
+
group: derived.group,
|
|
138
164
|
icon: derived.icon,
|
|
165
|
+
intro: derived.intro,
|
|
139
166
|
key: derived.key,
|
|
140
167
|
label: derived.label,
|
|
141
168
|
order: derived.order,
|
|
@@ -143,10 +170,11 @@ async function runSync(): Promise<void> {
|
|
|
143
170
|
// Data-domain sections get the Test/Push/Data-grid actions slot when the platform
|
|
144
171
|
// Implements the protocol's data routes; every other section renders actions-free.
|
|
145
172
|
const actions = dataSectionActions(derived.key);
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
}
|
|
173
|
+
const opts: ContributedSectionOptions = { formats: getFormats() };
|
|
174
|
+
if (actions !== null) {
|
|
175
|
+
opts.actions = actions;
|
|
176
|
+
}
|
|
177
|
+
renderContributedSection(container, contribution, opts);
|
|
150
178
|
},
|
|
151
179
|
});
|
|
152
180
|
next.add(derived.key);
|
|
@@ -90,7 +90,10 @@ const mounted = new WeakMap<HTMLElement, ExtensionsSurfaceHandle>();
|
|
|
90
90
|
const errors = new WeakMap<HTMLElement, string>();
|
|
91
91
|
|
|
92
92
|
/** The sentence a row's state deserves, and the tone it is said in. */
|
|
93
|
-
|
|
93
|
+
type RowNote = Pick<ExtensionRowView, "note" | "noteTone">;
|
|
94
|
+
|
|
95
|
+
/** Answer {@link RowNote} for one row. */
|
|
96
|
+
function noteFor(row: ExtensionRow): RowNote {
|
|
94
97
|
if (row.unavailable !== undefined) {
|
|
95
98
|
return { note: row.unavailable, noteTone: "warn" };
|
|
96
99
|
}
|
|
@@ -16,12 +16,17 @@
|
|
|
16
16
|
* container to a `render`, and this one mounts a document into it instead of rendering lit.
|
|
17
17
|
*/
|
|
18
18
|
|
|
19
|
+
import { isString } from "@jxsuite/schema/guards";
|
|
19
20
|
import { errorMessage } from "@jxsuite/schema/parse";
|
|
20
21
|
import { projectState } from "../store";
|
|
21
22
|
import { updateSiteConfig } from "../site-context";
|
|
22
23
|
import { activeRegistry } from "../commands/active-registry";
|
|
24
|
+
import { runActiveReported } from "../commands/run-reported";
|
|
25
|
+
import { closeSettingsDialog } from "./settings-dialog";
|
|
23
26
|
import { getPlatform } from "../platform";
|
|
24
27
|
import { mountOverviewSurface } from "../surfaces/settings-overview";
|
|
28
|
+
import { previewAssetSrcFor } from "../canvas/asset-refs";
|
|
29
|
+
import { PROJECT_CONFIG_PATH } from "../tabs/tab";
|
|
25
30
|
|
|
26
31
|
import type {
|
|
27
32
|
OverviewActions,
|
|
@@ -31,6 +36,7 @@ import type {
|
|
|
31
36
|
OverviewValues,
|
|
32
37
|
} from "../surfaces/settings-overview";
|
|
33
38
|
import type { JxHeadEntry, ProjectConfig } from "@jxsuite/schema/types";
|
|
39
|
+
import type { ProjectConfigPatch } from "../site-context";
|
|
34
40
|
|
|
35
41
|
/**
|
|
36
42
|
* The last failed write, per rendered section.
|
|
@@ -49,7 +55,7 @@ const mounted = new WeakMap<HTMLElement, OverviewSurfaceHandle>();
|
|
|
49
55
|
|
|
50
56
|
/** The live project configuration, read at the moment it is needed rather than at render time. */
|
|
51
57
|
function config(): ProjectConfig {
|
|
52
|
-
return
|
|
58
|
+
return projectState?.projectConfig || {};
|
|
53
59
|
}
|
|
54
60
|
|
|
55
61
|
// ─── Site description ($head meta) ───────────────────────────────────────────
|
|
@@ -66,7 +72,8 @@ function isDescriptionMeta(entry: JxHeadEntry): boolean {
|
|
|
66
72
|
*/
|
|
67
73
|
function readDescription(cfg: ProjectConfig): string {
|
|
68
74
|
const entry = (cfg.$head ?? []).find((e) => isDescriptionMeta(e));
|
|
69
|
-
|
|
75
|
+
const content = entry?.attributes?.content;
|
|
76
|
+
return isString(content) ? content : "";
|
|
70
77
|
}
|
|
71
78
|
|
|
72
79
|
/** `$head` with the description meta upserted (or dropped, when cleared). */
|
|
@@ -87,41 +94,105 @@ function headWithDescription(head: JxHeadEntry[], text: string): JxHeadEntry[] {
|
|
|
87
94
|
);
|
|
88
95
|
}
|
|
89
96
|
|
|
97
|
+
// ─── Favicon ($head link) ───────────────────────────────────────────────────
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* True for a `<link>` whose `rel` names the `icon` relation.
|
|
101
|
+
*
|
|
102
|
+
* `rel` is a set of space-separated, ASCII case-insensitive tokens (HTML Standard, link types), so
|
|
103
|
+
* the legacy `rel="shortcut icon"` every favicon snippet still carries is the same relation as
|
|
104
|
+
* `rel="icon"`. `apple-touch-icon` is a different token and is not the favicon.
|
|
105
|
+
*/
|
|
106
|
+
function isIconLink(entry: JxHeadEntry): boolean {
|
|
107
|
+
const rel = entry.attributes?.rel;
|
|
108
|
+
return (
|
|
109
|
+
entry.tagName === "link" &&
|
|
110
|
+
isString(rel) &&
|
|
111
|
+
rel
|
|
112
|
+
.toLowerCase()
|
|
113
|
+
.split(/\s+/u)
|
|
114
|
+
.some((token) => token === "icon")
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* The site favicon. Like the description it is not a top-level `project.json` key (the composed
|
|
120
|
+
* schema is closed, and no compiler stage reads one): it is the `<link rel="icon">` in `$head`,
|
|
121
|
+
* which is what every starter and `@jxsuite/create` write and what the browser reads
|
|
122
|
+
* (`site-architecture.md` §2).
|
|
123
|
+
*/
|
|
124
|
+
function readFavicon(cfg: ProjectConfig): string {
|
|
125
|
+
const href = (cfg.$head ?? []).find((e) => isIconLink(e))?.attributes?.href;
|
|
126
|
+
return isString(href) ? href : "";
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* `$head` with the icon link pointing at `href`.
|
|
131
|
+
*
|
|
132
|
+
* The existing link is rewritten in place, so its position among the head entries and any other
|
|
133
|
+
* attribute an author gave it (`sizes`, a media query) survive. `type` is the one attribute that is
|
|
134
|
+
* dropped: it describes the file being replaced, and a new upload may be a different format.
|
|
135
|
+
*/
|
|
136
|
+
function headWithFavicon(head: JxHeadEntry[], href: string): JxHeadEntry[] {
|
|
137
|
+
if (!head.some((e) => isIconLink(e))) {
|
|
138
|
+
return [...head, { attributes: { href, rel: "icon" }, tagName: "link" }];
|
|
139
|
+
}
|
|
140
|
+
return head.map((entry) => {
|
|
141
|
+
if (!isIconLink(entry)) {
|
|
142
|
+
return entry;
|
|
143
|
+
}
|
|
144
|
+
const { type: _type, ...attributes } = entry.attributes ?? {};
|
|
145
|
+
return { ...entry, attributes: { ...attributes, href } };
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/** The file name an uploaded favicon is stored under: `favicon` plus the upload's own extension. */
|
|
150
|
+
function faviconFileName(file: File): string {
|
|
151
|
+
const dot = file.name.lastIndexOf(".");
|
|
152
|
+
const ext = dot > 0 ? file.name.slice(dot + 1).toLowerCase() : "";
|
|
153
|
+
return /^[a-z0-9]+$/u.test(ext) ? `favicon.${ext}` : "favicon.ico";
|
|
154
|
+
}
|
|
155
|
+
|
|
90
156
|
/**
|
|
91
157
|
* The patch that _removes_ `url`. `undefined` survives the object spread inside `updateSiteConfig`
|
|
92
158
|
* and `JSON.stringify` then drops the key, so clearing the field clears the setting instead of
|
|
93
159
|
* persisting an empty string the build would have to special-case (`site-build.ts` gates the
|
|
94
|
-
* sitemap on `Boolean(url)` but still forwards `""` into the render context).
|
|
95
|
-
*
|
|
96
|
-
* undefined
|
|
160
|
+
* sitemap on `Boolean(url)` but still forwards `""` into the render context). A
|
|
161
|
+
* {@link ProjectConfigPatch} rather than a `Partial<ProjectConfig>`, because under
|
|
162
|
+
* `exactOptionalPropertyTypes` only the patch type can carry an `undefined` member.
|
|
97
163
|
*/
|
|
98
|
-
const CLEAR_URL = { url: undefined }
|
|
164
|
+
const CLEAR_URL: ProjectConfigPatch = { url: undefined };
|
|
165
|
+
|
|
166
|
+
/** The record the Global Styles button is drawn from: **Go to Styles**, the workspace's ⌘4. */
|
|
167
|
+
const STYLES_COMMAND = "workspace.focus.styles";
|
|
99
168
|
|
|
100
169
|
// ─── Projection ──────────────────────────────────────────────────────────────
|
|
101
170
|
|
|
102
171
|
/**
|
|
103
172
|
* What the surface should be showing, from the configuration and the registry as they stand now.
|
|
104
173
|
*
|
|
105
|
-
* The
|
|
106
|
-
*
|
|
107
|
-
*
|
|
174
|
+
* The Global Styles button is rendered FROM the `workspace.focus.styles` record (**Go to Styles**,
|
|
175
|
+
* ⌘4), whose run is `view.setWorkspace { workspace: "styles" }`, so it is disabled rather than
|
|
176
|
+
* absent when it cannot act (`studio-ui-guidelines.md` §12.3) and it cannot drift from the palette
|
|
177
|
+
* row or the switcher's tab. The record's TITLE, and nothing else off the registry:
|
|
108
178
|
* `disabledReason` would be the `studio-ui-guidelines.md` §12.3 shape for a control that can be
|
|
109
|
-
* inapplicable, but this one cannot be —
|
|
110
|
-
*
|
|
111
|
-
*
|
|
112
|
-
*
|
|
113
|
-
*
|
|
114
|
-
*
|
|
115
|
-
*
|
|
116
|
-
* state read.
|
|
179
|
+
* inapplicable, but this one cannot be — the switch is gated on `ctx.project.open` and Overview is
|
|
180
|
+
* a section of the project's own configuration, so by the time this renders the answer is always
|
|
181
|
+
* yes. Asking anyway would also be a FOCUS read inside a function that was handed a container,
|
|
182
|
+
* which is what `scripts/check-pane-singletons.ts` rule 4 forbids: a pane-scoped surface must not
|
|
183
|
+
* report the focused pane's state. A project-level verb happens to read the same in every pane, but
|
|
184
|
+
* the way to be right about that is not to ask. The one thing that can genuinely be missing is the
|
|
185
|
+
* registry itself (bootstrap order, a test), and that is an existence check, not a state read.
|
|
117
186
|
*/
|
|
118
187
|
function values(container: HTMLElement): OverviewValues {
|
|
119
188
|
const cfg = config();
|
|
120
|
-
const command = activeRegistry()?.get(
|
|
189
|
+
const command = activeRegistry()?.get(STYLES_COMMAND);
|
|
121
190
|
return {
|
|
122
191
|
description: readDescription(cfg),
|
|
123
192
|
error: errors.get(container) ?? null,
|
|
124
|
-
favicon:
|
|
193
|
+
favicon: readFavicon(cfg),
|
|
194
|
+
// `project.json` authored it, whatever tab is in front: the section is project-level.
|
|
195
|
+
faviconSrc: previewAssetSrcFor(readFavicon(cfg), PROJECT_CONFIG_PATH),
|
|
125
196
|
name: cfg.name ?? "",
|
|
126
197
|
stylesDisabled: command === undefined,
|
|
127
198
|
stylesTitle: command?.title ?? "",
|
|
@@ -145,7 +216,7 @@ function actions(container: HTMLElement): OverviewActions {
|
|
|
145
216
|
|
|
146
217
|
/** Persist a patch, surfacing the rejection instead of swallowing it. */
|
|
147
218
|
const persist = async (
|
|
148
|
-
patch:
|
|
219
|
+
patch: ProjectConfigPatch,
|
|
149
220
|
field: OverviewErrorField = "section",
|
|
150
221
|
): Promise<void> => {
|
|
151
222
|
try {
|
|
@@ -175,29 +246,31 @@ function actions(container: HTMLElement): OverviewActions {
|
|
|
175
246
|
if (!file) {
|
|
176
247
|
return;
|
|
177
248
|
}
|
|
249
|
+
// `public/` is copied to the site root verbatim, so `public/favicon.svg` is `/favicon.svg`.
|
|
250
|
+
const name = faviconFileName(file);
|
|
178
251
|
try {
|
|
179
|
-
await getPlatform().uploadFile(
|
|
252
|
+
await getPlatform().uploadFile(`public/${name}`, file);
|
|
180
253
|
} catch (error) {
|
|
181
254
|
reject("favicon", `Could not upload the favicon — ${errorMessage(error)}`);
|
|
182
255
|
return;
|
|
183
256
|
}
|
|
184
|
-
await persist({
|
|
257
|
+
await persist({ $head: headWithFavicon(config().$head ?? [], `/${name}`) }, "favicon");
|
|
185
258
|
});
|
|
186
259
|
input.click();
|
|
187
260
|
};
|
|
188
261
|
|
|
189
262
|
return {
|
|
190
263
|
/*
|
|
191
|
-
*
|
|
192
|
-
*
|
|
264
|
+
* Global styles are the Styles workspace's, and the workspace switch is the one place that
|
|
265
|
+
* says how to get there. This used to write `session.ui.canvasMode` here directly — a second
|
|
193
266
|
* implementation of a capability, `studio-ui-guidelines.md` §12.5's defect in miniature: the
|
|
194
267
|
* button and the command could disagree about what "open Project Styles" means, and only one of
|
|
195
|
-
* them was reachable by name.
|
|
196
|
-
*
|
|
197
|
-
* it.
|
|
268
|
+
* them was reachable by name. Overview is drawn in the settings dialog, so the dialog closes
|
|
269
|
+
* first: left up, it would cover the workspace the reader just asked for.
|
|
198
270
|
*/
|
|
199
271
|
openStyles: () => {
|
|
200
|
-
|
|
272
|
+
closeSettingsDialog();
|
|
273
|
+
void runActiveReported("view.setWorkspace", { workspace: "styles" }, "Settings");
|
|
201
274
|
},
|
|
202
275
|
setDescription: (value: string) => {
|
|
203
276
|
echo({ description: value });
|
|
@@ -30,6 +30,7 @@ import { updateSiteConfig } from "../site-context";
|
|
|
30
30
|
import type { LocalesActions, LocalesView } from "../surfaces/settings-locales";
|
|
31
31
|
import type { LocaleRouting } from "@jxsuite/schema/locale";
|
|
32
32
|
import type { ProjectConfig } from "@jxsuite/schema/types";
|
|
33
|
+
import type { ProjectConfigPatch } from "../site-context";
|
|
33
34
|
|
|
34
35
|
/**
|
|
35
36
|
* The form beside the file: the tag being typed, and the last write that failed.
|
|
@@ -67,9 +68,9 @@ function form(container: HTMLElement): Form {
|
|
|
67
68
|
* value the file still holds.
|
|
68
69
|
*
|
|
69
70
|
* @param {HTMLElement} container
|
|
70
|
-
* @param {
|
|
71
|
+
* @param {ProjectConfigPatch} patch
|
|
71
72
|
*/
|
|
72
|
-
async function persist(container: HTMLElement, patch:
|
|
73
|
+
async function persist(container: HTMLElement, patch: ProjectConfigPatch): Promise<void> {
|
|
73
74
|
try {
|
|
74
75
|
await updateSiteConfig(patch);
|
|
75
76
|
form(container).error = "";
|
|
@@ -81,7 +82,7 @@ async function persist(container: HTMLElement, patch: Partial<ProjectConfig>): P
|
|
|
81
82
|
|
|
82
83
|
/** The live project configuration, or an empty one before a project is open. */
|
|
83
84
|
function config(): ProjectConfig {
|
|
84
|
-
return
|
|
85
|
+
return projectState?.projectConfig ?? {};
|
|
85
86
|
}
|
|
86
87
|
|
|
87
88
|
/**
|
|
@@ -90,10 +91,10 @@ function config(): ProjectConfig {
|
|
|
90
91
|
* `undefined` survives the object spread inside `updateSiteConfig` and `JSON.stringify` then drops
|
|
91
92
|
* the key, so removing the last locale leaves a project with no `i18n` at all rather than one
|
|
92
93
|
* declaring an empty list — which `resolveI18n` reports as "declared with no usable locale", a
|
|
93
|
-
* build error for a state the author reached by deleting things.
|
|
94
|
-
*
|
|
94
|
+
* build error for a state the author reached by deleting things. A {@link ProjectConfigPatch}, the
|
|
95
|
+
* same as `general-settings.ts`'s `CLEAR_URL`, because only the patch type can carry `undefined`.
|
|
95
96
|
*/
|
|
96
|
-
const CLEAR_I18N = { i18n: undefined }
|
|
97
|
+
const CLEAR_I18N: ProjectConfigPatch = { i18n: undefined };
|
|
97
98
|
|
|
98
99
|
/** The routing modes, with the sentence that says what each does to a URL. */
|
|
99
100
|
export const LOCALE_ROUTINGS: readonly { value: LocaleRouting; label: string }[] = [
|
|
@@ -242,9 +243,12 @@ function remove(container: HTMLElement, tag: string): void {
|
|
|
242
243
|
const orphaned =
|
|
243
244
|
current?.defaultLocale !== undefined &&
|
|
244
245
|
canonicalizeLocale(current.defaultLocale) === canonicalizeLocale(tag);
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
246
|
+
const i18n: NonNullable<ProjectConfig["i18n"]> = { ...current };
|
|
247
|
+
if (orphaned) {
|
|
248
|
+
i18n.defaultLocale = kept[0]!;
|
|
249
|
+
}
|
|
250
|
+
i18n.locales = kept;
|
|
251
|
+
void persist(container, { i18n });
|
|
248
252
|
}
|
|
249
253
|
|
|
250
254
|
/**
|
|
@@ -266,9 +270,13 @@ function actions(container: HTMLElement): LocalesActions {
|
|
|
266
270
|
void persist(container, { i18n: { ...config().i18n, defaultLocale: value } });
|
|
267
271
|
},
|
|
268
272
|
chooseRouting: (value: string) => {
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
273
|
+
/* The picker's options are LOCALE_ROUTINGS, so the lookup always finds the mode; it is what
|
|
274
|
+
turns the control's string back into the routing it was drawn from. */
|
|
275
|
+
const routing = LOCALE_ROUTINGS.find((mode) => mode.value === value)?.value;
|
|
276
|
+
if (routing === undefined) {
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
void persist(container, { i18n: { ...config().i18n, routing } });
|
|
272
280
|
},
|
|
273
281
|
edit: (value: string) => {
|
|
274
282
|
/* Every keystroke, with no verdict check in front of it. The lit form re-rendered only when
|
|
@@ -11,7 +11,8 @@
|
|
|
11
11
|
* Four sections, and each one closes a hole the shell redesign named:
|
|
12
12
|
*
|
|
13
13
|
* - **Appearance** — the chrome theme. `shell.theme` and `view.setTheme` already existed; nothing
|
|
14
|
-
* rendered them, so the only way to change the theme was to run a command by hand.
|
|
14
|
+
* rendered them, so the only way to change the theme was to run a command by hand. Beside it,
|
|
15
|
+
* **Show developer panels**, which puts Files and Packages on the Design rail (§5.1).
|
|
15
16
|
* - **Assistant** — the provider key. It used to live in `Assistant: Settings…`, a dialog reachable
|
|
16
17
|
* only from inside the assistant panel, which meant a key had to be configured from the surface
|
|
17
18
|
* that was broken for want of one. That dialog is deleted; this is where it went.
|
|
@@ -42,7 +43,7 @@
|
|
|
42
43
|
* to paint. Preferences does not suspend the app.
|
|
43
44
|
*/
|
|
44
45
|
|
|
45
|
-
import { CHROME_THEMES, setChromeTheme, shell } from "../shell";
|
|
46
|
+
import { CHROME_THEMES, isChromeTheme, setChromeTheme, shell } from "../shell";
|
|
46
47
|
import { layerHost } from "../ui/layers";
|
|
47
48
|
import { hydrateAccountStatus } from "../account-status";
|
|
48
49
|
import { getPlatform, hasPlatform } from "../platform";
|
|
@@ -62,8 +63,8 @@ import {
|
|
|
62
63
|
} from "./preferences-accounts";
|
|
63
64
|
import { applyKeybindingOverrides, rebindCommand, resetKeybinding } from "./preferences-keymap";
|
|
64
65
|
import { openPreferencesSurface } from "../surfaces/preferences";
|
|
66
|
+
import { developerPanelsShown, setDeveloperPanelsShown } from "./developer-panels";
|
|
65
67
|
|
|
66
|
-
import type { ChromeTheme } from "../shell";
|
|
67
68
|
import type { ShortcutRow } from "../commands/reference";
|
|
68
69
|
import type { RebindResult } from "./preferences-keymap";
|
|
69
70
|
import type { AnyCommand, CommandRegistry } from "../commands/registry";
|
|
@@ -88,6 +89,7 @@ import {
|
|
|
88
89
|
isPreferencesSection,
|
|
89
90
|
PREFERENCES_SECTIONS,
|
|
90
91
|
} from "./preferences-sections";
|
|
92
|
+
import type { CommandArgValues } from "../commands/command-args";
|
|
91
93
|
|
|
92
94
|
export {
|
|
93
95
|
DEFAULT_PREFERENCES_SECTION,
|
|
@@ -232,7 +234,10 @@ function selectSection(id: string): void {
|
|
|
232
234
|
}
|
|
233
235
|
|
|
234
236
|
function setTheme(value: string): void {
|
|
235
|
-
|
|
237
|
+
// The theme rows are drawn from CHROME_THEMES, so a picked value is always one of them.
|
|
238
|
+
if (isChromeTheme(value)) {
|
|
239
|
+
setChromeTheme(value);
|
|
240
|
+
}
|
|
236
241
|
repaint();
|
|
237
242
|
}
|
|
238
243
|
|
|
@@ -547,6 +552,7 @@ function view(): PreferencesView {
|
|
|
547
552
|
sectionTitle: active?.title ?? "",
|
|
548
553
|
sections: sectionsView(),
|
|
549
554
|
themes: themesView(),
|
|
555
|
+
developerPanels: developerPanelsShown(),
|
|
550
556
|
...(_section === "keyboard" ? keyboardView() : KEYBOARD_IDLE),
|
|
551
557
|
};
|
|
552
558
|
}
|
|
@@ -609,6 +615,10 @@ export function openPreferences(section?: string): Promise<null> {
|
|
|
609
615
|
onResetBinding: resetBinding,
|
|
610
616
|
onSelectSection: selectSection,
|
|
611
617
|
onSetTheme: setTheme,
|
|
618
|
+
onSetDeveloperPanels: (show: boolean) => {
|
|
619
|
+
setDeveloperPanelsShown(show);
|
|
620
|
+
repaint();
|
|
621
|
+
},
|
|
612
622
|
onShowConflict: showConflict,
|
|
613
623
|
onToggleKeystroke: toggleKeystroke,
|
|
614
624
|
onToggleRebind: toggleRebind,
|
|
@@ -652,8 +662,8 @@ export function preferencesCommands(): AnyCommand[] {
|
|
|
652
662
|
keybinding: "mod+,",
|
|
653
663
|
menus: ["commandbar/overflow", "settings/menu", "palette"],
|
|
654
664
|
group: "7_settings",
|
|
655
|
-
run: (_ctx, args) => {
|
|
656
|
-
const section =
|
|
665
|
+
run: (_ctx, args?: CommandArgValues) => {
|
|
666
|
+
const section = args?.section;
|
|
657
667
|
if (section !== undefined && !isPreferencesSection(section)) {
|
|
658
668
|
throw new RangeError(
|
|
659
669
|
`command "app.preferences" argument "section": "${String(section)}" is not a ` +
|
|
@@ -661,7 +671,7 @@ export function preferencesCommands(): AnyCommand[] {
|
|
|
661
671
|
`${PREFERENCES_SECTIONS.map((candidate) => candidate.id).join(", ")}`,
|
|
662
672
|
);
|
|
663
673
|
}
|
|
664
|
-
void openPreferences(section
|
|
674
|
+
void openPreferences(section);
|
|
665
675
|
},
|
|
666
676
|
title: "Preferences…",
|
|
667
677
|
},
|
|
@@ -33,9 +33,11 @@
|
|
|
33
33
|
* during boot.
|
|
34
34
|
*/
|
|
35
35
|
|
|
36
|
+
import { isJsonObject, isString } from "@jxsuite/schema/guards";
|
|
36
37
|
import { normalizeChord, overlappingScopes, parseChord } from "../commands/keymap";
|
|
37
38
|
import { SETTINGS } from "../services/settings/definitions";
|
|
38
39
|
import { clearSettings, readStoredSetting, setSetting } from "../services/settings/kernel";
|
|
40
|
+
import type { JsonValue } from "@jxsuite/schema/types";
|
|
39
41
|
import type { KeybindingOverrides } from "../commands/keymap";
|
|
40
42
|
import type { KeyScope } from "../commands/levels";
|
|
41
43
|
import type { AnyCommand, CommandRegistry } from "../commands/registry";
|
|
@@ -120,13 +122,13 @@ function readRaw(): string {
|
|
|
120
122
|
}
|
|
121
123
|
|
|
122
124
|
/** Every chord in one stored entry, canonicalised — or `null` if any of them is not a chord. */
|
|
123
|
-
function canonicalise(chords:
|
|
125
|
+
function canonicalise(chords: JsonValue): string[] | null {
|
|
124
126
|
if (!Array.isArray(chords)) {
|
|
125
127
|
return null;
|
|
126
128
|
}
|
|
127
129
|
const canonical: string[] = [];
|
|
128
|
-
for (const chord of chords
|
|
129
|
-
if (
|
|
130
|
+
for (const chord of chords) {
|
|
131
|
+
if (!isString(chord)) {
|
|
130
132
|
return null;
|
|
131
133
|
}
|
|
132
134
|
try {
|
|
@@ -159,10 +161,10 @@ export function loadKeybindingOverrides(): Map<string, string[]> {
|
|
|
159
161
|
// Corrupt store: the defaults are the whole keymap.
|
|
160
162
|
return layer;
|
|
161
163
|
}
|
|
162
|
-
if (
|
|
164
|
+
if (!isJsonObject(parsed)) {
|
|
163
165
|
return layer;
|
|
164
166
|
}
|
|
165
|
-
for (const [id, chords] of Object.entries(parsed
|
|
167
|
+
for (const [id, chords] of Object.entries(parsed)) {
|
|
166
168
|
const canonical = canonicalise(chords);
|
|
167
169
|
if (canonical) {
|
|
168
170
|
layer.set(id, canonical);
|
|
@@ -29,7 +29,7 @@ export interface PreferencesSection {
|
|
|
29
29
|
* Four are built; a section is added here when it has something to configure, never before — an
|
|
30
30
|
* empty pane is the "declared but unbuilt" state the rail already refuses to render.
|
|
31
31
|
*/
|
|
32
|
-
|
|
32
|
+
const SECTIONS = [
|
|
33
33
|
{ id: "appearance", title: "Appearance", blurb: "How the Studio chrome looks." },
|
|
34
34
|
{
|
|
35
35
|
id: "assistant",
|
|
@@ -46,12 +46,18 @@ export const PREFERENCES_SECTIONS: readonly PreferencesSection[] = [
|
|
|
46
46
|
title: "Keyboard",
|
|
47
47
|
blurb: "Generated from the command registry — the app's own record of every chord.",
|
|
48
48
|
},
|
|
49
|
-
];
|
|
49
|
+
] as const satisfies readonly PreferencesSection[];
|
|
50
|
+
|
|
51
|
+
/** The id of one built section: the literal set `app.preferences { section }` accepts. */
|
|
52
|
+
export type PreferencesSectionId = (typeof SECTIONS)[number]["id"];
|
|
53
|
+
|
|
54
|
+
/** {@link SECTIONS}, as the sheet and the rail read it. */
|
|
55
|
+
export const PREFERENCES_SECTIONS: readonly PreferencesSection[] = SECTIONS;
|
|
50
56
|
|
|
51
57
|
/** The section the sheet opens on when none is named. */
|
|
52
58
|
export const DEFAULT_PREFERENCES_SECTION = PREFERENCES_SECTIONS[0]!.id;
|
|
53
59
|
|
|
54
|
-
/** Whether a
|
|
55
|
-
export function isPreferencesSection(id: unknown):
|
|
56
|
-
return
|
|
60
|
+
/** Whether a value names a section. */
|
|
61
|
+
export function isPreferencesSection(id: unknown): id is PreferencesSectionId {
|
|
62
|
+
return SECTIONS.some((section) => section.id === id);
|
|
57
63
|
}
|