@jxsuite/studio 6.1.1 → 8.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -5
- package/dist/chunks/2020-5wtzce5g.js +4 -0
- package/dist/chunks/{action-group-2mqby73c.js → action-group-4aan7g6g.js} +3 -3
- package/dist/chunks/adapter-5tphg7xe.js +4 -0
- package/dist/chunks/add-new-flow-psym14sn.js +4 -0
- package/dist/chunks/cf-account-picker-haqazq5r.js +4 -0
- package/dist/chunks/cf-settings-h2wrh6hq.js +4 -0
- package/dist/chunks/color-area-6rbra5dy.js +4 -0
- package/dist/chunks/color-field-gy56c94g.js +4 -0
- package/dist/chunks/color-m7r1vk54.js +4 -0
- package/dist/chunks/color-slider-sqqdyf6c.js +4 -0
- package/dist/chunks/combobox-72h32ejk.js +4 -0
- package/dist/chunks/components-r22xca09.js +4 -0
- package/dist/chunks/content-source-mmppmcyg.js +4 -0
- package/dist/chunks/convert-to-repeater-he70fc2b.js +4 -0
- package/dist/chunks/dialog-c4x05vyx.js +4 -0
- package/dist/chunks/editor-ccd9jwsa.js +4 -0
- package/dist/chunks/entry-commands-6qxz9e8p.js +4 -0
- package/dist/chunks/extension-sections-0egb88dm.js +4 -0
- package/dist/chunks/file-ops-qnab36ek.js +4 -0
- package/dist/chunks/files-rcn56qvm.js +4 -0
- package/dist/chunks/format-host-yxz0kjjs.js +4 -0
- package/dist/chunks/fs-events-d1qxq4z4.js +4 -0
- package/dist/chunks/grid-open-4z1g062t.js +4 -0
- package/dist/chunks/grid-view-qg1b5eqx.js +51 -0
- package/dist/chunks/icons-63bjtbs7.js +4 -0
- package/dist/chunks/iframe-entry-2zggzajv.js +5 -0
- package/dist/chunks/iframe-entry-76j8vwwx.js +5 -0
- package/dist/chunks/iframe-entry-99nr5zfb.js +5 -0
- package/dist/chunks/iframe-entry-pkgmcgp0.js +5 -0
- package/dist/chunks/iframe-host-ssv7kyj0.js +4 -0
- package/dist/chunks/{index-2veqmnhr.js → index-32eqzv1k.js} +3 -3
- package/dist/chunks/index-f0jn7nnp.js +4 -0
- package/dist/chunks/{javascript-8nbvs12s.js → javascript-pjp734q4.js} +3 -3
- package/dist/chunks/jsonMode-njkvsa02.js +13 -0
- package/dist/chunks/jx-validate-ttasrbh7.js +4 -0
- package/dist/chunks/layers-bgyr11tr.js +4 -0
- package/dist/chunks/layers-panel-7ez66zeq.js +4 -0
- package/dist/chunks/listbox-c421cf8c.js +4 -0
- package/dist/chunks/lit-html-v9gh687x.js +4 -0
- package/dist/chunks/media-library-sq468wts.js +4 -0
- package/dist/chunks/media-picker-shfe59pt.js +4 -0
- package/dist/chunks/menu-bdpzbfvs.js +4 -0
- package/dist/chunks/monaco-binding-vq1hgnn0.js +4 -0
- package/dist/chunks/monaco-buffer-3afgwvbp.js +4 -0
- package/dist/chunks/monaco-setup-xrd2cbkp.js +4 -0
- package/dist/chunks/notify-kzrjr3fv.js +4 -0
- package/dist/chunks/number-field-y62xq0ty.js +4 -0
- package/dist/chunks/parse-v77xtwv7.js +4 -0
- package/dist/chunks/platform-7v4rtd7m.js +4 -0
- package/dist/chunks/popover-b89sfej7.js +4 -0
- package/dist/chunks/publish-panel-2z9gw8ee.js +4 -0
- package/dist/chunks/publish-quick-qx2455cj.js +4 -0
- package/dist/chunks/publish-workspace-wrc1dgwx.js +4 -0
- package/dist/chunks/quick-search-n0t0eqxb.js +4 -0
- package/dist/chunks/references-9547rg5s.js +4 -0
- package/dist/chunks/right-panel-wsgnr9pn.js +4 -0
- package/dist/chunks/select-rzds841e.js +4 -0
- package/dist/chunks/source-control-kwktr9y6.js +4 -0
- package/dist/chunks/split-c9zfdgxf.js +4 -0
- package/dist/chunks/studio-03ct6yfv.js +9 -0
- package/dist/chunks/studio-07rcfje3.js +5 -0
- package/dist/chunks/studio-3e54qh39.js +7 -0
- package/dist/chunks/studio-3exxhz5g.js +5 -0
- package/dist/chunks/studio-3q40e3rj.js +5 -0
- package/dist/chunks/studio-3qeh9t0h.js +6 -0
- package/dist/chunks/studio-3qqjeep5.js +6 -0
- package/dist/chunks/studio-43sd2mam.js +4 -0
- package/dist/chunks/studio-4hp8pkyt.js +5 -0
- package/dist/chunks/studio-58xg6j2q.js +9 -0
- package/dist/chunks/studio-5g0rprdt.js +7 -0
- package/dist/chunks/studio-6m380wp7.js +5 -0
- package/dist/chunks/studio-80jyh1xh.js +4 -0
- package/dist/chunks/studio-83mk4bgg.js +9 -0
- package/dist/chunks/{studio-kggey1jt.js → studio-881z1xrx.js} +4 -4
- package/dist/chunks/studio-8m0y2qe7.js +5 -0
- package/dist/chunks/studio-8tr6cfrc.js +5 -0
- package/dist/chunks/studio-8vcvfs7r.js +6 -0
- package/dist/chunks/studio-9tmebf0s.js +5 -0
- package/dist/chunks/studio-a2bvaptz.js +5 -0
- package/dist/chunks/studio-b7y5mr30.js +5 -0
- package/dist/chunks/studio-bavb31r0.js +5 -0
- package/dist/chunks/studio-bbe4c90a.js +5 -0
- package/dist/chunks/studio-c05wdnt3.js +5 -0
- package/dist/chunks/studio-ccv2svc6.js +5 -0
- package/dist/chunks/studio-d5grtb9e.js +16 -0
- package/dist/chunks/studio-df0baea9.js +5 -0
- package/dist/chunks/studio-dgk4dqtx.js +7 -0
- package/dist/chunks/studio-e1g64q43.js +5 -0
- package/dist/chunks/studio-ed1hp6zf.js +6 -0
- package/dist/chunks/studio-ed3xx40h.js +7 -0
- package/dist/chunks/studio-f14e1zdj.js +5 -0
- package/dist/chunks/studio-fbhxxc5f.js +5 -0
- package/dist/chunks/studio-fyh0jc96.js +5 -0
- package/dist/chunks/studio-gcxk20n7.js +5 -0
- package/dist/chunks/studio-jaaz8ce9.js +5 -0
- package/dist/chunks/{studio-8grwxtqk.js → studio-jcnsdaep.js} +4 -4
- package/dist/chunks/studio-jsgf2q5k.js +7 -0
- package/dist/chunks/{studio-1q1sh2ax.js → studio-k3xxbagr.js} +3 -3
- package/dist/chunks/studio-k7evxqh4.js +5 -0
- package/dist/chunks/studio-kt3pjkwd.js +5 -0
- package/dist/chunks/studio-m8g16bgz.js +5 -0
- package/dist/chunks/studio-mn0476ag.js +5 -0
- package/dist/chunks/studio-mx1smyq0.js +5 -0
- package/dist/chunks/studio-n0c5h6mf.js +5 -0
- package/dist/chunks/{studio-rv11kfwa.js → studio-nh6d342n.js} +7 -7
- package/dist/chunks/studio-nqxqf8p2.js +4 -0
- package/dist/chunks/studio-p4nrkvqr.js +5 -0
- package/dist/chunks/{studio-h46vtzk8.js → studio-pbxa5fpc.js} +4 -4
- package/dist/chunks/studio-pgmvdv7z.js +7 -0
- package/dist/chunks/studio-ph84avkf.js +5 -0
- package/dist/chunks/{studio-wszjyh0j.js → studio-q0mvbaq6.js} +4 -4
- package/dist/chunks/studio-q0tccd43.js +5 -0
- package/dist/chunks/studio-q7rtx6zq.js +14 -0
- package/dist/chunks/{studio-pre0skq6.js → studio-qgh13jtz.js} +4 -4
- package/dist/chunks/studio-qmn1xc24.js +5 -0
- package/dist/chunks/studio-qwdqwkj0.js +5 -0
- package/dist/chunks/{studio-t6b6qe31.js → studio-r5qy30vx.js} +4 -4
- package/dist/chunks/studio-rj9eamf8.js +5 -0
- package/dist/chunks/studio-rptgsk96.js +5 -0
- package/dist/chunks/studio-rthyg42z.js +928 -0
- package/dist/chunks/studio-s19tp1xr.js +5 -0
- package/dist/chunks/studio-s32578pn.js +5 -0
- package/dist/chunks/studio-svb7yyve.js +5 -0
- package/dist/chunks/studio-syreb644.js +5 -0
- package/dist/chunks/studio-tf9jryb1.js +10 -0
- package/dist/chunks/studio-tfkznv39.js +5 -0
- package/dist/chunks/studio-tft6r105.js +5 -0
- package/dist/chunks/studio-txf2kysx.js +5 -0
- package/dist/chunks/studio-v8867ddv.js +12 -0
- package/dist/chunks/studio-vxq7fcvv.js +5 -0
- package/dist/chunks/studio-w4rz9hdk.js +5 -0
- package/dist/chunks/studio-wbcjbhy1.js +9 -0
- package/dist/chunks/studio-wc649wss.js +5 -0
- package/dist/chunks/studio-wys23mxz.js +5 -0
- package/dist/chunks/studio-x1x167jh.js +5 -0
- package/dist/chunks/studio-x9hsze61.js +5 -0
- package/dist/chunks/studio-y0n7yxea.js +9 -0
- package/dist/chunks/studio-y3ahhdpx.js +5 -0
- package/dist/chunks/studio-z97c48fk.js +5 -0
- package/dist/chunks/studio-zat62m0c.js +5 -0
- package/dist/chunks/studio-zcd2e7yz.js +5 -0
- package/dist/chunks/studio-zz9qe3rw.js +64 -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-1gv0h53h.js +4 -0
- package/dist/chunks/toast-host-1yg5ar8d.js +4 -0
- package/dist/chunks/{toolbar-2nnzqhrj.js → toolbar-44cm5cta.js} +3 -3
- package/dist/chunks/tooltip-yypz28gq.js +4 -0
- package/dist/chunks/tree-9xa4hm7n.js +4 -0
- package/dist/chunks/tsMode-epyfz1hv.js +14 -0
- package/dist/chunks/workspace-dz7nxfhv.js +4 -0
- package/dist/chunks/workspace-home-xsd7hkjw.js +4 -0
- package/dist/chunks/ws-client-bv552sfx.js +4 -0
- package/dist/iframe-entry.js +20 -16
- package/dist/manifest.json +77 -63
- package/dist/studio.js +106 -107
- package/dist/workers/ts.worker.js +3 -3
- package/package.json +17 -16
- 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/component-examples.ts +272 -0
- package/src/browse/library-commands.ts +64 -104
- package/src/browse/library-layouts.ts +270 -53
- package/src/browse/library-model.ts +194 -134
- package/src/browse/library-pane.ts +748 -440
- package/src/browse/library-preview.ts +161 -26
- package/src/browse/library-source.ts +308 -41
- package/src/browse/preview-root.ts +78 -0
- package/src/browse/preview-style.ts +155 -0
- package/src/canvas/asset-refs.ts +40 -10
- package/src/canvas/asset-resolve.ts +19 -23
- package/src/canvas/canvas-helpers.ts +7 -6
- package/src/canvas/canvas-live-render.ts +260 -77
- package/src/canvas/canvas-origin.ts +37 -12
- package/src/canvas/canvas-page-context.ts +112 -0
- package/src/canvas/canvas-patcher.ts +30 -30
- package/src/canvas/canvas-perf.ts +11 -5
- package/src/canvas/canvas-render.ts +175 -148
- package/src/canvas/canvas-surface.ts +5 -3
- package/src/canvas/canvas-utils.ts +147 -61
- 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 +120 -12
- package/src/canvas/iframe-editable-root.ts +29 -16
- package/src/canvas/iframe-entry.ts +104 -75
- package/src/canvas/iframe-eval.ts +73 -49
- package/src/canvas/iframe-host.ts +269 -158
- package/src/canvas/iframe-inline-edit.ts +49 -30
- package/src/canvas/iframe-insert.ts +5 -4
- package/src/canvas/iframe-interaction.ts +30 -25
- package/src/canvas/iframe-keys.ts +11 -0
- package/src/canvas/iframe-overlay.ts +1 -1
- package/src/canvas/iframe-patch.ts +25 -21
- package/src/canvas/iframe-position.ts +12 -6
- package/src/canvas/iframe-protocol.ts +36 -21
- package/src/canvas/iframe-render.ts +84 -35
- package/src/canvas/iframe-slash.ts +24 -11
- package/src/canvas/iframe-subtree.ts +10 -3
- package/src/canvas/npm-modules.ts +22 -0
- 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/preview-navigate.ts +16 -0
- package/src/canvas/repeater-sources.ts +200 -0
- package/src/canvas/serialize-scope.ts +13 -5
- package/src/canvas/stage-scrollbar.ts +7 -2
- package/src/canvas/surface-registry.ts +27 -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/app-commands.ts +16 -6
- package/src/commands/budget.ts +13 -11
- package/src/commands/command-args.ts +103 -71
- package/src/commands/context.ts +55 -28
- package/src/commands/defaults.ts +69 -45
- package/src/commands/keymap.ts +56 -43
- package/src/commands/levels.ts +14 -8
- package/src/commands/live-context.ts +9 -7
- package/src/commands/reference.ts +2 -1
- package/src/commands/registry.ts +22 -11
- package/src/commands/run-reported.ts +15 -10
- package/src/component-props.ts +46 -30
- package/src/content/collection-match.ts +11 -9
- package/src/content/collection-pages.ts +412 -0
- package/src/content/content-collections.ts +270 -0
- package/src/content/draft-state.ts +4 -3
- package/src/content/entry-commands.ts +54 -62
- package/src/content/entry-editor.ts +137 -32
- package/src/content/entry-fields.ts +25 -8
- package/src/content/entry-inspector.ts +225 -0
- package/src/content/entry-model.ts +38 -15
- package/src/content/entry-open.ts +80 -0
- package/src/content/entry-summaries.ts +440 -0
- package/src/content/file-record-ids.ts +80 -0
- package/src/content/file-records.ts +125 -0
- package/src/content/page-summaries.ts +129 -0
- package/src/content/record-entry.ts +201 -0
- package/src/content/writing-banner.ts +177 -0
- package/src/create/add-new-commands.ts +185 -0
- package/src/create/add-new-flow.ts +1116 -0
- package/src/create/add-new.ts +1014 -0
- package/src/create/element-name.ts +121 -0
- 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 +78 -48
- package/src/editor/convert-to-repeater.ts +34 -22
- package/src/editor/editable-tags.ts +17 -2
- package/src/editor/file-drop-action.ts +29 -22
- package/src/editor/inline-edit-apply.ts +79 -17
- package/src/editor/inline-edit.ts +76 -50
- package/src/editor/inline-format.ts +59 -56
- package/src/editor/inline-link.ts +40 -15
- package/src/editor/insert-component.ts +91 -0
- package/src/editor/insert-zone-action.ts +14 -5
- package/src/editor/merge-tags.ts +58 -19
- package/src/editor/repeater-scope.ts +39 -28
- package/src/editor/shortcuts.ts +76 -42
- package/src/editor/slash-menu.ts +52 -14
- package/src/files/asset-versions.ts +4 -4
- package/src/files/components.ts +89 -20
- package/src/files/elements.ts +5 -6
- package/src/files/file-ops.ts +92 -41
- package/src/files/files.ts +248 -239
- package/src/files/fs-events.ts +18 -7
- package/src/files/media-meta.ts +97 -2
- package/src/files/media-paths.ts +3 -0
- package/src/files/media-types.ts +55 -0
- package/src/files/media-upload.ts +209 -52
- package/src/files/new-file-name.ts +156 -0
- package/src/files/serialize-document.ts +15 -5
- 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 +91 -50
- package/src/github/github-auth-status.ts +27 -3
- package/src/github/github-auth.ts +21 -11
- package/src/github/github-publish.ts +28 -23
- 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 +25 -23
- package/src/grid/grid-layout.ts +21 -5
- package/src/grid/grid-open.ts +3 -33
- package/src/grid/grid-panel.ts +65 -6
- package/src/grid/grid-reveal.ts +34 -0
- package/src/grid/grid-source.ts +9 -31
- package/src/grid/grid-view.ts +45 -23
- 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 +100 -31
- package/src/grid/sources/csv-file-source.ts +2 -2
- package/src/grid/tabulator-tables.d.ts +61 -34
- package/src/hosting/document.ts +2 -2
- package/src/hosting/stage.ts +7 -7
- package/src/i18n/i18n-commands.ts +3 -3
- package/src/media/media-commands.ts +181 -0
- package/src/media/media-library-model.ts +232 -0
- package/src/media/media-library.ts +1283 -0
- package/src/media/media-pane.ts +51 -20
- 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 +38 -14
- package/src/panels/ai-chat/attached-context.ts +13 -7
- package/src/panels/ai-chat/chat-markdown.ts +8 -8
- 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 +57 -46
- package/src/panels/bottom-dock.ts +5 -3
- package/src/panels/canvas-dnd-bridge.ts +36 -26
- package/src/panels/chat-panel.ts +6 -6
- package/src/panels/collections-panel.ts +306 -0
- package/src/panels/component-preview.ts +35 -13
- package/src/panels/data-explorer.ts +63 -26
- package/src/panels/data-grid.ts +18 -11
- package/src/panels/dnd.ts +115 -138
- package/src/panels/editors.ts +52 -21
- package/src/panels/elements-panel.ts +19 -5
- package/src/panels/empty-state.ts +2 -2
- package/src/panels/events-panel.ts +84 -69
- package/src/panels/formula-workspace.ts +78 -54
- package/src/panels/frontmatter-fields.ts +33 -28
- package/src/panels/git-diff-open.ts +10 -6
- package/src/panels/head-panel.ts +488 -202
- package/src/panels/i18n-panel.ts +20 -12
- package/src/panels/imports-panel.ts +25 -47
- package/src/panels/jump-bar.ts +75 -31
- package/src/panels/layers-panel.ts +130 -101
- package/src/panels/left-panel.ts +25 -11
- package/src/panels/navigator-panels.ts +23 -11
- package/src/panels/pane-context.ts +140 -49
- package/src/panels/pane-grid.ts +55 -26
- package/src/panels/panel-registry.ts +36 -46
- package/src/panels/properties-panel.ts +182 -124
- package/src/panels/quick-search.ts +53 -31
- package/src/panels/right-panel.ts +201 -45
- package/src/panels/seo-modal.ts +54 -125
- package/src/panels/settings-menu.ts +63 -61
- package/src/panels/settings-pane.ts +268 -162
- package/src/panels/signals-panel.ts +156 -135
- package/src/panels/site-model.ts +367 -0
- package/src/panels/site-panel.ts +638 -0
- package/src/panels/statement-editor.ts +230 -140
- package/src/panels/style-panel.ts +253 -206
- package/src/panels/style-utils.ts +114 -51
- package/src/panels/stylebook-doc.ts +195 -60
- package/src/panels/stylebook-layers-panel.ts +48 -89
- package/src/panels/stylebook-panel.ts +60 -27
- package/src/panels/styles-panel.ts +327 -0
- package/src/panels/tab-drop.ts +27 -11
- package/src/panels/tab-strip.ts +143 -49
- package/src/platform-errors.ts +57 -43
- package/src/platform.ts +59 -31
- package/src/platforms/cloud.ts +373 -176
- package/src/platforms/default-platform.ts +14 -8
- package/src/platforms/devserver.ts +180 -142
- package/src/platforms/read-batcher.ts +16 -8
- package/src/project-list.ts +2 -1
- package/src/publish/deploy-checklist.ts +20 -9
- package/src/publish/pages-service.ts +66 -27
- package/src/publish/publish-changes.ts +491 -0
- package/src/publish/publish-commands.ts +88 -22
- package/src/publish/publish-ids.ts +49 -0
- package/src/publish/publish-panel.ts +10 -6
- package/src/publish/publish-quick.ts +148 -0
- package/src/publish/publish-workspace.ts +926 -0
- package/src/publish/source-control.ts +907 -0
- 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 +74 -51
- package/src/services/cem-export.ts +149 -58
- package/src/services/cf-settings.ts +4 -4
- package/src/services/clock.ts +6 -1
- package/src/services/code-services.ts +37 -31
- package/src/services/connection.ts +2 -2
- 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 +20 -14
- 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 +29 -9
- package/src/services/settings/definitions.ts +25 -14
- 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 +128 -70
- package/src/settings/css-vars-editor.ts +119 -32
- package/src/settings/defs-editor.ts +38 -35
- package/src/settings/developer-panels.ts +43 -0
- package/src/settings/extension-rows.ts +16 -8
- package/src/settings/extension-sections.ts +42 -14
- package/src/settings/extensions-section.ts +4 -1
- package/src/settings/general-settings.ts +101 -28
- package/src/settings/locales-section.ts +20 -12
- package/src/settings/preferences-dialog.ts +17 -7
- package/src/settings/preferences-keymap.ts +7 -5
- package/src/settings/preferences-sections.ts +11 -5
- package/src/settings/project-sections.ts +28 -11
- package/src/settings/schema-field-ui.ts +12 -1
- package/src/settings/section-registry.ts +116 -11
- package/src/settings/settings-dialog.ts +192 -0
- package/src/settings/settings-document.ts +186 -166
- package/src/shell/tree.ts +6 -5
- package/src/shell.ts +536 -477
- package/src/site-context.ts +101 -32
- package/src/state.ts +68 -57
- package/src/store.ts +54 -34
- package/src/studio.ts +219 -116
- package/src/style/live-preview.ts +1 -1
- package/src/style/project-styles.ts +40 -7
- package/src/style/stylebook-specimens.ts +89 -0
- package/src/style/stylebook-target.ts +26 -0
- package/src/style/tag-inheritance.ts +105 -0
- package/src/style/token-ref.ts +5 -4
- package/src/style/variables-focus.ts +61 -0
- package/src/style/variables-view.ts +235 -0
- package/src/surfaces/about.ts +18 -19
- package/src/surfaces/add-new.json +1482 -0
- package/src/surfaces/add-new.ts +325 -0
- package/src/surfaces/add-repo.ts +17 -19
- package/src/surfaces/ai-chat.ts +33 -38
- 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.json +4 -3
- package/src/surfaces/boot-failure.ts +4 -5
- package/src/surfaces/bottom-dock.json +1 -1
- package/src/surfaces/bottom-dock.ts +9 -18
- package/src/surfaces/canvas-stage.json +30 -19
- package/src/surfaces/canvas-stage.ts +17 -16
- package/src/surfaces/cf-account-picker.ts +17 -18
- package/src/surfaces/collections-panel.json +615 -0
- package/src/surfaces/collections-panel.ts +168 -0
- package/src/surfaces/commandbar.json +241 -96
- package/src/surfaces/commandbar.ts +145 -105
- 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/empty-state.json +1 -1
- package/src/surfaces/empty-state.ts +7 -10
- package/src/surfaces/entry-editor.json +136 -0
- package/src/surfaces/entry-editor.ts +35 -11
- package/src/surfaces/entry-inspector.json +371 -0
- package/src/surfaces/entry-inspector.ts +143 -0
- 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/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.json +162 -14
- package/src/surfaces/inspector-dock.ts +59 -31
- package/src/surfaces/jump-bar.ts +5 -6
- package/src/surfaces/jxsuite-update.ts +16 -22
- package/src/surfaces/library-pane.json +670 -437
- package/src/surfaces/library-pane.ts +111 -77
- package/src/surfaces/logic-panel.ts +17 -30
- package/src/surfaces/logic-workspace.ts +13 -15
- package/src/surfaces/media-browser.json +62 -6
- package/src/surfaces/media-browser.ts +26 -11
- package/src/surfaces/media-field.json +1 -1
- package/src/surfaces/media-field.ts +4 -5
- package/src/surfaces/media-library.json +1586 -0
- package/src/surfaces/media-library.ts +282 -0
- package/src/surfaces/media-pane.ts +8 -7
- package/src/surfaces/media-pick-dialog.json +71 -0
- package/src/surfaces/media-pick-dialog.ts +132 -0
- package/src/surfaces/menu.ts +47 -23
- package/src/surfaces/navigator-dock.ts +11 -12
- package/src/surfaces/new-project.ts +27 -26
- package/src/surfaces/pane-context.json +144 -77
- package/src/surfaces/pane-context.ts +44 -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.json +12 -6
- package/src/surfaces/panel-deploy-checklist.ts +8 -7
- 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.json +72 -2
- package/src/surfaces/panel-page.ts +49 -25
- package/src/surfaces/panel-problems.ts +5 -7
- package/src/surfaces/panel-signals.json +1 -1
- package/src/surfaces/panel-signals.ts +25 -39
- package/src/surfaces/panel-stylebook-layers.json +71 -204
- package/src/surfaces/panel-stylebook-layers.ts +5 -29
- package/src/surfaces/preferences.json +120 -48
- package/src/surfaces/preferences.ts +29 -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-quick.json +428 -0
- package/src/surfaces/publish-quick.ts +165 -0
- package/src/surfaces/publish-workspace.json +2892 -0
- package/src/surfaces/publish-workspace.ts +391 -0
- package/src/surfaces/publish.ts +18 -18
- package/src/surfaces/push-plan.ts +7 -8
- package/src/surfaces/rail.json +1 -159
- package/src/surfaces/rail.ts +22 -79
- package/src/surfaces/reference-field.ts +11 -15
- package/src/surfaces/schema-builder.ts +16 -22
- package/src/surfaces/schema-form.json +10 -2
- package/src/surfaces/schema-form.ts +17 -25
- package/src/surfaces/secret-field.ts +9 -6
- package/src/surfaces/seo.json +1 -1
- package/src/surfaces/seo.ts +21 -15
- package/src/surfaces/settings-contexts.ts +9 -7
- package/src/surfaces/settings-contributed.json +5 -5
- package/src/surfaces/settings-contributed.ts +32 -12
- package/src/surfaces/settings-css-vars.json +44 -36
- package/src/surfaces/settings-css-vars.ts +82 -16
- package/src/surfaces/settings-defs.json +2 -2
- package/src/surfaces/settings-defs.ts +17 -21
- package/src/surfaces/settings-deploy.json +2 -15
- package/src/surfaces/settings-deploy.ts +9 -16
- package/src/surfaces/settings-dialog.json +51 -0
- package/src/surfaces/settings-dialog.ts +169 -0
- 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.json +3 -3
- package/src/surfaces/settings-overview.ts +14 -8
- package/src/surfaces/settings-packages.ts +8 -7
- package/src/surfaces/settings-pane.json +269 -46
- package/src/surfaces/settings-pane.ts +88 -36
- package/src/surfaces/settings-rawjson.ts +5 -6
- package/src/surfaces/shell.json +2 -1
- package/src/surfaces/shell.ts +1 -2
- package/src/surfaces/site-panel.json +1029 -0
- package/src/surfaces/site-panel.ts +233 -0
- package/src/surfaces/slash-menu.json +63 -21
- package/src/surfaces/slash-menu.ts +42 -9
- package/src/surfaces/statements.ts +13 -18
- package/src/surfaces/statusbar.ts +56 -29
- package/src/surfaces/style-panel.ts +18 -31
- package/src/surfaces/stylebook-chrome.ts +3 -5
- package/src/surfaces/styles-panel.json +735 -0
- package/src/surfaces/styles-panel.ts +195 -0
- package/src/surfaces/styles-variables.json +149 -0
- package/src/surfaces/styles-variables.ts +145 -0
- package/src/surfaces/tab-strip.json +4 -4
- package/src/surfaces/tab-strip.ts +14 -13
- package/src/surfaces/target-line.ts +6 -7
- package/src/surfaces/welcome.ts +6 -8
- package/src/surfaces/writing-banner.json +94 -0
- package/src/surfaces/writing-banner.ts +80 -0
- package/src/tabs/bare-repeaters.ts +101 -0
- 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 +99 -48
- package/src/tabs/transact.ts +98 -53
- package/src/types.ts +53 -43
- 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 +104 -56
- package/src/ui/formula-catalog.ts +239 -230
- package/src/ui/formula-chips.ts +33 -18
- package/src/ui/layers.ts +57 -31
- package/src/ui/media-picker.ts +300 -47
- package/src/ui/popover-surface.ts +20 -12
- package/src/ui/progress-modal.ts +13 -8
- package/src/ui/regions.ts +14 -12
- package/src/ui/schema-form.ts +372 -97
- 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 +29 -3
- package/src/utils/base64.ts +6 -4
- package/src/utils/edit-display.ts +366 -111
- 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/local-day.ts +18 -0
- 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 +14 -16
- package/src/workspace/session.ts +81 -50
- package/src/workspace/tab-workspace.ts +137 -0
- package/src/workspace/workspace-back.ts +189 -0
- package/src/workspace/workspace-home.ts +133 -0
- package/src/workspace/workspace-ids.ts +129 -0
- package/src/workspace/workspace-switch.ts +372 -0
- package/src/workspace/workspace.ts +165 -47
- package/styles/shell-frame.css +30 -7
- package/styles/shell-frame.json +15 -3
- package/dist/chunks/2020-va2wwra4.js +0 -4
- package/dist/chunks/adapter-f93pafd7.js +0 -4
- package/dist/chunks/cf-account-picker-af1h381v.js +0 -4
- package/dist/chunks/cf-settings-125tdm0w.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-ax2f1fnn.js +0 -4
- package/dist/chunks/content-source-108aqtk1.js +0 -4
- package/dist/chunks/convert-to-repeater-ry5rmppr.js +0 -4
- package/dist/chunks/dialog-mtm9fq5t.js +0 -4
- package/dist/chunks/editor-pfgdmkb0.js +0 -4
- package/dist/chunks/entry-commands-t0k1q0kx.js +0 -4
- package/dist/chunks/extension-sections-6mwh2hf8.js +0 -4
- package/dist/chunks/file-ops-meej5mqf.js +0 -4
- package/dist/chunks/files-44vp8a2s.js +0 -4
- package/dist/chunks/format-host-7q1petb9.js +0 -4
- package/dist/chunks/fs-events-h2mwnxaz.js +0 -4
- package/dist/chunks/git-panel-zngbymvd.js +0 -4
- package/dist/chunks/grid-view-sx9vynsp.js +0 -51
- package/dist/chunks/icons-p44xhjf0.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-qk3ycq87.js +0 -4
- package/dist/chunks/index-wkyfjeqz.js +0 -4
- package/dist/chunks/jsonMode-s8kt9dsj.js +0 -13
- package/dist/chunks/jx-validate-psgd7vsx.js +0 -4
- package/dist/chunks/layers-panel-1kq2jyfk.js +0 -4
- package/dist/chunks/layers-xd92fg8d.js +0 -4
- package/dist/chunks/listbox-s8fkmnq8.js +0 -4
- package/dist/chunks/lit-html-ac4cwwr4.js +0 -4
- package/dist/chunks/media-picker-0svzkdyb.js +0 -4
- package/dist/chunks/menu-37d07z9m.js +0 -4
- package/dist/chunks/menu-5c55ea3d.js +0 -4
- package/dist/chunks/monaco-binding-z6r70pdt.js +0 -4
- package/dist/chunks/monaco-buffer-fz6gq5y7.js +0 -4
- package/dist/chunks/monaco-setup-q4axkgj7.js +0 -4
- package/dist/chunks/notify-0xgtn8q1.js +0 -4
- package/dist/chunks/number-field-gw7sq8rn.js +0 -4
- package/dist/chunks/parse-897fvqah.js +0 -4
- package/dist/chunks/platform-v1qctbe6.js +0 -4
- package/dist/chunks/popover-8htra4er.js +0 -4
- package/dist/chunks/publish-panel-ym1fmgq5.js +0 -4
- package/dist/chunks/quick-search-a54e6t5n.js +0 -4
- package/dist/chunks/references-gmqp82fs.js +0 -4
- package/dist/chunks/right-panel-v7t9awbk.js +0 -4
- package/dist/chunks/section-registry-vhyf3zsr.js +0 -4
- package/dist/chunks/select-n3v7gwas.js +0 -4
- package/dist/chunks/split-pff8f3ze.js +0 -4
- package/dist/chunks/studio-0bhx5hz6.js +0 -5
- package/dist/chunks/studio-0k1ddnyy.js +0 -6
- package/dist/chunks/studio-1b04pd0j.js +0 -64
- package/dist/chunks/studio-4dwbj6gb.js +0 -5
- package/dist/chunks/studio-4tanh828.js +0 -5
- package/dist/chunks/studio-55h4mstj.js +0 -4
- package/dist/chunks/studio-5tnvjkz4.js +0 -5
- package/dist/chunks/studio-60dqgb0c.js +0 -5
- package/dist/chunks/studio-61dp09qg.js +0 -9
- package/dist/chunks/studio-63epcrj2.js +0 -5
- package/dist/chunks/studio-74k29dy9.js +0 -5
- package/dist/chunks/studio-7vg6jcd3.js +0 -5
- package/dist/chunks/studio-7zx31knw.js +0 -9
- package/dist/chunks/studio-8bxk97km.js +0 -5
- package/dist/chunks/studio-933e30n4.js +0 -5
- package/dist/chunks/studio-98wnwhbg.js +0 -5
- package/dist/chunks/studio-9mccjwjh.js +0 -14
- package/dist/chunks/studio-a2ke1e4t.js +0 -5
- package/dist/chunks/studio-e3a2a6v3.js +0 -4
- package/dist/chunks/studio-e81q1vb9.js +0 -5
- package/dist/chunks/studio-epgrmqqm.js +0 -5
- package/dist/chunks/studio-ery42sqr.js +0 -4
- package/dist/chunks/studio-g1shz58g.js +0 -5
- package/dist/chunks/studio-gf0fz03c.js +0 -5
- package/dist/chunks/studio-gjtpe62q.js +0 -6
- package/dist/chunks/studio-gkskhg7m.js +0 -5
- package/dist/chunks/studio-gx4dnjzd.js +0 -5
- package/dist/chunks/studio-j03zga3y.js +0 -9
- package/dist/chunks/studio-jhpxeckz.js +0 -5
- package/dist/chunks/studio-k01r7ykp.js +0 -5
- package/dist/chunks/studio-kk7h30ne.js +0 -7
- package/dist/chunks/studio-kt1zqney.js +0 -5
- package/dist/chunks/studio-m3cwhvye.js +0 -5
- package/dist/chunks/studio-mcayt6hz.js +0 -5
- package/dist/chunks/studio-myjcghv3.js +0 -5
- package/dist/chunks/studio-n8bxwc3y.js +0 -4
- package/dist/chunks/studio-ngm8gvpb.js +0 -5
- package/dist/chunks/studio-nj5a01jy.js +0 -928
- package/dist/chunks/studio-pcgz8heb.js +0 -5
- package/dist/chunks/studio-qcsq0t15.js +0 -5
- package/dist/chunks/studio-qkstvve9.js +0 -5
- package/dist/chunks/studio-qv1pwd3c.js +0 -5
- package/dist/chunks/studio-rc6dvxjb.js +0 -7
- package/dist/chunks/studio-s8dmmz66.js +0 -5
- package/dist/chunks/studio-sp5xzbj4.js +0 -6
- package/dist/chunks/studio-szsjbj0g.js +0 -5
- package/dist/chunks/studio-t1xzawhr.js +0 -16
- package/dist/chunks/studio-tdcprbqb.js +0 -5
- package/dist/chunks/studio-vrmcjf9g.js +0 -7
- package/dist/chunks/studio-vyc0b4he.js +0 -10
- package/dist/chunks/studio-w0cgf6jg.js +0 -5
- package/dist/chunks/studio-w3hskzqk.js +0 -5
- package/dist/chunks/studio-xgrgcdyh.js +0 -9
- package/dist/chunks/studio-xz2yxfcb.js +0 -5
- package/dist/chunks/studio-y6n42tgs.js +0 -5
- package/dist/chunks/studio-yb560vxr.js +0 -5
- package/dist/chunks/studio-yn9f8vtx.js +0 -5
- package/dist/chunks/studio-yw05w8f0.js +0 -7
- package/dist/chunks/studio-z16sgavc.js +0 -5
- package/dist/chunks/studio-zey7zsdw.js +0 -12
- package/dist/chunks/studio-zyqn40w4.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-2frah6h1.js +0 -14
- package/dist/chunks/workspace-zt81g1ms.js +0 -4
- package/dist/chunks/ws-client-n2bh4hkf.js +0 -4
- package/src/panels/frontmatter-panel.ts +0 -701
- package/src/panels/git-panel.ts +0 -1120
- package/src/surfaces/doc-header.json +0 -776
- package/src/surfaces/doc-header.ts +0 -231
- package/src/surfaces/git-panel.json +0 -1880
- package/src/surfaces/git-panel.ts +0 -272
|
@@ -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,7 +21,15 @@ 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
|
|
24
|
+
import { isNonNullObject, isRef } from "@jxsuite/schema/guards";
|
|
25
|
+
import type { StylebookSpecimens } from "../style/stylebook-specimens";
|
|
26
|
+
import type {
|
|
27
|
+
JxDocument,
|
|
28
|
+
JxHeadEntry,
|
|
29
|
+
JxMutableNode,
|
|
30
|
+
JxStateDefinition,
|
|
31
|
+
JxStyle,
|
|
32
|
+
} from "@jxsuite/schema/types";
|
|
25
33
|
|
|
26
34
|
export interface StylebookDocResult {
|
|
27
35
|
/** The specimen document (plain JSON — safe to post over the bridge). */
|
|
@@ -44,8 +52,9 @@ function isTagPath(key: string): boolean {
|
|
|
44
52
|
);
|
|
45
53
|
}
|
|
46
54
|
|
|
47
|
-
|
|
48
|
-
|
|
55
|
+
/** A nested style block (a rule or an at-rule body), as opposed to a scalar or a block list. */
|
|
56
|
+
function isStyleBlock(value: JxStyle[string]): value is JxStyle {
|
|
57
|
+
return isNonNullObject(value) && !Array.isArray(value);
|
|
49
58
|
}
|
|
50
59
|
|
|
51
60
|
/** The specimen-scoping selector prefix (see the module doc). */
|
|
@@ -58,12 +67,11 @@ const SPECIMEN_SCOPE = "& .element-card-preview";
|
|
|
58
67
|
* `styleUpdate` fast path so an edit round-trips through the exact same transform.
|
|
59
68
|
*/
|
|
60
69
|
export function transposeStylebookStyle(effectiveStyle: JxStyle): JxStyle {
|
|
61
|
-
const
|
|
62
|
-
const out: Record<string, unknown> = {};
|
|
70
|
+
const out: JxStyle = {};
|
|
63
71
|
|
|
64
72
|
/** Drop the base-width marker, which is not a query and would resolve to `@media --`. */
|
|
65
|
-
const withoutBaseWidth = (rule:
|
|
66
|
-
const cleaned:
|
|
73
|
+
const withoutBaseWidth = (rule: JxStyle): JxStyle => {
|
|
74
|
+
const cleaned: JxStyle = {};
|
|
67
75
|
for (const [k, v] of Object.entries(rule)) {
|
|
68
76
|
if (k !== "@--") {
|
|
69
77
|
cleaned[k] = v;
|
|
@@ -72,8 +80,8 @@ export function transposeStylebookStyle(effectiveStyle: JxStyle): JxStyle {
|
|
|
72
80
|
return cleaned;
|
|
73
81
|
};
|
|
74
82
|
|
|
75
|
-
for (const [k, v] of Object.entries(
|
|
76
|
-
if (!
|
|
83
|
+
for (const [k, v] of Object.entries(effectiveStyle)) {
|
|
84
|
+
if (!isStyleBlock(v)) {
|
|
77
85
|
out[k] = v; // Flat scalars + -- custom props.
|
|
78
86
|
continue;
|
|
79
87
|
}
|
|
@@ -89,9 +97,9 @@ export function transposeStylebookStyle(effectiveStyle: JxStyle): JxStyle {
|
|
|
89
97
|
}
|
|
90
98
|
if (k.startsWith("@")) {
|
|
91
99
|
// Media block: re-key tag rules inside; non-tag keys (scalars/pseudo) apply to the root.
|
|
92
|
-
const bucket:
|
|
100
|
+
const bucket: JxStyle = {};
|
|
93
101
|
for (const [mk, mv] of Object.entries(v)) {
|
|
94
|
-
if (
|
|
102
|
+
if (isStyleBlock(mv) && isTagPath(mk)) {
|
|
95
103
|
bucket[`${SPECIMEN_SCOPE} ${mk}`] = withoutBaseWidth(mv);
|
|
96
104
|
} else {
|
|
97
105
|
bucket[mk] = mv;
|
|
@@ -107,34 +115,30 @@ export function transposeStylebookStyle(effectiveStyle: JxStyle): JxStyle {
|
|
|
107
115
|
out[k] = v;
|
|
108
116
|
}
|
|
109
117
|
|
|
110
|
-
return out
|
|
118
|
+
return out;
|
|
111
119
|
}
|
|
112
120
|
|
|
113
121
|
/** 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 {
|
|
122
|
+
function resolveNestedStyle(style: JxStyle, tagPath: string): JxStyle | null {
|
|
118
123
|
const parts = tagPath.split(" ");
|
|
119
|
-
let obj:
|
|
124
|
+
let obj: JxStyle[string] = style;
|
|
120
125
|
for (const part of parts) {
|
|
121
|
-
if (!
|
|
126
|
+
if (!isStyleBlock(obj)) {
|
|
122
127
|
return null;
|
|
123
128
|
}
|
|
124
129
|
obj = obj[part];
|
|
125
130
|
}
|
|
126
|
-
return
|
|
131
|
+
return isStyleBlock(obj) ? obj : null;
|
|
127
132
|
}
|
|
128
133
|
|
|
129
134
|
/** Whether the effective style customizes `tagPath` (directly or under any `@media` block). */
|
|
130
135
|
export function hasTagStyle(rootStyle: JxStyle, tagPath: string): boolean {
|
|
131
|
-
const
|
|
132
|
-
const direct = resolveNestedStyle(style, tagPath);
|
|
136
|
+
const direct = resolveNestedStyle(rootStyle, tagPath);
|
|
133
137
|
if (direct && Object.keys(direct).length > 0) {
|
|
134
138
|
return true;
|
|
135
139
|
}
|
|
136
|
-
for (const [key, val] of Object.entries(
|
|
137
|
-
if (!key.startsWith("@") || !
|
|
140
|
+
for (const [key, val] of Object.entries(rootStyle)) {
|
|
141
|
+
if (!key.startsWith("@") || !isStyleBlock(val)) {
|
|
138
142
|
continue;
|
|
139
143
|
}
|
|
140
144
|
const nested = resolveNestedStyle(val, tagPath);
|
|
@@ -145,6 +149,101 @@ export function hasTagStyle(rootStyle: JxStyle, tagPath: string): boolean {
|
|
|
145
149
|
return false;
|
|
146
150
|
}
|
|
147
151
|
|
|
152
|
+
/** One catalogue tag as a list of element defaults draws it: the Styles panel's, and the Outline's. */
|
|
153
|
+
export interface CatalogueRow {
|
|
154
|
+
/** The catalogue entry the row stands for. */
|
|
155
|
+
entry: StylebookEntry;
|
|
156
|
+
tag: string;
|
|
157
|
+
/** The compound path (`ul li`): the row's key, and what selecting the row selects. */
|
|
158
|
+
path: string;
|
|
159
|
+
/** How deep in its specimen the tag sits: 0 for a section's own entries. */
|
|
160
|
+
depth: number;
|
|
161
|
+
/** Whether the selection's leaf is this tag ({@link selectionLeaf}). */
|
|
162
|
+
selected: boolean;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* The leaf of a stylebook selection.
|
|
167
|
+
*
|
|
168
|
+
* A selection is a compound path (`"ul li"`) and the catalogue draws one row per TAG, so the row
|
|
169
|
+
* that is marked is the one whose tag is the path's last segment. That is what the tree has always
|
|
170
|
+
* done; it is written down here because "selected" meaning something other than "equal" is exactly
|
|
171
|
+
* the kind of thing a reader assumes is a bug.
|
|
172
|
+
*/
|
|
173
|
+
export function selectionLeaf(selection: string | null): string | null {
|
|
174
|
+
if (!selection) {
|
|
175
|
+
return null;
|
|
176
|
+
}
|
|
177
|
+
return selection.split(" ").pop() ?? null;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Flatten catalogue entries and everything under them into rows, in document order.
|
|
182
|
+
*
|
|
183
|
+
* Children are deduplicated by tag: a `<ul>` specimen carries several `<li>`s and they are one row,
|
|
184
|
+
* because the row selects a TAG and there is one rule per tag path to write. The ONE walk both
|
|
185
|
+
* lists draw from, so the two cannot drift; what each says about a row (its dot, its label) is the
|
|
186
|
+
* caller's.
|
|
187
|
+
*
|
|
188
|
+
* @param entries A section's entries, or several sections' in order
|
|
189
|
+
* @param selection The stylebook selection (`shell.stylebook.selection`)
|
|
190
|
+
*/
|
|
191
|
+
export function catalogueRows(
|
|
192
|
+
entries: readonly StylebookEntry[],
|
|
193
|
+
selection: string | null,
|
|
194
|
+
): CatalogueRow[] {
|
|
195
|
+
const leaf = selectionLeaf(selection);
|
|
196
|
+
const out: CatalogueRow[] = [];
|
|
197
|
+
const walk = (entry: StylebookEntry, depth: number, parentPath: string): void => {
|
|
198
|
+
const path = parentPath ? `${parentPath} ${entry.tag}` : entry.tag;
|
|
199
|
+
out.push({ depth, entry, path, selected: entry.tag === leaf, tag: entry.tag });
|
|
200
|
+
const children = entry.children
|
|
201
|
+
? [...new Map(entry.children.map((child) => [child.tag, child])).values()]
|
|
202
|
+
: [];
|
|
203
|
+
for (const child of children) {
|
|
204
|
+
walk(child, depth + 1, path);
|
|
205
|
+
}
|
|
206
|
+
};
|
|
207
|
+
for (const entry of entries) {
|
|
208
|
+
walk(entry, 0, "");
|
|
209
|
+
}
|
|
210
|
+
return out;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* A card's specimen for a component drawn as the first row of a list
|
|
215
|
+
* (`style/stylebook-specimens.ts`): the list's repeater, reading its row from `rootState[key]` so
|
|
216
|
+
* two cards' lists cannot collide, and the rest of the page state the row was drawn in, the first
|
|
217
|
+
* card's value winning a shared name (`$page`, `$site`). Null when the sample is not a repeater
|
|
218
|
+
* over a state list.
|
|
219
|
+
*/
|
|
220
|
+
export function sampleRowSpecimen(
|
|
221
|
+
sample: JxDocument,
|
|
222
|
+
key: string,
|
|
223
|
+
rootState: Record<string, JxStateDefinition>,
|
|
224
|
+
): JxMutableNode | null {
|
|
225
|
+
const [list] = Array.isArray(sample.children) ? sample.children : [];
|
|
226
|
+
if (!isNonNullObject(list) || Array.isArray(list) || !isRef(list.items)) {
|
|
227
|
+
return null;
|
|
228
|
+
}
|
|
229
|
+
const { $ref } = list.items;
|
|
230
|
+
const listKey = $ref.startsWith("#/state/") ? $ref.slice("#/state/".length) : "";
|
|
231
|
+
const rows = sample.state?.[listKey];
|
|
232
|
+
if (!Array.isArray(rows)) {
|
|
233
|
+
return null;
|
|
234
|
+
}
|
|
235
|
+
rootState[key] = rows;
|
|
236
|
+
for (const [name, value] of Object.entries(sample.state ?? {})) {
|
|
237
|
+
if (name !== listKey && !(name in rootState)) {
|
|
238
|
+
rootState[name] = value;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
/* SAFETY: `list` is the repeater object a page's `children` held; only its `items` is replaced,
|
|
242
|
+
with a ref of the same shape. */
|
|
243
|
+
const repeater = { ...list, items: { $ref: `#/state/${key}` } } as JxMutableNode;
|
|
244
|
+
return { children: [repeater], tagName: "div" };
|
|
245
|
+
}
|
|
246
|
+
|
|
148
247
|
/** Options for {@link buildStylebookDoc}. */
|
|
149
248
|
export interface BuildStylebookDocOpts {
|
|
150
249
|
meta: { $sections: { label: string; elements: StylebookEntry[] }[] };
|
|
@@ -153,9 +252,16 @@ export interface BuildStylebookDocOpts {
|
|
|
153
252
|
effectiveStyle: JxStyle;
|
|
154
253
|
/** Merged $media map (getEffectiveMedia output) — becomes the doc's $media. */
|
|
155
254
|
effectiveMedia: Record<string, string>;
|
|
255
|
+
/** Merged project+document `$head` (getEffectiveHead output) — becomes the doc's `$head`. */
|
|
256
|
+
effectiveHead?: JxHeadEntry[];
|
|
156
257
|
filter: string;
|
|
157
258
|
customizedOnly: boolean;
|
|
158
259
|
projectRoot: string | null;
|
|
260
|
+
/**
|
|
261
|
+
* How each component card is drawn, by tag (`style/stylebook-specimens.ts`). A component with no
|
|
262
|
+
* entry is drawn bare, with its declared defaults as attributes.
|
|
263
|
+
*/
|
|
264
|
+
specimens?: StylebookSpecimens;
|
|
159
265
|
}
|
|
160
266
|
|
|
161
267
|
/**
|
|
@@ -179,16 +285,21 @@ export function buildStylebookDoc(opts: BuildStylebookDocOpts): StylebookDocResu
|
|
|
179
285
|
};
|
|
180
286
|
|
|
181
287
|
const specimenNode = (entry: StylebookEntry): JxMutableNode => {
|
|
182
|
-
const attributes
|
|
288
|
+
const attributes = { ...entry.attributes };
|
|
183
289
|
if (entry.style) {
|
|
184
290
|
attributes.style = entry.style; // Inline CSS text — legacy `el.style.cssText` parity.
|
|
185
291
|
}
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
292
|
+
const node: JxMutableNode = { tagName: entry.tag };
|
|
293
|
+
if (entry.text) {
|
|
294
|
+
node.textContent = entry.text;
|
|
295
|
+
}
|
|
296
|
+
if (Object.keys(attributes).length > 0) {
|
|
297
|
+
node.attributes = attributes;
|
|
298
|
+
}
|
|
299
|
+
if (entry.children) {
|
|
300
|
+
node.children = entry.children.map(specimenNode);
|
|
301
|
+
}
|
|
302
|
+
return node;
|
|
192
303
|
};
|
|
193
304
|
|
|
194
305
|
/** A card wrapping one specimen; registers card/preview/specimen paths under `tag`. */
|
|
@@ -217,19 +328,18 @@ export function buildStylebookDoc(opts: BuildStylebookDocOpts): StylebookDocResu
|
|
|
217
328
|
{ attributes: { class: "element-card-label" }, tagName: "div", textContent: label },
|
|
218
329
|
],
|
|
219
330
|
tagName: "div",
|
|
220
|
-
}
|
|
331
|
+
};
|
|
221
332
|
};
|
|
222
333
|
|
|
223
334
|
const sections: JxMutableNode[] = [];
|
|
224
|
-
const sectionNode = (label: string, cards: JxMutableNode[]): JxMutableNode =>
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
}) as JxMutableNode;
|
|
335
|
+
const sectionNode = (label: string, cards: JxMutableNode[]): JxMutableNode => ({
|
|
336
|
+
attributes: { class: "sb-section" },
|
|
337
|
+
children: [
|
|
338
|
+
{ attributes: { class: "sb-label" }, tagName: "div", textContent: label },
|
|
339
|
+
{ attributes: { class: "sb-body" }, children: cards, tagName: "div" },
|
|
340
|
+
],
|
|
341
|
+
tagName: "div",
|
|
342
|
+
});
|
|
233
343
|
|
|
234
344
|
// Paths below mirror the assembled tree: root.children[si] = section; section.children[1] =
|
|
235
345
|
// Sb-body; body.children[ci] = card. Sections are appended only when non-empty, so indices are
|
|
@@ -264,6 +374,8 @@ export function buildStylebookDoc(opts: BuildStylebookDocOpts): StylebookDocResu
|
|
|
264
374
|
|
|
265
375
|
// Custom components from the registry — live custom elements registered via $elements.
|
|
266
376
|
const $elements: (string | { $ref: string })[] = [];
|
|
377
|
+
// The data the sample-row cards read: each row's list, and the page context it was drawn in.
|
|
378
|
+
const rootState: Record<string, JxStateDefinition> = {};
|
|
267
379
|
{
|
|
268
380
|
let comps = opts.components;
|
|
269
381
|
if (filter) {
|
|
@@ -287,24 +399,37 @@ export function buildStylebookDoc(opts: BuildStylebookDocOpts): StylebookDocResu
|
|
|
287
399
|
"/",
|
|
288
400
|
),
|
|
289
401
|
});
|
|
290
|
-
const
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
402
|
+
const drawn = opts.specimens?.get(comp.tagName);
|
|
403
|
+
if (drawn?.kind === "props") {
|
|
404
|
+
const specimen: JxMutableNode = { $props: drawn.props, tagName: comp.tagName };
|
|
405
|
+
return cardNode(comp.tagName, `<${comp.tagName}>`, specimen, cardPath, null);
|
|
406
|
+
}
|
|
407
|
+
if (drawn?.kind === "row") {
|
|
408
|
+
const row = sampleRowSpecimen(drawn.sample.doc, `stylebookRow${ci}`, rootState);
|
|
409
|
+
if (row) {
|
|
410
|
+
return cardNode(comp.tagName, `<${comp.tagName}>`, row, cardPath, null);
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
if (drawn?.kind !== "none") {
|
|
414
|
+
const attributes: Record<string, string> = {};
|
|
415
|
+
for (const p of comp.props ?? []) {
|
|
416
|
+
if (p.default !== undefined && p.default !== "false" && p.default !== "''") {
|
|
417
|
+
attributes[p.name] = String(p.default).replaceAll(/^'|'$/g, "");
|
|
418
|
+
}
|
|
294
419
|
}
|
|
420
|
+
const specimen: JxMutableNode = { tagName: comp.tagName };
|
|
421
|
+
if (Object.keys(attributes).length > 0) {
|
|
422
|
+
specimen.attributes = attributes;
|
|
423
|
+
}
|
|
424
|
+
return cardNode(comp.tagName, `<${comp.tagName}>`, specimen, cardPath, null);
|
|
295
425
|
}
|
|
296
|
-
const specimen = {
|
|
297
|
-
tagName: comp.tagName,
|
|
298
|
-
...(Object.keys(attributes).length > 0 ? { attributes } : {}),
|
|
299
|
-
} as JxMutableNode;
|
|
300
|
-
return cardNode(comp.tagName, `<${comp.tagName}>`, specimen, cardPath, null);
|
|
301
426
|
}
|
|
302
427
|
// Npm/format-class components can't be $ref-registered — placeholder box (legacy parity).
|
|
303
|
-
const fallback = {
|
|
428
|
+
const fallback: JxMutableNode = {
|
|
304
429
|
attributes: { class: "sb-fallback" },
|
|
305
430
|
tagName: "div",
|
|
306
431
|
textContent: `<${comp.tagName}>`,
|
|
307
|
-
}
|
|
432
|
+
};
|
|
308
433
|
return cardNode(comp.tagName, `<${comp.tagName}>`, fallback, cardPath, null);
|
|
309
434
|
});
|
|
310
435
|
sections.push(sectionNode("Components", cards));
|
|
@@ -316,17 +441,27 @@ export function buildStylebookDoc(opts: BuildStylebookDocOpts): StylebookDocResu
|
|
|
316
441
|
attributes: { class: "sb-empty" },
|
|
317
442
|
tagName: "div",
|
|
318
443
|
textContent: opts.customizedOnly ? "No customized elements" : "No matching elements",
|
|
319
|
-
}
|
|
444
|
+
});
|
|
320
445
|
}
|
|
321
446
|
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
447
|
+
// Assigned in this order so the posted document keeps its key order: `$elements` leads when present.
|
|
448
|
+
const doc: JxMutableNode = {};
|
|
449
|
+
if ($elements.length > 0) {
|
|
450
|
+
doc.$elements = $elements;
|
|
451
|
+
}
|
|
452
|
+
/* The project's `$head` too: its webfont links are what make `fontFamily: 'Barlow'` render as
|
|
453
|
+
Barlow, and a specimen sheet drawn in the system fallback shows styles the site never has. */
|
|
454
|
+
if (opts.effectiveHead && opts.effectiveHead.length > 0) {
|
|
455
|
+
doc.$head = opts.effectiveHead;
|
|
456
|
+
}
|
|
457
|
+
doc.$media = opts.effectiveMedia;
|
|
458
|
+
if (Object.keys(rootState).length > 0) {
|
|
459
|
+
doc.state = rootState;
|
|
460
|
+
}
|
|
461
|
+
doc.attributes = { class: "sb-root" };
|
|
462
|
+
doc.children = sections;
|
|
463
|
+
doc.style = transposeStylebookStyle(opts.effectiveStyle);
|
|
464
|
+
doc.tagName = "div";
|
|
330
465
|
|
|
331
466
|
return { doc, pathToTag, tagToCardPath };
|
|
332
467
|
}
|