@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
|
@@ -2990,16 +2990,10 @@ function sheetStateFor(doc) {
|
|
|
2990
2990
|
var elementStyles = new WeakMap;
|
|
2991
2991
|
var SCOPE_TOKEN = "\x01jx-scope\x01";
|
|
2992
2992
|
function rewriteScratch(state) {
|
|
2993
|
-
if (!state.scratch) {
|
|
2994
|
-
return;
|
|
2995
|
-
}
|
|
2996
2993
|
state.scratch.replaceAll([...state.scratchOwners.values()].flat());
|
|
2997
2994
|
}
|
|
2998
2995
|
function releaseInterned(state, table, key) {
|
|
2999
2996
|
const entry = table.get(key);
|
|
3000
|
-
if (!entry) {
|
|
3001
|
-
return;
|
|
3002
|
-
}
|
|
3003
2997
|
entry.refs -= 1;
|
|
3004
2998
|
if (entry.refs <= 0) {
|
|
3005
2999
|
table.delete(key);
|
|
@@ -3631,9 +3625,6 @@ async function importAndInstantiate(def, src, exportName, base) {
|
|
|
3631
3625
|
}
|
|
3632
3626
|
async function resolveClassJson(def, state, key, base) {
|
|
3633
3627
|
const src = def.$src;
|
|
3634
|
-
if (!src) {
|
|
3635
|
-
throw new Error(`Jx: class entry '${key}' has no $src`);
|
|
3636
|
-
}
|
|
3637
3628
|
let classDef;
|
|
3638
3629
|
const isBareSpecifier = !src.startsWith(".") && !src.startsWith("/") && !src.startsWith("http") && !src.startsWith("file:");
|
|
3639
3630
|
if (isBareSpecifier) {
|
|
@@ -4577,7 +4568,8 @@ __export(exports_split, {
|
|
|
4577
4568
|
onSplitPointerDown: () => onSplitPointerDown,
|
|
4578
4569
|
onSplitPointerMove: () => onSplitPointerMove,
|
|
4579
4570
|
onSplitPointerUp: () => onSplitPointerUp,
|
|
4580
|
-
splitModifiersOf: () => splitModifiersOf
|
|
4571
|
+
splitModifiersOf: () => splitModifiersOf,
|
|
4572
|
+
trackOf: () => trackOf
|
|
4581
4573
|
});
|
|
4582
4574
|
var HOST = "jx-split";
|
|
4583
4575
|
var EPSILON = 0.000001;
|
|
@@ -4624,7 +4616,16 @@ function isVertical(state) {
|
|
|
4624
4616
|
function coordOf(vertical, event) {
|
|
4625
4617
|
return vertical ? event.clientX : event.clientY;
|
|
4626
4618
|
}
|
|
4619
|
+
var trackCache = new WeakMap;
|
|
4627
4620
|
function trackOf(host, vertical) {
|
|
4621
|
+
const cached = trackCache.get(host);
|
|
4622
|
+
if (cached && cached.vertical === vertical && cached.element.isConnected && host.isConnected && cached.element.contains(host)) {
|
|
4623
|
+
const box = cached.element.getBoundingClientRect();
|
|
4624
|
+
const length = vertical ? box.width : box.height;
|
|
4625
|
+
if (length > 0) {
|
|
4626
|
+
return length;
|
|
4627
|
+
}
|
|
4628
|
+
}
|
|
4628
4629
|
for (let node = host.parentElement;node; node = node.parentElement) {
|
|
4629
4630
|
if (globalThis.getComputedStyle(node).display === "contents") {
|
|
4630
4631
|
continue;
|
|
@@ -4632,6 +4633,7 @@ function trackOf(host, vertical) {
|
|
|
4632
4633
|
const box = node.getBoundingClientRect();
|
|
4633
4634
|
const length = vertical ? box.width : box.height;
|
|
4634
4635
|
if (length > 0) {
|
|
4636
|
+
trackCache.set(host, { element: node, vertical });
|
|
4635
4637
|
return length;
|
|
4636
4638
|
}
|
|
4637
4639
|
}
|
|
@@ -5204,7 +5206,7 @@ var jx_action_button_default = {
|
|
|
5204
5206
|
type: "string",
|
|
5205
5207
|
default: "",
|
|
5206
5208
|
attribute: "icon",
|
|
5207
|
-
description: "The glyph, by its name in the kit's manifest. Empty for a text-only action button."
|
|
5209
|
+
description: "The glyph, by its name in the kit's manifest. Empty for a text-only action button, which the host reflects as data-no-icon so a sheet outside the element can tell the two apart: the icon PART is hidden while a glyph button is loading as well, the spinner having taken its place, so a compact group keyed on that span widened an icon segment by 4px for the length of a verb."
|
|
5208
5210
|
},
|
|
5209
5211
|
mirror: {
|
|
5210
5212
|
type: "boolean",
|
|
@@ -5245,7 +5247,7 @@ var jx_action_button_default = {
|
|
|
5245
5247
|
type: "boolean",
|
|
5246
5248
|
default: true,
|
|
5247
5249
|
attribute: "quiet",
|
|
5248
|
-
description: "No fill and no border until hovered, which is what a toolbar wants. Off for a standalone tool button."
|
|
5250
|
+
description: "No fill and no border until hovered, which is what a toolbar wants. Off for a standalone tool button. It has no effect on a member of a compact jx-action-group, which draws the segmented frame itself; a row of quiet tools is a group with compact=false."
|
|
5249
5251
|
},
|
|
5250
5252
|
emphasized: {
|
|
5251
5253
|
type: "boolean",
|
|
@@ -5519,6 +5521,7 @@ var jx_action_button_default = {
|
|
|
5519
5521
|
attributes: {
|
|
5520
5522
|
role: "${state.checked ? 'none' : null}",
|
|
5521
5523
|
"data-size": "${state.size}",
|
|
5524
|
+
"data-no-icon": "${state.icon ? null : ''}",
|
|
5522
5525
|
"data-quiet": "${state.quiet ? '' : null}",
|
|
5523
5526
|
"data-emphasized": "${state.emphasized ? '' : null}",
|
|
5524
5527
|
"data-selected": "${state.selected || state.checked === 'true' ? '' : null}",
|
|
@@ -5604,10 +5607,11 @@ var jx_action_button_default = {
|
|
|
5604
5607
|
color: "var(--jx-accent-fg)"
|
|
5605
5608
|
},
|
|
5606
5609
|
'&[data-size="sm"] > [part="control"]': {
|
|
5607
|
-
$description: "The small action button is the kit's most packed control — Studio's toolbars, block action bar and inspector rows declare it some four hundred times — and it draws 4px under the kit's control height, which is the WCAG 2.2 SC 2.5.8 floor (ui.md §4.3). The `::before` is the hit area, jx-tab's close-button technique: an empty pseudo-element that reaches 2px past the drawn box on every side, so the region that accepts the pointer is exactly `--jx-control-h` square while the picture stays 20px. The inset is -3px and not -2px because an absolutely positioned box is offset from its containing block's PADDING edge, and this control draws a 1px border: the border width comes first, then half of the 4px the box is under (jx-tab's close button is borderless, so -4px was exact there). The control is already `position: relative` for the badge, so the pseudo-element needs nothing more. A 4px gap (jx-toolbar's) lets two extended neighbours abut; a compact jx-action-group packs its members touching, and its sheet zeroes the extension on that axis, because an extension over a neighbour's box would take the neighbour's clicks, and the criterion gives an overlapped strip to the target on top rather than to both; a default group's 2px gap leaves every member but the last at 22px on that axis, which ui.md §11 names as a non-claim. Held by target-size.test.ts and the conformance gate, both of which read the border and subtract it.",
|
|
5610
|
+
$description: "The small action button is the kit's most packed control — Studio's toolbars, block action bar and inspector rows declare it some four hundred times — and it draws 4px under the kit's control height, which is the WCAG 2.2 SC 2.5.8 floor (ui.md §4.3). The `::before` is the hit area, jx-tab's close-button technique: an empty pseudo-element that reaches 2px past the drawn box on every side, so the region that accepts the pointer is exactly `--jx-control-h` square while the picture stays 20px. The inset is -3px and not -2px because an absolutely positioned box is offset from its containing block's PADDING edge, and this control draws a 1px border: the border width comes first, then half of the 4px the box is under (jx-tab's close button is borderless, so -4px was exact there). The control is already `position: relative` for the badge, so the pseudo-element needs nothing more. A 4px gap (jx-toolbar's) lets two extended neighbours abut; a compact jx-action-group packs its members touching, and its sheet zeroes the extension on that axis, because an extension over a neighbour's box would take the neighbour's clicks, and the criterion gives an overlapped strip to the target on top rather than to both; a default group's 2px gap leaves every member but the last at 22px on that axis, which ui.md §11 names as a non-claim. Held by target-size.test.ts and the conformance gate, both of which read the border and subtract it. `contain: layout` is the other half of drawing the hit area OUTSIDE the button's own box, as it is on jx-button's small control: an absolutely positioned descendant still contributes to the SCROLLABLE overflow of the nearest ancestor whose `overflow` isn't `visible`, whether or not anything clips or paints it, so a small action button whose box touched a scrolling host's edge widened that host's scrollable region by 2px and drew a scrollbar over content that fit (Preferences · Keyboard's `Search by keystroke`, and the `Change` of a row whose title wraps, both did). The containment has a price, and it is the baseline: a layout-contained box exports none, so a flex or grid row aligned on `baseline` synthesises one from the button's bottom edge and drops the row's text about 6px onto it. A row that holds a small action button centres it (`align-items: center`), which is what the host's `vertical-align: middle` already says for inline layout. The containment also makes the control a stacking context and the containing block of anything fixed inside it; neither moves a pixel here, because the badge is already positioned against the control, nothing fixed lives inside it, and a compact group's later member still paints over an earlier one, both painting in the positioned layer in tree order.",
|
|
5608
5611
|
minWidth: "calc(var(--jx-control-h) - 4px)",
|
|
5609
5612
|
minHeight: "calc(var(--jx-control-h) - 4px)",
|
|
5610
5613
|
padding: "0 var(--jx-space-1)",
|
|
5614
|
+
contain: "layout",
|
|
5611
5615
|
"::before": {
|
|
5612
5616
|
content: '""',
|
|
5613
5617
|
position: "absolute",
|
|
@@ -5812,7 +5816,7 @@ var jx_action_group_default = {
|
|
|
5812
5816
|
type: "boolean",
|
|
5813
5817
|
default: true,
|
|
5814
5818
|
attribute: "compact",
|
|
5815
|
-
description:
|
|
5819
|
+
description: `Draw the children joined into one segmented control, sharing their inner borders and rounding only the outer corners. The group draws every member's frame and fill itself, whatever the member's own quiet says: a strong border round an input fill, the selected member in the accent tint with an accent edge (the solid accent with emphasized), 6px of inline padding on a small member that shows text and no glyph, because the small size's 2px ran "Edit" into "Design", and muted ink on a disabled member, because fading it whole would fade its share of the shared frame. A member's quiet has no effect here. The control is one LINE — a segmented frame is written in tree order and no selector can find the ends of a wrapped line — so a row of choices that has to wrap is compact=false too. Off leaves them as separate buttons with a gap, each drawing itself, so a row of borderless tools is compact=false, never a compact group of quiet members. This is the one thing no button can do about itself: joining N of them needs selectors about a child's position among its siblings. The seam is a DIRECT-CHILD rule: it reaches the buttons the group itself owns — a slot leaves no node, so a distributed child is one — and so a nested group keeps its own compact, and a button a surface wraps in a div of its own is roved but not joined.`
|
|
5816
5820
|
},
|
|
5817
5821
|
label: {
|
|
5818
5822
|
type: "string",
|
|
@@ -5881,7 +5885,9 @@ var jx_action_group_default = {
|
|
|
5881
5885
|
alignItems: "stretch"
|
|
5882
5886
|
},
|
|
5883
5887
|
"&[data-compact]": {
|
|
5884
|
-
|
|
5888
|
+
$description: "A segmented control is ONE line, and this is where it says so. Every seam rule below is written in TREE order — the -1px overlap on `+ jx-action-button`, the rounded ends on `:first-of-type` and `:last-of-type` — and CSS has no selector for the first or last item on a flex LINE, so a group that wrapped put the overlap on a line-start member (1px outside the group's own edge), left both line ends square, and abutted the two lines into a doubled 2px border. Nothing in a sheet can see a line break, so the group refuses one rather than drawing it badly. A row of choices that has to wrap is `compact: false`: there each member draws its own rounded frame and the gap comes back, so every line reads the same (Studio's Size and Features chips are that row).",
|
|
5889
|
+
gap: "0",
|
|
5890
|
+
flexWrap: "nowrap"
|
|
5885
5891
|
},
|
|
5886
5892
|
'&[data-compact] > jx-action-button > [part="control"]': {
|
|
5887
5893
|
borderRadius: "0"
|
|
@@ -5897,6 +5903,10 @@ var jx_action_group_default = {
|
|
|
5897
5903
|
borderStartEndRadius: "var(--jx-radius-sm)",
|
|
5898
5904
|
borderEndEndRadius: "var(--jx-radius-sm)"
|
|
5899
5905
|
},
|
|
5906
|
+
'&[data-compact][data-orientation="vertical"] > jx-action-button > [part="control"]': {
|
|
5907
|
+
$description: "A vertical group stretches its member HOSTS to the widest one (`align-items: stretch` above), and a host is an inline-flex row whose control sits inside it at its own content width: so the segments' end edges stepped in and out down the column, one frame per label length, from the moment the group started drawing those frames. The control takes the whole host, as the zoom pod's label does for the same reason, and keeps the control's own centring.",
|
|
5908
|
+
flex: "1"
|
|
5909
|
+
},
|
|
5900
5910
|
'&[data-compact][data-orientation="vertical"] > jx-action-button + jx-action-button > [part="control"]': {
|
|
5901
5911
|
marginInlineStart: "0",
|
|
5902
5912
|
marginBlockStart: "-1px"
|
|
@@ -5909,9 +5919,44 @@ var jx_action_group_default = {
|
|
|
5909
5919
|
borderStartEndRadius: "0",
|
|
5910
5920
|
borderEndStartRadius: "var(--jx-radius-sm)"
|
|
5911
5921
|
},
|
|
5912
|
-
'&[data-compact] > jx-action-button > [part="control"]
|
|
5922
|
+
'&[data-compact] > jx-action-button:not([data-selected]) > [part="control"]': {
|
|
5923
|
+
$description: "The frame is the group's, not the member's. Every seam rule above acts on a member's border, and jx-action-button is quiet by default (a transparent border and fill, which is what a toolbar wants), so the shared borders, the rounded ends and the -1px overlap all worked on borders nobody could see, and a compact group drew as a gap-less row of bare words: the Canvas view switch, the Style panel's Display row, Preferences' Theme, the zoom pod and every other group Studio converted from Spectrum, whose sp-action-button was NOT quiet by default, so the conversion dropped the frame without anybody writing it off. So the group draws its members whatever their quiet says, which is what ui.md §5.4 means by `compact` with `single` being the segmented control. This rule and the selected one below are mutually exclusive, so neither depends on sheet order against the member's own; at (0,4,1) under the scope handle each outranks the member's quiet and selected rules at (0,3,0) and quiet's hover at (0,4,0). The ink restates the member's resting colour at this specificity so that only the hover rule below, which leaves a disabled member alone, can raise it: the member's own hover is not gated on disabled, and a disabled segment brightening under the pointer reads as one that can act.",
|
|
5924
|
+
borderColor: "var(--jx-border-strong)",
|
|
5925
|
+
background: "var(--jx-bg-input)",
|
|
5926
|
+
color: "var(--jx-fg-dim)"
|
|
5927
|
+
},
|
|
5928
|
+
'&[data-compact] > jx-action-button:not([data-selected]) > [part="control"]:hover:not(:disabled)': {
|
|
5929
|
+
$description: "The hover wash is LAYERED over the input fill rather than replacing it, as the member's own hover does. `--jx-hover-bg` is 6% of the ink over transparent, so on its own it shows whatever stands behind the group, and on the zoom pod's darkest background that came out a shade from the resting fill: a hover that did not read. As an image over the fill it is always the resting colour plus the wash, in both schemes.",
|
|
5930
|
+
backgroundColor: "var(--jx-bg-input)",
|
|
5931
|
+
backgroundImage: "linear-gradient(var(--jx-hover-bg), var(--jx-hover-bg))",
|
|
5932
|
+
color: "var(--jx-fg)"
|
|
5933
|
+
},
|
|
5934
|
+
'&[data-compact] > jx-action-button[data-selected] > [part="control"]': {
|
|
5935
|
+
$description: "The chosen segment: the accent tint with an accent EDGE. The member's own selected state is a 15% tint and nothing else, which beside a bordered neighbour read as a faint wash rather than as the one that is on. Raised over both neighbours, so the accent edge shows on every side through the -1px overlap, and still under a focus ring. A hovered selected segment stays as it is: this outranks the member's quiet hover.",
|
|
5936
|
+
borderColor: "var(--jx-accent)",
|
|
5937
|
+
background: "var(--jx-accent-20)",
|
|
5938
|
+
color: "var(--jx-fg)",
|
|
5913
5939
|
zIndex: "1"
|
|
5914
5940
|
},
|
|
5941
|
+
'&[data-compact] > jx-action-button[data-selected][data-emphasized] > [part="control"]': {
|
|
5942
|
+
$description: "The member's emphasized, kept: the solid accent, edge and all.",
|
|
5943
|
+
borderColor: "var(--jx-accent-solid)",
|
|
5944
|
+
background: "var(--jx-accent-solid)",
|
|
5945
|
+
color: "var(--jx-accent-fg)"
|
|
5946
|
+
},
|
|
5947
|
+
'&[data-compact] > jx-action-button > [part="control"]:disabled': {
|
|
5948
|
+
$description: "A disabled segment dims its INK and not the frame. jx-action-button fades the whole control (`opacity: 0.5`), which is right where the border is the button's own; in a group the border is one member's share of a frame drawn across all of them, so half-fading it left the outer rectangle bright on one side of a seam and faint on the other — a control that reads as half-broken rather than as half-unavailable. Muted ink is a step below the resting dim, and it carries a selected segment too: the accent fill and edge stay, so the chosen one still reads as chosen while it cannot act. AFTER the selected rules on purpose, because it ties with them at (0,4,1) and has to win the ink.",
|
|
5949
|
+
opacity: "1",
|
|
5950
|
+
color: "var(--jx-fg-muted)"
|
|
5951
|
+
},
|
|
5952
|
+
'&[data-compact] > jx-action-button[data-size="sm"][data-no-icon] > [part="control"]': {
|
|
5953
|
+
$description: 'A small member that shows no glyph is a text segment, and the small size\'s inline padding is 2px, which is right for a 20px glyph button and ran the words of a text row together ("flex" into "grid"). A text segment takes 6px: one step between --jx-space-2 and --jx-space-3, because the widest Style panel row measured 220px of its 256px at 4px and --jx-space-3 overflowed it. 6px costs that row 4px — `nowrap`, `wrap-reverse`, `normal` and `auto` are the only values css-meta leaves without a glyph, so no button row draws more than two text segments and the six-segment rows draw one. Keyed on the HOST\'s data-no-icon, not on a hidden icon part: the icon span is hidden while a glyph segment is `loading` too, since the spinner takes its place, so an icon segment grew 4px mid-verb and snapped back when it settled. Scoped to the group rather than made the small size\'s own, because some forty other small text buttons in Studio would widen with it.',
|
|
5954
|
+
paddingInline: "6px"
|
|
5955
|
+
},
|
|
5956
|
+
'&[data-compact] > jx-action-button > [part="control"]:focus-visible': {
|
|
5957
|
+
$description: "Over everything, the selected segment's raised edge included, so a focus ring is never painted under a neighbour.",
|
|
5958
|
+
zIndex: "2"
|
|
5959
|
+
},
|
|
5915
5960
|
'&[data-compact] > jx-action-button[data-size="sm"] > [part="control"]::before': {
|
|
5916
5961
|
$description: "A small action button carries a `::before` that extends its hit area 2px past its drawn box on every side (an inset of -3px: the button's 1px border, then half the 4px it is under, because an absolutely positioned box is offset from the padding edge), so that a 20px picture accepts the pointer over the kit's 24px control height (WCAG 2.2 SC 2.5.8, ui.md §4.3). In a compact group the boxes TOUCH on the packed axis — no gap, and each border drawn over the last — so an extension there could reach nothing but the neighbour's own box, and the later sibling paints above the earlier one: the last 2px of every button but the last would activate the button after it. The criterion gives an overlapped area to the target on TOP, so the extension would buy the earlier button nothing and cost it a stolen strip. The default 2px gap is the other case: two extensions overlap by 2px there, the later member keeps the strip, and every small member but the last counts 22px on the packed axis, which is under the floor and which ui.md §11 names beside this one. The packed axis is therefore zeroed here — `0` is the padding edge, 1px inside the drawn border, and the button's own box accepts the pointer over that pixel — and the cross axis keeps its 2px past the drawn box, which reaches only the gap around the group: a compact group's small members are 24px tall and as wide as they draw, which ui.md §11 records as the one thing the technique cannot reach. The vertical variant swaps the axes, and its inline value is the button's own -3px for the same reason.",
|
|
5917
5962
|
insetInline: "0"
|
|
@@ -5919,6 +5964,15 @@ var jx_action_group_default = {
|
|
|
5919
5964
|
'&[data-compact][data-orientation="vertical"] > jx-action-button[data-size="sm"] > [part="control"]::before': {
|
|
5920
5965
|
insetInline: "-3px",
|
|
5921
5966
|
insetBlock: "0"
|
|
5967
|
+
},
|
|
5968
|
+
"@(forced-colors: active)": {
|
|
5969
|
+
'&[data-compact] > jx-action-button[data-selected] > [part="control"], &[data-compact] > jx-action-button[data-selected][data-emphasized] > [part="control"]': {
|
|
5970
|
+
$description: "The chosen segment, redrawn. Forced colours replace every author colour with the user's palette, so the accent tint and the accent edge both collapse into the ones around them and the segmented control would say nothing about which segment is on. The system's own selection pair says it instead, as jx-switch does for its checked track. The emphasized selector is spelled out beside the plain one because a media condition adds no specificity: at (0,4,1) this block won `forced-color-adjust: none` and then LOST border, background and colour to the emphasized rule at (0,5,1), which painted the author's blue over the user's palette with adjustment switched off — the one combination where forced colours were worse than none.",
|
|
5971
|
+
forcedColorAdjust: "none",
|
|
5972
|
+
borderColor: "Highlight",
|
|
5973
|
+
background: "Highlight",
|
|
5974
|
+
color: "HighlightText"
|
|
5975
|
+
}
|
|
5922
5976
|
}
|
|
5923
5977
|
},
|
|
5924
5978
|
children: [
|
|
@@ -6227,11 +6281,12 @@ var jx_button_default = {
|
|
|
6227
6281
|
}
|
|
6228
6282
|
},
|
|
6229
6283
|
'&[data-size="sm"] > [part="control"]': {
|
|
6230
|
-
$description: "A small button draws 4px under the kit's control height, and the control height is the WCAG 2.2 SC 2.5.8 floor (ui.md §4.3), so the drawn box alone would be a 20px pointer target at the default density. The `::before` is the hit area: an empty pseudo-element that reaches 2px past the drawn box on every side, so what accepts the pointer is exactly `--jx-control-h` square while the picture stays small — jx-tab's close button's technique, and the criterion measures the region that accepts the pointer, not the paint. The inset is -3px and not -2px because an absolutely positioned box is offset from its containing block's PADDING edge, and this control draws a 1px border: the border width comes first, then half of the 4px the box is under. jx-tab's close button is borderless, which is why -4px was exact there, and why the number did not carry over unchanged. In a jx-toolbar (a 4px gap) two extended neighbours abut and neither loses a pixel; jx-action-group's own sheet zeroes the packed axis in a compact group, where the boxes touch and an extension could only steal a strip of the neighbour. Held by target-size.test.ts and the conformance gate, both of which read the border and subtract it.",
|
|
6284
|
+
$description: "A small button draws 4px under the kit's control height, and the control height is the WCAG 2.2 SC 2.5.8 floor (ui.md §4.3), so the drawn box alone would be a 20px pointer target at the default density. The `::before` is the hit area: an empty pseudo-element that reaches 2px past the drawn box on every side, so what accepts the pointer is exactly `--jx-control-h` square while the picture stays small — jx-tab's close button's technique, and the criterion measures the region that accepts the pointer, not the paint. The inset is -3px and not -2px because an absolutely positioned box is offset from its containing block's PADDING edge, and this control draws a 1px border: the border width comes first, then half of the 4px the box is under. jx-tab's close button is borderless, which is why -4px was exact there, and why the number did not carry over unchanged. In a jx-toolbar (a 4px gap) two extended neighbours abut and neither loses a pixel; jx-action-group's own sheet zeroes the packed axis in a compact group, where the boxes touch and an extension could only steal a strip of the neighbour. Held by target-size.test.ts and the conformance gate, both of which read the border and subtract it. `contain: layout` is the other half of drawing the hit area OUTSIDE the button's own box: an absolutely positioned descendant still contributes to the SCROLLABLE overflow of the nearest ancestor whose `overflow` isn't `visible`, whether or not anything clips or paints it, so every `sm` button inside a host that scrolls (Preferences · Assistant's `Refresh models` and `Save` both are) was quietly widening and heightening that host's scrollable region by a few px — enough, with jx-textfield's clear button and jx-combobox's toggle doing the same thing beside it, to draw a scrollbar over a panel whose visible content fit. The containment has a price, and it is the baseline: a layout-contained box exports none, so a flex or grid row aligned on `baseline` synthesises one from the button's bottom edge and drops the row's text about 6px onto it (Welcome's `Recent` header stood 7px taller for it until it centred its `Clear all`). A row that holds a small button centres it (`align-items: center`), which is what the host's `vertical-align: middle` already says for inline layout.",
|
|
6231
6285
|
position: "relative",
|
|
6232
6286
|
minHeight: "calc(var(--jx-control-h) - 4px)",
|
|
6233
6287
|
padding: "0 var(--jx-space-3)",
|
|
6234
6288
|
fontSize: "var(--jx-text-sm)",
|
|
6289
|
+
contain: "layout",
|
|
6235
6290
|
"::before": {
|
|
6236
6291
|
content: '""',
|
|
6237
6292
|
position: "absolute",
|
|
@@ -6502,11 +6557,12 @@ var jx_checkbox_default = {
|
|
|
6502
6557
|
color: "var(--jx-fg-dim)"
|
|
6503
6558
|
},
|
|
6504
6559
|
'&[data-size="sm"] > [part="control"]': {
|
|
6505
|
-
$description: "The control is the `<label>` wrapping the input, and the label is the pointer target: a click anywhere on it toggles the box. At `sm` it draws 4px under the kit's control height, the WCAG 2.2 SC 2.5.8 floor (ui.md §4.3), so the `::before` extends the hit area 2px beyond the box on every side — jx-tab's close-button technique, the same shape jx-button carries — and the region that accepts the pointer is `--jx-control-h` tall while the row stays 20px. -2px is exact here where jx-button needs -3px: an absolutely positioned box is offset from the PADDING edge, and the label draws no border, so its padding edge is its drawn edge. The label needs `position: relative` here for the pseudo-element to measure against; the input inside is 14px and needs nothing of its own, because the label around it is the target. Held by target-size.test.ts and the conformance gate.",
|
|
6560
|
+
$description: "The control is the `<label>` wrapping the input, and the label is the pointer target: a click anywhere on it toggles the box. At `sm` it draws 4px under the kit's control height, the WCAG 2.2 SC 2.5.8 floor (ui.md §4.3), so the `::before` extends the hit area 2px beyond the box on every side — jx-tab's close-button technique, the same shape jx-button carries — and the region that accepts the pointer is `--jx-control-h` tall while the row stays 20px. -2px is exact here where jx-button needs -3px: an absolutely positioned box is offset from the PADDING edge, and the label draws no border, so its padding edge is its drawn edge. The label needs `position: relative` here for the pseudo-element to measure against; the input inside is 14px and needs nothing of its own, because the label around it is the target. Held by target-size.test.ts and the conformance gate. `contain: layout` keeps the reach LOCAL, as it does on jx-button's and jx-action-button's small controls: an absolutely positioned box still counts toward the SCROLLABLE overflow of the nearest ancestor whose `overflow` isn't `visible`, invisible or not, so a small checkbox touching a scrolling host's edge would add 2px to that host's scrollable region and draw a scrollbar over content that fit. The price is the baseline: a layout-contained label exports none, so a row aligned on `baseline` puts the label's bottom edge on its text baseline, and a row that holds a small checkbox centres it (`align-items: center`) instead.",
|
|
6506
6561
|
position: "relative",
|
|
6507
6562
|
minHeight: "calc(var(--jx-control-h) - 4px)",
|
|
6508
6563
|
fontSize: "var(--jx-text-sm)",
|
|
6509
6564
|
lineHeight: "var(--jx-leading-sm)",
|
|
6565
|
+
contain: "layout",
|
|
6510
6566
|
"::before": {
|
|
6511
6567
|
content: '""',
|
|
6512
6568
|
position: "absolute",
|
|
@@ -9375,7 +9431,7 @@ var jx_combobox_default = {
|
|
|
9375
9431
|
fontSize: "var(--jx-text-lg)"
|
|
9376
9432
|
},
|
|
9377
9433
|
'& [part="toggle"]': {
|
|
9378
|
-
$description: "The toggle sits inside the field's border, so it draws 2px under the field's height: 22px in a 24px field, 18px in an `sm` one. The `::before` is its hit area (WCAG 2.2 SC 2.5.8, ui.md §4.3), the same shape as jx-textfield's clear button: an empty pseudo-element inset by half the difference between the drawn box and the kit's control height, -1px on a default field and -3px on a small one, so the region that accepts the pointer is `--jx-control-h` square at every size while the caret and its box stay where they were; on a large field the inset is positive and the pseudo-element is an invisible box inside a button already over the floor. `position: relative` is what the pseudo-element measures against, and it is new here: the toggle is a flex item of the field, not an absolutely placed one. The rotation the open state applies turns the pseudo-element with the button, which a square does not mind.",
|
|
9434
|
+
$description: "The toggle sits inside the field's border, so it draws 2px under the field's height: 22px in a 24px field, 18px in an `sm` one. The `::before` is its hit area (WCAG 2.2 SC 2.5.8, ui.md §4.3), the same shape as jx-textfield's clear button: an empty pseudo-element inset by half the difference between the drawn box and the kit's control height, -1px on a default field and -3px on a small one, so the region that accepts the pointer is `--jx-control-h` square at every size while the caret and its box stay where they were; on a large field the inset is positive and the pseudo-element is an invisible box inside a button already over the floor. `position: relative` is what the pseudo-element measures against, and it is new here: the toggle is a flex item of the field, not an absolutely placed one. The rotation the open state applies turns the pseudo-element with the button, which a square does not mind. `contain: layout` keeps that invisible expansion a LOCAL fact: an absolutely positioned box still contributes to the SCROLLABLE overflow of the nearest ancestor whose own `overflow` is not `visible`, even though nothing clips it and nothing paints there, so a form host that scrolls (Preferences · Assistant does, at `overflow: auto`) picked up a couple of phantom pixels on every axis from these `::before`s alone and drew scrollbars over content that fit.",
|
|
9379
9435
|
position: "relative",
|
|
9380
9436
|
display: "inline-flex",
|
|
9381
9437
|
alignItems: "center",
|
|
@@ -9393,6 +9449,7 @@ var jx_combobox_default = {
|
|
|
9393
9449
|
color: "var(--jx-fg-muted)",
|
|
9394
9450
|
cursor: "pointer",
|
|
9395
9451
|
outline: "none",
|
|
9452
|
+
contain: "layout",
|
|
9396
9453
|
transition: "rotate var(--jx-dur-1) var(--jx-ease-out)",
|
|
9397
9454
|
"::before": {
|
|
9398
9455
|
content: '""',
|
|
@@ -9430,7 +9487,19 @@ var jx_combobox_default = {
|
|
|
9430
9487
|
color: "var(--jx-danger)"
|
|
9431
9488
|
},
|
|
9432
9489
|
'& [part="error"]:empty': {
|
|
9433
|
-
|
|
9490
|
+
$description: "While the region is empty it draws nothing and takes no click, whatever an ancestor's rule gives it. The kit is light DOM, so a consumer's descendant rule on `[part=\"error\"]` lands on this paragraph too, and under `box-sizing: border-box` a 0×0 box floors at padding plus border, which is how a surface's banner rule drew a small painted box over a field's top-left corner that swallowed the click. So the box model is reset, and `clip-path: inset(50%)` with `pointer-events: none` removes the paint and hit area of anything the reset does not name. It is never `display: none` or `visibility: hidden`, because a live region absent from the accessibility tree does not announce its first text (ui.md §5.1). `jx-textfield.json`'s error region carries the same rule, and its description has the full mechanism.",
|
|
9491
|
+
position: "absolute",
|
|
9492
|
+
top: "0",
|
|
9493
|
+
left: "0",
|
|
9494
|
+
width: "0",
|
|
9495
|
+
height: "0",
|
|
9496
|
+
overflow: "hidden",
|
|
9497
|
+
margin: "0",
|
|
9498
|
+
padding: "0",
|
|
9499
|
+
border: "0",
|
|
9500
|
+
background: "none",
|
|
9501
|
+
clipPath: "inset(50%)",
|
|
9502
|
+
pointerEvents: "none"
|
|
9434
9503
|
},
|
|
9435
9504
|
'& > [part="help-slot"]': {
|
|
9436
9505
|
display: "contents"
|
|
@@ -10378,7 +10447,19 @@ var jx_select_default = {
|
|
|
10378
10447
|
color: "var(--jx-danger)"
|
|
10379
10448
|
},
|
|
10380
10449
|
'& [part="error"]:empty': {
|
|
10381
|
-
|
|
10450
|
+
$description: "While the region is empty it draws nothing and takes no click, whatever an ancestor's rule gives it. The kit is light DOM, so a consumer's descendant rule on `[part=\"error\"]` lands on this paragraph too, and under `box-sizing: border-box` a 0×0 box floors at padding plus border: Studio's Source Control banner rule drew a 16×13 box over the branch picker's top-left corner that swallowed the click. So the box model is reset, and `clip-path: inset(50%)` with `pointer-events: none` removes the paint and hit area of anything the reset does not name. It is never `display: none` or `visibility: hidden`, because a live region absent from the accessibility tree does not announce its first text (ui.md §5.1). `jx-textfield.json`'s error region carries the same rule, and its description has the full mechanism.",
|
|
10451
|
+
position: "absolute",
|
|
10452
|
+
top: "0",
|
|
10453
|
+
left: "0",
|
|
10454
|
+
width: "0",
|
|
10455
|
+
height: "0",
|
|
10456
|
+
overflow: "hidden",
|
|
10457
|
+
margin: "0",
|
|
10458
|
+
padding: "0",
|
|
10459
|
+
border: "0",
|
|
10460
|
+
background: "none",
|
|
10461
|
+
clipPath: "inset(50%)",
|
|
10462
|
+
pointerEvents: "none"
|
|
10382
10463
|
},
|
|
10383
10464
|
'& > [part="help-slot"]': {
|
|
10384
10465
|
display: "contents"
|
|
@@ -10986,13 +11067,14 @@ var jx_split_default = {
|
|
|
10986
11067
|
$ref: "#/state/onDoubleClick"
|
|
10987
11068
|
},
|
|
10988
11069
|
style: {
|
|
11070
|
+
$description: "`z-index: 3` is not decoration: a Navigator/Inspector split sits at the shell level, a sibling of the pane grid rather than a descendant of it, so where its box happens to meet a pane's own edge is decided by whichever stacking context wins — not by DOM order. `panels/pane-context.ts`'s floating toolbar band (`surfaces/pane-context.json`'s `[part=\"chrome\"]`) is `position: relative; z-index: 2` so it can float over the canvas stage, and that band's own edge sits flush against this splitter's box at the pane boundary. At `z-index: 1` the band won the last couple of pixels of the splitter's own 5px width, so a drag started right at that edge grabbed the toolbar instead of the handle — the reader-visible shape of that was `elementFromPoint` returning the band's `[part=\"bar\"]` for x inside the splitter's own rect. `3` clears every floating band in the shell (the chrome band's `2`, `diff-toolbar`'s `2`) without touching their own stacking, which still does its job of floating over the stage.",
|
|
10989
11071
|
display: "block",
|
|
10990
11072
|
"&[hidden]": {
|
|
10991
11073
|
display: "none"
|
|
10992
11074
|
},
|
|
10993
11075
|
flex: "none",
|
|
10994
11076
|
position: "relative",
|
|
10995
|
-
zIndex: "
|
|
11077
|
+
zIndex: "3",
|
|
10996
11078
|
touchAction: "none",
|
|
10997
11079
|
background: "var(--jx-border)",
|
|
10998
11080
|
cursor: "col-resize",
|
|
@@ -12547,7 +12629,9 @@ var jx_tab_default = {
|
|
|
12547
12629
|
background: "transparent",
|
|
12548
12630
|
color: "var(--jx-fg-muted)",
|
|
12549
12631
|
cursor: "pointer",
|
|
12632
|
+
contain: "layout",
|
|
12550
12633
|
"::before": {
|
|
12634
|
+
$description: "The hit area, and the technique every `sm` control in the kit borrows (ui.md §4.3): an empty pseudo-element, absolutely positioned and inset 4px past a borderless 16px box, so the region that accepts the pointer is the 24px SC 2.5.8 asks for while the × stays 16px. The containment above is the other half of it, and it was missing while §4.3 claimed every outset hit area had it: an absolutely positioned box counts toward the SCROLLABLE overflow of the nearest ancestor whose overflow is not visible, painted or not, so a scrolling tab strip counted 4px it could not see. Nothing here pays the containment's price — the tab is a centred flex row, so no baseline is asked of the ×, and the 4px reaches only the tab's own inline padding.",
|
|
12551
12635
|
content: '""',
|
|
12552
12636
|
position: "absolute",
|
|
12553
12637
|
insetBlock: "-4px",
|
|
@@ -13305,7 +13389,7 @@ var jx_textfield_default = {
|
|
|
13305
13389
|
fontSize: "var(--jx-text-lg)"
|
|
13306
13390
|
},
|
|
13307
13391
|
'& [part="clear"]': {
|
|
13308
|
-
$description: "The clear button sits inside the field's border, so it draws 2px under the field's height: 22px in a 24px field, and 18px in an `sm` one. The `::before` is its hit area (WCAG 2.2 SC 2.5.8, ui.md §4.3): an empty pseudo-element inset by half the difference between the drawn box and the kit's control height, which is -1px on a default field and -3px on a small one, so the region that accepts the pointer is `--jx-control-h` square at every size while the glyph and its hover box stay where they were. On a large field the difference is positive and the pseudo-element is an invisible box INSIDE a button that is already over the floor, which changes nothing. jx-tab's close button is the technique; the button is absolutely positioned already, so it is its own containing block. The extension lies over the input it clears, which was true of the drawn button too, and 2px past the field's edge at `sm`, where a neighbour at the kit's 4px gap extends 2px back and the two abut.",
|
|
13392
|
+
$description: "The clear button sits inside the field's border, so it draws 2px under the field's height: 22px in a 24px field, and 18px in an `sm` one. The `::before` is its hit area (WCAG 2.2 SC 2.5.8, ui.md §4.3): an empty pseudo-element inset by half the difference between the drawn box and the kit's control height, which is -1px on a default field and -3px on a small one, so the region that accepts the pointer is `--jx-control-h` square at every size while the glyph and its hover box stay where they were. On a large field the difference is positive and the pseudo-element is an invisible box INSIDE a button that is already over the floor, which changes nothing. jx-tab's close button is the technique; the button is absolutely positioned already, so it is its own containing block. The extension lies over the input it clears, which was true of the drawn button too, and 2px past the field's edge at `sm`, where a neighbour at the kit's 4px gap extends 2px back and the two abut. `contain: layout` keeps the expansion LOCAL: an absolutely positioned box still counts toward the SCROLLABLE overflow of the nearest ancestor whose `overflow` is not `visible`, invisible or not, so a host that scrolls picks up a couple of phantom pixels from every `::before` like this one between it and the field, and draws a scrollbar over content that already fit.",
|
|
13309
13393
|
position: "absolute",
|
|
13310
13394
|
insetBlockStart: "1px",
|
|
13311
13395
|
insetInlineEnd: "1px",
|
|
@@ -13329,6 +13413,7 @@ var jx_textfield_default = {
|
|
|
13329
13413
|
color: "var(--jx-fg-muted)",
|
|
13330
13414
|
cursor: "pointer",
|
|
13331
13415
|
outline: "none",
|
|
13416
|
+
contain: "layout",
|
|
13332
13417
|
":hover": {
|
|
13333
13418
|
color: "var(--jx-fg)"
|
|
13334
13419
|
},
|
|
@@ -13350,7 +13435,19 @@ var jx_textfield_default = {
|
|
|
13350
13435
|
color: "var(--jx-danger)"
|
|
13351
13436
|
},
|
|
13352
13437
|
'& [part="error"]:empty': {
|
|
13353
|
-
|
|
13438
|
+
$description: "The region is permanent and empty until it has something to say, and while it is empty it must draw nothing and take no click, whatever an ancestor's rule gives it. The kit is light DOM, so a consumer's descendant rule on `[part=\"error\"]` (a surface's own banner, a site's stylesheet) lands on this paragraph as well — and under `box-sizing: border-box` a `width`/`height` of 0 floors at padding plus border, which is how a Studio banner's `padding: 6px 8px` and 1px rule drew a 16×13 box at the field's top-left corner that also took the click meant for the control. Pinning the size was never enough on its own; the box model is therefore reset here, and `clip-path: inset(50%)` (the kit's visually-hidden idiom, as `jx-accordion-item.json`'s heading uses it) with `pointer-events: none` removes the paint and the hit area of anything a reset does not name, such as a shadow or an outline. Its `:empty` makes the selector one pseudo-class heavier than the `X [part=\"error\"]` a consumer writes, so it wins in whichever order the sheets land. It is never `display: none` or `visibility: hidden`: a live region absent from the accessibility tree does not announce its first text (ui.md §5.1). When text arrives `:empty` stops matching and the sentence draws in flow exactly as the two rules above say. `jx-select.json` and `jx-combobox.json` carry the same rule, for the same reason.",
|
|
13439
|
+
position: "absolute",
|
|
13440
|
+
top: "0",
|
|
13441
|
+
left: "0",
|
|
13442
|
+
width: "0",
|
|
13443
|
+
height: "0",
|
|
13444
|
+
overflow: "hidden",
|
|
13445
|
+
margin: "0",
|
|
13446
|
+
padding: "0",
|
|
13447
|
+
border: "0",
|
|
13448
|
+
background: "none",
|
|
13449
|
+
clipPath: "inset(50%)",
|
|
13450
|
+
pointerEvents: "none"
|
|
13354
13451
|
},
|
|
13355
13452
|
'& > [part="control-slot"], & > [part="clear-slot"], & > [part="help-slot"]': {
|
|
13356
13453
|
display: "contents"
|
|
@@ -15431,8 +15528,24 @@ function syncListbox(host, active) {
|
|
|
15431
15528
|
}
|
|
15432
15529
|
function mountListbox(state, host) {
|
|
15433
15530
|
syncListbox(host, String(state.active ?? ""));
|
|
15531
|
+
let frameId = null;
|
|
15532
|
+
const scheduleSync = () => {
|
|
15533
|
+
if (frameId !== null) {
|
|
15534
|
+
return;
|
|
15535
|
+
}
|
|
15536
|
+
frameId = requestAnimationFrame(() => {
|
|
15537
|
+
frameId = null;
|
|
15538
|
+
if (host.isConnected) {
|
|
15539
|
+
syncListbox(host, String(state.active ?? ""));
|
|
15540
|
+
}
|
|
15541
|
+
});
|
|
15542
|
+
};
|
|
15434
15543
|
const observer = new MutationObserver(() => {
|
|
15435
|
-
|
|
15544
|
+
if (typeof requestAnimationFrame === "function") {
|
|
15545
|
+
scheduleSync();
|
|
15546
|
+
} else {
|
|
15547
|
+
syncListbox(host, String(state.active ?? ""));
|
|
15548
|
+
}
|
|
15436
15549
|
});
|
|
15437
15550
|
observer.observe(host, {
|
|
15438
15551
|
attributeFilter: ["data-active"],
|
|
@@ -17065,6 +17178,9 @@ var manifest_default = {
|
|
|
17065
17178
|
"arrow-square-out": {
|
|
17066
17179
|
regular: "M224,104a8,8,0,0,1-16,0V59.32l-66.33,66.34a8,8,0,0,1-11.32-11.32L196.68,48H152a8,8,0,0,1,0-16h64a8,8,0,0,1,8,8Zm-40,24a8,8,0,0,0-8,8v72H48V80h72a8,8,0,0,0,0-16H48A16,16,0,0,0,32,80V208a16,16,0,0,0,16,16H176a16,16,0,0,0,16-16V136A8,8,0,0,0,184,128Z"
|
|
17067
17180
|
},
|
|
17181
|
+
"arrow-u-down-left": {
|
|
17182
|
+
regular: "M232,112a64.07,64.07,0,0,1-64,64H51.31l34.35,34.34a8,8,0,0,1-11.32,11.32l-48-48a8,8,0,0,1,0-11.32l48-48a8,8,0,0,1,11.32,11.32L51.31,160H168a48,48,0,0,0,0-96H80a8,8,0,0,1,0-16h88A64.07,64.07,0,0,1,232,112Z"
|
|
17183
|
+
},
|
|
17068
17184
|
"arrow-u-up-left": {
|
|
17069
17185
|
regular: "M232,144a64.07,64.07,0,0,1-64,64H80a8,8,0,0,1,0-16h88a48,48,0,0,0,0-96H51.31l34.35,34.34a8,8,0,0,1-11.32,11.32l-48-48a8,8,0,0,1,0-11.32l48-48A8,8,0,0,1,85.66,45.66L51.31,80H168A64.07,64.07,0,0,1,232,144Z"
|
|
17070
17186
|
},
|
|
@@ -17351,6 +17467,9 @@ var manifest_default = {
|
|
|
17351
17467
|
"text-superscript": {
|
|
17352
17468
|
regular: "M248,144a8,8,0,0,1-8,8H192a8,8,0,0,1-6.4-12.8l43.17-57.55a16,16,0,1,0-27.86-15,8,8,0,0,1-15.09-5.33,32,32,0,1,1,55.74,29.92L208,136h32A8,8,0,0,1,248,144ZM149.24,74a8,8,0,0,0-11.29.8L92,127.79l-45.95-53A8,8,0,0,0,34,85.24L81.41,140,34,194.76a8,8,0,0,0,12.1,10.48l46-53,45.95,53a8,8,0,1,0,12.1-10.48L102.59,140l47.46-54.76A8,8,0,0,0,149.24,74Z"
|
|
17353
17469
|
},
|
|
17470
|
+
"text-t": {
|
|
17471
|
+
regular: "M208,56V88a8,8,0,0,1-16,0V64H136V192h24a8,8,0,0,1,0,16H96a8,8,0,0,1,0-16h24V64H64V88a8,8,0,0,1-16,0V56a8,8,0,0,1,8-8H200A8,8,0,0,1,208,56Z"
|
|
17472
|
+
},
|
|
17354
17473
|
"text-underline": {
|
|
17355
17474
|
regular: "M200,224a8,8,0,0,1-8,8H64a8,8,0,0,1,0-16H192A8,8,0,0,1,200,224Zm-72-24a64.07,64.07,0,0,0,64-64V56a8,8,0,0,0-16,0v80a48,48,0,0,1-96,0V56a8,8,0,0,0-16,0v80A64.07,64.07,0,0,0,128,200Z"
|
|
17356
17475
|
},
|
|
@@ -17662,7 +17781,7 @@ function registerUi(options = {}) {
|
|
|
17662
17781
|
return registration;
|
|
17663
17782
|
}
|
|
17664
17783
|
|
|
17665
|
-
export { isKeyframesAtRule, pureSchemeOf, intlHelpersClause, PURE_METHOD_OPS, BLESSED_OPERATORS, BLESSED_GLOBALS, isMutating, evaluateExpression, assetUrlFor, PUBLIC_DIR, BUILD_LANES, splitRefSuffix, isNonRelativeRef, normalizeProjectPath, dirOfPath, joinProjectPath, projectPathForRef, encodeProjectPath, mount3, preloadDocument, setSkipServerFunctions, runScoped, setCanvasAssetResolver, buildScope, renderNode, redefineElement, defineElement, openAt, close, showModal, close2, ensureCaret, focusItem, splitModifiersOf, selectValue, POPOVER_DEFAULT_MODE, attrs, literalAttr, tagOf, labelOf, isPopover, idOf, walk, popoverIdsIn, documentHasPopover, scalar, findPopoverDefects, popoverDisplayRepair, POPOVER_TAGS, INVOKER_TAGS, KIT_BASE, registerUi, setActiveRegistry, activeRegistry };
|
|
17784
|
+
export { isKeyframesAtRule, pureSchemeOf, intlHelpersClause, PURE_METHOD_OPS, BLESSED_OPERATORS, BLESSED_GLOBALS, isMutating, evaluateExpression, assetUrlFor, PUBLIC_DIR, BUILD_LANES, splitRefSuffix, isNonRelativeRef, normalizeProjectPath, dirOfPath, joinProjectPath, projectPathForRef, encodeProjectPath, mount3, preloadDocument, setSkipServerFunctions, runScoped, setCanvasAssetResolver, buildScope, renderNode, redefineElement, defineElement, openAt, close, showModal, close2, ensureCaret, focusItem, splitModifiersOf, trackOf, selectValue, POPOVER_DEFAULT_MODE, attrs, literalAttr, tagOf, labelOf, isPopover, idOf, walk, popoverIdsIn, documentHasPopover, scalar, findPopoverDefects, popoverDisplayRepair, POPOVER_TAGS, INVOKER_TAGS, KIT_BASE, registerUi, setActiveRegistry, activeRegistry };
|
|
17666
17785
|
|
|
17667
|
-
//# debugId=
|
|
17668
|
-
//# sourceMappingURL=studio-
|
|
17786
|
+
//# debugId=9BF8DDFBCC4943F964756E2164756E21
|
|
17787
|
+
//# sourceMappingURL=studio-3nprwbd9.js.map
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getPlatform2
|
|
3
|
-
} from "./studio-
|
|
3
|
+
} from "./studio-6pwn9j8c.js";
|
|
4
4
|
import {
|
|
5
5
|
invalidateUsages2
|
|
6
|
-
} from "./studio-
|
|
6
|
+
} from "./studio-557bmn0x.js";
|
|
7
7
|
import {
|
|
8
8
|
projectState
|
|
9
9
|
} from "./studio-m1p9b6c3.js";
|
|
@@ -391,4 +391,4 @@ function startFsSync2(ctx) {
|
|
|
391
391
|
export { resetIgnoreCache, ensureIgnoreLayers, isIgnoredEntry, markLocalMutation2, isRecentLocal2, startFsSync2 };
|
|
392
392
|
|
|
393
393
|
//# debugId=021BCC8E71B450F764756E2164756E21
|
|
394
|
-
//# sourceMappingURL=studio-
|
|
394
|
+
//# sourceMappingURL=studio-40z39dme.js.map
|
|
@@ -4,16 +4,13 @@ import {
|
|
|
4
4
|
formatForPath2,
|
|
5
5
|
defaultContentFormat2,
|
|
6
6
|
formatSerialize2
|
|
7
|
-
} from "./studio-
|
|
7
|
+
} from "./studio-9vsvz7w7.js";
|
|
8
8
|
import {
|
|
9
9
|
effectScope,
|
|
10
10
|
effect,
|
|
11
11
|
reactive,
|
|
12
12
|
notify2
|
|
13
13
|
} from "./studio-d8z5bajd.js";
|
|
14
|
-
import {
|
|
15
|
-
projectState
|
|
16
|
-
} from "./studio-m1p9b6c3.js";
|
|
17
14
|
import {
|
|
18
15
|
recordDocOp,
|
|
19
16
|
transactDoc,
|
|
@@ -32,24 +29,27 @@ import {
|
|
|
32
29
|
workspace2,
|
|
33
30
|
activeTab2,
|
|
34
31
|
activateTab2
|
|
35
|
-
} from "./studio-
|
|
32
|
+
} from "./studio-dgdm6vvt.js";
|
|
33
|
+
import {
|
|
34
|
+
projectState
|
|
35
|
+
} from "./studio-m1p9b6c3.js";
|
|
36
36
|
import {
|
|
37
37
|
errorMessage2
|
|
38
38
|
} from "./studio-yxa81f45.js";
|
|
39
39
|
import {
|
|
40
40
|
activeRegistry
|
|
41
|
-
} from "./studio-
|
|
41
|
+
} from "./studio-3nprwbd9.js";
|
|
42
42
|
import {
|
|
43
43
|
paneRegion,
|
|
44
44
|
registerSurface,
|
|
45
45
|
mountSurface
|
|
46
|
-
} from "./studio-
|
|
46
|
+
} from "./studio-ag3z6shb.js";
|
|
47
47
|
import {
|
|
48
48
|
registerFormControl,
|
|
49
49
|
referenceTarget,
|
|
50
50
|
mountSchemaForm,
|
|
51
51
|
resolveContextPointer
|
|
52
|
-
} from "./studio-
|
|
52
|
+
} from "./studio-w7gpcvfj.js";
|
|
53
53
|
import {
|
|
54
54
|
DRAFT_FIELD,
|
|
55
55
|
DRAFT_MEANING,
|
|
@@ -57,23 +57,23 @@ import {
|
|
|
57
57
|
hasDraftAxis,
|
|
58
58
|
setIncludeDrafts,
|
|
59
59
|
reloadDraftAwareGrids2
|
|
60
|
-
} from "./studio-
|
|
60
|
+
} from "./studio-ygvr9e4q.js";
|
|
61
61
|
import {
|
|
62
62
|
serializeJson
|
|
63
|
-
} from "./studio-
|
|
63
|
+
} from "./studio-mfkh1q8d.js";
|
|
64
64
|
import {
|
|
65
65
|
notePreviewOverlayEdit
|
|
66
|
-
} from "./studio-
|
|
66
|
+
} from "./studio-y49b6mjv.js";
|
|
67
67
|
import {
|
|
68
68
|
entryCollection,
|
|
69
69
|
entryCollections,
|
|
70
70
|
collectionOfPath,
|
|
71
71
|
seedEntry,
|
|
72
72
|
missingRequired
|
|
73
|
-
} from "./studio-
|
|
73
|
+
} from "./studio-5w26wza5.js";
|
|
74
74
|
import {
|
|
75
75
|
cloneValue2
|
|
76
|
-
} from "./studio-
|
|
76
|
+
} from "./studio-aj9drheq.js";
|
|
77
77
|
import {
|
|
78
78
|
__preload
|
|
79
79
|
} from "./studio-5te5tqng.js";
|
|
@@ -1195,7 +1195,7 @@ function mountSchemaBuilderSurface(host, actions) {
|
|
|
1195
1195
|
var reference_field_default = {
|
|
1196
1196
|
$schema: "https://jxsuite.com/schema/v1",
|
|
1197
1197
|
$id: "StudioReferenceField",
|
|
1198
|
-
$description: 'The `reference` form control — site-architecture.md §6.1\'s `{ "$ref": "#/content/x" }` and §7.4\'s entry picker. Registered once and dispatched to by `ui/schema-form.ts` for any property whose `$ref` names a collection, so the settings forms, the entry editor and an array-of-objects cell all draw the same control without any of them knowing it exists. `ui/form-controls.ts` decides which of the three states the field is in and what each gesture commits; nothing here reads a schema or lists a directory. The three states are drawn as three different controls on purpose: a picker while the entries are known, a TEXT field while they are not — a failed read leaves the value editable with the reason beside it, because swapping it for an empty dropdown would present "no entries" and "could not find out" as the same screen — and a disabled picker saying so while the read is in flight.',
|
|
1198
|
+
$description: 'The `reference` form control — site-architecture.md §6.1\'s `{ "$ref": "#/content/x" }` and site-architecture.md §7.4\'s entry picker. Registered once and dispatched to by `ui/schema-form.ts` for any property whose `$ref` names a collection, so the settings forms, the entry editor and an array-of-objects cell all draw the same control without any of them knowing it exists. `ui/form-controls.ts` decides which of the three states the field is in and what each gesture commits; nothing here reads a schema or lists a directory. The three states are drawn as three different controls on purpose: a picker while the entries are known, a TEXT field while they are not — a failed read leaves the value editable with the reason beside it, because swapping it for an empty dropdown would present "no entries" and "could not find out" as the same screen — and a disabled picker saying so while the read is in flight.',
|
|
1199
1199
|
tagName: "div",
|
|
1200
1200
|
attributes: {
|
|
1201
1201
|
part: "reference",
|
|
@@ -1973,7 +1973,7 @@ function entryIdsFor(collection) {
|
|
|
1973
1973
|
if (known) {
|
|
1974
1974
|
return known;
|
|
1975
1975
|
}
|
|
1976
|
-
const pending = (__preload("
|
|
1976
|
+
const pending = (__preload("jt7rbcbc"), import("./content-source-jt7rbcbc.js")).then((m) => m.listCollectionEntryIds(collection));
|
|
1977
1977
|
entryIdCache.set(collection, pending);
|
|
1978
1978
|
return pending;
|
|
1979
1979
|
}
|
|
@@ -2099,7 +2099,7 @@ registerFormControl("reference", referenceControl);
|
|
|
2099
2099
|
var entry_editor_default = {
|
|
2100
2100
|
$schema: "https://jxsuite.com/schema/v1",
|
|
2101
2101
|
$id: "StudioEntryEditor",
|
|
2102
|
-
$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.",
|
|
2102
|
+
$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.",
|
|
2103
2103
|
tagName: "div",
|
|
2104
2104
|
attributes: {
|
|
2105
2105
|
part: "entry",
|
|
@@ -2641,7 +2641,7 @@ function renderEntryMode(surface, tab) {
|
|
|
2641
2641
|
});
|
|
2642
2642
|
}
|
|
2643
2643
|
async function openEntryEditor(path) {
|
|
2644
|
-
const { openFileInTab } = await (__preload("
|
|
2644
|
+
const { openFileInTab } = await (__preload("egsb0ry8"), import("./files-egsb0ry8.js"));
|
|
2645
2645
|
await openFileInTab(path);
|
|
2646
2646
|
for (const [id, tab] of workspace2.tabs.entries()) {
|
|
2647
2647
|
if (tab.documentPath !== path) {
|
|
@@ -2703,7 +2703,7 @@ async function createEntry2(collectionName, opts = {}) {
|
|
|
2703
2703
|
});
|
|
2704
2704
|
return null;
|
|
2705
2705
|
}
|
|
2706
|
-
const { createFileIn } = await (__preload("
|
|
2706
|
+
const { createFileIn } = await (__preload("egsb0ry8"), import("./files-egsb0ry8.js"));
|
|
2707
2707
|
const created = await createFileIn({
|
|
2708
2708
|
content,
|
|
2709
2709
|
dir: destination,
|
|
@@ -2807,5 +2807,5 @@ function registerContentCommands2(registry) {
|
|
|
2807
2807
|
|
|
2808
2808
|
export { FIELD_TYPES, FORMAT_OPTIONS, detectFieldType, detectFieldFormat, schemaForType, referenceEntryState, entryFields, entryPaneMounted, detachEntryPane, entryDraftPill, renderEntryMode, createEntry2, registerContentCommands2 };
|
|
2809
2809
|
|
|
2810
|
-
//# debugId=
|
|
2811
|
-
//# sourceMappingURL=studio-
|
|
2810
|
+
//# debugId=9B41188183FEB03964756E2164756E21
|
|
2811
|
+
//# sourceMappingURL=studio-482eeazk.js.map
|