@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
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/settings/schema-field-ui.ts", "../src/settings/defs-editor.ts", "../src/utils/canvas-media.ts", "../src/settings/css-vars-editor.ts", "../src/utils/google-fonts.ts", "../src/settings/head-editor.ts", "../src/settings/general-settings.ts", "../src/settings/dependencies-editor.ts", "../src/settings/settings-modal.ts"],
|
|
4
|
-
"sourcesContent": [
|
|
5
|
-
"/// <reference lib=\"dom\" />\n/**\n * Schema field UI — shared field-card and add-field-dialog templates for the content types and\n * definitions editors.\n */\n\nimport { html, nothing } from \"lit-html\";\nimport { camelToLabel } from \"../utils/studio-utils\";\n\nexport interface SchemaProperty {\n type?: string;\n properties?: Record<string, SchemaProperty>;\n required?: string[];\n items?: SchemaProperty;\n format?: string;\n $ref?: string;\n}\n\nexport interface FieldHandlers {\n onDelete: (name: string) => void;\n onToggleRequired: (name: string) => void;\n onRename: (oldName: string, newName: string) => void;\n onChangeType: (name: string, newType: string) => void;\n onChangeFormat?: (name: string, format: string) => void;\n onChangeRefTarget?: (name: string, target: string) => void;\n onAddNestedField?: (\n parentName: string,\n state: { name: string; type: string; required: boolean },\n ) => void;\n onDeleteNested?: (parentName: string, childName: string) => void;\n onToggleNestedRequired?: (parentName: string, childName: string) => void;\n onRenameNested?: (parentName: string, oldChild: string, newChild: string) => void;\n onChangeNestedType?: (parentName: string, childName: string, newType: string) => void;\n onChangeNestedFormat?: (parentName: string, childName: string, format: string) => void;\n}\n\nexport const FIELD_TYPES = [\"string\", \"number\", \"boolean\", \"array\", \"object\", \"reference\"];\n\nexport const FORMAT_OPTIONS = [\"\", \"image\", \"date\", \"color\"];\n\n/**\n * Detect the studio field type from a JSON Schema property definition.\n *\n * @param {SchemaProperty} schema\n * @returns {string}\n */\nexport function detectFieldType(schema: SchemaProperty) {\n if (schema.$ref) {\n return \"reference\";\n }\n return schema.type || \"string\";\n}\n\n/**\n * Detect the format from a JSON Schema property definition.\n *\n * @param {SchemaProperty} schema\n * @returns {string}\n */\nexport function detectFieldFormat(schema: SchemaProperty) {\n if (schema.type === \"array\" && schema.items?.format) {\n return schema.items.format;\n }\n return schema.format || \"\";\n}\n\n/**\n * Render a single schema field as an inline-editable form row.\n *\n * @param {string} fieldName\n * @param {SchemaProperty} fieldSchema — JSON Schema property definition\n * @param {boolean} isRequired\n * @param {FieldHandlers} handlers\n * @param {string[]} [contentTypeNames] - Available content type names for reference target picker\n * @returns {import(\"lit-html\").TemplateResult}\n */\nexport function fieldCardTpl(\n fieldName: string,\n fieldSchema: SchemaProperty,\n isRequired: boolean,\n handlers: FieldHandlers,\n contentTypeNames: string[] = [],\n) {\n const type = detectFieldType(fieldSchema);\n const format = detectFieldFormat(fieldSchema);\n const isNested = type === \"object\";\n const isRef = type === \"reference\";\n const nestedProps = fieldSchema.properties || {};\n const nestedRequired = fieldSchema.required || [];\n // Reference targets live under a referenceable project section (e.g. `#/content/<type>`); strip\n // The section prefix generically so any section's targets round-trip.\n const refTarget = fieldSchema.$ref ? fieldSchema.$ref.replace(/^#\\/[^/]+\\//, \"\") : \"\";\n\n return html`\n <div class=\"schema-field-card\">\n <div class=\"schema-field-row\">\n <sp-field-label size=\"s\" class=\"schema-field-label\"\n >${camelToLabel(fieldName)}</sp-field-label\n >\n <sp-textfield\n size=\"s\"\n quiet\n value=${fieldName}\n class=\"schema-field-name-input\"\n @change=${(e: Event) => {\n const target = e.target as HTMLInputElement;\n const newName = target.value.trim();\n if (newName && newName !== fieldName) {\n handlers.onRename(fieldName, newName);\n } else {\n target.value = fieldName;\n }\n }}\n @keydown=${(e: KeyboardEvent) => {\n const target = e.target as HTMLInputElement;\n if (e.key === \"Enter\") {\n target.blur();\n }\n if (e.key === \"Escape\") {\n target.value = fieldName;\n target.blur();\n }\n }}\n ></sp-textfield>\n ${typePickerTpl(type, (newType) => handlers.onChangeType(fieldName, newType))}\n ${\n type === \"string\" || type === \"array\"\n ? formatPickerTpl(format, (f) => {\n if (handlers.onChangeFormat) {\n handlers.onChangeFormat(fieldName, f);\n }\n })\n : nothing\n }\n <sp-switch\n size=\"s\"\n ?checked=${isRequired}\n @change=${() => handlers.onToggleRequired(fieldName)}\n >\n Req\n </sp-switch>\n <sp-action-button\n size=\"xs\"\n quiet\n title=\"Delete field\"\n @click=${() => handlers.onDelete(fieldName)}\n >\n <sp-icon-delete slot=\"icon\"></sp-icon-delete>\n </sp-action-button>\n </div>\n ${\n isRef && contentTypeNames.length > 0\n ? html`\n <div class=\"schema-field-ref-target\">\n <sp-picker\n size=\"s\"\n label=\"Target\"\n value=${refTarget}\n @change=${(e: Event) => {\n if (handlers.onChangeRefTarget) {\n handlers.onChangeRefTarget(fieldName, (e.target as HTMLInputElement).value);\n }\n }}\n >\n ${contentTypeNames.map((n) => html`<sp-menu-item value=${n}>${n}</sp-menu-item>`)}\n </sp-picker>\n </div>\n `\n : nothing\n }\n ${\n isNested\n ? html`\n <div class=\"schema-field-nested\">\n ${Object.entries(nestedProps).map(([name, sub]) =>\n nestedFieldCardTpl(\n fieldName,\n name,\n /** @type {SchemaProperty} */ sub,\n nestedRequired.includes(name),\n handlers,\n ),\n )}\n ${nestedAddFieldTpl(fieldName, handlers)}\n </div>\n `\n : nothing\n }\n </div>\n `;\n}\n\n/**\n * Render a nested (child) field card — same inline-editable pattern but delegates to nested\n * handlers.\n *\n * @param {string} parentName\n * @param {string} childName\n * @param {SchemaProperty} childSchema\n * @param {boolean} isRequired\n * @param {FieldHandlers} handlers\n * @returns {import(\"lit-html\").TemplateResult}\n */\nfunction nestedFieldCardTpl(\n parentName: string,\n childName: string,\n childSchema: SchemaProperty,\n isRequired: boolean,\n handlers: FieldHandlers,\n) {\n const type = detectFieldType(childSchema);\n const format = detectFieldFormat(childSchema);\n\n return html`\n <div class=\"schema-field-card schema-field-card--nested\">\n <div class=\"schema-field-row\">\n <sp-textfield\n size=\"s\"\n quiet\n value=${childName}\n class=\"schema-field-name-input\"\n @change=${(e: Event) => {\n const target = e.target as HTMLInputElement;\n const newName = target.value.trim();\n if (newName && newName !== childName && handlers.onRenameNested) {\n handlers.onRenameNested(parentName, childName, newName);\n } else {\n target.value = childName;\n }\n }}\n @keydown=${(e: KeyboardEvent) => {\n const target = e.target as HTMLInputElement;\n if (e.key === \"Enter\") {\n target.blur();\n }\n if (e.key === \"Escape\") {\n target.value = childName;\n target.blur();\n }\n }}\n ></sp-textfield>\n ${typePickerTpl(type, (newType) => {\n if (handlers.onChangeNestedType) {\n handlers.onChangeNestedType(parentName, childName, newType);\n }\n })}\n ${\n type === \"string\" || type === \"array\"\n ? formatPickerTpl(format, (f) => {\n if (handlers.onChangeNestedFormat) {\n handlers.onChangeNestedFormat(parentName, childName, f);\n }\n })\n : nothing\n }\n <sp-switch\n size=\"s\"\n ?checked=${isRequired}\n @change=${() => {\n if (handlers.onToggleNestedRequired) {\n handlers.onToggleNestedRequired(parentName, childName);\n }\n }}\n >\n Req\n </sp-switch>\n <sp-action-button\n size=\"xs\"\n quiet\n title=\"Delete field\"\n @click=${() => {\n if (handlers.onDeleteNested) {\n handlers.onDeleteNested(parentName, childName);\n }\n }}\n >\n <sp-icon-delete slot=\"icon\"></sp-icon-delete>\n </sp-action-button>\n </div>\n </div>\n `;\n}\n\n/**\n * Render an inline \"Add Field\" row for nested objects.\n *\n * @param {string} parentName\n * @param {FieldHandlers} handlers\n * @returns {import(\"lit-html\").TemplateResult}\n */\nfunction nestedAddFieldTpl(parentName: string, handlers: FieldHandlers) {\n return html`\n <div class=\"schema-nested-add\">\n <sp-textfield\n size=\"s\"\n placeholder=\"field name\"\n class=\"schema-nested-add-name\"\n @keydown=${(e: KeyboardEvent) => {\n if (e.key === \"Enter\") {\n const target = e.target as HTMLInputElement;\n const row = target.closest(\".schema-nested-add\");\n const name = target.value.trim();\n const typePicker = row?.querySelector(\"sp-picker\") as HTMLInputElement | null;\n const type = typePicker?.value || \"string\";\n if (name && handlers.onAddNestedField) {\n handlers.onAddNestedField(parentName, {\n name,\n required: false,\n type,\n });\n target.value = \"\";\n }\n }\n }}\n ></sp-textfield>\n ${typePickerTpl(\"string\", () => {})}\n <sp-action-button\n size=\"xs\"\n quiet\n title=\"Add nested field\"\n @click=${(e: Event) => {\n const target = e.target as HTMLElement;\n const row = target.closest(\".schema-nested-add\");\n const nameInput = row?.querySelector(\n \".schema-nested-add-name\",\n ) as HTMLInputElement | null;\n const typePicker = row?.querySelector(\"sp-picker\") as HTMLInputElement | null;\n const name = nameInput?.value?.trim();\n const type = typePicker?.value || \"string\";\n if (name && handlers.onAddNestedField) {\n handlers.onAddNestedField(parentName, {\n name,\n required: false,\n type,\n });\n if (nameInput) {\n nameInput.value = \"\";\n }\n }\n }}\n >\n <sp-icon-add slot=\"icon\"></sp-icon-add>\n </sp-action-button>\n </div>\n `;\n}\n\n/**\n * Render the type picker as an sp-picker dropdown.\n *\n * @param {string} value\n * @param {(type: string) => void} onChange\n * @returns {import(\"lit-html\").TemplateResult}\n */\nexport function typePickerTpl(value: string, onChange: (type: string) => void) {\n return html`\n <sp-picker\n size=\"s\"\n label=\"Type\"\n value=${value}\n @change=${(e: Event) => onChange((e.target as HTMLInputElement).value)}\n >\n ${FIELD_TYPES.map((t) => html`<sp-menu-item value=${t}>${t}</sp-menu-item>`)}\n </sp-picker>\n `;\n}\n\n/**\n * Render the format picker as an sp-picker dropdown.\n *\n * @param {string} value\n * @param {(format: string) => void} onChange\n * @returns {import(\"lit-html\").TemplateResult}\n */\nexport function formatPickerTpl(value: string, onChange: (format: string) => void) {\n return html`\n <sp-picker\n size=\"s\"\n label=\"Format\"\n value=${value}\n @change=${(e: Event) => onChange((e.target as HTMLInputElement).value)}\n >\n ${FORMAT_OPTIONS.map((f) => html`<sp-menu-item value=${f}>${f || \"(none)\"}</sp-menu-item>`)}\n </sp-picker>\n `;\n}\n\n/**\n * Render the add-field form (inline, not a dialog).\n *\n * @param {{ name: string; type: string; format: string; required: boolean }} state\n * @param {{\n * onInput: (field: string, value: string | boolean) => void;\n * onConfirm: () => void;\n * onCancel: () => void;\n * }} handlers\n * @returns {import(\"lit-html\").TemplateResult}\n */\nexport function addFieldFormTpl(\n state: { name: string; type: string; format: string; required: boolean },\n handlers: {\n onInput: (field: string, value: string | boolean) => void;\n onConfirm: () => void;\n onCancel: () => void;\n },\n) {\n return html`\n <div class=\"schema-add-field\">\n <sp-textfield\n size=\"s\"\n placeholder=\"Field name\"\n .value=${state.name}\n @input=${(e: Event) => handlers.onInput(\"name\", (e.target as HTMLInputElement).value)}\n @keydown=${(e: KeyboardEvent) => {\n if (e.key === \"Enter\") {\n handlers.onConfirm();\n }\n if (e.key === \"Escape\") {\n handlers.onCancel();\n }\n }}\n ></sp-textfield>\n ${typePickerTpl(state.type, (t) => handlers.onInput(\"type\", t))}\n ${\n state.type === \"string\" || state.type === \"array\"\n ? formatPickerTpl(state.format || \"\", (f) => handlers.onInput(\"format\", f))\n : nothing\n }\n <sp-switch\n size=\"s\"\n ?checked=${state.required}\n @change=${(e: Event) =>\n handlers.onInput(\"required\", (e.target as HTMLInputElement).checked)}\n >\n Required\n </sp-switch>\n <sp-action-button size=\"s\" @click=${handlers.onConfirm}>Add</sp-action-button>\n <sp-action-button size=\"s\" quiet @click=${handlers.onCancel}>Cancel</sp-action-button>\n </div>\n `;\n}\n\n/**\n * Build a JSON Schema property definition from a type and optional format.\n *\n * @param {string} type\n * @param {string} [format]\n * @returns {object}\n */\nexport function schemaForType(type: string, format?: string) {\n switch (type) {\n case \"number\": {\n return { type: \"number\" };\n }\n case \"boolean\": {\n return { type: \"boolean\" };\n }\n case \"array\": {\n return format\n ? { items: { format, type: \"string\" }, type: \"array\" }\n : { items: { type: \"string\" }, type: \"array\" };\n }\n case \"object\": {\n return { properties: {}, required: [], type: \"object\" };\n }\n case \"reference\": {\n return { $ref: \"#/content/\" };\n }\n default: {\n return format ? { format, type: \"string\" } : { type: \"string\" };\n }\n }\n}\n\n/**\n * Generate a YAML frontmatter default value for a given schema type.\n *\n * @param {string} type\n * @param {string} [format]\n * @returns {string}\n */\nexport function yamlDefault(type: string, format?: string) {\n if (format === \"date\") {\n return new Date().toISOString().split(\"T\")[0];\n }\n if (format === \"image\") {\n return '\"\"';\n }\n switch (type) {\n case \"boolean\": {\n return \"false\";\n }\n case \"number\": {\n return \"0\";\n }\n case \"array\": {\n return \"[]\";\n }\n case \"object\": {\n return \"{}\";\n }\n default: {\n return '\"\"';\n }\n }\n}\n",
|
|
6
|
-
"/// <reference lib=\"dom\" />\n/**\n * Definitions Editor — visual editor for project-level $defs (JSON Schema type definitions).\n *\n * Manages entries in project.json `$defs` — reusable type schemas for external datasets, API\n * responses, CMS payloads, etc. Same concept as component-level $defs but scoped to the entire\n * project.\n */\n\nimport { html, render as litRender } from \"lit-html\";\nimport { getPlatform } from \"../platform\";\nimport { projectState } from \"../store\";\nimport { addFieldFormTpl, detectFieldFormat, fieldCardTpl, schemaForType } from \"./schema-field-ui\";\n\nimport type { FieldHandlers, SchemaProperty } from \"./schema-field-ui.js\";\nimport type {\n ContentTypeSchema,\n ContentTypeSchemaField,\n ProjectConfig,\n} from \"@jxsuite/schema/types\";\n\n// ─── Module state ─────────────────────────────────────────────────────────────\n\nlet selectedDef: string | null = null;\nlet showAddField = false;\nlet newFieldState = { format: \"\", name: \"\", required: false, type: \"string\" };\nlet showNewDef = false;\nlet newDefName = \"\";\n\n// ─── Persistence ──────────────────────────────────────────────────────────────\n\nasync function saveProjectConfig() {\n const platform = getPlatform();\n const config = (projectState as { projectConfig: ProjectConfig }).projectConfig;\n await platform.writeFile(\"project.json\", JSON.stringify(config, null, \"\\t\"));\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\n/** Get the selected $def schema object. */\nfunction getSelectedDef(): ContentTypeSchema | undefined {\n const config = projectState?.projectConfig;\n return config?.$defs?.[selectedDef as string] as ContentTypeSchema | undefined;\n}\n\n// ─── Handlers ─────────────────────────────────────────────────────────────────\n\n/** @param {() => void} rerender */\nfunction handleNewDef(rerender: () => void) {\n const name = newDefName.trim();\n if (!name) {\n return;\n }\n\n const config = projectState?.projectConfig;\n if (!config) {\n return;\n }\n if (!config.$defs) {\n config.$defs = {};\n }\n if (config.$defs[name]) {\n return;\n } // Already exists\n\n config.$defs[name] = {\n properties: {},\n required: [],\n type: \"object\",\n };\n\n selectedDef = name;\n showNewDef = false;\n newDefName = \"\";\n rerender();\n void saveProjectConfig();\n}\n\n/** @param {() => void} rerender */\nfunction handleAddField(rerender: () => void) {\n const name = newFieldState.name.trim();\n if (!name || !selectedDef) {\n return;\n }\n\n const def = getSelectedDef();\n if (!def) {\n return;\n }\n\n if (!def.properties) {\n def.properties = {};\n }\n def.properties[name] = schemaForType(newFieldState.type, newFieldState.format || undefined);\n\n if (newFieldState.required) {\n if (!def.required) {\n def.required = [];\n }\n if (!def.required.includes(name)) {\n def.required.push(name);\n }\n }\n\n showAddField = false;\n newFieldState = { format: \"\", name: \"\", required: false, type: \"string\" };\n rerender();\n void saveProjectConfig();\n}\n\n/**\n * @param {string} fieldName\n * @param {() => void} rerender\n */\nfunction handleDeleteField(fieldName: string, rerender: () => void) {\n const def = getSelectedDef();\n if (!def?.properties) {\n return;\n }\n\n delete def.properties[fieldName];\n if (def.required) {\n def.required = def.required.filter((r: string) => r !== fieldName);\n }\n\n rerender();\n void saveProjectConfig();\n}\n\n/**\n * @param {string} fieldName\n * @param {() => void} rerender\n */\nfunction handleToggleRequired(fieldName: string, rerender: () => void) {\n const def = getSelectedDef();\n if (!def) {\n return;\n }\n if (!def.required) {\n def.required = [];\n }\n\n const idx = def.required.indexOf(fieldName);\n if (idx !== -1) {\n def.required.splice(idx, 1);\n } else {\n def.required.push(fieldName);\n }\n\n rerender();\n void saveProjectConfig();\n}\n\n/**\n * @param {string} oldName\n * @param {string} newName\n * @param {() => void} rerender\n */\nfunction handleRenameField(oldName: string, newName: string, rerender: () => void) {\n const def = getSelectedDef();\n if (!def?.properties || !newName || def.properties[newName]) {\n return;\n }\n\n const newProps: Record<string, ContentTypeSchemaField> = {};\n for (const [key, val] of Object.entries(def.properties)) {\n newProps[key === oldName ? newName : key] = val;\n }\n def.properties = newProps;\n\n if (def.required) {\n def.required = def.required.map((r: string) => (r === oldName ? newName : r));\n }\n\n rerender();\n void saveProjectConfig();\n}\n\n/**\n * @param {string} fieldName\n * @param {string} newType\n * @param {() => void} rerender\n */\nfunction handleChangeType(fieldName: string, newType: string, rerender: () => void) {\n const def = getSelectedDef();\n if (!def?.properties?.[fieldName]) {\n return;\n }\n\n const oldFormat =\n newType === \"string\" || newType === \"array\"\n ? detectFieldFormat(def.properties[fieldName])\n : undefined;\n def.properties[fieldName] = schemaForType(newType, oldFormat || undefined);\n rerender();\n void saveProjectConfig();\n}\n\n/**\n * @param {string} fieldName\n * @param {string} format\n * @param {() => void} rerender\n */\nfunction handleChangeFormat(fieldName: string, format: string, rerender: () => void) {\n const def = getSelectedDef();\n if (!def?.properties?.[fieldName]) {\n return;\n }\n\n const prop = def.properties[fieldName];\n const type = prop.type || \"string\";\n def.properties[fieldName] = schemaForType(type, format || undefined);\n rerender();\n void saveProjectConfig();\n}\n\n// ─── Nested field handlers ───────────────────────────────────────────────────\n\n/**\n * @param {string} parentName\n * @param {{ name: string; type: string; required: boolean }} fieldState\n * @param {() => void} rerender\n */\nfunction handleAddNestedField(\n parentName: string,\n fieldState: { name: string; type: string; required: boolean },\n rerender: () => void,\n) {\n const def = getSelectedDef();\n const parent = def?.properties?.[parentName];\n if (!parent) {\n return;\n }\n\n if (!parent.properties) {\n parent.properties = {};\n }\n parent.properties[fieldState.name] = schemaForType(fieldState.type);\n\n if (fieldState.required) {\n if (!parent.required) {\n parent.required = [];\n }\n if (!parent.required.includes(fieldState.name)) {\n parent.required.push(fieldState.name);\n }\n }\n\n rerender();\n void saveProjectConfig();\n}\n\n/**\n * @param {string} parentName\n * @param {string} childName\n * @param {() => void} rerender\n */\nfunction handleDeleteNested(parentName: string, childName: string, rerender: () => void) {\n const def = getSelectedDef();\n const parent = def?.properties?.[parentName];\n if (!parent?.properties) {\n return;\n }\n\n delete parent.properties[childName];\n if (parent.required) {\n parent.required = parent.required.filter((r: string) => r !== childName);\n }\n\n rerender();\n void saveProjectConfig();\n}\n\n/**\n * @param {string} parentName\n * @param {string} childName\n * @param {() => void} rerender\n */\nfunction handleToggleNestedRequired(parentName: string, childName: string, rerender: () => void) {\n const def = getSelectedDef();\n const parent = def?.properties?.[parentName];\n if (!parent) {\n return;\n }\n if (!parent.required) {\n parent.required = [];\n }\n\n const idx = parent.required.indexOf(childName);\n if (idx !== -1) {\n parent.required.splice(idx, 1);\n } else {\n parent.required.push(childName);\n }\n\n rerender();\n void saveProjectConfig();\n}\n\n/**\n * @param {string} parentName\n * @param {string} oldChild\n * @param {string} newChild\n * @param {() => void} rerender\n */\nfunction handleRenameNested(\n parentName: string,\n oldChild: string,\n newChild: string,\n rerender: () => void,\n) {\n const def = getSelectedDef();\n const parent = def?.properties?.[parentName];\n if (!parent?.properties || !newChild || parent.properties[newChild]) {\n return;\n }\n\n const newProps: Record<string, ContentTypeSchemaField> = {};\n for (const [key, val] of Object.entries(parent.properties)) {\n newProps[key === oldChild ? newChild : key] = val;\n }\n parent.properties = newProps;\n\n if (parent.required) {\n parent.required = parent.required.map((r: string) => (r === oldChild ? newChild : r));\n }\n\n rerender();\n void saveProjectConfig();\n}\n\n/**\n * @param {string} parentName\n * @param {string} childName\n * @param {string} newType\n * @param {() => void} rerender\n */\nfunction handleChangeNestedType(\n parentName: string,\n childName: string,\n newType: string,\n rerender: () => void,\n) {\n const def = getSelectedDef();\n const parent = def?.properties?.[parentName];\n if (!parent?.properties?.[childName]) {\n return;\n }\n\n const oldFormat =\n newType === \"string\" || newType === \"array\"\n ? detectFieldFormat(parent.properties[childName])\n : undefined;\n parent.properties[childName] = schemaForType(newType, oldFormat || undefined);\n rerender();\n void saveProjectConfig();\n}\n\n/**\n * @param {string} parentName\n * @param {string} childName\n * @param {string} format\n * @param {() => void} rerender\n */\nfunction handleChangeNestedFormat(\n parentName: string,\n childName: string,\n format: string,\n rerender: () => void,\n) {\n const def = getSelectedDef();\n const parent = def?.properties?.[parentName];\n if (!parent?.properties?.[childName]) {\n return;\n }\n\n const prop = parent.properties[childName];\n const type = prop.type || \"string\";\n parent.properties[childName] = schemaForType(type, format || undefined);\n rerender();\n void saveProjectConfig();\n}\n\n/** @param {() => void} rerender */\nfunction handleDeleteDef(rerender: () => void) {\n if (!selectedDef) {\n return;\n }\n const config = projectState?.projectConfig;\n if (!config?.$defs?.[selectedDef]) {\n return;\n }\n\n delete config.$defs[selectedDef];\n selectedDef = null;\n\n rerender();\n void saveProjectConfig();\n}\n\n// ─── Render ───────────────────────────────────────────────────────────────────\n\n/**\n * Render the definitions editor.\n *\n * @param {HTMLElement} container\n */\nexport function renderDefsEditor(container: HTMLElement) {\n const rerender = () => renderDefsEditor(container);\n const config = projectState?.projectConfig;\n const defs = config?.$defs || {};\n const defNames = Object.keys(defs);\n\n // Left column — def list\n const listTpl = html`\n <div class=\"settings-list-panel\">\n ${defNames.map(\n (name) => html`\n <sp-action-button\n size=\"s\"\n ?selected=${selectedDef === name}\n @click=${() => {\n selectedDef = name;\n showAddField = false;\n rerender();\n }}\n >\n ${name}\n </sp-action-button>\n `,\n )}\n ${\n showNewDef\n ? html`\n <div class=\"settings-inline-form\">\n <sp-textfield\n size=\"s\"\n placeholder=\"TypeName\"\n .value=${newDefName}\n @input=${(e: Event) => {\n newDefName = (e.target as HTMLInputElement).value;\n }}\n @keydown=${(e: KeyboardEvent) => {\n if (e.key === \"Enter\") {\n handleNewDef(rerender);\n }\n if (e.key === \"Escape\") {\n showNewDef = false;\n rerender();\n }\n }}\n ></sp-textfield>\n <sp-action-button size=\"s\" @click=${() => handleNewDef(rerender)}>\n Create\n </sp-action-button>\n </div>\n `\n : html`\n <sp-action-button\n size=\"s\"\n quiet\n @click=${() => {\n showNewDef = true;\n rerender();\n }}\n >\n <sp-icon-add slot=\"icon\"></sp-icon-add> New Definition\n </sp-action-button>\n `\n }\n </div>\n `;\n\n // Right column — schema editor\n let editorTpl;\n if (!selectedDef || !defs[selectedDef]) {\n editorTpl = html`<div class=\"settings-empty-state\">Select or create a type definition</div>`;\n } else {\n const def = defs[selectedDef] as ContentTypeSchema;\n const properties = def.properties || {};\n const required = def.required || [];\n\n const handlers: FieldHandlers = {\n onAddNestedField: (p: string, s: { name: string; type: string; required: boolean }) =>\n handleAddNestedField(p, s, rerender),\n onChangeFormat: (n: string, f: string) => handleChangeFormat(n, f, rerender),\n onChangeNestedFormat: (p: string, c: string, f: string) =>\n handleChangeNestedFormat(p, c, f, rerender),\n onChangeNestedType: (p: string, c: string, t: string) =>\n handleChangeNestedType(p, c, t, rerender),\n onChangeType: (n: string, t: string) => handleChangeType(n, t, rerender),\n onDelete: (n: string) => handleDeleteField(n, rerender),\n onDeleteNested: (p: string, c: string) => handleDeleteNested(p, c, rerender),\n onRename: (oldN: string, newN: string) => handleRenameField(oldN, newN, rerender),\n onRenameNested: (p: string, o: string, n: string) => handleRenameNested(p, o, n, rerender),\n onToggleNestedRequired: (p: string, c: string) => handleToggleNestedRequired(p, c, rerender),\n onToggleRequired: (n: string) => handleToggleRequired(n, rerender),\n };\n\n const fieldCards = Object.entries(properties).map(([name, fieldDef]) =>\n fieldCardTpl(name, fieldDef as SchemaProperty, required.includes(name), handlers),\n );\n\n editorTpl = html`\n <div class=\"settings-editor-panel\">\n <div class=\"settings-editor-header\">\n <h3>${selectedDef}</h3>\n <sp-action-button\n size=\"xs\"\n quiet\n title=\"Delete definition\"\n @click=${() => handleDeleteDef(rerender)}\n >\n <sp-icon-delete slot=\"icon\"></sp-icon-delete>\n </sp-action-button>\n </div>\n <div class=\"schema-field-list\">${fieldCards}</div>\n ${\n showAddField\n ? addFieldFormTpl(newFieldState, {\n onCancel: () => {\n showAddField = false;\n newFieldState = {\n format: \"\",\n name: \"\",\n required: false,\n type: \"string\",\n };\n rerender();\n },\n onConfirm: () => handleAddField(rerender),\n onInput: (field, value) => {\n newFieldState = { ...newFieldState, [field]: value };\n rerender();\n },\n })\n : html`\n <sp-action-button\n size=\"s\"\n quiet\n @click=${() => {\n showAddField = true;\n rerender();\n }}\n >\n <sp-icon-add slot=\"icon\"></sp-icon-add> Add Field\n </sp-action-button>\n `\n }\n </div>\n `;\n }\n\n const tpl = html` <div class=\"settings-two-col\">${listTpl} ${editorTpl}</div> `;\n\n litRender(tpl, container);\n}\n",
|
|
7
|
-
"/// <reference lib=\"dom\" />\n/// <reference lib=\"dom.iterable\" />\n/** Canvas media/breakpoint utilities — pure functions extracted for testability. */\n\nimport { pureSchemeOf } from \"@jxsuite/runtime\";\n\n/**\n * True when a feature query participates in the forced-scheme contract (spec §9.5) — a pure\n * prefers-color-scheme query. These surface as the Auto/Light/Dark control, not generic toggles.\n *\n * @param {string} query\n * @returns {boolean}\n */\nexport function isSchemeQuery(query: string): boolean {\n return pureSchemeOf(query) !== null;\n}\n\n/**\n * The scheme a feature query targets (\"light\" | \"dark\"), or null for non-scheme queries.\n *\n * @param {string} query\n * @returns {\"light\" | \"dark\" | null}\n */\nexport function schemeOfQuery(query: string): \"light\" | \"dark\" | null {\n return pureSchemeOf(query);\n}\n\n/**\n * Classify $media entries into size breakpoints (get a canvas each) and feature queries (rendered\n * as toolbar toggles).\n *\n * @param {Record<string, string> | null | undefined} mediaDef\n * @returns {{\n * sizeBreakpoints: { name: string; query: string; width: number; type: string }[];\n * featureQueries: { name: string; query: string }[];\n * baseWidth: number;\n * }}\n */\nexport function parseMediaEntries(mediaDef?: Record<string, string> | null) {\n if (!mediaDef) {\n return { baseWidth: 320, featureQueries: [], sizeBreakpoints: [] };\n }\n const features = [];\n const sizes = [];\n let baseWidth = 320;\n for (const [name, query] of Object.entries(mediaDef)) {\n if (name === \"--\") {\n const wm = String(query).match(/^(\\d+)\\s*px$/);\n baseWidth = wm ? Number(wm[1]!) : 320;\n continue;\n }\n const minMatch = query.match(/min-width:\\s*([\\d.]+)px/);\n const maxMatch = query.match(/max-width:\\s*([\\d.]+)px/);\n if (minMatch) {\n sizes.push({ name, query, type: \"min\", width: Number(minMatch[1]!) });\n } else if (maxMatch) {\n sizes.push({ name, query, type: \"max\", width: Number(maxMatch[1]!) });\n } else {\n features.push({ name, query });\n }\n }\n sizes.sort((a, b) => (a.type === \"min\" ? a.width - b.width : b.width - a.width));\n return { baseWidth, featureQueries: features, sizeBreakpoints: sizes };\n}\n\n/**\n * Compute which named breakpoints are active at a given canvas width.\n *\n * @param {{ name: string; width: number; type: string }[]} sizeBreakpoints\n * @param {number} canvasWidth\n * @returns {Set<string>}\n */\nexport function activeBreakpointsForWidth(\n sizeBreakpoints: { name: string; width: number; type: string }[],\n canvasWidth: number,\n) {\n const active = new Set<string>();\n for (const bp of sizeBreakpoints) {\n if (bp.type === \"min\" && canvasWidth >= bp.width) {\n active.add(bp.name);\n } else if (bp.type === \"max\" && canvasWidth <= bp.width) {\n active.add(bp.name);\n }\n }\n return active;\n}\n",
|
|
8
|
-
"/// <reference lib=\"dom\" />\n/**\n * CSS Variables editor — form-based editor for managing design tokens. Colors are scheme-aware\n * (per-scheme overrides in `@--dark`-style blocks, spec §9.5); sizes/spacing are media-aware; fonts\n * are neither.\n */\n\nimport { html, render as litRender, nothing } from \"lit-html\";\nimport { ref } from \"lit-html/directives/ref.js\";\nimport { projectState } from \"../store\";\nimport { getEffectiveMedia, updateSiteConfig } from \"../site-context\";\nimport { postSiteStyleToLiveHosts } from \"../canvas/iframe-host\";\nimport { isSchemeQuery, schemeOfQuery } from \"../utils/canvas-media\";\nimport { friendlyNameToVar, varDisplayName } from \"../utils/studio-utils\";\n\nimport type { JxStyle } from \"@jxsuite/schema/types\";\n\n/** A declared scheme query in $media: the block key name plus the scheme it targets. */\nexport interface SchemeEntry {\n name: string;\n scheme: \"light\" | \"dark\";\n}\n\n/** @param {HTMLElement} container */\nexport function renderCssVarsEditor(container: HTMLElement) {\n const config = projectState?.projectConfig || {};\n const rootStyle = config.style || {};\n const media = getEffectiveMedia(config.$media);\n\n /**\n * @type {{\n * color: [string, string | number][];\n * font: [string, string | number][];\n * size: [string, string | number][];\n * other: [string, string | number][];\n * }}\n */\n const groups: {\n color: [string, string | number][];\n font: [string, string | number][];\n size: [string, string | number][];\n other: [string, string | number][];\n } = { color: [], font: [], other: [], size: [] };\n for (const [k, v] of Object.entries(rootStyle)) {\n if (!k.startsWith(\"--\")) {\n continue;\n }\n if (typeof v !== \"string\" && typeof v !== \"number\") {\n continue;\n }\n if (k.startsWith(\"--color\")) {\n groups.color.push([k, v]);\n } else if (k.startsWith(\"--font\")) {\n groups.font.push([k, v]);\n } else if (k.startsWith(\"--size\") || k.startsWith(\"--spacing\") || k.startsWith(\"--radius\")) {\n groups.size.push([k, v]);\n } else {\n groups.other.push([k, v]);\n }\n }\n\n const mediaNames = media\n ? Object.keys(media).filter((m) => m !== \"--\" && !isSchemeQuery(String(media[m])))\n : [];\n const schemeEntries: SchemeEntry[] = media\n ? Object.entries(media).flatMap(([name, query]) => {\n const scheme = schemeOfQuery(String(query));\n return scheme ? [{ name, scheme }] : [];\n })\n : [];\n\n const save = () => {\n void updateSiteConfig({ style: { ...rootStyle } });\n // Live canvas feedback: replace the site-style sheet in place — no re-render needed.\n postSiteStyleToLiveHosts();\n };\n\n const updateVar = (name: string, val: string) => {\n rootStyle[name] = val;\n save();\n };\n\n // Write/clear a per-scheme token override in the scheme's `@--name` block (spec §9.5). An empty\n // Value clears the override (and drops the block when it empties) — the token inherits the base.\n const updateSchemeVar = (schemeName: string, varName: string, val: string) => {\n const key = `@${schemeName}`;\n if (val) {\n const block = (rootStyle[key] ??= {}) as Record<string, unknown>;\n block[varName] = val;\n } else {\n const block = rootStyle[key];\n if (block && typeof block === \"object\") {\n delete (block as Record<string, unknown>)[varName];\n if (Object.keys(block).length === 0) {\n delete rootStyle[key];\n }\n }\n }\n save();\n renderCssVarsEditor(container);\n };\n\n // Without a declared scheme query nothing ever shows the scheme UI (here or in the tab bar) —\n // This is the opt-in affordance for existing projects. Re-render after the async config update\n // Lands (unlike style edits, $media is not mutated in place).\n const enableDarkScheme = () => {\n void updateSiteConfig({\n $media: { ...config.$media, \"--dark\": \"(prefers-color-scheme: dark)\" },\n }).then(() => renderCssVarsEditor(container));\n };\n\n const deleteVar = (name: string) => {\n delete rootStyle[name];\n save();\n renderCssVarsEditor(container);\n };\n\n const addVar = (prefix: string, friendlyName: string, val: string) => {\n const varName = friendlyNameToVar(friendlyName, prefix);\n if (!varName || !val) {\n return;\n }\n rootStyle[varName] = val;\n save();\n renderCssVarsEditor(container);\n };\n\n const tpl = html`\n <div class=\"settings-section\">\n <h3 class=\"settings-section-title\">CSS Variables</h3>\n\n ${renderColorSection(\n groups.color,\n updateVar,\n deleteVar,\n addVar,\n rootStyle,\n schemeEntries,\n updateSchemeVar,\n enableDarkScheme,\n )}\n ${renderFontSection(groups.font, updateVar, deleteVar, addVar)}\n ${renderSizeSection(groups.size, updateVar, deleteVar, addVar, rootStyle, mediaNames)}\n ${\n groups.other.length > 0\n ? renderOtherSection(groups.other, updateVar, deleteVar, addVar, rootStyle, mediaNames)\n : nothing\n }\n </div>\n `;\n\n litRender(tpl, container);\n}\n\n/**\n * @param {[string, string | number][]} vars\n * @param {(name: string, val: string) => void} updateVar\n * @param {(name: string) => void} deleteVar\n * @param {(prefix: string, friendlyName: string, val: string) => void} addVar\n */\nfunction renderColorSection(\n vars: [string, string | number][],\n updateVar: (name: string, val: string) => void,\n deleteVar: (name: string) => void,\n addVar: (prefix: string, friendlyName: string, val: string) => void,\n rootStyle: JxStyle,\n schemeEntries: SchemeEntry[],\n updateSchemeVar: (schemeName: string, varName: string, val: string) => void,\n enableDarkScheme: () => void,\n) {\n return html`\n <div class=\"css-vars-group\">\n <h4 class=\"css-vars-group-title\">Colors</h4>\n ${vars.map(\n ([name, val]) => html`\n <div class=\"css-var-row\">\n <div class=\"css-var-swatch\" style=\"background:${val}\">\n <input\n type=\"color\"\n .value=${val && String(val).startsWith(\"#\") ? val : \"#3b82f6\"}\n @input=${(e: Event) => updateVar(name, (e.target as HTMLInputElement).value)}\n />\n </div>\n <span class=\"css-var-name\">${varDisplayName(name, \"--color-\")}</span>\n <sp-textfield\n size=\"s\"\n .value=${String(val)}\n @change=${(e: Event) => updateVar(name, (e.target as HTMLInputElement).value)}\n style=\"flex:1;max-width:160px\"\n ></sp-textfield>\n <sp-action-button quiet size=\"s\" @click=${() => deleteVar(name)}>\n <sp-icon-delete slot=\"icon\"></sp-icon-delete>\n </sp-action-button>\n </div>\n ${schemeEntries.map((entry) =>\n renderSchemeOverride(name, rootStyle, entry, updateSchemeVar),\n )}\n `,\n )}\n ${renderAddRow(\"--color-\", \"Primary Blue\", \"#3b82f6\", addVar)}\n ${\n schemeEntries.length === 0\n ? html`\n <sp-action-button\n size=\"s\"\n class=\"css-vars-enable-dark\"\n title=\"Add a dark color scheme: declares --dark in $media so every color token can carry a dark value\"\n @click=${enableDarkScheme}\n >\n Enable dark scheme\n </sp-action-button>\n `\n : nothing\n }\n </div>\n `;\n}\n\n/**\n * One per-scheme override row under a color token: swatch + field bound to the scheme block's\n * value. Empty shows \"inherits\" (the base value applies); clearing deletes the override.\n *\n * @param {string} varName\n * @param {JxStyle} rootStyle\n * @param {SchemeEntry} entry\n * @param {(schemeName: string, varName: string, val: string) => void} updateSchemeVar\n */\nfunction renderSchemeOverride(\n varName: string,\n rootStyle: JxStyle,\n entry: SchemeEntry,\n updateSchemeVar: (schemeName: string, varName: string, val: string) => void,\n) {\n const block = rootStyle[`@${entry.name}`];\n const current =\n block && typeof block === \"object\" ? (block as Record<string, unknown>)[varName] : undefined;\n const label = entry.scheme === \"dark\" ? \"Dark\" : \"Light\";\n return html`\n <div class=\"css-var-media-row css-var-scheme-row\">\n <span class=\"css-var-media-label\">${label}</span>\n <div class=\"css-var-swatch\" style=\"background:${current ?? \"transparent\"}\">\n <input\n type=\"color\"\n .value=${current && String(current).startsWith(\"#\") ? String(current) : \"#111111\"}\n @input=${(e: Event) =>\n updateSchemeVar(entry.name, varName, (e.target as HTMLInputElement).value)}\n />\n </div>\n <sp-textfield\n size=\"s\"\n placeholder=\"inherits\"\n .value=${current == null ? \"\" : String(current)}\n @change=${(e: Event) =>\n updateSchemeVar(entry.name, varName, (e.target as HTMLInputElement).value)}\n style=\"flex:1;max-width:160px\"\n ></sp-textfield>\n </div>\n `;\n}\n\n/**\n * @param {[string, string | number][]} vars\n * @param {(name: string, val: string) => void} updateVar\n * @param {(name: string) => void} deleteVar\n * @param {(prefix: string, friendlyName: string, val: string) => void} addVar\n */\nfunction renderFontSection(\n vars: [string, string | number][],\n updateVar: (name: string, val: string) => void,\n deleteVar: (name: string) => void,\n addVar: (prefix: string, friendlyName: string, val: string) => void,\n) {\n return html`\n <div class=\"css-vars-group\">\n <h4 class=\"css-vars-group-title\">Fonts</h4>\n ${vars.map(\n ([name, val]) => html`\n <div class=\"css-var-row\">\n <span class=\"css-var-name\">${varDisplayName(name, \"--font-\")}</span>\n <sp-textfield\n size=\"s\"\n .value=${String(val)}\n @change=${(e: Event) => updateVar(name, (e.target as HTMLInputElement).value)}\n style=\"flex:1\"\n ></sp-textfield>\n <sp-action-button quiet size=\"s\" @click=${() => deleteVar(name)}>\n <sp-icon-delete slot=\"icon\"></sp-icon-delete>\n </sp-action-button>\n </div>\n <div class=\"css-var-font-preview\" style=\"font-family:${val}\">\n The quick brown fox jumps over the lazy dog\n </div>\n `,\n )}\n ${renderAddRow(\"--font-\", \"Body Serif\", \"'Georgia', serif\", addVar)}\n </div>\n `;\n}\n\n/**\n * @param {[string, string | number][]} vars\n * @param {(name: string, val: string) => void} updateVar\n * @param {(name: string) => void} deleteVar\n * @param {(prefix: string, friendlyName: string, val: string) => void} addVar\n * @param {JxStyle} rootStyle\n * @param {string[]} mediaNames\n */\nfunction renderSizeSection(\n vars: [string, string | number][],\n updateVar: (name: string, val: string) => void,\n deleteVar: (name: string) => void,\n addVar: (prefix: string, friendlyName: string, val: string) => void,\n rootStyle: JxStyle,\n mediaNames: string[],\n) {\n return html`\n <div class=\"css-vars-group\">\n <h4 class=\"css-vars-group-title\">Sizes & Spacing</h4>\n ${vars.map(\n ([name, val]) => html`\n <div class=\"css-var-row\">\n <span class=\"css-var-name\"\n >${\n varDisplayName(name, \"--size-\") ||\n varDisplayName(name, \"--spacing-\") ||\n varDisplayName(name, \"--radius-\") ||\n name\n }</span\n >\n <sp-textfield\n size=\"s\"\n .value=${String(val)}\n @change=${(e: Event) => updateVar(name, (e.target as HTMLInputElement).value)}\n style=\"max-width:120px\"\n ></sp-textfield>\n <sp-action-button quiet size=\"s\" @click=${() => deleteVar(name)}>\n <sp-icon-delete slot=\"icon\"></sp-icon-delete>\n </sp-action-button>\n </div>\n ${mediaNames.length > 0 ? renderMediaOverrides(name, rootStyle, mediaNames) : nothing}\n `,\n )}\n ${renderAddRow(\"--size-\", \"Spacing Large\", \"32px\", addVar)}\n </div>\n `;\n}\n\n/**\n * @param {[string, string | number][]} vars\n * @param {(name: string, val: string) => void} updateVar\n * @param {(name: string) => void} deleteVar\n * @param {(prefix: string, friendlyName: string, val: string) => void} addVar\n * @param {JxStyle} rootStyle\n * @param {string[]} mediaNames\n */\nfunction renderOtherSection(\n vars: [string, string | number][],\n updateVar: (name: string, val: string) => void,\n deleteVar: (name: string) => void,\n addVar: (prefix: string, friendlyName: string, val: string) => void,\n rootStyle: JxStyle,\n mediaNames: string[],\n) {\n return html`\n <div class=\"css-vars-group\">\n <h4 class=\"css-vars-group-title\">Other</h4>\n ${vars.map(\n ([name, val]) => html`\n <div class=\"css-var-row\">\n <span class=\"css-var-name\">${name}</span>\n <sp-textfield\n size=\"s\"\n .value=${String(val)}\n @change=${(e: Event) => updateVar(name, (e.target as HTMLInputElement).value)}\n style=\"flex:1\"\n ></sp-textfield>\n <sp-action-button quiet size=\"s\" @click=${() => deleteVar(name)}>\n <sp-icon-delete slot=\"icon\"></sp-icon-delete>\n </sp-action-button>\n </div>\n ${mediaNames.length > 0 ? renderMediaOverrides(name, rootStyle, mediaNames) : nothing}\n `,\n )}\n ${renderAddRow(\"--\", \"Custom Var\", \"value\", addVar)}\n </div>\n `;\n}\n\n/**\n * @param {string} varName\n * @param {JxStyle} rootStyle\n * @param {string[]} mediaNames\n */\nfunction renderMediaOverrides(varName: string, rootStyle: JxStyle, mediaNames: string[]) {\n const overrides = [];\n for (const mediaName of mediaNames) {\n const mediaKey = `@${mediaName}`;\n const mediaBlock = rootStyle[mediaKey];\n if (mediaBlock && typeof mediaBlock === \"object\" && mediaBlock[varName]) {\n overrides.push({ mediaName, value: mediaBlock[varName] });\n }\n }\n\n if (overrides.length === 0) {\n return nothing;\n }\n\n return html`\n <div class=\"css-var-media-overrides\">\n ${overrides.map(\n (o) => html`\n <div class=\"css-var-media-row\">\n <span class=\"css-var-media-label\">@${o.mediaName}</span>\n <sp-textfield\n size=\"s\"\n .value=${String(o.value)}\n @change=${(e: Event) => {\n if (!rootStyle[`@${o.mediaName}`]) {\n rootStyle[`@${o.mediaName}`] = {};\n }\n (rootStyle[`@${o.mediaName}`] as Record<string, unknown>)[varName] = (\n e.target as HTMLInputElement\n ).value;\n void updateSiteConfig({ style: { ...rootStyle } });\n }}\n style=\"max-width:120px\"\n ></sp-textfield>\n </div>\n `,\n )}\n </div>\n `;\n}\n\n/**\n * @param {string} prefix\n * @param {string} placeholder\n * @param {string} valuePlaceholder\n * @param {(prefix: string, friendlyName: string, val: string) => void} addVar\n */\nfunction renderAddRow(\n prefix: string,\n placeholder: string,\n valuePlaceholder: string,\n addVar: (prefix: string, friendlyName: string, val: string) => void,\n) {\n let nameEl: HTMLInputElement | null = null;\n let valEl: HTMLInputElement | null = null;\n\n return html`\n <div class=\"css-var-add-row\">\n <sp-textfield\n size=\"s\"\n placeholder=${placeholder}\n ${ref((el) => {\n if (el) {\n nameEl = el as HTMLInputElement;\n }\n })}\n ></sp-textfield>\n <sp-textfield\n size=\"s\"\n placeholder=${valuePlaceholder}\n ${ref((el) => {\n if (el) {\n valEl = el as HTMLInputElement;\n }\n })}\n ></sp-textfield>\n <sp-action-button\n size=\"s\"\n @click=${() => {\n if (nameEl && valEl) {\n addVar(prefix, nameEl.value, valEl.value);\n }\n }}\n >Add</sp-action-button\n >\n </div>\n `;\n}\n",
|
|
9
|
-
"/** Google Fonts helpers — shared between head-panel (per-page) and head-editor (project-level). */\n\nimport type { JxHeadEntry } from \"@jxsuite/schema/types\";\n\nexport const GFONTS_CSS_PREFIX = \"https://fonts.googleapis.com/css2?\";\nexport const GFONTS_PRECONNECT_ORIGINS = [\n \"https://fonts.googleapis.com\",\n \"https://fonts.gstatic.com\",\n];\n\n/**\n * Check if a `$head` entry is a Google Fonts stylesheet link.\n *\n * @param {JxHeadEntry} entry\n * @returns {boolean}\n */\nexport function isGoogleFontEntry(entry: JxHeadEntry) {\n return (\n entry?.tagName === \"link\" &&\n entry?.attributes?.rel === \"stylesheet\" &&\n typeof entry?.attributes?.href === \"string\" &&\n (entry.attributes.href as string).startsWith(GFONTS_CSS_PREFIX)\n );\n}\n\n/**\n * Check if a `$head` entry is a Google Fonts preconnect link.\n *\n * @param {JxHeadEntry} entry\n * @returns {boolean}\n */\nexport function isGoogleFontPreconnect(entry: JxHeadEntry) {\n return (\n entry?.tagName === \"link\" &&\n entry?.attributes?.rel === \"preconnect\" &&\n GFONTS_PRECONNECT_ORIGINS.includes(entry?.attributes?.href as string)\n );\n}\n\n/**\n * Extract the font family name from a Google Fonts CSS URL.\n *\n * @param {string} href\n * @returns {string}\n */\nexport function extractFontFamily(href: string) {\n const match = href.match(/family=([^&:]+)/);\n if (!match) {\n return \"\";\n }\n return decodeURIComponent(match[1]!.replaceAll(\"+\", \" \"));\n}\n\n/**\n * Build a Google Fonts CSS2 URL for a family name.\n *\n * @param {string} family\n * @returns {string}\n */\nexport function buildGoogleFontUrl(family: string) {\n return `${GFONTS_CSS_PREFIX}family=${encodeURIComponent(family).replaceAll(\"%20\", \"+\")}&display=swap`;\n}\n\n/**\n * Ensure preconnect links exist in a `$head` array for Google Fonts.\n *\n * @param {JxHeadEntry[]} head\n */\nexport function ensureGoogleFontPreconnects(head: JxHeadEntry[]) {\n for (const origin of GFONTS_PRECONNECT_ORIGINS) {\n const exists = head.some(\n (e: JxHeadEntry) =>\n e?.tagName === \"link\" &&\n e?.attributes?.rel === \"preconnect\" &&\n e?.attributes?.href === origin,\n );\n if (!exists) {\n const attrs: Record<string, string | boolean> = {\n href: origin,\n rel: \"preconnect\",\n };\n if (origin === \"https://fonts.gstatic.com\") {\n attrs.crossorigin = \"\";\n }\n head.push({ attributes: attrs, tagName: \"link\" });\n }\n }\n}\n\n/**\n * Remove preconnect links if no Google Font stylesheets remain.\n *\n * @param {JxHeadEntry[]} head\n * @returns {JxHeadEntry[]}\n */\nexport function cleanupGoogleFontPreconnects(head: JxHeadEntry[]) {\n const hasFont = head.some((e: JxHeadEntry) => isGoogleFontEntry(e));\n if (!hasFont) {\n return head.filter((e: JxHeadEntry) => !isGoogleFontPreconnect(e));\n }\n return head;\n}\n",
|
|
10
|
-
"/// <reference lib=\"dom\" />\n/**\n * Head editor — structured form for managing $head entries (link, meta, script, style tags) with\n * Monaco editor for script/style bodies. Also manages project-level Google Fonts.\n */\n\nimport { html, render as litRender, nothing } from \"lit-html\";\nimport { projectState } from \"../store\";\nimport { updateSiteConfig } from \"../site-context\";\nimport {\n buildGoogleFontUrl,\n cleanupGoogleFontPreconnects,\n ensureGoogleFontPreconnects,\n extractFontFamily,\n isGoogleFontEntry,\n} from \"../utils/google-fonts\";\n\nimport type { JxHeadEntry, ProjectConfig } from \"@jxsuite/schema/types\";\n\n/** @param {HTMLElement} container */\nexport function renderHeadEditor(container: HTMLElement) {\n const config = (projectState?.projectConfig || {}) as ProjectConfig;\n const headEntries = config.$head || ([] as JxHeadEntry[]);\n\n const save = () => {\n void updateSiteConfig({ $head: headEntries });\n };\n\n const addEntry = (tag: string) => {\n const attrs: Record<string, string | boolean> = {};\n const entry: JxHeadEntry = { attributes: attrs, tagName: tag };\n if (tag === \"link\") {\n attrs.rel = \"stylesheet\";\n attrs.href = \"\";\n } else if (tag === \"meta\") {\n attrs.name = \"\";\n attrs.content = \"\";\n } else if (tag === \"script\") {\n attrs.src = \"\";\n } else if (tag === \"style\") {\n entry.textContent = \"\";\n }\n headEntries.push(entry);\n save();\n renderHeadEditor(container);\n };\n\n const removeEntry = (idx: number) => {\n headEntries.splice(idx, 1);\n save();\n renderHeadEditor(container);\n };\n\n const updateEntry = (idx: number, key: string, val: string) => {\n const entry = headEntries[idx]!;\n if (key === \"content\" && (entry.tagName === \"script\" || entry.tagName === \"style\")) {\n entry.textContent = val;\n } else {\n if (!entry.attributes) {\n entry.attributes = {};\n }\n entry.attributes[key] = val;\n }\n save();\n };\n\n const tpl = html`\n <div class=\"settings-section\">\n <h3 class=\"settings-section-title\">Google Fonts</h3>\n <p class=\"settings-field-desc\">\n Manage Google Fonts imported across all pages in this project.\n </p>\n ${renderGoogleFontsSection(headEntries, save, () => renderHeadEditor(container))}\n </div>\n\n <div class=\"settings-section\">\n <h3 class=\"settings-section-title\">Head</h3>\n <p class=\"settings-field-desc\">\n Manage global <head> tags — stylesheets, meta tags, scripts, and inline styles.\n </p>\n\n <div class=\"head-entries\">\n ${headEntries.map(\n (entry: JxHeadEntry, idx: number) => html`\n <div class=\"head-entry\">\n <div class=\"head-entry-header\">\n <span class=\"head-entry-tag\"><${entry.tagName}></span>\n <sp-action-button quiet size=\"s\" @click=${() => removeEntry(idx)}>\n <sp-icon-delete slot=\"icon\"></sp-icon-delete>\n </sp-action-button>\n </div>\n <div class=\"head-entry-fields\">${renderEntryFields(entry, idx, updateEntry)}</div>\n </div>\n `,\n )}\n </div>\n\n <div class=\"head-add-actions\" style=\"margin-top:12px;display:flex;gap:8px\">\n <sp-action-button size=\"s\" @click=${() => addEntry(\"link\")}> + Link </sp-action-button>\n <sp-action-button size=\"s\" @click=${() => addEntry(\"meta\")}> + Meta </sp-action-button>\n <sp-action-button size=\"s\" @click=${() => addEntry(\"script\")}> + Script </sp-action-button>\n <sp-action-button size=\"s\" @click=${() => addEntry(\"style\")}> + Style </sp-action-button>\n </div>\n </div>\n `;\n\n litRender(tpl, container);\n}\n\n/**\n * @param {JxHeadEntry} entry\n * @param {number} idx\n * @param {(idx: number, key: string, val: string) => void} updateEntry\n */\nfunction renderEntryFields(\n entry: JxHeadEntry,\n idx: number,\n updateEntry: (idx: number, key: string, val: string) => void,\n) {\n let debounce: ReturnType<typeof setTimeout> | undefined;\n const onFieldChange = (key: string) => (e: Event) => {\n clearTimeout(debounce);\n debounce = setTimeout(() => {\n updateEntry(idx, key, (e.target as HTMLInputElement).value);\n }, 300);\n };\n\n const attrs = entry.attributes || {};\n\n switch (entry.tagName) {\n case \"link\": {\n return html`\n <div class=\"settings-field-row\">\n <sp-textfield\n size=\"s\"\n label=\"rel\"\n .value=${attrs.rel || \"\"}\n @change=${onFieldChange(\"rel\")}\n ></sp-textfield>\n <sp-textfield\n size=\"s\"\n label=\"href\"\n .value=${attrs.href || \"\"}\n @change=${onFieldChange(\"href\")}\n style=\"flex:1\"\n ></sp-textfield>\n </div>\n `;\n }\n case \"meta\": {\n return html`\n <div class=\"settings-field-row\">\n <sp-textfield\n size=\"s\"\n label=\"name\"\n .value=${attrs.name || \"\"}\n @change=${onFieldChange(\"name\")}\n ></sp-textfield>\n <sp-textfield\n size=\"s\"\n label=\"content\"\n .value=${attrs.content || \"\"}\n @change=${onFieldChange(\"content\")}\n style=\"flex:1\"\n ></sp-textfield>\n </div>\n `;\n }\n case \"script\": {\n return html`\n <div class=\"settings-field-row\">\n <sp-textfield\n size=\"s\"\n label=\"src\"\n .value=${attrs.src || \"\"}\n @change=${onFieldChange(\"src\")}\n placeholder=\"URL or leave empty for inline\"\n style=\"flex:1\"\n ></sp-textfield>\n </div>\n ${\n !attrs.src\n ? html`\n <div class=\"head-entry-body\">\n <label class=\"settings-field-label\">Script body</label>\n <textarea\n class=\"head-code-editor\"\n .value=${entry.textContent || \"\"}\n @input=${onFieldChange(\"content\")}\n rows=\"6\"\n spellcheck=\"false\"\n ></textarea>\n </div>\n `\n : nothing\n }\n `;\n }\n case \"style\": {\n return html`\n <div class=\"head-entry-body\">\n <label class=\"settings-field-label\">Style body</label>\n <textarea\n class=\"head-code-editor\"\n .value=${entry.textContent || \"\"}\n @input=${onFieldChange(\"content\")}\n rows=\"8\"\n spellcheck=\"false\"\n ></textarea>\n </div>\n `;\n }\n default: {\n return nothing;\n }\n }\n}\n\n/**\n * Render the Google Fonts management section.\n *\n * @param {JxHeadEntry[]} headEntries\n * @param {() => void} save\n * @param {() => void} rerender\n */\nfunction renderGoogleFontsSection(\n headEntries: JxHeadEntry[],\n save: () => void,\n rerender: () => void,\n) {\n const fontEntries = headEntries.filter((e) => isGoogleFontEntry(e));\n\n const addFont = (family: string) => {\n ensureGoogleFontPreconnects(headEntries);\n headEntries.push({\n attributes: { href: buildGoogleFontUrl(family), rel: \"stylesheet\" },\n tagName: \"link\",\n });\n save();\n rerender();\n };\n\n const removeFont = (entry: JxHeadEntry) => {\n const idx = headEntries.indexOf(entry);\n if (idx !== -1) {\n headEntries.splice(idx, 1);\n }\n const cleaned = cleanupGoogleFontPreconnects(headEntries);\n if (cleaned !== headEntries) {\n headEntries.length = 0;\n headEntries.push(...cleaned);\n }\n save();\n rerender();\n };\n\n return html`\n <div class=\"head-entries\" style=\"margin-bottom:12px\">\n ${\n fontEntries.length > 0\n ? fontEntries.map(\n (entry) => html`\n <div class=\"head-entry\" style=\"flex-direction:row;align-items:center;gap:8px\">\n <span style=\"flex:1\"\n >${extractFontFamily(String(entry.attributes?.href || \"\"))}</span\n >\n <sp-action-button quiet size=\"s\" @click=${() => removeFont(entry)}>\n <sp-icon-delete slot=\"icon\"></sp-icon-delete>\n </sp-action-button>\n </div>\n `,\n )\n : html`<p class=\"settings-field-desc\" style=\"margin:0\">No fonts imported.</p>`\n }\n </div>\n <div style=\"display:flex;gap:8px;align-items:center\">\n <sp-textfield\n size=\"s\"\n placeholder=\"Font family name…\"\n style=\"flex:1\"\n @keydown=${(e: KeyboardEvent) => {\n if (e.key !== \"Enter\") {\n return;\n }\n const family = (e.target as HTMLInputElement).value?.trim();\n if (!family) {\n return;\n }\n (e.target as HTMLInputElement).value = \"\";\n addFont(family);\n }}\n ></sp-textfield>\n <sp-action-button\n size=\"s\"\n @click=${(e: MouseEvent) => {\n const input = (e.target as HTMLElement).closest(\"div\")?.querySelector(\"sp-textfield\");\n const family = (input as HTMLInputElement | null)?.value?.trim();\n if (!family) {\n return;\n }\n (input as HTMLInputElement).value = \"\";\n addFont(family);\n }}\n >\n + Add\n </sp-action-button>\n </div>\n `;\n}\n",
|
|
11
|
-
"/// <reference lib=\"dom\" />\n/** General settings section — favicon, platform adapter, breakpoints, and other site-wide config. */\n\nimport { html, render as litRender, nothing } from \"lit-html\";\nimport { projectState } from \"../store\";\nimport { updateSiteConfig } from \"../site-context\";\nimport { getPlatform } from \"../platform\";\nimport { openFileInTab } from \"../files/files\";\n\nimport type { ProjectConfig } from \"@jxsuite/schema/types\";\n\n/** @param {HTMLElement} container */\nexport function renderGeneralSettings(container: HTMLElement) {\n const config = (projectState?.projectConfig || {}) as ProjectConfig;\n\n const onFaviconUpload = async () => {\n const input = document.createElement(\"input\");\n input.type = \"file\";\n input.accept = \"image/*,.ico,.svg\";\n input.addEventListener(\"change\", async () => {\n const file = input.files?.[0];\n if (!file) {\n return;\n }\n const platform = getPlatform();\n await platform.uploadFile(\"public/favicon.ico\", file);\n await updateSiteConfig({ favicon: \"/favicon.ico\" });\n renderGeneralSettings(container);\n });\n input.click();\n };\n\n const onAdapterChange = (e: Event) => {\n void updateSiteConfig({\n build: { ...config.build, adapter: (e.target as HTMLInputElement).value },\n });\n };\n\n const onEditGlobalStyles = async () => {\n // Lazy import breaks the general-settings ↔ settings-modal module cycle\n const { closeSettingsModal } = await import(\"./settings-modal\");\n closeSettingsModal();\n void openFileInTab(\"project.json\");\n };\n\n // ─── Breakpoints ($media) ───────────────────────────────────────────────────\n\n const media = (config.$media || {}) as Record<string, string>;\n const mediaEntries = Object.entries(media);\n\n const onMediaValueChange = (key: string) => (e: Event) => {\n const updated = { ...media, [key]: (e.target as HTMLInputElement).value };\n void updateSiteConfig({ $media: updated });\n };\n\n const onMediaNameChange = (oldKey: string) => (e: Event) => {\n const rawName = (e.target as HTMLInputElement).value.trim();\n const newKey = rawName.startsWith(\"--\") ? rawName : `--${rawName}`;\n if (newKey === oldKey) {\n return;\n }\n const updated = {} as Record<string, string>;\n for (const [k, v] of Object.entries(media)) {\n updated[k === oldKey ? newKey : k] = v;\n }\n void updateSiteConfig({ $media: updated });\n renderGeneralSettings(container);\n };\n\n const onRemoveBreakpoint = (key: string) => () => {\n const updated = { ...media };\n delete updated[key];\n void updateSiteConfig({ $media: updated });\n renderGeneralSettings(container);\n };\n\n const onAddBreakpoint = () => {\n const updated = { ...media, \"--new\": \"(max-width: 480px)\" };\n void updateSiteConfig({ $media: updated });\n renderGeneralSettings(container);\n };\n\n const currentFavicon = config.favicon;\n\n const tpl = html`\n <div class=\"settings-section\">\n <h3 class=\"settings-section-title\">General</h3>\n\n <div class=\"settings-field\">\n <label class=\"settings-field-label\">Favicon</label>\n <p class=\"settings-field-desc\">Upload an image to use as the site favicon.</p>\n <div style=\"display:flex;align-items:center;gap:12px\">\n ${\n currentFavicon\n ? html`<img\n src=${currentFavicon}\n alt=\"Current favicon\"\n style=\"width:32px;height:32px;object-fit:contain;border:1px solid var(--border);border-radius:var(--radius);padding:2px\"\n />`\n : html`<div\n style=\"width:32px;height:32px;border:1px dashed var(--border);border-radius:var(--radius);display:flex;align-items:center;justify-content:center;color:var(--fg-dim);font-size:var(--spectrum-font-size-50, 11px)\"\n >\n —\n </div>`\n }\n <sp-action-button size=\"s\" @click=${onFaviconUpload}> Upload Favicon </sp-action-button>\n ${\n currentFavicon\n ? html`<span style=\"font-size:var(--spectrum-font-size-50, 11px);color:var(--fg-dim)\"\n >${currentFavicon}</span\n >`\n : nothing\n }\n </div>\n </div>\n\n <div class=\"settings-field\">\n <label class=\"settings-field-label\">Platform Adapter</label>\n <p class=\"settings-field-desc\">Build adapter for deployment target.</p>\n <sp-picker\n size=\"s\"\n label=\"Platform Adapter\"\n .value=${config.build?.adapter || \"static\"}\n @change=${onAdapterChange}\n >\n <sp-menu-item value=\"static\">Static</sp-menu-item>\n <sp-menu-item value=\"bun\">Bun</sp-menu-item>\n <sp-menu-item value=\"node\">Node</sp-menu-item>\n <sp-menu-item value=\"cloudflare-workers\">Cloudflare Workers</sp-menu-item>\n <sp-menu-item value=\"cloudflare-pages\">Cloudflare Pages</sp-menu-item>\n </sp-picker>\n </div>\n\n <div class=\"settings-field\">\n <label class=\"settings-field-label\">Breakpoints</label>\n <p class=\"settings-field-desc\">\n Responsive breakpoints for canvas panels and media query styles.\n </p>\n <div class=\"settings-media-list\">\n ${mediaEntries.map(([key, value]) => {\n const isBase = key === \"--\";\n return html`\n <div class=\"settings-media-row\">\n ${\n isBase\n ? html`<span class=\"settings-media-name-fixed\">Base</span>`\n : html`<sp-textfield\n size=\"s\"\n class=\"settings-media-name\"\n .value=${key.replace(/^--/, \"\")}\n placeholder=\"name\"\n @change=${onMediaNameChange(key)}\n ></sp-textfield>`\n }\n <sp-textfield\n size=\"s\"\n class=\"settings-media-value\"\n .value=${value}\n placeholder=${isBase ? \"1280px\" : \"(max-width: 768px)\"}\n @change=${onMediaValueChange(key)}\n ></sp-textfield>\n ${\n isBase\n ? nothing\n : html`<sp-action-button\n size=\"s\"\n quiet\n title=\"Remove breakpoint\"\n @click=${onRemoveBreakpoint(key)}\n >\n ×\n </sp-action-button>`\n }\n </div>\n `;\n })}\n </div>\n <sp-action-button size=\"s\" style=\"margin-top:8px\" @click=${onAddBreakpoint}>\n + Add Breakpoint\n </sp-action-button>\n </div>\n\n <div class=\"settings-field\">\n <label class=\"settings-field-label\">Global Styles</label>\n <p class=\"settings-field-desc\">Edit default element styles that apply across all pages.</p>\n <sp-action-button size=\"s\" @click=${onEditGlobalStyles}>\n Edit Global Styles\n </sp-action-button>\n </div>\n </div>\n `;\n\n litRender(tpl, container);\n}\n",
|
|
12
|
-
"/// <reference lib=\"dom\" />\n/**\n * Dependencies settings section — an outdated-aware table of the project's npm dependencies. Shows\n * current vs latest version, with per-row update/remove, an add-package field, \"update all\", and\n * reinstall. @jxsuite/* rows target the version this Studio build embeds; other packages target the\n * newest published version reported by the backend.\n */\n\nimport { html, render as litRender } from \"lit-html\";\nimport { getPlatform } from \"../platform\";\nimport { VERSION } from \"../version\";\nimport { statusMessage } from \"../panels/statusbar\";\nimport { showProgressModal } from \"../ui/progress-modal\";\nimport { isComparable, isUpgrade, stripRange } from \"../packages/semver\";\nimport type { PackageInfo } from \"../types\";\n\nconst JXSUITE_PREFIX = \"@jxsuite/\";\n\ninterface Update {\n name: string;\n version: string;\n dev: boolean;\n}\n\nlet _container: HTMLElement | null = null;\nlet _packages: PackageInfo[] | null = null;\nlet _latest = new Map<string, string>();\nlet _busy = false;\nlet _addName = \"\";\n\n/** The version a package can be updated to, or null if it is already current. */\nfunction latestFor(p: PackageInfo): string | null {\n if (p.name.startsWith(JXSUITE_PREFIX) && isComparable(VERSION) && isUpgrade(p.version, VERSION)) {\n return VERSION;\n }\n const registry = _latest.get(p.name);\n return registry && isUpgrade(p.version, registry) ? registry : null;\n}\n\nasync function load() {\n const platform = getPlatform();\n try {\n _packages = await platform.listPackages();\n } catch {\n _packages = [];\n }\n _latest = new Map();\n if (platform.outdatedPackages) {\n try {\n for (const o of await platform.outdatedPackages()) {\n _latest.set(o.name, o.latest);\n }\n } catch {\n /* Registry lookups are best-effort */\n }\n }\n render();\n}\n\nasync function withBusy(fn: () => Promise<void>) {\n if (_busy) {\n return;\n }\n _busy = true;\n render();\n const progress = showProgressModal({ status: \"Running bun…\", title: \"Updating dependencies\" });\n try {\n await fn();\n progress.done();\n } catch (error) {\n progress.fail(error instanceof Error ? error.message : String(error));\n } finally {\n _busy = false;\n await load();\n }\n}\n\nasync function onAdd() {\n const name = _addName.trim();\n if (!name) {\n return;\n }\n await withBusy(async () => {\n await getPlatform().addPackage(name);\n _addName = \"\";\n statusMessage(`Added ${name}`);\n });\n}\n\nasync function onRemove(p: PackageInfo) {\n await withBusy(async () => {\n await getPlatform().removePackage(p.name);\n statusMessage(`Removed ${p.name}`);\n });\n}\n\nasync function onUpdate(p: PackageInfo, latest: string) {\n const platform = getPlatform();\n if (!platform.setPackageVersions) {\n return;\n }\n await withBusy(async () => {\n const target = stripRange(latest);\n const res = await platform.setPackageVersions!([\n { dev: Boolean(p.dev), name: p.name, version: `^${target}` },\n ]);\n if (!res.ok) {\n throw new Error(res.log ?? \"Update failed\");\n }\n statusMessage(`Updated ${p.name} to ${target}`);\n });\n}\n\nasync function onUpdateAll() {\n const platform = getPlatform();\n if (!platform.setPackageVersions) {\n return;\n }\n const updates = (_packages ?? [])\n .map((p): Update | null => {\n const latest = latestFor(p);\n return latest\n ? { dev: Boolean(p.dev), name: p.name, version: `^${stripRange(latest)}` }\n : null;\n })\n .filter((u): u is Update => u !== null);\n if (updates.length === 0) {\n return;\n }\n await withBusy(async () => {\n const res = await platform.setPackageVersions!(updates);\n if (!res.ok) {\n throw new Error(res.log ?? \"Update failed\");\n }\n statusMessage(`Updated ${updates.length} package(s)`);\n });\n}\n\nasync function onReinstall() {\n const platform = getPlatform();\n if (!platform.installDependencies) {\n return;\n }\n await withBusy(async () => {\n const res = await platform.installDependencies!();\n if (!res.ok) {\n throw new Error(res.log ?? \"Install failed\");\n }\n statusMessage(\"Dependencies reinstalled\");\n });\n}\n\nfunction row(p: PackageInfo) {\n const latest = latestFor(p);\n return html`\n <sp-table-row>\n <sp-table-cell>\n ${p.name}${\n p.dev ? html`<span style=\"color:var(--fg-dim);font-size:10px\"> · dev</span>` : \"\"\n }\n </sp-table-cell>\n <sp-table-cell>${p.version}</sp-table-cell>\n <sp-table-cell>${latest ?? \"—\"}</sp-table-cell>\n <sp-table-cell>\n ${\n latest\n ? html`<sp-action-button\n size=\"s\"\n quiet\n ?disabled=${_busy}\n title=\"Update to ${latest}\"\n @click=${() => onUpdate(p, latest)}\n >\n <sp-icon-refresh slot=\"icon\"></sp-icon-refresh>\n </sp-action-button>`\n : \"\"\n }\n <sp-action-button\n size=\"s\"\n quiet\n ?disabled=${_busy}\n title=\"Remove\"\n @click=${() => onRemove(p)}\n >\n <sp-icon-delete slot=\"icon\"></sp-icon-delete>\n </sp-action-button>\n </sp-table-cell>\n </sp-table-row>\n `;\n}\n\nfunction render() {\n if (!_container) {\n return;\n }\n const pkgs = _packages ?? [];\n const hasUpdates = pkgs.some((p) => latestFor(p) !== null);\n\n const tpl = html`\n <div class=\"settings-section\">\n <h3 class=\"settings-section-title\">Dependencies</h3>\n <p class=\"settings-field-desc\">Manage this project's npm dependencies.</p>\n\n <div style=\"display:flex;gap:8px;margin-bottom:12px;align-items:center\">\n <sp-textfield\n size=\"s\"\n placeholder=\"package-name\"\n .value=${_addName}\n ?disabled=${_busy}\n @input=${(e: Event) => {\n _addName = (e.target as HTMLInputElement).value;\n }}\n ></sp-textfield>\n <sp-action-button size=\"s\" ?disabled=${_busy} @click=${onAdd}>\n <sp-icon-add slot=\"icon\"></sp-icon-add>\n Add\n </sp-action-button>\n <span style=\"flex:1\"></span>\n ${\n hasUpdates\n ? html`<sp-action-button size=\"s\" ?disabled=${_busy} @click=${onUpdateAll}>\n Update all\n </sp-action-button>`\n : \"\"\n }\n <sp-action-button\n size=\"s\"\n quiet\n ?disabled=${_busy}\n title=\"Reinstall (bun install)\"\n @click=${onReinstall}\n >\n <sp-icon-refresh slot=\"icon\"></sp-icon-refresh>\n Reinstall\n </sp-action-button>\n </div>\n\n ${\n _packages === null\n ? html`<p class=\"about-muted\">Loading…</p>`\n : pkgs.length === 0\n ? html`<p class=\"about-muted\">No dependencies.</p>`\n : html`\n <sp-table size=\"s\">\n <sp-table-head>\n <sp-table-head-cell>Package</sp-table-head-cell>\n <sp-table-head-cell>Current</sp-table-head-cell>\n <sp-table-head-cell>Latest</sp-table-head-cell>\n <sp-table-head-cell></sp-table-head-cell>\n </sp-table-head>\n <sp-table-body> ${pkgs.map((p) => row(p))} </sp-table-body>\n </sp-table>\n `\n }\n </div>\n `;\n\n litRender(tpl, _container);\n}\n\n/** @param {HTMLElement} container */\nexport function renderDependenciesEditor(container: HTMLElement) {\n _container = container;\n _packages = null;\n _addName = \"\";\n render();\n void load();\n}\n",
|
|
13
|
-
"/// <reference lib=\"dom\" />\n/**\n * Settings modal — site-wide project settings (CSS variables, definitions, content types, head,\n * general). Modeled after VS Code / Obsidian settings panels: left sidebar nav + right content\n * area. Sections come from a registry: built-ins register at module init, and extensions add\n * descriptor-contributed sections through `registerSettingsSection`.\n */\n\nimport { html } from \"lit-html\";\nimport { classMap } from \"lit-html/directives/class-map.js\";\nimport { ref } from \"lit-html/directives/ref.js\";\nimport { renderDefsEditor } from \"./defs-editor\";\nimport { renderCssVarsEditor } from \"./css-vars-editor\";\nimport { renderHeadEditor } from \"./head-editor\";\nimport { renderGeneralSettings } from \"./general-settings\";\nimport { renderDependenciesEditor } from \"./dependencies-editor\";\nimport { openModal } from \"../ui/layers\";\n\n// ─── Section registry ─────────────────────────────────────────────────────────\n\n/** A settings-modal section: nav entry plus a renderer for the content area. */\nexport interface SettingsSection {\n key: string;\n label: string;\n /** Nav icon name (reserved for future nav treatments). */\n icon?: string | undefined;\n /** Sort position — lower orders render higher in the nav. */\n order: number;\n render: (container: HTMLElement) => void;\n}\n\nconst sectionRegistry = new Map<string, SettingsSection>();\n\n/**\n * Register (or replace) a settings section. Extensions use this hook to contribute\n * descriptor-driven sections; built-ins register below at module init.\n *\n * @param {SettingsSection} section\n */\nexport function registerSettingsSection(section: SettingsSection): void {\n sectionRegistry.set(section.key, section);\n}\n\n/**\n * Remove a registered section — used when a descriptor-contributed section's extension is disabled\n * (see ./extension-sections). Built-ins are never unregistered.\n *\n * @param {string} key\n */\nexport function unregisterSettingsSection(key: string): void {\n sectionRegistry.delete(key);\n if (_activeSection === key) {\n _activeSection = \"general\";\n }\n}\n\n/** Registered sections sorted by order (registration order breaks ties). */\nfunction sortedSections(): SettingsSection[] {\n return [...sectionRegistry.values()].toSorted((a, b) => a.order - b.order);\n}\n\n// Built-in sections — orders preserve the historical display order\nregisterSettingsSection({\n icon: \"sp-icon-properties\",\n key: \"general\",\n label: \"General\",\n order: 10,\n render: renderGeneralSettings,\n});\nregisterSettingsSection({\n icon: \"sp-icon-file-single-web-page\",\n key: \"head\",\n label: \"Head\",\n order: 20,\n render: renderHeadEditor,\n});\nregisterSettingsSection({\n icon: \"sp-icon-brush\",\n key: \"cssVars\",\n label: \"CSS Variables\",\n order: 30,\n render: renderCssVarsEditor,\n});\nregisterSettingsSection({\n icon: \"sp-icon-data\",\n key: \"definitions\",\n label: \"Definitions\",\n order: 40,\n render: renderDefsEditor,\n});\n// Content Types is no longer a built-in: @jxsuite/parser contributes it (order 50) through its\n// Content class descriptor's $studio.settings block, registered via ./extension-sections.\nregisterSettingsSection({\n icon: \"sp-icon-box\",\n key: \"dependencies\",\n label: \"Dependencies\",\n order: 60,\n render: renderDependenciesEditor,\n});\n\n// ─── Modal state ──────────────────────────────────────────────────────────────\n\nlet _handle: ReturnType<typeof openModal> | null = null;\n\nlet _activeSection = \"general\";\n\nlet _contentEl: HTMLElement | null = null;\n\nexport function openSettingsModal(section?: string) {\n if (_handle) {\n return;\n }\n _activeSection = section ?? \"general\";\n renderModal();\n // Refresh descriptor-contributed sections (cached payloads make this cheap) and rerender the\n // Nav once they land. Lazy import breaks the settings-modal ↔ extension-sections module cycle.\n void import(\"./extension-sections\")\n .then(async ({ syncExtensionSettingsSections }) => {\n await syncExtensionSettingsSections();\n if (_handle) {\n renderModal();\n renderActiveSection();\n }\n })\n .catch(() => {\n // Contributed sections are optional — the built-ins render regardless.\n });\n}\n\nexport function closeSettingsModal() {\n if (!_handle) {\n return;\n }\n _handle.close();\n _handle = null;\n _contentEl = null;\n}\n\nfunction renderModal() {\n const onNavClick = (key: string) => {\n _activeSection = key;\n renderModal();\n renderActiveSection();\n };\n\n const tpl = html`\n <sp-underlay open @close=${closeSettingsModal}></sp-underlay>\n <div\n class=\"settings-modal\"\n @keydown=${(e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n closeSettingsModal();\n }\n }}\n >\n <div class=\"settings-modal-header\">\n <h2 class=\"settings-modal-title\">Settings</h2>\n <sp-action-button quiet size=\"s\" @click=${closeSettingsModal} title=\"Close\">\n <sp-icon-close slot=\"icon\"></sp-icon-close>\n </sp-action-button>\n </div>\n <div class=\"settings-modal-body\">\n <nav class=\"settings-modal-nav\">\n ${sortedSections().map(\n (s) => html`\n <button\n class=${classMap({\n active: _activeSection === s.key,\n \"settings-nav-item\": true,\n })}\n @click=${() => onNavClick(s.key)}\n >\n ${s.label}\n </button>\n `,\n )}\n </nav>\n <div\n class=\"settings-modal-content\"\n ${ref((el: Element | undefined) => {\n _contentEl = (el as HTMLElement) || null;\n if (_contentEl) {\n requestAnimationFrame(() => renderActiveSection());\n }\n })}\n ></div>\n </div>\n </div>\n `;\n\n if (!_handle) {\n _handle = openModal(tpl);\n } else {\n _handle.update(tpl);\n }\n}\n\nfunction renderActiveSection() {\n if (!_handle || !_contentEl) {\n return;\n }\n sectionRegistry.get(_activeSection)?.render(_contentEl);\n}\n"
|
|
14
|
-
],
|
|
15
|
-
"mappings": "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",
|
|
16
|
-
"debugId": "8B96522C815A708964756E2164756E21",
|
|
17
|
-
"names": []
|
|
18
|
-
}
|