@jxsuite/studio 2.0.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/canvas.html +21 -0
- package/dist/chunks/Overlay.dev-qfjzkms8.js +23 -0
- package/dist/chunks/{Overlay.dev-cszx7yn5.js.map → Overlay.dev-qfjzkms8.js.map} +1 -1
- package/dist/chunks/{adapter-z8fkmbmv.js → adapter-qfnesn5v.js} +2 -2
- package/dist/chunks/{cf-settings-mmyv436d.js → cf-settings-73sh5z4p.js} +3 -3
- package/dist/chunks/{components-0hzentwq.js → components-2bpqp4mq.js} +5 -7
- package/dist/chunks/{components-0hzentwq.js.map → components-2bpqp4mq.js.map} +1 -1
- package/dist/chunks/content-source-34gnkbnn.js +38 -0
- package/dist/chunks/content-source-34gnkbnn.js.map +9 -0
- package/dist/chunks/convert-to-repeater-t8kxre5s.js +258 -0
- package/dist/chunks/convert-to-repeater-t8kxre5s.js.map +10 -0
- package/dist/chunks/extension-sections-6mqydz35.js +301 -0
- package/dist/chunks/extension-sections-6mqydz35.js.map +11 -0
- package/dist/chunks/files-8kn321h1.js +70 -0
- package/dist/chunks/files-8kn321h1.js.map +9 -0
- package/dist/chunks/{format-host-2c188n41.js → format-host-mkwsmt8d.js} +3 -3
- package/dist/chunks/git-panel-tjbr191d.js +51 -0
- package/dist/chunks/git-panel-tjbr191d.js.map +9 -0
- package/dist/chunks/{index-baeg2x3y.js → index-7pxchcce.js} +4 -3
- package/dist/chunks/{index-baeg2x3y.js.map → index-7pxchcce.js.map} +3 -3
- package/dist/chunks/{jx-validate-qx8degj7.js → jx-validate-v6qgknrs.js} +3 -3
- package/dist/chunks/layers-panel-87pb25km.js +58 -0
- package/dist/chunks/layers-panel-87pb25km.js.map +9 -0
- package/dist/chunks/{monaco-setup-zjdp9zdw.js → monaco-setup-e0yh25j4.js} +4 -75
- package/dist/chunks/{monaco-setup-zjdp9zdw.js.map → monaco-setup-e0yh25j4.js.map} +3 -4
- package/dist/chunks/publish-panel-m0fcgdrt.js +21 -0
- package/dist/chunks/publish-panel-m0fcgdrt.js.map +9 -0
- package/dist/chunks/quick-search-rhs6cbsb.js +53 -0
- package/dist/chunks/quick-search-rhs6cbsb.js.map +9 -0
- package/dist/chunks/right-panel-zpdxd98t.js +37 -0
- package/dist/chunks/right-panel-zpdxd98t.js.map +9 -0
- package/dist/chunks/section-registry-zmckaxf4.js +30 -0
- package/dist/chunks/section-registry-zmckaxf4.js.map +9 -0
- package/dist/chunks/sp-overlay.dev-9ran0sfq.js +18 -0
- package/dist/chunks/sp-overlay.dev-9ran0sfq.js.map +9 -0
- package/dist/chunks/sp-popover.dev-rebmdncr.js +9 -0
- package/dist/chunks/sp-popover.dev-rebmdncr.js.map +9 -0
- package/dist/chunks/sp-progress-circle.dev-5vkppfkt.js +15 -0
- package/dist/chunks/sp-progress-circle.dev-5vkppfkt.js.map +9 -0
- package/dist/chunks/sp-tooltip.dev-ykqrg8h5.js +15 -0
- package/dist/chunks/sp-tooltip.dev-ykqrg8h5.js.map +9 -0
- package/dist/chunks/{sp-tray.dev-pb2fsd65.js → sp-tray.dev-ey59vfh7.js} +10 -8
- package/dist/chunks/{sp-tray.dev-pb2fsd65.js.map → sp-tray.dev-ey59vfh7.js.map} +2 -2
- package/dist/chunks/{studio-9qr6fq7p.js → studio-0rqqhrdy.js} +10 -378
- package/dist/chunks/{studio-9qr6fq7p.js.map → studio-0rqqhrdy.js.map} +4 -14
- package/dist/chunks/{studio-5x6tqqec.js → studio-2sj1jj3v.js} +10 -8
- package/dist/chunks/{studio-5x6tqqec.js.map → studio-2sj1jj3v.js.map} +2 -2
- package/dist/chunks/{studio-h3fw0wn8.js → studio-3fk1ac9z.js} +6 -4
- package/dist/chunks/{studio-h3fw0wn8.js.map → studio-3fk1ac9z.js.map} +2 -2
- package/dist/chunks/studio-41exgzhq.js +6690 -0
- package/dist/chunks/studio-41exgzhq.js.map +38 -0
- package/dist/chunks/{studio-7v2bpweq.js → studio-4mqb9a0j.js} +6 -4
- package/dist/chunks/{studio-7v2bpweq.js.map → studio-4mqb9a0j.js.map} +2 -2
- package/dist/chunks/studio-50k77cca.js +1787 -0
- package/dist/chunks/studio-50k77cca.js.map +18 -0
- package/dist/chunks/{studio-56v3zwk6.js → studio-6a0h7sne.js} +10 -8
- package/dist/chunks/{studio-56v3zwk6.js.map → studio-6a0h7sne.js.map} +2 -2
- package/dist/chunks/studio-6f0am8f2.js +53 -0
- package/dist/chunks/studio-6f0am8f2.js.map +10 -0
- package/dist/chunks/studio-6nmjc5qk.js +7002 -0
- package/dist/chunks/studio-6nmjc5qk.js.map +32 -0
- package/dist/chunks/studio-7afd21nw.js +67 -0
- package/dist/chunks/studio-7afd21nw.js.map +10 -0
- package/dist/chunks/{studio-xze4zrs1.js → studio-7bmdvzne.js} +2 -2
- package/dist/chunks/studio-7bmdvzne.js.map +10 -0
- package/dist/chunks/studio-8jpzqk5s.js +128 -0
- package/dist/chunks/studio-8jpzqk5s.js.map +10 -0
- package/dist/chunks/studio-94m77tgk.js +1482 -0
- package/dist/chunks/studio-94m77tgk.js.map +13 -0
- package/dist/chunks/studio-9je6w5sq.js +1000 -0
- package/dist/chunks/studio-9je6w5sq.js.map +16 -0
- package/dist/chunks/{studio-w7c6kvk7.js → studio-a7pzveq1.js} +2 -2
- package/dist/chunks/{studio-97qcgvdn.js → studio-adn0z1k3.js} +14 -8
- package/dist/chunks/{studio-97qcgvdn.js.map → studio-adn0z1k3.js.map} +3 -3
- package/dist/chunks/{studio-kr88ryr7.js → studio-bsxxx3x2.js} +17 -15
- package/dist/chunks/{studio-kr88ryr7.js.map → studio-bsxxx3x2.js.map} +7 -6
- package/dist/chunks/studio-bw5dz6km.js +608 -0
- package/dist/chunks/studio-bw5dz6km.js.map +21 -0
- package/dist/chunks/studio-c6s5getc.js +4232 -0
- package/dist/chunks/studio-c6s5getc.js.map +39 -0
- package/dist/chunks/studio-cjm7fdjf.js +451 -0
- package/dist/chunks/studio-cjm7fdjf.js.map +14 -0
- package/dist/chunks/{studio-cx91mnh8.js → studio-ckwz4d3x.js} +53 -53
- package/dist/chunks/{studio-cx91mnh8.js.map → studio-ckwz4d3x.js.map} +5 -5
- package/dist/chunks/studio-dg7zyt5x.js +28 -0
- package/dist/chunks/studio-dg7zyt5x.js.map +10 -0
- package/dist/chunks/studio-dzcyvvvz.js +166 -0
- package/dist/chunks/studio-dzcyvvvz.js.map +10 -0
- package/dist/chunks/{studio-7kqe41sa.js → studio-evkr5d3b.js} +15 -7
- package/dist/chunks/{studio-7kqe41sa.js.map → studio-evkr5d3b.js.map} +5 -4
- package/dist/chunks/studio-f12h6177.js +411 -0
- package/dist/chunks/studio-f12h6177.js.map +13 -0
- package/dist/chunks/studio-hbp1s8m9.js +1817 -0
- package/dist/chunks/studio-hbp1s8m9.js.map +14 -0
- package/dist/chunks/studio-k2sxjph5.js +15295 -0
- package/dist/chunks/studio-k2sxjph5.js.map +235 -0
- package/dist/chunks/studio-myje51t3.js +385 -0
- package/dist/chunks/studio-myje51t3.js.map +12 -0
- package/dist/chunks/studio-na6rwzhw.js +353 -0
- package/dist/chunks/studio-na6rwzhw.js.map +11 -0
- package/dist/chunks/{studio-4k0m4fmp.js → studio-p471gg5n.js} +126 -3
- package/dist/chunks/studio-p471gg5n.js.map +14 -0
- package/dist/chunks/{studio-9bjwf0d4.js → studio-rgwcpast.js} +5 -46
- package/dist/chunks/{studio-9bjwf0d4.js.map → studio-rgwcpast.js.map} +4 -5
- package/dist/chunks/{studio-hhj92gcr.js → studio-s519zc99.js} +3 -3
- package/dist/chunks/studio-sas7mt3k.js +75 -0
- package/dist/chunks/studio-sas7mt3k.js.map +10 -0
- package/dist/chunks/studio-t5wqwzdh.js +74 -0
- package/dist/chunks/studio-t5wqwzdh.js.map +10 -0
- package/dist/chunks/{studio-9qpspwfn.js → studio-temv5bw4.js} +5 -5
- package/dist/chunks/{studio-9qpspwfn.js.map → studio-temv5bw4.js.map} +1 -1
- package/dist/chunks/{studio-qkvt37c0.js → studio-tr20m8g8.js} +669 -18
- package/dist/chunks/studio-tr20m8g8.js.map +9 -0
- package/dist/chunks/{studio-ygzav7z5.js → studio-v96qfnww.js} +5514 -4291
- package/dist/chunks/studio-v96qfnww.js.map +54 -0
- package/dist/chunks/studio-vcetc91k.js +659 -0
- package/dist/chunks/studio-vcetc91k.js.map +10 -0
- package/dist/chunks/{studio-n9zmpxjg.js → studio-vmymjefp.js} +2972 -4937
- package/dist/chunks/studio-vmymjefp.js.map +98 -0
- package/dist/chunks/{studio-bghqfmea.js → studio-wwseqyw0.js} +2 -2
- package/dist/chunks/studio-x9hmy5kr.js +390 -0
- package/dist/chunks/studio-x9hmy5kr.js.map +10 -0
- package/dist/chunks/studio-xa0ce0n7.js +335 -0
- package/dist/chunks/studio-xa0ce0n7.js.map +10 -0
- package/dist/chunks/studio-xm3dbxvn.js +378 -0
- package/dist/chunks/studio-xm3dbxvn.js.map +19 -0
- package/dist/chunks/{studio-nqw433kv.js → studio-xmvbhg31.js} +2 -2
- package/dist/chunks/studio-zv37yrfa.js +1054 -0
- package/dist/chunks/studio-zv37yrfa.js.map +13 -0
- package/dist/chunks/{ws-client-q7hkz3j9.js → ws-client-654ts66j.js} +6 -4
- package/dist/chunks/ws-client-654ts66j.js.map +11 -0
- package/dist/iframe-entry.js +668 -230
- package/dist/studio.js +23711 -35185
- package/index.html +35 -4685
- package/package.json +17 -15
- package/src/about/about-modal.ts +42 -11
- package/src/browse/library-commands.ts +240 -0
- package/src/browse/library-layouts.ts +369 -0
- package/src/browse/library-model.ts +396 -0
- package/src/browse/library-pane.ts +1049 -0
- package/src/browse/library-preview.ts +252 -0
- package/src/browse/library-source.ts +150 -0
- package/src/canvas/canvas-helpers.ts +33 -9
- package/src/canvas/canvas-live-render.ts +45 -29
- package/src/canvas/canvas-patcher.ts +151 -31
- package/src/canvas/canvas-perf.ts +46 -7
- package/src/canvas/canvas-render.ts +1092 -220
- package/src/canvas/canvas-surface.ts +240 -0
- package/src/canvas/canvas-utils.ts +1166 -124
- package/src/canvas/iframe-drop.ts +2 -1
- package/src/canvas/iframe-entry.ts +241 -4
- package/src/canvas/iframe-host.ts +1226 -143
- package/src/canvas/iframe-inline-edit.ts +31 -0
- package/src/canvas/iframe-interaction.ts +76 -16
- package/src/canvas/iframe-keys.ts +107 -45
- package/src/canvas/iframe-overlay.ts +38 -1
- package/src/canvas/iframe-protocol.ts +137 -2
- package/src/canvas/iframe-render.ts +70 -2
- package/src/canvas/iframe-slash.ts +6 -0
- package/src/canvas/path-mapping.ts +56 -6
- package/src/canvas/surface-registry.ts +292 -0
- package/src/collab/collab-commands.ts +244 -0
- package/src/collab/collab-session.ts +198 -32
- package/src/collab/collab-state.ts +28 -2
- package/src/collab/presence-chips.ts +100 -9
- package/src/commands/active-registry.ts +42 -0
- package/src/commands/app-commands.ts +176 -0
- package/src/commands/budget.ts +158 -0
- package/src/commands/command-args.ts +253 -0
- package/src/commands/context.ts +387 -0
- package/src/commands/defaults.ts +580 -0
- package/src/commands/keymap.ts +571 -0
- package/src/commands/levels.ts +345 -0
- package/src/commands/live-context.ts +193 -0
- package/src/commands/reference.ts +227 -0
- package/src/commands/registry.ts +293 -0
- package/src/component-props.ts +3 -2
- package/src/content/draft-state.ts +106 -0
- package/src/content/entry-commands.ts +282 -0
- package/src/content/entry-editor.ts +327 -0
- package/src/content/entry-fields.ts +116 -0
- package/src/content/entry-model.ts +175 -0
- package/src/editor/canvas-context-menu.ts +17 -11
- package/src/editor/canvas-slash-bridge.ts +11 -4
- package/src/editor/context-menu.ts +804 -204
- package/src/editor/convert-to-component.ts +31 -10
- package/src/editor/convert-to-repeater.ts +3 -2
- package/src/editor/inline-edit-apply.ts +5 -5
- package/src/editor/inline-edit.ts +86 -50
- package/src/editor/insert-zone-action.ts +1 -1
- package/src/editor/shortcuts.ts +1043 -329
- package/src/editor/slash-menu.ts +1 -0
- package/src/files/elements.ts +166 -0
- package/src/files/file-ops.ts +178 -31
- package/src/files/files.ts +898 -268
- package/src/files/fs-events.ts +21 -0
- package/src/files/media-meta.ts +203 -0
- package/src/files/media-paths.ts +141 -0
- package/src/files/media-upload.ts +7 -3
- package/src/files/media-usage.ts +189 -0
- package/src/github/github-auth.ts +235 -33
- package/src/github/github-publish.ts +80 -21
- package/src/grid/grid-controller.ts +152 -12
- package/src/grid/grid-layout.ts +225 -20
- package/src/grid/grid-open.ts +120 -0
- package/src/grid/grid-panel.ts +554 -39
- package/src/grid/grid-source.ts +27 -1
- package/src/grid/redirects-grid.ts +599 -0
- package/src/grid/redirects.ts +398 -0
- package/src/grid/sources/content-source.ts +108 -2
- package/src/i18n/i18n-commands.ts +322 -0
- package/src/new-project/add-repo-modal.ts +8 -10
- package/src/new-project/import-tab.ts +34 -9
- package/src/new-project/location-fields.ts +9 -1
- package/src/new-project/new-project-modal.ts +270 -262
- package/src/packages/jxsuite-update.ts +97 -48
- package/src/packages/pull-package-sync.ts +18 -9
- package/src/page-params.ts +2 -1
- package/src/panels/activity-bar.ts +152 -91
- package/src/panels/activity-panel.ts +481 -0
- package/src/panels/ai-chat/chat-markdown.ts +8 -3
- package/src/panels/ai-chat/chat-view.ts +245 -18
- package/src/panels/ai-chat/composer.ts +31 -5
- package/src/panels/ai-chat/sessions-view.ts +17 -10
- package/src/panels/ai-panel.ts +279 -120
- package/src/panels/block-action-bar.ts +1115 -224
- package/src/panels/bottom-dock.ts +337 -0
- package/src/panels/canvas-dnd-bridge.ts +37 -8
- package/src/panels/chat-panel.ts +29 -12
- package/src/panels/data-explorer.ts +254 -112
- package/src/panels/data-grid.ts +10 -4
- package/src/panels/dnd.ts +28 -51
- package/src/panels/editors.ts +434 -107
- package/src/panels/elements-panel.ts +66 -2
- package/src/panels/empty-state.ts +112 -0
- package/src/panels/events-panel.ts +596 -82
- package/src/panels/formula-workspace.ts +408 -218
- package/src/panels/frontmatter-fields.ts +51 -10
- package/src/panels/frontmatter-panel.ts +357 -79
- package/src/panels/git-panel.ts +375 -164
- package/src/panels/head-panel.ts +791 -85
- package/src/panels/i18n-panel.ts +592 -0
- package/src/panels/imports-panel.ts +95 -85
- package/src/panels/jump-bar.ts +584 -0
- package/src/panels/layers-panel.ts +1106 -328
- package/src/panels/left-panel.ts +109 -204
- package/src/panels/navigator-panels.ts +131 -0
- package/src/panels/overlays.ts +7 -2
- package/src/panels/pane-context.ts +1477 -0
- package/src/panels/pane-grid.ts +406 -0
- package/src/panels/panel-registry.ts +340 -0
- package/src/panels/panel-scheduler.ts +75 -0
- package/src/panels/problems-panel.ts +234 -0
- package/src/panels/properties-panel.ts +946 -1139
- package/src/panels/provenance.ts +258 -0
- package/src/panels/quick-search.ts +791 -122
- package/src/panels/right-panel.ts +228 -102
- package/src/panels/seo-modal.ts +395 -0
- package/src/panels/settings-pane.ts +203 -0
- package/src/panels/signals-panel.ts +354 -137
- package/src/panels/statement-editor.ts +41 -25
- package/src/panels/statusbar.ts +342 -106
- package/src/panels/style-panel.ts +974 -463
- package/src/panels/style-utils.ts +3 -3
- package/src/panels/stylebook-doc.ts +4 -2
- package/src/panels/stylebook-layers-panel.ts +3 -2
- package/src/panels/stylebook-panel.ts +51 -26
- package/src/panels/tab-strip.ts +1058 -78
- package/src/panels/target-line.ts +274 -0
- package/src/panels/toolbar.ts +631 -484
- package/src/panels/welcome-screen.ts +301 -198
- package/src/platform-errors.ts +26 -3
- package/src/platform.ts +96 -2
- package/src/platforms/cloud.ts +71 -8
- package/src/platforms/devserver.ts +92 -29
- package/src/publish/deploy-checklist.ts +383 -0
- package/src/publish/pages-service.ts +10 -1
- package/src/publish/publish-commands.ts +218 -0
- package/src/publish/publish-panel.ts +110 -16
- package/src/recent-projects.ts +3 -2
- package/src/services/a11y-report.ts +505 -0
- package/src/services/ai-models.ts +75 -2
- package/src/services/ai-project-tools.ts +29 -10
- package/src/services/ai-system-prompt.ts +53 -14
- package/src/services/ai-tools.ts +39 -3
- package/src/services/ai-writes.ts +154 -0
- package/src/services/announce.ts +97 -0
- package/src/services/automation.ts +424 -175
- package/src/services/cem-export.ts +9 -4
- package/src/services/clock.ts +61 -0
- package/src/services/document-assistant.ts +36 -8
- package/src/services/idle.ts +179 -0
- package/src/services/import-client.ts +26 -0
- package/src/services/monaco-buffer.ts +627 -0
- package/src/services/monaco-lazy.ts +36 -0
- package/src/services/notify.ts +271 -0
- package/src/services/profile.ts +155 -0
- package/src/services/references.ts +0 -0
- package/src/services/token-lint.ts +3 -2
- package/src/services/tool-executor.ts +53 -7
- package/src/services/trusted-types.ts +123 -0
- package/src/settings/contexts-section.ts +427 -0
- package/src/settings/contributed-section.ts +149 -11
- package/src/settings/css-vars-editor.ts +306 -349
- package/src/settings/defs-editor.ts +93 -34
- package/src/settings/dependencies-editor.ts +7 -7
- package/src/settings/extension-sections.ts +37 -5
- package/src/settings/general-settings.ts +204 -121
- package/src/settings/locales-section.ts +347 -0
- package/src/settings/preferences-accounts.ts +140 -0
- package/src/settings/preferences-dialog.ts +620 -0
- package/src/settings/preferences-keymap.ts +270 -0
- package/src/settings/project-sections.ts +260 -0
- package/src/settings/section-registry.ts +169 -0
- package/src/settings/settings-document.ts +385 -0
- package/src/shell.ts +1549 -0
- package/src/site-context.ts +45 -20
- package/src/state.ts +14 -275
- package/src/store.ts +88 -43
- package/src/studio.ts +790 -346
- package/src/style/live-preview.ts +36 -0
- package/src/style/project-styles.ts +349 -0
- package/src/style/token-ref.ts +123 -0
- package/src/tabs/patch-ops.ts +16 -4
- package/src/tabs/project-config.ts +416 -0
- package/src/tabs/selection.ts +323 -0
- package/src/tabs/tab.ts +182 -47
- package/src/tabs/transact.ts +209 -28
- package/src/types.ts +68 -13
- package/src/ui/ai-credentials-form.ts +39 -35
- package/src/ui/ai-managed-connect.ts +113 -0
- package/src/ui/dynamic-slot.ts +224 -81
- package/src/ui/expression-editor.ts +71 -63
- package/src/ui/field-input.ts +4 -6
- package/src/ui/field-row.ts +215 -38
- package/src/ui/form-controls.ts +194 -7
- package/src/ui/layers.ts +492 -69
- package/src/ui/media-picker.ts +115 -25
- package/src/ui/panel-resize.ts +109 -91
- package/src/ui/progress-modal.ts +131 -50
- package/src/ui/regions.ts +462 -0
- package/src/ui/schema-form.ts +229 -45
- package/src/ui/spectrum.ts +24 -8
- package/src/ui/timing.ts +49 -0
- package/src/ui/value-selector.ts +20 -0
- package/src/ui/value-source.ts +348 -0
- package/src/ui/virtual-window.ts +400 -0
- package/src/utils/edit-display.ts +3 -2
- package/src/utils/inherited-style.ts +67 -37
- package/src/view.ts +64 -78
- package/src/workspace/pane-derive.ts +1258 -0
- package/src/workspace/session.ts +317 -0
- package/src/workspace/workspace.ts +1345 -23
- package/styles/canvas.css +653 -0
- package/styles/forced-colors.css +106 -0
- package/styles/inspector.css +1454 -0
- package/styles/overlays.css +2704 -0
- package/styles/panels.css +1701 -0
- package/styles/shell.css +1423 -0
- package/styles/tokens.css +151 -0
- package/dist/chunks/Overlay.dev-cszx7yn5.js +0 -22
- package/dist/chunks/extension-sections-qct0gt8f.js +0 -531
- package/dist/chunks/extension-sections-qct0gt8f.js.map +0 -12
- package/dist/chunks/files-02zn5y24.js +0 -50
- package/dist/chunks/files-02zn5y24.js.map +0 -9
- package/dist/chunks/git-panel-mbb0y0hz.js +0 -28
- package/dist/chunks/git-panel-mbb0y0hz.js.map +0 -9
- package/dist/chunks/layers-panel-9qekmqk1.js +0 -26
- package/dist/chunks/layers-panel-9qekmqk1.js.map +0 -9
- package/dist/chunks/settings-modal-gj0hrah4.js +0 -29
- package/dist/chunks/settings-modal-gj0hrah4.js.map +0 -9
- package/dist/chunks/sp-overlay.dev-earn5as8.js +0 -17
- package/dist/chunks/sp-overlay.dev-earn5as8.js.map +0 -9
- package/dist/chunks/sp-popover.dev-frxtfejn.js +0 -8
- package/dist/chunks/sp-popover.dev-frxtfejn.js.map +0 -9
- package/dist/chunks/sp-progress-circle.dev-7tvw34h8.js +0 -14
- package/dist/chunks/sp-progress-circle.dev-7tvw34h8.js.map +0 -9
- package/dist/chunks/sp-tooltip.dev-a9fywesm.js +0 -21
- package/dist/chunks/sp-tooltip.dev-a9fywesm.js.map +0 -10
- package/dist/chunks/studio-4k0m4fmp.js.map +0 -13
- package/dist/chunks/studio-568nx4t5.js +0 -469
- package/dist/chunks/studio-568nx4t5.js.map +0 -14
- package/dist/chunks/studio-9smfzqhc.js +0 -19
- package/dist/chunks/studio-9smfzqhc.js.map +0 -10
- package/dist/chunks/studio-asvf0j9e.js +0 -429
- package/dist/chunks/studio-asvf0j9e.js.map +0 -13
- package/dist/chunks/studio-d77qm3pk.js +0 -3427
- package/dist/chunks/studio-d77qm3pk.js.map +0 -26
- package/dist/chunks/studio-j6gqyjf4.js +0 -1854
- package/dist/chunks/studio-j6gqyjf4.js.map +0 -18
- package/dist/chunks/studio-n9zmpxjg.js.map +0 -115
- package/dist/chunks/studio-qkvt37c0.js.map +0 -9
- package/dist/chunks/studio-rq0vxb19.js +0 -3744
- package/dist/chunks/studio-rq0vxb19.js.map +0 -22
- package/dist/chunks/studio-wd6ewdvd.js +0 -853
- package/dist/chunks/studio-wd6ewdvd.js.map +0 -12
- package/dist/chunks/studio-xq0t7n5t.js +0 -140
- package/dist/chunks/studio-xq0t7n5t.js.map +0 -10
- package/dist/chunks/studio-xze4zrs1.js.map +0 -10
- package/dist/chunks/studio-ygzav7z5.js.map +0 -46
- package/dist/chunks/studio-zmy7241e.js +0 -399
- package/dist/chunks/studio-zmy7241e.js.map +0 -12
- package/dist/chunks/ws-client-q7hkz3j9.js.map +0 -11
- package/src/browse/browse-modal.ts +0 -69
- package/src/browse/browse.ts +0 -904
- package/src/canvas/canvas-diff.ts +0 -216
- package/src/canvas/nested-site-style.ts +0 -58
- package/src/new-project/design-fields.ts +0 -264
- package/src/new-project/templates.ts +0 -61
- package/src/panels/tab-bar.ts +0 -548
- package/src/settings/settings-modal.ts +0 -203
- /package/dist/chunks/{adapter-z8fkmbmv.js.map → adapter-qfnesn5v.js.map} +0 -0
- /package/dist/chunks/{cf-settings-mmyv436d.js.map → cf-settings-73sh5z4p.js.map} +0 -0
- /package/dist/chunks/{format-host-2c188n41.js.map → format-host-mkwsmt8d.js.map} +0 -0
- /package/dist/chunks/{jx-validate-qx8degj7.js.map → jx-validate-v6qgknrs.js.map} +0 -0
- /package/dist/chunks/{studio-w7c6kvk7.js.map → studio-a7pzveq1.js.map} +0 -0
- /package/dist/chunks/{studio-hhj92gcr.js.map → studio-s519zc99.js.map} +0 -0
- /package/dist/chunks/{studio-bghqfmea.js.map → studio-wwseqyw0.js.map} +0 -0
- /package/dist/chunks/{studio-nqw433kv.js.map → studio-xmvbhg31.js.map} +0 -0
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/github/github-auth.ts", "../src/github/github-publish.ts", "../src/panels/git-panel.ts"],
|
|
4
|
-
"sourcesContent": [
|
|
5
|
-
"/// <reference lib=\"dom\" />\n/**\n * GitHub OAuth Device Flow authentication for Jx Studio.\n *\n * Uses the Device Flow so the user authenticates in their browser without needing a server-side\n * redirect endpoint.\n */\n\nimport { html } from \"lit-html\";\nimport { showDialog } from \"../ui/layers\";\n\nconst CLIENT_ID = \"Ov23liYVlMFpgjOEPXJH\";\nconst STORAGE_KEY = \"jx_github_token\";\n\ninterface DeviceCodeResponse {\n device_code: string;\n user_code: string;\n verification_uri: string;\n interval?: number;\n}\n\ninterface TokenResponse {\n access_token?: string;\n error?: string;\n}\n\nexport function getGithubToken() {\n return localStorage.getItem(STORAGE_KEY);\n}\n\nexport function clearGithubToken() {\n localStorage.removeItem(STORAGE_KEY);\n}\n\n/**\n * Authenticate with GitHub via the Device Flow. Shows a dialog with the user code and polls until\n * the user completes authorization or cancels.\n *\n * @returns {Promise<string | null>} The access token, or null if cancelled.\n */\nexport async function authenticateGithub() {\n const existing = getGithubToken();\n if (existing) {\n return existing;\n }\n\n const codeRes = await fetch(\"https://github.com/login/device/code\", {\n body: JSON.stringify({ client_id: CLIENT_ID, scope: \"repo\" }),\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n });\n\n if (!codeRes.ok) {\n throw new Error(\"Failed to initiate GitHub device flow\");\n }\n const codeData = (await codeRes.json()) as DeviceCodeResponse;\n\n const { device_code, user_code, verification_uri, interval = 5 } = codeData;\n\n return showDialog((done) => {\n let cancelled = false;\n let pollTimer: ReturnType<typeof setTimeout> | null = null;\n\n const poll = async () => {\n if (cancelled) {\n return;\n }\n try {\n const tokenRes = await fetch(\"https://github.com/login/oauth/access_token\", {\n body: JSON.stringify({\n client_id: CLIENT_ID,\n device_code,\n grant_type: \"urn:ietf:params:oauth:grant-type:device_code\",\n }),\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n });\n const tokenData = (await tokenRes.json()) as TokenResponse;\n\n if (tokenData.access_token) {\n localStorage.setItem(STORAGE_KEY, tokenData.access_token);\n done(tokenData.access_token);\n return;\n }\n\n if (tokenData.error === \"authorization_pending\") {\n pollTimer = setTimeout(poll, interval * 1000);\n return;\n }\n\n if (tokenData.error === \"slow_down\") {\n pollTimer = setTimeout(poll, (interval + 5) * 1000);\n return;\n }\n\n // Expired_token or access_denied\n done(null);\n } catch {\n pollTimer = setTimeout(poll, interval * 1000);\n }\n };\n\n pollTimer = setTimeout(poll, interval * 1000);\n\n return html`\n <sp-dialog-wrapper\n open\n headline=\"Sign in to GitHub\"\n cancel-label=\"Cancel\"\n @cancel=${() => {\n cancelled = true;\n if (pollTimer) {\n clearTimeout(pollTimer);\n }\n done(null);\n }}\n @close=${() => {\n cancelled = true;\n if (pollTimer) {\n clearTimeout(pollTimer);\n }\n done(null);\n }}\n >\n <div class=\"github-auth-dialog\">\n <p>Enter this code on GitHub to authorize Jx Studio:</p>\n <div class=\"github-auth-code\">${user_code}</div>\n <p>\n <a href=\"${verification_uri}\" target=\"_blank\" rel=\"noopener\"\n >Open ${verification_uri}</a\n >\n </p>\n <p class=\"github-auth-waiting\">Waiting for authorization…</p>\n </div>\n </sp-dialog-wrapper>\n `;\n });\n}\n",
|
|
6
|
-
"/// <reference lib=\"dom\" />\n/** Publish a local project to GitHub — creates a new repo and pushes. */\n\nimport { html } from \"lit-html\";\nimport { errorMessage } from \"@jxsuite/schema/parse\";\nimport { ref } from \"lit-html/directives/ref.js\";\nimport { showDialog } from \"../ui/layers\";\nimport { authenticateGithub } from \"./github-auth\";\nimport { getPlatform } from \"../platform\";\nimport { statusMessage } from \"../panels/statusbar\";\n\ninterface GithubErrorResponse {\n errors?: { message?: string }[];\n message?: string;\n}\n\ninterface GithubRepoResponse {\n clone_url: string;\n html_url: string;\n}\n\n/**\n * Full \"Publish to GitHub\" flow: 1. Authenticate (or reuse stored token) 2. Prompt for repo name /\n * visibility 3. Create the repo via GitHub API 4. Add remote + push\n *\n * @param {{ projectName: string }} opts\n * @returns {Promise<boolean>} True if published successfully\n */\nexport async function publishToGithub({ projectName }: { projectName: string }) {\n const token = await authenticateGithub();\n if (!token) {\n return false;\n }\n\n const repoOpts = await showDialog<{\n name: string;\n description: string;\n isPrivate: boolean;\n } | null>((done) => {\n let _nameInput: HTMLInputElement | null = null;\n let _descInput: HTMLInputElement | null = null;\n let _privateToggle: HTMLInputElement | null = null;\n\n return html`\n <sp-dialog-wrapper\n open\n headline=\"Publish to GitHub\"\n confirm-label=\"Create Repository\"\n cancel-label=\"Cancel\"\n @confirm=${() => {\n done({\n description: _descInput?.value || \"\",\n isPrivate: _privateToggle?.checked ?? true,\n name: _nameInput?.value || projectName,\n });\n }}\n @cancel=${() => done(null)}\n @close=${() => done(null)}\n >\n <div class=\"github-publish-dialog\">\n <sp-field-label for=\"repo-name\">Repository name</sp-field-label>\n <sp-textfield\n id=\"repo-name\"\n name=\"repo-name\"\n value=\"${projectName}\"\n placeholder=\"my-project\"\n ${ref((el) => {\n _nameInput = (el as HTMLInputElement | null) || null;\n })}\n ></sp-textfield>\n\n <sp-field-label for=\"repo-desc\">Description (optional)</sp-field-label>\n <sp-textfield\n id=\"repo-desc\"\n name=\"repo-desc\"\n placeholder=\"A brief description\"\n ${ref((el) => {\n _descInput = (el as HTMLInputElement | null) || null;\n })}\n ></sp-textfield>\n\n <sp-field-label>Visibility</sp-field-label>\n <sp-switch\n name=\"repo-private\"\n checked\n ${ref((el) => {\n _privateToggle = (el as HTMLInputElement | null) || null;\n })}\n >Private repository</sp-switch\n >\n </div>\n </sp-dialog-wrapper>\n `;\n });\n\n if (!repoOpts) {\n return false;\n }\n\n statusMessage(\"Creating GitHub repository…\");\n\n const createRes = await fetch(\"https://api.github.com/user/repos\", {\n body: JSON.stringify({\n auto_init: false,\n description: repoOpts.description,\n name: repoOpts.name,\n private: repoOpts.isPrivate,\n }),\n headers: {\n Accept: \"application/vnd.github+json\",\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n });\n\n if (!createRes.ok) {\n const err = (await createRes.json()) as GithubErrorResponse;\n const msg = err.errors?.[0]?.message || err.message || \"Failed to create repository\";\n statusMessage(`Error: ${msg}`);\n return false;\n }\n\n const repo = (await createRes.json()) as GithubRepoResponse;\n const platform = getPlatform();\n\n statusMessage(\"Setting remote and pushing…\");\n\n await platform.gitAddRemote(\"origin\", repo.clone_url);\n\n statusMessage(\"Pushing to GitHub…\");\n try {\n await platform.gitPush({ setUpstream: true });\n } catch (error) {\n statusMessage(`Push failed: ${errorMessage(error)}`);\n return false;\n }\n\n // Lazy import breaks the github-publish ↔ git-panel module cycle\n const { refreshGitStatus } = await import(\"../panels/git-panel\");\n await refreshGitStatus();\n statusMessage(`Published to GitHub: ${repo.html_url}`);\n return true;\n}\n",
|
|
7
|
-
"/// <reference lib=\"dom\" />\n/**\n * Git panel — Source control sidebar with sync status, branch selector, Local Changes / History\n * tabs, commit form, and changed-components view.\n */\n\nimport { html, nothing } from \"lit-html\";\nimport { errorMessage } from \"@jxsuite/schema/parse\";\nimport { flushAllCollab } from \"../collab/collab-session\";\nimport type {\n GitBranchesResult,\n GitDiffState,\n GitFileStatus,\n GitStatusResult,\n StudioPlatform,\n} from \"../types\";\nimport { live } from \"lit-html/directives/live.js\";\nimport { repeat } from \"lit-html/directives/repeat.js\";\nimport { getPlatform } from \"../platform\";\nimport { formatForPath } from \"../format/format-host\";\nimport { projectState, renderOnly, updateUi } from \"../store\";\nimport { activeTab } from \"../workspace/workspace\";\nimport { view } from \"../view\";\nimport { showConfirmDialog, showPromptDialog } from \"../ui/layers\";\nimport { statusMessage } from \"./statusbar\";\nimport { publishToGithub } from \"../github/github-publish\";\nimport { pullWithPackageSync } from \"../packages/pull-package-sync\";\n\ninterface GitLogEntry {\n hash: string;\n message: string;\n author: string;\n date: string;\n}\n\ntype GitFileEntry = GitFileStatus;\n\ninterface GitUiState {\n gitStatus?: Partial<GitStatusResult> | null;\n gitBranches?: Partial<GitBranchesResult> | null;\n gitLoading?: boolean;\n gitError?: string | null;\n gitCommitMessage?: string;\n gitLogEntries?: GitLogEntry[] | null;\n}\n\nexport async function refreshGitStatus() {\n if (!projectState) {\n return;\n }\n const plat = getPlatform();\n updateUi(\"gitLoading\", true);\n updateUi(\"gitError\", null);\n try {\n // Settled independently, not Promise.all: outside a work tree `git branch` exits non-zero\n // While `git status` answers cleanly with isRepo:false. Letting the branch lookup reject the\n // Pair discarded that status, so the panel re-rendered its \"no status yet\" branch, refreshed\n // Again, and span — a request per render for as long as the tab stayed open.\n const [status, branches] = await Promise.allSettled([plat.gitStatus(), plat.gitBranches()]);\n if (status.status === \"fulfilled\") {\n updateUi(\"gitStatus\", status.value);\n }\n if (branches.status === \"fulfilled\") {\n updateUi(\"gitBranches\", branches.value);\n }\n // A branch lookup that fails on a repo-less project is expected, not an error worth showing;\n // Anything else (including a failed status) surfaces.\n const failure: unknown =\n status.status === \"rejected\"\n ? status.reason\n : branches.status === \"rejected\" && status.value?.isRepo\n ? branches.reason\n : null;\n if (failure) {\n updateUi(\"gitError\", errorMessage(failure));\n }\n _lastUpdated = new Date();\n } catch (error) {\n updateUi(\"gitError\", errorMessage(error));\n } finally {\n updateUi(\"gitLoading\", false);\n renderOnly(\"leftPanel\");\n }\n}\n\n/**\n * Show a dialog to clone a git repository. Returns the cloned project root on success, or null.\n *\n * @param {{ openRecentProject: (root: string) => Promise<void> }} ctx\n */\nexport async function cloneRepository(ctx: { openRecentProject: (root: string) => Promise<void> }) {\n const platform = getPlatform();\n if (!platform.gitClone) {\n statusMessage(\"Clone not supported on this platform\");\n return;\n }\n\n const url = await showPromptDialog(\"Clone Git Repository\", {\n confirmLabel: \"Clone\",\n message: \"Repository URL\",\n placeholder: \"https://github.com/user/repo.git\",\n validate: (v) => (v.trim() ? \"\" : \"Enter a repository URL.\"),\n });\n\n if (!url) {\n return;\n }\n\n try {\n statusMessage(\"Cloning repository...\");\n const result = await platform.gitClone(url);\n if (result?.root) {\n statusMessage(\"Clone complete\");\n await ctx.openRecentProject(result.root);\n }\n } catch (error) {\n statusMessage(`Clone failed: ${errorMessage(error)}`);\n }\n}\n\n/** @returns {boolean} */\nexport function platformSupportsClone() {\n return Boolean(getPlatform().gitClone);\n}\n\n/**\n * @param {string} action\n * @param {unknown} [body]\n */\nasync function gitAction(action: string, body?: unknown) {\n const plat = getPlatform() as Record<string, (...args: unknown[]) => Promise<unknown>> &\n StudioPlatform;\n updateUi(\"gitLoading\", true);\n updateUi(\"gitError\", null);\n try {\n await plat[action]!(body);\n await refreshGitStatus();\n } catch (error) {\n updateUi(\"gitError\", errorMessage(error));\n updateUi(\"gitLoading\", false);\n renderOnly(\"leftPanel\");\n }\n}\n\n/** Pull via the package-aware orchestrator; same loading/error contract as gitAction. */\nasync function doPull() {\n updateUi(\"gitLoading\", true);\n updateUi(\"gitError\", null);\n try {\n await pullWithPackageSync();\n await refreshGitStatus();\n } catch (error) {\n updateUi(\"gitError\", errorMessage(error));\n updateUi(\"gitLoading\", false);\n renderOnly(\"leftPanel\");\n }\n}\n\nlet _pollTimer = null as ReturnType<typeof setInterval> | null;\nlet _lastUpdated = null as Date | null;\nlet _gitSubTab = \"changes\";\n\nasync function fetchGitLog() {\n const plat = getPlatform();\n try {\n const entries = await plat.gitLog(30);\n updateUi(\"gitLogEntries\", entries);\n renderOnly(\"leftPanel\");\n } catch (error) {\n updateUi(\"gitError\", errorMessage(error));\n renderOnly(\"leftPanel\");\n }\n}\n\n/**\n * @param {{ ui: GitUiState }} S\n * @param {{\n * setCanvasMode?: (mode: string) => void;\n * setGitDiffState?: (state: GitDiffState | null) => void;\n * cloneRepository?: () => void;\n * }} ctx\n */\nexport function renderGitPanel(\n S: { ui: GitUiState },\n ctx: {\n setCanvasMode?: (mode: string) => void;\n setGitDiffState?: (state: GitDiffState | null) => void;\n cloneRepository?: () => void;\n },\n) {\n if (!projectState) {\n return html`<div class=\"git-panel git-panel-empty\">\n <div class=\"git-empty-state\">\n <p>Open a project to use source control.</p>\n ${\n platformSupportsClone()\n ? html`<sp-action-button size=\"m\" @click=${() => ctx.cloneRepository?.()}>\n <sp-icon-download slot=\"icon\"></sp-icon-download>\n Clone Git Repository\n </sp-action-button>`\n : nothing\n }\n </div>\n </div>`;\n }\n const status = S.ui.gitStatus;\n const branches = S.ui.gitBranches;\n const loading = S.ui.gitLoading;\n\n // First paint kicks off the fetch. A refresh that already failed must NOT re-arm it here, or the\n // Render it triggers becomes the next render's reason to fetch again; the Refresh button and the\n // Poll timer are the ways back.\n if (!status && !loading && !S.ui.gitError) {\n void refreshGitStatus();\n return html`<div class=\"git-panel\">\n <div class=\"git-loading\">Loading...</div>\n </div>`;\n }\n\n if (status && !status.isRepo) {\n return html`<div class=\"git-panel git-panel-empty\">\n <div class=\"git-empty-state\">\n <p>This project is not yet a git repository.</p>\n <sp-action-button\n size=\"m\"\n @click=${async () => {\n statusMessage(\"Initializing repository…\");\n await getPlatform().gitInit();\n statusMessage(\"Repository initialized\");\n await refreshGitStatus();\n }}\n ?disabled=${loading}\n >\n <sp-icon-add slot=\"icon\"></sp-icon-add>\n Initialize Repository\n </sp-action-button>\n <sp-action-button\n size=\"m\"\n @click=${() =>\n publishToGithub({\n projectName: projectState?.name || \"my-project\",\n })}\n ?disabled=${loading}\n >\n <sp-icon-share slot=\"icon\"></sp-icon-share>\n Publish to GitHub\n </sp-action-button>\n </div>\n </div>`;\n }\n\n if (!_pollTimer) {\n _pollTimer = setInterval(() => {\n if (view.leftTab === \"git\" && !S.ui.gitLoading) {\n void refreshGitStatus();\n }\n }, 30_000);\n }\n\n const stagedFiles = status?.files?.filter((f: GitFileEntry) => f.staged) || [];\n const unstagedFiles = status?.files?.filter((f: GitFileEntry) => !f.staged) || [];\n const totalChanges = status?.files?.length || 0;\n\n const doCommit = async () => {\n const tab = activeTab.value;\n const msg = tab?.session.ui.gitCommitMessage?.trim();\n if (!msg) {\n return;\n }\n updateUi(\"gitCommitMessage\", \"\");\n // Fold co-editing sessions into the backend's tree first so the commit never misses\n // Trailing keystrokes (the mirror is debounced).\n await flushAllCollab();\n await gitAction(\"gitCommit\", msg);\n };\n\n const doCommitAndSync = async () => {\n const tab = activeTab.value;\n const msg = tab?.session.ui.gitCommitMessage?.trim();\n if (!msg) {\n return;\n }\n updateUi(\"gitCommitMessage\", \"\");\n updateUi(\"gitLoading\", true);\n updateUi(\"gitError\", null);\n await flushAllCollab();\n const plat = getPlatform();\n try {\n await plat.gitCommit(msg);\n await plat.gitPush();\n await refreshGitStatus();\n } catch (error) {\n updateUi(\"gitError\", errorMessage(error));\n updateUi(\"gitLoading\", false);\n renderOnly(\"leftPanel\");\n }\n };\n\n // ─── 1. Sync status bar ──────────────────────────────────────────────────\n const isUpToDate = !status?.ahead && !status?.behind;\n const syncLabel = isUpToDate\n ? \"Up to date\"\n : `${status?.ahead ? `${status.ahead} ahead` : \"\"}${status?.ahead && status?.behind ? \", \" : \"\"}${status?.behind ? `${status.behind} behind` : \"\"}`;\n const lastUpdatedStr = _lastUpdated\n ? _lastUpdated.toLocaleTimeString([], {\n hour: \"2-digit\",\n minute: \"2-digit\",\n })\n : \"\";\n\n const hasRemotes = (status?.remotes?.length ?? 0) > 0;\n\n const syncBarT = hasRemotes\n ? html`\n <div class=\"git-sync-bar\">\n <sp-action-button\n size=\"s\"\n quiet\n class=\"git-sync-icon\"\n title=\"Refresh\"\n @click=${() => refreshGitStatus()}\n ?disabled=${loading}\n >\n <sp-icon-refresh slot=\"icon\"></sp-icon-refresh>\n </sp-action-button>\n <div class=\"git-sync-text\">\n <span class=\"git-sync-label\">${syncLabel}</span>\n ${\n lastUpdatedStr\n ? html`<span class=\"git-sync-time\">Last updated ${lastUpdatedStr}</span>`\n : nothing\n }\n </div>\n <sp-action-group size=\"xs\" quiet class=\"git-sync-actions\">\n <sp-action-button\n title=\"Fetch\"\n @click=${() => gitAction(\"gitFetch\")}\n ?disabled=${loading}\n >\n <sp-icon-download slot=\"icon\" size=\"xs\"></sp-icon-download>\n </sp-action-button>\n <sp-action-button\n title=\"Pull${status?.behind ? ` (${status.behind} behind)` : \"\"}\"\n @click=${() => void doPull()}\n ?disabled=${loading}\n >\n <sp-icon-arrow-down slot=\"icon\" size=\"xs\"></sp-icon-arrow-down>\n </sp-action-button>\n <sp-action-button\n title=\"Push${status?.ahead ? ` (${status.ahead} ahead)` : \"\"}\"\n @click=${() => gitAction(\"gitPush\")}\n ?disabled=${loading}\n >\n <sp-icon-arrow-up slot=\"icon\" size=\"xs\"></sp-icon-arrow-up>\n </sp-action-button>\n </sp-action-group>\n </div>\n `\n : html`\n <div class=\"git-sync-bar git-sync-bar--no-remote\">\n <sp-action-button\n size=\"s\"\n quiet\n class=\"git-sync-icon\"\n title=\"Refresh\"\n @click=${() => refreshGitStatus()}\n ?disabled=${loading}\n >\n <sp-icon-refresh slot=\"icon\"></sp-icon-refresh>\n </sp-action-button>\n <div class=\"git-sync-text\">\n <span class=\"git-sync-label\">Local only (no remote)</span>\n </div>\n <sp-action-button\n size=\"s\"\n @click=${() =>\n publishToGithub({\n projectName: projectState?.name || \"my-project\",\n })}\n ?disabled=${loading}\n >\n <sp-icon-share slot=\"icon\"></sp-icon-share>\n Publish to GitHub\n </sp-action-button>\n </div>\n `;\n\n // ─── 2. Branch selector ──────────────────────────────────────────────────\n const branchSelectorT = html`\n <div class=\"git-branch-row\">\n <svg\n class=\"git-branch-icon\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <line x1=\"6\" y1=\"3\" x2=\"6\" y2=\"15\"></line>\n <circle cx=\"18\" cy=\"6\" r=\"3\"></circle>\n <circle cx=\"6\" cy=\"18\" r=\"3\"></circle>\n <path d=\"M18 9a9 9 0 0 1-9 9\"></path>\n </svg>\n <div class=\"git-branch-text\">\n <span class=\"git-branch-label\">Active branch</span>\n <span class=\"git-branch-name\">${branches?.current || status?.branch || \"—\"}</span>\n </div>\n <sp-picker\n size=\"s\"\n quiet\n class=\"git-branch-picker\"\n .value=${live(branches?.current || \"\")}\n @change=${async (e: Event) => {\n const val = (e.target as HTMLInputElement).value;\n if (val === \"__new__\") {\n (e.target as HTMLInputElement).value = branches?.current || \"\";\n const name = await showPromptDialog(\"New Branch\", {\n confirmLabel: \"Create\",\n message: `Branching from ${branches?.current || status?.branch || \"the current branch\"}.`,\n placeholder: \"feature/my-change\",\n validate: (v) => (v.trim() ? \"\" : \"Enter a branch name.\"),\n });\n if (name) {\n await gitAction(\"gitCreateBranch\", name);\n }\n return;\n }\n if (val !== branches?.current) {\n await gitAction(\"gitCheckout\", val);\n }\n }}\n >\n ${(branches?.branches || []).map(\n (b: string) => html`<sp-menu-item value=${b}>${b}</sp-menu-item>`,\n )}\n <sp-menu-divider></sp-menu-divider>\n <sp-menu-item value=\"__new__\">+ New branch...</sp-menu-item>\n </sp-picker>\n </div>\n `;\n\n // ─── 3. Tabs: Local Changes / History ────────────────────────────────────\n const switchTab = (tab: string) => {\n _gitSubTab = tab;\n if (tab === \"history\" && !S.ui.gitLogEntries) {\n void fetchGitLog();\n }\n renderOnly(\"leftPanel\");\n };\n\n const tabsT = html`\n <div class=\"git-tabs\">\n <button\n class=\"git-tab ${_gitSubTab === \"changes\" ? \"active\" : \"\"}\"\n @click=${() => switchTab(\"changes\")}\n >\n Local Changes${totalChanges > 0 ? ` (${totalChanges})` : \"\"}\n </button>\n <button\n class=\"git-tab ${_gitSubTab === \"history\" ? \"active\" : \"\"}\"\n @click=${() => switchTab(\"history\")}\n >\n History\n </button>\n </div>\n `;\n\n // ─── 4. Commit form ──────────────────────────────────────────────────────\n const commitT = html`\n <div class=\"git-commit-area\">\n <label class=\"git-commit-label\">Please write a commit message</label>\n <sp-textfield\n size=\"s\"\n multiline\n class=\"git-commit-input\"\n placeholder=\"Describe your changes\"\n .value=${live(S.ui.gitCommitMessage || \"\")}\n @input=${(e: Event) => updateUi(\"gitCommitMessage\", (e.target as HTMLInputElement).value)}\n @keydown=${(e: KeyboardEvent) => {\n if ((e.ctrlKey || e.metaKey) && e.key === \"Enter\") {\n e.preventDefault();\n void doCommit();\n }\n }}\n ></sp-textfield>\n <div class=\"git-commit-actions\">\n <div class=\"git-split-btn\">\n <sp-action-button\n class=\"git-commit-btn\"\n size=\"s\"\n @click=${doCommitAndSync}\n ?disabled=${loading}\n >\n Commit and sync\n </sp-action-button>\n <sp-action-button\n class=\"git-split-trigger\"\n size=\"s\"\n @click=${(e: Event) => {\n const menu = (\n (e.currentTarget as HTMLElement).parentElement as HTMLElement\n ).querySelector(\".git-split-menu\");\n if (menu) {\n menu.toggleAttribute(\"hidden\");\n }\n }}\n >\n <sp-icon-chevron-down slot=\"icon\" size=\"xs\"></sp-icon-chevron-down>\n </sp-action-button>\n <div class=\"git-split-menu\" hidden>\n <button\n class=\"git-split-menu-item\"\n @click=${(e: Event) => {\n ((e.currentTarget as HTMLElement).parentElement as HTMLElement).setAttribute(\n \"hidden\",\n \"\",\n );\n void doCommit();\n }}\n >\n Commit (don't sync)\n </button>\n </div>\n </div>\n </div>\n </div>\n `;\n\n // ─── 5. Changed Components ───────────────────────────────────────────────\n const fileRowT = (file: GitFileEntry) => {\n const parts = file.path.split(\"/\");\n const name = parts.pop();\n const dir = parts.join(\"/\");\n\n const onFileClick = async () => {\n if (file.status !== \"M\" && file.status !== \"A\") {\n return;\n }\n if (!file.path.endsWith(\".json\") && !formatForPath(file.path)) {\n return;\n }\n\n try {\n const plat = getPlatform();\n updateUi(\"gitLoading\", true);\n\n const [originalContent, currentContent] = await Promise.all([\n file.status === \"A\"\n ? Promise.resolve(\"\")\n : plat.gitShow({ path: file.path, ref: \"HEAD\" }),\n plat.readFile(file.path),\n ]);\n\n const diffState = {\n currentContent,\n filePath: file.path,\n fileStatus: file.status,\n originalContent,\n };\n\n updateUi(\"gitDiffState\", diffState);\n\n if (ctx?.setCanvasMode) {\n if (ctx.setGitDiffState) {\n ctx.setGitDiffState(diffState);\n }\n ctx.setCanvasMode(\"git-diff\");\n }\n } catch (error) {\n updateUi(\"gitError\", `Failed to load diff: ${errorMessage(error)}`);\n } finally {\n updateUi(\"gitLoading\", false);\n }\n };\n\n return html`\n <div class=\"git-file-row\">\n <span\n class=\"git-file-info\"\n style=\"cursor: pointer; flex: 1;\"\n title=\"Click to view diff\"\n @click=${onFileClick}\n >\n <span class=\"git-file-name\" title=${file.path}>${name}</span>\n ${dir ? html`<span class=\"git-file-dir\">${dir}</span>` : nothing}\n </span>\n <span class=\"git-file-actions\">\n ${\n file.staged\n ? html`\n <sp-action-button\n size=\"xs\"\n quiet\n title=\"Unstage\"\n @click=${() => gitAction(\"gitUnstage\", [file.path])}\n >\n <sp-icon-remove slot=\"icon\" size=\"xs\"></sp-icon-remove>\n </sp-action-button>\n `\n : html`\n <sp-action-button\n size=\"xs\"\n quiet\n title=\"Discard changes\"\n @click=${async () => {\n if (file.status === \"U\") {\n return;\n }\n const confirmed = await showConfirmDialog(\n \"Discard Changes\",\n `Discard changes to ${file.path}?`,\n { confirmLabel: \"Discard\", destructive: true },\n );\n if (!confirmed) {\n return;\n }\n await gitAction(\"gitDiscard\", [file.path]);\n }}\n ?disabled=${file.status === \"U\"}\n >\n <sp-icon-undo slot=\"icon\" size=\"xs\"></sp-icon-undo>\n </sp-action-button>\n <sp-action-button\n size=\"xs\"\n quiet\n title=\"Stage\"\n @click=${() => gitAction(\"gitStage\", [file.path])}\n >\n <sp-icon-add slot=\"icon\" size=\"xs\"></sp-icon-add>\n </sp-action-button>\n `\n }\n </span>\n <span class=\"git-file-badge git-status-${file.status}\">${file.status}</span>\n </div>\n `;\n };\n\n /** Group files by component (parent directory for .json/.class.json, or \"Other\") */\n const groupFilesByComponent = (files: GitFileEntry[]) => {\n const groups = new Map<string, GitFileEntry[]>();\n for (const f of files) {\n const parts = f.path.split(\"/\");\n let component;\n if (f.path.endsWith(\".json\") || f.path.endsWith(\".class.json\") || formatForPath(f.path)) {\n component = parts.length > 1 ? `/${parts.at(-2)}` : `/${parts[0]}`;\n } else {\n component = \"Other\";\n }\n if (!groups.has(component)) {\n groups.set(component, []);\n }\n (groups.get(component) as GitFileEntry[]).push(f);\n }\n return groups;\n };\n\n const allFiles = [...stagedFiles, ...unstagedFiles];\n const componentGroups = groupFilesByComponent(allFiles);\n\n const changesT = html`\n ${\n stagedFiles.length > 0\n ? html`\n <div class=\"git-section\">\n <div class=\"git-section-header\">\n <span>Staged Changes</span>\n <span class=\"git-count\">${stagedFiles.length}</span>\n <sp-action-button\n size=\"xs\"\n quiet\n title=\"Unstage all\"\n @click=${() =>\n gitAction(\n \"gitUnstage\",\n stagedFiles.map((f: GitFileEntry) => f.path),\n )}\n >\n <sp-icon-remove slot=\"icon\" size=\"xs\"></sp-icon-remove>\n </sp-action-button>\n </div>\n ${repeat(stagedFiles, (f: GitFileEntry) => f.path, fileRowT)}\n </div>\n `\n : nothing\n }\n <div class=\"git-section\">\n <div class=\"git-section-header\">\n <span>Changed Components</span>\n <span class=\"git-count\">${allFiles.length}</span>\n ${\n unstagedFiles.length > 0\n ? html`\n <sp-action-button\n size=\"xs\"\n quiet\n title=\"Stage all\"\n @click=${() =>\n gitAction(\n \"gitStage\",\n unstagedFiles.map((f: GitFileEntry) => f.path),\n )}\n >\n <sp-icon-add slot=\"icon\" size=\"xs\"></sp-icon-add>\n </sp-action-button>\n `\n : nothing\n }\n </div>\n ${\n allFiles.length > 0\n ? html`\n ${[...componentGroups.entries()].map(\n ([comp, files]) => html`\n <div class=\"git-component-group\">\n <div class=\"git-component-header\">\n <sp-action-button\n size=\"xs\"\n quiet\n class=\"git-component-overflow\"\n title=\"Actions\"\n >\n <sp-icon-more slot=\"icon\" size=\"xs\"></sp-icon-more>\n </sp-action-button>\n <span class=\"git-component-name\">${comp}</span>\n </div>\n ${repeat(files, (f: GitFileEntry) => f.path, fileRowT)}\n </div>\n `,\n )}\n `\n : html`<div class=\"git-empty\">No changes</div>`\n }\n </div>\n `;\n\n // ─── 6. History tab content ──────────────────────────────────────────────\n const logEntries = S.ui.gitLogEntries || [];\n const historyT = html`\n <div class=\"git-history\">\n ${\n logEntries.length === 0\n ? html`<div class=\"git-empty\">No history</div>`\n : repeat(\n logEntries,\n (e: GitLogEntry) => e.hash,\n (entry: GitLogEntry) => html`\n <div class=\"git-history-entry\">\n <span class=\"git-history-hash\">${entry.hash.slice(0, 7)}</span>\n <span class=\"git-history-message\">${entry.message}</span>\n <span class=\"git-history-meta\"\n >${entry.author} · ${_relativeDate(entry.date)}</span\n >\n </div>\n `,\n )\n }\n </div>\n `;\n\n return html`\n <div class=\"git-panel\">\n ${syncBarT} ${branchSelectorT} ${tabsT}\n ${_gitSubTab === \"changes\" ? html`${commitT}${changesT}` : historyT}\n ${loading ? html`<div class=\"git-loading\">Loading...</div>` : nothing}\n ${S.ui.gitError ? html`<div class=\"git-error\">${S.ui.gitError}</div>` : nothing}\n </div>\n `;\n}\n\n/** @param {string} iso */\nfunction _relativeDate(iso: string) {\n const d = new Date(iso);\n const now = Date.now();\n const diff = now - d.getTime();\n const mins = Math.floor(diff / 60_000);\n if (mins < 1) {\n return \"just now\";\n }\n if (mins < 60) {\n return `${mins}m ago`;\n }\n const hours = Math.floor(mins / 60);\n if (hours < 24) {\n return `${hours}h ago`;\n }\n const days = Math.floor(hours / 24);\n if (days < 30) {\n return `${days}d ago`;\n }\n return d.toLocaleDateString();\n}\n\nexport function cleanupGitPanel() {\n if (_pollTimer) {\n clearInterval(_pollTimer);\n _pollTimer = null;\n }\n}\n"
|
|
8
|
-
],
|
|
9
|
-
"mappings": "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",
|
|
10
|
-
"debugId": "1EEF19D9DB2E4D1164756E2164756E21",
|
|
11
|
-
"names": []
|
|
12
|
-
}
|
|
@@ -1,140 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
Directive,
|
|
3
|
-
PartType,
|
|
4
|
-
directive,
|
|
5
|
-
getCommittedValue,
|
|
6
|
-
insertPart,
|
|
7
|
-
removePart,
|
|
8
|
-
setChildPartValue,
|
|
9
|
-
setCommittedValue
|
|
10
|
-
} from "./studio-4k0m4fmp.js";
|
|
11
|
-
import {
|
|
12
|
-
noChange
|
|
13
|
-
} from "./studio-5x5774ak.js";
|
|
14
|
-
|
|
15
|
-
// ../../node_modules/lit-html/development/directives/repeat.js
|
|
16
|
-
var generateMap = (list, start, end) => {
|
|
17
|
-
const map = new Map;
|
|
18
|
-
for (let i = start;i <= end; i++) {
|
|
19
|
-
map.set(list[i], i);
|
|
20
|
-
}
|
|
21
|
-
return map;
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
class RepeatDirective extends Directive {
|
|
25
|
-
constructor(partInfo) {
|
|
26
|
-
super(partInfo);
|
|
27
|
-
if (partInfo.type !== PartType.CHILD) {
|
|
28
|
-
throw new Error("repeat() can only be used in text expressions");
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
_getValuesAndKeys(items, keyFnOrTemplate, template) {
|
|
32
|
-
let keyFn;
|
|
33
|
-
if (template === undefined) {
|
|
34
|
-
template = keyFnOrTemplate;
|
|
35
|
-
} else if (keyFnOrTemplate !== undefined) {
|
|
36
|
-
keyFn = keyFnOrTemplate;
|
|
37
|
-
}
|
|
38
|
-
const keys = [];
|
|
39
|
-
const values = [];
|
|
40
|
-
let index = 0;
|
|
41
|
-
for (const item of items) {
|
|
42
|
-
keys[index] = keyFn ? keyFn(item, index) : index;
|
|
43
|
-
values[index] = template(item, index);
|
|
44
|
-
index++;
|
|
45
|
-
}
|
|
46
|
-
return {
|
|
47
|
-
values,
|
|
48
|
-
keys
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
render(items, keyFnOrTemplate, template) {
|
|
52
|
-
return this._getValuesAndKeys(items, keyFnOrTemplate, template).values;
|
|
53
|
-
}
|
|
54
|
-
update(containerPart, [items, keyFnOrTemplate, template]) {
|
|
55
|
-
const oldParts = getCommittedValue(containerPart);
|
|
56
|
-
const { values: newValues, keys: newKeys } = this._getValuesAndKeys(items, keyFnOrTemplate, template);
|
|
57
|
-
if (!Array.isArray(oldParts)) {
|
|
58
|
-
this._itemKeys = newKeys;
|
|
59
|
-
return newValues;
|
|
60
|
-
}
|
|
61
|
-
const oldKeys = this._itemKeys ??= [];
|
|
62
|
-
const newParts = [];
|
|
63
|
-
let newKeyToIndexMap;
|
|
64
|
-
let oldKeyToIndexMap;
|
|
65
|
-
let oldHead = 0;
|
|
66
|
-
let oldTail = oldParts.length - 1;
|
|
67
|
-
let newHead = 0;
|
|
68
|
-
let newTail = newValues.length - 1;
|
|
69
|
-
while (oldHead <= oldTail && newHead <= newTail) {
|
|
70
|
-
if (oldParts[oldHead] === null) {
|
|
71
|
-
oldHead++;
|
|
72
|
-
} else if (oldParts[oldTail] === null) {
|
|
73
|
-
oldTail--;
|
|
74
|
-
} else if (oldKeys[oldHead] === newKeys[newHead]) {
|
|
75
|
-
newParts[newHead] = setChildPartValue(oldParts[oldHead], newValues[newHead]);
|
|
76
|
-
oldHead++;
|
|
77
|
-
newHead++;
|
|
78
|
-
} else if (oldKeys[oldTail] === newKeys[newTail]) {
|
|
79
|
-
newParts[newTail] = setChildPartValue(oldParts[oldTail], newValues[newTail]);
|
|
80
|
-
oldTail--;
|
|
81
|
-
newTail--;
|
|
82
|
-
} else if (oldKeys[oldHead] === newKeys[newTail]) {
|
|
83
|
-
newParts[newTail] = setChildPartValue(oldParts[oldHead], newValues[newTail]);
|
|
84
|
-
insertPart(containerPart, newParts[newTail + 1], oldParts[oldHead]);
|
|
85
|
-
oldHead++;
|
|
86
|
-
newTail--;
|
|
87
|
-
} else if (oldKeys[oldTail] === newKeys[newHead]) {
|
|
88
|
-
newParts[newHead] = setChildPartValue(oldParts[oldTail], newValues[newHead]);
|
|
89
|
-
insertPart(containerPart, oldParts[oldHead], oldParts[oldTail]);
|
|
90
|
-
oldTail--;
|
|
91
|
-
newHead++;
|
|
92
|
-
} else {
|
|
93
|
-
if (newKeyToIndexMap === undefined) {
|
|
94
|
-
newKeyToIndexMap = generateMap(newKeys, newHead, newTail);
|
|
95
|
-
oldKeyToIndexMap = generateMap(oldKeys, oldHead, oldTail);
|
|
96
|
-
}
|
|
97
|
-
if (!newKeyToIndexMap.has(oldKeys[oldHead])) {
|
|
98
|
-
removePart(oldParts[oldHead]);
|
|
99
|
-
oldHead++;
|
|
100
|
-
} else if (!newKeyToIndexMap.has(oldKeys[oldTail])) {
|
|
101
|
-
removePart(oldParts[oldTail]);
|
|
102
|
-
oldTail--;
|
|
103
|
-
} else {
|
|
104
|
-
const oldIndex = oldKeyToIndexMap.get(newKeys[newHead]);
|
|
105
|
-
const oldPart = oldIndex !== undefined ? oldParts[oldIndex] : null;
|
|
106
|
-
if (oldPart === null) {
|
|
107
|
-
const newPart = insertPart(containerPart, oldParts[oldHead]);
|
|
108
|
-
setChildPartValue(newPart, newValues[newHead]);
|
|
109
|
-
newParts[newHead] = newPart;
|
|
110
|
-
} else {
|
|
111
|
-
newParts[newHead] = setChildPartValue(oldPart, newValues[newHead]);
|
|
112
|
-
insertPart(containerPart, oldParts[oldHead], oldPart);
|
|
113
|
-
oldParts[oldIndex] = null;
|
|
114
|
-
}
|
|
115
|
-
newHead++;
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
while (newHead <= newTail) {
|
|
120
|
-
const newPart = insertPart(containerPart, newParts[newTail + 1]);
|
|
121
|
-
setChildPartValue(newPart, newValues[newHead]);
|
|
122
|
-
newParts[newHead++] = newPart;
|
|
123
|
-
}
|
|
124
|
-
while (oldHead <= oldTail) {
|
|
125
|
-
const oldPart = oldParts[oldHead++];
|
|
126
|
-
if (oldPart !== null) {
|
|
127
|
-
removePart(oldPart);
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
this._itemKeys = newKeys;
|
|
131
|
-
setCommittedValue(containerPart, newParts);
|
|
132
|
-
return noChange;
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
var repeat = directive(RepeatDirective);
|
|
136
|
-
|
|
137
|
-
export { repeat };
|
|
138
|
-
|
|
139
|
-
//# debugId=25916A2DD803B44964756E2164756E21
|
|
140
|
-
//# sourceMappingURL=studio-xq0t7n5t.js.map
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../node_modules/lit-html/development/directives/repeat.js"],
|
|
4
|
-
"sourcesContent": [
|
|
5
|
-
"/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nimport { noChange } from '../lit-html.js';\nimport { directive, Directive, PartType } from '../directive.js';\nimport { insertPart, getCommittedValue, removePart, setCommittedValue, setChildPartValue, } from '../directive-helpers.js';\n// Helper for generating a map of array item to its index over a subset\n// of an array (used to lazily generate `newKeyToIndexMap` and\n// `oldKeyToIndexMap`)\nconst generateMap = (list, start, end) => {\n const map = new Map();\n for (let i = start; i <= end; i++) {\n map.set(list[i], i);\n }\n return map;\n};\nclass RepeatDirective extends Directive {\n constructor(partInfo) {\n super(partInfo);\n if (partInfo.type !== PartType.CHILD) {\n throw new Error('repeat() can only be used in text expressions');\n }\n }\n _getValuesAndKeys(items, keyFnOrTemplate, template) {\n let keyFn;\n if (template === undefined) {\n template = keyFnOrTemplate;\n }\n else if (keyFnOrTemplate !== undefined) {\n keyFn = keyFnOrTemplate;\n }\n const keys = [];\n const values = [];\n let index = 0;\n for (const item of items) {\n keys[index] = keyFn ? keyFn(item, index) : index;\n values[index] = template(item, index);\n index++;\n }\n return {\n values,\n keys,\n };\n }\n render(items, keyFnOrTemplate, template) {\n return this._getValuesAndKeys(items, keyFnOrTemplate, template).values;\n }\n update(containerPart, [items, keyFnOrTemplate, template]) {\n // Old part & key lists are retrieved from the last update (which may\n // be primed by hydration)\n const oldParts = getCommittedValue(containerPart);\n const { values: newValues, keys: newKeys } = this._getValuesAndKeys(items, keyFnOrTemplate, template);\n // We check that oldParts, the committed value, is an Array as an\n // indicator that the previous value came from a repeat() call. If\n // oldParts is not an Array then this is the first render and we return\n // an array for lit-html's array handling to render, and remember the\n // keys.\n if (!Array.isArray(oldParts)) {\n this._itemKeys = newKeys;\n return newValues;\n }\n // In SSR hydration it's possible for oldParts to be an array but for us\n // to not have item keys because the update() hasn't run yet. We set the\n // keys to an empty array. This will cause all oldKey/newKey comparisons\n // to fail and execution to fall to the last nested brach below which\n // reuses the oldPart.\n const oldKeys = (this._itemKeys ??= []);\n // New part list will be built up as we go (either reused from\n // old parts or created for new keys in this update). This is\n // saved in the above cache at the end of the update.\n const newParts = [];\n // Maps from key to index for current and previous update; these\n // are generated lazily only when needed as a performance\n // optimization, since they are only required for multiple\n // non-contiguous changes in the list, which are less common.\n let newKeyToIndexMap;\n let oldKeyToIndexMap;\n // Head and tail pointers to old parts and new values\n let oldHead = 0;\n let oldTail = oldParts.length - 1;\n let newHead = 0;\n let newTail = newValues.length - 1;\n // Overview of O(n) reconciliation algorithm (general approach\n // based on ideas found in ivi, vue, snabbdom, etc.):\n //\n // * We start with the list of old parts and new values (and\n // arrays of their respective keys), head/tail pointers into\n // each, and we build up the new list of parts by updating\n // (and when needed, moving) old parts or creating new ones.\n // The initial scenario might look like this (for brevity of\n // the diagrams, the numbers in the array reflect keys\n // associated with the old parts or new values, although keys\n // and parts/values are actually stored in parallel arrays\n // indexed using the same head/tail pointers):\n //\n // oldHead v v oldTail\n // oldKeys: [0, 1, 2, 3, 4, 5, 6]\n // newParts: [ , , , , , , ]\n // newKeys: [0, 2, 1, 4, 3, 7, 6] <- reflects the user's new\n // item order\n // newHead ^ ^ newTail\n //\n // * Iterate old & new lists from both sides, updating,\n // swapping, or removing parts at the head/tail locations\n // until neither head nor tail can move.\n //\n // * Example below: keys at head pointers match, so update old\n // part 0 in-place (no need to move it) and record part 0 in\n // the `newParts` list. The last thing we do is advance the\n // `oldHead` and `newHead` pointers (will be reflected in the\n // next diagram).\n //\n // oldHead v v oldTail\n // oldKeys: [0, 1, 2, 3, 4, 5, 6]\n // newParts: [0, , , , , , ] <- heads matched: update 0\n // newKeys: [0, 2, 1, 4, 3, 7, 6] and advance both oldHead\n // & newHead\n // newHead ^ ^ newTail\n //\n // * Example below: head pointers don't match, but tail\n // pointers do, so update part 6 in place (no need to move\n // it), and record part 6 in the `newParts` list. Last,\n // advance the `oldTail` and `oldHead` pointers.\n //\n // oldHead v v oldTail\n // oldKeys: [0, 1, 2, 3, 4, 5, 6]\n // newParts: [0, , , , , , 6] <- tails matched: update 6\n // newKeys: [0, 2, 1, 4, 3, 7, 6] and advance both oldTail\n // & newTail\n // newHead ^ ^ newTail\n //\n // * If neither head nor tail match; next check if one of the\n // old head/tail items was removed. We first need to generate\n // the reverse map of new keys to index (`newKeyToIndexMap`),\n // which is done once lazily as a performance optimization,\n // since we only hit this case if multiple non-contiguous\n // changes were made. Note that for contiguous removal\n // anywhere in the list, the head and tails would advance\n // from either end and pass each other before we get to this\n // case and removals would be handled in the final while loop\n // without needing to generate the map.\n //\n // * Example below: The key at `oldTail` was removed (no longer\n // in the `newKeyToIndexMap`), so remove that part from the\n // DOM and advance just the `oldTail` pointer.\n //\n // oldHead v v oldTail\n // oldKeys: [0, 1, 2, 3, 4, 5, 6]\n // newParts: [0, , , , , , 6] <- 5 not in new map: remove\n // newKeys: [0, 2, 1, 4, 3, 7, 6] 5 and advance oldTail\n // newHead ^ ^ newTail\n //\n // * Once head and tail cannot move, any mismatches are due to\n // either new or moved items; if a new key is in the previous\n // \"old key to old index\" map, move the old part to the new\n // location, otherwise create and insert a new part. Note\n // that when moving an old part we null its position in the\n // oldParts array if it lies between the head and tail so we\n // know to skip it when the pointers get there.\n //\n // * Example below: neither head nor tail match, and neither\n // were removed; so find the `newHead` key in the\n // `oldKeyToIndexMap`, and move that old part's DOM into the\n // next head position (before `oldParts[oldHead]`). Last,\n // null the part in the `oldPart` array since it was\n // somewhere in the remaining oldParts still to be scanned\n // (between the head and tail pointers) so that we know to\n // skip that old part on future iterations.\n //\n // oldHead v v oldTail\n // oldKeys: [0, 1, -, 3, 4, 5, 6]\n // newParts: [0, 2, , , , , 6] <- stuck: update & move 2\n // newKeys: [0, 2, 1, 4, 3, 7, 6] into place and advance\n // newHead\n // newHead ^ ^ newTail\n //\n // * Note that for moves/insertions like the one above, a part\n // inserted at the head pointer is inserted before the\n // current `oldParts[oldHead]`, and a part inserted at the\n // tail pointer is inserted before `newParts[newTail+1]`. The\n // seeming asymmetry lies in the fact that new parts are\n // moved into place outside in, so to the right of the head\n // pointer are old parts, and to the right of the tail\n // pointer are new parts.\n //\n // * We always restart back from the top of the algorithm,\n // allowing matching and simple updates in place to\n // continue...\n //\n // * Example below: the head pointers once again match, so\n // simply update part 1 and record it in the `newParts`\n // array. Last, advance both head pointers.\n //\n // oldHead v v oldTail\n // oldKeys: [0, 1, -, 3, 4, 5, 6]\n // newParts: [0, 2, 1, , , , 6] <- heads matched: update 1\n // newKeys: [0, 2, 1, 4, 3, 7, 6] and advance both oldHead\n // & newHead\n // newHead ^ ^ newTail\n //\n // * As mentioned above, items that were moved as a result of\n // being stuck (the final else clause in the code below) are\n // marked with null, so we always advance old pointers over\n // these so we're comparing the next actual old value on\n // either end.\n //\n // * Example below: `oldHead` is null (already placed in\n // newParts), so advance `oldHead`.\n //\n // oldHead v v oldTail\n // oldKeys: [0, 1, -, 3, 4, 5, 6] <- old head already used:\n // newParts: [0, 2, 1, , , , 6] advance oldHead\n // newKeys: [0, 2, 1, 4, 3, 7, 6]\n // newHead ^ ^ newTail\n //\n // * Note it's not critical to mark old parts as null when they\n // are moved from head to tail or tail to head, since they\n // will be outside the pointer range and never visited again.\n //\n // * Example below: Here the old tail key matches the new head\n // key, so the part at the `oldTail` position and move its\n // DOM to the new head position (before `oldParts[oldHead]`).\n // Last, advance `oldTail` and `newHead` pointers.\n //\n // oldHead v v oldTail\n // oldKeys: [0, 1, -, 3, 4, 5, 6]\n // newParts: [0, 2, 1, 4, , , 6] <- old tail matches new\n // newKeys: [0, 2, 1, 4, 3, 7, 6] head: update & move 4,\n // advance oldTail & newHead\n // newHead ^ ^ newTail\n //\n // * Example below: Old and new head keys match, so update the\n // old head part in place, and advance the `oldHead` and\n // `newHead` pointers.\n //\n // oldHead v oldTail\n // oldKeys: [0, 1, -, 3, 4, 5, 6]\n // newParts: [0, 2, 1, 4, 3, ,6] <- heads match: update 3\n // newKeys: [0, 2, 1, 4, 3, 7, 6] and advance oldHead &\n // newHead\n // newHead ^ ^ newTail\n //\n // * Once the new or old pointers move past each other then all\n // we have left is additions (if old list exhausted) or\n // removals (if new list exhausted). Those are handled in the\n // final while loops at the end.\n //\n // * Example below: `oldHead` exceeded `oldTail`, so we're done\n // with the main loop. Create the remaining part and insert\n // it at the new head position, and the update is complete.\n //\n // (oldHead > oldTail)\n // oldKeys: [0, 1, -, 3, 4, 5, 6]\n // newParts: [0, 2, 1, 4, 3, 7 ,6] <- create and insert 7\n // newKeys: [0, 2, 1, 4, 3, 7, 6]\n // newHead ^ newTail\n //\n // * Note that the order of the if/else clauses is not\n // important to the algorithm, as long as the null checks\n // come first (to ensure we're always working on valid old\n // parts) and that the final else clause comes last (since\n // that's where the expensive moves occur). The order of\n // remaining clauses is just a simple guess at which cases\n // will be most common.\n //\n // * Note, we could calculate the longest\n // increasing subsequence (LIS) of old items in new position,\n // and only move those not in the LIS set. However that costs\n // O(nlogn) time and adds a bit more code, and only helps\n // make rare types of mutations require fewer moves. The\n // above handles removes, adds, reversal, swaps, and single\n // moves of contiguous items in linear time, in the minimum\n // number of moves. As the number of multiple moves where LIS\n // might help approaches a random shuffle, the LIS\n // optimization becomes less helpful, so it seems not worth\n // the code at this point. Could reconsider if a compelling\n // case arises.\n while (oldHead <= oldTail && newHead <= newTail) {\n if (oldParts[oldHead] === null) {\n // `null` means old part at head has already been used\n // below; skip\n oldHead++;\n }\n else if (oldParts[oldTail] === null) {\n // `null` means old part at tail has already been used\n // below; skip\n oldTail--;\n }\n else if (oldKeys[oldHead] === newKeys[newHead]) {\n // Old head matches new head; update in place\n newParts[newHead] = setChildPartValue(oldParts[oldHead], newValues[newHead]);\n oldHead++;\n newHead++;\n }\n else if (oldKeys[oldTail] === newKeys[newTail]) {\n // Old tail matches new tail; update in place\n newParts[newTail] = setChildPartValue(oldParts[oldTail], newValues[newTail]);\n oldTail--;\n newTail--;\n }\n else if (oldKeys[oldHead] === newKeys[newTail]) {\n // Old head matches new tail; update and move to new tail\n newParts[newTail] = setChildPartValue(oldParts[oldHead], newValues[newTail]);\n insertPart(containerPart, newParts[newTail + 1], oldParts[oldHead]);\n oldHead++;\n newTail--;\n }\n else if (oldKeys[oldTail] === newKeys[newHead]) {\n // Old tail matches new head; update and move to new head\n newParts[newHead] = setChildPartValue(oldParts[oldTail], newValues[newHead]);\n insertPart(containerPart, oldParts[oldHead], oldParts[oldTail]);\n oldTail--;\n newHead++;\n }\n else {\n if (newKeyToIndexMap === undefined) {\n // Lazily generate key-to-index maps, used for removals &\n // moves below\n newKeyToIndexMap = generateMap(newKeys, newHead, newTail);\n oldKeyToIndexMap = generateMap(oldKeys, oldHead, oldTail);\n }\n if (!newKeyToIndexMap.has(oldKeys[oldHead])) {\n // Old head is no longer in new list; remove\n removePart(oldParts[oldHead]);\n oldHead++;\n }\n else if (!newKeyToIndexMap.has(oldKeys[oldTail])) {\n // Old tail is no longer in new list; remove\n removePart(oldParts[oldTail]);\n oldTail--;\n }\n else {\n // Any mismatches at this point are due to additions or\n // moves; see if we have an old part we can reuse and move\n // into place\n const oldIndex = oldKeyToIndexMap.get(newKeys[newHead]);\n const oldPart = oldIndex !== undefined ? oldParts[oldIndex] : null;\n if (oldPart === null) {\n // No old part for this value; create a new one and\n // insert it\n const newPart = insertPart(containerPart, oldParts[oldHead]);\n setChildPartValue(newPart, newValues[newHead]);\n newParts[newHead] = newPart;\n }\n else {\n // Reuse old part\n newParts[newHead] = setChildPartValue(oldPart, newValues[newHead]);\n insertPart(containerPart, oldParts[oldHead], oldPart);\n // This marks the old part as having been used, so that\n // it will be skipped in the first two checks above\n oldParts[oldIndex] = null;\n }\n newHead++;\n }\n }\n }\n // Add parts for any remaining new values\n while (newHead <= newTail) {\n // For all remaining additions, we insert before last new\n // tail, since old pointers are no longer valid\n const newPart = insertPart(containerPart, newParts[newTail + 1]);\n setChildPartValue(newPart, newValues[newHead]);\n newParts[newHead++] = newPart;\n }\n // Remove any remaining unused old parts\n while (oldHead <= oldTail) {\n const oldPart = oldParts[oldHead++];\n if (oldPart !== null) {\n removePart(oldPart);\n }\n }\n // Save order of new parts for next round\n this._itemKeys = newKeys;\n // Directly set part value, bypassing it's dirty-checking\n setCommittedValue(containerPart, newParts);\n return noChange;\n }\n}\n/**\n * A directive that repeats a series of values (usually `TemplateResults`)\n * generated from an iterable, and updates those items efficiently when the\n * iterable changes based on user-provided `keys` associated with each item.\n *\n * Note that if a `keyFn` is provided, strict key-to-DOM mapping is maintained,\n * meaning previous DOM for a given key is moved into the new position if\n * needed, and DOM will never be reused with values for different keys (new DOM\n * will always be created for new keys). This is generally the most efficient\n * way to use `repeat` since it performs minimum unnecessary work for insertions\n * and removals.\n *\n * The `keyFn` takes two parameters, the item and its index, and returns a unique key value.\n *\n * ```js\n * html`\n * <ol>\n * ${repeat(this.items, (item) => item.id, (item, index) => {\n * return html`<li>${index}: ${item.name}</li>`;\n * })}\n * </ol>\n * `\n * ```\n *\n * **Important**: If providing a `keyFn`, keys *must* be unique for all items in a\n * given call to `repeat`. The behavior when two or more items have the same key\n * is undefined.\n *\n * If no `keyFn` is provided, this directive will perform similar to mapping\n * items to values, and DOM will be reused against potentially different items.\n */\nexport const repeat = directive(RepeatDirective);\n//# sourceMappingURL=repeat.js.map"
|
|
6
|
-
],
|
|
7
|
-
"mappings": "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",
|
|
8
|
-
"debugId": "25916A2DD803B44964756E2164756E21",
|
|
9
|
-
"names": []
|
|
10
|
-
}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../collab/src/envelope.ts"],
|
|
4
|
-
"sourcesContent": [
|
|
5
|
-
"/**\n * The binary wire envelope every Jx collab provider speaks: the Cloudflare platform DO, the\n * devserver endpoint in the server package, and the browser client. One WebSocket per project\n * carries every open document, multiplexed by path:\n *\n * frame := varUint frameType, body\n * 0 DOC_SYNC := varString path, varUint docEpoch, varUint8Array y-protocols sync body\n * 1 AWARENESS := varUint8Array y-protocols awareness update (project-scoped)\n * 2 DOC_CLOSE := varString path (client → server unsubscribe)\n * 3 CONTROL := varString json (see ControlMessage)\n *\n * `docEpoch` is the server-owned lifetime counter of a document's Y history. Out-of-band content\n * replacement (git discard/pull/rename, non-collab writes) bumps it; frames carrying a stale epoch\n * are dropped and answered with a `doc-reset` control message, upon which the client destroys its\n * Y.Doc and re-opens. The invariant \"Y history is never deleted or replaced without an epoch bump\"\n * is what prevents divergent-history duplicate-content merges.\n */\n\nimport * as decoding from \"lib0/decoding\";\nimport * as encoding from \"lib0/encoding\";\n\nexport const FRAME_DOC_SYNC = 0;\nexport const FRAME_AWARENESS = 1;\nexport const FRAME_DOC_CLOSE = 2;\nexport const FRAME_CONTROL = 3;\n\nexport type CollabPermission = \"admin\" | \"write\" | \"read\";\n\n/** JSON payloads of CONTROL frames. */\nexport type ControlMessage =\n /** Server → client on accept: the socket's identity and effective permission. */\n | {\n type: \"hello\";\n login: string;\n name?: string;\n avatarUrl?: string;\n color: string;\n permission: CollabPermission;\n }\n /** Client → server: subscribe to a document (the client's Y.Doc must start EMPTY). */\n | { type: \"open\"; path: string }\n /** Server → client: the room is ready at this epoch; sync follows. */\n | { type: \"opened\"; path: string; epoch: number }\n /** Server → client: the doc's history was replaced; destroy the local Y.Doc and re-open. */\n | { type: \"doc-reset\"; path: string; epoch: number }\n /** Client → server: persist this doc to durable storage now (Cmd+S). */\n | { type: \"flush\"; path: string }\n /** Server → client: the flush landed. */\n | { type: \"flush-ack\"; path: string }\n /**\n * Server → client: the room's unsaved-since-last-persist state changed (drives the Save\n * affordance). Room-level and authoritative: any peer's edit dirties the room for everyone; a\n * persist clears it for everyone. Sent to a newly-subscribing connection during the open\n * handshake so it learns the current state.\n */\n | { type: \"doc-dirty\"; path: string; dirty: boolean }\n /**\n * Server → client: a request was refused (codes: read-only, content-not-loaded, too-large,\n * rate-limited, binary-file, unknown-frame).\n */\n | { type: \"error\"; path?: string; code: string; message: string };\n\nexport type CollabFrame =\n | { type: \"doc-sync\"; path: string; epoch: number; body: Uint8Array }\n | { type: \"awareness\"; body: Uint8Array }\n | { type: \"doc-close\"; path: string }\n | { type: \"control\"; message: ControlMessage };\n\nexport class EnvelopeError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"EnvelopeError\";\n }\n}\n\nexport function encodeFrame(frame: CollabFrame): Uint8Array {\n const encoder = encoding.createEncoder();\n switch (frame.type) {\n case \"doc-sync\": {\n encoding.writeVarUint(encoder, FRAME_DOC_SYNC);\n encoding.writeVarString(encoder, frame.path);\n encoding.writeVarUint(encoder, frame.epoch);\n encoding.writeVarUint8Array(encoder, frame.body);\n break;\n }\n case \"awareness\": {\n encoding.writeVarUint(encoder, FRAME_AWARENESS);\n encoding.writeVarUint8Array(encoder, frame.body);\n break;\n }\n case \"doc-close\": {\n encoding.writeVarUint(encoder, FRAME_DOC_CLOSE);\n encoding.writeVarString(encoder, frame.path);\n break;\n }\n case \"control\": {\n encoding.writeVarUint(encoder, FRAME_CONTROL);\n encoding.writeVarString(encoder, JSON.stringify(frame.message));\n break;\n }\n default: {\n throw new EnvelopeError(`unknown-frame:${(frame as CollabFrame).type}`);\n }\n }\n return encoding.toUint8Array(encoder);\n}\n\nexport function decodeFrame(data: Uint8Array): CollabFrame {\n try {\n const decoder = decoding.createDecoder(data);\n const frameType = decoding.readVarUint(decoder);\n switch (frameType) {\n case FRAME_DOC_SYNC: {\n const path = decoding.readVarString(decoder);\n const epoch = decoding.readVarUint(decoder);\n const body = decoding.readVarUint8Array(decoder);\n return { body, epoch, path, type: \"doc-sync\" };\n }\n case FRAME_AWARENESS: {\n return { body: decoding.readVarUint8Array(decoder), type: \"awareness\" };\n }\n case FRAME_DOC_CLOSE: {\n return { path: decoding.readVarString(decoder), type: \"doc-close\" };\n }\n case FRAME_CONTROL: {\n const message = JSON.parse(decoding.readVarString(decoder)) as ControlMessage;\n if (typeof message !== \"object\" || typeof message.type !== \"string\") {\n throw new EnvelopeError(\"malformed-control\");\n }\n return { message, type: \"control\" };\n }\n default: {\n throw new EnvelopeError(`unknown-frame-type:${frameType}`);\n }\n }\n } catch (error) {\n if (error instanceof EnvelopeError) {\n throw error;\n }\n throw new EnvelopeError(\n `malformed-frame: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n"
|
|
6
|
-
],
|
|
7
|
-
"mappings": ";;;;;;;;;;;;;AAqBO,IAAM,iBAAiB;AACvB,IAAM,kBAAkB;AACxB,IAAM,kBAAkB;AACxB,IAAM,gBAAgB;AAAA;AA4CtB,MAAM,sBAAsB,MAAM;AAAA,EACvC,WAAW,CAAC,SAAiB;AAAA,IAC3B,MAAM,OAAO;AAAA,IACb,KAAK,OAAO;AAAA;AAEhB;AAEO,SAAS,WAAW,CAAC,OAAgC;AAAA,EAC1D,MAAM,UAAmB,cAAc;AAAA,EACvC,QAAQ,MAAM;AAAA,SACP,YAAY;AAAA,MACN,aAAa,SAAS,cAAc;AAAA,MACpC,eAAe,SAAS,MAAM,IAAI;AAAA,MAClC,aAAa,SAAS,MAAM,KAAK;AAAA,MACjC,mBAAmB,SAAS,MAAM,IAAI;AAAA,MAC/C;AAAA,IACF;AAAA,SACK,aAAa;AAAA,MACP,aAAa,SAAS,eAAe;AAAA,MACrC,mBAAmB,SAAS,MAAM,IAAI;AAAA,MAC/C;AAAA,IACF;AAAA,SACK,aAAa;AAAA,MACP,aAAa,SAAS,eAAe;AAAA,MACrC,eAAe,SAAS,MAAM,IAAI;AAAA,MAC3C;AAAA,IACF;AAAA,SACK,WAAW;AAAA,MACL,aAAa,SAAS,aAAa;AAAA,MACnC,eAAe,SAAS,KAAK,UAAU,MAAM,OAAO,CAAC;AAAA,MAC9D;AAAA,IACF;AAAA,aACS;AAAA,MACP,MAAM,IAAI,cAAc,iBAAkB,MAAsB,MAAM;AAAA,IACxE;AAAA;AAAA,EAEF,OAAgB,aAAa,OAAO;AAAA;AAG/B,SAAS,WAAW,CAAC,MAA+B;AAAA,EACzD,IAAI;AAAA,IACF,MAAM,UAAmB,cAAc,IAAI;AAAA,IAC3C,MAAM,YAAqB,YAAY,OAAO;AAAA,IAC9C,QAAQ;AAAA,WACD,gBAAgB;AAAA,QACnB,MAAM,OAAgB,cAAc,OAAO;AAAA,QAC3C,MAAM,QAAiB,YAAY,OAAO;AAAA,QAC1C,MAAM,OAAgB,kBAAkB,OAAO;AAAA,QAC/C,OAAO,EAAE,MAAM,OAAO,MAAM,MAAM,WAAW;AAAA,MAC/C;AAAA,WACK,iBAAiB;AAAA,QACpB,OAAO,EAAE,MAAe,kBAAkB,OAAO,GAAG,MAAM,YAAY;AAAA,MACxE;AAAA,WACK,iBAAiB;AAAA,QACpB,OAAO,EAAE,MAAe,cAAc,OAAO,GAAG,MAAM,YAAY;AAAA,MACpE;AAAA,WACK,eAAe;AAAA,QAClB,MAAM,UAAU,KAAK,MAAe,cAAc,OAAO,CAAC;AAAA,QAC1D,IAAI,OAAO,YAAY,YAAY,OAAO,QAAQ,SAAS,UAAU;AAAA,UACnE,MAAM,IAAI,cAAc,mBAAmB;AAAA,QAC7C;AAAA,QACA,OAAO,EAAE,SAAS,MAAM,UAAU;AAAA,MACpC;AAAA,eACS;AAAA,QACP,MAAM,IAAI,cAAc,sBAAsB,WAAW;AAAA,MAC3D;AAAA;AAAA,IAEF,OAAO,OAAO;AAAA,IACd,IAAI,iBAAiB,eAAe;AAAA,MAClC,MAAM;AAAA,IACR;AAAA,IACA,MAAM,IAAI,cACR,oBAAoB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,GAC3E;AAAA;AAAA;",
|
|
8
|
-
"debugId": "DAAAC2821D4C97A164756E2164756E21",
|
|
9
|
-
"names": []
|
|
10
|
-
}
|