@velastack/cms 0.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/LICENSE +21 -0
- package/README.md +644 -0
- package/dist/cms.d.ts +6 -0
- package/dist/cms.js +30 -0
- package/dist/components/admin-bar/admin-bar-internal.svelte +1697 -0
- package/dist/components/admin-bar/admin-bar-internal.svelte.d.ts +12 -0
- package/dist/components/admin-bar/admin-bar.css +5 -0
- package/dist/components/admin-bar/admin-bar.svelte +355 -0
- package/dist/components/admin-bar/admin-bar.svelte.d.ts +7 -0
- package/dist/components/admin-bar/click-outside.d.ts +8 -0
- package/dist/components/admin-bar/click-outside.js +17 -0
- package/dist/components/admin-bar/css-root.svelte +23 -0
- package/dist/components/admin-bar/css-root.svelte.d.ts +19 -0
- package/dist/components/admin-bar/delete-page-dialog.svelte +326 -0
- package/dist/components/admin-bar/delete-page-dialog.svelte.d.ts +32 -0
- package/dist/components/admin-bar/history-panel.svelte +264 -0
- package/dist/components/admin-bar/history-panel.svelte.d.ts +8 -0
- package/dist/components/admin-bar/icons/bold.svelte +13 -0
- package/dist/components/admin-bar/icons/bold.svelte.d.ts +3 -0
- package/dist/components/admin-bar/icons/check.svelte +11 -0
- package/dist/components/admin-bar/icons/check.svelte.d.ts +3 -0
- package/dist/components/admin-bar/icons/chevron-down.svelte +11 -0
- package/dist/components/admin-bar/icons/chevron-down.svelte.d.ts +3 -0
- package/dist/components/admin-bar/icons/chevron-right.svelte +11 -0
- package/dist/components/admin-bar/icons/chevron-right.svelte.d.ts +3 -0
- package/dist/components/admin-bar/icons/chevron-up.svelte +11 -0
- package/dist/components/admin-bar/icons/chevron-up.svelte.d.ts +3 -0
- package/dist/components/admin-bar/icons/code.svelte +14 -0
- package/dist/components/admin-bar/icons/code.svelte.d.ts +3 -0
- package/dist/components/admin-bar/icons/external-link.svelte +15 -0
- package/dist/components/admin-bar/icons/external-link.svelte.d.ts +3 -0
- package/dist/components/admin-bar/icons/file.svelte +19 -0
- package/dist/components/admin-bar/icons/file.svelte.d.ts +3 -0
- package/dist/components/admin-bar/icons/heading-2.svelte +16 -0
- package/dist/components/admin-bar/icons/heading-2.svelte.d.ts +3 -0
- package/dist/components/admin-bar/icons/heading-3.svelte +17 -0
- package/dist/components/admin-bar/icons/heading-3.svelte.d.ts +3 -0
- package/dist/components/admin-bar/icons/icon.svelte +41 -0
- package/dist/components/admin-bar/icons/icon.svelte.d.ts +21 -0
- package/dist/components/admin-bar/icons/images.svelte +16 -0
- package/dist/components/admin-bar/icons/images.svelte.d.ts +3 -0
- package/dist/components/admin-bar/icons/italic.svelte +15 -0
- package/dist/components/admin-bar/icons/italic.svelte.d.ts +3 -0
- package/dist/components/admin-bar/icons/link-2-off.svelte +16 -0
- package/dist/components/admin-bar/icons/link-2-off.svelte.d.ts +3 -0
- package/dist/components/admin-bar/icons/link.svelte +14 -0
- package/dist/components/admin-bar/icons/link.svelte.d.ts +3 -0
- package/dist/components/admin-bar/icons/list-ordered.svelte +18 -0
- package/dist/components/admin-bar/icons/list-ordered.svelte.d.ts +3 -0
- package/dist/components/admin-bar/icons/list.svelte +18 -0
- package/dist/components/admin-bar/icons/list.svelte.d.ts +3 -0
- package/dist/components/admin-bar/icons/loader-circle.svelte +11 -0
- package/dist/components/admin-bar/icons/loader-circle.svelte.d.ts +3 -0
- package/dist/components/admin-bar/icons/minus.svelte +11 -0
- package/dist/components/admin-bar/icons/minus.svelte.d.ts +3 -0
- package/dist/components/admin-bar/icons/quote.svelte +24 -0
- package/dist/components/admin-bar/icons/quote.svelte.d.ts +3 -0
- package/dist/components/admin-bar/icons/search.svelte +14 -0
- package/dist/components/admin-bar/icons/search.svelte.d.ts +3 -0
- package/dist/components/admin-bar/icons/trash-2.svelte +17 -0
- package/dist/components/admin-bar/icons/trash-2.svelte.d.ts +3 -0
- package/dist/components/admin-bar/icons/triangle-alert.svelte +15 -0
- package/dist/components/admin-bar/icons/triangle-alert.svelte.d.ts +3 -0
- package/dist/components/admin-bar/icons/types.d.ts +7 -0
- package/dist/components/admin-bar/icons/types.js +1 -0
- package/dist/components/admin-bar/icons/undo-2.svelte +14 -0
- package/dist/components/admin-bar/icons/undo-2.svelte.d.ts +3 -0
- package/dist/components/admin-bar/icons/upload.svelte +15 -0
- package/dist/components/admin-bar/icons/upload.svelte.d.ts +3 -0
- package/dist/components/admin-bar/icons/x.svelte +14 -0
- package/dist/components/admin-bar/icons/x.svelte.d.ts +3 -0
- package/dist/components/admin-bar/keyboard-shortcuts-dialog.svelte +96 -0
- package/dist/components/admin-bar/keyboard-shortcuts-dialog.svelte.d.ts +7 -0
- package/dist/components/admin-bar/locales-panel.svelte +137 -0
- package/dist/components/admin-bar/locales-panel.svelte.d.ts +9 -0
- package/dist/components/admin-bar/media-panel.svelte +282 -0
- package/dist/components/admin-bar/media-panel.svelte.d.ts +7 -0
- package/dist/components/admin-bar/new-page-chooser-dialog.svelte +56 -0
- package/dist/components/admin-bar/new-page-chooser-dialog.svelte.d.ts +10 -0
- package/dist/components/admin-bar/new-page-dialog.svelte +126 -0
- package/dist/components/admin-bar/new-page-dialog.svelte.d.ts +14 -0
- package/dist/components/admin-bar/page-config.d.ts +61 -0
- package/dist/components/admin-bar/page-config.js +24 -0
- package/dist/components/admin-bar/pages-panel.svelte +639 -0
- package/dist/components/admin-bar/pages-panel.svelte.d.ts +13 -0
- package/dist/components/admin-bar/panel-footer.svelte +21 -0
- package/dist/components/admin-bar/panel-footer.svelte.d.ts +8 -0
- package/dist/components/admin-bar/panel-header.svelte +29 -0
- package/dist/components/admin-bar/panel-header.svelte.d.ts +10 -0
- package/dist/components/admin-bar/panel.svelte +41 -0
- package/dist/components/admin-bar/panel.svelte.d.ts +10 -0
- package/dist/components/admin-bar/publish-dialog.svelte +387 -0
- package/dist/components/admin-bar/publish-dialog.svelte.d.ts +16 -0
- package/dist/components/admin-bar/resolve-route.d.ts +20 -0
- package/dist/components/admin-bar/resolve-route.js +50 -0
- package/dist/components/admin-bar/seo-panel.svelte +387 -0
- package/dist/components/admin-bar/seo-panel.svelte.d.ts +7 -0
- package/dist/components/admin-bar/share-preview-link-dialog.svelte +97 -0
- package/dist/components/admin-bar/share-preview-link-dialog.svelte.d.ts +9 -0
- package/dist/components/admin-bar/site-settings-panel.svelte +225 -0
- package/dist/components/admin-bar/site-settings-panel.svelte.d.ts +7 -0
- package/dist/components/admin-bar/status-pill.svelte +49 -0
- package/dist/components/admin-bar/status-pill.svelte.d.ts +11 -0
- package/dist/components/admin-bar/theme.svelte.d.ts +16 -0
- package/dist/components/admin-bar/theme.svelte.js +39 -0
- package/dist/components/admin-bar/ui/badge/badge.svelte +57 -0
- package/dist/components/admin-bar/ui/badge/badge.svelte.d.ts +16 -0
- package/dist/components/admin-bar/ui/badge/index.d.ts +4 -0
- package/dist/components/admin-bar/ui/badge/index.js +4 -0
- package/dist/components/admin-bar/ui/button/button.svelte +73 -0
- package/dist/components/admin-bar/ui/button/button.svelte.d.ts +16 -0
- package/dist/components/admin-bar/ui/button/index.d.ts +4 -0
- package/dist/components/admin-bar/ui/button/index.js +4 -0
- package/dist/components/admin-bar/ui/collapsible/collapsible-content.svelte +7 -0
- package/dist/components/admin-bar/ui/collapsible/collapsible-content.svelte.d.ts +4 -0
- package/dist/components/admin-bar/ui/collapsible/collapsible-trigger.svelte +7 -0
- package/dist/components/admin-bar/ui/collapsible/collapsible-trigger.svelte.d.ts +4 -0
- package/dist/components/admin-bar/ui/collapsible/collapsible.svelte +7 -0
- package/dist/components/admin-bar/ui/collapsible/collapsible.svelte.d.ts +4 -0
- package/dist/components/admin-bar/ui/collapsible/index.d.ts +4 -0
- package/dist/components/admin-bar/ui/collapsible/index.js +6 -0
- package/dist/components/admin-bar/ui/dialog/dialog-close.svelte +7 -0
- package/dist/components/admin-bar/ui/dialog/dialog-close.svelte.d.ts +4 -0
- package/dist/components/admin-bar/ui/dialog/dialog-content.svelte +46 -0
- package/dist/components/admin-bar/ui/dialog/dialog-content.svelte.d.ts +11 -0
- package/dist/components/admin-bar/ui/dialog/dialog-description.svelte +17 -0
- package/dist/components/admin-bar/ui/dialog/dialog-description.svelte.d.ts +4 -0
- package/dist/components/admin-bar/ui/dialog/dialog-footer.svelte +23 -0
- package/dist/components/admin-bar/ui/dialog/dialog-footer.svelte.d.ts +5 -0
- package/dist/components/admin-bar/ui/dialog/dialog-header.svelte +20 -0
- package/dist/components/admin-bar/ui/dialog/dialog-header.svelte.d.ts +5 -0
- package/dist/components/admin-bar/ui/dialog/dialog-overlay.svelte +20 -0
- package/dist/components/admin-bar/ui/dialog/dialog-overlay.svelte.d.ts +4 -0
- package/dist/components/admin-bar/ui/dialog/dialog-portal.svelte +7 -0
- package/dist/components/admin-bar/ui/dialog/dialog-portal.svelte.d.ts +3 -0
- package/dist/components/admin-bar/ui/dialog/dialog-title.svelte +17 -0
- package/dist/components/admin-bar/ui/dialog/dialog-title.svelte.d.ts +4 -0
- package/dist/components/admin-bar/ui/dialog/dialog-trigger.svelte +7 -0
- package/dist/components/admin-bar/ui/dialog/dialog-trigger.svelte.d.ts +4 -0
- package/dist/components/admin-bar/ui/dialog/dialog.svelte +7 -0
- package/dist/components/admin-bar/ui/dialog/dialog.svelte.d.ts +3 -0
- package/dist/components/admin-bar/ui/dialog/index.d.ts +11 -0
- package/dist/components/admin-bar/ui/dialog/index.js +13 -0
- package/dist/components/admin-bar/ui/input/index.d.ts +3 -0
- package/dist/components/admin-bar/ui/input/index.js +3 -0
- package/dist/components/admin-bar/ui/input/input.svelte +24 -0
- package/dist/components/admin-bar/ui/input/input.svelte.d.ts +5 -0
- package/dist/components/admin-bar/ui/kbd/index.d.ts +4 -0
- package/dist/components/admin-bar/ui/kbd/index.js +6 -0
- package/dist/components/admin-bar/ui/kbd/kbd-group.svelte +20 -0
- package/dist/components/admin-bar/ui/kbd/kbd-group.svelte.d.ts +5 -0
- package/dist/components/admin-bar/ui/kbd/kbd-shortcut.svelte +52 -0
- package/dist/components/admin-bar/ui/kbd/kbd-shortcut.svelte.d.ts +8 -0
- package/dist/components/admin-bar/ui/kbd/kbd.svelte +27 -0
- package/dist/components/admin-bar/ui/kbd/kbd.svelte.d.ts +5 -0
- package/dist/components/admin-bar/ui/label/index.d.ts +3 -0
- package/dist/components/admin-bar/ui/label/index.js +3 -0
- package/dist/components/admin-bar/ui/label/label.svelte +20 -0
- package/dist/components/admin-bar/ui/label/label.svelte.d.ts +4 -0
- package/dist/components/admin-bar/ui/menubar/index.d.ts +18 -0
- package/dist/components/admin-bar/ui/menubar/index.js +20 -0
- package/dist/components/admin-bar/ui/menubar/menubar-checkbox-item.svelte +46 -0
- package/dist/components/admin-bar/ui/menubar/menubar-checkbox-item.svelte.d.ts +10 -0
- package/dist/components/admin-bar/ui/menubar/menubar-content.svelte +28 -0
- package/dist/components/admin-bar/ui/menubar/menubar-content.svelte.d.ts +4 -0
- package/dist/components/admin-bar/ui/menubar/menubar-group-heading.svelte +25 -0
- package/dist/components/admin-bar/ui/menubar/menubar-group-heading.svelte.d.ts +8 -0
- package/dist/components/admin-bar/ui/menubar/menubar-group.svelte +12 -0
- package/dist/components/admin-bar/ui/menubar/menubar-group.svelte.d.ts +7 -0
- package/dist/components/admin-bar/ui/menubar/menubar-item.svelte +27 -0
- package/dist/components/admin-bar/ui/menubar/menubar-item.svelte.d.ts +8 -0
- package/dist/components/admin-bar/ui/menubar/menubar-label.svelte +25 -0
- package/dist/components/admin-bar/ui/menubar/menubar-label.svelte.d.ts +8 -0
- package/dist/components/admin-bar/ui/menubar/menubar-menu.svelte +7 -0
- package/dist/components/admin-bar/ui/menubar/menubar-menu.svelte.d.ts +3 -0
- package/dist/components/admin-bar/ui/menubar/menubar-portal.svelte +7 -0
- package/dist/components/admin-bar/ui/menubar/menubar-portal.svelte.d.ts +3 -0
- package/dist/components/admin-bar/ui/menubar/menubar-radio-group.svelte +11 -0
- package/dist/components/admin-bar/ui/menubar/menubar-radio-group.svelte.d.ts +4 -0
- package/dist/components/admin-bar/ui/menubar/menubar-radio-item.svelte +37 -0
- package/dist/components/admin-bar/ui/menubar/menubar-radio-item.svelte.d.ts +8 -0
- package/dist/components/admin-bar/ui/menubar/menubar-separator.svelte +17 -0
- package/dist/components/admin-bar/ui/menubar/menubar-separator.svelte.d.ts +4 -0
- package/dist/components/admin-bar/ui/menubar/menubar-shortcut.svelte +23 -0
- package/dist/components/admin-bar/ui/menubar/menubar-shortcut.svelte.d.ts +5 -0
- package/dist/components/admin-bar/ui/menubar/menubar-sub-content.svelte +20 -0
- package/dist/components/admin-bar/ui/menubar/menubar-sub-content.svelte.d.ts +4 -0
- package/dist/components/admin-bar/ui/menubar/menubar-sub-trigger.svelte +29 -0
- package/dist/components/admin-bar/ui/menubar/menubar-sub-trigger.svelte.d.ts +8 -0
- package/dist/components/admin-bar/ui/menubar/menubar-sub.svelte +7 -0
- package/dist/components/admin-bar/ui/menubar/menubar-sub.svelte.d.ts +4 -0
- package/dist/components/admin-bar/ui/menubar/menubar-trigger.svelte +20 -0
- package/dist/components/admin-bar/ui/menubar/menubar-trigger.svelte.d.ts +4 -0
- package/dist/components/admin-bar/ui/menubar/menubar.svelte +20 -0
- package/dist/components/admin-bar/ui/menubar/menubar.svelte.d.ts +4 -0
- package/dist/components/admin-bar/ui/select/index.d.ts +12 -0
- package/dist/components/admin-bar/ui/select/index.js +14 -0
- package/dist/components/admin-bar/ui/select/select-content.svelte +45 -0
- package/dist/components/admin-bar/ui/select/select-content.svelte.d.ts +11 -0
- package/dist/components/admin-bar/ui/select/select-group-heading.svelte +21 -0
- package/dist/components/admin-bar/ui/select/select-group-heading.svelte.d.ts +10 -0
- package/dist/components/admin-bar/ui/select/select-group.svelte +17 -0
- package/dist/components/admin-bar/ui/select/select-group.svelte.d.ts +4 -0
- package/dist/components/admin-bar/ui/select/select-item.svelte +40 -0
- package/dist/components/admin-bar/ui/select/select-item.svelte.d.ts +5 -0
- package/dist/components/admin-bar/ui/select/select-label.svelte +20 -0
- package/dist/components/admin-bar/ui/select/select-label.svelte.d.ts +6 -0
- package/dist/components/admin-bar/ui/select/select-portal.svelte +7 -0
- package/dist/components/admin-bar/ui/select/select-portal.svelte.d.ts +3 -0
- package/dist/components/admin-bar/ui/select/select-scroll-down-button.svelte +23 -0
- package/dist/components/admin-bar/ui/select/select-scroll-down-button.svelte.d.ts +5 -0
- package/dist/components/admin-bar/ui/select/select-scroll-up-button.svelte +23 -0
- package/dist/components/admin-bar/ui/select/select-scroll-up-button.svelte.d.ts +5 -0
- package/dist/components/admin-bar/ui/select/select-separator.svelte +21 -0
- package/dist/components/admin-bar/ui/select/select-separator.svelte.d.ts +4 -0
- package/dist/components/admin-bar/ui/select/select-trigger.svelte +31 -0
- package/dist/components/admin-bar/ui/select/select-trigger.svelte.d.ts +8 -0
- package/dist/components/admin-bar/ui/select/select.svelte +11 -0
- package/dist/components/admin-bar/ui/select/select.svelte.d.ts +3 -0
- package/dist/components/admin-bar/ui/separator/index.d.ts +2 -0
- package/dist/components/admin-bar/ui/separator/index.js +4 -0
- package/dist/components/admin-bar/ui/separator/separator.svelte +21 -0
- package/dist/components/admin-bar/ui/separator/separator.svelte.d.ts +4 -0
- package/dist/components/admin-bar/ui/textarea/index.d.ts +3 -0
- package/dist/components/admin-bar/ui/textarea/index.js +3 -0
- package/dist/components/admin-bar/ui/textarea/textarea.svelte +21 -0
- package/dist/components/admin-bar/ui/textarea/textarea.svelte.d.ts +5 -0
- package/dist/components/admin-bar/user-avatar.svelte +29 -0
- package/dist/components/admin-bar/user-avatar.svelte.d.ts +7 -0
- package/dist/components/admin-bar/utils.d.ts +10 -0
- package/dist/components/admin-bar/utils.js +46 -0
- package/dist/components/admin-bar/variants.d.ts +20 -0
- package/dist/components/admin-bar/variants.js +14 -0
- package/dist/components/cms/cms-boolean.svelte +102 -0
- package/dist/components/cms/cms-boolean.svelte.d.ts +10 -0
- package/dist/components/cms/cms-date-time-editable.svelte +66 -0
- package/dist/components/cms/cms-date-time-editable.svelte.d.ts +11 -0
- package/dist/components/cms/cms-date-time.svelte +67 -0
- package/dist/components/cms/cms-date-time.svelte.d.ts +19 -0
- package/dist/components/cms/cms-entries.svelte +24 -0
- package/dist/components/cms/cms-entries.svelte.d.ts +31 -0
- package/dist/components/cms/cms-image-editable.svelte +439 -0
- package/dist/components/cms/cms-image-editable.svelte.d.ts +11 -0
- package/dist/components/cms/cms-image.svelte +78 -0
- package/dist/components/cms/cms-image.svelte.d.ts +18 -0
- package/dist/components/cms/cms-link-editable.svelte +429 -0
- package/dist/components/cms/cms-link-editable.svelte.d.ts +13 -0
- package/dist/components/cms/cms-link.svelte +92 -0
- package/dist/components/cms/cms-link.svelte.d.ts +25 -0
- package/dist/components/cms/cms-markdown-editable.svelte +74 -0
- package/dist/components/cms/cms-markdown-editable.svelte.d.ts +9 -0
- package/dist/components/cms/cms-markdown.svelte +56 -0
- package/dist/components/cms/cms-markdown.svelte.d.ts +10 -0
- package/dist/components/cms/cms-media-picker.svelte +150 -0
- package/dist/components/cms/cms-media-picker.svelte.d.ts +8 -0
- package/dist/components/cms/cms-number-editable.svelte +77 -0
- package/dist/components/cms/cms-number-editable.svelte.d.ts +13 -0
- package/dist/components/cms/cms-number.svelte +63 -0
- package/dist/components/cms/cms-number.svelte.d.ts +16 -0
- package/dist/components/cms/cms-repeater-editable.svelte +137 -0
- package/dist/components/cms/cms-repeater-editable.svelte.d.ts +31 -0
- package/dist/components/cms/cms-repeater.svelte +55 -0
- package/dist/components/cms/cms-repeater.svelte.d.ts +30 -0
- package/dist/components/cms/cms-rich-text-editable.svelte +101 -0
- package/dist/components/cms/cms-rich-text-editable.svelte.d.ts +9 -0
- package/dist/components/cms/cms-rich-text-toolbar.svelte +246 -0
- package/dist/components/cms/cms-rich-text-toolbar.svelte.d.ts +9 -0
- package/dist/components/cms/cms-rich-text.svelte +74 -0
- package/dist/components/cms/cms-rich-text.svelte.d.ts +10 -0
- package/dist/components/cms/cms-store.svelte.d.ts +294 -0
- package/dist/components/cms/cms-store.svelte.js +625 -0
- package/dist/components/cms/cms-text.svelte +131 -0
- package/dist/components/cms/cms-text.svelte.d.ts +11 -0
- package/dist/components/cms/index.d.ts +13 -0
- package/dist/components/cms/index.js +11 -0
- package/dist/components/cms/install-scope.svelte.d.ts +7 -0
- package/dist/components/cms/install-scope.svelte.js +33 -0
- package/dist/components/cms/locale-merge.d.ts +41 -0
- package/dist/components/cms/locale-merge.js +77 -0
- package/dist/components/cms/overlay-sync.d.ts +82 -0
- package/dist/components/cms/overlay-sync.js +76 -0
- package/dist/components/cms/path.d.ts +30 -0
- package/dist/components/cms/path.js +156 -0
- package/dist/components/cms/scope.d.ts +120 -0
- package/dist/components/cms/scope.js +23 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.js +28 -0
- package/dist/srv/README.md +341 -0
- package/dist/srv/api-adapter.d.ts +20 -0
- package/dist/srv/api-adapter.js +178 -0
- package/dist/srv/cms.d.ts +62 -0
- package/dist/srv/cms.js +35 -0
- package/dist/srv/index.d.ts +5 -0
- package/dist/srv/index.js +4 -0
- package/dist/srv/load-cms.d.ts +105 -0
- package/dist/srv/load-cms.js +227 -0
- package/dist/srv/mock-adapter.d.ts +96 -0
- package/dist/srv/mock-adapter.js +171 -0
- package/dist/srv/types.d.ts +114 -0
- package/dist/srv/types.js +1 -0
- package/package.json +116 -0
- package/plugin/README.md +137 -0
- package/plugin/dist/adapter.d.ts +35 -0
- package/plugin/dist/adapter.js +346 -0
- package/plugin/dist/adapter.js.map +1 -0
- package/plugin/dist/build-state.d.ts +10 -0
- package/plugin/dist/build-state.js +26 -0
- package/plugin/dist/build-state.js.map +1 -0
- package/plugin/dist/fallback-shim.js +194 -0
- package/plugin/dist/index.d.ts +56 -0
- package/plugin/dist/index.js +396 -0
- package/plugin/dist/index.js.map +1 -0
- package/plugin/dist/manifest.d.ts +76 -0
- package/plugin/dist/manifest.js +367 -0
- package/plugin/dist/manifest.js.map +1 -0
- package/plugin/dist/media.d.ts +36 -0
- package/plugin/dist/media.js +153 -0
- package/plugin/dist/media.js.map +1 -0
- package/plugin/dist/parse-svelte.d.ts +35 -0
- package/plugin/dist/parse-svelte.js +120 -0
- package/plugin/dist/parse-svelte.js.map +1 -0
- package/plugin/dist/route-tree.d.ts +27 -0
- package/plugin/dist/route-tree.js +69 -0
- package/plugin/dist/route-tree.js.map +1 -0
- package/plugin/dist/transforms.d.ts +42 -0
- package/plugin/dist/transforms.js +95 -0
- package/plugin/dist/transforms.js.map +1 -0
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { Button } from './ui/button/index.js';
|
|
3
|
+
import * as Dialog from './ui/dialog/index.js';
|
|
4
|
+
import { Input } from './ui/input/index.js';
|
|
5
|
+
import { Label } from './ui/label/index.js';
|
|
6
|
+
import * as Select from './ui/select/index.js';
|
|
7
|
+
|
|
8
|
+
export type DeletePageMode = 'delete' | 'gone' | 'redirect';
|
|
9
|
+
|
|
10
|
+
export type RedirectTarget = {
|
|
11
|
+
url: string;
|
|
12
|
+
routeId: string;
|
|
13
|
+
params: Record<string, string>;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
type Props = {
|
|
17
|
+
open: boolean;
|
|
18
|
+
onOpenChange: (open: boolean) => void;
|
|
19
|
+
/** The URL being deleted, shown in the heading and used for self-redirect detection. */
|
|
20
|
+
url: string;
|
|
21
|
+
/**
|
|
22
|
+
* `true` when the page exists only as a draft in the open release. Disables
|
|
23
|
+
* gone/redirect options — the page was never live so there's no equity to
|
|
24
|
+
* preserve and "discard draft" is the only meaningful action.
|
|
25
|
+
*/
|
|
26
|
+
isDraft: boolean;
|
|
27
|
+
/** Selectable redirect targets — pages-panel passes the filtered page list. */
|
|
28
|
+
targets: RedirectTarget[];
|
|
29
|
+
/**
|
|
30
|
+
* Map of source-url → terminal-redirect-url for chains in the working
|
|
31
|
+
* release plus any published tombstones. Used to auto-flatten if the user
|
|
32
|
+
* picks a target that's itself redirected.
|
|
33
|
+
*/
|
|
34
|
+
redirectsByUrl: Record<string, string>;
|
|
35
|
+
deleting: boolean;
|
|
36
|
+
error: string | null;
|
|
37
|
+
onConfirm: (mode: DeletePageMode, target?: string) => void;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
let {
|
|
41
|
+
open,
|
|
42
|
+
onOpenChange,
|
|
43
|
+
url,
|
|
44
|
+
isDraft,
|
|
45
|
+
targets,
|
|
46
|
+
redirectsByUrl,
|
|
47
|
+
deleting,
|
|
48
|
+
error,
|
|
49
|
+
onConfirm
|
|
50
|
+
}: Props = $props();
|
|
51
|
+
|
|
52
|
+
let mode = $state<DeletePageMode>('delete');
|
|
53
|
+
let pageTargetValue = $state('');
|
|
54
|
+
let externalUrl = $state('');
|
|
55
|
+
let useExternal = $state(false);
|
|
56
|
+
|
|
57
|
+
$effect.pre(() => {
|
|
58
|
+
if (!open) return;
|
|
59
|
+
mode = 'delete';
|
|
60
|
+
pageTargetValue = '';
|
|
61
|
+
externalUrl = '';
|
|
62
|
+
useExternal = false;
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
const optionValueFor = (t: RedirectTarget) => `${t.routeId}::${JSON.stringify(t.params)}`;
|
|
66
|
+
|
|
67
|
+
const selectableTargets = $derived(targets.filter((t) => t.url !== url));
|
|
68
|
+
|
|
69
|
+
const pickedRawTarget = $derived.by((): string => {
|
|
70
|
+
if (mode !== 'redirect') return '';
|
|
71
|
+
if (useExternal) return externalUrl.trim();
|
|
72
|
+
const opt = selectableTargets.find((t) => optionValueFor(t) === pageTargetValue);
|
|
73
|
+
return opt?.url ?? '';
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Walk the redirect chain from `target` until we hit a URL that isn't itself
|
|
78
|
+
* a redirect, or we revisit a URL (cycle). Returns the terminal URL plus the
|
|
79
|
+
* number of hops taken — when hops > 0 the dialog surfaces a notice that the
|
|
80
|
+
* stored target will be the flattened terminal.
|
|
81
|
+
*/
|
|
82
|
+
const resolved = $derived.by((): { terminal: string; hops: number; cycle: boolean } => {
|
|
83
|
+
const t = pickedRawTarget;
|
|
84
|
+
if (!t) return { terminal: '', hops: 0, cycle: false };
|
|
85
|
+
const seen = new Set<string>([url]);
|
|
86
|
+
let cur = t;
|
|
87
|
+
let hops = 0;
|
|
88
|
+
while (redirectsByUrl[cur]) {
|
|
89
|
+
if (seen.has(cur)) return { terminal: cur, hops, cycle: true };
|
|
90
|
+
seen.add(cur);
|
|
91
|
+
cur = redirectsByUrl[cur];
|
|
92
|
+
hops += 1;
|
|
93
|
+
if (hops > 50) return { terminal: cur, hops, cycle: true };
|
|
94
|
+
}
|
|
95
|
+
return {
|
|
96
|
+
terminal: cur,
|
|
97
|
+
hops,
|
|
98
|
+
cycle: cur === url
|
|
99
|
+
};
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
const isSelfRedirect = $derived(
|
|
103
|
+
mode === 'redirect' && pickedRawTarget !== '' && resolved.terminal === url
|
|
104
|
+
);
|
|
105
|
+
|
|
106
|
+
const canSubmit = $derived.by(() => {
|
|
107
|
+
if (deleting) return false;
|
|
108
|
+
if (mode === 'redirect') {
|
|
109
|
+
if (resolved.terminal === '') return false;
|
|
110
|
+
if (isSelfRedirect) return false;
|
|
111
|
+
}
|
|
112
|
+
return true;
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
const submit = () => {
|
|
116
|
+
if (!canSubmit) return;
|
|
117
|
+
if (mode === 'redirect') onConfirm('redirect', resolved.terminal);
|
|
118
|
+
else onConfirm(mode);
|
|
119
|
+
};
|
|
120
|
+
</script>
|
|
121
|
+
|
|
122
|
+
<Dialog.Root
|
|
123
|
+
{open}
|
|
124
|
+
onOpenChange={(next) => {
|
|
125
|
+
if (!next && deleting) return;
|
|
126
|
+
onOpenChange(next);
|
|
127
|
+
}}
|
|
128
|
+
>
|
|
129
|
+
<Dialog.Content showCloseButton={false} class="vela:max-w-[28rem]">
|
|
130
|
+
<form
|
|
131
|
+
class="vela:flex vela:flex-col vela:gap-0"
|
|
132
|
+
onsubmit={(e) => {
|
|
133
|
+
e.preventDefault();
|
|
134
|
+
submit();
|
|
135
|
+
}}
|
|
136
|
+
>
|
|
137
|
+
<Dialog.Header>
|
|
138
|
+
<Dialog.Title>{isDraft ? 'Discard draft page' : 'Delete page'}</Dialog.Title>
|
|
139
|
+
<Dialog.Description>
|
|
140
|
+
<span class="vela:font-mono">{url}</span>
|
|
141
|
+
</Dialog.Description>
|
|
142
|
+
</Dialog.Header>
|
|
143
|
+
|
|
144
|
+
<div class="vela:px-6 vela:pb-2 vela:flex vela:flex-col vela:gap-3">
|
|
145
|
+
{#if isDraft}
|
|
146
|
+
<p class="vela:text-[13px] vela:text-bar-text-secondary">
|
|
147
|
+
This page is unpublished. Discarding removes the draft entirely.
|
|
148
|
+
</p>
|
|
149
|
+
{:else}
|
|
150
|
+
<fieldset class="vela:flex vela:flex-col vela:gap-2 vela:m-0 vela:p-0 vela:border-0">
|
|
151
|
+
<legend class="vela:sr-only">Choose deletion mode</legend>
|
|
152
|
+
|
|
153
|
+
<label
|
|
154
|
+
class="vela:flex vela:items-start vela:gap-2 vela:cursor-pointer vela:p-2 vela:rounded-md vela:hover:bg-[var(--cms-bar-bg-hover)]"
|
|
155
|
+
>
|
|
156
|
+
<input
|
|
157
|
+
type="radio"
|
|
158
|
+
name="delete-mode"
|
|
159
|
+
value="delete"
|
|
160
|
+
checked={mode === 'delete'}
|
|
161
|
+
onchange={() => (mode = 'delete')}
|
|
162
|
+
disabled={deleting}
|
|
163
|
+
class="vela:mt-0.5"
|
|
164
|
+
/>
|
|
165
|
+
<span class="vela:flex vela:flex-col vela:gap-0.5">
|
|
166
|
+
<span class="vela:text-[13px] vela:text-bar-text">
|
|
167
|
+
Delete page (404 Not Found)
|
|
168
|
+
</span>
|
|
169
|
+
<span class="vela:text-[12px] vela:text-bar-text-secondary">
|
|
170
|
+
The URL becomes a regular not-found.
|
|
171
|
+
</span>
|
|
172
|
+
</span>
|
|
173
|
+
</label>
|
|
174
|
+
|
|
175
|
+
<label
|
|
176
|
+
class="vela:flex vela:items-start vela:gap-2 vela:cursor-pointer vela:p-2 vela:rounded-md vela:hover:bg-[var(--cms-bar-bg-hover)]"
|
|
177
|
+
>
|
|
178
|
+
<input
|
|
179
|
+
type="radio"
|
|
180
|
+
name="delete-mode"
|
|
181
|
+
value="gone"
|
|
182
|
+
checked={mode === 'gone'}
|
|
183
|
+
onchange={() => (mode = 'gone')}
|
|
184
|
+
disabled={deleting}
|
|
185
|
+
class="vela:mt-0.5"
|
|
186
|
+
/>
|
|
187
|
+
<span class="vela:flex vela:flex-col vela:gap-0.5">
|
|
188
|
+
<span class="vela:text-[13px] vela:text-bar-text">
|
|
189
|
+
Mark as permanently gone (410)
|
|
190
|
+
</span>
|
|
191
|
+
<span class="vela:text-[12px] vela:text-bar-text-secondary">
|
|
192
|
+
Tells crawlers the URL is intentionally removed.
|
|
193
|
+
</span>
|
|
194
|
+
</span>
|
|
195
|
+
</label>
|
|
196
|
+
|
|
197
|
+
<label
|
|
198
|
+
class="vela:flex vela:items-start vela:gap-2 vela:cursor-pointer vela:p-2 vela:rounded-md vela:hover:bg-[var(--cms-bar-bg-hover)]"
|
|
199
|
+
>
|
|
200
|
+
<input
|
|
201
|
+
type="radio"
|
|
202
|
+
name="delete-mode"
|
|
203
|
+
value="redirect"
|
|
204
|
+
checked={mode === 'redirect'}
|
|
205
|
+
onchange={() => (mode = 'redirect')}
|
|
206
|
+
disabled={deleting}
|
|
207
|
+
class="vela:mt-0.5"
|
|
208
|
+
/>
|
|
209
|
+
<span class="vela:flex vela:flex-col vela:gap-0.5">
|
|
210
|
+
<span class="vela:text-[13px] vela:text-bar-text">
|
|
211
|
+
Replace with redirect (308)
|
|
212
|
+
</span>
|
|
213
|
+
<span class="vela:text-[12px] vela:text-bar-text-secondary">
|
|
214
|
+
Send visitors to another URL. Preserves SEO equity.
|
|
215
|
+
</span>
|
|
216
|
+
</span>
|
|
217
|
+
</label>
|
|
218
|
+
</fieldset>
|
|
219
|
+
|
|
220
|
+
{#if mode === 'redirect'}
|
|
221
|
+
<div
|
|
222
|
+
class="vela:flex vela:flex-col vela:gap-2 vela:pl-7 vela:border-l vela:border-[var(--cms-bar-divider)] vela:ml-2"
|
|
223
|
+
>
|
|
224
|
+
<div class="vela:flex vela:items-center vela:gap-3">
|
|
225
|
+
<Label class="vela:text-[12px] vela:text-bar-text-secondary">Target:</Label>
|
|
226
|
+
<label class="vela:text-[12px] vela:flex vela:items-center vela:gap-1">
|
|
227
|
+
<input
|
|
228
|
+
type="radio"
|
|
229
|
+
name="target-source"
|
|
230
|
+
checked={!useExternal}
|
|
231
|
+
onchange={() => (useExternal = false)}
|
|
232
|
+
disabled={deleting}
|
|
233
|
+
/>
|
|
234
|
+
Page
|
|
235
|
+
</label>
|
|
236
|
+
<label class="vela:text-[12px] vela:flex vela:items-center vela:gap-1">
|
|
237
|
+
<input
|
|
238
|
+
type="radio"
|
|
239
|
+
name="target-source"
|
|
240
|
+
checked={useExternal}
|
|
241
|
+
onchange={() => (useExternal = true)}
|
|
242
|
+
disabled={deleting}
|
|
243
|
+
/>
|
|
244
|
+
External URL
|
|
245
|
+
</label>
|
|
246
|
+
</div>
|
|
247
|
+
|
|
248
|
+
{#if useExternal}
|
|
249
|
+
<Input
|
|
250
|
+
type="url"
|
|
251
|
+
placeholder="https://other-site.com/page"
|
|
252
|
+
bind:value={externalUrl}
|
|
253
|
+
disabled={deleting}
|
|
254
|
+
/>
|
|
255
|
+
{:else if selectableTargets.length === 0}
|
|
256
|
+
<p class="vela:text-[12px] vela:text-bar-text-tertiary">
|
|
257
|
+
No other pages available — switch to External URL.
|
|
258
|
+
</p>
|
|
259
|
+
{:else}
|
|
260
|
+
<Select.Root
|
|
261
|
+
type="single"
|
|
262
|
+
value={pageTargetValue}
|
|
263
|
+
onValueChange={(v) => (pageTargetValue = v)}
|
|
264
|
+
>
|
|
265
|
+
<Select.Trigger size="sm">
|
|
266
|
+
<span data-slot="select-value" class="vela:truncate">
|
|
267
|
+
{selectableTargets.find((t) => optionValueFor(t) === pageTargetValue)?.url ??
|
|
268
|
+
'— Select page —'}
|
|
269
|
+
</span>
|
|
270
|
+
</Select.Trigger>
|
|
271
|
+
<Select.Content sideOffset={6}>
|
|
272
|
+
{#each selectableTargets as t (optionValueFor(t))}
|
|
273
|
+
<Select.Item value={optionValueFor(t)} label={t.url}>
|
|
274
|
+
{t.url}
|
|
275
|
+
</Select.Item>
|
|
276
|
+
{/each}
|
|
277
|
+
</Select.Content>
|
|
278
|
+
</Select.Root>
|
|
279
|
+
{/if}
|
|
280
|
+
|
|
281
|
+
{#if isSelfRedirect}
|
|
282
|
+
<p class="vela:text-[12px] vela:text-[var(--cms-status-error-text)]" role="alert">
|
|
283
|
+
This would redirect to itself.
|
|
284
|
+
</p>
|
|
285
|
+
{:else if resolved.hops > 0 && resolved.terminal !== ''}
|
|
286
|
+
<p class="vela:text-[12px] vela:text-bar-text-secondary">
|
|
287
|
+
Will redirect directly to <span class="vela:font-mono">{resolved.terminal}</span>
|
|
288
|
+
(skipping {resolved.hops} chained redirect{resolved.hops === 1 ? '' : 's'}).
|
|
289
|
+
</p>
|
|
290
|
+
{/if}
|
|
291
|
+
</div>
|
|
292
|
+
{/if}
|
|
293
|
+
{/if}
|
|
294
|
+
</div>
|
|
295
|
+
|
|
296
|
+
{#if error}
|
|
297
|
+
<p
|
|
298
|
+
role="alert"
|
|
299
|
+
class="vela:mx-6 vela:mt-2 vela:px-3 vela:py-2 vela:rounded-md
|
|
300
|
+
vela:bg-[var(--cms-status-error-bg)] vela:text-[var(--cms-status-error-text)] vela:text-[12px]"
|
|
301
|
+
>
|
|
302
|
+
{error}
|
|
303
|
+
</p>
|
|
304
|
+
{/if}
|
|
305
|
+
|
|
306
|
+
<Dialog.Footer class="vela:justify-end vela:pt-4">
|
|
307
|
+
<Button variant="ghost" onclick={() => onOpenChange(false)} disabled={deleting}>
|
|
308
|
+
Cancel
|
|
309
|
+
</Button>
|
|
310
|
+
<Button type="submit" variant="outline-destructive" disabled={!canSubmit}>
|
|
311
|
+
{#if deleting}
|
|
312
|
+
Working…
|
|
313
|
+
{:else if isDraft}
|
|
314
|
+
Discard
|
|
315
|
+
{:else if mode === 'redirect'}
|
|
316
|
+
Stage redirect
|
|
317
|
+
{:else if mode === 'gone'}
|
|
318
|
+
Stage 410
|
|
319
|
+
{:else}
|
|
320
|
+
Stage delete
|
|
321
|
+
{/if}
|
|
322
|
+
</Button>
|
|
323
|
+
</Dialog.Footer>
|
|
324
|
+
</form>
|
|
325
|
+
</Dialog.Content>
|
|
326
|
+
</Dialog.Root>
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export type DeletePageMode = 'delete' | 'gone' | 'redirect';
|
|
2
|
+
export type RedirectTarget = {
|
|
3
|
+
url: string;
|
|
4
|
+
routeId: string;
|
|
5
|
+
params: Record<string, string>;
|
|
6
|
+
};
|
|
7
|
+
type Props = {
|
|
8
|
+
open: boolean;
|
|
9
|
+
onOpenChange: (open: boolean) => void;
|
|
10
|
+
/** The URL being deleted, shown in the heading and used for self-redirect detection. */
|
|
11
|
+
url: string;
|
|
12
|
+
/**
|
|
13
|
+
* `true` when the page exists only as a draft in the open release. Disables
|
|
14
|
+
* gone/redirect options — the page was never live so there's no equity to
|
|
15
|
+
* preserve and "discard draft" is the only meaningful action.
|
|
16
|
+
*/
|
|
17
|
+
isDraft: boolean;
|
|
18
|
+
/** Selectable redirect targets — pages-panel passes the filtered page list. */
|
|
19
|
+
targets: RedirectTarget[];
|
|
20
|
+
/**
|
|
21
|
+
* Map of source-url → terminal-redirect-url for chains in the working
|
|
22
|
+
* release plus any published tombstones. Used to auto-flatten if the user
|
|
23
|
+
* picks a target that's itself redirected.
|
|
24
|
+
*/
|
|
25
|
+
redirectsByUrl: Record<string, string>;
|
|
26
|
+
deleting: boolean;
|
|
27
|
+
error: string | null;
|
|
28
|
+
onConfirm: (mode: DeletePageMode, target?: string) => void;
|
|
29
|
+
};
|
|
30
|
+
declare const DeletePageDialog: import("svelte").Component<Props, {}, "">;
|
|
31
|
+
type DeletePageDialog = ReturnType<typeof DeletePageDialog>;
|
|
32
|
+
export default DeletePageDialog;
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { goto } from '$app/navigation';
|
|
3
|
+
import { page } from '$app/state';
|
|
4
|
+
import PanelFooter from './panel-footer.svelte';
|
|
5
|
+
import PanelHeader from './panel-header.svelte';
|
|
6
|
+
import Panel from './panel.svelte';
|
|
7
|
+
import { resolveRouteOnlyParams, resolveRouteUrl } from './resolve-route.js';
|
|
8
|
+
import { Badge } from './ui/badge/index.js';
|
|
9
|
+
import { Button } from './ui/button/index.js';
|
|
10
|
+
|
|
11
|
+
type ReleaseItem =
|
|
12
|
+
| {
|
|
13
|
+
kind: 'page';
|
|
14
|
+
routeId: string;
|
|
15
|
+
params: Record<string, string>;
|
|
16
|
+
fields: Record<string, unknown>;
|
|
17
|
+
}
|
|
18
|
+
| {
|
|
19
|
+
kind: 'page-delete';
|
|
20
|
+
routeId: string;
|
|
21
|
+
params: Record<string, string>;
|
|
22
|
+
outcome?: { kind: 'gone' } | { kind: 'redirect'; to: string };
|
|
23
|
+
}
|
|
24
|
+
| { kind: 'layout'; routeId: string; fields: Record<string, unknown> };
|
|
25
|
+
|
|
26
|
+
type PublishedRelease = {
|
|
27
|
+
id: string;
|
|
28
|
+
name?: string;
|
|
29
|
+
publishedBy: string;
|
|
30
|
+
publishedAt: string;
|
|
31
|
+
preview_key: string;
|
|
32
|
+
revertedAt?: string;
|
|
33
|
+
items: ReleaseItem[];
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
type Props = {
|
|
37
|
+
endpoint: string;
|
|
38
|
+
onClose: () => void;
|
|
39
|
+
onChanged: () => Promise<void> | void;
|
|
40
|
+
};
|
|
41
|
+
let { endpoint, onClose, onChanged }: Props = $props();
|
|
42
|
+
|
|
43
|
+
let history = $state<PublishedRelease[]>([]);
|
|
44
|
+
let loading = $state(false);
|
|
45
|
+
let reverting = $state<string | null>(null);
|
|
46
|
+
|
|
47
|
+
const load = async () => {
|
|
48
|
+
loading = true;
|
|
49
|
+
try {
|
|
50
|
+
const res = await fetch(`${endpoint}/release/history`, { credentials: 'include' });
|
|
51
|
+
if (!res.ok) return;
|
|
52
|
+
const data = (await res.json()) as { history: PublishedRelease[] };
|
|
53
|
+
history = data.history;
|
|
54
|
+
} finally {
|
|
55
|
+
loading = false;
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
$effect(() => {
|
|
60
|
+
void load();
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
const onRevert = async (release: PublishedRelease) => {
|
|
64
|
+
const label = release.name ?? release.id.slice(0, 8);
|
|
65
|
+
if (
|
|
66
|
+
!confirm(`Revert release "${label}"? This will create a new release that undoes its changes.`)
|
|
67
|
+
)
|
|
68
|
+
return;
|
|
69
|
+
reverting = release.id;
|
|
70
|
+
try {
|
|
71
|
+
const res = await fetch(`${endpoint}/release/history/${release.id}/revert`, {
|
|
72
|
+
credentials: 'include',
|
|
73
|
+
method: 'POST'
|
|
74
|
+
});
|
|
75
|
+
if (!res.ok) return;
|
|
76
|
+
await load();
|
|
77
|
+
await onChanged();
|
|
78
|
+
} finally {
|
|
79
|
+
reverting = null;
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
const formatDate = (iso: string): string => {
|
|
84
|
+
try {
|
|
85
|
+
const d = new Date(iso);
|
|
86
|
+
const now = new Date();
|
|
87
|
+
const sameDay =
|
|
88
|
+
d.getFullYear() === now.getFullYear() &&
|
|
89
|
+
d.getMonth() === now.getMonth() &&
|
|
90
|
+
d.getDate() === now.getDate();
|
|
91
|
+
const yesterday = new Date(now);
|
|
92
|
+
yesterday.setDate(yesterday.getDate() - 1);
|
|
93
|
+
const isYesterday =
|
|
94
|
+
d.getFullYear() === yesterday.getFullYear() &&
|
|
95
|
+
d.getMonth() === yesterday.getMonth() &&
|
|
96
|
+
d.getDate() === yesterday.getDate();
|
|
97
|
+
const time = d.toLocaleTimeString(undefined, { hour: 'numeric', minute: '2-digit' });
|
|
98
|
+
if (sameDay) return `Today, ${time}`;
|
|
99
|
+
if (isYesterday) return `Yesterday`;
|
|
100
|
+
return d.toLocaleDateString(undefined, { month: 'short', day: 'numeric' });
|
|
101
|
+
} catch {
|
|
102
|
+
return iso;
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
const isCommitHash = (s: string): boolean => /^[a-f0-9]{6,40}$/i.test(s);
|
|
107
|
+
|
|
108
|
+
type DisplayRelease = {
|
|
109
|
+
release: PublishedRelease;
|
|
110
|
+
title: string;
|
|
111
|
+
titleIsHash: boolean;
|
|
112
|
+
isLive: boolean;
|
|
113
|
+
paths: string[];
|
|
114
|
+
extraPaths: number;
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
const displayList = $derived.by<DisplayRelease[]>(() =>
|
|
118
|
+
history.map((release, idx) => {
|
|
119
|
+
const title = release.name ?? release.id.slice(0, 8);
|
|
120
|
+
const titleIsHash = !release.name && isCommitHash(title);
|
|
121
|
+
const isLive = idx === 0 && !release.revertedAt;
|
|
122
|
+
|
|
123
|
+
const seen = new Set<string>();
|
|
124
|
+
const allPaths: string[] = [];
|
|
125
|
+
for (const item of release.items) {
|
|
126
|
+
let path: string;
|
|
127
|
+
if (item.kind === 'layout') {
|
|
128
|
+
path = resolveRouteOnlyParams(item.routeId);
|
|
129
|
+
} else {
|
|
130
|
+
try {
|
|
131
|
+
path = resolveRouteUrl(item.routeId, item.params);
|
|
132
|
+
} catch {
|
|
133
|
+
path = resolveRouteOnlyParams(item.routeId);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
if (!seen.has(path)) {
|
|
137
|
+
seen.add(path);
|
|
138
|
+
allPaths.push(path);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
const cap = 3;
|
|
142
|
+
const paths = allPaths.slice(0, cap);
|
|
143
|
+
const extraPaths = Math.max(0, allPaths.length - cap);
|
|
144
|
+
return { release, title, titleIsHash, isLive, paths, extraPaths };
|
|
145
|
+
})
|
|
146
|
+
);
|
|
147
|
+
|
|
148
|
+
const onView = async (release: PublishedRelease) => {
|
|
149
|
+
const url = new URL(page.url);
|
|
150
|
+
url.searchParams.delete('preview');
|
|
151
|
+
url.searchParams.delete('edit');
|
|
152
|
+
url.searchParams.set('version', release.preview_key);
|
|
153
|
+
await goto(url.pathname + url.search + url.hash, { keepFocus: true, noScroll: true });
|
|
154
|
+
onClose();
|
|
155
|
+
};
|
|
156
|
+
</script>
|
|
157
|
+
|
|
158
|
+
<Panel ariaLabel="Recent releases" {onClose}>
|
|
159
|
+
<PanelHeader title="Recent releases" {onClose}>
|
|
160
|
+
{#snippet subtitle()}
|
|
161
|
+
<span class="vela:text-[12px] vela:text-bar-text-secondary">last 30 days</span>
|
|
162
|
+
{/snippet}
|
|
163
|
+
</PanelHeader>
|
|
164
|
+
|
|
165
|
+
<div class="vela:overflow-y-auto vela:px-4 vela:pb-2">
|
|
166
|
+
{#if loading && history.length === 0}
|
|
167
|
+
<p class="vela:text-[13px] vela:text-bar-text-tertiary vela:py-2">Loading…</p>
|
|
168
|
+
{:else if history.length === 0}
|
|
169
|
+
<p class="vela:text-[13px] vela:text-bar-text-tertiary vela:py-2">
|
|
170
|
+
No published releases yet.
|
|
171
|
+
</p>
|
|
172
|
+
{:else}
|
|
173
|
+
<ol class="vela:list-none vela:pl-0 vela:m-0 vela:relative vela:flex vela:flex-col">
|
|
174
|
+
<span
|
|
175
|
+
class="vela:absolute vela:left-[5px] vela:top-2 vela:bottom-2 vela:w-px vela:bg-[var(--cms-bar-divider)]"
|
|
176
|
+
aria-hidden="true"
|
|
177
|
+
></span>
|
|
178
|
+
{#each displayList as { release, title, titleIsHash, isLive, paths, extraPaths } (release.id)}
|
|
179
|
+
<li class="vela:relative vela:pl-6 vela:pr-1 vela:py-2.5">
|
|
180
|
+
<span
|
|
181
|
+
class="vela:absolute vela:left-0 vela:top-3.5 vela:w-[11px] vela:h-[11px]
|
|
182
|
+
vela:rounded-full vela:bg-bar-bg vela:flex vela:items-center vela:justify-center"
|
|
183
|
+
aria-hidden="true"
|
|
184
|
+
>
|
|
185
|
+
<span
|
|
186
|
+
class="vela:w-2 vela:h-2 vela:rounded-full"
|
|
187
|
+
style:background-color={isLive ? 'var(--cms-status-clean-dot)' : '#444'}
|
|
188
|
+
></span>
|
|
189
|
+
</span>
|
|
190
|
+
<div class="vela:flex vela:items-start vela:justify-between vela:gap-3">
|
|
191
|
+
<div class="vela:flex vela:flex-col vela:min-w-0 vela:flex-1">
|
|
192
|
+
<div class="vela:flex vela:items-center vela:gap-2 vela:min-w-0">
|
|
193
|
+
{#if titleIsHash}
|
|
194
|
+
<span class="vela:font-mono vela:text-[12px] vela:text-bar-text vela:truncate">
|
|
195
|
+
{title}
|
|
196
|
+
</span>
|
|
197
|
+
{:else}
|
|
198
|
+
<span
|
|
199
|
+
class="vela:text-[13px] vela:font-medium vela:text-bar-text vela:truncate"
|
|
200
|
+
>
|
|
201
|
+
{title}
|
|
202
|
+
</span>
|
|
203
|
+
{/if}
|
|
204
|
+
{#if release.revertedAt}
|
|
205
|
+
<Badge variant="warn" size="sm">reverted</Badge>
|
|
206
|
+
{/if}
|
|
207
|
+
</div>
|
|
208
|
+
<div class="vela:text-[11px] vela:text-bar-text-tertiary vela:mt-0.5">
|
|
209
|
+
{formatDate(release.publishedAt)} · published by {release.publishedBy}{isLive
|
|
210
|
+
? ' · '
|
|
211
|
+
: ''}{#if isLive}<span class="vela:text-[var(--cms-status-clean-dot)]"
|
|
212
|
+
>live now</span
|
|
213
|
+
>{/if}
|
|
214
|
+
</div>
|
|
215
|
+
{#if paths.length > 0}
|
|
216
|
+
<div class="vela:flex vela:flex-wrap vela:gap-1.5 vela:mt-2">
|
|
217
|
+
{#each paths as path}
|
|
218
|
+
<span
|
|
219
|
+
class="vela:font-mono vela:text-[11px] vela:px-1.5 vela:py-0.5 vela:rounded
|
|
220
|
+
vela:bg-[var(--cms-bar-bg-hover)] vela:text-bar-text-secondary"
|
|
221
|
+
>
|
|
222
|
+
{path}
|
|
223
|
+
</span>
|
|
224
|
+
{/each}
|
|
225
|
+
{#if extraPaths > 0}
|
|
226
|
+
<span
|
|
227
|
+
class="vela:text-[11px] vela:text-bar-text-tertiary vela:px-1 vela:py-0.5"
|
|
228
|
+
>
|
|
229
|
+
+{extraPaths} more
|
|
230
|
+
</span>
|
|
231
|
+
{/if}
|
|
232
|
+
</div>
|
|
233
|
+
{/if}
|
|
234
|
+
</div>
|
|
235
|
+
<div class="vela:flex vela:items-center vela:gap-1.5 vela:shrink-0">
|
|
236
|
+
<Button variant="outline" size="pill" onclick={() => onView(release)}>View</Button>
|
|
237
|
+
{#if !isLive}
|
|
238
|
+
<Button
|
|
239
|
+
variant="outline"
|
|
240
|
+
size="pill"
|
|
241
|
+
disabled={reverting === release.id || !!release.revertedAt}
|
|
242
|
+
onclick={() => onRevert(release)}
|
|
243
|
+
>
|
|
244
|
+
{reverting === release.id ? '…' : 'Revert'}
|
|
245
|
+
</Button>
|
|
246
|
+
{/if}
|
|
247
|
+
</div>
|
|
248
|
+
</div>
|
|
249
|
+
</li>
|
|
250
|
+
{/each}
|
|
251
|
+
</ol>
|
|
252
|
+
{/if}
|
|
253
|
+
</div>
|
|
254
|
+
|
|
255
|
+
<PanelFooter>
|
|
256
|
+
<span>
|
|
257
|
+
{history.length}
|
|
258
|
+
{history.length === 1 ? 'release' : 'releases'} shown
|
|
259
|
+
</span>
|
|
260
|
+
<Button variant="link" size="xs" disabled class="vela:text-bar-text-tertiary">
|
|
261
|
+
Load older →
|
|
262
|
+
</Button>
|
|
263
|
+
</PanelFooter>
|
|
264
|
+
</Panel>
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
// Lucide `bold` icon path data (https://lucide.dev) — ISC License,
|
|
3
|
+
// Copyright (c) Lucide Icons and Contributors. See ./types.ts.
|
|
4
|
+
import Icon from './icon.svelte';
|
|
5
|
+
import type { IconNode } from './types.js';
|
|
6
|
+
|
|
7
|
+
const iconNode: IconNode = [
|
|
8
|
+
['path', { d: 'M6 12h9a4 4 0 0 1 0 8H7a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h7a4 4 0 0 1 0 8' }]
|
|
9
|
+
];
|
|
10
|
+
let props = $props();
|
|
11
|
+
</script>
|
|
12
|
+
|
|
13
|
+
<Icon {iconNode} {...props} />
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
// Lucide `check` icon path data (https://lucide.dev) — ISC License,
|
|
3
|
+
// Copyright (c) Lucide Icons and Contributors. See ./types.ts.
|
|
4
|
+
import Icon from './icon.svelte';
|
|
5
|
+
import type { IconNode } from './types.js';
|
|
6
|
+
|
|
7
|
+
const iconNode: IconNode = [['path', { d: 'M20 6 9 17l-5-5' }]];
|
|
8
|
+
let props = $props();
|
|
9
|
+
</script>
|
|
10
|
+
|
|
11
|
+
<Icon {iconNode} {...props} />
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
// Lucide `chevron-down` icon path data (https://lucide.dev) — ISC License,
|
|
3
|
+
// Copyright (c) Lucide Icons and Contributors. See ./types.ts.
|
|
4
|
+
import Icon from './icon.svelte';
|
|
5
|
+
import type { IconNode } from './types.js';
|
|
6
|
+
|
|
7
|
+
const iconNode: IconNode = [['path', { d: 'm6 9 6 6 6-6' }]];
|
|
8
|
+
let props = $props();
|
|
9
|
+
</script>
|
|
10
|
+
|
|
11
|
+
<Icon {iconNode} {...props} />
|