includio-cms 0.25.0 → 0.26.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 (349) hide show
  1. package/API.md +57 -4
  2. package/CHANGELOG.md +53 -0
  3. package/DOCS.md +1 -1
  4. package/README.md +2 -0
  5. package/ROADMAP.md +6 -0
  6. package/dist/admin/client/account/lang.d.ts +1 -0
  7. package/dist/admin/client/account/lang.js +4 -2
  8. package/dist/admin/client/account/profile-section.svelte +2 -2
  9. package/dist/admin/client/account/security-section.svelte +27 -4
  10. package/dist/admin/client/account/sessions-section.svelte +1 -1
  11. package/dist/admin/client/admin/admin-after-login-layout-content.svelte +1 -1
  12. package/dist/admin/client/admin/dashboard-page.svelte +34 -10
  13. package/dist/admin/client/collection/bulk-actions-bar.svelte +86 -44
  14. package/dist/admin/client/collection/bulk-actions-bar.svelte.d.ts +3 -1
  15. package/dist/admin/client/collection/collection-entries.svelte +52 -36
  16. package/dist/admin/client/collection/collection-entries.svelte.d.ts +3 -0
  17. package/dist/admin/client/collection/collection.svelte +28 -14
  18. package/dist/admin/client/collection/collection.svelte.d.ts +3 -0
  19. package/dist/admin/client/collection/data-table.svelte +279 -130
  20. package/dist/admin/client/collection/data-table.svelte.d.ts +11 -0
  21. package/dist/admin/client/collection/date-cell.svelte +4 -4
  22. package/dist/admin/client/collection/row-actions.svelte +2 -1
  23. package/dist/admin/client/collection/sortable-header.svelte +33 -9
  24. package/dist/admin/client/collection/state-display.svelte +102 -0
  25. package/dist/admin/client/collection/state-display.svelte.d.ts +12 -0
  26. package/dist/admin/client/collection/status-badge.svelte +99 -11
  27. package/dist/admin/client/collection/status-badge.svelte.d.ts +15 -1
  28. package/dist/admin/client/collection/table-pagination.svelte +21 -6
  29. package/dist/admin/client/collection/table-toolbar.svelte +105 -80
  30. package/dist/admin/client/collection/table-toolbar.svelte.d.ts +11 -8
  31. package/dist/admin/client/entry/entry-form.svelte +36 -11
  32. package/dist/admin/client/entry/entry-form.svelte.d.ts +1 -0
  33. package/dist/admin/client/entry/entry-header.svelte +22 -15
  34. package/dist/admin/client/entry/entry-header.svelte.d.ts +1 -0
  35. package/dist/admin/client/entry/entry.svelte +269 -165
  36. package/dist/admin/client/entry/header/a11y-header-badge.svelte +47 -0
  37. package/dist/admin/client/entry/header/a11y-header-badge.svelte.d.ts +8 -0
  38. package/dist/admin/client/entry/header/publish-panel.svelte +69 -13
  39. package/dist/admin/client/entry/header/save-indicator.svelte +57 -28
  40. package/dist/admin/client/entry/header/save-indicator.svelte.d.ts +1 -0
  41. package/dist/admin/client/entry/header/status-badge.svelte +60 -15
  42. package/dist/admin/client/entry/header/status-badge.svelte.d.ts +1 -2
  43. package/dist/admin/client/entry/header/version-history-sheet.svelte +1 -1
  44. package/dist/admin/client/entry/hybrid/hybrid-layout.svelte +74 -23
  45. package/dist/admin/client/entry/hybrid/hybrid-preview.svelte +1 -1
  46. package/dist/admin/client/entry/utils.d.ts +14 -0
  47. package/dist/admin/client/entry/utils.js +28 -0
  48. package/dist/admin/client/form/form-submission/form-submission.svelte +2 -2
  49. package/dist/admin/client/form/form-submissions.svelte +143 -194
  50. package/dist/admin/client/form/form-submissions.svelte.d.ts +2 -0
  51. package/dist/admin/client/login/lang.d.ts +3 -0
  52. package/dist/admin/client/login/lang.js +10 -4
  53. package/dist/admin/client/login/login-form.svelte +8 -1
  54. package/dist/admin/client/login/reset-password-page.svelte +24 -3
  55. package/dist/admin/client/login/schema.d.ts +14 -2
  56. package/dist/admin/client/login/schema.js +19 -8
  57. package/dist/admin/client/maintenance/maintenance-page.svelte +16 -17
  58. package/dist/admin/client/media/media-page.svelte +1 -1
  59. package/dist/admin/client/shop/coupon-edit-page.svelte +117 -13
  60. package/dist/admin/client/shop/coupon-form.svelte +282 -138
  61. package/dist/admin/client/shop/coupon-form.svelte.d.ts +1 -9
  62. package/dist/admin/client/shop/coupon-new-page.svelte +40 -10
  63. package/dist/admin/client/shop/coupon-new-page.svelte.d.ts +2 -17
  64. package/dist/admin/client/shop/coupon-schema.d.ts +28 -0
  65. package/dist/admin/client/shop/coupon-schema.js +53 -0
  66. package/dist/admin/client/shop/coupons-list-page.svelte +262 -118
  67. package/dist/admin/client/shop/coupons-list-page.svelte.d.ts +16 -1
  68. package/dist/admin/client/shop/shipping-method-edit-page.svelte +108 -59
  69. package/dist/admin/client/shop/shipping-method-form.svelte +36 -9
  70. package/dist/admin/client/shop/shipping-method-new-page.svelte +44 -13
  71. package/dist/admin/client/shop/shipping-methods-list-page.svelte +101 -59
  72. package/dist/admin/client/shop/shop-order-detail-page.svelte +113 -84
  73. package/dist/admin/client/shop/shop-orders-list-page.svelte +302 -152
  74. package/dist/admin/client/shop/shop-orders-list-page.svelte.d.ts +18 -1
  75. package/dist/admin/client/shop/shop-products-list-page.svelte +355 -118
  76. package/dist/admin/client/shop/shop-products-list-page.svelte.d.ts +19 -1
  77. package/dist/admin/client/users/accept-invite-page.svelte +24 -3
  78. package/dist/admin/client/users/create-user-dialog.svelte +3 -8
  79. package/dist/admin/client/users/lang.d.ts +2 -0
  80. package/dist/admin/client/users/lang.js +4 -0
  81. package/dist/admin/client/users/pending-invitations.svelte +2 -9
  82. package/dist/admin/client/users/user-name-cell.svelte +20 -0
  83. package/dist/admin/client/users/user-name-cell.svelte.d.ts +9 -0
  84. package/dist/admin/client/users/user-role-badge.svelte +16 -0
  85. package/dist/admin/client/users/user-role-badge.svelte.d.ts +7 -0
  86. package/dist/admin/client/users/user-row-actions.svelte +72 -0
  87. package/dist/admin/client/users/user-row-actions.svelte.d.ts +20 -0
  88. package/dist/admin/client/users/user-sessions-sheet.svelte +2 -11
  89. package/dist/admin/client/users/users-page.svelte +283 -497
  90. package/dist/admin/client/users/users-page.svelte.d.ts +12 -1
  91. package/dist/admin/components/dashboard/form-submissions-widget.svelte +59 -74
  92. package/dist/admin/components/dashboard/recent-activity.svelte +17 -5
  93. package/dist/admin/components/dashboard/recent-entries.svelte +19 -7
  94. package/dist/admin/components/dialogs/confirmation-dialog.svelte +105 -0
  95. package/dist/admin/components/dialogs/confirmation-dialog.svelte.d.ts +13 -0
  96. package/dist/admin/components/fields/block-picker-modal.svelte +6 -0
  97. package/dist/admin/components/fields/blocks-field.svelte +46 -1
  98. package/dist/admin/components/fields/boolean-field.svelte +1 -1
  99. package/dist/admin/components/fields/field-renderer.svelte +23 -21
  100. package/dist/admin/components/fields/file-field.svelte +344 -30
  101. package/dist/admin/components/fields/media-field.svelte +16 -2
  102. package/dist/admin/components/fields/radio-field.svelte +22 -0
  103. package/dist/admin/components/fields/relation-field.svelte +123 -97
  104. package/dist/admin/components/fields/relation-picker-dialog.svelte +2 -2
  105. package/dist/admin/components/fields/seo-field.svelte +60 -30
  106. package/dist/admin/components/fields/shop-field.svelte +9 -4
  107. package/dist/admin/components/fields/simple-array-field.svelte +321 -151
  108. package/dist/admin/components/fields/simple-array-field.svelte.d.ts +3 -0
  109. package/dist/admin/components/fields/slug-field.svelte +146 -21
  110. package/dist/admin/components/fields/text-field-wrapper.svelte +37 -20
  111. package/dist/admin/components/fields/text-field.svelte +7 -2
  112. package/dist/admin/components/fields/url-field-wrapper.svelte +10 -0
  113. package/dist/admin/components/fields/url-field.svelte +36 -23
  114. package/dist/admin/components/forms/form-error-summary.svelte +143 -0
  115. package/dist/admin/components/forms/form-error-summary.svelte.d.ts +27 -0
  116. package/dist/admin/components/layout/app-sidebar.svelte +7 -2
  117. package/dist/admin/components/layout/detail-page-shell.svelte +71 -0
  118. package/dist/admin/components/layout/detail-page-shell.svelte.d.ts +24 -0
  119. package/dist/admin/components/layout/lang.d.ts +5 -0
  120. package/dist/admin/components/layout/lang.js +10 -0
  121. package/dist/admin/components/layout/layout-renderer.svelte +71 -2
  122. package/dist/admin/components/layout/layout-renderer.svelte.d.ts +1 -0
  123. package/dist/admin/components/layout/layout-tabs.svelte +172 -0
  124. package/dist/admin/components/layout/layout-tabs.svelte.d.ts +24 -0
  125. package/dist/admin/components/layout/nav-breadcrumbs.svelte +25 -7
  126. package/dist/admin/components/layout/nav-collections.svelte +23 -36
  127. package/dist/admin/components/layout/nav-forms.svelte +19 -35
  128. package/dist/admin/components/layout/nav-main.svelte +3 -28
  129. package/dist/admin/components/layout/nav-search.svelte +70 -2
  130. package/dist/admin/components/layout/nav-section.svelte +77 -0
  131. package/dist/admin/components/layout/nav-section.svelte.d.ts +22 -0
  132. package/dist/admin/components/layout/nav-shop.svelte +3 -27
  133. package/dist/admin/components/layout/nav-singletons.svelte +16 -28
  134. package/dist/admin/components/layout/page-header.stories.svelte +93 -0
  135. package/dist/admin/components/layout/page-header.stories.svelte.d.ts +27 -0
  136. package/dist/admin/components/layout/page-header.svelte +68 -0
  137. package/dist/admin/components/layout/page-header.svelte.d.ts +17 -0
  138. package/dist/admin/components/layout/site-header.svelte +9 -0
  139. package/dist/admin/components/layout/site-header.svelte.d.ts +2 -17
  140. package/dist/admin/components/media/file/file-name-input.svelte +6 -2
  141. package/dist/admin/components/media/file/file-preview.svelte +130 -17
  142. package/dist/admin/components/media/file-upload.svelte +16 -7
  143. package/dist/admin/components/media/file-upload.svelte.d.ts +1 -0
  144. package/dist/admin/components/media/files-list.svelte +153 -53
  145. package/dist/admin/components/media/files-list.svelte.d.ts +1 -0
  146. package/dist/admin/components/media/media-library.svelte +577 -198
  147. package/dist/admin/components/media/media-library.svelte.d.ts +4 -0
  148. package/dist/admin/components/media/media-selector.svelte +4 -2
  149. package/dist/admin/components/media/media-selector.svelte.d.ts +1 -0
  150. package/dist/admin/components/media/tag-sidebar.svelte +4 -4
  151. package/dist/admin/components/tiptap/FigureNodeView.svelte +10 -0
  152. package/dist/admin/components/tiptap/bubble-menu.svelte +104 -0
  153. package/dist/admin/components/tiptap/bubble-menu.svelte.d.ts +19 -0
  154. package/dist/admin/components/tiptap/content-editor.svelte +28 -24
  155. package/dist/admin/components/tiptap/editor-toolbar.svelte +7 -7
  156. package/dist/admin/components/tiptap/extensions.js +5 -1
  157. package/dist/admin/components/tiptap/image-dialog.svelte +5 -1
  158. package/dist/admin/components/tiptap/link-dialog.svelte +2 -0
  159. package/dist/admin/components/tiptap/tiptap-editor.svelte +18 -20
  160. package/dist/admin/components/tiptap/video-dialog.svelte +1 -1
  161. package/dist/admin/i18n/errors.d.ts +140 -0
  162. package/dist/admin/i18n/errors.js +151 -0
  163. package/dist/admin/remote/entry.remote.d.ts +59 -4
  164. package/dist/admin/remote/entry.remote.js +239 -62
  165. package/dist/admin/remote/shop.remote.d.ts +37 -32
  166. package/dist/admin/remote/shop.remote.js +9 -2
  167. package/dist/admin/shared/password-generate.d.ts +6 -0
  168. package/dist/admin/shared/password-generate.js +40 -0
  169. package/dist/admin/shared/password-schema.d.ts +6 -0
  170. package/dist/admin/shared/password-schema.js +10 -3
  171. package/dist/admin/styles/admin.css +23 -6
  172. package/dist/admin/styles/tokens.md +244 -0
  173. package/dist/admin/utils/accordionActivation.d.ts +13 -0
  174. package/dist/admin/utils/accordionActivation.js +35 -0
  175. package/dist/admin/utils/entryLabel.d.ts +23 -0
  176. package/dist/admin/utils/entryLabel.js +51 -12
  177. package/dist/admin/utils/field-a11y.d.ts +29 -0
  178. package/dist/admin/utils/field-a11y.js +23 -0
  179. package/dist/admin/utils/fieldPathElement.d.ts +9 -0
  180. package/dist/admin/utils/fieldPathElement.js +18 -0
  181. package/dist/admin/utils/fileDisplay.d.ts +10 -0
  182. package/dist/admin/utils/fileDisplay.js +26 -0
  183. package/dist/admin/utils/flattenFormErrors.d.ts +19 -0
  184. package/dist/admin/utils/flattenFormErrors.js +102 -0
  185. package/dist/admin/utils/formatters.d.ts +12 -0
  186. package/dist/admin/utils/{formatDate.js → formatters.js} +23 -2
  187. package/dist/admin/utils/scrollWithin.d.ts +9 -0
  188. package/dist/admin/utils/scrollWithin.js +32 -0
  189. package/dist/admin/utils/tabActivation.d.ts +12 -0
  190. package/dist/admin/utils/tabActivation.js +24 -0
  191. package/dist/cms/runtime/schema.d.ts +1 -0
  192. package/dist/cms/runtime/schema.js +1 -0
  193. package/dist/cms/runtime/types.d.ts +80 -7
  194. package/dist/components/ui/accordion/accordion-content.svelte +17 -3
  195. package/dist/components/ui/accordion/accordion.stories.svelte +21 -1
  196. package/dist/components/ui/alert/alert.stories.svelte +14 -0
  197. package/dist/components/ui/alert-dialog/alert-dialog.stories.svelte +45 -0
  198. package/dist/components/ui/alert-dialog/alert-dialog.stories.svelte.d.ts +27 -0
  199. package/dist/components/ui/avatar/avatar.stories.svelte +27 -0
  200. package/dist/components/ui/badge/badge.stories.svelte +15 -0
  201. package/dist/components/ui/breadcrumb/breadcrumb.stories.svelte +47 -0
  202. package/dist/components/ui/breadcrumb/breadcrumb.svelte +1 -1
  203. package/dist/components/ui/button/button.stories.svelte +53 -6
  204. package/dist/components/ui/button/button.svelte +39 -5
  205. package/dist/components/ui/button/button.svelte.d.ts +4 -0
  206. package/dist/components/ui/button-group/button-group.stories.svelte +44 -0
  207. package/dist/components/ui/button-group/button-group.stories.svelte.d.ts +27 -0
  208. package/dist/components/ui/calendar/calendar.stories.svelte +36 -0
  209. package/dist/components/ui/calendar/calendar.stories.svelte.d.ts +27 -0
  210. package/dist/components/ui/card/card.stories.svelte +7 -0
  211. package/dist/components/ui/carousel/carousel.stories.svelte +43 -0
  212. package/dist/components/ui/carousel/carousel.stories.svelte.d.ts +27 -0
  213. package/dist/components/ui/checkbox/checkbox.stories.svelte +67 -0
  214. package/dist/components/ui/checkbox/checkbox.stories.svelte.d.ts +27 -0
  215. package/dist/components/ui/checkbox/checkbox.svelte +3 -3
  216. package/dist/components/ui/command/command.stories.svelte +18 -0
  217. package/dist/components/ui/data-table/data-table.stories.svelte +61 -0
  218. package/dist/components/ui/data-table/data-table.stories.svelte.d.ts +18 -0
  219. package/dist/components/ui/dialog/dialog-content.svelte +5 -0
  220. package/dist/components/ui/dialog/dialog-content.svelte.d.ts +2 -0
  221. package/dist/components/ui/dialog/dialog.stories.svelte +35 -0
  222. package/dist/components/ui/dropdown-menu/dropdown-menu.stories.svelte +74 -0
  223. package/dist/components/ui/dropdown-menu/dropdown-menu.stories.svelte.d.ts +27 -0
  224. package/dist/components/ui/field/field-context.svelte.d.ts +22 -0
  225. package/dist/components/ui/field/field-context.svelte.js +9 -0
  226. package/dist/components/ui/field/field-control.svelte +18 -0
  227. package/dist/components/ui/field/field-control.svelte.d.ts +8 -0
  228. package/dist/components/ui/field/field-description.svelte +12 -0
  229. package/dist/components/ui/field/field-error.svelte +14 -6
  230. package/dist/components/ui/field/field-label.svelte +10 -0
  231. package/dist/components/ui/field/field.stories.svelte +95 -9
  232. package/dist/components/ui/field/field.svelte +57 -0
  233. package/dist/components/ui/field/field.svelte.d.ts +2 -0
  234. package/dist/components/ui/field/index.d.ts +3 -1
  235. package/dist/components/ui/field/index.js +4 -2
  236. package/dist/components/ui/form/form-field-errors.svelte +1 -1
  237. package/dist/components/ui/form/form.stories.svelte +25 -0
  238. package/dist/components/ui/form/form.stories.svelte.d.ts +26 -0
  239. package/dist/components/ui/input/input.stories.svelte +26 -0
  240. package/dist/components/ui/input-group/input-group-input.svelte.d.ts +1 -1
  241. package/dist/components/ui/input-group/input-group.stories.svelte +43 -0
  242. package/dist/components/ui/input-group/input-group.stories.svelte.d.ts +27 -0
  243. package/dist/components/ui/item/item.stories.svelte +61 -0
  244. package/dist/components/ui/item/item.stories.svelte.d.ts +27 -0
  245. package/dist/components/ui/label/label.stories.svelte +7 -0
  246. package/dist/components/ui/live-region/index.d.ts +1 -0
  247. package/dist/components/ui/live-region/index.js +1 -0
  248. package/dist/components/ui/live-region/live-region-demo.svelte +32 -0
  249. package/dist/components/ui/live-region/live-region-demo.svelte.d.ts +7 -0
  250. package/dist/components/ui/live-region/live-region.stories.svelte +23 -0
  251. package/dist/components/ui/live-region/live-region.stories.svelte.d.ts +26 -0
  252. package/dist/components/ui/live-region/live-region.svelte +12 -0
  253. package/dist/components/ui/live-region/live-region.svelte.d.ts +8 -0
  254. package/dist/components/ui/popover/popover.stories.svelte +34 -0
  255. package/dist/components/ui/radio-group/radio-group.stories.svelte +58 -0
  256. package/dist/components/ui/radio-group/radio-group.stories.svelte.d.ts +27 -0
  257. package/dist/components/ui/resizable/resizable.stories.svelte +56 -0
  258. package/dist/components/ui/resizable/resizable.stories.svelte.d.ts +27 -0
  259. package/dist/components/ui/select/select.stories.svelte +49 -0
  260. package/dist/components/ui/separator/separator.stories.svelte +18 -0
  261. package/dist/components/ui/sheet/sheet.stories.svelte +34 -0
  262. package/dist/components/ui/sidebar/sidebar-input.svelte.d.ts +1 -1
  263. package/dist/components/ui/sidebar/sidebar-menu-button.svelte +1 -0
  264. package/dist/components/ui/sidebar/sidebar-trigger.svelte +1 -1
  265. package/dist/components/ui/sidebar/sidebar.stories.svelte +72 -0
  266. package/dist/components/ui/sidebar/sidebar.stories.svelte.d.ts +27 -0
  267. package/dist/components/ui/skeleton/skeleton.stories.svelte +39 -0
  268. package/dist/components/ui/skeleton/skeleton.stories.svelte.d.ts +27 -0
  269. package/dist/components/ui/skeleton/skeleton.svelte +6 -0
  270. package/dist/components/ui/sonner/index.d.ts +1 -1
  271. package/dist/components/ui/sonner/index.js +1 -1
  272. package/dist/components/ui/sonner/sonner.stories.svelte +7 -0
  273. package/dist/components/ui/sonner/sonner.svelte +17 -1
  274. package/dist/components/ui/sonner/sonner.svelte.d.ts +6 -0
  275. package/dist/components/ui/spinner/spinner.stories.svelte +30 -0
  276. package/dist/components/ui/spinner/spinner.stories.svelte.d.ts +27 -0
  277. package/dist/components/ui/switch/switch.stories.svelte +56 -0
  278. package/dist/components/ui/switch/switch.stories.svelte.d.ts +27 -0
  279. package/dist/components/ui/table/table-cell.svelte +1 -1
  280. package/dist/components/ui/table/table-head.svelte +1 -1
  281. package/dist/components/ui/table/table.stories.svelte +68 -0
  282. package/dist/components/ui/table/table.stories.svelte.d.ts +27 -0
  283. package/dist/components/ui/table/table.svelte +1 -1
  284. package/dist/components/ui/tabs/tabs.stories.svelte +48 -0
  285. package/dist/components/ui/tabs/tabs.stories.svelte.d.ts +27 -0
  286. package/dist/components/ui/textarea/textarea.stories.svelte +21 -0
  287. package/dist/components/ui/toggle/toggle.stories.svelte +23 -0
  288. package/dist/components/ui/toggle-group/toggle-group.stories.svelte +43 -0
  289. package/dist/components/ui/tooltip/tooltip.stories.svelte +46 -6
  290. package/dist/core/fields/fieldSchemaToTs.d.ts +7 -0
  291. package/dist/core/fields/fieldSchemaToTs.js +234 -90
  292. package/dist/core/fields/layoutUtils.d.ts +4 -1
  293. package/dist/core/fields/layoutUtils.js +41 -4
  294. package/dist/core/fields/resolveSeo.d.ts +70 -0
  295. package/dist/core/fields/resolveSeo.js +88 -0
  296. package/dist/core/fields/seoFieldDescriptor.d.ts +43 -0
  297. package/dist/core/fields/seoFieldDescriptor.js +74 -0
  298. package/dist/core/fields/slugPath.d.ts +13 -0
  299. package/dist/core/fields/slugPath.js +32 -0
  300. package/dist/core/fields/urlUtils.d.ts +8 -0
  301. package/dist/core/fields/urlUtils.js +27 -0
  302. package/dist/core/index.d.ts +1 -0
  303. package/dist/core/index.js +1 -0
  304. package/dist/core/server/entries/operations/create.js +13 -0
  305. package/dist/core/server/entries/operations/get.d.ts +7 -0
  306. package/dist/core/server/entries/operations/get.js +10 -6
  307. package/dist/core/server/entries/operations/slugUniqueness.d.ts +37 -0
  308. package/dist/core/server/entries/operations/slugUniqueness.js +116 -0
  309. package/dist/core/server/entries/operations/update.d.ts +6 -1
  310. package/dist/core/server/entries/operations/update.js +24 -1
  311. package/dist/core/server/fields/slugResolver.d.ts +3 -13
  312. package/dist/core/server/fields/slugResolver.js +8 -37
  313. package/dist/core/server/generator/fields.js +10 -17
  314. package/dist/core/server/generator/formFields.js +2 -1
  315. package/dist/core/server/generator/generator.js +4 -4
  316. package/dist/core/server/generator/utils.d.ts +1 -0
  317. package/dist/core/server/generator/utils.js +4 -0
  318. package/dist/paraglide/messages/_index.d.ts +3 -36
  319. package/dist/paraglide/messages/_index.js +3 -71
  320. package/dist/paraglide/messages/hello_world.d.ts +5 -0
  321. package/dist/paraglide/messages/hello_world.js +33 -0
  322. package/dist/paraglide/messages/login_hello.d.ts +16 -0
  323. package/dist/paraglide/messages/login_hello.js +34 -0
  324. package/dist/paraglide/messages/login_please_login.d.ts +16 -0
  325. package/dist/paraglide/messages/login_please_login.js +34 -0
  326. package/dist/shop/server/orders.d.ts +1 -0
  327. package/dist/shop/server/orders.js +14 -0
  328. package/dist/shop/server/shop-data.d.ts +2 -0
  329. package/dist/shop/server/shop-data.js +20 -5
  330. package/dist/sveltekit/server/handle.js +17 -0
  331. package/dist/types/cms.schema.js +4 -2
  332. package/dist/types/fields.d.ts +35 -0
  333. package/dist/types/index.d.ts +1 -1
  334. package/dist/types/layout.d.ts +35 -2
  335. package/dist/updates/0.26.0/index.d.ts +2 -0
  336. package/dist/updates/0.26.0/index.js +51 -0
  337. package/dist/updates/index.js +3 -1
  338. package/package.json +29 -7
  339. package/dist/admin/client/collection/empty-state.svelte +0 -28
  340. package/dist/admin/client/collection/empty-state.svelte.d.ts +0 -9
  341. package/dist/admin/client/form/submission-status-badge.svelte +0 -41
  342. package/dist/admin/client/form/submission-status-badge.svelte.d.ts +0 -7
  343. package/dist/admin/components/media/file-preview.svelte +0 -51
  344. package/dist/admin/components/media/file-preview.svelte.d.ts +0 -6
  345. package/dist/admin/utils/formatDate.d.ts +0 -5
  346. package/dist/paraglide/messages/en.d.ts +0 -5
  347. package/dist/paraglide/messages/en.js +0 -14
  348. package/dist/paraglide/messages/pl.d.ts +0 -5
  349. package/dist/paraglide/messages/pl.js +0 -14
@@ -1,6 +1,9 @@
1
1
  <script lang="ts">
2
2
  import { Button } from '../../../components/ui/button/index.js';
3
3
  import { Switch } from '../../../components/ui/switch/index.js';
4
+ import FormErrorSummary, {
5
+ type FormErrorEntry
6
+ } from '../../components/forms/form-error-summary.svelte';
4
7
 
5
8
  type CarrierType = 'none' | 'inpost';
6
9
  type InpostServiceType =
@@ -135,6 +138,29 @@
135
138
  ? (initial.conditions.freeAbove / 100).toFixed(2)
136
139
  : '200.00'
137
140
  );
141
+ const summaryErrors = $derived.by<FormErrorEntry[]>(() => {
142
+ const list: FormErrorEntry[] = [];
143
+ if (errorMessage) {
144
+ list.push({ path: '_form', label: 'Formularz', message: errorMessage });
145
+ }
146
+ if (restrictPayments && allowedPaymentIds.length === 0) {
147
+ list.push({
148
+ path: 'allowedPaymentMethods',
149
+ label: 'Metody płatności',
150
+ message: 'Wybierz przynajmniej jedną metodę, inaczej checkout dla tej dostawy będzie zablokowany.'
151
+ });
152
+ }
153
+ const firstLang = languages[0] ?? 'pl';
154
+ if (!names[firstLang]?.trim()) {
155
+ list.push({
156
+ path: `name-${firstLang}`,
157
+ label: `Nazwa (${firstLang.toUpperCase()})`,
158
+ message: 'Wpisz nazwę widoczną w koszyku.'
159
+ });
160
+ }
161
+ return list;
162
+ });
163
+
138
164
  async function handleSubmit(e: SubmitEvent) {
139
165
  e.preventDefault();
140
166
  await onsubmit({
@@ -158,15 +184,13 @@
158
184
  </script>
159
185
 
160
186
  <form onsubmit={handleSubmit} class="space-y-6">
161
- {#if errorMessage}
162
- <div class="rounded-lg bg-red-50 p-3 text-sm text-red-800">{errorMessage}</div>
163
- {/if}
187
+ <FormErrorSummary errors={summaryErrors} />
164
188
 
165
189
  <section class="border-border bg-card space-y-4 rounded-xl border p-6">
166
190
  <h2 class="text-lg font-bold">Podstawowe informacje</h2>
167
191
 
168
192
  {#each languages as lang (lang)}
169
- <label class="block">
193
+ <label class="block" data-field-path={`name-${lang}`}>
170
194
  <span class="mb-1 block text-sm font-semibold">Nazwa ({lang})</span>
171
195
  <input
172
196
  type="text"
@@ -276,8 +300,11 @@
276
300
  </section>
277
301
 
278
302
  {#if paymentMethods.length > 0}
279
- <section class="border-border bg-card space-y-4 rounded-xl border p-6">
280
- <h2 class="text-lg font-bold">Dozwolone metody płatności</h2>
303
+ <fieldset
304
+ class="border-border bg-card space-y-4 rounded-xl border p-6"
305
+ data-field-path="allowedPaymentMethods"
306
+ >
307
+ <legend class="text-lg font-bold">Dozwolone metody płatności</legend>
281
308
  <p class="text-muted-foreground text-sm">
282
309
  Ogranicz metody płatności dla tej dostawy (np. wyłącz płatność za pobraniem dla paczkomatu).
283
310
  Jeśli wyłączone — wszystkie skonfigurowane metody są dostępne.
@@ -301,13 +328,13 @@
301
328
  </label>
302
329
  {/each}
303
330
  {#if allowedPaymentIds.length === 0}
304
- <p class="text-xs text-amber-700">
331
+ <p class="text-warning text-xs" role="alert">
305
332
  Wybierz co najmniej jedną metodę, inaczej checkout dla tej dostawy będzie zablokowany.
306
333
  </p>
307
334
  {/if}
308
335
  </div>
309
336
  {/if}
310
- </section>
337
+ </fieldset>
311
338
  {/if}
312
339
 
313
340
  <section class="border-border bg-card space-y-4 rounded-xl border p-6">
@@ -321,7 +348,7 @@
321
348
  </label>
322
349
 
323
350
  {#if carrierType === 'inpost'}
324
- <div class="border-primary/30 space-y-4 border-l-2 pl-4">
351
+ <div class="border-primary/30 space-y-4 border-l-2 pl-4" aria-live="polite">
325
352
  <p class="text-muted-foreground text-sm">
326
353
  Wymaga skonfigurowanego adaptera <code>inpostAdapter</code> w <code>cms.config.ts</code>.
327
354
  </p>
@@ -2,10 +2,46 @@
2
2
  import { goto } from '$app/navigation';
3
3
  import { getRemotes } from '../../../sveltekit/index.js';
4
4
  import ShippingMethodForm, { type ShippingFormPayload } from './shipping-method-form.svelte';
5
+ import DetailPageShell from '../../components/layout/detail-page-shell.svelte';
6
+ import StateDisplay from '../collection/state-display.svelte';
7
+ import { useInterfaceLanguage } from '../../state/interface-language.svelte.js';
8
+ import { getBreadcrumbs } from '../../state/breadcrumbs.svelte.js';
9
+ import { sidebarLang } from '../../components/layout/lang.js';
10
+ import type { InterfaceLanguage } from '../../../types/languages.js';
5
11
 
6
12
  const remotes = getRemotes();
13
+ const interfaceLanguage = useInterfaceLanguage();
14
+ const breadcrumbs = getBreadcrumbs();
7
15
  const configQuery = $derived(remotes.getShopConfig());
8
16
 
17
+ const lang: Record<
18
+ InterfaceLanguage,
19
+ { title: string; description: string; submitLabel: string; saveError: string }
20
+ > = {
21
+ pl: {
22
+ title: 'Nowa metoda wysyłki',
23
+ description: 'Skonfiguruj sposób dostawy widoczny w checkout.',
24
+ submitLabel: 'Utwórz metodę',
25
+ saveError: 'Nie udało się zapisać'
26
+ },
27
+ en: {
28
+ title: 'New shipping method',
29
+ description: 'Configure a delivery method visible at checkout.',
30
+ submitLabel: 'Create method',
31
+ saveError: 'Failed to save'
32
+ }
33
+ };
34
+ const t = $derived(lang[interfaceLanguage.current]);
35
+
36
+ $effect(() => {
37
+ const s = sidebarLang[interfaceLanguage.current].shop;
38
+ breadcrumbs.state = [
39
+ { label: s.title },
40
+ { label: s.shipping, href: '/admin/shop/shipping-methods' },
41
+ { label: t.title }
42
+ ];
43
+ });
44
+
9
45
  let saving = $state(false);
10
46
  let errorMessage = $state<string | null>(null);
11
47
 
@@ -16,30 +52,25 @@
16
52
  const row = await remotes.createShippingMethodCmd(payload);
17
53
  await goto(`/admin/shop/shipping-methods/${row.id}`);
18
54
  } catch (err) {
19
- errorMessage = err instanceof Error ? err.message : 'Nie udało się zapisać';
55
+ errorMessage = err instanceof Error ? err.message : t.saveError;
20
56
  } finally {
21
57
  saving = false;
22
58
  }
23
59
  }
24
60
  </script>
25
61
 
26
- {#if !configQuery.ready}
27
- <div class="text-muted-foreground p-6">Ładowanie…</div>
28
- {:else if configQuery.current}
29
- <div class="space-y-6 p-6">
30
- <div>
31
- <h1 class="text-2xl font-extrabold tracking-tight">Nowa metoda wysyłki</h1>
32
- <a href="/admin/shop/shipping-methods" class="text-muted-foreground text-sm hover:underline"
33
- >← Wróć do listy</a
34
- >
35
- </div>
62
+ <DetailPageShell title={t.title} description={t.description}>
63
+ {#if !configQuery.ready}
64
+ <StateDisplay kind="loading" />
65
+ {:else if configQuery.current}
36
66
  <ShippingMethodForm
37
67
  languages={configQuery.current.languages}
38
68
  vatRates={configQuery.current.vatRates}
39
69
  paymentMethods={configQuery.current.paymentMethods}
40
70
  {saving}
41
71
  {errorMessage}
72
+ submitLabel={t.submitLabel}
42
73
  onsubmit={handleSubmit}
43
74
  />
44
- </div>
45
- {/if}
75
+ {/if}
76
+ </DetailPageShell>
@@ -3,15 +3,28 @@
3
3
  import { droppable, draggable, dndState } from '@thisux/sveltednd';
4
4
  import { getRemotes } from '../../../sveltekit/index.js';
5
5
  import { useInterfaceLanguage } from '../../state/interface-language.svelte.js';
6
+ import { getBreadcrumbs } from '../../state/breadcrumbs.svelte.js';
7
+ import { sidebarLang } from '../../components/layout/lang.js';
6
8
  import { resolveI18n } from '../../../shop/pricing.js';
7
9
  import { Button } from '../../../components/ui/button/index.js';
8
10
  import PlusIcon from '@tabler/icons-svelte/icons/plus';
9
11
  import GripIcon from '@tabler/icons-svelte/icons/grip-vertical';
12
+ import { formatPlnPrice, formatCentsPrice } from '../../utils/formatters.js';
13
+ import PageHeader from '../../components/layout/page-header.svelte';
14
+ import StatusBadge from '../collection/status-badge.svelte';
15
+ import StateDisplay from '../collection/state-display.svelte';
16
+ import type { InterfaceLanguage } from '../../../types/languages.js';
10
17
 
11
18
  const remotes = getRemotes();
12
19
  const interfaceLanguage = useInterfaceLanguage();
20
+ const breadcrumbs = getBreadcrumbs();
13
21
  const query = $derived(remotes.listShippingMethodsAdmin());
14
22
 
23
+ $effect(() => {
24
+ const s = sidebarLang[interfaceLanguage.current].shop;
25
+ breadcrumbs.state = [{ label: s.title }, { label: s.shipping }];
26
+ });
27
+
15
28
  type Row = NonNullable<ReturnType<typeof remotes.listShippingMethodsAdmin>['current']>[number];
16
29
 
17
30
  let localRows = $state<Row[]>([]);
@@ -35,16 +48,61 @@
35
48
  }
36
49
  });
37
50
 
38
- function formatPricePln(pln: number) {
39
- return new Intl.NumberFormat('pl-PL', {
40
- style: 'currency',
41
- currency: 'PLN',
42
- minimumFractionDigits: 2
43
- }).format(pln);
44
- }
45
- function formatPriceCents(cents: number) {
46
- return formatPricePln(cents / 100);
47
- }
51
+ const lang: Record<
52
+ InterfaceLanguage,
53
+ {
54
+ title: string;
55
+ descriptionPrefix: string;
56
+ columnName: string;
57
+ columnPrice: string;
58
+ columnVat: string;
59
+ columnFreeFrom: string;
60
+ columnType: string;
61
+ columnStatus: string;
62
+ addMethod: string;
63
+ emptyTitle: string;
64
+ emptyDescription: string;
65
+ activeYes: string;
66
+ activeNo: string;
67
+ dragLabel: (i: number, total: number) => string;
68
+ }
69
+ > = {
70
+ en: {
71
+ title: 'Shipping methods',
72
+ descriptionPrefix: 'Drag to reorder',
73
+ columnName: 'Name',
74
+ columnPrice: 'Price (net)',
75
+ columnVat: 'VAT',
76
+ columnFreeFrom: 'Free from',
77
+ columnType: 'Type',
78
+ columnStatus: 'Status',
79
+ addMethod: 'Add method',
80
+ emptyTitle: 'No shipping methods',
81
+ emptyDescription:
82
+ 'Add your first method — courier, parcel locker, in-store pickup.',
83
+ activeYes: 'Active',
84
+ activeNo: 'Inactive',
85
+ dragLabel: (i, total) => `Drag to reorder, row ${i + 1} of ${total}`
86
+ },
87
+ pl: {
88
+ title: 'Metody wysyłki',
89
+ descriptionPrefix: 'Przeciągnij, aby zmienić kolejność',
90
+ columnName: 'Nazwa',
91
+ columnPrice: 'Cena (netto)',
92
+ columnVat: 'VAT',
93
+ columnFreeFrom: 'Darmowa od',
94
+ columnType: 'Typ',
95
+ columnStatus: 'Status',
96
+ addMethod: 'Dodaj metodę',
97
+ emptyTitle: 'Brak metod wysyłki',
98
+ emptyDescription:
99
+ 'Dodaj pierwszą metodę — np. kurier, paczkomat, odbiór osobisty.',
100
+ activeYes: 'Aktywna',
101
+ activeNo: 'Nieaktywna',
102
+ dragLabel: (i, total) => `Przeciągnij, aby zmienić kolejność, wiersz ${i + 1} z ${total}`
103
+ }
104
+ };
105
+ const t = $derived(lang[interfaceLanguage.current]);
48
106
 
49
107
  async function doReorder(fromIndex: number, toIndex: number) {
50
108
  if (fromIndex === toIndex) return;
@@ -61,48 +119,36 @@
61
119
  }
62
120
  </script>
63
121
 
64
- <div class="flex items-center justify-between gap-4 p-6">
65
- <div>
66
- <h1 class="text-2xl font-extrabold tracking-tight">Metody wysyłki</h1>
67
- <p class="text-muted-foreground text-sm">
68
- {#if query.ready}
69
- {localRows.length}
70
- {localRows.length === 1 ? 'metoda' : 'metod'} · przeciągnij
71
- <GripIcon class="inline size-3.5 align-[-2px]" />
72
- by zmienić kolejność
73
- {:else}
74
- Ładowanie…
75
- {/if}
76
- </p>
77
- </div>
78
- <Button href="/admin/shop/shipping-methods/new">
79
- <PlusIcon class="mr-1 size-4" />
80
- Dodaj metodę
81
- </Button>
82
- </div>
122
+ <div class="p-5 pb-24 md:p-7">
123
+ <PageHeader
124
+ title={t.title}
125
+ count={query.ready ? localRows.length : undefined}
126
+ description={t.descriptionPrefix}
127
+ >
128
+ {#snippet primaryActions()}
129
+ <Button href="/admin/shop/shipping-methods/new">
130
+ <PlusIcon class="size-4" />
131
+ {t.addMethod}
132
+ </Button>
133
+ {/snippet}
134
+ </PageHeader>
83
135
 
84
- <div class="px-6 pb-12">
85
136
  {#if !query.ready}
86
- <div class="text-muted-foreground">Ładowanie…</div>
137
+ <StateDisplay kind="loading" />
87
138
  {:else if localRows.length === 0}
88
- <div class="bg-lavender-lighter/40 border-border rounded-xl border p-8 text-center text-sm">
89
- <p class="mb-2 font-semibold">Brak metod wysyłki</p>
90
- <p class="text-muted-foreground">
91
- Dodaj pierwszą metodę — np. kurier, paczkomat, odbiór osobisty.
92
- </p>
93
- </div>
139
+ <StateDisplay kind="empty" title={t.emptyTitle} description={t.emptyDescription} />
94
140
  {:else}
95
- <div class="border-border overflow-hidden rounded-xl border">
141
+ <div class="overflow-hidden rounded-xl border bg-card shadow-sm">
96
142
  <div
97
- class="bg-muted/50 grid grid-cols-[32px_minmax(0,2fr)_minmax(0,1fr)_minmax(0,0.6fr)_minmax(0,1fr)_minmax(0,0.8fr)_minmax(0,1fr)] gap-3 px-4 py-3 text-left text-xs font-semibold tracking-wide uppercase"
143
+ class="text-muted-foreground bg-muted grid h-10 grid-cols-[32px_minmax(0,2fr)_minmax(0,1fr)_minmax(0,0.6fr)_minmax(0,1fr)_minmax(0,0.8fr)_minmax(0,1fr)] items-center gap-3 px-4 text-left text-[11px] font-bold tracking-[0.04em] uppercase"
98
144
  >
99
145
  <div></div>
100
- <div>Nazwa</div>
101
- <div>Cena (netto)</div>
102
- <div>VAT</div>
103
- <div>Darmowa od</div>
104
- <div>Typ</div>
105
- <div>Status</div>
146
+ <div>{t.columnName}</div>
147
+ <div>{t.columnPrice}</div>
148
+ <div>{t.columnVat}</div>
149
+ <div>{t.columnFreeFrom}</div>
150
+ <div>{t.columnType}</div>
151
+ <div>{t.columnStatus}</div>
106
152
  </div>
107
153
  <div>
108
154
  {#each localRows as m, i (m.id)}
@@ -129,14 +175,14 @@
129
175
  }
130
176
  }}
131
177
  animate:flip={{ duration: matchesReducedMotion ? 0 : 200 }}
132
- class="border-border hover:bg-muted/30 grid grid-cols-[32px_minmax(0,2fr)_minmax(0,1fr)_minmax(0,0.6fr)_minmax(0,1fr)_minmax(0,0.8fr)_minmax(0,1fr)] items-center gap-3 border-t px-4 py-3 text-sm transition-colors"
178
+ class="hover:bg-lavender-lighter/50 grid grid-cols-[32px_minmax(0,2fr)_minmax(0,1fr)_minmax(0,0.6fr)_minmax(0,1fr)_minmax(0,0.8fr)_minmax(0,1fr)] items-center gap-3 border-b px-4 py-3 text-sm transition-colors last:border-b-0"
133
179
  >
134
180
  <div
135
181
  use:draggable={{ container: i.toString(), dragData: { index: i } }}
136
182
  class="text-muted-foreground hover:text-foreground flex cursor-grab items-center justify-center"
137
183
  role="button"
138
184
  tabindex="0"
139
- aria-label={`Drag to reorder, row ${i + 1} of ${localRows.length}`}
185
+ aria-label={t.dragLabel(i, localRows.length)}
140
186
  >
141
187
  <GripIcon class="size-4" />
142
188
  </div>
@@ -145,27 +191,23 @@
145
191
  {resolveI18n(m.name as Record<string, string>, interfaceLanguage.current, '')}
146
192
  </a>
147
193
  </div>
148
- <div>{formatPricePln(Number(m.price))}</div>
194
+ <div>{formatPlnPrice(Number(m.price))}</div>
149
195
  <div>{m.vatRate}%</div>
150
196
  <div>
151
197
  {#if cond?.freeAbove != null}
152
- {formatPriceCents(cond.freeAbove)}
198
+ {formatCentsPrice(cond.freeAbove, 'PLN')}
153
199
  {:else}
154
200
  <span class="text-muted-foreground text-xs">—</span>
155
201
  {/if}
156
202
  </div>
157
203
  <div class="text-muted-foreground font-mono text-xs">{m.carrierType}</div>
158
204
  <div>
159
- {#if m.isActive}
160
- <span
161
- class="inline-flex rounded-full bg-green-100 px-2 py-0.5 text-xs text-green-800"
162
- >Aktywna</span
163
- >
164
- {:else}
165
- <span class="inline-flex rounded-full bg-gray-100 px-2 py-0.5 text-xs text-gray-800"
166
- >Nieaktywna</span
167
- >
168
- {/if}
205
+ <StatusBadge
206
+ variant="boolean"
207
+ active={m.isActive}
208
+ activeLabel={t.activeYes}
209
+ inactiveLabel={t.activeNo}
210
+ />
169
211
  </div>
170
212
  </div>
171
213
  {/each}