@jxsuite/studio 2.0.1 → 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-799jpvhm.js → components-2bpqp4mq.js} +5 -7
- package/dist/chunks/{components-799jpvhm.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-8jxwts2p.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-gs6kqdt1.js → studio-adn0z1k3.js} +14 -8
- package/dist/chunks/{studio-gs6kqdt1.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-esrewxap.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-v7jkjqng.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-jm0z592w.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 +21080 -32585
- 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 +7 -0
- package/src/new-project/location-fields.ts +9 -1
- package/src/new-project/new-project-modal.ts +221 -245
- 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 -53
- 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 +30 -1
- 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 +7 -1
- 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-qr3drkkw.js +0 -531
- package/dist/chunks/extension-sections-qr3drkkw.js.map +0 -12
- package/dist/chunks/files-j8a1t06k.js +0 -50
- package/dist/chunks/files-j8a1t06k.js.map +0 -9
- package/dist/chunks/git-panel-xtq5z81x.js +0 -28
- package/dist/chunks/git-panel-xtq5z81x.js.map +0 -9
- package/dist/chunks/layers-panel-ancn2wpq.js +0 -26
- package/dist/chunks/layers-panel-ancn2wpq.js.map +0 -9
- package/dist/chunks/settings-modal-17ttr96g.js +0 -29
- package/dist/chunks/settings-modal-17ttr96g.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-0xgs7xrs.js +0 -429
- package/dist/chunks/studio-0xgs7xrs.js.map +0 -13
- package/dist/chunks/studio-4d8hzcz5.js +0 -3427
- package/dist/chunks/studio-4d8hzcz5.js.map +0 -26
- package/dist/chunks/studio-4k0m4fmp.js.map +0 -13
- package/dist/chunks/studio-9smfzqhc.js +0 -19
- package/dist/chunks/studio-9smfzqhc.js.map +0 -10
- package/dist/chunks/studio-jm0z592w.js.map +0 -115
- package/dist/chunks/studio-m2t4mdg5.js +0 -1854
- package/dist/chunks/studio-m2t4mdg5.js.map +0 -18
- package/dist/chunks/studio-n4p11dfy.js +0 -853
- package/dist/chunks/studio-n4p11dfy.js.map +0 -12
- package/dist/chunks/studio-qkvt37c0.js.map +0 -9
- package/dist/chunks/studio-sjh1wt1a.js +0 -3744
- package/dist/chunks/studio-sjh1wt1a.js.map +0 -22
- package/dist/chunks/studio-v7jkjqng.js.map +0 -46
- 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-yfcstdzy.js +0 -399
- package/dist/chunks/studio-yfcstdzy.js.map +0 -12
- package/dist/chunks/studio-zp7jncs8.js +0 -469
- package/dist/chunks/studio-zp7jncs8.js.map +0 -14
- 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-8jxwts2p.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-esrewxap.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
|
@@ -0,0 +1,369 @@
|
|
|
1
|
+
/// <reference lib="dom" />
|
|
2
|
+
/**
|
|
3
|
+
* The Library's five layouts.
|
|
4
|
+
*
|
|
5
|
+
* All five draw the SAME rows — one scan, one filter — so switching layout is a repaint, never a
|
|
6
|
+
* re-read. What differs is the geometry, and the geometry is data ({@link LAYOUT_METRICS}) rather
|
|
7
|
+
* than five hand-rolled scroll containers: the pane hands each layout a window computed from the
|
|
8
|
+
* metric, so virtualization is a property of the Library rather than of whichever layout someone
|
|
9
|
+
* remembered to virtualize.
|
|
10
|
+
*
|
|
11
|
+
* **Two of them are grouped, and grouped lists are bounded differently.** Table, Cards and Media
|
|
12
|
+
* are flat and uniform, so they window. Calendar and Board are grouped, and a window over a grouped
|
|
13
|
+
* list either breaks the groups or needs variable-height measurement; both draw text only (no live
|
|
14
|
+
* preview, so an item costs a `<div>`), and each caps what it draws and SAYS what it left out. A
|
|
15
|
+
* layout that silently truncated would be the same class of lie as "No files found".
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import { html, nothing } from "lit-html";
|
|
19
|
+
import { repeat } from "lit-html/directives/repeat.js";
|
|
20
|
+
import { ref } from "lit-html/directives/ref.js";
|
|
21
|
+
import { isImage } from "../files/media-upload";
|
|
22
|
+
import { loopbackAssetSrc } from "../canvas/canvas-origin";
|
|
23
|
+
import { localeLabel } from "@jxsuite/schema/locale";
|
|
24
|
+
import { groupByCategory, groupByDate } from "./library-model";
|
|
25
|
+
import type { LibraryFile, LibraryLayout } from "./library-model";
|
|
26
|
+
import type { GridColumn, GridCellValue } from "../grid/grid-source";
|
|
27
|
+
import type { TemplateResult } from "lit-html";
|
|
28
|
+
|
|
29
|
+
/** The geometry a layout scrolls at. `itemWidth` of 0 means one item per row. */
|
|
30
|
+
export interface LayoutMetric {
|
|
31
|
+
/** Height of one row of items, in CSS pixels — the unit the window counts in. */
|
|
32
|
+
rowHeight: number;
|
|
33
|
+
/** Nominal item width; 0 for a full-width row. */
|
|
34
|
+
itemWidth: number;
|
|
35
|
+
/** Whether the layout windows at all. Grouped layouts cap instead. */
|
|
36
|
+
windowed: boolean;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Per-layout geometry.
|
|
41
|
+
*
|
|
42
|
+
* These are nominal sizes that must match `styles/`'s Library rules. They are approximate on
|
|
43
|
+
* purpose: the window's job is to keep the rendered count proportional to the viewport, and being
|
|
44
|
+
* one row out costs one row of overscan, not correctness.
|
|
45
|
+
*/
|
|
46
|
+
export const LAYOUT_METRICS: Readonly<Record<LibraryLayout, LayoutMetric>> = {
|
|
47
|
+
board: { itemWidth: 0, rowHeight: 0, windowed: false },
|
|
48
|
+
calendar: { itemWidth: 0, rowHeight: 0, windowed: false },
|
|
49
|
+
cards: { itemWidth: 200, rowHeight: 194, windowed: true },
|
|
50
|
+
media: { itemWidth: 132, rowHeight: 132, windowed: true },
|
|
51
|
+
table: { itemWidth: 0, rowHeight: 32, windowed: true },
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
/** Days the Calendar draws before it stops and states the remainder. */
|
|
55
|
+
export const CALENDAR_DAY_LIMIT = 60;
|
|
56
|
+
|
|
57
|
+
/** Items a Board column draws before it stops and states the remainder. */
|
|
58
|
+
export const BOARD_COLUMN_LIMIT = 25;
|
|
59
|
+
|
|
60
|
+
/** Items per row at a given container width, for the layouts that flow. */
|
|
61
|
+
export function columnsAt(layout: LibraryLayout, width: number): number {
|
|
62
|
+
const metric = LAYOUT_METRICS[layout];
|
|
63
|
+
if (metric.itemWidth <= 0 || width <= 0) {
|
|
64
|
+
return 1;
|
|
65
|
+
}
|
|
66
|
+
return Math.max(1, Math.floor(width / metric.itemWidth));
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// ─── What a layout is handed ─────────────────────────────────────────────────
|
|
70
|
+
|
|
71
|
+
export interface LayoutContext {
|
|
72
|
+
/** The source's columns — the Table layout's headers and cell order come from the GridSource. */
|
|
73
|
+
columns: readonly GridColumn[];
|
|
74
|
+
openFile: (path: string) => void;
|
|
75
|
+
contextMenu: (event: MouseEvent, file: LibraryFile) => void;
|
|
76
|
+
/**
|
|
77
|
+
* Register a card's preview slot for lazy mounting. Called from a lit `ref`, so it receives
|
|
78
|
+
* `undefined` on unmount and must tolerate it.
|
|
79
|
+
*/
|
|
80
|
+
mountPreview: (element: Element | undefined, file: LibraryFile) => void;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// ─── Cell text ───────────────────────────────────────────────────────────────
|
|
84
|
+
|
|
85
|
+
/** Bytes as a short human string. `null` when the platform did not report a size. */
|
|
86
|
+
export function formatSize(size: number | undefined): string {
|
|
87
|
+
if (size === undefined || !Number.isFinite(size)) {
|
|
88
|
+
return "";
|
|
89
|
+
}
|
|
90
|
+
if (size < 1024) {
|
|
91
|
+
return `${size} B`;
|
|
92
|
+
}
|
|
93
|
+
const units = ["KB", "MB", "GB"];
|
|
94
|
+
let value = size / 1024;
|
|
95
|
+
let unit = 0;
|
|
96
|
+
while (value >= 1024 && unit < units.length - 1) {
|
|
97
|
+
value /= 1024;
|
|
98
|
+
unit += 1;
|
|
99
|
+
}
|
|
100
|
+
return `${value < 10 ? value.toFixed(1) : Math.round(value)} ${units[unit]}`;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/** An ISO timestamp as `YYYY-MM-DD`, or "" when there is none. Never invents "just now". */
|
|
104
|
+
export function formatModified(modified: string | undefined): string {
|
|
105
|
+
if (!modified) {
|
|
106
|
+
return "";
|
|
107
|
+
}
|
|
108
|
+
const parsed = new Date(modified);
|
|
109
|
+
return Number.isNaN(parsed.getTime()) ? "" : parsed.toISOString().slice(0, 10);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/** The text one table cell shows for a file. */
|
|
113
|
+
export function cellText(file: LibraryFile, field: string): string {
|
|
114
|
+
switch (field) {
|
|
115
|
+
case "category": {
|
|
116
|
+
return file.category;
|
|
117
|
+
}
|
|
118
|
+
case "locale": {
|
|
119
|
+
// The autonym, not the tag: the column exists so a reader can find their own language in it,
|
|
120
|
+
// And `français` is what that reader scans for. The tag is still the filter's value.
|
|
121
|
+
return file.locale ? localeLabel(file.locale) : "";
|
|
122
|
+
}
|
|
123
|
+
case "modified": {
|
|
124
|
+
return formatModified(file.modified);
|
|
125
|
+
}
|
|
126
|
+
case "name": {
|
|
127
|
+
return file.name;
|
|
128
|
+
}
|
|
129
|
+
case "path": {
|
|
130
|
+
return file.path;
|
|
131
|
+
}
|
|
132
|
+
case "size": {
|
|
133
|
+
return formatSize(file.size);
|
|
134
|
+
}
|
|
135
|
+
case "type": {
|
|
136
|
+
return file.type;
|
|
137
|
+
}
|
|
138
|
+
default: {
|
|
139
|
+
return "";
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/** Row-shaped access for a caller holding grid cells rather than the typed record. */
|
|
145
|
+
export function cellTextOf(value: GridCellValue): string {
|
|
146
|
+
return value === null || value === undefined ? "" : String(value);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// ─── Shared pieces ───────────────────────────────────────────────────────────
|
|
150
|
+
|
|
151
|
+
/** A file's thumbnail: the real image for media, a lazily-mounted live preview for a document. */
|
|
152
|
+
function previewTpl(file: LibraryFile, ctx: LayoutContext): TemplateResult {
|
|
153
|
+
if (isImage(file.ext)) {
|
|
154
|
+
return html`<img
|
|
155
|
+
class="library-thumb"
|
|
156
|
+
loading="lazy"
|
|
157
|
+
src=${loopbackAssetSrc(`/${file.path}`)}
|
|
158
|
+
alt=""
|
|
159
|
+
/>`;
|
|
160
|
+
}
|
|
161
|
+
const previewable =
|
|
162
|
+
file.category === "Components" ||
|
|
163
|
+
file.category === "Pages" ||
|
|
164
|
+
file.category === "Layouts" ||
|
|
165
|
+
file.category === "Content";
|
|
166
|
+
if (!previewable) {
|
|
167
|
+
return html`<sp-icon-document size="xl"></sp-icon-document>`;
|
|
168
|
+
}
|
|
169
|
+
return html`<div
|
|
170
|
+
class="library-preview-slot"
|
|
171
|
+
${ref((element) => ctx.mountPreview(element, file))}
|
|
172
|
+
></div>`;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/** One clickable item, in whichever wrapper the layout wants. */
|
|
176
|
+
function itemAttrs(file: LibraryFile, ctx: LayoutContext) {
|
|
177
|
+
return {
|
|
178
|
+
contextmenu: (event: MouseEvent) => ctx.contextMenu(event, file),
|
|
179
|
+
open: () => ctx.openFile(file.path),
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// ─── Table ───────────────────────────────────────────────────────────────────
|
|
184
|
+
|
|
185
|
+
/** The Table layout's header, from the source's own columns. */
|
|
186
|
+
export function tableHeadTpl(columns: readonly GridColumn[]): TemplateResult {
|
|
187
|
+
return html`<div class="library-table-head" role="row">
|
|
188
|
+
${columns.map(
|
|
189
|
+
(column) =>
|
|
190
|
+
html`<div class="library-table-cell" role="columnheader" data-field=${column.field}>
|
|
191
|
+
${column.title}
|
|
192
|
+
</div>`,
|
|
193
|
+
)}
|
|
194
|
+
</div>`;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/** The windowed slice of table rows. */
|
|
198
|
+
export function tableRowsTpl(
|
|
199
|
+
files: readonly LibraryFile[],
|
|
200
|
+
ctx: LayoutContext,
|
|
201
|
+
): TemplateResult | typeof nothing {
|
|
202
|
+
if (files.length === 0) {
|
|
203
|
+
return nothing;
|
|
204
|
+
}
|
|
205
|
+
return html`${repeat(
|
|
206
|
+
files,
|
|
207
|
+
(file) => file.path,
|
|
208
|
+
(file) => {
|
|
209
|
+
const attrs = itemAttrs(file, ctx);
|
|
210
|
+
return html`<div
|
|
211
|
+
class="library-table-row"
|
|
212
|
+
role="row"
|
|
213
|
+
data-path=${file.path}
|
|
214
|
+
@click=${attrs.open}
|
|
215
|
+
@contextmenu=${attrs.contextmenu}
|
|
216
|
+
>
|
|
217
|
+
${ctx.columns.map(
|
|
218
|
+
(column) =>
|
|
219
|
+
html`<div class="library-table-cell" role="cell" data-field=${column.field}>
|
|
220
|
+
${cellText(file, column.field)}
|
|
221
|
+
</div>`,
|
|
222
|
+
)}
|
|
223
|
+
</div>`;
|
|
224
|
+
},
|
|
225
|
+
)}`;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
// ─── Cards and Media ─────────────────────────────────────────────────────────
|
|
229
|
+
|
|
230
|
+
/** Cards: a preview, a name, and the category beneath it. */
|
|
231
|
+
export function cardsTpl(files: readonly LibraryFile[], ctx: LayoutContext): TemplateResult {
|
|
232
|
+
return html`${repeat(
|
|
233
|
+
files,
|
|
234
|
+
(file) => file.path,
|
|
235
|
+
(file) => {
|
|
236
|
+
const attrs = itemAttrs(file, ctx);
|
|
237
|
+
return html`<div
|
|
238
|
+
class="library-card"
|
|
239
|
+
data-path=${file.path}
|
|
240
|
+
@click=${attrs.open}
|
|
241
|
+
@contextmenu=${attrs.contextmenu}
|
|
242
|
+
>
|
|
243
|
+
<div class="library-card-preview">${previewTpl(file, ctx)}</div>
|
|
244
|
+
<div class="library-card-label" title=${file.path}>${file.name}</div>
|
|
245
|
+
<div class="library-card-meta">${file.type}</div>
|
|
246
|
+
</div>`;
|
|
247
|
+
},
|
|
248
|
+
)}`;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/** Media: tighter tiles, image-first, no live document renders at all. */
|
|
252
|
+
export function mediaTpl(files: readonly LibraryFile[], ctx: LayoutContext): TemplateResult {
|
|
253
|
+
return html`${repeat(
|
|
254
|
+
files,
|
|
255
|
+
(file) => file.path,
|
|
256
|
+
(file) => {
|
|
257
|
+
const attrs = itemAttrs(file, ctx);
|
|
258
|
+
return html`<div
|
|
259
|
+
class="library-tile"
|
|
260
|
+
data-path=${file.path}
|
|
261
|
+
title=${file.path}
|
|
262
|
+
@click=${attrs.open}
|
|
263
|
+
@contextmenu=${attrs.contextmenu}
|
|
264
|
+
>
|
|
265
|
+
<div class="library-tile-preview">
|
|
266
|
+
${
|
|
267
|
+
isImage(file.ext)
|
|
268
|
+
? html`<img
|
|
269
|
+
class="library-thumb"
|
|
270
|
+
loading="lazy"
|
|
271
|
+
src=${loopbackAssetSrc(`/${file.path}`)}
|
|
272
|
+
alt=""
|
|
273
|
+
/>`
|
|
274
|
+
: html`<sp-icon-document size="l"></sp-icon-document>`
|
|
275
|
+
}
|
|
276
|
+
</div>
|
|
277
|
+
<div class="library-tile-label">${file.name}</div>
|
|
278
|
+
</div>`;
|
|
279
|
+
},
|
|
280
|
+
)}`;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
// ─── Calendar ────────────────────────────────────────────────────────────────
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* Calendar: one section per day, newest first, plus an explicit account of what it did not place.
|
|
287
|
+
*
|
|
288
|
+
* A file's day comes from a `YYYY-MM-DD` filename prefix or the filesystem's mtime — never from
|
|
289
|
+
* "now". Files with neither are listed under "No date" rather than parked on today, because a
|
|
290
|
+
* calendar that invents dates is worse than one that admits it cannot place a file.
|
|
291
|
+
*/
|
|
292
|
+
export function calendarTpl(files: readonly LibraryFile[], ctx: LayoutContext): TemplateResult {
|
|
293
|
+
const { days, undated } = groupByDate(files);
|
|
294
|
+
const shown = days.slice(0, CALENDAR_DAY_LIMIT);
|
|
295
|
+
const hiddenDays = days.length - shown.length;
|
|
296
|
+
return html`<div class="library-calendar">
|
|
297
|
+
${shown.map(
|
|
298
|
+
(day) => html`<section class="library-day">
|
|
299
|
+
<h3 class="library-day-date">${day.date}</h3>
|
|
300
|
+
${listTpl(day.files, ctx)}
|
|
301
|
+
</section>`,
|
|
302
|
+
)}
|
|
303
|
+
${
|
|
304
|
+
hiddenDays > 0
|
|
305
|
+
? html`<p class="library-truncated">
|
|
306
|
+
${hiddenDays} older ${hiddenDays === 1 ? "day is" : "days are"} not shown — filter, or
|
|
307
|
+
switch to Table.
|
|
308
|
+
</p>`
|
|
309
|
+
: nothing
|
|
310
|
+
}
|
|
311
|
+
${
|
|
312
|
+
undated.length > 0
|
|
313
|
+
? html`<section class="library-day library-day-undated">
|
|
314
|
+
<h3 class="library-day-date">No date</h3>
|
|
315
|
+
<p class="library-day-note">
|
|
316
|
+
${undated.length} file${undated.length === 1 ? "" : "s"} with no dated name and no
|
|
317
|
+
modification time.
|
|
318
|
+
</p>
|
|
319
|
+
${listTpl(undated.slice(0, BOARD_COLUMN_LIMIT), ctx)}
|
|
320
|
+
</section>`
|
|
321
|
+
: nothing
|
|
322
|
+
}
|
|
323
|
+
</div>`;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
// ─── Board ───────────────────────────────────────────────────────────────────
|
|
327
|
+
|
|
328
|
+
/** Board: one column per category present, each capped and each stating its own total. */
|
|
329
|
+
export function boardTpl(files: readonly LibraryFile[], ctx: LayoutContext): TemplateResult {
|
|
330
|
+
const groups = groupByCategory(files);
|
|
331
|
+
return html`<div class="library-board">
|
|
332
|
+
${groups.map((group) => {
|
|
333
|
+
const hidden = group.files.length - BOARD_COLUMN_LIMIT;
|
|
334
|
+
return html`<section class="library-board-column">
|
|
335
|
+
<h3 class="library-board-title">
|
|
336
|
+
${group.group} <span class="library-board-count">${group.files.length}</span>
|
|
337
|
+
</h3>
|
|
338
|
+
${listTpl(group.files.slice(0, BOARD_COLUMN_LIMIT), ctx)}
|
|
339
|
+
${
|
|
340
|
+
hidden > 0
|
|
341
|
+
? html`<p class="library-truncated">${hidden} more — switch to Table to see them.</p>`
|
|
342
|
+
: nothing
|
|
343
|
+
}
|
|
344
|
+
</section>`;
|
|
345
|
+
})}
|
|
346
|
+
</div>`;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
/** The plain name list both grouped layouts draw. Text only: a group must stay cheap. */
|
|
350
|
+
function listTpl(files: readonly LibraryFile[], ctx: LayoutContext): TemplateResult {
|
|
351
|
+
return html`<ul class="library-list">
|
|
352
|
+
${repeat(
|
|
353
|
+
files,
|
|
354
|
+
(file) => file.path,
|
|
355
|
+
(file) => {
|
|
356
|
+
const attrs = itemAttrs(file, ctx);
|
|
357
|
+
return html`<li
|
|
358
|
+
class="library-list-item"
|
|
359
|
+
data-path=${file.path}
|
|
360
|
+
title=${file.path}
|
|
361
|
+
@click=${attrs.open}
|
|
362
|
+
@contextmenu=${attrs.contextmenu}
|
|
363
|
+
>
|
|
364
|
+
${file.name}
|
|
365
|
+
</li>`;
|
|
366
|
+
},
|
|
367
|
+
)}
|
|
368
|
+
</ul>`;
|
|
369
|
+
}
|