@jxsuite/studio 6.1.0 → 6.1.2
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/dist/chunks/2020-f2gkpy8d.js +4 -0
- package/dist/chunks/{action-group-2mqby73c.js → action-group-4aan7g6g.js} +3 -3
- package/dist/chunks/adapter-4912g339.js +4 -0
- package/dist/chunks/cf-account-picker-wccaenh6.js +4 -0
- package/dist/chunks/cf-settings-br6105tr.js +4 -0
- package/dist/chunks/color-28ksk2qm.js +4 -0
- package/dist/chunks/color-area-0fj8a4ga.js +4 -0
- package/dist/chunks/color-field-xch8kx2g.js +4 -0
- package/dist/chunks/color-slider-jxd8v350.js +4 -0
- package/dist/chunks/combobox-p0efwjke.js +4 -0
- package/dist/chunks/components-db68vsn7.js +4 -0
- package/dist/chunks/content-source-1449qesq.js +4 -0
- package/dist/chunks/convert-to-repeater-5h457egj.js +4 -0
- package/dist/chunks/dialog-c4x05vyx.js +4 -0
- package/dist/chunks/editor-x9jn86a7.js +4 -0
- package/dist/chunks/entry-commands-may24cpt.js +4 -0
- package/dist/chunks/extension-sections-pvr14vxr.js +4 -0
- package/dist/chunks/file-ops-x9v54pcj.js +4 -0
- package/dist/chunks/files-j3knqf0s.js +4 -0
- package/dist/chunks/format-host-tyre2trb.js +4 -0
- package/dist/chunks/fs-events-64ma9htc.js +4 -0
- package/dist/chunks/git-panel-84ps5dex.js +4 -0
- package/dist/chunks/grid-view-d2wq9ezg.js +51 -0
- package/dist/chunks/icons-pnfz478q.js +4 -0
- package/dist/chunks/iframe-entry-fvbk89gm.js +5 -0
- package/dist/chunks/iframe-entry-jdcktez8.js +5 -0
- package/dist/chunks/iframe-entry-x0ygf2yr.js +5 -0
- package/dist/chunks/iframe-entry-zap785cw.js +5 -0
- package/dist/chunks/iframe-host-ck6vejt5.js +4 -0
- package/dist/chunks/index-b8xw3vy9.js +4 -0
- package/dist/chunks/{index-gybvv7a6.js → index-zpjmzqfk.js} +3 -3
- package/dist/chunks/{javascript-rnvdp3k4.js → javascript-m54mnwp6.js} +3 -3
- package/dist/chunks/jsonMode-w15cmrcm.js +13 -0
- package/dist/chunks/jx-validate-at3zn8wa.js +4 -0
- package/dist/chunks/layers-h4xp1pss.js +4 -0
- package/dist/chunks/layers-panel-m5hw1d7g.js +4 -0
- package/dist/chunks/listbox-e74qjyq6.js +4 -0
- package/dist/chunks/lit-html-8t8t3dnr.js +4 -0
- package/dist/chunks/media-picker-2cweexc5.js +4 -0
- package/dist/chunks/menu-n6yzswmy.js +4 -0
- package/dist/chunks/menu-ynw13y0s.js +4 -0
- package/dist/chunks/monaco-binding-7gx83x3r.js +4 -0
- package/dist/chunks/monaco-buffer-qzxn567r.js +4 -0
- package/dist/chunks/monaco-setup-gxf6656g.js +4 -0
- package/dist/chunks/notify-cj5zbrs2.js +4 -0
- package/dist/chunks/number-field-y62xq0ty.js +4 -0
- package/dist/chunks/parse-b7ddhr8m.js +4 -0
- package/dist/chunks/platform-3dfws9js.js +4 -0
- package/dist/chunks/popover-jt2gxmzs.js +4 -0
- package/dist/chunks/publish-panel-1gvxbj21.js +4 -0
- package/dist/chunks/quick-search-0dajrwqg.js +4 -0
- package/dist/chunks/references-49qgt404.js +4 -0
- package/dist/chunks/right-panel-jm1bwe53.js +4 -0
- package/dist/chunks/section-registry-6kwc4fky.js +4 -0
- package/dist/chunks/select-rzds841e.js +4 -0
- package/dist/chunks/split-n2gfpm5m.js +4 -0
- package/dist/chunks/{studio-5g0ag7c0.js → studio-0q988f9w.js} +3 -3
- package/dist/chunks/studio-0rt52vpq.js +5 -0
- package/dist/chunks/studio-18vgbhs5.js +5 -0
- package/dist/chunks/{studio-pxg4ap1e.js → studio-1fxkaaea.js} +4 -4
- package/dist/chunks/studio-24mccdrj.js +5 -0
- package/dist/chunks/studio-2eh507zk.js +9 -0
- package/dist/chunks/studio-2hcbccfv.js +5 -0
- package/dist/chunks/studio-2j1cb95x.js +5 -0
- package/dist/chunks/studio-2jbs3rxv.js +5 -0
- package/dist/chunks/{studio-qbj760tx.js → studio-485046te.js} +7 -7
- package/dist/chunks/studio-4h8k4dw9.js +5 -0
- package/dist/chunks/studio-5f6n18kx.js +5 -0
- package/dist/chunks/studio-5gthpky6.js +5 -0
- package/dist/chunks/studio-5ve6bbep.js +5 -0
- package/dist/chunks/studio-6ep3js6b.js +9 -0
- package/dist/chunks/studio-6wkmf3wz.js +9 -0
- package/dist/chunks/studio-841rf3cg.js +5 -0
- package/dist/chunks/studio-8gmwgheg.js +5 -0
- package/dist/chunks/studio-8qm0ep50.js +5 -0
- package/dist/chunks/{studio-anyrgzvb.js → studio-90pq9km1.js} +4 -4
- package/dist/chunks/studio-924p1tm1.js +6 -0
- package/dist/chunks/{studio-v2bvmbjj.js → studio-a3g98wjr.js} +4 -4
- package/dist/chunks/studio-a3shpz9y.js +5 -0
- package/dist/chunks/studio-amsbaaar.js +6 -0
- package/dist/chunks/studio-at5spjbc.js +7 -0
- package/dist/chunks/studio-b2xv945e.js +5 -0
- package/dist/chunks/studio-bn5nkafw.js +5 -0
- package/dist/chunks/studio-bw6q5xjf.js +9 -0
- package/dist/chunks/studio-c7q0t9x1.js +5 -0
- package/dist/chunks/studio-camnhc96.js +6 -0
- package/dist/chunks/studio-cffqvnzd.js +5 -0
- package/dist/chunks/studio-d81xfh1g.js +5 -0
- package/dist/chunks/studio-dgz8d0c1.js +5 -0
- package/dist/chunks/studio-efvfrsf8.js +5 -0
- package/dist/chunks/studio-er30bpcx.js +5 -0
- package/dist/chunks/studio-ezscgr64.js +5 -0
- package/dist/chunks/studio-ffrrncvz.js +5 -0
- package/dist/chunks/studio-fpphgn8y.js +10 -0
- package/dist/chunks/studio-j1kvhdjk.js +4 -0
- package/dist/chunks/{studio-txjjzrsm.js → studio-j430n16g.js} +5 -5
- package/dist/chunks/studio-jjkg84nj.js +5 -0
- package/dist/chunks/studio-m0q32ars.js +4 -0
- package/dist/chunks/studio-m6bdst11.js +5 -0
- package/dist/chunks/studio-nv2cptd4.js +64 -0
- package/dist/chunks/studio-nwfrc98n.js +5 -0
- package/dist/chunks/studio-p1wgvp7r.js +5 -0
- package/dist/chunks/studio-pag2wncm.js +5 -0
- package/dist/chunks/studio-qvanvzfd.js +5 -0
- package/dist/chunks/studio-qwa64kt7.js +5 -0
- package/dist/chunks/studio-rk1zc4x3.js +928 -0
- package/dist/chunks/studio-se2r3ptc.js +5 -0
- package/dist/chunks/studio-sg2a0dh0.js +5 -0
- package/dist/chunks/studio-tjzjhe68.js +5 -0
- package/dist/chunks/{studio-0x3jyb8r.js → studio-tq0rtfwj.js} +4 -4
- package/dist/chunks/{studio-cpxkgjrj.js → studio-v0jzqdjm.js} +4 -4
- package/dist/chunks/studio-v2w7q8r1.js +7 -0
- package/dist/chunks/studio-v5vjq1h0.js +4 -0
- package/dist/chunks/studio-v8aga3vp.js +14 -0
- package/dist/chunks/studio-vfcdrfmv.js +5 -0
- package/dist/chunks/studio-vmfkgdjf.js +5 -0
- package/dist/chunks/studio-wt1816jj.js +5 -0
- package/dist/chunks/studio-wz73q5kq.js +4 -0
- package/dist/chunks/studio-y04qtxvp.js +7 -0
- package/dist/chunks/studio-y21g8zzg.js +5 -0
- package/dist/chunks/studio-y64hrt8p.js +12 -0
- package/dist/chunks/studio-ynn90f58.js +16 -0
- package/dist/chunks/studio-yxz682sx.js +5 -0
- package/dist/chunks/studio-zp7snvkq.js +5 -0
- package/dist/chunks/studio-zq4z6tm6.js +5 -0
- package/dist/chunks/swatch-group-ewh24n1f.js +4 -0
- package/dist/chunks/tabs-f5cw3tgp.js +4 -0
- package/dist/chunks/textfield-wewc8rq2.js +4 -0
- package/dist/chunks/toast-c9fn075p.js +4 -0
- package/dist/chunks/toast-host-ke5z4ng7.js +4 -0
- package/dist/chunks/{toolbar-2nnzqhrj.js → toolbar-44cm5cta.js} +3 -3
- package/dist/chunks/tooltip-5v8ngwj2.js +4 -0
- package/dist/chunks/tree-mdq3v5cw.js +4 -0
- package/dist/chunks/tsMode-sf49ee9x.js +14 -0
- package/dist/chunks/workspace-jtfahpee.js +4 -0
- package/dist/chunks/ws-client-nze0k6mv.js +4 -0
- package/dist/iframe-entry.js +16 -16
- package/dist/manifest.json +63 -63
- package/dist/studio.js +98 -98
- package/dist/workers/ts.worker.js +3 -3
- package/package.json +11 -11
- package/src/about/about-modal.ts +4 -3
- package/src/account/action-flow.ts +45 -38
- package/src/account-status.ts +7 -2
- package/src/browse/library-layouts.ts +8 -5
- package/src/browse/library-model.ts +18 -6
- package/src/browse/library-pane.ts +37 -21
- package/src/browse/library-preview.ts +14 -9
- package/src/browse/library-source.ts +1 -1
- package/src/canvas/asset-refs.ts +24 -9
- package/src/canvas/asset-resolve.ts +19 -23
- package/src/canvas/canvas-helpers.ts +7 -6
- package/src/canvas/canvas-live-render.ts +44 -53
- package/src/canvas/canvas-patcher.ts +30 -30
- package/src/canvas/canvas-perf.ts +11 -5
- package/src/canvas/canvas-render.ts +66 -42
- package/src/canvas/canvas-surface.ts +5 -3
- package/src/canvas/canvas-utils.ts +163 -64
- package/src/canvas/dialog-path.ts +9 -4
- package/src/canvas/dialog-state.ts +1 -2
- package/src/canvas/diff-marks.ts +9 -16
- package/src/canvas/diff-toolbar.ts +8 -7
- package/src/canvas/edit-width-drag.ts +4 -1
- package/src/canvas/edit-width.ts +1 -3
- package/src/canvas/iframe-channel.ts +27 -13
- package/src/canvas/iframe-drop.ts +13 -12
- package/src/canvas/iframe-editable-root.ts +29 -16
- package/src/canvas/iframe-entry.ts +80 -63
- package/src/canvas/iframe-eval.ts +73 -49
- package/src/canvas/iframe-host.ts +203 -118
- package/src/canvas/iframe-inline-edit.ts +69 -32
- package/src/canvas/iframe-insert.ts +5 -4
- package/src/canvas/iframe-interaction.ts +37 -26
- package/src/canvas/iframe-overlay.ts +1 -1
- package/src/canvas/iframe-patch.ts +18 -15
- package/src/canvas/iframe-position.ts +12 -6
- package/src/canvas/iframe-protocol.ts +15 -16
- package/src/canvas/iframe-render.ts +41 -36
- package/src/canvas/iframe-slash.ts +24 -11
- package/src/canvas/iframe-subtree.ts +6 -2
- package/src/canvas/path-mapping.ts +19 -12
- package/src/canvas/popover-path.ts +7 -3
- package/src/canvas/popover-state.ts +1 -2
- package/src/canvas/serialize-scope.ts +13 -5
- package/src/canvas/stage-scrollbar.ts +2 -1
- package/src/canvas/surface-registry.ts +21 -3
- package/src/collab/collab-commands.ts +7 -2
- package/src/collab/collab-session.ts +84 -45
- package/src/collab/collab-state.ts +4 -3
- package/src/collab/monaco-binding.ts +16 -13
- package/src/collab/monaco-cursors.ts +5 -2
- package/src/commands/budget.ts +3 -3
- package/src/commands/command-args.ts +103 -71
- package/src/commands/context.ts +22 -20
- package/src/commands/defaults.ts +4 -1
- package/src/commands/keymap.ts +47 -43
- package/src/commands/levels.ts +3 -3
- package/src/commands/live-context.ts +10 -8
- package/src/commands/reference.ts +2 -1
- package/src/commands/registry.ts +12 -10
- package/src/commands/run-reported.ts +15 -10
- package/src/component-props.ts +46 -30
- package/src/content/collection-match.ts +5 -4
- package/src/content/draft-state.ts +4 -3
- package/src/content/entry-commands.ts +3 -2
- package/src/content/entry-editor.ts +29 -17
- package/src/content/entry-fields.ts +12 -7
- package/src/content/entry-model.ts +21 -12
- package/src/editor/canvas-context-menu.ts +1 -2
- package/src/editor/canvas-slash-bridge.ts +3 -6
- package/src/editor/content-slice.ts +16 -14
- package/src/editor/context-menu.ts +35 -22
- package/src/editor/convert-targets.ts +30 -35
- package/src/editor/convert-to-component.ts +11 -5
- package/src/editor/convert-to-repeater.ts +34 -22
- package/src/editor/editable-tags.ts +17 -2
- package/src/editor/file-drop-action.ts +21 -22
- package/src/editor/inline-edit-apply.ts +35 -17
- package/src/editor/inline-edit.ts +66 -50
- package/src/editor/inline-format.ts +59 -56
- package/src/editor/inline-link.ts +40 -15
- package/src/editor/insert-zone-action.ts +1 -1
- package/src/editor/merge-tags.ts +58 -19
- package/src/editor/repeater-scope.ts +39 -28
- package/src/editor/shortcuts.ts +87 -47
- package/src/editor/slash-menu.ts +1 -6
- package/src/files/asset-versions.ts +4 -4
- package/src/files/components.ts +15 -10
- package/src/files/elements.ts +5 -6
- package/src/files/file-ops.ts +77 -36
- package/src/files/files.ts +90 -95
- package/src/files/media-meta.ts +2 -1
- package/src/files/media-paths.ts +6 -1
- package/src/files/serialize-document.ts +2 -2
- package/src/format/constraints.ts +1 -1
- package/src/format/convert-file.ts +27 -13
- package/src/format/format-choices.ts +2 -1
- package/src/format/format-host.ts +76 -50
- package/src/github/github-auth-status.ts +27 -3
- package/src/github/github-auth.ts +19 -9
- package/src/github/github-publish.ts +24 -20
- package/src/grid/cell-editors.ts +46 -31
- package/src/grid/cell-popovers.ts +5 -3
- package/src/grid/edit-buffer.ts +10 -9
- package/src/grid/grid-controller.ts +20 -22
- package/src/grid/grid-layout.ts +21 -5
- package/src/grid/grid-open.ts +3 -6
- package/src/grid/grid-panel.ts +11 -4
- package/src/grid/grid-source.ts +8 -8
- package/src/grid/grid-view.ts +14 -17
- package/src/grid/redirects-grid.ts +14 -5
- package/src/grid/redirects.ts +16 -14
- package/src/grid/schema-columns.ts +25 -19
- package/src/grid/sources/connector-source.ts +47 -20
- package/src/grid/sources/content-source.ts +25 -24
- package/src/grid/sources/csv-file-source.ts +2 -2
- package/src/grid/tabulator-tables.d.ts +55 -34
- package/src/hosting/stage.ts +7 -7
- package/src/i18n/i18n-commands.ts +1 -2
- package/src/media/media-pane.ts +4 -1
- package/src/new-project/add-repo-modal.ts +20 -19
- package/src/new-project/import-tab.ts +10 -14
- package/src/new-project/location-fields.ts +2 -1
- package/src/new-project/new-project-modal.ts +12 -9
- package/src/packages/jxsuite-update.ts +4 -3
- package/src/packages/pull-package-sync.ts +26 -25
- package/src/page-params.ts +97 -68
- package/src/panels/activity-panel.ts +17 -9
- package/src/panels/ai-chat/attached-context.ts +13 -7
- package/src/panels/ai-chat/chat-view.ts +80 -73
- package/src/panels/ai-chat/composer.ts +30 -33
- package/src/panels/ai-chat/sessions-view.ts +1 -2
- package/src/panels/ai-panel.ts +23 -20
- package/src/panels/block-action-bar.ts +46 -35
- package/src/panels/bottom-dock.ts +5 -3
- package/src/panels/canvas-dnd-bridge.ts +31 -24
- package/src/panels/data-explorer.ts +62 -25
- package/src/panels/data-grid.ts +14 -11
- package/src/panels/dnd.ts +108 -118
- package/src/panels/editors.ts +55 -22
- package/src/panels/elements-panel.ts +10 -3
- package/src/panels/events-panel.ts +84 -69
- package/src/panels/formula-workspace.ts +76 -51
- package/src/panels/frontmatter-fields.ts +24 -19
- package/src/panels/frontmatter-panel.ts +44 -34
- package/src/panels/git-diff-open.ts +4 -4
- package/src/panels/git-panel.ts +49 -61
- package/src/panels/head-panel.ts +131 -111
- package/src/panels/i18n-panel.ts +10 -3
- package/src/panels/imports-panel.ts +23 -47
- package/src/panels/jump-bar.ts +48 -29
- package/src/panels/layers-panel.ts +97 -74
- package/src/panels/left-panel.ts +3 -3
- package/src/panels/pane-context.ts +31 -22
- package/src/panels/pane-grid.ts +49 -20
- package/src/panels/panel-registry.ts +22 -37
- package/src/panels/properties-panel.ts +175 -121
- package/src/panels/quick-search.ts +53 -31
- package/src/panels/right-panel.ts +3 -3
- package/src/panels/seo-modal.ts +13 -17
- package/src/panels/settings-menu.ts +15 -15
- package/src/panels/signals-panel.ts +153 -131
- package/src/panels/statement-editor.ts +230 -140
- package/src/panels/style-panel.ts +254 -216
- package/src/panels/style-utils.ts +114 -51
- package/src/panels/stylebook-doc.ts +57 -54
- package/src/panels/stylebook-layers-panel.ts +9 -9
- package/src/panels/stylebook-panel.ts +13 -17
- package/src/panels/tab-drop.ts +27 -11
- package/src/panels/tab-strip.ts +36 -26
- package/src/platform-errors.ts +57 -43
- package/src/platform.ts +58 -30
- package/src/platforms/cloud.ts +345 -175
- package/src/platforms/default-platform.ts +10 -4
- package/src/platforms/devserver.ts +174 -127
- package/src/platforms/read-batcher.ts +16 -8
- package/src/project-list.ts +2 -1
- package/src/publish/deploy-checklist.ts +8 -2
- package/src/publish/pages-service.ts +28 -13
- package/src/publish/publish-commands.ts +5 -4
- package/src/publish/publish-panel.ts +10 -6
- package/src/recent-projects.ts +15 -8
- package/src/resize-edges.ts +26 -36
- package/src/services/a11y-report.ts +26 -19
- package/src/services/agent-seed.ts +23 -11
- package/src/services/ai-ask.ts +9 -12
- package/src/services/ai-command-tools.ts +68 -62
- package/src/services/ai-import-tools.ts +80 -67
- package/src/services/ai-models.ts +17 -13
- package/src/services/ai-project-tools.ts +68 -32
- package/src/services/ai-session-store.ts +19 -10
- package/src/services/ai-system-prompt.ts +46 -20
- package/src/services/ai-tools.ts +71 -27
- package/src/services/ai-write-report.ts +20 -12
- package/src/services/ai-writes.ts +4 -4
- package/src/services/automation.ts +58 -31
- package/src/services/cem-export.ts +149 -58
- package/src/services/clock.ts +6 -1
- package/src/services/code-services.ts +37 -31
- package/src/services/context-manager.ts +14 -10
- package/src/services/context-resolver.ts +20 -8
- package/src/services/data-service.ts +19 -15
- package/src/services/directory-picker.ts +18 -12
- package/src/services/document-assistant.ts +39 -19
- package/src/services/gated-registry.ts +10 -6
- package/src/services/harness/chat-reducer.ts +23 -1
- package/src/services/import-client.ts +91 -38
- package/src/services/import-seed.ts +8 -2
- package/src/services/jx-validate.ts +28 -31
- package/src/services/live-preview.ts +0 -0
- package/src/services/live-surfaces.ts +6 -3
- package/src/services/model-uri.ts +10 -2
- package/src/services/module-preloads.ts +12 -8
- package/src/services/monaco-buffer.ts +43 -24
- package/src/services/monaco-lazy.ts +7 -8
- package/src/services/monaco-setup.ts +23 -16
- package/src/services/notify.ts +44 -17
- package/src/services/popover-report.ts +25 -10
- package/src/services/preview-eval.ts +20 -8
- package/src/services/profile.ts +13 -6
- package/src/services/project-path.ts +13 -10
- package/src/services/references.ts +0 -0
- package/src/services/render-critic.ts +8 -7
- package/src/services/settings/kernel.ts +13 -4
- package/src/services/settings/write-queue.ts +9 -9
- package/src/services/token-lint.ts +12 -10
- package/src/services/tool-executor.ts +17 -5
- package/src/services/tool-outcomes.ts +44 -24
- package/src/services/trusted-types.ts +24 -7
- package/src/settings/contexts-section.ts +11 -8
- package/src/settings/contributed-section.ts +79 -60
- package/src/settings/css-vars-editor.ts +37 -16
- package/src/settings/defs-editor.ts +38 -35
- package/src/settings/extension-rows.ts +16 -8
- package/src/settings/extension-sections.ts +23 -13
- package/src/settings/extensions-section.ts +4 -1
- package/src/settings/general-settings.ts +11 -8
- package/src/settings/locales-section.ts +20 -12
- package/src/settings/preferences-dialog.ts +9 -6
- package/src/settings/preferences-keymap.ts +7 -5
- package/src/settings/preferences-sections.ts +11 -5
- package/src/settings/project-sections.ts +1 -1
- package/src/settings/schema-field-ui.ts +9 -0
- package/src/settings/settings-document.ts +5 -5
- package/src/shell/tree.ts +6 -5
- package/src/shell.ts +104 -81
- package/src/site-context.ts +37 -22
- package/src/state.ts +41 -49
- package/src/store.ts +54 -34
- package/src/studio.ts +39 -77
- package/src/style/live-preview.ts +1 -1
- package/src/style/project-styles.ts +6 -7
- package/src/style/token-ref.ts +5 -4
- package/src/surfaces/about.ts +18 -19
- package/src/surfaces/add-repo.ts +17 -19
- package/src/surfaces/ai-chat.ts +31 -36
- package/src/surfaces/ai-credentials-form.ts +6 -16
- package/src/surfaces/ai-managed-connect.ts +3 -4
- package/src/surfaces/ai-model-picker.ts +3 -5
- package/src/surfaces/block-action-bar.ts +22 -11
- package/src/surfaces/boot-failure.ts +4 -5
- package/src/surfaces/bottom-dock.ts +9 -18
- package/src/surfaces/canvas-stage.ts +12 -11
- package/src/surfaces/cf-account-picker.ts +17 -18
- package/src/surfaces/commandbar.ts +14 -9
- package/src/surfaces/convert-repeater.ts +17 -19
- package/src/surfaces/data-actions.ts +9 -7
- package/src/surfaces/dialog.ts +26 -28
- package/src/surfaces/diff-toolbar.ts +9 -7
- package/src/surfaces/doc-header.ts +10 -19
- package/src/surfaces/empty-state.ts +7 -10
- package/src/surfaces/entry-editor.ts +14 -11
- package/src/surfaces/expression-editor.ts +11 -25
- package/src/surfaces/files-panel.ts +27 -14
- package/src/surfaces/formula-palette.ts +4 -5
- package/src/surfaces/git-panel.ts +7 -15
- package/src/surfaces/github-auth.ts +16 -20
- package/src/surfaces/github-publish.ts +17 -22
- package/src/surfaces/grid-cell.ts +30 -31
- package/src/surfaces/grid-open.ts +10 -14
- package/src/surfaces/grid-panel.ts +13 -9
- package/src/surfaces/grid-replace.ts +13 -13
- package/src/surfaces/grid-views.ts +15 -18
- package/src/surfaces/inspector-dock.ts +13 -12
- package/src/surfaces/jump-bar.ts +5 -6
- package/src/surfaces/jxsuite-update.ts +16 -22
- package/src/surfaces/library-pane.ts +25 -20
- package/src/surfaces/logic-panel.ts +17 -30
- package/src/surfaces/logic-workspace.ts +13 -15
- package/src/surfaces/media-browser.ts +11 -10
- package/src/surfaces/media-field.ts +4 -5
- package/src/surfaces/media-pane.ts +8 -7
- package/src/surfaces/menu.ts +29 -23
- package/src/surfaces/navigator-dock.ts +11 -12
- package/src/surfaces/new-project.ts +27 -26
- package/src/surfaces/pane-context.ts +20 -25
- package/src/surfaces/pane-grid.ts +15 -10
- package/src/surfaces/panel-activity.ts +5 -6
- package/src/surfaces/panel-data.ts +3 -4
- package/src/surfaces/panel-deploy-checklist.ts +5 -6
- package/src/surfaces/panel-elements.ts +5 -7
- package/src/surfaces/panel-i18n.ts +5 -7
- package/src/surfaces/panel-imports.ts +6 -13
- package/src/surfaces/panel-outline.ts +25 -19
- package/src/surfaces/panel-page.ts +11 -18
- package/src/surfaces/panel-problems.ts +5 -7
- package/src/surfaces/panel-signals.ts +20 -34
- package/src/surfaces/panel-stylebook-layers.ts +5 -8
- package/src/surfaces/preferences.ts +21 -11
- package/src/surfaces/progress-modal.ts +15 -9
- package/src/surfaces/properties-panel.json +1 -1
- package/src/surfaces/properties-panel.ts +20 -42
- package/src/surfaces/publish.ts +18 -18
- package/src/surfaces/push-plan.ts +7 -8
- package/src/surfaces/rail.json +126 -73
- package/src/surfaces/rail.ts +38 -12
- package/src/surfaces/reference-field.ts +11 -15
- package/src/surfaces/schema-builder.ts +16 -22
- package/src/surfaces/schema-form.ts +15 -25
- package/src/surfaces/secret-field.ts +9 -6
- package/src/surfaces/seo.ts +21 -15
- package/src/surfaces/settings-contexts.ts +9 -7
- package/src/surfaces/settings-contributed.ts +14 -10
- package/src/surfaces/settings-css-vars.ts +5 -12
- package/src/surfaces/settings-defs.json +2 -2
- package/src/surfaces/settings-defs.ts +17 -21
- package/src/surfaces/settings-deploy.ts +8 -15
- package/src/surfaces/settings-extensions.ts +5 -6
- package/src/surfaces/settings-head.ts +33 -39
- package/src/surfaces/settings-locales.ts +8 -20
- package/src/surfaces/settings-overview.ts +5 -6
- package/src/surfaces/settings-packages.ts +8 -7
- package/src/surfaces/settings-pane.ts +9 -18
- package/src/surfaces/settings-rawjson.ts +5 -6
- package/src/surfaces/shell.ts +1 -2
- package/src/surfaces/slash-menu.ts +19 -9
- package/src/surfaces/statements.ts +13 -18
- package/src/surfaces/statusbar.ts +17 -14
- package/src/surfaces/style-panel.ts +18 -31
- package/src/surfaces/stylebook-chrome.ts +3 -5
- package/src/surfaces/tab-strip.ts +14 -13
- package/src/surfaces/target-line.ts +6 -7
- package/src/surfaces/welcome.ts +5 -7
- package/src/tabs/patch-ops.ts +4 -3
- package/src/tabs/project-config.ts +32 -21
- package/src/tabs/selection.ts +36 -8
- package/src/tabs/tab.ts +52 -41
- package/src/tabs/transact.ts +98 -53
- package/src/tabs/typing.ts +31 -0
- package/src/types.ts +32 -17
- package/src/ui/ai-credentials-form.ts +10 -13
- package/src/ui/ai-model-picker.ts +3 -3
- package/src/ui/cf-account-picker.ts +7 -9
- package/src/ui/color-selector.ts +9 -5
- package/src/ui/dynamic-slot.ts +7 -8
- package/src/ui/expression-editor.ts +112 -105
- package/src/ui/form-controls.ts +57 -48
- package/src/ui/formula-catalog.ts +239 -230
- package/src/ui/formula-chips.ts +33 -18
- package/src/ui/layers.ts +44 -31
- package/src/ui/media-picker.ts +18 -9
- package/src/ui/popover-surface.ts +20 -12
- package/src/ui/progress-modal.ts +13 -8
- package/src/ui/regions.ts +7 -6
- package/src/ui/schema-form.ts +113 -70
- package/src/ui/surface.ts +71 -8
- package/src/ui/timing.ts +9 -0
- package/src/ui/value-source.ts +44 -31
- package/src/ui/virtual-window.ts +3 -2
- package/src/utils/base64.ts +3 -1
- package/src/utils/edit-display.ts +103 -74
- package/src/utils/element-selectors.ts +3 -2
- package/src/utils/google-fonts.ts +15 -14
- package/src/utils/inherited-style.ts +18 -20
- package/src/utils/link-target.ts +1 -1
- package/src/utils/preview-format.ts +25 -3
- package/src/utils/strip-events.ts +49 -22
- package/src/utils/studio-utils.ts +29 -14
- package/src/view.ts +2 -3
- package/src/workspace/pane-derive.ts +10 -12
- package/src/workspace/session.ts +53 -43
- package/src/workspace/workspace.ts +47 -36
- package/dist/chunks/2020-nkxms0ay.js +0 -4
- package/dist/chunks/adapter-m948ab5f.js +0 -4
- package/dist/chunks/cf-account-picker-n8hr38v7.js +0 -4
- package/dist/chunks/cf-settings-356xdtne.js +0 -4
- package/dist/chunks/color-area-jqhna8zy.js +0 -4
- package/dist/chunks/color-field-embq5ctg.js +0 -4
- package/dist/chunks/color-fpezvnkt.js +0 -4
- package/dist/chunks/color-slider-1qmw7wqy.js +0 -4
- package/dist/chunks/combobox-773hdzyj.js +0 -4
- package/dist/chunks/components-yk3t844e.js +0 -4
- package/dist/chunks/content-source-bawmyc09.js +0 -4
- package/dist/chunks/convert-to-repeater-7wns8kf1.js +0 -4
- package/dist/chunks/dialog-mtm9fq5t.js +0 -4
- package/dist/chunks/editor-6sc8nacq.js +0 -4
- package/dist/chunks/entry-commands-8ay9fh81.js +0 -4
- package/dist/chunks/extension-sections-na7rj3nr.js +0 -4
- package/dist/chunks/file-ops-gye0qw56.js +0 -4
- package/dist/chunks/files-dmc2xvcq.js +0 -4
- package/dist/chunks/format-host-t76b53f8.js +0 -4
- package/dist/chunks/fs-events-cg4tpz06.js +0 -4
- package/dist/chunks/git-panel-yef7bshy.js +0 -4
- package/dist/chunks/grid-view-7tt4bxw1.js +0 -51
- package/dist/chunks/icons-qbh8akb1.js +0 -4
- package/dist/chunks/iframe-entry-f7mqjwpm.js +0 -5
- package/dist/chunks/iframe-entry-haw7jkvz.js +0 -5
- package/dist/chunks/iframe-entry-z6qrytv3.js +0 -5
- package/dist/chunks/iframe-host-tmz30gfp.js +0 -4
- package/dist/chunks/index-nag78a9h.js +0 -4
- package/dist/chunks/jsonMode-zhwsprqk.js +0 -13
- package/dist/chunks/jx-validate-3gbp5nkn.js +0 -4
- package/dist/chunks/layers-fvz99859.js +0 -4
- package/dist/chunks/layers-panel-gchmbf9p.js +0 -4
- package/dist/chunks/listbox-s8fkmnq8.js +0 -4
- package/dist/chunks/lit-html-9agdspkt.js +0 -4
- package/dist/chunks/media-picker-rhjvyy00.js +0 -4
- package/dist/chunks/menu-2e4y9j7b.js +0 -4
- package/dist/chunks/menu-37d07z9m.js +0 -4
- package/dist/chunks/monaco-binding-2jnhjjvr.js +0 -4
- package/dist/chunks/monaco-buffer-rp21359g.js +0 -4
- package/dist/chunks/monaco-setup-vhh7gayr.js +0 -4
- package/dist/chunks/notify-h3www560.js +0 -4
- package/dist/chunks/number-field-gw7sq8rn.js +0 -4
- package/dist/chunks/parse-897fvqah.js +0 -4
- package/dist/chunks/platform-hz34wcd7.js +0 -4
- package/dist/chunks/popover-8htra4er.js +0 -4
- package/dist/chunks/publish-panel-exsmjzyj.js +0 -4
- package/dist/chunks/quick-search-pgaqeh0m.js +0 -4
- package/dist/chunks/references-2cgdxnb8.js +0 -4
- package/dist/chunks/right-panel-jf856w5w.js +0 -4
- package/dist/chunks/section-registry-jnf8r5gy.js +0 -4
- package/dist/chunks/select-n3v7gwas.js +0 -4
- package/dist/chunks/split-pff8f3ze.js +0 -4
- package/dist/chunks/studio-0f55h9ye.js +0 -5
- package/dist/chunks/studio-0sqdhnew.js +0 -12
- package/dist/chunks/studio-19x1c75w.js +0 -5
- package/dist/chunks/studio-2sqcndak.js +0 -5
- package/dist/chunks/studio-3aey7dd3.js +0 -5
- package/dist/chunks/studio-3bpdkq2s.js +0 -5
- package/dist/chunks/studio-47y6fbpf.js +0 -5
- package/dist/chunks/studio-4m3826v2.js +0 -5
- package/dist/chunks/studio-4nx2dj1g.js +0 -4
- package/dist/chunks/studio-4xv5s47r.js +0 -9
- package/dist/chunks/studio-5g4t8v6w.js +0 -5
- package/dist/chunks/studio-5py436sf.js +0 -5
- package/dist/chunks/studio-77kt594t.js +0 -5
- package/dist/chunks/studio-8f87n763.js +0 -10
- package/dist/chunks/studio-8mb00b84.js +0 -5
- package/dist/chunks/studio-8p51gq2h.js +0 -6
- package/dist/chunks/studio-954ds834.js +0 -5
- package/dist/chunks/studio-9ft45c83.js +0 -9
- package/dist/chunks/studio-a2138x5k.js +0 -7
- package/dist/chunks/studio-a9yzstqj.js +0 -5
- package/dist/chunks/studio-acdksxx6.js +0 -5
- package/dist/chunks/studio-ar8jcf2y.js +0 -5
- package/dist/chunks/studio-bmn4mn9j.js +0 -7
- package/dist/chunks/studio-e7xxa0sj.js +0 -5
- package/dist/chunks/studio-ecaz25vk.js +0 -5
- package/dist/chunks/studio-ery42sqr.js +0 -4
- package/dist/chunks/studio-fzdywr6p.js +0 -9
- package/dist/chunks/studio-g5fmf0c1.js +0 -5
- package/dist/chunks/studio-g7nse7zb.js +0 -5
- package/dist/chunks/studio-geq1ea6k.js +0 -14
- package/dist/chunks/studio-ghkb32r8.js +0 -5
- package/dist/chunks/studio-ghrhy2y7.js +0 -5
- package/dist/chunks/studio-grawhey1.js +0 -5
- package/dist/chunks/studio-h0xgswew.js +0 -5
- package/dist/chunks/studio-h9c4p2tx.js +0 -5
- package/dist/chunks/studio-jyzj5cxs.js +0 -5
- package/dist/chunks/studio-mgx8yhnz.js +0 -64
- package/dist/chunks/studio-mpb04y1d.js +0 -6
- package/dist/chunks/studio-n17mty64.js +0 -5
- package/dist/chunks/studio-nwh2eqsk.js +0 -6
- package/dist/chunks/studio-q1h883bt.js +0 -16
- package/dist/chunks/studio-q4tv82h7.js +0 -9
- package/dist/chunks/studio-qpqa7vk3.js +0 -5
- package/dist/chunks/studio-qqz8e5gk.js +0 -5
- package/dist/chunks/studio-qvasen3f.js +0 -5
- package/dist/chunks/studio-rggdb3hm.js +0 -5
- package/dist/chunks/studio-sghy936h.js +0 -4
- package/dist/chunks/studio-skprc6ef.js +0 -5
- package/dist/chunks/studio-tt2nactf.js +0 -5
- package/dist/chunks/studio-tyasmc39.js +0 -5
- package/dist/chunks/studio-vk9ezads.js +0 -5
- package/dist/chunks/studio-vzacdfsc.js +0 -4
- package/dist/chunks/studio-w4c0xmrw.js +0 -5
- package/dist/chunks/studio-wfjqhhbk.js +0 -5
- package/dist/chunks/studio-wgh5kxpj.js +0 -5
- package/dist/chunks/studio-xasj0796.js +0 -5
- package/dist/chunks/studio-y78s8r2n.js +0 -5
- package/dist/chunks/studio-z8w183sh.js +0 -5
- package/dist/chunks/studio-zscd9ty4.js +0 -928
- package/dist/chunks/studio-zxp13sss.js +0 -7
- package/dist/chunks/studio-zygnmm01.js +0 -5
- package/dist/chunks/swatch-group-8qh9a3bm.js +0 -4
- package/dist/chunks/tabs-jwthg40w.js +0 -4
- package/dist/chunks/textfield-spy3hc77.js +0 -4
- package/dist/chunks/toast-4d35zd64.js +0 -4
- package/dist/chunks/toast-host-8sjmfed3.js +0 -4
- package/dist/chunks/tooltip-fd6g9xy3.js +0 -4
- package/dist/chunks/tree-h19v1jfz.js +0 -4
- package/dist/chunks/tsMode-gr0m4dzr.js +0 -14
- package/dist/chunks/workspace-m15qtcqp.js +0 -4
- package/dist/chunks/ws-client-nf61frr1.js +0 -4
|
@@ -1,16 +1,88 @@
|
|
|
1
1
|
/** Style utilities — pure CSS helper functions used by the style panel. */
|
|
2
2
|
|
|
3
|
-
import
|
|
3
|
+
import { isNumber, isString } from "@jxsuite/schema/guards";
|
|
4
|
+
import type { JxMutableNode, JxStyle } from "@jxsuite/schema/types";
|
|
4
5
|
|
|
5
6
|
import { activeTab } from "../workspace/workspace";
|
|
6
7
|
import { getEffectiveStyle } from "../site-context";
|
|
7
8
|
import cssMeta from "../../data/css-meta.json";
|
|
8
9
|
|
|
10
|
+
/** One `$show` condition: the row is offered while `prop` holds one of `values`, or any value. */
|
|
11
|
+
export interface CssShowCondition {
|
|
12
|
+
prop: string;
|
|
13
|
+
values: string[];
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/** One Modern Font Stacks preset a `fontFamily` entry offers. */
|
|
17
|
+
export interface CssFontPreset {
|
|
18
|
+
title: string;
|
|
19
|
+
value: string;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/** Every kind of value a css-meta entry holds under any of its keys. */
|
|
23
|
+
type CssMetaValue =
|
|
24
|
+
| string
|
|
25
|
+
| number
|
|
26
|
+
| boolean
|
|
27
|
+
| string[]
|
|
28
|
+
| CssShowCondition[]
|
|
29
|
+
| CssFontPreset[]
|
|
30
|
+
| Record<string, string>;
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* What `css-meta.json` says about one CSS property: which section files it, where in that section,
|
|
34
|
+
* and which control edits it. Every entry in the file carries `$order`; the rest is per property.
|
|
35
|
+
*
|
|
36
|
+
* The index signature is what keeps an entry assignable to the open records `inferInputType()` and
|
|
37
|
+
* `propLabel()` read it through; it admits only the value kinds the file actually holds.
|
|
38
|
+
*/
|
|
39
|
+
export interface CssMetaEntry {
|
|
40
|
+
$order: number;
|
|
41
|
+
$section?: string;
|
|
42
|
+
$label?: string;
|
|
43
|
+
$input?: string;
|
|
44
|
+
$buttonValues?: string[];
|
|
45
|
+
$icons?: Record<string, string>;
|
|
46
|
+
$keywords?: string[];
|
|
47
|
+
$longhands?: string[];
|
|
48
|
+
/** `true` on a shorthand row; the shorthand's own name on each of its longhands. */
|
|
49
|
+
$shorthand?: string | boolean;
|
|
50
|
+
$shorthandType?: string;
|
|
51
|
+
$show?: CssShowCondition[];
|
|
52
|
+
$span?: number;
|
|
53
|
+
$units?: string[];
|
|
54
|
+
enum?: string[];
|
|
55
|
+
examples?: string[];
|
|
56
|
+
presets?: CssFontPreset[];
|
|
57
|
+
format?: string;
|
|
58
|
+
type?: string;
|
|
59
|
+
minimum?: number;
|
|
60
|
+
maximum?: number;
|
|
61
|
+
[key: string]: CssMetaValue | undefined;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/** A shorthand's longhand, with its own css-meta entry. */
|
|
65
|
+
export interface CssLonghand {
|
|
66
|
+
name: string;
|
|
67
|
+
entry: CssMetaEntry;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Css-meta's property table, by property name. The JSON module's inferred type is checked against
|
|
72
|
+
* {@link CssMetaEntry} here, once, so a key the file stops carrying is a type error at this line.
|
|
73
|
+
*/
|
|
74
|
+
export const cssDefs: Readonly<Record<string, CssMetaEntry>> = cssMeta.$defs;
|
|
75
|
+
|
|
9
76
|
let cssInitialMap = new Map<string, string>();
|
|
10
77
|
|
|
11
78
|
/** Initialise cssInitialMap from webdata — call once during bootstrap. */
|
|
12
79
|
export function initCssData(webdata: { cssProps: string[][] }) {
|
|
13
|
-
cssInitialMap = new Map
|
|
80
|
+
cssInitialMap = new Map<string, string>();
|
|
81
|
+
for (const [name, initial] of webdata.cssProps) {
|
|
82
|
+
if (name !== undefined && initial !== undefined) {
|
|
83
|
+
cssInitialMap.set(name, initial);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
14
86
|
}
|
|
15
87
|
|
|
16
88
|
/** Get the CSS initial-value map (populated by initCssData). */
|
|
@@ -18,31 +90,30 @@ export function getCssInitialMap() {
|
|
|
18
90
|
return cssInitialMap;
|
|
19
91
|
}
|
|
20
92
|
|
|
93
|
+
/**
|
|
94
|
+
* A declaration's value rather than a nested block (`:hover`, `@--md`) or a block list.
|
|
95
|
+
*
|
|
96
|
+
* Exactly the `typeof value !== "object"` test the Style tab has always made, so a `null` a JSON
|
|
97
|
+
* document might hold still counts as a block, never as a value.
|
|
98
|
+
*/
|
|
99
|
+
export function isDeclarationValue(value: JxStyle[string]): value is string | number | undefined {
|
|
100
|
+
return typeof value !== "object";
|
|
101
|
+
}
|
|
102
|
+
|
|
21
103
|
// ─── Condition helpers ──────────────────────────────────────────────────────
|
|
22
104
|
|
|
23
|
-
/**
|
|
24
|
-
export function conditionPasses(
|
|
25
|
-
|
|
26
|
-
styles: Record<string, unknown>,
|
|
27
|
-
) {
|
|
28
|
-
const val = (styles[cond.prop] ?? "") as string;
|
|
105
|
+
/** Whether one `$show` condition holds against the style being edited. */
|
|
106
|
+
export function conditionPasses(cond: CssShowCondition, styles: JxStyle) {
|
|
107
|
+
const val = styles[cond.prop] ?? "";
|
|
29
108
|
if (cond.values.length === 0) {
|
|
30
109
|
return val !== "" && val !== "initial";
|
|
31
110
|
}
|
|
32
|
-
return cond.values.includes(val);
|
|
111
|
+
return isString(val) && cond.values.includes(val);
|
|
33
112
|
}
|
|
34
113
|
|
|
35
|
-
/**
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
*/
|
|
39
|
-
export function allConditionsPass(
|
|
40
|
-
entry: { $show?: { prop: string; values: string[] }[] },
|
|
41
|
-
styles: Record<string, unknown>,
|
|
42
|
-
) {
|
|
43
|
-
return (entry.$show ?? []).every((/** @type {{ prop: string; values: string[] }} */ c) =>
|
|
44
|
-
conditionPasses(c, styles),
|
|
45
|
-
);
|
|
114
|
+
/** Whether every `$show` condition of an entry holds; an entry with none always passes. */
|
|
115
|
+
export function allConditionsPass(entry: Pick<CssMetaEntry, "$show">, styles: JxStyle) {
|
|
116
|
+
return (entry.$show ?? []).every((c) => conditionPasses(c, styles));
|
|
46
117
|
}
|
|
47
118
|
|
|
48
119
|
// ─── Auto-open sections ─────────────────────────────────────────────────────
|
|
@@ -64,11 +135,10 @@ export function autoOpenSections(node: JxMutableNode, currentSections: Record<st
|
|
|
64
135
|
const style = node.style || {};
|
|
65
136
|
const result = { ...currentSections };
|
|
66
137
|
for (const prop of Object.keys(style)) {
|
|
67
|
-
if (
|
|
138
|
+
if (!isDeclarationValue(style[prop])) {
|
|
68
139
|
continue;
|
|
69
140
|
}
|
|
70
|
-
const
|
|
71
|
-
const section = (entry?.$section as string) ?? "other";
|
|
141
|
+
const section = cssDefs[prop]?.$section ?? "other";
|
|
72
142
|
if (result[section] === undefined) {
|
|
73
143
|
result[section] = true;
|
|
74
144
|
}
|
|
@@ -78,31 +148,21 @@ export function autoOpenSections(node: JxMutableNode, currentSections: Record<st
|
|
|
78
148
|
|
|
79
149
|
// ─── Shorthand expand/compress ──────────────────────────────────────────────
|
|
80
150
|
|
|
81
|
-
/** Get longhands for a shorthand property from css-meta */
|
|
82
|
-
export function getLonghands(shorthandProp: string) {
|
|
83
|
-
const
|
|
84
|
-
if (
|
|
85
|
-
return
|
|
86
|
-
.map((name
|
|
87
|
-
|
|
88
|
-
$order: 0,
|
|
89
|
-
},
|
|
90
|
-
name,
|
|
91
|
-
}))
|
|
92
|
-
.toSorted(
|
|
93
|
-
(
|
|
94
|
-
/** @type {{ entry: Record<string, unknown> }} */ a,
|
|
95
|
-
/** @type {{ entry: Record<string, unknown> }} */ b,
|
|
96
|
-
) => (a.entry.$order as number) - (b.entry.$order as number),
|
|
97
|
-
);
|
|
151
|
+
/** Get longhands for a shorthand property from css-meta, in their `$order`. */
|
|
152
|
+
export function getLonghands(shorthandProp: string): CssLonghand[] {
|
|
153
|
+
const listed = cssDefs[shorthandProp]?.$longhands;
|
|
154
|
+
if (listed) {
|
|
155
|
+
return listed
|
|
156
|
+
.map((name) => ({ entry: cssDefs[name] || { $order: 0 }, name }))
|
|
157
|
+
.toSorted((a, b) => a.entry.$order - b.entry.$order);
|
|
98
158
|
}
|
|
99
|
-
const result = [];
|
|
100
|
-
for (const [name, e] of Object.entries(
|
|
159
|
+
const result: CssLonghand[] = [];
|
|
160
|
+
for (const [name, e] of Object.entries(cssDefs)) {
|
|
101
161
|
if (e.$shorthand === shorthandProp) {
|
|
102
162
|
result.push({ entry: e, name });
|
|
103
163
|
}
|
|
104
164
|
}
|
|
105
|
-
result.sort((a, b) =>
|
|
165
|
+
result.sort((a, b) => a.entry.$order - b.entry.$order);
|
|
106
166
|
return result;
|
|
107
167
|
}
|
|
108
168
|
|
|
@@ -232,7 +292,7 @@ export function getFontVars() {
|
|
|
232
292
|
const style = getEffectiveStyle(activeTab.value?.doc.document?.style);
|
|
233
293
|
const vars = [];
|
|
234
294
|
for (const [k, v] of Object.entries(style)) {
|
|
235
|
-
if (k.startsWith("--font") && (
|
|
295
|
+
if (k.startsWith("--font") && (isString(v) || isNumber(v))) {
|
|
236
296
|
vars.push({ name: k, value: String(v) });
|
|
237
297
|
}
|
|
238
298
|
}
|
|
@@ -247,12 +307,15 @@ export function getFontVars() {
|
|
|
247
307
|
* `face`, which is the channel every one of these rows ALSO carries, so a weight is shown in the
|
|
248
308
|
* element's own typeface rather than in the panel's.
|
|
249
309
|
*/
|
|
250
|
-
export const TYPO_PREVIEW_CHANNELS
|
|
251
|
-
fontStyle
|
|
252
|
-
fontVariant
|
|
253
|
-
fontWeight
|
|
254
|
-
textDecoration
|
|
255
|
-
textTransform
|
|
256
|
-
|
|
310
|
+
export const TYPO_PREVIEW_CHANNELS = new Map<string, TypoPreviewChannel>([
|
|
311
|
+
["fontStyle", "slant"],
|
|
312
|
+
["fontVariant", "variant"],
|
|
313
|
+
["fontWeight", "weight"],
|
|
314
|
+
["textDecoration", "decoration"],
|
|
315
|
+
["textTransform", "transform"],
|
|
316
|
+
]);
|
|
317
|
+
|
|
318
|
+
/** A `jx-option` drawing channel a typography row previews its value through (ui.md §5.3). */
|
|
319
|
+
export type TypoPreviewChannel = "decoration" | "slant" | "transform" | "variant" | "weight";
|
|
257
320
|
|
|
258
321
|
export { default as cssMeta } from "../../data/css-meta.json";
|
|
@@ -21,6 +21,7 @@ import { isKeyframesAtRule } from "@jxsuite/runtime/css";
|
|
|
21
21
|
import type { StylebookEntry } from "./stylebook-panel";
|
|
22
22
|
import type { ComponentEntry } from "../files/components";
|
|
23
23
|
import type { JxPath } from "../state";
|
|
24
|
+
import { isNonNullObject } from "@jxsuite/schema/guards";
|
|
24
25
|
import type { JxMutableNode, JxStyle } from "@jxsuite/schema/types";
|
|
25
26
|
|
|
26
27
|
export interface StylebookDocResult {
|
|
@@ -44,8 +45,9 @@ function isTagPath(key: string): boolean {
|
|
|
44
45
|
);
|
|
45
46
|
}
|
|
46
47
|
|
|
47
|
-
|
|
48
|
-
|
|
48
|
+
/** A nested style block (a rule or an at-rule body), as opposed to a scalar or a block list. */
|
|
49
|
+
function isStyleBlock(value: JxStyle[string]): value is JxStyle {
|
|
50
|
+
return isNonNullObject(value) && !Array.isArray(value);
|
|
49
51
|
}
|
|
50
52
|
|
|
51
53
|
/** The specimen-scoping selector prefix (see the module doc). */
|
|
@@ -58,12 +60,11 @@ const SPECIMEN_SCOPE = "& .element-card-preview";
|
|
|
58
60
|
* `styleUpdate` fast path so an edit round-trips through the exact same transform.
|
|
59
61
|
*/
|
|
60
62
|
export function transposeStylebookStyle(effectiveStyle: JxStyle): JxStyle {
|
|
61
|
-
const
|
|
62
|
-
const out: Record<string, unknown> = {};
|
|
63
|
+
const out: JxStyle = {};
|
|
63
64
|
|
|
64
65
|
/** Drop the base-width marker, which is not a query and would resolve to `@media --`. */
|
|
65
|
-
const withoutBaseWidth = (rule:
|
|
66
|
-
const cleaned:
|
|
66
|
+
const withoutBaseWidth = (rule: JxStyle): JxStyle => {
|
|
67
|
+
const cleaned: JxStyle = {};
|
|
67
68
|
for (const [k, v] of Object.entries(rule)) {
|
|
68
69
|
if (k !== "@--") {
|
|
69
70
|
cleaned[k] = v;
|
|
@@ -72,8 +73,8 @@ export function transposeStylebookStyle(effectiveStyle: JxStyle): JxStyle {
|
|
|
72
73
|
return cleaned;
|
|
73
74
|
};
|
|
74
75
|
|
|
75
|
-
for (const [k, v] of Object.entries(
|
|
76
|
-
if (!
|
|
76
|
+
for (const [k, v] of Object.entries(effectiveStyle)) {
|
|
77
|
+
if (!isStyleBlock(v)) {
|
|
77
78
|
out[k] = v; // Flat scalars + -- custom props.
|
|
78
79
|
continue;
|
|
79
80
|
}
|
|
@@ -89,9 +90,9 @@ export function transposeStylebookStyle(effectiveStyle: JxStyle): JxStyle {
|
|
|
89
90
|
}
|
|
90
91
|
if (k.startsWith("@")) {
|
|
91
92
|
// Media block: re-key tag rules inside; non-tag keys (scalars/pseudo) apply to the root.
|
|
92
|
-
const bucket:
|
|
93
|
+
const bucket: JxStyle = {};
|
|
93
94
|
for (const [mk, mv] of Object.entries(v)) {
|
|
94
|
-
if (
|
|
95
|
+
if (isStyleBlock(mv) && isTagPath(mk)) {
|
|
95
96
|
bucket[`${SPECIMEN_SCOPE} ${mk}`] = withoutBaseWidth(mv);
|
|
96
97
|
} else {
|
|
97
98
|
bucket[mk] = mv;
|
|
@@ -107,34 +108,30 @@ export function transposeStylebookStyle(effectiveStyle: JxStyle): JxStyle {
|
|
|
107
108
|
out[k] = v;
|
|
108
109
|
}
|
|
109
110
|
|
|
110
|
-
return out
|
|
111
|
+
return out;
|
|
111
112
|
}
|
|
112
113
|
|
|
113
114
|
/** Resolve a nested tag path ("table th") in a style object; null when absent. */
|
|
114
|
-
function resolveNestedStyle(
|
|
115
|
-
style: Record<string, unknown>,
|
|
116
|
-
tagPath: string,
|
|
117
|
-
): Record<string, unknown> | null {
|
|
115
|
+
function resolveNestedStyle(style: JxStyle, tagPath: string): JxStyle | null {
|
|
118
116
|
const parts = tagPath.split(" ");
|
|
119
|
-
let obj:
|
|
117
|
+
let obj: JxStyle[string] = style;
|
|
120
118
|
for (const part of parts) {
|
|
121
|
-
if (!
|
|
119
|
+
if (!isStyleBlock(obj)) {
|
|
122
120
|
return null;
|
|
123
121
|
}
|
|
124
122
|
obj = obj[part];
|
|
125
123
|
}
|
|
126
|
-
return
|
|
124
|
+
return isStyleBlock(obj) ? obj : null;
|
|
127
125
|
}
|
|
128
126
|
|
|
129
127
|
/** Whether the effective style customizes `tagPath` (directly or under any `@media` block). */
|
|
130
128
|
export function hasTagStyle(rootStyle: JxStyle, tagPath: string): boolean {
|
|
131
|
-
const
|
|
132
|
-
const direct = resolveNestedStyle(style, tagPath);
|
|
129
|
+
const direct = resolveNestedStyle(rootStyle, tagPath);
|
|
133
130
|
if (direct && Object.keys(direct).length > 0) {
|
|
134
131
|
return true;
|
|
135
132
|
}
|
|
136
|
-
for (const [key, val] of Object.entries(
|
|
137
|
-
if (!key.startsWith("@") || !
|
|
133
|
+
for (const [key, val] of Object.entries(rootStyle)) {
|
|
134
|
+
if (!key.startsWith("@") || !isStyleBlock(val)) {
|
|
138
135
|
continue;
|
|
139
136
|
}
|
|
140
137
|
const nested = resolveNestedStyle(val, tagPath);
|
|
@@ -179,16 +176,21 @@ export function buildStylebookDoc(opts: BuildStylebookDocOpts): StylebookDocResu
|
|
|
179
176
|
};
|
|
180
177
|
|
|
181
178
|
const specimenNode = (entry: StylebookEntry): JxMutableNode => {
|
|
182
|
-
const attributes
|
|
179
|
+
const attributes = { ...entry.attributes };
|
|
183
180
|
if (entry.style) {
|
|
184
181
|
attributes.style = entry.style; // Inline CSS text — legacy `el.style.cssText` parity.
|
|
185
182
|
}
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
183
|
+
const node: JxMutableNode = { tagName: entry.tag };
|
|
184
|
+
if (entry.text) {
|
|
185
|
+
node.textContent = entry.text;
|
|
186
|
+
}
|
|
187
|
+
if (Object.keys(attributes).length > 0) {
|
|
188
|
+
node.attributes = attributes;
|
|
189
|
+
}
|
|
190
|
+
if (entry.children) {
|
|
191
|
+
node.children = entry.children.map(specimenNode);
|
|
192
|
+
}
|
|
193
|
+
return node;
|
|
192
194
|
};
|
|
193
195
|
|
|
194
196
|
/** A card wrapping one specimen; registers card/preview/specimen paths under `tag`. */
|
|
@@ -217,19 +219,18 @@ export function buildStylebookDoc(opts: BuildStylebookDocOpts): StylebookDocResu
|
|
|
217
219
|
{ attributes: { class: "element-card-label" }, tagName: "div", textContent: label },
|
|
218
220
|
],
|
|
219
221
|
tagName: "div",
|
|
220
|
-
}
|
|
222
|
+
};
|
|
221
223
|
};
|
|
222
224
|
|
|
223
225
|
const sections: JxMutableNode[] = [];
|
|
224
|
-
const sectionNode = (label: string, cards: JxMutableNode[]): JxMutableNode =>
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
}) as JxMutableNode;
|
|
226
|
+
const sectionNode = (label: string, cards: JxMutableNode[]): JxMutableNode => ({
|
|
227
|
+
attributes: { class: "sb-section" },
|
|
228
|
+
children: [
|
|
229
|
+
{ attributes: { class: "sb-label" }, tagName: "div", textContent: label },
|
|
230
|
+
{ attributes: { class: "sb-body" }, children: cards, tagName: "div" },
|
|
231
|
+
],
|
|
232
|
+
tagName: "div",
|
|
233
|
+
});
|
|
233
234
|
|
|
234
235
|
// Paths below mirror the assembled tree: root.children[si] = section; section.children[1] =
|
|
235
236
|
// Sb-body; body.children[ci] = card. Sections are appended only when non-empty, so indices are
|
|
@@ -293,18 +294,18 @@ export function buildStylebookDoc(opts: BuildStylebookDocOpts): StylebookDocResu
|
|
|
293
294
|
attributes[p.name] = String(p.default).replaceAll(/^'|'$/g, "");
|
|
294
295
|
}
|
|
295
296
|
}
|
|
296
|
-
const specimen = {
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
}
|
|
297
|
+
const specimen: JxMutableNode = { tagName: comp.tagName };
|
|
298
|
+
if (Object.keys(attributes).length > 0) {
|
|
299
|
+
specimen.attributes = attributes;
|
|
300
|
+
}
|
|
300
301
|
return cardNode(comp.tagName, `<${comp.tagName}>`, specimen, cardPath, null);
|
|
301
302
|
}
|
|
302
303
|
// Npm/format-class components can't be $ref-registered — placeholder box (legacy parity).
|
|
303
|
-
const fallback = {
|
|
304
|
+
const fallback: JxMutableNode = {
|
|
304
305
|
attributes: { class: "sb-fallback" },
|
|
305
306
|
tagName: "div",
|
|
306
307
|
textContent: `<${comp.tagName}>`,
|
|
307
|
-
}
|
|
308
|
+
};
|
|
308
309
|
return cardNode(comp.tagName, `<${comp.tagName}>`, fallback, cardPath, null);
|
|
309
310
|
});
|
|
310
311
|
sections.push(sectionNode("Components", cards));
|
|
@@ -316,17 +317,19 @@ export function buildStylebookDoc(opts: BuildStylebookDocOpts): StylebookDocResu
|
|
|
316
317
|
attributes: { class: "sb-empty" },
|
|
317
318
|
tagName: "div",
|
|
318
319
|
textContent: opts.customizedOnly ? "No customized elements" : "No matching elements",
|
|
319
|
-
}
|
|
320
|
+
});
|
|
320
321
|
}
|
|
321
322
|
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
323
|
+
// Assigned in this order so the posted document keeps its key order: `$elements` leads when present.
|
|
324
|
+
const doc: JxMutableNode = {};
|
|
325
|
+
if ($elements.length > 0) {
|
|
326
|
+
doc.$elements = $elements;
|
|
327
|
+
}
|
|
328
|
+
doc.$media = opts.effectiveMedia;
|
|
329
|
+
doc.attributes = { class: "sb-root" };
|
|
330
|
+
doc.children = sections;
|
|
331
|
+
doc.style = transposeStylebookStyle(opts.effectiveStyle);
|
|
332
|
+
doc.tagName = "div";
|
|
330
333
|
|
|
331
334
|
return { doc, pathToTag, tagToCardPath };
|
|
332
335
|
}
|
|
@@ -31,8 +31,8 @@ import type {
|
|
|
31
31
|
StylebookRowView,
|
|
32
32
|
StylebookVariableView,
|
|
33
33
|
} from "../surfaces/panel-stylebook-layers";
|
|
34
|
+
import { isNonNullObject } from "@jxsuite/schema/guards";
|
|
34
35
|
import type { JxStyle } from "@jxsuite/schema/types";
|
|
35
|
-
import type { ComponentEntry } from "../files/components.js";
|
|
36
36
|
|
|
37
37
|
/** What the panel is drawn from: the catalogue, and what selecting a row does. */
|
|
38
38
|
export interface StylebookLayersCtx {
|
|
@@ -40,9 +40,9 @@ export interface StylebookLayersCtx {
|
|
|
40
40
|
stylebookMeta: { $sections: { label: string; elements: StylebookEntry[] }[] };
|
|
41
41
|
}
|
|
42
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;
|
|
43
|
+
/** The row's own padding at depth 0, and what each level of nesting adds (the Outline's too). */
|
|
44
|
+
export const INDENT_BASE = 8;
|
|
45
|
+
export const INDENT_STEP = 16;
|
|
46
46
|
|
|
47
47
|
/**
|
|
48
48
|
* Whether the open file has already written a `& <tag>` block with something in it.
|
|
@@ -50,9 +50,9 @@ const INDENT_STEP = 16;
|
|
|
50
50
|
* @param {JxStyle} rootStyle
|
|
51
51
|
* @param {string} tag
|
|
52
52
|
*/
|
|
53
|
-
function hasTagStyle(rootStyle: JxStyle, tag: string) {
|
|
53
|
+
function hasTagStyle(rootStyle: JxStyle, tag: string): boolean {
|
|
54
54
|
const s = rootStyle[`& ${tag}`];
|
|
55
|
-
return
|
|
55
|
+
return isNonNullObject(s) && Object.keys(s).length > 0;
|
|
56
56
|
}
|
|
57
57
|
|
|
58
58
|
/**
|
|
@@ -121,7 +121,7 @@ function variableRows(rootStyle: JxStyle): StylebookVariableView[] {
|
|
|
121
121
|
*/
|
|
122
122
|
export function stylebookLayersValues(ctx: StylebookLayersCtx): StylebookLayersValues {
|
|
123
123
|
const tab = activeTab.value;
|
|
124
|
-
const rootStyle =
|
|
124
|
+
const rootStyle: JxStyle = tab?.doc.document?.style || {};
|
|
125
125
|
const { selection } = shell.stylebook;
|
|
126
126
|
const leaf = selectedLeaf(selection);
|
|
127
127
|
|
|
@@ -131,7 +131,7 @@ export function stylebookLayersValues(ctx: StylebookLayersCtx): StylebookLayersV
|
|
|
131
131
|
elementRows(entry, rootStyle, leaf, 0, "", rows);
|
|
132
132
|
}
|
|
133
133
|
}
|
|
134
|
-
for (const comp of componentRegistry
|
|
134
|
+
for (const comp of componentRegistry) {
|
|
135
135
|
rows.push({
|
|
136
136
|
customized: false,
|
|
137
137
|
indent: `${INDENT_BASE}px`,
|
|
@@ -174,7 +174,7 @@ function revealSelectedRow(host: HTMLElement): void {
|
|
|
174
174
|
queueMicrotask(() => {
|
|
175
175
|
host
|
|
176
176
|
.querySelector('[part="row"][aria-current="true"]')
|
|
177
|
-
?.scrollIntoView
|
|
177
|
+
?.scrollIntoView({ behavior: "smooth", block: "nearest" });
|
|
178
178
|
});
|
|
179
179
|
}
|
|
180
180
|
|
|
@@ -36,7 +36,8 @@ import { PROJECT_STYLES_TITLE } from "../style/project-styles";
|
|
|
36
36
|
import { mountStylebookCanvas, panToStylebookTag } from "../canvas/iframe-host";
|
|
37
37
|
import stylebookMeta from "../../data/stylebook-meta.json";
|
|
38
38
|
import type { CanvasPanelEntry } from "../canvas/canvas-utils";
|
|
39
|
-
import type { CanvasStageView } from "../surfaces/canvas-stage";
|
|
39
|
+
import type { CanvasStageHandle, CanvasStageView } from "../surfaces/canvas-stage";
|
|
40
|
+
import type { TabUi } from "../tabs/tab";
|
|
40
41
|
|
|
41
42
|
export interface StylebookEntry {
|
|
42
43
|
tag: string;
|
|
@@ -61,7 +62,7 @@ interface StylebookCtx {
|
|
|
61
62
|
surface: CanvasSurface,
|
|
62
63
|
view: CanvasStageView,
|
|
63
64
|
entries: CanvasPanelEntry[],
|
|
64
|
-
) => Promise<
|
|
65
|
+
) => Promise<CanvasStageHandle | null>;
|
|
65
66
|
/** A node the stage drew for a part — here, the empty box the chrome bar stands in. */
|
|
66
67
|
stageHost: (surface: CanvasSurface, part: string) => HTMLElement | null;
|
|
67
68
|
applyTransform: (surface: CanvasSurface) => void;
|
|
@@ -151,7 +152,7 @@ export async function renderStylebookMode(
|
|
|
151
152
|
so the field keeps its caret across the stage rebuild a keystroke in it causes. */
|
|
152
153
|
const chromeBarNode = chromeBar(surface);
|
|
153
154
|
|
|
154
|
-
|
|
155
|
+
canvasWrap.style.overflow = "hidden";
|
|
155
156
|
|
|
156
157
|
/** @type {{ name: string; displayName: string; width: number }[]} */
|
|
157
158
|
const allPanelDefs = [];
|
|
@@ -173,7 +174,7 @@ export async function renderStylebookMode(
|
|
|
173
174
|
/** @type {CanvasPanelEntry[]} */
|
|
174
175
|
let panelEntries;
|
|
175
176
|
if (!hasMedia) {
|
|
176
|
-
const hasBaseWidth = effectiveMedia
|
|
177
|
+
const hasBaseWidth = effectiveMedia["--"];
|
|
177
178
|
const label = hasBaseWidth ? `${mediaDisplayName("--")} (${baseWidth}px)` : null;
|
|
178
179
|
panelEntries = [
|
|
179
180
|
ctx.canvasPanelEntry(
|
|
@@ -224,22 +225,17 @@ export async function renderStylebookMode(
|
|
|
224
225
|
const generated = buildStylebookDoc({
|
|
225
226
|
components: componentRegistry,
|
|
226
227
|
customizedOnly: Boolean(customizedOnly),
|
|
227
|
-
effectiveMedia
|
|
228
|
+
effectiveMedia,
|
|
228
229
|
effectiveStyle: getEffectiveStyle(tab?.doc.document?.style),
|
|
229
230
|
filter,
|
|
230
|
-
meta: stylebookMeta
|
|
231
|
+
meta: stylebookMeta,
|
|
231
232
|
projectRoot: projectState?.projectRoot ?? null,
|
|
232
233
|
});
|
|
233
234
|
|
|
234
235
|
const { panels } = surface;
|
|
235
236
|
for (const { panel } of panelEntries) {
|
|
236
237
|
panels.push(panel);
|
|
237
|
-
mountStylebookCanvas(
|
|
238
|
-
surface.renderGeneration,
|
|
239
|
-
generated,
|
|
240
|
-
panel.canvas as HTMLElement,
|
|
241
|
-
panel._width,
|
|
242
|
-
);
|
|
238
|
+
mountStylebookCanvas(surface.renderGeneration, generated, panel.canvas, panel._width);
|
|
243
239
|
}
|
|
244
240
|
if (hasMedia) {
|
|
245
241
|
ctx.updateActivePanelHeaders(surface);
|
|
@@ -260,16 +256,16 @@ export async function renderStylebookMode(
|
|
|
260
256
|
*/
|
|
261
257
|
export function selectStylebookTag(tag: string, media?: string | null, { panCanvas = false } = {}) {
|
|
262
258
|
shell.stylebook.selection = tag;
|
|
259
|
+
const ui: Partial<TabUi> = { activeSelector: tag, rightTab: "style" };
|
|
260
|
+
if (media !== undefined) {
|
|
261
|
+
ui.activeMedia = media;
|
|
262
|
+
}
|
|
263
263
|
updateSession(activeTab.value, {
|
|
264
264
|
// The ROOT path, not an empty selection: stylebook mode has always parked the selection on the
|
|
265
265
|
// Document element while the Style tab edits a TAG, and widening the field to a list changed
|
|
266
266
|
// Which literal spells that — `[[]]` is one selected path, the root — not what it means.
|
|
267
267
|
selection: [[]],
|
|
268
|
-
ui
|
|
269
|
-
activeSelector: tag,
|
|
270
|
-
rightTab: "style",
|
|
271
|
-
...(media !== undefined ? { activeMedia: media } : {}),
|
|
272
|
-
},
|
|
268
|
+
ui,
|
|
273
269
|
});
|
|
274
270
|
|
|
275
271
|
if (tag && panCanvas) {
|