@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,353 @@
|
|
|
1
|
+
import {
|
|
2
|
+
renderDeployChecklist
|
|
3
|
+
} from "./studio-myje51t3.js";
|
|
4
|
+
import {
|
|
5
|
+
registerPanel,
|
|
6
|
+
renderEmptyState
|
|
7
|
+
} from "./studio-v96qfnww.js";
|
|
8
|
+
import {
|
|
9
|
+
notify,
|
|
10
|
+
now,
|
|
11
|
+
openModal,
|
|
12
|
+
reactive,
|
|
13
|
+
setBottomTab
|
|
14
|
+
} from "./studio-41exgzhq.js";
|
|
15
|
+
import {
|
|
16
|
+
repeat
|
|
17
|
+
} from "./studio-p471gg5n.js";
|
|
18
|
+
import {
|
|
19
|
+
html,
|
|
20
|
+
nothing
|
|
21
|
+
} from "./studio-5x5774ak.js";
|
|
22
|
+
|
|
23
|
+
// src/panels/activity-panel.ts
|
|
24
|
+
var activities = reactive([]);
|
|
25
|
+
var MAX_FINISHED_ACTIVITIES = 20;
|
|
26
|
+
var _cancels = new Map;
|
|
27
|
+
var _seq = 0;
|
|
28
|
+
function nextId() {
|
|
29
|
+
_seq += 1;
|
|
30
|
+
return `a${_seq}`;
|
|
31
|
+
}
|
|
32
|
+
function isFinished(entry) {
|
|
33
|
+
return entry.state !== "running";
|
|
34
|
+
}
|
|
35
|
+
function retireOldest() {
|
|
36
|
+
let excess = activities.filter((entry) => isFinished(entry)).length - MAX_FINISHED_ACTIVITIES;
|
|
37
|
+
while (excess > 0) {
|
|
38
|
+
const at = activities.findIndex((entry) => isFinished(entry));
|
|
39
|
+
if (at === -1) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
_cancels.delete(activities[at].id);
|
|
43
|
+
activities.splice(at, 1);
|
|
44
|
+
excess -= 1;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
function beginActivity(options) {
|
|
48
|
+
const entry = {
|
|
49
|
+
cancellable: options.cancel !== undefined,
|
|
50
|
+
endedAt: null,
|
|
51
|
+
expanded: false,
|
|
52
|
+
id: nextId(),
|
|
53
|
+
log: [],
|
|
54
|
+
startedAt: now(),
|
|
55
|
+
state: "running",
|
|
56
|
+
status: options.status ?? "",
|
|
57
|
+
steps: (options.steps ?? []).map((label) => ({ label, state: "pending" })),
|
|
58
|
+
title: options.title,
|
|
59
|
+
...options.source === undefined ? {} : { source: options.source }
|
|
60
|
+
};
|
|
61
|
+
if (options.cancel) {
|
|
62
|
+
_cancels.set(entry.id, options.cancel);
|
|
63
|
+
}
|
|
64
|
+
activities.push(entry);
|
|
65
|
+
const live = activities.at(-1);
|
|
66
|
+
retireOldest();
|
|
67
|
+
const finish = (state, status) => {
|
|
68
|
+
if (isFinished(live)) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
live.state = state;
|
|
72
|
+
live.endedAt = now();
|
|
73
|
+
if (status !== undefined) {
|
|
74
|
+
live.status = status;
|
|
75
|
+
}
|
|
76
|
+
for (const step of live.steps) {
|
|
77
|
+
step.state = step.state === "done" ? "done" : state === "done" ? "done" : "failed";
|
|
78
|
+
}
|
|
79
|
+
live.cancellable = false;
|
|
80
|
+
_cancels.delete(live.id);
|
|
81
|
+
retireOldest();
|
|
82
|
+
};
|
|
83
|
+
return {
|
|
84
|
+
done(status) {
|
|
85
|
+
finish("done", status);
|
|
86
|
+
},
|
|
87
|
+
entry: live,
|
|
88
|
+
fail(message, opts = {}) {
|
|
89
|
+
if (isFinished(live)) {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
const detail = live.log.join(`
|
|
93
|
+
`);
|
|
94
|
+
finish("failed", message);
|
|
95
|
+
notify.error(message, {
|
|
96
|
+
source: live.source ?? live.title,
|
|
97
|
+
...detail === "" ? {} : { detail },
|
|
98
|
+
...opts.action === undefined ? {} : { action: opts.action },
|
|
99
|
+
...opts.path === undefined ? {} : { path: opts.path }
|
|
100
|
+
});
|
|
101
|
+
},
|
|
102
|
+
id: live.id,
|
|
103
|
+
log(chunk) {
|
|
104
|
+
const text = chunk.replace(/\s+$/, "");
|
|
105
|
+
if (text !== "") {
|
|
106
|
+
live.log.push(text);
|
|
107
|
+
}
|
|
108
|
+
},
|
|
109
|
+
setStatus(text) {
|
|
110
|
+
if (!isFinished(live)) {
|
|
111
|
+
live.status = text;
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
step(label) {
|
|
115
|
+
let at = live.steps.findIndex((step) => step.label === label);
|
|
116
|
+
if (at === -1) {
|
|
117
|
+
live.steps.push({ label, state: "pending" });
|
|
118
|
+
at = live.steps.length - 1;
|
|
119
|
+
}
|
|
120
|
+
for (const [index, step] of live.steps.entries()) {
|
|
121
|
+
step.state = index < at ? "done" : index === at ? "running" : step.state;
|
|
122
|
+
}
|
|
123
|
+
live.status = label;
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
function activityById(id) {
|
|
128
|
+
return activities.find((entry) => entry.id === id);
|
|
129
|
+
}
|
|
130
|
+
function runningActivities() {
|
|
131
|
+
return activities.filter((entry) => !isFinished(entry));
|
|
132
|
+
}
|
|
133
|
+
function cancelActivity(id) {
|
|
134
|
+
const entry = activityById(id);
|
|
135
|
+
const stop = _cancels.get(id);
|
|
136
|
+
if (!entry || !stop || isFinished(entry)) {
|
|
137
|
+
return false;
|
|
138
|
+
}
|
|
139
|
+
stop();
|
|
140
|
+
_cancels.delete(id);
|
|
141
|
+
entry.state = "cancelled";
|
|
142
|
+
entry.endedAt = now();
|
|
143
|
+
entry.cancellable = false;
|
|
144
|
+
entry.status = "Cancelled";
|
|
145
|
+
return true;
|
|
146
|
+
}
|
|
147
|
+
function clearFinishedActivities() {
|
|
148
|
+
const kept = activities.filter((entry) => !isFinished(entry));
|
|
149
|
+
const removed = activities.length - kept.length;
|
|
150
|
+
activities.splice(0, activities.length, ...kept);
|
|
151
|
+
return removed;
|
|
152
|
+
}
|
|
153
|
+
function activityIdleBlockers() {
|
|
154
|
+
return runningActivities().map((entry) => `activity: ${entry.title} — ${entry.status || "running"}`);
|
|
155
|
+
}
|
|
156
|
+
var STATE_ICON = {
|
|
157
|
+
cancelled: "⊘",
|
|
158
|
+
done: "✓",
|
|
159
|
+
failed: "✕",
|
|
160
|
+
running: "⋯"
|
|
161
|
+
};
|
|
162
|
+
var STEP_ICON = {
|
|
163
|
+
done: "✓",
|
|
164
|
+
failed: "✕",
|
|
165
|
+
pending: "·",
|
|
166
|
+
running: "⋯"
|
|
167
|
+
};
|
|
168
|
+
function activityDuration(entry, at = now()) {
|
|
169
|
+
const ms = Math.max(0, (entry.endedAt ?? at) - entry.startedAt);
|
|
170
|
+
if (ms < 1000) {
|
|
171
|
+
return `${ms}ms`;
|
|
172
|
+
}
|
|
173
|
+
const seconds = Math.round(ms / 1000);
|
|
174
|
+
return seconds < 60 ? `${seconds}s` : `${Math.floor(seconds / 60)}m ${seconds % 60}s`;
|
|
175
|
+
}
|
|
176
|
+
function stepsTpl(entry) {
|
|
177
|
+
if (entry.steps.length === 0) {
|
|
178
|
+
return nothing;
|
|
179
|
+
}
|
|
180
|
+
return html`<ol class="activity-steps">
|
|
181
|
+
${entry.steps.map((step) => html`<li class="activity-step activity-step--${step.state}">
|
|
182
|
+
<span class="activity-step-icon" aria-hidden="true">${STEP_ICON[step.state]}</span>
|
|
183
|
+
${step.label}
|
|
184
|
+
</li>`)}
|
|
185
|
+
</ol>`;
|
|
186
|
+
}
|
|
187
|
+
function logTpl(entry) {
|
|
188
|
+
if (entry.log.length === 0) {
|
|
189
|
+
return nothing;
|
|
190
|
+
}
|
|
191
|
+
return html`<button
|
|
192
|
+
class="activity-log-toggle"
|
|
193
|
+
aria-expanded=${entry.expanded ? "true" : "false"}
|
|
194
|
+
@click=${() => {
|
|
195
|
+
entry.expanded = !entry.expanded;
|
|
196
|
+
}}
|
|
197
|
+
>
|
|
198
|
+
${entry.expanded ? "Hide log" : `Show log (${entry.log.length} line(s))`}
|
|
199
|
+
</button>
|
|
200
|
+
${entry.expanded ? html`<pre class="activity-log">${entry.log.join(`
|
|
201
|
+
`)}</pre>` : nothing}`;
|
|
202
|
+
}
|
|
203
|
+
function activityTpl(entry) {
|
|
204
|
+
return html`
|
|
205
|
+
<li class="activity-row activity-row--${entry.state}">
|
|
206
|
+
<span class="activity-icon" aria-hidden="true">${STATE_ICON[entry.state]}</span>
|
|
207
|
+
<div class="activity-body">
|
|
208
|
+
<div class="activity-head">
|
|
209
|
+
<span class="activity-title">${entry.title}</span>
|
|
210
|
+
${entry.source ? html`<span class="activity-source">${entry.source}</span>` : nothing}
|
|
211
|
+
<span class="activity-duration">${activityDuration(entry)}</span>
|
|
212
|
+
</div>
|
|
213
|
+
${entry.status ? html`<div class="activity-status">${entry.status}</div>` : nothing}
|
|
214
|
+
${stepsTpl(entry)} ${logTpl(entry)}
|
|
215
|
+
</div>
|
|
216
|
+
${entry.cancellable ? html`<button
|
|
217
|
+
class="activity-cancel"
|
|
218
|
+
title="Stop this operation"
|
|
219
|
+
@click=${() => {
|
|
220
|
+
cancelActivity(entry.id);
|
|
221
|
+
}}
|
|
222
|
+
>
|
|
223
|
+
Cancel
|
|
224
|
+
</button>` : nothing}
|
|
225
|
+
</li>
|
|
226
|
+
`;
|
|
227
|
+
}
|
|
228
|
+
function renderActivityList() {
|
|
229
|
+
const checklist = renderDeployChecklist();
|
|
230
|
+
if (activities.length === 0) {
|
|
231
|
+
return html`${checklist}${renderEmptyState({
|
|
232
|
+
detail: "Installs, clones, publishes and imports report here while they run.",
|
|
233
|
+
message: "Long operations show their progress, their log and their Cancel button here."
|
|
234
|
+
})}`;
|
|
235
|
+
}
|
|
236
|
+
const finished = activities.filter((entry) => isFinished(entry)).length;
|
|
237
|
+
return html`
|
|
238
|
+
${checklist}
|
|
239
|
+
<div class="activity-panel">
|
|
240
|
+
${finished > 0 ? html`<div class="activity-actions">
|
|
241
|
+
<button
|
|
242
|
+
class="activity-clear"
|
|
243
|
+
@click=${() => {
|
|
244
|
+
clearFinishedActivities();
|
|
245
|
+
}}
|
|
246
|
+
>
|
|
247
|
+
Clear ${finished} finished
|
|
248
|
+
</button>
|
|
249
|
+
</div>` : nothing}
|
|
250
|
+
<ul class="activity-list">
|
|
251
|
+
${repeat(activities, (entry) => entry.id, (entry) => activityTpl(entry))}
|
|
252
|
+
</ul>
|
|
253
|
+
</div>
|
|
254
|
+
`;
|
|
255
|
+
}
|
|
256
|
+
function registerActivityPanel() {
|
|
257
|
+
registerPanel({
|
|
258
|
+
id: "activity",
|
|
259
|
+
title: "Activity",
|
|
260
|
+
level: "project",
|
|
261
|
+
dock: "bottom",
|
|
262
|
+
icon: "sp-icon-data",
|
|
263
|
+
rail: false,
|
|
264
|
+
badge: () => runningActivities().length > 0 ? runningActivities().length : null,
|
|
265
|
+
render: () => renderActivityList()
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
// src/ui/progress-modal.ts
|
|
270
|
+
function card(body) {
|
|
271
|
+
return html`
|
|
272
|
+
<sp-underlay open></sp-underlay>
|
|
273
|
+
<div class="progress-modal" aria-live="polite">${body}</div>
|
|
274
|
+
`;
|
|
275
|
+
}
|
|
276
|
+
function runningView(title, status, actions) {
|
|
277
|
+
return card(html`
|
|
278
|
+
<div class="progress-head">
|
|
279
|
+
<sp-progress-circle indeterminate size="m" aria-label=${title}></sp-progress-circle>
|
|
280
|
+
<div class="progress-lines">
|
|
281
|
+
<strong class="progress-title">${title}</strong>
|
|
282
|
+
${status ? html`<span class="progress-status">${status}</span>` : ""}
|
|
283
|
+
</div>
|
|
284
|
+
</div>
|
|
285
|
+
<div class="progress-actions">
|
|
286
|
+
<sp-button size="s" variant="secondary" treatment="outline" @click=${actions.background}>
|
|
287
|
+
Run in the background
|
|
288
|
+
</sp-button>
|
|
289
|
+
${actions.cancel ? html`<sp-button size="s" variant="negative" @click=${actions.cancel}>Cancel</sp-button>` : ""}
|
|
290
|
+
</div>
|
|
291
|
+
`);
|
|
292
|
+
}
|
|
293
|
+
function showProgressModal(opts) {
|
|
294
|
+
let closed = false;
|
|
295
|
+
const activity = beginActivity({
|
|
296
|
+
title: opts.title,
|
|
297
|
+
...opts.status === undefined ? {} : { status: opts.status },
|
|
298
|
+
...opts.source === undefined ? {} : { source: opts.source },
|
|
299
|
+
...opts.cancel === undefined ? {} : { cancel: opts.cancel }
|
|
300
|
+
});
|
|
301
|
+
const close = () => {
|
|
302
|
+
if (closed) {
|
|
303
|
+
return;
|
|
304
|
+
}
|
|
305
|
+
closed = true;
|
|
306
|
+
modal.close();
|
|
307
|
+
};
|
|
308
|
+
const background = () => {
|
|
309
|
+
close();
|
|
310
|
+
setBottomTab("activity");
|
|
311
|
+
};
|
|
312
|
+
const cancel = opts.cancel ? () => {
|
|
313
|
+
close();
|
|
314
|
+
opts.cancel?.();
|
|
315
|
+
} : undefined;
|
|
316
|
+
const view = (status) => runningView(opts.title, status, { background, cancel });
|
|
317
|
+
const modal = openModal(view(opts.status ?? ""), {
|
|
318
|
+
label: opts.title,
|
|
319
|
+
onDismiss: background
|
|
320
|
+
});
|
|
321
|
+
return {
|
|
322
|
+
activity,
|
|
323
|
+
done() {
|
|
324
|
+
activity.done();
|
|
325
|
+
close();
|
|
326
|
+
},
|
|
327
|
+
fail(message) {
|
|
328
|
+
const text = (message ?? "").trim();
|
|
329
|
+
if (text === "" || text.includes(`
|
|
330
|
+
`)) {
|
|
331
|
+
activity.log(text);
|
|
332
|
+
activity.fail(`${opts.title} failed`);
|
|
333
|
+
} else {
|
|
334
|
+
activity.fail(text);
|
|
335
|
+
}
|
|
336
|
+
close();
|
|
337
|
+
},
|
|
338
|
+
log(chunk) {
|
|
339
|
+
activity.log(chunk);
|
|
340
|
+
},
|
|
341
|
+
setStatus(text) {
|
|
342
|
+
activity.setStatus(text);
|
|
343
|
+
if (!closed) {
|
|
344
|
+
modal.update(view(text));
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
};
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
export { beginActivity, activityIdleBlockers, registerActivityPanel, showProgressModal };
|
|
351
|
+
|
|
352
|
+
//# debugId=E5DF930C7E1AD2C064756E2164756E21
|
|
353
|
+
//# sourceMappingURL=studio-na6rwzhw.js.map
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/panels/activity-panel.ts", "../src/ui/progress-modal.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/// <reference lib=\"dom\" />\n/**\n * Activity — where a long operation lives while it runs, and what it leaves behind (plan §7.3).\n *\n * What this replaces: `ui/progress-modal.ts` was **the only surface in Studio with a real error\n * view** — a red headline, the captured log in a `<pre>`, an explicit Close — and it had four call\n * sites, all package operations. It blocked the whole app, offered no cancel, and vanished\n * completely on success, so a `bun install` that hung had no exit and one that failed had a log you\n * could read exactly once. Every OTHER long operation — git clone, publish, media upload, site\n * import, project open — got a three-second grey line or nothing at all.\n *\n * An activity is a **record**, like a notification and a command:\n *\n * - It is **persistent** — a finished operation stays on the list, with its log, until the list is\n * cleared, so \"what did the import actually do?\" is answerable after the fact;\n * - It is **inspectable** — the log is the same captured output the modal used to show, and it is\n * attached to the entry rather than to a modal that is about to close;\n * - It can be **cancelled** — an operation that hands over a `cancel` callback gets a Cancel button\n * on its row, which is the affordance a hung install has never had;\n * - And it **fails into Problems** — {@link ActivityHandle.fail} raises a `notify.error` carrying the\n * log as its `detail`, so the failure outlives the run and carries a Retry command. That is\n * §7.3's \"the progress modal's error view is promoted into Problems\", in one function.\n *\n * **Nothing here blocks.** `showProgressModal` still exists for the four dependency-install sites\n * §7.3 keeps blocking, and it is now a thin front end over {@link beginActivity} — so even the\n * blocking case leaves an inspectable entry behind, and closing the modal no longer loses it.\n *\n * `services/idle.ts` reads {@link activityIdleBlockers}: an open operation means the app is not\n * settled, which is the §13.6 S4 obligation every phase's checklist carries.\n */\n\nimport { html, nothing } from \"lit-html\";\nimport { renderDeployChecklist } from \"../publish/deploy-checklist\";\nimport { repeat } from \"lit-html/directives/repeat.js\";\nimport { reactive } from \"../reactivity\";\nimport { now } from \"../services/clock\";\nimport { notify } from \"../services/notify\";\nimport { registerPanel } from \"./panel-registry\";\nimport { renderEmptyState } from \"./empty-state\";\nimport type { PanelBody } from \"./panel-registry\";\nimport type { TemplateResult } from \"lit-html\";\n\n/** How an operation ended, or that it has not. */\nexport const ACTIVITY_STATES = [\"running\", \"done\", \"failed\", \"cancelled\"] as const;\n\nexport type ActivityState = (typeof ACTIVITY_STATES)[number];\n\n/** One named phase of an operation — \"Install dependencies\", \"Sync with the remote\". */\nexport interface ActivityStep {\n label: string;\n state: \"pending\" | \"running\" | \"done\" | \"failed\";\n}\n\n/**\n * One operation, as recorded.\n *\n * Mutable and reactive on purpose: an activity is the one record in the app that CHANGES while you\n * watch it, which is the whole difference between it and a\n * {@link import(\"../services/notify\") .Notification}. A host repaints by reading it.\n */\nexport interface ActivityEntry {\n readonly id: string;\n readonly title: string;\n /** The line under the title — what the operation is doing right now. */\n status: string;\n state: ActivityState;\n /** The captured output, one entry per chunk. Rendered in the expanded row. */\n log: string[];\n steps: ActivityStep[];\n /** Epoch ms from {@link now}, so a pinned clock pins the duration a row prints. */\n readonly startedAt: number;\n endedAt: number | null;\n /** Who is running it: \"Packages\", \"Source Control\", \"Publish\". Printed beside the title. */\n readonly source?: string;\n /** Whether a `cancel` callback was handed over — the row draws Cancel iff this is true. */\n cancellable: boolean;\n /** Whether this row's log is unfolded. A view flag, on the record, so a repaint keeps it. */\n expanded: boolean;\n}\n\n/**\n * Every operation this session, oldest first — running and finished alike.\n *\n * Exported as the array rather than behind a getter for the same reason `notify`'s stores are: that\n * is what makes it trackable, so a lit render effect that reads it re-runs when an operation\n * starts, logs a line or ends, with no subscription to remember to release.\n */\nexport const activities: ActivityEntry[] = reactive([]);\n\n/**\n * How many FINISHED entries are kept. Running ones are never retired — an operation the app is\n * still doing is not history, and dropping it would take its Cancel button with it.\n */\nexport const MAX_FINISHED_ACTIVITIES = 20;\n\n/**\n * Entry id → the callback that stops it.\n *\n * Held beside the record rather than on it: a closure inside a reactive proxy is a value effects\n * would track and nothing would ever compare, and the record is otherwise plain data. The record\n * carries `cancellable` so a renderer never needs this map.\n */\nconst _cancels = new Map<string, () => void>();\n\nlet _seq = 0;\n\n/** Monotonic within a page load, and stable enough to be a lit `repeat` key. */\nfunction nextId(): string {\n _seq += 1;\n return `a${_seq}`;\n}\n\n/** Whether an entry has stopped. */\nexport function isFinished(entry: ActivityEntry): boolean {\n return entry.state !== \"running\";\n}\n\n/** Drop the oldest finished entries once there are more than {@link MAX_FINISHED_ACTIVITIES}. */\nfunction retireOldest(): void {\n let excess = activities.filter((entry) => isFinished(entry)).length - MAX_FINISHED_ACTIVITIES;\n while (excess > 0) {\n const at = activities.findIndex((entry) => isFinished(entry));\n if (at === -1) {\n return;\n }\n _cancels.delete(activities[at]!.id);\n activities.splice(at, 1);\n excess -= 1;\n }\n}\n\n/** What {@link beginActivity} is told about an operation up front. */\nexport interface ActivityOptions {\n /** What the operation IS — \"Open project\", \"Update dependencies\". Never changes. */\n title: string;\n /** What it is doing right now. Changes as it goes. */\n status?: string;\n /** Who is running it — \"Packages\", \"Source Control\". Groups nothing yet; printed on the row. */\n source?: string;\n /** The plan, declared up front so the row shows how far along it is. */\n steps?: readonly string[];\n /**\n * Stop the operation.\n *\n * Its presence is what draws the Cancel button, so an operation that cannot honestly be stopped\n * must not pass one — a Cancel that does nothing is the failure §7 exists to end, restated as a\n * button.\n */\n cancel?: () => void;\n}\n\n/** The live handle an operation drives its own entry through. */\nexport interface ActivityHandle {\n readonly id: string;\n /** The record itself, for a caller that wants to read its own log back. */\n readonly entry: ActivityEntry;\n /** Replace the line under the title. */\n setStatus: (text: string) => void;\n /** Append captured output. Blank chunks are dropped, so a trailing newline is not a log line. */\n log: (chunk: string) => void;\n /** Mark `label` as the running step; every step before it is done. Appends an unplanned one. */\n step: (label: string) => void;\n /** Finish successfully. */\n done: (status?: string) => void;\n /**\n * Finish with a failure — and raise the Problem that outlives it.\n *\n * The log goes into the notification's `detail`, so the persistent, inspectable error view §7.3\n * asks for is the Problems row, not a modal that has to stay open to be read.\n */\n fail: (message: string, opts?: { action?: string; path?: string }) => void;\n}\n\n/**\n * Start recording an operation.\n *\n * @param {ActivityOptions} options\n * @returns {ActivityHandle}\n */\nexport function beginActivity(options: ActivityOptions): ActivityHandle {\n const entry: ActivityEntry = {\n cancellable: options.cancel !== undefined,\n endedAt: null,\n expanded: false,\n id: nextId(),\n log: [],\n startedAt: now(),\n state: \"running\",\n status: options.status ?? \"\",\n steps: (options.steps ?? []).map((label) => ({ label, state: \"pending\" as const })),\n title: options.title,\n ...(options.source === undefined ? {} : { source: options.source }),\n };\n if (options.cancel) {\n _cancels.set(entry.id, options.cancel);\n }\n activities.push(entry);\n // The PROXY, not the literal: writing through the raw object a `reactive()` array was handed\n // Skips every effect depending on it, which is the one bug that would make a running operation\n // Look frozen. Read back before anything is retired, so the reference is unambiguous.\n const live = activities.at(-1) as ActivityEntry;\n retireOldest();\n\n const finish = (state: ActivityState, status?: string) => {\n if (isFinished(live)) {\n return;\n }\n live.state = state;\n live.endedAt = now();\n if (status !== undefined) {\n live.status = status;\n }\n for (const step of live.steps) {\n step.state = step.state === \"done\" ? \"done\" : state === \"done\" ? \"done\" : \"failed\";\n }\n live.cancellable = false;\n _cancels.delete(live.id);\n retireOldest();\n };\n\n return {\n done(status?: string) {\n finish(\"done\", status);\n },\n entry: live,\n fail(message: string, opts: { action?: string; path?: string } = {}) {\n // An operation that has already ended does not get to raise a Problem: the first outcome is\n // The one that happened, and a late `fail()` after a successful `done()` would put a failure\n // On a list whose whole promise is that everything on it still needs fixing.\n if (isFinished(live)) {\n return;\n }\n const detail = live.log.join(\"\\n\");\n finish(\"failed\", message);\n notify.error(message, {\n source: live.source ?? live.title,\n ...(detail === \"\" ? {} : { detail }),\n ...(opts.action === undefined ? {} : { action: opts.action }),\n ...(opts.path === undefined ? {} : { path: opts.path }),\n });\n },\n id: live.id,\n log(chunk: string) {\n const text = chunk.replace(/\\s+$/, \"\");\n if (text !== \"\") {\n live.log.push(text);\n }\n },\n setStatus(text: string) {\n if (!isFinished(live)) {\n live.status = text;\n }\n },\n step(label: string) {\n let at = live.steps.findIndex((step) => step.label === label);\n if (at === -1) {\n live.steps.push({ label, state: \"pending\" });\n at = live.steps.length - 1;\n }\n for (const [index, step] of live.steps.entries()) {\n step.state = index < at ? \"done\" : index === at ? \"running\" : step.state;\n }\n live.status = label;\n },\n };\n}\n\n/** One entry by id, or `undefined`. */\nexport function activityById(id: string): ActivityEntry | undefined {\n return activities.find((entry) => entry.id === id);\n}\n\n/** Everything still running, oldest first — what the badge counts and idle waits on. */\nexport function runningActivities(): ActivityEntry[] {\n return activities.filter((entry) => !isFinished(entry));\n}\n\n/**\n * Stop an operation: run its callback, mark it cancelled. Returns whether anything was stopped.\n *\n * The callback runs BEFORE the state changes, so an implementation that throws leaves the entry\n * honestly still running rather than claiming a cancellation that did not happen.\n */\nexport function cancelActivity(id: string): boolean {\n const entry = activityById(id);\n const stop = _cancels.get(id);\n if (!entry || !stop || isFinished(entry)) {\n return false;\n }\n stop();\n _cancels.delete(id);\n entry.state = \"cancelled\";\n entry.endedAt = now();\n entry.cancellable = false;\n entry.status = \"Cancelled\";\n return true;\n}\n\n/** Drop every finished entry. Returns how many went. Running operations are kept. */\nexport function clearFinishedActivities(): number {\n const kept = activities.filter((entry) => !isFinished(entry));\n const removed = activities.length - kept.length;\n activities.splice(0, activities.length, ...kept);\n return removed;\n}\n\n/** Clear the whole list — tests, and the \"close project\" path. */\nexport function resetActivities(): void {\n activities.splice(0);\n _cancels.clear();\n}\n\n/**\n * What is still running, as `services/idle.ts` phrases it.\n *\n * §13.6 S4 puts this on every phase's checklist: an app with an operation in flight has not\n * finished reacting, so a screenshot taken now photographs a half-done import. A FINISHED entry is\n * not a blocker — the list stays on screen forever and waiting for it to empty would never settle.\n */\nexport function activityIdleBlockers(): readonly string[] {\n return runningActivities().map(\n (entry) => `activity: ${entry.title} — ${entry.status || \"running\"}`,\n );\n}\n\n// ─── Rendering ────────────────────────────────────────────────────────────────\n\n/** The state glyphs. One character each: the row's job is a line of text, not an illustration. */\nconst STATE_ICON: Readonly<Record<ActivityState, string>> = {\n cancelled: \"⊘\",\n done: \"✓\",\n failed: \"✕\",\n running: \"⋯\",\n};\n\nconst STEP_ICON: Readonly<Record<ActivityStep[\"state\"], string>> = {\n done: \"✓\",\n failed: \"✕\",\n pending: \"·\",\n running: \"⋯\",\n};\n\n/** How long it took, in the coarsest unit that is still true. */\nexport function activityDuration(entry: ActivityEntry, at: number = now()): string {\n const ms = Math.max(0, (entry.endedAt ?? at) - entry.startedAt);\n if (ms < 1000) {\n return `${ms}ms`;\n }\n const seconds = Math.round(ms / 1000);\n return seconds < 60 ? `${seconds}s` : `${Math.floor(seconds / 60)}m ${seconds % 60}s`;\n}\n\nfunction stepsTpl(entry: ActivityEntry): TemplateResult | typeof nothing {\n if (entry.steps.length === 0) {\n return nothing;\n }\n return html`<ol class=\"activity-steps\">\n ${entry.steps.map(\n (step) => html`<li class=\"activity-step activity-step--${step.state}\">\n <span class=\"activity-step-icon\" aria-hidden=\"true\">${STEP_ICON[step.state]}</span>\n ${step.label}\n </li>`,\n )}\n </ol>`;\n}\n\nfunction logTpl(entry: ActivityEntry): TemplateResult | typeof nothing {\n if (entry.log.length === 0) {\n return nothing;\n }\n return html`<button\n class=\"activity-log-toggle\"\n aria-expanded=${entry.expanded ? \"true\" : \"false\"}\n @click=${() => {\n entry.expanded = !entry.expanded;\n }}\n >\n ${entry.expanded ? \"Hide log\" : `Show log (${entry.log.length} line(s))`}\n </button>\n ${entry.expanded ? html`<pre class=\"activity-log\">${entry.log.join(\"\\n\")}</pre>` : nothing}`;\n}\n\n/** One operation. */\nfunction activityTpl(entry: ActivityEntry): TemplateResult {\n return html`\n <li class=\"activity-row activity-row--${entry.state}\">\n <span class=\"activity-icon\" aria-hidden=\"true\">${STATE_ICON[entry.state]}</span>\n <div class=\"activity-body\">\n <div class=\"activity-head\">\n <span class=\"activity-title\">${entry.title}</span>\n ${entry.source ? html`<span class=\"activity-source\">${entry.source}</span>` : nothing}\n <span class=\"activity-duration\">${activityDuration(entry)}</span>\n </div>\n ${entry.status ? html`<div class=\"activity-status\">${entry.status}</div>` : nothing}\n ${stepsTpl(entry)} ${logTpl(entry)}\n </div>\n ${\n entry.cancellable\n ? html`<button\n class=\"activity-cancel\"\n title=\"Stop this operation\"\n @click=${() => {\n cancelActivity(entry.id);\n }}\n >\n Cancel\n </button>`\n : nothing\n }\n </li>\n `;\n}\n\n/**\n * The Activity tab's body.\n *\n * Newest LAST, like a log and unlike a menu: an operation that starts while you are reading one\n * that is already running must not push it off the top.\n */\nexport function renderActivityList(): PanelBody {\n // The Deploy checklist lives here because a deploy IS a long operation with a log — which is why\n // P4 folded Deploy into Activity rather than giving it a fifth dock tab. It renders above the\n // Run log and before any operation has started, because its whole job is to say what is missing\n // BEFORE you begin.\n const checklist = renderDeployChecklist();\n if (activities.length === 0) {\n return html`${checklist}${renderEmptyState({\n detail: \"Installs, clones, publishes and imports report here while they run.\",\n message: \"Long operations show their progress, their log and their Cancel button here.\",\n })}`;\n }\n const finished = activities.filter((entry) => isFinished(entry)).length;\n return html`\n ${checklist}\n <div class=\"activity-panel\">\n ${\n finished > 0\n ? html`<div class=\"activity-actions\">\n <button\n class=\"activity-clear\"\n @click=${() => {\n clearFinishedActivities();\n }}\n >\n Clear ${finished} finished\n </button>\n </div>`\n : nothing\n }\n <ul class=\"activity-list\">\n ${repeat(\n activities,\n (entry) => entry.id,\n (entry) => activityTpl(entry),\n )}\n </ul>\n </div>\n `;\n}\n\n/**\n * Define the Activity panel. Called by `panels/bottom-dock.ts`, beside the state it writes.\n *\n * `level: \"project\"` because an operation is a thing done TO a project — an install, a clone, a\n * publish — and the list must not empty itself when the last document closes, which is the same\n * rule that hoisted source control off `TabUi`.\n */\nexport function registerActivityPanel(): void {\n registerPanel({\n id: \"activity\",\n title: \"Activity\",\n level: \"project\",\n dock: \"bottom\",\n icon: \"sp-icon-data\",\n // No rail button: the Bottom dock's tabs are reached by ⌘J and `view.setBottomTab`, and a\n // Fifth rail slot for a surface with no steady state would spend chrome §2 principle 9 caps.\n rail: false,\n badge: () => (runningActivities().length > 0 ? runningActivities().length : null),\n render: () => renderActivityList(),\n });\n}\n",
|
|
6
|
+
"/// <reference lib=\"dom\" />\n/**\n * The one surface in Studio that still BLOCKS while it works — and now the only one (plan §7.3).\n *\n * What changed. This modal used to be four things at once: the running state, the error view, the\n * log and the operation's entire memory. It blocked the whole app, offered no way out, and took all\n * four with it when it closed — so a failed `bun install` could be read exactly once, and a hung\n * one could not be escaped at all. §7.3 splits those apart:\n *\n * - The **record** moves to `panels/activity-panel.ts`, which keeps the entry, its steps and its log\n * after the modal is gone;\n * - The **error view** is promoted into Problems — {@link ProgressModalHandle.fail} raises a\n * `notify.error` carrying the captured log as its `detail`, so the failure persists, is grouped\n * by source, and carries a Retry built from a command record;\n * - And the **exit** arrives twice: `Run in the background` hands the app back while the operation\n * keeps going in Activity, and an operation that passed a `cancel` gets a real Cancel button.\n *\n * What did NOT change is which operations block. §7.3 keeps blocking for dependency install and\n * nothing else, and this module's four call sites are exactly that — `packages/ensure-deps.ts`,\n * `packages/pull-package-sync.ts`, `packages/jxsuite-update.ts` and\n * `settings/dependencies-editor.ts`. Every other long operation calls `beginActivity` directly and\n * blocks nobody.\n */\n\nimport { html } from \"lit-html\";\nimport { beginActivity } from \"../panels/activity-panel\";\nimport { setBottomTab } from \"../shell\";\nimport { openModal } from \"./layers\";\nimport type { ActivityHandle } from \"../panels/activity-panel\";\nimport type { TemplateResult } from \"lit-html\";\n\nexport interface ProgressModalHandle {\n /** Update the status line shown under the title. Also the Activity entry's status. */\n setStatus: (text: string) => void;\n /** Append captured output. It is the Activity entry's log and a failure's `detail`. */\n log: (chunk: string) => void;\n /** Record the failure as a Problem (message + captured log) and close the modal. */\n fail: (message: string) => void;\n /** Close the modal and mark the operation done (success path). */\n done: () => void;\n /** The Activity entry this operation is recorded in, which outlives the modal. */\n activity: ActivityHandle;\n}\n\nexport interface ProgressModalOptions {\n title: string;\n status?: string;\n /** Who is running it — \"Packages\" for all four of today's call sites. */\n source?: string;\n /**\n * Stop the operation. Draws Cancel, here and on the Activity row.\n *\n * Absent means the operation genuinely cannot be stopped, and no button claims otherwise — but\n * `Run in the background` is offered regardless, because \"let me use the app\" is a promise this\n * module can always keep.\n */\n cancel?: () => void;\n}\n\nfunction card(body: TemplateResult): TemplateResult {\n return html`\n <sp-underlay open></sp-underlay>\n <div class=\"progress-modal\" aria-live=\"polite\">${body}</div>\n `;\n}\n\n/**\n * The running view: the spinner, the status line, and the two ways out.\n *\n * `Run in the background` is not a cancel and does not pretend to be — it dismisses the BLOCKING\n * part and leaves the operation running where it can be watched, which is the affordance a modal\n * with no exit never had.\n */\nfunction runningView(\n title: string,\n status: string,\n actions: { background: () => void; cancel?: (() => void) | undefined },\n): TemplateResult {\n return card(html`\n <div class=\"progress-head\">\n <sp-progress-circle indeterminate size=\"m\" aria-label=${title}></sp-progress-circle>\n <div class=\"progress-lines\">\n <strong class=\"progress-title\">${title}</strong>\n ${status ? html`<span class=\"progress-status\">${status}</span>` : \"\"}\n </div>\n </div>\n <div class=\"progress-actions\">\n <sp-button size=\"s\" variant=\"secondary\" treatment=\"outline\" @click=${actions.background}>\n Run in the background\n </sp-button>\n ${\n actions.cancel\n ? html`<sp-button size=\"s\" variant=\"negative\" @click=${actions.cancel}>Cancel</sp-button>`\n : \"\"\n }\n </div>\n `);\n}\n\n/**\n * Show a blocking progress modal, and record the operation in Activity either way.\n *\n * @param {ProgressModalOptions} opts\n * @returns {ProgressModalHandle}\n */\nexport function showProgressModal(opts: ProgressModalOptions): ProgressModalHandle {\n let closed = false;\n\n const activity = beginActivity({\n title: opts.title,\n ...(opts.status === undefined ? {} : { status: opts.status }),\n ...(opts.source === undefined ? {} : { source: opts.source }),\n ...(opts.cancel === undefined ? {} : { cancel: opts.cancel }),\n });\n\n const close = () => {\n if (closed) {\n return;\n }\n closed = true;\n modal.close();\n };\n\n /** Hand the app back and put the operation where it can be watched. */\n const background = () => {\n close();\n setBottomTab(\"activity\");\n };\n\n const cancel = opts.cancel\n ? () => {\n close();\n opts.cancel?.();\n }\n : undefined;\n\n const view = (status: string) => runningView(opts.title, status, { background, cancel });\n\n const modal = openModal(view(opts.status ?? \"\"), {\n label: opts.title,\n // Escape means the same thing the button does: stop BLOCKING, not stop working. The operation\n // Owned the modal outright before, and swallowing Escape was the only honest thing a surface\n // With nowhere to put a running operation could do.\n onDismiss: background,\n });\n\n return {\n activity,\n done() {\n activity.done();\n close();\n },\n fail(message: string) {\n // The error view is not rendered here any more: it is the Problems row, with the log as its\n // `detail`, and it is still on screen tomorrow. Three of the four call sites hand over a\n // CAPTURED LOG as their message — `result.log ?? \"bun install failed\"` — so a multi-line one\n // Is split the way the old view split it: \"<title> failed\" as the headline, the whole text\n // As the detail. A Problems list whose first row is 400 lines of `bun` output is not a list.\n const text = (message ?? \"\").trim();\n if (text === \"\" || text.includes(\"\\n\")) {\n activity.log(text);\n activity.fail(`${opts.title} failed`);\n } else {\n activity.fail(text);\n }\n close();\n },\n log(chunk: string) {\n activity.log(chunk);\n },\n setStatus(text: string) {\n activity.setStatus(text);\n if (!closed) {\n modal.update(view(text));\n }\n },\n };\n}\n"
|
|
7
|
+
],
|
|
8
|
+
"mappings": "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",
|
|
9
|
+
"debugId": "E5DF930C7E1AD2C064756E2164756E21",
|
|
10
|
+
"names": []
|
|
11
|
+
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
_$LH,
|
|
3
|
+
noChange,
|
|
3
4
|
nothing
|
|
4
5
|
} from "./studio-5x5774ak.js";
|
|
5
6
|
|
|
@@ -254,7 +255,129 @@ class RefDirective extends AsyncDirective {
|
|
|
254
255
|
}
|
|
255
256
|
var ref = directive(RefDirective);
|
|
256
257
|
|
|
257
|
-
|
|
258
|
+
// ../../node_modules/lit-html/development/directives/repeat.js
|
|
259
|
+
var generateMap = (list, start, end) => {
|
|
260
|
+
const map = new Map;
|
|
261
|
+
for (let i = start;i <= end; i++) {
|
|
262
|
+
map.set(list[i], i);
|
|
263
|
+
}
|
|
264
|
+
return map;
|
|
265
|
+
};
|
|
266
|
+
|
|
267
|
+
class RepeatDirective extends Directive {
|
|
268
|
+
constructor(partInfo) {
|
|
269
|
+
super(partInfo);
|
|
270
|
+
if (partInfo.type !== PartType.CHILD) {
|
|
271
|
+
throw new Error("repeat() can only be used in text expressions");
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
_getValuesAndKeys(items, keyFnOrTemplate, template) {
|
|
275
|
+
let keyFn;
|
|
276
|
+
if (template === undefined) {
|
|
277
|
+
template = keyFnOrTemplate;
|
|
278
|
+
} else if (keyFnOrTemplate !== undefined) {
|
|
279
|
+
keyFn = keyFnOrTemplate;
|
|
280
|
+
}
|
|
281
|
+
const keys = [];
|
|
282
|
+
const values = [];
|
|
283
|
+
let index = 0;
|
|
284
|
+
for (const item of items) {
|
|
285
|
+
keys[index] = keyFn ? keyFn(item, index) : index;
|
|
286
|
+
values[index] = template(item, index);
|
|
287
|
+
index++;
|
|
288
|
+
}
|
|
289
|
+
return {
|
|
290
|
+
values,
|
|
291
|
+
keys
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
render(items, keyFnOrTemplate, template) {
|
|
295
|
+
return this._getValuesAndKeys(items, keyFnOrTemplate, template).values;
|
|
296
|
+
}
|
|
297
|
+
update(containerPart, [items, keyFnOrTemplate, template]) {
|
|
298
|
+
const oldParts = getCommittedValue(containerPart);
|
|
299
|
+
const { values: newValues, keys: newKeys } = this._getValuesAndKeys(items, keyFnOrTemplate, template);
|
|
300
|
+
if (!Array.isArray(oldParts)) {
|
|
301
|
+
this._itemKeys = newKeys;
|
|
302
|
+
return newValues;
|
|
303
|
+
}
|
|
304
|
+
const oldKeys = this._itemKeys ??= [];
|
|
305
|
+
const newParts = [];
|
|
306
|
+
let newKeyToIndexMap;
|
|
307
|
+
let oldKeyToIndexMap;
|
|
308
|
+
let oldHead = 0;
|
|
309
|
+
let oldTail = oldParts.length - 1;
|
|
310
|
+
let newHead = 0;
|
|
311
|
+
let newTail = newValues.length - 1;
|
|
312
|
+
while (oldHead <= oldTail && newHead <= newTail) {
|
|
313
|
+
if (oldParts[oldHead] === null) {
|
|
314
|
+
oldHead++;
|
|
315
|
+
} else if (oldParts[oldTail] === null) {
|
|
316
|
+
oldTail--;
|
|
317
|
+
} else if (oldKeys[oldHead] === newKeys[newHead]) {
|
|
318
|
+
newParts[newHead] = setChildPartValue(oldParts[oldHead], newValues[newHead]);
|
|
319
|
+
oldHead++;
|
|
320
|
+
newHead++;
|
|
321
|
+
} else if (oldKeys[oldTail] === newKeys[newTail]) {
|
|
322
|
+
newParts[newTail] = setChildPartValue(oldParts[oldTail], newValues[newTail]);
|
|
323
|
+
oldTail--;
|
|
324
|
+
newTail--;
|
|
325
|
+
} else if (oldKeys[oldHead] === newKeys[newTail]) {
|
|
326
|
+
newParts[newTail] = setChildPartValue(oldParts[oldHead], newValues[newTail]);
|
|
327
|
+
insertPart(containerPart, newParts[newTail + 1], oldParts[oldHead]);
|
|
328
|
+
oldHead++;
|
|
329
|
+
newTail--;
|
|
330
|
+
} else if (oldKeys[oldTail] === newKeys[newHead]) {
|
|
331
|
+
newParts[newHead] = setChildPartValue(oldParts[oldTail], newValues[newHead]);
|
|
332
|
+
insertPart(containerPart, oldParts[oldHead], oldParts[oldTail]);
|
|
333
|
+
oldTail--;
|
|
334
|
+
newHead++;
|
|
335
|
+
} else {
|
|
336
|
+
if (newKeyToIndexMap === undefined) {
|
|
337
|
+
newKeyToIndexMap = generateMap(newKeys, newHead, newTail);
|
|
338
|
+
oldKeyToIndexMap = generateMap(oldKeys, oldHead, oldTail);
|
|
339
|
+
}
|
|
340
|
+
if (!newKeyToIndexMap.has(oldKeys[oldHead])) {
|
|
341
|
+
removePart(oldParts[oldHead]);
|
|
342
|
+
oldHead++;
|
|
343
|
+
} else if (!newKeyToIndexMap.has(oldKeys[oldTail])) {
|
|
344
|
+
removePart(oldParts[oldTail]);
|
|
345
|
+
oldTail--;
|
|
346
|
+
} else {
|
|
347
|
+
const oldIndex = oldKeyToIndexMap.get(newKeys[newHead]);
|
|
348
|
+
const oldPart = oldIndex !== undefined ? oldParts[oldIndex] : null;
|
|
349
|
+
if (oldPart === null) {
|
|
350
|
+
const newPart = insertPart(containerPart, oldParts[oldHead]);
|
|
351
|
+
setChildPartValue(newPart, newValues[newHead]);
|
|
352
|
+
newParts[newHead] = newPart;
|
|
353
|
+
} else {
|
|
354
|
+
newParts[newHead] = setChildPartValue(oldPart, newValues[newHead]);
|
|
355
|
+
insertPart(containerPart, oldParts[oldHead], oldPart);
|
|
356
|
+
oldParts[oldIndex] = null;
|
|
357
|
+
}
|
|
358
|
+
newHead++;
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
while (newHead <= newTail) {
|
|
363
|
+
const newPart = insertPart(containerPart, newParts[newTail + 1]);
|
|
364
|
+
setChildPartValue(newPart, newValues[newHead]);
|
|
365
|
+
newParts[newHead++] = newPart;
|
|
366
|
+
}
|
|
367
|
+
while (oldHead <= oldTail) {
|
|
368
|
+
const oldPart = oldParts[oldHead++];
|
|
369
|
+
if (oldPart !== null) {
|
|
370
|
+
removePart(oldPart);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
this._itemKeys = newKeys;
|
|
374
|
+
setCommittedValue(containerPart, newParts);
|
|
375
|
+
return noChange;
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
var repeat = directive(RepeatDirective);
|
|
379
|
+
|
|
380
|
+
export { PartType, directive, Directive, isPrimitive, isSingleExpression, setCommittedValue, AsyncDirective, ref, repeat };
|
|
258
381
|
|
|
259
|
-
//# debugId=
|
|
260
|
-
//# sourceMappingURL=studio-
|
|
382
|
+
//# debugId=31D24FE1EC80EAFA64756E2164756E21
|
|
383
|
+
//# sourceMappingURL=studio-p471gg5n.js.map
|