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,12 +1,16 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import { getContext } from 'svelte';
|
|
2
|
+
import { getContext, untrack } from 'svelte';
|
|
3
3
|
import { Button } from '../../../components/ui/button/index.js';
|
|
4
4
|
import { Switch } from '../../../components/ui/switch/index.js';
|
|
5
5
|
import TrashIcon from '@tabler/icons-svelte/icons/trash';
|
|
6
6
|
import PlusIcon from '@tabler/icons-svelte/icons/plus';
|
|
7
7
|
import BuildingStoreIcon from '@tabler/icons-svelte/icons/building-store';
|
|
8
8
|
import { getRemotes } from '../../../sveltekit/index.js';
|
|
9
|
+
import { errorMessages } from '../../i18n/errors.js';
|
|
9
10
|
import type { ShopField } from '../../../types/fields.js';
|
|
11
|
+
import VariantAttributeRenderer from '../variant-form/VariantAttributeRenderer.svelte';
|
|
12
|
+
import { interpolateTemplate } from '../../../shop/template.js';
|
|
13
|
+
import { isVariantExpired } from '../../../shop/expiry.js';
|
|
10
14
|
|
|
11
15
|
type Props = { field: ShopField };
|
|
12
16
|
const { field }: Props = $props();
|
|
@@ -21,14 +25,21 @@
|
|
|
21
25
|
let inputPrice = $state('0.00');
|
|
22
26
|
let vatRate = $state<number | string>(23);
|
|
23
27
|
let isActive = $state(true);
|
|
28
|
+
type PolicyType = 'full' | 'deposit';
|
|
29
|
+
type DepositKind = 'percent' | 'amount';
|
|
30
|
+
let policyType = $state<PolicyType>('full');
|
|
31
|
+
let depositKind = $state<DepositKind>('percent');
|
|
32
|
+
let depositValue = $state<string>('30');
|
|
24
33
|
let variants = $state<
|
|
25
34
|
Array<{
|
|
26
35
|
id?: string;
|
|
27
36
|
sku: string;
|
|
28
37
|
name: string;
|
|
38
|
+
nameDirty: boolean;
|
|
29
39
|
priceDelta: string;
|
|
30
40
|
priceDeltaMode: InputMode;
|
|
31
41
|
stock: string;
|
|
42
|
+
attributes: Record<string, unknown>;
|
|
32
43
|
}>
|
|
33
44
|
>([]);
|
|
34
45
|
|
|
@@ -36,6 +47,7 @@
|
|
|
36
47
|
let saving = $state(false);
|
|
37
48
|
let errorMessage = $state<string | null>(null);
|
|
38
49
|
let successMessage = $state<string | null>(null);
|
|
50
|
+
let showExpired = $state(false);
|
|
39
51
|
|
|
40
52
|
// PLN-precise math — storage w numeric(20,6). Round do groszy tylko przy prezentacji.
|
|
41
53
|
const inputPln = $derived(parseFloat(inputPrice || '0') || 0);
|
|
@@ -67,20 +79,35 @@
|
|
|
67
79
|
inputPrice = formatPln(grossInitial);
|
|
68
80
|
vatRate = shop.vatRate;
|
|
69
81
|
isActive = shop.isActive;
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
82
|
+
const policy = shop.paymentPolicy ?? null;
|
|
83
|
+
if (policy && policy.type === 'deposit') {
|
|
84
|
+
policyType = 'deposit';
|
|
85
|
+
depositKind = policy.depositAmount.type;
|
|
86
|
+
depositValue = String(policy.depositAmount.value);
|
|
87
|
+
} else {
|
|
88
|
+
policyType = 'full';
|
|
89
|
+
}
|
|
90
|
+
variants = shop.variants.map((v) => {
|
|
91
|
+
const name =
|
|
74
92
|
typeof v.name === 'object' && v.name !== null
|
|
75
93
|
? String(
|
|
76
94
|
Object.values(v.name as Record<string, string>)[0] ?? ''
|
|
77
95
|
)
|
|
78
|
-
: ''
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
96
|
+
: '';
|
|
97
|
+
return {
|
|
98
|
+
id: v.id,
|
|
99
|
+
sku: v.sku ?? '',
|
|
100
|
+
name,
|
|
101
|
+
// Saved non-empty name = editor's choice; lock pre-fill for this session.
|
|
102
|
+
nameDirty: name !== '',
|
|
103
|
+
// Delta hydratowana jako netto (kanoniczna), mode default 'net' dla istniejących.
|
|
104
|
+
priceDelta: formatPln(Number(v.priceDelta)),
|
|
105
|
+
priceDeltaMode: 'net' as InputMode,
|
|
106
|
+
stock: v.stock == null ? '' : String(v.stock),
|
|
107
|
+
attributes:
|
|
108
|
+
(v.attributes as Record<string, unknown> | null | undefined) ?? {}
|
|
109
|
+
};
|
|
110
|
+
});
|
|
84
111
|
} else {
|
|
85
112
|
const defaultVat = configQuery.current?.vatRates[0] ?? 23;
|
|
86
113
|
vatRate = defaultVat;
|
|
@@ -100,12 +127,31 @@
|
|
|
100
127
|
id: undefined,
|
|
101
128
|
sku: '',
|
|
102
129
|
name: '',
|
|
130
|
+
nameDirty: false,
|
|
103
131
|
priceDelta: '0.00',
|
|
104
132
|
priceDeltaMode: 'gross',
|
|
105
|
-
stock: ''
|
|
133
|
+
stock: '',
|
|
134
|
+
attributes: {}
|
|
106
135
|
});
|
|
107
136
|
}
|
|
108
137
|
|
|
138
|
+
// Auto-prefill `name` from variantLabel.template whenever attributes change,
|
|
139
|
+
// unless the user has edited the name manually (dirty flag, per session).
|
|
140
|
+
$effect(() => {
|
|
141
|
+
const template = configQuery.current?.variantLabel?.template;
|
|
142
|
+
if (!template) return;
|
|
143
|
+
for (let i = 0; i < variants.length; i++) {
|
|
144
|
+
// Tracked: re-run when this variant's attributes change.
|
|
145
|
+
const attrs = variants[i].attributes;
|
|
146
|
+
const next = interpolateTemplate(template, attrs, 'pl');
|
|
147
|
+
untrack(() => {
|
|
148
|
+
const v = variants[i];
|
|
149
|
+
if (v.nameDirty) return;
|
|
150
|
+
if (v.name !== next) v.name = next;
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
|
|
109
155
|
function switchVariantMode(i: number, newMode: InputMode) {
|
|
110
156
|
const v = variants[i];
|
|
111
157
|
if (v.priceDeltaMode === newMode) return;
|
|
@@ -118,6 +164,38 @@
|
|
|
118
164
|
variants.splice(i, 1);
|
|
119
165
|
}
|
|
120
166
|
|
|
167
|
+
const expiryConfig = $derived(configQuery.current?.variantExpiry ?? null);
|
|
168
|
+
|
|
169
|
+
const displayVariants = $derived.by(() => {
|
|
170
|
+
const enriched = variants.map((v, originalIndex) => ({
|
|
171
|
+
v,
|
|
172
|
+
originalIndex,
|
|
173
|
+
expired: expiryConfig
|
|
174
|
+
? isVariantExpired({ attributes: v.attributes }, expiryConfig)
|
|
175
|
+
: false
|
|
176
|
+
}));
|
|
177
|
+
const visible = showExpired ? enriched : enriched.filter((x) => !x.expired);
|
|
178
|
+
const source = expiryConfig?.source;
|
|
179
|
+
if (!source) return visible;
|
|
180
|
+
return [...visible].sort((a, b) => {
|
|
181
|
+
const aVal = a.v.attributes?.[source];
|
|
182
|
+
const bVal = b.v.attributes?.[source];
|
|
183
|
+
const aTs = typeof aVal === 'string' ? Date.parse(aVal) : NaN;
|
|
184
|
+
const bTs = typeof bVal === 'string' ? Date.parse(bVal) : NaN;
|
|
185
|
+
if (Number.isNaN(aTs) && Number.isNaN(bTs)) return 0;
|
|
186
|
+
if (Number.isNaN(aTs)) return 1;
|
|
187
|
+
if (Number.isNaN(bTs)) return -1;
|
|
188
|
+
return aTs - bTs;
|
|
189
|
+
});
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
const expiredCount = $derived(
|
|
193
|
+
expiryConfig
|
|
194
|
+
? variants.filter((v) => isVariantExpired({ attributes: v.attributes }, expiryConfig))
|
|
195
|
+
.length
|
|
196
|
+
: 0
|
|
197
|
+
);
|
|
198
|
+
|
|
121
199
|
async function save() {
|
|
122
200
|
if (!entryId) {
|
|
123
201
|
errorMessage = 'Brak ID wpisu — zapisz najpierw wpis, potem dane sklepu.';
|
|
@@ -129,12 +207,26 @@
|
|
|
129
207
|
try {
|
|
130
208
|
const stockEnabled = configQuery.current?.features.stock ?? false;
|
|
131
209
|
const variantsEnabled = configQuery.current?.features.variants ?? false;
|
|
210
|
+
const policyValue = Number(depositValue);
|
|
211
|
+
const paymentPolicy =
|
|
212
|
+
policyType === 'full'
|
|
213
|
+
? ({ type: 'full' as const })
|
|
214
|
+
: Number.isFinite(policyValue) && policyValue > 0
|
|
215
|
+
? ({
|
|
216
|
+
type: 'deposit' as const,
|
|
217
|
+
depositAmount:
|
|
218
|
+
depositKind === 'percent'
|
|
219
|
+
? { type: 'percent' as const, value: policyValue }
|
|
220
|
+
: { type: 'amount' as const, value: Math.round(policyValue) }
|
|
221
|
+
})
|
|
222
|
+
: ({ type: 'full' as const });
|
|
132
223
|
await remotes.upsertShopDataForEntry({
|
|
133
224
|
entryId,
|
|
134
225
|
data: {
|
|
135
226
|
basePrice: netPln,
|
|
136
227
|
vatRate: Number(vatRate),
|
|
137
|
-
isActive
|
|
228
|
+
isActive,
|
|
229
|
+
paymentPolicy
|
|
138
230
|
},
|
|
139
231
|
variants: variantsEnabled
|
|
140
232
|
? variants.map((v) => ({
|
|
@@ -143,14 +235,14 @@
|
|
|
143
235
|
name: v.name ? { pl: v.name } : null,
|
|
144
236
|
priceDelta: variantDeltaNetPln(v),
|
|
145
237
|
stock: stockEnabled && v.stock !== '' ? parseInt(v.stock, 10) : null,
|
|
146
|
-
attributes: null
|
|
238
|
+
attributes: Object.keys(v.attributes).length > 0 ? v.attributes : null
|
|
147
239
|
}))
|
|
148
240
|
: []
|
|
149
241
|
});
|
|
150
242
|
await dataQuery.refresh();
|
|
151
243
|
successMessage = 'Zapisano dane sklepu.';
|
|
152
244
|
} catch (err) {
|
|
153
|
-
errorMessage = err instanceof Error ? err.message :
|
|
245
|
+
errorMessage = err instanceof Error ? err.message : errorMessages.server.saveFailed.pl;
|
|
154
246
|
} finally {
|
|
155
247
|
saving = false;
|
|
156
248
|
}
|
|
@@ -183,9 +275,10 @@
|
|
|
183
275
|
<span class="text-muted-foreground text-xs font-semibold">
|
|
184
276
|
Cena bazowa ({inputMode === 'net' ? 'netto' : 'brutto'}, PLN)
|
|
185
277
|
</span>
|
|
186
|
-
<div class="bg-muted inline-flex rounded-md p-0.5 text-xs">
|
|
278
|
+
<div class="bg-muted inline-flex rounded-md p-0.5 text-xs" role="group" aria-label="Tryb wpisywania ceny">
|
|
187
279
|
<button
|
|
188
280
|
type="button"
|
|
281
|
+
aria-pressed={inputMode === 'net'}
|
|
189
282
|
class="rounded px-2 py-0.5 {inputMode === 'net'
|
|
190
283
|
? 'bg-background text-primary font-semibold shadow-sm'
|
|
191
284
|
: 'text-muted-foreground'}"
|
|
@@ -195,6 +288,7 @@
|
|
|
195
288
|
</button>
|
|
196
289
|
<button
|
|
197
290
|
type="button"
|
|
291
|
+
aria-pressed={inputMode === 'gross'}
|
|
198
292
|
class="rounded px-2 py-0.5 {inputMode === 'gross'
|
|
199
293
|
? 'bg-background text-primary font-semibold shadow-sm'
|
|
200
294
|
: 'text-muted-foreground'}"
|
|
@@ -240,24 +334,122 @@
|
|
|
240
334
|
</div>
|
|
241
335
|
</div>
|
|
242
336
|
|
|
337
|
+
<div class="border-border space-y-3 rounded-lg border-t pt-4">
|
|
338
|
+
<h4 class="text-sm font-bold">Zasady płatności</h4>
|
|
339
|
+
<div class="flex flex-col gap-2 sm:flex-row sm:items-center sm:gap-4">
|
|
340
|
+
<label class="flex items-center gap-2 text-sm">
|
|
341
|
+
<input
|
|
342
|
+
type="radio"
|
|
343
|
+
name="policy-type"
|
|
344
|
+
value="full"
|
|
345
|
+
checked={policyType === 'full'}
|
|
346
|
+
onchange={() => (policyType = 'full')}
|
|
347
|
+
/>
|
|
348
|
+
<span>Płatność z góry (pełna kwota)</span>
|
|
349
|
+
</label>
|
|
350
|
+
<label class="flex items-center gap-2 text-sm">
|
|
351
|
+
<input
|
|
352
|
+
type="radio"
|
|
353
|
+
name="policy-type"
|
|
354
|
+
value="deposit"
|
|
355
|
+
checked={policyType === 'deposit'}
|
|
356
|
+
onchange={() => (policyType = 'deposit')}
|
|
357
|
+
/>
|
|
358
|
+
<span>Zaliczka + dopłata</span>
|
|
359
|
+
</label>
|
|
360
|
+
</div>
|
|
361
|
+
{#if policyType === 'deposit'}
|
|
362
|
+
<div class="bg-muted/30 grid grid-cols-1 gap-3 rounded-md p-3 sm:grid-cols-[auto_1fr]">
|
|
363
|
+
<label class="flex flex-col gap-1 text-xs">
|
|
364
|
+
<span class="text-muted-foreground font-semibold">Typ zaliczki</span>
|
|
365
|
+
<select
|
|
366
|
+
class="border-border rounded-md border px-2 py-1.5 text-sm"
|
|
367
|
+
bind:value={depositKind}
|
|
368
|
+
>
|
|
369
|
+
<option value="percent">Procent ceny</option>
|
|
370
|
+
<option value="amount">Kwota stała (grosze)</option>
|
|
371
|
+
</select>
|
|
372
|
+
</label>
|
|
373
|
+
<label class="flex flex-col gap-1 text-xs">
|
|
374
|
+
<span class="text-muted-foreground font-semibold">
|
|
375
|
+
{depositKind === 'percent' ? 'Procent (1–100)' : 'Kwota w groszach'}
|
|
376
|
+
</span>
|
|
377
|
+
<input
|
|
378
|
+
type="number"
|
|
379
|
+
inputmode="numeric"
|
|
380
|
+
min="1"
|
|
381
|
+
max={depositKind === 'percent' ? '100' : undefined}
|
|
382
|
+
step={depositKind === 'percent' ? '1' : '1'}
|
|
383
|
+
class="border-border rounded-md border px-2 py-1.5 text-sm tabular-nums"
|
|
384
|
+
bind:value={depositValue}
|
|
385
|
+
/>
|
|
386
|
+
</label>
|
|
387
|
+
<p class="text-muted-foreground col-span-full text-xs">
|
|
388
|
+
{#if depositKind === 'percent'}
|
|
389
|
+
Klient płaci {depositValue || '0'}% przy zamówieniu, resztę po wygenerowaniu linka do dopłaty w panelu admina.
|
|
390
|
+
{:else}
|
|
391
|
+
Klient płaci {(Number(depositValue) || 0) / 100} zł przy zamówieniu, resztę po wygenerowaniu linka do dopłaty.
|
|
392
|
+
{/if}
|
|
393
|
+
</p>
|
|
394
|
+
</div>
|
|
395
|
+
{/if}
|
|
396
|
+
</div>
|
|
397
|
+
|
|
243
398
|
{#if config.features.variants}
|
|
244
399
|
<div class="border-border space-y-3 rounded-lg border-t pt-4">
|
|
245
|
-
<div class="flex items-center justify-between">
|
|
400
|
+
<div class="flex items-center justify-between gap-2">
|
|
246
401
|
<h4 class="text-sm font-bold">Warianty</h4>
|
|
247
|
-
<
|
|
248
|
-
|
|
249
|
-
|
|
402
|
+
<div class="flex items-center gap-3">
|
|
403
|
+
{#if expiryConfig && expiredCount > 0}
|
|
404
|
+
<label class="text-muted-foreground flex items-center gap-1.5 text-xs">
|
|
405
|
+
<input type="checkbox" bind:checked={showExpired} class="size-3.5" />
|
|
406
|
+
Pokaż zakończone ({expiredCount})
|
|
407
|
+
</label>
|
|
408
|
+
{/if}
|
|
409
|
+
<Button type="button" variant="outline" size="sm" onclick={addVariant}>
|
|
410
|
+
<PlusIcon class="mr-1 size-4" /> Dodaj wariant
|
|
411
|
+
</Button>
|
|
412
|
+
</div>
|
|
250
413
|
</div>
|
|
251
414
|
{#if variants.length === 0}
|
|
252
415
|
<p class="text-muted-foreground text-xs">Brak wariantów — zostanie użyta cena bazowa.</p>
|
|
416
|
+
{:else if displayVariants.length === 0}
|
|
417
|
+
<p class="text-muted-foreground text-xs">
|
|
418
|
+
Wszystkie warianty są zakończone. Zaznacz „Pokaż zakończone", aby je zobaczyć.
|
|
419
|
+
</p>
|
|
253
420
|
{/if}
|
|
254
|
-
{#each
|
|
255
|
-
|
|
421
|
+
{#each displayVariants as { v, originalIndex, expired } (originalIndex)}
|
|
422
|
+
{@const i = originalIndex}
|
|
423
|
+
<div
|
|
424
|
+
class="border-border space-y-3 rounded-lg border p-3 {expired ? 'opacity-60' : ''}"
|
|
425
|
+
>
|
|
426
|
+
{#if expired}
|
|
427
|
+
<span
|
|
428
|
+
class="bg-muted text-muted-foreground inline-flex items-center rounded-md border border-border px-2 py-0.5 text-[11px] font-semibold uppercase tracking-wide"
|
|
429
|
+
aria-label="Wariant zakończony"
|
|
430
|
+
>
|
|
431
|
+
Zakończony
|
|
432
|
+
</span>
|
|
433
|
+
{/if}
|
|
434
|
+
{#if config.variantAttributes && Object.keys(config.variantAttributes).length > 0}
|
|
435
|
+
<div class="grid grid-cols-1 gap-3 md:grid-cols-2">
|
|
436
|
+
{#each Object.entries(config.variantAttributes) as [attrKey, attrConfig] (attrKey)}
|
|
437
|
+
<VariantAttributeRenderer
|
|
438
|
+
{attrKey}
|
|
439
|
+
{attrConfig}
|
|
440
|
+
bind:value={v.attributes[attrKey]}
|
|
441
|
+
/>
|
|
442
|
+
{/each}
|
|
443
|
+
</div>
|
|
444
|
+
<div class="border-border border-t pt-3" aria-hidden="true"></div>
|
|
445
|
+
{/if}
|
|
446
|
+
<div class="grid grid-cols-2 gap-2">
|
|
256
447
|
<label class="block">
|
|
257
448
|
<span class="text-muted-foreground mb-0.5 block text-xs">Nazwa</span>
|
|
258
449
|
<input
|
|
259
450
|
type="text"
|
|
260
451
|
bind:value={v.name}
|
|
452
|
+
oninput={() => (v.nameDirty = true)}
|
|
261
453
|
class="border-border w-full rounded border px-2 py-1 text-sm"
|
|
262
454
|
/>
|
|
263
455
|
</label>
|
|
@@ -274,9 +466,10 @@
|
|
|
274
466
|
<span class="text-muted-foreground text-xs">
|
|
275
467
|
Zmiana ceny ({v.priceDeltaMode === 'net' ? 'netto' : 'brutto'}, PLN)
|
|
276
468
|
</span>
|
|
277
|
-
<div class="bg-muted inline-flex rounded-md p-0.5 text-[10px]">
|
|
469
|
+
<div class="bg-muted inline-flex rounded-md p-0.5 text-[10px]" role="group" aria-label="Tryb zmiany ceny wariantu {i + 1}">
|
|
278
470
|
<button
|
|
279
471
|
type="button"
|
|
472
|
+
aria-pressed={v.priceDeltaMode === 'net'}
|
|
280
473
|
class="rounded px-1.5 py-0.5 {v.priceDeltaMode === 'net'
|
|
281
474
|
? 'bg-background text-primary font-semibold shadow-sm'
|
|
282
475
|
: 'text-muted-foreground'}"
|
|
@@ -286,6 +479,7 @@
|
|
|
286
479
|
</button>
|
|
287
480
|
<button
|
|
288
481
|
type="button"
|
|
482
|
+
aria-pressed={v.priceDeltaMode === 'gross'}
|
|
289
483
|
class="rounded px-1.5 py-0.5 {v.priceDeltaMode === 'gross'
|
|
290
484
|
? 'bg-background text-primary font-semibold shadow-sm'
|
|
291
485
|
: 'text-muted-foreground'}"
|
|
@@ -314,10 +508,11 @@
|
|
|
314
508
|
</label>
|
|
315
509
|
{/if}
|
|
316
510
|
<div class="col-span-2 flex justify-end">
|
|
317
|
-
<Button type="button" variant="ghost" size="sm" onclick={() => removeVariant(i)}>
|
|
511
|
+
<Button type="button" variant="ghost" size="sm" onclick={() => removeVariant(i)} aria-label="Usuń wariant {i + 1}">
|
|
318
512
|
<TrashIcon class="size-4" />
|
|
319
513
|
</Button>
|
|
320
514
|
</div>
|
|
515
|
+
</div>
|
|
321
516
|
</div>
|
|
322
517
|
{/each}
|
|
323
518
|
</div>
|