@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,96 @@
|
|
|
1
|
+
<script lang="ts" module>
|
|
2
|
+
type ShortcutEntry = { keys: string; label: string };
|
|
3
|
+
type ShortcutGroup = { heading: string; entries: ShortcutEntry[] };
|
|
4
|
+
|
|
5
|
+
// Mirrors DESIGN.md §9. Grouped to match the menubar's mental model so
|
|
6
|
+
// users can scan to the right section by what they're trying to do.
|
|
7
|
+
const SHORTCUT_GROUPS: ShortcutGroup[] = [
|
|
8
|
+
{
|
|
9
|
+
heading: 'Editing',
|
|
10
|
+
entries: [
|
|
11
|
+
{ keys: '⌘E', label: 'Enter edit mode' },
|
|
12
|
+
{ keys: '⌘S', label: 'Save' },
|
|
13
|
+
{ keys: 'esc', label: 'Cancel edit / close panel' },
|
|
14
|
+
{ keys: '⌘Z', label: 'Revert last edit' }
|
|
15
|
+
]
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
heading: 'Page',
|
|
19
|
+
entries: [
|
|
20
|
+
{ keys: '⌘I', label: 'SEO & metadata for this page' },
|
|
21
|
+
{ keys: '⌘↵', label: 'Open current page in new tab' },
|
|
22
|
+
{ keys: '⌘P', label: 'Review & publish' }
|
|
23
|
+
]
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
heading: 'Navigate',
|
|
27
|
+
entries: [
|
|
28
|
+
{ keys: '⌘K', label: 'All pages' },
|
|
29
|
+
{ keys: '⌘M', label: 'Media library' },
|
|
30
|
+
{ keys: '⌘L', label: 'Locales' },
|
|
31
|
+
{ keys: '⌘H', label: 'Recent releases' },
|
|
32
|
+
{ keys: '/', label: 'Focus search (when a panel is open)' }
|
|
33
|
+
]
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
heading: 'Site',
|
|
37
|
+
entries: [
|
|
38
|
+
{ keys: '⌘N', label: 'New page' },
|
|
39
|
+
{ keys: '⌘,', label: 'Site settings' }
|
|
40
|
+
]
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
heading: 'View',
|
|
44
|
+
entries: [
|
|
45
|
+
{ keys: '⌘.', label: 'Hide / show bar' },
|
|
46
|
+
{ keys: '⌘⇧E', label: 'Toggle highlight editable areas' },
|
|
47
|
+
{ keys: '⌘G', label: 'Toggle grid & spacing overlay' },
|
|
48
|
+
{ keys: '?', label: 'Show this list' }
|
|
49
|
+
]
|
|
50
|
+
}
|
|
51
|
+
];
|
|
52
|
+
</script>
|
|
53
|
+
|
|
54
|
+
<script lang="ts">
|
|
55
|
+
import * as Dialog from './ui/dialog/index.js';
|
|
56
|
+
import { KbdShortcut } from './ui/kbd/index.js';
|
|
57
|
+
|
|
58
|
+
type Props = {
|
|
59
|
+
open: boolean;
|
|
60
|
+
onOpenChange: (open: boolean) => void;
|
|
61
|
+
};
|
|
62
|
+
let { open, onOpenChange }: Props = $props();
|
|
63
|
+
</script>
|
|
64
|
+
|
|
65
|
+
<Dialog.Root {open} {onOpenChange}>
|
|
66
|
+
<Dialog.Content class="vela:max-w-[34rem]">
|
|
67
|
+
<Dialog.Header>
|
|
68
|
+
<Dialog.Title>Keyboard shortcuts</Dialog.Title>
|
|
69
|
+
<Dialog.Description>
|
|
70
|
+
Single-letter shortcuts only fire when no input is focused.
|
|
71
|
+
</Dialog.Description>
|
|
72
|
+
</Dialog.Header>
|
|
73
|
+
|
|
74
|
+
<div class="vela:px-6 vela:pb-5 vela:flex vela:flex-col vela:gap-5">
|
|
75
|
+
{#each SHORTCUT_GROUPS as group}
|
|
76
|
+
<section class="vela:flex vela:flex-col vela:gap-1.5">
|
|
77
|
+
<h3
|
|
78
|
+
class="vela:text-[10px] vela:font-semibold vela:uppercase vela:tracking-widest vela:text-bar-text-tertiary vela:m-0"
|
|
79
|
+
>
|
|
80
|
+
{group.heading}
|
|
81
|
+
</h3>
|
|
82
|
+
<ul class="vela:flex vela:flex-col vela:m-0 vela:p-0 vela:list-none">
|
|
83
|
+
{#each group.entries as entry}
|
|
84
|
+
<li
|
|
85
|
+
class="vela:flex vela:items-center vela:justify-between vela:gap-3 vela:py-1.5 vela:text-[13px] vela:text-bar-text"
|
|
86
|
+
>
|
|
87
|
+
<span>{entry.label}</span>
|
|
88
|
+
<KbdShortcut keys={entry.keys} />
|
|
89
|
+
</li>
|
|
90
|
+
{/each}
|
|
91
|
+
</ul>
|
|
92
|
+
</section>
|
|
93
|
+
{/each}
|
|
94
|
+
</div>
|
|
95
|
+
</Dialog.Content>
|
|
96
|
+
</Dialog.Root>
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
type Props = {
|
|
2
|
+
open: boolean;
|
|
3
|
+
onOpenChange: (open: boolean) => void;
|
|
4
|
+
};
|
|
5
|
+
declare const KeyboardShortcutsDialog: import("svelte").Component<Props, {}, "">;
|
|
6
|
+
type KeyboardShortcutsDialog = ReturnType<typeof KeyboardShortcutsDialog>;
|
|
7
|
+
export default KeyboardShortcutsDialog;
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { cmsStore, type ReleaseItem } from '../cms/cms-store.svelte.js';
|
|
3
|
+
import PanelFooter from './panel-footer.svelte';
|
|
4
|
+
import PanelHeader from './panel-header.svelte';
|
|
5
|
+
import Panel from './panel.svelte';
|
|
6
|
+
import { Badge } from './ui/badge/index.js';
|
|
7
|
+
import { Button } from './ui/button/index.js';
|
|
8
|
+
|
|
9
|
+
type Props = {
|
|
10
|
+
currentLocale: string;
|
|
11
|
+
locales: string[];
|
|
12
|
+
onClose: () => void;
|
|
13
|
+
onSelectLocale: (locale: string) => void;
|
|
14
|
+
};
|
|
15
|
+
let { currentLocale, locales, onClose, onSelectLocale }: Props = $props();
|
|
16
|
+
|
|
17
|
+
const defaultLocale = $derived(locales[0] ?? '');
|
|
18
|
+
|
|
19
|
+
// Group an item to a stable identity across locales: a same-(kind, routeId,
|
|
20
|
+
// params) item in EN and ES describes "the same thing" in both languages.
|
|
21
|
+
// Site items don't belong to any locale and never appear in this panel —
|
|
22
|
+
// callers filter them out before invoking `itemKey`.
|
|
23
|
+
const itemKey = (item: Exclude<ReleaseItem, { kind: 'site' }>): string => {
|
|
24
|
+
if (item.kind === 'layout') return `layout|${item.routeId}`;
|
|
25
|
+
const keys = Object.keys(item.params).sort();
|
|
26
|
+
const qp = keys.map((k) => `${k}=${item.params[k]}`).join('&');
|
|
27
|
+
return `${item.kind}|${item.routeId}|${qp}`;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
// Per-locale: which "things" (item keys) have edits in this locale.
|
|
31
|
+
const editsByLocale = $derived.by(() => {
|
|
32
|
+
const out = new Map<string, Set<string>>();
|
|
33
|
+
for (const locale of locales) out.set(locale, new Set<string>());
|
|
34
|
+
for (const item of cmsStore.openRelease?.items ?? []) {
|
|
35
|
+
if (item.kind === 'site') continue;
|
|
36
|
+
const set = out.get(item.locale);
|
|
37
|
+
if (!set) continue;
|
|
38
|
+
set.add(itemKey(item));
|
|
39
|
+
}
|
|
40
|
+
return out;
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
const counts = $derived(cmsStore.workingCopyCountsByLocale);
|
|
44
|
+
|
|
45
|
+
type Row = {
|
|
46
|
+
locale: string;
|
|
47
|
+
isDefault: boolean;
|
|
48
|
+
isCurrent: boolean;
|
|
49
|
+
edits: number;
|
|
50
|
+
missing: number;
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
const rows = $derived.by<Row[]>(() => {
|
|
54
|
+
const defaultEdits = editsByLocale.get(defaultLocale) ?? new Set<string>();
|
|
55
|
+
return locales.map((locale) => {
|
|
56
|
+
const edits = editsByLocale.get(locale) ?? new Set<string>();
|
|
57
|
+
let missing = 0;
|
|
58
|
+
if (locale !== defaultLocale) {
|
|
59
|
+
for (const k of defaultEdits) {
|
|
60
|
+
if (!edits.has(k)) missing += 1;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return {
|
|
64
|
+
locale,
|
|
65
|
+
isDefault: locale === defaultLocale,
|
|
66
|
+
isCurrent: locale === currentLocale,
|
|
67
|
+
edits: counts[locale]?.total ?? 0,
|
|
68
|
+
missing
|
|
69
|
+
};
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
</script>
|
|
73
|
+
|
|
74
|
+
<Panel ariaLabel="Locales" {onClose}>
|
|
75
|
+
<PanelHeader title="Locales" {onClose}>
|
|
76
|
+
{#snippet subtitle()}
|
|
77
|
+
<span class="vela:text-[12px] vela:text-bar-text-secondary">
|
|
78
|
+
preview locale & translation progress
|
|
79
|
+
</span>
|
|
80
|
+
{/snippet}
|
|
81
|
+
</PanelHeader>
|
|
82
|
+
|
|
83
|
+
<div class="vela:overflow-y-auto vela:px-4 vela:pb-2">
|
|
84
|
+
{#if rows.length === 0}
|
|
85
|
+
<p class="vela:text-[13px] vela:text-bar-text-tertiary vela:py-2">No locales configured.</p>
|
|
86
|
+
{:else}
|
|
87
|
+
<ol class="vela:list-none vela:pl-0 vela:m-0 vela:flex vela:flex-col">
|
|
88
|
+
{#each rows as row (row.locale)}
|
|
89
|
+
<li class="vela:relative vela:py-2.5">
|
|
90
|
+
<div class="vela:flex vela:items-start vela:justify-between vela:gap-3">
|
|
91
|
+
<div class="vela:flex vela:flex-col vela:min-w-0 vela:flex-1">
|
|
92
|
+
<div class="vela:flex vela:items-center vela:gap-2 vela:min-w-0">
|
|
93
|
+
<span class="vela:font-mono vela:text-[13px] vela:font-medium vela:text-bar-text">
|
|
94
|
+
{row.locale}
|
|
95
|
+
</span>
|
|
96
|
+
{#if row.isDefault}
|
|
97
|
+
<Badge variant="default" size="sm">default</Badge>
|
|
98
|
+
{/if}
|
|
99
|
+
{#if row.isCurrent}
|
|
100
|
+
<Badge variant="edit" size="sm">previewing</Badge>
|
|
101
|
+
{/if}
|
|
102
|
+
</div>
|
|
103
|
+
<div class="vela:text-[11px] vela:text-bar-text-tertiary vela:mt-0.5">
|
|
104
|
+
{row.edits}
|
|
105
|
+
{row.edits === 1 ? 'edit' : 'edits'}
|
|
106
|
+
{#if !row.isDefault && row.missing > 0}
|
|
107
|
+
· <span class="vela:text-[var(--cms-status-warn-text)]">
|
|
108
|
+
missing {row.missing} from {defaultLocale}
|
|
109
|
+
</span>
|
|
110
|
+
{/if}
|
|
111
|
+
</div>
|
|
112
|
+
</div>
|
|
113
|
+
<div class="vela:flex vela:items-center vela:gap-1.5 vela:shrink-0">
|
|
114
|
+
<Button
|
|
115
|
+
variant="outline"
|
|
116
|
+
size="pill"
|
|
117
|
+
disabled={row.isCurrent}
|
|
118
|
+
onclick={() => onSelectLocale(row.locale)}
|
|
119
|
+
>
|
|
120
|
+
{row.isCurrent ? 'Current' : 'Preview'}
|
|
121
|
+
</Button>
|
|
122
|
+
</div>
|
|
123
|
+
</div>
|
|
124
|
+
</li>
|
|
125
|
+
{/each}
|
|
126
|
+
</ol>
|
|
127
|
+
{/if}
|
|
128
|
+
</div>
|
|
129
|
+
|
|
130
|
+
<PanelFooter>
|
|
131
|
+
<span>
|
|
132
|
+
{rows.length}
|
|
133
|
+
{rows.length === 1 ? 'locale' : 'locales'}
|
|
134
|
+
</span>
|
|
135
|
+
<span class="vela:text-bar-text-tertiary"> Edits ride in one release across all locales. </span>
|
|
136
|
+
</PanelFooter>
|
|
137
|
+
</Panel>
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
type Props = {
|
|
2
|
+
currentLocale: string;
|
|
3
|
+
locales: string[];
|
|
4
|
+
onClose: () => void;
|
|
5
|
+
onSelectLocale: (locale: string) => void;
|
|
6
|
+
};
|
|
7
|
+
declare const LocalesPanel: import("svelte").Component<Props, {}, "">;
|
|
8
|
+
type LocalesPanel = ReturnType<typeof LocalesPanel>;
|
|
9
|
+
export default LocalesPanel;
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import UploadIcon from './icons/upload.svelte';
|
|
3
|
+
import TrashIcon from './icons/trash-2.svelte';
|
|
4
|
+
import LoaderIcon from './icons/loader-circle.svelte';
|
|
5
|
+
import AlertIcon from './icons/triangle-alert.svelte';
|
|
6
|
+
import CheckIcon from './icons/check.svelte';
|
|
7
|
+
import { cmsStore } from '../cms/cms-store.svelte.js';
|
|
8
|
+
import type { MediaItem } from '../cms/cms-store.svelte.js';
|
|
9
|
+
import PanelFooter from './panel-footer.svelte';
|
|
10
|
+
import PanelHeader from './panel-header.svelte';
|
|
11
|
+
import Panel from './panel.svelte';
|
|
12
|
+
import { Button } from './ui/button/index.js';
|
|
13
|
+
|
|
14
|
+
type Props = {
|
|
15
|
+
endpoint: string;
|
|
16
|
+
onClose: () => void;
|
|
17
|
+
};
|
|
18
|
+
let { endpoint, onClose }: Props = $props();
|
|
19
|
+
|
|
20
|
+
const PAGE_SIZE = 24;
|
|
21
|
+
|
|
22
|
+
let items = $state<MediaItem[]>([]);
|
|
23
|
+
let total = $state(0);
|
|
24
|
+
let offset = $state(0);
|
|
25
|
+
let loading = $state(true);
|
|
26
|
+
let error = $state<string | null>(null);
|
|
27
|
+
|
|
28
|
+
let dragDepth = $state(0);
|
|
29
|
+
const dragging = $derived(dragDepth > 0);
|
|
30
|
+
|
|
31
|
+
let uploading = $state(false);
|
|
32
|
+
let copiedId = $state<string | null>(null);
|
|
33
|
+
let fileInputEl: HTMLInputElement | null = $state(null);
|
|
34
|
+
|
|
35
|
+
const fetchPage = async () => {
|
|
36
|
+
loading = true;
|
|
37
|
+
try {
|
|
38
|
+
const res = await cmsStore.listMedia(endpoint, { offset, limit: PAGE_SIZE });
|
|
39
|
+
items = res.items;
|
|
40
|
+
total = res.total;
|
|
41
|
+
error = null;
|
|
42
|
+
} catch {
|
|
43
|
+
error = 'Could not load media.';
|
|
44
|
+
} finally {
|
|
45
|
+
loading = false;
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
$effect(() => {
|
|
50
|
+
void offset; // re-run when offset changes
|
|
51
|
+
void fetchPage();
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
const upload = async (file: File) => {
|
|
55
|
+
if (!file.type.startsWith('image/')) {
|
|
56
|
+
error = 'Only image files are supported.';
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
error = null;
|
|
60
|
+
uploading = true;
|
|
61
|
+
try {
|
|
62
|
+
const item = await cmsStore.uploadMedia(endpoint, file);
|
|
63
|
+
// Optimistic prepend; reset to first page so it's visible.
|
|
64
|
+
if (offset === 0) {
|
|
65
|
+
items = [item, ...items].slice(0, PAGE_SIZE);
|
|
66
|
+
total += 1;
|
|
67
|
+
} else {
|
|
68
|
+
offset = 0;
|
|
69
|
+
}
|
|
70
|
+
} catch (e) {
|
|
71
|
+
error = e instanceof Error ? e.message : 'Upload failed';
|
|
72
|
+
} finally {
|
|
73
|
+
uploading = false;
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
const onPickerChange = () => {
|
|
78
|
+
const files = fileInputEl?.files;
|
|
79
|
+
if (!files) return;
|
|
80
|
+
for (const f of files) void upload(f);
|
|
81
|
+
if (fileInputEl) fileInputEl.value = '';
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
const remove = async (item: MediaItem) => {
|
|
85
|
+
try {
|
|
86
|
+
await cmsStore.deleteMedia(endpoint, item.id);
|
|
87
|
+
items = items.filter((i) => i.id !== item.id);
|
|
88
|
+
total = Math.max(0, total - 1);
|
|
89
|
+
} catch (e) {
|
|
90
|
+
error = e instanceof Error ? e.message : 'Delete failed';
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
const copyUrl = async (item: MediaItem) => {
|
|
95
|
+
try {
|
|
96
|
+
await navigator.clipboard.writeText(item.url);
|
|
97
|
+
copiedId = item.id;
|
|
98
|
+
setTimeout(() => {
|
|
99
|
+
if (copiedId === item.id) copiedId = null;
|
|
100
|
+
}, 1500);
|
|
101
|
+
} catch {
|
|
102
|
+
// clipboard may be unavailable; ignore silently
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
const onDragEnter = (e: DragEvent) => {
|
|
107
|
+
if (!e.dataTransfer?.types.includes('Files')) return;
|
|
108
|
+
e.preventDefault();
|
|
109
|
+
dragDepth++;
|
|
110
|
+
};
|
|
111
|
+
const onDragOver = (e: DragEvent) => {
|
|
112
|
+
if (!e.dataTransfer?.types.includes('Files')) return;
|
|
113
|
+
e.preventDefault();
|
|
114
|
+
if (e.dataTransfer) e.dataTransfer.dropEffect = 'copy';
|
|
115
|
+
};
|
|
116
|
+
const onDragLeave = (e: DragEvent) => {
|
|
117
|
+
e.preventDefault();
|
|
118
|
+
dragDepth = Math.max(0, dragDepth - 1);
|
|
119
|
+
};
|
|
120
|
+
const onDrop = (e: DragEvent) => {
|
|
121
|
+
e.preventDefault();
|
|
122
|
+
dragDepth = 0;
|
|
123
|
+
const files = e.dataTransfer?.files;
|
|
124
|
+
if (!files) return;
|
|
125
|
+
for (const f of files) void upload(f);
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
const rangeLabel = $derived.by(() => {
|
|
129
|
+
if (total === 0) return '0 of 0';
|
|
130
|
+
const start = offset + 1;
|
|
131
|
+
const end = Math.min(offset + items.length, total);
|
|
132
|
+
return `${start}–${end} of ${total}`;
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
const canPrev = $derived(offset > 0);
|
|
136
|
+
const canNext = $derived(offset + items.length < total);
|
|
137
|
+
|
|
138
|
+
const formatSize = (bytes: number): string => {
|
|
139
|
+
if (bytes < 1024) return `${bytes} B`;
|
|
140
|
+
if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;
|
|
141
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
|
|
142
|
+
};
|
|
143
|
+
</script>
|
|
144
|
+
|
|
145
|
+
<Panel ariaLabel="Media Library" {onClose}>
|
|
146
|
+
<PanelHeader title="Media Library" {onClose} />
|
|
147
|
+
|
|
148
|
+
<div
|
|
149
|
+
class="vela:relative vela:flex vela:flex-col vela:gap-3 vela:px-4 vela:pb-3 vela:overflow-y-auto"
|
|
150
|
+
class:dragging
|
|
151
|
+
ondragenter={onDragEnter}
|
|
152
|
+
ondragover={onDragOver}
|
|
153
|
+
ondragleave={onDragLeave}
|
|
154
|
+
ondrop={onDrop}
|
|
155
|
+
role="region"
|
|
156
|
+
aria-label="Media uploads"
|
|
157
|
+
>
|
|
158
|
+
<div class="vela:flex vela:items-center vela:gap-2">
|
|
159
|
+
<Button size="sm" variant="default" onclick={() => fileInputEl?.click()}>
|
|
160
|
+
<UploadIcon class="vela:size-3.5" />
|
|
161
|
+
Upload
|
|
162
|
+
</Button>
|
|
163
|
+
<span class="vela:text-[12px] vela:text-bar-text-tertiary">
|
|
164
|
+
or drag & drop images here
|
|
165
|
+
</span>
|
|
166
|
+
</div>
|
|
167
|
+
|
|
168
|
+
<input
|
|
169
|
+
bind:this={fileInputEl}
|
|
170
|
+
type="file"
|
|
171
|
+
accept="image/*"
|
|
172
|
+
multiple
|
|
173
|
+
hidden
|
|
174
|
+
onchange={onPickerChange}
|
|
175
|
+
/>
|
|
176
|
+
|
|
177
|
+
{#if error}
|
|
178
|
+
<div
|
|
179
|
+
class="vela:flex vela:items-center vela:gap-2 vela:px-2.5 vela:py-1.5 vela:rounded-md vela:text-[12px]"
|
|
180
|
+
style:background="var(--cms-status-error-bg-hover)"
|
|
181
|
+
style:color="var(--cms-status-error-text-base)"
|
|
182
|
+
role="alert"
|
|
183
|
+
>
|
|
184
|
+
<AlertIcon class="vela:size-3.5" />
|
|
185
|
+
<span>{error}</span>
|
|
186
|
+
</div>
|
|
187
|
+
{/if}
|
|
188
|
+
|
|
189
|
+
{#if loading && items.length === 0}
|
|
190
|
+
<div
|
|
191
|
+
class="vela:flex vela:items-center vela:justify-center vela:py-12 vela:text-bar-text-tertiary"
|
|
192
|
+
>
|
|
193
|
+
<LoaderIcon class="vela:size-5 vela:animate-spin" />
|
|
194
|
+
</div>
|
|
195
|
+
{:else if items.length === 0}
|
|
196
|
+
<div
|
|
197
|
+
class="vela:flex vela:flex-col vela:items-center vela:justify-center vela:py-12 vela:text-[13px] vela:text-bar-text-tertiary"
|
|
198
|
+
>
|
|
199
|
+
<UploadIcon class="vela:size-6 vela:mb-2 vela:opacity-50" />
|
|
200
|
+
<span>No media yet — upload an image to get started.</span>
|
|
201
|
+
</div>
|
|
202
|
+
{:else}
|
|
203
|
+
<div class="vela:grid vela:grid-cols-3 vela:sm:grid-cols-4 vela:gap-2">
|
|
204
|
+
{#each items as item (item.id)}
|
|
205
|
+
<div
|
|
206
|
+
class="vela:relative vela:group vela:aspect-square vela:rounded-md vela:overflow-hidden vela:bg-[var(--cms-bar-bg-hover)]"
|
|
207
|
+
>
|
|
208
|
+
<button
|
|
209
|
+
type="button"
|
|
210
|
+
class="vela:block vela:size-full vela:cursor-pointer vela:bg-transparent vela:border-0 vela:p-0"
|
|
211
|
+
title={`${item.originalName} · ${formatSize(item.size)} — click to copy URL`}
|
|
212
|
+
onclick={() => copyUrl(item)}
|
|
213
|
+
>
|
|
214
|
+
<img
|
|
215
|
+
src={item.url}
|
|
216
|
+
alt={item.originalName}
|
|
217
|
+
loading="lazy"
|
|
218
|
+
class="vela:size-full vela:object-cover"
|
|
219
|
+
/>
|
|
220
|
+
</button>
|
|
221
|
+
<button
|
|
222
|
+
type="button"
|
|
223
|
+
class="vela:absolute vela:top-1 vela:right-1 vela:size-6 vela:rounded vela:bg-black/60 vela:text-white vela:flex vela:items-center vela:justify-center vela:cursor-pointer vela:opacity-0 vela:group-hover:opacity-100 vela:transition-opacity"
|
|
224
|
+
aria-label={`Delete ${item.originalName}`}
|
|
225
|
+
onclick={() => remove(item)}
|
|
226
|
+
>
|
|
227
|
+
<TrashIcon class="vela:size-3.5" />
|
|
228
|
+
</button>
|
|
229
|
+
{#if copiedId === item.id}
|
|
230
|
+
<div
|
|
231
|
+
class="vela:absolute vela:inset-0 vela:flex vela:items-center vela:justify-center vela:bg-black/55 vela:text-white vela:text-[12px] vela:font-medium vela:gap-1"
|
|
232
|
+
>
|
|
233
|
+
<CheckIcon class="vela:size-4" />
|
|
234
|
+
Copied
|
|
235
|
+
</div>
|
|
236
|
+
{/if}
|
|
237
|
+
</div>
|
|
238
|
+
{/each}
|
|
239
|
+
</div>
|
|
240
|
+
{/if}
|
|
241
|
+
|
|
242
|
+
{#if uploading}
|
|
243
|
+
<div
|
|
244
|
+
class="vela:absolute vela:inset-0 vela:flex vela:items-center vela:justify-center vela:bg-black/35 vela:pointer-events-none"
|
|
245
|
+
>
|
|
246
|
+
<LoaderIcon class="vela:size-6 vela:animate-spin vela:text-white" />
|
|
247
|
+
</div>
|
|
248
|
+
{/if}
|
|
249
|
+
|
|
250
|
+
{#if dragging}
|
|
251
|
+
<div
|
|
252
|
+
class="vela:absolute vela:inset-0 vela:flex vela:flex-col vela:items-center vela:justify-center vela:gap-2 vela:text-white vela:font-semibold vela:pointer-events-none"
|
|
253
|
+
style:background="rgba(83, 74, 183, 0.85)"
|
|
254
|
+
>
|
|
255
|
+
<UploadIcon class="vela:size-6" />
|
|
256
|
+
<span>Drop to upload</span>
|
|
257
|
+
</div>
|
|
258
|
+
{/if}
|
|
259
|
+
</div>
|
|
260
|
+
|
|
261
|
+
<PanelFooter>
|
|
262
|
+
<span>{rangeLabel}</span>
|
|
263
|
+
<div class="vela:flex vela:items-center vela:gap-1">
|
|
264
|
+
<Button
|
|
265
|
+
size="xs"
|
|
266
|
+
variant="ghost"
|
|
267
|
+
disabled={!canPrev}
|
|
268
|
+
onclick={() => (offset = Math.max(0, offset - PAGE_SIZE))}
|
|
269
|
+
>
|
|
270
|
+
Prev
|
|
271
|
+
</Button>
|
|
272
|
+
<Button
|
|
273
|
+
size="xs"
|
|
274
|
+
variant="ghost"
|
|
275
|
+
disabled={!canNext}
|
|
276
|
+
onclick={() => (offset = offset + PAGE_SIZE)}
|
|
277
|
+
>
|
|
278
|
+
Next
|
|
279
|
+
</Button>
|
|
280
|
+
</div>
|
|
281
|
+
</PanelFooter>
|
|
282
|
+
</Panel>
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import ChevronRightIcon from './icons/chevron-right.svelte';
|
|
3
|
+
import type { CmsCreatablePageConfigWithRouteId } from './page-config.js';
|
|
4
|
+
import { resolveRouteOnlyParams } from './resolve-route.js';
|
|
5
|
+
import { Button } from './ui/button/index.js';
|
|
6
|
+
import * as Dialog from './ui/dialog/index.js';
|
|
7
|
+
|
|
8
|
+
type Props = {
|
|
9
|
+
open: boolean;
|
|
10
|
+
onOpenChange: (open: boolean) => void;
|
|
11
|
+
creatablePages: CmsCreatablePageConfigWithRouteId[];
|
|
12
|
+
onSelect: (config: CmsCreatablePageConfigWithRouteId) => void;
|
|
13
|
+
};
|
|
14
|
+
let { open, onOpenChange, creatablePages, onSelect }: Props = $props();
|
|
15
|
+
</script>
|
|
16
|
+
|
|
17
|
+
<Dialog.Root {open} {onOpenChange}>
|
|
18
|
+
<Dialog.Content showCloseButton={false} class="vela:max-w-[28rem]">
|
|
19
|
+
<Dialog.Header>
|
|
20
|
+
<Dialog.Title>New page</Dialog.Title>
|
|
21
|
+
<Dialog.Description>Choose a template.</Dialog.Description>
|
|
22
|
+
</Dialog.Header>
|
|
23
|
+
|
|
24
|
+
<ul class="vela:list-none vela:m-0 vela:px-3 vela:pb-2 vela:flex vela:flex-col vela:gap-1">
|
|
25
|
+
{#each creatablePages as cfg (cfg.routeId)}
|
|
26
|
+
<li>
|
|
27
|
+
<button
|
|
28
|
+
type="button"
|
|
29
|
+
onclick={() => onSelect(cfg)}
|
|
30
|
+
class="vela:group vela:flex vela:items-center vela:gap-3 vela:w-full vela:px-3 vela:py-2.5 vela:rounded-md
|
|
31
|
+
vela:text-left vela:cursor-pointer vela:focus:outline-none
|
|
32
|
+
vela:hover:bg-[var(--cms-bar-bg-hover)] vela:focus-visible:bg-[var(--cms-bar-bg-hover)]"
|
|
33
|
+
>
|
|
34
|
+
<div class="vela:flex vela:flex-col vela:min-w-0 vela:flex-1">
|
|
35
|
+
<span class="vela:text-[13px] vela:font-medium vela:text-bar-text vela:capitalize">
|
|
36
|
+
{cfg.type}
|
|
37
|
+
</span>
|
|
38
|
+
<span
|
|
39
|
+
class="vela:font-mono vela:text-[12px] vela:text-bar-text-secondary vela:truncate"
|
|
40
|
+
>
|
|
41
|
+
{resolveRouteOnlyParams(cfg.routeId)}
|
|
42
|
+
</span>
|
|
43
|
+
</div>
|
|
44
|
+
<ChevronRightIcon
|
|
45
|
+
class="vela:size-4 vela:text-bar-text-tertiary vela:group-hover:text-bar-text"
|
|
46
|
+
/>
|
|
47
|
+
</button>
|
|
48
|
+
</li>
|
|
49
|
+
{/each}
|
|
50
|
+
</ul>
|
|
51
|
+
|
|
52
|
+
<Dialog.Footer class="vela:justify-end vela:pt-3">
|
|
53
|
+
<Button variant="ghost" onclick={() => onOpenChange(false)}>Cancel</Button>
|
|
54
|
+
</Dialog.Footer>
|
|
55
|
+
</Dialog.Content>
|
|
56
|
+
</Dialog.Root>
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { CmsCreatablePageConfigWithRouteId } from './page-config.js';
|
|
2
|
+
type Props = {
|
|
3
|
+
open: boolean;
|
|
4
|
+
onOpenChange: (open: boolean) => void;
|
|
5
|
+
creatablePages: CmsCreatablePageConfigWithRouteId[];
|
|
6
|
+
onSelect: (config: CmsCreatablePageConfigWithRouteId) => void;
|
|
7
|
+
};
|
|
8
|
+
declare const NewPageChooserDialog: import("svelte").Component<Props, {}, "">;
|
|
9
|
+
type NewPageChooserDialog = ReturnType<typeof NewPageChooserDialog>;
|
|
10
|
+
export default NewPageChooserDialog;
|