@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,216 +0,0 @@
|
|
|
1
|
-
/// <reference lib="dom" />
|
|
2
|
-
/**
|
|
3
|
-
* Canvas Diff — computes visual diff between original and current Jx documents.
|
|
4
|
-
*
|
|
5
|
-
* Compares two document trees recursively, marking nodes as added/removed/modified, and propagates
|
|
6
|
-
* "modified" status up the tree for structural changes (children added/removed/reordered).
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import type { JxMutableNode } from "@jxsuite/schema/types";
|
|
10
|
-
|
|
11
|
-
type DiffStatus = "added" | "removed" | "modified";
|
|
12
|
-
|
|
13
|
-
interface DiffResult {
|
|
14
|
-
byPath: Map<string, DiffStatus>;
|
|
15
|
-
allPaths: Set<string>;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Deep equality check for two values. Ignores function and ref properties.
|
|
20
|
-
*
|
|
21
|
-
* @param {unknown} a
|
|
22
|
-
* @param {unknown} b
|
|
23
|
-
* @returns {boolean}
|
|
24
|
-
*/
|
|
25
|
-
function valuesEqual(a: unknown, b: unknown): boolean {
|
|
26
|
-
if (a === b) {
|
|
27
|
-
return true;
|
|
28
|
-
}
|
|
29
|
-
if (typeof a !== "object" || typeof b !== "object" || !a || !b) {
|
|
30
|
-
return false;
|
|
31
|
-
}
|
|
32
|
-
if (Array.isArray(a) !== Array.isArray(b)) {
|
|
33
|
-
return false;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
if (Array.isArray(a)) {
|
|
37
|
-
const bArr = b as unknown[];
|
|
38
|
-
if (a.length !== bArr.length) {
|
|
39
|
-
return false;
|
|
40
|
-
}
|
|
41
|
-
return a.every((v: unknown, i: number) => valuesEqual(v, bArr[i]));
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
const aObj = a as Record<string, unknown>;
|
|
45
|
-
const bObj = b as Record<string, unknown>;
|
|
46
|
-
|
|
47
|
-
const keysA = Object.keys(aObj).filter((k: string) => !k.startsWith("on") && k !== "$ref");
|
|
48
|
-
const keysB = Object.keys(bObj).filter((k: string) => !k.startsWith("on") && k !== "$ref");
|
|
49
|
-
|
|
50
|
-
if (keysA.length !== keysB.length) {
|
|
51
|
-
return false;
|
|
52
|
-
}
|
|
53
|
-
if (!keysA.every((k: string) => keysB.includes(k))) {
|
|
54
|
-
return false;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
return keysA.every((k: string) => valuesEqual(aObj[k], bObj[k]));
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Filter element children from a node's children array.
|
|
62
|
-
*
|
|
63
|
-
* @param {JxMutableNode | undefined} node
|
|
64
|
-
* @returns {JxMutableNode[]}
|
|
65
|
-
*/
|
|
66
|
-
function elementChildren(node: JxMutableNode | undefined) {
|
|
67
|
-
if (!node?.children || !Array.isArray(node.children)) {
|
|
68
|
-
return [];
|
|
69
|
-
}
|
|
70
|
-
return node.children.filter(
|
|
71
|
-
(c: JxMutableNode | string) => c != null && typeof c === "object",
|
|
72
|
-
) as JxMutableNode[];
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
/**
|
|
76
|
-
* Mark an entire subtree with a diff status.
|
|
77
|
-
*
|
|
78
|
-
* @param {JxMutableNode} node
|
|
79
|
-
* @param {DiffStatus} status
|
|
80
|
-
* @param {string} path
|
|
81
|
-
* @param {Map<string, DiffStatus>} diffMap
|
|
82
|
-
* @param {Set<string>} allPaths
|
|
83
|
-
*/
|
|
84
|
-
function markRecursive(
|
|
85
|
-
node: JxMutableNode,
|
|
86
|
-
status: DiffStatus,
|
|
87
|
-
path: string,
|
|
88
|
-
diffMap: Map<string, DiffStatus>,
|
|
89
|
-
allPaths: Set<string>,
|
|
90
|
-
) {
|
|
91
|
-
allPaths.add(path);
|
|
92
|
-
diffMap.set(path, status);
|
|
93
|
-
const children = elementChildren(node);
|
|
94
|
-
for (let i = 0; i < children.length; i++) {
|
|
95
|
-
const childPath = `${path}/children/${i}`;
|
|
96
|
-
markRecursive(children[i]!, status, childPath, diffMap, allPaths);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
/**
|
|
101
|
-
* Compute structural diff between original and current documents.
|
|
102
|
-
*
|
|
103
|
-
* @param {JxMutableNode | undefined} originalDoc - Original document (from git)
|
|
104
|
-
* @param {JxMutableNode | undefined} currentDoc - Current document (in memory/on disk)
|
|
105
|
-
* @returns {DiffResult}
|
|
106
|
-
*/
|
|
107
|
-
export function computeDocumentDiff(
|
|
108
|
-
originalDoc: JxMutableNode | undefined,
|
|
109
|
-
currentDoc: JxMutableNode | undefined,
|
|
110
|
-
): DiffResult {
|
|
111
|
-
const diffMap = new Map<string, DiffStatus>();
|
|
112
|
-
const allPaths = new Set<string>();
|
|
113
|
-
|
|
114
|
-
/**
|
|
115
|
-
* Walk both trees in parallel and mark differences.
|
|
116
|
-
*
|
|
117
|
-
* @param {JxMutableNode | undefined} origNode
|
|
118
|
-
* @param {JxMutableNode | undefined} currNode
|
|
119
|
-
* @param {string} path
|
|
120
|
-
*/
|
|
121
|
-
const walk = (
|
|
122
|
-
origNode: JxMutableNode | undefined,
|
|
123
|
-
currNode: JxMutableNode | undefined,
|
|
124
|
-
path = "",
|
|
125
|
-
) => {
|
|
126
|
-
const pathKey = path || "/";
|
|
127
|
-
allPaths.add(pathKey);
|
|
128
|
-
|
|
129
|
-
// Both exist but differ
|
|
130
|
-
if (origNode != null && currNode != null) {
|
|
131
|
-
if (!valuesEqual(origNode, currNode)) {
|
|
132
|
-
diffMap.set(pathKey, "modified");
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
// Walk children
|
|
136
|
-
if (origNode.children && currNode.children) {
|
|
137
|
-
const origChildren = elementChildren(origNode);
|
|
138
|
-
const currChildren = elementChildren(currNode);
|
|
139
|
-
|
|
140
|
-
for (let i = 0; i < Math.max(origChildren.length, currChildren.length); i++) {
|
|
141
|
-
const childPath = pathKey === "/" ? `children/${i}` : `${pathKey}/children/${i}`;
|
|
142
|
-
walk(origChildren[i], currChildren[i], childPath);
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
return;
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
// In current only (added)
|
|
149
|
-
if (currNode != null && origNode == null) {
|
|
150
|
-
diffMap.set(pathKey, "added");
|
|
151
|
-
const children = elementChildren(currNode);
|
|
152
|
-
for (let i = 0; i < children.length; i++) {
|
|
153
|
-
const childPath = pathKey === "/" ? `children/${i}` : `${pathKey}/children/${i}`;
|
|
154
|
-
markRecursive(children[i]!, "added", childPath, diffMap, allPaths);
|
|
155
|
-
}
|
|
156
|
-
return;
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
// In original only (removed)
|
|
160
|
-
if (origNode != null && currNode == null) {
|
|
161
|
-
diffMap.set(pathKey, "removed");
|
|
162
|
-
const children = elementChildren(origNode);
|
|
163
|
-
for (let i = 0; i < children.length; i++) {
|
|
164
|
-
const childPath = pathKey === "/" ? `children/${i}` : `${pathKey}/children/${i}`;
|
|
165
|
-
markRecursive(children[i]!, "removed", childPath, diffMap, allPaths);
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
};
|
|
169
|
-
|
|
170
|
-
// Start comparison
|
|
171
|
-
walk(originalDoc, currentDoc, "");
|
|
172
|
-
|
|
173
|
-
// Propagate "modified" status to parents of added/removed children
|
|
174
|
-
const propagateModified = () => {
|
|
175
|
-
let changed = false;
|
|
176
|
-
for (const [path, status] of diffMap.entries()) {
|
|
177
|
-
if ((status === "added" || status === "removed") && path !== "/") {
|
|
178
|
-
const parentPath = path.split("/").slice(0, -2).join("/") || "/";
|
|
179
|
-
if (parentPath !== "/") {
|
|
180
|
-
const parentStatus = diffMap.get(parentPath);
|
|
181
|
-
if (
|
|
182
|
-
parentStatus !== "modified" &&
|
|
183
|
-
parentStatus !== "added" &&
|
|
184
|
-
parentStatus !== "removed"
|
|
185
|
-
) {
|
|
186
|
-
diffMap.set(parentPath, "modified");
|
|
187
|
-
changed = true;
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
return changed;
|
|
193
|
-
};
|
|
194
|
-
|
|
195
|
-
// Propagate upwards until no more changes
|
|
196
|
-
let propagating = true;
|
|
197
|
-
while (propagating) {
|
|
198
|
-
propagating = propagateModified();
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
return { allPaths, byPath: diffMap };
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
/**
|
|
205
|
-
* Clear diff highlighting from all elements in a canvas.
|
|
206
|
-
*
|
|
207
|
-
* @param {HTMLElement} canvas
|
|
208
|
-
*/
|
|
209
|
-
export function clearDiffHighlight(canvas: HTMLElement) {
|
|
210
|
-
const marked = canvas.querySelectorAll(
|
|
211
|
-
".element-diff-added, .element-diff-removed, .element-diff-modified",
|
|
212
|
-
);
|
|
213
|
-
for (const el of marked) {
|
|
214
|
-
el.classList.remove("element-diff-added", "element-diff-removed", "element-diff-modified");
|
|
215
|
-
}
|
|
216
|
-
}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Generate scoped CSS from nested style objects (e.g. `table: { width: "100%", thead: { ... } }`).
|
|
3
|
-
* Returns a CSS string with rules scoped under the given selector.
|
|
4
|
-
*
|
|
5
|
-
* @param {import("@jxsuite/schema/types").JxStyle} styleObj - The full style object (flat + nested)
|
|
6
|
-
* @param {string} scope - The scoping selector (e.g. `[data-jx-site]`)
|
|
7
|
-
* @returns {string} Generated CSS text
|
|
8
|
-
*/
|
|
9
|
-
import type { JxStyle } from "@jxsuite/schema/types";
|
|
10
|
-
|
|
11
|
-
export function buildNestedSiteCSS(styleObj: JxStyle, scope: string) {
|
|
12
|
-
let css = "";
|
|
13
|
-
|
|
14
|
-
function emit(parentSel: string, rules: JxStyle) {
|
|
15
|
-
const props = Object.entries(rules)
|
|
16
|
-
.filter(([, val]) => val === null || typeof val !== "object" || Array.isArray(val))
|
|
17
|
-
.map(([p, val]) => `${camelToKebab(p)}: ${val}`)
|
|
18
|
-
.join("; ");
|
|
19
|
-
if (props) {
|
|
20
|
-
css += `${parentSel} { ${props} }\n`;
|
|
21
|
-
}
|
|
22
|
-
for (const [sel, sub] of Object.entries(rules)) {
|
|
23
|
-
if (sub === null || typeof sub !== "object" || Array.isArray(sub)) {
|
|
24
|
-
continue;
|
|
25
|
-
}
|
|
26
|
-
const resolved = sel.startsWith("&")
|
|
27
|
-
? sel.replace("&", parentSel)
|
|
28
|
-
: sel.startsWith("[") || sel.startsWith(":") || sel.startsWith(".")
|
|
29
|
-
? `${parentSel}${sel}`
|
|
30
|
-
: `${parentSel} ${sel}`;
|
|
31
|
-
emit(resolved, sub);
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
for (const [k, v] of Object.entries(styleObj)) {
|
|
36
|
-
if (v === null || typeof v !== "object" || Array.isArray(v)) {
|
|
37
|
-
continue;
|
|
38
|
-
}
|
|
39
|
-
const resolved = k.startsWith("&")
|
|
40
|
-
? k.replace("&", scope)
|
|
41
|
-
: k.startsWith("[") || k.startsWith(":") || k.startsWith(".")
|
|
42
|
-
? `${scope}${k}`
|
|
43
|
-
: `${scope} ${k}`;
|
|
44
|
-
emit(resolved, v);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
return css;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* Convert camelCase to kebab-case.
|
|
52
|
-
*
|
|
53
|
-
* @param {string} s
|
|
54
|
-
* @returns {string}
|
|
55
|
-
*/
|
|
56
|
-
function camelToKebab(s: string) {
|
|
57
|
-
return s.replaceAll(/[A-Z]/g, (m) => `-${m.toLowerCase()}`);
|
|
58
|
-
}
|
|
@@ -1,264 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The design-quickstart section of the New Project Parameters step: colors, fonts, logo, and
|
|
3
|
-
* breakpoints. A trimmed-down, creation-time version of the settings modal — every field is
|
|
4
|
-
* optional, and empty fields leave the template/starter defaults untouched (the backend applies
|
|
5
|
-
* overrides best-effort against the starters' shared token conventions).
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import { html } from "lit-html";
|
|
9
|
-
import type { TemplateResult } from "lit-html";
|
|
10
|
-
|
|
11
|
-
/** Mirrors @jxsuite/create's DesignOptions (threaded through platform.createProject). */
|
|
12
|
-
export interface DesignSelection {
|
|
13
|
-
accent?: string;
|
|
14
|
-
background?: string;
|
|
15
|
-
text?: string;
|
|
16
|
-
bodyFont?: string;
|
|
17
|
-
headingFont?: string;
|
|
18
|
-
media?: Record<string, string>;
|
|
19
|
-
logo?: { name: string; base64: string };
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
interface MediaRow {
|
|
23
|
-
name: string;
|
|
24
|
-
value: string;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
let _accent = "";
|
|
28
|
-
let _background = "";
|
|
29
|
-
let _text = "";
|
|
30
|
-
let _bodyFont = "";
|
|
31
|
-
let _headingFont = "";
|
|
32
|
-
let _mediaRows: MediaRow[] = [];
|
|
33
|
-
let _mediaNote = "";
|
|
34
|
-
let _logo: { name: string; base64: string } | null = null;
|
|
35
|
-
let _logoError = "";
|
|
36
|
-
|
|
37
|
-
// Prefills are display defaults, not overrides: a value identical to its prefill is NOT sent, so
|
|
38
|
-
// An untouched form leaves the template/starter exactly as authored (a starter's registry accent
|
|
39
|
-
// Need not equal its --color-primary, and re-sending a template's own $media is just noise).
|
|
40
|
-
let _prefillAccent = "";
|
|
41
|
-
let _prefillMediaJson = "";
|
|
42
|
-
|
|
43
|
-
function mediaRowsJson(rows: MediaRow[]): string {
|
|
44
|
-
return JSON.stringify(rows.map((r) => [r.name.trim(), r.value.trim()]));
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
export interface DesignPrefill {
|
|
48
|
-
/** Prefilled accent color (a starter's registry accent). */
|
|
49
|
-
accent?: string;
|
|
50
|
-
/** Prefilled breakpoint rows (a template's $media preset). */
|
|
51
|
-
media?: Record<string, string>;
|
|
52
|
-
/** Shown under the breakpoints editor when it starts empty (starter sites). */
|
|
53
|
-
mediaNote?: string;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/** Reset the section for a fresh modal pass, seeding prefills from the chosen source. */
|
|
57
|
-
export function resetDesignFields(prefill: DesignPrefill = {}) {
|
|
58
|
-
_accent = prefill.accent ?? "";
|
|
59
|
-
_background = "";
|
|
60
|
-
_text = "";
|
|
61
|
-
_bodyFont = "";
|
|
62
|
-
_headingFont = "";
|
|
63
|
-
_mediaRows = Object.entries(prefill.media ?? {}).map(([name, value]) => ({ name, value }));
|
|
64
|
-
_mediaNote = prefill.mediaNote ?? "";
|
|
65
|
-
_logo = null;
|
|
66
|
-
_logoError = "";
|
|
67
|
-
_prefillAccent = _accent;
|
|
68
|
-
_prefillMediaJson = mediaRowsJson(_mediaRows);
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
* The design overrides to send with createProject, or undefined when everything was left at its
|
|
73
|
-
* defaults (the payload then stays byte-identical to a plain create).
|
|
74
|
-
*/
|
|
75
|
-
export function collectDesign(): DesignSelection | undefined {
|
|
76
|
-
const media: Record<string, string> = {};
|
|
77
|
-
for (const row of _mediaRows) {
|
|
78
|
-
if (row.name.trim() && row.value.trim()) {
|
|
79
|
-
media[row.name.trim()] = row.value.trim();
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
const accentChanged = _accent.trim() && _accent.trim() !== _prefillAccent;
|
|
83
|
-
const mediaChanged =
|
|
84
|
-
Object.keys(media).length > 0 && mediaRowsJson(_mediaRows) !== _prefillMediaJson;
|
|
85
|
-
const design: DesignSelection = {
|
|
86
|
-
...(accentChanged ? { accent: _accent.trim() } : {}),
|
|
87
|
-
...(_background.trim() ? { background: _background.trim() } : {}),
|
|
88
|
-
...(_text.trim() ? { text: _text.trim() } : {}),
|
|
89
|
-
...(_bodyFont.trim() ? { bodyFont: _bodyFont.trim() } : {}),
|
|
90
|
-
...(_headingFont.trim() ? { headingFont: _headingFont.trim() } : {}),
|
|
91
|
-
...(mediaChanged ? { media } : {}),
|
|
92
|
-
...(_logo ? { logo: _logo } : {}),
|
|
93
|
-
};
|
|
94
|
-
return Object.keys(design).length > 0 ? design : undefined;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
/** Base64-encode a small file (logos) without blowing the call stack on spread. */
|
|
98
|
-
async function fileToBase64(file: File): Promise<string> {
|
|
99
|
-
const bytes = new Uint8Array(await file.arrayBuffer());
|
|
100
|
-
let binary = "";
|
|
101
|
-
const CHUNK = 32_768;
|
|
102
|
-
for (let i = 0; i < bytes.length; i += CHUNK) {
|
|
103
|
-
binary += String.fromCodePoint(...bytes.subarray(i, i + CHUNK));
|
|
104
|
-
}
|
|
105
|
-
return btoa(binary);
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
function colorRow(
|
|
109
|
-
label: string,
|
|
110
|
-
value: string,
|
|
111
|
-
set: (v: string) => void,
|
|
112
|
-
rerender: () => void,
|
|
113
|
-
): TemplateResult {
|
|
114
|
-
const onText = (e: Event) => {
|
|
115
|
-
set((e.target as HTMLInputElement).value);
|
|
116
|
-
rerender();
|
|
117
|
-
};
|
|
118
|
-
return html`
|
|
119
|
-
<div class="new-project-color-row">
|
|
120
|
-
<span class="new-project-label">${label}</span>
|
|
121
|
-
<div class="css-var-swatch" style="background:${value || "transparent"}">
|
|
122
|
-
<input type="color" .value=${value || "#888888"} @input=${onText} />
|
|
123
|
-
</div>
|
|
124
|
-
<sp-textfield placeholder="Keep default" .value=${value} @input=${onText}></sp-textfield>
|
|
125
|
-
</div>
|
|
126
|
-
`;
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
export function renderDesignFields(ctx: { rerender: () => void }): TemplateResult {
|
|
130
|
-
const { rerender } = ctx;
|
|
131
|
-
|
|
132
|
-
const onLogoChange = async (e: Event) => {
|
|
133
|
-
const input = e.target as HTMLInputElement;
|
|
134
|
-
const file = input.files?.[0];
|
|
135
|
-
if (!file) {
|
|
136
|
-
return;
|
|
137
|
-
}
|
|
138
|
-
if (!/\.(svg|png|jpe?g|webp|gif|ico)$/i.test(file.name)) {
|
|
139
|
-
_logoError = "Use an SVG, PNG, JPEG, WebP, GIF, or ICO image";
|
|
140
|
-
_logo = null;
|
|
141
|
-
rerender();
|
|
142
|
-
return;
|
|
143
|
-
}
|
|
144
|
-
_logoError = "";
|
|
145
|
-
_logo = { base64: await fileToBase64(file), name: file.name };
|
|
146
|
-
rerender();
|
|
147
|
-
};
|
|
148
|
-
|
|
149
|
-
const setRow = (index: number, field: "name" | "value") => (e: Event) => {
|
|
150
|
-
const row = _mediaRows[index];
|
|
151
|
-
if (row) {
|
|
152
|
-
row[field] = (e.target as HTMLInputElement).value;
|
|
153
|
-
}
|
|
154
|
-
};
|
|
155
|
-
|
|
156
|
-
return html`
|
|
157
|
-
<div class="new-project-design-section">
|
|
158
|
-
<div class="new-project-design-heading">Colors</div>
|
|
159
|
-
${colorRow("Accent", _accent, (v) => (_accent = v), rerender)}
|
|
160
|
-
${colorRow("Background", _background, (v) => (_background = v), rerender)}
|
|
161
|
-
${colorRow("Text", _text, (v) => (_text = v), rerender)}
|
|
162
|
-
</div>
|
|
163
|
-
|
|
164
|
-
<div class="new-project-design-section">
|
|
165
|
-
<div class="new-project-design-heading">Fonts</div>
|
|
166
|
-
<label class="new-project-field">
|
|
167
|
-
<span class="new-project-label">Body Font</span>
|
|
168
|
-
<sp-textfield
|
|
169
|
-
placeholder="Keep default (e.g. 'Inter', system-ui, sans-serif)"
|
|
170
|
-
.value=${_bodyFont}
|
|
171
|
-
@input=${(e: Event) => (_bodyFont = (e.target as HTMLInputElement).value)}
|
|
172
|
-
style="width: 100%"
|
|
173
|
-
></sp-textfield>
|
|
174
|
-
</label>
|
|
175
|
-
<label class="new-project-field">
|
|
176
|
-
<span class="new-project-label">Heading Font</span>
|
|
177
|
-
<sp-textfield
|
|
178
|
-
placeholder="Keep default"
|
|
179
|
-
.value=${_headingFont}
|
|
180
|
-
@input=${(e: Event) => (_headingFont = (e.target as HTMLInputElement).value)}
|
|
181
|
-
style="width: 100%"
|
|
182
|
-
></sp-textfield>
|
|
183
|
-
</label>
|
|
184
|
-
</div>
|
|
185
|
-
|
|
186
|
-
<div class="new-project-design-section">
|
|
187
|
-
<div class="new-project-design-heading">Logo</div>
|
|
188
|
-
<div class="new-project-logo-row">
|
|
189
|
-
<input type="file" accept=".svg,.png,.jpg,.jpeg,.webp,.gif,.ico" @change=${onLogoChange} />
|
|
190
|
-
${
|
|
191
|
-
_logo
|
|
192
|
-
? html`
|
|
193
|
-
<span class="new-project-logo-name">
|
|
194
|
-
${_logo.name} → public/${_logo.name}
|
|
195
|
-
<sp-action-button
|
|
196
|
-
quiet
|
|
197
|
-
size="s"
|
|
198
|
-
title="Remove logo"
|
|
199
|
-
@click=${() => {
|
|
200
|
-
_logo = null;
|
|
201
|
-
rerender();
|
|
202
|
-
}}
|
|
203
|
-
>
|
|
204
|
-
✕
|
|
205
|
-
</sp-action-button>
|
|
206
|
-
</span>
|
|
207
|
-
`
|
|
208
|
-
: html`<span class="new-project-tab-intro"
|
|
209
|
-
>Copied into the project's public/ folder.</span
|
|
210
|
-
>`
|
|
211
|
-
}
|
|
212
|
-
</div>
|
|
213
|
-
${_logoError ? html`<div class="new-project-error">${_logoError}</div>` : ""}
|
|
214
|
-
</div>
|
|
215
|
-
|
|
216
|
-
<div class="new-project-design-section">
|
|
217
|
-
<div class="new-project-design-heading">Breakpoints</div>
|
|
218
|
-
${
|
|
219
|
-
_mediaRows.length === 0 && _mediaNote
|
|
220
|
-
? html`<div class="new-project-tab-intro">${_mediaNote}</div>`
|
|
221
|
-
: ""
|
|
222
|
-
}
|
|
223
|
-
${_mediaRows.map(
|
|
224
|
-
(row, index) => html`
|
|
225
|
-
<div class="new-project-media-row">
|
|
226
|
-
<sp-textfield
|
|
227
|
-
class="new-project-media-name"
|
|
228
|
-
placeholder="--md"
|
|
229
|
-
.value=${row.name}
|
|
230
|
-
@input=${setRow(index, "name")}
|
|
231
|
-
></sp-textfield>
|
|
232
|
-
<sp-textfield
|
|
233
|
-
class="new-project-media-value"
|
|
234
|
-
placeholder="(max-width: 768px)"
|
|
235
|
-
.value=${row.value}
|
|
236
|
-
@input=${setRow(index, "value")}
|
|
237
|
-
></sp-textfield>
|
|
238
|
-
<sp-action-button
|
|
239
|
-
quiet
|
|
240
|
-
size="s"
|
|
241
|
-
title="Remove breakpoint"
|
|
242
|
-
@click=${() => {
|
|
243
|
-
_mediaRows.splice(index, 1);
|
|
244
|
-
rerender();
|
|
245
|
-
}}
|
|
246
|
-
>
|
|
247
|
-
✕
|
|
248
|
-
</sp-action-button>
|
|
249
|
-
</div>
|
|
250
|
-
`,
|
|
251
|
-
)}
|
|
252
|
-
<sp-button
|
|
253
|
-
variant="secondary"
|
|
254
|
-
size="s"
|
|
255
|
-
@click=${() => {
|
|
256
|
-
_mediaRows.push({ name: "", value: "" });
|
|
257
|
-
rerender();
|
|
258
|
-
}}
|
|
259
|
-
>
|
|
260
|
-
Add Breakpoint
|
|
261
|
-
</sp-button>
|
|
262
|
-
</div>
|
|
263
|
-
`;
|
|
264
|
-
}
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The built-in project templates shown on the New Project modal's Template tab. The ids are the
|
|
3
|
-
* contract with `@jxsuite/create/templates` (createProject validates them server-side); the copy
|
|
4
|
-
* here is presentation only. Hardcoded rather than imported: `@jxsuite/create` is a Node CLI
|
|
5
|
-
* package and Studio runs in the browser.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
export interface TemplateInfo {
|
|
9
|
-
id: string;
|
|
10
|
-
name: string;
|
|
11
|
-
tagline: string;
|
|
12
|
-
/** Glyph shown in the card's preview area. */
|
|
13
|
-
glyph: string;
|
|
14
|
-
/** The template's default $media map (mirrors @jxsuite/create's mediaForTemplate). */
|
|
15
|
-
media: Record<string, string>;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
const DESKTOP_FIRST_MEDIA = {
|
|
19
|
-
"--": "1280px",
|
|
20
|
-
"--lg": "(max-width: 1024px)",
|
|
21
|
-
"--md": "(max-width: 768px)",
|
|
22
|
-
"--sm": "(max-width: 640px)",
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
const MOBILE_FIRST_MEDIA = {
|
|
26
|
-
"--": "375px",
|
|
27
|
-
"--sm": "(min-width: 640px)",
|
|
28
|
-
"--md": "(min-width: 768px)",
|
|
29
|
-
"--lg": "(min-width: 1024px)",
|
|
30
|
-
};
|
|
31
|
-
|
|
32
|
-
export const PROJECT_TEMPLATES: readonly TemplateInfo[] = [
|
|
33
|
-
{
|
|
34
|
-
glyph: "+",
|
|
35
|
-
id: "blank",
|
|
36
|
-
media: DESKTOP_FIRST_MEDIA,
|
|
37
|
-
name: "Blank",
|
|
38
|
-
tagline: "Start from scratch",
|
|
39
|
-
},
|
|
40
|
-
{
|
|
41
|
-
glyph: "🖥",
|
|
42
|
-
id: "desktop-first",
|
|
43
|
-
media: DESKTOP_FIRST_MEDIA,
|
|
44
|
-
name: "Desktop First",
|
|
45
|
-
tagline: "Max-width breakpoints",
|
|
46
|
-
},
|
|
47
|
-
{
|
|
48
|
-
glyph: "📱",
|
|
49
|
-
id: "mobile-first",
|
|
50
|
-
media: MOBILE_FIRST_MEDIA,
|
|
51
|
-
name: "Mobile First",
|
|
52
|
-
tagline: "Min-width breakpoints",
|
|
53
|
-
},
|
|
54
|
-
{
|
|
55
|
-
glyph: "📲",
|
|
56
|
-
id: "mobile-app",
|
|
57
|
-
media: MOBILE_FIRST_MEDIA,
|
|
58
|
-
name: "Mobile App",
|
|
59
|
-
tagline: "App shell with bottom navigation",
|
|
60
|
-
},
|
|
61
|
-
];
|