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,11 +1,10 @@
1
1
  <script lang="ts">
2
- import { getRawCollectionEntryLabel } from '../../utils/entryLabel.js';
2
+ import { getCollectionEntryDisplayLabel } from '../../utils/entryLabel.js';
3
3
  import { getEntryThumbnail, type MediaThumbnailLookup } from '../../utils/entryThumbnail.js';
4
4
  import { arrayMove } from '../../utils/arrayMove.js';
5
5
  import { getRemotes } from '../../../sveltekit/index.js';
6
6
  import type { CollectionConfigWithType } from '../../../types/collections.js';
7
7
  import DataTable from './data-table.svelte';
8
- import { getContentLanguage } from '../../state/content-language.svelte.js';
9
8
  import type { ColumnDef, RowSelectionState, Table } from '@tanstack/table-core';
10
9
  import { renderComponent } from '../../../components/ui/data-table/render-helpers.js';
11
10
  import EntryLink from './entry-link.svelte';
@@ -25,10 +24,11 @@
25
24
  import TablePagination from './table-pagination.svelte';
26
25
  import GridView from './grid-view.svelte';
27
26
  import BulkActionsBar from './bulk-actions-bar.svelte';
28
- import EmptyState from './empty-state.svelte';
27
+ import StateDisplay from './state-display.svelte';
29
28
  import { createCollectionViewState } from './collection-view.svelte.js';
30
29
  import type { EntryStatus as EntryStatusType, RawEntry } from '../../../types/entries.js';
31
30
  import type { RelationField, SelectField, RadioField } from '../../../types/fields.js';
31
+ import { resolveEntryUrl } from '../../../core/fields/slugPath.js';
32
32
  import {
33
33
  validateA11y,
34
34
  a11yLangPl,
@@ -37,7 +37,6 @@
37
37
  import Skeleton from '../../../components/ui/skeleton/skeleton.svelte';
38
38
 
39
39
  const remotes = getRemotes();
40
- const contentLanguage = getContentLanguage();
41
40
  const interfaceLanguage = useInterfaceLanguage();
42
41
 
43
42
  const lang: Record<
@@ -121,9 +120,13 @@
121
120
  collection: CollectionConfigWithType;
122
121
  onCreateEntry: () => void;
123
122
  addLabel: string;
123
+ data?: RawEntry[];
124
+ state?: 'loading' | 'error' | 'ok';
124
125
  };
125
126
 
126
- let { collection, onCreateEntry, addLabel }: Props = $props();
127
+ let { collection, onCreateEntry, addLabel, data: injectedData, state: injectedState }: Props = $props();
128
+
129
+ const useInjectedData = $derived(injectedData !== undefined);
127
130
 
128
131
  const viewState = createCollectionViewState(collection.slug);
129
132
 
@@ -193,14 +196,16 @@
193
196
 
194
197
  const hasActiveDataFilter = $derived(Object.values(activeDataFilters).some((v) => v !== null));
195
198
 
196
- // Find seo field for slug extraction
197
- const seoField = $derived(collection.fields.find((f) => f.type === 'seo'));
198
-
199
- // Determine if we need fetch-all fallback (search active or sorting by name)
199
+ // Determine if we need the fetch-all fallback. Server pagination can't honour
200
+ // a client-side status filter (it would only see the current page) or
201
+ // search / sort-by-name, so in those cases we fetch the whole collection and
202
+ // filter / sort / paginate on the client.
200
203
  const isSortingByName = $derived(
201
204
  viewState.sorting.length > 0 && viewState.sorting[0].id === 'name'
202
205
  );
203
- const useServerPagination = $derived(!searchQuery && !isSortingByName);
206
+ const useServerPagination = $derived(
207
+ !searchQuery && !isSortingByName && !viewState.statusFilter
208
+ );
204
209
 
205
210
  // Is the current filter for archived entries?
206
211
  const isArchivedFilter = $derived(viewState.statusFilter === 'archived');
@@ -240,9 +245,21 @@
240
245
  }
241
246
  );
242
247
 
243
- // Reactive query
248
+ // Reactive query (skipped when data is injected via prop)
244
249
  const entriesQuery = $derived(remotes.getRawEntries(queryParams));
245
250
 
251
+ const dataResult = $derived(
252
+ useInjectedData
253
+ ? { entries: injectedData ?? [], total: (injectedData ?? []).length }
254
+ : entriesQuery.current
255
+ );
256
+
257
+ const isReady = $derived(
258
+ useInjectedData ? injectedState !== 'loading' : entriesQuery.ready
259
+ );
260
+
261
+ const isError = $derived(useInjectedData && injectedState === 'error');
262
+
246
263
  // Track relation labels
247
264
  let labelLookup = $state<Record<string, string>>({});
248
265
 
@@ -409,7 +426,7 @@
409
426
  }
410
427
 
411
428
  function getVersionData(entry: RawEntry): Record<string, unknown> | undefined {
412
- const lang = contentLanguage.current;
429
+ const lang = interfaceLanguage.current;
413
430
  const draft = entry.draftVersions[lang];
414
431
  const published = entry.publishedVersions[lang];
415
432
  if (draft?.data) return draft.data as Record<string, unknown>;
@@ -444,15 +461,14 @@
444
461
  return values;
445
462
  }
446
463
 
447
- function extractSlug(entry: RawEntry): string | undefined {
448
- if (!seoField) return undefined;
464
+ function extractEntryUrl(entry: RawEntry): string | undefined {
449
465
  const data = getVersionData(entry);
450
466
  if (!data) return undefined;
451
- const seoData = data[seoField.slug];
452
- if (seoData && typeof seoData === 'object' && 'slug' in seoData) {
453
- return (seoData as { slug?: string }).slug || undefined;
454
- }
455
- return undefined;
467
+ return resolveEntryUrl({
468
+ slugField: collection.slugField,
469
+ pathTemplate: collection.pathTemplate,
470
+ data: data as Record<string, unknown>
471
+ });
456
472
  }
457
473
 
458
474
  function countA11yWarnings(entry: RawEntry): number {
@@ -474,7 +490,7 @@
474
490
  }
475
491
  for (const entry of entries) {
476
492
  // Collect UUIDs from all version sources (draft + published) to match mapEntryToRow
477
- const lang = contentLanguage.current;
493
+ const lang = interfaceLanguage.current;
478
494
  const dataSources = [
479
495
  entry.publishedVersions[lang]?.data,
480
496
  entry.draftVersions[lang]?.data,
@@ -545,7 +561,7 @@
545
561
  function mapEntryToRow(entry: RawEntry, lookup: Record<string, string> = {}, mediaThumbs: MediaThumbnailLookup = {}): CollectionDataTableRow {
546
562
  const data = getVersionData(entry) || {};
547
563
  // For custom columns, prefer published data (complete) over draft (may be partial)
548
- const lang = contentLanguage.current;
564
+ const lang = interfaceLanguage.current;
549
565
  const columnData = entry.publishedVersions[lang]?.data || entry.draftVersions[lang]?.data || data;
550
566
  const customData: Record<string, unknown> = {};
551
567
  if (collection.listColumns) {
@@ -567,9 +583,10 @@
567
583
  customData[fieldSlug] = '';
568
584
  }
569
585
  } else if (fieldData && typeof fieldData === 'object' && !Array.isArray(fieldData)) {
570
- // For localized fields, extract current content language value
586
+ // Localized field show the value in the UI language (fallback to any)
571
587
  const localized = fieldData as Record<string, unknown>;
572
- customData[fieldSlug] = localized[contentLanguage.current] ?? Object.values(localized)[0] ?? '';
588
+ customData[fieldSlug] =
589
+ localized[interfaceLanguage.current] ?? Object.values(localized)[0] ?? '';
573
590
  } else {
574
591
  customData[fieldSlug] = fieldData ?? '';
575
592
  }
@@ -577,12 +594,10 @@
577
594
  }
578
595
  return {
579
596
  id: entry.id,
580
- name: getRawCollectionEntryLabel(entry, collection, contentLanguage.current),
581
- slug: (() => {
582
- const s = extractSlug(entry);
583
- if (!s) return undefined;
584
- return collection.pathTemplate ? collection.pathTemplate.replace('{slug}', s) : s;
585
- })(),
597
+ // Entry title in the admin list follows the UI language (with cross-language
598
+ // fallback) the content-language selector only governs the editor.
599
+ name: getCollectionEntryDisplayLabel(entry, collection, interfaceLanguage.current),
600
+ slug: extractEntryUrl(entry),
586
601
  url: `/admin/entries/${entry.id}`,
587
602
  status: getEntryStatus(entry),
588
603
  createdAt: new Date(entry.createdAt),
@@ -695,13 +710,15 @@
695
710
  }
696
711
  </script>
697
712
 
698
- {#if !entriesQuery.ready}
713
+ {#if isError}
714
+ <StateDisplay kind="error" />
715
+ {:else if !isReady}
699
716
  <div class="space-y-4 p-4">
700
717
  <Skeleton class="h-10 w-full" />
701
718
  <Skeleton class="h-64 w-full" />
702
719
  </div>
703
- {:else if entriesQuery.current}
704
- {@const result = entriesQuery.current}
720
+ {:else if dataResult}
721
+ {@const result = dataResult}
705
722
  {@const allRows = result.entries.map((e) => mapEntryToRow(e, labelLookup, mediaLookup))}
706
723
  {@const filteredRows = (() => {
707
724
  let rows = allRows;
@@ -754,7 +771,7 @@
754
771
  (viewState.pageIndex + 1) * viewState.pageSize
755
772
  )}
756
773
 
757
- <div class:opacity-60={entriesQuery.loading} class="transition-opacity duration-200">
774
+ <div class:opacity-60={!useInjectedData && entriesQuery.loading} class="transition-opacity duration-200">
758
775
  <TableToolbar
759
776
  {searchQuery}
760
777
  onSearchChange={(q) => {
@@ -765,8 +782,6 @@
765
782
  onStatusFilterChange={(f) => (viewState.statusFilter = f)}
766
783
  viewMode={viewState.viewMode}
767
784
  onViewModeChange={(m) => (viewState.viewMode = m)}
768
- {onCreateEntry}
769
- createLabel={addLabel}
770
785
  dataFilters={dataFilterConfigs}
771
786
  {activeDataFilters}
772
787
  onDataFilterChange={(slug, value) => {
@@ -776,7 +791,8 @@
776
791
  />
777
792
 
778
793
  {#if totalItems === 0 && !searchQuery}
779
- <EmptyState
794
+ <StateDisplay
795
+ kind="empty"
780
796
  title={lang[interfaceLanguage.current].emptyTitle}
781
797
  description={lang[interfaceLanguage.current].emptyDescription}
782
798
  ctaLabel={addLabel}
@@ -1,8 +1,11 @@
1
1
  import type { CollectionConfigWithType } from '../../../types/collections.js';
2
+ import type { RawEntry } from '../../../types/entries.js';
2
3
  type Props = {
3
4
  collection: CollectionConfigWithType;
4
5
  onCreateEntry: () => void;
5
6
  addLabel: string;
7
+ data?: RawEntry[];
8
+ state?: 'loading' | 'error' | 'ok';
6
9
  };
7
10
  declare const CollectionEntries: import("svelte").Component<Props, {}, "">;
8
11
  type CollectionEntries = ReturnType<typeof CollectionEntries>;
@@ -7,6 +7,10 @@
7
7
  import { getLocalizedLabel } from '../../utils/collectionLabel.js';
8
8
  import { useInterfaceLanguage } from '../../state/interface-language.svelte.js';
9
9
  import type { InterfaceLanguage } from '../../../types/languages.js';
10
+ import type { RawEntry } from '../../../types/entries.js';
11
+ import PageHeader from '../../components/layout/page-header.svelte';
12
+ import Button from '../../../components/ui/button/button.svelte';
13
+ import Plus from '@tabler/icons-svelte/icons/plus';
10
14
 
11
15
  const remotes = getRemotes();
12
16
  const interfaceLanguage = useInterfaceLanguage();
@@ -18,11 +22,15 @@
18
22
 
19
23
  type Props = {
20
24
  collection: CollectionConfigWithType;
25
+ data?: RawEntry[];
26
+ state?: 'loading' | 'error' | 'ok';
21
27
  };
22
28
 
23
- let { collection }: Props = $props();
29
+ let { collection, data: injectedData, state: injectedState }: Props = $props();
24
30
  let entryCount = $state<number | null>(null);
25
31
 
32
+ const useInjectedData = $derived(injectedData !== undefined);
33
+
26
34
  async function onCreateEntry() {
27
35
  const newEntry = await remotes.createEntry({ type: 'collection', slug: collection.slug });
28
36
  goto(`/admin/entries/${newEntry.id}`);
@@ -46,6 +54,10 @@
46
54
  });
47
55
 
48
56
  $effect(() => {
57
+ if (useInjectedData) {
58
+ entryCount = injectedData?.length ?? 0;
59
+ return;
60
+ }
49
61
  remotes.getRawEntries({ slug: collection.slug }).then(({ total }) => {
50
62
  entryCount = total;
51
63
  });
@@ -53,18 +65,20 @@
53
65
  </script>
54
66
 
55
67
  <div class="p-5 pb-24 md:p-7">
56
- <header class="mb-6">
57
- <div class="mb-1 flex items-center gap-3">
58
- <h1 class="text-foreground text-2xl font-bold">{collectionLabel}</h1>
59
- {#if entryCount !== null}
60
- <span
61
- class="bg-muted text-muted-foreground inline-flex items-center justify-center rounded-full px-2.5 py-0.5 text-xs font-semibold"
62
- >
63
- {entryCount}
64
- </span>
65
- {/if}
66
- </div>
67
- </header>
68
+ <PageHeader title={collectionLabel} count={entryCount ?? undefined}>
69
+ {#snippet primaryActions()}
70
+ <Button onclick={onCreateEntry} data-testid="create-entry-button">
71
+ <Plus class="mr-1 size-4" />
72
+ {lang[interfaceLanguage.current].add}
73
+ </Button>
74
+ {/snippet}
75
+ </PageHeader>
68
76
 
69
- <CollectionEntries {collection} {onCreateEntry} addLabel={lang[interfaceLanguage.current].add} />
77
+ <CollectionEntries
78
+ {collection}
79
+ {onCreateEntry}
80
+ addLabel={lang[interfaceLanguage.current].add}
81
+ data={injectedData}
82
+ state={injectedState}
83
+ />
70
84
  </div>
@@ -1,6 +1,9 @@
1
1
  import type { CollectionConfigWithType } from '../../../types/collections.js';
2
+ import type { RawEntry } from '../../../types/entries.js';
2
3
  type Props = {
3
4
  collection: CollectionConfigWithType;
5
+ data?: RawEntry[];
6
+ state?: 'loading' | 'error' | 'ok';
4
7
  };
5
8
  declare const Collection: import("svelte").Component<Props, {}, "">;
6
9
  type Collection = ReturnType<typeof Collection>;