@jxsuite/studio 4.0.0 → 5.0.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-xp8vnwma.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-fyf63pmy.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-2w1f35qs.js +18 -0
- package/dist/chunks/content-source-3wqeas45.js +46 -0
- package/dist/chunks/convert-to-repeater-d0cgnb6d.js +639 -0
- package/dist/chunks/dialog-s890b918.js +85 -0
- package/dist/chunks/editor-3qhbg51x.js +35 -0
- package/dist/chunks/entry-commands-d6g50j7s.js +42 -0
- package/dist/chunks/extension-sections-fy7q4fe9.js +651 -0
- package/dist/chunks/file-ops-3btj6st0.js +47 -0
- package/dist/chunks/files-ef8fgs3w.js +72 -0
- package/dist/chunks/format-host-3c33nwr8.js +40 -0
- package/dist/chunks/fs-events-13tj6sex.js +18 -0
- package/dist/chunks/git-panel-4wp2rn9b.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-jgesd924.js +115 -0
- package/dist/chunks/{index-nj44jpzj.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-1nq5evsh.js +29 -0
- package/dist/chunks/layers-panel-ar2gh90g.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-2qbetq73.js +33 -0
- package/dist/chunks/menu-q99sy9rf.js +285 -0
- package/dist/chunks/menu-rf7n72mf.js +14 -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-rws7k4br.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-98f7sr3g.js +27 -0
- package/dist/chunks/quick-search-srzz83k2.js +45 -0
- package/dist/chunks/references-n553f0e1.js +26 -0
- package/dist/chunks/right-panel-rrgx2dn3.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-18avnhjp.js +2430 -0
- package/dist/chunks/{studio-kryvsw6j.js → studio-1k325pwf.js} +48 -48
- package/dist/chunks/{studio-hbtp0eh1.js → studio-25hkdrkw.js} +356 -85
- package/dist/chunks/studio-26d7myd1.js +258 -0
- package/dist/chunks/{studio-p8j86wag.js → studio-38emantv.js} +22 -5
- package/dist/chunks/studio-3gxv60tn.js +422 -0
- package/dist/chunks/{studio-8swrjbny.js → studio-3hxkd92t.js} +275 -163
- package/dist/chunks/studio-4m0haseg.js +185 -0
- package/dist/chunks/{studio-ynxwkrzd.js → studio-4wbb9ct0.js} +1953 -1785
- package/dist/chunks/{studio-gv8vvshc.js → studio-5523bpzt.js} +11 -11
- package/dist/chunks/{studio-5q69gfag.js → studio-57mf66w2.js} +1753 -2484
- package/dist/chunks/studio-5jy81t3s.js +17463 -0
- package/dist/chunks/studio-5rt7sqa0.js +1168 -0
- package/dist/chunks/studio-5te5tqng.js +81 -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-eenfkt4e.js → studio-79y5sz51.js} +52 -38
- package/dist/chunks/{studio-4q0wznzf.js → studio-7e11jpa9.js} +461 -145
- package/dist/chunks/{studio-q7v10cg2.js → studio-7r42c6ca.js} +17 -7
- package/dist/chunks/studio-7xptrg0j.js +954 -0
- package/dist/chunks/{studio-cft9r4r7.js → studio-81390n6f.js} +22 -22
- package/dist/chunks/{studio-q43a5y9h.js → studio-8jn5yhyn.js} +16 -16
- package/dist/chunks/studio-8qtrpzr3.js +839 -0
- package/dist/chunks/{studio-dg7zyt5x.js → studio-98b3z07n.js} +1 -1
- package/dist/chunks/studio-9xxz1q69.js +1356 -0
- package/dist/chunks/studio-akbww0j5.js +13615 -0
- package/dist/chunks/studio-arfpe389.js +195 -0
- package/dist/chunks/{studio-2zkz8evn.js → studio-az3zd49t.js} +473 -281
- package/dist/chunks/studio-cpvb2ed1.js +1171 -0
- package/dist/chunks/{studio-9r6j5ev1.js → studio-d0300636.js} +5078 -19
- package/dist/chunks/{studio-bgxt93ga.js → studio-d055c37e.js} +13 -13
- package/dist/chunks/studio-d1ja2x9r.js +362 -0
- package/dist/chunks/{studio-b9b6t1dg.js → studio-e1f24eff.js} +5664 -5666
- package/dist/chunks/{studio-4pqqxbrt.js → studio-em9nw8eh.js} +301 -112
- package/dist/chunks/studio-erdatzvp.js +1190 -0
- package/dist/chunks/{studio-g1wdche0.js → studio-esrxgwh6.js} +80 -80
- package/dist/chunks/studio-fabxk6r9.js +2811 -0
- package/dist/chunks/{studio-3n4ndrzh.js → studio-h4nvnjvz.js} +303 -303
- package/dist/chunks/studio-hhvs4sdg.js +195 -0
- package/dist/chunks/{studio-68n67094.js → studio-kcgff4r0.js} +15 -18
- package/dist/chunks/{studio-685s0ytq.js → studio-nqgawfks.js} +572 -572
- package/dist/chunks/{studio-xrapxwwc.js → studio-p1dw8wfw.js} +55 -29
- package/dist/chunks/studio-pm6hgy7r.js +4763 -0
- package/dist/chunks/studio-q0a3yk4n.js +33 -0
- package/dist/chunks/{studio-wcy8trfx.js → studio-q3x06vmj.js} +23 -22
- package/dist/chunks/studio-qahxvnan.js +111 -0
- package/dist/chunks/{studio-53n8bp04.js → studio-r6xmmtfh.js} +1 -1
- package/dist/chunks/{studio-kjjsjak4.js → studio-rkstz940.js} +3661 -6136
- package/dist/chunks/{studio-tvgyw9xw.js → studio-rnyf3f8e.js} +83 -250
- package/dist/chunks/studio-rpyah2ew.js +2805 -0
- package/dist/chunks/studio-rs76k67r.js +12 -0
- package/dist/chunks/{studio-yxrkyv8a.js → studio-s6z853aq.js} +12108 -11766
- package/dist/chunks/{studio-sf7zjgv1.js → studio-sgdc5pfc.js} +8 -8
- package/dist/chunks/studio-tb3ev01j.js +763 -0
- package/dist/chunks/{studio-t5wqwzdh.js → studio-tjjk7jvk.js} +1 -1
- package/dist/chunks/studio-vhv5tgxm.js +51 -0
- package/dist/chunks/{studio-htsf0w6m.js → studio-vz68yn9e.js} +31 -154
- package/dist/chunks/studio-wqpngpsk.js +174 -0
- package/dist/chunks/{studio-eesa1myv.js → studio-x3rty6tr.js} +58 -58
- package/dist/chunks/studio-xsykpvsh.js +8448 -0
- package/dist/chunks/{studio-92ab2jqe.js → studio-y9zedyjn.js} +14 -14
- package/dist/chunks/studio-yxa81f45.js +12 -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-wrew8zk4.js +69 -0
- package/dist/chunks/{ws-client-6shc5rze.js → ws-client-ny4zc51r.js} +20 -22
- package/dist/iframe-entry.js +1812 -698
- package/dist/manifest.json +7 -0
- package/dist/studio.js +52900 -36573
- 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/favicon.ico +0 -0
- package/index.html +2 -0
- package/package.json +22 -55
- package/src/about/about-modal.ts +73 -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 +310 -117
- 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 +369 -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 +165 -8
- 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 +65 -26
- package/src/editor/slash-menu.ts +150 -157
- package/src/files/file-ops.ts +117 -11
- package/src/files/files.ts +949 -664
- package/src/files/json-layout.ts +474 -0
- package/src/files/media-paths.ts +13 -42
- package/src/files/media-usage.ts +41 -131
- 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/document.ts +2 -0
- package/src/hosting/layout.ts +10 -0
- package/src/i18n/i18n-commands.ts +127 -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 +201 -250
- package/src/new-project/location-fields.ts +101 -165
- package/src/new-project/new-project-modal.ts +376 -367
- package/src/packages/jxsuite-update.ts +76 -18
- 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 -153
- package/src/panels/ai-chat/sessions-view.ts +31 -62
- package/src/panels/ai-panel.ts +210 -185
- package/src/panels/block-action-bar.ts +437 -643
- 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 +153 -133
- package/src/panels/imports-panel.ts +388 -414
- package/src/panels/jump-bar.ts +174 -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 +177 -99
- package/src/panels/properties-panel.ts +1525 -966
- package/src/panels/provenance.ts +31 -113
- package/src/panels/quick-search.ts +217 -172
- package/src/panels/right-panel.ts +135 -169
- package/src/panels/seo-modal.ts +346 -167
- package/src/panels/settings-menu.ts +109 -646
- 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 +385 -287
- package/src/platforms/cloud.ts +347 -86
- 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 +165 -299
- package/src/services/a11y-report.ts +100 -43
- package/src/services/ai-command-tools.ts +468 -0
- package/src/services/ai-import-tools.ts +50 -12
- package/src/services/ai-models.ts +108 -1
- package/src/services/ai-session-store.ts +6 -0
- package/src/services/ai-system-prompt.ts +110 -18
- package/src/services/ai-tools.ts +28 -143
- package/src/services/ai-write-report.ts +174 -0
- package/src/services/context-manager.ts +12 -1
- package/src/services/document-assistant.ts +50 -2
- 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 +17 -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 +193 -12
- package/src/settings/preferences-dialog.ts +384 -307
- 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 +90 -67
- 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 +984 -0
- package/src/{panels/toolbar.ts → surfaces/commandbar.ts} +414 -389
- 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 +163 -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 +71 -15
- package/src/tabs/tab.ts +52 -1
- package/src/types.ts +49 -3
- package/src/ui/ai-credentials-form.ts +104 -100
- package/src/ui/ai-managed-connect.ts +116 -49
- package/src/ui/ai-model-picker.ts +102 -47
- package/src/ui/cf-account-picker.ts +135 -0
- 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 +293 -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 +15 -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 -1532
- package/styles/tokens.css +65 -136
- package/styles/tokens.json +84 -0
- package/dist/chunks/Overlay.dev-723bv0df.js +0 -23
- package/dist/chunks/adapter-jkcyhgtr.js +0 -14
- package/dist/chunks/cf-settings-45fgyx8y.js +0 -21
- package/dist/chunks/components-zmx10t62.js +0 -21
- package/dist/chunks/content-source-t88vb2dr.js +0 -49
- package/dist/chunks/convert-to-repeater-dhw1nrz9.js +0 -268
- package/dist/chunks/editor-cptq5jp1.js +0 -37
- package/dist/chunks/entry-commands-6z6bhxg0.js +0 -46
- package/dist/chunks/extension-sections-3ydgjbdy.js +0 -311
- package/dist/chunks/file-ops-rskmhxyq.js +0 -48
- package/dist/chunks/files-0cratsr0.js +0 -92
- package/dist/chunks/flow-qbfgrpeh.js +0 -634
- package/dist/chunks/focus-trap.esm-ggawf1hy.js +0 -1024
- package/dist/chunks/focus-visible-6eg70z18.js +0 -167
- package/dist/chunks/format-host-tgcmfs4p.js +0 -43
- package/dist/chunks/fs-events-hrrg328g.js +0 -21
- package/dist/chunks/git-panel-0yywyk76.js +0 -58
- package/dist/chunks/index-zqxmqxmh.js +0 -109
- package/dist/chunks/jx-validate-8q2g05x1.js +0 -19
- package/dist/chunks/layers-panel-z3tqe5cd.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-54jvhskq.js +0 -28
- package/dist/chunks/quick-search-cgfmjwq5.js +0 -65
- package/dist/chunks/references-3qx8fkyp.js +0 -29
- package/dist/chunks/right-panel-cqp8bc4v.js +0 -46
- package/dist/chunks/section-registry-sx1ykvkw.js +0 -30
- package/dist/chunks/sp-overlay.dev-yztmtrs1.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-xcvpnqr0.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-18j3bmcz.js +0 -14
- package/dist/chunks/studio-1hbqnt19.js +0 -1823
- package/dist/chunks/studio-4rzyrtjz.js +0 -426
- package/dist/chunks/studio-5rywrkxz.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-9c4k4vhv.js +0 -357
- package/dist/chunks/studio-9n4mrmnb.js +0 -184
- package/dist/chunks/studio-a0tswy0w.js +0 -58
- package/dist/chunks/studio-ahjfdy6e.js +0 -387
- package/dist/chunks/studio-ahnzd9rg.js +0 -23
- package/dist/chunks/studio-bw5dz6km.js +0 -608
- package/dist/chunks/studio-cb12yz9w.js +0 -15055
- package/dist/chunks/studio-d1ks410h.js +0 -175
- package/dist/chunks/studio-eqq1w638.js +0 -113
- package/dist/chunks/studio-ex8zyp98.js +0 -1813
- package/dist/chunks/studio-h4rxscfc.js +0 -10
- package/dist/chunks/studio-kyh9avvv.js +0 -28
- package/dist/chunks/studio-kyk2v92a.js +0 -659
- package/dist/chunks/studio-m3hwn7y1.js +0 -120
- package/dist/chunks/studio-mmv72a27.js +0 -4344
- package/dist/chunks/studio-n8b9wqwy.js +0 -291
- package/dist/chunks/studio-pdfjntbk.js +0 -6939
- package/dist/chunks/studio-qq6jym04.js +0 -53
- package/dist/chunks/studio-r1r7afxx.js +0 -1066
- 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-txwkm6p9.js +0 -12
- package/dist/chunks/studio-v38hmvx1.js +0 -390
- package/dist/chunks/studio-vadzgkrz.js +0 -318
- package/dist/chunks/studio-wx5609xd.js +0 -341
- package/dist/chunks/studio-z6nw2ek2.js +0 -18
- package/dist/chunks/studio-zczps70q.js +0 -378
- package/dist/chunks/workspace-xpres40v.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
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* the iframe only reports what was pointed at.
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
-
import { parseJxPath, serializeJxPath } from "./path-mapping";
|
|
9
|
+
import { jxPathSelector, parseJxPath, serializeJxPath } from "./path-mapping";
|
|
10
10
|
import { rectOf } from "../utils/geometry";
|
|
11
11
|
import { computeInsertZones, insertZonesKey } from "./iframe-insert";
|
|
12
12
|
import { getActiveElement, isEditing } from "../editor/inline-edit";
|
|
@@ -60,25 +60,57 @@ export function nearestHit(target: EventTarget | null): NodeHit | null {
|
|
|
60
60
|
return measureHit(el, el.dataset.jxPath as string);
|
|
61
61
|
}
|
|
62
62
|
|
|
63
|
+
/**
|
|
64
|
+
* Whether an element is actually rendered, as opposed to merely present in the DOM.
|
|
65
|
+
*
|
|
66
|
+
* `checkVisibility` is the platform's own answer, and it is the right one: it walks the ancestor
|
|
67
|
+
* chain, so a node inside a closed popover or a `display: none` section is reported hidden without
|
|
68
|
+
* this having to know why. happy-dom implements it faithfully (`display`, `visibility`, `opacity`,
|
|
69
|
+
* disconnection), so the guard is exercised under test rather than merely asserted.
|
|
70
|
+
*
|
|
71
|
+
* A rect test would NOT work here and was tried: happy-dom performs no layout, so every element
|
|
72
|
+
* measures 0×0 at the origin and the guard would report the whole document hidden.
|
|
73
|
+
*
|
|
74
|
+
* An engine without `checkVisibility` gets the benefit of the doubt. Withholding a selection box
|
|
75
|
+
* from a node that is on screen is a worse failure than drawing one for a node that is not.
|
|
76
|
+
*/
|
|
77
|
+
function isRendered(el: Element): boolean {
|
|
78
|
+
const check = (el as { checkVisibility?: (o?: object) => boolean }).checkVisibility;
|
|
79
|
+
return typeof check === "function" ? check.call(el, { checkVisibilityCSS: true }) : true;
|
|
80
|
+
}
|
|
81
|
+
|
|
63
82
|
/**
|
|
64
83
|
* Measure the current rect of each requested document path by locating its `data-jx-path` element.
|
|
65
|
-
*
|
|
66
|
-
*
|
|
84
|
+
*
|
|
85
|
+
* Paths with no matching node are omitted. Paths that resolve to an element which is NOT RENDERED —
|
|
86
|
+
* a closed popover, a `display: none` node, a `$switch` branch that is not the live case — come
|
|
87
|
+
* back under `hidden` instead of as a rect. That distinction is the point: they used to be measured
|
|
88
|
+
* like anything else, and a zero rect is a truthy object, so the overlay drew a 0×0 box at the
|
|
89
|
+
* artboard origin and the block action bar anchored to it. Selecting a hidden node put a selection
|
|
90
|
+
* marker in the corner of the page and left the toolbar sitting there.
|
|
91
|
+
*
|
|
92
|
+
* The serialized path is the same string the renderer stamps, so a stored selection path
|
|
93
|
+
* round-trips back to its element.
|
|
67
94
|
*/
|
|
68
|
-
export function measureHits(
|
|
69
|
-
|
|
95
|
+
export function measureHits(
|
|
96
|
+
paths: (string | number)[][],
|
|
97
|
+
doc: Document = document,
|
|
98
|
+
): { hits: NodeHit[]; hidden: (string | number)[][] } {
|
|
99
|
+
const hits: NodeHit[] = [];
|
|
100
|
+
const hidden: (string | number)[][] = [];
|
|
70
101
|
for (const path of paths) {
|
|
71
|
-
const
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
if (el) {
|
|
102
|
+
const el = doc.querySelector(jxPathSelector(serializeJxPath(path)));
|
|
103
|
+
if (!el) {
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
if (isRendered(el)) {
|
|
77
107
|
const r = rectOf(el);
|
|
78
|
-
|
|
108
|
+
hits.push({ path, rect: { height: r.height, width: r.width, x: r.x, y: r.y } });
|
|
109
|
+
} else {
|
|
110
|
+
hidden.push(path);
|
|
79
111
|
}
|
|
80
112
|
}
|
|
81
|
-
return
|
|
113
|
+
return { hidden, hits };
|
|
82
114
|
}
|
|
83
115
|
|
|
84
116
|
/**
|
|
@@ -87,6 +119,88 @@ export function measureHits(paths: (string | number)[][], doc: Document = docume
|
|
|
87
119
|
* {@link file://./iframe-drop.ts}'s `startGrabDetector` receives its deps rather than reaching for
|
|
88
120
|
* module state.
|
|
89
121
|
*/
|
|
122
|
+
/** The three `popovertargetaction` keywords. Anything else falls back to the HTML default. */
|
|
123
|
+
const INVOKER_ACTIONS = new Set(["toggle", "show", "hide"]);
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Report an invoker click, when the click landed on one and it names an addressable popover.
|
|
127
|
+
*
|
|
128
|
+
* Both attributes are read from their CANVAS spellings: the runtime renamed `popover` to
|
|
129
|
+
* `data-jx-popover` for the render, but `popovertarget` keeps its own name — nothing in the editor
|
|
130
|
+
* needs it renamed, since with no real popover to invoke the browser does nothing with it anyway.
|
|
131
|
+
* That is what makes this safe to post unconditionally: a trigger whose target is a component's own
|
|
132
|
+
* internal popover resolves to no addressable node, and nothing is posted.
|
|
133
|
+
*
|
|
134
|
+
* Called only after `onClick`'s preview branch has returned, so no mode gate is needed here.
|
|
135
|
+
*
|
|
136
|
+
* @param target The click's `e.target`.
|
|
137
|
+
* @param channel The frame's channel.
|
|
138
|
+
*/
|
|
139
|
+
function postPopoverInvoke(
|
|
140
|
+
target: EventTarget | null,
|
|
141
|
+
channel: { post: (m: IframeToParent) => void },
|
|
142
|
+
): void {
|
|
143
|
+
if (!(target instanceof Element)) {
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
const invoker = target.closest("[popovertarget]");
|
|
147
|
+
const id = invoker?.getAttribute("popovertarget");
|
|
148
|
+
if (!invoker || !id) {
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
/* Scanned rather than selected. The id is author-controlled text, so a `[id='…']` selector would
|
|
152
|
+
need escaping — a rule this file already keeps in exactly one place (`jxPathSelector`) and
|
|
153
|
+
should not gain a second spelling of. The set scanned is the addressable POPOVERS, which is
|
|
154
|
+
also the set the answer has to come from, so the scan is the test. */
|
|
155
|
+
const panels = invoker.ownerDocument.querySelectorAll("[data-jx-popover]");
|
|
156
|
+
const panel = [...panels].find((el) => el.id === id) as HTMLElement | undefined;
|
|
157
|
+
const serialized = panel?.dataset.jxPath;
|
|
158
|
+
if (!serialized) {
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
const raw = invoker.getAttribute("popovertargetaction") ?? "toggle";
|
|
162
|
+
const action = INVOKER_ACTIONS.has(raw) ? (raw as "toggle" | "show" | "hide") : "toggle";
|
|
163
|
+
channel.post({ action, kind: "popoverTargetClick", targetPath: parseJxPath(serialized) });
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Report a click on a `<button command commandfor>` the canvas de-linked.
|
|
168
|
+
*
|
|
169
|
+
* The runtime renamed `commandfor` to `data-jx-commandfor` (so the platform's invoker never runs
|
|
170
|
+
* `showModal()` or `togglePopover()` inside an editable frame); the frame reports the target's path
|
|
171
|
+
* and the command, and the host's single writer of open state decides what it means — for a popover
|
|
172
|
+
* command exactly as `popovertarget` is answered, for a dialog command through
|
|
173
|
+
* `canvas.setDialogOpen`. A custom `--command` is reported too, and the host ignores it.
|
|
174
|
+
*
|
|
175
|
+
* @param target The click's `e.target`.
|
|
176
|
+
* @param channel The frame's channel.
|
|
177
|
+
*/
|
|
178
|
+
function postCommandInvoke(
|
|
179
|
+
target: EventTarget | null,
|
|
180
|
+
channel: { post: (m: IframeToParent) => void },
|
|
181
|
+
): void {
|
|
182
|
+
if (!(target instanceof Element)) {
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
const invoker = target.closest<HTMLElement>("[data-jx-commandfor]");
|
|
186
|
+
const id = invoker?.dataset["jxCommandfor"];
|
|
187
|
+
const command = invoker?.getAttribute("command")?.trim().toLowerCase() ?? "";
|
|
188
|
+
if (!invoker || !id || !command) {
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
// Scanned, not selected, for the reason `postPopoverInvoke` gives; the addressable overlays are
|
|
192
|
+
// The de-popovered panels and the stamped dialogs.
|
|
193
|
+
const overlays = invoker.ownerDocument.querySelectorAll(
|
|
194
|
+
"[data-jx-popover], dialog[data-jx-path]",
|
|
195
|
+
);
|
|
196
|
+
const overlay = [...overlays].find((el) => el.id === id) as HTMLElement | undefined;
|
|
197
|
+
const serialized = overlay?.dataset.jxPath;
|
|
198
|
+
if (!serialized) {
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
channel.post({ command, kind: "commandTargetClick", targetPath: parseJxPath(serialized) });
|
|
202
|
+
}
|
|
203
|
+
|
|
90
204
|
export interface InteractionDeps {
|
|
91
205
|
/**
|
|
92
206
|
* The iframe's current non-reactive shadow doc (path coordinate space), or null before the first
|
|
@@ -190,6 +304,12 @@ export function startInteraction(
|
|
|
190
304
|
kind: "hit",
|
|
191
305
|
});
|
|
192
306
|
}
|
|
307
|
+
/* AFTER the hit, and the order is load-bearing. The host's reveal rule opens the overlay a
|
|
308
|
+
selection lands in, so a Close button INSIDE a dialog (the normal shape of one) selected
|
|
309
|
+
after its command would close the dialog and then reveal it again. Selected first, the
|
|
310
|
+
reveal is a no-op on an overlay that is already open, and the close lands. */
|
|
311
|
+
postPopoverInvoke(e.target, channel);
|
|
312
|
+
postCommandInvoke(e.target, channel);
|
|
193
313
|
};
|
|
194
314
|
|
|
195
315
|
/**
|
|
@@ -377,7 +377,13 @@ function editModeStyle(style: JxStyle | undefined): JxStyle | undefined {
|
|
|
377
377
|
}
|
|
378
378
|
const out: Record<string, unknown> = {};
|
|
379
379
|
for (const [k, v] of Object.entries(style)) {
|
|
380
|
-
|
|
380
|
+
/* OMITTED, not blanked. It used to be written as `""`, which was a silent no-op while a
|
|
381
|
+
declaration went to `el.style` and is a malformed declaration now that it goes into a rule.
|
|
382
|
+
Dropping the key is what blanking always meant: the property falls back to the cascade. */
|
|
383
|
+
if (typeof v === "string" && v.includes("${")) {
|
|
384
|
+
continue;
|
|
385
|
+
}
|
|
386
|
+
out[k] = v;
|
|
381
387
|
}
|
|
382
388
|
return out as JxStyle;
|
|
383
389
|
}
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
* @docs studio/editing/writing
|
|
19
19
|
*/
|
|
20
20
|
|
|
21
|
-
import { parseJxPath, serializeJxPath } from "./path-mapping";
|
|
21
|
+
import { jxPathSelector, parseJxPath, serializeJxPath } from "./path-mapping";
|
|
22
22
|
import type { JxPath } from "../state";
|
|
23
23
|
|
|
24
24
|
/** A caret/selection endpoint in document coordinates: a block path + a character offset into it. */
|
|
@@ -82,11 +82,10 @@ export function activeBlockAt(
|
|
|
82
82
|
|
|
83
83
|
/** Locate the rendered element for a document path via its stamped `data-jx-path`. */
|
|
84
84
|
export function elementForPath(container: HTMLElement, path: JxPath): HTMLElement | null {
|
|
85
|
-
|
|
86
|
-
//
|
|
87
|
-
//
|
|
88
|
-
const
|
|
89
|
-
const el = container.querySelector(`[data-jx-path='${esc}']`);
|
|
85
|
+
// The escaping lives in `jxPathSelector`, which the popover work extracted for its own lookup.
|
|
86
|
+
// This function had the only other copy of it, and two spellings of one escaping rule is how the
|
|
87
|
+
// Two come to disagree about a path containing a quote.
|
|
88
|
+
const el = container.querySelector(jxPathSelector(serializeJxPath(path)));
|
|
90
89
|
return el instanceof HTMLElement ? el : null;
|
|
91
90
|
}
|
|
92
91
|
|
|
@@ -23,11 +23,16 @@ import type { JxExpressionNode, JxMutableNode } from "@jxsuite/schema/types";
|
|
|
23
23
|
*/
|
|
24
24
|
export type WireDocOp = JxDocOp;
|
|
25
25
|
|
|
26
|
-
export const CANVAS_MODES = ["preview", "design", "edit", "stylebook"] as const;
|
|
26
|
+
export const CANVAS_MODES = ["preview", "design", "edit", "stylebook", "git-diff"] as const;
|
|
27
27
|
|
|
28
28
|
/**
|
|
29
|
-
* How the iframe renders the document: live `preview`, instrumented `design`/`edit`,
|
|
30
|
-
* `stylebook` specimen catalog (hit/hover/measure only — no inline editing, DnD, or insert zones)
|
|
29
|
+
* How the iframe renders the document: live `preview`, instrumented `design`/`edit`, the
|
|
30
|
+
* `stylebook` specimen catalog (hit/hover/measure only — no inline editing, DnD, or insert zones),
|
|
31
|
+
* or a `git-diff` comparison artboard (a read-only render carrying {@link WireDiffMarks}).
|
|
32
|
+
*
|
|
33
|
+
* `git-diff` was reaching the frame long before it was listed here: `preparePassRender` casts the
|
|
34
|
+
* resolved mode with `as CanvasMode`, so the one mode this union did not admit crossed the wire
|
|
35
|
+
* anyway and `isCanvasMode` answered false for a mode the frame was actively rendering.
|
|
31
36
|
*/
|
|
32
37
|
export type CanvasMode = (typeof CANVAS_MODES)[number];
|
|
33
38
|
|
|
@@ -63,6 +68,24 @@ export interface SyncedChord {
|
|
|
63
68
|
scope: "caret" | "canvas" | "global";
|
|
64
69
|
}
|
|
65
70
|
|
|
71
|
+
/** One node the comparison says changed, addressed in THIS artboard's document. */
|
|
72
|
+
export interface WireDiffMark {
|
|
73
|
+
path: (string | number)[];
|
|
74
|
+
/**
|
|
75
|
+
* How to draw it.
|
|
76
|
+
*
|
|
77
|
+
* A modification is ONE change with two faces, and the artboard it is drawn on decides which:
|
|
78
|
+
* `modified-before` on the committed side, `modified-after` on the working copy. The parent
|
|
79
|
+
* splits them when it hands each artboard its own marks, because the frame does not know which
|
|
80
|
+
* side it is. Marked identically on both, a modification read as "added" on the left — the green
|
|
81
|
+
* of the added colour over the text that is being replaced.
|
|
82
|
+
*/
|
|
83
|
+
kind: "added" | "removed" | "modified-before" | "modified-after";
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** An artboard's whole mark set. Each side receives only its own; `[]` clears. */
|
|
87
|
+
export type WireDiffMarks = readonly WireDiffMark[];
|
|
88
|
+
|
|
66
89
|
/** Messages the editor (parent) sends into the canvas iframe. */
|
|
67
90
|
export type ParentToIframe =
|
|
68
91
|
| { kind: "init"; gen: number }
|
|
@@ -102,11 +125,56 @@ export type ParentToIframe =
|
|
|
102
125
|
// Forced color-scheme preview (spec §9.5): "light"/"dark" sets data-color-scheme on the
|
|
103
126
|
// Iframe root, null clears it (auto — follow the OS).
|
|
104
127
|
colorScheme: "light" | "dark" | null;
|
|
128
|
+
/**
|
|
129
|
+
* Which nodes to tint on a `git-diff` artboard, in this side's own coordinates.
|
|
130
|
+
*
|
|
131
|
+
* A FIELD ON THE RENDER, not a message of its own, and the reason is ordering. A render ends
|
|
132
|
+
* in `container.replaceChildren(el)`, which destroys the DOM any earlier mark was stamped on
|
|
133
|
+
* — so a separate message would need its own generation, a queue for arriving early, and a
|
|
134
|
+
* re-apply hook after every render, three mechanisms to reproduce what carrying the data
|
|
135
|
+
* already guarantees. The transport settles it too: a host holds ONE `pending` message while
|
|
136
|
+
* its iframe boots, so a marks message posted beside a queued render would replace it.
|
|
137
|
+
*/
|
|
138
|
+
diffMarks?: WireDiffMarks | null;
|
|
139
|
+
/**
|
|
140
|
+
* Which popover the artboard draws OPEN, by document path — absent or null for none.
|
|
141
|
+
*
|
|
142
|
+
* Carried on `render` as well as by the setter below for the same reason `colorScheme` is: a
|
|
143
|
+
* render replaces the DOM, and the open state is one attribute on one element, so without it
|
|
144
|
+
* every re-render would close the panel the author is editing.
|
|
145
|
+
*/
|
|
146
|
+
popoverOpen?: (string | number)[] | null;
|
|
147
|
+
/** The dialog to draw open after this render, for the same reason. */
|
|
148
|
+
dialogOpen?: (string | number)[] | null;
|
|
105
149
|
gen: number;
|
|
106
150
|
}
|
|
107
151
|
// Flip the forced color-scheme preview on the iframe root without re-rendering — a document-level
|
|
108
152
|
// Idempotent attribute write, deliberately gen-less (like endEdit).
|
|
109
153
|
| { kind: "setColorScheme"; scheme: "light" | "dark" | null }
|
|
154
|
+
/**
|
|
155
|
+
* Draw the popover at `path` open, and every other one closed. `null` closes them all.
|
|
156
|
+
*
|
|
157
|
+
* Render-free and gen-less, exactly like `setColorScheme` above, because it changes no content:
|
|
158
|
+
* the runtime has already renamed every addressable `popover` to `data-jx-popover` for this
|
|
159
|
+
* render (`setCanvasDelinkPopovers`), so open-ness is ONE attribute on ONE element and the whole
|
|
160
|
+
* document's layout follows from flipping it. Opening a popover must not cost a full render —
|
|
161
|
+
* §4.1 calls that expensive, and it would rebuild every binding effect under the author's caret.
|
|
162
|
+
*
|
|
163
|
+
* Refused in preview, in BOTH realms: preview is native, and a canvas-only attribute has no
|
|
164
|
+
* business in a view whose whole job is fidelity (§4.2).
|
|
165
|
+
*
|
|
166
|
+
* A frame built before this message existed ignores it and draws every popover closed, which is
|
|
167
|
+
* the compatibility story `dist/iframe-entry.js` shipping prebuilt requires.
|
|
168
|
+
*/
|
|
169
|
+
| { kind: "setPopoverOpen"; path: (string | number)[] | null }
|
|
170
|
+
/** The `<dialog>` to draw open in place, or none. The dialog twin of `setPopoverOpen`. */
|
|
171
|
+
| { kind: "setDialogOpen"; path: (string | number)[] | null }
|
|
172
|
+
/**
|
|
173
|
+
* Replace a custom element's definition in the frame's realm — the canvas half of
|
|
174
|
+
* `redefineElement` (embedding.md §7). Instances already on the canvas keep the old definition
|
|
175
|
+
* until the next render replaces them, which is why the host follows it with a `render`.
|
|
176
|
+
*/
|
|
177
|
+
| { kind: "redefineElement"; doc: JxMutableNode; base?: string }
|
|
110
178
|
/**
|
|
111
179
|
* Set the language the artboard is drawn in — `lang` and `dir` on the frame's document element.
|
|
112
180
|
*
|
|
@@ -443,7 +511,18 @@ export type IframeToParent =
|
|
|
443
511
|
| { kind: "insertZones"; zones: InsertZone[] | null }
|
|
444
512
|
// Response to `measure`: the rects of whichever requested paths resolved to a node (missing paths
|
|
445
513
|
// Are simply omitted). `reqId` echoes the request so the parent can drop stale responses.
|
|
446
|
-
|
|
514
|
+
/**
|
|
515
|
+
* Measured rects for the requested paths.
|
|
516
|
+
*
|
|
517
|
+
* `hidden` names the paths that RESOLVED to an element but are not rendered — a closed popover, a
|
|
518
|
+
* `display: none` node, a `$switch` branch that is not the live case. They are reported apart
|
|
519
|
+
* from `hits` rather than as a zero rect, because a zero rect is a truthy object: the overlay
|
|
520
|
+
* drew a 0×0 box at the artboard origin and the block action bar anchored to it, so selecting a
|
|
521
|
+
* hidden node put a selection marker in the top-left corner of the page.
|
|
522
|
+
*
|
|
523
|
+
* Optional, so a prebuilt frame that predates it still answers.
|
|
524
|
+
*/
|
|
525
|
+
| { kind: "geometry"; reqId: number; hits: NodeHit[]; hidden?: (string | number)[][] }
|
|
447
526
|
// Response to `evalExpr`: one result per requested expression (empty when the request's gen no
|
|
448
527
|
// Longer matches the live render — the iframe never evaluates against the wrong scope). `reqId`/
|
|
449
528
|
// `gen` echo the request so the parent can drop stale replies (measure/geometry precedent).
|
|
@@ -541,7 +620,7 @@ export type IframeToParent =
|
|
|
541
620
|
| { kind: "editEnd" }
|
|
542
621
|
// ─── Slash-menu bridge ──────────────────────────────────────────────────────
|
|
543
622
|
// The engine (in the iframe) detected "/" in a live edit session; the parent shows the real
|
|
544
|
-
//
|
|
623
|
+
// Host-realm menu. Re-posted with a new `filter` as the author keeps typing (the engine's
|
|
545
624
|
// UpdateSlashMenu drives it). `rect` is the edited element's bbox in IFRAME-VIEWPORT coords.
|
|
546
625
|
/**
|
|
547
626
|
* Show the parent's slash menu at this rect.
|
|
@@ -580,6 +659,28 @@ export type IframeToParent =
|
|
|
580
659
|
//
|
|
581
660
|
// Deliberately NOT in the host's preview block-list: focusing a pane is not an edit, and it is
|
|
582
661
|
// The one thing preview must still report.
|
|
662
|
+
/**
|
|
663
|
+
* A `popovertarget` invoker was clicked, and it names a popover the studio can address.
|
|
664
|
+
*
|
|
665
|
+
* The canvas renames `popover` to `data-jx-popover`, so the browser's own invoker activation no
|
|
666
|
+
* longer fires — which is a gain, not a loss: there is exactly ONE writer of open state instead
|
|
667
|
+
* of a race between the platform and the editor, and the model can no longer disagree with what
|
|
668
|
+
* is on screen. The affordance is re-supplied here, and the host runs the same command the
|
|
669
|
+
* palette and the assistant run.
|
|
670
|
+
*
|
|
671
|
+
* Posted ALONGSIDE `hit`, never instead of it: clicking a trigger both selects the button and
|
|
672
|
+
* opens its panel, which is what an author expects from a control they can also style.
|
|
673
|
+
*/
|
|
674
|
+
| {
|
|
675
|
+
kind: "popoverTargetClick";
|
|
676
|
+
targetPath: (string | number)[];
|
|
677
|
+
action: "toggle" | "show" | "hide";
|
|
678
|
+
}
|
|
679
|
+
/**
|
|
680
|
+
* A click on a `<button command commandfor>` the canvas de-linked: the frame reports the target
|
|
681
|
+
* and the command, and the host's single writer of open state answers for a popover or a dialog.
|
|
682
|
+
*/
|
|
683
|
+
| { kind: "commandTargetClick"; targetPath: (string | number)[]; command: string }
|
|
583
684
|
| { kind: "paneFocus" }
|
|
584
685
|
// ─── Preview navigation ─────────────────────────────────────────────────────
|
|
585
686
|
// A link was clicked in PREVIEW mode. Preview keeps anchors live (design/edit de-link them onto
|