@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
|
@@ -54,12 +54,12 @@ import { collabState } from "../collab/collab-state";
|
|
|
54
54
|
import { problemCount, problems } from "../services/notify";
|
|
55
55
|
import { mountSurface, registerSurface } from "../ui/surface";
|
|
56
56
|
import statusbarDoc from "./statusbar.json";
|
|
57
|
+
import type { CommandArgValues } from "../commands/command-args";
|
|
57
58
|
import type { CommandRegistry } from "../commands/registry";
|
|
58
59
|
import type { EffectScope } from "@vue/reactivity";
|
|
59
|
-
import type { JxDocument } from "@jxsuite/schema/types";
|
|
60
60
|
import type { SurfaceHandle } from "../ui/surface";
|
|
61
61
|
|
|
62
|
-
registerSurface("statusbar", statusbarDoc
|
|
62
|
+
registerSurface("statusbar", statusbarDoc);
|
|
63
63
|
|
|
64
64
|
let _scope: EffectScope | null = null;
|
|
65
65
|
|
|
@@ -72,7 +72,7 @@ interface StatusItem {
|
|
|
72
72
|
label: string;
|
|
73
73
|
/** Extra context for the tooltip. The command's own title and chord are added to it. */
|
|
74
74
|
title?: string;
|
|
75
|
-
args?:
|
|
75
|
+
args?: CommandArgValues;
|
|
76
76
|
}
|
|
77
77
|
|
|
78
78
|
/** One item as the surface reads it: a button that runs a command through `run`, or a readout. */
|
|
@@ -85,7 +85,7 @@ interface ProjectedItem {
|
|
|
85
85
|
disabled: boolean;
|
|
86
86
|
/** For a button: what `run` runs. */
|
|
87
87
|
command: string | null;
|
|
88
|
-
args:
|
|
88
|
+
args: CommandArgValues | undefined;
|
|
89
89
|
}
|
|
90
90
|
|
|
91
91
|
interface ProjectedField {
|
|
@@ -147,9 +147,10 @@ function projectField(
|
|
|
147
147
|
items: readonly (StatusItem | null)[],
|
|
148
148
|
): ProjectedField | null {
|
|
149
149
|
const region = `statusbar/${id}`;
|
|
150
|
-
const live = items
|
|
151
|
-
|
|
152
|
-
|
|
150
|
+
const live = items.flatMap((item) => {
|
|
151
|
+
const projected = item === null ? null : projectItem(registry, region, item);
|
|
152
|
+
return projected === null ? [] : [projected];
|
|
153
|
+
});
|
|
153
154
|
if (live.length === 0) {
|
|
154
155
|
return null;
|
|
155
156
|
}
|
|
@@ -266,7 +267,7 @@ function present(fields: readonly (ProjectedField | null)[]): ProjectedField[] {
|
|
|
266
267
|
return fields.filter((field): field is ProjectedField => field !== null);
|
|
267
268
|
}
|
|
268
269
|
|
|
269
|
-
interface StatusbarScope
|
|
270
|
+
interface StatusbarScope {
|
|
270
271
|
/** The fields before the DOCUMENT slot: PROJECT. */
|
|
271
272
|
leading: ProjectedField[];
|
|
272
273
|
/** Whether the DOCUMENT slot has a trail to show. */
|
|
@@ -282,7 +283,7 @@ let _handle: SurfaceHandle | null = null;
|
|
|
282
283
|
|
|
283
284
|
/** The reactive scope the surface reads, made once. */
|
|
284
285
|
function state(): StatusbarScope {
|
|
285
|
-
_state ??= reactive({
|
|
286
|
+
_state ??= reactive<StatusbarScope>({
|
|
286
287
|
hasDocument: false,
|
|
287
288
|
leading: [],
|
|
288
289
|
run: (key: string) => {
|
|
@@ -291,11 +292,11 @@ function state(): StatusbarScope {
|
|
|
291
292
|
.find((i) => i.key === key);
|
|
292
293
|
const registry = activeRegistry();
|
|
293
294
|
if (item?.command && registry) {
|
|
294
|
-
void runReported(registry, item.command, item.args
|
|
295
|
+
void runReported(registry, item.command, item.args, "Status Bar");
|
|
295
296
|
}
|
|
296
297
|
},
|
|
297
298
|
trailing: [],
|
|
298
|
-
})
|
|
299
|
+
});
|
|
299
300
|
return _state;
|
|
300
301
|
}
|
|
301
302
|
|
|
@@ -306,17 +307,19 @@ function state(): StatusbarScope {
|
|
|
306
307
|
* is the same hand-over the pane grid gives the tab strip and the context bar.
|
|
307
308
|
*/
|
|
308
309
|
function ensureMounted(): void {
|
|
309
|
-
|
|
310
|
+
// The host is captured, so the mount callback below reads the element this call checked.
|
|
311
|
+
const host = statusbarEl;
|
|
312
|
+
if (_mount || !host) {
|
|
310
313
|
return;
|
|
311
314
|
}
|
|
312
|
-
const mount = mountSurface("statusbar", state(),
|
|
315
|
+
const mount = mountSurface("statusbar", state(), host);
|
|
313
316
|
_mount = mount;
|
|
314
317
|
void mount.then((handle) => {
|
|
315
318
|
if (_mount !== mount) {
|
|
316
319
|
return;
|
|
317
320
|
}
|
|
318
321
|
_handle = handle;
|
|
319
|
-
attachJumpBarHost(
|
|
322
|
+
attachJumpBarHost(host.querySelector<HTMLElement>('[part="trail"]'));
|
|
320
323
|
});
|
|
321
324
|
}
|
|
322
325
|
|
|
@@ -22,13 +22,15 @@
|
|
|
22
22
|
* @docs studio/design/style-inspector
|
|
23
23
|
*/
|
|
24
24
|
|
|
25
|
+
import { isString } from "@jxsuite/schema/guards";
|
|
25
26
|
import { reactive } from "../reactivity";
|
|
26
27
|
import { mountSurface, registerSurface } from "../ui/surface";
|
|
27
28
|
import stylePanelDoc from "./style-panel.json";
|
|
28
|
-
import type {
|
|
29
|
+
import type { JxElement } from "@jxsuite/schema/types";
|
|
29
30
|
import type { SurfaceHandle } from "../ui/surface";
|
|
31
|
+
import type { ColorTokenView } from "../ui/color-selector";
|
|
30
32
|
|
|
31
|
-
registerSurface("style-panel", stylePanelDoc
|
|
33
|
+
registerSurface("style-panel", stylePanelDoc);
|
|
32
34
|
|
|
33
35
|
// ─── The projection ──────────────────────────────────────────────────────────
|
|
34
36
|
|
|
@@ -58,19 +60,6 @@ export type StyleRowKind =
|
|
|
58
60
|
/** How the provenance chip is drawn: not at all, as a control, or as a statement. */
|
|
59
61
|
export type StyleChipControl = "none" | "button" | "text";
|
|
60
62
|
|
|
61
|
-
/**
|
|
62
|
-
* One colour the project has named, as the row's palette draws it.
|
|
63
|
-
*
|
|
64
|
-
* `value` is the reference and `color` is the literal behind it, and they are two fields because
|
|
65
|
-
* they are two things: choosing a swatch commits `var(--color-accent)`, while the chip is only how
|
|
66
|
-
* that reads on screen. `label` is what a reader hears — a swatch is never named by its hex.
|
|
67
|
-
*/
|
|
68
|
-
export interface StyleTokenView extends Record<string, unknown> {
|
|
69
|
-
value: string;
|
|
70
|
-
color: string;
|
|
71
|
-
label: string;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
63
|
/**
|
|
75
64
|
* One keyword a `keywords` row lists under its field.
|
|
76
65
|
*
|
|
@@ -78,7 +67,7 @@ export interface StyleTokenView extends Record<string, unknown> {
|
|
|
78
67
|
* — and the two stay separate because the field holds the value: a combobox row's label is a
|
|
79
68
|
* courtesy, never a second spelling the reader could end up with.
|
|
80
69
|
*/
|
|
81
|
-
export interface StyleOptionView
|
|
70
|
+
export interface StyleOptionView {
|
|
82
71
|
value: string;
|
|
83
72
|
label: string;
|
|
84
73
|
/** A muted note at the end of the row — a font token's own name beside its display name. */
|
|
@@ -97,7 +86,7 @@ export interface StyleOptionView extends Record<string, unknown> {
|
|
|
97
86
|
}
|
|
98
87
|
|
|
99
88
|
/** One value of a button-group row. */
|
|
100
|
-
export interface StyleButtonView
|
|
89
|
+
export interface StyleButtonView {
|
|
101
90
|
/** The owning row's key — a nested `$map` shadows `$map.item`, so the row carries it here. */
|
|
102
91
|
row: string;
|
|
103
92
|
/** The CSS value this button commits, and the button's identity in the repeater. */
|
|
@@ -130,7 +119,7 @@ export interface StyleButtonView extends Record<string, unknown> {
|
|
|
130
119
|
* `prop` is the name a reader, the region grammar and the inspector see. The two are different on
|
|
131
120
|
* purpose: one coordinate's `color` and another's are two rows with one name.
|
|
132
121
|
*/
|
|
133
|
-
export interface StyleRowView
|
|
122
|
+
export interface StyleRowView {
|
|
134
123
|
key: string;
|
|
135
124
|
prop: string;
|
|
136
125
|
label: string;
|
|
@@ -177,7 +166,7 @@ export interface StyleRowView extends Record<string, unknown> {
|
|
|
177
166
|
choicesHint: string;
|
|
178
167
|
buttons: StyleButtonView[];
|
|
179
168
|
/** The palette a colour row offers inside its picker, and whether it has one to offer. */
|
|
180
|
-
tokens:
|
|
169
|
+
tokens: ColorTokenView[];
|
|
181
170
|
hasTokens: boolean;
|
|
182
171
|
overflowSelected: boolean;
|
|
183
172
|
expanded: boolean;
|
|
@@ -190,7 +179,7 @@ export interface StyleRowView extends Record<string, unknown> {
|
|
|
190
179
|
}
|
|
191
180
|
|
|
192
181
|
/** One accordion section. */
|
|
193
|
-
export interface StyleSectionView
|
|
182
|
+
export interface StyleSectionView {
|
|
194
183
|
key: string;
|
|
195
184
|
label: string;
|
|
196
185
|
open: boolean;
|
|
@@ -236,14 +225,14 @@ export interface StylePanelActions {
|
|
|
236
225
|
/** The provenance chip, a custom pair's remove and a nested rule's remove are one verb. */
|
|
237
226
|
chipClick: (key: string) => void;
|
|
238
227
|
/** Open the Value Source picker under the chip that was pressed. */
|
|
239
|
-
pickSource: (key: string, anchor:
|
|
228
|
+
pickSource: (key: string, anchor: EventTarget | null) => void;
|
|
240
229
|
/** Open the row's list of offerable values under the button that was pressed. */
|
|
241
|
-
pickChoice: (key: string, anchor:
|
|
230
|
+
pickChoice: (key: string, anchor: EventTarget | null) => void;
|
|
242
231
|
pressButton: (key: string, value: string) => void;
|
|
243
232
|
toggleShorthand: (key: string) => void;
|
|
244
233
|
renameCustom: (key: string, name: string) => void;
|
|
245
234
|
/** Enter in the add-a-property field. Given the field too, because it is emptied on success. */
|
|
246
|
-
addCustom: (key: string, field:
|
|
235
|
+
addCustom: (key: string, field: EventTarget | null) => void;
|
|
247
236
|
openNested: (key: string) => void;
|
|
248
237
|
addNested: () => void;
|
|
249
238
|
}
|
|
@@ -264,12 +253,12 @@ export interface StylePanelSurface {
|
|
|
264
253
|
}
|
|
265
254
|
|
|
266
255
|
/** The scope the document reads: the view plus the actions, flat. */
|
|
267
|
-
interface StylePanelScope extends
|
|
256
|
+
interface StylePanelScope extends StylePanelView, StylePanelActions {}
|
|
268
257
|
|
|
269
258
|
/** A node definition's `part`, as written in the document. */
|
|
270
259
|
function partOf(def: JxElement | string): string {
|
|
271
|
-
const part =
|
|
272
|
-
return
|
|
260
|
+
const part = isString(def) ? undefined : def.attributes?.["part"];
|
|
261
|
+
return isString(part) ? part : "";
|
|
273
262
|
}
|
|
274
263
|
|
|
275
264
|
/** Write a whole view into the scope. Assignment only — the mount is never rebuilt for a repaint. */
|
|
@@ -300,7 +289,7 @@ export function mountStylePanelSurface(
|
|
|
300
289
|
actions: StylePanelActions,
|
|
301
290
|
hosts: StyleHostSink,
|
|
302
291
|
): StylePanelSurface {
|
|
303
|
-
const scope = reactive<StylePanelScope>({
|
|
292
|
+
const scope: StylePanelScope = reactive<StylePanelScope>({
|
|
304
293
|
...actions,
|
|
305
294
|
emptyActionLabel: "",
|
|
306
295
|
emptyMessage: "",
|
|
@@ -308,7 +297,7 @@ export function mountStylePanelSurface(
|
|
|
308
297
|
hasEmptyAction: false,
|
|
309
298
|
sections: [],
|
|
310
299
|
view: "empty",
|
|
311
|
-
})
|
|
300
|
+
});
|
|
312
301
|
project(scope, view);
|
|
313
302
|
|
|
314
303
|
host.replaceChildren();
|
|
@@ -334,9 +323,7 @@ export function mountStylePanelSurface(
|
|
|
334
323
|
dock that redrew took the tab's root away without telling anyone. */
|
|
335
324
|
connected: () =>
|
|
336
325
|
!disposed &&
|
|
337
|
-
(mounted === null
|
|
338
|
-
? host.childNodes.length === 0
|
|
339
|
-
: (mounted.root as Node).parentNode === host),
|
|
326
|
+
(mounted === null ? host.childNodes.length === 0 : mounted.root.parentNode === host),
|
|
340
327
|
dispose() {
|
|
341
328
|
disposed = true;
|
|
342
329
|
hosts.target(null);
|
|
@@ -29,10 +29,9 @@
|
|
|
29
29
|
import { reactive } from "../reactivity";
|
|
30
30
|
import { mountSurface, registerSurface } from "../ui/surface";
|
|
31
31
|
import chromeDoc from "./stylebook-chrome.json";
|
|
32
|
-
import type { JxDocument } from "@jxsuite/schema/types";
|
|
33
32
|
import type { SurfaceHandle } from "../ui/surface";
|
|
34
33
|
|
|
35
|
-
registerSurface("stylebook-chrome", chromeDoc
|
|
34
|
+
registerSurface("stylebook-chrome", chromeDoc);
|
|
36
35
|
|
|
37
36
|
/** What the bar says right now. Every field is the panel's own wording, never a value it derives. */
|
|
38
37
|
export interface StylebookChromeView {
|
|
@@ -64,8 +63,7 @@ export interface StylebookChromeSurface {
|
|
|
64
63
|
update: (view: StylebookChromeView) => void;
|
|
65
64
|
}
|
|
66
65
|
|
|
67
|
-
interface StylebookChromeScope
|
|
68
|
-
extends Record<string, unknown>, StylebookChromeView, StylebookChromeActions {}
|
|
66
|
+
interface StylebookChromeScope extends StylebookChromeView, StylebookChromeActions {}
|
|
69
67
|
|
|
70
68
|
/**
|
|
71
69
|
* Create the bar's surface, mounted into a host of its own.
|
|
@@ -84,7 +82,7 @@ export function createStylebookChromeSurface(
|
|
|
84
82
|
): StylebookChromeSurface {
|
|
85
83
|
const host = document.createElement("div");
|
|
86
84
|
host.style.display = "contents";
|
|
87
|
-
const scope = reactive({ ...view, ...actions })
|
|
85
|
+
const scope: StylebookChromeScope = reactive<StylebookChromeScope>({ ...view, ...actions });
|
|
88
86
|
|
|
89
87
|
/** `null` while a mount is in flight — which is a standing surface, not a missing one. */
|
|
90
88
|
let handle: SurfaceHandle | null = null;
|
|
@@ -28,20 +28,21 @@
|
|
|
28
28
|
* @docs studio/interface
|
|
29
29
|
*/
|
|
30
30
|
|
|
31
|
+
import { isJsonObject, isString } from "@jxsuite/schema/guards";
|
|
31
32
|
import { reactive } from "../reactivity";
|
|
32
33
|
import { mountSurface, registerSurface } from "../ui/surface";
|
|
33
34
|
import tabStripDoc from "./tab-strip.json";
|
|
34
|
-
import type {
|
|
35
|
+
import type { JxElement } from "@jxsuite/schema/types";
|
|
35
36
|
import type { JxScope } from "@jxsuite/runtime/types";
|
|
36
37
|
import type { SurfaceHandle } from "../ui/surface";
|
|
37
38
|
|
|
38
|
-
registerSurface("tab-strip", tabStripDoc
|
|
39
|
+
registerSurface("tab-strip", tabStripDoc);
|
|
39
40
|
|
|
40
41
|
/**
|
|
41
42
|
* One chip, as the document draws it. Every field is a value: the document asks no question about a
|
|
42
43
|
* tab, and there is no branch in it that a projection has not already decided.
|
|
43
44
|
*/
|
|
44
|
-
export interface TabChipView
|
|
45
|
+
export interface TabChipView {
|
|
45
46
|
/** The tab id: the repeater's key, the tab's `value`, and what every action is addressed with. */
|
|
46
47
|
key: string;
|
|
47
48
|
/** The shortest suffix that tells this document apart, or a page's route. */
|
|
@@ -107,7 +108,7 @@ export interface TabStripActions {
|
|
|
107
108
|
/** The chevron, or a derived pane's ✕. The anchor is the button that was pressed. */
|
|
108
109
|
openTrailing: (anchor: HTMLElement | null) => void;
|
|
109
110
|
/** A wheel over the strip. A host function in handler position, so it takes the event. */
|
|
110
|
-
wheel: (scope:
|
|
111
|
+
wheel: (scope: JxScope, event: WheelEvent) => void;
|
|
111
112
|
/** A chip element exists. `panels/tab-strip.ts` makes it a pragmatic drag source and drop target. */
|
|
112
113
|
chipHost: (element: HTMLElement, id: string) => void;
|
|
113
114
|
/**
|
|
@@ -146,20 +147,20 @@ export interface TabStripSurface {
|
|
|
146
147
|
}
|
|
147
148
|
|
|
148
149
|
/** The scope `tab-strip.json` reads. */
|
|
149
|
-
interface TabStripScope
|
|
150
|
-
extends Record<string, unknown>, TabStripValues, TabStripActions, TabStripDragState {}
|
|
150
|
+
interface TabStripScope extends TabStripValues, TabStripActions, TabStripDragState {}
|
|
151
151
|
|
|
152
152
|
/** The `part` a node's definition carries, or `""` for a text node or an unmarked element. */
|
|
153
153
|
function partOf(def: JxElement | string): string {
|
|
154
|
-
const part =
|
|
155
|
-
return
|
|
154
|
+
const part = isString(def) ? undefined : def.attributes?.["part"];
|
|
155
|
+
return isString(part) ? part : "";
|
|
156
156
|
}
|
|
157
157
|
|
|
158
158
|
/** The tab id a mapped `jx-tab` node was rendered for, read from the row scope, or `""`. */
|
|
159
159
|
function mappedChipKey(state: JxScope | undefined): string {
|
|
160
|
-
const map = state?.["$map"]
|
|
161
|
-
const
|
|
162
|
-
|
|
160
|
+
const map = state?.["$map"];
|
|
161
|
+
const item = isJsonObject(map) ? map["item"] : undefined;
|
|
162
|
+
const key = isJsonObject(item) ? item["key"] : undefined;
|
|
163
|
+
return isString(key) ? key : "";
|
|
163
164
|
}
|
|
164
165
|
|
|
165
166
|
/**
|
|
@@ -178,13 +179,13 @@ export function mountTabStripSurface(
|
|
|
178
179
|
values: TabStripValues,
|
|
179
180
|
actions: TabStripActions,
|
|
180
181
|
): TabStripSurface {
|
|
181
|
-
const scope = reactive<TabStripScope>({
|
|
182
|
+
const scope: TabStripScope = reactive<TabStripScope>({
|
|
182
183
|
...values,
|
|
183
184
|
...actions,
|
|
184
185
|
dragKey: "",
|
|
185
186
|
dropIndex: -1,
|
|
186
187
|
dropTail: false,
|
|
187
|
-
})
|
|
188
|
+
});
|
|
188
189
|
|
|
189
190
|
host.replaceChildren();
|
|
190
191
|
let mounted: SurfaceHandle | null = null;
|
|
@@ -46,11 +46,10 @@ import { reactive } from "../reactivity";
|
|
|
46
46
|
import { mountSurface, registerSurface } from "../ui/surface";
|
|
47
47
|
import { openMenu } from "./menu";
|
|
48
48
|
import targetLineDoc from "./target-line.json";
|
|
49
|
-
import type { JxDocument } from "@jxsuite/schema/types";
|
|
50
49
|
import type { MenuHandle, MenuRowProjection } from "./menu";
|
|
51
50
|
import type { SurfaceHandle } from "../ui/surface";
|
|
52
51
|
|
|
53
|
-
registerSurface("target-line", targetLineDoc
|
|
52
|
+
registerSurface("target-line", targetLineDoc);
|
|
54
53
|
|
|
55
54
|
/** The region the line stamps on itself, so a shot can crop it. */
|
|
56
55
|
const REGION = "inspector/target";
|
|
@@ -108,7 +107,7 @@ export const BASE_SELECTOR_LABEL = "base rule";
|
|
|
108
107
|
// ─── The projection ──────────────────────────────────────────────────────────
|
|
109
108
|
|
|
110
109
|
/** One word of the sentence, as the document reads it. */
|
|
111
|
-
interface ProjectedSegment
|
|
110
|
+
interface ProjectedSegment {
|
|
112
111
|
key: string;
|
|
113
112
|
label: string;
|
|
114
113
|
title: string;
|
|
@@ -119,7 +118,7 @@ interface ProjectedSegment extends Record<string, unknown> {
|
|
|
119
118
|
}
|
|
120
119
|
|
|
121
120
|
/** The scope `target-line.json` reads. */
|
|
122
|
-
interface TargetLineScope
|
|
121
|
+
interface TargetLineScope {
|
|
123
122
|
region: string;
|
|
124
123
|
segments: ProjectedSegment[];
|
|
125
124
|
selectorLabel: string;
|
|
@@ -201,7 +200,7 @@ function scope(): TargetLineScope {
|
|
|
201
200
|
toggleLabel: "Show affected",
|
|
202
201
|
warn: false,
|
|
203
202
|
warningText: "",
|
|
204
|
-
})
|
|
203
|
+
});
|
|
205
204
|
return _scope;
|
|
206
205
|
}
|
|
207
206
|
|
|
@@ -311,11 +310,11 @@ export function openSelectorMenu(): void {
|
|
|
311
310
|
},
|
|
312
311
|
title: BASE_SELECTOR_LABEL,
|
|
313
312
|
},
|
|
314
|
-
...selector.options.map((option, index) => ({
|
|
313
|
+
...selector.options.map((option, index): MenuRowProjection => ({
|
|
315
314
|
/* What the ● in the old menu said: this element already DECLARES this rule. Where you are is
|
|
316
315
|
stated once, by the trigger's own label — a row that carried both facts would be two
|
|
317
316
|
answers on one line. */
|
|
318
|
-
checked:
|
|
317
|
+
checked: selector.declared.has(option) ? "true" : "false",
|
|
319
318
|
destructive: false,
|
|
320
319
|
disabled: false,
|
|
321
320
|
dividerAbove: index === 0,
|
package/src/surfaces/welcome.ts
CHANGED
|
@@ -24,16 +24,15 @@ import { runOfferedAction } from "../account/action-flow";
|
|
|
24
24
|
import { platformSupportsAddRepo } from "../new-project/add-repo-modal";
|
|
25
25
|
import { getProjectList } from "../project-list";
|
|
26
26
|
import { reactive } from "../reactivity";
|
|
27
|
-
import { now } from "../services/clock";
|
|
27
|
+
import { MINUTE, now } from "../services/clock";
|
|
28
28
|
import { clearRecentProjects, getRecentProjects, removeRecentProject } from "../recent-projects";
|
|
29
29
|
import { platformSupportsClone } from "../panels/git-panel";
|
|
30
30
|
import { mountSurface, registerSurface } from "../ui/surface";
|
|
31
31
|
import welcomeDoc from "./welcome.json";
|
|
32
|
-
import type { JxDocument } from "@jxsuite/schema/types";
|
|
33
32
|
import type { SurfaceHandle } from "../ui/surface";
|
|
34
33
|
import type { AccountNotice, OfferedAction } from "../types";
|
|
35
34
|
|
|
36
|
-
registerSurface("welcome", welcomeDoc
|
|
35
|
+
registerSurface("welcome", welcomeDoc);
|
|
37
36
|
|
|
38
37
|
interface WelcomeCtx {
|
|
39
38
|
openProject: () => void;
|
|
@@ -122,7 +121,6 @@ export function recentLocations(
|
|
|
122
121
|
return labels;
|
|
123
122
|
}
|
|
124
123
|
|
|
125
|
-
const MINUTE = 60_000;
|
|
126
124
|
const HOUR = 60 * MINUTE;
|
|
127
125
|
const DAY = 24 * HOUR;
|
|
128
126
|
|
|
@@ -195,7 +193,7 @@ interface CatalogueRow {
|
|
|
195
193
|
detail: string;
|
|
196
194
|
}
|
|
197
195
|
|
|
198
|
-
interface WelcomeScope
|
|
196
|
+
interface WelcomeScope {
|
|
199
197
|
actions: StartAction[];
|
|
200
198
|
installNeeded: boolean;
|
|
201
199
|
installUrl: string;
|
|
@@ -292,7 +290,7 @@ function noticeAction(key: string): OfferedAction | null {
|
|
|
292
290
|
|
|
293
291
|
/** The reactive scope the surface reads, made once. */
|
|
294
292
|
function state(): WelcomeScope {
|
|
295
|
-
_state ??= reactive({
|
|
293
|
+
_state ??= reactive<WelcomeScope>({
|
|
296
294
|
actions: [],
|
|
297
295
|
catalogue: [],
|
|
298
296
|
clear: () => {
|
|
@@ -342,7 +340,7 @@ function state(): WelcomeScope {
|
|
|
342
340
|
}
|
|
343
341
|
}
|
|
344
342
|
},
|
|
345
|
-
})
|
|
343
|
+
});
|
|
346
344
|
return _state;
|
|
347
345
|
}
|
|
348
346
|
|
package/src/tabs/patch-ops.ts
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
// oxlint-disable-next-line unicorn/prefer-export-from -- JxDocOpPair is also used locally (TransactionRecord)
|
|
9
9
|
import type { JxDocOpPair } from "@jxsuite/schema/doc-ops";
|
|
10
|
+
import type { JxDocumentValue, JxMutableNode } from "@jxsuite/schema/types";
|
|
10
11
|
import type { JxPath } from "../state";
|
|
11
12
|
import type { Tab } from "./tab.js";
|
|
12
13
|
|
|
@@ -48,8 +49,8 @@ export type { JxDocOpPair };
|
|
|
48
49
|
*/
|
|
49
50
|
export interface JxFmOp {
|
|
50
51
|
field: string;
|
|
51
|
-
before?:
|
|
52
|
-
after?:
|
|
52
|
+
before?: JxDocumentValue | undefined;
|
|
53
|
+
after?: JxDocumentValue | undefined;
|
|
53
54
|
}
|
|
54
55
|
|
|
55
56
|
/** Everything recorded during one transaction. */
|
|
@@ -82,7 +83,7 @@ export interface PatchConsumer {
|
|
|
82
83
|
* was consumed by whichever pane's effect ran first, so the second full-rendered every patched
|
|
83
84
|
* edit while the skip counter reported one skip.
|
|
84
85
|
*/
|
|
85
|
-
markConsumed: (docRef:
|
|
86
|
+
markConsumed: (docRef: JxMutableNode, tab: Tab) => void;
|
|
86
87
|
/**
|
|
87
88
|
* Apply the batch to all ready canvas panels. Throws on any failure (caller escalates). `record`
|
|
88
89
|
* carries the value-carrying `docOps` the iframe consumer posts across the frame boundary; the
|
|
@@ -63,7 +63,7 @@ import { errorMessage } from "@jxsuite/schema/parse";
|
|
|
63
63
|
import { effect, toRaw } from "../reactivity";
|
|
64
64
|
import { getPlatform } from "../platform";
|
|
65
65
|
import { notify } from "../services/notify";
|
|
66
|
-
import { requireProjectState, setProjectState } from "../state";
|
|
66
|
+
import { projectState, requireProjectState, setProjectState } from "../state";
|
|
67
67
|
import { setWorkspaceProject, workspace } from "../workspace/workspace";
|
|
68
68
|
import { PROJECT_CONFIG_PATH, createTab, disposeTab } from "./tab";
|
|
69
69
|
import { transactDoc } from "./transact";
|
|
@@ -71,7 +71,7 @@ import { deriveJsonLayout, parseJsonDocument, serializeJson } from "@jxsuite/sch
|
|
|
71
71
|
import type { JsonLayout } from "@jxsuite/schema/json-layout";
|
|
72
72
|
|
|
73
73
|
import type { Tab } from "./tab";
|
|
74
|
-
import type { ProjectConfig } from "@jxsuite/schema/types";
|
|
74
|
+
import type { JxMutableNode, ProjectConfig } from "@jxsuite/schema/types";
|
|
75
75
|
|
|
76
76
|
export { PROJECT_CONFIG_PATH } from "./tab";
|
|
77
77
|
|
|
@@ -147,7 +147,7 @@ let _seeding: Promise<void> | null = null;
|
|
|
147
147
|
*/
|
|
148
148
|
function openConfigTab(): Tab | null {
|
|
149
149
|
const tab = workspace.tabs.get(PROJECT_CONFIG_PATH);
|
|
150
|
-
return tab ?
|
|
150
|
+
return tab ? toRaw(tab) : null;
|
|
151
151
|
}
|
|
152
152
|
|
|
153
153
|
/** Drop the current binding, disposing the detached document if that is what it was. */
|
|
@@ -169,7 +169,8 @@ function seedCommitted(): Promise<void> {
|
|
|
169
169
|
const text = await getPlatform().readFile(PROJECT_CONFIG_PATH);
|
|
170
170
|
const { document, layout } = parseJsonDocument(text);
|
|
171
171
|
_layout = layout;
|
|
172
|
-
|
|
172
|
+
// {@link serializeProjectConfig}'s serialisation, over the file's parse rather than a config.
|
|
173
|
+
_committed = serializeJson(document, configLayout());
|
|
173
174
|
} catch {
|
|
174
175
|
// No file, an unreadable one, or one that does not parse. "Unknown" is the honest answer,
|
|
175
176
|
// And an unknown file is one every commit must write.
|
|
@@ -240,8 +241,22 @@ function syncProjectState(config: ProjectConfig): void {
|
|
|
240
241
|
* @returns {ProjectConfig | null}
|
|
241
242
|
*/
|
|
242
243
|
function liveConfig(): ProjectConfig | null {
|
|
243
|
-
const config =
|
|
244
|
-
return config ?
|
|
244
|
+
const config = projectState?.projectConfig;
|
|
245
|
+
return config ? toRaw(config) : null;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* The configuration a configuration document holds, unwrapped.
|
|
250
|
+
*
|
|
251
|
+
* @param {JxMutableNode} document The bound tab's `doc.document`.
|
|
252
|
+
* @returns {ProjectConfig}
|
|
253
|
+
*/
|
|
254
|
+
function configOf(document: JxMutableNode): ProjectConfig {
|
|
255
|
+
/* SAFETY: every document this module reads is the `project.json` tab's root, and that root is
|
|
256
|
+
only ever installed as a ProjectConfig: `createTab` below seeds it from `projectConfig`, an open
|
|
257
|
+
tab parsed the file the schema gate wrote, and every transaction here assigns configuration
|
|
258
|
+
keys. The Tab type calls every root a JxMutableNode; this is the one place that says which. */
|
|
259
|
+
return toRaw(document) as ProjectConfig;
|
|
245
260
|
}
|
|
246
261
|
|
|
247
262
|
/**
|
|
@@ -261,10 +276,10 @@ function liveConfig(): ProjectConfig | null {
|
|
|
261
276
|
* settings surfaces render from `projectState` and mutate it in place, and every reader of the
|
|
262
277
|
* document follows the root reference {@link transactDoc} replaces when the transaction ends.
|
|
263
278
|
*
|
|
264
|
-
* @param {
|
|
279
|
+
* @param {JxMutableNode} target
|
|
265
280
|
* @param {ProjectConfig} source
|
|
266
281
|
*/
|
|
267
|
-
function replaceContents(target:
|
|
282
|
+
function replaceContents(target: JxMutableNode, source: ProjectConfig): void {
|
|
268
283
|
for (const key of Object.keys(target)) {
|
|
269
284
|
delete target[key];
|
|
270
285
|
}
|
|
@@ -282,10 +297,10 @@ function bind(tab: Tab): Tab {
|
|
|
282
297
|
tab.scope.run(() => {
|
|
283
298
|
effect(() => {
|
|
284
299
|
const doc = tab.doc.document;
|
|
285
|
-
if (_bound !== tab || !
|
|
300
|
+
if (_bound !== tab || !projectState) {
|
|
286
301
|
return;
|
|
287
302
|
}
|
|
288
|
-
syncProjectState(
|
|
303
|
+
syncProjectState(configOf(doc));
|
|
289
304
|
});
|
|
290
305
|
});
|
|
291
306
|
return tab;
|
|
@@ -316,7 +331,7 @@ export function projectConfigDocument(): Tab {
|
|
|
316
331
|
return bind(open);
|
|
317
332
|
}
|
|
318
333
|
_detached = createTab({
|
|
319
|
-
document:
|
|
334
|
+
document: state.projectConfig ?? {},
|
|
320
335
|
documentPath: PROJECT_CONFIG_PATH,
|
|
321
336
|
id: PROJECT_CONFIG_PATH,
|
|
322
337
|
});
|
|
@@ -380,7 +395,7 @@ export async function commitProjectConfig(
|
|
|
380
395
|
// The seed, and the record it read handed to the document — so the tab the Settings door opened
|
|
381
396
|
// Writes the same bytes from ⌘S that this commit is about to.
|
|
382
397
|
await lendProjectConfigLayout(tab);
|
|
383
|
-
const current =
|
|
398
|
+
const current = configOf(tab.doc.document);
|
|
384
399
|
const currentText = serializeProjectConfig(current);
|
|
385
400
|
|
|
386
401
|
// Two objects that disagree — whichever one loses, an edit written into it is lost. Null when
|
|
@@ -404,7 +419,7 @@ export async function commitProjectConfig(
|
|
|
404
419
|
}
|
|
405
420
|
|
|
406
421
|
const base = rival ?? current;
|
|
407
|
-
const next = patch ?
|
|
422
|
+
const next: ProjectConfig = patch ? { ...base, ...patch } : base;
|
|
408
423
|
const text = serializeProjectConfig(next);
|
|
409
424
|
|
|
410
425
|
// Nothing the file does not already say: no transaction, no write, and therefore no diff. The
|
|
@@ -417,7 +432,7 @@ export async function commitProjectConfig(
|
|
|
417
432
|
|
|
418
433
|
const before = extensionsKey(current);
|
|
419
434
|
transactDoc(tab, (t) => {
|
|
420
|
-
const doc = t.doc.document
|
|
435
|
+
const doc = t.doc.document;
|
|
421
436
|
if (rival) {
|
|
422
437
|
replaceContents(doc, rival);
|
|
423
438
|
}
|
|
@@ -429,7 +444,7 @@ export async function commitProjectConfig(
|
|
|
429
444
|
// Serialised from what the transaction actually LANDED, not from the `next` computed above: a
|
|
430
445
|
// Gate on `transactDoc` can refuse a mutation, and writing the value it refused would put the
|
|
431
446
|
// File and the document into the one disagreement this module exists to make impossible.
|
|
432
|
-
const config =
|
|
447
|
+
const config = configOf(tab.doc.document);
|
|
433
448
|
const output = serializeProjectConfig(config);
|
|
434
449
|
try {
|
|
435
450
|
await getPlatform().writeFile(PROJECT_CONFIG_PATH, output);
|
|
@@ -480,18 +495,14 @@ export async function commitProjectConfig(
|
|
|
480
495
|
* @returns {Promise<void>}
|
|
481
496
|
*/
|
|
482
497
|
export async function adoptProjectConfig(config: ProjectConfig, text: string): Promise<void> {
|
|
483
|
-
if (!
|
|
498
|
+
if (!projectState) {
|
|
484
499
|
// No project state is no configuration document either ({@link projectConfigDocument} reads
|
|
485
500
|
// One). The workspace copy is then the only thing there is to keep true.
|
|
486
501
|
setWorkspaceProject(workspace.projectRoot, config);
|
|
487
502
|
return;
|
|
488
503
|
}
|
|
489
504
|
const tab = projectConfigDocument();
|
|
490
|
-
transactDoc(
|
|
491
|
-
tab,
|
|
492
|
-
(t) => replaceContents(t.doc.document as unknown as Record<string, unknown>, config),
|
|
493
|
-
{ skipHistory: true },
|
|
494
|
-
);
|
|
505
|
+
transactDoc(tab, (t) => replaceContents(t.doc.document, config), { skipHistory: true });
|
|
495
506
|
tab.doc.dirty = false;
|
|
496
507
|
// Settle a read already in flight before saying what the file holds, or it would resolve after
|
|
497
508
|
// These lines with the PREVIOUS bytes and record, and make the next real commit look like a
|