@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,387 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { page } from '$app/state';
|
|
3
|
+
import ChevronDownIcon from './icons/chevron-down.svelte';
|
|
4
|
+
import { pages } from 'virtual:vela-cms/pages';
|
|
5
|
+
import { cmsStore, type CmsScopeRef } from '../cms/cms-store.svelte.js';
|
|
6
|
+
import { getPageScope, type CmsPayload } from '../cms/scope.js';
|
|
7
|
+
import {
|
|
8
|
+
DEFAULT_METADATA_SCHEMA,
|
|
9
|
+
fieldType,
|
|
10
|
+
type CmsPageMetadataSchema,
|
|
11
|
+
type MetadataFieldSchema
|
|
12
|
+
} from './page-config.js';
|
|
13
|
+
import PanelFooter from './panel-footer.svelte';
|
|
14
|
+
import PanelHeader from './panel-header.svelte';
|
|
15
|
+
import Panel from './panel.svelte';
|
|
16
|
+
import { Button } from './ui/button/index.js';
|
|
17
|
+
import * as Collapsible from './ui/collapsible/index.js';
|
|
18
|
+
import { Input } from './ui/input/index.js';
|
|
19
|
+
import { Textarea } from './ui/textarea/index.js';
|
|
20
|
+
|
|
21
|
+
type Props = { onClose: () => void; onSave: () => void | Promise<void> };
|
|
22
|
+
let { onClose, onSave }: Props = $props();
|
|
23
|
+
|
|
24
|
+
const TITLE_TARGET = 60;
|
|
25
|
+
const DESC_TARGET = 155;
|
|
26
|
+
// "Approaches" the limit at 80% — past this, color shifts amber to nudge.
|
|
27
|
+
const TITLE_AMBER_AT = Math.floor(TITLE_TARGET * 0.8);
|
|
28
|
+
const DESC_AMBER_AT = Math.floor(DESC_TARGET * 0.8);
|
|
29
|
+
|
|
30
|
+
const cms = $derived(page.data.cms as CmsPayload | undefined);
|
|
31
|
+
const pageScope = $derived(getPageScope(cms));
|
|
32
|
+
const ref = $derived<CmsScopeRef | null>(
|
|
33
|
+
pageScope
|
|
34
|
+
? { scopeId: pageScope.scopeId, routeId: pageScope.routeId, params: pageScope.params }
|
|
35
|
+
: null
|
|
36
|
+
);
|
|
37
|
+
|
|
38
|
+
// Schema lives in the route's `page.cms.ts`. Fall back to default
|
|
39
|
+
// title/description so every route gets at least the SEO basics.
|
|
40
|
+
const schema = $derived.by<CmsPageMetadataSchema>(() => {
|
|
41
|
+
if (!pageScope) return {};
|
|
42
|
+
const cfg = pages[pageScope.routeId];
|
|
43
|
+
return cfg?.metadata ?? DEFAULT_METADATA_SCHEMA;
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
const entries = $derived(Object.entries(schema));
|
|
47
|
+
const advancedEntries = $derived(entries.filter(([k]) => k !== 'title' && k !== 'description'));
|
|
48
|
+
|
|
49
|
+
const persistedValue = (key: string): unknown => {
|
|
50
|
+
if (!ref) return undefined;
|
|
51
|
+
return cmsStore.getValue(ref, `metadata.${key}`);
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
// Local form state — typing only updates `local`; nothing reaches
|
|
55
|
+
// cmsStore.metadataDrafts until Save fires. That keeps the bar's "X page
|
|
56
|
+
// draft" badge from flickering as the user explores.
|
|
57
|
+
let local = $state<Record<string, unknown>>({});
|
|
58
|
+
|
|
59
|
+
$effect(() => {
|
|
60
|
+
const next: Record<string, unknown> = {};
|
|
61
|
+
for (const [k] of entries) next[k] = persistedValue(k);
|
|
62
|
+
local = next;
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
const titleVal = $derived(typeof local.title === 'string' ? local.title : '');
|
|
66
|
+
const descVal = $derived(typeof local.description === 'string' ? local.description : '');
|
|
67
|
+
|
|
68
|
+
const breadcrumb = $derived.by(() => {
|
|
69
|
+
const host = page.url.hostname || 'localhost';
|
|
70
|
+
const segments = page.url.pathname.split('/').filter(Boolean);
|
|
71
|
+
return segments.length === 0 ? host : `${host} › ${segments.join(' › ')}`;
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
let previewTab = $state<'search' | 'social'>('search');
|
|
75
|
+
|
|
76
|
+
// Pull the live site's favicon — Google's result preview shows whichever
|
|
77
|
+
// favicon the document head declares, so the SEO preview should match. Resolve
|
|
78
|
+
// to absolute URLs (using `.href` rather than `.getAttribute`) so the img src
|
|
79
|
+
// renders correctly regardless of where the favicon is hosted.
|
|
80
|
+
let faviconHref = $state<string | null>(null);
|
|
81
|
+
$effect(() => {
|
|
82
|
+
if (typeof document === 'undefined') return;
|
|
83
|
+
const link = document.querySelector<HTMLLinkElement>(
|
|
84
|
+
'link[rel="icon"], link[rel~="icon"], link[rel="shortcut icon"]'
|
|
85
|
+
);
|
|
86
|
+
faviconHref = link?.href ?? null;
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
// Best-effort OG image: an explicit `og_image` field in the schema wins,
|
|
90
|
+
// otherwise the first image-type metadata field. The Social card stays useful
|
|
91
|
+
// even when neither exists — title/description still render against a
|
|
92
|
+
// placeholder.
|
|
93
|
+
const ogImageVal = $derived.by(() => {
|
|
94
|
+
const og = stringValue(local.og_image);
|
|
95
|
+
if (og) return og;
|
|
96
|
+
for (const [k, s] of entries) {
|
|
97
|
+
if (fieldType(s) !== 'image') continue;
|
|
98
|
+
const v = stringValue(local[k]);
|
|
99
|
+
if (v) return v;
|
|
100
|
+
}
|
|
101
|
+
return '';
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
const hostname = $derived(page.url.hostname || 'localhost');
|
|
105
|
+
|
|
106
|
+
const counterClass = (n: number, target: number, amberAt: number): string => {
|
|
107
|
+
if (n > target) return 'vela:text-destructive';
|
|
108
|
+
if (n >= amberAt) return 'vela:text-[var(--cms-status-warn-text)]';
|
|
109
|
+
return 'vela:text-bar-text-tertiary';
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
const handleSave = async () => {
|
|
113
|
+
if (!ref) return onClose();
|
|
114
|
+
for (const [k] of entries) {
|
|
115
|
+
const v = local[k];
|
|
116
|
+
if (v !== persistedValue(k)) cmsStore.setValue(ref, `metadata.${k}`, v);
|
|
117
|
+
}
|
|
118
|
+
await onSave();
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
const fieldLabelClass = 'vela:text-[12px] vela:text-bar-text-secondary';
|
|
122
|
+
const counterBaseClass = 'vela:text-[11px] vela:font-mono vela:tabular-nums';
|
|
123
|
+
const selectClass =
|
|
124
|
+
'vela:flex vela:h-9 vela:w-full vela:rounded-md vela:border vela:border-[var(--cms-bar-divider)]' +
|
|
125
|
+
' vela:bg-[var(--cms-bar-bg-hover)] vela:px-3 vela:py-1 vela:text-[13px] vela:text-bar-text' +
|
|
126
|
+
' vela:focus:outline-none vela:focus:ring-2 vela:focus:ring-[var(--cms-accent)]';
|
|
127
|
+
|
|
128
|
+
const stringValue = (v: unknown): string => (typeof v === 'string' ? v : '');
|
|
129
|
+
const numberValue = (v: unknown): number | null =>
|
|
130
|
+
typeof v === 'number' && !Number.isNaN(v) ? v : null;
|
|
131
|
+
const booleanValue = (v: unknown): boolean => v === true;
|
|
132
|
+
|
|
133
|
+
const setNumber = (key: string, raw: string) => {
|
|
134
|
+
if (raw === '') {
|
|
135
|
+
local[key] = undefined;
|
|
136
|
+
} else {
|
|
137
|
+
const n = Number(raw);
|
|
138
|
+
local[key] = Number.isFinite(n) ? n : undefined;
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
const enumValues = (s: MetadataFieldSchema): readonly string[] =>
|
|
143
|
+
typeof s !== 'string' && s.type === 'enum' ? s.values : [];
|
|
144
|
+
</script>
|
|
145
|
+
|
|
146
|
+
<Panel ariaLabel="SEO and metadata" {onClose}>
|
|
147
|
+
<PanelHeader title="SEO & metadata" {onClose} />
|
|
148
|
+
|
|
149
|
+
<form
|
|
150
|
+
class="vela:overflow-y-auto vela:px-4 vela:pb-4 vela:flex vela:flex-col vela:gap-4"
|
|
151
|
+
onsubmit={(e) => {
|
|
152
|
+
e.preventDefault();
|
|
153
|
+
handleSave();
|
|
154
|
+
}}
|
|
155
|
+
>
|
|
156
|
+
{#if !pageScope}
|
|
157
|
+
<p class="vela:text-[13px] vela:text-bar-text-tertiary vela:py-2">
|
|
158
|
+
No page scope on this route.
|
|
159
|
+
</p>
|
|
160
|
+
{:else}
|
|
161
|
+
<div class="vela:flex vela:flex-col vela:gap-2">
|
|
162
|
+
<div
|
|
163
|
+
role="tablist"
|
|
164
|
+
aria-label="Preview format"
|
|
165
|
+
class="vela:inline-flex vela:self-start vela:p-0.5 vela:rounded-md
|
|
166
|
+
vela:bg-[var(--cms-bar-bg-hover)] vela:border vela:border-[var(--cms-bar-divider)]"
|
|
167
|
+
>
|
|
168
|
+
<button
|
|
169
|
+
type="button"
|
|
170
|
+
role="tab"
|
|
171
|
+
aria-selected={previewTab === 'search'}
|
|
172
|
+
onclick={() => (previewTab = 'search')}
|
|
173
|
+
class="vela:px-2.5 vela:py-1 vela:rounded vela:text-[11px] vela:font-medium
|
|
174
|
+
vela:cursor-pointer vela:transition-colors
|
|
175
|
+
{previewTab === 'search'
|
|
176
|
+
? 'vela:bg-bar-bg vela:text-bar-text'
|
|
177
|
+
: 'vela:text-bar-text-secondary vela:hover:text-bar-text'}"
|
|
178
|
+
>
|
|
179
|
+
Search
|
|
180
|
+
</button>
|
|
181
|
+
<button
|
|
182
|
+
type="button"
|
|
183
|
+
role="tab"
|
|
184
|
+
aria-selected={previewTab === 'social'}
|
|
185
|
+
onclick={() => (previewTab = 'social')}
|
|
186
|
+
class="vela:px-2.5 vela:py-1 vela:rounded vela:text-[11px] vela:font-medium
|
|
187
|
+
vela:cursor-pointer vela:transition-colors
|
|
188
|
+
{previewTab === 'social'
|
|
189
|
+
? 'vela:bg-bar-bg vela:text-bar-text'
|
|
190
|
+
: 'vela:text-bar-text-secondary vela:hover:text-bar-text'}"
|
|
191
|
+
>
|
|
192
|
+
Social
|
|
193
|
+
</button>
|
|
194
|
+
</div>
|
|
195
|
+
|
|
196
|
+
{#if previewTab === 'search'}
|
|
197
|
+
<div
|
|
198
|
+
class="vela:bg-[#fafafa] vela:text-[#202124] vela:rounded-lg vela:p-3.5
|
|
199
|
+
vela:border vela:border-[#e8eaed]"
|
|
200
|
+
>
|
|
201
|
+
<div class="vela:flex vela:items-center vela:gap-1.5 vela:text-[12px]">
|
|
202
|
+
{#if faviconHref}
|
|
203
|
+
<img
|
|
204
|
+
src={faviconHref}
|
|
205
|
+
alt=""
|
|
206
|
+
class="vela:w-4 vela:h-4 vela:rounded-full vela:bg-white vela:object-contain"
|
|
207
|
+
/>
|
|
208
|
+
{:else}
|
|
209
|
+
<span
|
|
210
|
+
class="vela:inline-flex vela:items-center vela:justify-center vela:w-4 vela:h-4 vela:rounded-full vela:bg-[var(--cms-accent)]"
|
|
211
|
+
></span>
|
|
212
|
+
{/if}
|
|
213
|
+
<span class="vela:text-[#202124]">{breadcrumb}</span>
|
|
214
|
+
</div>
|
|
215
|
+
<div
|
|
216
|
+
class="vela:mt-1.5 vela:text-[18px] vela:leading-snug vela:text-[#1a0dab] vela:truncate"
|
|
217
|
+
>
|
|
218
|
+
{titleVal || 'Page title'}
|
|
219
|
+
</div>
|
|
220
|
+
<div class="vela:mt-1 vela:text-[13px] vela:leading-snug vela:text-[#4d5156]">
|
|
221
|
+
{descVal || 'Meta description appears here.'}
|
|
222
|
+
</div>
|
|
223
|
+
</div>
|
|
224
|
+
{:else}
|
|
225
|
+
<div
|
|
226
|
+
class="vela:bg-white vela:text-[#0f1419] vela:rounded-lg vela:overflow-hidden
|
|
227
|
+
vela:border vela:border-[#e8eaed]"
|
|
228
|
+
>
|
|
229
|
+
<div
|
|
230
|
+
class="vela:aspect-[1.91/1] vela:bg-[#e8eaed] vela:flex vela:items-center vela:justify-center vela:overflow-hidden"
|
|
231
|
+
>
|
|
232
|
+
{#if ogImageVal}
|
|
233
|
+
<img src={ogImageVal} alt="" class="vela:w-full vela:h-full vela:object-cover" />
|
|
234
|
+
{:else}
|
|
235
|
+
<span class="vela:text-[11px] vela:text-[#5f6368]">No social image set</span>
|
|
236
|
+
{/if}
|
|
237
|
+
</div>
|
|
238
|
+
<div
|
|
239
|
+
class="vela:px-3.5 vela:py-2.5 vela:border-t vela:border-[#e8eaed] vela:bg-[#f7f9fa]"
|
|
240
|
+
>
|
|
241
|
+
<div class="vela:text-[11px] vela:uppercase vela:text-[#5f6368]">
|
|
242
|
+
{hostname}
|
|
243
|
+
</div>
|
|
244
|
+
<div
|
|
245
|
+
class="vela:mt-0.5 vela:text-[14px] vela:font-semibold vela:leading-snug vela:line-clamp-2"
|
|
246
|
+
>
|
|
247
|
+
{titleVal || 'Page title'}
|
|
248
|
+
</div>
|
|
249
|
+
<div
|
|
250
|
+
class="vela:mt-0.5 vela:text-[12px] vela:leading-snug vela:text-[#536471] vela:line-clamp-2"
|
|
251
|
+
>
|
|
252
|
+
{descVal || 'Meta description appears here.'}
|
|
253
|
+
</div>
|
|
254
|
+
</div>
|
|
255
|
+
</div>
|
|
256
|
+
{/if}
|
|
257
|
+
</div>
|
|
258
|
+
|
|
259
|
+
{#if 'title' in schema}
|
|
260
|
+
<label class="vela:flex vela:flex-col vela:gap-1.5">
|
|
261
|
+
<div class="vela:flex vela:items-center vela:justify-between">
|
|
262
|
+
<span class={fieldLabelClass}>Title</span>
|
|
263
|
+
<span
|
|
264
|
+
class="{counterBaseClass} {counterClass(
|
|
265
|
+
titleVal.length,
|
|
266
|
+
TITLE_TARGET,
|
|
267
|
+
TITLE_AMBER_AT
|
|
268
|
+
)}"
|
|
269
|
+
>
|
|
270
|
+
{titleVal.length} / {TITLE_TARGET}
|
|
271
|
+
</span>
|
|
272
|
+
</div>
|
|
273
|
+
<Input
|
|
274
|
+
type="text"
|
|
275
|
+
value={stringValue(local.title)}
|
|
276
|
+
oninput={(e) => (local.title = e.currentTarget.value)}
|
|
277
|
+
/>
|
|
278
|
+
</label>
|
|
279
|
+
{/if}
|
|
280
|
+
|
|
281
|
+
{#if 'description' in schema}
|
|
282
|
+
<label class="vela:flex vela:flex-col vela:gap-1.5">
|
|
283
|
+
<div class="vela:flex vela:items-center vela:justify-between">
|
|
284
|
+
<span class={fieldLabelClass}>Description</span>
|
|
285
|
+
<span
|
|
286
|
+
class="{counterBaseClass} {counterClass(descVal.length, DESC_TARGET, DESC_AMBER_AT)}"
|
|
287
|
+
>
|
|
288
|
+
{descVal.length} / {DESC_TARGET}
|
|
289
|
+
</span>
|
|
290
|
+
</div>
|
|
291
|
+
<Textarea
|
|
292
|
+
value={stringValue(local.description)}
|
|
293
|
+
oninput={(e) => (local.description = e.currentTarget.value)}
|
|
294
|
+
/>
|
|
295
|
+
</label>
|
|
296
|
+
{/if}
|
|
297
|
+
|
|
298
|
+
{#if advancedEntries.length > 0}
|
|
299
|
+
<Collapsible.Root class="vela:border-t vela:border-[var(--cms-bar-divider)] vela:pt-3">
|
|
300
|
+
<Collapsible.Trigger
|
|
301
|
+
class="vela:group vela:flex vela:items-center vela:justify-between vela:w-full
|
|
302
|
+
vela:text-left vela:text-[13px] vela:text-bar-text-secondary
|
|
303
|
+
vela:hover:text-bar-text vela:cursor-pointer vela:focus:outline-none"
|
|
304
|
+
>
|
|
305
|
+
<span>More fields</span>
|
|
306
|
+
<ChevronDownIcon
|
|
307
|
+
class="vela:size-4 vela:transition-transform vela:group-data-[state=open]:rotate-180"
|
|
308
|
+
/>
|
|
309
|
+
</Collapsible.Trigger>
|
|
310
|
+
<Collapsible.Content>
|
|
311
|
+
<div class="vela:flex vela:flex-col vela:gap-3 vela:mt-3">
|
|
312
|
+
{#each advancedEntries as [key, fieldSchema] (key)}
|
|
313
|
+
{@const t = fieldType(fieldSchema)}
|
|
314
|
+
{#if t === 'boolean'}
|
|
315
|
+
<label
|
|
316
|
+
class="vela:flex vela:items-center vela:gap-2 vela:text-[13px] vela:text-bar-text"
|
|
317
|
+
>
|
|
318
|
+
<input
|
|
319
|
+
type="checkbox"
|
|
320
|
+
checked={booleanValue(local[key])}
|
|
321
|
+
onchange={(e) => (local[key] = e.currentTarget.checked)}
|
|
322
|
+
/>
|
|
323
|
+
<span>{key}</span>
|
|
324
|
+
</label>
|
|
325
|
+
{:else}
|
|
326
|
+
<label class="vela:flex vela:flex-col vela:gap-1.5">
|
|
327
|
+
<span class={fieldLabelClass}>{key}</span>
|
|
328
|
+
{#if t === 'long-string'}
|
|
329
|
+
<Textarea
|
|
330
|
+
value={stringValue(local[key])}
|
|
331
|
+
oninput={(e) => (local[key] = e.currentTarget.value)}
|
|
332
|
+
/>
|
|
333
|
+
{:else if t === 'number'}
|
|
334
|
+
<Input
|
|
335
|
+
type="number"
|
|
336
|
+
value={numberValue(local[key]) ?? ''}
|
|
337
|
+
oninput={(e) => setNumber(key, e.currentTarget.value)}
|
|
338
|
+
/>
|
|
339
|
+
{:else if t === 'date'}
|
|
340
|
+
<Input
|
|
341
|
+
type="date"
|
|
342
|
+
value={stringValue(local[key])}
|
|
343
|
+
oninput={(e) => (local[key] = e.currentTarget.value)}
|
|
344
|
+
/>
|
|
345
|
+
{:else if t === 'image'}
|
|
346
|
+
<Input
|
|
347
|
+
type="url"
|
|
348
|
+
placeholder="https://…"
|
|
349
|
+
value={stringValue(local[key])}
|
|
350
|
+
oninput={(e) => (local[key] = e.currentTarget.value)}
|
|
351
|
+
/>
|
|
352
|
+
{:else if t === 'enum'}
|
|
353
|
+
<select
|
|
354
|
+
class={selectClass}
|
|
355
|
+
value={stringValue(local[key])}
|
|
356
|
+
onchange={(e) => (local[key] = e.currentTarget.value)}
|
|
357
|
+
>
|
|
358
|
+
<option value="">—</option>
|
|
359
|
+
{#each enumValues(fieldSchema) as v (v)}
|
|
360
|
+
<option value={v}>{v}</option>
|
|
361
|
+
{/each}
|
|
362
|
+
</select>
|
|
363
|
+
{:else}
|
|
364
|
+
<Input
|
|
365
|
+
type="text"
|
|
366
|
+
value={stringValue(local[key])}
|
|
367
|
+
oninput={(e) => (local[key] = e.currentTarget.value)}
|
|
368
|
+
/>
|
|
369
|
+
{/if}
|
|
370
|
+
</label>
|
|
371
|
+
{/if}
|
|
372
|
+
{/each}
|
|
373
|
+
</div>
|
|
374
|
+
</Collapsible.Content>
|
|
375
|
+
</Collapsible.Root>
|
|
376
|
+
{/if}
|
|
377
|
+
{/if}
|
|
378
|
+
</form>
|
|
379
|
+
|
|
380
|
+
<PanelFooter>
|
|
381
|
+
<span>Save to keep your changes</span>
|
|
382
|
+
<div class="vela:flex vela:items-center vela:gap-1.5">
|
|
383
|
+
<Button variant="ghost" size="pill" onclick={onClose}>Cancel</Button>
|
|
384
|
+
<Button size="pill" onclick={handleSave}>Save</Button>
|
|
385
|
+
</div>
|
|
386
|
+
</PanelFooter>
|
|
387
|
+
</Panel>
|
|
@@ -0,0 +1,97 @@
|
|
|
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
|
+
|
|
6
|
+
type Props = {
|
|
7
|
+
open: boolean;
|
|
8
|
+
onOpenChange: (open: boolean) => void;
|
|
9
|
+
previewUrl: string;
|
|
10
|
+
onRegenerate: () => Promise<void> | void;
|
|
11
|
+
};
|
|
12
|
+
let { open, onOpenChange, previewUrl, onRegenerate }: Props = $props();
|
|
13
|
+
|
|
14
|
+
let copied = $state(false);
|
|
15
|
+
let regenerating = $state(false);
|
|
16
|
+
let copiedTimer: ReturnType<typeof setTimeout> | null = null;
|
|
17
|
+
|
|
18
|
+
$effect(() => {
|
|
19
|
+
if (!open) {
|
|
20
|
+
copied = false;
|
|
21
|
+
if (copiedTimer) {
|
|
22
|
+
clearTimeout(copiedTimer);
|
|
23
|
+
copiedTimer = null;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
const onCopy = async () => {
|
|
29
|
+
if (!previewUrl) return;
|
|
30
|
+
try {
|
|
31
|
+
await navigator.clipboard.writeText(previewUrl);
|
|
32
|
+
copied = true;
|
|
33
|
+
if (copiedTimer) clearTimeout(copiedTimer);
|
|
34
|
+
copiedTimer = setTimeout(() => (copied = false), 1600);
|
|
35
|
+
} catch {
|
|
36
|
+
/* clipboard may be unavailable; swallow silently */
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
const onRegenerateClick = async () => {
|
|
41
|
+
if (regenerating) return;
|
|
42
|
+
regenerating = true;
|
|
43
|
+
try {
|
|
44
|
+
await onRegenerate();
|
|
45
|
+
} finally {
|
|
46
|
+
regenerating = false;
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
</script>
|
|
50
|
+
|
|
51
|
+
<Dialog.Root {open} {onOpenChange}>
|
|
52
|
+
<Dialog.Content class="vela:max-w-[28rem]">
|
|
53
|
+
<Dialog.Header>
|
|
54
|
+
<Dialog.Title>Share preview link</Dialog.Title>
|
|
55
|
+
<Dialog.Description>
|
|
56
|
+
Anyone with this link can view your unpublished changes without signing in. Share it with
|
|
57
|
+
teammates or stakeholders to gather feedback before publishing.
|
|
58
|
+
</Dialog.Description>
|
|
59
|
+
</Dialog.Header>
|
|
60
|
+
|
|
61
|
+
<div class="vela:px-6 vela:pb-4 vela:flex vela:flex-col vela:gap-4">
|
|
62
|
+
<div class="vela:flex vela:items-center vela:gap-2">
|
|
63
|
+
<Input
|
|
64
|
+
readonly
|
|
65
|
+
value={previewUrl}
|
|
66
|
+
onfocus={(e) => e.currentTarget.select()}
|
|
67
|
+
class="vela:font-mono vela:text-[12px]"
|
|
68
|
+
/>
|
|
69
|
+
<Button variant="default" onclick={onCopy} disabled={!previewUrl}>
|
|
70
|
+
{copied ? 'Copied' : 'Copy'}
|
|
71
|
+
</Button>
|
|
72
|
+
</div>
|
|
73
|
+
|
|
74
|
+
<div
|
|
75
|
+
class="vela:flex vela:items-start vela:justify-between vela:gap-3 vela:pt-3
|
|
76
|
+
vela:border-t vela:border-[var(--cms-bar-divider)]"
|
|
77
|
+
>
|
|
78
|
+
<p class="vela:text-[12px] vela:text-bar-text-secondary vela:leading-snug vela:m-0">
|
|
79
|
+
Regenerating the preview key revokes access for anyone holding a previously shared link.
|
|
80
|
+
</p>
|
|
81
|
+
<Button
|
|
82
|
+
variant="outline-destructive"
|
|
83
|
+
size="sm"
|
|
84
|
+
onclick={onRegenerateClick}
|
|
85
|
+
disabled={regenerating || !previewUrl}
|
|
86
|
+
class="vela:shrink-0"
|
|
87
|
+
>
|
|
88
|
+
{regenerating ? 'Regenerating…' : 'Regenerate'}
|
|
89
|
+
</Button>
|
|
90
|
+
</div>
|
|
91
|
+
</div>
|
|
92
|
+
|
|
93
|
+
<Dialog.Footer class="vela:justify-end vela:pt-2">
|
|
94
|
+
<Button variant="ghost" onclick={() => onOpenChange(false)}>Done</Button>
|
|
95
|
+
</Dialog.Footer>
|
|
96
|
+
</Dialog.Content>
|
|
97
|
+
</Dialog.Root>
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
type Props = {
|
|
2
|
+
open: boolean;
|
|
3
|
+
onOpenChange: (open: boolean) => void;
|
|
4
|
+
previewUrl: string;
|
|
5
|
+
onRegenerate: () => Promise<void> | void;
|
|
6
|
+
};
|
|
7
|
+
declare const SharePreviewLinkDialog: import("svelte").Component<Props, {}, "">;
|
|
8
|
+
type SharePreviewLinkDialog = ReturnType<typeof SharePreviewLinkDialog>;
|
|
9
|
+
export default SharePreviewLinkDialog;
|