includio-cms 0.25.0 → 0.27.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/API.md +97 -4
- package/CHANGELOG.md +118 -0
- package/DOCS.md +1 -1
- package/README.md +2 -0
- package/ROADMAP.md +14 -0
- package/dist/admin/auth-client.d.ts +42 -42
- package/dist/admin/client/account/lang.d.ts +1 -0
- package/dist/admin/client/account/lang.js +4 -2
- package/dist/admin/client/account/profile-section.svelte +2 -2
- package/dist/admin/client/account/security-section.svelte +27 -4
- package/dist/admin/client/account/sessions-section.svelte +1 -1
- package/dist/admin/client/admin/admin-after-login-layout-content.svelte +1 -1
- package/dist/admin/client/admin/admin-layout.svelte +12 -2
- package/dist/admin/client/admin/admin-layout.svelte.d.ts +2 -1
- package/dist/admin/client/admin/dashboard-page.svelte +34 -10
- package/dist/admin/client/collection/bulk-actions-bar.svelte +86 -44
- package/dist/admin/client/collection/bulk-actions-bar.svelte.d.ts +3 -1
- package/dist/admin/client/collection/collection-entries.svelte +52 -36
- package/dist/admin/client/collection/collection-entries.svelte.d.ts +3 -0
- package/dist/admin/client/collection/collection.svelte +28 -14
- package/dist/admin/client/collection/collection.svelte.d.ts +3 -0
- package/dist/admin/client/collection/data-table.svelte +240 -130
- package/dist/admin/client/collection/data-table.svelte.d.ts +9 -0
- package/dist/admin/client/collection/date-cell.svelte +4 -4
- package/dist/admin/client/collection/row-actions.svelte +2 -1
- package/dist/admin/client/collection/sortable-header.svelte +33 -9
- package/dist/admin/client/collection/state-display.svelte +102 -0
- package/dist/admin/client/collection/state-display.svelte.d.ts +12 -0
- package/dist/admin/client/collection/status-badge.svelte +99 -11
- package/dist/admin/client/collection/status-badge.svelte.d.ts +15 -1
- package/dist/admin/client/collection/table-pagination.svelte +21 -6
- package/dist/admin/client/collection/table-toolbar.svelte +105 -80
- package/dist/admin/client/collection/table-toolbar.svelte.d.ts +11 -8
- package/dist/admin/client/entry/entry-form.svelte +36 -11
- package/dist/admin/client/entry/entry-form.svelte.d.ts +1 -0
- package/dist/admin/client/entry/entry-header.svelte +22 -15
- package/dist/admin/client/entry/entry-header.svelte.d.ts +1 -0
- package/dist/admin/client/entry/entry.svelte +269 -165
- package/dist/admin/client/entry/header/a11y-header-badge.svelte +47 -0
- package/dist/admin/client/entry/header/a11y-header-badge.svelte.d.ts +8 -0
- package/dist/admin/client/entry/header/publish-panel.svelte +69 -13
- package/dist/admin/client/entry/header/save-indicator.svelte +57 -28
- package/dist/admin/client/entry/header/save-indicator.svelte.d.ts +1 -0
- package/dist/admin/client/entry/header/status-badge.svelte +60 -15
- package/dist/admin/client/entry/header/status-badge.svelte.d.ts +1 -2
- package/dist/admin/client/entry/header/version-history-sheet.svelte +1 -1
- package/dist/admin/client/entry/hybrid/hybrid-layout.svelte +74 -23
- package/dist/admin/client/entry/hybrid/hybrid-preview.svelte +1 -1
- package/dist/admin/client/entry/utils.d.ts +14 -0
- package/dist/admin/client/entry/utils.js +28 -0
- package/dist/admin/client/form/form-submission/form-submission.svelte +2 -2
- package/dist/admin/client/form/form-submissions.svelte +143 -194
- package/dist/admin/client/form/form-submissions.svelte.d.ts +2 -0
- package/dist/admin/client/login/lang.d.ts +3 -0
- package/dist/admin/client/login/lang.js +10 -4
- package/dist/admin/client/login/login-form.svelte +8 -1
- package/dist/admin/client/login/reset-password-page.svelte +24 -3
- package/dist/admin/client/login/schema.d.ts +14 -2
- package/dist/admin/client/login/schema.js +19 -8
- package/dist/admin/client/maintenance/maintenance-page.svelte +16 -17
- package/dist/admin/client/media/media-page.svelte +1 -1
- package/dist/admin/client/shop/coupon-edit-page.svelte +117 -13
- package/dist/admin/client/shop/coupon-form.svelte +282 -138
- package/dist/admin/client/shop/coupon-form.svelte.d.ts +1 -9
- package/dist/admin/client/shop/coupon-new-page.svelte +40 -10
- package/dist/admin/client/shop/coupon-new-page.svelte.d.ts +2 -17
- package/dist/admin/client/shop/coupon-schema.d.ts +28 -0
- package/dist/admin/client/shop/coupon-schema.js +53 -0
- package/dist/admin/client/shop/coupons-list-page.svelte +262 -118
- package/dist/admin/client/shop/coupons-list-page.svelte.d.ts +16 -1
- package/dist/admin/client/shop/refund-dialog.svelte +37 -1
- package/dist/admin/client/shop/refund-dialog.svelte.d.ts +3 -0
- package/dist/admin/client/shop/shipping-method-edit-page.svelte +108 -59
- package/dist/admin/client/shop/shipping-method-form.svelte +36 -9
- package/dist/admin/client/shop/shipping-method-new-page.svelte +44 -13
- package/dist/admin/client/shop/shipping-methods-list-page.svelte +101 -59
- package/dist/admin/client/shop/shop-order-detail-page.svelte +220 -84
- package/dist/admin/client/shop/shop-orders-list-page.svelte +302 -152
- package/dist/admin/client/shop/shop-orders-list-page.svelte.d.ts +18 -1
- package/dist/admin/client/shop/shop-products-list-page.svelte +355 -118
- package/dist/admin/client/shop/shop-products-list-page.svelte.d.ts +19 -1
- package/dist/admin/client/users/accept-invite-page.svelte +24 -3
- package/dist/admin/client/users/create-user-dialog.svelte +3 -8
- package/dist/admin/client/users/lang.d.ts +2 -0
- package/dist/admin/client/users/lang.js +4 -0
- package/dist/admin/client/users/pending-invitations.svelte +2 -9
- package/dist/admin/client/users/user-name-cell.svelte +20 -0
- package/dist/admin/client/users/user-name-cell.svelte.d.ts +9 -0
- package/dist/admin/client/users/user-role-badge.svelte +16 -0
- package/dist/admin/client/users/user-role-badge.svelte.d.ts +7 -0
- package/dist/admin/client/users/user-row-actions.svelte +72 -0
- package/dist/admin/client/users/user-row-actions.svelte.d.ts +20 -0
- package/dist/admin/client/users/user-sessions-sheet.svelte +2 -11
- package/dist/admin/client/users/users-page.svelte +283 -497
- package/dist/admin/client/users/users-page.svelte.d.ts +12 -1
- package/dist/admin/components/dashboard/form-submissions-widget.svelte +59 -74
- package/dist/admin/components/dashboard/recent-activity.svelte +17 -5
- package/dist/admin/components/dashboard/recent-entries.svelte +19 -7
- package/dist/admin/components/dialogs/confirmation-dialog.svelte +105 -0
- package/dist/admin/components/dialogs/confirmation-dialog.svelte.d.ts +13 -0
- package/dist/admin/components/fields/block-picker-modal.svelte +6 -0
- package/dist/admin/components/fields/blocks-field.svelte +46 -1
- package/dist/admin/components/fields/boolean-field.svelte +1 -1
- package/dist/admin/components/fields/field-renderer.svelte +29 -22
- package/dist/admin/components/fields/file-field.svelte +344 -30
- package/dist/admin/components/fields/icon-field.svelte +86 -0
- package/dist/admin/components/fields/icon-field.svelte.d.ts +8 -0
- package/dist/admin/components/fields/icon-picker-dialog.svelte +174 -0
- package/dist/admin/components/fields/icon-picker-dialog.svelte.d.ts +11 -0
- package/dist/admin/components/fields/media-field.svelte +16 -2
- package/dist/admin/components/fields/object-field.svelte +27 -7
- package/dist/admin/components/fields/radio-field.svelte +22 -0
- package/dist/admin/components/fields/relation-field.svelte +123 -97
- package/dist/admin/components/fields/relation-picker-dialog.svelte +2 -2
- package/dist/admin/components/fields/seo-field.svelte +60 -30
- package/dist/admin/components/fields/shop-field.svelte +219 -24
- package/dist/admin/components/fields/simple-array-field.svelte +321 -151
- package/dist/admin/components/fields/simple-array-field.svelte.d.ts +3 -0
- package/dist/admin/components/fields/slug-field.svelte +146 -21
- package/dist/admin/components/fields/text-field-wrapper.svelte +37 -20
- package/dist/admin/components/fields/text-field.svelte +7 -2
- package/dist/admin/components/fields/url-field-wrapper.svelte +10 -0
- package/dist/admin/components/fields/url-field.svelte +36 -23
- package/dist/admin/components/forms/form-error-summary.svelte +143 -0
- package/dist/admin/components/forms/form-error-summary.svelte.d.ts +27 -0
- package/dist/admin/components/layout/app-sidebar.svelte +7 -2
- package/dist/admin/components/layout/detail-page-shell.svelte +71 -0
- package/dist/admin/components/layout/detail-page-shell.svelte.d.ts +24 -0
- package/dist/admin/components/layout/lang.d.ts +5 -0
- package/dist/admin/components/layout/lang.js +10 -0
- package/dist/admin/components/layout/layout-renderer.svelte +71 -2
- package/dist/admin/components/layout/layout-renderer.svelte.d.ts +1 -0
- package/dist/admin/components/layout/layout-tabs.svelte +173 -0
- package/dist/admin/components/layout/layout-tabs.svelte.d.ts +24 -0
- package/dist/admin/components/layout/nav-breadcrumbs.svelte +25 -7
- package/dist/admin/components/layout/nav-collections.svelte +23 -36
- package/dist/admin/components/layout/nav-forms.svelte +19 -35
- package/dist/admin/components/layout/nav-main.svelte +3 -28
- package/dist/admin/components/layout/nav-search.svelte +70 -2
- package/dist/admin/components/layout/nav-section.svelte +77 -0
- package/dist/admin/components/layout/nav-section.svelte.d.ts +22 -0
- package/dist/admin/components/layout/nav-shop.svelte +3 -27
- package/dist/admin/components/layout/nav-singletons.svelte +16 -28
- package/dist/admin/components/layout/page-header.stories.svelte +93 -0
- package/dist/admin/components/layout/page-header.stories.svelte.d.ts +27 -0
- package/dist/admin/components/layout/page-header.svelte +68 -0
- package/dist/admin/components/layout/page-header.svelte.d.ts +17 -0
- package/dist/admin/components/layout/site-header.svelte +9 -0
- package/dist/admin/components/layout/site-header.svelte.d.ts +2 -17
- package/dist/admin/components/media/file/file-name-input.svelte +6 -2
- package/dist/admin/components/media/file/file-preview.svelte +130 -17
- package/dist/admin/components/media/file-upload.svelte +16 -7
- package/dist/admin/components/media/file-upload.svelte.d.ts +1 -0
- package/dist/admin/components/media/files-list.svelte +153 -53
- package/dist/admin/components/media/files-list.svelte.d.ts +1 -0
- package/dist/admin/components/media/media-library.svelte +577 -198
- package/dist/admin/components/media/media-library.svelte.d.ts +4 -0
- package/dist/admin/components/media/media-selector.svelte +4 -2
- package/dist/admin/components/media/media-selector.svelte.d.ts +1 -0
- package/dist/admin/components/media/tag-sidebar.svelte +4 -4
- package/dist/admin/components/tiptap/FigureNodeView.svelte +10 -0
- package/dist/admin/components/tiptap/bubble-menu.svelte +104 -0
- package/dist/admin/components/tiptap/bubble-menu.svelte.d.ts +19 -0
- package/dist/admin/components/tiptap/content-editor.svelte +28 -24
- package/dist/admin/components/tiptap/editor-toolbar.svelte +7 -7
- package/dist/admin/components/tiptap/extensions.js +5 -1
- package/dist/admin/components/tiptap/image-dialog.svelte +5 -1
- package/dist/admin/components/tiptap/link-dialog.svelte +2 -0
- package/dist/admin/components/tiptap/tiptap-editor.svelte +18 -20
- package/dist/admin/components/tiptap/video-dialog.svelte +1 -1
- package/dist/admin/components/variant-form/VariantAttributeRenderer.svelte +109 -0
- package/dist/admin/components/variant-form/VariantAttributeRenderer.svelte.d.ts +9 -0
- package/dist/admin/helpers/build-icon-set-map.d.ts +8 -0
- package/dist/admin/helpers/build-icon-set-map.js +16 -0
- package/dist/admin/helpers/index.d.ts +2 -0
- package/dist/admin/helpers/index.js +2 -0
- package/dist/admin/i18n/errors.d.ts +140 -0
- package/dist/admin/i18n/errors.js +151 -0
- package/dist/admin/remote/entry.remote.d.ts +59 -4
- package/dist/admin/remote/entry.remote.js +239 -62
- package/dist/admin/remote/shop.remote.d.ts +87 -48
- package/dist/admin/remote/shop.remote.js +70 -8
- package/dist/admin/shared/password-generate.d.ts +6 -0
- package/dist/admin/shared/password-generate.js +40 -0
- package/dist/admin/shared/password-schema.d.ts +6 -0
- package/dist/admin/shared/password-schema.js +10 -3
- package/dist/admin/state/icon-sets.svelte.d.ts +9 -0
- package/dist/admin/state/icon-sets.svelte.js +20 -0
- package/dist/admin/styles/admin.css +23 -6
- package/dist/admin/styles/tokens.md +244 -0
- package/dist/admin/utils/accordionActivation.d.ts +13 -0
- package/dist/admin/utils/accordionActivation.js +35 -0
- package/dist/admin/utils/entryLabel.d.ts +23 -0
- package/dist/admin/utils/entryLabel.js +51 -12
- package/dist/admin/utils/field-a11y.d.ts +29 -0
- package/dist/admin/utils/field-a11y.js +23 -0
- package/dist/admin/utils/fieldPathElement.d.ts +9 -0
- package/dist/admin/utils/fieldPathElement.js +18 -0
- package/dist/admin/utils/fileDisplay.d.ts +10 -0
- package/dist/admin/utils/fileDisplay.js +26 -0
- package/dist/admin/utils/flattenFormErrors.d.ts +19 -0
- package/dist/admin/utils/flattenFormErrors.js +102 -0
- package/dist/admin/utils/formatters.d.ts +12 -0
- package/dist/admin/utils/{formatDate.js → formatters.js} +23 -2
- package/dist/admin/utils/scrollWithin.d.ts +9 -0
- package/dist/admin/utils/scrollWithin.js +32 -0
- package/dist/admin/utils/tabActivation.d.ts +12 -0
- package/dist/admin/utils/tabActivation.js +24 -0
- package/dist/cli/scaffold/admin.js +2 -2
- package/dist/cms/runtime/schema.d.ts +1 -0
- package/dist/cms/runtime/schema.js +1 -0
- package/dist/cms/runtime/types.d.ts +80 -7
- package/dist/components/ui/accordion/accordion-content.svelte +17 -3
- package/dist/components/ui/accordion/accordion.stories.svelte +21 -1
- package/dist/components/ui/alert/alert.stories.svelte +14 -0
- package/dist/components/ui/alert-dialog/alert-dialog.stories.svelte +45 -0
- package/dist/components/ui/alert-dialog/alert-dialog.stories.svelte.d.ts +27 -0
- package/dist/components/ui/avatar/avatar.stories.svelte +27 -0
- package/dist/components/ui/badge/badge.stories.svelte +15 -0
- package/dist/components/ui/breadcrumb/breadcrumb.stories.svelte +47 -0
- package/dist/components/ui/breadcrumb/breadcrumb.svelte +1 -1
- package/dist/components/ui/button/button.stories.svelte +53 -6
- package/dist/components/ui/button/button.svelte +39 -5
- package/dist/components/ui/button/button.svelte.d.ts +4 -0
- package/dist/components/ui/button-group/button-group.stories.svelte +44 -0
- package/dist/components/ui/button-group/button-group.stories.svelte.d.ts +27 -0
- package/dist/components/ui/calendar/calendar.stories.svelte +36 -0
- package/dist/components/ui/calendar/calendar.stories.svelte.d.ts +27 -0
- package/dist/components/ui/card/card.stories.svelte +7 -0
- package/dist/components/ui/carousel/carousel.stories.svelte +43 -0
- package/dist/components/ui/carousel/carousel.stories.svelte.d.ts +27 -0
- package/dist/components/ui/checkbox/checkbox.stories.svelte +67 -0
- package/dist/components/ui/checkbox/checkbox.stories.svelte.d.ts +27 -0
- package/dist/components/ui/checkbox/checkbox.svelte +1 -1
- package/dist/components/ui/command/command.stories.svelte +18 -0
- package/dist/components/ui/data-table/data-table.stories.svelte +61 -0
- package/dist/components/ui/data-table/data-table.stories.svelte.d.ts +18 -0
- package/dist/components/ui/dialog/dialog-content.svelte +5 -0
- package/dist/components/ui/dialog/dialog-content.svelte.d.ts +2 -0
- package/dist/components/ui/dialog/dialog.stories.svelte +35 -0
- package/dist/components/ui/dropdown-menu/dropdown-menu.stories.svelte +74 -0
- package/dist/components/ui/dropdown-menu/dropdown-menu.stories.svelte.d.ts +27 -0
- package/dist/components/ui/field/field-context.svelte.d.ts +22 -0
- package/dist/components/ui/field/field-context.svelte.js +9 -0
- package/dist/components/ui/field/field-control.svelte +18 -0
- package/dist/components/ui/field/field-control.svelte.d.ts +8 -0
- package/dist/components/ui/field/field-description.svelte +12 -0
- package/dist/components/ui/field/field-error.svelte +14 -6
- package/dist/components/ui/field/field-label.svelte +10 -0
- package/dist/components/ui/field/field.stories.svelte +95 -9
- package/dist/components/ui/field/field.svelte +57 -0
- package/dist/components/ui/field/field.svelte.d.ts +2 -0
- package/dist/components/ui/field/index.d.ts +3 -1
- package/dist/components/ui/field/index.js +4 -2
- package/dist/components/ui/form/form-field-errors.svelte +1 -1
- package/dist/components/ui/form/form.stories.svelte +25 -0
- package/dist/components/ui/form/form.stories.svelte.d.ts +26 -0
- package/dist/components/ui/input/input.stories.svelte +26 -0
- package/dist/components/ui/input-group/input-group-input.svelte.d.ts +1 -1
- package/dist/components/ui/input-group/input-group.stories.svelte +43 -0
- package/dist/components/ui/input-group/input-group.stories.svelte.d.ts +27 -0
- package/dist/components/ui/item/item.stories.svelte +61 -0
- package/dist/components/ui/item/item.stories.svelte.d.ts +27 -0
- package/dist/components/ui/label/label.stories.svelte +7 -0
- package/dist/components/ui/live-region/index.d.ts +1 -0
- package/dist/components/ui/live-region/index.js +1 -0
- package/dist/components/ui/live-region/live-region-demo.svelte +32 -0
- package/dist/components/ui/live-region/live-region-demo.svelte.d.ts +7 -0
- package/dist/components/ui/live-region/live-region.stories.svelte +23 -0
- package/dist/components/ui/live-region/live-region.stories.svelte.d.ts +26 -0
- package/dist/components/ui/live-region/live-region.svelte +12 -0
- package/dist/components/ui/live-region/live-region.svelte.d.ts +8 -0
- package/dist/components/ui/popover/popover.stories.svelte +34 -0
- package/dist/components/ui/radio-group/radio-group.stories.svelte +58 -0
- package/dist/components/ui/radio-group/radio-group.stories.svelte.d.ts +27 -0
- package/dist/components/ui/resizable/resizable.stories.svelte +56 -0
- package/dist/components/ui/resizable/resizable.stories.svelte.d.ts +27 -0
- package/dist/components/ui/select/select.stories.svelte +49 -0
- package/dist/components/ui/separator/separator.stories.svelte +18 -0
- package/dist/components/ui/sheet/sheet.stories.svelte +34 -0
- package/dist/components/ui/sidebar/sidebar-input.svelte.d.ts +1 -1
- package/dist/components/ui/sidebar/sidebar-menu-button.svelte +1 -0
- package/dist/components/ui/sidebar/sidebar-trigger.svelte +1 -1
- package/dist/components/ui/sidebar/sidebar.stories.svelte +72 -0
- package/dist/components/ui/sidebar/sidebar.stories.svelte.d.ts +27 -0
- package/dist/components/ui/skeleton/skeleton.stories.svelte +39 -0
- package/dist/components/ui/skeleton/skeleton.stories.svelte.d.ts +27 -0
- package/dist/components/ui/skeleton/skeleton.svelte +6 -0
- package/dist/components/ui/sonner/index.d.ts +1 -1
- package/dist/components/ui/sonner/index.js +1 -1
- package/dist/components/ui/sonner/sonner.stories.svelte +7 -0
- package/dist/components/ui/sonner/sonner.svelte +17 -1
- package/dist/components/ui/sonner/sonner.svelte.d.ts +6 -0
- package/dist/components/ui/spinner/spinner.stories.svelte +30 -0
- package/dist/components/ui/spinner/spinner.stories.svelte.d.ts +27 -0
- package/dist/components/ui/switch/switch.stories.svelte +56 -0
- package/dist/components/ui/switch/switch.stories.svelte.d.ts +27 -0
- package/dist/components/ui/table/table-cell.svelte +1 -1
- package/dist/components/ui/table/table-head.svelte +1 -1
- package/dist/components/ui/table/table.stories.svelte +68 -0
- package/dist/components/ui/table/table.stories.svelte.d.ts +27 -0
- package/dist/components/ui/table/table.svelte +1 -1
- package/dist/components/ui/tabs/tabs.stories.svelte +48 -0
- package/dist/components/ui/tabs/tabs.stories.svelte.d.ts +27 -0
- package/dist/components/ui/textarea/textarea.stories.svelte +21 -0
- package/dist/components/ui/toggle/toggle.stories.svelte +23 -0
- package/dist/components/ui/toggle-group/toggle-group.stories.svelte +43 -0
- package/dist/components/ui/tooltip/tooltip.stories.svelte +46 -6
- package/dist/core/cms.d.ts +11 -2
- package/dist/core/cms.js +29 -0
- package/dist/core/fields/fieldSchemaToTs.d.ts +7 -0
- package/dist/core/fields/fieldSchemaToTs.js +241 -90
- package/dist/core/fields/layoutUtils.d.ts +4 -1
- package/dist/core/fields/layoutUtils.js +41 -4
- package/dist/core/fields/resolveSeo.d.ts +70 -0
- package/dist/core/fields/resolveSeo.js +88 -0
- package/dist/core/fields/seoFieldDescriptor.d.ts +43 -0
- package/dist/core/fields/seoFieldDescriptor.js +74 -0
- package/dist/core/fields/slugPath.d.ts +13 -0
- package/dist/core/fields/slugPath.js +32 -0
- package/dist/core/fields/urlUtils.d.ts +8 -0
- package/dist/core/fields/urlUtils.js +27 -0
- package/dist/core/index.d.ts +1 -0
- package/dist/core/index.js +1 -0
- package/dist/core/server/entries/operations/create.js +13 -0
- package/dist/core/server/entries/operations/get.d.ts +7 -0
- package/dist/core/server/entries/operations/get.js +10 -6
- package/dist/core/server/entries/operations/slugUniqueness.d.ts +37 -0
- package/dist/core/server/entries/operations/slugUniqueness.js +116 -0
- package/dist/core/server/entries/operations/update.d.ts +6 -1
- package/dist/core/server/entries/operations/update.js +24 -1
- package/dist/core/server/fields/slugResolver.d.ts +3 -13
- package/dist/core/server/fields/slugResolver.js +8 -37
- package/dist/core/server/generator/fields.d.ts +2 -0
- package/dist/core/server/generator/fields.js +44 -18
- package/dist/core/server/generator/formFields.js +2 -1
- package/dist/core/server/generator/generator.js +6 -5
- package/dist/core/server/generator/utils.d.ts +1 -0
- package/dist/core/server/generator/utils.js +4 -0
- package/dist/db-postgres/schema/shop/order.d.ts +37 -1
- package/dist/db-postgres/schema/shop/order.js +3 -1
- package/dist/db-postgres/schema/shop/payment.d.ts +20 -0
- package/dist/db-postgres/schema/shop/payment.js +4 -1
- package/dist/db-postgres/schema/shop/product.d.ts +20 -0
- package/dist/db-postgres/schema/shop/product.js +3 -1
- package/dist/db-postgres/schema/shop/productVariant.d.ts +12 -2
- package/dist/db-postgres/schema/shop/productVariant.js +22 -0
- package/dist/shop/cart/types.d.ts +1 -0
- package/dist/shop/client/index.d.ts +54 -0
- package/dist/shop/client/index.js +5 -1
- package/dist/shop/expiry.d.ts +35 -0
- package/dist/shop/expiry.js +68 -0
- package/dist/shop/http/balance-handler.d.ts +20 -0
- package/dist/shop/http/balance-handler.js +91 -0
- package/dist/shop/http/cart-handler.js +19 -0
- package/dist/shop/http/checkout-handler.js +19 -1
- package/dist/shop/http/index.d.ts +2 -0
- package/dist/shop/http/index.js +2 -0
- package/dist/shop/http/upcoming-handler.d.ts +16 -0
- package/dist/shop/http/upcoming-handler.js +65 -0
- package/dist/shop/http/webhook-handler.js +46 -9
- package/dist/shop/index.d.ts +4 -1
- package/dist/shop/index.js +7 -1
- package/dist/shop/server/balance-payment.d.ts +40 -0
- package/dist/shop/server/balance-payment.js +140 -0
- package/dist/shop/server/cart-hydrate.js +2 -0
- package/dist/shop/server/init.d.ts +14 -0
- package/dist/shop/server/init.js +35 -0
- package/dist/shop/server/orders.d.ts +35 -0
- package/dist/shop/server/orders.js +155 -2
- package/dist/shop/server/payment-policy.d.ts +35 -0
- package/dist/shop/server/payment-policy.js +55 -0
- package/dist/shop/server/payments.d.ts +29 -0
- package/dist/shop/server/payments.js +64 -0
- package/dist/shop/server/populate.d.ts +1 -1
- package/dist/shop/server/refund.d.ts +17 -12
- package/dist/shop/server/refund.js +96 -13
- package/dist/shop/server/shop-data.d.ts +6 -1
- package/dist/shop/server/shop-data.js +44 -7
- package/dist/shop/template.d.ts +13 -0
- package/dist/shop/template.js +98 -0
- package/dist/shop/types.d.ts +142 -1
- package/dist/shop/variant-attributes.d.ts +28 -0
- package/dist/shop/variant-attributes.js +69 -0
- package/dist/sveltekit/server/handle.js +17 -0
- package/dist/sveltekit/server/index.d.ts +1 -0
- package/dist/sveltekit/server/index.js +2 -0
- package/dist/types/cms.d.ts +4 -3
- package/dist/types/cms.schema.d.ts +1 -1
- package/dist/types/cms.schema.js +13 -2
- package/dist/types/fields.d.ts +56 -2
- package/dist/types/index.d.ts +2 -2
- package/dist/types/index.js +1 -1
- package/dist/types/layout.d.ts +35 -2
- package/dist/types/plugins.d.ts +40 -0
- package/dist/types/plugins.js +4 -1
- package/dist/updates/0.26.0/index.d.ts +2 -0
- package/dist/updates/0.26.0/index.js +51 -0
- package/dist/updates/0.26.1/index.d.ts +2 -0
- package/dist/updates/0.26.1/index.js +19 -0
- package/dist/updates/0.27.0/index.d.ts +2 -0
- package/dist/updates/0.27.0/index.js +50 -0
- package/dist/updates/index.js +7 -1
- package/package.json +29 -7
- package/dist/admin/client/collection/empty-state.svelte +0 -28
- package/dist/admin/client/collection/empty-state.svelte.d.ts +0 -9
- package/dist/admin/client/form/submission-status-badge.svelte +0 -41
- package/dist/admin/client/form/submission-status-badge.svelte.d.ts +0 -7
- package/dist/admin/components/media/file-preview.svelte +0 -51
- package/dist/admin/components/media/file-preview.svelte.d.ts +0 -6
- package/dist/admin/utils/formatDate.d.ts +0 -5
|
@@ -1,7 +1,11 @@
|
|
|
1
|
+
import type { MediaFile } from '../../../types/media.js';
|
|
1
2
|
type Props = {
|
|
2
3
|
selected?: string[] | string;
|
|
3
4
|
multiple?: boolean;
|
|
4
5
|
accept?: string;
|
|
6
|
+
showHeader?: boolean;
|
|
7
|
+
data?: MediaFile[];
|
|
8
|
+
state?: 'loading' | 'error' | 'ok';
|
|
5
9
|
};
|
|
6
10
|
declare const MediaLibrary: import("svelte").Component<Props, {}, "selected">;
|
|
7
11
|
type MediaLibrary = ReturnType<typeof MediaLibrary>;
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
cancel: 'Anuluj',
|
|
43
43
|
confirm: 'Potwierdź',
|
|
44
44
|
selectedCount: 'Wybrano',
|
|
45
|
-
clickToSelect: '
|
|
45
|
+
clickToSelect: 'Kliknij plik, aby go wybrać',
|
|
46
46
|
selectedFile: 'Wybrany plik:'
|
|
47
47
|
},
|
|
48
48
|
en: {
|
|
@@ -66,11 +66,12 @@
|
|
|
66
66
|
selected?: string[] | string;
|
|
67
67
|
multiple?: boolean;
|
|
68
68
|
accept?: string;
|
|
69
|
+
maxSizeMB?: number;
|
|
69
70
|
onConfirm?: () => void;
|
|
70
71
|
onCancel?: () => void;
|
|
71
72
|
};
|
|
72
73
|
|
|
73
|
-
let { selected = $bindable([]), multiple = false, accept, onConfirm, onCancel }: Props = $props();
|
|
74
|
+
let { selected = $bindable([]), multiple = false, accept, maxSizeMB, onConfirm, onCancel }: Props = $props();
|
|
74
75
|
|
|
75
76
|
const PAGE_SIZE = 48;
|
|
76
77
|
|
|
@@ -209,6 +210,7 @@
|
|
|
209
210
|
<FileUpload
|
|
210
211
|
onUpload={() => { page = 0; loadedFiles = []; filesQuery.refresh(); countQuery.refresh(); tagCountsQuery.refresh(); totalCountQuery.refresh(); untaggedCountQuery.refresh(); }}
|
|
211
212
|
{accept}
|
|
213
|
+
{maxSizeMB}
|
|
212
214
|
bind:dropZoneRef
|
|
213
215
|
tagIds={activeTagFilter && activeTagFilter !== 'untagged' ? [activeTagFilter] : undefined}
|
|
214
216
|
/>
|
|
@@ -137,9 +137,9 @@
|
|
|
137
137
|
|
|
138
138
|
<div class="flex h-full flex-col">
|
|
139
139
|
<div class="flex-1 overflow-y-auto py-2 scrollbar-thin" role="listbox" aria-label="Filtry tagów">
|
|
140
|
-
<ul class="flex flex-col gap-px px-1.5">
|
|
140
|
+
<ul class="flex flex-col gap-px px-1.5" role="presentation">
|
|
141
141
|
<!-- All files -->
|
|
142
|
-
<li>
|
|
142
|
+
<li role="presentation">
|
|
143
143
|
<button
|
|
144
144
|
type="button"
|
|
145
145
|
role="option"
|
|
@@ -161,7 +161,7 @@
|
|
|
161
161
|
</li>
|
|
162
162
|
|
|
163
163
|
<!-- Untagged -->
|
|
164
|
-
<li>
|
|
164
|
+
<li role="presentation">
|
|
165
165
|
<button
|
|
166
166
|
type="button"
|
|
167
167
|
role="option"
|
|
@@ -187,7 +187,7 @@
|
|
|
187
187
|
|
|
188
188
|
<!-- User tags -->
|
|
189
189
|
{#each tags as tag (tag.id)}
|
|
190
|
-
<li>
|
|
190
|
+
<li role="presentation">
|
|
191
191
|
{#if editingTagId === tag.id}
|
|
192
192
|
<form
|
|
193
193
|
class="flex items-center gap-1 px-1"
|
|
@@ -269,6 +269,11 @@
|
|
|
269
269
|
border-color: var(--primary);
|
|
270
270
|
}
|
|
271
271
|
|
|
272
|
+
.caption-input:focus-visible {
|
|
273
|
+
outline: 2px solid var(--ring);
|
|
274
|
+
outline-offset: 1px;
|
|
275
|
+
}
|
|
276
|
+
|
|
272
277
|
/* Alt text field */
|
|
273
278
|
.figure-alt-row {
|
|
274
279
|
margin-top: 0.375rem;
|
|
@@ -320,4 +325,9 @@
|
|
|
320
325
|
outline: none;
|
|
321
326
|
border-color: var(--primary);
|
|
322
327
|
}
|
|
328
|
+
|
|
329
|
+
.figure-alt-input:focus-visible {
|
|
330
|
+
outline: 2px solid var(--ring);
|
|
331
|
+
outline-offset: 1px;
|
|
332
|
+
}
|
|
323
333
|
</style>
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
@component
|
|
3
|
+
@internal
|
|
4
|
+
-->
|
|
5
|
+
<script lang="ts">
|
|
6
|
+
import { onMount, type Snippet } from 'svelte';
|
|
7
|
+
import { BubbleMenuPlugin, type BubbleMenuPluginProps } from '@tiptap/extension-bubble-menu';
|
|
8
|
+
import { PluginKey } from '@tiptap/pm/state';
|
|
9
|
+
import type { Editor } from '@tiptap/core';
|
|
10
|
+
|
|
11
|
+
type Props = {
|
|
12
|
+
editor: Editor;
|
|
13
|
+
pluginKey?: BubbleMenuPluginProps['pluginKey'];
|
|
14
|
+
updateDelay?: BubbleMenuPluginProps['updateDelay'];
|
|
15
|
+
resizeDelay?: BubbleMenuPluginProps['resizeDelay'];
|
|
16
|
+
appendTo?: BubbleMenuPluginProps['appendTo'];
|
|
17
|
+
shouldShow?: BubbleMenuPluginProps['shouldShow'];
|
|
18
|
+
getReferencedVirtualElement?: BubbleMenuPluginProps['getReferencedVirtualElement'];
|
|
19
|
+
options?: BubbleMenuPluginProps['options'];
|
|
20
|
+
class?: string;
|
|
21
|
+
children: Snippet;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
let {
|
|
25
|
+
editor,
|
|
26
|
+
pluginKey,
|
|
27
|
+
updateDelay,
|
|
28
|
+
resizeDelay,
|
|
29
|
+
appendTo,
|
|
30
|
+
shouldShow = null,
|
|
31
|
+
getReferencedVirtualElement,
|
|
32
|
+
options,
|
|
33
|
+
class: className,
|
|
34
|
+
children
|
|
35
|
+
}: Props = $props();
|
|
36
|
+
|
|
37
|
+
// svelte-ignore state_referenced_locally
|
|
38
|
+
const resolvedKey = pluginKey ?? new PluginKey('bubbleMenu');
|
|
39
|
+
|
|
40
|
+
let root = $state<HTMLDivElement | null>(null);
|
|
41
|
+
let skipFirst = true;
|
|
42
|
+
|
|
43
|
+
onMount(() => {
|
|
44
|
+
if (!root || !editor || editor.isDestroyed) return;
|
|
45
|
+
|
|
46
|
+
root.style.visibility = 'hidden';
|
|
47
|
+
root.style.position = 'absolute';
|
|
48
|
+
|
|
49
|
+
editor.registerPlugin(
|
|
50
|
+
BubbleMenuPlugin({
|
|
51
|
+
editor,
|
|
52
|
+
element: root,
|
|
53
|
+
pluginKey: resolvedKey,
|
|
54
|
+
updateDelay,
|
|
55
|
+
resizeDelay,
|
|
56
|
+
appendTo,
|
|
57
|
+
shouldShow,
|
|
58
|
+
getReferencedVirtualElement,
|
|
59
|
+
options
|
|
60
|
+
})
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
return () => {
|
|
64
|
+
editor.unregisterPlugin(resolvedKey);
|
|
65
|
+
requestAnimationFrame(() => {
|
|
66
|
+
// RAF: defer past in-flight Floating UI update
|
|
67
|
+
root?.parentNode?.removeChild(root);
|
|
68
|
+
});
|
|
69
|
+
};
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
$effect(() => {
|
|
73
|
+
updateDelay;
|
|
74
|
+
resizeDelay;
|
|
75
|
+
appendTo;
|
|
76
|
+
shouldShow;
|
|
77
|
+
getReferencedVirtualElement;
|
|
78
|
+
options;
|
|
79
|
+
|
|
80
|
+
if (skipFirst) {
|
|
81
|
+
skipFirst = false;
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
if (!editor || editor.isDestroyed) return;
|
|
85
|
+
|
|
86
|
+
editor.view.dispatch(
|
|
87
|
+
editor.state.tr.setMeta(resolvedKey, {
|
|
88
|
+
type: 'updateOptions',
|
|
89
|
+
options: {
|
|
90
|
+
updateDelay,
|
|
91
|
+
resizeDelay,
|
|
92
|
+
appendTo,
|
|
93
|
+
shouldShow,
|
|
94
|
+
getReferencedVirtualElement,
|
|
95
|
+
options
|
|
96
|
+
}
|
|
97
|
+
})
|
|
98
|
+
);
|
|
99
|
+
});
|
|
100
|
+
</script>
|
|
101
|
+
|
|
102
|
+
<div bind:this={root} class={className}>
|
|
103
|
+
{@render children()}
|
|
104
|
+
</div>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type Snippet } from 'svelte';
|
|
2
|
+
import { type BubbleMenuPluginProps } from '@tiptap/extension-bubble-menu';
|
|
3
|
+
import type { Editor } from '@tiptap/core';
|
|
4
|
+
type Props = {
|
|
5
|
+
editor: Editor;
|
|
6
|
+
pluginKey?: BubbleMenuPluginProps['pluginKey'];
|
|
7
|
+
updateDelay?: BubbleMenuPluginProps['updateDelay'];
|
|
8
|
+
resizeDelay?: BubbleMenuPluginProps['resizeDelay'];
|
|
9
|
+
appendTo?: BubbleMenuPluginProps['appendTo'];
|
|
10
|
+
shouldShow?: BubbleMenuPluginProps['shouldShow'];
|
|
11
|
+
getReferencedVirtualElement?: BubbleMenuPluginProps['getReferencedVirtualElement'];
|
|
12
|
+
options?: BubbleMenuPluginProps['options'];
|
|
13
|
+
class?: string;
|
|
14
|
+
children: Snippet;
|
|
15
|
+
};
|
|
16
|
+
/** @internal */
|
|
17
|
+
declare const BubbleMenu: import("svelte").Component<Props, {}, "">;
|
|
18
|
+
type BubbleMenu = ReturnType<typeof BubbleMenu>;
|
|
19
|
+
export default BubbleMenu;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import { onMount, getAllContexts } from 'svelte';
|
|
3
3
|
import { Editor, type Editor as EditorType } from '@tiptap/core';
|
|
4
|
-
import BubbleMenu from '@tiptap/extension-bubble-menu';
|
|
5
4
|
import { extensions } from './extensions.js';
|
|
5
|
+
import BubbleMenu from './bubble-menu.svelte';
|
|
6
6
|
import ToolbarButton from './toolbar-button.svelte';
|
|
7
7
|
import EditorToolbar from './editor-toolbar.svelte';
|
|
8
8
|
import LinkDialog from './link-dialog.svelte';
|
|
@@ -52,7 +52,6 @@
|
|
|
52
52
|
|
|
53
53
|
let element = $state<HTMLDivElement | null>(null);
|
|
54
54
|
let editorState = $state<{ editor: EditorType | null }>({ editor: null });
|
|
55
|
-
let bubbleMenu = $state<HTMLDivElement | null>(null);
|
|
56
55
|
|
|
57
56
|
// Dialog states
|
|
58
57
|
let linkDialogOpen = $state(false);
|
|
@@ -80,9 +79,6 @@
|
|
|
80
79
|
...extensions,
|
|
81
80
|
...extraExtensions,
|
|
82
81
|
HeadingA11yPlugin,
|
|
83
|
-
BubbleMenu.configure({
|
|
84
|
-
element: bubbleMenu!
|
|
85
|
-
}),
|
|
86
82
|
Placeholder.configure({
|
|
87
83
|
showOnlyCurrent: false,
|
|
88
84
|
placeholder: ({ node, hasAnchor, editor }) => {
|
|
@@ -154,16 +150,35 @@
|
|
|
154
150
|
{/if}
|
|
155
151
|
|
|
156
152
|
<!-- Bubble Menu -->
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
153
|
+
{#if ed}
|
|
154
|
+
<BubbleMenu
|
|
155
|
+
editor={ed}
|
|
156
|
+
appendTo={() => document.body}
|
|
157
|
+
options={{ scrollTarget: element!, placement: 'bottom', offset: 8 }}
|
|
158
|
+
shouldShow={({ editor, from, to }) =>
|
|
159
|
+
from !== to &&
|
|
160
|
+
!editor.isActive('image') &&
|
|
161
|
+
!editor.isActive('video') &&
|
|
162
|
+
!editor.isActive('figure') &&
|
|
163
|
+
!editor.isActive('codeBlock')}
|
|
164
|
+
>
|
|
165
|
+
<div
|
|
166
|
+
class="bg-popover text-popover-foreground flex items-center gap-0.5 rounded-lg border p-1 shadow-md"
|
|
167
|
+
>
|
|
160
168
|
{#if ed.isActive('link')}
|
|
161
169
|
{#if ed.getAttributes('link').target === '_blank'}
|
|
162
|
-
<span
|
|
170
|
+
<span
|
|
171
|
+
class="text-muted-foreground flex items-center px-1"
|
|
172
|
+
title="Otwiera w nowej karcie"
|
|
173
|
+
>
|
|
163
174
|
<ExternalLink class="h-4 w-4" />
|
|
164
175
|
</span>
|
|
165
176
|
{/if}
|
|
166
|
-
<ToolbarButton
|
|
177
|
+
<ToolbarButton
|
|
178
|
+
label="Edytuj link"
|
|
179
|
+
active={false}
|
|
180
|
+
onclick={() => (linkDialogOpen = true)}
|
|
181
|
+
>
|
|
167
182
|
<Pencil class="h-4 w-4" />
|
|
168
183
|
</ToolbarButton>
|
|
169
184
|
<ToolbarButton
|
|
@@ -270,13 +285,13 @@
|
|
|
270
285
|
</ToolbarButton>
|
|
271
286
|
{/if}
|
|
272
287
|
</div>
|
|
273
|
-
|
|
274
|
-
|
|
288
|
+
</BubbleMenu>
|
|
289
|
+
{/if}
|
|
275
290
|
|
|
276
291
|
<!-- Editor content -->
|
|
277
292
|
<div
|
|
278
293
|
bind:this={element}
|
|
279
|
-
class="prose prose-sm dark:prose-invert
|
|
294
|
+
class="prose prose-sm dark:prose-invert [&_.ProseMirror]:scroll-padding-top-12 max-h-112 max-w-none overflow-y-auto p-4 focus:outline-none [&_.ProseMirror]:min-h-[200px] [&_.ProseMirror]:outline-none"
|
|
280
295
|
></div>
|
|
281
296
|
</div>
|
|
282
297
|
</Tooltip.Provider>
|
|
@@ -287,14 +302,3 @@
|
|
|
287
302
|
<VideoDialog bind:open={videoDialogOpen} editor={ed} />
|
|
288
303
|
<TableDialog bind:open={tableDialogOpen} editor={ed} />
|
|
289
304
|
|
|
290
|
-
<style>
|
|
291
|
-
.bubble-menu {
|
|
292
|
-
height: 0;
|
|
293
|
-
overflow: visible;
|
|
294
|
-
visibility: hidden;
|
|
295
|
-
opacity: 0;
|
|
296
|
-
transition:
|
|
297
|
-
visibility 0.1s ease,
|
|
298
|
-
opacity 0.1s ease;
|
|
299
|
-
}
|
|
300
|
-
</style>
|
|
@@ -86,7 +86,7 @@
|
|
|
86
86
|
<LetterP class="h-4 w-4" />
|
|
87
87
|
</ToolbarButton>
|
|
88
88
|
|
|
89
|
-
<Separator orientation="vertical" class="mx-1 h-6" />
|
|
89
|
+
<Separator orientation="vertical" class="mx-1 hidden h-6 sm:block" />
|
|
90
90
|
|
|
91
91
|
<!-- Text formatting -->
|
|
92
92
|
<ToolbarButton
|
|
@@ -125,7 +125,7 @@
|
|
|
125
125
|
<Highlight class="h-4 w-4" />
|
|
126
126
|
</ToolbarButton>
|
|
127
127
|
|
|
128
|
-
<Separator orientation="vertical" class="mx-1 h-6" />
|
|
128
|
+
<Separator orientation="vertical" class="mx-1 hidden h-6 sm:block" />
|
|
129
129
|
|
|
130
130
|
<!-- Alignment -->
|
|
131
131
|
<ToolbarButton
|
|
@@ -157,7 +157,7 @@
|
|
|
157
157
|
<AlignJustified class="h-4 w-4" />
|
|
158
158
|
</ToolbarButton>
|
|
159
159
|
|
|
160
|
-
<Separator orientation="vertical" class="mx-1 h-6" />
|
|
160
|
+
<Separator orientation="vertical" class="mx-1 hidden h-6 sm:block" />
|
|
161
161
|
|
|
162
162
|
<!-- Lists & Quote -->
|
|
163
163
|
<ToolbarButton
|
|
@@ -182,7 +182,7 @@
|
|
|
182
182
|
<Quote class="h-4 w-4" />
|
|
183
183
|
</ToolbarButton>
|
|
184
184
|
|
|
185
|
-
<Separator orientation="vertical" class="mx-1 h-6" />
|
|
185
|
+
<Separator orientation="vertical" class="mx-1 hidden h-6 sm:block" />
|
|
186
186
|
|
|
187
187
|
<!-- Link, Image, Table -->
|
|
188
188
|
<ToolbarButton label={t.link} active={ed.isActive('link')} onclick={onLinkDialog}>
|
|
@@ -198,7 +198,7 @@
|
|
|
198
198
|
<Table class="h-4 w-4" />
|
|
199
199
|
</ToolbarButton>
|
|
200
200
|
|
|
201
|
-
<Separator orientation="vertical" class="mx-1 h-6" />
|
|
201
|
+
<Separator orientation="vertical" class="mx-1 hidden h-6 sm:block" />
|
|
202
202
|
|
|
203
203
|
<!-- Code -->
|
|
204
204
|
<ToolbarButton
|
|
@@ -217,14 +217,14 @@
|
|
|
217
217
|
</ToolbarButton>
|
|
218
218
|
|
|
219
219
|
{#if showInsertBlock && onInsertBlock}
|
|
220
|
-
<Separator orientation="vertical" class="mx-1 h-6" />
|
|
220
|
+
<Separator orientation="vertical" class="mx-1 hidden h-6 sm:block" />
|
|
221
221
|
<ToolbarButton label={t.insertBlock} active={false} onclick={onInsertBlock}>
|
|
222
222
|
<Plus class="h-4 w-4" />
|
|
223
223
|
</ToolbarButton>
|
|
224
224
|
{/if}
|
|
225
225
|
|
|
226
226
|
{#if showCodeView && onToggleCodeView}
|
|
227
|
-
<Separator orientation="vertical" class="mx-1 h-6" />
|
|
227
|
+
<Separator orientation="vertical" class="mx-1 hidden h-6 sm:block" />
|
|
228
228
|
|
|
229
229
|
<!-- HTML View -->
|
|
230
230
|
<ToolbarButton label={t.htmlView} active={isCodeViewActive} onclick={onToggleCodeView}>
|
|
@@ -15,7 +15,11 @@ import { FigureNode } from './figure-node.js';
|
|
|
15
15
|
const lowlight = createLowlight(common);
|
|
16
16
|
export const extensions = [
|
|
17
17
|
StarterKit.configure({
|
|
18
|
-
|
|
18
|
+
// StarterKit (TipTap v3) ships Link + Underline; we register CustomLink and
|
|
19
|
+
// Underline ourselves, so disable them here to avoid duplicate extensions.
|
|
20
|
+
codeBlock: false,
|
|
21
|
+
link: false,
|
|
22
|
+
underline: false
|
|
19
23
|
}),
|
|
20
24
|
CustomLink.configure({
|
|
21
25
|
openOnClick: false,
|
|
@@ -81,7 +81,7 @@
|
|
|
81
81
|
|
|
82
82
|
<!-- Dialog 1: Media selector -->
|
|
83
83
|
<Dialog.Root bind:open {onOpenChange}>
|
|
84
|
-
<Dialog.Content class="max-w-5xl! sm:max-w-5xl!">
|
|
84
|
+
<Dialog.Content fullscreenMobile class="max-w-5xl! sm:max-w-5xl!">
|
|
85
85
|
<Dialog.Header>
|
|
86
86
|
<Dialog.Title>{t.insertImage}</Dialog.Title>
|
|
87
87
|
</Dialog.Header>
|
|
@@ -183,6 +183,10 @@
|
|
|
183
183
|
.image-alt-input:focus {
|
|
184
184
|
border-color: var(--primary);
|
|
185
185
|
}
|
|
186
|
+
.image-alt-input:focus-visible {
|
|
187
|
+
outline: 2px solid var(--ring);
|
|
188
|
+
outline-offset: 1px;
|
|
189
|
+
}
|
|
186
190
|
.image-alt-actions {
|
|
187
191
|
display: flex;
|
|
188
192
|
gap: 8px;
|
|
@@ -256,6 +256,7 @@
|
|
|
256
256
|
<button
|
|
257
257
|
type="button"
|
|
258
258
|
class="flex w-full items-center gap-1 text-sm font-medium"
|
|
259
|
+
aria-expanded={a11yOpen}
|
|
259
260
|
onclick={() => (a11yOpen = !a11yOpen)}
|
|
260
261
|
>
|
|
261
262
|
{#if a11yOpen}
|
|
@@ -291,6 +292,7 @@
|
|
|
291
292
|
<button
|
|
292
293
|
type="button"
|
|
293
294
|
class="flex w-full items-center gap-1 text-sm font-medium"
|
|
295
|
+
aria-expanded={relOpen}
|
|
294
296
|
onclick={() => (relOpen = !relOpen)}
|
|
295
297
|
>
|
|
296
298
|
{#if relOpen}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import { onMount } from 'svelte';
|
|
3
3
|
import { Editor, type Editor as EditorType } from '@tiptap/core';
|
|
4
|
-
import BubbleMenu from '@tiptap/extension-bubble-menu';
|
|
5
4
|
import { extensions } from './extensions.js';
|
|
6
5
|
import Placeholder from '@tiptap/extension-placeholder';
|
|
6
|
+
import BubbleMenu from './bubble-menu.svelte';
|
|
7
7
|
import ToolbarButton from './toolbar-button.svelte';
|
|
8
8
|
import EditorToolbar from './editor-toolbar.svelte';
|
|
9
9
|
import LinkDialog from './link-dialog.svelte';
|
|
@@ -40,7 +40,6 @@
|
|
|
40
40
|
|
|
41
41
|
let element = $state<HTMLDivElement | null>(null);
|
|
42
42
|
let editorState = $state<{ editor: EditorType | null }>({ editor: null });
|
|
43
|
-
let bubbleMenu = $state<HTMLDivElement | null>(null);
|
|
44
43
|
let isCodeViewActive = $state(false);
|
|
45
44
|
|
|
46
45
|
// Dialog states
|
|
@@ -54,9 +53,6 @@
|
|
|
54
53
|
element: element!,
|
|
55
54
|
extensions: [
|
|
56
55
|
...extensions,
|
|
57
|
-
BubbleMenu.configure({
|
|
58
|
-
element: bubbleMenu!
|
|
59
|
-
}),
|
|
60
56
|
Placeholder.configure({
|
|
61
57
|
placeholder: 'Wpisz treść...',
|
|
62
58
|
showOnlyCurrent: true
|
|
@@ -109,9 +105,21 @@
|
|
|
109
105
|
{/if}
|
|
110
106
|
|
|
111
107
|
<!-- Bubble Menu -->
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
108
|
+
{#if ed}
|
|
109
|
+
<BubbleMenu
|
|
110
|
+
editor={ed}
|
|
111
|
+
appendTo={() => document.body}
|
|
112
|
+
options={{ scrollTarget: element!, placement: 'bottom', offset: 8 }}
|
|
113
|
+
shouldShow={({ editor, from, to }) =>
|
|
114
|
+
from !== to &&
|
|
115
|
+
!editor.isActive('image') &&
|
|
116
|
+
!editor.isActive('video') &&
|
|
117
|
+
!editor.isActive('figure') &&
|
|
118
|
+
!editor.isActive('codeBlock')}
|
|
119
|
+
>
|
|
120
|
+
<div
|
|
121
|
+
class="bg-popover text-popover-foreground flex items-center gap-0.5 rounded-lg border p-1 shadow-md"
|
|
122
|
+
>
|
|
115
123
|
{#if ed.isActive('link')}
|
|
116
124
|
{#if ed.getAttributes('link').target === '_blank'}
|
|
117
125
|
<span class="text-muted-foreground flex items-center px-1" title="Otwiera w nowej karcie">
|
|
@@ -225,8 +233,8 @@
|
|
|
225
233
|
</ToolbarButton>
|
|
226
234
|
{/if}
|
|
227
235
|
</div>
|
|
228
|
-
|
|
229
|
-
|
|
236
|
+
</BubbleMenu>
|
|
237
|
+
{/if}
|
|
230
238
|
|
|
231
239
|
<!-- Editor content -->
|
|
232
240
|
<div
|
|
@@ -250,16 +258,6 @@
|
|
|
250
258
|
<TableDialog bind:open={tableDialogOpen} editor={ed} />
|
|
251
259
|
|
|
252
260
|
<style>
|
|
253
|
-
.bubble-menu {
|
|
254
|
-
height: 0;
|
|
255
|
-
overflow: visible;
|
|
256
|
-
visibility: hidden;
|
|
257
|
-
opacity: 0;
|
|
258
|
-
transition:
|
|
259
|
-
visibility 0.1s ease,
|
|
260
|
-
opacity 0.1s ease;
|
|
261
|
-
}
|
|
262
|
-
|
|
263
261
|
:global(.tiptap-highlight) {
|
|
264
262
|
background-color: rgb(250 204 21 / 0.4);
|
|
265
263
|
padding: 0.125em 0.25em;
|
|
@@ -63,7 +63,7 @@
|
|
|
63
63
|
</script>
|
|
64
64
|
|
|
65
65
|
<Dialog.Root bind:open {onOpenChange}>
|
|
66
|
-
<Dialog.Content class="max-w-5xl! sm:max-w-5xl!">
|
|
66
|
+
<Dialog.Content fullscreenMobile class="max-w-5xl! sm:max-w-5xl!">
|
|
67
67
|
<Dialog.Header>
|
|
68
68
|
<Dialog.Title>{t.insertVideo}</Dialog.Title>
|
|
69
69
|
</Dialog.Header>
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { VariantAttribute } from '../../../shop/types.js';
|
|
3
|
+
import { useInterfaceLanguage } from '../../state/interface-language.svelte.js';
|
|
4
|
+
import { getLocalizedLabel } from '../../utils/collectionLabel.js';
|
|
5
|
+
import TextField from '../fields/text-field.svelte';
|
|
6
|
+
import NumberField from '../fields/number-field.svelte';
|
|
7
|
+
import DatetimeField from '../fields/datetime-field.svelte';
|
|
8
|
+
import SelectField from '../fields/select-field.svelte';
|
|
9
|
+
import BooleanField from '../fields/boolean-field.svelte';
|
|
10
|
+
import Input from '../../../components/ui/input/input.svelte';
|
|
11
|
+
import type {
|
|
12
|
+
TextField as TextFieldType,
|
|
13
|
+
NumberField as NumberFieldType,
|
|
14
|
+
DateTimeField as DateTimeFieldType,
|
|
15
|
+
SelectField as SelectFieldType,
|
|
16
|
+
BooleanField as BooleanFieldType
|
|
17
|
+
} from '../../../types/fields.js';
|
|
18
|
+
|
|
19
|
+
type Props = {
|
|
20
|
+
attrKey: string;
|
|
21
|
+
attrConfig: VariantAttribute;
|
|
22
|
+
value: unknown;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
let { attrKey, attrConfig, value = $bindable() }: Props = $props();
|
|
26
|
+
|
|
27
|
+
const interfaceLanguage = useInterfaceLanguage();
|
|
28
|
+
const label = $derived(
|
|
29
|
+
getLocalizedLabel(attrConfig.label, interfaceLanguage.current) || attrKey
|
|
30
|
+
);
|
|
31
|
+
|
|
32
|
+
// Adapter — VariantAttribute → CMS Field shape that each field component expects.
|
|
33
|
+
// Booleans render their own label inline; everything else uses our outer <label>.
|
|
34
|
+
const textField = $derived<TextFieldType>({
|
|
35
|
+
type: 'text',
|
|
36
|
+
slug: attrKey,
|
|
37
|
+
label,
|
|
38
|
+
required: attrConfig.required,
|
|
39
|
+
multiline: false
|
|
40
|
+
});
|
|
41
|
+
const numberField = $derived<NumberFieldType>({
|
|
42
|
+
type: 'number',
|
|
43
|
+
slug: attrKey,
|
|
44
|
+
label,
|
|
45
|
+
required: attrConfig.required
|
|
46
|
+
});
|
|
47
|
+
const datetimeField = $derived<DateTimeFieldType>({
|
|
48
|
+
type: 'datetime',
|
|
49
|
+
slug: attrKey,
|
|
50
|
+
label,
|
|
51
|
+
required: attrConfig.required
|
|
52
|
+
});
|
|
53
|
+
const selectField = $derived<SelectFieldType>(
|
|
54
|
+
attrConfig.type === 'select'
|
|
55
|
+
? {
|
|
56
|
+
type: 'select',
|
|
57
|
+
slug: attrKey,
|
|
58
|
+
label,
|
|
59
|
+
required: attrConfig.required,
|
|
60
|
+
options: attrConfig.options
|
|
61
|
+
}
|
|
62
|
+
: ({} as SelectFieldType)
|
|
63
|
+
);
|
|
64
|
+
const booleanField = $derived<BooleanFieldType>({
|
|
65
|
+
type: 'boolean',
|
|
66
|
+
slug: attrKey,
|
|
67
|
+
label,
|
|
68
|
+
required: attrConfig.required,
|
|
69
|
+
defaultValue: false
|
|
70
|
+
});
|
|
71
|
+
</script>
|
|
72
|
+
|
|
73
|
+
{#if attrConfig.type === 'boolean'}
|
|
74
|
+
<!-- boolean-field renders its own label, asterisk, and switch row -->
|
|
75
|
+
<BooleanField field={booleanField} bind:value={value as boolean | undefined} />
|
|
76
|
+
{:else}
|
|
77
|
+
<label class="block">
|
|
78
|
+
<span class="text-muted-foreground mb-1 block text-xs font-semibold">
|
|
79
|
+
{label}
|
|
80
|
+
{#if attrConfig.required}<span class="text-destructive ml-0.5" aria-hidden="true"
|
|
81
|
+
>*</span
|
|
82
|
+
>{/if}
|
|
83
|
+
</span>
|
|
84
|
+
|
|
85
|
+
{#if attrConfig.type === 'text'}
|
|
86
|
+
<TextField field={textField} bind:value={value as string | undefined} />
|
|
87
|
+
{:else if attrConfig.type === 'number'}
|
|
88
|
+
<NumberField field={numberField} bind:value={value as number | undefined} />
|
|
89
|
+
{:else if attrConfig.type === 'datetime'}
|
|
90
|
+
<DatetimeField field={datetimeField} bind:value={value as string | undefined} />
|
|
91
|
+
{:else if attrConfig.type === 'select'}
|
|
92
|
+
<SelectField field={selectField} bind:value={value as string | undefined} />
|
|
93
|
+
{:else if attrConfig.type === 'slug'}
|
|
94
|
+
<Input
|
|
95
|
+
bind:value={value as string | undefined}
|
|
96
|
+
type="text"
|
|
97
|
+
pattern="[a-z0-9-]+"
|
|
98
|
+
placeholder="moj-slug"
|
|
99
|
+
/>
|
|
100
|
+
{:else if attrConfig.type === 'image' || attrConfig.type === 'entry'}
|
|
101
|
+
<!-- Pełny picker UI defer post-1.0; tymczasowo: wklej UUID -->
|
|
102
|
+
<Input
|
|
103
|
+
bind:value={value as string | undefined}
|
|
104
|
+
type="text"
|
|
105
|
+
placeholder="UUID ({attrConfig.type === 'image' ? 'media' : 'wpis'})"
|
|
106
|
+
/>
|
|
107
|
+
{/if}
|
|
108
|
+
</label>
|
|
109
|
+
{/if}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { VariantAttribute } from '../../../shop/types.js';
|
|
2
|
+
type Props = {
|
|
3
|
+
attrKey: string;
|
|
4
|
+
attrConfig: VariantAttribute;
|
|
5
|
+
value: unknown;
|
|
6
|
+
};
|
|
7
|
+
declare const VariantAttributeRenderer: import("svelte").Component<Props, {}, "value">;
|
|
8
|
+
type VariantAttributeRenderer = ReturnType<typeof VariantAttributeRenderer>;
|
|
9
|
+
export default VariantAttributeRenderer;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { IconSetPlugin } from '../../types/plugins.js';
|
|
2
|
+
/**
|
|
3
|
+
* Build a Map<slug, IconSetPlugin> from icon-set plugin instances.
|
|
4
|
+
* Use in consumer's admin `+layout.svelte` to pass `iconSets` to AdminLayout —
|
|
5
|
+
* Svelte icon components cannot serialize through SvelteKit data, so the same
|
|
6
|
+
* plugin instances must be imported on the client and forwarded explicitly.
|
|
7
|
+
*/
|
|
8
|
+
export declare function buildIconSetMap(...plugins: IconSetPlugin[]): Map<string, IconSetPlugin>;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build a Map<slug, IconSetPlugin> from icon-set plugin instances.
|
|
3
|
+
* Use in consumer's admin `+layout.svelte` to pass `iconSets` to AdminLayout —
|
|
4
|
+
* Svelte icon components cannot serialize through SvelteKit data, so the same
|
|
5
|
+
* plugin instances must be imported on the client and forwarded explicitly.
|
|
6
|
+
*/
|
|
7
|
+
export function buildIconSetMap(...plugins) {
|
|
8
|
+
const map = new Map();
|
|
9
|
+
for (const p of plugins) {
|
|
10
|
+
if (map.has(p.slug)) {
|
|
11
|
+
throw new Error(`Duplicate icon-set plugin slug: "${p.slug}"`);
|
|
12
|
+
}
|
|
13
|
+
map.set(p.slug, p);
|
|
14
|
+
}
|
|
15
|
+
return map;
|
|
16
|
+
}
|