@jxsuite/studio 5.3.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-nwnwdm6p.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-4rzvmp0m.js → content-source-jt7rbcbc.js} +22 -22
- package/dist/chunks/{convert-to-repeater-jxsv62v7.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-2mrptyek.js → extension-sections-r73an5s6.js} +30 -29
- package/dist/chunks/{file-ops-knfqshrm.js → file-ops-3xan8mnj.js} +21 -21
- package/dist/chunks/{files-y6fr4he9.js → files-egsb0ry8.js} +28 -28
- package/dist/chunks/{format-host-1k4qrcqd.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-2rkrsjva.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-a7b87n2c.js → grid-view-qaqer9kr.js} +24 -24
- package/dist/chunks/{icons-yy10wk9r.js → icons-drxq9q10.js} +8 -2
- package/dist/chunks/{iframe-host-scpw01h8.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/layers-panel-83a16ytx.js +41 -0
- package/dist/chunks/{layers-jnvdbqva.js → layers-s6mc01ry.js} +3 -3
- package/dist/chunks/{media-picker-f66nav16.js → media-picker-nhn6rv4w.js} +11 -11
- package/dist/chunks/{menu-1dfhry4s.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-km6abc6q.js → monaco-setup-gsjdysze.js} +6 -6
- 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/{studio-ze46gzjh.js → studio-01269reb.js} +7 -7
- 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-d1n2bykn.js → studio-3nprwbd9.js} +117 -25
- package/dist/chunks/{studio-4c041r8y.js → studio-40z39dme.js} +3 -3
- package/dist/chunks/{studio-151w0xnh.js → studio-482eeazk.js} +20 -20
- package/dist/chunks/{studio-cgprcdxn.js → studio-4998spet.js} +10 -9
- package/dist/chunks/{studio-nq5yf5mp.js → studio-557bmn0x.js} +2 -2
- package/dist/chunks/{studio-rtskkm43.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-6gryj0sg.js → studio-9vsvz7w7.js} +6 -6
- package/dist/chunks/{studio-50wfwy44.js → studio-9wm0xzpf.js} +19 -19
- package/dist/chunks/{studio-0j7r7s9g.js → studio-ag3z6shb.js} +10 -4
- package/dist/chunks/studio-aj9drheq.js +177 -0
- package/dist/chunks/{studio-xajk70w0.js → studio-apv9x70c.js} +189 -130
- package/dist/chunks/{studio-c04nzbby.js → studio-b9q3znz8.js} +2 -2
- package/dist/chunks/{studio-nfx354t1.js → studio-bh47w0cy.js} +9 -10
- package/dist/chunks/{studio-gk2twyh4.js → studio-dgdm6vvt.js} +264 -52
- package/dist/chunks/{studio-gtfq1dkz.js → studio-dwdcr2e8.js} +4 -4
- package/dist/chunks/{studio-nqgawfks.js → studio-fbcyz234.js} +146 -139
- package/dist/chunks/{studio-27q131j3.js → studio-fqpkpq1t.js} +7 -4
- package/dist/chunks/{studio-c0qgc3tn.js → studio-fy320dfc.js} +62 -68
- package/dist/chunks/{studio-zjjde71a.js → studio-gjj4bbfx.js} +2 -2
- package/dist/chunks/{studio-g33v4fe9.js → studio-jfhxy8h3.js} +7 -7
- package/dist/chunks/{studio-ab87phj1.js → studio-kwewmhhq.js} +4 -4
- package/dist/chunks/{studio-7rrb1esn.js → studio-m58xn8at.js} +25 -24
- package/dist/chunks/{studio-fzjx96t2.js → studio-mfkh1q8d.js} +17 -17
- package/dist/chunks/{studio-drg8qj9k.js → studio-mrh0a92f.js} +17 -17
- package/dist/chunks/{studio-jt27ta6x.js → studio-mt79tn56.js} +3 -3
- package/dist/chunks/{studio-b66rsh78.js → studio-ne593z1j.js} +38 -31
- package/dist/chunks/{studio-h4nvnjvz.js → studio-ptfcxkz5.js} +418 -232
- package/dist/chunks/{studio-dd1qqkry.js → studio-qxye31h7.js} +7 -7
- package/dist/chunks/{studio-ye9drbk8.js → studio-rav5bpmp.js} +73 -52
- package/dist/chunks/{studio-6kvgrkrp.js → studio-rwmmbrth.js} +6 -6
- package/dist/chunks/{studio-b7xacrwe.js → studio-sceg8ws0.js} +8 -8
- package/dist/chunks/{studio-msc1ee1m.js → studio-sjas5b3a.js} +19 -13
- package/dist/chunks/{studio-a65w20ex.js → studio-vd67b66d.js} +3 -3
- package/dist/chunks/{studio-7144epdr.js → studio-w475cbf9.js} +10 -10
- package/dist/chunks/{studio-4f3psrk1.js → studio-w7gpcvfj.js} +9 -9
- package/dist/chunks/{studio-nsgw7dbk.js → studio-xrbfdxgk.js} +7 -7
- package/dist/chunks/{studio-ke09tn9k.js → studio-y49b6mjv.js} +35 -35
- package/dist/chunks/{studio-j0w60gft.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-np10mayv.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 +18 -16
- package/dist/studio.css +956 -139
- package/dist/studio.js +1453 -830
- 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 +15 -14
- 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/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/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 +46 -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 +2 -2
- package/src/surfaces/formula-palette.ts +1 -1
- 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/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 +5 -5
- 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 +1 -1
- 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-1wnsqn5d.js +0 -42
- package/dist/chunks/layers-panel-73gfkcga.js +0 -41
- package/dist/chunks/publish-panel-z1zd2da1.js +0 -27
- package/dist/chunks/quick-search-zdv7h8ht.js +0 -47
- package/dist/chunks/right-panel-889vbnm5.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
|
@@ -49,8 +49,8 @@
|
|
|
49
49
|
"fontSize": "var(--jx-text-md)",
|
|
50
50
|
"color": "var(--fg-dim)"
|
|
51
51
|
},
|
|
52
|
-
"& [part=\"
|
|
53
|
-
"$description": "A commit the broker refused, said above the list the reader is still looking at. It is not an announcement of the same thing twice: the list survives a refusal, because listing again is not what would fix an account Cloudflare will not accept, so the reason has to sit beside the rows that are still on offer.",
|
|
52
|
+
"& [part=\"failure\"]": {
|
|
53
|
+
"$description": "A commit the broker refused, said above the list the reader is still looking at. It is not an announcement of the same thing twice: the list survives a refusal, because listing again is not what would fix an account Cloudflare will not accept, so the reason has to sit beside the rows that are still on offer. It is `failure` rather than `error` because every kit field draws a permanent, empty `[part=\"error\"]` of its own, and the kit is light DOM: a rule on that name here would reach any field this dialog ever holds.",
|
|
54
54
|
"margin": "0",
|
|
55
55
|
"fontSize": "var(--jx-text-md)",
|
|
56
56
|
"color": "var(--danger)"
|
|
@@ -77,19 +77,22 @@
|
|
|
77
77
|
"borderRadius": "var(--radius)"
|
|
78
78
|
},
|
|
79
79
|
"& [part=\"text\"]": {
|
|
80
|
-
"$description": "`min-width: 0`
|
|
80
|
+
"$description": "`min-width: 0` lets the column shrink below its content, so the name and id reflow inside the row instead of pushing its own button off the end of it; what lets them reflow is their own `overflow-wrap`. Nothing here ellipsizes. Unlike Preferences › Accounts, the row does not wrap its button onto a line of its own: in an `sm` dialog the arithmetic (a 120px basis, the gap and a 105px button against a 236px row) would wrap every row at rest.",
|
|
81
81
|
"display": "flex",
|
|
82
82
|
"flexDirection": "column",
|
|
83
83
|
"gap": "var(--jx-space-1)",
|
|
84
84
|
"minWidth": "0"
|
|
85
85
|
},
|
|
86
86
|
"& [part=\"name\"]": {
|
|
87
|
-
"
|
|
87
|
+
"$description": "`overflow-wrap: anywhere` because Cloudflare names a new account after the email that opened it (`name@example.com's Account`), and an address has no break opportunity in it.",
|
|
88
|
+
"color": "var(--fg)",
|
|
89
|
+
"overflowWrap": "anywhere"
|
|
88
90
|
},
|
|
89
91
|
"& [part=\"detail\"]": {
|
|
90
|
-
"$description": "The account id under the name. Two Cloudflare accounts may carry the same name and the id is what is stored, so the row shows both rather than the half a reader would have to guess from.",
|
|
92
|
+
"$description": "The account id under the name. Two Cloudflare accounts may carry the same name and the id is what is stored, so the row shows both rather than the half a reader would have to guess from. `overflow-wrap: anywhere` because the id is 32 hex digits with no break opportunity: it measured 203px in a 119px column and ran under the row's own button. It reflows rather than ellipsizing, because the id is the half that tells two same-named accounts apart.",
|
|
91
93
|
"fontSize": "var(--jx-text-sm)",
|
|
92
|
-
"color": "var(--fg-dim)"
|
|
94
|
+
"color": "var(--fg-dim)",
|
|
95
|
+
"overflowWrap": "anywhere"
|
|
93
96
|
}
|
|
94
97
|
},
|
|
95
98
|
"children": [
|
|
@@ -188,7 +191,7 @@
|
|
|
188
191
|
{
|
|
189
192
|
"tagName": "div",
|
|
190
193
|
"attributes": {
|
|
191
|
-
"part": "
|
|
194
|
+
"part": "failure-slot",
|
|
192
195
|
"role": "none"
|
|
193
196
|
},
|
|
194
197
|
"style": {
|
|
@@ -201,7 +204,7 @@
|
|
|
201
204
|
"true": {
|
|
202
205
|
"tagName": "p",
|
|
203
206
|
"attributes": {
|
|
204
|
-
"part": "
|
|
207
|
+
"part": "failure"
|
|
205
208
|
},
|
|
206
209
|
"textContent": "${state.failure}"
|
|
207
210
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/// <reference lib="dom" />
|
|
2
2
|
/**
|
|
3
|
-
* The Command Bar —
|
|
3
|
+
* The Command Bar — the `commandbar/*` placements of `studio-ui-guidelines.md` §12.1, rendered FROM
|
|
4
|
+
* the registry, as a document.
|
|
4
5
|
*
|
|
5
6
|
* `surfaces/commandbar.json` is the band; this module is its adapter. Every control in the band is
|
|
6
7
|
* a command, so what the document is handed is a PROJECTION of the registry rather than a list of
|
|
@@ -8,24 +9,24 @@
|
|
|
8
9
|
* `scripts/check-chrome-budget.ts`), `docks` is the three dock records with the shell's state
|
|
9
10
|
* beside them, `layouts` is the project's own layout record, and the ⬢ Studio menu is
|
|
10
11
|
* `forPlacement("commandbar/overflow")` opened on the `menu` surface. With no project open the same
|
|
11
|
-
* document renders; the records' own `when` clauses empty it (§
|
|
12
|
-
*
|
|
12
|
+
* document renders; the records' own `when` clauses empty it (§13.1: enablement is a predicate with
|
|
13
|
+
* a sentence, never a second template).
|
|
13
14
|
*
|
|
14
15
|
* What is decided here, and nowhere in the document:
|
|
15
16
|
*
|
|
16
17
|
* - {@link commandTooltip}: the title, plus its chord formatted for THIS platform by `keymap.format`,
|
|
17
18
|
* or plus the `requires` sentence when the record is off — so no control is ever permanently dead
|
|
18
19
|
* with no explanation.
|
|
19
|
-
* - The **Command Center pill**
|
|
20
|
+
* - The **Command Center pill** is the app's address bar: `◈ project › document › selection`,
|
|
20
21
|
* right-aligned ⌘K, each segment opening the palette pre-scoped. It gives Studio a persistent
|
|
21
22
|
* project name — the desktop titlebar is `titleBarStyle:"hidden"`.
|
|
22
23
|
* - The window controls, which are the one thing in the band that is not an action, and whose ORDER
|
|
23
24
|
* is the platform's.
|
|
24
25
|
*
|
|
25
|
-
* **Retired, with a name, a chord and a residue** (§2
|
|
26
|
-
* recents → the pill and `Project: Open Recent…`; `Manage` → `File: Browse Library`;
|
|
27
|
-
* the `Publish:` family; `Sync Project` → Source Control. The five-mode switcher lives
|
|
28
|
-
* context bar and is reachable as `View: Set Canvas Mode` in the palette.
|
|
26
|
+
* **Retired, with a name, a chord and a residue** (`studio-ui-guidelines.md` §12.2): Open Project +
|
|
27
|
+
* New Project + recents → the pill and `Project: Open Recent…`; `Manage` → `File: Browse Library`;
|
|
28
|
+
* `Publish` → the `Publish:` family; `Sync Project` → Source Control. The five-mode switcher lives
|
|
29
|
+
* in the pane context bar and is reachable as `View: Set Canvas Mode` in the palette.
|
|
29
30
|
*
|
|
30
31
|
* @docs studio/interface
|
|
31
32
|
*/
|
|
@@ -553,7 +554,7 @@ function windowControls(): WindowControls | undefined {
|
|
|
553
554
|
|
|
554
555
|
/**
|
|
555
556
|
* `◈ project › document › selection`: four facts about where you are, in non-collapsible chrome
|
|
556
|
-
* (
|
|
557
|
+
* (the Command Center pill, `docs/studio/interface.md`).
|
|
557
558
|
*/
|
|
558
559
|
function projectSegments(tab: Tab | null): SegmentProjection[] {
|
|
559
560
|
const segments: SegmentProjection[] = [
|
|
@@ -837,7 +838,7 @@ export function mount(rootEl: HTMLElement, _ctx: ToolbarCtx = {}): void {
|
|
|
837
838
|
void tab.doc.dirty;
|
|
838
839
|
void tab.doc.mode;
|
|
839
840
|
// The whole SET, joined — a bare property read would not re-trigger when the selection
|
|
840
|
-
// Changes WITHIN the array, and §6.
|
|
841
|
+
// Changes WITHIN the array, and §6.7's helpers always replace it but nothing enforces that.
|
|
841
842
|
void tab.session.selection.map((path) => path.join("/")).join("|");
|
|
842
843
|
void tab.session.ui.canvasMode;
|
|
843
844
|
// Open in Browser needs a value for every route param before it can resolve a page.
|
|
@@ -185,8 +185,9 @@ export function openConvertRepeaterSurface(
|
|
|
185
185
|
setName: (value: string) => {
|
|
186
186
|
/* What the control holds, first and unconditionally. A binding only writes when the scope
|
|
187
187
|
CHANGES, so a surface that refused a value without announcing the raw one would leave the
|
|
188
|
-
field showing text the scope does not have (§9.3). The refusal
|
|
189
|
-
field rather than a rewrite of it, but the echo is what keeps
|
|
188
|
+
field showing text the scope does not have (`studio-ui-guidelines.md` §9.3). The refusal
|
|
189
|
+
here is a sentence UNDER the field rather than a rewrite of it, but the echo is what keeps
|
|
190
|
+
that true of the next one. */
|
|
190
191
|
scope.newName = value;
|
|
191
192
|
options.onName(value);
|
|
192
193
|
},
|
package/src/surfaces/dialog.json
CHANGED
|
@@ -80,11 +80,17 @@
|
|
|
80
80
|
},
|
|
81
81
|
"style": {
|
|
82
82
|
"& [part=\"message\"]": {
|
|
83
|
-
"
|
|
83
|
+
"$description": "The one part of a dialog that is text rather than interface, so it opts back in to selection. The root sets `user-select: none` and `styles/tokens.json` restates it on every `dialog`, so the headline, the labels and the buttons around this sentence stay unselectable; a message is often the thing a reader copies into a search or a bug report.",
|
|
84
|
+
"margin": "0 0 var(--jx-space-3)",
|
|
85
|
+
"userSelect": "text"
|
|
84
86
|
},
|
|
85
87
|
"& [part=\"message\"]:last-child": {
|
|
86
88
|
"margin": "0"
|
|
87
89
|
},
|
|
90
|
+
"& [part=\"island\"] > p, & [part=\"island\"] > span, & [part=\"island\"] > strong, & [part=\"island\"] > em, & [part=\"island\"] > code": {
|
|
91
|
+
"$description": "The island's own prose is the message's other form — a body richer than a sentence, written straight into the island from a lit template (studio-ui-guidelines.md §9.4) — so it is selectable for the same reason `[part=\"message\"]` is. The opt-in stops at those children because the island is ALSO the mount point for a whole document: the Open Grid picker and Push Schema's plan put their surfaces here, and `user-select` inherits, so a rule on the island itself would hand selection to every heading, source row and button they draw, which is the interface the policy exists to keep unselectable. A mounted surface roots a `div`; a message writes paragraphs and text-level spans, so the two forms are told apart by the child that arrives.",
|
|
92
|
+
"userSelect": "text"
|
|
93
|
+
},
|
|
88
94
|
"& [part=\"island\"]:empty": {
|
|
89
95
|
"display": "none"
|
|
90
96
|
},
|
package/src/surfaces/dialog.ts
CHANGED
|
@@ -16,8 +16,8 @@
|
|
|
16
16
|
*
|
|
17
17
|
* A message that is a lit template (three callers still pass one) is rendered by the caller into
|
|
18
18
|
* the document's `[part="island"]` through {@link DialogSurfaceOptions.island}, which is the island
|
|
19
|
-
* rule of studio-ui-guidelines §9.4: the decision stays with the host, the markup around it is
|
|
20
|
-
* document's.
|
|
19
|
+
* rule of `studio-ui-guidelines.md` §9.4: the decision stays with the host, the markup around it is
|
|
20
|
+
* the document's.
|
|
21
21
|
*
|
|
22
22
|
* @docs studio/interface
|
|
23
23
|
*/
|
|
@@ -1,28 +1,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://jxsuite.com/schema/v1",
|
|
3
3
|
"$id": "StudioDocHeader",
|
|
4
|
-
"$description": "The Document Header card (
|
|
4
|
+
"$description": "The Document Header card (`docs/studio/editing/frontmatter.md`) — the artefact's own header, drawn IN the stage, docked above Edit's page, once per pane. A bar naming the collection and the page's route, a column of rows, the door to Search appearance and a disclosure listing the raw head tags. ONE row vocabulary: Title, the Layout picker and every schema-driven frontmatter field are the same `row`, discriminated by `kind`, because they differ in what they COMMIT rather than in what they look like — and what they commit is `panels/frontmatter-panel.ts`'s decision, reached by the row's `key`. Nothing here knows what a content collection is, which document it is drawing, or that a page has a route: the flow hands over rows whose every field is already a string and this draws them.",
|
|
5
5
|
"tagName": "section",
|
|
6
6
|
"attributes": {
|
|
7
7
|
"part": "card",
|
|
8
8
|
"aria-label": "Document header",
|
|
9
|
-
"data-jx-region": "${state.region}"
|
|
10
|
-
"data-placement": "${state.placement}"
|
|
9
|
+
"data-jx-region": "${state.region}"
|
|
11
10
|
},
|
|
12
11
|
"style": {
|
|
13
|
-
"$description": "The twelve `.doc-header*` rules from `styles/canvas.css` plus the row vocabulary the card used to borrow from `styles/inspector.css` (`.style-row`, `.style-row-label`, `.set-dot`) and `styles/overlays.css` (`.media-picker`, `.media-picker-thumb`). The borrowed ones are TRANSCRIBED rather than shared: the card is a document now and a class it does not emit cannot style it, and the three lit panels that still draw a `.style-row` go on owning those rules until they convert. Every `--spectrum-font-size-*` reference is re-pointed at the kit's scale — a document mounted in a pane's stage is outside `<sp-theme>`, so each of them would silently have taken its hard-coded fallback and stopped following the theme. And the
|
|
12
|
+
"$description": "The twelve `.doc-header*` rules from `styles/canvas.css` plus the row vocabulary the card used to borrow from `styles/inspector.css` (`.style-row`, `.style-row-label`, `.set-dot`) and `styles/overlays.css` (`.media-picker`, `.media-picker-thumb`). The borrowed ones are TRANSCRIBED rather than shared: the card is a document now and a class it does not emit cannot style it, and the three lit panels that still draw a `.style-row` go on owning those rules until they convert. Every `--spectrum-font-size-*` reference is re-pointed at the kit's scale — a document mounted in a pane's stage is outside `<sp-theme>`, so each of them would silently have taken its hard-coded fallback and stopped following the theme. And the card has ONE shape, because it has one place: Edit docks it above the page's scroller as a band across the pane, so it is a band rather than a box. It keeps only the bottom edge that separates it from the page, because a box's border and radius would draw a card edge across a full-width strip. It used to have two placements, arriving as a `data-placement` the card keyed on, and the band look was the Design one; the attribute was read before the runtime had written it, so the band never drew.",
|
|
14
13
|
"display": "flex",
|
|
15
14
|
"flexDirection": "column",
|
|
16
15
|
"padding": "8px 12px 10px",
|
|
17
16
|
"background": "var(--bg-panel)",
|
|
18
|
-
"
|
|
19
|
-
"borderRadius": "var(--radius)",
|
|
17
|
+
"borderBottom": "1px solid var(--border)",
|
|
20
18
|
"fontFamily": "var(--jx-font-sans)",
|
|
21
|
-
"&[data-placement=\"pinned\"]": {
|
|
22
|
-
"$description": "Design draws the artboards under a pan/zoom transform, so the card is pinned above the surface at 1:1 rather than sitting in the document's own column. Pinned it is a band, not a box: it spans the stage, so the box's border and radius would draw a card edge across a full-width strip.",
|
|
23
|
-
"borderWidth": "0 0 1px",
|
|
24
|
-
"borderRadius": "0"
|
|
25
|
-
},
|
|
26
19
|
"& [part=\"bar\"]": {
|
|
27
20
|
"display": "flex",
|
|
28
21
|
"alignItems": "baseline",
|
|
@@ -48,7 +41,7 @@
|
|
|
48
41
|
"gap": "2px"
|
|
49
42
|
},
|
|
50
43
|
"& [part=\"row\"]": {
|
|
51
|
-
"$description": "§4.1's standard form row, stacked: the label sits above a control that takes the whole width. `min-width: 0` is what keeps it honest at a narrow stage (§4.6) — a field refuses to shrink below its own min-content without it, and the card is drawn inside a pane that can be half a window wide.",
|
|
44
|
+
"$description": "studio-ui-guidelines.md §4.1's standard form row, stacked: the label sits above a control that takes the whole width. `min-width: 0` is what keeps it honest at a narrow stage (studio-ui-guidelines.md §4.6) — a field refuses to shrink below its own min-content without it, and the card is drawn inside a pane that can be half a window wide.",
|
|
52
45
|
"display": "flex",
|
|
53
46
|
"flexDirection": "column",
|
|
54
47
|
"alignItems": "stretch",
|
|
@@ -64,7 +57,7 @@
|
|
|
64
57
|
"color": "var(--fg-dim)"
|
|
65
58
|
},
|
|
66
59
|
"& [part=\"chip\"]": {
|
|
67
|
-
"$description": "§4.2's set dot: a 6px accent dot, drawn only where the value is set here, that clears the value when it is pressed. It is a real `button` — it is pressable, and it is the row's only keyboard route to clearing — stripped of the chrome a button brings with it so the row still reads as a label with a dot beside it.",
|
|
60
|
+
"$description": "studio-ui-guidelines.md §4.2's set dot: a 6px accent dot, drawn only where the value is set here, that clears the value when it is pressed. It is a real `button` — it is pressable, and it is the row's only keyboard route to clearing — stripped of the chrome a button brings with it so the row still reads as a label with a dot beside it.",
|
|
68
61
|
"width": "6px",
|
|
69
62
|
"height": "6px",
|
|
70
63
|
"padding": "0",
|
|
@@ -54,7 +54,10 @@ export interface DocHeaderRow extends Record<string, unknown> {
|
|
|
54
54
|
label: string;
|
|
55
55
|
/** Which control the row draws. */
|
|
56
56
|
kind: "text" | "number" | "boolean" | "select" | "media";
|
|
57
|
-
/**
|
|
57
|
+
/**
|
|
58
|
+
* Whether the value is set on this document — studio-ui-guidelines.md §4.2's dot, and the row's
|
|
59
|
+
* only clear affordance.
|
|
60
|
+
*/
|
|
58
61
|
isSet: boolean;
|
|
59
62
|
/** The dot's accessible name and tooltip, e.g. `Clear title`. */
|
|
60
63
|
clearLabel: string;
|
|
@@ -90,8 +93,6 @@ export interface DocHeaderRawEntry extends Record<string, unknown> {
|
|
|
90
93
|
export interface DocHeaderView {
|
|
91
94
|
/** The region id the card stamps on itself — `pane.<id>/frontmatter`. */
|
|
92
95
|
region: string;
|
|
93
|
-
/** `in-column` in Edit, `pinned` in Design. The stage decides; the card only draws it. */
|
|
94
|
-
placement: "in-column" | "pinned";
|
|
95
96
|
/** The matched collection's name, or the word `Document` when it belongs to none. */
|
|
96
97
|
collection: string;
|
|
97
98
|
/** This page's route. */
|
|
@@ -150,7 +151,6 @@ interface DocHeaderScope extends Record<string, unknown>, DocHeaderView, DocHead
|
|
|
150
151
|
/** Write a whole view into the scope. Assignment only — the mount is never rebuilt for a repaint. */
|
|
151
152
|
function project(scope: DocHeaderScope, view: DocHeaderView): void {
|
|
152
153
|
scope.region = view.region;
|
|
153
|
-
scope.placement = view.placement;
|
|
154
154
|
scope.collection = view.collection;
|
|
155
155
|
scope.route = view.route;
|
|
156
156
|
scope.hasRoute = view.hasRoute;
|
|
@@ -180,7 +180,6 @@ export function mountDocHeaderSurface(
|
|
|
180
180
|
...actions,
|
|
181
181
|
collection: "Document",
|
|
182
182
|
hasRoute: false,
|
|
183
|
-
placement: "in-column",
|
|
184
183
|
rawEntries: [],
|
|
185
184
|
rawOpen: false,
|
|
186
185
|
rawState: "empty",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://jxsuite.com/schema/v1",
|
|
3
3
|
"$id": "StudioEntryEditor",
|
|
4
|
-
"$description": "The Entry editor (§7.4) — one content entry's fields, in a pane, as a Jx document over the kit. The adapter (`surfaces/entry-editor.ts`) hands in a projection; `content/entry-editor.ts` decides everything in it — which collection the file belongs to, which record its fields live in, which required keys are absent and what a draft flag commits into. The FORM is an island: a schema is `ui/schema-form.ts`'s subject, so this document renders an empty `fields` node and the flow places the element that engine hands back (studio-ui-guidelines.md §9.3, §9.4). That is the whole of the difference between this and the card the lit version drew, and it is why the engine converting in batch 7 is what unblocked this one.",
|
|
4
|
+
"$description": "The Entry editor (site-architecture.md §7.4) — one content entry's fields, in a pane, as a Jx document over the kit. The adapter (`surfaces/entry-editor.ts`) hands in a projection; `content/entry-editor.ts` decides everything in it — which collection the file belongs to, which record its fields live in, which required keys are absent and what a draft flag commits into. The FORM is an island: a schema is `ui/schema-form.ts`'s subject, so this document renders an empty `fields` node and the flow places the element that engine hands back (studio-ui-guidelines.md §9.3, §9.4). That is the whole of the difference between this and the card the lit version drew, and it is why the engine converting in batch 7 is what unblocked this one.",
|
|
5
5
|
"tagName": "div",
|
|
6
6
|
"attributes": {
|
|
7
7
|
"part": "entry",
|
|
@@ -154,7 +154,8 @@ export function mountEntryEditorSurface(
|
|
|
154
154
|
let disposed = false;
|
|
155
155
|
/* Nothing is called on an element here, so the mount is all there is to wait for: the island
|
|
156
156
|
announces itself through `onNodeCreated` as it is created, which is one `connectedCallback`
|
|
157
|
-
earlier than awaiting the element would be (§1.1, "await the
|
|
157
|
+
earlier than awaiting the element would be (studio-ui-guidelines.md §1.1, "await the
|
|
158
|
+
element"). */
|
|
158
159
|
const ready = mountSurface("entry-editor", scope, host, {
|
|
159
160
|
onNodeCreated: (element, _path, def) => {
|
|
160
161
|
if (element instanceof HTMLElement && partOf(def) === "fields") {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://jxsuite.com/schema/v1",
|
|
3
3
|
"$id": "StudioExpressionEditor",
|
|
4
|
-
"$description": "The expression editor (spec §19.9): a `$expression` node edited as STRUCTURE — an operator, the operands that operator needs, and the live value of each. The rows arrive FLAT. An expression nests to any depth (an operand may be another expression, an aggregate's per-item body is one, and either may hold more of both) while a document's one repeater is `$prototype: \"Array\"` over a list, so `ui/expression-editor.ts` walks the tree once and hands over rows that already carry their own indent — recursion is a property of the walk, exactly as it is for the statement tree and the Data panel's value tree. Six kinds of row come out of that walk: the CHIP strip that summarises the whole pipeline, the preview's ERROR line, the OPERATOR row, an OPERAND row (the workhorse, which carries the value ladder and every literal control), a section LABEL, and an ACTION that grows the node. Five surfaces draw this — the Inspector's Content and Logic tabs, the Navigator's State panel, the statement editor and the Logic dock — and none of them is named here: each host has already said where it is, so this document stamps no region of its own.",
|
|
4
|
+
"$description": "The expression editor (spec.md §19.9): a `$expression` node edited as STRUCTURE — an operator, the operands that operator needs, and the live value of each. The rows arrive FLAT. An expression nests to any depth (an operand may be another expression, an aggregate's per-item body is one, and either may hold more of both) while a document's one repeater is `$prototype: \"Array\"` over a list, so `ui/expression-editor.ts` walks the tree once and hands over rows that already carry their own indent — recursion is a property of the walk, exactly as it is for the statement tree and the Data panel's value tree. Six kinds of row come out of that walk: the CHIP strip that summarises the whole pipeline, the preview's ERROR line, the OPERATOR row, an OPERAND row (the workhorse, which carries the value ladder and every literal control), a section LABEL, and an ACTION that grows the node. Five surfaces draw this — the Inspector's Content and Logic tabs, the Navigator's State panel, the statement editor and the Logic dock — and none of them is named here: each host has already said where it is, so this document stamps no region of its own.",
|
|
5
5
|
"tagName": "div",
|
|
6
6
|
"attributes": {
|
|
7
7
|
"part": "expression"
|
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
"textOverflow": "ellipsis"
|
|
59
59
|
},
|
|
60
60
|
"& [part=\"row\"]": {
|
|
61
|
-
"$description": "§4.1's standard form row, stacked, with its own indent. `display: flex` rather than `block` because an operand row carries a leading cell (an argument's name, a case's key) beside the field.",
|
|
61
|
+
"$description": "studio-ui-guidelines.md §4.1's standard form row, stacked, with its own indent. `display: flex` rather than `block` because an operand row carries a leading cell (an argument's name, a case's key) beside the field.",
|
|
62
62
|
"boxSizing": "border-box",
|
|
63
63
|
"display": "flex",
|
|
64
64
|
"alignItems": "flex-start",
|
|
@@ -107,7 +107,7 @@
|
|
|
107
107
|
"fontSize": "var(--jx-text-xs)"
|
|
108
108
|
},
|
|
109
109
|
"& [part=\"badge\"]": {
|
|
110
|
-
"$description": "The live value (spec §19.9). A resolved formula is arbitrary text — an object, a URL, a paragraph — so it ellipsizes inside the line it annotates and never sets that line's width.",
|
|
110
|
+
"$description": "The live value (spec.md §19.9). A resolved formula is arbitrary text — an object, a URL, a paragraph — so it ellipsizes inside the line it annotates and never sets that line's width.",
|
|
111
111
|
"flex": "0 1 auto",
|
|
112
112
|
"minWidth": "0",
|
|
113
113
|
"maxWidth": "120px",
|
|
@@ -123,7 +123,7 @@
|
|
|
123
123
|
"textOverflow": "ellipsis"
|
|
124
124
|
},
|
|
125
125
|
"& [part=\"preview-error\"]": {
|
|
126
|
-
"$description": "§
|
|
126
|
+
"$description": "§16.1's inline tier: not a toast and not a problem record, because it is a property of the value currently in the editor and lives exactly as long as that value does.",
|
|
127
127
|
"margin": "0",
|
|
128
128
|
"padding": "2px 0",
|
|
129
129
|
"minWidth": "0",
|
|
@@ -529,7 +529,7 @@
|
|
|
529
529
|
},
|
|
530
530
|
"children": [
|
|
531
531
|
{
|
|
532
|
-
"$description": "The value ladder (§6.
|
|
532
|
+
"$description": "The value ladder (§6.6), in the one vocabulary `ui/value-source.ts` owns. It is absent where the position admits a single shape — an assignment target, a `call`'s callee — because a picker with one entry is a control that asks a question with one answer.",
|
|
533
533
|
"tagName": "span",
|
|
534
534
|
"attributes": {
|
|
535
535
|
"part": "source-slot",
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"fontSize": "var(--jx-text-md)",
|
|
18
18
|
"color": "var(--fg)",
|
|
19
19
|
"& [part=\"empty\"]": {
|
|
20
|
-
"$description": "The two states that are not a tree. They are two states and not one sentence: a window with no project at all and a monorepo root that has not been pointed at a site are different situations, and only the second has anything to offer (§11).",
|
|
20
|
+
"$description": "The two states that are not a tree. They are two states and not one sentence: a window with no project at all and a monorepo root that has not been pointed at a site are different situations, and only the second has anything to offer (studio-ui-guidelines.md §11).",
|
|
21
21
|
"padding": "var(--jx-space-6)",
|
|
22
22
|
"textAlign": "center",
|
|
23
23
|
"color": "var(--fg-dim)",
|
|
@@ -166,7 +166,7 @@
|
|
|
166
166
|
"value": []
|
|
167
167
|
}
|
|
168
168
|
],
|
|
169
|
-
"description": "The declared `project.open` command, run through the registry — not a second opener of this surface's own. It is the one the chord, the palette and the status bar's PROJECT field already run, so a window that opens a project from here reports the outcome the same way they do (§12.5)."
|
|
169
|
+
"description": "The declared `project.open` command, run through the registry — not a second opener of this surface's own. It is the one the chord, the palette and the status bar's PROJECT field already run, so a window that opens a project from here reports the outcome the same way they do (studio-ui-guidelines.md §12.5)."
|
|
170
170
|
},
|
|
171
171
|
"children": [
|
|
172
172
|
{
|
|
@@ -218,12 +218,13 @@
|
|
|
218
218
|
},
|
|
219
219
|
"children": [
|
|
220
220
|
{
|
|
221
|
+
"$description": "A row of quiet tools, so NOT compact. A compact group draws every member's frame and fill whatever its quiet says, which is the segmented look a choice wants and not the borderless one a toolbar wants; Spectrum's group here was `compact quiet`, a combination the kit spells as compact=false with its members' default quiet.",
|
|
221
222
|
"tagName": "jx-action-group",
|
|
222
223
|
"attributes": {
|
|
223
224
|
"part": "toolbar-actions"
|
|
224
225
|
},
|
|
225
226
|
"$props": {
|
|
226
|
-
"compact":
|
|
227
|
+
"compact": false,
|
|
227
228
|
"label": "File tree actions"
|
|
228
229
|
},
|
|
229
230
|
"children": [
|
|
@@ -230,7 +230,7 @@ function mappedRow(state: JxScope | undefined): FileRowView | null {
|
|
|
230
230
|
*
|
|
231
231
|
* Nothing is called on the elements, so the mount is all this has to wait for: the two islands
|
|
232
232
|
* announce themselves through `onNodeCreated` as their nodes are created, which is one
|
|
233
|
-
* `connectedCallback` EARLIER than awaiting the element would be (guidelines §1.1).
|
|
233
|
+
* `connectedCallback` EARLIER than awaiting the element would be (studio-ui-guidelines.md §1.1).
|
|
234
234
|
*/
|
|
235
235
|
export function mountFilesPanelSurface(
|
|
236
236
|
container: HTMLElement,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://jxsuite.com/schema/v1",
|
|
3
3
|
"$id": "StudioFormulaPalette",
|
|
4
|
-
"$description": "The formula palette (spec §19.9): a search field over the formula catalog, its results grouped by the catalog's own group order, and one pick that hands an entry back to whoever opened it. The same shape as `palette.json` — a scrim, a framed panel, a borderless field, a listbox — because it is the same gesture over a different corpus, and the two used to share a stylesheet by sharing its class names. `groups` is the filtered catalog already grouped; `activeId` is the highlight, and it is ONE string — the id the field points `aria-activedescendant` at and the id the listbox is handed as `active` — kept apart from the rows so a key moves it without the list reconciling, which is why every row carries the FLAT index it would otherwise have to be asked for. Panel position is the caller's: centred under the top edge by default, and pinned under an anchor control when one was named, which is the only thing about this surface a document cannot decide for itself — it arrives as `anchorLeft`/`anchorTop`, two numbers the `style` object below binds, because a style declaration may read state like any other value (spec §9.1).",
|
|
4
|
+
"$description": "The formula palette (spec.md §19.9): a search field over the formula catalog, its results grouped by the catalog's own group order, and one pick that hands an entry back to whoever opened it. The same shape as `palette.json` — a scrim, a framed panel, a borderless field, a listbox — because it is the same gesture over a different corpus, and the two used to share a stylesheet by sharing its class names. `groups` is the filtered catalog already grouped; `activeId` is the highlight, and it is ONE string — the id the field points `aria-activedescendant` at and the id the listbox is handed as `active` — kept apart from the rows so a key moves it without the list reconciling, which is why every row carries the FLAT index it would otherwise have to be asked for. Panel position is the caller's: centred under the top edge by default, and pinned under an anchor control when one was named, which is the only thing about this surface a document cannot decide for itself — it arrives as `anchorLeft`/`anchorTop`, two numbers the `style` object below binds, because a style declaration may read state like any other value (spec.md §9.1).",
|
|
5
5
|
"tagName": "div",
|
|
6
6
|
"attributes": {
|
|
7
7
|
"part": "palette"
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"overflow": "hidden"
|
|
40
40
|
},
|
|
41
41
|
"& [part=\"panel\"][data-anchored]": {
|
|
42
|
-
"$description": "Opened from a control rather than from a chord: the panel hangs under that control instead of sitting under the top edge. The two custom properties are the only measured numbers in the surface — a rect belongs to the moment it was taken, so the adapter measures it once per open and this document binds the result. They used to travel as a `style` ATTRIBUTE the adapter assembled into one string, on the belief that a document cannot bind a style declaration to state; it can, and always could. They are declared at the top of this object rather than here because a reactive custom property in a rule targeting the element ITSELF is written inline under the author's own name (spec §9.1), and the panel then reads them by inheritance — the root is `display: contents`, so nothing sits between the two.",
|
|
42
|
+
"$description": "Opened from a control rather than from a chord: the panel hangs under that control instead of sitting under the top edge. The two custom properties are the only measured numbers in the surface — a rect belongs to the moment it was taken, so the adapter measures it once per open and this document binds the result. They used to travel as a `style` ATTRIBUTE the adapter assembled into one string, on the belief that a document cannot bind a style declaration to state; it can, and always could. They are declared at the top of this object rather than here because a reactive custom property in a rule targeting the element ITSELF is written inline under the author's own name (spec.md §9.1), and the panel then reads them by inheritance — the root is `display: contents`, so nothing sits between the two.",
|
|
43
43
|
"position": "fixed",
|
|
44
44
|
"left": "var(--formula-palette-left)",
|
|
45
45
|
"top": "var(--formula-palette-top)",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/// <reference lib="dom" />
|
|
2
2
|
/**
|
|
3
|
-
* The formula palette (spec §19.9): a search over the formula catalog, mounted into the popover
|
|
3
|
+
* The formula palette (spec.md §19.9): a search over the formula catalog, mounted into the popover
|
|
4
4
|
* layer as a Jx document.
|
|
5
5
|
*
|
|
6
6
|
* `formula-palette.json` is the markup, the ARIA and the style; this is the decisions — which
|