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.
Files changed (411) hide show
  1. package/API.md +97 -4
  2. package/CHANGELOG.md +118 -0
  3. package/DOCS.md +1 -1
  4. package/README.md +2 -0
  5. package/ROADMAP.md +14 -0
  6. package/dist/admin/auth-client.d.ts +42 -42
  7. package/dist/admin/client/account/lang.d.ts +1 -0
  8. package/dist/admin/client/account/lang.js +4 -2
  9. package/dist/admin/client/account/profile-section.svelte +2 -2
  10. package/dist/admin/client/account/security-section.svelte +27 -4
  11. package/dist/admin/client/account/sessions-section.svelte +1 -1
  12. package/dist/admin/client/admin/admin-after-login-layout-content.svelte +1 -1
  13. package/dist/admin/client/admin/admin-layout.svelte +12 -2
  14. package/dist/admin/client/admin/admin-layout.svelte.d.ts +2 -1
  15. package/dist/admin/client/admin/dashboard-page.svelte +34 -10
  16. package/dist/admin/client/collection/bulk-actions-bar.svelte +86 -44
  17. package/dist/admin/client/collection/bulk-actions-bar.svelte.d.ts +3 -1
  18. package/dist/admin/client/collection/collection-entries.svelte +52 -36
  19. package/dist/admin/client/collection/collection-entries.svelte.d.ts +3 -0
  20. package/dist/admin/client/collection/collection.svelte +28 -14
  21. package/dist/admin/client/collection/collection.svelte.d.ts +3 -0
  22. package/dist/admin/client/collection/data-table.svelte +240 -130
  23. package/dist/admin/client/collection/data-table.svelte.d.ts +9 -0
  24. package/dist/admin/client/collection/date-cell.svelte +4 -4
  25. package/dist/admin/client/collection/row-actions.svelte +2 -1
  26. package/dist/admin/client/collection/sortable-header.svelte +33 -9
  27. package/dist/admin/client/collection/state-display.svelte +102 -0
  28. package/dist/admin/client/collection/state-display.svelte.d.ts +12 -0
  29. package/dist/admin/client/collection/status-badge.svelte +99 -11
  30. package/dist/admin/client/collection/status-badge.svelte.d.ts +15 -1
  31. package/dist/admin/client/collection/table-pagination.svelte +21 -6
  32. package/dist/admin/client/collection/table-toolbar.svelte +105 -80
  33. package/dist/admin/client/collection/table-toolbar.svelte.d.ts +11 -8
  34. package/dist/admin/client/entry/entry-form.svelte +36 -11
  35. package/dist/admin/client/entry/entry-form.svelte.d.ts +1 -0
  36. package/dist/admin/client/entry/entry-header.svelte +22 -15
  37. package/dist/admin/client/entry/entry-header.svelte.d.ts +1 -0
  38. package/dist/admin/client/entry/entry.svelte +269 -165
  39. package/dist/admin/client/entry/header/a11y-header-badge.svelte +47 -0
  40. package/dist/admin/client/entry/header/a11y-header-badge.svelte.d.ts +8 -0
  41. package/dist/admin/client/entry/header/publish-panel.svelte +69 -13
  42. package/dist/admin/client/entry/header/save-indicator.svelte +57 -28
  43. package/dist/admin/client/entry/header/save-indicator.svelte.d.ts +1 -0
  44. package/dist/admin/client/entry/header/status-badge.svelte +60 -15
  45. package/dist/admin/client/entry/header/status-badge.svelte.d.ts +1 -2
  46. package/dist/admin/client/entry/header/version-history-sheet.svelte +1 -1
  47. package/dist/admin/client/entry/hybrid/hybrid-layout.svelte +74 -23
  48. package/dist/admin/client/entry/hybrid/hybrid-preview.svelte +1 -1
  49. package/dist/admin/client/entry/utils.d.ts +14 -0
  50. package/dist/admin/client/entry/utils.js +28 -0
  51. package/dist/admin/client/form/form-submission/form-submission.svelte +2 -2
  52. package/dist/admin/client/form/form-submissions.svelte +143 -194
  53. package/dist/admin/client/form/form-submissions.svelte.d.ts +2 -0
  54. package/dist/admin/client/login/lang.d.ts +3 -0
  55. package/dist/admin/client/login/lang.js +10 -4
  56. package/dist/admin/client/login/login-form.svelte +8 -1
  57. package/dist/admin/client/login/reset-password-page.svelte +24 -3
  58. package/dist/admin/client/login/schema.d.ts +14 -2
  59. package/dist/admin/client/login/schema.js +19 -8
  60. package/dist/admin/client/maintenance/maintenance-page.svelte +16 -17
  61. package/dist/admin/client/media/media-page.svelte +1 -1
  62. package/dist/admin/client/shop/coupon-edit-page.svelte +117 -13
  63. package/dist/admin/client/shop/coupon-form.svelte +282 -138
  64. package/dist/admin/client/shop/coupon-form.svelte.d.ts +1 -9
  65. package/dist/admin/client/shop/coupon-new-page.svelte +40 -10
  66. package/dist/admin/client/shop/coupon-new-page.svelte.d.ts +2 -17
  67. package/dist/admin/client/shop/coupon-schema.d.ts +28 -0
  68. package/dist/admin/client/shop/coupon-schema.js +53 -0
  69. package/dist/admin/client/shop/coupons-list-page.svelte +262 -118
  70. package/dist/admin/client/shop/coupons-list-page.svelte.d.ts +16 -1
  71. package/dist/admin/client/shop/refund-dialog.svelte +37 -1
  72. package/dist/admin/client/shop/refund-dialog.svelte.d.ts +3 -0
  73. package/dist/admin/client/shop/shipping-method-edit-page.svelte +108 -59
  74. package/dist/admin/client/shop/shipping-method-form.svelte +36 -9
  75. package/dist/admin/client/shop/shipping-method-new-page.svelte +44 -13
  76. package/dist/admin/client/shop/shipping-methods-list-page.svelte +101 -59
  77. package/dist/admin/client/shop/shop-order-detail-page.svelte +220 -84
  78. package/dist/admin/client/shop/shop-orders-list-page.svelte +302 -152
  79. package/dist/admin/client/shop/shop-orders-list-page.svelte.d.ts +18 -1
  80. package/dist/admin/client/shop/shop-products-list-page.svelte +355 -118
  81. package/dist/admin/client/shop/shop-products-list-page.svelte.d.ts +19 -1
  82. package/dist/admin/client/users/accept-invite-page.svelte +24 -3
  83. package/dist/admin/client/users/create-user-dialog.svelte +3 -8
  84. package/dist/admin/client/users/lang.d.ts +2 -0
  85. package/dist/admin/client/users/lang.js +4 -0
  86. package/dist/admin/client/users/pending-invitations.svelte +2 -9
  87. package/dist/admin/client/users/user-name-cell.svelte +20 -0
  88. package/dist/admin/client/users/user-name-cell.svelte.d.ts +9 -0
  89. package/dist/admin/client/users/user-role-badge.svelte +16 -0
  90. package/dist/admin/client/users/user-role-badge.svelte.d.ts +7 -0
  91. package/dist/admin/client/users/user-row-actions.svelte +72 -0
  92. package/dist/admin/client/users/user-row-actions.svelte.d.ts +20 -0
  93. package/dist/admin/client/users/user-sessions-sheet.svelte +2 -11
  94. package/dist/admin/client/users/users-page.svelte +283 -497
  95. package/dist/admin/client/users/users-page.svelte.d.ts +12 -1
  96. package/dist/admin/components/dashboard/form-submissions-widget.svelte +59 -74
  97. package/dist/admin/components/dashboard/recent-activity.svelte +17 -5
  98. package/dist/admin/components/dashboard/recent-entries.svelte +19 -7
  99. package/dist/admin/components/dialogs/confirmation-dialog.svelte +105 -0
  100. package/dist/admin/components/dialogs/confirmation-dialog.svelte.d.ts +13 -0
  101. package/dist/admin/components/fields/block-picker-modal.svelte +6 -0
  102. package/dist/admin/components/fields/blocks-field.svelte +46 -1
  103. package/dist/admin/components/fields/boolean-field.svelte +1 -1
  104. package/dist/admin/components/fields/field-renderer.svelte +29 -22
  105. package/dist/admin/components/fields/file-field.svelte +344 -30
  106. package/dist/admin/components/fields/icon-field.svelte +86 -0
  107. package/dist/admin/components/fields/icon-field.svelte.d.ts +8 -0
  108. package/dist/admin/components/fields/icon-picker-dialog.svelte +174 -0
  109. package/dist/admin/components/fields/icon-picker-dialog.svelte.d.ts +11 -0
  110. package/dist/admin/components/fields/media-field.svelte +16 -2
  111. package/dist/admin/components/fields/object-field.svelte +27 -7
  112. package/dist/admin/components/fields/radio-field.svelte +22 -0
  113. package/dist/admin/components/fields/relation-field.svelte +123 -97
  114. package/dist/admin/components/fields/relation-picker-dialog.svelte +2 -2
  115. package/dist/admin/components/fields/seo-field.svelte +60 -30
  116. package/dist/admin/components/fields/shop-field.svelte +219 -24
  117. package/dist/admin/components/fields/simple-array-field.svelte +321 -151
  118. package/dist/admin/components/fields/simple-array-field.svelte.d.ts +3 -0
  119. package/dist/admin/components/fields/slug-field.svelte +146 -21
  120. package/dist/admin/components/fields/text-field-wrapper.svelte +37 -20
  121. package/dist/admin/components/fields/text-field.svelte +7 -2
  122. package/dist/admin/components/fields/url-field-wrapper.svelte +10 -0
  123. package/dist/admin/components/fields/url-field.svelte +36 -23
  124. package/dist/admin/components/forms/form-error-summary.svelte +143 -0
  125. package/dist/admin/components/forms/form-error-summary.svelte.d.ts +27 -0
  126. package/dist/admin/components/layout/app-sidebar.svelte +7 -2
  127. package/dist/admin/components/layout/detail-page-shell.svelte +71 -0
  128. package/dist/admin/components/layout/detail-page-shell.svelte.d.ts +24 -0
  129. package/dist/admin/components/layout/lang.d.ts +5 -0
  130. package/dist/admin/components/layout/lang.js +10 -0
  131. package/dist/admin/components/layout/layout-renderer.svelte +71 -2
  132. package/dist/admin/components/layout/layout-renderer.svelte.d.ts +1 -0
  133. package/dist/admin/components/layout/layout-tabs.svelte +173 -0
  134. package/dist/admin/components/layout/layout-tabs.svelte.d.ts +24 -0
  135. package/dist/admin/components/layout/nav-breadcrumbs.svelte +25 -7
  136. package/dist/admin/components/layout/nav-collections.svelte +23 -36
  137. package/dist/admin/components/layout/nav-forms.svelte +19 -35
  138. package/dist/admin/components/layout/nav-main.svelte +3 -28
  139. package/dist/admin/components/layout/nav-search.svelte +70 -2
  140. package/dist/admin/components/layout/nav-section.svelte +77 -0
  141. package/dist/admin/components/layout/nav-section.svelte.d.ts +22 -0
  142. package/dist/admin/components/layout/nav-shop.svelte +3 -27
  143. package/dist/admin/components/layout/nav-singletons.svelte +16 -28
  144. package/dist/admin/components/layout/page-header.stories.svelte +93 -0
  145. package/dist/admin/components/layout/page-header.stories.svelte.d.ts +27 -0
  146. package/dist/admin/components/layout/page-header.svelte +68 -0
  147. package/dist/admin/components/layout/page-header.svelte.d.ts +17 -0
  148. package/dist/admin/components/layout/site-header.svelte +9 -0
  149. package/dist/admin/components/layout/site-header.svelte.d.ts +2 -17
  150. package/dist/admin/components/media/file/file-name-input.svelte +6 -2
  151. package/dist/admin/components/media/file/file-preview.svelte +130 -17
  152. package/dist/admin/components/media/file-upload.svelte +16 -7
  153. package/dist/admin/components/media/file-upload.svelte.d.ts +1 -0
  154. package/dist/admin/components/media/files-list.svelte +153 -53
  155. package/dist/admin/components/media/files-list.svelte.d.ts +1 -0
  156. package/dist/admin/components/media/media-library.svelte +577 -198
  157. package/dist/admin/components/media/media-library.svelte.d.ts +4 -0
  158. package/dist/admin/components/media/media-selector.svelte +4 -2
  159. package/dist/admin/components/media/media-selector.svelte.d.ts +1 -0
  160. package/dist/admin/components/media/tag-sidebar.svelte +4 -4
  161. package/dist/admin/components/tiptap/FigureNodeView.svelte +10 -0
  162. package/dist/admin/components/tiptap/bubble-menu.svelte +104 -0
  163. package/dist/admin/components/tiptap/bubble-menu.svelte.d.ts +19 -0
  164. package/dist/admin/components/tiptap/content-editor.svelte +28 -24
  165. package/dist/admin/components/tiptap/editor-toolbar.svelte +7 -7
  166. package/dist/admin/components/tiptap/extensions.js +5 -1
  167. package/dist/admin/components/tiptap/image-dialog.svelte +5 -1
  168. package/dist/admin/components/tiptap/link-dialog.svelte +2 -0
  169. package/dist/admin/components/tiptap/tiptap-editor.svelte +18 -20
  170. package/dist/admin/components/tiptap/video-dialog.svelte +1 -1
  171. package/dist/admin/components/variant-form/VariantAttributeRenderer.svelte +109 -0
  172. package/dist/admin/components/variant-form/VariantAttributeRenderer.svelte.d.ts +9 -0
  173. package/dist/admin/helpers/build-icon-set-map.d.ts +8 -0
  174. package/dist/admin/helpers/build-icon-set-map.js +16 -0
  175. package/dist/admin/helpers/index.d.ts +2 -0
  176. package/dist/admin/helpers/index.js +2 -0
  177. package/dist/admin/i18n/errors.d.ts +140 -0
  178. package/dist/admin/i18n/errors.js +151 -0
  179. package/dist/admin/remote/entry.remote.d.ts +59 -4
  180. package/dist/admin/remote/entry.remote.js +239 -62
  181. package/dist/admin/remote/shop.remote.d.ts +87 -48
  182. package/dist/admin/remote/shop.remote.js +70 -8
  183. package/dist/admin/shared/password-generate.d.ts +6 -0
  184. package/dist/admin/shared/password-generate.js +40 -0
  185. package/dist/admin/shared/password-schema.d.ts +6 -0
  186. package/dist/admin/shared/password-schema.js +10 -3
  187. package/dist/admin/state/icon-sets.svelte.d.ts +9 -0
  188. package/dist/admin/state/icon-sets.svelte.js +20 -0
  189. package/dist/admin/styles/admin.css +23 -6
  190. package/dist/admin/styles/tokens.md +244 -0
  191. package/dist/admin/utils/accordionActivation.d.ts +13 -0
  192. package/dist/admin/utils/accordionActivation.js +35 -0
  193. package/dist/admin/utils/entryLabel.d.ts +23 -0
  194. package/dist/admin/utils/entryLabel.js +51 -12
  195. package/dist/admin/utils/field-a11y.d.ts +29 -0
  196. package/dist/admin/utils/field-a11y.js +23 -0
  197. package/dist/admin/utils/fieldPathElement.d.ts +9 -0
  198. package/dist/admin/utils/fieldPathElement.js +18 -0
  199. package/dist/admin/utils/fileDisplay.d.ts +10 -0
  200. package/dist/admin/utils/fileDisplay.js +26 -0
  201. package/dist/admin/utils/flattenFormErrors.d.ts +19 -0
  202. package/dist/admin/utils/flattenFormErrors.js +102 -0
  203. package/dist/admin/utils/formatters.d.ts +12 -0
  204. package/dist/admin/utils/{formatDate.js → formatters.js} +23 -2
  205. package/dist/admin/utils/scrollWithin.d.ts +9 -0
  206. package/dist/admin/utils/scrollWithin.js +32 -0
  207. package/dist/admin/utils/tabActivation.d.ts +12 -0
  208. package/dist/admin/utils/tabActivation.js +24 -0
  209. package/dist/cli/scaffold/admin.js +2 -2
  210. package/dist/cms/runtime/schema.d.ts +1 -0
  211. package/dist/cms/runtime/schema.js +1 -0
  212. package/dist/cms/runtime/types.d.ts +80 -7
  213. package/dist/components/ui/accordion/accordion-content.svelte +17 -3
  214. package/dist/components/ui/accordion/accordion.stories.svelte +21 -1
  215. package/dist/components/ui/alert/alert.stories.svelte +14 -0
  216. package/dist/components/ui/alert-dialog/alert-dialog.stories.svelte +45 -0
  217. package/dist/components/ui/alert-dialog/alert-dialog.stories.svelte.d.ts +27 -0
  218. package/dist/components/ui/avatar/avatar.stories.svelte +27 -0
  219. package/dist/components/ui/badge/badge.stories.svelte +15 -0
  220. package/dist/components/ui/breadcrumb/breadcrumb.stories.svelte +47 -0
  221. package/dist/components/ui/breadcrumb/breadcrumb.svelte +1 -1
  222. package/dist/components/ui/button/button.stories.svelte +53 -6
  223. package/dist/components/ui/button/button.svelte +39 -5
  224. package/dist/components/ui/button/button.svelte.d.ts +4 -0
  225. package/dist/components/ui/button-group/button-group.stories.svelte +44 -0
  226. package/dist/components/ui/button-group/button-group.stories.svelte.d.ts +27 -0
  227. package/dist/components/ui/calendar/calendar.stories.svelte +36 -0
  228. package/dist/components/ui/calendar/calendar.stories.svelte.d.ts +27 -0
  229. package/dist/components/ui/card/card.stories.svelte +7 -0
  230. package/dist/components/ui/carousel/carousel.stories.svelte +43 -0
  231. package/dist/components/ui/carousel/carousel.stories.svelte.d.ts +27 -0
  232. package/dist/components/ui/checkbox/checkbox.stories.svelte +67 -0
  233. package/dist/components/ui/checkbox/checkbox.stories.svelte.d.ts +27 -0
  234. package/dist/components/ui/checkbox/checkbox.svelte +1 -1
  235. package/dist/components/ui/command/command.stories.svelte +18 -0
  236. package/dist/components/ui/data-table/data-table.stories.svelte +61 -0
  237. package/dist/components/ui/data-table/data-table.stories.svelte.d.ts +18 -0
  238. package/dist/components/ui/dialog/dialog-content.svelte +5 -0
  239. package/dist/components/ui/dialog/dialog-content.svelte.d.ts +2 -0
  240. package/dist/components/ui/dialog/dialog.stories.svelte +35 -0
  241. package/dist/components/ui/dropdown-menu/dropdown-menu.stories.svelte +74 -0
  242. package/dist/components/ui/dropdown-menu/dropdown-menu.stories.svelte.d.ts +27 -0
  243. package/dist/components/ui/field/field-context.svelte.d.ts +22 -0
  244. package/dist/components/ui/field/field-context.svelte.js +9 -0
  245. package/dist/components/ui/field/field-control.svelte +18 -0
  246. package/dist/components/ui/field/field-control.svelte.d.ts +8 -0
  247. package/dist/components/ui/field/field-description.svelte +12 -0
  248. package/dist/components/ui/field/field-error.svelte +14 -6
  249. package/dist/components/ui/field/field-label.svelte +10 -0
  250. package/dist/components/ui/field/field.stories.svelte +95 -9
  251. package/dist/components/ui/field/field.svelte +57 -0
  252. package/dist/components/ui/field/field.svelte.d.ts +2 -0
  253. package/dist/components/ui/field/index.d.ts +3 -1
  254. package/dist/components/ui/field/index.js +4 -2
  255. package/dist/components/ui/form/form-field-errors.svelte +1 -1
  256. package/dist/components/ui/form/form.stories.svelte +25 -0
  257. package/dist/components/ui/form/form.stories.svelte.d.ts +26 -0
  258. package/dist/components/ui/input/input.stories.svelte +26 -0
  259. package/dist/components/ui/input-group/input-group-input.svelte.d.ts +1 -1
  260. package/dist/components/ui/input-group/input-group.stories.svelte +43 -0
  261. package/dist/components/ui/input-group/input-group.stories.svelte.d.ts +27 -0
  262. package/dist/components/ui/item/item.stories.svelte +61 -0
  263. package/dist/components/ui/item/item.stories.svelte.d.ts +27 -0
  264. package/dist/components/ui/label/label.stories.svelte +7 -0
  265. package/dist/components/ui/live-region/index.d.ts +1 -0
  266. package/dist/components/ui/live-region/index.js +1 -0
  267. package/dist/components/ui/live-region/live-region-demo.svelte +32 -0
  268. package/dist/components/ui/live-region/live-region-demo.svelte.d.ts +7 -0
  269. package/dist/components/ui/live-region/live-region.stories.svelte +23 -0
  270. package/dist/components/ui/live-region/live-region.stories.svelte.d.ts +26 -0
  271. package/dist/components/ui/live-region/live-region.svelte +12 -0
  272. package/dist/components/ui/live-region/live-region.svelte.d.ts +8 -0
  273. package/dist/components/ui/popover/popover.stories.svelte +34 -0
  274. package/dist/components/ui/radio-group/radio-group.stories.svelte +58 -0
  275. package/dist/components/ui/radio-group/radio-group.stories.svelte.d.ts +27 -0
  276. package/dist/components/ui/resizable/resizable.stories.svelte +56 -0
  277. package/dist/components/ui/resizable/resizable.stories.svelte.d.ts +27 -0
  278. package/dist/components/ui/select/select.stories.svelte +49 -0
  279. package/dist/components/ui/separator/separator.stories.svelte +18 -0
  280. package/dist/components/ui/sheet/sheet.stories.svelte +34 -0
  281. package/dist/components/ui/sidebar/sidebar-input.svelte.d.ts +1 -1
  282. package/dist/components/ui/sidebar/sidebar-menu-button.svelte +1 -0
  283. package/dist/components/ui/sidebar/sidebar-trigger.svelte +1 -1
  284. package/dist/components/ui/sidebar/sidebar.stories.svelte +72 -0
  285. package/dist/components/ui/sidebar/sidebar.stories.svelte.d.ts +27 -0
  286. package/dist/components/ui/skeleton/skeleton.stories.svelte +39 -0
  287. package/dist/components/ui/skeleton/skeleton.stories.svelte.d.ts +27 -0
  288. package/dist/components/ui/skeleton/skeleton.svelte +6 -0
  289. package/dist/components/ui/sonner/index.d.ts +1 -1
  290. package/dist/components/ui/sonner/index.js +1 -1
  291. package/dist/components/ui/sonner/sonner.stories.svelte +7 -0
  292. package/dist/components/ui/sonner/sonner.svelte +17 -1
  293. package/dist/components/ui/sonner/sonner.svelte.d.ts +6 -0
  294. package/dist/components/ui/spinner/spinner.stories.svelte +30 -0
  295. package/dist/components/ui/spinner/spinner.stories.svelte.d.ts +27 -0
  296. package/dist/components/ui/switch/switch.stories.svelte +56 -0
  297. package/dist/components/ui/switch/switch.stories.svelte.d.ts +27 -0
  298. package/dist/components/ui/table/table-cell.svelte +1 -1
  299. package/dist/components/ui/table/table-head.svelte +1 -1
  300. package/dist/components/ui/table/table.stories.svelte +68 -0
  301. package/dist/components/ui/table/table.stories.svelte.d.ts +27 -0
  302. package/dist/components/ui/table/table.svelte +1 -1
  303. package/dist/components/ui/tabs/tabs.stories.svelte +48 -0
  304. package/dist/components/ui/tabs/tabs.stories.svelte.d.ts +27 -0
  305. package/dist/components/ui/textarea/textarea.stories.svelte +21 -0
  306. package/dist/components/ui/toggle/toggle.stories.svelte +23 -0
  307. package/dist/components/ui/toggle-group/toggle-group.stories.svelte +43 -0
  308. package/dist/components/ui/tooltip/tooltip.stories.svelte +46 -6
  309. package/dist/core/cms.d.ts +11 -2
  310. package/dist/core/cms.js +29 -0
  311. package/dist/core/fields/fieldSchemaToTs.d.ts +7 -0
  312. package/dist/core/fields/fieldSchemaToTs.js +241 -90
  313. package/dist/core/fields/layoutUtils.d.ts +4 -1
  314. package/dist/core/fields/layoutUtils.js +41 -4
  315. package/dist/core/fields/resolveSeo.d.ts +70 -0
  316. package/dist/core/fields/resolveSeo.js +88 -0
  317. package/dist/core/fields/seoFieldDescriptor.d.ts +43 -0
  318. package/dist/core/fields/seoFieldDescriptor.js +74 -0
  319. package/dist/core/fields/slugPath.d.ts +13 -0
  320. package/dist/core/fields/slugPath.js +32 -0
  321. package/dist/core/fields/urlUtils.d.ts +8 -0
  322. package/dist/core/fields/urlUtils.js +27 -0
  323. package/dist/core/index.d.ts +1 -0
  324. package/dist/core/index.js +1 -0
  325. package/dist/core/server/entries/operations/create.js +13 -0
  326. package/dist/core/server/entries/operations/get.d.ts +7 -0
  327. package/dist/core/server/entries/operations/get.js +10 -6
  328. package/dist/core/server/entries/operations/slugUniqueness.d.ts +37 -0
  329. package/dist/core/server/entries/operations/slugUniqueness.js +116 -0
  330. package/dist/core/server/entries/operations/update.d.ts +6 -1
  331. package/dist/core/server/entries/operations/update.js +24 -1
  332. package/dist/core/server/fields/slugResolver.d.ts +3 -13
  333. package/dist/core/server/fields/slugResolver.js +8 -37
  334. package/dist/core/server/generator/fields.d.ts +2 -0
  335. package/dist/core/server/generator/fields.js +44 -18
  336. package/dist/core/server/generator/formFields.js +2 -1
  337. package/dist/core/server/generator/generator.js +6 -5
  338. package/dist/core/server/generator/utils.d.ts +1 -0
  339. package/dist/core/server/generator/utils.js +4 -0
  340. package/dist/db-postgres/schema/shop/order.d.ts +37 -1
  341. package/dist/db-postgres/schema/shop/order.js +3 -1
  342. package/dist/db-postgres/schema/shop/payment.d.ts +20 -0
  343. package/dist/db-postgres/schema/shop/payment.js +4 -1
  344. package/dist/db-postgres/schema/shop/product.d.ts +20 -0
  345. package/dist/db-postgres/schema/shop/product.js +3 -1
  346. package/dist/db-postgres/schema/shop/productVariant.d.ts +12 -2
  347. package/dist/db-postgres/schema/shop/productVariant.js +22 -0
  348. package/dist/shop/cart/types.d.ts +1 -0
  349. package/dist/shop/client/index.d.ts +54 -0
  350. package/dist/shop/client/index.js +5 -1
  351. package/dist/shop/expiry.d.ts +35 -0
  352. package/dist/shop/expiry.js +68 -0
  353. package/dist/shop/http/balance-handler.d.ts +20 -0
  354. package/dist/shop/http/balance-handler.js +91 -0
  355. package/dist/shop/http/cart-handler.js +19 -0
  356. package/dist/shop/http/checkout-handler.js +19 -1
  357. package/dist/shop/http/index.d.ts +2 -0
  358. package/dist/shop/http/index.js +2 -0
  359. package/dist/shop/http/upcoming-handler.d.ts +16 -0
  360. package/dist/shop/http/upcoming-handler.js +65 -0
  361. package/dist/shop/http/webhook-handler.js +46 -9
  362. package/dist/shop/index.d.ts +4 -1
  363. package/dist/shop/index.js +7 -1
  364. package/dist/shop/server/balance-payment.d.ts +40 -0
  365. package/dist/shop/server/balance-payment.js +140 -0
  366. package/dist/shop/server/cart-hydrate.js +2 -0
  367. package/dist/shop/server/init.d.ts +14 -0
  368. package/dist/shop/server/init.js +35 -0
  369. package/dist/shop/server/orders.d.ts +35 -0
  370. package/dist/shop/server/orders.js +155 -2
  371. package/dist/shop/server/payment-policy.d.ts +35 -0
  372. package/dist/shop/server/payment-policy.js +55 -0
  373. package/dist/shop/server/payments.d.ts +29 -0
  374. package/dist/shop/server/payments.js +64 -0
  375. package/dist/shop/server/populate.d.ts +1 -1
  376. package/dist/shop/server/refund.d.ts +17 -12
  377. package/dist/shop/server/refund.js +96 -13
  378. package/dist/shop/server/shop-data.d.ts +6 -1
  379. package/dist/shop/server/shop-data.js +44 -7
  380. package/dist/shop/template.d.ts +13 -0
  381. package/dist/shop/template.js +98 -0
  382. package/dist/shop/types.d.ts +142 -1
  383. package/dist/shop/variant-attributes.d.ts +28 -0
  384. package/dist/shop/variant-attributes.js +69 -0
  385. package/dist/sveltekit/server/handle.js +17 -0
  386. package/dist/sveltekit/server/index.d.ts +1 -0
  387. package/dist/sveltekit/server/index.js +2 -0
  388. package/dist/types/cms.d.ts +4 -3
  389. package/dist/types/cms.schema.d.ts +1 -1
  390. package/dist/types/cms.schema.js +13 -2
  391. package/dist/types/fields.d.ts +56 -2
  392. package/dist/types/index.d.ts +2 -2
  393. package/dist/types/index.js +1 -1
  394. package/dist/types/layout.d.ts +35 -2
  395. package/dist/types/plugins.d.ts +40 -0
  396. package/dist/types/plugins.js +4 -1
  397. package/dist/updates/0.26.0/index.d.ts +2 -0
  398. package/dist/updates/0.26.0/index.js +51 -0
  399. package/dist/updates/0.26.1/index.d.ts +2 -0
  400. package/dist/updates/0.26.1/index.js +19 -0
  401. package/dist/updates/0.27.0/index.d.ts +2 -0
  402. package/dist/updates/0.27.0/index.js +50 -0
  403. package/dist/updates/index.js +7 -1
  404. package/package.json +29 -7
  405. package/dist/admin/client/collection/empty-state.svelte +0 -28
  406. package/dist/admin/client/collection/empty-state.svelte.d.ts +0 -9
  407. package/dist/admin/client/form/submission-status-badge.svelte +0 -41
  408. package/dist/admin/client/form/submission-status-badge.svelte.d.ts +0 -7
  409. package/dist/admin/components/media/file-preview.svelte +0 -51
  410. package/dist/admin/components/media/file-preview.svelte.d.ts +0 -6
  411. 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
- variants = shop.variants.map((v) => ({
71
- id: v.id,
72
- sku: v.sku ?? '',
73
- name:
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
- // Delta hydratowana jako netto (kanoniczna), mode default 'net' dla istniejących.
80
- priceDelta: formatPln(Number(v.priceDelta)),
81
- priceDeltaMode: 'net' as InputMode,
82
- stock: v.stock == null ? '' : String(v.stock)
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 : 'Nie udało się zapisać';
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
- <Button type="button" variant="outline" size="sm" onclick={addVariant}>
248
- <PlusIcon class="mr-1 size-4" /> Dodaj wariant
249
- </Button>
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 variants as v, i (i)}
255
- <div class="border-border grid grid-cols-2 gap-2 rounded-lg border p-3">
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>