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
@@ -4,11 +4,35 @@
4
4
  import { Button } from '../../../components/ui/button/index.js';
5
5
  import MailIcon from '@tabler/icons-svelte/icons/mail';
6
6
  import RefundDialog from './refund-dialog.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 { formatCentsPrice, formatDateTime } from '../../utils/formatters.js';
11
+ import PageHeader from '../../components/layout/page-header.svelte';
12
+ import StatusBadge from '../collection/status-badge.svelte';
13
+ import ConfirmationDialog from '../../components/dialogs/confirmation-dialog.svelte';
14
+ import SaveIndicator from '../entry/header/save-indicator.svelte';
15
+ import FormErrorSummary, {
16
+ type FormErrorEntry
17
+ } from '../../components/forms/form-error-summary.svelte';
18
+ import type { OrderStatus as OrderStatusT } from '../../../shop/types.js';
7
19
 
8
20
  const remotes = getRemotes();
21
+ const interfaceLanguage = useInterfaceLanguage();
22
+ const breadcrumbs = getBreadcrumbs();
9
23
 
10
24
  const orderId = $derived(page.params.id ?? '');
11
25
  const query = $derived(remotes.getOrderForAdmin(orderId));
26
+
27
+ $effect(() => {
28
+ const s = sidebarLang[interfaceLanguage.current].shop;
29
+ const number = query.current?.order?.number;
30
+ breadcrumbs.state = [
31
+ { label: s.title },
32
+ { label: s.orders, href: '/admin/shop/orders' },
33
+ { label: number ?? '…' }
34
+ ];
35
+ });
12
36
  const refundsQuery = $derived(remotes.getOrderRefundsAdmin(orderId));
13
37
  let refundDialogOpen = $state(false);
14
38
 
@@ -35,18 +59,6 @@
35
59
  { value: 'refunded', label: 'Zwrócone' }
36
60
  ];
37
61
 
38
- const STATUS_STYLES: Record<string, string> = {
39
- new: 'bg-blue-100 text-blue-800',
40
- awaitingPayment: 'bg-yellow-100 text-yellow-800',
41
- paid: 'bg-green-100 text-green-800',
42
- preparing: 'bg-purple-100 text-purple-800',
43
- sent: 'bg-indigo-100 text-indigo-800',
44
- done: 'bg-gray-100 text-gray-800',
45
- cancelled: 'bg-red-100 text-red-800',
46
- paymentRejected: 'bg-red-100 text-red-800',
47
- refunded: 'bg-orange-100 text-orange-800'
48
- };
49
-
50
62
  let newStatus = $state<OrderStatus | ''>('');
51
63
  let note = $state('');
52
64
  let saving = $state(false);
@@ -55,28 +67,24 @@
55
67
  let errorMessage = $state<string | null>(null);
56
68
  let successMessage = $state<string | null>(null);
57
69
 
58
- function statusLabel(s: string) {
59
- return STATUSES.find((x) => x.value === s)?.label ?? s;
60
- }
70
+ type SaveStatus = 'idle' | 'saving' | 'saved' | 'unsaved' | 'error';
71
+ let statusFormStatus = $state<SaveStatus>('idle');
72
+ let statusFormSavedAt = $state<Date | null>(null);
61
73
 
62
- function formatPrice(cents: number, currency: string) {
63
- return new Intl.NumberFormat('pl-PL', {
64
- style: 'currency',
65
- currency,
66
- minimumFractionDigits: 2
67
- }).format(cents / 100);
68
- }
74
+ const statusFormSummaryErrors = $derived<FormErrorEntry[]>(
75
+ errorMessage
76
+ ? [{ path: 'newStatus', label: 'Status zamówienia', message: errorMessage }]
77
+ : []
78
+ );
69
79
 
70
- function formatDate(d: Date | string) {
71
- return new Intl.DateTimeFormat('pl-PL', {
72
- dateStyle: 'short',
73
- timeStyle: 'short'
74
- }).format(new Date(d));
80
+ function statusLabel(s: string) {
81
+ return STATUSES.find((x) => x.value === s)?.label ?? s;
75
82
  }
76
83
 
77
84
  async function changeStatus() {
78
85
  if (!newStatus) return;
79
86
  saving = true;
87
+ statusFormStatus = 'saving';
80
88
  errorMessage = null;
81
89
  successMessage = null;
82
90
  try {
@@ -89,8 +97,11 @@
89
97
  note = '';
90
98
  newStatus = '';
91
99
  successMessage = 'Status zaktualizowany. Email wysłany do klienta.';
100
+ statusFormSavedAt = new Date();
101
+ statusFormStatus = 'saved';
92
102
  } catch (err) {
93
103
  errorMessage = err instanceof Error ? err.message : 'Nie udało się zmienić statusu';
104
+ statusFormStatus = 'error';
94
105
  } finally {
95
106
  saving = false;
96
107
  }
@@ -131,8 +142,13 @@
131
142
  }
132
143
  }
133
144
 
134
- async function handleCancelShipment() {
135
- if (!confirm('Anulować przesyłkę? Etykieta zostanie unieważniona w ShipX.')) return;
145
+ let cancelShipmentOpen = $state(false);
146
+
147
+ function handleCancelShipment() {
148
+ cancelShipmentOpen = true;
149
+ }
150
+
151
+ async function performCancelShipment() {
136
152
  shipping = true;
137
153
  errorMessage = null;
138
154
  successMessage = null;
@@ -168,53 +184,57 @@
168
184
  label: string;
169
185
  }> | null}
170
186
 
171
- <div class="space-y-6 p-6">
172
- <div class="flex items-start justify-between gap-4">
173
- <div>
174
- <h1 class="text-2xl font-extrabold tracking-tight">
175
- <span class="font-mono">{order.number}</span>
176
- </h1>
177
- <p class="text-muted-foreground text-sm">
178
- {formatDate(order.createdAt)} ·
179
- <a href="/admin/shop/orders" class="hover:underline">← Lista</a>
180
- </p>
181
- </div>
182
- <span
183
- class="inline-flex rounded-full px-3 py-1 text-xs font-semibold {STATUS_STYLES[
184
- order.status
185
- ] ?? 'bg-gray-100 text-gray-800'}"
186
- >
187
- {statusLabel(order.status)}
188
- </span>
189
- </div>
187
+ <div class="space-y-6 p-3 sm:p-5 md:p-7">
188
+ <PageHeader
189
+ title={`Zamówienie ${order.number}`}
190
+ description={formatDateTime(order.createdAt, interfaceLanguage.current)}
191
+ >
192
+ {#snippet secondaryActions()}
193
+ <StatusBadge variant="order" status={order.status as OrderStatusT} />
194
+ {/snippet}
195
+ </PageHeader>
196
+ <a href="/admin/shop/orders" class="text-primary text-sm hover:underline">← Lista zamówień</a>
190
197
 
191
198
  {#if errorMessage}
192
- <div class="rounded-lg bg-red-50 p-3 text-sm text-red-800">{errorMessage}</div>
199
+ <div
200
+ class="bg-destructive-bg text-destructive rounded-lg p-3 text-sm"
201
+ role="alert"
202
+ aria-live="assertive"
203
+ >
204
+ {errorMessage}
205
+ </div>
193
206
  {/if}
194
207
  {#if successMessage}
195
- <div class="rounded-lg bg-green-50 p-3 text-sm text-green-800">{successMessage}</div>
208
+ <div
209
+ class="bg-success-bg text-success rounded-lg p-3 text-sm"
210
+ role="status"
211
+ aria-live="polite"
212
+ >
213
+ {successMessage}
214
+ </div>
196
215
  {/if}
197
216
 
198
217
  <div class="grid grid-cols-1 gap-6 lg:grid-cols-[2fr_1fr]">
199
218
  <div class="space-y-6">
200
- <section class="border-border bg-card space-y-3 rounded-xl border p-5">
219
+ <section class="border-border bg-card space-y-3 rounded-xl border p-3 sm:p-5">
201
220
  <h2 class="text-base font-bold">Pozycje</h2>
202
- <table class="w-full text-sm">
221
+ <div class="-mx-3 overflow-x-auto sm:mx-0">
222
+ <table class="w-full min-w-[640px] text-sm">
203
223
  <thead class="text-muted-foreground text-left text-xs uppercase">
204
224
  <tr>
205
- <th class="pb-2 font-semibold">Nazwa</th>
225
+ <th class="px-3 pb-2 font-semibold sm:px-0">Nazwa</th>
206
226
  <th class="pb-2 font-semibold">SKU</th>
207
227
  <th class="pb-2 text-center font-semibold">Ilość</th>
208
228
  <th class="pb-2 text-right font-semibold">Brutto / szt.</th>
209
229
  <th class="pb-2 text-right font-semibold">VAT</th>
210
- <th class="pb-2 text-right font-semibold">Suma</th>
230
+ <th class="px-3 pb-2 text-right font-semibold sm:px-0">Suma</th>
211
231
  </tr>
212
232
  </thead>
213
233
  <tbody>
214
234
  {#each items as item (item.id)}
215
235
  {@const name = (item.nameSnapshot as { product?: string; variant?: string }) ?? {}}
216
236
  <tr class="border-border border-t">
217
- <td class="py-2">
237
+ <td class="px-3 py-2 sm:px-0">
218
238
  <div class="font-medium">{name.product ?? '—'}</div>
219
239
  {#if name.variant}
220
240
  <div class="text-muted-foreground text-xs">{name.variant}</div>
@@ -225,11 +245,11 @@
225
245
  >
226
246
  <td class="py-2 text-center">{item.qty}</td>
227
247
  <td class="py-2 text-right tabular-nums"
228
- >{formatPrice(item.priceGrossSnapshot, order.currency)}</td
248
+ >{formatCentsPrice(item.priceGrossSnapshot, order.currency)}</td
229
249
  >
230
250
  <td class="text-muted-foreground py-2 text-right">{item.vatRate}%</td>
231
- <td class="py-2 text-right font-semibold tabular-nums">
232
- {formatPrice(item.priceGrossSnapshot * item.qty, order.currency)}
251
+ <td class="px-3 py-2 text-right font-semibold tabular-nums sm:px-0">
252
+ {formatCentsPrice(item.priceGrossSnapshot * item.qty, order.currency)}
233
253
  </td>
234
254
  </tr>
235
255
  {/each}
@@ -238,46 +258,43 @@
238
258
  <tr>
239
259
  <td colspan="5" class="pt-3 text-right text-sm">Wysyłka (brutto):</td>
240
260
  <td class="pt-3 text-right tabular-nums"
241
- >{formatPrice(order.shippingGross, order.currency)}</td
261
+ >{formatCentsPrice(order.shippingGross, order.currency)}</td
242
262
  >
243
263
  </tr>
244
264
  <tr>
245
265
  <td colspan="5" class="text-right text-sm">Razem netto:</td>
246
266
  <td class="text-muted-foreground text-right tabular-nums">
247
- {formatPrice(order.totalNet, order.currency)}
267
+ {formatCentsPrice(order.totalNet, order.currency)}
248
268
  </td>
249
269
  </tr>
250
270
  <tr>
251
271
  <td colspan="5" class="text-right text-sm">VAT:</td>
252
272
  <td class="text-muted-foreground text-right tabular-nums">
253
- {formatPrice(order.vatAmount, order.currency)}
273
+ {formatCentsPrice(order.vatAmount, order.currency)}
254
274
  </td>
255
275
  </tr>
256
276
  <tr>
257
- <td colspan="5" class="pb-1 text-right text-base font-bold">Razem brutto:</td>
258
- <td class="text-primary pb-1 text-right text-base font-extrabold tabular-nums">
259
- {formatPrice(order.totalGross, order.currency)}
277
+ <td colspan="5" class="px-3 pb-1 text-right text-base font-bold sm:px-0">Razem brutto:</td>
278
+ <td class="text-primary px-3 pb-1 text-right text-base font-extrabold tabular-nums sm:px-0">
279
+ {formatCentsPrice(order.totalGross, order.currency)}
260
280
  </td>
261
281
  </tr>
262
282
  </tfoot>
263
283
  </table>
284
+ </div>
264
285
  </section>
265
286
 
266
- <section class="border-border bg-card space-y-3 rounded-xl border p-5">
287
+ <section class="border-border bg-card space-y-3 rounded-xl border p-3 sm:p-5">
267
288
  <h2 class="text-base font-bold">Historia statusów</h2>
268
289
  <ol class="space-y-2 text-sm">
269
290
  {#each history as h (h.id)}
270
291
  <li class="flex items-start gap-3">
271
- <span
272
- class="mt-0.5 inline-flex shrink-0 rounded-full px-2 py-0.5 text-xs {STATUS_STYLES[
273
- h.status
274
- ] ?? 'bg-gray-100 text-gray-800'}"
275
- >
276
- {statusLabel(h.status)}
277
- </span>
292
+ <div class="mt-0.5">
293
+ <StatusBadge variant="order" status={h.status as OrderStatusT} />
294
+ </div>
278
295
  <div class="flex-1">
279
296
  <div class="text-muted-foreground text-xs">
280
- {formatDate(h.changedAt)} · {h.changedBy ?? '—'}
297
+ {formatDateTime(h.changedAt, interfaceLanguage.current)} · {h.changedBy ?? '—'}
281
298
  </div>
282
299
  {#if h.note}
283
300
  <div class="text-sm">{h.note}</div>
@@ -300,8 +317,12 @@
300
317
  </div>
301
318
 
302
319
  <div class="space-y-6">
303
- <section class="border-border bg-card space-y-3 rounded-xl border p-5">
304
- <h2 class="text-base font-bold">Zmień status</h2>
320
+ <section class="border-border bg-card space-y-3 rounded-xl border p-3 sm:p-5">
321
+ <div class="flex items-center justify-between">
322
+ <h2 class="text-base font-bold">Zmień status</h2>
323
+ <SaveIndicator status={statusFormStatus} lastSavedAt={statusFormSavedAt} />
324
+ </div>
325
+ <FormErrorSummary errors={statusFormSummaryErrors} />
305
326
  <label class="block">
306
327
  <span class="text-muted-foreground mb-1 block text-xs font-semibold">Nowy status</span>
307
328
  <select
@@ -326,13 +347,13 @@
326
347
  ></textarea>
327
348
  </label>
328
349
  <Button onclick={changeStatus} disabled={saving || !newStatus} class="w-full">
329
- {saving ? 'Zapisywanie…' : 'Zmień status + wyślij email'}
350
+ {saving ? 'Zapisuję…' : 'Zapisz status i powiadom klienta'}
330
351
  </Button>
331
352
  </section>
332
353
 
333
354
  {#if refundsQuery.ready && refundsQuery.current}
334
355
  {@const r = refundsQuery.current}
335
- <section class="border-border bg-card space-y-3 rounded-xl border p-5 text-sm">
356
+ <section class="border-border bg-card space-y-3 rounded-xl border p-3 text-sm sm:p-5">
336
357
  <h2 class="text-base font-bold">Zwroty</h2>
337
358
  {#if r.refunds.length > 0}
338
359
  <ul class="space-y-2">
@@ -340,10 +361,10 @@
340
361
  <li class="border-border flex items-start justify-between gap-2 border-t pt-2">
341
362
  <div>
342
363
  <div class="font-medium tabular-nums">
343
- {formatPrice(refund.amount, r.currency)}
364
+ {formatCentsPrice(refund.amount, r.currency)}
344
365
  </div>
345
366
  <div class="text-muted-foreground text-xs">
346
- {formatDate(refund.createdAt)} · {refund.status}
367
+ {formatDateTime(refund.createdAt, interfaceLanguage.current)} · {refund.status}
347
368
  </div>
348
369
  {#if refund.reason}
349
370
  <div class="text-muted-foreground text-xs">{refund.reason}</div>
@@ -354,10 +375,10 @@
354
375
  </ul>
355
376
  <div class="border-border border-t pt-2 text-xs">
356
377
  <div class="text-muted-foreground">
357
- Zwrócono: <strong>{formatPrice(r.refundedAmount, r.currency)}</strong>
378
+ Zwrócono: <strong>{formatCentsPrice(r.refundedAmount, r.currency)}</strong>
358
379
  </div>
359
380
  <div class="text-muted-foreground">
360
- Pozostało: <strong>{formatPrice(r.remainingRefundable, r.currency)}</strong>
381
+ Pozostało: <strong>{formatCentsPrice(r.remainingRefundable, r.currency)}</strong>
361
382
  </div>
362
383
  </div>
363
384
  {:else}
@@ -376,7 +397,7 @@
376
397
  {/if}
377
398
 
378
399
  {#if order.carrierType && order.carrierType !== 'none'}
379
- <section class="border-border bg-card space-y-3 rounded-xl border p-5 text-sm">
400
+ <section class="border-border bg-card space-y-3 rounded-xl border p-3 text-sm sm:p-5">
380
401
  <h2 class="text-base font-bold">
381
402
  Przesyłka <span class="text-muted-foreground font-mono text-xs"
382
403
  >{order.carrierType}</span
@@ -430,7 +451,7 @@
430
451
  </section>
431
452
  {/if}
432
453
 
433
- <section class="border-border bg-card space-y-2 rounded-xl border p-5 text-sm">
454
+ <section class="border-border bg-card space-y-2 rounded-xl border p-3 text-sm sm:p-5">
434
455
  <h2 class="text-base font-bold">Klient</h2>
435
456
  <div>
436
457
  <div class="font-medium">{order.customerName ?? '—'}</div>
@@ -471,7 +492,7 @@
471
492
  {/if}
472
493
 
473
494
  {#if consents && consents.length > 0}
474
- <section class="border-border bg-card space-y-2 rounded-xl border p-5 text-sm">
495
+ <section class="border-border bg-card space-y-2 rounded-xl border p-3 text-sm sm:p-5">
475
496
  <h2 class="text-base font-bold">Zgody</h2>
476
497
  {#each consents as c (c.id)}
477
498
  <div class="flex items-start gap-2">
@@ -511,3 +532,11 @@
511
532
  />
512
533
  {/if}
513
534
  {/if}
535
+
536
+ <ConfirmationDialog
537
+ bind:open={cancelShipmentOpen}
538
+ title="Anulować przesyłkę?"
539
+ description="Etykieta wysyłkowa zostanie unieważniona w ShipX. Tej akcji nie cofniesz."
540
+ loading={shipping}
541
+ onConfirm={performCancelShipment}
542
+ />