includio-cms 0.24.1 → 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,7 +1,11 @@
1
+ import type { MediaFile } from '../../../types/media.js';
1
2
  type Props = {
2
3
  selected?: string[] | string;
3
4
  multiple?: boolean;
4
5
  accept?: string;
6
+ showHeader?: boolean;
7
+ data?: MediaFile[];
8
+ state?: 'loading' | 'error' | 'ok';
5
9
  };
6
10
  declare const MediaLibrary: import("svelte").Component<Props, {}, "selected">;
7
11
  type MediaLibrary = ReturnType<typeof MediaLibrary>;
@@ -42,7 +42,7 @@
42
42
  cancel: 'Anuluj',
43
43
  confirm: 'Potwierdź',
44
44
  selectedCount: 'Wybrano',
45
- clickToSelect: '{lang[interfaceLanguage.current].clickToSelect}',
45
+ clickToSelect: 'Kliknij plik, aby go wybrać',
46
46
  selectedFile: 'Wybrany plik:'
47
47
  },
48
48
  en: {
@@ -66,11 +66,12 @@
66
66
  selected?: string[] | string;
67
67
  multiple?: boolean;
68
68
  accept?: string;
69
+ maxSizeMB?: number;
69
70
  onConfirm?: () => void;
70
71
  onCancel?: () => void;
71
72
  };
72
73
 
73
- let { selected = $bindable([]), multiple = false, accept, onConfirm, onCancel }: Props = $props();
74
+ let { selected = $bindable([]), multiple = false, accept, maxSizeMB, onConfirm, onCancel }: Props = $props();
74
75
 
75
76
  const PAGE_SIZE = 48;
76
77
 
@@ -209,6 +210,7 @@
209
210
  <FileUpload
210
211
  onUpload={() => { page = 0; loadedFiles = []; filesQuery.refresh(); countQuery.refresh(); tagCountsQuery.refresh(); totalCountQuery.refresh(); untaggedCountQuery.refresh(); }}
211
212
  {accept}
213
+ {maxSizeMB}
212
214
  bind:dropZoneRef
213
215
  tagIds={activeTagFilter && activeTagFilter !== 'untagged' ? [activeTagFilter] : undefined}
214
216
  />
@@ -2,6 +2,7 @@ type Props = {
2
2
  selected?: string[] | string;
3
3
  multiple?: boolean;
4
4
  accept?: string;
5
+ maxSizeMB?: number;
5
6
  onConfirm?: () => void;
6
7
  onCancel?: () => void;
7
8
  };
@@ -137,9 +137,9 @@
137
137
 
138
138
  <div class="flex h-full flex-col">
139
139
  <div class="flex-1 overflow-y-auto py-2 scrollbar-thin" role="listbox" aria-label="Filtry tagów">
140
- <ul class="flex flex-col gap-px px-1.5">
140
+ <ul class="flex flex-col gap-px px-1.5" role="presentation">
141
141
  <!-- All files -->
142
- <li>
142
+ <li role="presentation">
143
143
  <button
144
144
  type="button"
145
145
  role="option"
@@ -161,7 +161,7 @@
161
161
  </li>
162
162
 
163
163
  <!-- Untagged -->
164
- <li>
164
+ <li role="presentation">
165
165
  <button
166
166
  type="button"
167
167
  role="option"
@@ -187,7 +187,7 @@
187
187
 
188
188
  <!-- User tags -->
189
189
  {#each tags as tag (tag.id)}
190
- <li>
190
+ <li role="presentation">
191
191
  {#if editingTagId === tag.id}
192
192
  <form
193
193
  class="flex items-center gap-1 px-1"
@@ -269,6 +269,11 @@
269
269
  border-color: var(--primary);
270
270
  }
271
271
 
272
+ .caption-input:focus-visible {
273
+ outline: 2px solid var(--ring);
274
+ outline-offset: 1px;
275
+ }
276
+
272
277
  /* Alt text field */
273
278
  .figure-alt-row {
274
279
  margin-top: 0.375rem;
@@ -320,4 +325,9 @@
320
325
  outline: none;
321
326
  border-color: var(--primary);
322
327
  }
328
+
329
+ .figure-alt-input:focus-visible {
330
+ outline: 2px solid var(--ring);
331
+ outline-offset: 1px;
332
+ }
323
333
  </style>
@@ -0,0 +1,104 @@
1
+ <!--
2
+ @component
3
+ @internal
4
+ -->
5
+ <script lang="ts">
6
+ import { onMount, type Snippet } from 'svelte';
7
+ import { BubbleMenuPlugin, type BubbleMenuPluginProps } from '@tiptap/extension-bubble-menu';
8
+ import { PluginKey } from '@tiptap/pm/state';
9
+ import type { Editor } from '@tiptap/core';
10
+
11
+ type Props = {
12
+ editor: Editor;
13
+ pluginKey?: BubbleMenuPluginProps['pluginKey'];
14
+ updateDelay?: BubbleMenuPluginProps['updateDelay'];
15
+ resizeDelay?: BubbleMenuPluginProps['resizeDelay'];
16
+ appendTo?: BubbleMenuPluginProps['appendTo'];
17
+ shouldShow?: BubbleMenuPluginProps['shouldShow'];
18
+ getReferencedVirtualElement?: BubbleMenuPluginProps['getReferencedVirtualElement'];
19
+ options?: BubbleMenuPluginProps['options'];
20
+ class?: string;
21
+ children: Snippet;
22
+ };
23
+
24
+ let {
25
+ editor,
26
+ pluginKey,
27
+ updateDelay,
28
+ resizeDelay,
29
+ appendTo,
30
+ shouldShow = null,
31
+ getReferencedVirtualElement,
32
+ options,
33
+ class: className,
34
+ children
35
+ }: Props = $props();
36
+
37
+ // svelte-ignore state_referenced_locally
38
+ const resolvedKey = pluginKey ?? new PluginKey('bubbleMenu');
39
+
40
+ let root = $state<HTMLDivElement | null>(null);
41
+ let skipFirst = true;
42
+
43
+ onMount(() => {
44
+ if (!root || !editor || editor.isDestroyed) return;
45
+
46
+ root.style.visibility = 'hidden';
47
+ root.style.position = 'absolute';
48
+
49
+ editor.registerPlugin(
50
+ BubbleMenuPlugin({
51
+ editor,
52
+ element: root,
53
+ pluginKey: resolvedKey,
54
+ updateDelay,
55
+ resizeDelay,
56
+ appendTo,
57
+ shouldShow,
58
+ getReferencedVirtualElement,
59
+ options
60
+ })
61
+ );
62
+
63
+ return () => {
64
+ editor.unregisterPlugin(resolvedKey);
65
+ requestAnimationFrame(() => {
66
+ // RAF: defer past in-flight Floating UI update
67
+ root?.parentNode?.removeChild(root);
68
+ });
69
+ };
70
+ });
71
+
72
+ $effect(() => {
73
+ updateDelay;
74
+ resizeDelay;
75
+ appendTo;
76
+ shouldShow;
77
+ getReferencedVirtualElement;
78
+ options;
79
+
80
+ if (skipFirst) {
81
+ skipFirst = false;
82
+ return;
83
+ }
84
+ if (!editor || editor.isDestroyed) return;
85
+
86
+ editor.view.dispatch(
87
+ editor.state.tr.setMeta(resolvedKey, {
88
+ type: 'updateOptions',
89
+ options: {
90
+ updateDelay,
91
+ resizeDelay,
92
+ appendTo,
93
+ shouldShow,
94
+ getReferencedVirtualElement,
95
+ options
96
+ }
97
+ })
98
+ );
99
+ });
100
+ </script>
101
+
102
+ <div bind:this={root} class={className}>
103
+ {@render children()}
104
+ </div>
@@ -0,0 +1,19 @@
1
+ import { type Snippet } from 'svelte';
2
+ import { type BubbleMenuPluginProps } from '@tiptap/extension-bubble-menu';
3
+ import type { Editor } from '@tiptap/core';
4
+ type Props = {
5
+ editor: Editor;
6
+ pluginKey?: BubbleMenuPluginProps['pluginKey'];
7
+ updateDelay?: BubbleMenuPluginProps['updateDelay'];
8
+ resizeDelay?: BubbleMenuPluginProps['resizeDelay'];
9
+ appendTo?: BubbleMenuPluginProps['appendTo'];
10
+ shouldShow?: BubbleMenuPluginProps['shouldShow'];
11
+ getReferencedVirtualElement?: BubbleMenuPluginProps['getReferencedVirtualElement'];
12
+ options?: BubbleMenuPluginProps['options'];
13
+ class?: string;
14
+ children: Snippet;
15
+ };
16
+ /** @internal */
17
+ declare const BubbleMenu: import("svelte").Component<Props, {}, "">;
18
+ type BubbleMenu = ReturnType<typeof BubbleMenu>;
19
+ export default BubbleMenu;
@@ -1,8 +1,8 @@
1
1
  <script lang="ts">
2
2
  import { onMount, getAllContexts } from 'svelte';
3
3
  import { Editor, type Editor as EditorType } from '@tiptap/core';
4
- import BubbleMenu from '@tiptap/extension-bubble-menu';
5
4
  import { extensions } from './extensions.js';
5
+ import BubbleMenu from './bubble-menu.svelte';
6
6
  import ToolbarButton from './toolbar-button.svelte';
7
7
  import EditorToolbar from './editor-toolbar.svelte';
8
8
  import LinkDialog from './link-dialog.svelte';
@@ -52,7 +52,6 @@
52
52
 
53
53
  let element = $state<HTMLDivElement | null>(null);
54
54
  let editorState = $state<{ editor: EditorType | null }>({ editor: null });
55
- let bubbleMenu = $state<HTMLDivElement | null>(null);
56
55
 
57
56
  // Dialog states
58
57
  let linkDialogOpen = $state(false);
@@ -80,9 +79,6 @@
80
79
  ...extensions,
81
80
  ...extraExtensions,
82
81
  HeadingA11yPlugin,
83
- BubbleMenu.configure({
84
- element: bubbleMenu!
85
- }),
86
82
  Placeholder.configure({
87
83
  showOnlyCurrent: false,
88
84
  placeholder: ({ node, hasAnchor, editor }) => {
@@ -154,16 +150,35 @@
154
150
  {/if}
155
151
 
156
152
  <!-- Bubble Menu -->
157
- <div bind:this={bubbleMenu} class="bubble-menu">
158
- {#if ed}
159
- <div class="bg-popover text-popover-foreground flex items-center gap-0.5 rounded-lg border p-1 shadow-md">
153
+ {#if ed}
154
+ <BubbleMenu
155
+ editor={ed}
156
+ appendTo={() => document.body}
157
+ options={{ scrollTarget: element!, placement: 'bottom', offset: 8 }}
158
+ shouldShow={({ editor, from, to }) =>
159
+ from !== to &&
160
+ !editor.isActive('image') &&
161
+ !editor.isActive('video') &&
162
+ !editor.isActive('figure') &&
163
+ !editor.isActive('codeBlock')}
164
+ >
165
+ <div
166
+ class="bg-popover text-popover-foreground flex items-center gap-0.5 rounded-lg border p-1 shadow-md"
167
+ >
160
168
  {#if ed.isActive('link')}
161
169
  {#if ed.getAttributes('link').target === '_blank'}
162
- <span class="text-muted-foreground flex items-center px-1" title="Otwiera w nowej karcie">
170
+ <span
171
+ class="text-muted-foreground flex items-center px-1"
172
+ title="Otwiera w nowej karcie"
173
+ >
163
174
  <ExternalLink class="h-4 w-4" />
164
175
  </span>
165
176
  {/if}
166
- <ToolbarButton label="Edytuj link" active={false} onclick={() => (linkDialogOpen = true)}>
177
+ <ToolbarButton
178
+ label="Edytuj link"
179
+ active={false}
180
+ onclick={() => (linkDialogOpen = true)}
181
+ >
167
182
  <Pencil class="h-4 w-4" />
168
183
  </ToolbarButton>
169
184
  <ToolbarButton
@@ -270,13 +285,13 @@
270
285
  </ToolbarButton>
271
286
  {/if}
272
287
  </div>
273
- {/if}
274
- </div>
288
+ </BubbleMenu>
289
+ {/if}
275
290
 
276
291
  <!-- Editor content -->
277
292
  <div
278
293
  bind:this={element}
279
- class="prose prose-sm dark:prose-invert max-w-none p-4 focus:outline-none overflow-y-auto max-h-[70vh] [&_.ProseMirror]:min-h-[200px] [&_.ProseMirror]:outline-none [&_.ProseMirror]:scroll-padding-top-12"
294
+ class="prose prose-sm dark:prose-invert [&_.ProseMirror]:scroll-padding-top-12 max-h-112 max-w-none overflow-y-auto p-4 focus:outline-none [&_.ProseMirror]:min-h-[200px] [&_.ProseMirror]:outline-none"
280
295
  ></div>
281
296
  </div>
282
297
  </Tooltip.Provider>
@@ -287,14 +302,3 @@
287
302
  <VideoDialog bind:open={videoDialogOpen} editor={ed} />
288
303
  <TableDialog bind:open={tableDialogOpen} editor={ed} />
289
304
 
290
- <style>
291
- .bubble-menu {
292
- height: 0;
293
- overflow: visible;
294
- visibility: hidden;
295
- opacity: 0;
296
- transition:
297
- visibility 0.1s ease,
298
- opacity 0.1s ease;
299
- }
300
- </style>
@@ -86,7 +86,7 @@
86
86
  <LetterP class="h-4 w-4" />
87
87
  </ToolbarButton>
88
88
 
89
- <Separator orientation="vertical" class="mx-1 h-6" />
89
+ <Separator orientation="vertical" class="mx-1 hidden h-6 sm:block" />
90
90
 
91
91
  <!-- Text formatting -->
92
92
  <ToolbarButton
@@ -125,7 +125,7 @@
125
125
  <Highlight class="h-4 w-4" />
126
126
  </ToolbarButton>
127
127
 
128
- <Separator orientation="vertical" class="mx-1 h-6" />
128
+ <Separator orientation="vertical" class="mx-1 hidden h-6 sm:block" />
129
129
 
130
130
  <!-- Alignment -->
131
131
  <ToolbarButton
@@ -157,7 +157,7 @@
157
157
  <AlignJustified class="h-4 w-4" />
158
158
  </ToolbarButton>
159
159
 
160
- <Separator orientation="vertical" class="mx-1 h-6" />
160
+ <Separator orientation="vertical" class="mx-1 hidden h-6 sm:block" />
161
161
 
162
162
  <!-- Lists & Quote -->
163
163
  <ToolbarButton
@@ -182,7 +182,7 @@
182
182
  <Quote class="h-4 w-4" />
183
183
  </ToolbarButton>
184
184
 
185
- <Separator orientation="vertical" class="mx-1 h-6" />
185
+ <Separator orientation="vertical" class="mx-1 hidden h-6 sm:block" />
186
186
 
187
187
  <!-- Link, Image, Table -->
188
188
  <ToolbarButton label={t.link} active={ed.isActive('link')} onclick={onLinkDialog}>
@@ -198,7 +198,7 @@
198
198
  <Table class="h-4 w-4" />
199
199
  </ToolbarButton>
200
200
 
201
- <Separator orientation="vertical" class="mx-1 h-6" />
201
+ <Separator orientation="vertical" class="mx-1 hidden h-6 sm:block" />
202
202
 
203
203
  <!-- Code -->
204
204
  <ToolbarButton
@@ -217,14 +217,14 @@
217
217
  </ToolbarButton>
218
218
 
219
219
  {#if showInsertBlock && onInsertBlock}
220
- <Separator orientation="vertical" class="mx-1 h-6" />
220
+ <Separator orientation="vertical" class="mx-1 hidden h-6 sm:block" />
221
221
  <ToolbarButton label={t.insertBlock} active={false} onclick={onInsertBlock}>
222
222
  <Plus class="h-4 w-4" />
223
223
  </ToolbarButton>
224
224
  {/if}
225
225
 
226
226
  {#if showCodeView && onToggleCodeView}
227
- <Separator orientation="vertical" class="mx-1 h-6" />
227
+ <Separator orientation="vertical" class="mx-1 hidden h-6 sm:block" />
228
228
 
229
229
  <!-- HTML View -->
230
230
  <ToolbarButton label={t.htmlView} active={isCodeViewActive} onclick={onToggleCodeView}>
@@ -15,7 +15,11 @@ import { FigureNode } from './figure-node.js';
15
15
  const lowlight = createLowlight(common);
16
16
  export const extensions = [
17
17
  StarterKit.configure({
18
- codeBlock: false
18
+ // StarterKit (TipTap v3) ships Link + Underline; we register CustomLink and
19
+ // Underline ourselves, so disable them here to avoid duplicate extensions.
20
+ codeBlock: false,
21
+ link: false,
22
+ underline: false
19
23
  }),
20
24
  CustomLink.configure({
21
25
  openOnClick: false,
@@ -81,7 +81,7 @@
81
81
 
82
82
  <!-- Dialog 1: Media selector -->
83
83
  <Dialog.Root bind:open {onOpenChange}>
84
- <Dialog.Content class="max-w-5xl! sm:max-w-5xl!">
84
+ <Dialog.Content fullscreenMobile class="max-w-5xl! sm:max-w-5xl!">
85
85
  <Dialog.Header>
86
86
  <Dialog.Title>{t.insertImage}</Dialog.Title>
87
87
  </Dialog.Header>
@@ -183,6 +183,10 @@
183
183
  .image-alt-input:focus {
184
184
  border-color: var(--primary);
185
185
  }
186
+ .image-alt-input:focus-visible {
187
+ outline: 2px solid var(--ring);
188
+ outline-offset: 1px;
189
+ }
186
190
  .image-alt-actions {
187
191
  display: flex;
188
192
  gap: 8px;
@@ -256,6 +256,7 @@
256
256
  <button
257
257
  type="button"
258
258
  class="flex w-full items-center gap-1 text-sm font-medium"
259
+ aria-expanded={a11yOpen}
259
260
  onclick={() => (a11yOpen = !a11yOpen)}
260
261
  >
261
262
  {#if a11yOpen}
@@ -291,6 +292,7 @@
291
292
  <button
292
293
  type="button"
293
294
  class="flex w-full items-center gap-1 text-sm font-medium"
295
+ aria-expanded={relOpen}
294
296
  onclick={() => (relOpen = !relOpen)}
295
297
  >
296
298
  {#if relOpen}
@@ -1,9 +1,9 @@
1
1
  <script lang="ts">
2
2
  import { onMount } from 'svelte';
3
3
  import { Editor, type Editor as EditorType } from '@tiptap/core';
4
- import BubbleMenu from '@tiptap/extension-bubble-menu';
5
4
  import { extensions } from './extensions.js';
6
5
  import Placeholder from '@tiptap/extension-placeholder';
6
+ import BubbleMenu from './bubble-menu.svelte';
7
7
  import ToolbarButton from './toolbar-button.svelte';
8
8
  import EditorToolbar from './editor-toolbar.svelte';
9
9
  import LinkDialog from './link-dialog.svelte';
@@ -40,7 +40,6 @@
40
40
 
41
41
  let element = $state<HTMLDivElement | null>(null);
42
42
  let editorState = $state<{ editor: EditorType | null }>({ editor: null });
43
- let bubbleMenu = $state<HTMLDivElement | null>(null);
44
43
  let isCodeViewActive = $state(false);
45
44
 
46
45
  // Dialog states
@@ -54,9 +53,6 @@
54
53
  element: element!,
55
54
  extensions: [
56
55
  ...extensions,
57
- BubbleMenu.configure({
58
- element: bubbleMenu!
59
- }),
60
56
  Placeholder.configure({
61
57
  placeholder: 'Wpisz treść...',
62
58
  showOnlyCurrent: true
@@ -109,9 +105,21 @@
109
105
  {/if}
110
106
 
111
107
  <!-- Bubble Menu -->
112
- <div bind:this={bubbleMenu} class="bubble-menu">
113
- {#if ed}
114
- <div class="bg-popover text-popover-foreground flex items-center gap-0.5 rounded-lg border p-1 shadow-md">
108
+ {#if ed}
109
+ <BubbleMenu
110
+ editor={ed}
111
+ appendTo={() => document.body}
112
+ options={{ scrollTarget: element!, placement: 'bottom', offset: 8 }}
113
+ shouldShow={({ editor, from, to }) =>
114
+ from !== to &&
115
+ !editor.isActive('image') &&
116
+ !editor.isActive('video') &&
117
+ !editor.isActive('figure') &&
118
+ !editor.isActive('codeBlock')}
119
+ >
120
+ <div
121
+ class="bg-popover text-popover-foreground flex items-center gap-0.5 rounded-lg border p-1 shadow-md"
122
+ >
115
123
  {#if ed.isActive('link')}
116
124
  {#if ed.getAttributes('link').target === '_blank'}
117
125
  <span class="text-muted-foreground flex items-center px-1" title="Otwiera w nowej karcie">
@@ -225,8 +233,8 @@
225
233
  </ToolbarButton>
226
234
  {/if}
227
235
  </div>
228
- {/if}
229
- </div>
236
+ </BubbleMenu>
237
+ {/if}
230
238
 
231
239
  <!-- Editor content -->
232
240
  <div
@@ -250,16 +258,6 @@
250
258
  <TableDialog bind:open={tableDialogOpen} editor={ed} />
251
259
 
252
260
  <style>
253
- .bubble-menu {
254
- height: 0;
255
- overflow: visible;
256
- visibility: hidden;
257
- opacity: 0;
258
- transition:
259
- visibility 0.1s ease,
260
- opacity 0.1s ease;
261
- }
262
-
263
261
  :global(.tiptap-highlight) {
264
262
  background-color: rgb(250 204 21 / 0.4);
265
263
  padding: 0.125em 0.25em;
@@ -63,7 +63,7 @@
63
63
  </script>
64
64
 
65
65
  <Dialog.Root bind:open {onOpenChange}>
66
- <Dialog.Content class="max-w-5xl! sm:max-w-5xl!">
66
+ <Dialog.Content fullscreenMobile class="max-w-5xl! sm:max-w-5xl!">
67
67
  <Dialog.Header>
68
68
  <Dialog.Title>{t.insertVideo}</Dialog.Title>
69
69
  </Dialog.Header>
@@ -0,0 +1,140 @@
1
+ /**
2
+ * AriaCMS — Error message catalog (COGA-friendly, PL/EN).
3
+ *
4
+ * Tone-of-voice (zob. `src/stories/docs/tone-of-voice.mdx`):
5
+ * - Mów do użytkownika, nie o nim
6
+ * - Konkretnie + akcja co zrobić, nie sucha diagnoza
7
+ * - Bez żargonu, kodów HTTP, "UWAGA!", "Validation failed"
8
+ * - Bez strachu — prowadź, nie strasz
9
+ *
10
+ * Wzorzec: "Brak/Problem X — zrób Y, żeby Z."
11
+ *
12
+ * `@public` od v0.26.0. Migracja do paraglide w S10.
13
+ */
14
+ import type { InterfaceLanguage } from "../../types/languages.js";
15
+ type Bilingual = {
16
+ pl: string;
17
+ en: string;
18
+ };
19
+ export declare const errorMessages: {
20
+ readonly validation: {
21
+ readonly required: {
22
+ readonly pl: "Wpisz to pole, żeby zapisać.";
23
+ readonly en: "Fill in this field to save.";
24
+ };
25
+ readonly invalidEmail: {
26
+ readonly pl: "Sprawdź email — wygląda jakby brakowało @ i domeny.";
27
+ readonly en: "Check the email — looks like @ or domain is missing.";
28
+ };
29
+ readonly minLength: (n: number) => Bilingual;
30
+ readonly passwordWeak: {
31
+ readonly pl: "Hasło musi mieć wielką literę, cyfrę i znak specjalny — to chroni twoje konto.";
32
+ readonly en: "Password needs an uppercase letter, a digit and a special character — for your account safety.";
33
+ };
34
+ readonly passwordsDoNotMatch: {
35
+ readonly pl: "Hasła się różnią — wpisz to samo w obu polach.";
36
+ readonly en: "Passwords don't match — type the same one in both fields.";
37
+ };
38
+ readonly invalidFormat: {
39
+ readonly pl: "Sprawdź wpisaną wartość — format wygląda na inny niż oczekiwany.";
40
+ readonly en: "Check the value — the format looks unexpected.";
41
+ };
42
+ };
43
+ readonly network: {
44
+ readonly offline: {
45
+ readonly pl: "Brak połączenia z internetem — sprawdź sieć i spróbuj ponownie.";
46
+ readonly en: "No internet connection — check your network and try again.";
47
+ };
48
+ readonly timeout: {
49
+ readonly pl: "Serwer odpowiada wolno — spróbuj jeszcze raz za chwilę.";
50
+ readonly en: "The server is slow to respond — try again in a moment.";
51
+ };
52
+ readonly generic: {
53
+ readonly pl: "Nie udało się połączyć — spróbuj jeszcze raz.";
54
+ readonly en: "Couldn't connect — try again.";
55
+ };
56
+ };
57
+ readonly permission: {
58
+ readonly denied: {
59
+ readonly pl: "Nie masz dostępu do tego działania — poproś administratora o uprawnienia.";
60
+ readonly en: "You don't have access to this action — ask an admin for permissions.";
61
+ };
62
+ readonly sessionExpired: {
63
+ readonly pl: "Sesja wygasła — zaloguj się ponownie, żeby kontynuować.";
64
+ readonly en: "Your session expired — sign in again to continue.";
65
+ };
66
+ };
67
+ readonly conflict: {
68
+ readonly nameTaken: {
69
+ readonly pl: "Ta nazwa jest już zajęta — wybierz inną.";
70
+ readonly en: "That name is already taken — pick a different one.";
71
+ };
72
+ readonly alreadyExists: {
73
+ readonly pl: "Taki wpis już istnieje — sprawdź czy nie tworzysz duplikatu.";
74
+ readonly en: "An item like this already exists — check that you're not duplicating it.";
75
+ };
76
+ readonly staleData: {
77
+ readonly pl: "Ktoś zaktualizował te dane — odśwież stronę i wprowadź zmiany ponownie.";
78
+ readonly en: "Someone updated this data — refresh the page and try again.";
79
+ };
80
+ };
81
+ readonly server: {
82
+ readonly saveFailed: {
83
+ readonly pl: "Nie udało się zapisać — spróbuj jeszcze raz.";
84
+ readonly en: "Couldn't save — try again.";
85
+ };
86
+ readonly loadFailed: {
87
+ readonly pl: "Nie udało się wczytać danych — odśwież stronę.";
88
+ readonly en: "Couldn't load the data — refresh the page.";
89
+ };
90
+ readonly uploadFailed: {
91
+ readonly pl: "Nie udało się przesłać pliku — spróbuj jeszcze raz.";
92
+ readonly en: "Couldn't upload the file — try again.";
93
+ };
94
+ readonly generic: {
95
+ readonly pl: "Coś poszło nie tak — spróbuj jeszcze raz.";
96
+ readonly en: "Something went wrong — try again.";
97
+ };
98
+ };
99
+ readonly upload: {
100
+ readonly fileTooLarge: (maxMB: number) => Bilingual;
101
+ readonly unsupportedType: {
102
+ readonly pl: "Ten format nie jest obsługiwany — wybierz inny plik.";
103
+ readonly en: "This format isn't supported — pick a different file.";
104
+ };
105
+ };
106
+ readonly notFound: {
107
+ readonly entry: {
108
+ readonly pl: "Nie znaleziono wpisu — mógł zostać usunięty lub przeniesiony.";
109
+ readonly en: "Entry not found — it may have been deleted or moved.";
110
+ };
111
+ readonly page: {
112
+ readonly pl: "Nie znaleziono strony — sprawdź adres lub wróć do panelu.";
113
+ readonly en: "Page not found — check the address or return to the dashboard.";
114
+ };
115
+ };
116
+ };
117
+ export declare const successMessages: {
118
+ readonly saved: {
119
+ readonly pl: "Zapisano.";
120
+ readonly en: "Saved.";
121
+ };
122
+ readonly published: {
123
+ readonly pl: "Opublikowano — zmiany są już widoczne na stronie.";
124
+ readonly en: "Published — changes are now live.";
125
+ };
126
+ readonly uploaded: {
127
+ readonly pl: "Plik przesłany.";
128
+ readonly en: "File uploaded.";
129
+ };
130
+ readonly deleted: {
131
+ readonly pl: "Usunięto.";
132
+ readonly en: "Deleted.";
133
+ };
134
+ };
135
+ /**
136
+ * Pobierz zlokalizowany komunikat dla interfejsu.
137
+ * @example pickError(errorMessages.server.saveFailed, lang.current)
138
+ */
139
+ export declare function pickError(msg: Bilingual, lang: InterfaceLanguage): string;
140
+ export {};