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,21 +1,107 @@
1
1
  <script module>
2
2
  import { defineMeta } from '@storybook/addon-svelte-csf';
3
- import { Field, FieldLabel, FieldContent, FieldDescription } from './index.js';
3
+ import {
4
+ Field,
5
+ FieldLabel,
6
+ FieldContent,
7
+ FieldControl,
8
+ FieldDescription,
9
+ FieldError,
10
+ } from './index.js';
4
11
  import { Input } from '../input/index.js';
5
12
 
6
13
  const { Story } = defineMeta({
7
14
  title: 'UI/Forms/Field',
8
15
  component: Field,
9
16
  tags: ['autodocs'],
17
+ parameters: {
18
+ docs: {
19
+ description: {
20
+ component: 'Wrapper formularza spinający label, kontrolkę, opis i błąd w jeden ARIA-poprawny pakiet. Używaj `Field.Root` dla każdego pola w `<form>`.',
21
+ },
22
+ },
23
+ },
10
24
  });
11
25
  </script>
12
26
 
13
- <Story name="Label + Input + Hint">
14
- <div style="max-width:280px;">
15
- <Field>
16
- <FieldLabel>Ocena <span style="color:var(--destructive);">*</span></FieldLabel>
17
- <FieldContent><Input type="number" value="82" min={0} max={100} step={2} /></FieldContent>
18
- <FieldDescription>Zakres: 0–100 · Krok: 2</FieldDescription>
19
- </Field>
20
- </div>
27
+ <Story name="Auto-wired (label + description + input)">
28
+ {#snippet template()}
29
+ <div style="max-width:320px;">
30
+ <Field>
31
+ <FieldLabel>Tytuł wpisu</FieldLabel>
32
+ <FieldControl>
33
+ {#snippet child(props)}
34
+ <Input {...props} placeholder="Wpisz tytuł…" />
35
+ {/snippet}
36
+ </FieldControl>
37
+ <FieldDescription>Krótki, konkretny — pojawi się na liście wpisów.</FieldDescription>
38
+ </Field>
39
+ </div>
40
+ {/snippet}
41
+ </Story>
42
+
43
+ <Story name="Required + auto aria-required">
44
+ {#snippet template()}
45
+ <div style="max-width:320px;">
46
+ <Field required>
47
+ <FieldLabel>Email</FieldLabel>
48
+ <FieldControl>
49
+ {#snippet child(props)}
50
+ <Input {...props} type="email" placeholder="ty@przykład.pl" />
51
+ {/snippet}
52
+ </FieldControl>
53
+ <FieldDescription>Na ten adres wyślemy potwierdzenie.</FieldDescription>
54
+ </Field>
55
+ </div>
56
+ {/snippet}
57
+ </Story>
58
+
59
+ <Story name="Error state (auto aria-invalid + describedby)">
60
+ {#snippet template()}
61
+ <div style="max-width:320px;">
62
+ <Field required>
63
+ <FieldLabel>Email</FieldLabel>
64
+ <FieldControl>
65
+ {#snippet child(props)}
66
+ <Input {...props} type="email" value="kowalski" />
67
+ {/snippet}
68
+ </FieldControl>
69
+ <FieldDescription>Na ten adres wyślemy potwierdzenie.</FieldDescription>
70
+ <FieldError>Sprawdź email — wygląda jakby brakowało @ i domeny.</FieldError>
71
+ </Field>
72
+ </div>
73
+ {/snippet}
74
+ </Story>
75
+
76
+ <Story name="Number with hint">
77
+ {#snippet template()}
78
+ <div style="max-width:280px;">
79
+ <Field required>
80
+ <FieldLabel>Ocena</FieldLabel>
81
+ <FieldContent>
82
+ <FieldControl>
83
+ {#snippet child(props)}
84
+ <Input {...props} type="number" value="82" min={0} max={100} step={2} />
85
+ {/snippet}
86
+ </FieldControl>
87
+ </FieldContent>
88
+ <FieldDescription>Zakres: 0–100 · Krok: 2</FieldDescription>
89
+ </Field>
90
+ </div>
91
+ {/snippet}
92
+ </Story>
93
+
94
+ <Story name="Empty / minimal">
95
+ {#snippet template()}
96
+ <div style="max-width:280px;">
97
+ <Field>
98
+ <FieldLabel>Tytuł</FieldLabel>
99
+ <FieldControl>
100
+ {#snippet child(props)}
101
+ <Input {...props} placeholder="Wpisz tytuł…" />
102
+ {/snippet}
103
+ </FieldControl>
104
+ </Field>
105
+ </div>
106
+ {/snippet}
21
107
  </Story>
@@ -29,16 +29,72 @@
29
29
  <script lang="ts">
30
30
  import { cn, type WithElementRef } from "../../../utils.js";
31
31
  import type { HTMLAttributes } from "svelte/elements";
32
+ import { setFieldContext, type FieldA11yProps } from "./field-context.svelte.js";
32
33
 
33
34
  let {
34
35
  ref = $bindable(null),
35
36
  class: className,
36
37
  orientation = "vertical",
38
+ id: idProp,
39
+ required = false,
37
40
  children,
38
41
  ...restProps
39
42
  }: WithElementRef<HTMLAttributes<HTMLDivElement>> & {
40
43
  orientation?: FieldOrientation;
44
+ id?: string;
45
+ required?: boolean;
41
46
  } = $props();
47
+
48
+ const autoId = $props.id();
49
+ const baseId = $derived(idProp ?? autoId);
50
+ const inputId = $derived(`${baseId}-control`);
51
+ const descriptionId = $derived(`${baseId}-description`);
52
+ const errorId = $derived(`${baseId}-error`);
53
+
54
+ let descriptionRefs = $state(0);
55
+ let errorRefs = $state(0);
56
+
57
+ const ctx = setFieldContext({
58
+ get inputId() {
59
+ return inputId;
60
+ },
61
+ get descriptionId() {
62
+ return descriptionId;
63
+ },
64
+ get errorId() {
65
+ return errorId;
66
+ },
67
+ get required() {
68
+ return required;
69
+ },
70
+ get hasDescription() {
71
+ return descriptionRefs > 0;
72
+ },
73
+ get hasError() {
74
+ return errorRefs > 0;
75
+ },
76
+ get invalid() {
77
+ return errorRefs > 0;
78
+ },
79
+ registerDescription: () => void descriptionRefs++,
80
+ unregisterDescription: () => void descriptionRefs--,
81
+ registerError: () => void errorRefs++,
82
+ unregisterError: () => void errorRefs--,
83
+ getControlProps(): FieldA11yProps {
84
+ const describedBy = [
85
+ descriptionRefs > 0 ? descriptionId : null,
86
+ errorRefs > 0 ? errorId : null,
87
+ ]
88
+ .filter(Boolean)
89
+ .join(" ");
90
+ return {
91
+ id: inputId,
92
+ "aria-describedby": describedBy || undefined,
93
+ "aria-invalid": errorRefs > 0 ? "true" : undefined,
94
+ "aria-required": required ? "true" : undefined,
95
+ };
96
+ },
97
+ });
42
98
  </script>
43
99
 
44
100
  <div
@@ -46,6 +102,7 @@
46
102
  role="group"
47
103
  data-slot="field"
48
104
  data-orientation={orientation}
105
+ data-invalid={ctx.invalid || undefined}
49
106
  class={cn(fieldVariants({ orientation }), className)}
50
107
  {...restProps}
51
108
  >
@@ -23,6 +23,8 @@ import { type WithElementRef } from "../../../utils.js";
23
23
  import type { HTMLAttributes } from "svelte/elements";
24
24
  type $$ComponentProps = WithElementRef<HTMLAttributes<HTMLDivElement>> & {
25
25
  orientation?: FieldOrientation;
26
+ id?: string;
27
+ required?: boolean;
26
28
  };
27
29
  declare const Field: import("svelte").Component<$$ComponentProps, {}, "ref">;
28
30
  type Field = ReturnType<typeof Field>;
@@ -3,9 +3,11 @@ import Set from "./field-set.svelte";
3
3
  import Legend from "./field-legend.svelte";
4
4
  import Group from "./field-group.svelte";
5
5
  import Content from "./field-content.svelte";
6
+ import Control from "./field-control.svelte";
6
7
  import Label from "./field-label.svelte";
7
8
  import Title from "./field-title.svelte";
8
9
  import Description from "./field-description.svelte";
9
10
  import Separator from "./field-separator.svelte";
10
11
  import Error from "./field-error.svelte";
11
- export { Field, Set, Legend, Group, Content, Label, Title, Description, Separator, Error, Set as FieldSet, Legend as FieldLegend, Group as FieldGroup, Content as FieldContent, Label as FieldLabel, Title as FieldTitle, Description as FieldDescription, Separator as FieldSeparator, Error as FieldError, };
12
+ export { getFieldContext, setFieldContext, type FieldA11yProps, type FieldContext, } from "./field-context.svelte.js";
13
+ export { Field, Set, Legend, Group, Content, Control, Label, Title, Description, Separator, Error, Set as FieldSet, Legend as FieldLegend, Group as FieldGroup, Content as FieldContent, Control as FieldControl, Label as FieldLabel, Title as FieldTitle, Description as FieldDescription, Separator as FieldSeparator, Error as FieldError, };
@@ -3,11 +3,13 @@ import Set from "./field-set.svelte";
3
3
  import Legend from "./field-legend.svelte";
4
4
  import Group from "./field-group.svelte";
5
5
  import Content from "./field-content.svelte";
6
+ import Control from "./field-control.svelte";
6
7
  import Label from "./field-label.svelte";
7
8
  import Title from "./field-title.svelte";
8
9
  import Description from "./field-description.svelte";
9
10
  import Separator from "./field-separator.svelte";
10
11
  import Error from "./field-error.svelte";
11
- export { Field, Set, Legend, Group, Content, Label, Title, Description, Separator, Error,
12
+ export { getFieldContext, setFieldContext, } from "./field-context.svelte.js";
13
+ export { Field, Set, Legend, Group, Content, Control, Label, Title, Description, Separator, Error,
12
14
  //
13
- Set as FieldSet, Legend as FieldLegend, Group as FieldGroup, Content as FieldContent, Label as FieldLabel, Title as FieldTitle, Description as FieldDescription, Separator as FieldSeparator, Error as FieldError, };
15
+ Set as FieldSet, Legend as FieldLegend, Group as FieldGroup, Content as FieldContent, Control as FieldControl, Label as FieldLabel, Title as FieldTitle, Description as FieldDescription, Separator as FieldSeparator, Error as FieldError, };
@@ -22,7 +22,7 @@
22
22
  {#if childrenProp}
23
23
  {@render childrenProp({ errors, errorProps })}
24
24
  {:else}
25
- {#each errors as error (error)}
25
+ {#each errors as error, i (i)}
26
26
  <div {...errorProps} class={cn(errorClasses)}>{error}</div>
27
27
  {/each}
28
28
  {/if}
@@ -0,0 +1,25 @@
1
+ <script module>
2
+ import { defineMeta } from '@storybook/addon-svelte-csf';
3
+ import DemoForm from '../../../../stories/_fixtures/demo-form.svelte';
4
+
5
+ // superForm + zod4Client używa WeakMap do cache walidatorów; Storybook MockProvider
6
+ // invalidates the schema reference między decoratorami w vitest-browser ("Invalid value
7
+ // used as weak map key"). Stories działają w dev (`pnpm storybook`), test runner pada.
8
+ // Odłożone do S10 (real browser via MCP).
9
+ const { Story } = defineMeta({
10
+ title: 'UI/Forms/Form',
11
+ component: DemoForm,
12
+ tags: ['autodocs', 'no-test'],
13
+ parameters: {
14
+ docs: {
15
+ description: {
16
+ component: 'Wzorzec formularza z `sveltekit-superforms` + `formsnap`. Walidacja Valibot, błędy renderowane przez `Field.Error`, focus na pierwszy błąd po submit.',
17
+ },
18
+ },
19
+ },
20
+ });
21
+ </script>
22
+
23
+ <Story name="formsnap + superForm (demo)" args={{ autoSubmit: false }} />
24
+
25
+ <Story name="With initial errors (autoSubmit)" args={{ autoSubmit: true }} />
@@ -0,0 +1,26 @@
1
+ export default Form;
2
+ type Form = SvelteComponent<{
3
+ [x: string]: never;
4
+ }, {
5
+ [evt: string]: CustomEvent<any>;
6
+ }, {}> & {
7
+ $$bindings?: string | undefined;
8
+ };
9
+ declare const Form: $$__sveltets_2_IsomorphicComponent<{
10
+ [x: string]: never;
11
+ }, {
12
+ [evt: string]: CustomEvent<any>;
13
+ }, {}, {}, string>;
14
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
15
+ new (options: import("svelte").ComponentConstructorOptions<Props>): import("svelte").SvelteComponent<Props, Events, Slots> & {
16
+ $$bindings?: Bindings;
17
+ } & Exports;
18
+ (internal: unknown, props: {
19
+ $$events?: Events;
20
+ $$slots?: Slots;
21
+ }): Exports & {
22
+ $set?: any;
23
+ $on?: any;
24
+ };
25
+ z_$$bindings?: Bindings;
26
+ }
@@ -6,6 +6,32 @@
6
6
  title: 'UI/Forms/Input',
7
7
  component: Input,
8
8
  tags: ['autodocs'],
9
+ parameters: {
10
+ docs: {
11
+ description: {
12
+ component: 'Pole tekstowe. Zawsze wewnątrz `Field.Root` — wtedy `aria-describedby` (opis + błąd) i `aria-invalid` zostaną dopięte automatycznie.',
13
+ },
14
+ },
15
+ },
16
+ argTypes: {
17
+ type: {
18
+ control: 'select',
19
+ options: ['text', 'email', 'password', 'number', 'search', 'tel', 'url'],
20
+ description: 'Typ HTML inputu (wpływa na klawiaturę mobilną i walidację).',
21
+ },
22
+ placeholder: {
23
+ control: 'text',
24
+ description: 'Tekst zachęty — NIE używaj zamiast labela.',
25
+ },
26
+ disabled: {
27
+ control: 'boolean',
28
+ description: 'Blokada z pełną nieaktywnością.',
29
+ },
30
+ readOnly: {
31
+ control: 'boolean',
32
+ description: 'Pole tylko do odczytu (skopiowanie tak, edycja nie).',
33
+ },
34
+ },
9
35
  });
10
36
  </script>
11
37
 
@@ -2,7 +2,7 @@ declare const InputGroupInput: import("svelte").Component<(Omit<import("svelte/e
2
2
  type: "file";
3
3
  files?: FileList;
4
4
  } | {
5
- type?: "number" | "image" | "url" | "text" | "date" | "radio" | "color" | "button" | "checkbox" | "search" | (string & {}) | "email" | "password" | "time" | "hidden" | "reset" | "submit" | "tel" | "datetime-local" | "month" | "range" | "week";
5
+ type?: "number" | "image" | "url" | "text" | "date" | "radio" | "color" | "button" | "checkbox" | "search" | (string & {}) | "email" | "tel" | "password" | "time" | "hidden" | "reset" | "submit" | "datetime-local" | "month" | "range" | "week";
6
6
  files?: undefined;
7
7
  })) & {
8
8
  ref?: HTMLElement | null | undefined;
@@ -0,0 +1,43 @@
1
+ <script module>
2
+ import { defineMeta } from '@storybook/addon-svelte-csf';
3
+ import * as InputGroup from './index.js';
4
+ import { Root as InputGroupRoot } from './index.js';
5
+ import { Label } from '../label/index.js';
6
+
7
+ const { Story } = defineMeta({
8
+ title: 'UI/Forms/InputGroup',
9
+ component: InputGroupRoot,
10
+ tags: ['autodocs'],
11
+ parameters: {
12
+ docs: {
13
+ description: {
14
+ component: 'Złożenie inputu z dodatkami (prefix, suffix, akcje). Składaj `InputGroupRoot > InputGroupAddon > InputGroupInput`.',
15
+ },
16
+ },
17
+ },
18
+ });
19
+ </script>
20
+
21
+ <Story name="Prefix addon">
22
+ <div class="space-y-2" style="width:320px;">
23
+ <Label for="ig-amount">Kwota</Label>
24
+ <InputGroup.Root>
25
+ <InputGroup.Addon align="inline-start">
26
+ <InputGroup.Text>PLN</InputGroup.Text>
27
+ </InputGroup.Addon>
28
+ <InputGroup.Input id="ig-amount" type="number" placeholder="0.00" />
29
+ </InputGroup.Root>
30
+ </div>
31
+ </Story>
32
+
33
+ <Story name="Suffix button">
34
+ <div class="space-y-2" style="width:320px;">
35
+ <Label for="ig-search">Szukaj</Label>
36
+ <InputGroup.Root>
37
+ <InputGroup.Input id="ig-search" placeholder="Wpisz frazę…" />
38
+ <InputGroup.Addon align="inline-end">
39
+ <InputGroup.Button>Szukaj</InputGroup.Button>
40
+ </InputGroup.Addon>
41
+ </InputGroup.Root>
42
+ </div>
43
+ </Story>
@@ -0,0 +1,27 @@
1
+ export default InputGroup;
2
+ type InputGroup = SvelteComponent<{
3
+ [x: string]: never;
4
+ }, {
5
+ [evt: string]: CustomEvent<any>;
6
+ }, {}> & {
7
+ $$bindings?: string | undefined;
8
+ };
9
+ declare const InputGroup: $$__sveltets_2_IsomorphicComponent<{
10
+ [x: string]: never;
11
+ }, {
12
+ [evt: string]: CustomEvent<any>;
13
+ }, {}, {}, string>;
14
+ import * as InputGroup from './index.js';
15
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
16
+ new (options: import("svelte").ComponentConstructorOptions<Props>): import("svelte").SvelteComponent<Props, Events, Slots> & {
17
+ $$bindings?: Bindings;
18
+ } & Exports;
19
+ (internal: unknown, props: {
20
+ $$events?: Events;
21
+ $$slots?: Slots;
22
+ }): Exports & {
23
+ $set?: any;
24
+ $on?: any;
25
+ };
26
+ z_$$bindings?: Bindings;
27
+ }
@@ -0,0 +1,61 @@
1
+ <script module>
2
+ import { defineMeta } from '@storybook/addon-svelte-csf';
3
+ import * as Item from './index.js';
4
+ import { Root as ItemRoot } from './index.js';
5
+
6
+ const { Story } = defineMeta({
7
+ title: 'UI/Data/Item',
8
+ component: ItemRoot,
9
+ tags: ['autodocs'],
10
+ parameters: {
11
+ docs: {
12
+ description: {
13
+ component: 'Komponowalny rekord listy (avatar + treść + akcja). Zastępuje custom `<li>` z manualnym layoutem. Używaj w sidebarze, listach pickerów, dropdownach.',
14
+ },
15
+ },
16
+ },
17
+ });
18
+ </script>
19
+
20
+ <Story name="Default">
21
+ <Item.Root>
22
+ <Item.Content>
23
+ <Item.Title>Zamówienie #ZAM-2026-0001</Item.Title>
24
+ <Item.Description>Jan Kowalski · 123,00 PLN</Item.Description>
25
+ </Item.Content>
26
+ </Item.Root>
27
+ </Story>
28
+
29
+ <Story name="Outline + actions">
30
+ <Item.Root variant="outline">
31
+ <Item.Content>
32
+ <Item.Title>Wpis "Pierwszy"</Item.Title>
33
+ <Item.Description>Zaktualizowany 15 stycznia 2026</Item.Description>
34
+ </Item.Content>
35
+ <Item.Actions>
36
+ <button>Edytuj</button>
37
+ </Item.Actions>
38
+ </Item.Root>
39
+ </Story>
40
+
41
+ <Story name="Group with separators">
42
+ <Item.Group>
43
+ <Item.Root variant="muted">
44
+ <Item.Content>
45
+ <Item.Title>Pierwszy element</Item.Title>
46
+ </Item.Content>
47
+ </Item.Root>
48
+ <Item.Separator />
49
+ <Item.Root variant="muted">
50
+ <Item.Content>
51
+ <Item.Title>Drugi element</Item.Title>
52
+ </Item.Content>
53
+ </Item.Root>
54
+ <Item.Separator />
55
+ <Item.Root variant="muted">
56
+ <Item.Content>
57
+ <Item.Title>Trzeci element</Item.Title>
58
+ </Item.Content>
59
+ </Item.Root>
60
+ </Item.Group>
61
+ </Story>
@@ -0,0 +1,27 @@
1
+ export default Item;
2
+ type Item = SvelteComponent<{
3
+ [x: string]: never;
4
+ }, {
5
+ [evt: string]: CustomEvent<any>;
6
+ }, {}> & {
7
+ $$bindings?: string | undefined;
8
+ };
9
+ declare const Item: $$__sveltets_2_IsomorphicComponent<{
10
+ [x: string]: never;
11
+ }, {
12
+ [evt: string]: CustomEvent<any>;
13
+ }, {}, {}, string>;
14
+ import * as Item from './index.js';
15
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
16
+ new (options: import("svelte").ComponentConstructorOptions<Props>): import("svelte").SvelteComponent<Props, Events, Slots> & {
17
+ $$bindings?: Bindings;
18
+ } & Exports;
19
+ (internal: unknown, props: {
20
+ $$events?: Events;
21
+ $$slots?: Slots;
22
+ }): Exports & {
23
+ $set?: any;
24
+ $on?: any;
25
+ };
26
+ z_$$bindings?: Bindings;
27
+ }
@@ -6,6 +6,13 @@
6
6
  title: 'UI/Forms/Label',
7
7
  component: Label,
8
8
  tags: ['autodocs'],
9
+ parameters: {
10
+ docs: {
11
+ description: {
12
+ component: 'Etykieta pola. W `Field.Root` używana automatycznie. Poza Field — `for` musi pasować do `id` kontrolki, inaczej kliknięcie nie ufokusuje pola.',
13
+ },
14
+ },
15
+ },
9
16
  });
10
17
  </script>
11
18
 
@@ -0,0 +1 @@
1
+ export { default as LiveRegion } from './live-region.svelte';
@@ -0,0 +1 @@
1
+ export { default as LiveRegion } from './live-region.svelte';
@@ -0,0 +1,32 @@
1
+ <script lang="ts">
2
+ import { LiveRegion } from './index.js';
3
+
4
+ type Props = {
5
+ politeness?: 'polite' | 'assertive';
6
+ initial?: string;
7
+ };
8
+ let { politeness = 'polite', initial = '' }: Props = $props();
9
+
10
+ let message = $state(initial);
11
+ let counter = $state(0);
12
+
13
+ function announce() {
14
+ counter += 1;
15
+ message = `Ogłoszenie nr ${counter}`;
16
+ }
17
+ </script>
18
+
19
+ <div style="display:flex;flex-direction:column;gap:8px;align-items:flex-start;">
20
+ <button
21
+ type="button"
22
+ onclick={announce}
23
+ style="padding:8px 12px;border:1px solid currentColor;border-radius:8px;cursor:pointer;"
24
+ >
25
+ Ogłoś coś
26
+ </button>
27
+ <p style="margin:0;font-size:13px;color:var(--muted-foreground,#666);">
28
+ Komunikat (widoczny tu tylko do podglądu — w produkcji jest <code>sr-only</code>):
29
+ </p>
30
+ <output style="font-size:14px;min-height:1.5em;">{message}</output>
31
+ <LiveRegion {message} {politeness} />
32
+ </div>
@@ -0,0 +1,7 @@
1
+ type Props = {
2
+ politeness?: 'polite' | 'assertive';
3
+ initial?: string;
4
+ };
5
+ declare const LiveRegionDemo: import("svelte").Component<Props, {}, "">;
6
+ type LiveRegionDemo = ReturnType<typeof LiveRegionDemo>;
7
+ export default LiveRegionDemo;
@@ -0,0 +1,23 @@
1
+ <script module>
2
+ import { defineMeta } from '@storybook/addon-svelte-csf';
3
+ import LiveRegionDemo from './live-region-demo.svelte';
4
+
5
+ const { Story } = defineMeta({
6
+ title: 'UI/Feedback/LiveRegion',
7
+ component: LiveRegionDemo,
8
+ tags: ['autodocs'],
9
+ parameters: {
10
+ docs: {
11
+ description: {
12
+ component: 'Niewidoczna strefa ARIA `aria-live` dla zapowiedzi (zapis, błąd, dodanie elementu). `polite` — czeka na pauzę; `assertive` — przerywa. Używaj `polite` chyba że krytyczne.',
13
+ },
14
+ },
15
+ },
16
+ });
17
+ </script>
18
+
19
+ <Story name="Polite (default)" args={{ politeness: 'polite' }} />
20
+
21
+ <Story name="Assertive" args={{ politeness: 'assertive' }} />
22
+
23
+ <Story name="With initial message" args={{ politeness: 'polite', initial: 'Załadowano 12 wyników' }} />
@@ -0,0 +1,26 @@
1
+ export default LiveRegion;
2
+ type LiveRegion = SvelteComponent<{
3
+ [x: string]: never;
4
+ }, {
5
+ [evt: string]: CustomEvent<any>;
6
+ }, {}> & {
7
+ $$bindings?: string | undefined;
8
+ };
9
+ declare const LiveRegion: $$__sveltets_2_IsomorphicComponent<{
10
+ [x: string]: never;
11
+ }, {
12
+ [evt: string]: CustomEvent<any>;
13
+ }, {}, {}, string>;
14
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
15
+ new (options: import("svelte").ComponentConstructorOptions<Props>): import("svelte").SvelteComponent<Props, Events, Slots> & {
16
+ $$bindings?: Bindings;
17
+ } & Exports;
18
+ (internal: unknown, props: {
19
+ $$events?: Events;
20
+ $$slots?: Slots;
21
+ }): Exports & {
22
+ $set?: any;
23
+ $on?: any;
24
+ };
25
+ z_$$bindings?: Bindings;
26
+ }
@@ -0,0 +1,12 @@
1
+ <script lang="ts">
2
+ type Props = {
3
+ message?: string;
4
+ politeness?: 'polite' | 'assertive';
5
+ class?: string;
6
+ };
7
+ let { message = '', politeness = 'polite', class: className = '' }: Props = $props();
8
+ </script>
9
+
10
+ <div class="sr-only {className}" role="status" aria-live={politeness}>
11
+ {message}
12
+ </div>
@@ -0,0 +1,8 @@
1
+ type Props = {
2
+ message?: string;
3
+ politeness?: 'polite' | 'assertive';
4
+ class?: string;
5
+ };
6
+ declare const LiveRegion: import("svelte").Component<Props, {}, "">;
7
+ type LiveRegion = ReturnType<typeof LiveRegion>;
8
+ export default LiveRegion;