@jxsuite/studio 6.1.0 → 6.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/2020-f2gkpy8d.js +4 -0
- package/dist/chunks/{action-group-2mqby73c.js → action-group-4aan7g6g.js} +3 -3
- package/dist/chunks/adapter-4912g339.js +4 -0
- package/dist/chunks/cf-account-picker-wccaenh6.js +4 -0
- package/dist/chunks/cf-settings-br6105tr.js +4 -0
- package/dist/chunks/color-28ksk2qm.js +4 -0
- package/dist/chunks/color-area-0fj8a4ga.js +4 -0
- package/dist/chunks/color-field-xch8kx2g.js +4 -0
- package/dist/chunks/color-slider-jxd8v350.js +4 -0
- package/dist/chunks/combobox-p0efwjke.js +4 -0
- package/dist/chunks/components-db68vsn7.js +4 -0
- package/dist/chunks/content-source-1449qesq.js +4 -0
- package/dist/chunks/convert-to-repeater-5h457egj.js +4 -0
- package/dist/chunks/dialog-c4x05vyx.js +4 -0
- package/dist/chunks/editor-x9jn86a7.js +4 -0
- package/dist/chunks/entry-commands-may24cpt.js +4 -0
- package/dist/chunks/extension-sections-pvr14vxr.js +4 -0
- package/dist/chunks/file-ops-x9v54pcj.js +4 -0
- package/dist/chunks/files-j3knqf0s.js +4 -0
- package/dist/chunks/format-host-tyre2trb.js +4 -0
- package/dist/chunks/fs-events-64ma9htc.js +4 -0
- package/dist/chunks/git-panel-84ps5dex.js +4 -0
- package/dist/chunks/grid-view-d2wq9ezg.js +51 -0
- package/dist/chunks/icons-pnfz478q.js +4 -0
- package/dist/chunks/iframe-entry-fvbk89gm.js +5 -0
- package/dist/chunks/iframe-entry-jdcktez8.js +5 -0
- package/dist/chunks/iframe-entry-x0ygf2yr.js +5 -0
- package/dist/chunks/iframe-entry-zap785cw.js +5 -0
- package/dist/chunks/iframe-host-ck6vejt5.js +4 -0
- package/dist/chunks/index-b8xw3vy9.js +4 -0
- package/dist/chunks/{index-gybvv7a6.js → index-zpjmzqfk.js} +3 -3
- package/dist/chunks/{javascript-rnvdp3k4.js → javascript-m54mnwp6.js} +3 -3
- package/dist/chunks/jsonMode-w15cmrcm.js +13 -0
- package/dist/chunks/jx-validate-at3zn8wa.js +4 -0
- package/dist/chunks/layers-h4xp1pss.js +4 -0
- package/dist/chunks/layers-panel-m5hw1d7g.js +4 -0
- package/dist/chunks/listbox-e74qjyq6.js +4 -0
- package/dist/chunks/lit-html-8t8t3dnr.js +4 -0
- package/dist/chunks/media-picker-2cweexc5.js +4 -0
- package/dist/chunks/menu-n6yzswmy.js +4 -0
- package/dist/chunks/menu-ynw13y0s.js +4 -0
- package/dist/chunks/monaco-binding-7gx83x3r.js +4 -0
- package/dist/chunks/monaco-buffer-qzxn567r.js +4 -0
- package/dist/chunks/monaco-setup-gxf6656g.js +4 -0
- package/dist/chunks/notify-cj5zbrs2.js +4 -0
- package/dist/chunks/number-field-y62xq0ty.js +4 -0
- package/dist/chunks/parse-b7ddhr8m.js +4 -0
- package/dist/chunks/platform-3dfws9js.js +4 -0
- package/dist/chunks/popover-jt2gxmzs.js +4 -0
- package/dist/chunks/publish-panel-1gvxbj21.js +4 -0
- package/dist/chunks/quick-search-0dajrwqg.js +4 -0
- package/dist/chunks/references-49qgt404.js +4 -0
- package/dist/chunks/right-panel-jm1bwe53.js +4 -0
- package/dist/chunks/section-registry-6kwc4fky.js +4 -0
- package/dist/chunks/select-rzds841e.js +4 -0
- package/dist/chunks/split-n2gfpm5m.js +4 -0
- package/dist/chunks/{studio-5g0ag7c0.js → studio-0q988f9w.js} +3 -3
- package/dist/chunks/studio-0rt52vpq.js +5 -0
- package/dist/chunks/studio-18vgbhs5.js +5 -0
- package/dist/chunks/{studio-pxg4ap1e.js → studio-1fxkaaea.js} +4 -4
- package/dist/chunks/studio-24mccdrj.js +5 -0
- package/dist/chunks/studio-2eh507zk.js +9 -0
- package/dist/chunks/studio-2hcbccfv.js +5 -0
- package/dist/chunks/studio-2j1cb95x.js +5 -0
- package/dist/chunks/studio-2jbs3rxv.js +5 -0
- package/dist/chunks/{studio-qbj760tx.js → studio-485046te.js} +7 -7
- package/dist/chunks/studio-4h8k4dw9.js +5 -0
- package/dist/chunks/studio-5f6n18kx.js +5 -0
- package/dist/chunks/studio-5gthpky6.js +5 -0
- package/dist/chunks/studio-5ve6bbep.js +5 -0
- package/dist/chunks/studio-6ep3js6b.js +9 -0
- package/dist/chunks/studio-6wkmf3wz.js +9 -0
- package/dist/chunks/studio-841rf3cg.js +5 -0
- package/dist/chunks/studio-8gmwgheg.js +5 -0
- package/dist/chunks/studio-8qm0ep50.js +5 -0
- package/dist/chunks/{studio-anyrgzvb.js → studio-90pq9km1.js} +4 -4
- package/dist/chunks/studio-924p1tm1.js +6 -0
- package/dist/chunks/{studio-v2bvmbjj.js → studio-a3g98wjr.js} +4 -4
- package/dist/chunks/studio-a3shpz9y.js +5 -0
- package/dist/chunks/studio-amsbaaar.js +6 -0
- package/dist/chunks/studio-at5spjbc.js +7 -0
- package/dist/chunks/studio-b2xv945e.js +5 -0
- package/dist/chunks/studio-bn5nkafw.js +5 -0
- package/dist/chunks/studio-bw6q5xjf.js +9 -0
- package/dist/chunks/studio-c7q0t9x1.js +5 -0
- package/dist/chunks/studio-camnhc96.js +6 -0
- package/dist/chunks/studio-cffqvnzd.js +5 -0
- package/dist/chunks/studio-d81xfh1g.js +5 -0
- package/dist/chunks/studio-dgz8d0c1.js +5 -0
- package/dist/chunks/studio-efvfrsf8.js +5 -0
- package/dist/chunks/studio-er30bpcx.js +5 -0
- package/dist/chunks/studio-ezscgr64.js +5 -0
- package/dist/chunks/studio-ffrrncvz.js +5 -0
- package/dist/chunks/studio-fpphgn8y.js +10 -0
- package/dist/chunks/studio-j1kvhdjk.js +4 -0
- package/dist/chunks/{studio-txjjzrsm.js → studio-j430n16g.js} +5 -5
- package/dist/chunks/studio-jjkg84nj.js +5 -0
- package/dist/chunks/studio-m0q32ars.js +4 -0
- package/dist/chunks/studio-m6bdst11.js +5 -0
- package/dist/chunks/studio-nv2cptd4.js +64 -0
- package/dist/chunks/studio-nwfrc98n.js +5 -0
- package/dist/chunks/studio-p1wgvp7r.js +5 -0
- package/dist/chunks/studio-pag2wncm.js +5 -0
- package/dist/chunks/studio-qvanvzfd.js +5 -0
- package/dist/chunks/studio-qwa64kt7.js +5 -0
- package/dist/chunks/studio-rk1zc4x3.js +928 -0
- package/dist/chunks/studio-se2r3ptc.js +5 -0
- package/dist/chunks/studio-sg2a0dh0.js +5 -0
- package/dist/chunks/studio-tjzjhe68.js +5 -0
- package/dist/chunks/{studio-0x3jyb8r.js → studio-tq0rtfwj.js} +4 -4
- package/dist/chunks/{studio-cpxkgjrj.js → studio-v0jzqdjm.js} +4 -4
- package/dist/chunks/studio-v2w7q8r1.js +7 -0
- package/dist/chunks/studio-v5vjq1h0.js +4 -0
- package/dist/chunks/studio-v8aga3vp.js +14 -0
- package/dist/chunks/studio-vfcdrfmv.js +5 -0
- package/dist/chunks/studio-vmfkgdjf.js +5 -0
- package/dist/chunks/studio-wt1816jj.js +5 -0
- package/dist/chunks/studio-wz73q5kq.js +4 -0
- package/dist/chunks/studio-y04qtxvp.js +7 -0
- package/dist/chunks/studio-y21g8zzg.js +5 -0
- package/dist/chunks/studio-y64hrt8p.js +12 -0
- package/dist/chunks/studio-ynn90f58.js +16 -0
- package/dist/chunks/studio-yxz682sx.js +5 -0
- package/dist/chunks/studio-zp7snvkq.js +5 -0
- package/dist/chunks/studio-zq4z6tm6.js +5 -0
- package/dist/chunks/swatch-group-ewh24n1f.js +4 -0
- package/dist/chunks/tabs-f5cw3tgp.js +4 -0
- package/dist/chunks/textfield-wewc8rq2.js +4 -0
- package/dist/chunks/toast-c9fn075p.js +4 -0
- package/dist/chunks/toast-host-ke5z4ng7.js +4 -0
- package/dist/chunks/{toolbar-2nnzqhrj.js → toolbar-44cm5cta.js} +3 -3
- package/dist/chunks/tooltip-5v8ngwj2.js +4 -0
- package/dist/chunks/tree-mdq3v5cw.js +4 -0
- package/dist/chunks/tsMode-sf49ee9x.js +14 -0
- package/dist/chunks/workspace-jtfahpee.js +4 -0
- package/dist/chunks/ws-client-nze0k6mv.js +4 -0
- package/dist/iframe-entry.js +16 -16
- package/dist/manifest.json +63 -63
- package/dist/studio.js +98 -98
- package/dist/workers/ts.worker.js +3 -3
- package/package.json +11 -11
- package/src/about/about-modal.ts +4 -3
- package/src/account/action-flow.ts +45 -38
- package/src/account-status.ts +7 -2
- package/src/browse/library-layouts.ts +8 -5
- package/src/browse/library-model.ts +18 -6
- package/src/browse/library-pane.ts +37 -21
- package/src/browse/library-preview.ts +14 -9
- package/src/browse/library-source.ts +1 -1
- package/src/canvas/asset-refs.ts +24 -9
- package/src/canvas/asset-resolve.ts +19 -23
- package/src/canvas/canvas-helpers.ts +7 -6
- package/src/canvas/canvas-live-render.ts +44 -53
- package/src/canvas/canvas-patcher.ts +30 -30
- package/src/canvas/canvas-perf.ts +11 -5
- package/src/canvas/canvas-render.ts +66 -42
- package/src/canvas/canvas-surface.ts +5 -3
- package/src/canvas/canvas-utils.ts +163 -64
- package/src/canvas/dialog-path.ts +9 -4
- package/src/canvas/dialog-state.ts +1 -2
- package/src/canvas/diff-marks.ts +9 -16
- package/src/canvas/diff-toolbar.ts +8 -7
- package/src/canvas/edit-width-drag.ts +4 -1
- package/src/canvas/edit-width.ts +1 -3
- package/src/canvas/iframe-channel.ts +27 -13
- package/src/canvas/iframe-drop.ts +13 -12
- package/src/canvas/iframe-editable-root.ts +29 -16
- package/src/canvas/iframe-entry.ts +80 -63
- package/src/canvas/iframe-eval.ts +73 -49
- package/src/canvas/iframe-host.ts +203 -118
- package/src/canvas/iframe-inline-edit.ts +69 -32
- package/src/canvas/iframe-insert.ts +5 -4
- package/src/canvas/iframe-interaction.ts +37 -26
- package/src/canvas/iframe-overlay.ts +1 -1
- package/src/canvas/iframe-patch.ts +18 -15
- package/src/canvas/iframe-position.ts +12 -6
- package/src/canvas/iframe-protocol.ts +15 -16
- package/src/canvas/iframe-render.ts +41 -36
- package/src/canvas/iframe-slash.ts +24 -11
- package/src/canvas/iframe-subtree.ts +6 -2
- package/src/canvas/path-mapping.ts +19 -12
- package/src/canvas/popover-path.ts +7 -3
- package/src/canvas/popover-state.ts +1 -2
- package/src/canvas/serialize-scope.ts +13 -5
- package/src/canvas/stage-scrollbar.ts +2 -1
- package/src/canvas/surface-registry.ts +21 -3
- package/src/collab/collab-commands.ts +7 -2
- package/src/collab/collab-session.ts +84 -45
- package/src/collab/collab-state.ts +4 -3
- package/src/collab/monaco-binding.ts +16 -13
- package/src/collab/monaco-cursors.ts +5 -2
- package/src/commands/budget.ts +3 -3
- package/src/commands/command-args.ts +103 -71
- package/src/commands/context.ts +22 -20
- package/src/commands/defaults.ts +4 -1
- package/src/commands/keymap.ts +47 -43
- package/src/commands/levels.ts +3 -3
- package/src/commands/live-context.ts +10 -8
- package/src/commands/reference.ts +2 -1
- package/src/commands/registry.ts +12 -10
- package/src/commands/run-reported.ts +15 -10
- package/src/component-props.ts +46 -30
- package/src/content/collection-match.ts +5 -4
- package/src/content/draft-state.ts +4 -3
- package/src/content/entry-commands.ts +3 -2
- package/src/content/entry-editor.ts +29 -17
- package/src/content/entry-fields.ts +12 -7
- package/src/content/entry-model.ts +21 -12
- package/src/editor/canvas-context-menu.ts +1 -2
- package/src/editor/canvas-slash-bridge.ts +3 -6
- package/src/editor/content-slice.ts +16 -14
- package/src/editor/context-menu.ts +35 -22
- package/src/editor/convert-targets.ts +30 -35
- package/src/editor/convert-to-component.ts +11 -5
- package/src/editor/convert-to-repeater.ts +34 -22
- package/src/editor/editable-tags.ts +17 -2
- package/src/editor/file-drop-action.ts +21 -22
- package/src/editor/inline-edit-apply.ts +35 -17
- package/src/editor/inline-edit.ts +66 -50
- package/src/editor/inline-format.ts +59 -56
- package/src/editor/inline-link.ts +40 -15
- package/src/editor/insert-zone-action.ts +1 -1
- package/src/editor/merge-tags.ts +58 -19
- package/src/editor/repeater-scope.ts +39 -28
- package/src/editor/shortcuts.ts +87 -47
- package/src/editor/slash-menu.ts +1 -6
- package/src/files/asset-versions.ts +4 -4
- package/src/files/components.ts +15 -10
- package/src/files/elements.ts +5 -6
- package/src/files/file-ops.ts +77 -36
- package/src/files/files.ts +90 -95
- package/src/files/media-meta.ts +2 -1
- package/src/files/media-paths.ts +6 -1
- package/src/files/serialize-document.ts +2 -2
- package/src/format/constraints.ts +1 -1
- package/src/format/convert-file.ts +27 -13
- package/src/format/format-choices.ts +2 -1
- package/src/format/format-host.ts +76 -50
- package/src/github/github-auth-status.ts +27 -3
- package/src/github/github-auth.ts +19 -9
- package/src/github/github-publish.ts +24 -20
- package/src/grid/cell-editors.ts +46 -31
- package/src/grid/cell-popovers.ts +5 -3
- package/src/grid/edit-buffer.ts +10 -9
- package/src/grid/grid-controller.ts +20 -22
- package/src/grid/grid-layout.ts +21 -5
- package/src/grid/grid-open.ts +3 -6
- package/src/grid/grid-panel.ts +11 -4
- package/src/grid/grid-source.ts +8 -8
- package/src/grid/grid-view.ts +14 -17
- package/src/grid/redirects-grid.ts +14 -5
- package/src/grid/redirects.ts +16 -14
- package/src/grid/schema-columns.ts +25 -19
- package/src/grid/sources/connector-source.ts +47 -20
- package/src/grid/sources/content-source.ts +25 -24
- package/src/grid/sources/csv-file-source.ts +2 -2
- package/src/grid/tabulator-tables.d.ts +55 -34
- package/src/hosting/stage.ts +7 -7
- package/src/i18n/i18n-commands.ts +1 -2
- package/src/media/media-pane.ts +4 -1
- package/src/new-project/add-repo-modal.ts +20 -19
- package/src/new-project/import-tab.ts +10 -14
- package/src/new-project/location-fields.ts +2 -1
- package/src/new-project/new-project-modal.ts +12 -9
- package/src/packages/jxsuite-update.ts +4 -3
- package/src/packages/pull-package-sync.ts +26 -25
- package/src/page-params.ts +97 -68
- package/src/panels/activity-panel.ts +17 -9
- package/src/panels/ai-chat/attached-context.ts +13 -7
- package/src/panels/ai-chat/chat-view.ts +80 -73
- package/src/panels/ai-chat/composer.ts +30 -33
- package/src/panels/ai-chat/sessions-view.ts +1 -2
- package/src/panels/ai-panel.ts +23 -20
- package/src/panels/block-action-bar.ts +46 -35
- package/src/panels/bottom-dock.ts +5 -3
- package/src/panels/canvas-dnd-bridge.ts +31 -24
- package/src/panels/data-explorer.ts +62 -25
- package/src/panels/data-grid.ts +14 -11
- package/src/panels/dnd.ts +108 -118
- package/src/panels/editors.ts +55 -22
- package/src/panels/elements-panel.ts +10 -3
- package/src/panels/events-panel.ts +84 -69
- package/src/panels/formula-workspace.ts +76 -51
- package/src/panels/frontmatter-fields.ts +24 -19
- package/src/panels/frontmatter-panel.ts +44 -34
- package/src/panels/git-diff-open.ts +4 -4
- package/src/panels/git-panel.ts +49 -61
- package/src/panels/head-panel.ts +131 -111
- package/src/panels/i18n-panel.ts +10 -3
- package/src/panels/imports-panel.ts +23 -47
- package/src/panels/jump-bar.ts +48 -29
- package/src/panels/layers-panel.ts +97 -74
- package/src/panels/left-panel.ts +3 -3
- package/src/panels/pane-context.ts +31 -22
- package/src/panels/pane-grid.ts +49 -20
- package/src/panels/panel-registry.ts +22 -37
- package/src/panels/properties-panel.ts +175 -121
- package/src/panels/quick-search.ts +53 -31
- package/src/panels/right-panel.ts +3 -3
- package/src/panels/seo-modal.ts +13 -17
- package/src/panels/settings-menu.ts +15 -15
- package/src/panels/signals-panel.ts +153 -131
- package/src/panels/statement-editor.ts +230 -140
- package/src/panels/style-panel.ts +254 -216
- package/src/panels/style-utils.ts +114 -51
- package/src/panels/stylebook-doc.ts +57 -54
- package/src/panels/stylebook-layers-panel.ts +9 -9
- package/src/panels/stylebook-panel.ts +13 -17
- package/src/panels/tab-drop.ts +27 -11
- package/src/panels/tab-strip.ts +36 -26
- package/src/platform-errors.ts +57 -43
- package/src/platform.ts +58 -30
- package/src/platforms/cloud.ts +345 -175
- package/src/platforms/default-platform.ts +10 -4
- package/src/platforms/devserver.ts +174 -127
- package/src/platforms/read-batcher.ts +16 -8
- package/src/project-list.ts +2 -1
- package/src/publish/deploy-checklist.ts +8 -2
- package/src/publish/pages-service.ts +28 -13
- package/src/publish/publish-commands.ts +5 -4
- package/src/publish/publish-panel.ts +10 -6
- package/src/recent-projects.ts +15 -8
- package/src/resize-edges.ts +26 -36
- package/src/services/a11y-report.ts +26 -19
- package/src/services/agent-seed.ts +23 -11
- package/src/services/ai-ask.ts +9 -12
- package/src/services/ai-command-tools.ts +68 -62
- package/src/services/ai-import-tools.ts +80 -67
- package/src/services/ai-models.ts +17 -13
- package/src/services/ai-project-tools.ts +68 -32
- package/src/services/ai-session-store.ts +19 -10
- package/src/services/ai-system-prompt.ts +46 -20
- package/src/services/ai-tools.ts +71 -27
- package/src/services/ai-write-report.ts +20 -12
- package/src/services/ai-writes.ts +4 -4
- package/src/services/automation.ts +58 -31
- package/src/services/cem-export.ts +149 -58
- package/src/services/clock.ts +6 -1
- package/src/services/code-services.ts +37 -31
- package/src/services/context-manager.ts +14 -10
- package/src/services/context-resolver.ts +20 -8
- package/src/services/data-service.ts +19 -15
- package/src/services/directory-picker.ts +18 -12
- package/src/services/document-assistant.ts +39 -19
- package/src/services/gated-registry.ts +10 -6
- package/src/services/harness/chat-reducer.ts +23 -1
- package/src/services/import-client.ts +91 -38
- package/src/services/import-seed.ts +8 -2
- package/src/services/jx-validate.ts +28 -31
- package/src/services/live-preview.ts +0 -0
- package/src/services/live-surfaces.ts +6 -3
- package/src/services/model-uri.ts +10 -2
- package/src/services/module-preloads.ts +12 -8
- package/src/services/monaco-buffer.ts +43 -24
- package/src/services/monaco-lazy.ts +7 -8
- package/src/services/monaco-setup.ts +23 -16
- package/src/services/notify.ts +44 -17
- package/src/services/popover-report.ts +25 -10
- package/src/services/preview-eval.ts +20 -8
- package/src/services/profile.ts +13 -6
- package/src/services/project-path.ts +13 -10
- package/src/services/references.ts +0 -0
- package/src/services/render-critic.ts +8 -7
- package/src/services/settings/kernel.ts +13 -4
- package/src/services/settings/write-queue.ts +9 -9
- package/src/services/token-lint.ts +12 -10
- package/src/services/tool-executor.ts +17 -5
- package/src/services/tool-outcomes.ts +44 -24
- package/src/services/trusted-types.ts +24 -7
- package/src/settings/contexts-section.ts +11 -8
- package/src/settings/contributed-section.ts +79 -60
- package/src/settings/css-vars-editor.ts +37 -16
- package/src/settings/defs-editor.ts +38 -35
- package/src/settings/extension-rows.ts +16 -8
- package/src/settings/extension-sections.ts +23 -13
- package/src/settings/extensions-section.ts +4 -1
- package/src/settings/general-settings.ts +11 -8
- package/src/settings/locales-section.ts +20 -12
- package/src/settings/preferences-dialog.ts +9 -6
- package/src/settings/preferences-keymap.ts +7 -5
- package/src/settings/preferences-sections.ts +11 -5
- package/src/settings/project-sections.ts +1 -1
- package/src/settings/schema-field-ui.ts +9 -0
- package/src/settings/settings-document.ts +5 -5
- package/src/shell/tree.ts +6 -5
- package/src/shell.ts +104 -81
- package/src/site-context.ts +37 -22
- package/src/state.ts +41 -49
- package/src/store.ts +54 -34
- package/src/studio.ts +39 -77
- package/src/style/live-preview.ts +1 -1
- package/src/style/project-styles.ts +6 -7
- package/src/style/token-ref.ts +5 -4
- package/src/surfaces/about.ts +18 -19
- package/src/surfaces/add-repo.ts +17 -19
- package/src/surfaces/ai-chat.ts +31 -36
- package/src/surfaces/ai-credentials-form.ts +6 -16
- package/src/surfaces/ai-managed-connect.ts +3 -4
- package/src/surfaces/ai-model-picker.ts +3 -5
- package/src/surfaces/block-action-bar.ts +22 -11
- package/src/surfaces/boot-failure.ts +4 -5
- package/src/surfaces/bottom-dock.ts +9 -18
- package/src/surfaces/canvas-stage.ts +12 -11
- package/src/surfaces/cf-account-picker.ts +17 -18
- package/src/surfaces/commandbar.ts +14 -9
- package/src/surfaces/convert-repeater.ts +17 -19
- package/src/surfaces/data-actions.ts +9 -7
- package/src/surfaces/dialog.ts +26 -28
- package/src/surfaces/diff-toolbar.ts +9 -7
- package/src/surfaces/doc-header.ts +10 -19
- package/src/surfaces/empty-state.ts +7 -10
- package/src/surfaces/entry-editor.ts +14 -11
- package/src/surfaces/expression-editor.ts +11 -25
- package/src/surfaces/files-panel.ts +27 -14
- package/src/surfaces/formula-palette.ts +4 -5
- package/src/surfaces/git-panel.ts +7 -15
- package/src/surfaces/github-auth.ts +16 -20
- package/src/surfaces/github-publish.ts +17 -22
- package/src/surfaces/grid-cell.ts +30 -31
- package/src/surfaces/grid-open.ts +10 -14
- package/src/surfaces/grid-panel.ts +13 -9
- package/src/surfaces/grid-replace.ts +13 -13
- package/src/surfaces/grid-views.ts +15 -18
- package/src/surfaces/inspector-dock.ts +13 -12
- package/src/surfaces/jump-bar.ts +5 -6
- package/src/surfaces/jxsuite-update.ts +16 -22
- package/src/surfaces/library-pane.ts +25 -20
- package/src/surfaces/logic-panel.ts +17 -30
- package/src/surfaces/logic-workspace.ts +13 -15
- package/src/surfaces/media-browser.ts +11 -10
- package/src/surfaces/media-field.ts +4 -5
- package/src/surfaces/media-pane.ts +8 -7
- package/src/surfaces/menu.ts +29 -23
- package/src/surfaces/navigator-dock.ts +11 -12
- package/src/surfaces/new-project.ts +27 -26
- package/src/surfaces/pane-context.ts +20 -25
- package/src/surfaces/pane-grid.ts +15 -10
- package/src/surfaces/panel-activity.ts +5 -6
- package/src/surfaces/panel-data.ts +3 -4
- package/src/surfaces/panel-deploy-checklist.ts +5 -6
- package/src/surfaces/panel-elements.ts +5 -7
- package/src/surfaces/panel-i18n.ts +5 -7
- package/src/surfaces/panel-imports.ts +6 -13
- package/src/surfaces/panel-outline.ts +25 -19
- package/src/surfaces/panel-page.ts +11 -18
- package/src/surfaces/panel-problems.ts +5 -7
- package/src/surfaces/panel-signals.ts +20 -34
- package/src/surfaces/panel-stylebook-layers.ts +5 -8
- package/src/surfaces/preferences.ts +21 -11
- package/src/surfaces/progress-modal.ts +15 -9
- package/src/surfaces/properties-panel.json +1 -1
- package/src/surfaces/properties-panel.ts +20 -42
- package/src/surfaces/publish.ts +18 -18
- package/src/surfaces/push-plan.ts +7 -8
- package/src/surfaces/rail.json +126 -73
- package/src/surfaces/rail.ts +38 -12
- package/src/surfaces/reference-field.ts +11 -15
- package/src/surfaces/schema-builder.ts +16 -22
- package/src/surfaces/schema-form.ts +15 -25
- package/src/surfaces/secret-field.ts +9 -6
- package/src/surfaces/seo.ts +21 -15
- package/src/surfaces/settings-contexts.ts +9 -7
- package/src/surfaces/settings-contributed.ts +14 -10
- package/src/surfaces/settings-css-vars.ts +5 -12
- package/src/surfaces/settings-defs.json +2 -2
- package/src/surfaces/settings-defs.ts +17 -21
- package/src/surfaces/settings-deploy.ts +8 -15
- package/src/surfaces/settings-extensions.ts +5 -6
- package/src/surfaces/settings-head.ts +33 -39
- package/src/surfaces/settings-locales.ts +8 -20
- package/src/surfaces/settings-overview.ts +5 -6
- package/src/surfaces/settings-packages.ts +8 -7
- package/src/surfaces/settings-pane.ts +9 -18
- package/src/surfaces/settings-rawjson.ts +5 -6
- package/src/surfaces/shell.ts +1 -2
- package/src/surfaces/slash-menu.ts +19 -9
- package/src/surfaces/statements.ts +13 -18
- package/src/surfaces/statusbar.ts +17 -14
- package/src/surfaces/style-panel.ts +18 -31
- package/src/surfaces/stylebook-chrome.ts +3 -5
- package/src/surfaces/tab-strip.ts +14 -13
- package/src/surfaces/target-line.ts +6 -7
- package/src/surfaces/welcome.ts +5 -7
- package/src/tabs/patch-ops.ts +4 -3
- package/src/tabs/project-config.ts +32 -21
- package/src/tabs/selection.ts +36 -8
- package/src/tabs/tab.ts +52 -41
- package/src/tabs/transact.ts +98 -53
- package/src/tabs/typing.ts +31 -0
- package/src/types.ts +32 -17
- package/src/ui/ai-credentials-form.ts +10 -13
- package/src/ui/ai-model-picker.ts +3 -3
- package/src/ui/cf-account-picker.ts +7 -9
- package/src/ui/color-selector.ts +9 -5
- package/src/ui/dynamic-slot.ts +7 -8
- package/src/ui/expression-editor.ts +112 -105
- package/src/ui/form-controls.ts +57 -48
- package/src/ui/formula-catalog.ts +239 -230
- package/src/ui/formula-chips.ts +33 -18
- package/src/ui/layers.ts +44 -31
- package/src/ui/media-picker.ts +18 -9
- package/src/ui/popover-surface.ts +20 -12
- package/src/ui/progress-modal.ts +13 -8
- package/src/ui/regions.ts +7 -6
- package/src/ui/schema-form.ts +113 -70
- package/src/ui/surface.ts +71 -8
- package/src/ui/timing.ts +9 -0
- package/src/ui/value-source.ts +44 -31
- package/src/ui/virtual-window.ts +3 -2
- package/src/utils/base64.ts +3 -1
- package/src/utils/edit-display.ts +103 -74
- package/src/utils/element-selectors.ts +3 -2
- package/src/utils/google-fonts.ts +15 -14
- package/src/utils/inherited-style.ts +18 -20
- package/src/utils/link-target.ts +1 -1
- package/src/utils/preview-format.ts +25 -3
- package/src/utils/strip-events.ts +49 -22
- package/src/utils/studio-utils.ts +29 -14
- package/src/view.ts +2 -3
- package/src/workspace/pane-derive.ts +10 -12
- package/src/workspace/session.ts +53 -43
- package/src/workspace/workspace.ts +47 -36
- package/dist/chunks/2020-nkxms0ay.js +0 -4
- package/dist/chunks/adapter-m948ab5f.js +0 -4
- package/dist/chunks/cf-account-picker-n8hr38v7.js +0 -4
- package/dist/chunks/cf-settings-356xdtne.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-yk3t844e.js +0 -4
- package/dist/chunks/content-source-bawmyc09.js +0 -4
- package/dist/chunks/convert-to-repeater-7wns8kf1.js +0 -4
- package/dist/chunks/dialog-mtm9fq5t.js +0 -4
- package/dist/chunks/editor-6sc8nacq.js +0 -4
- package/dist/chunks/entry-commands-8ay9fh81.js +0 -4
- package/dist/chunks/extension-sections-na7rj3nr.js +0 -4
- package/dist/chunks/file-ops-gye0qw56.js +0 -4
- package/dist/chunks/files-dmc2xvcq.js +0 -4
- package/dist/chunks/format-host-t76b53f8.js +0 -4
- package/dist/chunks/fs-events-cg4tpz06.js +0 -4
- package/dist/chunks/git-panel-yef7bshy.js +0 -4
- package/dist/chunks/grid-view-7tt4bxw1.js +0 -51
- package/dist/chunks/icons-qbh8akb1.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-tmz30gfp.js +0 -4
- package/dist/chunks/index-nag78a9h.js +0 -4
- package/dist/chunks/jsonMode-zhwsprqk.js +0 -13
- package/dist/chunks/jx-validate-3gbp5nkn.js +0 -4
- package/dist/chunks/layers-fvz99859.js +0 -4
- package/dist/chunks/layers-panel-gchmbf9p.js +0 -4
- package/dist/chunks/listbox-s8fkmnq8.js +0 -4
- package/dist/chunks/lit-html-9agdspkt.js +0 -4
- package/dist/chunks/media-picker-rhjvyy00.js +0 -4
- package/dist/chunks/menu-2e4y9j7b.js +0 -4
- package/dist/chunks/menu-37d07z9m.js +0 -4
- package/dist/chunks/monaco-binding-2jnhjjvr.js +0 -4
- package/dist/chunks/monaco-buffer-rp21359g.js +0 -4
- package/dist/chunks/monaco-setup-vhh7gayr.js +0 -4
- package/dist/chunks/notify-h3www560.js +0 -4
- package/dist/chunks/number-field-gw7sq8rn.js +0 -4
- package/dist/chunks/parse-897fvqah.js +0 -4
- package/dist/chunks/platform-hz34wcd7.js +0 -4
- package/dist/chunks/popover-8htra4er.js +0 -4
- package/dist/chunks/publish-panel-exsmjzyj.js +0 -4
- package/dist/chunks/quick-search-pgaqeh0m.js +0 -4
- package/dist/chunks/references-2cgdxnb8.js +0 -4
- package/dist/chunks/right-panel-jf856w5w.js +0 -4
- package/dist/chunks/section-registry-jnf8r5gy.js +0 -4
- package/dist/chunks/select-n3v7gwas.js +0 -4
- package/dist/chunks/split-pff8f3ze.js +0 -4
- package/dist/chunks/studio-0f55h9ye.js +0 -5
- package/dist/chunks/studio-0sqdhnew.js +0 -12
- package/dist/chunks/studio-19x1c75w.js +0 -5
- package/dist/chunks/studio-2sqcndak.js +0 -5
- package/dist/chunks/studio-3aey7dd3.js +0 -5
- package/dist/chunks/studio-3bpdkq2s.js +0 -5
- package/dist/chunks/studio-47y6fbpf.js +0 -5
- package/dist/chunks/studio-4m3826v2.js +0 -5
- package/dist/chunks/studio-4nx2dj1g.js +0 -4
- package/dist/chunks/studio-4xv5s47r.js +0 -9
- package/dist/chunks/studio-5g4t8v6w.js +0 -5
- package/dist/chunks/studio-5py436sf.js +0 -5
- package/dist/chunks/studio-77kt594t.js +0 -5
- package/dist/chunks/studio-8f87n763.js +0 -10
- package/dist/chunks/studio-8mb00b84.js +0 -5
- package/dist/chunks/studio-8p51gq2h.js +0 -6
- package/dist/chunks/studio-954ds834.js +0 -5
- package/dist/chunks/studio-9ft45c83.js +0 -9
- package/dist/chunks/studio-a2138x5k.js +0 -7
- package/dist/chunks/studio-a9yzstqj.js +0 -5
- package/dist/chunks/studio-acdksxx6.js +0 -5
- package/dist/chunks/studio-ar8jcf2y.js +0 -5
- package/dist/chunks/studio-bmn4mn9j.js +0 -7
- package/dist/chunks/studio-e7xxa0sj.js +0 -5
- package/dist/chunks/studio-ecaz25vk.js +0 -5
- package/dist/chunks/studio-ery42sqr.js +0 -4
- package/dist/chunks/studio-fzdywr6p.js +0 -9
- package/dist/chunks/studio-g5fmf0c1.js +0 -5
- package/dist/chunks/studio-g7nse7zb.js +0 -5
- package/dist/chunks/studio-geq1ea6k.js +0 -14
- package/dist/chunks/studio-ghkb32r8.js +0 -5
- package/dist/chunks/studio-ghrhy2y7.js +0 -5
- package/dist/chunks/studio-grawhey1.js +0 -5
- package/dist/chunks/studio-h0xgswew.js +0 -5
- package/dist/chunks/studio-h9c4p2tx.js +0 -5
- package/dist/chunks/studio-jyzj5cxs.js +0 -5
- package/dist/chunks/studio-mgx8yhnz.js +0 -64
- package/dist/chunks/studio-mpb04y1d.js +0 -6
- package/dist/chunks/studio-n17mty64.js +0 -5
- package/dist/chunks/studio-nwh2eqsk.js +0 -6
- package/dist/chunks/studio-q1h883bt.js +0 -16
- package/dist/chunks/studio-q4tv82h7.js +0 -9
- package/dist/chunks/studio-qpqa7vk3.js +0 -5
- package/dist/chunks/studio-qqz8e5gk.js +0 -5
- package/dist/chunks/studio-qvasen3f.js +0 -5
- package/dist/chunks/studio-rggdb3hm.js +0 -5
- package/dist/chunks/studio-sghy936h.js +0 -4
- package/dist/chunks/studio-skprc6ef.js +0 -5
- package/dist/chunks/studio-tt2nactf.js +0 -5
- package/dist/chunks/studio-tyasmc39.js +0 -5
- package/dist/chunks/studio-vk9ezads.js +0 -5
- package/dist/chunks/studio-vzacdfsc.js +0 -4
- package/dist/chunks/studio-w4c0xmrw.js +0 -5
- package/dist/chunks/studio-wfjqhhbk.js +0 -5
- package/dist/chunks/studio-wgh5kxpj.js +0 -5
- package/dist/chunks/studio-xasj0796.js +0 -5
- package/dist/chunks/studio-y78s8r2n.js +0 -5
- package/dist/chunks/studio-z8w183sh.js +0 -5
- package/dist/chunks/studio-zscd9ty4.js +0 -928
- package/dist/chunks/studio-zxp13sss.js +0 -7
- package/dist/chunks/studio-zygnmm01.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-gr0m4dzr.js +0 -14
- package/dist/chunks/workspace-m15qtcqp.js +0 -4
- package/dist/chunks/ws-client-nf61frr1.js +0 -4
|
@@ -8,13 +8,14 @@
|
|
|
8
8
|
* path.
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
+
import { isNonNullObject } from "@jxsuite/schema/guards";
|
|
11
12
|
import { getFormats, loadExtensions, loadFormats } from "../format/format-host";
|
|
12
13
|
import { registerSettingsSection, unregisterSettingsSection } from "./section-registry";
|
|
13
14
|
import { renderContributedSection } from "./contributed-section";
|
|
14
15
|
import { dataSectionActions } from "../panels/data-grid";
|
|
15
16
|
import type { ExtensionContributionInfo } from "../types";
|
|
16
17
|
import type { JsonSchema } from "../ui/schema-form";
|
|
17
|
-
import type { SettingsContribution } from "./contributed-section";
|
|
18
|
+
import type { ContributedSectionOptions, SettingsContribution } from "./contributed-section";
|
|
18
19
|
|
|
19
20
|
/** The `$studio.settings` block shape consumed here (nav metadata + the renderer inputs). */
|
|
20
21
|
interface StudioSettingsBlock {
|
|
@@ -49,31 +50,39 @@ const DEFAULT_SECTION_ORDER = 100;
|
|
|
49
50
|
export function deriveSettingsSection(
|
|
50
51
|
info: ExtensionContributionInfo,
|
|
51
52
|
): DerivedSettingsSection | null {
|
|
52
|
-
|
|
53
|
-
|
|
53
|
+
/* SAFETY: `$studio.settings` is the extensions.md §9.1 vocabulary, served verbatim from the
|
|
54
|
+
class descriptor; every member read below is optional and falls back through `??`, so an
|
|
55
|
+
omitted member degrades to the section defaults rather than reaching the renderer. */
|
|
56
|
+
const settings = info.studio?.settings as StudioSettingsBlock | null | undefined;
|
|
54
57
|
if (!settings) {
|
|
55
58
|
return null;
|
|
56
59
|
}
|
|
57
60
|
const { key } = info.project;
|
|
58
61
|
const layout = settings.layout ?? "form";
|
|
62
|
+
/* SAFETY: the backend fills `entrySchema` with `properties[<key>]` of the extension's shipped
|
|
63
|
+
project fragment (compiler `site/format-host.ts`), which is a JSON Schema by construction. */
|
|
59
64
|
const sectionSchema = (info.entrySchema ?? {}) as JsonSchema & {
|
|
60
65
|
additionalProperties?: JsonSchema | boolean;
|
|
61
66
|
};
|
|
62
67
|
const entrySchema =
|
|
63
68
|
layout === "map"
|
|
64
|
-
?
|
|
69
|
+
? isNonNullObject(sectionSchema.additionalProperties)
|
|
65
70
|
? sectionSchema.additionalProperties
|
|
66
71
|
: {}
|
|
67
|
-
:
|
|
72
|
+
: sectionSchema;
|
|
68
73
|
const label = settings.label ?? info.project.title ?? key;
|
|
74
|
+
const sectionSettings: SettingsContribution["settings"] = {};
|
|
75
|
+
if (settings.entry !== undefined) {
|
|
76
|
+
sectionSettings.entry = settings.entry;
|
|
77
|
+
}
|
|
78
|
+
if (settings.layout !== undefined) {
|
|
79
|
+
sectionSettings.layout = settings.layout;
|
|
80
|
+
}
|
|
69
81
|
return {
|
|
70
82
|
contribution: {
|
|
71
83
|
entrySchema,
|
|
72
84
|
key,
|
|
73
|
-
settings:
|
|
74
|
-
...(settings.entry === undefined ? {} : { entry: settings.entry }),
|
|
75
|
-
...(settings.layout === undefined ? {} : { layout: settings.layout }),
|
|
76
|
-
},
|
|
85
|
+
settings: sectionSettings,
|
|
77
86
|
title: label,
|
|
78
87
|
},
|
|
79
88
|
icon: settings.icon,
|
|
@@ -143,10 +152,11 @@ async function runSync(): Promise<void> {
|
|
|
143
152
|
// Data-domain sections get the Test/Push/Data-grid actions slot when the platform
|
|
144
153
|
// Implements the protocol's data routes; every other section renders actions-free.
|
|
145
154
|
const actions = dataSectionActions(derived.key);
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
}
|
|
155
|
+
const opts: ContributedSectionOptions = { formats: getFormats() };
|
|
156
|
+
if (actions !== null) {
|
|
157
|
+
opts.actions = actions;
|
|
158
|
+
}
|
|
159
|
+
renderContributedSection(container, contribution, opts);
|
|
150
160
|
},
|
|
151
161
|
});
|
|
152
162
|
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,6 +16,7 @@
|
|
|
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";
|
|
@@ -31,6 +32,7 @@ import type {
|
|
|
31
32
|
OverviewValues,
|
|
32
33
|
} from "../surfaces/settings-overview";
|
|
33
34
|
import type { JxHeadEntry, ProjectConfig } from "@jxsuite/schema/types";
|
|
35
|
+
import type { ProjectConfigPatch } from "../site-context";
|
|
34
36
|
|
|
35
37
|
/**
|
|
36
38
|
* The last failed write, per rendered section.
|
|
@@ -49,7 +51,7 @@ const mounted = new WeakMap<HTMLElement, OverviewSurfaceHandle>();
|
|
|
49
51
|
|
|
50
52
|
/** The live project configuration, read at the moment it is needed rather than at render time. */
|
|
51
53
|
function config(): ProjectConfig {
|
|
52
|
-
return
|
|
54
|
+
return projectState?.projectConfig || {};
|
|
53
55
|
}
|
|
54
56
|
|
|
55
57
|
// ─── Site description ($head meta) ───────────────────────────────────────────
|
|
@@ -66,7 +68,8 @@ function isDescriptionMeta(entry: JxHeadEntry): boolean {
|
|
|
66
68
|
*/
|
|
67
69
|
function readDescription(cfg: ProjectConfig): string {
|
|
68
70
|
const entry = (cfg.$head ?? []).find((e) => isDescriptionMeta(e));
|
|
69
|
-
|
|
71
|
+
const content = entry?.attributes?.content;
|
|
72
|
+
return isString(content) ? content : "";
|
|
70
73
|
}
|
|
71
74
|
|
|
72
75
|
/** `$head` with the description meta upserted (or dropped, when cleared). */
|
|
@@ -91,11 +94,11 @@ function headWithDescription(head: JxHeadEntry[], text: string): JxHeadEntry[] {
|
|
|
91
94
|
* The patch that _removes_ `url`. `undefined` survives the object spread inside `updateSiteConfig`
|
|
92
95
|
* and `JSON.stringify` then drops the key, so clearing the field clears the setting instead of
|
|
93
96
|
* 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
|
|
97
|
+
* sitemap on `Boolean(url)` but still forwards `""` into the render context). A
|
|
98
|
+
* {@link ProjectConfigPatch} rather than a `Partial<ProjectConfig>`, because under
|
|
99
|
+
* `exactOptionalPropertyTypes` only the patch type can carry an `undefined` member.
|
|
97
100
|
*/
|
|
98
|
-
const CLEAR_URL = { url: undefined }
|
|
101
|
+
const CLEAR_URL: ProjectConfigPatch = { url: undefined };
|
|
99
102
|
|
|
100
103
|
// ─── Projection ──────────────────────────────────────────────────────────────
|
|
101
104
|
|
|
@@ -121,7 +124,7 @@ function values(container: HTMLElement): OverviewValues {
|
|
|
121
124
|
return {
|
|
122
125
|
description: readDescription(cfg),
|
|
123
126
|
error: errors.get(container) ?? null,
|
|
124
|
-
favicon:
|
|
127
|
+
favicon: isString(cfg.favicon) ? cfg.favicon : "",
|
|
125
128
|
name: cfg.name ?? "",
|
|
126
129
|
stylesDisabled: command === undefined,
|
|
127
130
|
stylesTitle: command?.title ?? "",
|
|
@@ -145,7 +148,7 @@ function actions(container: HTMLElement): OverviewActions {
|
|
|
145
148
|
|
|
146
149
|
/** Persist a patch, surfacing the rejection instead of swallowing it. */
|
|
147
150
|
const persist = async (
|
|
148
|
-
patch:
|
|
151
|
+
patch: ProjectConfigPatch,
|
|
149
152
|
field: OverviewErrorField = "section",
|
|
150
153
|
): Promise<void> => {
|
|
151
154
|
try {
|
|
@@ -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
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
* to paint. Preferences does not suspend the app.
|
|
43
43
|
*/
|
|
44
44
|
|
|
45
|
-
import { CHROME_THEMES, setChromeTheme, shell } from "../shell";
|
|
45
|
+
import { CHROME_THEMES, isChromeTheme, setChromeTheme, shell } from "../shell";
|
|
46
46
|
import { layerHost } from "../ui/layers";
|
|
47
47
|
import { hydrateAccountStatus } from "../account-status";
|
|
48
48
|
import { getPlatform, hasPlatform } from "../platform";
|
|
@@ -63,7 +63,6 @@ import {
|
|
|
63
63
|
import { applyKeybindingOverrides, rebindCommand, resetKeybinding } from "./preferences-keymap";
|
|
64
64
|
import { openPreferencesSurface } from "../surfaces/preferences";
|
|
65
65
|
|
|
66
|
-
import type { ChromeTheme } from "../shell";
|
|
67
66
|
import type { ShortcutRow } from "../commands/reference";
|
|
68
67
|
import type { RebindResult } from "./preferences-keymap";
|
|
69
68
|
import type { AnyCommand, CommandRegistry } from "../commands/registry";
|
|
@@ -88,6 +87,7 @@ import {
|
|
|
88
87
|
isPreferencesSection,
|
|
89
88
|
PREFERENCES_SECTIONS,
|
|
90
89
|
} from "./preferences-sections";
|
|
90
|
+
import type { CommandArgValues } from "../commands/command-args";
|
|
91
91
|
|
|
92
92
|
export {
|
|
93
93
|
DEFAULT_PREFERENCES_SECTION,
|
|
@@ -232,7 +232,10 @@ function selectSection(id: string): void {
|
|
|
232
232
|
}
|
|
233
233
|
|
|
234
234
|
function setTheme(value: string): void {
|
|
235
|
-
|
|
235
|
+
// The theme rows are drawn from CHROME_THEMES, so a picked value is always one of them.
|
|
236
|
+
if (isChromeTheme(value)) {
|
|
237
|
+
setChromeTheme(value);
|
|
238
|
+
}
|
|
236
239
|
repaint();
|
|
237
240
|
}
|
|
238
241
|
|
|
@@ -652,8 +655,8 @@ export function preferencesCommands(): AnyCommand[] {
|
|
|
652
655
|
keybinding: "mod+,",
|
|
653
656
|
menus: ["commandbar/overflow", "settings/menu", "palette"],
|
|
654
657
|
group: "7_settings",
|
|
655
|
-
run: (_ctx, args) => {
|
|
656
|
-
const section =
|
|
658
|
+
run: (_ctx, args?: CommandArgValues) => {
|
|
659
|
+
const section = args?.section;
|
|
657
660
|
if (section !== undefined && !isPreferencesSection(section)) {
|
|
658
661
|
throw new RangeError(
|
|
659
662
|
`command "app.preferences" argument "section": "${String(section)}" is not a ` +
|
|
@@ -661,7 +664,7 @@ export function preferencesCommands(): AnyCommand[] {
|
|
|
661
664
|
`${PREFERENCES_SECTIONS.map((candidate) => candidate.id).join(", ")}`,
|
|
662
665
|
);
|
|
663
666
|
}
|
|
664
|
-
void openPreferences(section
|
|
667
|
+
void openPreferences(section);
|
|
665
668
|
},
|
|
666
669
|
title: "Preferences…",
|
|
667
670
|
},
|
|
@@ -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
|
}
|
|
@@ -54,7 +54,7 @@ const errors = new WeakMap<HTMLElement, string>();
|
|
|
54
54
|
|
|
55
55
|
/** The live project configuration, or an empty one before a project is open. */
|
|
56
56
|
function config(): ProjectConfig {
|
|
57
|
-
return
|
|
57
|
+
return projectState?.projectConfig ?? {};
|
|
58
58
|
}
|
|
59
59
|
|
|
60
60
|
// ─── Deploy ───────────────────────────────────────────────────────────────────
|
|
@@ -26,6 +26,15 @@ export const FIELD_TYPES = ["string", "number", "boolean", "array", "object", "r
|
|
|
26
26
|
|
|
27
27
|
export const FORMAT_OPTIONS = ["", "image", "date", "color"];
|
|
28
28
|
|
|
29
|
+
/** What a new field's add row starts as. Spread it: every add row edits its own copy. */
|
|
30
|
+
export const BLANK_FIELD = { format: "", name: "", required: false, type: "string" };
|
|
31
|
+
|
|
32
|
+
/** One object field's unsubmitted nested field. */
|
|
33
|
+
export interface NestedFieldDraft {
|
|
34
|
+
name: string;
|
|
35
|
+
type: string;
|
|
36
|
+
}
|
|
37
|
+
|
|
29
38
|
/**
|
|
30
39
|
* Detect the studio field type from a JSON Schema property definition.
|
|
31
40
|
*
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
import { errorMessage } from "@jxsuite/schema/parse";
|
|
27
27
|
import { optionalStringArg, stringProperty } from "../commands/command-args";
|
|
28
28
|
import { notify } from "../services/notify";
|
|
29
|
-
import {
|
|
29
|
+
import { projectState } from "../state";
|
|
30
30
|
import { PROJECT_CONFIG_PATH } from "../tabs/tab";
|
|
31
31
|
import { lendProjectConfigLayout } from "../tabs/project-config";
|
|
32
32
|
import { activeTab, focusPane, openTab, workspace } from "../workspace/workspace";
|
|
@@ -181,7 +181,7 @@ export function activeSettingsSection(): string | null {
|
|
|
181
181
|
|
|
182
182
|
/** Whether the active tab is the configuration document in its settings editor. */
|
|
183
183
|
export function settingsDocumentOpen(): boolean {
|
|
184
|
-
const tab = activeTab.value
|
|
184
|
+
const tab = activeTab.value;
|
|
185
185
|
return tab?.documentPath === PROJECT_CONFIG_PATH && tab.session.ui.canvasMode === SETTINGS_MODE;
|
|
186
186
|
}
|
|
187
187
|
|
|
@@ -197,7 +197,7 @@ export function settingsDocumentOpen(): boolean {
|
|
|
197
197
|
* @returns {Tab | null} The tab, or null when no project is open
|
|
198
198
|
*/
|
|
199
199
|
export function showSettingsDocument(mode: string = SETTINGS_MODE): Tab | null {
|
|
200
|
-
const state =
|
|
200
|
+
const state = projectState;
|
|
201
201
|
if (!state) {
|
|
202
202
|
return null;
|
|
203
203
|
}
|
|
@@ -210,11 +210,11 @@ export function showSettingsDocument(mode: string = SETTINGS_MODE): Tab | null {
|
|
|
210
210
|
}
|
|
211
211
|
existing.session.ui.canvasMode = mode;
|
|
212
212
|
existing.session.ui.preview = false;
|
|
213
|
-
return revealTab(existing
|
|
213
|
+
return revealTab(existing);
|
|
214
214
|
}
|
|
215
215
|
const tab = openTab({
|
|
216
216
|
capabilities: { modes: [...SETTINGS_TAB_MODES] },
|
|
217
|
-
document:
|
|
217
|
+
document: state.projectConfig ?? {},
|
|
218
218
|
documentPath: PROJECT_CONFIG_PATH,
|
|
219
219
|
id: PROJECT_CONFIG_PATH,
|
|
220
220
|
});
|
package/src/shell/tree.ts
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* the real shell instead of describing one.
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
|
-
import { html, render
|
|
16
|
+
import { html, render } from "lit-html";
|
|
17
17
|
import type { TemplateResult } from "lit-html";
|
|
18
18
|
import { mountShellSurface } from "../surfaces/shell";
|
|
19
19
|
import { mountBootFailureSurface } from "../surfaces/boot-failure";
|
|
@@ -82,7 +82,7 @@ export async function mountShellTree(host: ParentNode = document.body): Promise<
|
|
|
82
82
|
await mountShellSurface(root);
|
|
83
83
|
/* After the frame, so the layers are its siblings in the order they always were. lit's `render`
|
|
84
84
|
manages only the range between its own markers, so appending here leaves `#app` alone. */
|
|
85
|
-
|
|
85
|
+
render(overlayLayers(), root);
|
|
86
86
|
}
|
|
87
87
|
|
|
88
88
|
/**
|
|
@@ -128,12 +128,13 @@ export async function mountBootFailureTree(
|
|
|
128
128
|
* containing block here would move all four of them, silently.
|
|
129
129
|
*/
|
|
130
130
|
function shellRoot(host: ParentNode): HTMLElement {
|
|
131
|
-
|
|
131
|
+
// The only `#shell-root` is the div made below, so the element found is an HTMLElement.
|
|
132
|
+
const existing = host.querySelector<HTMLElement>("#shell-root");
|
|
132
133
|
if (existing) {
|
|
133
|
-
return existing
|
|
134
|
+
return existing;
|
|
134
135
|
}
|
|
135
136
|
const root = document.createElement("div");
|
|
136
137
|
root.id = "shell-root";
|
|
137
|
-
|
|
138
|
+
host.append(root);
|
|
138
139
|
return root;
|
|
139
140
|
}
|