@jxsuite/studio 2.0.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/canvas.html +21 -0
- package/dist/chunks/Overlay.dev-qfjzkms8.js +23 -0
- package/dist/chunks/{Overlay.dev-cszx7yn5.js.map → Overlay.dev-qfjzkms8.js.map} +1 -1
- package/dist/chunks/{adapter-z8fkmbmv.js → adapter-qfnesn5v.js} +2 -2
- package/dist/chunks/{cf-settings-mmyv436d.js → cf-settings-73sh5z4p.js} +3 -3
- package/dist/chunks/{components-0hzentwq.js → components-2bpqp4mq.js} +5 -7
- package/dist/chunks/{components-0hzentwq.js.map → components-2bpqp4mq.js.map} +1 -1
- package/dist/chunks/content-source-34gnkbnn.js +38 -0
- package/dist/chunks/content-source-34gnkbnn.js.map +9 -0
- package/dist/chunks/convert-to-repeater-t8kxre5s.js +258 -0
- package/dist/chunks/convert-to-repeater-t8kxre5s.js.map +10 -0
- package/dist/chunks/extension-sections-6mqydz35.js +301 -0
- package/dist/chunks/extension-sections-6mqydz35.js.map +11 -0
- package/dist/chunks/files-8kn321h1.js +70 -0
- package/dist/chunks/files-8kn321h1.js.map +9 -0
- package/dist/chunks/{format-host-2c188n41.js → format-host-mkwsmt8d.js} +3 -3
- package/dist/chunks/git-panel-tjbr191d.js +51 -0
- package/dist/chunks/git-panel-tjbr191d.js.map +9 -0
- package/dist/chunks/{index-baeg2x3y.js → index-7pxchcce.js} +4 -3
- package/dist/chunks/{index-baeg2x3y.js.map → index-7pxchcce.js.map} +3 -3
- package/dist/chunks/{jx-validate-qx8degj7.js → jx-validate-v6qgknrs.js} +3 -3
- package/dist/chunks/layers-panel-87pb25km.js +58 -0
- package/dist/chunks/layers-panel-87pb25km.js.map +9 -0
- package/dist/chunks/{monaco-setup-zjdp9zdw.js → monaco-setup-e0yh25j4.js} +4 -75
- package/dist/chunks/{monaco-setup-zjdp9zdw.js.map → monaco-setup-e0yh25j4.js.map} +3 -4
- package/dist/chunks/publish-panel-m0fcgdrt.js +21 -0
- package/dist/chunks/publish-panel-m0fcgdrt.js.map +9 -0
- package/dist/chunks/quick-search-rhs6cbsb.js +53 -0
- package/dist/chunks/quick-search-rhs6cbsb.js.map +9 -0
- package/dist/chunks/right-panel-zpdxd98t.js +37 -0
- package/dist/chunks/right-panel-zpdxd98t.js.map +9 -0
- package/dist/chunks/section-registry-zmckaxf4.js +30 -0
- package/dist/chunks/section-registry-zmckaxf4.js.map +9 -0
- package/dist/chunks/sp-overlay.dev-9ran0sfq.js +18 -0
- package/dist/chunks/sp-overlay.dev-9ran0sfq.js.map +9 -0
- package/dist/chunks/sp-popover.dev-rebmdncr.js +9 -0
- package/dist/chunks/sp-popover.dev-rebmdncr.js.map +9 -0
- package/dist/chunks/sp-progress-circle.dev-5vkppfkt.js +15 -0
- package/dist/chunks/sp-progress-circle.dev-5vkppfkt.js.map +9 -0
- package/dist/chunks/sp-tooltip.dev-ykqrg8h5.js +15 -0
- package/dist/chunks/sp-tooltip.dev-ykqrg8h5.js.map +9 -0
- package/dist/chunks/{sp-tray.dev-pb2fsd65.js → sp-tray.dev-ey59vfh7.js} +10 -8
- package/dist/chunks/{sp-tray.dev-pb2fsd65.js.map → sp-tray.dev-ey59vfh7.js.map} +2 -2
- package/dist/chunks/{studio-9qr6fq7p.js → studio-0rqqhrdy.js} +10 -378
- package/dist/chunks/{studio-9qr6fq7p.js.map → studio-0rqqhrdy.js.map} +4 -14
- package/dist/chunks/{studio-5x6tqqec.js → studio-2sj1jj3v.js} +10 -8
- package/dist/chunks/{studio-5x6tqqec.js.map → studio-2sj1jj3v.js.map} +2 -2
- package/dist/chunks/{studio-h3fw0wn8.js → studio-3fk1ac9z.js} +6 -4
- package/dist/chunks/{studio-h3fw0wn8.js.map → studio-3fk1ac9z.js.map} +2 -2
- package/dist/chunks/studio-41exgzhq.js +6690 -0
- package/dist/chunks/studio-41exgzhq.js.map +38 -0
- package/dist/chunks/{studio-7v2bpweq.js → studio-4mqb9a0j.js} +6 -4
- package/dist/chunks/{studio-7v2bpweq.js.map → studio-4mqb9a0j.js.map} +2 -2
- package/dist/chunks/studio-50k77cca.js +1787 -0
- package/dist/chunks/studio-50k77cca.js.map +18 -0
- package/dist/chunks/{studio-56v3zwk6.js → studio-6a0h7sne.js} +10 -8
- package/dist/chunks/{studio-56v3zwk6.js.map → studio-6a0h7sne.js.map} +2 -2
- package/dist/chunks/studio-6f0am8f2.js +53 -0
- package/dist/chunks/studio-6f0am8f2.js.map +10 -0
- package/dist/chunks/studio-6nmjc5qk.js +7002 -0
- package/dist/chunks/studio-6nmjc5qk.js.map +32 -0
- package/dist/chunks/studio-7afd21nw.js +67 -0
- package/dist/chunks/studio-7afd21nw.js.map +10 -0
- package/dist/chunks/{studio-xze4zrs1.js → studio-7bmdvzne.js} +2 -2
- package/dist/chunks/studio-7bmdvzne.js.map +10 -0
- package/dist/chunks/studio-8jpzqk5s.js +128 -0
- package/dist/chunks/studio-8jpzqk5s.js.map +10 -0
- package/dist/chunks/studio-94m77tgk.js +1482 -0
- package/dist/chunks/studio-94m77tgk.js.map +13 -0
- package/dist/chunks/studio-9je6w5sq.js +1000 -0
- package/dist/chunks/studio-9je6w5sq.js.map +16 -0
- package/dist/chunks/{studio-w7c6kvk7.js → studio-a7pzveq1.js} +2 -2
- package/dist/chunks/{studio-97qcgvdn.js → studio-adn0z1k3.js} +14 -8
- package/dist/chunks/{studio-97qcgvdn.js.map → studio-adn0z1k3.js.map} +3 -3
- package/dist/chunks/{studio-kr88ryr7.js → studio-bsxxx3x2.js} +17 -15
- package/dist/chunks/{studio-kr88ryr7.js.map → studio-bsxxx3x2.js.map} +7 -6
- package/dist/chunks/studio-bw5dz6km.js +608 -0
- package/dist/chunks/studio-bw5dz6km.js.map +21 -0
- package/dist/chunks/studio-c6s5getc.js +4232 -0
- package/dist/chunks/studio-c6s5getc.js.map +39 -0
- package/dist/chunks/studio-cjm7fdjf.js +451 -0
- package/dist/chunks/studio-cjm7fdjf.js.map +14 -0
- package/dist/chunks/{studio-cx91mnh8.js → studio-ckwz4d3x.js} +53 -53
- package/dist/chunks/{studio-cx91mnh8.js.map → studio-ckwz4d3x.js.map} +5 -5
- package/dist/chunks/studio-dg7zyt5x.js +28 -0
- package/dist/chunks/studio-dg7zyt5x.js.map +10 -0
- package/dist/chunks/studio-dzcyvvvz.js +166 -0
- package/dist/chunks/studio-dzcyvvvz.js.map +10 -0
- package/dist/chunks/{studio-7kqe41sa.js → studio-evkr5d3b.js} +15 -7
- package/dist/chunks/{studio-7kqe41sa.js.map → studio-evkr5d3b.js.map} +5 -4
- package/dist/chunks/studio-f12h6177.js +411 -0
- package/dist/chunks/studio-f12h6177.js.map +13 -0
- package/dist/chunks/studio-hbp1s8m9.js +1817 -0
- package/dist/chunks/studio-hbp1s8m9.js.map +14 -0
- package/dist/chunks/studio-k2sxjph5.js +15295 -0
- package/dist/chunks/studio-k2sxjph5.js.map +235 -0
- package/dist/chunks/studio-myje51t3.js +385 -0
- package/dist/chunks/studio-myje51t3.js.map +12 -0
- package/dist/chunks/studio-na6rwzhw.js +353 -0
- package/dist/chunks/studio-na6rwzhw.js.map +11 -0
- package/dist/chunks/{studio-4k0m4fmp.js → studio-p471gg5n.js} +126 -3
- package/dist/chunks/studio-p471gg5n.js.map +14 -0
- package/dist/chunks/{studio-9bjwf0d4.js → studio-rgwcpast.js} +5 -46
- package/dist/chunks/{studio-9bjwf0d4.js.map → studio-rgwcpast.js.map} +4 -5
- package/dist/chunks/{studio-hhj92gcr.js → studio-s519zc99.js} +3 -3
- package/dist/chunks/studio-sas7mt3k.js +75 -0
- package/dist/chunks/studio-sas7mt3k.js.map +10 -0
- package/dist/chunks/studio-t5wqwzdh.js +74 -0
- package/dist/chunks/studio-t5wqwzdh.js.map +10 -0
- package/dist/chunks/{studio-9qpspwfn.js → studio-temv5bw4.js} +5 -5
- package/dist/chunks/{studio-9qpspwfn.js.map → studio-temv5bw4.js.map} +1 -1
- package/dist/chunks/{studio-qkvt37c0.js → studio-tr20m8g8.js} +669 -18
- package/dist/chunks/studio-tr20m8g8.js.map +9 -0
- package/dist/chunks/{studio-ygzav7z5.js → studio-v96qfnww.js} +5514 -4291
- package/dist/chunks/studio-v96qfnww.js.map +54 -0
- package/dist/chunks/studio-vcetc91k.js +659 -0
- package/dist/chunks/studio-vcetc91k.js.map +10 -0
- package/dist/chunks/{studio-n9zmpxjg.js → studio-vmymjefp.js} +2972 -4937
- package/dist/chunks/studio-vmymjefp.js.map +98 -0
- package/dist/chunks/{studio-bghqfmea.js → studio-wwseqyw0.js} +2 -2
- package/dist/chunks/studio-x9hmy5kr.js +390 -0
- package/dist/chunks/studio-x9hmy5kr.js.map +10 -0
- package/dist/chunks/studio-xa0ce0n7.js +335 -0
- package/dist/chunks/studio-xa0ce0n7.js.map +10 -0
- package/dist/chunks/studio-xm3dbxvn.js +378 -0
- package/dist/chunks/studio-xm3dbxvn.js.map +19 -0
- package/dist/chunks/{studio-nqw433kv.js → studio-xmvbhg31.js} +2 -2
- package/dist/chunks/studio-zv37yrfa.js +1054 -0
- package/dist/chunks/studio-zv37yrfa.js.map +13 -0
- package/dist/chunks/{ws-client-q7hkz3j9.js → ws-client-654ts66j.js} +6 -4
- package/dist/chunks/ws-client-654ts66j.js.map +11 -0
- package/dist/iframe-entry.js +668 -230
- package/dist/studio.js +23711 -35185
- package/index.html +35 -4685
- package/package.json +17 -15
- package/src/about/about-modal.ts +42 -11
- package/src/browse/library-commands.ts +240 -0
- package/src/browse/library-layouts.ts +369 -0
- package/src/browse/library-model.ts +396 -0
- package/src/browse/library-pane.ts +1049 -0
- package/src/browse/library-preview.ts +252 -0
- package/src/browse/library-source.ts +150 -0
- package/src/canvas/canvas-helpers.ts +33 -9
- package/src/canvas/canvas-live-render.ts +45 -29
- package/src/canvas/canvas-patcher.ts +151 -31
- package/src/canvas/canvas-perf.ts +46 -7
- package/src/canvas/canvas-render.ts +1092 -220
- package/src/canvas/canvas-surface.ts +240 -0
- package/src/canvas/canvas-utils.ts +1166 -124
- package/src/canvas/iframe-drop.ts +2 -1
- package/src/canvas/iframe-entry.ts +241 -4
- package/src/canvas/iframe-host.ts +1226 -143
- package/src/canvas/iframe-inline-edit.ts +31 -0
- package/src/canvas/iframe-interaction.ts +76 -16
- package/src/canvas/iframe-keys.ts +107 -45
- package/src/canvas/iframe-overlay.ts +38 -1
- package/src/canvas/iframe-protocol.ts +137 -2
- package/src/canvas/iframe-render.ts +70 -2
- package/src/canvas/iframe-slash.ts +6 -0
- package/src/canvas/path-mapping.ts +56 -6
- package/src/canvas/surface-registry.ts +292 -0
- package/src/collab/collab-commands.ts +244 -0
- package/src/collab/collab-session.ts +198 -32
- package/src/collab/collab-state.ts +28 -2
- package/src/collab/presence-chips.ts +100 -9
- package/src/commands/active-registry.ts +42 -0
- package/src/commands/app-commands.ts +176 -0
- package/src/commands/budget.ts +158 -0
- package/src/commands/command-args.ts +253 -0
- package/src/commands/context.ts +387 -0
- package/src/commands/defaults.ts +580 -0
- package/src/commands/keymap.ts +571 -0
- package/src/commands/levels.ts +345 -0
- package/src/commands/live-context.ts +193 -0
- package/src/commands/reference.ts +227 -0
- package/src/commands/registry.ts +293 -0
- package/src/component-props.ts +3 -2
- package/src/content/draft-state.ts +106 -0
- package/src/content/entry-commands.ts +282 -0
- package/src/content/entry-editor.ts +327 -0
- package/src/content/entry-fields.ts +116 -0
- package/src/content/entry-model.ts +175 -0
- package/src/editor/canvas-context-menu.ts +17 -11
- package/src/editor/canvas-slash-bridge.ts +11 -4
- package/src/editor/context-menu.ts +804 -204
- package/src/editor/convert-to-component.ts +31 -10
- package/src/editor/convert-to-repeater.ts +3 -2
- package/src/editor/inline-edit-apply.ts +5 -5
- package/src/editor/inline-edit.ts +86 -50
- package/src/editor/insert-zone-action.ts +1 -1
- package/src/editor/shortcuts.ts +1043 -329
- package/src/editor/slash-menu.ts +1 -0
- package/src/files/elements.ts +166 -0
- package/src/files/file-ops.ts +178 -31
- package/src/files/files.ts +898 -268
- package/src/files/fs-events.ts +21 -0
- package/src/files/media-meta.ts +203 -0
- package/src/files/media-paths.ts +141 -0
- package/src/files/media-upload.ts +7 -3
- package/src/files/media-usage.ts +189 -0
- package/src/github/github-auth.ts +235 -33
- package/src/github/github-publish.ts +80 -21
- package/src/grid/grid-controller.ts +152 -12
- package/src/grid/grid-layout.ts +225 -20
- package/src/grid/grid-open.ts +120 -0
- package/src/grid/grid-panel.ts +554 -39
- package/src/grid/grid-source.ts +27 -1
- package/src/grid/redirects-grid.ts +599 -0
- package/src/grid/redirects.ts +398 -0
- package/src/grid/sources/content-source.ts +108 -2
- package/src/i18n/i18n-commands.ts +322 -0
- package/src/new-project/add-repo-modal.ts +8 -10
- package/src/new-project/import-tab.ts +34 -9
- package/src/new-project/location-fields.ts +9 -1
- package/src/new-project/new-project-modal.ts +270 -262
- package/src/packages/jxsuite-update.ts +97 -48
- package/src/packages/pull-package-sync.ts +18 -9
- package/src/page-params.ts +2 -1
- package/src/panels/activity-bar.ts +152 -91
- package/src/panels/activity-panel.ts +481 -0
- package/src/panels/ai-chat/chat-markdown.ts +8 -3
- package/src/panels/ai-chat/chat-view.ts +245 -18
- package/src/panels/ai-chat/composer.ts +31 -5
- package/src/panels/ai-chat/sessions-view.ts +17 -10
- package/src/panels/ai-panel.ts +279 -120
- package/src/panels/block-action-bar.ts +1115 -224
- package/src/panels/bottom-dock.ts +337 -0
- package/src/panels/canvas-dnd-bridge.ts +37 -8
- package/src/panels/chat-panel.ts +29 -12
- package/src/panels/data-explorer.ts +254 -112
- package/src/panels/data-grid.ts +10 -4
- package/src/panels/dnd.ts +28 -51
- package/src/panels/editors.ts +434 -107
- package/src/panels/elements-panel.ts +66 -2
- package/src/panels/empty-state.ts +112 -0
- package/src/panels/events-panel.ts +596 -82
- package/src/panels/formula-workspace.ts +408 -218
- package/src/panels/frontmatter-fields.ts +51 -10
- package/src/panels/frontmatter-panel.ts +357 -79
- package/src/panels/git-panel.ts +375 -164
- package/src/panels/head-panel.ts +791 -85
- package/src/panels/i18n-panel.ts +592 -0
- package/src/panels/imports-panel.ts +95 -85
- package/src/panels/jump-bar.ts +584 -0
- package/src/panels/layers-panel.ts +1106 -328
- package/src/panels/left-panel.ts +109 -204
- package/src/panels/navigator-panels.ts +131 -0
- package/src/panels/overlays.ts +7 -2
- package/src/panels/pane-context.ts +1477 -0
- package/src/panels/pane-grid.ts +406 -0
- package/src/panels/panel-registry.ts +340 -0
- package/src/panels/panel-scheduler.ts +75 -0
- package/src/panels/problems-panel.ts +234 -0
- package/src/panels/properties-panel.ts +946 -1139
- package/src/panels/provenance.ts +258 -0
- package/src/panels/quick-search.ts +791 -122
- package/src/panels/right-panel.ts +228 -102
- package/src/panels/seo-modal.ts +395 -0
- package/src/panels/settings-pane.ts +203 -0
- package/src/panels/signals-panel.ts +354 -137
- package/src/panels/statement-editor.ts +41 -25
- package/src/panels/statusbar.ts +342 -106
- package/src/panels/style-panel.ts +974 -463
- package/src/panels/style-utils.ts +3 -3
- package/src/panels/stylebook-doc.ts +4 -2
- package/src/panels/stylebook-layers-panel.ts +3 -2
- package/src/panels/stylebook-panel.ts +51 -26
- package/src/panels/tab-strip.ts +1058 -78
- package/src/panels/target-line.ts +274 -0
- package/src/panels/toolbar.ts +631 -484
- package/src/panels/welcome-screen.ts +301 -198
- package/src/platform-errors.ts +26 -3
- package/src/platform.ts +96 -2
- package/src/platforms/cloud.ts +71 -8
- package/src/platforms/devserver.ts +92 -29
- package/src/publish/deploy-checklist.ts +383 -0
- package/src/publish/pages-service.ts +10 -1
- package/src/publish/publish-commands.ts +218 -0
- package/src/publish/publish-panel.ts +110 -16
- package/src/recent-projects.ts +3 -2
- package/src/services/a11y-report.ts +505 -0
- package/src/services/ai-models.ts +75 -2
- package/src/services/ai-project-tools.ts +29 -10
- package/src/services/ai-system-prompt.ts +53 -14
- package/src/services/ai-tools.ts +39 -3
- package/src/services/ai-writes.ts +154 -0
- package/src/services/announce.ts +97 -0
- package/src/services/automation.ts +424 -175
- package/src/services/cem-export.ts +9 -4
- package/src/services/clock.ts +61 -0
- package/src/services/document-assistant.ts +36 -8
- package/src/services/idle.ts +179 -0
- package/src/services/import-client.ts +26 -0
- package/src/services/monaco-buffer.ts +627 -0
- package/src/services/monaco-lazy.ts +36 -0
- package/src/services/notify.ts +271 -0
- package/src/services/profile.ts +155 -0
- package/src/services/references.ts +0 -0
- package/src/services/token-lint.ts +3 -2
- package/src/services/tool-executor.ts +53 -7
- package/src/services/trusted-types.ts +123 -0
- package/src/settings/contexts-section.ts +427 -0
- package/src/settings/contributed-section.ts +149 -11
- package/src/settings/css-vars-editor.ts +306 -349
- package/src/settings/defs-editor.ts +93 -34
- package/src/settings/dependencies-editor.ts +7 -7
- package/src/settings/extension-sections.ts +37 -5
- package/src/settings/general-settings.ts +204 -121
- package/src/settings/locales-section.ts +347 -0
- package/src/settings/preferences-accounts.ts +140 -0
- package/src/settings/preferences-dialog.ts +620 -0
- package/src/settings/preferences-keymap.ts +270 -0
- package/src/settings/project-sections.ts +260 -0
- package/src/settings/section-registry.ts +169 -0
- package/src/settings/settings-document.ts +385 -0
- package/src/shell.ts +1549 -0
- package/src/site-context.ts +45 -20
- package/src/state.ts +14 -275
- package/src/store.ts +88 -43
- package/src/studio.ts +790 -346
- package/src/style/live-preview.ts +36 -0
- package/src/style/project-styles.ts +349 -0
- package/src/style/token-ref.ts +123 -0
- package/src/tabs/patch-ops.ts +16 -4
- package/src/tabs/project-config.ts +416 -0
- package/src/tabs/selection.ts +323 -0
- package/src/tabs/tab.ts +182 -47
- package/src/tabs/transact.ts +209 -28
- package/src/types.ts +68 -13
- package/src/ui/ai-credentials-form.ts +39 -35
- package/src/ui/ai-managed-connect.ts +113 -0
- package/src/ui/dynamic-slot.ts +224 -81
- package/src/ui/expression-editor.ts +71 -63
- package/src/ui/field-input.ts +4 -6
- package/src/ui/field-row.ts +215 -38
- package/src/ui/form-controls.ts +194 -7
- package/src/ui/layers.ts +492 -69
- package/src/ui/media-picker.ts +115 -25
- package/src/ui/panel-resize.ts +109 -91
- package/src/ui/progress-modal.ts +131 -50
- package/src/ui/regions.ts +462 -0
- package/src/ui/schema-form.ts +229 -45
- package/src/ui/spectrum.ts +24 -8
- package/src/ui/timing.ts +49 -0
- package/src/ui/value-selector.ts +20 -0
- package/src/ui/value-source.ts +348 -0
- package/src/ui/virtual-window.ts +400 -0
- package/src/utils/edit-display.ts +3 -2
- package/src/utils/inherited-style.ts +67 -37
- package/src/view.ts +64 -78
- package/src/workspace/pane-derive.ts +1258 -0
- package/src/workspace/session.ts +317 -0
- package/src/workspace/workspace.ts +1345 -23
- package/styles/canvas.css +653 -0
- package/styles/forced-colors.css +106 -0
- package/styles/inspector.css +1454 -0
- package/styles/overlays.css +2704 -0
- package/styles/panels.css +1701 -0
- package/styles/shell.css +1423 -0
- package/styles/tokens.css +151 -0
- package/dist/chunks/Overlay.dev-cszx7yn5.js +0 -22
- package/dist/chunks/extension-sections-qct0gt8f.js +0 -531
- package/dist/chunks/extension-sections-qct0gt8f.js.map +0 -12
- package/dist/chunks/files-02zn5y24.js +0 -50
- package/dist/chunks/files-02zn5y24.js.map +0 -9
- package/dist/chunks/git-panel-mbb0y0hz.js +0 -28
- package/dist/chunks/git-panel-mbb0y0hz.js.map +0 -9
- package/dist/chunks/layers-panel-9qekmqk1.js +0 -26
- package/dist/chunks/layers-panel-9qekmqk1.js.map +0 -9
- package/dist/chunks/settings-modal-gj0hrah4.js +0 -29
- package/dist/chunks/settings-modal-gj0hrah4.js.map +0 -9
- package/dist/chunks/sp-overlay.dev-earn5as8.js +0 -17
- package/dist/chunks/sp-overlay.dev-earn5as8.js.map +0 -9
- package/dist/chunks/sp-popover.dev-frxtfejn.js +0 -8
- package/dist/chunks/sp-popover.dev-frxtfejn.js.map +0 -9
- package/dist/chunks/sp-progress-circle.dev-7tvw34h8.js +0 -14
- package/dist/chunks/sp-progress-circle.dev-7tvw34h8.js.map +0 -9
- package/dist/chunks/sp-tooltip.dev-a9fywesm.js +0 -21
- package/dist/chunks/sp-tooltip.dev-a9fywesm.js.map +0 -10
- package/dist/chunks/studio-4k0m4fmp.js.map +0 -13
- package/dist/chunks/studio-568nx4t5.js +0 -469
- package/dist/chunks/studio-568nx4t5.js.map +0 -14
- package/dist/chunks/studio-9smfzqhc.js +0 -19
- package/dist/chunks/studio-9smfzqhc.js.map +0 -10
- package/dist/chunks/studio-asvf0j9e.js +0 -429
- package/dist/chunks/studio-asvf0j9e.js.map +0 -13
- package/dist/chunks/studio-d77qm3pk.js +0 -3427
- package/dist/chunks/studio-d77qm3pk.js.map +0 -26
- package/dist/chunks/studio-j6gqyjf4.js +0 -1854
- package/dist/chunks/studio-j6gqyjf4.js.map +0 -18
- package/dist/chunks/studio-n9zmpxjg.js.map +0 -115
- package/dist/chunks/studio-qkvt37c0.js.map +0 -9
- package/dist/chunks/studio-rq0vxb19.js +0 -3744
- package/dist/chunks/studio-rq0vxb19.js.map +0 -22
- package/dist/chunks/studio-wd6ewdvd.js +0 -853
- package/dist/chunks/studio-wd6ewdvd.js.map +0 -12
- package/dist/chunks/studio-xq0t7n5t.js +0 -140
- package/dist/chunks/studio-xq0t7n5t.js.map +0 -10
- package/dist/chunks/studio-xze4zrs1.js.map +0 -10
- package/dist/chunks/studio-ygzav7z5.js.map +0 -46
- package/dist/chunks/studio-zmy7241e.js +0 -399
- package/dist/chunks/studio-zmy7241e.js.map +0 -12
- package/dist/chunks/ws-client-q7hkz3j9.js.map +0 -11
- package/src/browse/browse-modal.ts +0 -69
- package/src/browse/browse.ts +0 -904
- package/src/canvas/canvas-diff.ts +0 -216
- package/src/canvas/nested-site-style.ts +0 -58
- package/src/new-project/design-fields.ts +0 -264
- package/src/new-project/templates.ts +0 -61
- package/src/panels/tab-bar.ts +0 -548
- package/src/settings/settings-modal.ts +0 -203
- /package/dist/chunks/{adapter-z8fkmbmv.js.map → adapter-qfnesn5v.js.map} +0 -0
- /package/dist/chunks/{cf-settings-mmyv436d.js.map → cf-settings-73sh5z4p.js.map} +0 -0
- /package/dist/chunks/{format-host-2c188n41.js.map → format-host-mkwsmt8d.js.map} +0 -0
- /package/dist/chunks/{jx-validate-qx8degj7.js.map → jx-validate-v6qgknrs.js.map} +0 -0
- /package/dist/chunks/{studio-w7c6kvk7.js.map → studio-a7pzveq1.js.map} +0 -0
- /package/dist/chunks/{studio-hhj92gcr.js.map → studio-s519zc99.js.map} +0 -0
- /package/dist/chunks/{studio-bghqfmea.js.map → studio-wwseqyw0.js.map} +0 -0
- /package/dist/chunks/{studio-nqw433kv.js.map → studio-xmvbhg31.js.map} +0 -0
package/src/panels/tab-bar.ts
DELETED
|
@@ -1,548 +0,0 @@
|
|
|
1
|
-
/// <reference lib="dom" />
|
|
2
|
-
/**
|
|
3
|
-
* Tab bar — a persistent per-tab settings bar rendered between the tab strip and the edit content.
|
|
4
|
-
* Standardizes Back/breadcrumb navigation, the view settings cluster (preview toggle, layout
|
|
5
|
-
* visibility, dynamic route-param pickers — shown in the edit/design base modes), media feature
|
|
6
|
-
* toggles, and mode actions (Code-mode Export) into a single bar shared by every edit mode.
|
|
7
|
-
*
|
|
8
|
-
* Follows the same module shape as tab-strip.ts: mount(host, ctx) → effectScope/effect → render().
|
|
9
|
-
* The bar renders `nothing` (so `#tab-bar:empty` hides the row) only when no tab is active.
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
import { html, render as litRender, nothing } from "lit-html";
|
|
13
|
-
import { projectState, updateUi } from "../store";
|
|
14
|
-
import { effect, effectScope } from "../reactivity";
|
|
15
|
-
import { activeTab } from "../workspace/workspace";
|
|
16
|
-
import { applyTransform, fitToScreen, resetZoom, setEditZoom } from "../canvas/canvas-utils";
|
|
17
|
-
import { getEffectiveLayoutPath, getEffectiveMedia } from "../site-context";
|
|
18
|
-
import { isSchemeQuery } from "../utils/canvas-media";
|
|
19
|
-
import { dynamicRouteParams, loadParamValues, pagePathsDef } from "../page-params";
|
|
20
|
-
import { componentPropEntries, isComponentDoc } from "../component-props";
|
|
21
|
-
import { mediaDisplayName } from "./shared";
|
|
22
|
-
import type { ParamValues } from "../page-params";
|
|
23
|
-
import type { Tab } from "../tabs/tab";
|
|
24
|
-
import type { DocumentStackEntry, FormulaEditDef, FunctionEditDef, JsonValue } from "../types";
|
|
25
|
-
import type { EffectScope } from "@vue/reactivity";
|
|
26
|
-
import type { TemplateResult } from "lit-html";
|
|
27
|
-
|
|
28
|
-
interface TabBarCtx {
|
|
29
|
-
navigateBack: () => void;
|
|
30
|
-
navigateToLevel: (level: number) => void;
|
|
31
|
-
closeFunctionEditor: () => void;
|
|
32
|
-
closeFormulaWorkspace: () => void;
|
|
33
|
-
exportFile: () => void;
|
|
34
|
-
getCanvasMode: () => string;
|
|
35
|
-
parseMediaEntries: (media: Record<string, string> | null | undefined) => {
|
|
36
|
-
sizeBreakpoints: {
|
|
37
|
-
name: string;
|
|
38
|
-
query: string;
|
|
39
|
-
width: number;
|
|
40
|
-
type: string;
|
|
41
|
-
}[];
|
|
42
|
-
featureQueries: { name: string; query: string }[];
|
|
43
|
-
baseWidth: number;
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
let _host: HTMLElement | null = null;
|
|
48
|
-
|
|
49
|
-
let _ctx: TabBarCtx | null = null;
|
|
50
|
-
|
|
51
|
-
let _scope: EffectScope | null = null;
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* Mount the tab bar into the given host element.
|
|
55
|
-
*
|
|
56
|
-
* @param {HTMLElement} host
|
|
57
|
-
* @param {TabBarCtx} ctx
|
|
58
|
-
*/
|
|
59
|
-
export function mount(host: HTMLElement, ctx: TabBarCtx) {
|
|
60
|
-
_host = host;
|
|
61
|
-
_ctx = ctx;
|
|
62
|
-
_scope = effectScope();
|
|
63
|
-
_scope.run(() => {
|
|
64
|
-
effect(() => {
|
|
65
|
-
const tab = activeTab.value;
|
|
66
|
-
if (tab) {
|
|
67
|
-
// Read reactive properties to establish tracking — mirrors the toolbar's subset
|
|
68
|
-
void tab.doc.document;
|
|
69
|
-
void tab.doc.document?.$layout;
|
|
70
|
-
void tab.doc.mode;
|
|
71
|
-
void tab.documentPath;
|
|
72
|
-
void tab.session.documentStack.length;
|
|
73
|
-
void tab.session.ui.canvasMode;
|
|
74
|
-
void tab.session.ui.editZoom;
|
|
75
|
-
void tab.session.ui.editingFormula;
|
|
76
|
-
void tab.session.ui.editingFunction;
|
|
77
|
-
void tab.session.ui.featureToggles;
|
|
78
|
-
void tab.session.ui.preview;
|
|
79
|
-
void tab.session.ui.previewColorScheme;
|
|
80
|
-
void tab.session.ui.previewParams;
|
|
81
|
-
void tab.session.ui.previewProps;
|
|
82
|
-
void tab.session.ui.showLayout;
|
|
83
|
-
void tab.session.ui.zoom;
|
|
84
|
-
}
|
|
85
|
-
render();
|
|
86
|
-
});
|
|
87
|
-
});
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
export function unmount() {
|
|
91
|
-
_scope?.stop();
|
|
92
|
-
_scope = null;
|
|
93
|
-
_host = null;
|
|
94
|
-
_ctx = null;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
export function render() {
|
|
98
|
-
if (!_host || !_ctx) {
|
|
99
|
-
return;
|
|
100
|
-
}
|
|
101
|
-
try {
|
|
102
|
-
litRender(tabBarTemplate(_ctx), _host);
|
|
103
|
-
} catch (error) {
|
|
104
|
-
console.error("tab-bar render error:", error);
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
function tabBarTemplate(ctx: TabBarCtx): TemplateResult | typeof nothing {
|
|
109
|
-
const tab = activeTab.value;
|
|
110
|
-
if (!tab) {
|
|
111
|
-
return nothing;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
const S = {
|
|
115
|
-
document: tab.doc.document,
|
|
116
|
-
documentPath: tab.documentPath,
|
|
117
|
-
documentStack: tab.session.documentStack,
|
|
118
|
-
ui: tab.session.ui,
|
|
119
|
-
};
|
|
120
|
-
const canvasMode = ctx.getCanvasMode();
|
|
121
|
-
const editing = S.ui.editingFunction as FunctionEditDef | null;
|
|
122
|
-
const formulaEditing = S.ui.editingFormula as FormulaEditDef | null;
|
|
123
|
-
// Any full-screen canvas takeover (function editor or formula workspace) suppresses the zoom
|
|
124
|
-
// Widget, the view-settings cluster, and the Export action below.
|
|
125
|
-
const takeover = Boolean(editing) || Boolean(formulaEditing);
|
|
126
|
-
const hasStack = S.documentStack && S.documentStack.length > 0;
|
|
127
|
-
|
|
128
|
-
// ── Left region: navigation context (function editor > formula workspace > document stack) ──
|
|
129
|
-
let navTpl: TemplateResult | typeof nothing = nothing;
|
|
130
|
-
if (editing) {
|
|
131
|
-
const docName = S.documentPath?.split("/").pop() || S.document?.tagName || "document";
|
|
132
|
-
const funcLabel = editing.type === "def" ? `ƒ ${editing.defName}` : `ƒ ${editing.eventKey}`;
|
|
133
|
-
navTpl = html`
|
|
134
|
-
<div class="breadcrumb">
|
|
135
|
-
<sp-action-button size="s" title="Close editor" @click=${ctx.closeFunctionEditor}>
|
|
136
|
-
<sp-icon-back slot="icon"></sp-icon-back>
|
|
137
|
-
Back
|
|
138
|
-
</sp-action-button>
|
|
139
|
-
<span class="breadcrumb-item">${docName}</span>
|
|
140
|
-
<span class="breadcrumb-sep"> › </span>
|
|
141
|
-
<span class="breadcrumb-item current">${funcLabel}</span>
|
|
142
|
-
</div>
|
|
143
|
-
`;
|
|
144
|
-
} else if (formulaEditing) {
|
|
145
|
-
const docName = S.documentPath?.split("/").pop() || S.document?.tagName || "document";
|
|
146
|
-
const formulaLabel =
|
|
147
|
-
formulaEditing.type === "def"
|
|
148
|
-
? `fx ${formulaEditing.defName}`
|
|
149
|
-
: `fx ${formulaEditing.eventKey}`;
|
|
150
|
-
navTpl = html`
|
|
151
|
-
<div class="breadcrumb">
|
|
152
|
-
<sp-action-button
|
|
153
|
-
size="s"
|
|
154
|
-
title="Close formula workspace"
|
|
155
|
-
@click=${ctx.closeFormulaWorkspace}
|
|
156
|
-
>
|
|
157
|
-
<sp-icon-back slot="icon"></sp-icon-back>
|
|
158
|
-
Back
|
|
159
|
-
</sp-action-button>
|
|
160
|
-
<span class="breadcrumb-item">${docName}</span>
|
|
161
|
-
<span class="breadcrumb-sep"> › </span>
|
|
162
|
-
<span class="breadcrumb-item current">${formulaLabel}</span>
|
|
163
|
-
</div>
|
|
164
|
-
`;
|
|
165
|
-
} else if (hasStack) {
|
|
166
|
-
navTpl = html`
|
|
167
|
-
<div class="breadcrumb">
|
|
168
|
-
<sp-action-button size="s" title="Return to parent document" @click=${ctx.navigateBack}>
|
|
169
|
-
<sp-icon-back slot="icon"></sp-icon-back>
|
|
170
|
-
Back
|
|
171
|
-
</sp-action-button>
|
|
172
|
-
${S.documentStack.map(
|
|
173
|
-
(frame: DocumentStackEntry, i: number) => html`
|
|
174
|
-
<span class="breadcrumb-item clickable" @click=${() => ctx.navigateToLevel(i)}
|
|
175
|
-
>${frame.documentPath?.split("/").pop() || "untitled"}</span
|
|
176
|
-
>
|
|
177
|
-
<span class="breadcrumb-sep"> › </span>
|
|
178
|
-
`,
|
|
179
|
-
)}
|
|
180
|
-
<span class="breadcrumb-item current">
|
|
181
|
-
${S.documentPath?.split("/").pop() || S.document?.tagName || "document"}
|
|
182
|
-
</span>
|
|
183
|
-
</div>
|
|
184
|
-
`;
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
// ── Left region: zoom widget (every mode with a zoom concept) ──
|
|
188
|
-
// Gates on the EFFECTIVE mode: edit drives the content-reflow `editZoom`, while design /
|
|
189
|
-
// Stylebook / git-diff / preview all render on the panzoom surface and drive `ui.zoom` (with the
|
|
190
|
-
// Panzoom-only fit-to-screen action).
|
|
191
|
-
let zoomTpl: TemplateResult | typeof nothing = nothing;
|
|
192
|
-
if (!takeover && canvasMode === "edit") {
|
|
193
|
-
const editZoom = S.ui.editZoom ?? 1;
|
|
194
|
-
zoomTpl = html`
|
|
195
|
-
<sp-action-group compact size="s" class="tb-zoom">
|
|
196
|
-
<sp-action-button
|
|
197
|
-
size="s"
|
|
198
|
-
title="Zoom out (Ctrl+-)"
|
|
199
|
-
@click=${() => setEditZoom((tab.session.ui.editZoom ?? 1) / 1.2)}
|
|
200
|
-
>
|
|
201
|
-
−
|
|
202
|
-
</sp-action-button>
|
|
203
|
-
<sp-action-button
|
|
204
|
-
size="s"
|
|
205
|
-
class="tb-zoom-label"
|
|
206
|
-
title="Reset to 100% (Ctrl+0)"
|
|
207
|
-
@click=${() => setEditZoom(1)}
|
|
208
|
-
>
|
|
209
|
-
${Math.round(editZoom * 100)}%
|
|
210
|
-
</sp-action-button>
|
|
211
|
-
<sp-action-button
|
|
212
|
-
size="s"
|
|
213
|
-
title="Zoom in (Ctrl+=)"
|
|
214
|
-
@click=${() => setEditZoom((tab.session.ui.editZoom ?? 1) * 1.2)}
|
|
215
|
-
>
|
|
216
|
-
+
|
|
217
|
-
</sp-action-button>
|
|
218
|
-
</sp-action-group>
|
|
219
|
-
`;
|
|
220
|
-
} else if (
|
|
221
|
-
!takeover &&
|
|
222
|
-
(canvasMode === "design" ||
|
|
223
|
-
canvasMode === "stylebook" ||
|
|
224
|
-
canvasMode === "git-diff" ||
|
|
225
|
-
canvasMode === "preview")
|
|
226
|
-
) {
|
|
227
|
-
const zoom = S.ui.zoom ?? 1;
|
|
228
|
-
const setPanZoom = (next: number) => {
|
|
229
|
-
tab.session.ui.zoom = Math.min(5, Math.max(0.05, next));
|
|
230
|
-
applyTransform();
|
|
231
|
-
};
|
|
232
|
-
zoomTpl = html`
|
|
233
|
-
<sp-action-group compact size="s" class="tb-zoom">
|
|
234
|
-
<sp-action-button
|
|
235
|
-
size="s"
|
|
236
|
-
title="Zoom out (Ctrl+-)"
|
|
237
|
-
@click=${() => setPanZoom((tab.session.ui.zoom ?? 1) / 1.2)}
|
|
238
|
-
>
|
|
239
|
-
−
|
|
240
|
-
</sp-action-button>
|
|
241
|
-
<sp-action-button
|
|
242
|
-
size="s"
|
|
243
|
-
class="tb-zoom-label"
|
|
244
|
-
title="Reset to 100% (Ctrl+0)"
|
|
245
|
-
@click=${() => resetZoom()}
|
|
246
|
-
>
|
|
247
|
-
${Math.round(zoom * 100)}%
|
|
248
|
-
</sp-action-button>
|
|
249
|
-
<sp-action-button
|
|
250
|
-
size="s"
|
|
251
|
-
title="Zoom in (Ctrl+=)"
|
|
252
|
-
@click=${() => setPanZoom((tab.session.ui.zoom ?? 1) * 1.2)}
|
|
253
|
-
>
|
|
254
|
-
+
|
|
255
|
-
</sp-action-button>
|
|
256
|
-
<sp-action-button size="s" title="Fit to screen" @click=${() => fitToScreen()}>
|
|
257
|
-
Fit
|
|
258
|
-
</sp-action-button>
|
|
259
|
-
</sp-action-group>
|
|
260
|
-
`;
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
// ── Right region: view settings cluster (edit/design base modes only) ──
|
|
264
|
-
// Gates on the BASE mode (not the effective mode): the cluster stays visible while the preview
|
|
265
|
-
// Toggle is on so it can be toggled back off.
|
|
266
|
-
const baseMode = S.ui.canvasMode;
|
|
267
|
-
const isPage = Boolean(
|
|
268
|
-
S.documentPath &&
|
|
269
|
-
projectState?.isSiteProject &&
|
|
270
|
-
(S.documentPath.startsWith("pages/") || S.documentPath.startsWith("./pages/")),
|
|
271
|
-
);
|
|
272
|
-
let settingsTpl: TemplateResult | typeof nothing = nothing;
|
|
273
|
-
if (!takeover && (baseMode === "edit" || baseMode === "design")) {
|
|
274
|
-
const canPreview = tab.capabilities.modes.includes("preview");
|
|
275
|
-
const hasLayout = isPage && Boolean(getEffectiveLayoutPath(S.document?.$layout));
|
|
276
|
-
// Pages get route-param pickers; component docs get test-prop fields (M6) — same slot.
|
|
277
|
-
const pickersTpl = isPage ? paramPickersTpl(tab) : propFieldsTpl(tab);
|
|
278
|
-
const previewTpl = canPreview
|
|
279
|
-
? html`
|
|
280
|
-
<sp-action-button
|
|
281
|
-
toggles
|
|
282
|
-
size="s"
|
|
283
|
-
title="Preview resolved values"
|
|
284
|
-
?selected=${Boolean(S.ui.preview)}
|
|
285
|
-
@click=${() => updateUi("preview", !S.ui.preview)}
|
|
286
|
-
>
|
|
287
|
-
<sp-icon-preview slot="icon"></sp-icon-preview>
|
|
288
|
-
Preview
|
|
289
|
-
</sp-action-button>
|
|
290
|
-
`
|
|
291
|
-
: nothing;
|
|
292
|
-
const layoutTpl = hasLayout
|
|
293
|
-
? html`
|
|
294
|
-
<sp-action-button
|
|
295
|
-
toggles
|
|
296
|
-
size="s"
|
|
297
|
-
title="Show layout elements"
|
|
298
|
-
?selected=${S.ui.showLayout !== false}
|
|
299
|
-
@click=${() => updateUi("showLayout", S.ui.showLayout === false)}
|
|
300
|
-
>
|
|
301
|
-
Layout
|
|
302
|
-
</sp-action-button>
|
|
303
|
-
`
|
|
304
|
-
: nothing;
|
|
305
|
-
if (pickersTpl !== nothing || previewTpl !== nothing || layoutTpl !== nothing) {
|
|
306
|
-
settingsTpl = html`
|
|
307
|
-
${pickersTpl}
|
|
308
|
-
<sp-action-group compact size="s">${layoutTpl} ${previewTpl}</sp-action-group>
|
|
309
|
-
`;
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
// ── Right region: color-scheme preview (projects that declare a scheme query, spec §9.5) ──
|
|
314
|
-
// One switch per tab: drives the canvas data-color-scheme attribute and (in the style
|
|
315
|
-
// Sidebar) which scheme layer edits target. Ungated — works in every canvas mode.
|
|
316
|
-
const { featureQueries } = ctx.parseMediaEntries(getEffectiveMedia(S.document?.$media));
|
|
317
|
-
const schemeQueries = featureQueries.filter(({ query }) => isSchemeQuery(query));
|
|
318
|
-
const plainQueries = featureQueries.filter(({ query }) => !isSchemeQuery(query));
|
|
319
|
-
const scheme = S.ui.previewColorScheme ?? "auto";
|
|
320
|
-
const schemeTpl =
|
|
321
|
-
schemeQueries.length > 0
|
|
322
|
-
? html`
|
|
323
|
-
<sp-action-group compact size="s" class="tb-scheme">
|
|
324
|
-
${(
|
|
325
|
-
[
|
|
326
|
-
["auto", "Auto", "Follow the OS color scheme"],
|
|
327
|
-
["light", "Light", "Force the light scheme"],
|
|
328
|
-
["dark", "Dark", "Force the dark scheme"],
|
|
329
|
-
] as const
|
|
330
|
-
).map(
|
|
331
|
-
([value, label, title]) => html`
|
|
332
|
-
<sp-action-button
|
|
333
|
-
toggles
|
|
334
|
-
size="s"
|
|
335
|
-
title=${title}
|
|
336
|
-
?selected=${scheme === value}
|
|
337
|
-
@click=${() => updateUi("previewColorScheme", value)}
|
|
338
|
-
>
|
|
339
|
-
${label}
|
|
340
|
-
</sp-action-button>
|
|
341
|
-
`,
|
|
342
|
-
)}
|
|
343
|
-
</sp-action-group>
|
|
344
|
-
`
|
|
345
|
-
: nothing;
|
|
346
|
-
|
|
347
|
-
// ── Right region: media feature toggles (non-scheme queries) ──
|
|
348
|
-
const togglesTpl =
|
|
349
|
-
plainQueries.length > 0
|
|
350
|
-
? html`
|
|
351
|
-
<sp-action-group compact size="s">
|
|
352
|
-
${plainQueries.map(
|
|
353
|
-
({ name, query }: { name: string; query: string }) => html`
|
|
354
|
-
<sp-action-button
|
|
355
|
-
toggles
|
|
356
|
-
size="s"
|
|
357
|
-
title=${query}
|
|
358
|
-
?selected=${Boolean(S.ui.featureToggles[name])}
|
|
359
|
-
@click=${() => {
|
|
360
|
-
const newToggles = {
|
|
361
|
-
...S.ui.featureToggles,
|
|
362
|
-
[name]: !S.ui.featureToggles[name],
|
|
363
|
-
};
|
|
364
|
-
updateUi("featureToggles", newToggles);
|
|
365
|
-
}}
|
|
366
|
-
>
|
|
367
|
-
${mediaDisplayName(name)}
|
|
368
|
-
</sp-action-button>
|
|
369
|
-
`,
|
|
370
|
-
)}
|
|
371
|
-
</sp-action-group>
|
|
372
|
-
`
|
|
373
|
-
: nothing;
|
|
374
|
-
|
|
375
|
-
// ── Right region: mode actions (Code-mode Export) ──
|
|
376
|
-
const exportTpl =
|
|
377
|
-
!takeover && canvasMode === "source"
|
|
378
|
-
? html`
|
|
379
|
-
<sp-action-button size="s" @click=${ctx.exportFile}>
|
|
380
|
-
<sp-icon-export slot="icon"></sp-icon-export>
|
|
381
|
-
Export
|
|
382
|
-
</sp-action-button>
|
|
383
|
-
`
|
|
384
|
-
: nothing;
|
|
385
|
-
|
|
386
|
-
return html`
|
|
387
|
-
<div class="tab-bar">
|
|
388
|
-
${navTpl} ${zoomTpl}
|
|
389
|
-
<div class="tb-spacer"></div>
|
|
390
|
-
${settingsTpl} ${schemeTpl} ${togglesTpl} ${exportTpl}
|
|
391
|
-
</div>
|
|
392
|
-
`;
|
|
393
|
-
}
|
|
394
|
-
|
|
395
|
-
// ── Dynamic route-param pickers ──────────────────────────────────────────────
|
|
396
|
-
// Candidate values load asynchronously (ContentCollection resolution / data-file read); the module
|
|
397
|
-
// Caches the last result per (documentPath, $paths) and re-renders when it lands — the same lazy
|
|
398
|
-
// Fill pattern as head-panel's loadLayoutEntries. When values arrive, any param without a chosen
|
|
399
|
-
// Value auto-selects the first candidate (matching the compiler, whose first expanded route is the
|
|
400
|
-
// First path entry).
|
|
401
|
-
|
|
402
|
-
let _paramValues: ParamValues | null = null;
|
|
403
|
-
|
|
404
|
-
let _paramValuesKey: string | null = null;
|
|
405
|
-
|
|
406
|
-
/**
|
|
407
|
-
* @param {Tab} tab
|
|
408
|
-
* @returns {ParamValues | null} — null while loading (or when the doc declares no params)
|
|
409
|
-
*/
|
|
410
|
-
function paramValuesFor(tab: Tab): ParamValues | null {
|
|
411
|
-
const pathsDef = pagePathsDef({
|
|
412
|
-
document: tab.doc.document,
|
|
413
|
-
frontmatter: tab.doc.content.frontmatter,
|
|
414
|
-
});
|
|
415
|
-
if (!pathsDef && dynamicRouteParams(tab.documentPath).length === 0) {
|
|
416
|
-
return null;
|
|
417
|
-
}
|
|
418
|
-
const key = `${tab.documentPath ?? ""}::${JSON.stringify(pathsDef)}`;
|
|
419
|
-
if (_paramValuesKey === key) {
|
|
420
|
-
return _paramValues;
|
|
421
|
-
}
|
|
422
|
-
_paramValuesKey = key;
|
|
423
|
-
_paramValues = null;
|
|
424
|
-
void loadParamValues(tab.documentPath, pathsDef).then((values) => {
|
|
425
|
-
if (_paramValuesKey !== key || activeTab.value !== tab) {
|
|
426
|
-
return;
|
|
427
|
-
}
|
|
428
|
-
_paramValues = values;
|
|
429
|
-
autoSelectParams(tab, values);
|
|
430
|
-
render();
|
|
431
|
-
});
|
|
432
|
-
return _paramValues;
|
|
433
|
-
}
|
|
434
|
-
|
|
435
|
-
/**
|
|
436
|
-
* @param {Tab} tab
|
|
437
|
-
* @param {ParamValues} values
|
|
438
|
-
*/
|
|
439
|
-
function autoSelectParams(tab: Tab, values: ParamValues) {
|
|
440
|
-
const current = tab.session.ui.previewParams ?? {};
|
|
441
|
-
const additions: Record<string, string> = {};
|
|
442
|
-
for (const [name, list] of Object.entries(values)) {
|
|
443
|
-
if (!current[name] && list.length > 0) {
|
|
444
|
-
additions[name] = list[0]!;
|
|
445
|
-
}
|
|
446
|
-
}
|
|
447
|
-
if (Object.keys(additions).length > 0) {
|
|
448
|
-
updateUi("previewParams", { ...current, ...additions });
|
|
449
|
-
}
|
|
450
|
-
}
|
|
451
|
-
|
|
452
|
-
/**
|
|
453
|
-
* @param {Tab} tab
|
|
454
|
-
* @returns {TemplateResult | typeof nothing}
|
|
455
|
-
*/
|
|
456
|
-
function paramPickersTpl(tab: Tab): TemplateResult | typeof nothing {
|
|
457
|
-
const values = paramValuesFor(tab);
|
|
458
|
-
const names = new Set(dynamicRouteParams(tab.documentPath));
|
|
459
|
-
for (const name of Object.keys(values ?? {})) {
|
|
460
|
-
names.add(name);
|
|
461
|
-
}
|
|
462
|
-
if (names.size === 0) {
|
|
463
|
-
return nothing;
|
|
464
|
-
}
|
|
465
|
-
const { previewParams } = tab.session.ui;
|
|
466
|
-
return html`
|
|
467
|
-
${[...names].map(
|
|
468
|
-
(name) => html`
|
|
469
|
-
<sp-picker
|
|
470
|
-
size="s"
|
|
471
|
-
quiet
|
|
472
|
-
class="tab-bar-param"
|
|
473
|
-
label=${name}
|
|
474
|
-
title=${`Preview value for [${name}]`}
|
|
475
|
-
value=${previewParams?.[name] ?? ""}
|
|
476
|
-
@change=${(e: Event) => {
|
|
477
|
-
const { value } = e.target as HTMLInputElement;
|
|
478
|
-
updateUi("previewParams", { ...tab.session.ui.previewParams, [name]: value });
|
|
479
|
-
}}
|
|
480
|
-
>
|
|
481
|
-
${(values?.[name] ?? []).map(
|
|
482
|
-
(v: string) => html`<sp-menu-item value=${v}>${v}</sp-menu-item>`,
|
|
483
|
-
)}
|
|
484
|
-
</sp-picker>
|
|
485
|
-
`,
|
|
486
|
-
)}
|
|
487
|
-
`;
|
|
488
|
-
}
|
|
489
|
-
|
|
490
|
-
// ── Component test-prop fields (M6) ──────────────────────────────────────────
|
|
491
|
-
// The previewParams mirror for component docs: one small field per prop entry (the doc's
|
|
492
|
-
// Plain-data state entries), committed on change so typing never re-renders the bar mid-edit. A
|
|
493
|
-
// Value parses as JSON when it can (numbers, booleans, arrays) and falls back to the raw string;
|
|
494
|
-
// Clearing a field removes the override so the prop returns to its authored default.
|
|
495
|
-
|
|
496
|
-
/**
|
|
497
|
-
* @param {string} raw
|
|
498
|
-
* @returns {JsonValue}
|
|
499
|
-
*/
|
|
500
|
-
function parsePropValue(raw: string): JsonValue {
|
|
501
|
-
try {
|
|
502
|
-
return JSON.parse(raw) as JsonValue;
|
|
503
|
-
} catch {
|
|
504
|
-
return raw;
|
|
505
|
-
}
|
|
506
|
-
}
|
|
507
|
-
|
|
508
|
-
/**
|
|
509
|
-
* @param {Tab} tab
|
|
510
|
-
* @returns {TemplateResult | typeof nothing}
|
|
511
|
-
*/
|
|
512
|
-
function propFieldsTpl(tab: Tab): TemplateResult | typeof nothing {
|
|
513
|
-
const doc = tab.doc.document;
|
|
514
|
-
if (!isComponentDoc(doc)) {
|
|
515
|
-
return nothing;
|
|
516
|
-
}
|
|
517
|
-
const entries = componentPropEntries(doc);
|
|
518
|
-
if (entries.length === 0) {
|
|
519
|
-
return nothing;
|
|
520
|
-
}
|
|
521
|
-
const { previewProps } = tab.session.ui;
|
|
522
|
-
const display = (v: JsonValue | undefined) =>
|
|
523
|
-
v === undefined ? "" : typeof v === "string" ? v : JSON.stringify(v);
|
|
524
|
-
return html`
|
|
525
|
-
${entries.map(
|
|
526
|
-
({ name }) => html`
|
|
527
|
-
<sp-textfield
|
|
528
|
-
size="s"
|
|
529
|
-
quiet
|
|
530
|
-
class="tab-bar-prop"
|
|
531
|
-
placeholder=${name}
|
|
532
|
-
title=${`Test value for ${name}`}
|
|
533
|
-
.value=${display(previewProps?.[name])}
|
|
534
|
-
@change=${(e: Event) => {
|
|
535
|
-
const raw = (e.target as HTMLInputElement).value;
|
|
536
|
-
const next = { ...tab.session.ui.previewProps };
|
|
537
|
-
if (raw === "") {
|
|
538
|
-
delete next[name];
|
|
539
|
-
} else {
|
|
540
|
-
next[name] = parsePropValue(raw);
|
|
541
|
-
}
|
|
542
|
-
updateUi("previewProps", Object.keys(next).length > 0 ? next : null);
|
|
543
|
-
}}
|
|
544
|
-
></sp-textfield>
|
|
545
|
-
`,
|
|
546
|
-
)}
|
|
547
|
-
`;
|
|
548
|
-
}
|