@jxsuite/studio 4.1.0 → 5.1.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/README.md +1 -1
- package/data/elements-meta.json +5 -15
- package/data/html-meta.json +51 -6
- package/dist/chunks/{2020-n6tfwnda.js → 2020-g79n01v9.js} +14 -14
- package/dist/chunks/action-group-sp6tna8v.js +118 -0
- package/dist/chunks/adapter-nj7tnjfn.js +13 -0
- package/dist/chunks/cf-account-picker-qwkm9zrf.js +495 -0
- package/dist/chunks/cf-settings-71bv5zn9.js +20 -0
- package/dist/chunks/color-area-v17df7b8.js +154 -0
- package/dist/chunks/color-field-anwybnkn.js +208 -0
- package/dist/chunks/color-slider-44ez96fc.js +79 -0
- package/dist/chunks/color-xgg3kfw7.js +35 -0
- package/dist/chunks/combobox-5e7jev23.js +236 -0
- package/dist/chunks/components-vj72gqtq.js +20 -0
- package/dist/chunks/content-source-5mex4x1h.js +46 -0
- package/dist/chunks/convert-to-repeater-n64h8znc.js +639 -0
- package/dist/chunks/dialog-s890b918.js +85 -0
- package/dist/chunks/editor-3qhbg51x.js +35 -0
- package/dist/chunks/entry-commands-234hjnqw.js +42 -0
- package/dist/chunks/extension-sections-3hpcambp.js +651 -0
- package/dist/chunks/file-ops-8yhd83xr.js +47 -0
- package/dist/chunks/files-hnxqxtsg.js +72 -0
- package/dist/chunks/format-host-779sfp2n.js +40 -0
- package/dist/chunks/fs-events-b88z7g4h.js +18 -0
- package/dist/chunks/git-panel-xwj8fpab.js +49 -0
- package/dist/chunks/icons-yy10wk9r.js +402 -0
- package/dist/chunks/iframe-entry-15g3n6xv.js +114 -0
- package/dist/chunks/iframe-entry-b27vq81n.js +203 -0
- package/dist/chunks/iframe-entry-nbyxee1y.js +154 -0
- package/dist/chunks/iframe-host-syr0f9sb.js +115 -0
- package/dist/chunks/{index-wcnt3r9g.js → index-mdmyx6s2.js} +11 -11
- package/dist/chunks/index-n4j7qxyr.js +109 -0
- package/dist/chunks/{javascript-q8kpmfah.js → javascript-xvrfrpkb.js} +8 -9
- package/dist/chunks/{jsonMode-dkr040ga.js → jsonMode-tyx2kj6p.js} +526 -527
- package/dist/chunks/jx-validate-j0wxk72w.js +15 -0
- package/dist/chunks/layers-ff81wthn.js +30 -0
- package/dist/chunks/layers-panel-pnnghw12.js +40 -0
- package/dist/chunks/listbox-6v2ac08j.js +44 -0
- package/dist/chunks/lit-html-m244w9nh.js +17 -0
- package/dist/chunks/media-picker-cqhhxhhe.js +33 -0
- package/dist/chunks/menu-9p2w46gj.js +15 -0
- package/dist/chunks/menu-q99sy9rf.js +285 -0
- package/dist/chunks/{monaco-binding-rj6xpx9y.js → monaco-binding-sw6en4dw.js} +12 -15
- package/dist/chunks/monaco-buffer-bhy3hb6m.js +24 -0
- package/dist/chunks/{monaco-setup-vx9bhp1d.js → monaco-setup-8r62fj6y.js} +27 -37
- package/dist/chunks/notify-628t0anh.js +21 -0
- package/dist/chunks/number-field-5cndyft8.js +72 -0
- package/dist/chunks/parse-0zx14y15.js +10 -0
- package/dist/chunks/platform-ts9cg1a4.js +15 -0
- package/dist/chunks/popover-47z3ytva.js +25 -0
- package/dist/chunks/publish-panel-5zt840sy.js +27 -0
- package/dist/chunks/quick-search-3748564r.js +45 -0
- package/dist/chunks/references-qvvxej7h.js +26 -0
- package/dist/chunks/right-panel-eccz92qt.js +45 -0
- package/dist/chunks/section-registry-5pq32t0q.js +25 -0
- package/dist/chunks/select-2r16ez41.js +49 -0
- package/dist/chunks/split-g7nm1rgb.js +191 -0
- package/dist/chunks/studio-0hqbpbd0.js +62 -0
- package/dist/chunks/{studio-kryvsw6j.js → studio-1k325pwf.js} +48 -48
- package/dist/chunks/{studio-b55y6ewx.js → studio-1knfqgy7.js} +58 -58
- package/dist/chunks/{studio-2b946z26.js → studio-1z1kcjv4.js} +3628 -6095
- package/dist/chunks/studio-3773086z.js +111 -0
- package/dist/chunks/{studio-4r1pv6zf.js → studio-38emantv.js} +22 -5
- package/dist/chunks/{studio-x813zp48.js → studio-3rz5md06.js} +30 -30
- package/dist/chunks/{studio-ynxwkrzd.js → studio-4wbb9ct0.js} +1953 -1785
- package/dist/chunks/studio-5te5tqng.js +81 -0
- package/dist/chunks/studio-5wt9nvhd.js +4763 -0
- package/dist/chunks/{studio-p4ngc046.js → studio-6ewqv390.js} +9 -9
- package/dist/chunks/{studio-9ab8gqsm.js → studio-6nzaktvy.js} +7 -7
- package/dist/chunks/studio-6xa21ej9.js +28 -0
- package/dist/chunks/{studio-5ehhackm.js → studio-727xh0e3.js} +19 -19
- package/dist/chunks/{studio-gcye7qka.js → studio-7e11jpa9.js} +21 -21
- package/dist/chunks/{studio-q7v10cg2.js → studio-7r42c6ca.js} +17 -7
- package/dist/chunks/studio-7xnmgv66.js +13615 -0
- package/dist/chunks/studio-8scdew0e.js +258 -0
- package/dist/chunks/{studio-fbf92ckf.js → studio-93zafjcm.js} +275 -163
- package/dist/chunks/{studio-dg7zyt5x.js → studio-98b3z07n.js} +1 -1
- package/dist/chunks/studio-a79k90n9.js +1162 -0
- package/dist/chunks/studio-aj37eer3.js +422 -0
- package/dist/chunks/studio-b0k5tqgp.js +2432 -0
- package/dist/chunks/studio-b4s9eykd.js +2811 -0
- package/dist/chunks/{studio-f3wqjtk5.js → studio-d0300636.js} +5076 -18
- package/dist/chunks/{studio-b9b6t1dg.js → studio-e1f24eff.js} +5664 -5666
- package/dist/chunks/studio-e1pgga3k.js +839 -0
- package/dist/chunks/{studio-g1wdche0.js → studio-esrxgwh6.js} +80 -80
- package/dist/chunks/{studio-q43a5y9h.js → studio-g3jevyjt.js} +16 -16
- package/dist/chunks/studio-gb13095a.js +2806 -0
- package/dist/chunks/{studio-3n4ndrzh.js → studio-h4nvnjvz.js} +303 -303
- package/dist/chunks/{studio-dm19q43r.js → studio-hhvs4sdg.js} +10 -10
- package/dist/chunks/{studio-x4qkdat5.js → studio-js8nv53n.js} +1749 -2481
- package/dist/chunks/{studio-qjy2z9bv.js → studio-jxp12rnj.js} +32 -137
- package/dist/chunks/{studio-trxrabqf.js → studio-k75n7vhp.js} +527 -283
- package/dist/chunks/{studio-q9jd1a60.js → studio-kcgff4r0.js} +15 -18
- package/dist/chunks/studio-kkqkcp3d.js +17668 -0
- package/dist/chunks/studio-mhhyamxf.js +763 -0
- package/dist/chunks/{studio-cft9r4r7.js → studio-nq5yf5mp.js} +22 -22
- package/dist/chunks/{studio-685s0ytq.js → studio-nqgawfks.js} +572 -572
- package/dist/chunks/studio-nzzpvzx9.js +185 -0
- package/dist/chunks/{studio-xrapxwwc.js → studio-p1dw8wfw.js} +55 -29
- package/dist/chunks/{studio-3bqpr0zh.js → studio-pxbgypmg.js} +299 -110
- package/dist/chunks/studio-q0a3yk4n.js +33 -0
- package/dist/chunks/{studio-wcy8trfx.js → studio-q3x06vmj.js} +23 -22
- package/dist/chunks/{studio-6yw4y3my.js → studio-qhhm6hbt.js} +8 -8
- package/dist/chunks/studio-qk4bfsq2.js +362 -0
- package/dist/chunks/{studio-msd847zn.js → studio-qk90fgqm.js} +361 -90
- package/dist/chunks/{studio-jkftxyvz.js → studio-r6nvacqs.js} +5861 -2154
- package/dist/chunks/{studio-53n8bp04.js → studio-r6xmmtfh.js} +1 -1
- package/dist/chunks/{studio-tvgyw9xw.js → studio-rnyf3f8e.js} +83 -250
- package/dist/chunks/studio-rs76k67r.js +12 -0
- package/dist/chunks/studio-sbjyc8bt.js +954 -0
- package/dist/chunks/{studio-1wagb550.js → studio-syg2tadj.js} +11 -11
- package/dist/chunks/{studio-t5wqwzdh.js → studio-tjjk7jvk.js} +1 -1
- package/dist/chunks/studio-tqgryxwg.js +1171 -0
- package/dist/chunks/studio-try13h8c.js +8448 -0
- package/dist/chunks/studio-vfq8qpjt.js +1219 -0
- package/dist/chunks/studio-vhv5tgxm.js +51 -0
- package/dist/chunks/{studio-ahn3pdgx.js → studio-vw7mzp6z.js} +52 -38
- package/dist/chunks/studio-wqpngpsk.js +174 -0
- package/dist/chunks/studio-wqz6dggm.js +1356 -0
- package/dist/chunks/{studio-92ab2jqe.js → studio-y9zedyjn.js} +14 -14
- package/dist/chunks/studio-yxa81f45.js +12 -0
- package/dist/chunks/studio-zdn2g6dt.js +148 -0
- package/dist/chunks/swatch-group-t0n6h2rn.js +139 -0
- package/dist/chunks/tabs-wbp1cdws.js +156 -0
- package/dist/chunks/textfield-abk6qyee.js +73 -0
- package/dist/chunks/toast-780pvfbv.js +27 -0
- package/dist/chunks/toast-host-3sqv46sn.js +116 -0
- package/dist/chunks/toolbar-xbh5bhtr.js +194 -0
- package/dist/chunks/tooltip-eptb614w.js +369 -0
- package/dist/chunks/tree-a73p0pqm.js +367 -0
- package/dist/chunks/{tsMode-76kr53q0.js → tsMode-jy4m86rv.js} +83 -85
- package/dist/chunks/workspace-t55jdjbx.js +69 -0
- package/dist/chunks/{ws-client-6shc5rze.js → ws-client-ny4zc51r.js} +20 -22
- package/dist/iframe-entry.js +1873 -673
- package/dist/studio.js +52757 -36535
- package/dist/workers/editor.worker.js +1040 -1085
- package/dist/workers/json.worker.js +1946 -1991
- package/dist/workers/ts.worker.js +4960 -5005
- package/index.html +1 -0
- package/package.json +18 -52
- package/src/about/about-modal.ts +72 -123
- package/src/browse/library-commands.ts +20 -49
- package/src/browse/library-layouts.ts +87 -218
- package/src/browse/library-pane.ts +406 -438
- package/src/canvas/canvas-helpers.ts +0 -49
- package/src/canvas/canvas-live-render.ts +25 -2
- package/src/canvas/canvas-render.ts +666 -231
- package/src/canvas/canvas-surface.ts +0 -1
- package/src/canvas/canvas-utils.ts +333 -113
- package/src/canvas/dialog-path.ts +76 -0
- package/src/canvas/dialog-state.ts +67 -0
- package/src/canvas/diff-marks.ts +252 -0
- package/src/canvas/diff-toolbar.ts +349 -0
- package/src/canvas/diff-view.ts +123 -0
- package/src/canvas/edit-width-drag.ts +187 -0
- package/src/canvas/edit-width.ts +150 -0
- package/src/canvas/iframe-entry.ts +125 -8
- package/src/canvas/iframe-host.ts +271 -15
- package/src/canvas/iframe-interaction.ts +133 -13
- package/src/canvas/iframe-patch.ts +7 -1
- package/src/canvas/iframe-position.ts +5 -6
- package/src/canvas/iframe-protocol.ts +106 -5
- package/src/canvas/iframe-render.ts +373 -5
- package/src/canvas/iframe-slash.ts +2 -2
- package/src/canvas/iframe-subtree.ts +5 -8
- package/src/canvas/path-mapping.ts +25 -3
- package/src/canvas/popover-path.ts +106 -0
- package/src/canvas/popover-state.ts +155 -0
- package/src/canvas/surface-registry.ts +21 -10
- package/src/collab/presence-chips.ts +51 -73
- package/src/commands/app-commands.ts +10 -0
- package/src/commands/budget.ts +12 -0
- package/src/commands/command-args.ts +404 -6
- package/src/commands/defaults.ts +44 -14
- package/src/commands/live-context.ts +11 -5
- package/src/commands/reference.ts +12 -2
- package/src/commands/registry.ts +177 -10
- package/src/commands/run-reported.ts +120 -0
- package/src/content/entry-commands.ts +16 -23
- package/src/content/entry-editor.ts +144 -101
- package/src/editor/canvas-slash-bridge.ts +2 -2
- package/src/editor/context-menu.ts +49 -200
- package/src/editor/convert-to-component.ts +42 -82
- package/src/editor/convert-to-repeater.ts +132 -173
- package/src/editor/inline-edit.ts +11 -0
- package/src/editor/shortcuts.ts +76 -49
- package/src/editor/slash-menu.ts +150 -157
- package/src/files/components.ts +39 -0
- package/src/files/file-ops.ts +117 -11
- package/src/files/files.ts +944 -660
- package/src/files/json-layout.ts +474 -0
- package/src/files/serialize-document.ts +8 -1
- package/src/format/convert-file.ts +16 -10
- package/src/format/format-host.ts +50 -1
- package/src/github/github-auth.ts +71 -29
- package/src/github/github-publish.ts +57 -65
- package/src/grid/cell-editors.ts +46 -4
- package/src/grid/cell-popovers.ts +65 -62
- package/src/grid/grid-open.ts +86 -64
- package/src/grid/grid-panel.ts +390 -469
- package/src/grid/redirects-grid.ts +40 -44
- package/src/hosting/layout.ts +2 -0
- package/src/i18n/i18n-commands.ts +137 -62
- package/src/media/media-pane.ts +83 -133
- package/src/new-project/add-repo-modal.ts +125 -176
- package/src/new-project/import-tab.ts +181 -252
- package/src/new-project/location-fields.ts +93 -160
- package/src/new-project/new-project-modal.ts +376 -367
- package/src/packages/jxsuite-update.ts +76 -18
- package/src/packages/pull-package-sync.ts +5 -1
- package/src/panels/activity-panel.ts +137 -104
- package/src/panels/ai-chat/chat-markdown.ts +15 -13
- package/src/panels/ai-chat/chat-view.ts +307 -472
- package/src/panels/ai-chat/composer.ts +175 -163
- package/src/panels/ai-chat/sessions-view.ts +31 -62
- package/src/panels/ai-panel.ts +213 -185
- package/src/panels/block-action-bar.ts +444 -645
- package/src/panels/bottom-dock.ts +112 -47
- package/src/panels/chat-panel.ts +19 -14
- package/src/panels/data-explorer.ts +141 -102
- package/src/panels/data-grid.ts +183 -150
- package/src/panels/dnd.ts +75 -20
- package/src/panels/editors.ts +26 -19
- package/src/panels/elements-panel.ts +243 -186
- package/src/panels/empty-state.ts +26 -42
- package/src/panels/events-panel.ts +950 -729
- package/src/panels/formula-workspace.ts +434 -207
- package/src/panels/frontmatter-fields.ts +185 -153
- package/src/panels/frontmatter-panel.ts +411 -187
- package/src/panels/git-diff-open.ts +148 -0
- package/src/panels/git-panel.ts +679 -605
- package/src/panels/head-panel.ts +617 -435
- package/src/panels/i18n-panel.ts +148 -135
- package/src/panels/imports-panel.ts +388 -414
- package/src/panels/jump-bar.ts +175 -147
- package/src/panels/layers-panel.ts +785 -671
- package/src/panels/left-panel.ts +166 -94
- package/src/panels/navigator-panels.ts +1 -1
- package/src/panels/pane-context.ts +529 -677
- package/src/panels/pane-grid.ts +265 -241
- package/src/panels/panel-registry.ts +15 -4
- package/src/panels/problems-panel.ts +181 -99
- package/src/panels/properties-panel.ts +1525 -966
- package/src/panels/provenance.ts +31 -113
- package/src/panels/quick-search.ts +223 -184
- package/src/panels/right-panel.ts +135 -169
- package/src/panels/seo-modal.ts +346 -167
- package/src/panels/settings-menu.ts +114 -661
- package/src/panels/settings-pane.ts +102 -86
- package/src/panels/signals-panel.ts +1318 -1172
- package/src/panels/statement-editor.ts +556 -428
- package/src/panels/style-panel.ts +1367 -630
- package/src/panels/style-utils.ts +36 -32
- package/src/panels/stylebook-doc.ts +30 -73
- package/src/panels/stylebook-layers-panel.ts +202 -109
- package/src/panels/stylebook-panel.ts +124 -88
- package/src/panels/tab-strip.ts +386 -288
- package/src/platforms/cloud.ts +106 -16
- package/src/platforms/devserver.ts +13 -0
- package/src/publish/deploy-checklist.ts +124 -78
- package/src/publish/publish-commands.ts +4 -12
- package/src/publish/publish-panel.ts +134 -328
- package/src/services/a11y-report.ts +100 -43
- package/src/services/ai-command-tools.ts +538 -0
- package/src/services/ai-project-tools.ts +8 -2
- package/src/services/ai-session-store.ts +6 -0
- package/src/services/ai-system-prompt.ts +112 -24
- package/src/services/ai-tools.ts +36 -212
- package/src/services/ai-write-report.ts +174 -0
- package/src/services/document-assistant.ts +59 -8
- package/src/services/idle.ts +16 -14
- package/src/services/live-surfaces.ts +237 -0
- package/src/services/model-uri.ts +75 -0
- package/src/services/notify.ts +63 -6
- package/src/services/popover-report.ts +325 -0
- package/src/services/surface-registry.ts +56 -0
- package/src/services/tool-executor.ts +6 -0
- package/src/settings/contexts-section.ts +301 -299
- package/src/settings/contributed-section.ts +361 -222
- package/src/settings/css-vars-editor.ts +320 -325
- package/src/settings/defs-editor.ts +572 -535
- package/src/settings/dependencies-editor.ts +79 -107
- package/src/settings/extension-commands.ts +379 -0
- package/src/settings/extension-rows.ts +113 -0
- package/src/settings/extensions-section.ts +287 -0
- package/src/settings/general-settings.ts +130 -181
- package/src/settings/head-editor.ts +10 -305
- package/src/settings/locales-section.ts +146 -196
- package/src/settings/preferences-accounts.ts +1 -1
- package/src/settings/preferences-dialog.ts +350 -330
- package/src/settings/project-sections.ts +108 -181
- package/src/settings/schema-field-ui.ts +11 -399
- package/src/settings/section-registry.ts +8 -1
- package/src/settings/settings-document.ts +31 -29
- package/src/shell/tree.ts +42 -87
- package/src/shell.ts +48 -36
- package/src/studio.ts +104 -69
- package/src/style/token-ref.ts +0 -39
- package/src/surfaces/about.json +263 -0
- package/src/surfaces/about.ts +163 -0
- package/src/surfaces/add-repo.json +486 -0
- package/src/surfaces/add-repo.ts +236 -0
- package/src/surfaces/ai-chat.json +2185 -0
- package/src/surfaces/ai-chat.ts +549 -0
- package/src/surfaces/ai-credentials-form.json +332 -0
- package/src/surfaces/ai-credentials-form.ts +151 -0
- package/src/surfaces/ai-managed-connect.json +108 -0
- package/src/surfaces/ai-managed-connect.ts +123 -0
- package/src/surfaces/ai-model-picker.json +114 -0
- package/src/surfaces/ai-model-picker.ts +139 -0
- package/src/surfaces/block-action-bar.json +640 -0
- package/src/surfaces/block-action-bar.ts +368 -0
- package/src/surfaces/bottom-dock.json +154 -0
- package/src/surfaces/bottom-dock.ts +125 -0
- package/src/surfaces/canvas-stage.json +444 -0
- package/src/surfaces/canvas-stage.ts +253 -0
- package/src/surfaces/cf-account-picker.json +300 -0
- package/src/surfaces/cf-account-picker.ts +214 -0
- package/src/surfaces/commandbar.json +985 -0
- package/src/{panels/toolbar.ts → surfaces/commandbar.ts} +417 -391
- package/src/surfaces/convert-repeater.json +309 -0
- package/src/surfaces/convert-repeater.ts +276 -0
- package/src/surfaces/data-actions.json +157 -0
- package/src/surfaces/data-actions.ts +115 -0
- package/src/surfaces/dialog.json +289 -0
- package/src/surfaces/dialog.ts +343 -0
- package/src/surfaces/diff-toolbar.json +266 -0
- package/src/surfaces/diff-toolbar.ts +139 -0
- package/src/surfaces/doc-header.json +739 -0
- package/src/surfaces/doc-header.ts +223 -0
- package/src/surfaces/empty-state.json +152 -0
- package/src/surfaces/empty-state.ts +173 -0
- package/src/surfaces/entry-editor.json +281 -0
- package/src/surfaces/entry-editor.ts +191 -0
- package/src/surfaces/expression-editor.json +977 -0
- package/src/surfaces/expression-editor.ts +266 -0
- package/src/surfaces/files-panel.json +592 -0
- package/src/surfaces/files-panel.ts +301 -0
- package/src/surfaces/formula-palette.json +364 -0
- package/src/surfaces/formula-palette.ts +340 -0
- package/src/surfaces/git-panel.json +1822 -0
- package/src/surfaces/git-panel.ts +272 -0
- package/src/surfaces/github-auth.json +112 -0
- package/src/surfaces/github-auth.ts +139 -0
- package/src/surfaces/github-publish.json +206 -0
- package/src/surfaces/github-publish.ts +169 -0
- package/src/surfaces/grid-cell.json +218 -0
- package/src/surfaces/grid-cell.ts +120 -0
- package/src/surfaces/grid-open.json +147 -0
- package/src/surfaces/grid-open.ts +87 -0
- package/src/surfaces/grid-panel.json +706 -0
- package/src/surfaces/grid-panel.ts +206 -0
- package/src/surfaces/grid-replace.json +179 -0
- package/src/surfaces/grid-replace.ts +89 -0
- package/src/surfaces/grid-views.json +446 -0
- package/src/surfaces/grid-views.ts +172 -0
- package/src/surfaces/inspector-dock.json +187 -0
- package/src/surfaces/inspector-dock.ts +161 -0
- package/src/surfaces/jump-bar.json +243 -0
- package/src/surfaces/jump-bar.ts +129 -0
- package/src/surfaces/jxsuite-update.json +146 -0
- package/src/surfaces/jxsuite-update.ts +149 -0
- package/src/surfaces/library-pane.json +1509 -0
- package/src/surfaces/library-pane.ts +363 -0
- package/src/surfaces/logic-panel.json +1949 -0
- package/src/surfaces/logic-panel.ts +369 -0
- package/src/surfaces/logic-workspace.json +685 -0
- package/src/surfaces/logic-workspace.ts +238 -0
- package/src/surfaces/media-browser.json +303 -0
- package/src/surfaces/media-browser.ts +145 -0
- package/src/surfaces/media-field.json +163 -0
- package/src/surfaces/media-field.ts +116 -0
- package/src/surfaces/media-pane.json +513 -0
- package/src/surfaces/media-pane.ts +197 -0
- package/src/surfaces/menu.json +232 -0
- package/src/surfaces/menu.ts +375 -0
- package/src/surfaces/navigator-dock.json +113 -0
- package/src/surfaces/navigator-dock.ts +130 -0
- package/src/surfaces/new-project.json +1654 -0
- package/src/surfaces/new-project.ts +411 -0
- package/src/surfaces/palette.json +535 -0
- package/src/surfaces/pane-context.json +1497 -0
- package/src/surfaces/pane-context.ts +513 -0
- package/src/surfaces/pane-grid.json +188 -0
- package/src/surfaces/pane-grid.ts +250 -0
- package/src/surfaces/panel-activity.json +563 -0
- package/src/surfaces/panel-activity.ts +187 -0
- package/src/surfaces/panel-data.json +141 -0
- package/src/surfaces/panel-data.ts +156 -0
- package/src/surfaces/panel-deploy-checklist.json +283 -0
- package/src/surfaces/panel-deploy-checklist.ts +175 -0
- package/src/surfaces/panel-elements.json +367 -0
- package/src/surfaces/panel-elements.ts +175 -0
- package/src/surfaces/panel-i18n.json +569 -0
- package/src/surfaces/panel-i18n.ts +212 -0
- package/src/surfaces/panel-imports.json +780 -0
- package/src/surfaces/panel-imports.ts +209 -0
- package/src/surfaces/panel-outline.json +734 -0
- package/src/surfaces/panel-outline.ts +326 -0
- package/src/surfaces/panel-page.json +1017 -0
- package/src/surfaces/panel-page.ts +240 -0
- package/src/surfaces/panel-problems.json +497 -0
- package/src/surfaces/panel-problems.ts +157 -0
- package/src/surfaces/panel-signals.json +1973 -0
- package/src/surfaces/panel-signals.ts +436 -0
- package/src/surfaces/panel-stylebook-layers.json +317 -0
- package/src/surfaces/panel-stylebook-layers.ts +155 -0
- package/src/surfaces/preferences.json +850 -0
- package/src/surfaces/preferences.ts +332 -0
- package/src/surfaces/progress-modal.json +110 -0
- package/src/surfaces/progress-modal.ts +150 -0
- package/src/surfaces/properties-panel.json +1578 -0
- package/src/surfaces/properties-panel.ts +337 -0
- package/src/surfaces/publish.json +945 -0
- package/src/surfaces/publish.ts +392 -0
- package/src/surfaces/push-plan.json +110 -0
- package/src/surfaces/push-plan.ts +87 -0
- package/src/surfaces/rail.json +255 -0
- package/src/surfaces/rail.ts +206 -0
- package/src/surfaces/reference-field.json +191 -0
- package/src/surfaces/reference-field.ts +168 -0
- package/src/surfaces/schema-builder.json +1011 -0
- package/src/surfaces/schema-builder.ts +181 -0
- package/src/surfaces/schema-form.json +1013 -0
- package/src/surfaces/schema-form.ts +287 -0
- package/src/surfaces/secret-field.json +60 -0
- package/src/surfaces/secret-field.ts +146 -0
- package/src/surfaces/seo.json +932 -0
- package/src/surfaces/seo.ts +334 -0
- package/src/surfaces/settings-contexts.json +538 -0
- package/src/surfaces/settings-contexts.ts +196 -0
- package/src/surfaces/settings-contributed.json +489 -0
- package/src/surfaces/settings-contributed.ts +199 -0
- package/src/surfaces/settings-css-vars.json +820 -0
- package/src/surfaces/settings-css-vars.ts +199 -0
- package/src/surfaces/settings-defs.json +1363 -0
- package/src/surfaces/settings-defs.ts +232 -0
- package/src/surfaces/settings-deploy.json +108 -0
- package/src/surfaces/settings-deploy.ts +135 -0
- package/src/surfaces/settings-extensions.json +486 -0
- package/src/surfaces/settings-extensions.ts +201 -0
- package/src/surfaces/settings-head.json +779 -0
- package/src/surfaces/settings-head.ts +397 -0
- package/src/surfaces/settings-locales.json +420 -0
- package/src/surfaces/settings-locales.ts +137 -0
- package/src/surfaces/settings-overview.json +423 -0
- package/src/surfaces/settings-overview.ts +218 -0
- package/src/surfaces/settings-packages.json +549 -0
- package/src/surfaces/settings-packages.ts +158 -0
- package/src/surfaces/settings-pane.json +147 -0
- package/src/surfaces/settings-pane.ts +150 -0
- package/src/surfaces/settings-rawjson.json +104 -0
- package/src/surfaces/settings-rawjson.ts +107 -0
- package/src/surfaces/shell.json +99 -0
- package/src/surfaces/shell.ts +30 -0
- package/src/surfaces/slash-menu.json +180 -0
- package/src/surfaces/slash-menu.ts +272 -0
- package/src/surfaces/statements.json +607 -0
- package/src/surfaces/statements.ts +238 -0
- package/src/surfaces/statusbar.json +94 -0
- package/src/{panels → surfaces}/statusbar.ts +164 -90
- package/src/surfaces/style-panel.json +1643 -0
- package/src/surfaces/style-panel.ts +338 -0
- package/src/surfaces/stylebook-chrome.json +122 -0
- package/src/surfaces/stylebook-chrome.ts +122 -0
- package/src/surfaces/tab-strip.json +448 -0
- package/src/surfaces/tab-strip.ts +200 -0
- package/src/surfaces/target-line.json +419 -0
- package/src/surfaces/target-line.ts +349 -0
- package/src/surfaces/toasts.json +189 -0
- package/src/surfaces/welcome.json +571 -0
- package/src/surfaces/welcome.ts +338 -0
- package/src/tabs/project-config.ts +111 -21
- package/src/tabs/tab.ts +52 -1
- package/src/types.ts +22 -0
- package/src/ui/ai-credentials-form.ts +104 -100
- package/src/ui/ai-managed-connect.ts +54 -36
- package/src/ui/ai-model-picker.ts +75 -47
- package/src/ui/cf-account-picker.ts +76 -141
- package/src/ui/color-selector.ts +80 -301
- package/src/ui/dynamic-slot.ts +43 -283
- package/src/ui/expression-editor.ts +797 -576
- package/src/ui/field-input.ts +8 -181
- package/src/ui/form-controls.ts +838 -366
- package/src/ui/formula-chips.ts +80 -85
- package/src/ui/kit.ts +33 -0
- package/src/ui/layers.ts +296 -593
- package/src/ui/media-picker.ts +203 -284
- package/src/ui/panel-resize.ts +251 -64
- package/src/ui/popover-surface.ts +153 -0
- package/src/ui/progress-modal.ts +22 -60
- package/src/ui/regions.ts +13 -7
- package/src/ui/schema-form.ts +906 -440
- package/src/ui/surface.ts +122 -0
- package/src/ui/unit-selector.ts +15 -131
- package/src/ui/value-source.ts +14 -0
- package/src/ui/virtual-window.ts +88 -9
- package/src/utils/canvas-media.ts +72 -0
- package/src/utils/edit-display.ts +7 -2
- package/src/utils/element-selectors.ts +69 -0
- package/src/utils/link-target.ts +2 -2
- package/src/utils/studio-utils.ts +0 -10
- package/src/view.ts +15 -0
- package/src/workspace/pane-derive.ts +36 -14
- package/src/workspace/workspace.ts +75 -6
- package/styles/canvas.css +72 -467
- package/styles/forced-colors.css +48 -82
- package/styles/forced-colors.json +41 -0
- package/styles/inspector.css +2 -1301
- package/styles/overlays.css +96 -2823
- package/styles/panels.css +6 -1423
- package/styles/shell-frame.css +272 -0
- package/styles/shell-frame.json +227 -0
- package/styles/shell.css +0 -1568
- package/styles/tokens.css +65 -136
- package/styles/tokens.json +84 -0
- package/dist/chunks/Overlay.dev-etqjwyf9.js +0 -23
- package/dist/chunks/adapter-jkcyhgtr.js +0 -14
- package/dist/chunks/cf-account-picker-en86v7x7.js +0 -163
- package/dist/chunks/cf-settings-45fgyx8y.js +0 -21
- package/dist/chunks/components-zmx10t62.js +0 -21
- package/dist/chunks/content-source-48xg86wj.js +0 -49
- package/dist/chunks/convert-to-repeater-43tfn7cs.js +0 -268
- package/dist/chunks/editor-cptq5jp1.js +0 -37
- package/dist/chunks/entry-commands-e63f1xc0.js +0 -46
- package/dist/chunks/extension-sections-txv08xxg.js +0 -311
- package/dist/chunks/file-ops-wbh4hhsx.js +0 -48
- package/dist/chunks/files-3kfkwhk4.js +0 -93
- package/dist/chunks/flow-qbfgrpeh.js +0 -634
- package/dist/chunks/focus-trap.esm-9t2drp0g.js +0 -1025
- package/dist/chunks/focus-visible-6eg70z18.js +0 -167
- package/dist/chunks/format-host-w16q81tf.js +0 -43
- package/dist/chunks/fs-events-hrrg328g.js +0 -21
- package/dist/chunks/git-panel-532whr1y.js +0 -59
- package/dist/chunks/index-zqxmqxmh.js +0 -109
- package/dist/chunks/jx-validate-8er6gbxy.js +0 -19
- package/dist/chunks/layers-panel-07hm7g5j.js +0 -67
- package/dist/chunks/layers-q75tj2mf.js +0 -45
- package/dist/chunks/lit-html-j055mkh8.js +0 -22
- package/dist/chunks/monaco-buffer-dqw0xxpx.js +0 -25
- package/dist/chunks/notify-yjm79n4s.js +0 -30
- package/dist/chunks/parse-24d0gay3.js +0 -19
- package/dist/chunks/platform-ba1j1gbh.js +0 -16
- package/dist/chunks/publish-panel-v9st96ja.js +0 -29
- package/dist/chunks/quick-search-zccjp6gv.js +0 -66
- package/dist/chunks/references-3qx8fkyp.js +0 -29
- package/dist/chunks/right-panel-vm3b6kwy.js +0 -46
- package/dist/chunks/section-registry-sx1ykvkw.js +0 -30
- package/dist/chunks/sp-overlay.dev-qgvhnxf4.js +0 -18
- package/dist/chunks/sp-popover.dev-n2etmqdp.js +0 -9
- package/dist/chunks/sp-progress-circle.dev-hryhj0es.js +0 -15
- package/dist/chunks/sp-tooltip.dev-4sastdnw.js +0 -15
- package/dist/chunks/sp-tray.dev-tkbscm06.js +0 -199
- package/dist/chunks/studio-0a5qrh01.js +0 -3
- package/dist/chunks/studio-0bq6eh7v.js +0 -12
- package/dist/chunks/studio-18j3bmcz.js +0 -14
- package/dist/chunks/studio-1ngbejft.js +0 -181
- package/dist/chunks/studio-4b5z1x43.js +0 -424
- package/dist/chunks/studio-4n2b5gzb.js +0 -357
- package/dist/chunks/studio-4rzyrtjz.js +0 -426
- package/dist/chunks/studio-5fx3g9jg.js +0 -4325
- package/dist/chunks/studio-5myknm0a.js +0 -1903
- package/dist/chunks/studio-7afd21nw.js +0 -67
- package/dist/chunks/studio-7nte2hj4.js +0 -613
- package/dist/chunks/studio-8jpzqk5s.js +0 -128
- package/dist/chunks/studio-8q517dfr.js +0 -24
- package/dist/chunks/studio-950k0dx6.js +0 -6939
- package/dist/chunks/studio-9n4mrmnb.js +0 -184
- package/dist/chunks/studio-a0tswy0w.js +0 -58
- package/dist/chunks/studio-ahnzd9rg.js +0 -23
- package/dist/chunks/studio-bgxt93ga.js +0 -62
- package/dist/chunks/studio-cmb03bg5.js +0 -13890
- package/dist/chunks/studio-d1ks410h.js +0 -175
- package/dist/chunks/studio-ef49pnzx.js +0 -387
- package/dist/chunks/studio-eqq1w638.js +0 -113
- package/dist/chunks/studio-ew0djmhg.js +0 -341
- package/dist/chunks/studio-gfgb8pe6.js +0 -1652
- package/dist/chunks/studio-h4rxscfc.js +0 -10
- package/dist/chunks/studio-jc994dnr.js +0 -1066
- package/dist/chunks/studio-kyh9avvv.js +0 -28
- package/dist/chunks/studio-m3hwn7y1.js +0 -120
- package/dist/chunks/studio-mtfnaqs9.js +0 -659
- package/dist/chunks/studio-n6j9t10q.js +0 -318
- package/dist/chunks/studio-n8b9wqwy.js +0 -291
- package/dist/chunks/studio-qcy05dp8.js +0 -1743
- package/dist/chunks/studio-qq6jym04.js +0 -53
- package/dist/chunks/studio-rdx8jcxy.js +0 -83
- package/dist/chunks/studio-rn9ta2mz.js +0 -111
- package/dist/chunks/studio-t7qb9db8.js +0 -665
- package/dist/chunks/studio-tmc5emrw.js +0 -8
- package/dist/chunks/studio-z6nw2ek2.js +0 -18
- package/dist/chunks/studio-zczps70q.js +0 -378
- package/dist/chunks/studio-zqazsct2.js +0 -1823
- package/dist/chunks/workspace-fjx52ryv.js +0 -89
- package/src/panels/activity-bar.ts +0 -251
- package/src/panels/panel-scheduler.ts +0 -219
- package/src/panels/style-inputs.ts +0 -237
- package/src/panels/target-line.ts +0 -274
- package/src/panels/welcome-screen.ts +0 -346
- package/src/ui/button-group.ts +0 -102
- package/src/ui/choice-field.ts +0 -72
- package/src/ui/field-row.ts +0 -249
- package/src/ui/formula-palette.ts +0 -213
- package/src/ui/icons.ts +0 -52
- package/src/ui/jx-theme.ts +0 -130
- package/src/ui/spectrum.ts +0 -340
- package/src/ui/value-selector.ts +0 -174
- package/src/ui/widgets.ts +0 -172
- /package/dist/chunks/{javascript-s56a8dpk.css → javascript-4abzjcy9.css} +0 -0
- /package/dist/chunks/{jsonMode-zr9sw0c7.css → jsonMode-vvmpmk34.css} +0 -0
- /package/dist/chunks/{monaco-setup-pav68602.css → monaco-setup-8vbyqnhr.css} +0 -0
- /package/dist/chunks/{tsMode-ef187txx.css → tsMode-hnxxb73h.css} +0 -0
package/src/panels/pane-grid.ts
CHANGED
|
@@ -10,44 +10,60 @@
|
|
|
10
10
|
* by whichever pane had focus, releasing the loser's artboards on the way past. This module is what
|
|
11
11
|
* that scaffolding was standing in for, and the handover is deleted with it.
|
|
12
12
|
*
|
|
13
|
-
* **
|
|
14
|
-
*
|
|
15
|
-
* `
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
13
|
+
* **The document owns the frame; this module owns the decisions.** `surfaces/pane-grid.json` is the
|
|
14
|
+
* cells, the four boxes inside each one, the splitter between two of them and every rule that lays
|
|
15
|
+
* them out; `surfaces/pane-grid.ts` is the mount. What is left here is the flow: which panes there
|
|
16
|
+
* are, what a cell's stage is furnished with, in what ORDER a departing cell is taken apart, and
|
|
17
|
+
* what the grid's own tracks are. Everything a cell CONTAINS still arrives through the module that
|
|
18
|
+
* owns it — `canvas/canvas-render.ts` is the render root of the stage and this document puts
|
|
19
|
+
* nothing inside it, `panels/jump-bar.ts` and `panels/pane-context.ts` are handed the jump and
|
|
20
|
+
* chrome boxes, and `panels/tab-strip.ts` is handed the strip.
|
|
19
21
|
*
|
|
20
|
-
*
|
|
21
|
-
* on every `shell.paneSplit` write — every `pointermove` of a drag — and it re-ran
|
|
22
|
-
* `cells[1].root.before(splitter)`, which on an already-positioned node is a REMOVE plus an insert:
|
|
23
|
-
* Chrome fires `lostpointercapture` on move #1, the rest of the gesture goes to whatever is under
|
|
24
|
-
* the cursor, and a drag asking for +0.20 lands +0.03. The old file carried "never touches an
|
|
25
|
-
* existing cell's children" as a comment; a **keyed** `repeat` makes it structural — lit MOVES an
|
|
26
|
-
* existing cell rather than recreating it, and re-parenting is not a move for the things inside a
|
|
27
|
-
* stage: an `<iframe>` that changes parent reloads, dropping its `iframe-channel` connection, its
|
|
28
|
-
* shadow document and every `ready` panel with it.
|
|
22
|
+
* **Three properties survived the conversion, and each is structural rather than remembered:**
|
|
29
23
|
*
|
|
30
|
-
*
|
|
24
|
+
* 1. _A pane is complete before it is published._ The runtime builds a `$map` row inside its own
|
|
25
|
+
* effect scope and inserts it afterwards, so the four `cellPart` calls below — the surface
|
|
26
|
+
* record, the gestures, the two bars' mounts, the pane-focus listener — all happen while the
|
|
27
|
+
* cell is still detached. There is no frame in which a cell exists with no stage inside it.
|
|
28
|
+
* 2. _A pane's node is never re-parented._ The repeater is keyed on the pane id and the runtime's
|
|
29
|
+
* forward-cursor pass only moves rows that are out of place. `workspace.panes[0]` is always the
|
|
30
|
+
* primary and `MAX_PANES` is 2, so no row ever moves — which matters because re-parenting is not
|
|
31
|
+
* a move for an `<iframe>`: it reloads, dropping its `iframe-channel` connection, its shadow
|
|
32
|
+
* document and every `ready` panel with it.
|
|
33
|
+
* 3. _A drag moves a track edge and never a node._ {@link layout} writes ONE inline property on the
|
|
34
|
+
* HOST, which is outside the document, and the projection is skipped entirely when the pane set
|
|
35
|
+
* has not changed — so the five `shell.paneSplit` writes a drag makes reach no markup at all.
|
|
36
|
+
* The predecessor re-ran `cells[1].root.before(splitter)` from here, and `.before()` on an
|
|
37
|
+
* already-positioned node is a REMOVE plus an insert: Chrome fires `lostpointercapture` on move
|
|
38
|
+
* #1, the rest of the gesture goes to whatever is under the cursor, and a drag asking for +0.20
|
|
39
|
+
* lands +0.03.
|
|
31
40
|
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
41
|
+
* **The splitter is `jx-split` (ui.md §5.5), and the drag left this module with it.** It used to be
|
|
42
|
+
* a bare div carrying `role="separator"` and a `setupHandle` call from here — which meant the one
|
|
43
|
+
* dock-sized thing in Studio that no keyboard could move: no tab stop, no `aria-valuenow`, no
|
|
44
|
+
* arrows, and a double click that reset the split as the only gesture a pointer could reach without
|
|
45
|
+
* dragging. What is left here is the two lines a host actually owns: {@link setPaneSplit} on every
|
|
46
|
+
* move and {@link persistDocks} on every commit. The element measures the grid itself, so the 320px
|
|
47
|
+
* floor is handed over in pixels and converted against the box it is actually dividing — and the
|
|
48
|
+
* `scale`, `min` and `max` closures that read `clientWidth` on every `pointermove` are gone, along
|
|
49
|
+
* with the window-resize staleness they were paying for.
|
|
50
|
+
*
|
|
51
|
+
* The fourth rule of §18.1 — _a pane with nothing in it is a hole in the grid_ — is enforced in
|
|
52
|
+
* `workspace/workspace.ts`, where the tabs are. This module never repairs: repairing inside a
|
|
53
|
+
* reactive effect that writes `workspace.panes` is an effect that triggers itself.
|
|
42
54
|
*/
|
|
43
55
|
|
|
44
|
-
import { html, render as litRender, nothing } from "lit-html";
|
|
45
|
-
import { repeat } from "lit-html/directives/repeat.js";
|
|
46
|
-
import { ref } from "lit-html/directives/ref.js";
|
|
47
56
|
import { effect, effectScope } from "../reactivity";
|
|
48
|
-
import { persistDocks, registerShellSurface, setPaneSplit, shell } from "../shell";
|
|
49
57
|
import {
|
|
50
|
-
|
|
58
|
+
DEFAULT_PANE_SPLIT,
|
|
59
|
+
PANE_SPLIT_MAX,
|
|
60
|
+
PANE_SPLIT_MIN,
|
|
61
|
+
persistDocks,
|
|
62
|
+
registerShellSurface,
|
|
63
|
+
setPaneSplit,
|
|
64
|
+
shell,
|
|
65
|
+
} from "../shell";
|
|
66
|
+
import {
|
|
51
67
|
createPaneSurface,
|
|
52
68
|
disposePaneSurface,
|
|
53
69
|
registerCanvasSurface,
|
|
@@ -59,10 +75,10 @@ import { paneRegion, paneStripRegion } from "../ui/regions";
|
|
|
59
75
|
import { attachJumpBarHost } from "./jump-bar";
|
|
60
76
|
import { attachPaneChromeHost } from "./pane-context";
|
|
61
77
|
import { focusPane, workspace } from "../workspace/workspace";
|
|
62
|
-
import {
|
|
78
|
+
import { mountPaneGridSurface } from "../surfaces/pane-grid";
|
|
63
79
|
import type { EffectScope } from "@vue/reactivity";
|
|
64
80
|
import type { CanvasSurface } from "../canvas/canvas-surface";
|
|
65
|
-
import type {
|
|
81
|
+
import type { PaneCellPart, PaneGridRow, PaneGridSurface } from "../surfaces/pane-grid";
|
|
66
82
|
|
|
67
83
|
/** One drawn pane: its root and the four surfaces inside it. */
|
|
68
84
|
export interface PaneCell {
|
|
@@ -75,30 +91,23 @@ export interface PaneCell {
|
|
|
75
91
|
surface: CanvasSurface;
|
|
76
92
|
}
|
|
77
93
|
|
|
78
|
-
/**
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
* The callbacks are MEMOISED per pane id, and that is not an optimisation. lit's `ref` directive
|
|
82
|
-
* compares the callback by identity: hand it a fresh closure on a re-render and it calls the old
|
|
83
|
-
* one with `undefined` and the new one with the element — a detach and a re-attach of a live host,
|
|
84
|
-
* on every pass. Stable callbacks mean an unchanged cell's refs are never called again at all.
|
|
85
|
-
*/
|
|
86
|
-
interface CellRefs extends PaneCell {
|
|
87
|
-
onRoot: (el?: Element) => void;
|
|
88
|
-
onStrip: (el?: Element) => void;
|
|
89
|
-
onJump: (el?: Element) => void;
|
|
90
|
-
onChrome: (el?: Element) => void;
|
|
91
|
-
onStage: (el?: Element) => void;
|
|
92
|
-
/** Capture-phase `pointerdown` on the cell root — see {@link cellRefs}. */
|
|
93
|
-
onPointerDown: { handleEvent: () => void; capture: true };
|
|
94
|
-
/** Stage-gesture disposer, live between the stage's attach and its detach. */
|
|
94
|
+
/** A cell's record, plus the disposer its stage gestures live behind. */
|
|
95
|
+
interface CellState extends PaneCell {
|
|
96
|
+
/** Stage-gesture disposer, live between the stage's creation and the cell's disposal. */
|
|
95
97
|
releaseGestures: (() => void) | null;
|
|
96
98
|
}
|
|
97
99
|
|
|
98
|
-
const _cells = new Map<string,
|
|
100
|
+
const _cells = new Map<string, CellState>();
|
|
99
101
|
|
|
100
102
|
let _grid: HTMLElement | null = null;
|
|
101
103
|
|
|
104
|
+
let _surface: PaneGridSurface | null = null;
|
|
105
|
+
|
|
106
|
+
let _ready: Promise<void> | null = null;
|
|
107
|
+
|
|
108
|
+
/** The pane ids the document has been asked to draw. The projection's dirty check. */
|
|
109
|
+
let _drawn: string[] = [];
|
|
110
|
+
|
|
102
111
|
let _scope: EffectScope | null = null;
|
|
103
112
|
|
|
104
113
|
/** The cell a pane is drawn in, or null. Test-visible, and the bootstrap's handle on the primary. */
|
|
@@ -106,108 +115,34 @@ export function cellForPane(paneId: string): PaneCell | null {
|
|
|
106
115
|
return _cells.get(paneId) ?? null;
|
|
107
116
|
}
|
|
108
117
|
|
|
109
|
-
/**
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
118
|
+
/**
|
|
119
|
+
* Settles once the first projection is in the document.
|
|
120
|
+
*
|
|
121
|
+
* The mount is asynchronous — the runtime waits for the kit to be defined and renders one microtask
|
|
122
|
+
* after that — so `mountShell()` starting the grid is not the same event as the grid existing. The
|
|
123
|
+
* bootstrap reads the primary cell's four boxes on the line after it, exactly as `mountShellTree()`
|
|
124
|
+
* made every caller await the frame for the same reason.
|
|
125
|
+
*/
|
|
126
|
+
export function paneGridReady(): Promise<void> {
|
|
127
|
+
return _ready ?? Promise.resolve();
|
|
114
128
|
}
|
|
115
129
|
|
|
116
130
|
/**
|
|
117
|
-
* The record for a pane, created
|
|
131
|
+
* The record for a pane, created when its cell's outermost box is, and reused for the life of the
|
|
132
|
+
* cell.
|
|
118
133
|
*
|
|
119
134
|
* Every element field is typed non-null and starts null, the same bargain `CanvasSurface` makes:
|
|
120
|
-
*
|
|
135
|
+
* the runtime creates a row's nodes depth-first inside one synchronous render pass, so the record
|
|
136
|
+
* is complete before anything outside that pass can hold it.
|
|
121
137
|
*/
|
|
122
|
-
function
|
|
138
|
+
function cellState(paneId: string): CellState {
|
|
123
139
|
const existing = _cells.get(paneId);
|
|
124
140
|
if (existing) {
|
|
125
141
|
return existing;
|
|
126
142
|
}
|
|
127
|
-
|
|
128
|
-
bodies only run when lit commits a part, so there is no temporal-dead-zone read — and a record
|
|
129
|
-
that is complete on the line it is created cannot be half-wired by an early return later. */
|
|
130
|
-
const cell: CellRefs = {
|
|
143
|
+
const cell: CellState = {
|
|
131
144
|
chrome: null as unknown as HTMLElement,
|
|
132
145
|
jump: null as unknown as HTMLElement,
|
|
133
|
-
/* The two bars are HANDED their host rather than resolving a region, the same way
|
|
134
|
-
`panels/frontmatter-panel.ts` is handed the stage. They cannot resolve one the way the tab
|
|
135
|
-
strip does: the strip's host carries `pane.<id>/tabs` and nothing inside it re-stamps that
|
|
136
|
-
id, while the jump bar and the context bar both stamp `pane.<id>/jump` and
|
|
137
|
-
`pane.<id>/context` on markup they render INSIDE these two divs — so a region on the wrapper
|
|
138
|
-
as well would put the same id on two nested elements, and `resolveRegion` takes the LAST
|
|
139
|
-
match. Sixty shots crop `pane.primary/context`; a second, larger element carrying it is a
|
|
140
|
-
silently widened crop. */
|
|
141
|
-
onChrome: (el?: Element) => {
|
|
142
|
-
if (el) {
|
|
143
|
-
cell.chrome = el as HTMLElement;
|
|
144
|
-
}
|
|
145
|
-
attachPaneChromeHost(paneId, (el as HTMLElement | undefined) ?? null);
|
|
146
|
-
},
|
|
147
|
-
onJump: (el?: Element) => {
|
|
148
|
-
if (el) {
|
|
149
|
-
cell.jump = el as HTMLElement;
|
|
150
|
-
}
|
|
151
|
-
attachJumpBarHost(paneId, (el as HTMLElement | undefined) ?? null);
|
|
152
|
-
},
|
|
153
|
-
/**
|
|
154
|
-
* **A pointer landing anywhere in this cell puts the keyboard in this pane.**
|
|
155
|
-
*
|
|
156
|
-
* Before this, `panels/tab-strip.ts`'s strip row was the ONLY thing in the app that moved
|
|
157
|
-
* `workspace.activePaneId` by pointer, so a click on the side pane's canvas, its context bar,
|
|
158
|
-
* its Library, its Code editor or its entry form selected and edited that pane's document while
|
|
159
|
-
* every keyboard command, the Inspector, the block action bar and the overlay effect went on
|
|
160
|
-
* answering for the other one.
|
|
161
|
-
*
|
|
162
|
-
* ONE listener, on the cell, because the cell is the only thing that knows which pane a click
|
|
163
|
-
* is IN. The alternative — a `focusPane` call in each of the seven surfaces a pane can contain
|
|
164
|
-
* — is a list that a new surface joins by being remembered.
|
|
165
|
-
*
|
|
166
|
-
* Three properties it needs, and where each comes from:
|
|
167
|
-
*
|
|
168
|
-
* 1. _It must not disturb a control mid-interaction._ It moves the pane focus, never the DOM
|
|
169
|
-
* focus, so a text field in the context bar keeps its caret and its selection; and it fires
|
|
170
|
-
* on `pointerdown`, before any gesture has begun. The pane SPLITTER is a sibling of the
|
|
171
|
-
* cells rather than a child of one, so a splitter drag never reaches this at all.
|
|
172
|
-
* 2. _It must reach clicks inside the canvas._ It cannot: those land in a cross-origin iframe and
|
|
173
|
-
* never surface as a parent-realm pointer event. `canvas/iframe-host.ts`'s `hit` /
|
|
174
|
-
* `layoutHit` handlers are that seam and call {@link focusPane} themselves, from the pane
|
|
175
|
-
* that mounted the artboard.
|
|
176
|
-
* 3. _It must cost nothing when the pane is already focused._ {@link focusPane} returns early in
|
|
177
|
-
* that case — the guard is in the module that owns focus, because a function handed a
|
|
178
|
-
* `paneId` may not read the focus (`scripts/check-pane-singletons.ts` rule 4).
|
|
179
|
-
*
|
|
180
|
-
* CAPTURE phase, so a surface inside the cell that stops propagation cannot silently take the
|
|
181
|
-
* pane's focus with it. `studio.ts`'s commit-on-parent-click listener is on `document`, so it
|
|
182
|
-
* still runs first and the outgoing inline-edit session is committed before focus moves.
|
|
183
|
-
*/
|
|
184
|
-
onPointerDown: {
|
|
185
|
-
capture: true,
|
|
186
|
-
handleEvent: () => {
|
|
187
|
-
focusPane(paneId);
|
|
188
|
-
},
|
|
189
|
-
},
|
|
190
|
-
/* Every element field is written on ATTACH and left alone on detach. A caller holding the
|
|
191
|
-
record when its pane goes away — `studio.ts`'s primary cell, three tests — asks it what the
|
|
192
|
-
cell WAS, and `root.isConnected === false` is the honest answer to that where `root === null`
|
|
193
|
-
is a `TypeError`. `_cells` forgetting the pane is what makes the cell gone. */
|
|
194
|
-
onRoot: (el?: Element) => {
|
|
195
|
-
if (el) {
|
|
196
|
-
cell.root = el as HTMLElement;
|
|
197
|
-
}
|
|
198
|
-
},
|
|
199
|
-
onStage: (el?: Element) => {
|
|
200
|
-
if (el) {
|
|
201
|
-
attachStage(cell, el as HTMLElement);
|
|
202
|
-
return;
|
|
203
|
-
}
|
|
204
|
-
detachStage(cell);
|
|
205
|
-
},
|
|
206
|
-
onStrip: (el?: Element) => {
|
|
207
|
-
if (el) {
|
|
208
|
-
cell.strip = el as HTMLElement;
|
|
209
|
-
}
|
|
210
|
-
},
|
|
211
146
|
paneId,
|
|
212
147
|
releaseGestures: null,
|
|
213
148
|
root: null as unknown as HTMLElement,
|
|
@@ -219,15 +154,61 @@ function cellRefs(paneId: string): CellRefs {
|
|
|
219
154
|
return cell;
|
|
220
155
|
}
|
|
221
156
|
|
|
157
|
+
/**
|
|
158
|
+
* **A pointer landing anywhere in this cell puts the keyboard in this pane.**
|
|
159
|
+
*
|
|
160
|
+
* Before this, `panels/tab-strip.ts`'s strip row was the ONLY thing in the app that moved
|
|
161
|
+
* `workspace.activePaneId` by pointer, so a click on the side pane's canvas, its context bar, its
|
|
162
|
+
* Library, its Code editor or its entry form selected and edited that pane's document while every
|
|
163
|
+
* keyboard command, the Inspector, the block action bar and the overlay effect went on answering
|
|
164
|
+
* for the other one.
|
|
165
|
+
*
|
|
166
|
+
* ONE listener, on the cell, because the cell is the only thing that knows which pane a click is
|
|
167
|
+
* IN. The alternative — a `focusPane` call in each of the seven surfaces a pane can contain — is a
|
|
168
|
+
* list that a new surface joins by being remembered.
|
|
169
|
+
*
|
|
170
|
+
* Three properties it needs, and where each comes from:
|
|
171
|
+
*
|
|
172
|
+
* 1. _It must not disturb a control mid-interaction._ It moves the pane focus, never the DOM focus, so
|
|
173
|
+
* a text field in the context bar keeps its caret and its selection; and it fires on
|
|
174
|
+
* `pointerdown`, before any gesture has begun. The pane SPLITTER is a sibling of the cells
|
|
175
|
+
* rather than a child of one, so a splitter drag never reaches this at all.
|
|
176
|
+
* 2. _It must reach clicks inside the canvas._ It cannot: those land in a cross-origin iframe and
|
|
177
|
+
* never surface as a parent-realm pointer event. `canvas/iframe-host.ts`'s `hit` / `layoutHit`
|
|
178
|
+
* handlers are that seam and call {@link focusPane} themselves, from the pane that mounted the
|
|
179
|
+
* artboard.
|
|
180
|
+
* 3. _It must cost nothing when the pane is already focused._ {@link focusPane} returns early in that
|
|
181
|
+
* case — the guard is in the module that owns focus, because a function handed a `paneId` may
|
|
182
|
+
* not read the focus (`scripts/check-pane-singletons.ts` rule 4).
|
|
183
|
+
*
|
|
184
|
+
* CAPTURE phase, so a surface inside the cell that stops propagation cannot silently take the
|
|
185
|
+
* pane's focus with it. `studio.ts`'s commit-on-parent-click listener is on `document`, so it still
|
|
186
|
+
* runs first and the outgoing inline-edit session is committed before focus moves.
|
|
187
|
+
*
|
|
188
|
+
* **It is attached here rather than declared in the document** because a document's `on*` key binds
|
|
189
|
+
* through `addEventListener` with no options, so capture cannot be expressed in a Jx document at
|
|
190
|
+
* all. The node's lifetime is the row's, so there is nothing to remove: the listener goes when the
|
|
191
|
+
* repeater drops the node.
|
|
192
|
+
*/
|
|
193
|
+
function watchPaneFocus(paneId: string, root: HTMLElement): void {
|
|
194
|
+
root.addEventListener(
|
|
195
|
+
"pointerdown",
|
|
196
|
+
() => {
|
|
197
|
+
focusPane(paneId);
|
|
198
|
+
},
|
|
199
|
+
{ capture: true },
|
|
200
|
+
);
|
|
201
|
+
}
|
|
202
|
+
|
|
222
203
|
/**
|
|
223
204
|
* Furnish a pane's stage: its surface record, its host registration and its gestures.
|
|
224
205
|
*
|
|
225
|
-
* Runs while the cell is still inside
|
|
226
|
-
* rather than by the caller because nothing else is keyed on a pane appearing — both
|
|
227
|
-
* key on the active TAB, which a split does not change — and by the time the frame
|
|
228
|
-
* is in the document.
|
|
206
|
+
* Runs while the cell is still inside the runtime's render pass (§18.1 rule 1). The render is
|
|
207
|
+
* SCHEDULED here rather than by the caller because nothing else is keyed on a pane appearing — both
|
|
208
|
+
* canvas effects key on the active TAB, which a split does not change — and by the time the frame
|
|
209
|
+
* runs, the cell is in the document.
|
|
229
210
|
*/
|
|
230
|
-
function attachStage(cell:
|
|
211
|
+
function attachStage(cell: CellState, stage: HTMLElement): void {
|
|
231
212
|
cell.stage = stage;
|
|
232
213
|
cell.surface = createPaneSurface(cell.paneId);
|
|
233
214
|
registerCanvasSurface(cell.paneId, stage);
|
|
@@ -236,110 +217,135 @@ function attachStage(cell: CellRefs, stage: HTMLElement): void {
|
|
|
236
217
|
}
|
|
237
218
|
|
|
238
219
|
/**
|
|
239
|
-
*
|
|
220
|
+
* One of a cell's five boxes has been created. Fill the record in, and wire what belongs to it.
|
|
240
221
|
*
|
|
241
|
-
* The
|
|
242
|
-
* `
|
|
243
|
-
*
|
|
244
|
-
*
|
|
245
|
-
*
|
|
246
|
-
*
|
|
247
|
-
*
|
|
222
|
+
* The two bars are HANDED their host rather than resolving a region, the same way
|
|
223
|
+
* `panels/frontmatter-panel.ts` is handed the stage. They cannot resolve one the way the tab strip
|
|
224
|
+
* does: the strip's host carries `pane.<id>/tabs` and nothing inside it re-stamps that id, while
|
|
225
|
+
* the jump bar and the context bar both stamp `pane.<id>/jump` and `pane.<id>/context` on markup
|
|
226
|
+
* they render INSIDE their two boxes — so a region on the wrapper as well would put the same id on
|
|
227
|
+
* two nested elements, and `resolveRegion` takes the LAST match. Sixty shots crop
|
|
228
|
+
* `pane.primary/context`; a second, larger element carrying it is a silently widened crop.
|
|
248
229
|
*/
|
|
249
|
-
function
|
|
230
|
+
function cellPart(paneId: string, part: PaneCellPart, element: HTMLElement): void {
|
|
231
|
+
const cell = cellState(paneId);
|
|
232
|
+
if (part === "pane") {
|
|
233
|
+
cell.root = element;
|
|
234
|
+
watchPaneFocus(paneId, element);
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
if (part === "strip") {
|
|
238
|
+
cell.strip = element;
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
if (part === "jump") {
|
|
242
|
+
cell.jump = element;
|
|
243
|
+
attachJumpBarHost(paneId, element);
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
if (part === "chrome") {
|
|
247
|
+
cell.chrome = element;
|
|
248
|
+
attachPaneChromeHost(paneId, element);
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
attachStage(cell, element);
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* Take a pane's cell apart, in the one order that works, BEFORE the repeater removes it.
|
|
256
|
+
*
|
|
257
|
+
* The lit predecessor got this ordering from a framework: a part is notified of its disconnection
|
|
258
|
+
* and only then are its nodes removed, so a `ref` detach ran while the stage still had its children
|
|
259
|
+
* in it. A document has no detach counterpart to `onNodeCreated`, so the order is stated here
|
|
260
|
+
* instead — which is the stronger arrangement, because it no longer depends on when a renderer
|
|
261
|
+
* chooses to tell anybody.
|
|
262
|
+
*
|
|
263
|
+
* The order is the document's own, and each step needs the one before it:
|
|
264
|
+
*
|
|
265
|
+
* - The two bars go first, each disposing a mount whose DOM is inside this cell — the runtime that
|
|
266
|
+
* owns it is about to be unreachable.
|
|
267
|
+
* - `releaseCanvasHosts` goes before `disposePaneSurface` and while `stage` still CONTAINS its
|
|
268
|
+
* frames, which is the whole reason it can find them. A frame released later is noticed only by
|
|
269
|
+
* whichever lazy `liveHosts` walk runs next, so its channel's `window` "message" listener and its
|
|
270
|
+
* overlay would outlive the pane.
|
|
271
|
+
* - `disposePaneSurface` comes last, because it is what stops the artboards' render scopes and clears
|
|
272
|
+
* the record the hosts resolve through.
|
|
273
|
+
*/
|
|
274
|
+
function disposeCell(cell: CellState): void {
|
|
275
|
+
attachJumpBarHost(cell.paneId, null);
|
|
276
|
+
attachPaneChromeHost(cell.paneId, null);
|
|
250
277
|
cell.releaseGestures?.();
|
|
251
278
|
cell.releaseGestures = null;
|
|
252
279
|
if (cell.stage) {
|
|
253
280
|
releaseCanvasHosts(cell.stage);
|
|
254
281
|
}
|
|
255
282
|
disposePaneSurface(cell.paneId);
|
|
283
|
+
/* Every element field is left alone. A caller holding the record when its pane goes away —
|
|
284
|
+
`studio.ts`'s primary cell, three tests — asks it what the cell WAS, and `root.isConnected ===
|
|
285
|
+
false` is the honest answer to that where `root === null` is a `TypeError`. `_cells` forgetting
|
|
286
|
+
the pane is what makes the cell gone. */
|
|
256
287
|
_cells.delete(cell.paneId);
|
|
257
288
|
}
|
|
258
289
|
|
|
259
|
-
/**
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
* `canvas/canvas-render.ts` is that element's lit render root — a node cannot have two owners of
|
|
268
|
-
* its child list.
|
|
269
|
-
*/
|
|
270
|
-
function cellTpl(paneId: string): TemplateResult {
|
|
271
|
-
const cell = cellRefs(paneId);
|
|
272
|
-
return html`
|
|
273
|
-
<div class="pane" data-pane-id=${paneId} @pointerdown=${cell.onPointerDown} ${ref(cell.onRoot)}>
|
|
274
|
-
<div class="pane-strip" data-jx-region=${paneStripRegion(paneId)} ${ref(cell.onStrip)}></div>
|
|
275
|
-
<div class="pane-jump" ${ref(cell.onJump)}></div>
|
|
276
|
-
<div class="pane-chrome" ${ref(cell.onChrome)}></div>
|
|
277
|
-
<div class=${STAGE_CLASS} data-jx-region=${paneRegion(paneId)} ${ref(cell.onStage)}></div>
|
|
278
|
-
</div>
|
|
279
|
-
`;
|
|
290
|
+
/** `workspace.panes`, as the rows the document draws. */
|
|
291
|
+
function rows(): PaneGridRow[] {
|
|
292
|
+
return workspace.panes.map((pane, index) => ({
|
|
293
|
+
id: pane.id,
|
|
294
|
+
region: paneRegion(pane.id),
|
|
295
|
+
split: index > 0 ? "shown" : "hidden",
|
|
296
|
+
stripRegion: paneStripRegion(pane.id),
|
|
297
|
+
}));
|
|
280
298
|
}
|
|
281
299
|
|
|
282
|
-
/**
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
* A module-level function, so lit's `ref` sees the same callback on every pass and never re-runs
|
|
286
|
-
* it. That is the whole of defect S2's fix: a node the template owns is created when the second
|
|
287
|
-
* cell appears and removed when it goes, and NOTHING in between re-inserts it — so a pointer
|
|
288
|
-
* capture taken on `pointerdown` survives the drag that writes `shell.paneSplit` five times.
|
|
289
|
-
*/
|
|
290
|
-
const onSplitter = (el?: Element): void => {
|
|
291
|
-
if (!el) {
|
|
292
|
-
return;
|
|
293
|
-
}
|
|
294
|
-
setupHandle(el as HTMLElement, {
|
|
295
|
-
axis: "x",
|
|
296
|
-
// The floor is a pane, not a sliver: 320px is the narrowest an Inspector-less editor is
|
|
297
|
-
// Usable at, and the same number on both sides is what makes a drag symmetrical.
|
|
298
|
-
max: () => Math.max(0.2, 1 - 320 / Math.max(1, gridWidth())),
|
|
299
|
-
min: () => Math.min(0.8, 320 / Math.max(1, gridWidth())),
|
|
300
|
-
read: () => shell.paneSplit,
|
|
301
|
-
reset: () => 0.5,
|
|
302
|
-
// A drag is px against the measured grid; the stored value is a RATIO, so the same layout
|
|
303
|
-
// Survives a window resize.
|
|
304
|
-
scale: () => 1 / Math.max(1, gridWidth()),
|
|
305
|
-
settle: () => persistDocks(),
|
|
306
|
-
write: (value) => setPaneSplit(value),
|
|
307
|
-
});
|
|
308
|
-
};
|
|
309
|
-
|
|
310
|
-
/** The splitter, as a template. */
|
|
311
|
-
function splitterTpl(): TemplateResult {
|
|
312
|
-
return html`<div class="resize-handle pane-splitter" ${ref(onSplitter)}></div>`;
|
|
300
|
+
/** Whether two id lists name the same panes in the same order. */
|
|
301
|
+
function sameOrder(a: readonly string[], b: readonly string[]): boolean {
|
|
302
|
+
return a.length === b.length && a.every((id, index) => id === b[index]);
|
|
313
303
|
}
|
|
314
304
|
|
|
315
305
|
/**
|
|
316
|
-
* The
|
|
306
|
+
* The floor: a pane, not a sliver.
|
|
317
307
|
*
|
|
318
|
-
*
|
|
319
|
-
*
|
|
320
|
-
*
|
|
321
|
-
*
|
|
322
|
-
*
|
|
308
|
+
* 320px is the narrowest an Inspector-less editor is usable at, and the same number on both sides
|
|
309
|
+
* is what makes a drag symmetrical. It is handed to `jx-split` in PIXELS and converted there
|
|
310
|
+
* against the track the element measures for itself, which is the whole reason nothing in this
|
|
311
|
+
* module has to notice a window resize: a fractional floor computed from a width here would be
|
|
312
|
+
* wrong the moment the width changed, and wrong in the direction that lets a pane go below it.
|
|
323
313
|
*/
|
|
324
|
-
|
|
325
|
-
return html`${repeat(
|
|
326
|
-
workspace.panes,
|
|
327
|
-
(pane) => pane.id,
|
|
328
|
-
(pane, index) => html`${index > 0 ? splitterTpl() : nothing}${cellTpl(pane.id)}`,
|
|
329
|
-
)}`;
|
|
330
|
-
}
|
|
314
|
+
const MIN_PANE_PX = 320;
|
|
331
315
|
|
|
332
316
|
/**
|
|
333
317
|
* Bring the drawn cells into line with `workspace.panes`. Idempotent by construction.
|
|
334
318
|
*
|
|
319
|
+
* The pane set is compared before anything is written, and that dirty check is load-bearing rather
|
|
320
|
+
* than thrifty: the effect below re-runs on every `shell.paneSplit` write — which is every
|
|
321
|
+
* `pointermove` of a splitter drag — and a projection that reached the document on each of them
|
|
322
|
+
* would re-commit every binding in every row mid-gesture.
|
|
323
|
+
*
|
|
335
324
|
* Exported for the tests, which need to drive it without a reactive tick.
|
|
336
325
|
*/
|
|
337
326
|
export function reconcile(): void {
|
|
338
|
-
|
|
327
|
+
const grid = _grid;
|
|
328
|
+
if (!grid || !_surface) {
|
|
339
329
|
return;
|
|
340
330
|
}
|
|
341
|
-
|
|
342
|
-
|
|
331
|
+
const next = rows();
|
|
332
|
+
const ids = next.map((row) => row.id);
|
|
333
|
+
if (!sameOrder(ids, _drawn)) {
|
|
334
|
+
/* BEFORE the projection, so the teardown runs while the cell is still standing. See
|
|
335
|
+
{@link disposeCell}: the repeater removes a departed row's node without telling anybody, so
|
|
336
|
+
the order the frames come down in is this module's to state. */
|
|
337
|
+
for (const paneId of _drawn) {
|
|
338
|
+
if (!ids.includes(paneId)) {
|
|
339
|
+
const cell = _cells.get(paneId);
|
|
340
|
+
if (cell) {
|
|
341
|
+
disposeCell(cell);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
_drawn = ids;
|
|
346
|
+
_surface.update(next, shell.paneSplit);
|
|
347
|
+
}
|
|
348
|
+
layout(grid);
|
|
343
349
|
}
|
|
344
350
|
|
|
345
351
|
/**
|
|
@@ -349,23 +355,21 @@ export function reconcile(): void {
|
|
|
349
355
|
* `workspace.panes.length`, and the shell effect must not read the workspace — a dock resize would
|
|
350
356
|
* then re-run on every tab change. The shell owns `--pane-split`; the grid owns what it means.
|
|
351
357
|
*
|
|
352
|
-
* It writes ONE style property
|
|
353
|
-
* that lands here can move a track edge but can never move a node.
|
|
358
|
+
* It writes ONE style property, on the HOST rather than on anything the document drew, and touches
|
|
359
|
+
* no child: a `pointermove` that lands here can move a track edge but can never move a node. It
|
|
360
|
+
* counts PANES rather than drawn cells, because the document's rows land one microtask after the
|
|
361
|
+
* model does and a track count that lagged them would flash a full-width primary on every split.
|
|
362
|
+
*
|
|
363
|
+
* The host is a PARAMETER rather than a module read, because {@link reconcile} has already answered
|
|
364
|
+
* "is there a grid" and a second null check here is a branch nothing can reach.
|
|
354
365
|
*/
|
|
355
|
-
function layout(): void {
|
|
356
|
-
if (
|
|
357
|
-
|
|
358
|
-
}
|
|
359
|
-
if (paneCells().length < 2) {
|
|
360
|
-
_grid.style.gridTemplateColumns = "minmax(0, 1fr)";
|
|
366
|
+
function layout(grid: HTMLElement): void {
|
|
367
|
+
if (workspace.panes.length < 2) {
|
|
368
|
+
grid.style.gridTemplateColumns = "minmax(0, 1fr)";
|
|
361
369
|
return;
|
|
362
370
|
}
|
|
363
371
|
const split = shell.paneSplit;
|
|
364
|
-
|
|
365
|
-
}
|
|
366
|
-
|
|
367
|
-
function gridWidth(): number {
|
|
368
|
-
return _grid?.clientWidth ?? 0;
|
|
372
|
+
grid.style.gridTemplateColumns = `minmax(0, ${split}fr) 5px minmax(0, ${1 - split}fr)`;
|
|
369
373
|
}
|
|
370
374
|
|
|
371
375
|
/** Mount the grid. Called by `shell.ts`'s `mountShell()`, like every other shell surface. */
|
|
@@ -377,6 +381,21 @@ export function mount(): void {
|
|
|
377
381
|
if (!_grid) {
|
|
378
382
|
return;
|
|
379
383
|
}
|
|
384
|
+
const first = rows();
|
|
385
|
+
_drawn = first.map((row) => row.id);
|
|
386
|
+
_surface = mountPaneGridSurface(
|
|
387
|
+
_grid,
|
|
388
|
+
first,
|
|
389
|
+
{
|
|
390
|
+
collapse: DEFAULT_PANE_SPLIT,
|
|
391
|
+
gap: MIN_PANE_PX,
|
|
392
|
+
max: PANE_SPLIT_MAX,
|
|
393
|
+
min: PANE_SPLIT_MIN,
|
|
394
|
+
value: shell.paneSplit,
|
|
395
|
+
},
|
|
396
|
+
{ cellPart, move: setPaneSplit, settle: persistDocks },
|
|
397
|
+
);
|
|
398
|
+
_ready = _surface.ready;
|
|
380
399
|
_scope = effectScope();
|
|
381
400
|
_scope.run(() => {
|
|
382
401
|
effect(() => {
|
|
@@ -393,12 +412,17 @@ export function mount(): void {
|
|
|
393
412
|
export function unmount(): void {
|
|
394
413
|
_scope?.stop();
|
|
395
414
|
_scope = null;
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
415
|
+
/* Every cell is taken apart by the same ordered teardown a departing one gets, and BEFORE the
|
|
416
|
+
document goes: doing it afterwards would hand `releaseCanvasHosts` a stage whose frames the
|
|
417
|
+
runtime had already dropped. */
|
|
418
|
+
const standing = [..._cells.values()];
|
|
419
|
+
for (const cell of standing) {
|
|
420
|
+
disposeCell(cell);
|
|
401
421
|
}
|
|
422
|
+
_surface?.dispose();
|
|
423
|
+
_surface = null;
|
|
424
|
+
_ready = null;
|
|
425
|
+
_drawn = [];
|
|
402
426
|
_cells.clear();
|
|
403
427
|
_grid = null;
|
|
404
428
|
}
|