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
@@ -23,6 +23,19 @@ export interface TextField extends BaseField {
23
23
  minLength?: number;
24
24
  maxLength?: number;
25
25
  pattern?: string;
26
+ /**
27
+ * Friendly validation message shown when {@link pattern} fails. A raw regex
28
+ * means nothing to an editor, so provide a localized human message here
29
+ * (e.g. "Use lowercase letters and dashes only"). Falls back to a generic
30
+ * message when omitted.
31
+ */
32
+ patternError?: Localized;
33
+ /**
34
+ * Localized hint describing the expected format, shown in the field
35
+ * description instead of the raw regex. Without it the raw {@link pattern}
36
+ * is never surfaced to the editor.
37
+ */
38
+ patternHint?: Localized;
26
39
  multiline?: boolean;
27
40
  defaultValue?: string;
28
41
  }
@@ -60,6 +73,12 @@ export interface FileField extends BaseField {
60
73
  maxSizeMB?: number;
61
74
  multiple?: boolean;
62
75
  defaultValue?: string | string[];
76
+ /**
77
+ * Render mode for selected file(s).
78
+ * - 'preview' (default): aspect-square miniature + carousel for multiple (parity with media field).
79
+ * - 'list': compact list of rows (icon + name + size + X) — better for non-visual files (PDF, audio, other).
80
+ */
81
+ display?: 'preview' | 'list';
63
82
  }
64
83
  export interface ImageFieldStyle {
65
84
  name: string;
@@ -172,17 +191,33 @@ export interface BlocksField extends BaseField {
172
191
  defaultValue?: ObjectFieldData[];
173
192
  displayMode?: 'simple' | 'blocks';
174
193
  }
194
+ /**
195
+ * @public
196
+ * Slug field — a normalized URL-safe string. Its presence does NOT imply a
197
+ * public URL; routability is decided by the collection's `slugField`/`pathTemplate`
198
+ * config, not by this field existing.
199
+ */
175
200
  export interface SlugField extends BaseField {
176
201
  type: 'slug';
177
202
  pattern?: string;
178
203
  sourceField?: string;
179
204
  defaultValue?: string;
180
205
  }
206
+ /**
207
+ * @public
208
+ * v1.0-frozen. New properties may only be added as OPTIONAL (additive,
209
+ * non-breaking).
210
+ */
181
211
  export interface SeoField extends BaseField {
182
212
  type: 'seo';
183
213
  slugSource?: string;
184
214
  titleSource?: string;
185
215
  }
216
+ /**
217
+ * @public
218
+ * v1.0-frozen data contract: `entry.seo.*`. New fields may only be added as
219
+ * OPTIONAL (additive, non-breaking).
220
+ */
186
221
  export interface SeoFieldData {
187
222
  slug: string;
188
223
  canonicalUrl?: string;
@@ -12,6 +12,6 @@ export { type FormField, type FormFieldType, type FormBaseField, type FormTextFi
12
12
  export { type CMSConfig, type ApiKeyConfig, type AuthConfig, type TypographyConfig } from './cms.js';
13
13
  export { type PluginConfig, type CustomFieldDefinition } from './plugins.js';
14
14
  export { type Language, type Localized } from './languages.js';
15
- export { type Layout, type LayoutNode, type LayoutPreset, type LayoutNodeType, type ColumnRatio, type SectionNode, type ColumnsNode, type CardNode, type AccordionNode, type StackNode } from './layout.js';
15
+ export { type Layout, type LayoutNode, type LayoutPreset, type LayoutNodeType, type ColumnRatio, type SectionNode, type ColumnsNode, type CardNode, type AccordionNode, type StackNode, type TabsNode, type TabNode } from './layout.js';
16
16
  export { type CmsContext } from './cms-context.js';
17
17
  export { type UserData, type Breadcrumb } from '../admin/types.js';
@@ -7,7 +7,7 @@ export type LayoutPreset = 'sidebar-right' | 'two-column' | {
7
7
  preset: 'two-column';
8
8
  left?: string[];
9
9
  };
10
- export type LayoutNodeType = 'section' | 'columns' | 'card' | 'accordion' | 'stack';
10
+ export type LayoutNodeType = 'section' | 'columns' | 'card' | 'accordion' | 'stack' | 'tabs' | 'tab';
11
11
  export type ColumnRatio = '1fr 1fr' | '2fr 1fr' | '1fr 2fr' | '3fr 1fr' | '1fr 3fr' | '1fr 1fr 1fr';
12
12
  interface LayoutNodeBase {
13
13
  type: LayoutNodeType;
@@ -51,7 +51,40 @@ export interface StackNode extends LayoutNodeBase {
51
51
  fields?: string[];
52
52
  children?: LayoutNode[];
53
53
  }
54
- export type LayoutNode = SectionNode | ColumnsNode | CardNode | AccordionNode | StackNode;
54
+ /**
55
+ * Tab strip. Renders an accessible tablist; each child `tab` becomes a panel.
56
+ * All panels stay mounted (inactive ones hidden) so validation, dirty-tracking
57
+ * and conditional visibility keep working across tabs.
58
+ *
59
+ * Constraints (enforced by {@link validateLayout}):
60
+ * - `children` must contain only `tab` nodes
61
+ * - `tabs` may not be nested inside another `tab`/`tabs`
62
+ * - allowed top-level or inside section/card/columns/stack
63
+ *
64
+ * @public
65
+ * @example
66
+ * { type: 'tabs', children: [
67
+ * { type: 'tab', label: { en: 'Content', pl: 'Treść' }, fields: ['title', 'body'] },
68
+ * { type: 'tab', label: { en: 'SEO' }, fields: ['seo'] }
69
+ * ] }
70
+ */
71
+ export interface TabsNode extends LayoutNodeBase {
72
+ type: 'tabs';
73
+ children: TabNode[];
74
+ }
75
+ /**
76
+ * A single tab. Only valid as a direct child of {@link TabsNode}.
77
+ * `label` is required — it is the trigger text. Use `fields` for a flat tab
78
+ * or `children` to nest sections/cards/columns inside the tab.
79
+ * @public
80
+ */
81
+ export interface TabNode extends LayoutNodeBase {
82
+ type: 'tab';
83
+ label: Localized;
84
+ fields?: string[];
85
+ children?: LayoutNode[];
86
+ }
87
+ export type LayoutNode = SectionNode | ColumnsNode | CardNode | AccordionNode | StackNode | TabsNode | TabNode;
55
88
  export declare function isLayoutLeaf(node: LayoutNode): node is LayoutNode & {
56
89
  fields: string[];
57
90
  };
@@ -0,0 +1,2 @@
1
+ import type { CmsUpdate } from '../index.js';
2
+ export declare const update: CmsUpdate;
@@ -0,0 +1,51 @@
1
+ export const update = {
2
+ version: '0.26.0',
3
+ date: '2026-05-26',
4
+ description: 'UI Normalization → release readiness: slug regex camelCase + S8 detail/edit + S9 fields a11y polish + S10 a11y final audit + S10b/S10c mobile responsiveness full pass (sticky first column DataTable, Dialog fullscreenMobile prop, media library Sheet drawers, entry hybrid preview drawer toggle, dashboard mobile layout flip). 43/43 mobile Playwright pass (3 viewports × 12 widoków, 0 critical axe).',
5
+ features: [
6
+ '`getFieldA11yProps({ id, hasDescription, hasError, required })` (`src/lib/admin/utils/field-a11y.ts`) — buduje `aria-describedby` chain, `aria-invalid`, `aria-required` dla pól w `ui/form` (formsnap) — bridge bez breaking migracji ui/form ↔ ui/field koegzystencji z S3.',
7
+ '`<LiveRegion>` (`src/lib/components/ui/live-region/`) — prosty primitive (`sr-only` + `role="status"` + `aria-live`) zastąpił inline duplicates w relation-field i blocks-field; gotowy do reuse.',
8
+ '`field-renderer.svelte` propaguje `Form.Control` `props` (formsnap snippet `children({ props })`) do wszystkich field components (boolean, number, date, datetime, select, media, file, blocks, array, object, slug, seo, shop, url, relation). Dotąd tylko text/radio/checkboxes dostawały aria — reszta była niewired.',
9
+ 'Blocks field — keyboard reorder/add/remove/duplicate ogłasza przez `<LiveRegion>` ("Przeniesiono X na pozycję Y", "Dodano blok X" itp.). Block picker modal — `aria-labelledby` z Dialog.Title + `aria-live` na search results count.',
10
+ 'Slug field — live preview slugify\'d wartości pod inputem (gdy user typuje wielką literą), copy button z `UseClipboard` + toast "Skopiowano slug". Description default w demo blog-post.',
11
+ 'Relation field — combobox a11y wzmocnione: `aria-busy` na Command.List podczas async search, picker dialog `Dialog.Title`/`Dialog.Description` (sr-only), reorder LiveRegion przeniesione na primitive.',
12
+ 'Media + File fields — `Dialog.Title` + `Dialog.Description` (sr-only) na picker dialogs (eliminuje bits-ui ostrzeżenie o brakujących aria-labelledby).',
13
+ 'Shop field — `aria-pressed` na price mode toggle (Netto/Brutto), `role="group"` + `aria-label` na toggle group, `aria-label="Usuń wariant N"` na trash buttons.',
14
+ 'SEO field — `aria-live="polite"` na char counter (50/60, 120/160) — SR słyszy zmianę gdy user wpisuje.',
15
+ 'Storybook fields — nowe `file.stories.svelte` (4 warianty) i `shop.stories.svelte` (4 warianty). Slug stories rozszerzone o WithPreview/ClipboardCopy. Text stories — Required wariant. Slug ma już `tags: [\'autodocs\']` (zdjęty `no-test`).',
16
+ 'Slugi pól, kolekcji, singles i form akceptują camelCase (`/^[a-z][a-zA-Z0-9-]*$/`). Można pisać `slug: \'siteName\'` zamiast `\'site-name\'` i odczytywać `entry.data.siteName` bez bracket notation. Walidacja blokuje nadal PascalCase, prefix `_` i digit-leading.',
17
+ 'Helper `quoteKey()` w `src/lib/core/server/generator/utils.ts` — opakowuje slugi nie-spełniające JS identifier shape w cudzysłowy w wygenerowanym TS.',
18
+ 'Nowy węzeł layoutu `tabs`/`tab` (`src/lib/types/layout.ts`) — taby konfigurowane per kolekcja w `layout[]`, renderowane przez `LayoutRenderer` (bits-ui Tabs: `role=tab/tablist/tabpanel`, strzałki/Home/End, `aria-selected`). Wszystkie panele pozostają zamontowane (walidacja/dirty-tracking/`showWhen` działają na nieaktywnych tabach), error-summary i klik-w-preview (hybrid) automatycznie przełączają tab i fokusują pole (`activateContainingTabs`), trigger taba z błędem ma wskaźnik (kropka + tekst dla SR, nie sam kolor). Aktywny tab najwyższego poziomu utrwalany w `?tab` (deep-link, przeżywa reload). `tab` przyjmuje `fields` (płaski) lub `children` (sekcje/karty w środku); zakaz zagnieżdżonych tabów + walidacja struktury w `validateLayout`. Stary sztywny tab Content/SEO w `entry.svelte` usunięty — SEO to teraz zwykły `tab` w configu (demo blog-post).',
19
+ '`<FormErrorSummary>` (`src/lib/admin/components/forms/`) — banner z listą błędów, anchor links scroll do `[data-field-path]`, focus pierwszego błędnego pola, `role="alert"` + `aria-live="assertive"`. Adoptowany w entry, coupon-form, shipping-method-form, shop-order-detail.',
20
+ '`<ConfirmationDialog>` (`src/lib/admin/components/dialogs/`) — typed wrapper na bits-ui AlertDialog z destructive/default variant, default focus na Cancel (bezpieczniejszy), loading state. Zastąpił 5× `confirm()` (form-submissions, entry, shop-order-detail, coupons-list, dashboard) + dodany dla Archive entry.',
21
+ '`<DetailPageShell>` (`src/lib/admin/components/layout/`) — wspólny layout (PageHeader + body + opcjonalny sidebar) dla coupon-edit / shipping-method-edit. Skip-link target `#detail-main`.',
22
+ 'Coupon edit form zmigrowany na sveltekit-superforms + formsnap (jak account/profile-section) — schema zod (`coupon-schema.ts`), SPA mode, error summary + per-field errors.',
23
+ 'Entry SaveIndicator: nowe stany + COGA copy (`Niezapisane zmiany`, `Zapisuję…`, `Zapisano X temu` z `formatRelativeDate` recompute co 30s, `Błąd zapisu`), `aria-atomic` + role flip alert/status. `<svelte:window>` `beforeunload` guard gdy unsaved.',
24
+ '`<A11yHeaderBadge>` (`src/lib/admin/client/entry/header/a11y-header-badge.svelte`) — persistent warning chip w entry-header pokazujący liczbę a11y issues (images bez alt, heading hierarchy, generic link text). Reuse `validateA11y` z `a11y-validator.ts`. Strong-warning UX (B.1) — nie blokuje save, prowadzi autora. Kolumna a11y w collection-entries.svelte (S5) + persistent header badge (S10) + publish-panel sheet detail = pełna ścieżka widoczności.',
25
+ '`scripts/lighthouse-audit.ts` (`pnpm audit:lighthouse`) — ad-hoc CLI runner po 11 URL admin (login, dashboard, collections, users, media, forms, account, maintenance, shop ×3). Lighthouse 13 + chrome-launcher + auth cookie z `e2e/.auth/admin.json`. Output `.tmp/lighthouse/<view>.json` + `summary.md`, target a11y ≥95.',
26
+ '`e2e/admin/a11y-baseline.spec.ts` rozszerzone 4 → 14 widoków: 10 page-level (login, dashboard, collections-list, entry-edit, users-list, media-library, forms-detail, account, maintenance, user-create-dialog) + 4 shop best-effort (skip jeśli moduł nie configured). Per spec 0 critical violations enforced.',
27
+ 'TipTap link-dialog `aria-expanded` na 2 collapsible sections (Dostępność + Indeksowanie) — uzupełnia ATAG B.3 author tool a11y. FigureNodeView/image-dialog/publish-panel: `:focus-visible` fallback z `var(--ring)` outline (focus indicator widoczny zawsze, nawet gdy `:focus` zmienia tylko border-color).',
28
+ 'Publiczny `resolveSeo(entry, language?)` (`includio-cms/core`) — stabilny znormalizowany read-path nad zamrożonym kontraktem `entry.seo.*` (wartości localized spłaszczane po języku; `ogImage` przepuszczany jako string lub MediaFile) do budowy własnego `<head>` lub zasilenia komponentu `<Seo>`. `SlugField`/`SeoField`/`SeoFieldData` oznaczone `@public` + v1.0-frozen.',
29
+ 'Wewnętrzny `seoFieldDescriptor` — pojedyncze źródło prawdy kształtu pola SEO dla generatorów Zod + TS (wyjście bit-identyczne, pilnowane snapshotami i testami drift-guard). Przygotowuje przyszły plugin-rehoming SEO bez breaking change. Istniejąca niespójność Zod(required)/TS(optional) dla `description`/`ogImage` udokumentowana i zachowana 1:1 (do rozstrzygnięcia post-1.0).',
30
+ 'Mobile responsiveness full pass (S10c) — pełny mobile UX panelu admina: `DataTable` sticky first column + edge-bleed scroll wrapper (1 fix → wszystkie 8+ list pages, w tym shop), `Dialog.Content` `fullscreenMobile` prop (media/file picker + tiptap image/video dialogi), media library tags sidebar + FileDetails jako Sheet drawer na <md (`hidden md:flex` aside), entry hybrid preview Sheet drawer toggle z `IsMobile(1024)` (<lg pokazuje tylko form + floating "Podgląd" button), shop-order detail items table z `min-w-[640px]` + horizontal scroll, char counter w `text-field-wrapper` na mobile stackowany pod polem zamiast `absolute right`, EntryHeader padding + SaveIndicator text `max-sm:sr-only`, PageHeader text-scale `text-2xl sm:text-3xl lg:text-4xl`, breadcrumb truncacja middle segments `/…/` na <sm, table-toolbar search `w-full min-w-0` na mobile, tiptap toolbar separatory `hidden sm:block`, relation popover `w-[var(--bits-popover-anchor-width)] max-w-[calc(100vw-1rem)]`. Playwright `e2e/admin/mobile-responsive.spec.ts` rozszerzony o iPad portrait (768×1024) + shop-shipping view + `scrollWidth <= window.innerWidth` page-overflow assertion: 43/43 testów pass, 0 critical, 0-2 serious axe per (3 viewports × 12 widoków).',
31
+ 'Dashboard mobile layout flip (S10c follow-up) — `dashboard-page.svelte`: main wrapper `flex gap-5` → `flex flex-col gap-5 lg:flex-row` + sub-grid `grid-cols-2` → `grid-cols-1 sm:grid-cols-2` + sidebar `max-w-80 flex-1 shrink-0` → `w-full shrink-0 lg:max-w-80 lg:flex-1`. Side-by-side 2-col layout aktywowany dopiero od `lg` (1024px); poniżej stack vertically, sub-grid kolumna pojedyncza do `sm` (640px). Eliminuje cramped 2-col scroll na 375-768px.'
32
+ ],
33
+ fixes: [
34
+ '`runtime/types.ts` generuje poprawny TypeScript dla kebab-case slugów (np. `\'published-at\'?: string` zamiast gołego `published-at?: string`, który był syntaks błędem). Naprawione w `generateTsTypeFromFields`, `generateFlatTsTypeFromFields`, `generateInlineBlockTypeString`, object/blocks variants oraz form fields generator.',
35
+ 'Shop order detail: `bg-red-50` / `bg-green-50` zamienione na tokenized `bg-destructive-bg` / `bg-success-bg` z `role="alert"`/`role="status"`. Status form ma teraz SaveIndicator + FormErrorSummary.',
36
+ 'Shipping-method form: `<fieldset>/<legend>` na payment methods (poprawne grouping dla SR), `aria-live="polite"` na carrier config panel, FormErrorSummary zamiast `bg-red-50` div, `text-amber-700` zamienione na `text-warning` token.',
37
+ 'Coupons list: delete dialog A11y (focus trap, ESC, return focus) zamiast browser `confirm()`.',
38
+ 'Form submissions bulk delete: AlertDialog zamiast `confirm()`, plural PL forms ("3 zgłoszenia" vs "5 zgłoszeń").',
39
+ 'Dashboard delete-orphaned: AlertDialog z liczbą wpisów w description zamiast `confirm()`.',
40
+ '`pnpm demo` seed (`scripts/seed-demo.ts`) — twarda bramka walidacji: każdy `entry_version` przed surowym INSERT-em przechodzi przez realny schemat CMS (`generateZodSchemaFromFields(..., { localized: false })` — ten sam oracle co admin/publish). Niezgodne dane przerywają seed z czytelnym `collection/lang/entry: path: message`. Dane demo doprowadzone do zgodności: blog-post `title` bez nierealnego `minLength: 50` (+ usunięte śmieciowe debugowe pole `test`/`dupa` z kolekcji), media jako UUID-string zamiast `{id,url,alt}` (cover/thumbnail/image/logo/favicon/photo), daty pełne ISO, dołożone wymagane obiekty `seo`, `url` jako obiekt, bloki z `_slug` zamiast `_type`, `localizedTags`/`links` w kształcie schematu.',
41
+ 'Lista entries w kolekcji pokazuje "(bez tytułu)"/"(untitled)" zamiast surowego UUID gdy wpis nie ma tytułu — spójne z breadcrumbem na ekranie edycji. Wspólny helper `getCollectionEntryDisplayLabel` (`src/lib/admin/utils/entryLabel.ts`) używany przez list/grid i breadcrumb (fallback wykrywany po `language === null`, odporny na tytuł = id).',
42
+ 'Slug first-class: podgląd URL wpisu w adminie (`collection-entries.svelte`) odhardkodowany z wymogu pola typu `seo` — kolekcja ze standalone polem slug + skonfigurowanym `slugField` pokazuje URL; bez `slugField`/`pathTemplate` świadomie brak `_url` (np. kolekcje atrybutów), bez błędu. Wydzielony czysty resolver `slugPath.ts` (bez `getCMS`) współdzielony przez admin client i server.'
43
+ ],
44
+ breakingChanges: [
45
+ '**Entry autosave usunięty** — wcześniej 30s timeout + Ctrl/Cmd+S manual. Teraz tylko manual save (button "Zapisz szkic" zawsze widoczny + Ctrl/Cmd+S shortcut). Powód: stara impl mogła w niejasnych sytuacjach modyfikować published data; bezpieczniejsza re-introdukcja z draft-only guard zaplanowana w ROADMAP backlog. Migracja: użytkownicy muszą explicit zapisać przed nawigacją (jest `beforeunload` guard).',
46
+ 'EntryHeader props: nowy `lastSavedAt?: Date | null` (default `null`). Niezbędny dla SaveIndicator "Zapisano X temu". Konsumenci niestandardowi (entry-header-story-demo, custom integracje) muszą propagować z entry.svelte.',
47
+ 'EntryForm props: usunięty hardcoded podział Content/SEO (`tabFilter` nigdy nie trafił do release\'u — zastąpiony węzłem layoutu `tabs`). Grupowanie w taby = teraz config `layout[]`. Kolekcje bez `tabs` bez zmian; SEO w demo blog-post wyrażone jako `tab`. Dodany prop `errorPaths?: Set<string>` (EntryForm/LayoutRenderer) do wskaźnika błędu na tabie.',
48
+ '`coupon-form.svelte` przepisane od zera na sveltekit-superforms — props identyczne (`initial`, `submitLabel`, `onSubmit`, `onCancel`), ale wewnętrzny mechanizm walidacji zmieniony (zod schema zamiast hand-rolled). Call-sites bez zmian.'
49
+ ],
50
+ notes: 'V1-DECISIONS.md sekcja "Sesja 8" zawiera pełny audit decyzji + grep gates. Pełna superForm migracja shipping-method-form odłożona do backlogu (skomplikowany state: net/gross toggle + dynamic carrier + multi-lang record). Storybook entry-page story też w backlogu (wymaga mock setRemotes + RawEntry fixtures — robione w S10 a11y sweep). VoiceOver smoke test (manual user-delegated) — checklist w `V1-UI-AUDIT.md` sekcja "VoiceOver smoke (manual)". Kompatybilność z istniejącymi danymi: pełna (zero schema changes; coupon zachowuje stary kontrakt API).'
51
+ };
@@ -59,6 +59,7 @@ import { update as update0220 } from './0.22.0/index.js';
59
59
  import { update as update0230 } from './0.23.0/index.js';
60
60
  import { update as update0240 } from './0.24.0/index.js';
61
61
  import { update as update0250 } from './0.25.0/index.js';
62
+ import { update as update0260 } from './0.26.0/index.js';
62
63
  export const updates = [
63
64
  update0065,
64
65
  update0066,
@@ -120,7 +121,8 @@ export const updates = [
120
121
  update0220,
121
122
  update0230,
122
123
  update0240,
123
- update0250
124
+ update0250,
125
+ update0260
124
126
  ];
125
127
  export const getUpdatesFrom = (fromVersion) => {
126
128
  const fromParts = fromVersion.split('.').map(Number);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "includio-cms",
3
- "version": "0.25.0",
3
+ "version": "0.26.0",
4
4
  "scripts": {
5
5
  "dev": "vite dev",
6
6
  "build": "vite build && npm run prepack",
@@ -18,6 +18,8 @@
18
18
  "test:coverage": "vitest run --coverage",
19
19
  "pretest:integration": "pnpm prepack",
20
20
  "test:integration": "TEST_DATABASE_URL=postgres://root:mysecretpassword@localhost:5434/test vitest run --project=integration",
21
+ "demo": "tsx scripts/demo.ts",
22
+ "demo:down": "docker compose --profile demo down -v",
21
23
  "db:start": "docker compose up",
22
24
  "db:push": "drizzle-kit push",
23
25
  "db:migrate": "drizzle-kit migrate",
@@ -30,13 +32,15 @@
30
32
  "db:e2e:migrate": "DATABASE_URL=postgres://root:mysecretpassword@localhost:5435/test_e2e drizzle-kit push --force",
31
33
  "storybook": "storybook dev -p 6006",
32
34
  "build-storybook": "storybook build",
35
+ "storybook:test": "vitest run --project=storybook",
33
36
  "create:user": "tsx cli/addUser/index.ts",
34
37
  "cli": "tsx cli/init/index.ts",
35
38
  "build:cli": "tsc cli/init/index.ts --outDir dist/cli/init --module commonjs --esModuleInterop",
36
39
  "changelog": "tsx scripts/generate-changelog.ts",
37
40
  "docs:compile": "tsx scripts/compile-docs.ts",
38
41
  "api:generate": "tsx scripts/generate-api-md.ts",
39
- "prepublishOnly": "tsx scripts/generate-changelog.ts && tsx scripts/compile-docs.ts && tsx scripts/generate-api-md.ts && git commit -am \"Prepublish v${version} (CHANGELOG.md, DOCS.md and API.md updated)\""
42
+ "audit:lighthouse": "tsx scripts/lighthouse-audit.ts",
43
+ "prepublishOnly": "tsx scripts/generate-changelog.ts && tsx scripts/compile-docs.ts && tsx scripts/generate-api-md.ts && git add CHANGELOG.md DOCS.md API.md && (git diff --cached --quiet || git commit -m \"Prepublish v${npm_package_version} (CHANGELOG.md, DOCS.md and API.md updated)\")"
40
44
  },
41
45
  "bin": {
42
46
  "includio": "./dist/cli/index.js"
@@ -95,6 +99,18 @@
95
99
  "types": "./dist/db-postgres/index.d.ts",
96
100
  "node": "./dist/db-postgres/index.js"
97
101
  },
102
+ "./db-postgres/schema-core": {
103
+ "types": "./dist/db-postgres/schema-core.d.ts",
104
+ "node": "./dist/db-postgres/schema-core.js"
105
+ },
106
+ "./db-postgres/schema-shop": {
107
+ "types": "./dist/db-postgres/schema-shop.d.ts",
108
+ "node": "./dist/db-postgres/schema-shop.js"
109
+ },
110
+ "./auth-schema": {
111
+ "types": "./dist/server/db/schema/auth-schema.d.ts",
112
+ "node": "./dist/server/db/schema/auth-schema.js"
113
+ },
98
114
  "./shop": {
99
115
  "types": "./dist/shop/index.d.ts",
100
116
  "svelte": "./dist/shop/index.js",
@@ -179,9 +195,11 @@
179
195
  },
180
196
  "devDependencies": {
181
197
  "@anthropic-ai/sdk": "^0.39.0",
198
+ "@axe-core/playwright": "^4.11.3",
182
199
  "@chromatic-com/storybook": "^5.0.1",
183
200
  "@eslint/compat": "^1.2.5",
184
201
  "@eslint/js": "^9.18.0",
202
+ "@fontsource-variable/plus-jakarta-sans": "^5.2.8",
185
203
  "@playwright/test": "^1.49.1",
186
204
  "@storybook/addon-a11y": "^10.2.10",
187
205
  "@storybook/addon-docs": "^10.2.10",
@@ -201,10 +219,12 @@
201
219
  "@types/fluent-ffmpeg": "^2.1.27",
202
220
  "@types/node": "^22",
203
221
  "@types/nodemailer": "^7.0.4",
204
- "nodemailer": "^7.0.11",
205
- "openai": "^6.9.0",
222
+ "@vitest/browser": "3.2.4",
223
+ "@vitest/coverage-v8": "^3.2.3",
224
+ "axe-core": "^4.11.4",
206
225
  "better-auth": "^1.3.34",
207
226
  "bits-ui": "^2.11.5",
227
+ "chrome-launcher": "^1.2.1",
208
228
  "clsx": "^2.1.1",
209
229
  "drizzle-kit": "^0.30.2",
210
230
  "drizzle-orm": "^0.40.0",
@@ -217,14 +237,16 @@
217
237
  "formsnap": "^2.0.1",
218
238
  "globals": "^16.0.0",
219
239
  "jsdom": "^26.0.0",
240
+ "lighthouse": "^13.2.0",
220
241
  "mdsvex": "^0.12.3",
242
+ "nodemailer": "^7.0.11",
243
+ "openai": "^6.9.0",
221
244
  "paneforge": "^1.0.2",
222
245
  "postgres": "^3.4.5",
223
246
  "prettier": "^3.4.2",
224
247
  "prettier-plugin-svelte": "^3.3.3",
225
248
  "prettier-plugin-tailwindcss": "^0.6.11",
226
249
  "publint": "^0.3.2",
227
- "stripe": "^17.0.0",
228
250
  "rehype-autolink-headings": "^7.1.0",
229
251
  "rehype-slug": "^6.0.0",
230
252
  "remark-gfm": "^4.0.1",
@@ -232,6 +254,7 @@
232
254
  "sharp": "^0.34.2",
233
255
  "shiki": "^3.21.0",
234
256
  "storybook": "^10.2.10",
257
+ "stripe": "^17.0.0",
235
258
  "svelte": "^5.43.6",
236
259
  "svelte-check": "^4.0.0",
237
260
  "svelte-sonner": "^1.0.5",
@@ -244,8 +267,7 @@
244
267
  "typescript": "^5.0.0",
245
268
  "typescript-eslint": "^8.20.0",
246
269
  "vite": "^7.2.2",
247
- "vitest": "^3.2.3",
248
- "@vitest/coverage-v8": "^3.2.3"
270
+ "vitest": "^3.2.3"
249
271
  },
250
272
  "keywords": [
251
273
  "svelte"
@@ -1,28 +0,0 @@
1
- <script lang="ts">
2
- import FileText from '@tabler/icons-svelte/icons/file-text';
3
- import Button from '../../../components/ui/button/button.svelte';
4
- import Plus from '@tabler/icons-svelte/icons/plus';
5
-
6
- type Props = {
7
- title: string;
8
- description: string;
9
- ctaLabel?: string;
10
- onCta?: () => void;
11
- };
12
-
13
- let { title, description, ctaLabel, onCta }: Props = $props();
14
- </script>
15
-
16
- <div class="flex flex-col items-center justify-center py-16 px-4 text-center">
17
- <div class="flex items-center justify-center w-[72px] h-[72px] rounded-2xl bg-muted mb-5">
18
- <FileText class="size-8 text-muted-foreground" />
19
- </div>
20
- <h3 class="text-lg font-bold text-foreground mb-2">{title}</h3>
21
- <p class="text-sm text-muted-foreground max-w-[360px] mb-6">{description}</p>
22
- {#if ctaLabel && onCta}
23
- <Button variant="default" onclick={onCta} data-testid="create-entry-button">
24
- <Plus class="size-4 mr-1.5" />
25
- {ctaLabel}
26
- </Button>
27
- {/if}
28
- </div>
@@ -1,9 +0,0 @@
1
- type Props = {
2
- title: string;
3
- description: string;
4
- ctaLabel?: string;
5
- onCta?: () => void;
6
- };
7
- declare const EmptyState: import("svelte").Component<Props, {}, "">;
8
- type EmptyState = ReturnType<typeof EmptyState>;
9
- export default EmptyState;
@@ -1,41 +0,0 @@
1
- <script lang="ts">
2
- import { useInterfaceLanguage } from '../../state/interface-language.svelte.js';
3
- import type { InterfaceLanguage } from '../../../types/languages.js';
4
-
5
- type Props = {
6
- isRead: boolean;
7
- variant?: 'badge' | 'dot';
8
- };
9
-
10
- let { isRead, variant = 'badge' }: Props = $props();
11
-
12
- const interfaceLanguage = useInterfaceLanguage();
13
-
14
- const lang: Record<InterfaceLanguage, { new: string; read: string }> = {
15
- pl: { new: 'Nowe', read: 'Przeczytane' },
16
- en: { new: 'New', read: 'Read' }
17
- };
18
- </script>
19
-
20
- {#if variant === 'dot'}
21
- {#if !isRead}
22
- <span
23
- class="bg-primary inline-block size-2 rounded-full"
24
- aria-label={lang[interfaceLanguage.current].new}
25
- ></span>
26
- {:else}
27
- <span class="inline-block size-2" aria-label={lang[interfaceLanguage.current].read}></span>
28
- {/if}
29
- {:else if isRead}
30
- <span
31
- class="bg-muted text-muted-foreground inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium"
32
- >
33
- {lang[interfaceLanguage.current].read}
34
- </span>
35
- {:else}
36
- <span
37
- class="inline-flex items-center rounded-full bg-blue-100 px-2 py-0.5 text-xs font-medium text-blue-700 dark:bg-blue-900/30 dark:text-blue-400"
38
- >
39
- {lang[interfaceLanguage.current].new}
40
- </span>
41
- {/if}
@@ -1,7 +0,0 @@
1
- type Props = {
2
- isRead: boolean;
3
- variant?: 'badge' | 'dot';
4
- };
5
- declare const SubmissionStatusBadge: import("svelte").Component<Props, {}, "">;
6
- type SubmissionStatusBadge = ReturnType<typeof SubmissionStatusBadge>;
7
- export default SubmissionStatusBadge;
@@ -1,51 +0,0 @@
1
- <script lang="ts">
2
- import Image from '../../../sveltekit/components/image.svelte';
3
- import { cn } from '../../../utils.js';
4
- import PhotoOff from '@tabler/icons-svelte/icons/photo-off';
5
- import VideoOff from '@tabler/icons-svelte/icons/video-off';
6
-
7
- import { getRemotes } from '../../context/remotes.js';
8
- import { useInterfaceLanguage } from '../../state/interface-language.svelte.js';
9
- import type { InterfaceLanguage } from '../../../types/languages.js';
10
-
11
- const interfaceLanguage = useInterfaceLanguage();
12
- const previewLang: Record<InterfaceLanguage, { loading: string }> = {
13
- pl: { loading: 'Ładowanie...' },
14
- en: { loading: 'Loading...' }
15
- };
16
- const pvt = $derived(previewLang[interfaceLanguage.current]);
17
-
18
- const remotes = getRemotes();
19
-
20
- type Props = {
21
- id: string;
22
- class?: string;
23
- };
24
-
25
- let { id, class: className = undefined } = $props();
26
-
27
- const fileQuery = $derived(remotes.getFileById(id));
28
- </script>
29
-
30
- <div class="border">
31
- {#if !fileQuery.ready}
32
- {pvt.loading}
33
- {:else if fileQuery.current}
34
- {@const file = fileQuery.current}
35
- {#if file.type === 'image'}
36
- <Image data={file} class={className} />
37
- {:else if file.type === 'video'}
38
- {#if file.thumbnailUrl}
39
- <Image data={{ ...file, url: file.thumbnailUrl }} class={className} />
40
- {:else}
41
- <div class={cn('border-primary flex items-center justify-center border p-4', className)}>
42
- <VideoOff />
43
- </div>
44
- {/if}
45
- {/if}
46
- {:else}
47
- <div class={cn('border-primary flex items-center justify-center border p-4', className)}>
48
- <PhotoOff />
49
- </div>
50
- {/if}
51
- </div>
@@ -1,6 +0,0 @@
1
- declare const FilePreview: import("svelte").Component<{
2
- id: any;
3
- class?: any;
4
- }, {}, "">;
5
- type FilePreview = ReturnType<typeof FilePreview>;
6
- export default FilePreview;
@@ -1,5 +0,0 @@
1
- import type { InterfaceLanguage } from '../../types/languages.js';
2
- export declare function toLocaleCode(lang: string): string;
3
- export declare function formatRelativeDate(date: Date | string, lang?: InterfaceLanguage): string;
4
- export declare function formatShortDate(date: Date | string, lang?: InterfaceLanguage): string;
5
- export declare function formatAbsoluteDate(date: Date | string, lang?: InterfaceLanguage): string;
@@ -1,5 +0,0 @@
1
- export const hello_world: (inputs: {
2
- name: NonNullable<unknown>;
3
- }) => string;
4
- export const login_hello: (inputs: {}) => string;
5
- export const login_please_login: (inputs: {}) => string;
@@ -1,14 +0,0 @@
1
- /* eslint-disable */
2
-
3
-
4
- export const hello_world = /** @type {(inputs: { name: NonNullable<unknown> }) => string} */ (i) => {
5
- return `Hello, ${i.name} from en!`
6
- };
7
-
8
- export const login_hello = /** @type {(inputs: {}) => string} */ () => {
9
- return `Welcome back`
10
- };
11
-
12
- export const login_please_login = /** @type {(inputs: {}) => string} */ () => {
13
- return `Login to your account`
14
- };
@@ -1,5 +0,0 @@
1
- export const hello_world: (inputs: {
2
- name: NonNullable<unknown>;
3
- }) => string;
4
- export const login_hello: (inputs: {}) => string;
5
- export const login_please_login: (inputs: {}) => string;
@@ -1,14 +0,0 @@
1
- /* eslint-disable */
2
-
3
-
4
- export const hello_world = /** @type {(inputs: { name: NonNullable<unknown> }) => string} */ (i) => {
5
- return `Hello, ${i.name} from pl!`
6
- };
7
-
8
- export const login_hello = /** @type {(inputs: {}) => string} */ () => {
9
- return `Witaj ponownie`
10
- };
11
-
12
- export const login_please_login = /** @type {(inputs: {}) => string} */ () => {
13
- return `Zaloguj się na swoje konto`
14
- };