@jxsuite/studio 6.1.1 → 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-va2wwra4.js → 2020-f2gkpy8d.js} +3 -3
- 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-2veqmnhr.js → index-zpjmzqfk.js} +3 -3
- package/dist/chunks/{javascript-8nbvs12s.js → javascript-m54mnwp6.js} +3 -3
- package/dist/chunks/{jsonMode-s8kt9dsj.js → jsonMode-w15cmrcm.js} +8 -8
- 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-1q1sh2ax.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-h46vtzk8.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-rv11kfwa.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-8grwxtqk.js → studio-90pq9km1.js} +4 -4
- package/dist/chunks/studio-924p1tm1.js +6 -0
- package/dist/chunks/{studio-pre0skq6.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-vrmcjf9g.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-wszjyh0j.js → studio-tq0rtfwj.js} +4 -4
- package/dist/chunks/{studio-kggey1jt.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-zey7zsdw.js → studio-y64hrt8p.js} +7 -7
- 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-2frah6h1.js → tsMode-sf49ee9x.js} +7 -7
- 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 +97 -97
- package/package.json +6 -6
- 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 +62 -41
- package/src/canvas/canvas-surface.ts +5 -3
- package/src/canvas/canvas-utils.ts +90 -49
- 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 +135 -96
- package/src/canvas/iframe-inline-edit.ts +49 -30
- package/src/canvas/iframe-insert.ts +5 -4
- package/src/canvas/iframe-interaction.ts +30 -25
- package/src/canvas/iframe-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 +12 -16
- package/src/canvas/iframe-render.ts +36 -34
- 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/keymap.ts +47 -43
- package/src/commands/levels.ts +3 -3
- package/src/commands/live-context.ts +7 -7
- 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 +32 -20
- 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 +3 -0
- 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 +52 -21
- 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 +218 -205
- 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 +129 -117
- 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 +25 -75
- 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 +19 -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.ts +13 -13
- 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/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 +73 -73
- 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 +40 -36
- package/dist/chunks/adapter-f93pafd7.js +0 -4
- package/dist/chunks/cf-account-picker-af1h381v.js +0 -4
- package/dist/chunks/cf-settings-125tdm0w.js +0 -4
- package/dist/chunks/color-area-jqhna8zy.js +0 -4
- package/dist/chunks/color-field-embq5ctg.js +0 -4
- package/dist/chunks/color-fpezvnkt.js +0 -4
- package/dist/chunks/color-slider-1qmw7wqy.js +0 -4
- package/dist/chunks/combobox-773hdzyj.js +0 -4
- package/dist/chunks/components-ax2f1fnn.js +0 -4
- package/dist/chunks/content-source-108aqtk1.js +0 -4
- package/dist/chunks/convert-to-repeater-ry5rmppr.js +0 -4
- package/dist/chunks/dialog-mtm9fq5t.js +0 -4
- package/dist/chunks/editor-pfgdmkb0.js +0 -4
- package/dist/chunks/entry-commands-t0k1q0kx.js +0 -4
- package/dist/chunks/extension-sections-6mwh2hf8.js +0 -4
- package/dist/chunks/file-ops-meej5mqf.js +0 -4
- package/dist/chunks/files-44vp8a2s.js +0 -4
- package/dist/chunks/format-host-7q1petb9.js +0 -4
- package/dist/chunks/fs-events-h2mwnxaz.js +0 -4
- package/dist/chunks/git-panel-zngbymvd.js +0 -4
- package/dist/chunks/grid-view-sx9vynsp.js +0 -51
- package/dist/chunks/icons-p44xhjf0.js +0 -4
- package/dist/chunks/iframe-entry-f7mqjwpm.js +0 -5
- package/dist/chunks/iframe-entry-haw7jkvz.js +0 -5
- package/dist/chunks/iframe-entry-z6qrytv3.js +0 -5
- package/dist/chunks/iframe-host-qk3ycq87.js +0 -4
- package/dist/chunks/index-wkyfjeqz.js +0 -4
- package/dist/chunks/jx-validate-psgd7vsx.js +0 -4
- package/dist/chunks/layers-panel-1kq2jyfk.js +0 -4
- package/dist/chunks/layers-xd92fg8d.js +0 -4
- package/dist/chunks/listbox-s8fkmnq8.js +0 -4
- package/dist/chunks/lit-html-ac4cwwr4.js +0 -4
- package/dist/chunks/media-picker-0svzkdyb.js +0 -4
- package/dist/chunks/menu-37d07z9m.js +0 -4
- package/dist/chunks/menu-5c55ea3d.js +0 -4
- package/dist/chunks/monaco-binding-z6r70pdt.js +0 -4
- package/dist/chunks/monaco-buffer-fz6gq5y7.js +0 -4
- package/dist/chunks/monaco-setup-q4axkgj7.js +0 -4
- package/dist/chunks/notify-0xgtn8q1.js +0 -4
- package/dist/chunks/number-field-gw7sq8rn.js +0 -4
- package/dist/chunks/parse-897fvqah.js +0 -4
- package/dist/chunks/platform-v1qctbe6.js +0 -4
- package/dist/chunks/popover-8htra4er.js +0 -4
- package/dist/chunks/publish-panel-ym1fmgq5.js +0 -4
- package/dist/chunks/quick-search-a54e6t5n.js +0 -4
- package/dist/chunks/references-gmqp82fs.js +0 -4
- package/dist/chunks/right-panel-v7t9awbk.js +0 -4
- package/dist/chunks/section-registry-vhyf3zsr.js +0 -4
- package/dist/chunks/select-n3v7gwas.js +0 -4
- package/dist/chunks/split-pff8f3ze.js +0 -4
- package/dist/chunks/studio-0bhx5hz6.js +0 -5
- package/dist/chunks/studio-0k1ddnyy.js +0 -6
- package/dist/chunks/studio-1b04pd0j.js +0 -64
- package/dist/chunks/studio-4dwbj6gb.js +0 -5
- package/dist/chunks/studio-4tanh828.js +0 -5
- package/dist/chunks/studio-55h4mstj.js +0 -4
- package/dist/chunks/studio-5tnvjkz4.js +0 -5
- package/dist/chunks/studio-60dqgb0c.js +0 -5
- package/dist/chunks/studio-61dp09qg.js +0 -9
- package/dist/chunks/studio-63epcrj2.js +0 -5
- package/dist/chunks/studio-74k29dy9.js +0 -5
- package/dist/chunks/studio-7vg6jcd3.js +0 -5
- package/dist/chunks/studio-7zx31knw.js +0 -9
- package/dist/chunks/studio-8bxk97km.js +0 -5
- package/dist/chunks/studio-933e30n4.js +0 -5
- package/dist/chunks/studio-98wnwhbg.js +0 -5
- package/dist/chunks/studio-9mccjwjh.js +0 -14
- package/dist/chunks/studio-a2ke1e4t.js +0 -5
- package/dist/chunks/studio-e3a2a6v3.js +0 -4
- package/dist/chunks/studio-e81q1vb9.js +0 -5
- package/dist/chunks/studio-epgrmqqm.js +0 -5
- package/dist/chunks/studio-ery42sqr.js +0 -4
- package/dist/chunks/studio-g1shz58g.js +0 -5
- package/dist/chunks/studio-gf0fz03c.js +0 -5
- package/dist/chunks/studio-gjtpe62q.js +0 -6
- package/dist/chunks/studio-gkskhg7m.js +0 -5
- package/dist/chunks/studio-gx4dnjzd.js +0 -5
- package/dist/chunks/studio-j03zga3y.js +0 -9
- package/dist/chunks/studio-jhpxeckz.js +0 -5
- package/dist/chunks/studio-k01r7ykp.js +0 -5
- package/dist/chunks/studio-kk7h30ne.js +0 -7
- package/dist/chunks/studio-kt1zqney.js +0 -5
- package/dist/chunks/studio-m3cwhvye.js +0 -5
- package/dist/chunks/studio-mcayt6hz.js +0 -5
- package/dist/chunks/studio-myjcghv3.js +0 -5
- package/dist/chunks/studio-n8bxwc3y.js +0 -4
- package/dist/chunks/studio-ngm8gvpb.js +0 -5
- package/dist/chunks/studio-nj5a01jy.js +0 -928
- package/dist/chunks/studio-pcgz8heb.js +0 -5
- package/dist/chunks/studio-qcsq0t15.js +0 -5
- package/dist/chunks/studio-qkstvve9.js +0 -5
- package/dist/chunks/studio-qv1pwd3c.js +0 -5
- package/dist/chunks/studio-rc6dvxjb.js +0 -7
- package/dist/chunks/studio-s8dmmz66.js +0 -5
- package/dist/chunks/studio-sp5xzbj4.js +0 -6
- package/dist/chunks/studio-szsjbj0g.js +0 -5
- package/dist/chunks/studio-t1xzawhr.js +0 -16
- package/dist/chunks/studio-t6b6qe31.js +0 -5
- package/dist/chunks/studio-tdcprbqb.js +0 -5
- package/dist/chunks/studio-vyc0b4he.js +0 -10
- package/dist/chunks/studio-w0cgf6jg.js +0 -5
- package/dist/chunks/studio-w3hskzqk.js +0 -5
- package/dist/chunks/studio-xgrgcdyh.js +0 -9
- package/dist/chunks/studio-xz2yxfcb.js +0 -5
- package/dist/chunks/studio-y6n42tgs.js +0 -5
- package/dist/chunks/studio-yb560vxr.js +0 -5
- package/dist/chunks/studio-yn9f8vtx.js +0 -5
- package/dist/chunks/studio-yw05w8f0.js +0 -7
- package/dist/chunks/studio-z16sgavc.js +0 -5
- package/dist/chunks/studio-zyqn40w4.js +0 -5
- package/dist/chunks/swatch-group-8qh9a3bm.js +0 -4
- package/dist/chunks/tabs-jwthg40w.js +0 -4
- package/dist/chunks/textfield-spy3hc77.js +0 -4
- package/dist/chunks/toast-4d35zd64.js +0 -4
- package/dist/chunks/toast-host-8sjmfed3.js +0 -4
- package/dist/chunks/tooltip-fd6g9xy3.js +0 -4
- package/dist/chunks/tree-h19v1jfz.js +0 -4
- package/dist/chunks/workspace-zt81g1ms.js +0 -4
- package/dist/chunks/ws-client-n2bh4hkf.js +0 -4
|
@@ -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
|
package/src/tabs/selection.ts
CHANGED
|
@@ -42,6 +42,8 @@
|
|
|
42
42
|
* standing between a mixed selection and a half-applied, unrecorded delete.
|
|
43
43
|
*/
|
|
44
44
|
|
|
45
|
+
import { isNumber } from "@jxsuite/schema/guards";
|
|
46
|
+
|
|
45
47
|
import type { JxPath } from "../state";
|
|
46
48
|
import { isAncestor, pathsEqual } from "../state";
|
|
47
49
|
|
|
@@ -52,7 +54,7 @@ import { isAncestor, pathsEqual } from "../state";
|
|
|
52
54
|
* @returns {JxPath | null}
|
|
53
55
|
*/
|
|
54
56
|
export function primarySelection(selection: readonly JxPath[] | null | undefined): JxPath | null {
|
|
55
|
-
return selection
|
|
57
|
+
return selection?.at(-1) ?? null;
|
|
56
58
|
}
|
|
57
59
|
|
|
58
60
|
/**
|
|
@@ -62,7 +64,7 @@ export function primarySelection(selection: readonly JxPath[] | null | undefined
|
|
|
62
64
|
* @returns {JxPath | null}
|
|
63
65
|
*/
|
|
64
66
|
export function selectionAnchor(selection: readonly JxPath[] | null | undefined): JxPath | null {
|
|
65
|
-
return selection
|
|
67
|
+
return selection?.[0] ?? null;
|
|
66
68
|
}
|
|
67
69
|
|
|
68
70
|
/**
|
|
@@ -187,7 +189,7 @@ export function comparePaths(a: JxPath, b: JxPath): number {
|
|
|
187
189
|
if (x === y) {
|
|
188
190
|
continue;
|
|
189
191
|
}
|
|
190
|
-
if (
|
|
192
|
+
if (isNumber(x) && isNumber(y)) {
|
|
191
193
|
return x - y;
|
|
192
194
|
}
|
|
193
195
|
return String(x) < String(y) ? -1 : 1;
|
|
@@ -231,7 +233,27 @@ export function topLevelSelection(selection: readonly JxPath[]): JxPath[] {
|
|
|
231
233
|
* @returns {boolean}
|
|
232
234
|
*/
|
|
233
235
|
export function isSpliceablePath(path: JxPath): boolean {
|
|
234
|
-
return
|
|
236
|
+
return spliceCoordinate(path) !== null;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/** Where a structural verb splices: the parent element's path and the index in its children. */
|
|
240
|
+
export interface SpliceCoordinate {
|
|
241
|
+
parentPath: JxPath;
|
|
242
|
+
index: number;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* The splice coordinate `path` names, or `null` for no path and for every path
|
|
247
|
+
* {@link isSpliceablePath} refuses.
|
|
248
|
+
*
|
|
249
|
+
* @param {JxPath | null | undefined} path
|
|
250
|
+
* @returns {SpliceCoordinate | null}
|
|
251
|
+
*/
|
|
252
|
+
export function spliceCoordinate(path: JxPath | null | undefined): SpliceCoordinate | null {
|
|
253
|
+
const index = path?.at(-1);
|
|
254
|
+
return path && path.at(-2) === "children" && isNumber(index)
|
|
255
|
+
? { index, parentPath: path.slice(0, -2) }
|
|
256
|
+
: null;
|
|
235
257
|
}
|
|
236
258
|
|
|
237
259
|
/**
|
|
@@ -289,7 +311,13 @@ export function selectionsEqual(
|
|
|
289
311
|
): boolean {
|
|
290
312
|
const x = a ?? [];
|
|
291
313
|
const y = b ?? [];
|
|
292
|
-
return x.length === y.length && x.every((p, i) => pathsEqual(p, y[i]
|
|
314
|
+
return x.length === y.length && x.every((p, i) => pathsEqual(p, y[i] ?? null));
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
/** One field's value read across the selection: `mixed` when the selected nodes disagree. */
|
|
318
|
+
export interface UnifiedValue<T> {
|
|
319
|
+
mixed: boolean;
|
|
320
|
+
value: T | undefined;
|
|
293
321
|
}
|
|
294
322
|
|
|
295
323
|
/**
|
|
@@ -306,13 +334,13 @@ export function selectionsEqual(
|
|
|
306
334
|
*
|
|
307
335
|
* @template T
|
|
308
336
|
* @param {readonly T[]} values One per selected node, in selection order.
|
|
309
|
-
* @returns {
|
|
337
|
+
* @returns {UnifiedValue<T>}
|
|
310
338
|
*/
|
|
311
|
-
export function unifyValues<T>(values: readonly T[]):
|
|
339
|
+
export function unifyValues<T>(values: readonly T[]): UnifiedValue<T> {
|
|
312
340
|
if (values.length === 0) {
|
|
313
341
|
return { mixed: false, value: undefined };
|
|
314
342
|
}
|
|
315
|
-
const first = values
|
|
343
|
+
const [first] = values;
|
|
316
344
|
const key = JSON.stringify(first ?? null);
|
|
317
345
|
for (let i = 1; i < values.length; i++) {
|
|
318
346
|
if (JSON.stringify(values[i] ?? null) !== key) {
|
package/src/tabs/tab.ts
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
/// <reference lib="dom" />
|
|
2
2
|
import { effectScope, reactive } from "../reactivity";
|
|
3
3
|
import { formatByName, formatForPath } from "../format/format-host";
|
|
4
|
+
import type { FormatFrontmatter } from "../format/format-host";
|
|
4
5
|
import { normalizeArrayChildren } from "../state";
|
|
5
6
|
import type { JxPath } from "../state";
|
|
6
7
|
import type { FormulaEditDef, FunctionEditDef, InlineEditDef, JsonValue } from "../types";
|
|
7
8
|
import { editorKindForMode } from "../commands/context";
|
|
8
9
|
import type { EditorKind } from "../commands/context";
|
|
9
|
-
import type { JxMutableNode } from "@jxsuite/schema/types";
|
|
10
|
+
import type { JsonObject, JxMutableNode } from "@jxsuite/schema/types";
|
|
10
11
|
import type { JxDocOp, JxFmOp } from "./patch-ops";
|
|
11
12
|
import type { JsonLayout } from "@jxsuite/schema/json-layout";
|
|
12
13
|
|
|
@@ -125,7 +126,7 @@ export interface StoredLivePreview {
|
|
|
125
126
|
|
|
126
127
|
interface HistorySnapshot {
|
|
127
128
|
/** Full document at this state (checkpoint), or null when the ops describe the transition. */
|
|
128
|
-
document:
|
|
129
|
+
document: JxMutableNode | null;
|
|
129
130
|
/** Selection after this state's transaction — the whole set, so a batch undoes back to it. */
|
|
130
131
|
selection: (string | number)[][];
|
|
131
132
|
/** Selection before this state's transaction (restored on surgical undo). */
|
|
@@ -177,11 +178,10 @@ export interface Tab {
|
|
|
177
178
|
scope: {
|
|
178
179
|
stop: () => void;
|
|
179
180
|
run: <T>(fn: () => T) => T | undefined;
|
|
180
|
-
[k: string]: unknown;
|
|
181
181
|
};
|
|
182
182
|
doc: {
|
|
183
183
|
document: JxMutableNode;
|
|
184
|
-
content: { frontmatter:
|
|
184
|
+
content: { frontmatter: FormatFrontmatter };
|
|
185
185
|
mode: string;
|
|
186
186
|
sourceFormat: string | null;
|
|
187
187
|
handlersSource: string | null;
|
|
@@ -230,7 +230,7 @@ export interface Tab {
|
|
|
230
230
|
// A serializable snapshot of the iframe's resolved `$defs` (data-source values), posted over
|
|
231
231
|
// The bridge as a `dataScope` message and read by the data-explorer panel. Plain data now —
|
|
232
232
|
// The old live `EffectScope` (with `.stop()`) moved into the iframe realm with buildScope.
|
|
233
|
-
scope:
|
|
233
|
+
scope: JsonObject | null;
|
|
234
234
|
// Latest live (iframe-evaluated) expression previews keyed by editing-target id, stored
|
|
235
235
|
// Beside `scope` the same way (services/live-preview.ts owns reads/writes).
|
|
236
236
|
livePreviews: Record<string, StoredLivePreview> | null;
|
|
@@ -249,7 +249,7 @@ export interface Tab {
|
|
|
249
249
|
* @param {boolean} preview — initial preview-toggle state
|
|
250
250
|
* @returns {TabUi}
|
|
251
251
|
*/
|
|
252
|
-
function createDefaultUi(canvasMode: string, preview = false) {
|
|
252
|
+
function createDefaultUi(canvasMode: string, preview = false): TabUi {
|
|
253
253
|
return {
|
|
254
254
|
activeMedia: null,
|
|
255
255
|
activeSelector: null,
|
|
@@ -264,7 +264,7 @@ function createDefaultUi(canvasMode: string, preview = false) {
|
|
|
264
264
|
pendingInlineEdit: null,
|
|
265
265
|
preview,
|
|
266
266
|
previewColorScheme: "auto" as const,
|
|
267
|
-
previewLocale: null
|
|
267
|
+
previewLocale: null,
|
|
268
268
|
previewParams: {},
|
|
269
269
|
previewProps: null,
|
|
270
270
|
rightTab: "properties",
|
|
@@ -295,8 +295,8 @@ const ALL_MODES = ["edit", "design", "preview", "source", "stylebook", "git-diff
|
|
|
295
295
|
* id: string;
|
|
296
296
|
* documentPath?: string | null;
|
|
297
297
|
* fileHandle?: FileSystemFileHandle | null;
|
|
298
|
-
* document:
|
|
299
|
-
* frontmatter?:
|
|
298
|
+
* document: JxMutableNode;
|
|
299
|
+
* frontmatter?: FormatFrontmatter;
|
|
300
300
|
* sourceFormat?: string | null;
|
|
301
301
|
* capabilities?: { modes?: string[] };
|
|
302
302
|
* openedFrom?: TabOrigin | null;
|
|
@@ -320,8 +320,8 @@ export function createTab({
|
|
|
320
320
|
id: string;
|
|
321
321
|
documentPath?: string | null;
|
|
322
322
|
fileHandle?: FileSystemFileHandle | null;
|
|
323
|
-
document:
|
|
324
|
-
frontmatter?:
|
|
323
|
+
document: JxMutableNode;
|
|
324
|
+
frontmatter?: FormatFrontmatter;
|
|
325
325
|
sourceFormat?: string | null;
|
|
326
326
|
capabilities?: { modes?: string[] };
|
|
327
327
|
openedFrom?: TabOrigin | null;
|
|
@@ -342,45 +342,56 @@ export function createTab({
|
|
|
342
342
|
const initialCanvasMode = resolvedModes.find((m) => m !== "preview") ?? "edit";
|
|
343
343
|
const initialPreview = resolvedModes[0] === "preview";
|
|
344
344
|
|
|
345
|
+
const doc: Tab["doc"] = {
|
|
346
|
+
content: { frontmatter: frontmatter || {} },
|
|
347
|
+
dirty: false,
|
|
348
|
+
document,
|
|
349
|
+
handlersSource: null,
|
|
350
|
+
layout,
|
|
351
|
+
mode: inferDocumentMode(documentPath, sourceFormat),
|
|
352
|
+
sourceFormat,
|
|
353
|
+
};
|
|
354
|
+
const history: Tab["history"] = {
|
|
355
|
+
index: 0,
|
|
356
|
+
snapshots: [{ document: structuredClone(document), selection: [] }],
|
|
357
|
+
};
|
|
358
|
+
const session: Tab["session"] = {
|
|
359
|
+
canvas: {
|
|
360
|
+
refreshing: false,
|
|
361
|
+
error: null,
|
|
362
|
+
livePreviews: null,
|
|
363
|
+
pendingInlineEdit: null,
|
|
364
|
+
scope: null,
|
|
365
|
+
status: "idle",
|
|
366
|
+
},
|
|
367
|
+
clipboard: null,
|
|
368
|
+
hover: null,
|
|
369
|
+
openedFrom,
|
|
370
|
+
selection: [],
|
|
371
|
+
ui: createDefaultUi(initialCanvasMode, initialPreview),
|
|
372
|
+
};
|
|
373
|
+
|
|
374
|
+
/* SAFETY: `reactive()` returns a deep proxy carrying its target's own members, and none of these
|
|
375
|
+
Three trees holds a ref for `UnwrapNestedRefs` to unwrap, so each proxy IS the shape it is cast
|
|
376
|
+
To. The type argument is pinned to `object` because `UnwrapNestedRefs<JxMutableNode>` recurses
|
|
377
|
+
Deeply enough for tsc to give up (TS2589); the proxies are deep either way. */
|
|
345
378
|
const tab = scope.run(() => ({
|
|
346
379
|
capabilities: { modes: resolvedModes },
|
|
347
|
-
doc: reactive(
|
|
348
|
-
content: { frontmatter: frontmatter || {} },
|
|
349
|
-
dirty: false,
|
|
350
|
-
document,
|
|
351
|
-
handlersSource: null,
|
|
352
|
-
layout,
|
|
353
|
-
mode: inferDocumentMode(documentPath, sourceFormat),
|
|
354
|
-
sourceFormat,
|
|
355
|
-
}),
|
|
380
|
+
doc: reactive<object>(doc) as Tab["doc"],
|
|
356
381
|
documentPath,
|
|
357
382
|
fileHandle,
|
|
358
|
-
history: reactive(
|
|
359
|
-
index: 0,
|
|
360
|
-
snapshots: [{ document: structuredClone(document), selection: [] }],
|
|
361
|
-
}),
|
|
383
|
+
history: reactive<object>(history) as Tab["history"],
|
|
362
384
|
id,
|
|
363
385
|
pinned: false,
|
|
364
386
|
preview: previewTab,
|
|
365
387
|
scope,
|
|
366
|
-
session: reactive(
|
|
367
|
-
|
|
368
|
-
refreshing: false,
|
|
369
|
-
error: null,
|
|
370
|
-
livePreviews: null,
|
|
371
|
-
pendingInlineEdit: null,
|
|
372
|
-
scope: null,
|
|
373
|
-
status: "idle",
|
|
374
|
-
},
|
|
375
|
-
clipboard: null,
|
|
376
|
-
hover: null,
|
|
377
|
-
openedFrom,
|
|
378
|
-
selection: [],
|
|
379
|
-
ui: createDefaultUi(initialCanvasMode, initialPreview),
|
|
380
|
-
}),
|
|
381
|
-
})) as unknown as Tab;
|
|
388
|
+
session: reactive<object>(session) as Tab["session"],
|
|
389
|
+
}));
|
|
382
390
|
|
|
383
|
-
|
|
391
|
+
/* SAFETY: `scope` was created at the top of this function and nothing has stopped it, and an
|
|
392
|
+
Active scope's `run` always returns its callback's value; `undefined` is only what an inactive
|
|
393
|
+
Scope answers. */
|
|
394
|
+
return tab as Tab;
|
|
384
395
|
}
|
|
385
396
|
|
|
386
397
|
/**
|