includio-cms 0.25.0 → 0.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (349) hide show
  1. package/API.md +57 -4
  2. package/CHANGELOG.md +53 -0
  3. package/DOCS.md +1 -1
  4. package/README.md +2 -0
  5. package/ROADMAP.md +6 -0
  6. package/dist/admin/client/account/lang.d.ts +1 -0
  7. package/dist/admin/client/account/lang.js +4 -2
  8. package/dist/admin/client/account/profile-section.svelte +2 -2
  9. package/dist/admin/client/account/security-section.svelte +27 -4
  10. package/dist/admin/client/account/sessions-section.svelte +1 -1
  11. package/dist/admin/client/admin/admin-after-login-layout-content.svelte +1 -1
  12. package/dist/admin/client/admin/dashboard-page.svelte +34 -10
  13. package/dist/admin/client/collection/bulk-actions-bar.svelte +86 -44
  14. package/dist/admin/client/collection/bulk-actions-bar.svelte.d.ts +3 -1
  15. package/dist/admin/client/collection/collection-entries.svelte +52 -36
  16. package/dist/admin/client/collection/collection-entries.svelte.d.ts +3 -0
  17. package/dist/admin/client/collection/collection.svelte +28 -14
  18. package/dist/admin/client/collection/collection.svelte.d.ts +3 -0
  19. package/dist/admin/client/collection/data-table.svelte +279 -130
  20. package/dist/admin/client/collection/data-table.svelte.d.ts +11 -0
  21. package/dist/admin/client/collection/date-cell.svelte +4 -4
  22. package/dist/admin/client/collection/row-actions.svelte +2 -1
  23. package/dist/admin/client/collection/sortable-header.svelte +33 -9
  24. package/dist/admin/client/collection/state-display.svelte +102 -0
  25. package/dist/admin/client/collection/state-display.svelte.d.ts +12 -0
  26. package/dist/admin/client/collection/status-badge.svelte +99 -11
  27. package/dist/admin/client/collection/status-badge.svelte.d.ts +15 -1
  28. package/dist/admin/client/collection/table-pagination.svelte +21 -6
  29. package/dist/admin/client/collection/table-toolbar.svelte +105 -80
  30. package/dist/admin/client/collection/table-toolbar.svelte.d.ts +11 -8
  31. package/dist/admin/client/entry/entry-form.svelte +36 -11
  32. package/dist/admin/client/entry/entry-form.svelte.d.ts +1 -0
  33. package/dist/admin/client/entry/entry-header.svelte +22 -15
  34. package/dist/admin/client/entry/entry-header.svelte.d.ts +1 -0
  35. package/dist/admin/client/entry/entry.svelte +269 -165
  36. package/dist/admin/client/entry/header/a11y-header-badge.svelte +47 -0
  37. package/dist/admin/client/entry/header/a11y-header-badge.svelte.d.ts +8 -0
  38. package/dist/admin/client/entry/header/publish-panel.svelte +69 -13
  39. package/dist/admin/client/entry/header/save-indicator.svelte +57 -28
  40. package/dist/admin/client/entry/header/save-indicator.svelte.d.ts +1 -0
  41. package/dist/admin/client/entry/header/status-badge.svelte +60 -15
  42. package/dist/admin/client/entry/header/status-badge.svelte.d.ts +1 -2
  43. package/dist/admin/client/entry/header/version-history-sheet.svelte +1 -1
  44. package/dist/admin/client/entry/hybrid/hybrid-layout.svelte +74 -23
  45. package/dist/admin/client/entry/hybrid/hybrid-preview.svelte +1 -1
  46. package/dist/admin/client/entry/utils.d.ts +14 -0
  47. package/dist/admin/client/entry/utils.js +28 -0
  48. package/dist/admin/client/form/form-submission/form-submission.svelte +2 -2
  49. package/dist/admin/client/form/form-submissions.svelte +143 -194
  50. package/dist/admin/client/form/form-submissions.svelte.d.ts +2 -0
  51. package/dist/admin/client/login/lang.d.ts +3 -0
  52. package/dist/admin/client/login/lang.js +10 -4
  53. package/dist/admin/client/login/login-form.svelte +8 -1
  54. package/dist/admin/client/login/reset-password-page.svelte +24 -3
  55. package/dist/admin/client/login/schema.d.ts +14 -2
  56. package/dist/admin/client/login/schema.js +19 -8
  57. package/dist/admin/client/maintenance/maintenance-page.svelte +16 -17
  58. package/dist/admin/client/media/media-page.svelte +1 -1
  59. package/dist/admin/client/shop/coupon-edit-page.svelte +117 -13
  60. package/dist/admin/client/shop/coupon-form.svelte +282 -138
  61. package/dist/admin/client/shop/coupon-form.svelte.d.ts +1 -9
  62. package/dist/admin/client/shop/coupon-new-page.svelte +40 -10
  63. package/dist/admin/client/shop/coupon-new-page.svelte.d.ts +2 -17
  64. package/dist/admin/client/shop/coupon-schema.d.ts +28 -0
  65. package/dist/admin/client/shop/coupon-schema.js +53 -0
  66. package/dist/admin/client/shop/coupons-list-page.svelte +262 -118
  67. package/dist/admin/client/shop/coupons-list-page.svelte.d.ts +16 -1
  68. package/dist/admin/client/shop/shipping-method-edit-page.svelte +108 -59
  69. package/dist/admin/client/shop/shipping-method-form.svelte +36 -9
  70. package/dist/admin/client/shop/shipping-method-new-page.svelte +44 -13
  71. package/dist/admin/client/shop/shipping-methods-list-page.svelte +101 -59
  72. package/dist/admin/client/shop/shop-order-detail-page.svelte +113 -84
  73. package/dist/admin/client/shop/shop-orders-list-page.svelte +302 -152
  74. package/dist/admin/client/shop/shop-orders-list-page.svelte.d.ts +18 -1
  75. package/dist/admin/client/shop/shop-products-list-page.svelte +355 -118
  76. package/dist/admin/client/shop/shop-products-list-page.svelte.d.ts +19 -1
  77. package/dist/admin/client/users/accept-invite-page.svelte +24 -3
  78. package/dist/admin/client/users/create-user-dialog.svelte +3 -8
  79. package/dist/admin/client/users/lang.d.ts +2 -0
  80. package/dist/admin/client/users/lang.js +4 -0
  81. package/dist/admin/client/users/pending-invitations.svelte +2 -9
  82. package/dist/admin/client/users/user-name-cell.svelte +20 -0
  83. package/dist/admin/client/users/user-name-cell.svelte.d.ts +9 -0
  84. package/dist/admin/client/users/user-role-badge.svelte +16 -0
  85. package/dist/admin/client/users/user-role-badge.svelte.d.ts +7 -0
  86. package/dist/admin/client/users/user-row-actions.svelte +72 -0
  87. package/dist/admin/client/users/user-row-actions.svelte.d.ts +20 -0
  88. package/dist/admin/client/users/user-sessions-sheet.svelte +2 -11
  89. package/dist/admin/client/users/users-page.svelte +283 -497
  90. package/dist/admin/client/users/users-page.svelte.d.ts +12 -1
  91. package/dist/admin/components/dashboard/form-submissions-widget.svelte +59 -74
  92. package/dist/admin/components/dashboard/recent-activity.svelte +17 -5
  93. package/dist/admin/components/dashboard/recent-entries.svelte +19 -7
  94. package/dist/admin/components/dialogs/confirmation-dialog.svelte +105 -0
  95. package/dist/admin/components/dialogs/confirmation-dialog.svelte.d.ts +13 -0
  96. package/dist/admin/components/fields/block-picker-modal.svelte +6 -0
  97. package/dist/admin/components/fields/blocks-field.svelte +46 -1
  98. package/dist/admin/components/fields/boolean-field.svelte +1 -1
  99. package/dist/admin/components/fields/field-renderer.svelte +23 -21
  100. package/dist/admin/components/fields/file-field.svelte +344 -30
  101. package/dist/admin/components/fields/media-field.svelte +16 -2
  102. package/dist/admin/components/fields/radio-field.svelte +22 -0
  103. package/dist/admin/components/fields/relation-field.svelte +123 -97
  104. package/dist/admin/components/fields/relation-picker-dialog.svelte +2 -2
  105. package/dist/admin/components/fields/seo-field.svelte +60 -30
  106. package/dist/admin/components/fields/shop-field.svelte +9 -4
  107. package/dist/admin/components/fields/simple-array-field.svelte +321 -151
  108. package/dist/admin/components/fields/simple-array-field.svelte.d.ts +3 -0
  109. package/dist/admin/components/fields/slug-field.svelte +146 -21
  110. package/dist/admin/components/fields/text-field-wrapper.svelte +37 -20
  111. package/dist/admin/components/fields/text-field.svelte +7 -2
  112. package/dist/admin/components/fields/url-field-wrapper.svelte +10 -0
  113. package/dist/admin/components/fields/url-field.svelte +36 -23
  114. package/dist/admin/components/forms/form-error-summary.svelte +143 -0
  115. package/dist/admin/components/forms/form-error-summary.svelte.d.ts +27 -0
  116. package/dist/admin/components/layout/app-sidebar.svelte +7 -2
  117. package/dist/admin/components/layout/detail-page-shell.svelte +71 -0
  118. package/dist/admin/components/layout/detail-page-shell.svelte.d.ts +24 -0
  119. package/dist/admin/components/layout/lang.d.ts +5 -0
  120. package/dist/admin/components/layout/lang.js +10 -0
  121. package/dist/admin/components/layout/layout-renderer.svelte +71 -2
  122. package/dist/admin/components/layout/layout-renderer.svelte.d.ts +1 -0
  123. package/dist/admin/components/layout/layout-tabs.svelte +172 -0
  124. package/dist/admin/components/layout/layout-tabs.svelte.d.ts +24 -0
  125. package/dist/admin/components/layout/nav-breadcrumbs.svelte +25 -7
  126. package/dist/admin/components/layout/nav-collections.svelte +23 -36
  127. package/dist/admin/components/layout/nav-forms.svelte +19 -35
  128. package/dist/admin/components/layout/nav-main.svelte +3 -28
  129. package/dist/admin/components/layout/nav-search.svelte +70 -2
  130. package/dist/admin/components/layout/nav-section.svelte +77 -0
  131. package/dist/admin/components/layout/nav-section.svelte.d.ts +22 -0
  132. package/dist/admin/components/layout/nav-shop.svelte +3 -27
  133. package/dist/admin/components/layout/nav-singletons.svelte +16 -28
  134. package/dist/admin/components/layout/page-header.stories.svelte +93 -0
  135. package/dist/admin/components/layout/page-header.stories.svelte.d.ts +27 -0
  136. package/dist/admin/components/layout/page-header.svelte +68 -0
  137. package/dist/admin/components/layout/page-header.svelte.d.ts +17 -0
  138. package/dist/admin/components/layout/site-header.svelte +9 -0
  139. package/dist/admin/components/layout/site-header.svelte.d.ts +2 -17
  140. package/dist/admin/components/media/file/file-name-input.svelte +6 -2
  141. package/dist/admin/components/media/file/file-preview.svelte +130 -17
  142. package/dist/admin/components/media/file-upload.svelte +16 -7
  143. package/dist/admin/components/media/file-upload.svelte.d.ts +1 -0
  144. package/dist/admin/components/media/files-list.svelte +153 -53
  145. package/dist/admin/components/media/files-list.svelte.d.ts +1 -0
  146. package/dist/admin/components/media/media-library.svelte +577 -198
  147. package/dist/admin/components/media/media-library.svelte.d.ts +4 -0
  148. package/dist/admin/components/media/media-selector.svelte +4 -2
  149. package/dist/admin/components/media/media-selector.svelte.d.ts +1 -0
  150. package/dist/admin/components/media/tag-sidebar.svelte +4 -4
  151. package/dist/admin/components/tiptap/FigureNodeView.svelte +10 -0
  152. package/dist/admin/components/tiptap/bubble-menu.svelte +104 -0
  153. package/dist/admin/components/tiptap/bubble-menu.svelte.d.ts +19 -0
  154. package/dist/admin/components/tiptap/content-editor.svelte +28 -24
  155. package/dist/admin/components/tiptap/editor-toolbar.svelte +7 -7
  156. package/dist/admin/components/tiptap/extensions.js +5 -1
  157. package/dist/admin/components/tiptap/image-dialog.svelte +5 -1
  158. package/dist/admin/components/tiptap/link-dialog.svelte +2 -0
  159. package/dist/admin/components/tiptap/tiptap-editor.svelte +18 -20
  160. package/dist/admin/components/tiptap/video-dialog.svelte +1 -1
  161. package/dist/admin/i18n/errors.d.ts +140 -0
  162. package/dist/admin/i18n/errors.js +151 -0
  163. package/dist/admin/remote/entry.remote.d.ts +59 -4
  164. package/dist/admin/remote/entry.remote.js +239 -62
  165. package/dist/admin/remote/shop.remote.d.ts +37 -32
  166. package/dist/admin/remote/shop.remote.js +9 -2
  167. package/dist/admin/shared/password-generate.d.ts +6 -0
  168. package/dist/admin/shared/password-generate.js +40 -0
  169. package/dist/admin/shared/password-schema.d.ts +6 -0
  170. package/dist/admin/shared/password-schema.js +10 -3
  171. package/dist/admin/styles/admin.css +23 -6
  172. package/dist/admin/styles/tokens.md +244 -0
  173. package/dist/admin/utils/accordionActivation.d.ts +13 -0
  174. package/dist/admin/utils/accordionActivation.js +35 -0
  175. package/dist/admin/utils/entryLabel.d.ts +23 -0
  176. package/dist/admin/utils/entryLabel.js +51 -12
  177. package/dist/admin/utils/field-a11y.d.ts +29 -0
  178. package/dist/admin/utils/field-a11y.js +23 -0
  179. package/dist/admin/utils/fieldPathElement.d.ts +9 -0
  180. package/dist/admin/utils/fieldPathElement.js +18 -0
  181. package/dist/admin/utils/fileDisplay.d.ts +10 -0
  182. package/dist/admin/utils/fileDisplay.js +26 -0
  183. package/dist/admin/utils/flattenFormErrors.d.ts +19 -0
  184. package/dist/admin/utils/flattenFormErrors.js +102 -0
  185. package/dist/admin/utils/formatters.d.ts +12 -0
  186. package/dist/admin/utils/{formatDate.js → formatters.js} +23 -2
  187. package/dist/admin/utils/scrollWithin.d.ts +9 -0
  188. package/dist/admin/utils/scrollWithin.js +32 -0
  189. package/dist/admin/utils/tabActivation.d.ts +12 -0
  190. package/dist/admin/utils/tabActivation.js +24 -0
  191. package/dist/cms/runtime/schema.d.ts +1 -0
  192. package/dist/cms/runtime/schema.js +1 -0
  193. package/dist/cms/runtime/types.d.ts +80 -7
  194. package/dist/components/ui/accordion/accordion-content.svelte +17 -3
  195. package/dist/components/ui/accordion/accordion.stories.svelte +21 -1
  196. package/dist/components/ui/alert/alert.stories.svelte +14 -0
  197. package/dist/components/ui/alert-dialog/alert-dialog.stories.svelte +45 -0
  198. package/dist/components/ui/alert-dialog/alert-dialog.stories.svelte.d.ts +27 -0
  199. package/dist/components/ui/avatar/avatar.stories.svelte +27 -0
  200. package/dist/components/ui/badge/badge.stories.svelte +15 -0
  201. package/dist/components/ui/breadcrumb/breadcrumb.stories.svelte +47 -0
  202. package/dist/components/ui/breadcrumb/breadcrumb.svelte +1 -1
  203. package/dist/components/ui/button/button.stories.svelte +53 -6
  204. package/dist/components/ui/button/button.svelte +39 -5
  205. package/dist/components/ui/button/button.svelte.d.ts +4 -0
  206. package/dist/components/ui/button-group/button-group.stories.svelte +44 -0
  207. package/dist/components/ui/button-group/button-group.stories.svelte.d.ts +27 -0
  208. package/dist/components/ui/calendar/calendar.stories.svelte +36 -0
  209. package/dist/components/ui/calendar/calendar.stories.svelte.d.ts +27 -0
  210. package/dist/components/ui/card/card.stories.svelte +7 -0
  211. package/dist/components/ui/carousel/carousel.stories.svelte +43 -0
  212. package/dist/components/ui/carousel/carousel.stories.svelte.d.ts +27 -0
  213. package/dist/components/ui/checkbox/checkbox.stories.svelte +67 -0
  214. package/dist/components/ui/checkbox/checkbox.stories.svelte.d.ts +27 -0
  215. package/dist/components/ui/checkbox/checkbox.svelte +3 -3
  216. package/dist/components/ui/command/command.stories.svelte +18 -0
  217. package/dist/components/ui/data-table/data-table.stories.svelte +61 -0
  218. package/dist/components/ui/data-table/data-table.stories.svelte.d.ts +18 -0
  219. package/dist/components/ui/dialog/dialog-content.svelte +5 -0
  220. package/dist/components/ui/dialog/dialog-content.svelte.d.ts +2 -0
  221. package/dist/components/ui/dialog/dialog.stories.svelte +35 -0
  222. package/dist/components/ui/dropdown-menu/dropdown-menu.stories.svelte +74 -0
  223. package/dist/components/ui/dropdown-menu/dropdown-menu.stories.svelte.d.ts +27 -0
  224. package/dist/components/ui/field/field-context.svelte.d.ts +22 -0
  225. package/dist/components/ui/field/field-context.svelte.js +9 -0
  226. package/dist/components/ui/field/field-control.svelte +18 -0
  227. package/dist/components/ui/field/field-control.svelte.d.ts +8 -0
  228. package/dist/components/ui/field/field-description.svelte +12 -0
  229. package/dist/components/ui/field/field-error.svelte +14 -6
  230. package/dist/components/ui/field/field-label.svelte +10 -0
  231. package/dist/components/ui/field/field.stories.svelte +95 -9
  232. package/dist/components/ui/field/field.svelte +57 -0
  233. package/dist/components/ui/field/field.svelte.d.ts +2 -0
  234. package/dist/components/ui/field/index.d.ts +3 -1
  235. package/dist/components/ui/field/index.js +4 -2
  236. package/dist/components/ui/form/form-field-errors.svelte +1 -1
  237. package/dist/components/ui/form/form.stories.svelte +25 -0
  238. package/dist/components/ui/form/form.stories.svelte.d.ts +26 -0
  239. package/dist/components/ui/input/input.stories.svelte +26 -0
  240. package/dist/components/ui/input-group/input-group-input.svelte.d.ts +1 -1
  241. package/dist/components/ui/input-group/input-group.stories.svelte +43 -0
  242. package/dist/components/ui/input-group/input-group.stories.svelte.d.ts +27 -0
  243. package/dist/components/ui/item/item.stories.svelte +61 -0
  244. package/dist/components/ui/item/item.stories.svelte.d.ts +27 -0
  245. package/dist/components/ui/label/label.stories.svelte +7 -0
  246. package/dist/components/ui/live-region/index.d.ts +1 -0
  247. package/dist/components/ui/live-region/index.js +1 -0
  248. package/dist/components/ui/live-region/live-region-demo.svelte +32 -0
  249. package/dist/components/ui/live-region/live-region-demo.svelte.d.ts +7 -0
  250. package/dist/components/ui/live-region/live-region.stories.svelte +23 -0
  251. package/dist/components/ui/live-region/live-region.stories.svelte.d.ts +26 -0
  252. package/dist/components/ui/live-region/live-region.svelte +12 -0
  253. package/dist/components/ui/live-region/live-region.svelte.d.ts +8 -0
  254. package/dist/components/ui/popover/popover.stories.svelte +34 -0
  255. package/dist/components/ui/radio-group/radio-group.stories.svelte +58 -0
  256. package/dist/components/ui/radio-group/radio-group.stories.svelte.d.ts +27 -0
  257. package/dist/components/ui/resizable/resizable.stories.svelte +56 -0
  258. package/dist/components/ui/resizable/resizable.stories.svelte.d.ts +27 -0
  259. package/dist/components/ui/select/select.stories.svelte +49 -0
  260. package/dist/components/ui/separator/separator.stories.svelte +18 -0
  261. package/dist/components/ui/sheet/sheet.stories.svelte +34 -0
  262. package/dist/components/ui/sidebar/sidebar-input.svelte.d.ts +1 -1
  263. package/dist/components/ui/sidebar/sidebar-menu-button.svelte +1 -0
  264. package/dist/components/ui/sidebar/sidebar-trigger.svelte +1 -1
  265. package/dist/components/ui/sidebar/sidebar.stories.svelte +72 -0
  266. package/dist/components/ui/sidebar/sidebar.stories.svelte.d.ts +27 -0
  267. package/dist/components/ui/skeleton/skeleton.stories.svelte +39 -0
  268. package/dist/components/ui/skeleton/skeleton.stories.svelte.d.ts +27 -0
  269. package/dist/components/ui/skeleton/skeleton.svelte +6 -0
  270. package/dist/components/ui/sonner/index.d.ts +1 -1
  271. package/dist/components/ui/sonner/index.js +1 -1
  272. package/dist/components/ui/sonner/sonner.stories.svelte +7 -0
  273. package/dist/components/ui/sonner/sonner.svelte +17 -1
  274. package/dist/components/ui/sonner/sonner.svelte.d.ts +6 -0
  275. package/dist/components/ui/spinner/spinner.stories.svelte +30 -0
  276. package/dist/components/ui/spinner/spinner.stories.svelte.d.ts +27 -0
  277. package/dist/components/ui/switch/switch.stories.svelte +56 -0
  278. package/dist/components/ui/switch/switch.stories.svelte.d.ts +27 -0
  279. package/dist/components/ui/table/table-cell.svelte +1 -1
  280. package/dist/components/ui/table/table-head.svelte +1 -1
  281. package/dist/components/ui/table/table.stories.svelte +68 -0
  282. package/dist/components/ui/table/table.stories.svelte.d.ts +27 -0
  283. package/dist/components/ui/table/table.svelte +1 -1
  284. package/dist/components/ui/tabs/tabs.stories.svelte +48 -0
  285. package/dist/components/ui/tabs/tabs.stories.svelte.d.ts +27 -0
  286. package/dist/components/ui/textarea/textarea.stories.svelte +21 -0
  287. package/dist/components/ui/toggle/toggle.stories.svelte +23 -0
  288. package/dist/components/ui/toggle-group/toggle-group.stories.svelte +43 -0
  289. package/dist/components/ui/tooltip/tooltip.stories.svelte +46 -6
  290. package/dist/core/fields/fieldSchemaToTs.d.ts +7 -0
  291. package/dist/core/fields/fieldSchemaToTs.js +234 -90
  292. package/dist/core/fields/layoutUtils.d.ts +4 -1
  293. package/dist/core/fields/layoutUtils.js +41 -4
  294. package/dist/core/fields/resolveSeo.d.ts +70 -0
  295. package/dist/core/fields/resolveSeo.js +88 -0
  296. package/dist/core/fields/seoFieldDescriptor.d.ts +43 -0
  297. package/dist/core/fields/seoFieldDescriptor.js +74 -0
  298. package/dist/core/fields/slugPath.d.ts +13 -0
  299. package/dist/core/fields/slugPath.js +32 -0
  300. package/dist/core/fields/urlUtils.d.ts +8 -0
  301. package/dist/core/fields/urlUtils.js +27 -0
  302. package/dist/core/index.d.ts +1 -0
  303. package/dist/core/index.js +1 -0
  304. package/dist/core/server/entries/operations/create.js +13 -0
  305. package/dist/core/server/entries/operations/get.d.ts +7 -0
  306. package/dist/core/server/entries/operations/get.js +10 -6
  307. package/dist/core/server/entries/operations/slugUniqueness.d.ts +37 -0
  308. package/dist/core/server/entries/operations/slugUniqueness.js +116 -0
  309. package/dist/core/server/entries/operations/update.d.ts +6 -1
  310. package/dist/core/server/entries/operations/update.js +24 -1
  311. package/dist/core/server/fields/slugResolver.d.ts +3 -13
  312. package/dist/core/server/fields/slugResolver.js +8 -37
  313. package/dist/core/server/generator/fields.js +10 -17
  314. package/dist/core/server/generator/formFields.js +2 -1
  315. package/dist/core/server/generator/generator.js +4 -4
  316. package/dist/core/server/generator/utils.d.ts +1 -0
  317. package/dist/core/server/generator/utils.js +4 -0
  318. package/dist/paraglide/messages/_index.d.ts +3 -36
  319. package/dist/paraglide/messages/_index.js +3 -71
  320. package/dist/paraglide/messages/hello_world.d.ts +5 -0
  321. package/dist/paraglide/messages/hello_world.js +33 -0
  322. package/dist/paraglide/messages/login_hello.d.ts +16 -0
  323. package/dist/paraglide/messages/login_hello.js +34 -0
  324. package/dist/paraglide/messages/login_please_login.d.ts +16 -0
  325. package/dist/paraglide/messages/login_please_login.js +34 -0
  326. package/dist/shop/server/orders.d.ts +1 -0
  327. package/dist/shop/server/orders.js +14 -0
  328. package/dist/shop/server/shop-data.d.ts +2 -0
  329. package/dist/shop/server/shop-data.js +20 -5
  330. package/dist/sveltekit/server/handle.js +17 -0
  331. package/dist/types/cms.schema.js +4 -2
  332. package/dist/types/fields.d.ts +35 -0
  333. package/dist/types/index.d.ts +1 -1
  334. package/dist/types/layout.d.ts +35 -2
  335. package/dist/updates/0.26.0/index.d.ts +2 -0
  336. package/dist/updates/0.26.0/index.js +51 -0
  337. package/dist/updates/index.js +3 -1
  338. package/package.json +29 -7
  339. package/dist/admin/client/collection/empty-state.svelte +0 -28
  340. package/dist/admin/client/collection/empty-state.svelte.d.ts +0 -9
  341. package/dist/admin/client/form/submission-status-badge.svelte +0 -41
  342. package/dist/admin/client/form/submission-status-badge.svelte.d.ts +0 -7
  343. package/dist/admin/components/media/file-preview.svelte +0 -51
  344. package/dist/admin/components/media/file-preview.svelte.d.ts +0 -6
  345. package/dist/admin/utils/formatDate.d.ts +0 -5
  346. package/dist/paraglide/messages/en.d.ts +0 -5
  347. package/dist/paraglide/messages/en.js +0 -14
  348. package/dist/paraglide/messages/pl.d.ts +0 -5
  349. package/dist/paraglide/messages/pl.js +0 -14
@@ -0,0 +1,67 @@
1
+ <script module>
2
+ import { defineMeta } from '@storybook/addon-svelte-csf';
3
+ import { Checkbox } from './index.js';
4
+ import { Label } from '../label/index.js';
5
+
6
+ const { Story } = defineMeta({
7
+ title: 'UI/Forms/Checkbox',
8
+ component: Checkbox,
9
+ tags: ['autodocs'],
10
+ parameters: {
11
+ docs: {
12
+ description: {
13
+ component: 'Pojedynczy wybór typu „włącz/wyłącz". Zawsze sparowany z `<Label>`. W formularzach łącz przez `Field.Control`, by błędy walidacji propagowały się do `aria-invalid` automatycznie.',
14
+ },
15
+ },
16
+ },
17
+ argTypes: {
18
+ checked: {
19
+ control: 'boolean',
20
+ description: 'Stan zaznaczenia.',
21
+ },
22
+ disabled: {
23
+ control: 'boolean',
24
+ description: 'Wyłącza interakcję.',
25
+ },
26
+ },
27
+ });
28
+ </script>
29
+
30
+ <Story name="Default">
31
+ <div style="display:flex;align-items:center;gap:8px;">
32
+ <Checkbox id="cb-default" />
33
+ <Label for="cb-default">Akceptuję regulamin</Label>
34
+ </div>
35
+ </Story>
36
+
37
+ <Story name="Checked">
38
+ <div style="display:flex;align-items:center;gap:8px;">
39
+ <Checkbox id="cb-checked" checked />
40
+ <Label for="cb-checked">Zapisz mnie do newslettera</Label>
41
+ </div>
42
+ </Story>
43
+
44
+ <Story name="Disabled">
45
+ <div style="display:flex;align-items:center;gap:8px;">
46
+ <Checkbox id="cb-disabled" disabled />
47
+ <Label for="cb-disabled">Opcja niedostępna</Label>
48
+ </div>
49
+ </Story>
50
+
51
+ <Story name="Group">
52
+ <fieldset style="display:flex;flex-direction:column;gap:8px;border:0;padding:0;">
53
+ <legend style="margin-bottom:8px;font-weight:600;">Wybierz języki</legend>
54
+ <div style="display:flex;align-items:center;gap:8px;">
55
+ <Checkbox id="cb-pl" checked />
56
+ <Label for="cb-pl">Polski</Label>
57
+ </div>
58
+ <div style="display:flex;align-items:center;gap:8px;">
59
+ <Checkbox id="cb-en" />
60
+ <Label for="cb-en">English</Label>
61
+ </div>
62
+ <div style="display:flex;align-items:center;gap:8px;">
63
+ <Checkbox id="cb-de" />
64
+ <Label for="cb-de">Deutsch</Label>
65
+ </div>
66
+ </fieldset>
67
+ </Story>
@@ -0,0 +1,27 @@
1
+ export default Checkbox;
2
+ type Checkbox = SvelteComponent<{
3
+ [x: string]: never;
4
+ }, {
5
+ [evt: string]: CustomEvent<any>;
6
+ }, {}> & {
7
+ $$bindings?: string | undefined;
8
+ };
9
+ declare const Checkbox: $$__sveltets_2_IsomorphicComponent<{
10
+ [x: string]: never;
11
+ }, {
12
+ [evt: string]: CustomEvent<any>;
13
+ }, {}, {}, string>;
14
+ import { Checkbox } 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
+ }
@@ -17,7 +17,7 @@
17
17
  bind:ref
18
18
  data-slot="checkbox"
19
19
  class={cn(
20
- "border-input dark:bg-input/30 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground dark:data-[state=checked]:bg-primary data-[state=checked]:border-primary focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive shadow-xs peer flex size-4 shrink-0 items-center justify-center rounded-[4px] border outline-none transition-shadow focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50",
20
+ "border-input dark:bg-input/30 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground dark:data-[state=checked]:bg-primary data-[state=checked]:border-primary focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive shadow-xs peer flex size-6 shrink-0 items-center justify-center rounded-[4px] border outline-none transition-shadow focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50",
21
21
  className
22
22
  )}
23
23
  bind:checked
@@ -27,9 +27,9 @@
27
27
  {#snippet children({ checked, indeterminate })}
28
28
  <div data-slot="checkbox-indicator" class="text-current transition-none">
29
29
  {#if checked}
30
- <CheckIcon class="size-3.5" />
30
+ <CheckIcon class="size-4" />
31
31
  {:else if indeterminate}
32
- <MinusIcon class="size-3.5" />
32
+ <MinusIcon class="size-4" />
33
33
  {/if}
34
34
  </div>
35
35
  {/snippet}
@@ -6,9 +6,27 @@
6
6
  title: 'UI/Navigation/Command',
7
7
  component: Command,
8
8
  tags: ['autodocs'],
9
+ parameters: {
10
+ docs: {
11
+ description: {
12
+ component: 'Lista wyszukiwalnych komend (Cmd-K palette). Filtrowanie wbudowane — pisz po `CommandItem` z czytelnymi etykietami.',
13
+ },
14
+ },
15
+ },
9
16
  });
10
17
  </script>
11
18
 
19
+ <Story name="Empty (no results)">
20
+ <div style="max-width:300px;border:1px solid var(--border);border-radius:12px;overflow:hidden;">
21
+ <Command>
22
+ <CommandInput placeholder="Szukaj…" value="zzzz" />
23
+ <CommandList>
24
+ <CommandEmpty>Nie znaleziono — sprawdź pisownię lub spróbuj prostszej frazy.</CommandEmpty>
25
+ </CommandList>
26
+ </Command>
27
+ </div>
28
+ </Story>
29
+
12
30
  <Story name="Slash Popup">
13
31
  <div style="max-width:300px;border:1px solid var(--border);border-radius:12px;box-shadow:var(--shadow-xl);overflow:hidden;">
14
32
  <Command>
@@ -0,0 +1,61 @@
1
+ <script module lang="ts">
2
+ import { defineMeta } from '@storybook/addon-svelte-csf';
3
+ import { createSvelteTable, FlexRender } from './index.js';
4
+ import * as Table from '../table/index.js';
5
+ import { getCoreRowModel, type ColumnDef } from '@tanstack/table-core';
6
+ import { orders } from '../../../../stories/_fixtures/index.js';
7
+
8
+ type Order = (typeof orders.allStatuses)[number];
9
+
10
+ const columns: ColumnDef<Order>[] = [
11
+ { accessorKey: 'number', header: 'Numer' },
12
+ { accessorKey: 'customerEmail', header: 'Email klienta' },
13
+ { accessorKey: 'totalGross', header: 'Kwota (grosze)' },
14
+ { accessorKey: 'status', header: 'Status' }
15
+ ];
16
+
17
+ const { Story } = defineMeta({
18
+ title: 'UI/Data/DataTable',
19
+ component: FlexRender,
20
+ tags: ['autodocs'],
21
+ parameters: {
22
+ docs: {
23
+ description: {
24
+ component: 'Renderer wiersza/komórki dla `@tanstack/table-core`. W praktyce kompozyt — kolumny i model definiujesz w komponencie wyższego rzędu, ten primitive tylko renderuje.',
25
+ },
26
+ },
27
+ },
28
+ });
29
+ </script>
30
+
31
+ <Story name="Orders sample">
32
+ {@const table = createSvelteTable({
33
+ data: orders.allStatuses,
34
+ columns,
35
+ getCoreRowModel: getCoreRowModel()
36
+ })}
37
+ <Table.Root>
38
+ <Table.Header>
39
+ {#each table.getHeaderGroups() as headerGroup (headerGroup.id)}
40
+ <Table.Row>
41
+ {#each headerGroup.headers as header (header.id)}
42
+ <Table.Head>
43
+ <FlexRender content={header.column.columnDef.header} context={header.getContext()} />
44
+ </Table.Head>
45
+ {/each}
46
+ </Table.Row>
47
+ {/each}
48
+ </Table.Header>
49
+ <Table.Body>
50
+ {#each table.getRowModel().rows as row (row.id)}
51
+ <Table.Row>
52
+ {#each row.getVisibleCells() as cell (cell.id)}
53
+ <Table.Cell>
54
+ <FlexRender content={cell.column.columnDef.cell} context={cell.getContext()} />
55
+ </Table.Cell>
56
+ {/each}
57
+ </Table.Row>
58
+ {/each}
59
+ </Table.Body>
60
+ </Table.Root>
61
+ </Story>
@@ -0,0 +1,18 @@
1
+ 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> {
2
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
3
+ $$bindings?: Bindings;
4
+ } & Exports;
5
+ (internal: unknown, props: {
6
+ $$events?: Events;
7
+ $$slots?: Slots;
8
+ }): Exports & {
9
+ $set?: any;
10
+ $on?: any;
11
+ };
12
+ z_$$bindings?: Bindings;
13
+ }
14
+ declare const DataTable: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
15
+ [evt: string]: CustomEvent<any>;
16
+ }, {}, {}, string>;
17
+ type DataTable = InstanceType<typeof DataTable>;
18
+ export default DataTable;
@@ -11,11 +11,14 @@
11
11
  portalProps,
12
12
  children,
13
13
  showCloseButton = true,
14
+ fullscreenMobile = false,
14
15
  ...restProps
15
16
  }: WithoutChildrenOrChild<DialogPrimitive.ContentProps> & {
16
17
  portalProps?: DialogPrimitive.PortalProps;
17
18
  children: Snippet;
18
19
  showCloseButton?: boolean;
20
+ /** Render the dialog as a fullscreen sheet on viewports < 640px (sm). */
21
+ fullscreenMobile?: boolean;
19
22
  } = $props();
20
23
  </script>
21
24
 
@@ -26,6 +29,8 @@
26
29
  data-slot="dialog-content"
27
30
  class={cn(
28
31
  'bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:max-w-lg',
32
+ fullscreenMobile &&
33
+ 'max-sm:top-0 max-sm:left-0 max-sm:h-[100dvh] max-sm:max-h-none max-sm:max-w-none max-sm:w-screen max-sm:translate-x-0 max-sm:translate-y-0 max-sm:rounded-none max-sm:border-0',
29
34
  className
30
35
  )}
31
36
  {...restProps}
@@ -5,6 +5,8 @@ type $$ComponentProps = WithoutChildrenOrChild<DialogPrimitive.ContentProps> & {
5
5
  portalProps?: DialogPrimitive.PortalProps;
6
6
  children: Snippet;
7
7
  showCloseButton?: boolean;
8
+ /** Render the dialog as a fullscreen sheet on viewports < 640px (sm). */
9
+ fullscreenMobile?: boolean;
8
10
  };
9
11
  declare const DialogContent: import("svelte").Component<$$ComponentProps, {}, "ref">;
10
12
  type DialogContent = ReturnType<typeof DialogContent>;
@@ -7,6 +7,19 @@
7
7
  title: 'UI/Overlays/Dialog',
8
8
  component: Dialog,
9
9
  tags: ['autodocs'],
10
+ parameters: {
11
+ docs: {
12
+ description: {
13
+ component: 'Niskopoziomowy modal (formularz, picker). Dla potwierdzeń destrukcyjnych użyj `AlertDialog`. Pierwszy fokus → pierwsze pole edytowalne, nie przycisk Anuluj.',
14
+ },
15
+ },
16
+ },
17
+ argTypes: {
18
+ open: {
19
+ control: 'boolean',
20
+ description: 'Stan otwarcia (opcjonalne — Trigger steruje sam).',
21
+ },
22
+ },
10
23
  });
11
24
  </script>
12
25
 
@@ -27,3 +40,25 @@
27
40
  </DialogContent>
28
41
  </Dialog>
29
42
  </Story>
43
+
44
+ <Story name="Information only">
45
+ <Dialog>
46
+ <DialogTrigger>
47
+ <Button variant="outline">Pokaż informację</Button>
48
+ </DialogTrigger>
49
+ <DialogContent>
50
+ <DialogHeader>
51
+ <DialogTitle>Sesja zostanie odświeżona</DialogTitle>
52
+ <DialogDescription>
53
+ Twoja sesja jest aktywna. Za 5 minut nastąpi automatyczne odświeżenie tokena bez utraty pracy.
54
+ </DialogDescription>
55
+ </DialogHeader>
56
+ <DialogFooter>
57
+ <Button>OK</Button>
58
+ </DialogFooter>
59
+ </DialogContent>
60
+ </Dialog>
61
+ </Story>
62
+
63
+ <!-- SUGESTIA(S3): focus trap test (Tab nie ucieka) + ESC return focus na trigger — manual sprawdzenie. -->
64
+
@@ -0,0 +1,74 @@
1
+ <script module>
2
+ import { defineMeta } from '@storybook/addon-svelte-csf';
3
+ import * as DropdownMenu from './index.js';
4
+ import { DropdownMenu as DropdownMenuRoot } from './index.js';
5
+ import { Button } from '../button/index.js';
6
+
7
+ const { Story } = defineMeta({
8
+ title: 'UI/Overlays/DropdownMenu',
9
+ component: DropdownMenuRoot,
10
+ tags: ['autodocs'],
11
+ parameters: {
12
+ docs: {
13
+ description: {
14
+ component: 'Menu kontekstowe powiązane z triggerem. Klawiatura: Enter/Space otwiera, Esc zamyka, strzałki nawigują.',
15
+ },
16
+ },
17
+ },
18
+ argTypes: {
19
+ open: {
20
+ control: 'boolean',
21
+ description: 'Stan otwarcia (opcjonalne).',
22
+ },
23
+ dir: {
24
+ control: 'select',
25
+ options: ['ltr', 'rtl'],
26
+ description: 'Kierunek tekstu — domyślnie z `<html dir>`.',
27
+ },
28
+ },
29
+ });
30
+ </script>
31
+
32
+ <Story name="Basic actions">
33
+ <DropdownMenu.Root>
34
+ <DropdownMenu.Trigger>
35
+ {#snippet child({ props })}
36
+ <Button variant="outline" {...props}>Akcje wpisu</Button>
37
+ {/snippet}
38
+ </DropdownMenu.Trigger>
39
+ <DropdownMenu.Content>
40
+ <DropdownMenu.Item>Edytuj</DropdownMenu.Item>
41
+ <DropdownMenu.Item>Duplikuj</DropdownMenu.Item>
42
+ <DropdownMenu.Separator />
43
+ <DropdownMenu.Item>Archiwizuj</DropdownMenu.Item>
44
+ </DropdownMenu.Content>
45
+ </DropdownMenu.Root>
46
+ </Story>
47
+
48
+ <Story name="Z grupą i shortcutami">
49
+ <DropdownMenu.Root>
50
+ <DropdownMenu.Trigger>
51
+ {#snippet child({ props })}
52
+ <Button variant="outline" {...props}>Plik</Button>
53
+ {/snippet}
54
+ </DropdownMenu.Trigger>
55
+ <DropdownMenu.Content>
56
+ <DropdownMenu.Group>
57
+ <DropdownMenu.GroupHeading>Plik</DropdownMenu.GroupHeading>
58
+ <DropdownMenu.Item>
59
+ Nowy
60
+ <DropdownMenu.Shortcut>⌘N</DropdownMenu.Shortcut>
61
+ </DropdownMenu.Item>
62
+ <DropdownMenu.Item>
63
+ Otwórz
64
+ <DropdownMenu.Shortcut>⌘O</DropdownMenu.Shortcut>
65
+ </DropdownMenu.Item>
66
+ </DropdownMenu.Group>
67
+ <DropdownMenu.Separator />
68
+ <DropdownMenu.Item>
69
+ Zapisz
70
+ <DropdownMenu.Shortcut>⌘S</DropdownMenu.Shortcut>
71
+ </DropdownMenu.Item>
72
+ </DropdownMenu.Content>
73
+ </DropdownMenu.Root>
74
+ </Story>
@@ -0,0 +1,27 @@
1
+ export default DropdownMenu;
2
+ type DropdownMenu = SvelteComponent<{
3
+ [x: string]: never;
4
+ }, {
5
+ [evt: string]: CustomEvent<any>;
6
+ }, {}> & {
7
+ $$bindings?: string | undefined;
8
+ };
9
+ declare const DropdownMenu: $$__sveltets_2_IsomorphicComponent<{
10
+ [x: string]: never;
11
+ }, {
12
+ [evt: string]: CustomEvent<any>;
13
+ }, {}, {}, string>;
14
+ import * as DropdownMenu 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,22 @@
1
+ export type FieldA11yProps = {
2
+ id: string;
3
+ "aria-describedby"?: string;
4
+ "aria-invalid"?: "true" | undefined;
5
+ "aria-required"?: "true" | undefined;
6
+ };
7
+ export type FieldContext = {
8
+ inputId: string;
9
+ descriptionId: string;
10
+ errorId: string;
11
+ required: boolean;
12
+ hasDescription: boolean;
13
+ hasError: boolean;
14
+ invalid: boolean;
15
+ registerDescription: () => void;
16
+ unregisterDescription: () => void;
17
+ registerError: () => void;
18
+ unregisterError: () => void;
19
+ getControlProps: () => FieldA11yProps;
20
+ };
21
+ export declare function setFieldContext(ctx: FieldContext): FieldContext;
22
+ export declare function getFieldContext(): FieldContext | undefined;
@@ -0,0 +1,9 @@
1
+ import { getContext, setContext } from "svelte";
2
+ const FIELD_CONTEXT_KEY = Symbol("ui-field");
3
+ export function setFieldContext(ctx) {
4
+ setContext(FIELD_CONTEXT_KEY, ctx);
5
+ return ctx;
6
+ }
7
+ export function getFieldContext() {
8
+ return getContext(FIELD_CONTEXT_KEY);
9
+ }
@@ -0,0 +1,18 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from "svelte";
3
+ import { getFieldContext, type FieldA11yProps } from "./field-context.svelte.js";
4
+
5
+ let { child }: { child: Snippet<[FieldA11yProps]> } = $props();
6
+
7
+ const ctx = getFieldContext();
8
+
9
+ if (!ctx && import.meta.env.DEV) {
10
+ console.warn(
11
+ "[ui/field] <FieldControl> użyte poza <Field> — brak context, ARIA props nie zostaną wstrzyknięte.",
12
+ );
13
+ }
14
+ </script>
15
+
16
+ {#if ctx}
17
+ {@render child(ctx.getControlProps())}
18
+ {/if}
@@ -0,0 +1,8 @@
1
+ import type { Snippet } from "svelte";
2
+ import { type FieldA11yProps } from "./field-context.svelte.js";
3
+ type $$ComponentProps = {
4
+ child: Snippet<[FieldA11yProps]>;
5
+ };
6
+ declare const FieldControl: import("svelte").Component<$$ComponentProps, {}, "">;
7
+ type FieldControl = ReturnType<typeof FieldControl>;
8
+ export default FieldControl;
@@ -1,17 +1,29 @@
1
1
  <script lang="ts">
2
2
  import { cn, type WithElementRef } from "../../../utils.js";
3
3
  import type { HTMLAttributes } from "svelte/elements";
4
+ import { onMount } from "svelte";
5
+ import { getFieldContext } from "./field-context.svelte.js";
4
6
 
5
7
  let {
6
8
  ref = $bindable(null),
7
9
  class: className,
10
+ id: idProp,
8
11
  children,
9
12
  ...restProps
10
13
  }: WithElementRef<HTMLAttributes<HTMLParagraphElement>> = $props();
14
+
15
+ const ctx = getFieldContext();
16
+ const id = $derived(idProp ?? ctx?.descriptionId);
17
+
18
+ onMount(() => {
19
+ ctx?.registerDescription();
20
+ return () => ctx?.unregisterDescription();
21
+ });
11
22
  </script>
12
23
 
13
24
  <p
14
25
  bind:this={ref}
26
+ {id}
15
27
  data-slot="field-description"
16
28
  class={cn(
17
29
  "text-muted-foreground text-sm font-normal leading-normal group-has-[[data-orientation=horizontal]]/field:text-balance",
@@ -2,10 +2,13 @@
2
2
  import { cn, type WithElementRef } from "../../../utils.js";
3
3
  import type { HTMLAttributes } from "svelte/elements";
4
4
  import type { Snippet } from "svelte";
5
+ import { onMount } from "svelte";
6
+ import { getFieldContext } from "./field-context.svelte.js";
5
7
 
6
8
  let {
7
9
  ref = $bindable(null),
8
10
  class: className,
11
+ id: idProp,
9
12
  children,
10
13
  errors,
11
14
  ...restProps
@@ -14,21 +17,24 @@
14
17
  errors?: { message?: string }[];
15
18
  } = $props();
16
19
 
20
+ const ctx = getFieldContext();
21
+ const id = $derived(idProp ?? ctx?.errorId);
22
+
17
23
  const hasContent = $derived.by(() => {
18
- // has slotted error
19
24
  if (children) return true;
20
-
21
- // no errors
22
25
  if (!errors) return false;
23
-
24
- // has an error but no message
25
26
  if (errors.length === 1 && !errors[0]?.message) {
26
27
  return false;
27
28
  }
28
-
29
29
  return true;
30
30
  });
31
31
 
32
+ onMount(() => {
33
+ if (!ctx) return;
34
+ ctx.registerError();
35
+ return () => ctx.unregisterError();
36
+ });
37
+
32
38
  const isMultipleErrors = $derived(errors && errors.length > 1);
33
39
  const singleErrorMessage = $derived(errors && errors.length === 1 && errors[0]?.message);
34
40
  </script>
@@ -36,7 +42,9 @@
36
42
  {#if hasContent}
37
43
  <div
38
44
  bind:this={ref}
45
+ {id}
39
46
  role="alert"
47
+ aria-live="polite"
40
48
  data-slot="field-error"
41
49
  class={cn("text-destructive text-sm font-normal", className)}
42
50
  {...restProps}
@@ -2,17 +2,24 @@
2
2
  import { Label } from "../label/index.js";
3
3
  import { cn } from "../../../utils.js";
4
4
  import type { ComponentProps } from "svelte";
5
+ import { getFieldContext } from "./field-context.svelte.js";
5
6
 
6
7
  let {
7
8
  ref = $bindable(null),
8
9
  class: className,
10
+ for: forProp,
9
11
  children,
10
12
  ...restProps
11
13
  }: ComponentProps<typeof Label> = $props();
14
+
15
+ const ctx = getFieldContext();
16
+ const forId = $derived(forProp ?? ctx?.inputId);
17
+ const required = $derived(ctx?.required ?? false);
12
18
  </script>
13
19
 
14
20
  <Label
15
21
  bind:ref
22
+ for={forId}
16
23
  data-slot="field-label"
17
24
  class={cn(
18
25
  "group/field-label peer/field-label flex w-fit gap-2 leading-snug group-data-[disabled=true]/field:opacity-50",
@@ -23,4 +30,7 @@
23
30
  {...restProps}
24
31
  >
25
32
  {@render children?.()}
33
+ {#if required}
34
+ <span aria-hidden="true" class="text-destructive">*</span>
35
+ {/if}
26
36
  </Label>