@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
|
@@ -2,9 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
import type { JxMutableNode } from "@jxsuite/schema/types";
|
|
4
4
|
|
|
5
|
-
import { getNodeAtPath } from "../store";
|
|
6
5
|
import { activeTab } from "../workspace/workspace";
|
|
7
|
-
import {
|
|
6
|
+
import { getEffectiveStyle } from "../site-context";
|
|
8
7
|
import cssMeta from "../../data/css-meta.json";
|
|
9
8
|
|
|
10
9
|
let cssInitialMap = new Map<string, string>();
|
|
@@ -48,7 +47,19 @@ export function allConditionsPass(
|
|
|
48
47
|
|
|
49
48
|
// ─── Auto-open sections ─────────────────────────────────────────────────────
|
|
50
49
|
|
|
51
|
-
/**
|
|
50
|
+
/**
|
|
51
|
+
* Open every section that has a value in it — and leave alone every section somebody has DECIDED
|
|
52
|
+
* about.
|
|
53
|
+
*
|
|
54
|
+
* The distinction is `undefined` versus `false`, and it is what makes the Style tab's accordion
|
|
55
|
+
* obey a click. It used to test `!result[section]`, which cannot tell "never opened" from "the
|
|
56
|
+
* reader just closed it": with the tab drawn once per interaction that was invisible, because the
|
|
57
|
+
* close and the re-open happened on either side of a render nobody looked between. The tab is a
|
|
58
|
+
* document now and re-projects the moment the section record moves, so closing an auto-opened
|
|
59
|
+
* section re-opened it in the same frame.
|
|
60
|
+
*
|
|
61
|
+
* @param {JxMutableNode} node @param {Record<string, boolean>} currentSections
|
|
62
|
+
*/
|
|
52
63
|
export function autoOpenSections(node: JxMutableNode, currentSections: Record<string, boolean>) {
|
|
53
64
|
const style = node.style || {};
|
|
54
65
|
const result = { ...currentSections };
|
|
@@ -58,7 +69,7 @@ export function autoOpenSections(node: JxMutableNode, currentSections: Record<st
|
|
|
58
69
|
}
|
|
59
70
|
const entry = (cssMeta.$defs as Record<string, Record<string, unknown>>)[prop];
|
|
60
71
|
const section = (entry?.$section as string) ?? "other";
|
|
61
|
-
if (
|
|
72
|
+
if (result[section] === undefined) {
|
|
62
73
|
result[section] = true;
|
|
63
74
|
}
|
|
64
75
|
}
|
|
@@ -213,10 +224,12 @@ export function compressBorderSide(vals: string[]) {
|
|
|
213
224
|
|
|
214
225
|
/** Extract --font-* CSS custom properties from the document root style. */
|
|
215
226
|
export function getFontVars() {
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
227
|
+
/* The EFFECTIVE style — the site's `project.json` block under the document's own — for the same
|
|
228
|
+
reason `colorTokens()` reads it: a project's fonts are declared once, in the site, and a list
|
|
229
|
+
that read only the document offered a component none of its project's fonts. The value is what
|
|
230
|
+
the token's OWN declaration says; a token that aliases another (`--font-ui: var(--font-body)`)
|
|
231
|
+
is followed by whoever draws it. Only scalars are taken: an object is a nested rule. */
|
|
232
|
+
const style = getEffectiveStyle(activeTab.value?.doc.document?.style);
|
|
220
233
|
const vars = [];
|
|
221
234
|
for (const [k, v] of Object.entries(style)) {
|
|
222
235
|
if (k.startsWith("--font") && (typeof v === "string" || typeof v === "number")) {
|
|
@@ -226,29 +239,20 @@ export function getFontVars() {
|
|
|
226
239
|
return vars;
|
|
227
240
|
}
|
|
228
241
|
|
|
229
|
-
/**
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
return "";
|
|
245
|
-
}
|
|
246
|
-
const m = typeof raw === "string" && raw.match(/^var\((--[^)]+)\)$/);
|
|
247
|
-
if (m) {
|
|
248
|
-
return tab?.doc.document?.style?.[m[1]!] || "";
|
|
249
|
-
}
|
|
250
|
-
return raw;
|
|
251
|
-
}
|
|
242
|
+
/**
|
|
243
|
+
* The typography properties whose keyword rows draw each value AS that value, and the `jx-option`
|
|
244
|
+
* channel each one reaches the row through (ui.md §5.3): a weight row's `700` is set in 700, an
|
|
245
|
+
* italic row's `Italic` leans, a transform row's `Uppercase` is capitalised without changing the
|
|
246
|
+
* word a reader hears. `fontFamily` is not here because its rows are their own preview through
|
|
247
|
+
* `face`, which is the channel every one of these rows ALSO carries, so a weight is shown in the
|
|
248
|
+
* element's own typeface rather than in the panel's.
|
|
249
|
+
*/
|
|
250
|
+
export const TYPO_PREVIEW_CHANNELS: Readonly<Record<string, string>> = {
|
|
251
|
+
fontStyle: "slant",
|
|
252
|
+
fontVariant: "variant",
|
|
253
|
+
fontWeight: "weight",
|
|
254
|
+
textDecoration: "decoration",
|
|
255
|
+
textTransform: "transform",
|
|
256
|
+
};
|
|
252
257
|
|
|
253
258
|
export { default as cssMeta } from "../../data/css-meta.json";
|
|
254
|
-
export { camelToKebab } from "../utils/studio-utils";
|
|
@@ -5,17 +5,19 @@
|
|
|
5
5
|
* a width-sized iframe, so `@media` blocks evaluate for real — this replaces the legacy parent-side
|
|
6
6
|
* inline-style flatten (`buildStylebookElement`/`refreshStylebookStyles`).
|
|
7
7
|
*
|
|
8
|
-
*
|
|
8
|
+
* One runtime fact shapes {@link transposeStylebookStyle}: tag-keyed rules on the generated root
|
|
9
|
+
* would restyle the card chrome (`div` rules hit chrome divs), so every tag rule `T` is re-keyed to
|
|
10
|
+
* `` `& .element-card-preview ${T}` `` — applyStyle resolves `&` to the root's `[data-jx=uid]`
|
|
11
|
+
* scope, confining the cascade to specimens.
|
|
9
12
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* divs), so every tag rule `T` is re-keyed to `` `& .element-card-preview ${T}` `` — applyStyle
|
|
15
|
-
* resolves `&` to the root's `[data-jx=uid]` scope, confining the cascade to specimens.
|
|
13
|
+
* There used to be a second, and it was a workaround rather than a fact: `applyStyle` emitted
|
|
14
|
+
* `@media → selector` but DROPPED `selector → @media`, so a tag rule's embedded `@name` block was
|
|
15
|
+
* HOISTED into the corresponding top-level one here. The runtime composes both orders now, so the
|
|
16
|
+
* hoist is gone and a nested `@name` block stays where the author wrote it.
|
|
16
17
|
*/
|
|
17
18
|
|
|
18
19
|
import { serializeJxPath } from "../canvas/path-mapping";
|
|
20
|
+
import { isKeyframesAtRule } from "@jxsuite/runtime/css";
|
|
19
21
|
import type { StylebookEntry } from "./stylebook-panel";
|
|
20
22
|
import type { ComponentEntry } from "../files/components";
|
|
21
23
|
import type { JxPath } from "../state";
|
|
@@ -46,74 +48,26 @@ function isPlainObject(v: unknown): v is Record<string, unknown> {
|
|
|
46
48
|
return v !== null && typeof v === "object" && !Array.isArray(v);
|
|
47
49
|
}
|
|
48
50
|
|
|
49
|
-
/** The specimen-scoping selector prefix (see module doc
|
|
51
|
+
/** The specimen-scoping selector prefix (see the module doc). */
|
|
50
52
|
const SPECIMEN_SCOPE = "& .element-card-preview";
|
|
51
53
|
|
|
52
|
-
/** Deep-merge `add` into `base` (objects merge, scalars overwrite; add wins). */
|
|
53
|
-
function mergeRules(
|
|
54
|
-
base: Record<string, unknown> | undefined,
|
|
55
|
-
add: Record<string, unknown>,
|
|
56
|
-
): Record<string, unknown> {
|
|
57
|
-
const out: Record<string, unknown> = { ...base };
|
|
58
|
-
for (const [k, v] of Object.entries(add)) {
|
|
59
|
-
out[k] = isPlainObject(v) && isPlainObject(out[k]) ? mergeRules(out[k], v) : v;
|
|
60
|
-
}
|
|
61
|
-
return out;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
/** Drop nested `@` keys from a rule object (already-hoisted media can't nest deeper). */
|
|
65
|
-
function stripAtKeys(rule: Record<string, unknown>): Record<string, unknown> {
|
|
66
|
-
const out: Record<string, unknown> = {};
|
|
67
|
-
for (const [k, v] of Object.entries(rule)) {
|
|
68
|
-
if (isPlainObject(v) && k.startsWith("@")) {
|
|
69
|
-
continue;
|
|
70
|
-
}
|
|
71
|
-
out[k] = isPlainObject(v) ? stripAtKeys(v) : v;
|
|
72
|
-
}
|
|
73
|
-
return out;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
54
|
/**
|
|
77
55
|
* Transform the merged effective document style into the generated root's style block: flat scalars
|
|
78
|
-
* and `--` custom props stay at the top (inheritance into specimens)
|
|
79
|
-
* {@link SPECIMEN_SCOPE},
|
|
80
|
-
*
|
|
81
|
-
* edit round-trips through the exact same transform.
|
|
56
|
+
* and `--` custom props stay at the top (inheritance into specimens) and tag rules are re-keyed
|
|
57
|
+
* under {@link SPECIMEN_SCOPE}, per the module doc. Shared by the doc generator and the live
|
|
58
|
+
* `styleUpdate` fast path so an edit round-trips through the exact same transform.
|
|
82
59
|
*/
|
|
83
60
|
export function transposeStylebookStyle(effectiveStyle: JxStyle): JxStyle {
|
|
84
61
|
const style = effectiveStyle as Record<string, unknown>;
|
|
85
62
|
const out: Record<string, unknown> = {};
|
|
86
|
-
const mediaOut: Record<string, Record<string, unknown>> = {};
|
|
87
63
|
|
|
88
|
-
/**
|
|
89
|
-
const
|
|
90
|
-
rule: Record<string, unknown>,
|
|
91
|
-
tagPath: string,
|
|
92
|
-
): Record<string, unknown> => {
|
|
64
|
+
/** Drop the base-width marker, which is not a query and would resolve to `@media --`. */
|
|
65
|
+
const withoutBaseWidth = (rule: Record<string, unknown>): Record<string, unknown> => {
|
|
93
66
|
const cleaned: Record<string, unknown> = {};
|
|
94
67
|
for (const [k, v] of Object.entries(rule)) {
|
|
95
|
-
if (
|
|
68
|
+
if (k !== "@--") {
|
|
96
69
|
cleaned[k] = v;
|
|
97
|
-
continue;
|
|
98
70
|
}
|
|
99
|
-
if (k.startsWith("@")) {
|
|
100
|
-
if (k === "@--") {
|
|
101
|
-
continue; // Base canvas width marker, not a real query.
|
|
102
|
-
}
|
|
103
|
-
mediaOut[k] ??= {};
|
|
104
|
-
const bucket = mediaOut[k];
|
|
105
|
-
const sel = `${SPECIMEN_SCOPE} ${tagPath}`;
|
|
106
|
-
bucket[sel] = mergeRules(
|
|
107
|
-
bucket[sel] as Record<string, unknown> | undefined,
|
|
108
|
-
stripAtKeys(v),
|
|
109
|
-
);
|
|
110
|
-
continue;
|
|
111
|
-
}
|
|
112
|
-
if (isTagPath(k)) {
|
|
113
|
-
cleaned[k] = processTagRule(v, `${tagPath} ${k}`);
|
|
114
|
-
continue;
|
|
115
|
-
}
|
|
116
|
-
cleaned[k] = v; // Pseudo/class/& sub-rules ride along under the re-keyed parent.
|
|
117
71
|
}
|
|
118
72
|
return cleaned;
|
|
119
73
|
};
|
|
@@ -123,33 +77,36 @@ export function transposeStylebookStyle(effectiveStyle: JxStyle): JxStyle {
|
|
|
123
77
|
out[k] = v; // Flat scalars + -- custom props.
|
|
124
78
|
continue;
|
|
125
79
|
}
|
|
80
|
+
if (k === "@--") {
|
|
81
|
+
continue; // Base canvas width marker, not a real query.
|
|
82
|
+
}
|
|
83
|
+
if (isKeyframesAtRule(k)) {
|
|
84
|
+
/* A keyframes body holds keyframe selectors — `from`, `to`, `50%` — which `isTagPath`
|
|
85
|
+
accepts and which re-keying would turn into `& .element-card-preview from`, a stop the
|
|
86
|
+
browser discards along with the rest of the animation. It has no selectors to confine. */
|
|
87
|
+
out[k] = v;
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
126
90
|
if (k.startsWith("@")) {
|
|
127
|
-
if (k === "@--") {
|
|
128
|
-
continue;
|
|
129
|
-
}
|
|
130
91
|
// Media block: re-key tag rules inside; non-tag keys (scalars/pseudo) apply to the root.
|
|
131
|
-
|
|
132
|
-
const bucket = mediaOut[k];
|
|
92
|
+
const bucket: Record<string, unknown> = {};
|
|
133
93
|
for (const [mk, mv] of Object.entries(v)) {
|
|
134
94
|
if (isPlainObject(mv) && isTagPath(mk)) {
|
|
135
|
-
|
|
136
|
-
bucket[sel] = mergeRules(bucket[sel] as Record<string, unknown> | undefined, mv);
|
|
95
|
+
bucket[`${SPECIMEN_SCOPE} ${mk}`] = withoutBaseWidth(mv);
|
|
137
96
|
} else {
|
|
138
97
|
bucket[mk] = mv;
|
|
139
98
|
}
|
|
140
99
|
}
|
|
100
|
+
out[k] = bucket;
|
|
141
101
|
continue;
|
|
142
102
|
}
|
|
143
103
|
if (isTagPath(k)) {
|
|
144
|
-
out[`${SPECIMEN_SCOPE} ${k}`] =
|
|
104
|
+
out[`${SPECIMEN_SCOPE} ${k}`] = withoutBaseWidth(v);
|
|
145
105
|
continue;
|
|
146
106
|
}
|
|
147
107
|
out[k] = v;
|
|
148
108
|
}
|
|
149
109
|
|
|
150
|
-
for (const [mk, mv] of Object.entries(mediaOut)) {
|
|
151
|
-
out[mk] = isPlainObject(out[mk]) ? mergeRules(out[mk] as Record<string, unknown>, mv) : mv;
|
|
152
|
-
}
|
|
153
110
|
return out as JxStyle;
|
|
154
111
|
}
|
|
155
112
|
|
|
@@ -1,135 +1,228 @@
|
|
|
1
1
|
/// <reference lib="dom" />
|
|
2
|
-
/**
|
|
2
|
+
/**
|
|
3
|
+
* The Outline panel while the pane is showing Project Styles — the element catalogue and the
|
|
4
|
+
* document's own custom properties.
|
|
5
|
+
*
|
|
6
|
+
* **The body is a Jx document** (`surfaces/panel-stylebook-layers.json`, mounted by
|
|
7
|
+
* `surfaces/panel-stylebook-layers.ts`), so this module renders nothing and projects everything.
|
|
8
|
+
* What stays here is what is a DECISION: how the catalogue's recursive `$sections` flatten into a
|
|
9
|
+
* list, how a child's compound path is spelled, which children are duplicates of each other, which
|
|
10
|
+
* tags the open file has already styled, and which row the current selection marks. The surface
|
|
11
|
+
* reads values.
|
|
12
|
+
*
|
|
13
|
+
* The panel does not own the panel RECORD — `panels/layers-panel.ts` does, because the Outline is
|
|
14
|
+
* one panel with two bodies and only the record can know which the pane is asking for. That module
|
|
15
|
+
* calls {@link mountStylebookLayersPanel} on the stylebook side and {@link detachStylebookLayers}
|
|
16
|
+
* on the other, which is what takes this document back out again: lit paints its own branch into
|
|
17
|
+
* the same `.panel-content` and would otherwise leave the catalogue standing underneath the tree.
|
|
18
|
+
*
|
|
19
|
+
* @docs studio/design/stylebook
|
|
20
|
+
*/
|
|
3
21
|
|
|
4
|
-
import { html, nothing } from "lit-html";
|
|
5
|
-
import { classMap } from "lit-html/directives/class-map.js";
|
|
6
22
|
import { activeTab } from "../workspace/workspace";
|
|
7
23
|
import { shell } from "../shell";
|
|
8
24
|
import { componentRegistry } from "../files/components";
|
|
25
|
+
import { mountStylebookLayersSurface } from "../surfaces/panel-stylebook-layers";
|
|
9
26
|
|
|
10
27
|
import type { StylebookEntry } from "./stylebook-panel";
|
|
28
|
+
import type {
|
|
29
|
+
StylebookLayersSurfaceHandle,
|
|
30
|
+
StylebookLayersValues,
|
|
31
|
+
StylebookRowView,
|
|
32
|
+
StylebookVariableView,
|
|
33
|
+
} from "../surfaces/panel-stylebook-layers";
|
|
11
34
|
import type { JxStyle } from "@jxsuite/schema/types";
|
|
12
|
-
import type { TemplateResult } from "lit-html";
|
|
13
35
|
import type { ComponentEntry } from "../files/components.js";
|
|
14
36
|
|
|
37
|
+
/** What the panel is drawn from: the catalogue, and what selecting a row does. */
|
|
38
|
+
export interface StylebookLayersCtx {
|
|
39
|
+
selectStylebookTag: (tag: string, media?: string | null, opts?: { panCanvas?: boolean }) => void;
|
|
40
|
+
stylebookMeta: { $sections: { label: string; elements: StylebookEntry[] }[] };
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** The row's own padding at depth 0, and what each level of nesting adds. */
|
|
44
|
+
const INDENT_BASE = 8;
|
|
45
|
+
const INDENT_STEP = 16;
|
|
46
|
+
|
|
15
47
|
/**
|
|
48
|
+
* Whether the open file has already written a `& <tag>` block with something in it.
|
|
49
|
+
*
|
|
16
50
|
* @param {JxStyle} rootStyle
|
|
17
51
|
* @param {string} tag
|
|
18
52
|
*/
|
|
19
53
|
function hasTagStyle(rootStyle: JxStyle, tag: string) {
|
|
20
54
|
const s = rootStyle[`& ${tag}`];
|
|
21
|
-
return s && typeof s === "object" && Object.keys(s).length > 0;
|
|
55
|
+
return Boolean(s) && typeof s === "object" && Object.keys(s as object).length > 0;
|
|
22
56
|
}
|
|
23
57
|
|
|
24
58
|
/**
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
* stylebookMeta: { $sections: { label: string; elements: StylebookEntry[] }[] };
|
|
32
|
-
* }} ctx
|
|
33
|
-
* @returns {import("lit-html").TemplateResult}
|
|
59
|
+
* The leaf of the current selection.
|
|
60
|
+
*
|
|
61
|
+
* A selection is a compound path (`"ul li"`) and the catalogue draws one row per TAG, so the row
|
|
62
|
+
* that is marked is the one whose tag is the path's last segment. That is what the tree has always
|
|
63
|
+
* done; it is written down here because "selected" meaning something other than "equal" is exactly
|
|
64
|
+
* the kind of thing a reader assumes is a bug.
|
|
34
65
|
*/
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
const selectedTag = shell.stylebook.selection;
|
|
42
|
-
const selectedLeaf = selectedTag?.includes(" ") ? selectedTag.split(" ").pop() : selectedTag;
|
|
66
|
+
function selectedLeaf(selection: string | null): string | null {
|
|
67
|
+
if (!selection) {
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
return selection.includes(" ") ? (selection.split(" ").pop() ?? null) : selection;
|
|
71
|
+
}
|
|
43
72
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
73
|
+
/**
|
|
74
|
+
* Flatten one catalogue entry and everything under it into rows.
|
|
75
|
+
*
|
|
76
|
+
* Children are deduplicated by tag — a `<ul>` specimen carries two `<li>`s and they are one row,
|
|
77
|
+
* because the row selects a TAG and there is only one `& li` to write.
|
|
78
|
+
*/
|
|
79
|
+
function elementRows(
|
|
80
|
+
entry: StylebookEntry,
|
|
81
|
+
rootStyle: JxStyle,
|
|
82
|
+
leaf: string | null,
|
|
83
|
+
depth: number,
|
|
84
|
+
parentPath: string,
|
|
85
|
+
out: StylebookRowView[],
|
|
86
|
+
): void {
|
|
87
|
+
const { tag } = entry;
|
|
88
|
+
const fullPath = parentPath ? `${parentPath} ${tag}` : tag;
|
|
89
|
+
out.push({
|
|
90
|
+
customized: hasTagStyle(rootStyle, tag),
|
|
91
|
+
indent: `${INDENT_BASE + depth * INDENT_STEP}px`,
|
|
92
|
+
key: fullPath,
|
|
93
|
+
kind: "element",
|
|
94
|
+
label: entry.text || `<${tag}>`,
|
|
95
|
+
selected: tag === leaf,
|
|
96
|
+
tag,
|
|
97
|
+
});
|
|
98
|
+
const children = entry.children
|
|
99
|
+
? [...new Map(entry.children.map((c: StylebookEntry) => [c.tag, c])).values()]
|
|
100
|
+
: [];
|
|
101
|
+
for (const child of children) {
|
|
102
|
+
elementRows(child, rootStyle, leaf, depth + 1, fullPath, out);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/** The custom properties the open file declares, in the order it declares them. */
|
|
107
|
+
function variableRows(rootStyle: JxStyle): StylebookVariableView[] {
|
|
108
|
+
return Object.entries(rootStyle)
|
|
109
|
+
.filter(([k]) => k.startsWith("--"))
|
|
110
|
+
.map(([name, value]) => ({ key: name, name, value: String(value) }));
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* What the surface should be showing right now.
|
|
115
|
+
*
|
|
116
|
+
* Exported because it is the whole of this module that is worth testing on its own: it is a pure
|
|
117
|
+
* function of the open document, the shell's stylebook state and the component registry.
|
|
118
|
+
*
|
|
119
|
+
* @param {StylebookLayersCtx} ctx
|
|
120
|
+
* @returns {StylebookLayersValues}
|
|
121
|
+
*/
|
|
122
|
+
export function stylebookLayersValues(ctx: StylebookLayersCtx): StylebookLayersValues {
|
|
123
|
+
const tab = activeTab.value;
|
|
124
|
+
const rootStyle = (tab?.doc.document?.style || {}) as JxStyle;
|
|
125
|
+
const { selection } = shell.stylebook;
|
|
126
|
+
const leaf = selectedLeaf(selection);
|
|
86
127
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
}
|
|
128
|
+
const rows: StylebookRowView[] = [];
|
|
129
|
+
for (const section of ctx.stylebookMeta.$sections) {
|
|
130
|
+
for (const entry of section.elements) {
|
|
131
|
+
elementRows(entry, rootStyle, leaf, 0, "", rows);
|
|
92
132
|
}
|
|
93
|
-
const compRows = componentRegistry.map(
|
|
94
|
-
/** @param {import("../files/components.js").ComponentEntry} comp */ (
|
|
95
|
-
comp: ComponentEntry,
|
|
96
|
-
) => html`
|
|
97
|
-
<div
|
|
98
|
-
class=${classMap({
|
|
99
|
-
"layer-row": true,
|
|
100
|
-
selected: comp.tagName === selectedTag,
|
|
101
|
-
})}
|
|
102
|
-
@click=${() =>
|
|
103
|
-
ctx.selectStylebookTag(comp.tagName, undefined, {
|
|
104
|
-
panCanvas: true,
|
|
105
|
-
})}
|
|
106
|
-
>
|
|
107
|
-
<span class="layer-tag component-tag" style="background:var(--accent)">⬡</span>
|
|
108
|
-
<span class="layer-label">${comp.tagName}</span>
|
|
109
|
-
</div>
|
|
110
|
-
`,
|
|
111
|
-
);
|
|
112
|
-
return html`${elementRows}${compRows}`;
|
|
113
133
|
}
|
|
114
|
-
const
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
134
|
+
for (const comp of componentRegistry as ComponentEntry[]) {
|
|
135
|
+
rows.push({
|
|
136
|
+
customized: false,
|
|
137
|
+
indent: `${INDENT_BASE}px`,
|
|
138
|
+
key: comp.tagName,
|
|
139
|
+
kind: "component",
|
|
140
|
+
label: comp.tagName,
|
|
141
|
+
selected: comp.tagName === selection,
|
|
142
|
+
/* The glyph, not the tag: a component's tag IS its label here, and a badge repeating it
|
|
143
|
+
would be the same word twice on one 24px row. */
|
|
144
|
+
tag: "⬡",
|
|
145
|
+
});
|
|
122
146
|
}
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
147
|
+
|
|
148
|
+
const variables = variableRows(rootStyle);
|
|
149
|
+
return {
|
|
150
|
+
hasVariables: variables.length > 0,
|
|
151
|
+
rows,
|
|
152
|
+
tab: shell.stylebook.tab,
|
|
153
|
+
variables,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* The surface standing in the Navigator, and the node it was mounted into.
|
|
159
|
+
*
|
|
160
|
+
* One slot rather than a per-host map, for the reason `panels/elements-panel.ts` gives: there is
|
|
161
|
+
* one Navigator, so a mount into a DIFFERENT node is the old one being replaced, and holding both
|
|
162
|
+
* would leave the first one's effects running against a scope nobody writes any more.
|
|
163
|
+
*/
|
|
164
|
+
let standing: { host: HTMLElement; handle: StylebookLayersSurfaceHandle } | null = null;
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Keep the selected row on screen after a repaint.
|
|
168
|
+
*
|
|
169
|
+
* On a microtask, because the document is what draws the row: a scope written on this tick is a
|
|
170
|
+
* binding that runs on the next one, so a query made here and now would find the row the PREVIOUS
|
|
171
|
+
* projection marked (or, on the first paint, no rows at all).
|
|
172
|
+
*/
|
|
173
|
+
function revealSelectedRow(host: HTMLElement): void {
|
|
174
|
+
queueMicrotask(() => {
|
|
175
|
+
host
|
|
176
|
+
.querySelector('[part="row"][aria-current="true"]')
|
|
177
|
+
?.scrollIntoView?.({ behavior: "smooth", block: "nearest" });
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Draw the catalogue — mounting the document the first time, updating it every time after.
|
|
183
|
+
*
|
|
184
|
+
* The document goes into `.panel-content`, not into the `.panel-body` this is handed, for the
|
|
185
|
+
* reason `panels/elements-panel.ts` states: only one of them is the node lit renders this panel's
|
|
186
|
+
* body into, and appending to the other would leave the catalogue drawn under whatever the
|
|
187
|
+
* Navigator paints next.
|
|
188
|
+
*
|
|
189
|
+
* The second parameter is `host` rather than `container` deliberately — see
|
|
190
|
+
* `scripts/check-pane-singletons.ts`'s {@link PANE_PARAM_NAMES}. This is the NAVIGATOR's node, not
|
|
191
|
+
* a pane's stage, and "which document is open" is the whole question the projection answers.
|
|
192
|
+
*
|
|
193
|
+
* @param {StylebookLayersCtx} ctx
|
|
194
|
+
* @param {HTMLElement} host - The painted `.panel-body`
|
|
195
|
+
*/
|
|
196
|
+
export function mountStylebookLayersPanel(ctx: StylebookLayersCtx, host: HTMLElement): void {
|
|
197
|
+
const target = host.querySelector<HTMLElement>(".panel-content") ?? host;
|
|
198
|
+
if (standing && (standing.host !== target || !standing.handle.connected())) {
|
|
199
|
+
standing.handle.dispose();
|
|
200
|
+
standing = null;
|
|
201
|
+
}
|
|
202
|
+
const values = stylebookLayersValues(ctx);
|
|
203
|
+
if (standing) {
|
|
204
|
+
standing.handle.update(values);
|
|
205
|
+
} else {
|
|
206
|
+
standing = {
|
|
207
|
+
handle: mountStylebookLayersSurface(target, values, {
|
|
208
|
+
selectRow: (path) => {
|
|
209
|
+
ctx.selectStylebookTag(path, undefined, { panCanvas: true });
|
|
210
|
+
},
|
|
211
|
+
}),
|
|
212
|
+
host: target,
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
revealSelectedRow(target);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* Take the catalogue down.
|
|
220
|
+
*
|
|
221
|
+
* Called by the Outline's record when the pane is no longer showing Project Styles. Without it the
|
|
222
|
+
* document survives its own irrelevance: lit's branch renders into the range it owns inside
|
|
223
|
+
* `.panel-content` and leaves everything appended after it exactly where it was.
|
|
224
|
+
*/
|
|
225
|
+
export function detachStylebookLayers(): void {
|
|
226
|
+
standing?.handle.dispose();
|
|
227
|
+
standing = null;
|
|
135
228
|
}
|