@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
|
@@ -0,0 +1,448 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://jxsuite.com/schema/v1",
|
|
3
|
+
"$id": "StudioTabStrip",
|
|
4
|
+
"$description": "One pane's tab strip, as a Jx document over the kit: a real `tablist` of `jx-tab`s, or — for a pane that owns no document — the derivation chip naming what it is a projection of, and in both cases one trailing button. `panels/tab-strip.ts` keeps every decision: which pane a host is drawing, what each tab is called (the shortest unique suffix, and a page's ROUTE), what its tooltip says, whether closing it needs a prompt, what the overflow chevron lists and what the context menu offers. This document owns the markup, the ARIA, the keyboard and the style, and it holds THREE things the old chip drew by hand and the kit now draws: the tab's own selected state (`aria-selected`, not an `.active` class), its close button, and its dirty dot. The three that are Studio's alone go in `jx-tab`'s slots — the drill-in marker in `icon`, the draft pill in `status`, the pin toggle in `actions` (ui.md §5.4) — which is the gap that kept this strip out of the tab pattern until now.",
|
|
5
|
+
"tagName": "div",
|
|
6
|
+
"attributes": {
|
|
7
|
+
"part": "strip-row",
|
|
8
|
+
"data-focused": "${state.focused ? '' : null}",
|
|
9
|
+
"hidden": "${state.mode === 'empty' ? '' : null}"
|
|
10
|
+
},
|
|
11
|
+
"onmousedown": {
|
|
12
|
+
"$prototype": "Function",
|
|
13
|
+
"body": [
|
|
14
|
+
{
|
|
15
|
+
"operator": "call",
|
|
16
|
+
"target": { "$ref": "#/state/focusPane" },
|
|
17
|
+
"value": []
|
|
18
|
+
}
|
|
19
|
+
]
|
|
20
|
+
},
|
|
21
|
+
"style": {
|
|
22
|
+
"$description": "`styles/shell.css`'s `.tab-strip*` rules and `styles/canvas.css`'s pane-state rules, keyed on `part` and carried in. What did NOT come with them is the point: the chip's own hover, its selected underline, its close button and its dirty dot are `jx-tab`'s, and the strip's flex row and hairline are `jx-tabs`'s. What is left here is the pane strip's own shape — the scroll container the chevron exists for, the 11px type of a chrome row, the states the PANE model adds (pinned, preview, dragging, an unfocused pane's dimmed underline), and the three slotted marks.",
|
|
23
|
+
"display": "flex",
|
|
24
|
+
"alignItems": "stretch",
|
|
25
|
+
"minWidth": "0",
|
|
26
|
+
"background": "var(--bg-panel)",
|
|
27
|
+
"borderBottom": "1px solid var(--border)",
|
|
28
|
+
"fontFamily": "var(--jx-font-sans)",
|
|
29
|
+
"&[hidden]": {
|
|
30
|
+
"display": "none"
|
|
31
|
+
},
|
|
32
|
+
"& [part=\"tabs\"]": {
|
|
33
|
+
"$description": "`.tab-strip`. The kit's strip draws its own hairline; the ROW draws this one, so the strip's is taken off rather than doubled. The scrollbar is hidden by design — the wheel handler is a mouse affordance and the chevron is the pointer-independent route to the same tabs — so `overflow-x: auto` here is a scrolling box with no visible bar.",
|
|
34
|
+
"flex": "1 1 auto",
|
|
35
|
+
"minWidth": "0",
|
|
36
|
+
"gap": "0",
|
|
37
|
+
"padding": "0 var(--jx-space-2)",
|
|
38
|
+
"border": "0",
|
|
39
|
+
"overflowX": "auto",
|
|
40
|
+
"overflowY": "hidden",
|
|
41
|
+
"scrollbarWidth": "none",
|
|
42
|
+
"fontSize": "var(--jx-text-sm)",
|
|
43
|
+
"&::-webkit-scrollbar": {
|
|
44
|
+
"display": "none"
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
"& [part=\"tab\"]": {
|
|
48
|
+
"$description": "`.tab-strip-tab`. The kit's tab caps itself at 220px and reserves a control's height; a chrome row is tighter than that and its labels are the shortest unique suffix, so both are re-declared. `flex-shrink: 0` is what makes the strip scroll rather than squeeze fifteen documents into one width.",
|
|
49
|
+
"gap": "var(--jx-space-1)",
|
|
50
|
+
"padding": "4px var(--jx-space-2)",
|
|
51
|
+
"minHeight": "0",
|
|
52
|
+
"maxWidth": "none",
|
|
53
|
+
"flexShrink": "0",
|
|
54
|
+
"marginBlockEnd": "0",
|
|
55
|
+
"color": "var(--fg-dim)",
|
|
56
|
+
"cursor": "pointer",
|
|
57
|
+
":hover": {
|
|
58
|
+
"color": "var(--fg)",
|
|
59
|
+
"background": "var(--hover-bg)"
|
|
60
|
+
},
|
|
61
|
+
"&[aria-selected=\"true\"]": {
|
|
62
|
+
"color": "var(--fg)",
|
|
63
|
+
"borderBlockEndColor": "var(--accent)"
|
|
64
|
+
},
|
|
65
|
+
"&[data-dragging]": {
|
|
66
|
+
"opacity": "0.4"
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
"& [part=\"tab\"] [part=\"label\"]": {
|
|
70
|
+
"maxWidth": "140px"
|
|
71
|
+
},
|
|
72
|
+
"& [part=\"tab\"][data-preview] [part=\"label\"]": {
|
|
73
|
+
"fontStyle": "italic"
|
|
74
|
+
},
|
|
75
|
+
"&:not([data-focused]) [part=\"tab\"][aria-selected=\"true\"]": {
|
|
76
|
+
"$description": "The unfocused pane's strip still says which of ITS documents is current, in a colour that does not compete with the pane holding the keyboard.",
|
|
77
|
+
"borderBlockEndColor": "var(--border)"
|
|
78
|
+
},
|
|
79
|
+
"& [part=\"tab\"] [part=\"close\"]": {
|
|
80
|
+
"$description": "`.tab-strip-close`'s reveal, applied to the kit's own close button: a row of fifteen ✕ glyphs is noise, so the affordance appears on the tab under the pointer and on the current one. The button keeps its own 24px target either way (SC 2.5.8) — this moves no pixel of layout.",
|
|
81
|
+
"opacity": "0"
|
|
82
|
+
},
|
|
83
|
+
"& [part=\"tab\"]:hover [part=\"close\"], & [part=\"tab\"][aria-selected=\"true\"] [part=\"close\"]": {
|
|
84
|
+
"opacity": "1"
|
|
85
|
+
},
|
|
86
|
+
"& [part=\"origin\"]": {
|
|
87
|
+
"$description": "`.tab-strip-origin` — the drill-in marker, in `jx-tab`'s icon slot. Hidden from assistive technology by the document that writes it: a reader hears where a document was opened from in the tooltip, and an arrow announced beside a file name says nothing.",
|
|
88
|
+
"color": "var(--fg-dim)",
|
|
89
|
+
"fontSize": "var(--jx-text-sm)",
|
|
90
|
+
"lineHeight": "1"
|
|
91
|
+
},
|
|
92
|
+
"& [part=\"pill\"]": {
|
|
93
|
+
"$description": "`.entry-pill` — the draft pill (§7.6), in `jx-tab`'s status slot. It is ON THE CHIP and not only inside the entry editor because the mistake it prevents, publishing something you believed was private, is made while glancing at a row of tabs. \"Published\" is deliberately as visible as \"Draft\": a state you can only see one half of is a state you cannot check. The two Spectrum colours it used to name are `--jx-signal` against `--jx-bg`, which flips with the theme where a fixed yellow and a fixed black did not.",
|
|
94
|
+
"padding": "0 5px",
|
|
95
|
+
"borderRadius": "var(--radius)",
|
|
96
|
+
"background": "var(--bg)",
|
|
97
|
+
"color": "var(--fg-dim)",
|
|
98
|
+
"fontSize": "var(--jx-text-sm)",
|
|
99
|
+
"lineHeight": "15px",
|
|
100
|
+
"whiteSpace": "nowrap"
|
|
101
|
+
},
|
|
102
|
+
"& [part=\"pill\"][data-draft]": {
|
|
103
|
+
"background": "var(--jx-signal)",
|
|
104
|
+
"color": "var(--jx-bg)"
|
|
105
|
+
},
|
|
106
|
+
"& [part=\"pin\"]": {
|
|
107
|
+
"$description": "`.tab-strip-pin`, in `jx-tab`'s actions slot. A click on it never also selects the tab, and that is the KIT's doing now rather than a `stopPropagation` this document has to remember: `jx-tab` stops a click inside its actions slot exactly as it stops one on its own close button.",
|
|
108
|
+
"display": "flex",
|
|
109
|
+
"alignItems": "center",
|
|
110
|
+
"justifyContent": "center",
|
|
111
|
+
"width": "16px",
|
|
112
|
+
"height": "16px",
|
|
113
|
+
"padding": "0",
|
|
114
|
+
"border": "none",
|
|
115
|
+
"background": "none",
|
|
116
|
+
"color": "var(--fg-dim)",
|
|
117
|
+
"font": "inherit",
|
|
118
|
+
"fontSize": "var(--jx-text-md)",
|
|
119
|
+
"lineHeight": "1",
|
|
120
|
+
"borderRadius": "var(--radius)",
|
|
121
|
+
"cursor": "pointer",
|
|
122
|
+
"opacity": "0",
|
|
123
|
+
":hover": {
|
|
124
|
+
"background": "var(--hover-bg)",
|
|
125
|
+
"color": "var(--fg)"
|
|
126
|
+
},
|
|
127
|
+
":focus-visible": {
|
|
128
|
+
"outline": "var(--jx-focus-ring)",
|
|
129
|
+
"outlineOffset": "-1px"
|
|
130
|
+
}
|
|
131
|
+
},
|
|
132
|
+
"& [part=\"tab\"]:hover [part=\"pin\"], & [part=\"tab\"][aria-selected=\"true\"] [part=\"pin\"], & [part=\"tab\"][data-pinned] [part=\"pin\"]": {
|
|
133
|
+
"opacity": "1"
|
|
134
|
+
},
|
|
135
|
+
"& [part=\"tab\"][data-pinned] [part=\"pin\"]": {
|
|
136
|
+
"color": "var(--accent)"
|
|
137
|
+
},
|
|
138
|
+
"& [part=\"derivation\"]": {
|
|
139
|
+
"$description": "A LENS pane's strip: one chip naming the projection and the document it projects, where an ordinary pane draws tab chips. It is not a tab and must not look like one — no close ✕ of its own, because a lens owns no document to close. Its vertical box is a tab chip's, `4px` top and bottom plus the 2px underline `[part=\"tab\"]` reserves, so the lens's one-chip row sits on the same baseline grid as the tab row in the pane beside it; `tab-strip.test.ts` compares the two declarations rather than the two boxes, because happy-dom lays nothing out and a 19px strip against a 28px one is the class of defect only a picture catches. Horizontally it is 10px rather than a chip's 8px: this row is one chip wide with nothing to sit beside, and a chip's tighter inset exists so several of them read as a series.",
|
|
140
|
+
"display": "flex",
|
|
141
|
+
"flex": "1 1 auto",
|
|
142
|
+
"alignItems": "baseline",
|
|
143
|
+
"gap": "6px",
|
|
144
|
+
"minWidth": "0",
|
|
145
|
+
"padding": "4px 10px",
|
|
146
|
+
"borderBottom": "2px solid transparent",
|
|
147
|
+
"whiteSpace": "nowrap",
|
|
148
|
+
"overflow": "hidden"
|
|
149
|
+
},
|
|
150
|
+
"& [part=\"preset\"]": {
|
|
151
|
+
"color": "var(--fg)",
|
|
152
|
+
"fontSize": "var(--jx-text-md)"
|
|
153
|
+
},
|
|
154
|
+
"& [part=\"subject\"]": {
|
|
155
|
+
"color": "var(--fg-dim)",
|
|
156
|
+
"fontSize": "var(--jx-text-sm)",
|
|
157
|
+
"textOverflow": "ellipsis",
|
|
158
|
+
"overflow": "hidden"
|
|
159
|
+
},
|
|
160
|
+
"& [part=\"overflow\"]": {
|
|
161
|
+
"$description": "`.tab-strip-overflow`. It sits OUTSIDE the scrolling strip, so it stays reachable at any scroll offset — which is the whole point of it. One button draws both trailing affordances, because they are the same control in the same place: the chevron that lists the tabs currently out of view, and, on a derived pane, the ✕ that is a lens's only exit.",
|
|
162
|
+
"flex": "0 0 auto",
|
|
163
|
+
"display": "flex",
|
|
164
|
+
"alignItems": "center",
|
|
165
|
+
"justifyContent": "center",
|
|
166
|
+
"width": "22px",
|
|
167
|
+
"padding": "0",
|
|
168
|
+
"border": "none",
|
|
169
|
+
"borderLeft": "1px solid var(--border)",
|
|
170
|
+
"background": "none",
|
|
171
|
+
"color": "var(--fg-dim)",
|
|
172
|
+
"font": "inherit",
|
|
173
|
+
"fontSize": "var(--jx-text-lg)",
|
|
174
|
+
"lineHeight": "1",
|
|
175
|
+
"cursor": "pointer",
|
|
176
|
+
":hover": {
|
|
177
|
+
"background": "var(--hover-bg)",
|
|
178
|
+
"color": "var(--fg)"
|
|
179
|
+
},
|
|
180
|
+
":focus-visible": {
|
|
181
|
+
"outline": "var(--jx-focus-ring)",
|
|
182
|
+
"outlineOffset": "-2px"
|
|
183
|
+
}
|
|
184
|
+
},
|
|
185
|
+
"& [part=\"overflow\"][hidden]": {
|
|
186
|
+
"display": "none"
|
|
187
|
+
}
|
|
188
|
+
},
|
|
189
|
+
"children": [
|
|
190
|
+
{
|
|
191
|
+
"$description": "One row draws one pane, and a pane is either a set of open documents or a projection of somebody else's. A third answer — a pane with neither — draws nothing at all, which is the case with no branch here: the row itself is `hidden`.",
|
|
192
|
+
"tagName": "div",
|
|
193
|
+
"attributes": {
|
|
194
|
+
"part": "body"
|
|
195
|
+
},
|
|
196
|
+
"style": {
|
|
197
|
+
"$description": "The switch container generates no box: the branch inside it IS the row's flex item, so a lens chip and a tab strip sit at the same depth and take the same `flex` the row gives them.",
|
|
198
|
+
"display": "contents"
|
|
199
|
+
},
|
|
200
|
+
"$switch": {
|
|
201
|
+
"$ref": "#/state/mode"
|
|
202
|
+
},
|
|
203
|
+
"cases": {
|
|
204
|
+
"tabs": {
|
|
205
|
+
"tagName": "jx-tabs",
|
|
206
|
+
"attributes": {
|
|
207
|
+
"part": "tabs",
|
|
208
|
+
"label": "${state.stripLabel}",
|
|
209
|
+
"selected": "${state.active}"
|
|
210
|
+
},
|
|
211
|
+
"onchange": {
|
|
212
|
+
"$prototype": "Function",
|
|
213
|
+
"body": [
|
|
214
|
+
{
|
|
215
|
+
"operator": "call",
|
|
216
|
+
"target": { "$ref": "#/state/activate" },
|
|
217
|
+
"value": [{ "$ref": "event#/detail" }]
|
|
218
|
+
}
|
|
219
|
+
]
|
|
220
|
+
},
|
|
221
|
+
"onclose": {
|
|
222
|
+
"$prototype": "Function",
|
|
223
|
+
"body": [
|
|
224
|
+
{
|
|
225
|
+
"operator": "call",
|
|
226
|
+
"target": { "$ref": "#/state/closeTab" },
|
|
227
|
+
"value": [{ "$ref": "event#/detail" }]
|
|
228
|
+
}
|
|
229
|
+
]
|
|
230
|
+
},
|
|
231
|
+
"onwheel": {
|
|
232
|
+
"$ref": "#/state/wheel"
|
|
233
|
+
},
|
|
234
|
+
"children": [
|
|
235
|
+
{
|
|
236
|
+
"$prototype": "Array",
|
|
237
|
+
"items": { "$ref": "#/state/tabs" },
|
|
238
|
+
"key": { "$ref": "$map/item/key" },
|
|
239
|
+
"map": {
|
|
240
|
+
"tagName": "jx-tab",
|
|
241
|
+
"attributes": {
|
|
242
|
+
"part": "tab",
|
|
243
|
+
"data-tab": "${$map.item.key}",
|
|
244
|
+
"value": "${$map.item.key}",
|
|
245
|
+
"label": "${$map.item.label}",
|
|
246
|
+
"title": "${$map.item.title}",
|
|
247
|
+
"closable": "",
|
|
248
|
+
"draggable": "true",
|
|
249
|
+
"dirty": "${$map.item.dirty ? '' : null}",
|
|
250
|
+
"data-pinned": "${$map.item.pinned ? '' : null}",
|
|
251
|
+
"data-preview": "${$map.item.preview ? '' : null}",
|
|
252
|
+
"data-dragging": "${$map.item.dragging ? '' : null}"
|
|
253
|
+
},
|
|
254
|
+
"ondblclick": {
|
|
255
|
+
"$prototype": "Function",
|
|
256
|
+
"body": [
|
|
257
|
+
{
|
|
258
|
+
"operator": "call",
|
|
259
|
+
"target": { "$ref": "#/state/promote" },
|
|
260
|
+
"value": [{ "$ref": "$map/item/key" }]
|
|
261
|
+
}
|
|
262
|
+
]
|
|
263
|
+
},
|
|
264
|
+
"onauxclick": {
|
|
265
|
+
"$prototype": "Function",
|
|
266
|
+
"body": [
|
|
267
|
+
{
|
|
268
|
+
"if": {
|
|
269
|
+
"operator": "===",
|
|
270
|
+
"target": { "$ref": "event#/button" },
|
|
271
|
+
"value": 1
|
|
272
|
+
},
|
|
273
|
+
"then": [
|
|
274
|
+
{ "preventDefault": true },
|
|
275
|
+
{
|
|
276
|
+
"operator": "call",
|
|
277
|
+
"target": { "$ref": "#/state/closeTab" },
|
|
278
|
+
"value": [{ "$ref": "$map/item/key" }]
|
|
279
|
+
}
|
|
280
|
+
]
|
|
281
|
+
}
|
|
282
|
+
]
|
|
283
|
+
},
|
|
284
|
+
"oncontextmenu": {
|
|
285
|
+
"$prototype": "Function",
|
|
286
|
+
"body": [
|
|
287
|
+
{ "preventDefault": true },
|
|
288
|
+
{ "stopPropagation": true },
|
|
289
|
+
{
|
|
290
|
+
"operator": "call",
|
|
291
|
+
"target": { "$ref": "#/state/context" },
|
|
292
|
+
"value": [
|
|
293
|
+
{ "$ref": "$map/item/key" },
|
|
294
|
+
{ "$ref": "event#/clientX" },
|
|
295
|
+
{ "$ref": "event#/clientY" }
|
|
296
|
+
]
|
|
297
|
+
}
|
|
298
|
+
]
|
|
299
|
+
},
|
|
300
|
+
"ondragstart": {
|
|
301
|
+
"$prototype": "Function",
|
|
302
|
+
"body": [
|
|
303
|
+
{
|
|
304
|
+
"operator": "call",
|
|
305
|
+
"target": { "$ref": "#/state/dragStart" },
|
|
306
|
+
"value": [{ "$ref": "$map/item/key" }, { "$ref": "event#/dataTransfer" }]
|
|
307
|
+
}
|
|
308
|
+
]
|
|
309
|
+
},
|
|
310
|
+
"ondragend": {
|
|
311
|
+
"$prototype": "Function",
|
|
312
|
+
"body": [
|
|
313
|
+
{
|
|
314
|
+
"operator": "call",
|
|
315
|
+
"target": { "$ref": "#/state/dragEnd" },
|
|
316
|
+
"value": []
|
|
317
|
+
}
|
|
318
|
+
]
|
|
319
|
+
},
|
|
320
|
+
"ondragover": {
|
|
321
|
+
"$prototype": "Function",
|
|
322
|
+
"body": [{ "preventDefault": true }]
|
|
323
|
+
},
|
|
324
|
+
"ondrop": {
|
|
325
|
+
"$prototype": "Function",
|
|
326
|
+
"body": [
|
|
327
|
+
{ "preventDefault": true },
|
|
328
|
+
{
|
|
329
|
+
"operator": "call",
|
|
330
|
+
"target": { "$ref": "#/state/drop" },
|
|
331
|
+
"value": [{ "$ref": "$map/item/index" }, { "$ref": "event#/dataTransfer" }]
|
|
332
|
+
}
|
|
333
|
+
]
|
|
334
|
+
},
|
|
335
|
+
"children": [
|
|
336
|
+
{
|
|
337
|
+
"$description": "The drill-in marker: this document was opened FROM another one. `jx-tab`'s icon slot draws it before the label, which is where it has always been.",
|
|
338
|
+
"tagName": "span",
|
|
339
|
+
"attributes": {
|
|
340
|
+
"slot": "icon",
|
|
341
|
+
"part": "origin",
|
|
342
|
+
"aria-hidden": "true",
|
|
343
|
+
"hidden": "${$map.item.origin ? null : ''}"
|
|
344
|
+
},
|
|
345
|
+
"textContent": "↳"
|
|
346
|
+
},
|
|
347
|
+
{
|
|
348
|
+
"$description": "The draft pill. It is a `<span>` in the status slot rather than a mounted document of its own, which is what kept it a lit fragment inside `content/entry-editor.ts` until the strip converted: a document mounted per chip would be an async mount inside a synchronous rebuild. `entryDraftPill` states the two facts; this draws them.",
|
|
349
|
+
"tagName": "span",
|
|
350
|
+
"attributes": {
|
|
351
|
+
"slot": "status",
|
|
352
|
+
"part": "pill",
|
|
353
|
+
"title": "${$map.item.pillTitle}",
|
|
354
|
+
"data-draft": "${$map.item.draft ? '' : null}",
|
|
355
|
+
"hidden": "${$map.item.pill ? null : ''}"
|
|
356
|
+
},
|
|
357
|
+
"textContent": "${$map.item.pill}"
|
|
358
|
+
},
|
|
359
|
+
{
|
|
360
|
+
"$description": "The pin, in the actions slot. `title` is the whole accessible name (§10): the glyph is hidden, so a matching `aria-label` would announce it twice. `tabindex` follows the tab's own selectedness, exactly as the close button's does — the strip is ONE stop in the tab order, and a control inside every chip that took the platform's default would make fifteen.",
|
|
361
|
+
"tagName": "button",
|
|
362
|
+
"attributes": {
|
|
363
|
+
"slot": "actions",
|
|
364
|
+
"part": "pin",
|
|
365
|
+
"type": "button",
|
|
366
|
+
"title": "${$map.item.pinTitle}",
|
|
367
|
+
"tabindex": "${$map.item.tabindex}"
|
|
368
|
+
},
|
|
369
|
+
"onclick": {
|
|
370
|
+
"$prototype": "Function",
|
|
371
|
+
"body": [
|
|
372
|
+
{
|
|
373
|
+
"operator": "call",
|
|
374
|
+
"target": { "$ref": "#/state/togglePin" },
|
|
375
|
+
"value": [{ "$ref": "$map/item/key" }]
|
|
376
|
+
}
|
|
377
|
+
]
|
|
378
|
+
},
|
|
379
|
+
"children": [
|
|
380
|
+
{
|
|
381
|
+
"tagName": "span",
|
|
382
|
+
"attributes": {
|
|
383
|
+
"part": "pin-glyph",
|
|
384
|
+
"aria-hidden": "true"
|
|
385
|
+
},
|
|
386
|
+
"textContent": "${$map.item.pinGlyph}"
|
|
387
|
+
}
|
|
388
|
+
]
|
|
389
|
+
}
|
|
390
|
+
]
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
]
|
|
394
|
+
},
|
|
395
|
+
"derivation": {
|
|
396
|
+
"$description": "THE CHIP FINISHES ITS OWN SENTENCE, and both halves are the flow's: two of the presets are labelled with an unfinished phrase — \"Same page at\", \"Same page in\" — because the interesting half is the value, and a chip whose source pane shows nothing says \"no document\" rather than trailing off.",
|
|
397
|
+
"tagName": "div",
|
|
398
|
+
"attributes": {
|
|
399
|
+
"part": "derivation",
|
|
400
|
+
"title": "${state.chipTitle}"
|
|
401
|
+
},
|
|
402
|
+
"children": [
|
|
403
|
+
{
|
|
404
|
+
"tagName": "span",
|
|
405
|
+
"attributes": { "part": "preset" },
|
|
406
|
+
"textContent": "${state.preset}"
|
|
407
|
+
},
|
|
408
|
+
{
|
|
409
|
+
"tagName": "span",
|
|
410
|
+
"attributes": { "part": "subject" },
|
|
411
|
+
"textContent": "${state.subject}"
|
|
412
|
+
}
|
|
413
|
+
]
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
},
|
|
417
|
+
{
|
|
418
|
+
"tagName": "button",
|
|
419
|
+
"attributes": {
|
|
420
|
+
"part": "overflow",
|
|
421
|
+
"type": "button",
|
|
422
|
+
"title": "${state.trailingTitle}",
|
|
423
|
+
"hidden": "${state.trailing ? null : ''}"
|
|
424
|
+
},
|
|
425
|
+
"onclick": {
|
|
426
|
+
"$prototype": "Function",
|
|
427
|
+
"body": [
|
|
428
|
+
{ "stopPropagation": true },
|
|
429
|
+
{
|
|
430
|
+
"operator": "call",
|
|
431
|
+
"target": { "$ref": "#/state/openTrailing" },
|
|
432
|
+
"value": [{ "$ref": "event#/currentTarget" }]
|
|
433
|
+
}
|
|
434
|
+
]
|
|
435
|
+
},
|
|
436
|
+
"children": [
|
|
437
|
+
{
|
|
438
|
+
"tagName": "span",
|
|
439
|
+
"attributes": {
|
|
440
|
+
"part": "overflow-glyph",
|
|
441
|
+
"aria-hidden": "true"
|
|
442
|
+
},
|
|
443
|
+
"textContent": "${state.trailingGlyph}"
|
|
444
|
+
}
|
|
445
|
+
]
|
|
446
|
+
}
|
|
447
|
+
]
|
|
448
|
+
}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/// <reference lib="dom" />
|
|
2
|
+
/**
|
|
3
|
+
* One pane's tab strip, as a mounted document — the mount seam, and nothing else.
|
|
4
|
+
*
|
|
5
|
+
* `tab-strip.json` is the markup, the ARIA, the keyboard and the style; `panels/tab-strip.ts` is
|
|
6
|
+
* the flow — which pane a host is drawing, what each tab is called, what its tooltip says, whether
|
|
7
|
+
* closing it needs a prompt, and what the two menus offer. This module is the seam between them:
|
|
8
|
+
* one scope per HOST, one document mounted into it, and an `update()` that ASSIGNS rather than
|
|
9
|
+
* re-mounts.
|
|
10
|
+
*
|
|
11
|
+
* **One mount per host, not one per pane.** Two panes can resolve to the same strip host while the
|
|
12
|
+
* shell has a single one, and the FOCUSED pane wins the tie (`panels/tab-strip.ts`'s `render`).
|
|
13
|
+
* Keying the mount by pane would then mount twice into one div; keying it by the host is what makes
|
|
14
|
+
* the hand-over an assignment — the same document keeps standing and starts saying the other pane's
|
|
15
|
+
* tabs, which is also what keeps the reader's scroll offset.
|
|
16
|
+
*
|
|
17
|
+
* **The host's region id is NOT stamped here.** `panels/pane-grid.ts` writes `pane.<id>/tabs` on
|
|
18
|
+
* the cell as the cell is built, and that is the one writer: a host can change which pane it draws
|
|
19
|
+
* (the shell's single strip goes to whichever pane has the stage), so a region stamped at MOUNT
|
|
20
|
+
* would be a second answer that never moved again — and `pane.primary/tabs` would resolve to
|
|
21
|
+
* nothing the first time the side pane claimed the strip.
|
|
22
|
+
*
|
|
23
|
+
* **The strip element is HELD, not re-found.** Overflow is a measurement — `scrollWidth` against
|
|
24
|
+
* `clientWidth`, and each chip's `offsetLeft` against the scroll viewport — and a measurement needs
|
|
25
|
+
* the element. It arrives through `onNodeCreated` as the `jx-tabs` is created, so nothing in this
|
|
26
|
+
* package queries the strip by a class it also renders (studio-ui-guidelines.md §9.4).
|
|
27
|
+
*
|
|
28
|
+
* @docs studio/interface
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
import { reactive } from "../reactivity";
|
|
32
|
+
import { mountSurface, registerSurface } from "../ui/surface";
|
|
33
|
+
import tabStripDoc from "./tab-strip.json";
|
|
34
|
+
import type { JxDocument } from "@jxsuite/schema/types";
|
|
35
|
+
import type { SurfaceHandle } from "../ui/surface";
|
|
36
|
+
|
|
37
|
+
registerSurface("tab-strip", tabStripDoc as unknown as JxDocument);
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* One chip, as the document draws it. Every field is a value: the document asks no question about a
|
|
41
|
+
* tab, and there is no branch in it that a projection has not already decided.
|
|
42
|
+
*/
|
|
43
|
+
export interface TabChipView extends Record<string, unknown> {
|
|
44
|
+
/** The tab id: the repeater's key, the tab's `value`, and what every action is addressed with. */
|
|
45
|
+
key: string;
|
|
46
|
+
/** The shortest suffix that tells this document apart, or a page's route. */
|
|
47
|
+
label: string;
|
|
48
|
+
/** The full path, the document it was drilled in from, and whether it is a preview. */
|
|
49
|
+
title: string;
|
|
50
|
+
dirty: boolean;
|
|
51
|
+
pinned: boolean;
|
|
52
|
+
preview: boolean;
|
|
53
|
+
dragging: boolean;
|
|
54
|
+
/** Whether to draw the drill-in marker. */
|
|
55
|
+
origin: boolean;
|
|
56
|
+
/** "Pin" or "Unpin" — the pin button's whole accessible name. */
|
|
57
|
+
pinTitle: string;
|
|
58
|
+
pinGlyph: string;
|
|
59
|
+
/** The draft pill's word, or the empty string when this document has no draft axis. */
|
|
60
|
+
pill: string;
|
|
61
|
+
pillTitle: string;
|
|
62
|
+
draft: boolean;
|
|
63
|
+
/** "0" while this is the pane's current tab, "-1" otherwise. The pin's roving stop. */
|
|
64
|
+
tabindex: string;
|
|
65
|
+
/** This chip's slot in the pane's order, which is the drop target index. */
|
|
66
|
+
index: number;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/** What one strip says right now. */
|
|
70
|
+
export interface TabStripValues {
|
|
71
|
+
/**
|
|
72
|
+
* `tabs`, `derivation`, or `empty`.
|
|
73
|
+
*
|
|
74
|
+
* The `$switch` branches on it and the row's own `hidden` reads it, so a pane with nothing to say
|
|
75
|
+
* is hidden outright rather than left as an empty band. One field rather than a `mode` and a
|
|
76
|
+
* `blank` beside it: two names for one fact are two things that can disagree, and the row that
|
|
77
|
+
* says nothing and the row that draws no branch are the same row.
|
|
78
|
+
*/
|
|
79
|
+
mode: "tabs" | "derivation" | "empty";
|
|
80
|
+
/** Whether this pane holds the keyboard. */
|
|
81
|
+
focused: boolean;
|
|
82
|
+
/** The tablist's accessible name. A tablist takes no name from its tabs. */
|
|
83
|
+
stripLabel: string;
|
|
84
|
+
/** The active tab id — what `jx-tabs` compares each tab's `value` against. */
|
|
85
|
+
active: string;
|
|
86
|
+
tabs: TabChipView[];
|
|
87
|
+
/** The derivation chip's preset phrase, finished. */
|
|
88
|
+
preset: string;
|
|
89
|
+
/** What the derivation is a projection OF, or "no document". */
|
|
90
|
+
subject: string;
|
|
91
|
+
chipTitle: string;
|
|
92
|
+
/** Whether the trailing button is on screen at all. */
|
|
93
|
+
trailing: boolean;
|
|
94
|
+
trailingTitle: string;
|
|
95
|
+
trailingGlyph: string;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/** What a gesture on the strip asks of the flow. Read once, when the scope is made. */
|
|
99
|
+
export interface TabStripActions {
|
|
100
|
+
focusPane: () => void;
|
|
101
|
+
activate: (id: string) => void;
|
|
102
|
+
closeTab: (id: string) => void;
|
|
103
|
+
/** A double click: a preview tab becomes permanent. */
|
|
104
|
+
promote: (id: string) => void;
|
|
105
|
+
togglePin: (id: string) => void;
|
|
106
|
+
context: (id: string, x: number, y: number) => void;
|
|
107
|
+
/** The chevron, or a derived pane's ✕. The anchor is the button that was pressed. */
|
|
108
|
+
openTrailing: (anchor: HTMLElement | null) => void;
|
|
109
|
+
/** A drag left this chip. The `DataTransfer` is the platform's and may be absent. */
|
|
110
|
+
dragStart: (id: string, transfer: DataTransfer | null) => void;
|
|
111
|
+
dragEnd: () => void;
|
|
112
|
+
/** A drop landed on the chip at `index`. */
|
|
113
|
+
drop: (index: number, transfer: DataTransfer | null) => void;
|
|
114
|
+
/** A wheel over the strip. A host function in handler position, so it takes the event. */
|
|
115
|
+
wheel: (scope: unknown, event: WheelEvent) => void;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
export interface TabStripSurface {
|
|
119
|
+
/** Bring the standing document up to date. An assignment; the mount is never rebuilt. */
|
|
120
|
+
update: (values: TabStripValues) => void;
|
|
121
|
+
/** The `jx-tabs` element, once it exists — the one thing a measurement needs. */
|
|
122
|
+
strip: () => HTMLElement | null;
|
|
123
|
+
/** Take the document down and give the host back empty. Idempotent. */
|
|
124
|
+
dispose: () => void;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/** The scope `tab-strip.json` reads. */
|
|
128
|
+
interface TabStripScope extends Record<string, unknown>, TabStripValues, TabStripActions {}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Mount one strip into `host`.
|
|
132
|
+
*
|
|
133
|
+
* The host is CLEARED first: a pane cell hands the strip a div of its own, and whatever is in it
|
|
134
|
+
* belongs to a pane this strip is no longer drawing.
|
|
135
|
+
*
|
|
136
|
+
* @param {HTMLElement} host The pane cell's strip slot.
|
|
137
|
+
* @param {TabStripValues} values What to say on the first paint.
|
|
138
|
+
* @param {TabStripActions} actions What a gesture does. Read once, when the scope is made.
|
|
139
|
+
* @returns {TabStripSurface}
|
|
140
|
+
*/
|
|
141
|
+
export function mountTabStripSurface(
|
|
142
|
+
host: HTMLElement,
|
|
143
|
+
values: TabStripValues,
|
|
144
|
+
actions: TabStripActions,
|
|
145
|
+
): TabStripSurface {
|
|
146
|
+
const scope = reactive<TabStripScope>({ ...values, ...actions }) as TabStripScope;
|
|
147
|
+
|
|
148
|
+
host.replaceChildren();
|
|
149
|
+
let mounted: SurfaceHandle | null = null;
|
|
150
|
+
let disposed = false;
|
|
151
|
+
let strip: HTMLElement | null = null;
|
|
152
|
+
void mountSurface("tab-strip", scope, host, {
|
|
153
|
+
onNodeCreated: (element, _path, def) => {
|
|
154
|
+
const part = typeof def === "string" ? undefined : def.attributes?.["part"];
|
|
155
|
+
if (part === "tabs" && element instanceof HTMLElement) {
|
|
156
|
+
strip = element;
|
|
157
|
+
}
|
|
158
|
+
},
|
|
159
|
+
}).then((surface) => {
|
|
160
|
+
if (disposed) {
|
|
161
|
+
surface.dispose();
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
mounted = surface;
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
return {
|
|
168
|
+
dispose() {
|
|
169
|
+
disposed = true;
|
|
170
|
+
mounted?.dispose();
|
|
171
|
+
mounted = null;
|
|
172
|
+
strip = null;
|
|
173
|
+
host.replaceChildren();
|
|
174
|
+
},
|
|
175
|
+
strip: () => strip,
|
|
176
|
+
update(next) {
|
|
177
|
+
/* Field by field, so an unchanged one is inert. A whole-object assignment would re-run every
|
|
178
|
+
binding in the row on every workspace tick, which is what a keyed `$map` exists to avoid.
|
|
179
|
+
|
|
180
|
+
`mode` IS ASSIGNED LAST, and that is an ordering rather than a style. It is what the
|
|
181
|
+
`$switch` branches on, so writing it first builds the new branch against the data the OLD
|
|
182
|
+
one was showing — a strip whose tabs arrive one assignment later, into a `jx-tabs` that has
|
|
183
|
+
already connected and distributed its slot around nothing. Measured: a derived pane whose
|
|
184
|
+
one tab comes back drew an EMPTY tablist, and the chip the flow then went looking for to
|
|
185
|
+
scroll into view was not there. Every value the new shape needs is in place before the
|
|
186
|
+
shape changes. */
|
|
187
|
+
scope.focused = next.focused;
|
|
188
|
+
scope.stripLabel = next.stripLabel;
|
|
189
|
+
scope.active = next.active;
|
|
190
|
+
scope.tabs = next.tabs;
|
|
191
|
+
scope.preset = next.preset;
|
|
192
|
+
scope.subject = next.subject;
|
|
193
|
+
scope.chipTitle = next.chipTitle;
|
|
194
|
+
scope.trailing = next.trailing;
|
|
195
|
+
scope.trailingTitle = next.trailingTitle;
|
|
196
|
+
scope.trailingGlyph = next.trailingGlyph;
|
|
197
|
+
scope.mode = next.mode;
|
|
198
|
+
},
|
|
199
|
+
};
|
|
200
|
+
}
|