@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
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
/// <reference lib="dom" />
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* The Bottom dock — where long operations and lists of things-to-fix live (§16.3).
|
|
4
4
|
*
|
|
5
5
|
* Studio had no bottom dock and at least five surfaces wanted one, so each of them took over the
|
|
6
6
|
* canvas: Code mode, the git diff, the formula workspace and the Monaco function editor all replace
|
|
7
|
-
* the stage, and the progress modal covers the whole app. The canvas is the one region §3 says
|
|
8
|
-
* never disappear, so this is where those surfaces go instead.
|
|
7
|
+
* the stage, and the progress modal covers the whole app. The canvas is the one region §16.3 says
|
|
8
|
+
* must never disappear, so this is where those surfaces go instead.
|
|
9
9
|
*
|
|
10
10
|
* **Under the pane grid, not under the window.** The dock occupies the pane's grid column only, so
|
|
11
11
|
* opening it never narrows the Navigator or the Inspector — which is the difference between a dock
|
|
@@ -13,16 +13,17 @@
|
|
|
13
13
|
*
|
|
14
14
|
* **Three tabs, under a cap of four.** `scripts/check-chrome-budget.ts` caps a dock at four, and
|
|
15
15
|
* this spends three: **Problems · Logic · Activity**, with Deploy folded into Activity because a
|
|
16
|
-
* deploy is a long operation with a log. Diff was the fourth until
|
|
17
|
-
* instead — see {@link registerBottomPanels}. `shell.ts` declares the ids
|
|
18
|
-
* so a bare Bun process can read `view.setBottomTab`'s enum; this module
|
|
16
|
+
* deploy is a long operation with a log. Diff was the fourth until a second pane gave it somewhere
|
|
17
|
+
* to open into instead — see {@link registerBottomPanels}. `shell.ts` declares the ids
|
|
18
|
+
* ({@link BOTTOM_TAB_IDS}) so a bare Bun process can read `view.setBottomTab`'s enum; this module
|
|
19
|
+
* turns them into records.
|
|
19
20
|
*
|
|
20
21
|
* **The tabs are panel records, so they inherit everything.** `dock: "bottom"` was already admitted
|
|
21
22
|
* by `registerPanel()` and by the level × placement matrix, and `ui/regions.ts` has parsed
|
|
22
|
-
* `dock.bottom`
|
|
23
|
-
* host. Every tab gets `dock.bottom/panel:<id>` for free and its title comes from the record.
|
|
23
|
+
* `dock.bottom` from the start — it simply resolved to nothing, because there was no host. This is
|
|
24
|
+
* the host. Every tab gets `dock.bottom/panel:<id>` for free and its title comes from the record.
|
|
24
25
|
*
|
|
25
|
-
* **Logic is built, and it is why this dock exists.**
|
|
26
|
+
* **Logic is built, and it is why this dock exists.** §16.3 moves the formula workspace and the
|
|
26
27
|
* Monaco function editor out of their canvas takeovers and into this tab, so the page whose values
|
|
27
28
|
* they compute stays on screen beside them. Its record is defined beside the surface
|
|
28
29
|
* (`panels/formula-workspace.ts`) and registered from here, like Problems and Activity. Because a
|
|
@@ -30,11 +31,10 @@
|
|
|
30
31
|
* for a Logic target appearing and opens the dock on it — once per target, so closing the dock over
|
|
31
32
|
* an open formula keeps it closed until you open another.
|
|
32
33
|
*
|
|
33
|
-
* **Problems is one of them.** §
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
* (`panels/problems-panel.ts`) and registered from here, like every other tab of this dock.
|
|
34
|
+
* **Problems is one of them.** §16.3 places it here, and this dock is its only host. It has no rail
|
|
35
|
+
* button: its count sits in the status bar, and clicking the count runs `view.setBottomTab`. Its
|
|
36
|
+
* record is defined beside the notification store it renders (`panels/problems-panel.ts`) and
|
|
37
|
+
* registered from here, like every other tab of this dock.
|
|
38
38
|
*/
|
|
39
39
|
|
|
40
40
|
import { render as litRender, nothing } from "lit-html";
|
|
@@ -72,10 +72,10 @@ export const BOTTOM_DOCK_SELECTOR = "#bottom-dock";
|
|
|
72
72
|
*
|
|
73
73
|
* Problems first, because it is the tab the dock opens itself for.
|
|
74
74
|
*
|
|
75
|
-
* **Diff is not among them, and its reserved id is gone.** It was held here
|
|
75
|
+
* **Diff is not among them, and its reserved id is gone.** It was held here for four phases with a
|
|
76
76
|
* `when: () => false`, and the comment that held it said why it should not be here: `git-diff` is
|
|
77
77
|
* the `diff` EDITOR KIND (`commands/context.ts`), a pane hosts it at pane size, and folding it into
|
|
78
|
-
* a 240px dock would be a downgrade. What it owed was a pane to open into — and
|
|
78
|
+
* a 240px dock would be a downgrade. What it owed was a pane to open into — and §18 shipped that
|
|
79
79
|
* (`pane.splitRight`, `canOpenInSecondPane`), so Source Control opens a changed file as a Diff
|
|
80
80
|
* editor in the side pane. A reservation whose capability shipped elsewhere is not a reservation;
|
|
81
81
|
* it is an id in `view.setBottomTab`'s enum that can only ever select a hidden tab. The dock spends
|
|
@@ -94,7 +94,7 @@ export function registerBottomPanels(): void {
|
|
|
94
94
|
* The dock's tabs, in strip order.
|
|
95
95
|
*
|
|
96
96
|
* Ordered by {@link BOTTOM_TAB_IDS} rather than by registration order, because the strip's order is
|
|
97
|
-
* a design decision (§3
|
|
97
|
+
* a design decision (§16.3 names it) and `shell.ts` is where a bare Bun process can read it. An id
|
|
98
98
|
* with no record is skipped rather than throwing: the list is also the `args` enum, and a command
|
|
99
99
|
* enum naming a surface that has not registered yet must be inert, not fatal.
|
|
100
100
|
*/
|
|
@@ -147,7 +147,7 @@ function bottomContext(): NavigatorPanelContext {
|
|
|
147
147
|
};
|
|
148
148
|
}
|
|
149
149
|
|
|
150
|
-
/** One tab's label — the record's title, with its badge appended
|
|
150
|
+
/** One tab's label — the record's title, with its badge appended ("Problems 2"). */
|
|
151
151
|
export function bottomTabLabel(panel: PanelRecord, ctx: CommandContext): string {
|
|
152
152
|
const badge = panel.badge?.(ctx) ?? null;
|
|
153
153
|
return badge === null || badge === 0 || badge === "" ? panel.title : `${panel.title} ${badge}`;
|
|
@@ -219,10 +219,10 @@ function logicKey(): string | null {
|
|
|
219
219
|
* Paint the dock, and stamp the region iff it is on screen.
|
|
220
220
|
*
|
|
221
221
|
* The stamp is conditional on purpose. `REGION_FOR_FOCUS.dock` has pointed at `dock.bottom` since
|
|
222
|
-
*
|
|
223
|
-
* `display: none` box that focus must not land in and a shot must not crop. A
|
|
224
|
-
* resolves to nothing, and `view.setBottomDock { open: true }` is what makes
|
|
225
|
-
* is exactly what an idempotent setter is for.
|
|
222
|
+
* before the dock existed, so F6 and `regions.resolve()` will find whatever carries it — and a
|
|
223
|
+
* COLLAPSED dock is a `display: none` box that focus must not land in and a shot must not crop. A
|
|
224
|
+
* closed dock therefore resolves to nothing, and `view.setBottomDock { open: true }` is what makes
|
|
225
|
+
* it addressable, which is exactly what an idempotent setter is for.
|
|
226
226
|
*/
|
|
227
227
|
export function renderBottomDock(): void {
|
|
228
228
|
if (!_host) {
|
package/src/panels/chat-panel.ts
CHANGED
|
@@ -12,10 +12,19 @@
|
|
|
12
12
|
* in `ui/regions.ts`'s shell table — the assistant no longer has a shell host to name. Three
|
|
13
13
|
* screenshot shots address that id and none of them changed.
|
|
14
14
|
*
|
|
15
|
-
* Hosts the assistant
|
|
16
|
-
* project but no open document, and with a document open. The
|
|
17
|
-
* and never tears down on tab switches — the assistant's module state
|
|
18
|
-
* scroll position)
|
|
15
|
+
* Hosts the assistant machinery from ai-panel.ts unconditionally: with no project (welcome screen),
|
|
16
|
+
* with a project but no open document, and with a document open. The machinery is mounted once at
|
|
17
|
+
* studio boot and never tears down on tab switches — the assistant's module state (composer draft,
|
|
18
|
+
* scroll position, transcript) persists.
|
|
19
|
+
*
|
|
20
|
+
* **The assistant's SURFACE document is what this module defers.** Mounting `surfaces/ai-chat.ts`
|
|
21
|
+
* costs a traced 100–290 ms of connectedCallback at boot (its island projections; see
|
|
22
|
+
* `scripts/perf/REPORT.md`), paid on every window open although the document is invisible until
|
|
23
|
+
* the tab is picked. Binding is the same seam (`bindAiPanelHost`) and it is now deferred to the
|
|
24
|
+
* first time the Assistant tab is actually shown or revealed: `renderAiPanel` no-ops while the
|
|
25
|
+
* surface is null, and the surface's own watcher projects whatever the machinery wrote before that
|
|
26
|
+
* point, so a prompt seeded into a boot the reader never spends in the tab is not lost — it is one
|
|
27
|
+
* more message waiting when the body first appears.
|
|
19
28
|
*
|
|
20
29
|
* **This module is the SEAM, and it has no markup of its own.** The assistant is a Jx document
|
|
21
30
|
* (`surfaces/ai-chat.json`), and a document CLEARS the host it is given — so it needs a container
|
|
@@ -32,6 +41,7 @@ import { effect, effectScope } from "../reactivity";
|
|
|
32
41
|
import { workspace } from "../workspace/workspace";
|
|
33
42
|
import { consumePendingAgentPrompt, hasPendingAgentPrompt } from "../services/agent-seed";
|
|
34
43
|
import { REGION_ATTR } from "../ui/regions";
|
|
44
|
+
import { inspectorTab } from "./right-panel";
|
|
35
45
|
import {
|
|
36
46
|
bindAiPanelHost,
|
|
37
47
|
mountAiPanel,
|
|
@@ -48,6 +58,23 @@ const ASSISTANT_REGION = "inspector.assistant";
|
|
|
48
58
|
let _host: HTMLElement | null = null;
|
|
49
59
|
let _container: HTMLElement | null = null;
|
|
50
60
|
let _scope: EffectScope | null = null;
|
|
61
|
+
/** Whether the surface document has been bound. One bind per host; a remount resets it. */
|
|
62
|
+
let _surfaceBound = false;
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Bind the assistant's surface document the first time its tab is shown or revealed.
|
|
66
|
+
*
|
|
67
|
+
* The container, the region attribute and every prompt path are ready before this; the surface is
|
|
68
|
+
* the expensive part and is invisible until the tab is picked, so this is the earliest moment its
|
|
69
|
+
* cost is worth paying. A restore that lands on the Assistant tab binds on the same tick.
|
|
70
|
+
*/
|
|
71
|
+
function ensureAssistantSurface(): void {
|
|
72
|
+
if (_surfaceBound || !_container) {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
_surfaceBound = true;
|
|
76
|
+
bindAiPanelHost(_container);
|
|
77
|
+
}
|
|
51
78
|
|
|
52
79
|
/**
|
|
53
80
|
* Mount the assistant into the host the Inspector hands it. Idempotent per host: the persistent
|
|
@@ -68,11 +95,18 @@ export function mount(host: HTMLElement | null) {
|
|
|
68
95
|
host.append(_container);
|
|
69
96
|
|
|
70
97
|
mountAiPanel();
|
|
71
|
-
|
|
98
|
+
_surfaceBound = false;
|
|
72
99
|
|
|
73
100
|
_scope?.stop();
|
|
74
101
|
_scope = effectScope();
|
|
75
102
|
_scope.run(() => {
|
|
103
|
+
effect(() => {
|
|
104
|
+
// The surface's bind follows the TAB: a session restored onto the Assistant is bound by
|
|
105
|
+
// One re-run of this effect, not by anyone remembering to call the seam directly.
|
|
106
|
+
if (inspectorTab() === "assistant") {
|
|
107
|
+
ensureAssistantSurface();
|
|
108
|
+
}
|
|
109
|
+
});
|
|
76
110
|
effect(() => {
|
|
77
111
|
// A pending agent prompt (stored by the New Project flow, possibly from another window) is
|
|
78
112
|
// Keyed by the absolute project root — consume it as soon as this window adopts that root.
|
|
@@ -98,6 +132,7 @@ export function mount(host: HTMLElement | null) {
|
|
|
98
132
|
export function unmount() {
|
|
99
133
|
_scope?.stop();
|
|
100
134
|
_scope = null;
|
|
135
|
+
_surfaceBound = false;
|
|
101
136
|
// `null` unbinds the surface: the document is disposed and the chat-state watcher stopped.
|
|
102
137
|
bindAiPanelHost(null);
|
|
103
138
|
if (_host) {
|
|
@@ -30,8 +30,8 @@ function rowsUi(): Record<string, boolean> | null {
|
|
|
30
30
|
*
|
|
31
31
|
* The tree caps arrays at 20, objects at 30 and depth at 5, and printed "… 5 more" as inert text.
|
|
32
32
|
* That is the panel telling you it has the answer and will not show it — the exact case a user
|
|
33
|
-
* opens this panel for is the fetch that returned something unexpected at item 40.
|
|
34
|
-
*
|
|
33
|
+
* opens this panel for is the fetch that returned something unexpected at item 40. §5.6: every
|
|
34
|
+
* truncation marker in the tree is a control.
|
|
35
35
|
*
|
|
36
36
|
* Raising a limit is remembered per marker rather than globally, so opening one long array does not
|
|
37
37
|
* re-render every other one at full length, and it never lowers: a step is a step.
|
|
@@ -136,7 +136,7 @@ export function dataTypeLabel(value: unknown) {
|
|
|
136
136
|
/* THE VALUE LIST IS GONE, AND ITS ROWS ARE THE DEFINITION ROWS — `panels/signals-panel.ts`.
|
|
137
137
|
It listed every state entry with its badge and what it resolved to, one rail tab away from a
|
|
138
138
|
panel listing every state entry with its badge and how it is defined: the same names twice, and
|
|
139
|
-
you read one to understand the other.
|
|
139
|
+
you read one to understand the other. §5.6 asks for definitions and live values in one row,
|
|
140
140
|
so the definition row now carries the resolved type and expands to the value tree, and what is
|
|
141
141
|
left here is the tree WALK, the type label and the row-expansion record the merged rows read. */
|
|
142
142
|
|
|
@@ -369,12 +369,12 @@ export function registerDataExplorerCommands(
|
|
|
369
369
|
*
|
|
370
370
|
* `level: "document"`, because both belong to the open document.
|
|
371
371
|
*
|
|
372
|
-
* **This is where the State editor lives now.**
|
|
373
|
-
* editor
|
|
374
|
-
*
|
|
375
|
-
*
|
|
376
|
-
*
|
|
377
|
-
*
|
|
372
|
+
* **This is where the State editor lives now.** §5.6 says so (expanding a row opens the entry's
|
|
373
|
+
* editor), but the two halves shipped apart: the rail button was taken away to keep the DOCUMENT
|
|
374
|
+
* group at four, the merge was deferred, and the editor was left reachable only by typing its name
|
|
375
|
+
* into the palette. So the one surface for declaring a state variable — or a component property,
|
|
376
|
+
* which is a state entry with a default — became unfindable, which is a capability lost rather than
|
|
377
|
+
* a control moved.
|
|
378
378
|
*
|
|
379
379
|
* Defining and watching are the same task interrupted: you add an entry, then look at what it
|
|
380
380
|
* resolved to. Two panels made that two panels.
|
package/src/panels/data-grid.ts
CHANGED
|
@@ -205,7 +205,7 @@ let actionsState: ActionsState = { pushing: false, testResult: null, testing: nu
|
|
|
205
205
|
/**
|
|
206
206
|
* The row mounted in each host the settings machinery has handed us.
|
|
207
207
|
*
|
|
208
|
-
* Keyed by the host node, because one settings pane per stage means one host per stage (§
|
|
208
|
+
* Keyed by the host node, because one settings pane per stage means one host per stage (§18) and a
|
|
209
209
|
* module-level single would make the second pane's row replace the first's.
|
|
210
210
|
*/
|
|
211
211
|
const mounted = new Map<HTMLElement, DataActionsSurfaceHandle>();
|
package/src/panels/editors.ts
CHANGED
|
@@ -5,13 +5,13 @@
|
|
|
5
5
|
* It used to take over the canvas: `renderFunctionEditor` cleared `canvasWrap`, dropped every
|
|
6
6
|
* canvas panel and mounted Monaco over the stage, so the page whose handler you were writing was
|
|
7
7
|
* the one thing you could not see while writing it. It is a surface of the Bottom dock's **Logic**
|
|
8
|
-
* tab now (
|
|
9
|
-
*
|
|
8
|
+
* tab now (§16.3); `panels/formula-workspace.ts` owns that tab's record and calls the two exports
|
|
9
|
+
* below — {@link syncFunctionEditor} from the panel's `afterRender`, and
|
|
10
10
|
* {@link closeFunctionEditor} for its Close. The container is no longer one of them: the Logic tab
|
|
11
11
|
* is a Jx document (`surfaces/logic-workspace.json`) and it draws the empty
|
|
12
|
-
* {@link CODE_HOST_SELECTOR} node itself
|
|
13
|
-
*
|
|
14
|
-
*
|
|
12
|
+
* {@link CODE_HOST_SELECTOR} node itself: an island, as studio-ui-guidelines.md §9.4 defines one.
|
|
13
|
+
* The canvas keeps rendering the page underneath the dock; `canvas/canvas-render.ts` no longer
|
|
14
|
+
* knows this surface exists.
|
|
15
15
|
*
|
|
16
16
|
* **The mount is driven by the DOM, not by a render call.** A dock tab's body is re-rendered
|
|
17
17
|
* whenever anything it reads changes, and a repaint will happily replace the container element out
|
|
@@ -178,9 +178,9 @@ export function syncFunctionEditor(host: HTMLElement): void {
|
|
|
178
178
|
* work was the one that destroyed it.
|
|
179
179
|
*
|
|
180
180
|
* The takeover never saw this because it was torn down by exactly one thing (closing it, which
|
|
181
|
-
* happened to be slower than the debounce). A dock tab is torn down by five, four of them new
|
|
182
|
-
*
|
|
183
|
-
* still the current editor?" is passed by a timer that fires after a REMOUNT.
|
|
181
|
+
* happened to be slower than the debounce). A dock tab is torn down by five, four of them new with
|
|
182
|
+
* the pane grid (§18). Handling it here rather than guarding inside each callback is deliberate: a
|
|
183
|
+
* guard on "is this still the current editor?" is passed by a timer that fires after a REMOUNT.
|
|
184
184
|
*
|
|
185
185
|
* **But cancelling alone is the same loss with the alarm switched off.** The armed commit IS the
|
|
186
186
|
* last half-second of typing; dropping it means the pre-typing body survives instead of an empty
|
|
@@ -265,15 +265,14 @@ export function mountElementsPanel(ctx: NavigatorPanelContext, host: HTMLElement
|
|
|
265
265
|
/**
|
|
266
266
|
* Contribute the Insert panel — **off the rail** (`rail: false`).
|
|
267
267
|
*
|
|
268
|
-
* §
|
|
269
|
-
*
|
|
270
|
-
*
|
|
271
|
-
*
|
|
272
|
-
*
|
|
273
|
-
* four.
|
|
268
|
+
* §5.1 keeps Insert off the Navigator rail because it is not a view of anything: it is an insert
|
|
269
|
+
* palette, and a palette belongs at the caret (slash menu), on the canvas (`+`) and behind ⌘⇧A, all
|
|
270
|
+
* of which are the Insert command family. The record survives so the surface stays reachable —
|
|
271
|
+
* `view.setActivity {tab:"insert"}`, the palette, and the screenshot pipeline all still address it
|
|
272
|
+
* — and giving up its rail slot is what keeps the DOCUMENT group at four.
|
|
274
273
|
*
|
|
275
|
-
* `level: "document"`, per
|
|
276
|
-
*
|
|
274
|
+
* `level: "document"`, per §13.2's own worked example: it READS the project's component registry
|
|
275
|
+
* and WRITES the document tree.
|
|
277
276
|
*/
|
|
278
277
|
export function registerInsertPanel(): void {
|
|
279
278
|
registerPanel({
|
|
@@ -68,7 +68,7 @@ export function staleSelectionMessage(): string {
|
|
|
68
68
|
*
|
|
69
69
|
* Quick Access is reached through a lazy import on purpose: this module is imported by every panel
|
|
70
70
|
* in the shell, and a static edge would drag the file browser, the format host and the recents
|
|
71
|
-
* store into all of them.
|
|
71
|
+
* store into all of them. A command id would replace the closure.
|
|
72
72
|
*/
|
|
73
73
|
export function openPageAction(label = "Open a page…"): EmptyStateAction {
|
|
74
74
|
return {
|
|
@@ -3,11 +3,11 @@
|
|
|
3
3
|
* The Logic tab — everything about how this element BEHAVES. The FLOW behind the `logic-panel`
|
|
4
4
|
* surface.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
6
|
+
* The inspector is split by task rather than by data type (§6), and this is the tab that gained by
|
|
7
|
+
* it. Wiring a `$switch`, wiring a repeater to a collection and wiring a click handler are one job;
|
|
8
|
+
* they were three, split across two tabs, because a `$switch` is stored as a property and a click
|
|
9
|
+
* handler is stored as a property-shaped function, and the old split followed the storage. So Logic
|
|
10
|
+
* is now:
|
|
11
11
|
*
|
|
12
12
|
* - **Repeating list** — the `$prototype: "Array"` node's items / filter / sort, and its template.
|
|
13
13
|
* - **Condition** — the `$switch` expression and its cases.
|
|
@@ -28,8 +28,9 @@
|
|
|
28
28
|
* Three things the conversion settled, and each was a defect rather than a translation:
|
|
29
29
|
*
|
|
30
30
|
* - **A binding had two controls that did the same thing.** The provenance chip cleared the key and
|
|
31
|
-
* the trash button beside it cleared the same key. §12.5 calls a second
|
|
32
|
-
* there is one control now, and it carries the dot that says whether
|
|
31
|
+
* the trash button beside it cleared the same key. studio-ui-guidelines.md §12.5 calls a second
|
|
32
|
+
* list of actions a defect; there is one control now, and it carries the dot that says whether
|
|
33
|
+
* the selection agrees.
|
|
33
34
|
* - **The sections would not stay shut.** Repeating list, Condition and Events were rendered with a
|
|
34
35
|
* hard-coded `open`, so collapsing one lasted until the next repaint. They persist through
|
|
35
36
|
* `inspectorSections` like every other section in the dock.
|
|
@@ -114,9 +115,9 @@ import type {
|
|
|
114
115
|
* The events worth SUGGESTING — not the events an element may have.
|
|
115
116
|
*
|
|
116
117
|
* These ten were a closed `sp-picker`, so `ondragover`, `onpointerdown`, `onwheel`, `onpaste` and
|
|
117
|
-
* every custom event a component emits were unbindable from the Inspector
|
|
118
|
-
*
|
|
119
|
-
*
|
|
118
|
+
* every custom event a component emits were unbindable from the Inspector. An event name is typed,
|
|
119
|
+
* not picked (§6.1): the list is still ten, and it is a list of SUGGESTIONS now — the menu's last
|
|
120
|
+
* row asks for any other name.
|
|
120
121
|
*/
|
|
121
122
|
export const EVENT_NAMES = [
|
|
122
123
|
"onclick",
|
|
@@ -159,7 +160,7 @@ function seedForHandlerMode(mode: SlotMode, functionDefs: [string, unknown][]):
|
|
|
159
160
|
// ─── The Mixed contract ──────────────────────────────────────────────────────
|
|
160
161
|
|
|
161
162
|
/**
|
|
162
|
-
* The Logic tab's Mixed contract (§6.
|
|
163
|
+
* The Logic tab's Mixed contract (§6.7), stated once because it is a judgement, not a mechanism.
|
|
163
164
|
*
|
|
164
165
|
* Wiring splits in two, and a multi-selection treats the halves differently:
|
|
165
166
|
*
|
|
@@ -917,7 +918,7 @@ function watch(): void {
|
|
|
917
918
|
|
|
918
919
|
// ─── The menus ───────────────────────────────────────────────────────────────
|
|
919
920
|
|
|
920
|
-
/** The rung picker for a bindable row: every source this position permits, one action away (§6.
|
|
921
|
+
/** The rung picker for a bindable row: every source this position permits, one action away (§6.6). */
|
|
921
922
|
function openSourceMenu(key: string, anchor: HTMLElement): void {
|
|
922
923
|
const plan = plans.fields.get(key);
|
|
923
924
|
if (!plan || !canMove(plan.mode, plan.offered)) {
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
/// <reference lib="dom" />
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* Logic — the flow behind the Bottom dock's Logic tab.
|
|
4
4
|
*
|
|
5
5
|
* **What changed, and why it is the whole point.** Both of these surfaces used to TAKE OVER the
|
|
6
6
|
* canvas: `TabUi.editingFormula` (this file) and `TabUi.editingFunction` (`panels/editors.ts`) each
|
|
7
7
|
* cleared `canvasWrap`, dropped every canvas panel and drew themselves over the stage. So the one
|
|
8
8
|
* artefact whose values you are authoring — the page — was the one thing you could not see while
|
|
9
9
|
* authoring them, and the workspace's own data rail existed to paper over it: a frozen snapshot of
|
|
10
|
-
* a scope, shown because the live thing had just been unmounted.
|
|
11
|
-
*
|
|
12
|
-
*
|
|
10
|
+
* a scope, shown because the live thing had just been unmounted. No editor may hide the page it
|
|
11
|
+
* computes (§16.3). They are a **tab of the Bottom dock** now, which sits under the pane grid, so
|
|
12
|
+
* the page renders beside the formula and keeps rendering while you edit it.
|
|
13
13
|
*
|
|
14
14
|
* **A dock tab is not a reparented takeover.** The surface has to work at dock height, so the
|
|
15
15
|
* header is one row, the chip pipeline and the result are single lines, and the data rail is a
|
|
@@ -93,7 +93,10 @@ export type LogicTarget =
|
|
|
93
93
|
| { surface: "function"; editing: FunctionEditDef }
|
|
94
94
|
| { surface: "formula"; editing: FormulaEditDef };
|
|
95
95
|
|
|
96
|
-
/**
|
|
96
|
+
/**
|
|
97
|
+
* The sentence the tab shows with nothing open in it — what the region is FOR
|
|
98
|
+
* (studio-ui-guidelines.md §11.1).
|
|
99
|
+
*/
|
|
97
100
|
const NOTHING_OPEN = "Open a formula or a function to edit it here, beside the page it computes.";
|
|
98
101
|
|
|
99
102
|
/** The target names a document position that holds no expression: say so, keep the header. */
|
|
@@ -128,7 +128,10 @@ export interface FmRowView {
|
|
|
128
128
|
label: string;
|
|
129
129
|
/** Which control the row draws. */
|
|
130
130
|
kind: "text" | "number" | "boolean" | "select" | "media";
|
|
131
|
-
/**
|
|
131
|
+
/**
|
|
132
|
+
* Whether the value is set on this document — studio-ui-guidelines.md §4.2's dot, and the row's
|
|
133
|
+
* only clear affordance.
|
|
134
|
+
*/
|
|
132
135
|
isSet: boolean;
|
|
133
136
|
/** The text, number or chosen value, always as a string. Empty for a boolean row. */
|
|
134
137
|
value: string;
|
|
@@ -1,25 +1,30 @@
|
|
|
1
1
|
/// <reference lib="dom" />
|
|
2
2
|
/**
|
|
3
|
-
* The Document Header card
|
|
3
|
+
* The Document Header card — the artefact's own header, drawn IN the stage.
|
|
4
4
|
*
|
|
5
5
|
* It replaces the old "Properties" bar, which was a fourth full-width band that **appeared and
|
|
6
6
|
* vanished as a side effect of the canvas mode** with no control to summon it, and which showed
|
|
7
7
|
* nothing at all unless `findContentTypeSchema` matched the document to a content collection — so
|
|
8
8
|
* it never appeared on the default home page, the one document every new author opens first.
|
|
9
9
|
*
|
|
10
|
-
*
|
|
10
|
+
* Two gates are gone, and each was a lie about what the card is for:
|
|
11
11
|
*
|
|
12
12
|
* - The **collection gate** (`if (!fieldSet?.collection)`) — a page's `title` is frontmatter whether
|
|
13
13
|
* or not a collection schema describes it;
|
|
14
|
-
* - The **mode gate** (`getCanvasMode() === "edit"`) — the header is part of the document, not a view
|
|
15
|
-
* of it, so switching to Design must not delete it;
|
|
16
14
|
* - The **document-mode gate** (`doc.mode === "content"`) — a JSON page carries `title` and `$head`
|
|
17
15
|
* directly on the root node, and it has a header for exactly the same reason.
|
|
18
16
|
*
|
|
19
|
-
* What it renders instead: **any** document with frontmatter or `$head`, in every named layout
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
17
|
+
* What it renders instead: **any** document with frontmatter or `$head`, in every named layout —
|
|
18
|
+
* Title, Route, the layout picker, the schema-and-frontmatter field list, the door to Search
|
|
19
|
+
* appearance and a "Raw head tags" disclosure. `hasDocumentHeader` is this module's whole
|
|
20
|
+
* predicate, and it is a fact about the DOCUMENT.
|
|
21
|
+
*
|
|
22
|
+
* **The canvas mode is the STAGE's question, and this module still takes none.** The stage draws a
|
|
23
|
+
* host for the card in Edit only (`wantsDocHeader` in `canvas/canvas-render.ts`): Design gives its
|
|
24
|
+
* artboards the whole pane, and the Navigator's Page panel carries the same fields in every mode,
|
|
25
|
+
* so nothing is out of reach in either. The old mode gate lived HERE, as a `getCanvasMode()` check
|
|
26
|
+
* the card ran to decide whether to exist; the decision now has one owner, the frame that draws the
|
|
27
|
+
* page, and this module draws into whatever host it is handed.
|
|
23
28
|
*
|
|
24
29
|
* **One reserved-key policy, one `collectFmFields` call.** The two field sets this card merges used
|
|
25
30
|
* to disagree: this module passed an empty reserved set and `head-panel.ts` passed `{title}`, so
|
|
@@ -29,7 +34,8 @@
|
|
|
29
34
|
* **The card has no host of its own.** `#frontmatter-panel` — the grid row, the `hidden` div, the
|
|
30
35
|
* `frontmatterPanelEl` ref and the 40vh cap that came with them — is deleted. The STAGE renders the
|
|
31
36
|
* host now ({@link attachDocumentHeaderHost}, called from the stage document's `onNodeCreated` in
|
|
32
|
-
* `canvas/canvas-render.ts`), so the card
|
|
37
|
+
* `canvas/canvas-render.ts`), so the card is docked above the page, as wide as the pane, rather
|
|
38
|
+
* than in a band the shell drew above every stage.
|
|
33
39
|
*
|
|
34
40
|
* **The card is a Jx document now** (`src/surfaces/doc-header.json`), and this module is the flow
|
|
35
41
|
* behind it: it decides which document a pane's card is drawn for, which rows that document has,
|
|
@@ -55,7 +61,7 @@
|
|
|
55
61
|
* ids behind a `#/content/<type>` reference are a read (`ui/form-controls.ts`), so the card draws
|
|
56
62
|
* its own control for each and calls the owner for the part that is not markup. Neither module's
|
|
57
63
|
* lit template is interpolated here — a document and a lit template cannot share a container, and
|
|
58
|
-
* §9.4 forbids the mix outright.
|
|
64
|
+
* studio-ui-guidelines.md §9.4 forbids the mix outright.
|
|
59
65
|
*
|
|
60
66
|
* @docs studio/editing/frontmatter
|
|
61
67
|
*/
|
|
@@ -170,8 +176,8 @@ export function attachDocumentHeaderHost(paneId: string, el: HTMLElement | null)
|
|
|
170
176
|
/* There is no `documentHeaderHost` getter any more, and its absence is the point.
|
|
171
177
|
It existed for ONE caller: the stage's lit `ref`, which was told about a removal WITHOUT being
|
|
172
178
|
told which node had gone, so it had to read the host back and ask whether it was still connected
|
|
173
|
-
before deciding the report was about the host it held. `surfaces/canvas-stage.json` states
|
|
174
|
-
|
|
179
|
+
before deciding the report was about the host it held. `surfaces/canvas-stage.json` states the
|
|
180
|
+
card's slot as a view, so a frame that draws no card simply announces none and `renderCanvasImpl`
|
|
175
181
|
releases the slot in one place — there is nothing left to settle after the fact, and a getter
|
|
176
182
|
whose only reader is gone is a fact about the module nobody is entitled to. */
|
|
177
183
|
|
|
@@ -360,12 +366,6 @@ function viewFor(tab: Tab, paneId: string, card: HeaderCard): DocHeaderView {
|
|
|
360
366
|
return {
|
|
361
367
|
collection: collection ? collection.name : "Document",
|
|
362
368
|
hasRoute: route !== null,
|
|
363
|
-
/* The stage's two placements, read off the host it handed over. In Edit the card is a block of
|
|
364
|
-
the document's own column; in Design it is pinned above a pan/zoom surface at 1:1, and only
|
|
365
|
-
that one wants the band's edge rather than the card's. `surfaces/canvas-stage.json` says the
|
|
366
|
-
same thing from the STAGE's side, which a document's own scoped style block cannot answer —
|
|
367
|
-
and it says it on `data-placement` rather than on a class, because the stage emits none. */
|
|
368
|
-
placement: card.el.dataset["placement"] === "pinned" ? "pinned" : "in-column",
|
|
369
369
|
rawEntries: raw,
|
|
370
370
|
rawOpen: _rawOpen.has(tab.id),
|
|
371
371
|
rawState: raw.length === 0 ? "empty" : "list",
|
package/src/panels/git-panel.ts
CHANGED
|
@@ -23,8 +23,8 @@
|
|
|
23
23
|
* light dismissal and Escape, so both the markup and the flag go.
|
|
24
24
|
*
|
|
25
25
|
* The third is the empty states. A document cannot call a lit helper, so the three this panel used
|
|
26
|
-
* to render are drawn in the document — under the same §11 copy rules, and,
|
|
27
|
-
* buttons, with the buttons still real. This was the last caller that passed
|
|
26
|
+
* to render are drawn in the document — under the same studio-ui-guidelines.md §11 copy rules, and,
|
|
27
|
+
* for the two that offer buttons, with the buttons still real. This was the last caller that passed
|
|
28
28
|
* `EmptyStateAction.icon`, a `TemplateResult` of `sp-icon-*`, and the field went with it.
|
|
29
29
|
*
|
|
30
30
|
* @docs studio/publish/source-control
|
|
@@ -412,9 +412,9 @@ let _deps: GitPanelDeps = {};
|
|
|
412
412
|
*
|
|
413
413
|
* A `<select>` always holds one of its options, and picking "New branch…" must put the control back
|
|
414
414
|
* on the current branch when the dialog is dismissed. A document's binding only writes when the
|
|
415
|
-
* SCOPE MOVES (guidelines §9.3), so writing the current branch over a scope that
|
|
416
|
-
* would be a no-op and the control would keep saying "New branch…". Announcing what
|
|
417
|
-
* actually chose first is what makes putting it back a change.
|
|
415
|
+
* SCOPE MOVES (studio-ui-guidelines.md §9.3), so writing the current branch over a scope that
|
|
416
|
+
* already said it would be a no-op and the control would keep saying "New branch…". Announcing what
|
|
417
|
+
* the reader actually chose first is what makes putting it back a change.
|
|
418
418
|
*/
|
|
419
419
|
let _branchOverride: string | null = null;
|
|
420
420
|
|
|
@@ -700,8 +700,9 @@ async function discardFile(path: string): Promise<void> {
|
|
|
700
700
|
* The split button's second half.
|
|
701
701
|
*
|
|
702
702
|
* The kit menu, not a `<div>` of this panel's own: `openMenu()` owns the popover, the roving focus,
|
|
703
|
-
* the light dismissal and Escape, and it is the answer this shell already settled on
|
|
704
|
-
* row, because there is one thing "Commit and sync" can do
|
|
703
|
+
* the light dismissal and Escape, and it is the answer this shell already settled on
|
|
704
|
+
* (studio-ui-guidelines.md §8.4). One row, because there is one thing "Commit and sync" can do
|
|
705
|
+
* differently.
|
|
705
706
|
*/
|
|
706
707
|
function openCommitMenu(anchor: HTMLElement): void {
|
|
707
708
|
/* Lazily imported for the reason `panels/problems-panel.ts` and `panels/empty-state.ts` already
|
|
@@ -978,9 +979,10 @@ export function sourceControlCommands(): AnyCommand[] {
|
|
|
978
979
|
// `when` already asked about the project; an `enablement` that re-asks is the same rule
|
|
979
980
|
// Written twice, and the two places drift.
|
|
980
981
|
enablement: (ctx) => !ctx.project.isRepo,
|
|
981
|
-
/* No `aiTool`, by §12.4's third deletion rule: outside the tree,
|
|
982
|
-
has no read to judge by. The git family is reconsidered
|
|
983
|
-
a record — without it the agent could not ship its own
|
|
982
|
+
/* No `aiTool`, by studio-ui-guidelines.md §12.4's third deletion rule: outside the tree,
|
|
983
|
+
irreversible, and the model has no read to judge by. The git family is reconsidered
|
|
984
|
+
together when `git.commit` becomes a record — without it the agent could not ship its own
|
|
985
|
+
edits anyway. */
|
|
984
986
|
run: async () => {
|
|
985
987
|
await initRepository();
|
|
986
988
|
},
|
|
@@ -1003,8 +1005,8 @@ export function sourceControlCommands(): AnyCommand[] {
|
|
|
1003
1005
|
requires: "a project tracked by git",
|
|
1004
1006
|
when: (ctx) => ctx.project.open,
|
|
1005
1007
|
enablement: (ctx) => ctx.project.isRepo,
|
|
1006
|
-
/* No `aiTool`, by §12.4's third deletion rule: it creates a
|
|
1007
|
-
account. Same family as `git.init`. */
|
|
1008
|
+
/* No `aiTool`, by studio-ui-guidelines.md §12.4's third deletion rule: it creates a
|
|
1009
|
+
repository on the person's account. Same family as `git.init`. */
|
|
1008
1010
|
run: async () => {
|
|
1009
1011
|
await createGithubRepository({ projectName: projectState?.name || "my-project" });
|
|
1010
1012
|
},
|
|
@@ -1019,7 +1021,8 @@ export function sourceControlCommands(): AnyCommand[] {
|
|
|
1019
1021
|
requires: "a project tracked by git",
|
|
1020
1022
|
when: (ctx) => ctx.project.open,
|
|
1021
1023
|
enablement: (ctx) => ctx.project.isRepo,
|
|
1022
|
-
/* No `aiTool`, by §12.4's third deletion rule. Same family as
|
|
1024
|
+
/* No `aiTool`, by studio-ui-guidelines.md §12.4's third deletion rule. Same family as
|
|
1025
|
+
`git.init`. */
|
|
1023
1026
|
run: async () => {
|
|
1024
1027
|
await pushCurrentBranch();
|
|
1025
1028
|
},
|
|
@@ -1073,6 +1076,9 @@ export function registerGitPanel(): void {
|
|
|
1073
1076
|
registerPanel({
|
|
1074
1077
|
id: "git",
|
|
1075
1078
|
title: "Source Control",
|
|
1079
|
+
/* The full title is 71px against the rail's 48px label box. The header, the tooltip and the
|
|
1080
|
+
accessible name keep it; only the words under the glyph shorten. */
|
|
1081
|
+
railLabel: "Source",
|
|
1076
1082
|
level: "project",
|
|
1077
1083
|
dock: "navigator",
|
|
1078
1084
|
// A KEY into the kit's icon manifest, not a tag: this one resolves to
|
package/src/panels/head-panel.ts
CHANGED
|
@@ -480,8 +480,8 @@ export interface SeoField extends ResolvedHeadField {
|
|
|
480
480
|
* Character budgets, in the only role a number is allowed here: a counter's reference line.
|
|
481
481
|
*
|
|
482
482
|
* There is deliberately no score. A single figure out of a hundred aggregates unrelated facts into
|
|
483
|
-
* a verdict, and the verdict is what gets optimised (
|
|
484
|
-
*
|
|
483
|
+
* a verdict, and the verdict is what gets optimised (§16.6). A count beside a limit says the same
|
|
484
|
+
* thing without pretending to rank it.
|
|
485
485
|
*/
|
|
486
486
|
export const SEO_LIMITS: Readonly<Record<string, number>> = {
|
|
487
487
|
description: 160,
|
|
@@ -589,7 +589,7 @@ function hasTitleEntry(layers: HeadLayers): boolean {
|
|
|
589
589
|
*
|
|
590
590
|
* Every one of them states a consequence rather than a grade, and every one is checkable against
|
|
591
591
|
* `head-merger.ts`. "Missing" is decided on the MERGED value, so a page that inherits a description
|
|
592
|
-
* from the site is never told it has none — the defect §
|
|
592
|
+
* from the site is never told it has none — the defect site-architecture.md §8.6 names by name.
|
|
593
593
|
*
|
|
594
594
|
* @param {SeoPreview} preview — `warnings` is ignored; this computes it.
|
|
595
595
|
* @param {HeadLayers} layers
|
|
@@ -875,8 +875,8 @@ export function buildHeadDoc(doc: JxMutableNode, fm: Record<string, unknown>): J
|
|
|
875
875
|
* mutation it makes — Title, Clear title, the Layout picker — as does Search appearance, which is
|
|
876
876
|
* where the head fields went and which takes its tab the same way. The card is drawn per pane, so
|
|
877
877
|
* on a markdown page the card in one pane retitled the document in the other. The comment beside
|
|
878
|
-
* the card's JSON branch has claimed since
|
|
879
|
-
* only, and this is the half that was left.
|
|
878
|
+
* the card's JSON branch has claimed since the pane grid landed that this was fixed; the fix
|
|
879
|
+
* reached the JSON branch only, and this is the half that was left.
|
|
880
880
|
*
|
|
881
881
|
* @param {Tab | null} tab The document to commit into.
|
|
882
882
|
* @param {() => void} rerender
|
|
@@ -1174,8 +1174,8 @@ function customEntries(head: JxHeadEntry[]): PageTagRow[] {
|
|
|
1174
1174
|
* Everything the panel says about one document, and the commit table behind it.
|
|
1175
1175
|
*
|
|
1176
1176
|
* `activeTab.value` is read HERE and nowhere below it: the Navigator's Page panel is an app-level
|
|
1177
|
-
* surface that shows the focused document by definition
|
|
1178
|
-
*
|
|
1177
|
+
* surface that shows the focused document by definition, and spelling that out once at the top is
|
|
1178
|
+
* what lets every helper under it take a tab instead of asking for one.
|
|
1179
1179
|
*/
|
|
1180
1180
|
function view(ctx: PagePanelContext): PagePanelView {
|
|
1181
1181
|
_commits.clear();
|
|
@@ -1454,9 +1454,8 @@ export function renderHeadTemplate(_against: PagePanelContext): typeof nothing {
|
|
|
1454
1454
|
* Contribute the Page panel.
|
|
1455
1455
|
*
|
|
1456
1456
|
* `level: "document"` — title, description, social card and custom `$head` entries are the open
|
|
1457
|
-
* document's. The id is `page` now: "head" named an HTML element, and §
|
|
1458
|
-
* the surface Page.
|
|
1459
|
-
* record is what keeps the surface addressable under one name.
|
|
1457
|
+
* document's. The id is `page` now: "head" named an HTML element, and §5.1's Document group calls
|
|
1458
|
+
* the surface Page. The record is what keeps the surface addressable under one name.
|
|
1460
1459
|
*/
|
|
1461
1460
|
export function registerPagePanel(): void {
|
|
1462
1461
|
registerPanel({
|