@jxsuite/studio 5.2.0 → 5.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/data/css-meta.json +28 -27
- package/dist/chunks/{cf-account-picker-h4dab9bq.js → cf-account-picker-3f08rry6.js} +21 -18
- package/dist/chunks/{cf-settings-adg74qsk.js → cf-settings-m79r7p5y.js} +4 -4
- package/dist/chunks/{components-5y78e05d.js → components-xm826zjw.js} +3 -3
- package/dist/chunks/{content-source-sgg1sv6n.js → content-source-jt7rbcbc.js} +22 -22
- package/dist/chunks/{convert-to-repeater-mf1cxgfn.js → convert-to-repeater-vg38bq99.js} +22 -22
- package/dist/chunks/{editor-3qhbg51x.js → editor-ddy019sn.js} +2 -2
- package/dist/chunks/entry-commands-64nb2a9a.js +42 -0
- package/dist/chunks/{extension-sections-c6zwzbre.js → extension-sections-r73an5s6.js} +31 -30
- package/dist/chunks/{file-ops-vrpq1jjk.js → file-ops-3xan8mnj.js} +21 -21
- package/dist/chunks/{files-msaf95y6.js → files-egsb0ry8.js} +30 -29
- package/dist/chunks/{format-host-f64fnesp.js → format-host-mym8qnd0.js} +3 -3
- package/dist/chunks/{fs-events-3y6y0nrm.js → fs-events-z2gg8qjt.js} +4 -4
- package/dist/chunks/{git-panel-bv5e22j0.js → git-panel-a05atk6q.js} +20 -20
- package/dist/chunks/{grid-view-1p6hsyjx.css → grid-view-3g1h2re8.css} +956 -139
- package/dist/chunks/{grid-view-paj67nr5.js → grid-view-qaqer9kr.js} +24 -24
- package/dist/chunks/{icons-yy10wk9r.js → icons-drxq9q10.js} +8 -2
- package/dist/chunks/{iframe-host-dh5np8vk.js → iframe-host-psetcv20.js} +11 -11
- package/dist/chunks/{index-n4j7qxyr.js → index-9yjae3hz.js} +4 -4
- package/dist/chunks/{javascript-4abzjcy9.css → javascript-bc9z461d.css} +688 -54
- package/dist/chunks/{javascript-xvrfrpkb.js → javascript-hr5sg57n.js} +2 -2
- package/dist/chunks/{jsonMode-vvmpmk34.css → jsonMode-qqd9nm1t.css} +1120 -303
- package/dist/chunks/{jsonMode-tyx2kj6p.js → jsonMode-zs88v0wr.js} +4 -4
- package/dist/chunks/{jx-validate-j0wxk72w.js → jx-validate-epp2z3s3.js} +2 -2
- package/dist/chunks/layers-panel-83a16ytx.js +41 -0
- package/dist/chunks/{layers-1vcfdbet.js → layers-s6mc01ry.js} +3 -3
- package/dist/chunks/{listbox-6v2ac08j.js → listbox-b7jxnhq1.js} +19 -3
- package/dist/chunks/{media-picker-p49nhqhs.js → media-picker-nhn6rv4w.js} +11 -11
- package/dist/chunks/{menu-qht48vnc.js → menu-8j4qxjrp.js} +4 -4
- package/dist/chunks/{monaco-binding-sw6en4dw.js → monaco-binding-e8d9wzyk.js} +3 -3
- package/dist/chunks/{monaco-buffer-pykwbm92.js → monaco-buffer-jaq1t9zj.js} +2 -2
- package/dist/chunks/{monaco-setup-8vbyqnhr.css → monaco-setup-ey9cjcm3.css} +954 -137
- package/dist/chunks/{monaco-setup-8r62fj6y.js → monaco-setup-gsjdysze.js} +7 -7
- package/dist/chunks/{platform-ts9cg1a4.js → platform-fnchmhy7.js} +5 -3
- package/dist/chunks/publish-panel-ak6hxfma.js +27 -0
- package/dist/chunks/quick-search-c63mkt3b.js +47 -0
- package/dist/chunks/{references-h69xp9zz.js → references-f7bdv3z5.js} +3 -3
- package/dist/chunks/right-panel-t5n8wttg.js +45 -0
- package/dist/chunks/{split-g7nm1rgb.js → split-4cz4b6ef.js} +14 -3
- package/dist/chunks/{studio-sar8g54p.js → studio-01269reb.js} +8 -8
- package/dist/chunks/{studio-rnyf3f8e.js → studio-0a4gncx0.js} +3 -3
- package/dist/chunks/{studio-e1f24eff.js → studio-0d4p4wxj.js} +6778 -2993
- package/dist/chunks/{studio-4wbb9ct0.js → studio-1tejxvba.js} +3006 -1855
- package/dist/chunks/{studio-p6pmwkvh.js → studio-3nprwbd9.js} +147 -28
- package/dist/chunks/{studio-4c041r8y.js → studio-40z39dme.js} +3 -3
- package/dist/chunks/{studio-68fydsrj.js → studio-482eeazk.js} +20 -20
- package/dist/chunks/{studio-y4f9fdge.js → studio-4998spet.js} +10 -9
- package/dist/chunks/{studio-nq5yf5mp.js → studio-557bmn0x.js} +2 -2
- package/dist/chunks/{studio-hdc2jt3z.js → studio-5w26wza5.js} +3 -3
- package/dist/chunks/{studio-6nzaktvy.js → studio-6pwn9j8c.js} +6 -3
- package/dist/chunks/{studio-wnsyffg1.js → studio-6vg0x5fz.js} +3 -2
- package/dist/chunks/{studio-vn5hske5.js → studio-7d3c1m59.js} +12 -5
- package/dist/chunks/{studio-28vs5k2y.js → studio-9vsvz7w7.js} +7 -7
- package/dist/chunks/{studio-t3adrr56.js → studio-9wm0xzpf.js} +19 -19
- package/dist/chunks/{studio-38emantv.js → studio-a5h5j33a.js} +19 -5
- package/dist/chunks/{studio-ympe0n7a.js → studio-ag3z6shb.js} +10 -4
- package/dist/chunks/studio-aj9drheq.js +177 -0
- package/dist/chunks/{studio-vt0tj32j.js → studio-apv9x70c.js} +189 -130
- package/dist/chunks/{studio-c04nzbby.js → studio-b9q3znz8.js} +2 -2
- package/dist/chunks/{studio-2mdbbc76.js → studio-bh47w0cy.js} +9 -10
- package/dist/chunks/{studio-ez11dmdh.js → studio-dgdm6vvt.js} +264 -52
- package/dist/chunks/{studio-5nz00bhh.js → studio-dwdcr2e8.js} +4 -4
- package/dist/chunks/{studio-nqgawfks.js → studio-fbcyz234.js} +146 -139
- package/dist/chunks/{studio-kcgff4r0.js → studio-fgmfksz8.js} +2 -2
- package/dist/chunks/{studio-x72j58vw.js → studio-fqpkpq1t.js} +7 -4
- package/dist/chunks/{studio-15f3kxqe.js → studio-fy320dfc.js} +62 -68
- package/dist/chunks/{studio-zjjde71a.js → studio-gjj4bbfx.js} +2 -2
- package/dist/chunks/{studio-66arbpc2.js → studio-jfhxy8h3.js} +16 -15
- package/dist/chunks/{studio-d0300636.js → studio-ks2zzth2.js} +17 -2
- package/dist/chunks/{studio-c07s5ckd.js → studio-kwewmhhq.js} +4 -4
- package/dist/chunks/{studio-01jeck2y.js → studio-m58xn8at.js} +26 -25
- package/dist/chunks/{studio-mpzwze9x.js → studio-mfkh1q8d.js} +17 -17
- package/dist/chunks/{studio-etvx9s2g.js → studio-mrh0a92f.js} +17 -17
- package/dist/chunks/{studio-qa7fzxan.js → studio-mt79tn56.js} +3 -3
- package/dist/chunks/{studio-hhskq2mr.js → studio-ne593z1j.js} +39 -32
- package/dist/chunks/{studio-h4nvnjvz.js → studio-ptfcxkz5.js} +418 -232
- package/dist/chunks/{studio-4xmjcrg3.js → studio-qxye31h7.js} +7 -7
- package/dist/chunks/{studio-a1pswps3.js → studio-rav5bpmp.js} +81 -59
- package/dist/chunks/{studio-ncn9e189.js → studio-rwmmbrth.js} +6 -6
- package/dist/chunks/{studio-en82c639.js → studio-sceg8ws0.js} +8 -8
- package/dist/chunks/{studio-wjpgxywa.js → studio-sjas5b3a.js} +19 -13
- package/dist/chunks/{studio-4r14yzyy.js → studio-vd67b66d.js} +3 -3
- package/dist/chunks/{studio-14d9tq4d.js → studio-w475cbf9.js} +10 -10
- package/dist/chunks/{studio-ctm7bhx5.js → studio-w7gpcvfj.js} +9 -9
- package/dist/chunks/{studio-9j6sfeba.js → studio-xrbfdxgk.js} +7 -7
- package/dist/chunks/{studio-x10fp4tp.js → studio-y49b6mjv.js} +35 -35
- package/dist/chunks/{studio-5t7ena5z.js → studio-ygvr9e4q.js} +10 -10
- package/dist/chunks/{studio-z2smx5ce.js → studio-yxmmjy2a.js} +9 -6
- package/dist/chunks/{tsMode-jy4m86rv.js → tsMode-ay4c78ne.js} +4 -4
- package/dist/chunks/{tsMode-hnxxb73h.css → tsMode-c72wyz27.css} +954 -137
- package/dist/chunks/{workspace-bnw54cha.js → workspace-b9k2frks.js} +5 -5
- package/dist/chunks/{ws-client-ny4zc51r.js → ws-client-erze4czt.js} +356 -20
- package/dist/codicon.ttf +0 -0
- package/dist/iframe-entry.js +20 -18
- package/dist/studio.css +956 -139
- package/dist/studio.js +1511 -851
- package/dist/workers/editor.worker.js +196 -107
- package/dist/workers/json.worker.js +196 -107
- package/dist/workers/ts.worker.js +196 -107
- package/package.json +18 -17
- package/src/about/about-modal.ts +4 -3
- package/src/browse/library-commands.ts +15 -13
- package/src/browse/library-pane.ts +2 -2
- package/src/canvas/canvas-render.ts +97 -83
- package/src/canvas/canvas-surface.ts +2 -2
- package/src/canvas/canvas-utils.ts +42 -32
- package/src/canvas/diff-toolbar.ts +21 -2
- package/src/canvas/diff-view.ts +30 -6
- package/src/canvas/iframe-entry.ts +2 -2
- package/src/canvas/iframe-host.ts +5 -5
- package/src/canvas/iframe-interaction.ts +7 -6
- package/src/canvas/iframe-overlay.ts +1 -1
- package/src/canvas/iframe-protocol.ts +6 -5
- package/src/canvas/iframe-render.ts +3 -3
- package/src/canvas/popover-state.ts +1 -1
- package/src/canvas/stage-scrollbar.ts +112 -0
- package/src/canvas/surface-registry.ts +9 -2
- package/src/collab/collab-commands.ts +8 -6
- package/src/collab/collab-session.ts +4 -4
- package/src/collab/collab-state.ts +4 -4
- package/src/collab/presence-chips.ts +3 -3
- package/src/commands/app-commands.ts +7 -7
- package/src/commands/budget.ts +17 -16
- package/src/commands/command-args.ts +10 -9
- package/src/commands/context.ts +20 -10
- package/src/commands/defaults.ts +30 -29
- package/src/commands/levels.ts +8 -6
- package/src/commands/live-context.ts +12 -10
- package/src/commands/reference.ts +5 -5
- package/src/commands/registry.ts +2 -2
- package/src/content/draft-state.ts +9 -8
- package/src/content/entry-commands.ts +16 -14
- package/src/content/entry-editor.ts +2 -2
- package/src/content/entry-fields.ts +1 -1
- package/src/editor/context-menu.ts +4 -4
- package/src/editor/convert-to-component.ts +6 -5
- package/src/editor/inline-edit.ts +3 -3
- package/src/editor/shortcuts.ts +88 -20
- package/src/editor/slash-menu.ts +11 -10
- package/src/files/elements.ts +4 -5
- package/src/files/file-ops.ts +1 -1
- package/src/files/files.ts +21 -17
- package/src/files/serialize-document.ts +1 -1
- package/src/format/convert-file.ts +5 -5
- package/src/github/github-auth-status.ts +107 -0
- package/src/github/github-auth.ts +18 -82
- package/src/github/github-publish.ts +7 -6
- package/src/grid/cell-editors.ts +8 -7
- package/src/grid/grid-layout.ts +1 -1
- package/src/grid/grid-open.ts +6 -5
- package/src/grid/grid-panel.ts +13 -12
- package/src/grid/redirects-grid.ts +14 -11
- package/src/grid/redirects.ts +10 -5
- package/src/grid/sources/content-source.ts +10 -9
- package/src/hosting/document.ts +28 -1
- package/src/hosting/stage.ts +15 -4
- package/src/i18n/i18n-commands.ts +9 -7
- package/src/new-project/location-fields.ts +16 -3
- package/src/new-project/new-project-modal.ts +23 -7
- package/src/page-params.ts +6 -6
- package/src/panels/activity-panel.ts +11 -10
- package/src/panels/ai-chat/chat-view.ts +27 -14
- package/src/panels/ai-chat/composer.ts +10 -3
- package/src/panels/ai-panel.ts +87 -29
- package/src/panels/block-action-bar.ts +59 -33
- package/src/panels/bottom-dock.ts +22 -22
- package/src/panels/chat-panel.ts +40 -5
- package/src/panels/data-explorer.ts +9 -9
- package/src/panels/data-grid.ts +1 -1
- package/src/panels/editors.ts +8 -8
- package/src/panels/elements-panel.ts +7 -8
- package/src/panels/empty-state.ts +1 -1
- package/src/panels/events-panel.ts +13 -12
- package/src/panels/formula-workspace.ts +8 -5
- package/src/panels/frontmatter-fields.ts +4 -1
- package/src/panels/frontmatter-panel.ts +18 -18
- package/src/panels/git-panel.ts +19 -13
- package/src/panels/head-panel.ts +9 -10
- package/src/panels/i18n-panel.ts +6 -4
- package/src/panels/imports-panel.ts +1 -1
- package/src/panels/jump-bar.ts +20 -18
- package/src/panels/layers-panel.ts +19 -17
- package/src/panels/left-panel.ts +3 -3
- package/src/panels/navigator-panels.ts +8 -8
- package/src/panels/overlays.ts +1 -1
- package/src/panels/pane-context.ts +56 -28
- package/src/panels/pane-grid.ts +9 -8
- package/src/panels/panel-registry.ts +47 -19
- package/src/panels/problems-panel.ts +11 -12
- package/src/panels/properties-panel.ts +21 -20
- package/src/panels/provenance.ts +3 -3
- package/src/panels/quick-search.ts +15 -11
- package/src/panels/right-panel.ts +4 -3
- package/src/panels/seo-modal.ts +5 -4
- package/src/panels/settings-menu.ts +9 -9
- package/src/panels/settings-pane.ts +3 -3
- package/src/panels/signals-panel.ts +16 -9
- package/src/panels/statement-editor.ts +12 -9
- package/src/panels/style-panel.ts +45 -41
- package/src/panels/stylebook-panel.ts +0 -1
- package/src/panels/tab-strip.ts +26 -23
- package/src/platform-errors.ts +2 -2
- package/src/platform.ts +44 -4
- package/src/platforms/cloud.ts +11 -1
- package/src/platforms/default-platform.ts +141 -4
- package/src/platforms/devserver.ts +23 -3
- package/src/publish/deploy-checklist.ts +11 -10
- package/src/publish/publish-commands.ts +9 -8
- package/src/services/a11y-report.ts +1 -1
- package/src/services/ai-ask.ts +39 -16
- package/src/services/ai-command-tools.ts +28 -14
- package/src/services/ai-import-tools.ts +43 -29
- package/src/services/ai-project-tools.ts +20 -38
- package/src/services/ai-settings.ts +55 -2
- package/src/services/ai-tools.ts +69 -58
- package/src/services/ai-write-report.ts +4 -4
- package/src/services/ai-writes.ts +74 -55
- package/src/services/automation.ts +12 -12
- package/src/services/clock.ts +2 -1
- package/src/services/connection.ts +2 -2
- package/src/services/context-manager.ts +69 -6
- package/src/services/directory-picker.ts +93 -27
- package/src/services/document-assistant.ts +86 -17
- package/src/services/gated-registry.ts +4 -3
- package/src/services/idle.ts +5 -4
- package/src/services/live-surfaces.ts +2 -1
- package/src/services/module-preloads.ts +67 -0
- package/src/services/notify.ts +9 -7
- package/src/services/popover-report.ts +3 -3
- package/src/services/preview-eval.ts +1 -1
- package/src/services/project-adoption.ts +34 -1
- package/src/services/project-path.ts +53 -0
- package/src/services/settings/kernel.ts +13 -2
- package/src/services/tool-executor.ts +135 -30
- package/src/services/tool-outcomes.ts +143 -0
- package/src/settings/contexts-section.ts +8 -8
- package/src/settings/contributed-section.ts +6 -6
- package/src/settings/css-vars-editor.ts +6 -5
- package/src/settings/extension-commands.ts +19 -18
- package/src/settings/extension-sections.ts +7 -7
- package/src/settings/extensions-section.ts +3 -3
- package/src/settings/general-settings.ts +21 -18
- package/src/settings/preferences-accounts.ts +3 -3
- package/src/settings/preferences-dialog.ts +9 -8
- package/src/settings/preferences-sections.ts +1 -1
- package/src/settings/project-sections.ts +2 -2
- package/src/settings/section-registry.ts +7 -6
- package/src/settings/settings-document.ts +41 -43
- package/src/shell/tree.ts +29 -0
- package/src/shell.ts +63 -55
- package/src/site-context.ts +1 -1
- package/src/store.ts +2 -2
- package/src/studio.ts +52 -28
- package/src/style/live-preview.ts +8 -8
- package/src/style/project-styles.ts +8 -9
- package/src/style/token-ref.ts +2 -2
- package/src/surfaces/about.json +6 -2
- package/src/surfaces/add-repo.json +2 -2
- package/src/surfaces/add-repo.ts +2 -2
- package/src/surfaces/ai-chat.json +14 -6
- package/src/surfaces/ai-chat.ts +4 -2
- package/src/surfaces/ai-credentials-form.json +53 -49
- package/src/surfaces/ai-credentials-form.ts +18 -4
- package/src/surfaces/ai-managed-connect.json +4 -4
- package/src/surfaces/block-action-bar.json +4 -4
- package/src/surfaces/block-action-bar.ts +3 -3
- package/src/surfaces/boot-failure.json +228 -0
- package/src/surfaces/boot-failure.ts +156 -0
- package/src/surfaces/bottom-dock.json +1 -1
- package/src/surfaces/canvas-stage.json +9 -40
- package/src/surfaces/canvas-stage.ts +9 -9
- package/src/surfaces/cf-account-picker.json +11 -8
- package/src/surfaces/commandbar.ts +11 -10
- package/src/surfaces/convert-repeater.ts +3 -2
- package/src/surfaces/dialog.json +7 -1
- package/src/surfaces/dialog.ts +2 -2
- package/src/surfaces/doc-header.json +6 -13
- package/src/surfaces/doc-header.ts +4 -5
- package/src/surfaces/entry-editor.json +1 -1
- package/src/surfaces/entry-editor.ts +2 -1
- package/src/surfaces/expression-editor.json +5 -5
- package/src/surfaces/files-panel.json +4 -3
- package/src/surfaces/files-panel.ts +1 -1
- package/src/surfaces/formula-palette.json +10 -9
- package/src/surfaces/formula-palette.ts +11 -7
- package/src/surfaces/git-panel.json +167 -109
- package/src/surfaces/git-panel.ts +2 -2
- package/src/surfaces/github-auth.json +2 -1
- package/src/surfaces/github-publish.ts +3 -3
- package/src/surfaces/grid-open.json +1 -1
- package/src/surfaces/grid-panel.json +2 -2
- package/src/surfaces/grid-views.json +1 -1
- package/src/surfaces/inspector-dock.json +2 -2
- package/src/surfaces/jump-bar.json +1 -1
- package/src/surfaces/jump-bar.ts +1 -1
- package/src/surfaces/library-pane.ts +2 -1
- package/src/surfaces/logic-panel.json +7 -7
- package/src/surfaces/logic-panel.ts +6 -4
- package/src/surfaces/logic-workspace.json +2 -2
- package/src/surfaces/logic-workspace.ts +2 -2
- package/src/surfaces/media-browser.ts +3 -3
- package/src/surfaces/media-pane.ts +2 -1
- package/src/surfaces/menu.ts +5 -5
- package/src/surfaces/new-project.json +1 -1
- package/src/surfaces/palette.json +8 -7
- package/src/surfaces/pane-context.json +86 -57
- package/src/surfaces/pane-context.ts +2 -1
- package/src/surfaces/pane-grid.json +3 -3
- package/src/surfaces/panel-activity.json +2 -1
- package/src/surfaces/panel-deploy-checklist.json +1 -1
- package/src/surfaces/panel-elements.ts +2 -1
- package/src/surfaces/panel-i18n.ts +2 -1
- package/src/surfaces/panel-outline.json +1 -1
- package/src/surfaces/panel-outline.ts +4 -3
- package/src/surfaces/panel-page.json +2 -2
- package/src/surfaces/panel-page.ts +4 -1
- package/src/surfaces/panel-problems.json +4 -3
- package/src/surfaces/panel-problems.ts +2 -2
- package/src/surfaces/panel-signals.json +23 -8
- package/src/surfaces/panel-signals.ts +5 -1
- package/src/surfaces/panel-stylebook-layers.json +1 -1
- package/src/surfaces/panel-stylebook-layers.ts +2 -2
- package/src/surfaces/preferences.json +21 -8
- package/src/surfaces/preferences.ts +9 -1
- package/src/surfaces/properties-panel.json +4 -4
- package/src/surfaces/properties-panel.ts +2 -2
- package/src/surfaces/publish.json +1 -1
- package/src/surfaces/publish.ts +2 -1
- package/src/surfaces/push-plan.json +4 -3
- package/src/surfaces/rail.json +2 -2
- package/src/surfaces/rail.ts +10 -4
- package/src/surfaces/reference-field.json +1 -1
- package/src/surfaces/schema-form.json +2 -2
- package/src/surfaces/schema-form.ts +1 -1
- package/src/surfaces/seo.json +1 -1
- package/src/surfaces/seo.ts +2 -2
- package/src/surfaces/settings-contributed.ts +2 -1
- package/src/surfaces/settings-css-vars.json +4 -4
- package/src/surfaces/settings-deploy.json +4 -4
- package/src/surfaces/settings-deploy.ts +2 -1
- package/src/surfaces/settings-extensions.json +6 -6
- package/src/surfaces/settings-extensions.ts +6 -2
- package/src/surfaces/settings-locales.json +4 -4
- package/src/surfaces/settings-overview.ts +2 -1
- package/src/surfaces/settings-pane.ts +3 -2
- package/src/surfaces/settings-rawjson.ts +1 -1
- package/src/surfaces/slash-menu.ts +4 -4
- package/src/surfaces/statements.json +3 -3
- package/src/surfaces/statusbar.ts +23 -23
- package/src/surfaces/style-panel.json +9 -5
- package/src/surfaces/style-panel.ts +3 -3
- package/src/surfaces/tab-strip.json +2 -2
- package/src/surfaces/target-line.json +1 -1
- package/src/surfaces/target-line.ts +12 -10
- package/src/surfaces/welcome.json +7 -2
- package/src/tabs/doc-op-apply.ts +5 -5
- package/src/tabs/patch-ops.ts +3 -3
- package/src/tabs/project-config.ts +10 -10
- package/src/tabs/selection.ts +1 -1
- package/src/tabs/tab.ts +13 -14
- package/src/tabs/transact.ts +18 -24
- package/src/types.ts +27 -3
- package/src/ui/ai-credentials-form.ts +74 -16
- package/src/ui/ai-managed-connect.ts +68 -19
- package/src/ui/color-selector.ts +1 -1
- package/src/ui/expression-editor.ts +3 -3
- package/src/ui/form-controls.ts +6 -5
- package/src/ui/formula-catalog.ts +4 -4
- package/src/ui/formula-chips.ts +2 -2
- package/src/ui/layers.ts +20 -18
- package/src/ui/panel-resize.ts +8 -28
- package/src/ui/popover-surface.ts +2 -2
- package/src/ui/progress-modal.ts +3 -3
- package/src/ui/regions.ts +14 -9
- package/src/ui/schema-form.ts +10 -9
- package/src/ui/timing.ts +9 -7
- package/src/ui/value-source.ts +4 -4
- package/src/ui/virtual-window.ts +58 -5
- package/src/utils/base64.ts +20 -1
- package/src/utils/canvas-media.ts +1 -1
- package/src/utils/studio-utils.ts +0 -31
- package/src/view.ts +4 -3
- package/src/workspace/pane-derive.ts +14 -13
- package/src/workspace/session.ts +7 -6
- package/src/workspace/workspace.ts +49 -39
- package/styles/canvas.css +1 -27
- package/styles/inspector.css +4 -3
- package/styles/overlays.css +1 -1
- package/styles/tokens.css +17 -1
- package/styles/tokens.json +6 -1
- package/dist/chunks/entry-commands-w9qsxa6q.js +0 -42
- package/dist/chunks/layers-panel-fksbdg4q.js +0 -40
- package/dist/chunks/publish-panel-vz23wwmg.js +0 -27
- package/dist/chunks/quick-search-e9rp74m8.js +0 -46
- package/dist/chunks/right-panel-j97t2yvy.js +0 -45
- package/dist/chunks/studio-727xh0e3.js +0 -76
- package/src/files/json-layout.ts +0 -474
- package/src/services/ai-turn-signal.ts +0 -70
|
@@ -5,8 +5,9 @@
|
|
|
5
5
|
* between this and the Manage view it replaces. That view's category filter, its search box and its
|
|
6
6
|
* grid/table switch existed ONLY as buttons inside a modal, so `scripts/screenshots/automation.ts`
|
|
7
7
|
* carried a hand-maintained `BROWSE_CATEGORY_LABELS` table and pressed the buttons through an XPath
|
|
8
|
-
* matched on their rendered text
|
|
9
|
-
* action the button runs, and
|
|
8
|
+
* matched on their rendered text, exactly what the shot contract's R1 forbids
|
|
9
|
+
* (`scripts/screenshots/README.md`). `library.setCategory` is the same action the button runs, and
|
|
10
|
+
* the button is now a rendering of the record.
|
|
10
11
|
*
|
|
11
12
|
* Every setter is idempotent and names the STATE it reaches, never a delta: there is no
|
|
12
13
|
* `library.toggleLayout`, because a toggle against unstated state is what silently inverted
|
|
@@ -51,7 +52,7 @@ export function libraryCommands(): AnyCommand[] {
|
|
|
51
52
|
{
|
|
52
53
|
category: "Project",
|
|
53
54
|
id: "library.open",
|
|
54
|
-
// ⌘⇧E
|
|
55
|
+
// ⌘⇧E, as studio.md §9.1.2 names it. The Library is the content surface for a site
|
|
55
56
|
// With a collection, and it was reachable only by palette search and one overflow menu item.
|
|
56
57
|
keybinding: "mod+shift+e",
|
|
57
58
|
level: "project",
|
|
@@ -59,9 +60,9 @@ export function libraryCommands(): AnyCommand[] {
|
|
|
59
60
|
group: "1_file",
|
|
60
61
|
requires: "an open project",
|
|
61
62
|
when: (ctx) => ctx.project.open,
|
|
62
|
-
/* No `aiTool`, by §12.4's first deletion rule: chrome. None of the
|
|
63
|
-
projected — every one of these verbs shapes a listing a person reads,
|
|
64
|
-
`list_files` / `search_files` for the same facts. */
|
|
63
|
+
/* No `aiTool`, by studio-ui-guidelines.md §12.4's first deletion rule: chrome. None of the
|
|
64
|
+
Library family is projected — every one of these verbs shapes a listing a person reads,
|
|
65
|
+
and the model has `list_files` / `search_files` for the same facts. */
|
|
65
66
|
run: () => {
|
|
66
67
|
openLibraryTab();
|
|
67
68
|
},
|
|
@@ -81,7 +82,7 @@ export function libraryCommands(): AnyCommand[] {
|
|
|
81
82
|
group: "1_file",
|
|
82
83
|
requires: "an open project",
|
|
83
84
|
when: (ctx) => ctx.project.open,
|
|
84
|
-
/* No `aiTool`: a listing filter for a person (§12.4, rule 1). */
|
|
85
|
+
/* No `aiTool`: a listing filter for a person (studio-ui-guidelines.md §12.4, rule 1). */
|
|
85
86
|
run: (_ctx, args) => {
|
|
86
87
|
const key = enumArg("library.setCategory", args, "category", LIBRARY_CATEGORY_KEYS);
|
|
87
88
|
setLibraryCategory(key);
|
|
@@ -104,7 +105,7 @@ export function libraryCommands(): AnyCommand[] {
|
|
|
104
105
|
group: "1_file",
|
|
105
106
|
requires: "an open project",
|
|
106
107
|
when: (ctx) => ctx.project.open,
|
|
107
|
-
/* No `aiTool`: a listing filter for a person (§12.4, rule 1). */
|
|
108
|
+
/* No `aiTool`: a listing filter for a person (studio-ui-guidelines.md §12.4, rule 1). */
|
|
108
109
|
run: (_ctx, args) => {
|
|
109
110
|
const layout = enumArg<LibraryLayout>("library.setLayout", args, "layout", LIBRARY_LAYOUTS);
|
|
110
111
|
setLibraryLayout(layout);
|
|
@@ -126,7 +127,8 @@ export function libraryCommands(): AnyCommand[] {
|
|
|
126
127
|
group: "1_file",
|
|
127
128
|
requires: "an open project",
|
|
128
129
|
when: (ctx) => ctx.project.open,
|
|
129
|
-
/* No `aiTool`: a listing filter for a person; the model has `search_files`
|
|
130
|
+
/* No `aiTool`: a listing filter for a person; the model has `search_files`
|
|
131
|
+
(studio-ui-guidelines.md §12.4, rule 1). */
|
|
130
132
|
run: (_ctx, args) => {
|
|
131
133
|
setLibrarySearch(optionalStringArg("library.setSearch", args, "query") ?? "");
|
|
132
134
|
},
|
|
@@ -154,7 +156,7 @@ export function libraryCommands(): AnyCommand[] {
|
|
|
154
156
|
// A monolingual project has no facet to set: the Library draws no picker, and offering the
|
|
155
157
|
// Verb would name a value space with one member in it.
|
|
156
158
|
when: (ctx) => ctx.project.open && ctx.project.isMultilingual,
|
|
157
|
-
/* No `aiTool`: a listing filter for a person (§12.4, rule 1). */
|
|
159
|
+
/* No `aiTool`: a listing filter for a person (studio-ui-guidelines.md §12.4, rule 1). */
|
|
158
160
|
run: (_ctx, args) => {
|
|
159
161
|
const choice = enumArg("library.setLocale", args, "locale", localeChoices());
|
|
160
162
|
setLibraryLocale(choice === "all" ? "" : choice);
|
|
@@ -169,7 +171,7 @@ export function libraryCommands(): AnyCommand[] {
|
|
|
169
171
|
group: "1_file",
|
|
170
172
|
requires: "an open project",
|
|
171
173
|
when: (ctx) => ctx.project.open,
|
|
172
|
-
/* No `aiTool`: chrome (§12.4, rule 1). */
|
|
174
|
+
/* No `aiTool`: chrome (studio-ui-guidelines.md §12.4, rule 1). */
|
|
173
175
|
run: () => refreshLibrary(),
|
|
174
176
|
title: "Library: Rescan Files",
|
|
175
177
|
},
|
|
@@ -193,8 +195,8 @@ export function libraryCommands(): AnyCommand[] {
|
|
|
193
195
|
requires: "an open project",
|
|
194
196
|
when: (ctx) => ctx.project.open,
|
|
195
197
|
undo: "project",
|
|
196
|
-
/* No `aiTool`, by §12.4's second deletion rule: it waits on the New
|
|
197
|
-
`create_page` / `create_component` cover the job. */
|
|
198
|
+
/* No `aiTool`, by studio-ui-guidelines.md §12.4's second deletion rule: it waits on the New
|
|
199
|
+
File prompt; `create_page` / `create_component` cover the job. */
|
|
198
200
|
run: async (_ctx, args) => {
|
|
199
201
|
const declared = libraryNewEntries().map((entry) => entry.key);
|
|
200
202
|
const key = enumArg("library.newEntry", args, "type", declared);
|
|
@@ -798,8 +798,8 @@ export async function createLibraryEntry(key: string): Promise<string | null> {
|
|
|
798
798
|
*
|
|
799
799
|
* The active category's directory when it has one — printed on the drop zone, so the destination is
|
|
800
800
|
* visible BEFORE the drop. "All" has none, and rather than falling back to a default nobody chose,
|
|
801
|
-
* it asks. That fallback is exactly the surprise §
|
|
802
|
-
* worked, and it is in a directory the author never picked.
|
|
801
|
+
* it asks. That fallback is exactly the surprise studio.md §16 exists to refuse: the file arrives,
|
|
802
|
+
* the toast says it worked, and it is in a directory the author never picked.
|
|
803
803
|
*/
|
|
804
804
|
export async function resolveUploadDir(): Promise<string | null> {
|
|
805
805
|
const named = uploadDirForCategory(libraryView.category);
|
|
@@ -35,8 +35,9 @@ import {
|
|
|
35
35
|
import { collabSourceContext } from "../collab/collab-session";
|
|
36
36
|
import { buildChangeMap } from "./diff-marks";
|
|
37
37
|
import type { ChangeMap, ChangeMark } from "./diff-marks";
|
|
38
|
-
import { clearDiffView,
|
|
38
|
+
import { clearDiffView, diffShowsCode, setDiffChangeMap } from "./diff-view";
|
|
39
39
|
import { canRenderComparison } from "../panels/git-diff-open";
|
|
40
|
+
import { releaseStageScrollbar, trackStageScrollbar } from "./stage-scrollbar";
|
|
40
41
|
import { renderDiffToolbar, setDiffRepaint, setDiffToolbarHost } from "./diff-toolbar";
|
|
41
42
|
import { attachCursorStyles } from "../collab/monaco-cursors";
|
|
42
43
|
import type { AwarenessLike } from "../collab/monaco-cursors";
|
|
@@ -44,7 +45,7 @@ import type { BindingAwareness } from "../collab/monaco-binding";
|
|
|
44
45
|
import { monacoTheme, shell } from "../shell";
|
|
45
46
|
import { parseSourceForPath } from "../files/file-ops";
|
|
46
47
|
import { serializeDocument } from "../files/serialize-document";
|
|
47
|
-
import { parseJsonDocument, serializeJson } from "
|
|
48
|
+
import { parseJsonDocument, serializeJson } from "@jxsuite/schema/json-layout";
|
|
48
49
|
import { detachGridPanel, gridPanelMounted, renderGridMode } from "../grid/grid-panel";
|
|
49
50
|
import { detachLibraryPane, libraryPaneMounted, renderLibraryMode } from "../browse/library-pane";
|
|
50
51
|
import { detachEntryPane, entryPaneMounted, renderEntryMode } from "../content/entry-editor";
|
|
@@ -165,7 +166,7 @@ async function sourceContent(tab: Tab) {
|
|
|
165
166
|
if (formatByName(tab.doc.sourceFormat)) {
|
|
166
167
|
return serializeDocument(tab);
|
|
167
168
|
}
|
|
168
|
-
// The file's own layout (
|
|
169
|
+
// The file's own layout (`@jxsuite/schema/json-layout`), so the buffer shows the bytes a save writes and
|
|
169
170
|
// A commit from it reads the same layout back — what `serializeDocument`'s JSON branch does.
|
|
170
171
|
return serializeJson(tab.doc.document, tab.doc.layout ?? null);
|
|
171
172
|
}
|
|
@@ -231,7 +232,7 @@ function hardClearCanvasWrap(canvasWrap: HTMLElement) {
|
|
|
231
232
|
|
|
232
233
|
/**
|
|
233
234
|
* Where each stage's non-artboard hosts landed, keyed by part (and by the static mark that tells
|
|
234
|
-
* two
|
|
235
|
+
* the two width handles apart: `data-side`, the one part the stage document draws twice).
|
|
235
236
|
*
|
|
236
237
|
* Per STAGE rather than per module, for the reason every other field on `CanvasSurface` is: two
|
|
237
238
|
* panes each have a Monaco host and a card slot, and one slot would hand the second pane's stage
|
|
@@ -345,7 +346,6 @@ function drawStage(
|
|
|
345
346
|
*/
|
|
346
347
|
function editorStageView(frame: "source" | "code"): CanvasStageView {
|
|
347
348
|
return {
|
|
348
|
-
columnHeader: "hidden",
|
|
349
349
|
frame,
|
|
350
350
|
framePart: "panzoom",
|
|
351
351
|
frameVars: "",
|
|
@@ -514,6 +514,25 @@ function disposeDiffEditor(surface: CanvasSurface): void {
|
|
|
514
514
|
surface.monacoDiffEditor = null;
|
|
515
515
|
}
|
|
516
516
|
|
|
517
|
+
/**
|
|
518
|
+
* One artboard's marks, with a modification given the face that side wears.
|
|
519
|
+
*
|
|
520
|
+
* {@link ChangeMap} names a modification once, semantically; the two artboards draw it as the before
|
|
521
|
+
* and the after. The split happens here because this is the only place that knows which document
|
|
522
|
+
* each mark set is about to be painted on.
|
|
523
|
+
*/
|
|
524
|
+
function sideMarks(
|
|
525
|
+
marks: readonly ChangeMark[] | undefined,
|
|
526
|
+
modified: "modified-before" | "modified-after",
|
|
527
|
+
): WireDiffMarks | null {
|
|
528
|
+
return (
|
|
529
|
+
marks?.map((mark) => ({
|
|
530
|
+
kind: mark.kind === "modified" ? modified : mark.kind,
|
|
531
|
+
path: mark.path,
|
|
532
|
+
})) ?? null
|
|
533
|
+
);
|
|
534
|
+
}
|
|
535
|
+
|
|
517
536
|
/**
|
|
518
537
|
* Mount the comparison's Monaco diff editor: HEAD on the left, the working copy on the right.
|
|
519
538
|
*
|
|
@@ -532,40 +551,10 @@ function disposeDiffEditor(surface: CanvasSurface): void {
|
|
|
532
551
|
* A RETARGET is the second, independent race, and `mountStillWanted` cannot catch it: it answers
|
|
533
552
|
* false when the slot is already filled, so a comparison switching to a different file would keep
|
|
534
553
|
* the old editor and its claimed URIs. That one is disposed synchronously, before the await.
|
|
535
|
-
*/
|
|
536
|
-
/**
|
|
537
|
-
* Whether this pane draws the comparison as TEXT.
|
|
538
554
|
*
|
|
539
|
-
*
|
|
540
|
-
*
|
|
541
|
-
* were two spellings — the branch said "not renderable OR the author chose Code", the guard said
|
|
542
|
-
* only "the author chose Code" — so for a file with no visual half the branch built the Code
|
|
543
|
-
* container and the guard then refused to mount into it. An empty stage, no error, and a toolbar
|
|
544
|
-
* correctly describing an editor that was never there.
|
|
555
|
+
* The guard asks {@link diffShowsCode}, the same predicate the render branch chose the half with
|
|
556
|
+
* (`canvas/diff-view.ts` says why there is only one).
|
|
545
557
|
*/
|
|
546
|
-
/**
|
|
547
|
-
* One artboard's marks, with a modification given the face that side wears.
|
|
548
|
-
*
|
|
549
|
-
* {@link ChangeMap} names a modification once, semantically; the two artboards draw it as the before
|
|
550
|
-
* and the after. The split happens here because this is the only place that knows which document
|
|
551
|
-
* each mark set is about to be painted on.
|
|
552
|
-
*/
|
|
553
|
-
function sideMarks(
|
|
554
|
-
marks: readonly ChangeMark[] | undefined,
|
|
555
|
-
modified: "modified-before" | "modified-after",
|
|
556
|
-
): WireDiffMarks | null {
|
|
557
|
-
return (
|
|
558
|
-
marks?.map((mark) => ({
|
|
559
|
-
kind: mark.kind === "modified" ? modified : mark.kind,
|
|
560
|
-
path: mark.path,
|
|
561
|
-
})) ?? null
|
|
562
|
-
);
|
|
563
|
-
}
|
|
564
|
-
|
|
565
|
-
function diffShowsCode(paneId: string, filePath: string): boolean {
|
|
566
|
-
return !canRenderComparison(filePath) || diffViewOf(paneId) === "code";
|
|
567
|
-
}
|
|
568
|
-
|
|
569
558
|
async function mountDiffEditor(
|
|
570
559
|
surface: CanvasSurface,
|
|
571
560
|
container: Element,
|
|
@@ -581,7 +570,8 @@ async function mountDiffEditor(
|
|
|
581
570
|
!mountStillWanted(
|
|
582
571
|
container,
|
|
583
572
|
surface.monacoDiffEditor,
|
|
584
|
-
() =>
|
|
573
|
+
() =>
|
|
574
|
+
canvasModeOfPane(paneId) === "git-diff" && diffShowsCode(paneId, canRenderComparison(key)),
|
|
585
575
|
)
|
|
586
576
|
) {
|
|
587
577
|
return;
|
|
@@ -629,6 +619,7 @@ function resetCanvasView(surface: CanvasSurface) {
|
|
|
629
619
|
surface.centerObserver.disconnect();
|
|
630
620
|
surface.centerObserver = null;
|
|
631
621
|
}
|
|
622
|
+
releaseStageScrollbar(surface);
|
|
632
623
|
for (const p of surface.panels) {
|
|
633
624
|
p.renderScope?.stop();
|
|
634
625
|
p.renderScope = null;
|
|
@@ -641,6 +632,7 @@ function resetCanvasView(surface: CanvasSurface) {
|
|
|
641
632
|
canvasWrap.style.padding = "";
|
|
642
633
|
canvasWrap.style.alignItems = "";
|
|
643
634
|
canvasWrap.style.flexDirection = "";
|
|
635
|
+
canvasWrap.style.gap = "";
|
|
644
636
|
canvasWrap.style.display = "";
|
|
645
637
|
canvasWrap.style.overflow = "";
|
|
646
638
|
dismissBlockActionBar();
|
|
@@ -1029,23 +1021,24 @@ function renderCanvasImpl(surface: CanvasSurface) {
|
|
|
1029
1021
|
// Re-rendering the previous mode's panels in place.
|
|
1030
1022
|
const canvasMode = canvasModeOfPane(surface.paneId);
|
|
1031
1023
|
|
|
1032
|
-
/* The Document Header card
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
those
|
|
1042
|
-
|
|
1024
|
+
/* The Document Header card is drawn by the STAGE, and only by Edit's. It is docked
|
|
1025
|
+
above the page's scroller, a band across the pane at 1:1: its width is the PANE's rather than
|
|
1026
|
+
the breakpoint's, and the page scrolls under it rather than taking it along. It used to go
|
|
1027
|
+
INSIDE Edit's column, where it was exactly as wide as whatever breakpoint or dragged width the
|
|
1028
|
+
column had and scrolled off with the first screen of the page, and it was pinned above Design's
|
|
1029
|
+
artboards as well. Design omits it now, so the artboards get the whole pane, and nothing is
|
|
1030
|
+
lost by that: the Navigator's Page panel carries the same fields in every mode.
|
|
1031
|
+
`hasDocumentHeader` is the other predicate, and it is a fact about the DOCUMENT. It used to
|
|
1032
|
+
carry two more clauses, suppressing the card while a function body or a formula was open on
|
|
1033
|
+
the grounds that those sub-editors took the whole stage. They open in the dock's Logic tab now
|
|
1034
|
+
(§16.3) and the page is still on screen behind it, so those clauses only DETACHED the visible
|
|
1035
|
+
card: it stopped re-rendering and quietly showed frontmatter from before the edit. */
|
|
1043
1036
|
/* …and NOT in a lens. The Document Header is an editing surface — Title, Route, SEO, the raw
|
|
1044
1037
|
frontmatter — over a document this pane does not own, and two cards editing one document's
|
|
1045
1038
|
frontmatter side by side is two writers for one field. A lens is a view; the card belongs to
|
|
1046
1039
|
the pane that owns the tab. */
|
|
1047
1040
|
const wantsDocHeader =
|
|
1048
|
-
|
|
1041
|
+
canvasMode === "edit" &&
|
|
1049
1042
|
derivationOfPane(surface.paneId)?.kind !== "lens" &&
|
|
1050
1043
|
hasDocumentHeader(tab);
|
|
1051
1044
|
if (!wantsDocHeader) {
|
|
@@ -1084,9 +1077,9 @@ function renderCanvasImpl(surface: CanvasSurface) {
|
|
|
1084
1077
|
|
|
1085
1078
|
/* There are no `editingFunction` / `editingFormula` branches here, and that is the point.
|
|
1086
1079
|
Both used to RETURN from this function, which is what made the logic editors a takeover: the
|
|
1087
|
-
stage kept whatever DOM it was last painted with and stopped tracking the document.
|
|
1088
|
-
|
|
1089
|
-
`panels/editors.ts`'s `syncFunctionEditor` owns the Monaco instance from the panel's
|
|
1080
|
+
stage kept whatever DOM it was last painted with and stopped tracking the document. Both open
|
|
1081
|
+
in the dock's Logic tab now (§16.3), `panels/bottom-dock.ts` reveals it from its own effect,
|
|
1082
|
+
and `panels/editors.ts`'s `syncFunctionEditor` owns the Monaco instance from the panel's
|
|
1090
1083
|
`afterRender` — including disposing it. Nothing about the canvas render depends on a logic
|
|
1091
1084
|
target any more, so the page underneath the dock keeps rendering while you edit a formula. */
|
|
1092
1085
|
|
|
@@ -1235,12 +1228,15 @@ function renderCanvasImpl(surface: CanvasSurface) {
|
|
|
1235
1228
|
surface.centerObserver.disconnect();
|
|
1236
1229
|
surface.centerObserver = null;
|
|
1237
1230
|
}
|
|
1231
|
+
/* Edit's scroller leaves with its stage, and the pod must not keep Edit's inset in a mode that
|
|
1232
|
+
has no scrollbar under it: missed here, Design's pod would float 15px short of its corner. */
|
|
1233
|
+
releaseStageScrollbar(surface);
|
|
1238
1234
|
|
|
1239
1235
|
// Destroy the grid panel if switching away from grid mode
|
|
1240
1236
|
detachGridPanel(surface.paneId);
|
|
1241
1237
|
|
|
1242
1238
|
// The Library holds an IntersectionObserver and an LRU of live runtime subtrees; leaving the
|
|
1243
|
-
// Mode without releasing them is exactly the unbounded retention
|
|
1239
|
+
// Mode without releasing them is exactly the unbounded retention its LRU cap exists to remove.
|
|
1244
1240
|
detachLibraryPane(surface.paneId);
|
|
1245
1241
|
|
|
1246
1242
|
// Same for the entry form, whose effect scope subscribes to the document's frontmatter
|
|
@@ -1268,9 +1264,9 @@ function renderCanvasImpl(surface: CanvasSurface) {
|
|
|
1268
1264
|
canvasWrap.style.padding = "";
|
|
1269
1265
|
canvasWrap.style.alignItems = "";
|
|
1270
1266
|
canvasWrap.style.flexDirection = "";
|
|
1267
|
+
canvasWrap.style.gap = "";
|
|
1271
1268
|
canvasWrap.style.display = "";
|
|
1272
1269
|
canvasWrap.style.overflow = "";
|
|
1273
|
-
canvasWrap.style.overflow = "";
|
|
1274
1270
|
|
|
1275
1271
|
// Dismiss open popovers/toolbars that are no longer relevant
|
|
1276
1272
|
dismissBlockActionBar();
|
|
@@ -1342,7 +1338,6 @@ function renderCanvasImpl(surface: CanvasSurface) {
|
|
|
1342
1338
|
void drawStage(
|
|
1343
1339
|
surface,
|
|
1344
1340
|
{
|
|
1345
|
-
columnHeader: "hidden",
|
|
1346
1341
|
frame: "boards",
|
|
1347
1342
|
framePart: "preview-stage",
|
|
1348
1343
|
frameVars: `--preview-w:${previewWidth}px`,
|
|
@@ -1362,7 +1357,7 @@ function renderCanvasImpl(surface: CanvasSurface) {
|
|
|
1362
1357
|
return;
|
|
1363
1358
|
}
|
|
1364
1359
|
|
|
1365
|
-
/* Settings mode: the Project Settings document (
|
|
1360
|
+
/* Settings mode: the Project Settings document (§17.1). Same non-iframe-editor pattern as
|
|
1366
1361
|
grid and stylebook — the panel owns its own reactivity from here — and the reason the seven
|
|
1367
1362
|
settings screenshots now crop `pane.primary` instead of `overlay.dialog:settings` without one
|
|
1368
1363
|
manifest step changing. */
|
|
@@ -1468,7 +1463,7 @@ function renderCanvasImpl(surface: CanvasSurface) {
|
|
|
1468
1463
|
a Diff lens, the Editor axis) and only this one sees every arrival. Forcing it here also
|
|
1469
1464
|
leaves `diffView` alone, so a document opened after a `.css` still comes up Visual. */
|
|
1470
1465
|
const renderable = canRenderComparison(gitDiffState.filePath ?? "");
|
|
1471
|
-
if (diffShowsCode(surface.paneId,
|
|
1466
|
+
if (diffShowsCode(surface.paneId, renderable)) {
|
|
1472
1467
|
/* A null map is how the toolbar learns there is no visual half to offer: it draws Code as a
|
|
1473
1468
|
static label rather than as half of a choice, and reports the line marks instead of a node
|
|
1474
1469
|
count. Cleared rather than left, so a pane that compared a document and then a stylesheet
|
|
@@ -1504,7 +1499,6 @@ function renderCanvasImpl(surface: CanvasSurface) {
|
|
|
1504
1499
|
const diffStage = drawStage(
|
|
1505
1500
|
surface,
|
|
1506
1501
|
{
|
|
1507
|
-
columnHeader: "hidden",
|
|
1508
1502
|
frame: "boards",
|
|
1509
1503
|
framePart: "panzoom",
|
|
1510
1504
|
frameVars: "",
|
|
@@ -1632,8 +1626,9 @@ function renderCanvasImpl(surface: CanvasSurface) {
|
|
|
1632
1626
|
* that computes the SAME width it last committed skips the write — and the imperative value
|
|
1633
1627
|
* stays. That is not hypothetical: drag a page down to 330px, open a different document in the
|
|
1634
1628
|
* pane, and the new one is 330px wide too, because both passes computed the base width and lit
|
|
1635
|
-
* wrote neither. One writer, applied after the render, is the fix
|
|
1636
|
-
* `applyEditZoom` below already has exactly this shape for
|
|
1629
|
+
* wrote neither. One writer, applied after the render, is the fix
|
|
1630
|
+
* (studio-ui-guidelines.md §9.4); `applyEditZoom` below already has exactly this shape for
|
|
1631
|
+
* exactly this reason.
|
|
1637
1632
|
*/
|
|
1638
1633
|
const entry = canvasPanelEntry(null, null, true);
|
|
1639
1634
|
// A component-definition doc (root tag is a custom element) is a fragment, not a page: it should
|
|
@@ -1641,21 +1636,38 @@ function renderCanvasImpl(surface: CanvasSurface) {
|
|
|
1641
1636
|
const rootTag = (S.document as { tagName?: unknown }).tagName;
|
|
1642
1637
|
const isComponentDoc = typeof rootTag === "string" && rootTag.includes("-");
|
|
1643
1638
|
const { featureToggles: editToggles } = S.ui;
|
|
1639
|
+
/* The stage stacks when it carries the card: the band first, the page's scroller below it.
|
|
1640
|
+
Set on every render rather than on the transition, because whether a document HAS a header
|
|
1641
|
+
changes with the tab and not with the mode. `editors.ts` and `formula-workspace.ts` already
|
|
1642
|
+
claim the column this way — `#canvas-wrap` is a row by default and each surface states its
|
|
1643
|
+
own axis. Stretched, because the band is as wide as the PANE: that is the whole difference
|
|
1644
|
+
between docking the card here and drawing it in the column, whose width is the breakpoint's
|
|
1645
|
+
or the drag's.
|
|
1646
|
+
And FLUSH: the cell's own 24px gap (`pane-grid.json`) between two side-by-side surfaces is
|
|
1647
|
+
dead space between a docked band and the box below it. The scroller clips its content at its
|
|
1648
|
+
top edge, so the gap put that edge 24px below the band's border with nothing drawn in
|
|
1649
|
+
between — the page ended at an invisible line and the band read as a hairline over one
|
|
1650
|
+
continuous surface. At 0 the clip happens AT the border, which is what makes the border read
|
|
1651
|
+
as the band's edge; the scroller's own 32px of top padding is the breathing room. */
|
|
1652
|
+
canvasWrap.style.flexDirection = wantsDocHeader ? "column" : "";
|
|
1653
|
+
canvasWrap.style.alignItems = wantsDocHeader ? "stretch" : "";
|
|
1654
|
+
canvasWrap.style.gap = wantsDocHeader ? "0px" : "";
|
|
1644
1655
|
void drawStage(
|
|
1645
1656
|
surface,
|
|
1646
1657
|
{
|
|
1647
|
-
/* The card
|
|
1648
|
-
|
|
1649
|
-
|
|
1650
|
-
|
|
1651
|
-
|
|
1658
|
+
/* The card LEADS the frame (`tests/canvas-render.test.ts`, "Edit docks it above the page's
|
|
1659
|
+
scroller"): a sibling of the scroller rather than a block of the column, so the page
|
|
1660
|
+
scrolls under it and the breakpoint does not size it. The two handles are not in the
|
|
1661
|
+
column either: they are `jx-split`s standing beside it in the canvas's row, because the
|
|
1662
|
+
canvas is the track a splitter has to measure and the column is the thing being
|
|
1663
|
+
resized. */
|
|
1652
1664
|
frame: "boards",
|
|
1653
1665
|
framePart: "edit-canvas",
|
|
1654
1666
|
frameVars: "",
|
|
1655
1667
|
handles: "shown",
|
|
1656
1668
|
hug: isComponentDoc,
|
|
1657
1669
|
innerPart: "edit-column",
|
|
1658
|
-
lead: "none",
|
|
1670
|
+
lead: wantsDocHeader ? "header" : "none",
|
|
1659
1671
|
panels: [entry.item],
|
|
1660
1672
|
},
|
|
1661
1673
|
[entry],
|
|
@@ -1664,7 +1676,13 @@ function renderCanvasImpl(surface: CanvasSurface) {
|
|
|
1664
1676
|
return;
|
|
1665
1677
|
}
|
|
1666
1678
|
const editColumn = stageHost(surface, "edit-column");
|
|
1667
|
-
|
|
1679
|
+
const scroller = stageHost(surface, "edit-canvas");
|
|
1680
|
+
entry.panel.scrollContainer = scroller as HTMLElement;
|
|
1681
|
+
/* The one mode whose stage SCROLLS under the zoom pod, so the one that tells the pane how
|
|
1682
|
+
wide its scrollbar is. The pod floats in the pane's chrome layer, which spans the gutter
|
|
1683
|
+
too, and without this it sat 3px into the track. A same-scroller repaint is a no-op, and
|
|
1684
|
+
every teardown below releases it back to 0. See `canvas/stage-scrollbar.ts`. */
|
|
1685
|
+
trackStageScrollbar(surface, scroller);
|
|
1668
1686
|
// The one writer of the column's width — see the note above.
|
|
1669
1687
|
if (editColumn) {
|
|
1670
1688
|
editColumn.style.maxWidth = `${Math.round(columnWidth)}px`;
|
|
@@ -1696,13 +1714,9 @@ function renderCanvasImpl(surface: CanvasSurface) {
|
|
|
1696
1714
|
canvasWrap.style.padding = "0";
|
|
1697
1715
|
canvasWrap.style.overflow = "hidden";
|
|
1698
1716
|
}
|
|
1699
|
-
/*
|
|
1700
|
-
|
|
1701
|
-
|
|
1702
|
-
`#canvas-wrap` is a row by default and each surface states its own axis. */
|
|
1703
|
-
canvasWrap.style.flexDirection = wantsDocHeader ? "column" : "";
|
|
1704
|
-
canvasWrap.style.alignItems = wantsDocHeader ? "stretch" : "";
|
|
1705
|
-
const designLead = wantsDocHeader ? "header" : "none";
|
|
1717
|
+
/* No Document Header here, so the stage cell stays the row it is by default: the card is Edit's
|
|
1718
|
+
alone (see `wantsDocHeader`), and the transition into this mode has already cleared the two
|
|
1719
|
+
inline writes Edit makes to stack it. */
|
|
1706
1720
|
|
|
1707
1721
|
const {
|
|
1708
1722
|
sizeBreakpoints,
|
|
@@ -1727,14 +1741,13 @@ function renderCanvasImpl(surface: CanvasSurface) {
|
|
|
1727
1741
|
void drawStage(
|
|
1728
1742
|
surface,
|
|
1729
1743
|
{
|
|
1730
|
-
columnHeader: "hidden",
|
|
1731
1744
|
frame: "boards",
|
|
1732
1745
|
framePart: "panzoom",
|
|
1733
1746
|
frameVars: "",
|
|
1734
1747
|
handles: "hidden",
|
|
1735
1748
|
hug: false,
|
|
1736
1749
|
innerPart: "boards",
|
|
1737
|
-
lead:
|
|
1750
|
+
lead: "none",
|
|
1738
1751
|
panels: [entry.item],
|
|
1739
1752
|
},
|
|
1740
1753
|
[entry],
|
|
@@ -1793,14 +1806,13 @@ function renderCanvasImpl(surface: CanvasSurface) {
|
|
|
1793
1806
|
const stageDrawn = drawStage(
|
|
1794
1807
|
surface,
|
|
1795
1808
|
{
|
|
1796
|
-
columnHeader: "hidden",
|
|
1797
1809
|
frame: "boards",
|
|
1798
1810
|
framePart: "panzoom",
|
|
1799
1811
|
frameVars: "",
|
|
1800
1812
|
handles: "hidden",
|
|
1801
1813
|
hug: false,
|
|
1802
1814
|
innerPart: "boards",
|
|
1803
|
-
lead:
|
|
1815
|
+
lead: "none",
|
|
1804
1816
|
panels: panelEntries.map((e) => e.item),
|
|
1805
1817
|
},
|
|
1806
1818
|
panelEntries,
|
|
@@ -1968,6 +1980,7 @@ setSurfaceTeardown((surface) => {
|
|
|
1968
1980
|
disposeSourceEditor(surface);
|
|
1969
1981
|
surface.centerObserver?.disconnect();
|
|
1970
1982
|
surface.centerObserver = null;
|
|
1983
|
+
releaseStageScrollbar(surface);
|
|
1971
1984
|
surface.panzoomWrap = null;
|
|
1972
1985
|
detachCanvasStage(surface);
|
|
1973
1986
|
});
|
|
@@ -2109,10 +2122,11 @@ export function selectionCommands(): AnyCommand[] {
|
|
|
2109
2122
|
requires: "an open document",
|
|
2110
2123
|
when: (ctx) => ctx.document.open,
|
|
2111
2124
|
/*
|
|
2112
|
-
* No `aiTool`, by §12.4's fourth deletion rule (redundant with a
|
|
2113
|
-
* assistant's bridge runs THIS record by id as the selector step of
|
|
2114
|
-
* tool — `delete_node(paths)` is `selection.setPaths` then
|
|
2115
|
-
* selection tool beside `select_node` would be prompt cost
|
|
2125
|
+
* No `aiTool`, by studio-ui-guidelines.md §12.4's fourth deletion rule (redundant with a
|
|
2126
|
+
* tool the model has): the assistant's bridge runs THIS record by id as the selector step of
|
|
2127
|
+
* every selection-level tool — `delete_node(paths)` is `selection.setPaths` then
|
|
2128
|
+
* `selection.delete` — so a second selection tool beside `select_node` would be prompt cost
|
|
2129
|
+
* with no second job.
|
|
2116
2130
|
*/
|
|
2117
2131
|
/**
|
|
2118
2132
|
* The idempotent SET for the whole selection, beside `selection.set`'s single path.
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Canvas surfaces — one stage per pane, asked about the pane it belongs to.
|
|
4
4
|
*
|
|
5
|
-
* A pane is the unit of split, focus and zoom (§
|
|
6
|
-
*
|
|
5
|
+
* A pane is the unit of split, focus and zoom (§18), so it is also the unit of RENDER. The panels a
|
|
6
|
+
* pass mounted, the host element they mounted into, the mode that pass was drawn in and the full
|
|
7
7
|
* render a failed patch escalates to are all facts about ONE pane; they were app-level singletons
|
|
8
8
|
* only because the shell had a single stage.
|
|
9
9
|
*
|