@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
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session.ts — what a project looked like when you left it, and how it looks that way again.
|
|
3
|
+
*
|
|
4
|
+
* Plan §4.4: "Session state persists **per project root** … open tabs and order per pane, active
|
|
5
|
+
* tab, per-tab editor kind / view / zoom / rendering context." P3's "Newly possible" states the
|
|
6
|
+
* consequence plainly: **the session survives a relaunch.** Neither shipped. The per-project record
|
|
7
|
+
* held `layouts` and `activeLayout` and nothing else, its interface said "Session state (§4.4)
|
|
8
|
+
* grows into this shape", and reopening a project landed on the home page with an empty strip — so
|
|
9
|
+
* nine open documents, a split, and the breakpoint you were checking were lost every time.
|
|
10
|
+
*
|
|
11
|
+
* **Paths, not tab ids.** A tab id is minted per open and means nothing across a reload; the
|
|
12
|
+
* document's path is the identity the workspace already dedupes on (`openFileInTab` scans
|
|
13
|
+
* `tab.documentPath`). A stored path that no longer resolves is skipped on restore rather than
|
|
14
|
+
* failing the whole session — files move, and losing the other eight tabs because one was renamed
|
|
15
|
+
* would be worse than the problem this solves.
|
|
16
|
+
*
|
|
17
|
+
* **Only what the author chose.** Per tab it records the canvas mode, the preview flag, the zooms
|
|
18
|
+
* and the rendering context — the settings a person deliberately put a document into. Selection,
|
|
19
|
+
* hover, clipboard, undo history and the live canvas scope are all derived or transient, and
|
|
20
|
+
* restoring a selection into a document that has since changed on disk would point at a node that
|
|
21
|
+
* may not exist.
|
|
22
|
+
*
|
|
23
|
+
* **Untrusted input.** Everything read back is `localStorage`, which is hand-editable and survives
|
|
24
|
+
* across versions. Every field is validated on the way in and a bad record restores nothing.
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
import { PRIMARY_PANE, SECONDARY_PANE, focusPane, workspace } from "./workspace";
|
|
28
|
+
import { isWellFormedLocale } from "@jxsuite/schema/locale";
|
|
29
|
+
import type { Tab } from "../tabs/tab";
|
|
30
|
+
|
|
31
|
+
/** One pane's share of a session. */
|
|
32
|
+
export interface PersistedPane {
|
|
33
|
+
/** `PRIMARY_PANE` or `SECONDARY_PANE` — the two ids the grid has (§18.1). */
|
|
34
|
+
id: string;
|
|
35
|
+
/** Document paths in strip order. Untitled tabs are absent: they have no path to restore from. */
|
|
36
|
+
files: string[];
|
|
37
|
+
/** Which of `files` was active, or `null`. */
|
|
38
|
+
activeFile: string | null;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/** What a document was showing when the project was last closed. */
|
|
42
|
+
export interface PersistedTabUi {
|
|
43
|
+
canvasMode?: string;
|
|
44
|
+
preview?: boolean;
|
|
45
|
+
zoom?: number;
|
|
46
|
+
editZoom?: number;
|
|
47
|
+
activeMedia?: string | null;
|
|
48
|
+
previewColorScheme?: string;
|
|
49
|
+
/** BCP 47 tag, or `null` for "the document's own language". */
|
|
50
|
+
previewLocale?: string | null;
|
|
51
|
+
showLayout?: boolean;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/** The whole session, as stored. */
|
|
55
|
+
export interface PersistedSession {
|
|
56
|
+
panes: PersistedPane[];
|
|
57
|
+
/** Which pane had the keyboard. */
|
|
58
|
+
focusedPane: string;
|
|
59
|
+
/** Per-document view settings, keyed by path. */
|
|
60
|
+
ui: Record<string, PersistedTabUi>;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const PANE_IDS = new Set([PRIMARY_PANE, SECONDARY_PANE]);
|
|
64
|
+
const SCHEMES = new Set(["auto", "light", "dark"]);
|
|
65
|
+
|
|
66
|
+
/** The view settings this tab was left in — the ones a person chose, not the ones derived. */
|
|
67
|
+
function uiOf(tab: Tab): PersistedTabUi {
|
|
68
|
+
const { ui } = tab.session;
|
|
69
|
+
return {
|
|
70
|
+
activeMedia: ui.activeMedia,
|
|
71
|
+
canvasMode: ui.canvasMode,
|
|
72
|
+
editZoom: ui.editZoom,
|
|
73
|
+
preview: ui.preview,
|
|
74
|
+
previewColorScheme: ui.previewColorScheme,
|
|
75
|
+
previewLocale: ui.previewLocale,
|
|
76
|
+
showLayout: ui.showLayout,
|
|
77
|
+
zoom: ui.zoom,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Snapshot the workspace.
|
|
83
|
+
*
|
|
84
|
+
* A pane with no restorable tab is dropped rather than stored empty — restoring a split whose
|
|
85
|
+
* second half has nothing in it would reopen a pane the author would immediately close.
|
|
86
|
+
*/
|
|
87
|
+
export function captureSession(): PersistedSession {
|
|
88
|
+
const ui: Record<string, PersistedTabUi> = {};
|
|
89
|
+
const panes: PersistedPane[] = [];
|
|
90
|
+
for (const pane of workspace.panes) {
|
|
91
|
+
// A DERIVED pane owns no tabs — it is a projection of another pane (§18.4) — and re-deriving it
|
|
92
|
+
// Needs the source pane's document to exist first. Not stored; the author re-derives in a
|
|
93
|
+
// Keystroke, and a half-restored derivation pointing at a pane that failed to fill is worse.
|
|
94
|
+
if (pane.derived) {
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
const files: string[] = [];
|
|
98
|
+
for (const tabId of pane.tabOrder) {
|
|
99
|
+
const tab = workspace.tabs.get(tabId);
|
|
100
|
+
if (!tab?.documentPath) {
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
files.push(tab.documentPath);
|
|
104
|
+
ui[tab.documentPath] = uiOf(tab);
|
|
105
|
+
}
|
|
106
|
+
if (files.length === 0) {
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
const activeTab = pane.activeTabId ? workspace.tabs.get(pane.activeTabId) : null;
|
|
110
|
+
panes.push({
|
|
111
|
+
activeFile: activeTab?.documentPath ?? null,
|
|
112
|
+
files,
|
|
113
|
+
id: pane.id,
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
return { focusedPane: workspace.activePaneId, panes, ui };
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/** Whether a parsed value is a usable {@link PersistedTabUi}. Hand-edited storage is input. */
|
|
120
|
+
function readTabUi(value: unknown): PersistedTabUi {
|
|
121
|
+
if (typeof value !== "object" || value === null) {
|
|
122
|
+
return {};
|
|
123
|
+
}
|
|
124
|
+
const raw = value as Record<string, unknown>;
|
|
125
|
+
const out: PersistedTabUi = {};
|
|
126
|
+
if (typeof raw.canvasMode === "string") {
|
|
127
|
+
out.canvasMode = raw.canvasMode;
|
|
128
|
+
}
|
|
129
|
+
if (typeof raw.preview === "boolean") {
|
|
130
|
+
out.preview = raw.preview;
|
|
131
|
+
}
|
|
132
|
+
if (typeof raw.zoom === "number" && Number.isFinite(raw.zoom)) {
|
|
133
|
+
out.zoom = raw.zoom;
|
|
134
|
+
}
|
|
135
|
+
if (typeof raw.editZoom === "number" && Number.isFinite(raw.editZoom)) {
|
|
136
|
+
out.editZoom = raw.editZoom;
|
|
137
|
+
}
|
|
138
|
+
if (raw.activeMedia === null || typeof raw.activeMedia === "string") {
|
|
139
|
+
out.activeMedia = raw.activeMedia;
|
|
140
|
+
}
|
|
141
|
+
if (typeof raw.previewColorScheme === "string" && SCHEMES.has(raw.previewColorScheme)) {
|
|
142
|
+
out.previewColorScheme = raw.previewColorScheme;
|
|
143
|
+
}
|
|
144
|
+
/* `null` is a value here, not an absence: it is "the document's own language", so a pane put
|
|
145
|
+
deliberately back onto its own file's language would otherwise restore the tag it left.
|
|
146
|
+
A tag is checked for WELL-FORMEDNESS only — whether the project still declares it is a
|
|
147
|
+
question about `project.json`, which the reader cannot see and which changes between sessions;
|
|
148
|
+
the control refuses an undeclared tag on the way in and the render falls back on the way out. */
|
|
149
|
+
if (raw.previewLocale === null || isWellFormedLocale(raw.previewLocale)) {
|
|
150
|
+
out.previewLocale = raw.previewLocale as string | null;
|
|
151
|
+
}
|
|
152
|
+
if (typeof raw.showLayout === "boolean") {
|
|
153
|
+
out.showLayout = raw.showLayout;
|
|
154
|
+
}
|
|
155
|
+
return out;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Validate a stored session. Returns `null` for anything that is not one — a corrupt record
|
|
160
|
+
* restores nothing rather than restoring half a workspace.
|
|
161
|
+
*/
|
|
162
|
+
export function readSession(value: unknown): PersistedSession | null {
|
|
163
|
+
if (typeof value !== "object" || value === null) {
|
|
164
|
+
return null;
|
|
165
|
+
}
|
|
166
|
+
const raw = value as Partial<PersistedSession>;
|
|
167
|
+
if (!Array.isArray(raw.panes)) {
|
|
168
|
+
return null;
|
|
169
|
+
}
|
|
170
|
+
const panes: PersistedPane[] = [];
|
|
171
|
+
for (const entry of raw.panes) {
|
|
172
|
+
if (typeof entry !== "object" || entry === null) {
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
const pane = entry as Partial<PersistedPane>;
|
|
176
|
+
if (typeof pane.id !== "string" || !PANE_IDS.has(pane.id)) {
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
const files = Array.isArray(pane.files)
|
|
180
|
+
? pane.files.filter((file): file is string => typeof file === "string" && file !== "")
|
|
181
|
+
: [];
|
|
182
|
+
if (files.length === 0) {
|
|
183
|
+
continue;
|
|
184
|
+
}
|
|
185
|
+
panes.push({
|
|
186
|
+
activeFile:
|
|
187
|
+
typeof pane.activeFile === "string" && files.includes(pane.activeFile)
|
|
188
|
+
? pane.activeFile
|
|
189
|
+
: null,
|
|
190
|
+
files,
|
|
191
|
+
id: pane.id,
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
if (panes.length === 0) {
|
|
195
|
+
return null;
|
|
196
|
+
}
|
|
197
|
+
const ui: Record<string, PersistedTabUi> = {};
|
|
198
|
+
if (typeof raw.ui === "object" && raw.ui !== null) {
|
|
199
|
+
for (const [path, entry] of Object.entries(raw.ui as Record<string, unknown>)) {
|
|
200
|
+
ui[path] = readTabUi(entry);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
return {
|
|
204
|
+
focusedPane:
|
|
205
|
+
typeof raw.focusedPane === "string" && PANE_IDS.has(raw.focusedPane)
|
|
206
|
+
? raw.focusedPane
|
|
207
|
+
: PRIMARY_PANE,
|
|
208
|
+
panes,
|
|
209
|
+
ui,
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/** What {@link restoreSession} needs from the rest of Studio, so this module opens no files itself. */
|
|
214
|
+
export interface RestoreDeps {
|
|
215
|
+
/** Open one path into one pane, without moving the keyboard. Rejects if the file is gone. */
|
|
216
|
+
openFile: (path: string, paneId: string) => Promise<void>;
|
|
217
|
+
/**
|
|
218
|
+
* Make sure the grid HAS a second pane, without moving anything into it.
|
|
219
|
+
*
|
|
220
|
+
* `receivingPane()`, not `splitRight()`: a split moves the focused pane's active tab, and at this
|
|
221
|
+
* point nothing is open — so `splitRight()` returns `null`, the pane is never created, and the
|
|
222
|
+
* second pane's documents all land in the first.
|
|
223
|
+
*/
|
|
224
|
+
ensureSecondPane: () => void;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Reopen what the session describes. Returns how many documents actually landed.
|
|
229
|
+
*
|
|
230
|
+
* A path that no longer resolves is SKIPPED, not fatal: files move, and losing eight tabs because
|
|
231
|
+
* one was renamed would be a worse bug than the one this fixes. `0` means nothing restored, which
|
|
232
|
+
* is the caller's signal to fall back to the home page.
|
|
233
|
+
*/
|
|
234
|
+
export async function restoreSession(
|
|
235
|
+
session: PersistedSession,
|
|
236
|
+
deps: RestoreDeps,
|
|
237
|
+
): Promise<number> {
|
|
238
|
+
let opened = 0;
|
|
239
|
+
if (session.panes.some((pane) => pane.id === SECONDARY_PANE)) {
|
|
240
|
+
deps.ensureSecondPane();
|
|
241
|
+
}
|
|
242
|
+
for (const pane of session.panes) {
|
|
243
|
+
for (const file of pane.files) {
|
|
244
|
+
try {
|
|
245
|
+
await deps.openFile(file, pane.id);
|
|
246
|
+
} catch {
|
|
247
|
+
// Moved, renamed or deleted since. The rest of the session is still worth having.
|
|
248
|
+
}
|
|
249
|
+
/*
|
|
250
|
+
* COUNT WHAT LANDED, not what failed to throw.
|
|
251
|
+
*
|
|
252
|
+
* `openFileInTab` reports a missing file by raising a Problem and returning normally — it is
|
|
253
|
+
* a user action, not an exception — so counting calls made every restore look like a success.
|
|
254
|
+
* A session of three deleted files then reported `3`, the caller skipped its home-page
|
|
255
|
+
* fallback, and the window opened empty. The workspace is the only honest answer to "is it
|
|
256
|
+
* open?", and it is the same field `openFileInTab` dedupes against.
|
|
257
|
+
*/
|
|
258
|
+
if ([...workspace.tabs.values()].some((tab) => tab.documentPath === file)) {
|
|
259
|
+
opened += 1;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
if (opened === 0) {
|
|
264
|
+
return 0;
|
|
265
|
+
}
|
|
266
|
+
// The view settings, applied AFTER every tab exists: `canvasMode` is validated against the tab's
|
|
267
|
+
// Own `capabilities.modes` by the setter, and a mode a document does not support is dropped.
|
|
268
|
+
for (const tab of workspace.tabs.values()) {
|
|
269
|
+
const stored = tab.documentPath ? session.ui[tab.documentPath] : undefined;
|
|
270
|
+
if (!stored) {
|
|
271
|
+
continue;
|
|
272
|
+
}
|
|
273
|
+
const { ui } = tab.session;
|
|
274
|
+
if (stored.canvasMode && tab.capabilities.modes.includes(stored.canvasMode)) {
|
|
275
|
+
ui.canvasMode = stored.canvasMode;
|
|
276
|
+
}
|
|
277
|
+
if (stored.preview !== undefined) {
|
|
278
|
+
ui.preview = stored.preview;
|
|
279
|
+
}
|
|
280
|
+
if (stored.zoom !== undefined) {
|
|
281
|
+
ui.zoom = stored.zoom;
|
|
282
|
+
}
|
|
283
|
+
if (stored.editZoom !== undefined) {
|
|
284
|
+
ui.editZoom = stored.editZoom;
|
|
285
|
+
}
|
|
286
|
+
if (stored.activeMedia !== undefined) {
|
|
287
|
+
ui.activeMedia = stored.activeMedia;
|
|
288
|
+
}
|
|
289
|
+
if (stored.previewColorScheme !== undefined) {
|
|
290
|
+
ui.previewColorScheme = stored.previewColorScheme as "auto" | "dark" | "light";
|
|
291
|
+
}
|
|
292
|
+
if (stored.previewLocale !== undefined) {
|
|
293
|
+
ui.previewLocale = stored.previewLocale;
|
|
294
|
+
}
|
|
295
|
+
if (stored.showLayout !== undefined) {
|
|
296
|
+
ui.showLayout = stored.showLayout;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
// Each pane's active tab, then the pane that had the keyboard — in that order, because activating
|
|
300
|
+
// A tab in a pane is what makes that pane's strip meaningful and focusing comes last.
|
|
301
|
+
for (const stored of session.panes) {
|
|
302
|
+
const pane = workspace.panes.find((p) => p.id === stored.id);
|
|
303
|
+
if (!pane || !stored.activeFile) {
|
|
304
|
+
continue;
|
|
305
|
+
}
|
|
306
|
+
const match = pane.tabOrder.find(
|
|
307
|
+
(tabId) => workspace.tabs.get(tabId)?.documentPath === stored.activeFile,
|
|
308
|
+
);
|
|
309
|
+
if (match) {
|
|
310
|
+
pane.activeTabId = match;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
if (workspace.panes.some((pane) => pane.id === session.focusedPane)) {
|
|
314
|
+
focusPane(session.focusedPane);
|
|
315
|
+
}
|
|
316
|
+
return opened;
|
|
317
|
+
}
|