includio-cms 0.25.0 → 0.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (349) hide show
  1. package/API.md +57 -4
  2. package/CHANGELOG.md +53 -0
  3. package/DOCS.md +1 -1
  4. package/README.md +2 -0
  5. package/ROADMAP.md +6 -0
  6. package/dist/admin/client/account/lang.d.ts +1 -0
  7. package/dist/admin/client/account/lang.js +4 -2
  8. package/dist/admin/client/account/profile-section.svelte +2 -2
  9. package/dist/admin/client/account/security-section.svelte +27 -4
  10. package/dist/admin/client/account/sessions-section.svelte +1 -1
  11. package/dist/admin/client/admin/admin-after-login-layout-content.svelte +1 -1
  12. package/dist/admin/client/admin/dashboard-page.svelte +34 -10
  13. package/dist/admin/client/collection/bulk-actions-bar.svelte +86 -44
  14. package/dist/admin/client/collection/bulk-actions-bar.svelte.d.ts +3 -1
  15. package/dist/admin/client/collection/collection-entries.svelte +52 -36
  16. package/dist/admin/client/collection/collection-entries.svelte.d.ts +3 -0
  17. package/dist/admin/client/collection/collection.svelte +28 -14
  18. package/dist/admin/client/collection/collection.svelte.d.ts +3 -0
  19. package/dist/admin/client/collection/data-table.svelte +279 -130
  20. package/dist/admin/client/collection/data-table.svelte.d.ts +11 -0
  21. package/dist/admin/client/collection/date-cell.svelte +4 -4
  22. package/dist/admin/client/collection/row-actions.svelte +2 -1
  23. package/dist/admin/client/collection/sortable-header.svelte +33 -9
  24. package/dist/admin/client/collection/state-display.svelte +102 -0
  25. package/dist/admin/client/collection/state-display.svelte.d.ts +12 -0
  26. package/dist/admin/client/collection/status-badge.svelte +99 -11
  27. package/dist/admin/client/collection/status-badge.svelte.d.ts +15 -1
  28. package/dist/admin/client/collection/table-pagination.svelte +21 -6
  29. package/dist/admin/client/collection/table-toolbar.svelte +105 -80
  30. package/dist/admin/client/collection/table-toolbar.svelte.d.ts +11 -8
  31. package/dist/admin/client/entry/entry-form.svelte +36 -11
  32. package/dist/admin/client/entry/entry-form.svelte.d.ts +1 -0
  33. package/dist/admin/client/entry/entry-header.svelte +22 -15
  34. package/dist/admin/client/entry/entry-header.svelte.d.ts +1 -0
  35. package/dist/admin/client/entry/entry.svelte +269 -165
  36. package/dist/admin/client/entry/header/a11y-header-badge.svelte +47 -0
  37. package/dist/admin/client/entry/header/a11y-header-badge.svelte.d.ts +8 -0
  38. package/dist/admin/client/entry/header/publish-panel.svelte +69 -13
  39. package/dist/admin/client/entry/header/save-indicator.svelte +57 -28
  40. package/dist/admin/client/entry/header/save-indicator.svelte.d.ts +1 -0
  41. package/dist/admin/client/entry/header/status-badge.svelte +60 -15
  42. package/dist/admin/client/entry/header/status-badge.svelte.d.ts +1 -2
  43. package/dist/admin/client/entry/header/version-history-sheet.svelte +1 -1
  44. package/dist/admin/client/entry/hybrid/hybrid-layout.svelte +74 -23
  45. package/dist/admin/client/entry/hybrid/hybrid-preview.svelte +1 -1
  46. package/dist/admin/client/entry/utils.d.ts +14 -0
  47. package/dist/admin/client/entry/utils.js +28 -0
  48. package/dist/admin/client/form/form-submission/form-submission.svelte +2 -2
  49. package/dist/admin/client/form/form-submissions.svelte +143 -194
  50. package/dist/admin/client/form/form-submissions.svelte.d.ts +2 -0
  51. package/dist/admin/client/login/lang.d.ts +3 -0
  52. package/dist/admin/client/login/lang.js +10 -4
  53. package/dist/admin/client/login/login-form.svelte +8 -1
  54. package/dist/admin/client/login/reset-password-page.svelte +24 -3
  55. package/dist/admin/client/login/schema.d.ts +14 -2
  56. package/dist/admin/client/login/schema.js +19 -8
  57. package/dist/admin/client/maintenance/maintenance-page.svelte +16 -17
  58. package/dist/admin/client/media/media-page.svelte +1 -1
  59. package/dist/admin/client/shop/coupon-edit-page.svelte +117 -13
  60. package/dist/admin/client/shop/coupon-form.svelte +282 -138
  61. package/dist/admin/client/shop/coupon-form.svelte.d.ts +1 -9
  62. package/dist/admin/client/shop/coupon-new-page.svelte +40 -10
  63. package/dist/admin/client/shop/coupon-new-page.svelte.d.ts +2 -17
  64. package/dist/admin/client/shop/coupon-schema.d.ts +28 -0
  65. package/dist/admin/client/shop/coupon-schema.js +53 -0
  66. package/dist/admin/client/shop/coupons-list-page.svelte +262 -118
  67. package/dist/admin/client/shop/coupons-list-page.svelte.d.ts +16 -1
  68. package/dist/admin/client/shop/shipping-method-edit-page.svelte +108 -59
  69. package/dist/admin/client/shop/shipping-method-form.svelte +36 -9
  70. package/dist/admin/client/shop/shipping-method-new-page.svelte +44 -13
  71. package/dist/admin/client/shop/shipping-methods-list-page.svelte +101 -59
  72. package/dist/admin/client/shop/shop-order-detail-page.svelte +113 -84
  73. package/dist/admin/client/shop/shop-orders-list-page.svelte +302 -152
  74. package/dist/admin/client/shop/shop-orders-list-page.svelte.d.ts +18 -1
  75. package/dist/admin/client/shop/shop-products-list-page.svelte +355 -118
  76. package/dist/admin/client/shop/shop-products-list-page.svelte.d.ts +19 -1
  77. package/dist/admin/client/users/accept-invite-page.svelte +24 -3
  78. package/dist/admin/client/users/create-user-dialog.svelte +3 -8
  79. package/dist/admin/client/users/lang.d.ts +2 -0
  80. package/dist/admin/client/users/lang.js +4 -0
  81. package/dist/admin/client/users/pending-invitations.svelte +2 -9
  82. package/dist/admin/client/users/user-name-cell.svelte +20 -0
  83. package/dist/admin/client/users/user-name-cell.svelte.d.ts +9 -0
  84. package/dist/admin/client/users/user-role-badge.svelte +16 -0
  85. package/dist/admin/client/users/user-role-badge.svelte.d.ts +7 -0
  86. package/dist/admin/client/users/user-row-actions.svelte +72 -0
  87. package/dist/admin/client/users/user-row-actions.svelte.d.ts +20 -0
  88. package/dist/admin/client/users/user-sessions-sheet.svelte +2 -11
  89. package/dist/admin/client/users/users-page.svelte +283 -497
  90. package/dist/admin/client/users/users-page.svelte.d.ts +12 -1
  91. package/dist/admin/components/dashboard/form-submissions-widget.svelte +59 -74
  92. package/dist/admin/components/dashboard/recent-activity.svelte +17 -5
  93. package/dist/admin/components/dashboard/recent-entries.svelte +19 -7
  94. package/dist/admin/components/dialogs/confirmation-dialog.svelte +105 -0
  95. package/dist/admin/components/dialogs/confirmation-dialog.svelte.d.ts +13 -0
  96. package/dist/admin/components/fields/block-picker-modal.svelte +6 -0
  97. package/dist/admin/components/fields/blocks-field.svelte +46 -1
  98. package/dist/admin/components/fields/boolean-field.svelte +1 -1
  99. package/dist/admin/components/fields/field-renderer.svelte +23 -21
  100. package/dist/admin/components/fields/file-field.svelte +344 -30
  101. package/dist/admin/components/fields/media-field.svelte +16 -2
  102. package/dist/admin/components/fields/radio-field.svelte +22 -0
  103. package/dist/admin/components/fields/relation-field.svelte +123 -97
  104. package/dist/admin/components/fields/relation-picker-dialog.svelte +2 -2
  105. package/dist/admin/components/fields/seo-field.svelte +60 -30
  106. package/dist/admin/components/fields/shop-field.svelte +9 -4
  107. package/dist/admin/components/fields/simple-array-field.svelte +321 -151
  108. package/dist/admin/components/fields/simple-array-field.svelte.d.ts +3 -0
  109. package/dist/admin/components/fields/slug-field.svelte +146 -21
  110. package/dist/admin/components/fields/text-field-wrapper.svelte +37 -20
  111. package/dist/admin/components/fields/text-field.svelte +7 -2
  112. package/dist/admin/components/fields/url-field-wrapper.svelte +10 -0
  113. package/dist/admin/components/fields/url-field.svelte +36 -23
  114. package/dist/admin/components/forms/form-error-summary.svelte +143 -0
  115. package/dist/admin/components/forms/form-error-summary.svelte.d.ts +27 -0
  116. package/dist/admin/components/layout/app-sidebar.svelte +7 -2
  117. package/dist/admin/components/layout/detail-page-shell.svelte +71 -0
  118. package/dist/admin/components/layout/detail-page-shell.svelte.d.ts +24 -0
  119. package/dist/admin/components/layout/lang.d.ts +5 -0
  120. package/dist/admin/components/layout/lang.js +10 -0
  121. package/dist/admin/components/layout/layout-renderer.svelte +71 -2
  122. package/dist/admin/components/layout/layout-renderer.svelte.d.ts +1 -0
  123. package/dist/admin/components/layout/layout-tabs.svelte +172 -0
  124. package/dist/admin/components/layout/layout-tabs.svelte.d.ts +24 -0
  125. package/dist/admin/components/layout/nav-breadcrumbs.svelte +25 -7
  126. package/dist/admin/components/layout/nav-collections.svelte +23 -36
  127. package/dist/admin/components/layout/nav-forms.svelte +19 -35
  128. package/dist/admin/components/layout/nav-main.svelte +3 -28
  129. package/dist/admin/components/layout/nav-search.svelte +70 -2
  130. package/dist/admin/components/layout/nav-section.svelte +77 -0
  131. package/dist/admin/components/layout/nav-section.svelte.d.ts +22 -0
  132. package/dist/admin/components/layout/nav-shop.svelte +3 -27
  133. package/dist/admin/components/layout/nav-singletons.svelte +16 -28
  134. package/dist/admin/components/layout/page-header.stories.svelte +93 -0
  135. package/dist/admin/components/layout/page-header.stories.svelte.d.ts +27 -0
  136. package/dist/admin/components/layout/page-header.svelte +68 -0
  137. package/dist/admin/components/layout/page-header.svelte.d.ts +17 -0
  138. package/dist/admin/components/layout/site-header.svelte +9 -0
  139. package/dist/admin/components/layout/site-header.svelte.d.ts +2 -17
  140. package/dist/admin/components/media/file/file-name-input.svelte +6 -2
  141. package/dist/admin/components/media/file/file-preview.svelte +130 -17
  142. package/dist/admin/components/media/file-upload.svelte +16 -7
  143. package/dist/admin/components/media/file-upload.svelte.d.ts +1 -0
  144. package/dist/admin/components/media/files-list.svelte +153 -53
  145. package/dist/admin/components/media/files-list.svelte.d.ts +1 -0
  146. package/dist/admin/components/media/media-library.svelte +577 -198
  147. package/dist/admin/components/media/media-library.svelte.d.ts +4 -0
  148. package/dist/admin/components/media/media-selector.svelte +4 -2
  149. package/dist/admin/components/media/media-selector.svelte.d.ts +1 -0
  150. package/dist/admin/components/media/tag-sidebar.svelte +4 -4
  151. package/dist/admin/components/tiptap/FigureNodeView.svelte +10 -0
  152. package/dist/admin/components/tiptap/bubble-menu.svelte +104 -0
  153. package/dist/admin/components/tiptap/bubble-menu.svelte.d.ts +19 -0
  154. package/dist/admin/components/tiptap/content-editor.svelte +28 -24
  155. package/dist/admin/components/tiptap/editor-toolbar.svelte +7 -7
  156. package/dist/admin/components/tiptap/extensions.js +5 -1
  157. package/dist/admin/components/tiptap/image-dialog.svelte +5 -1
  158. package/dist/admin/components/tiptap/link-dialog.svelte +2 -0
  159. package/dist/admin/components/tiptap/tiptap-editor.svelte +18 -20
  160. package/dist/admin/components/tiptap/video-dialog.svelte +1 -1
  161. package/dist/admin/i18n/errors.d.ts +140 -0
  162. package/dist/admin/i18n/errors.js +151 -0
  163. package/dist/admin/remote/entry.remote.d.ts +59 -4
  164. package/dist/admin/remote/entry.remote.js +239 -62
  165. package/dist/admin/remote/shop.remote.d.ts +37 -32
  166. package/dist/admin/remote/shop.remote.js +9 -2
  167. package/dist/admin/shared/password-generate.d.ts +6 -0
  168. package/dist/admin/shared/password-generate.js +40 -0
  169. package/dist/admin/shared/password-schema.d.ts +6 -0
  170. package/dist/admin/shared/password-schema.js +10 -3
  171. package/dist/admin/styles/admin.css +23 -6
  172. package/dist/admin/styles/tokens.md +244 -0
  173. package/dist/admin/utils/accordionActivation.d.ts +13 -0
  174. package/dist/admin/utils/accordionActivation.js +35 -0
  175. package/dist/admin/utils/entryLabel.d.ts +23 -0
  176. package/dist/admin/utils/entryLabel.js +51 -12
  177. package/dist/admin/utils/field-a11y.d.ts +29 -0
  178. package/dist/admin/utils/field-a11y.js +23 -0
  179. package/dist/admin/utils/fieldPathElement.d.ts +9 -0
  180. package/dist/admin/utils/fieldPathElement.js +18 -0
  181. package/dist/admin/utils/fileDisplay.d.ts +10 -0
  182. package/dist/admin/utils/fileDisplay.js +26 -0
  183. package/dist/admin/utils/flattenFormErrors.d.ts +19 -0
  184. package/dist/admin/utils/flattenFormErrors.js +102 -0
  185. package/dist/admin/utils/formatters.d.ts +12 -0
  186. package/dist/admin/utils/{formatDate.js → formatters.js} +23 -2
  187. package/dist/admin/utils/scrollWithin.d.ts +9 -0
  188. package/dist/admin/utils/scrollWithin.js +32 -0
  189. package/dist/admin/utils/tabActivation.d.ts +12 -0
  190. package/dist/admin/utils/tabActivation.js +24 -0
  191. package/dist/cms/runtime/schema.d.ts +1 -0
  192. package/dist/cms/runtime/schema.js +1 -0
  193. package/dist/cms/runtime/types.d.ts +80 -7
  194. package/dist/components/ui/accordion/accordion-content.svelte +17 -3
  195. package/dist/components/ui/accordion/accordion.stories.svelte +21 -1
  196. package/dist/components/ui/alert/alert.stories.svelte +14 -0
  197. package/dist/components/ui/alert-dialog/alert-dialog.stories.svelte +45 -0
  198. package/dist/components/ui/alert-dialog/alert-dialog.stories.svelte.d.ts +27 -0
  199. package/dist/components/ui/avatar/avatar.stories.svelte +27 -0
  200. package/dist/components/ui/badge/badge.stories.svelte +15 -0
  201. package/dist/components/ui/breadcrumb/breadcrumb.stories.svelte +47 -0
  202. package/dist/components/ui/breadcrumb/breadcrumb.svelte +1 -1
  203. package/dist/components/ui/button/button.stories.svelte +53 -6
  204. package/dist/components/ui/button/button.svelte +39 -5
  205. package/dist/components/ui/button/button.svelte.d.ts +4 -0
  206. package/dist/components/ui/button-group/button-group.stories.svelte +44 -0
  207. package/dist/components/ui/button-group/button-group.stories.svelte.d.ts +27 -0
  208. package/dist/components/ui/calendar/calendar.stories.svelte +36 -0
  209. package/dist/components/ui/calendar/calendar.stories.svelte.d.ts +27 -0
  210. package/dist/components/ui/card/card.stories.svelte +7 -0
  211. package/dist/components/ui/carousel/carousel.stories.svelte +43 -0
  212. package/dist/components/ui/carousel/carousel.stories.svelte.d.ts +27 -0
  213. package/dist/components/ui/checkbox/checkbox.stories.svelte +67 -0
  214. package/dist/components/ui/checkbox/checkbox.stories.svelte.d.ts +27 -0
  215. package/dist/components/ui/checkbox/checkbox.svelte +3 -3
  216. package/dist/components/ui/command/command.stories.svelte +18 -0
  217. package/dist/components/ui/data-table/data-table.stories.svelte +61 -0
  218. package/dist/components/ui/data-table/data-table.stories.svelte.d.ts +18 -0
  219. package/dist/components/ui/dialog/dialog-content.svelte +5 -0
  220. package/dist/components/ui/dialog/dialog-content.svelte.d.ts +2 -0
  221. package/dist/components/ui/dialog/dialog.stories.svelte +35 -0
  222. package/dist/components/ui/dropdown-menu/dropdown-menu.stories.svelte +74 -0
  223. package/dist/components/ui/dropdown-menu/dropdown-menu.stories.svelte.d.ts +27 -0
  224. package/dist/components/ui/field/field-context.svelte.d.ts +22 -0
  225. package/dist/components/ui/field/field-context.svelte.js +9 -0
  226. package/dist/components/ui/field/field-control.svelte +18 -0
  227. package/dist/components/ui/field/field-control.svelte.d.ts +8 -0
  228. package/dist/components/ui/field/field-description.svelte +12 -0
  229. package/dist/components/ui/field/field-error.svelte +14 -6
  230. package/dist/components/ui/field/field-label.svelte +10 -0
  231. package/dist/components/ui/field/field.stories.svelte +95 -9
  232. package/dist/components/ui/field/field.svelte +57 -0
  233. package/dist/components/ui/field/field.svelte.d.ts +2 -0
  234. package/dist/components/ui/field/index.d.ts +3 -1
  235. package/dist/components/ui/field/index.js +4 -2
  236. package/dist/components/ui/form/form-field-errors.svelte +1 -1
  237. package/dist/components/ui/form/form.stories.svelte +25 -0
  238. package/dist/components/ui/form/form.stories.svelte.d.ts +26 -0
  239. package/dist/components/ui/input/input.stories.svelte +26 -0
  240. package/dist/components/ui/input-group/input-group-input.svelte.d.ts +1 -1
  241. package/dist/components/ui/input-group/input-group.stories.svelte +43 -0
  242. package/dist/components/ui/input-group/input-group.stories.svelte.d.ts +27 -0
  243. package/dist/components/ui/item/item.stories.svelte +61 -0
  244. package/dist/components/ui/item/item.stories.svelte.d.ts +27 -0
  245. package/dist/components/ui/label/label.stories.svelte +7 -0
  246. package/dist/components/ui/live-region/index.d.ts +1 -0
  247. package/dist/components/ui/live-region/index.js +1 -0
  248. package/dist/components/ui/live-region/live-region-demo.svelte +32 -0
  249. package/dist/components/ui/live-region/live-region-demo.svelte.d.ts +7 -0
  250. package/dist/components/ui/live-region/live-region.stories.svelte +23 -0
  251. package/dist/components/ui/live-region/live-region.stories.svelte.d.ts +26 -0
  252. package/dist/components/ui/live-region/live-region.svelte +12 -0
  253. package/dist/components/ui/live-region/live-region.svelte.d.ts +8 -0
  254. package/dist/components/ui/popover/popover.stories.svelte +34 -0
  255. package/dist/components/ui/radio-group/radio-group.stories.svelte +58 -0
  256. package/dist/components/ui/radio-group/radio-group.stories.svelte.d.ts +27 -0
  257. package/dist/components/ui/resizable/resizable.stories.svelte +56 -0
  258. package/dist/components/ui/resizable/resizable.stories.svelte.d.ts +27 -0
  259. package/dist/components/ui/select/select.stories.svelte +49 -0
  260. package/dist/components/ui/separator/separator.stories.svelte +18 -0
  261. package/dist/components/ui/sheet/sheet.stories.svelte +34 -0
  262. package/dist/components/ui/sidebar/sidebar-input.svelte.d.ts +1 -1
  263. package/dist/components/ui/sidebar/sidebar-menu-button.svelte +1 -0
  264. package/dist/components/ui/sidebar/sidebar-trigger.svelte +1 -1
  265. package/dist/components/ui/sidebar/sidebar.stories.svelte +72 -0
  266. package/dist/components/ui/sidebar/sidebar.stories.svelte.d.ts +27 -0
  267. package/dist/components/ui/skeleton/skeleton.stories.svelte +39 -0
  268. package/dist/components/ui/skeleton/skeleton.stories.svelte.d.ts +27 -0
  269. package/dist/components/ui/skeleton/skeleton.svelte +6 -0
  270. package/dist/components/ui/sonner/index.d.ts +1 -1
  271. package/dist/components/ui/sonner/index.js +1 -1
  272. package/dist/components/ui/sonner/sonner.stories.svelte +7 -0
  273. package/dist/components/ui/sonner/sonner.svelte +17 -1
  274. package/dist/components/ui/sonner/sonner.svelte.d.ts +6 -0
  275. package/dist/components/ui/spinner/spinner.stories.svelte +30 -0
  276. package/dist/components/ui/spinner/spinner.stories.svelte.d.ts +27 -0
  277. package/dist/components/ui/switch/switch.stories.svelte +56 -0
  278. package/dist/components/ui/switch/switch.stories.svelte.d.ts +27 -0
  279. package/dist/components/ui/table/table-cell.svelte +1 -1
  280. package/dist/components/ui/table/table-head.svelte +1 -1
  281. package/dist/components/ui/table/table.stories.svelte +68 -0
  282. package/dist/components/ui/table/table.stories.svelte.d.ts +27 -0
  283. package/dist/components/ui/table/table.svelte +1 -1
  284. package/dist/components/ui/tabs/tabs.stories.svelte +48 -0
  285. package/dist/components/ui/tabs/tabs.stories.svelte.d.ts +27 -0
  286. package/dist/components/ui/textarea/textarea.stories.svelte +21 -0
  287. package/dist/components/ui/toggle/toggle.stories.svelte +23 -0
  288. package/dist/components/ui/toggle-group/toggle-group.stories.svelte +43 -0
  289. package/dist/components/ui/tooltip/tooltip.stories.svelte +46 -6
  290. package/dist/core/fields/fieldSchemaToTs.d.ts +7 -0
  291. package/dist/core/fields/fieldSchemaToTs.js +234 -90
  292. package/dist/core/fields/layoutUtils.d.ts +4 -1
  293. package/dist/core/fields/layoutUtils.js +41 -4
  294. package/dist/core/fields/resolveSeo.d.ts +70 -0
  295. package/dist/core/fields/resolveSeo.js +88 -0
  296. package/dist/core/fields/seoFieldDescriptor.d.ts +43 -0
  297. package/dist/core/fields/seoFieldDescriptor.js +74 -0
  298. package/dist/core/fields/slugPath.d.ts +13 -0
  299. package/dist/core/fields/slugPath.js +32 -0
  300. package/dist/core/fields/urlUtils.d.ts +8 -0
  301. package/dist/core/fields/urlUtils.js +27 -0
  302. package/dist/core/index.d.ts +1 -0
  303. package/dist/core/index.js +1 -0
  304. package/dist/core/server/entries/operations/create.js +13 -0
  305. package/dist/core/server/entries/operations/get.d.ts +7 -0
  306. package/dist/core/server/entries/operations/get.js +10 -6
  307. package/dist/core/server/entries/operations/slugUniqueness.d.ts +37 -0
  308. package/dist/core/server/entries/operations/slugUniqueness.js +116 -0
  309. package/dist/core/server/entries/operations/update.d.ts +6 -1
  310. package/dist/core/server/entries/operations/update.js +24 -1
  311. package/dist/core/server/fields/slugResolver.d.ts +3 -13
  312. package/dist/core/server/fields/slugResolver.js +8 -37
  313. package/dist/core/server/generator/fields.js +10 -17
  314. package/dist/core/server/generator/formFields.js +2 -1
  315. package/dist/core/server/generator/generator.js +4 -4
  316. package/dist/core/server/generator/utils.d.ts +1 -0
  317. package/dist/core/server/generator/utils.js +4 -0
  318. package/dist/paraglide/messages/_index.d.ts +3 -36
  319. package/dist/paraglide/messages/_index.js +3 -71
  320. package/dist/paraglide/messages/hello_world.d.ts +5 -0
  321. package/dist/paraglide/messages/hello_world.js +33 -0
  322. package/dist/paraglide/messages/login_hello.d.ts +16 -0
  323. package/dist/paraglide/messages/login_hello.js +34 -0
  324. package/dist/paraglide/messages/login_please_login.d.ts +16 -0
  325. package/dist/paraglide/messages/login_please_login.js +34 -0
  326. package/dist/shop/server/orders.d.ts +1 -0
  327. package/dist/shop/server/orders.js +14 -0
  328. package/dist/shop/server/shop-data.d.ts +2 -0
  329. package/dist/shop/server/shop-data.js +20 -5
  330. package/dist/sveltekit/server/handle.js +17 -0
  331. package/dist/types/cms.schema.js +4 -2
  332. package/dist/types/fields.d.ts +35 -0
  333. package/dist/types/index.d.ts +1 -1
  334. package/dist/types/layout.d.ts +35 -2
  335. package/dist/updates/0.26.0/index.d.ts +2 -0
  336. package/dist/updates/0.26.0/index.js +51 -0
  337. package/dist/updates/index.js +3 -1
  338. package/package.json +29 -7
  339. package/dist/admin/client/collection/empty-state.svelte +0 -28
  340. package/dist/admin/client/collection/empty-state.svelte.d.ts +0 -9
  341. package/dist/admin/client/form/submission-status-badge.svelte +0 -41
  342. package/dist/admin/client/form/submission-status-badge.svelte.d.ts +0 -7
  343. package/dist/admin/components/media/file-preview.svelte +0 -51
  344. package/dist/admin/components/media/file-preview.svelte.d.ts +0 -6
  345. package/dist/admin/utils/formatDate.d.ts +0 -5
  346. package/dist/paraglide/messages/en.d.ts +0 -5
  347. package/dist/paraglide/messages/en.js +0 -14
  348. package/dist/paraglide/messages/pl.d.ts +0 -5
  349. package/dist/paraglide/messages/pl.js +0 -14
@@ -1,6 +1,4 @@
1
1
  <script lang="ts">
2
- import * as Sidebar from '../../../components/ui/sidebar/index.js';
3
- import type { Icon } from '@tabler/icons-svelte';
4
2
  import { sidebarLang } from './lang.js';
5
3
  import { useInterfaceLanguage } from '../../state/interface-language.svelte.js';
6
4
  import CameraIcon from '@tabler/icons-svelte/icons/camera';
@@ -9,15 +7,14 @@
9
7
  import SettingsIcon from '@tabler/icons-svelte/icons/settings';
10
8
  import { page } from '$app/state';
11
9
  import { authClient } from '../../auth-client.js';
12
- import { resolve } from '$app/paths';
13
- import { cn } from '../../../utils.js';
10
+ import NavSection, { type NavSectionItem } from './nav-section.svelte';
14
11
 
15
12
  const interfaceLanguage = useInterfaceLanguage();
16
13
  let session = authClient.useSession();
17
14
 
18
15
  const isAdmin = $derived($session.data?.user?.role === 'admin');
19
16
 
20
- let items: { title: string; url: string; icon?: Icon }[] = $derived([
17
+ const items: NavSectionItem[] = $derived([
21
18
  {
22
19
  title: sidebarLang[interfaceLanguage.current].main.dashboard,
23
20
  url: '/admin',
@@ -50,26 +47,4 @@
50
47
  }
51
48
  </script>
52
49
 
53
- <Sidebar.Group class="px-0 py-1">
54
- <Sidebar.Menu>
55
- {#each items as item (item.title)}
56
- {@const active = isActive(item.url)}
57
- <Sidebar.MenuItem>
58
- <Sidebar.MenuButton isActive={active} tooltipContent={item.title}>
59
- {#snippet child({ props })}
60
- <a class={cn(props.class)} {...props} href={item.url}>
61
- {#if item.icon}
62
- <item.icon
63
- class="size-5! shrink-0 {active ? 'text-primary' : 'text-muted-foreground'}"
64
- />
65
- {/if}
66
- <span class="{active ? 'text-primary' : 'text-muted-foreground'} flex-1 truncate"
67
- >{item.title}</span
68
- >
69
- </a>
70
- {/snippet}
71
- </Sidebar.MenuButton>
72
- </Sidebar.MenuItem>
73
- {/each}
74
- </Sidebar.Menu>
75
- </Sidebar.Group>
50
+ <NavSection {items} {isActive} />
@@ -1,16 +1,18 @@
1
1
  <script lang="ts">
2
2
  import SearchIcon from '@tabler/icons-svelte/icons/search';
3
- import DashboardIcon from '@tabler/icons-svelte/icons/dashboard';
3
+ import DashboardIcon from '@tabler/icons-svelte/icons/layout-dashboard';
4
4
  import CameraIcon from '@tabler/icons-svelte/icons/camera';
5
5
  import ClipboardIcon from '@tabler/icons-svelte/icons/clipboard-list';
6
6
  import SettingsIcon from '@tabler/icons-svelte/icons/settings';
7
7
  import FolderIcon from '@tabler/icons-svelte/icons/folder';
8
+ import FileTextIcon from '@tabler/icons-svelte/icons/file-text';
8
9
  import { getIcon } from '../icons/icon-map.js';
9
10
  import * as Command from '../../../components/ui/command/index.js';
10
11
  import { goto } from '$app/navigation';
11
12
  import { getRemotes } from '../../../sveltekit/index.js';
12
13
  import { useInterfaceLanguage } from '../../state/interface-language.svelte.js';
13
14
  import { getLocalizedLabel } from '../../utils/collectionLabel.js';
15
+ import type { Localized } from '../../../types/languages.js';
14
16
  import { sidebarLang } from './lang.js';
15
17
 
16
18
  const interfaceLanguage = useInterfaceLanguage();
@@ -33,6 +35,48 @@
33
35
  const singlesQuery = $derived(remotes.getSingles());
34
36
  const collectionsQuery = $derived(remotes.getCollections());
35
37
  const formsQuery = $derived(remotes.getForms());
38
+
39
+ // --- entry search (debounced, server-side) ---
40
+ type EntryHit = {
41
+ entryId: string;
42
+ title: string;
43
+ titleLanguage: string | null;
44
+ kind: 'collection' | 'single';
45
+ containerSlug: string;
46
+ containerLabel: Localized;
47
+ };
48
+
49
+ let searchTerm = $state('');
50
+ let entryResults = $state<EntryHit[]>([]);
51
+ let searchTimeout: ReturnType<typeof setTimeout> | undefined;
52
+
53
+ $effect(() => {
54
+ const q = searchTerm.trim();
55
+ const lang = interfaceLanguage.current;
56
+ clearTimeout(searchTimeout);
57
+ if (q.length < 2) {
58
+ entryResults = [];
59
+ return;
60
+ }
61
+ searchTimeout = setTimeout(async () => {
62
+ try {
63
+ entryResults = (await remotes.searchEntries({ query: q, language: lang })) as EntryHit[];
64
+ } catch {
65
+ entryResults = [];
66
+ }
67
+ }, 250);
68
+ });
69
+
70
+ // reset when the dialog closes
71
+ $effect(() => {
72
+ if (!open) {
73
+ searchTerm = '';
74
+ entryResults = [];
75
+ clearTimeout(searchTimeout);
76
+ }
77
+ });
78
+
79
+ const entriesHeading = $derived(interfaceLanguage.current === 'pl' ? 'Wpisy' : 'Entries');
36
80
  </script>
37
81
 
38
82
  <svelte:window {onkeydown} />
@@ -57,10 +101,34 @@
57
101
  </button>
58
102
 
59
103
  <Command.Dialog bind:open title={sidebarLang[interfaceLanguage.current].search.placeholder}>
60
- <Command.Input placeholder={sidebarLang[interfaceLanguage.current].search.placeholder} />
104
+ <Command.Input
105
+ bind:value={searchTerm}
106
+ placeholder={sidebarLang[interfaceLanguage.current].search.placeholder}
107
+ />
61
108
  <Command.List>
62
109
  <Command.Empty>{sidebarLang[interfaceLanguage.current].search.noResults}</Command.Empty>
63
110
 
111
+ {#if entryResults.length > 0}
112
+ <Command.Group heading={entriesHeading}>
113
+ {#each entryResults as hit (hit.kind + ':' + hit.entryId)}
114
+ <Command.Item
115
+ value="{hit.title} {hit.entryId}"
116
+ onSelect={() => navigate(`/admin/entries/${hit.entryId}`)}
117
+ >
118
+ <FileTextIcon class="mr-2 size-4 shrink-0" />
119
+ <span class="truncate"
120
+ >{hit.title}{#if hit.titleLanguage && hit.titleLanguage !== interfaceLanguage.current}<span
121
+ class="text-muted-foreground text-xs">{' '}({hit.titleLanguage})</span
122
+ >{/if}</span
123
+ >
124
+ <span class="text-muted-foreground ml-auto pl-3 text-xs whitespace-nowrap">
125
+ {getLocalizedLabel(hit.containerLabel, interfaceLanguage.current)}
126
+ </span>
127
+ </Command.Item>
128
+ {/each}
129
+ </Command.Group>
130
+ {/if}
131
+
64
132
  <Command.Group heading={sidebarLang[interfaceLanguage.current].main.platform}>
65
133
  <Command.Item onSelect={() => navigate('/admin')}>
66
134
  <DashboardIcon class="mr-2 size-4" />
@@ -0,0 +1,77 @@
1
+ <script lang="ts" module>
2
+ /**
3
+ * @internal
4
+ * Internal helper — DRY for sidebar nav-* sections (NavMain, NavCollections, NavSingletons, NavForms, NavShop).
5
+ * Not exported publicly. Sesja 4 (UI Normalization → 0.26.0).
6
+ */
7
+ import type { Icon } from '@tabler/icons-svelte';
8
+
9
+ export type NavSectionItem = {
10
+ title: string;
11
+ url: string;
12
+ icon?: Icon;
13
+ count?: number;
14
+ };
15
+ </script>
16
+
17
+ <script lang="ts">
18
+ import * as Sidebar from '../../../components/ui/sidebar/index.js';
19
+ import { cn } from '../../../utils.js';
20
+
21
+ let {
22
+ items,
23
+ label,
24
+ labelIcon,
25
+ isActive,
26
+ withTopBorder = false
27
+ }: {
28
+ items: NavSectionItem[];
29
+ label?: string;
30
+ labelIcon?: Icon;
31
+ isActive: (url: string) => boolean;
32
+ withTopBorder?: boolean;
33
+ } = $props();
34
+ </script>
35
+
36
+ <Sidebar.Group
37
+ role="presentation"
38
+ class={cn('px-0 py-1', withTopBorder && 'border-sidebar-border mt-1 border-t pt-2 pb-1')}
39
+ >
40
+ {#if label}
41
+ <Sidebar.GroupLabel class="group-data-[collapsible=icon]:hidden">
42
+ {#if labelIcon}
43
+ {@const LabelIcon = labelIcon}
44
+ <LabelIcon class="mr-1 size-3.5" />
45
+ {/if}
46
+ {label}
47
+ </Sidebar.GroupLabel>
48
+ {/if}
49
+ <Sidebar.Menu>
50
+ {#each items as item (item.url)}
51
+ {@const active = isActive(item.url)}
52
+ <Sidebar.MenuItem>
53
+ <Sidebar.MenuButton isActive={active} tooltipContent={item.title}>
54
+ {#snippet child({ props })}
55
+ <a {...props} href={item.url}>
56
+ {#if item.icon}
57
+ {@const ItemIcon = item.icon}
58
+ <ItemIcon
59
+ class="size-5! shrink-0 {active ? 'text-primary' : 'text-muted-foreground'}"
60
+ />
61
+ {/if}
62
+ <span class="flex-1 truncate {active ? 'text-primary' : 'text-muted-foreground'}">
63
+ {item.title}
64
+ </span>
65
+ {#if item.count}
66
+ <span
67
+ class="bg-lavender-lighter text-primary inline-flex h-[18px] min-w-[18px] shrink-0 items-center justify-center rounded-full px-[5px] text-[10px] font-bold group-data-[collapsible=icon]:hidden"
68
+ >{item.count}</span
69
+ >
70
+ {/if}
71
+ </a>
72
+ {/snippet}
73
+ </Sidebar.MenuButton>
74
+ </Sidebar.MenuItem>
75
+ {/each}
76
+ </Sidebar.Menu>
77
+ </Sidebar.Group>
@@ -0,0 +1,22 @@
1
+ /**
2
+ * @internal
3
+ * Internal helper — DRY for sidebar nav-* sections (NavMain, NavCollections, NavSingletons, NavForms, NavShop).
4
+ * Not exported publicly. Sesja 4 (UI Normalization → 0.26.0).
5
+ */
6
+ import type { Icon } from '@tabler/icons-svelte';
7
+ export type NavSectionItem = {
8
+ title: string;
9
+ url: string;
10
+ icon?: Icon;
11
+ count?: number;
12
+ };
13
+ type $$ComponentProps = {
14
+ items: NavSectionItem[];
15
+ label?: string;
16
+ labelIcon?: Icon;
17
+ isActive: (url: string) => boolean;
18
+ withTopBorder?: boolean;
19
+ };
20
+ declare const NavSection: import("svelte").Component<$$ComponentProps, {}, "">;
21
+ type NavSection = ReturnType<typeof NavSection>;
22
+ export default NavSection;
@@ -1,6 +1,5 @@
1
1
  <script lang="ts">
2
2
  import { useInterfaceLanguage } from '../../state/interface-language.svelte.js';
3
- import * as Sidebar from '../../../components/ui/sidebar/index.js';
4
3
  import { sidebarLang } from './lang.js';
5
4
  import { getRemotes } from '../../../sveltekit/index.js';
6
5
  import PackageIcon from '@tabler/icons-svelte/icons/package';
@@ -9,6 +8,7 @@
9
8
  import TicketIcon from '@tabler/icons-svelte/icons/ticket';
10
9
  import BuildingStoreIcon from '@tabler/icons-svelte/icons/building-store';
11
10
  import { page } from '$app/state';
11
+ import NavSection, { type NavSectionItem } from './nav-section.svelte';
12
12
 
13
13
  const interfaceLanguage = useInterfaceLanguage();
14
14
  const lang = $derived(sidebarLang[interfaceLanguage.current].shop);
@@ -20,7 +20,7 @@
20
20
  return pathname === url || pathname.startsWith(url + '/');
21
21
  }
22
22
 
23
- const items = $derived([
23
+ const items: NavSectionItem[] = $derived([
24
24
  { title: lang.products, url: '/admin/shop/products', icon: PackageIcon },
25
25
  { title: lang.orders, url: '/admin/shop/orders', icon: ShoppingCartIcon },
26
26
  { title: lang.shipping, url: '/admin/shop/shipping-methods', icon: TruckIcon },
@@ -29,29 +29,5 @@
29
29
  </script>
30
30
 
31
31
  {#if enabledQuery.ready && enabledQuery.current}
32
- <Sidebar.Group class="border-sidebar-border mt-1 border-t px-0 pt-2 pb-1">
33
- <Sidebar.GroupLabel class="group-data-[collapsible=icon]:hidden">
34
- <BuildingStoreIcon class="mr-1 size-3.5" />
35
- {lang.title}
36
- </Sidebar.GroupLabel>
37
- <Sidebar.Menu>
38
- {#each items as item (item.url)}
39
- {@const active = isActive(item.url)}
40
- <Sidebar.MenuItem>
41
- <Sidebar.MenuButton isActive={active} tooltipContent={item.title}>
42
- {#snippet child({ props })}
43
- <a {...props} href={item.url}>
44
- <item.icon
45
- class="size-5! shrink-0 {active ? 'text-primary' : 'text-muted-foreground'}"
46
- />
47
- <span class="flex-1 truncate {active ? 'text-primary' : 'text-muted-foreground'}">
48
- {item.title}
49
- </span>
50
- </a>
51
- {/snippet}
52
- </Sidebar.MenuButton>
53
- </Sidebar.MenuItem>
54
- {/each}
55
- </Sidebar.Menu>
56
- </Sidebar.Group>
32
+ <NavSection {items} label={lang.title} labelIcon={BuildingStoreIcon} {isActive} withTopBorder />
57
33
  {/if}
@@ -8,6 +8,7 @@
8
8
  import { page } from '$app/state';
9
9
  import SettingsIcon from '@tabler/icons-svelte/icons/settings';
10
10
  import { getIcon } from '../icons/icon-map.js';
11
+ import NavSection, { type NavSectionItem } from './nav-section.svelte';
11
12
 
12
13
  const interfaceLanguage = useInterfaceLanguage();
13
14
  const remotes = getRemotes();
@@ -18,6 +19,14 @@
18
19
  }
19
20
 
20
21
  const query = $derived(remotes.getSingles());
22
+
23
+ const items: NavSectionItem[] = $derived(
24
+ query.current?.map((item) => ({
25
+ title: getLocalizedLabel(item.label, interfaceLanguage.current) ?? item.slug,
26
+ url: `/admin/entries/${item.slug}`,
27
+ icon: getIcon(item.sidebarIcon) ?? SettingsIcon
28
+ })) ?? []
29
+ );
21
30
  </script>
22
31
 
23
32
  {#if !query.ready}
@@ -32,32 +41,11 @@
32
41
  </div>
33
42
  </Sidebar.Menu>
34
43
  </Sidebar.Group>
35
- {:else if query.current && query.current.length > 0}
36
- <Sidebar.Group class="border-sidebar-border mt-1 border-t px-0 pt-2 pb-1">
37
- <Sidebar.GroupLabel class="group-data-[collapsible=icon]:hidden"
38
- >{sidebarLang[interfaceLanguage.current].singletons.title}</Sidebar.GroupLabel
39
- >
40
- <Sidebar.Menu>
41
- {#each query.current as item (item)}
42
- {@const name = getLocalizedLabel(item.label, interfaceLanguage.current) ?? item.slug}
43
- {@const url = `/admin/entries/${item.slug}`}
44
- {@const active = isActive(url)}
45
- <Sidebar.MenuItem>
46
- <Sidebar.MenuButton isActive={active} tooltipContent={name}>
47
- {#snippet child({ props })}
48
- {@const ResolvedIcon = getIcon(item.sidebarIcon) ?? SettingsIcon}
49
- <a {...props} href={url}>
50
- <ResolvedIcon
51
- class="size-5! shrink-0 {active ? 'text-primary' : 'text-muted-foreground'}"
52
- />
53
- <span class="flex-1 truncate {active ? 'text-primary' : 'text-muted-foreground'}"
54
- >{name}</span
55
- >
56
- </a>
57
- {/snippet}
58
- </Sidebar.MenuButton>
59
- </Sidebar.MenuItem>
60
- {/each}
61
- </Sidebar.Menu>
62
- </Sidebar.Group>
44
+ {:else if items.length > 0}
45
+ <NavSection
46
+ {items}
47
+ label={sidebarLang[interfaceLanguage.current].singletons.title}
48
+ {isActive}
49
+ withTopBorder
50
+ />
63
51
  {/if}
@@ -0,0 +1,93 @@
1
+ <script module>
2
+ import { defineMeta } from '@storybook/addon-svelte-csf';
3
+ import PageHeader from './page-header.svelte';
4
+ import Button from '../../../components/ui/button/button.svelte';
5
+ import PlusIcon from '@tabler/icons-svelte/icons/plus';
6
+ import FilterIcon from '@tabler/icons-svelte/icons/filter';
7
+
8
+ const { Story } = defineMeta({
9
+ title: 'Admin/Layout/PageHeader',
10
+ component: PageHeader,
11
+ tags: ['autodocs'],
12
+ parameters: {
13
+ layout: 'fullscreen',
14
+ docs: {
15
+ description: {
16
+ component:
17
+ 'Header strony adminowej: tytuł, opis, count badge, primary/secondary actions slots. Wspólny pattern dla wszystkich list i form pages.'
18
+ }
19
+ }
20
+ }
21
+ });
22
+ </script>
23
+
24
+ <Story name="BasicTitle">
25
+ <PageHeader title="Artykuły" />
26
+ </Story>
27
+
28
+ <Story name="WithCount">
29
+ <PageHeader title="Artykuły" count={42} />
30
+ </Story>
31
+
32
+ <Story name="WithDescription">
33
+ <PageHeader
34
+ title="Artykuły"
35
+ description="Zarządzaj treściami publikowanymi na blogu i w aktualnościach."
36
+ />
37
+ </Story>
38
+
39
+ <Story name="WithActions">
40
+ <PageHeader title="Artykuły" count={42}>
41
+ {#snippet secondaryActions()}
42
+ <Button variant="outline" size="sm">
43
+ <FilterIcon class="size-4" />
44
+ Filtry
45
+ </Button>
46
+ {/snippet}
47
+ {#snippet primaryActions()}
48
+ <Button size="sm">
49
+ <PlusIcon class="size-4" />
50
+ Nowy artykuł
51
+ </Button>
52
+ {/snippet}
53
+ </PageHeader>
54
+ </Story>
55
+
56
+ <Story name="WithEverything">
57
+ <PageHeader
58
+ title="Artykuły"
59
+ count={42}
60
+ description="Zarządzaj treściami publikowanymi na blogu i w aktualnościach."
61
+ >
62
+ {#snippet secondaryActions()}
63
+ <Button variant="outline" size="sm">
64
+ <FilterIcon class="size-4" />
65
+ Filtry
66
+ </Button>
67
+ {/snippet}
68
+ {#snippet primaryActions()}
69
+ <Button size="sm">
70
+ <PlusIcon class="size-4" />
71
+ Nowy artykuł
72
+ </Button>
73
+ {/snippet}
74
+ </PageHeader>
75
+ </Story>
76
+
77
+ <Story
78
+ name="Mobile"
79
+ parameters={{ viewport: { defaultViewport: 'mobile' } }}
80
+ >
81
+ <PageHeader
82
+ title="Artykuły"
83
+ count={42}
84
+ description="Zarządzaj treściami publikowanymi na blogu i w aktualnościach."
85
+ >
86
+ {#snippet primaryActions()}
87
+ <Button size="sm">
88
+ <PlusIcon class="size-4" />
89
+ Nowy
90
+ </Button>
91
+ {/snippet}
92
+ </PageHeader>
93
+ </Story>
@@ -0,0 +1,27 @@
1
+ export default PageHeader;
2
+ type PageHeader = SvelteComponent<{
3
+ [x: string]: never;
4
+ }, {
5
+ [evt: string]: CustomEvent<any>;
6
+ }, {}> & {
7
+ $$bindings?: string | undefined;
8
+ };
9
+ declare const PageHeader: $$__sveltets_2_IsomorphicComponent<{
10
+ [x: string]: never;
11
+ }, {
12
+ [evt: string]: CustomEvent<any>;
13
+ }, {}, {}, string>;
14
+ import PageHeader from './page-header.svelte';
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,68 @@
1
+ <script lang="ts" module>
2
+ /**
3
+ * @internal
4
+ * Internal helper — page header pattern (title + description + count badge + actions).
5
+ * Used by list/detail pages in admin (sesje 6-8). Not exported publicly.
6
+ */
7
+ import type { Snippet } from 'svelte';
8
+ </script>
9
+
10
+ <script lang="ts">
11
+ import { cn } from '../../../utils.js';
12
+
13
+ let {
14
+ title,
15
+ description,
16
+ count,
17
+ primaryActions,
18
+ secondaryActions,
19
+ class: className
20
+ }: {
21
+ title: string;
22
+ description?: string;
23
+ count?: number;
24
+ primaryActions?: Snippet;
25
+ secondaryActions?: Snippet;
26
+ class?: string;
27
+ } = $props();
28
+ </script>
29
+
30
+ <div
31
+ class={cn(
32
+ 'flex flex-wrap items-start justify-between gap-3 px-4 py-4 sm:gap-4 sm:px-6 sm:py-5',
33
+ className
34
+ )}
35
+ >
36
+ <div class="flex min-w-0 flex-col gap-1">
37
+ <div class="flex items-baseline gap-2 sm:gap-3">
38
+ <h1
39
+ class="text-foreground truncate text-2xl font-extrabold tracking-[-0.5px] sm:text-3xl lg:text-4xl"
40
+ style="font-family: 'Plus Jakarta Sans', sans-serif;"
41
+ >
42
+ {title}
43
+ </h1>
44
+ {#if count !== undefined}
45
+ <span
46
+ class="bg-lavender-lighter text-primary inline-flex h-6 min-w-6 shrink-0 items-center justify-center rounded-full px-2 text-xs font-bold"
47
+ aria-label="{count} pozycji"
48
+ >
49
+ {count}
50
+ </span>
51
+ {/if}
52
+ </div>
53
+ {#if description}
54
+ <p class="text-muted-foreground text-sm">{description}</p>
55
+ {/if}
56
+ </div>
57
+
58
+ {#if primaryActions || secondaryActions}
59
+ <div class="flex w-full shrink-0 flex-wrap items-center gap-2 sm:w-auto">
60
+ {#if secondaryActions}
61
+ {@render secondaryActions()}
62
+ {/if}
63
+ {#if primaryActions}
64
+ {@render primaryActions()}
65
+ {/if}
66
+ </div>
67
+ {/if}
68
+ </div>
@@ -0,0 +1,17 @@
1
+ /**
2
+ * @internal
3
+ * Internal helper — page header pattern (title + description + count badge + actions).
4
+ * Used by list/detail pages in admin (sesje 6-8). Not exported publicly.
5
+ */
6
+ import type { Snippet } from 'svelte';
7
+ type $$ComponentProps = {
8
+ title: string;
9
+ description?: string;
10
+ count?: number;
11
+ primaryActions?: Snippet;
12
+ secondaryActions?: Snippet;
13
+ class?: string;
14
+ };
15
+ declare const PageHeader: import("svelte").Component<$$ComponentProps, {}, "">;
16
+ type PageHeader = ReturnType<typeof PageHeader>;
17
+ export default PageHeader;
@@ -27,6 +27,8 @@
27
27
  }
28
28
  };
29
29
 
30
+ const skipToMain = $derived(sidebarLang[interfaceLanguage.current].nav.skipToMain);
31
+
30
32
  async function onLogout() {
31
33
  await authClient.signOut({
32
34
  fetchOptions: {
@@ -39,6 +41,12 @@
39
41
  }
40
42
  </script>
41
43
 
44
+ <a
45
+ href="#main-content"
46
+ class="bg-primary text-primary-foreground sr-only focus:not-sr-only focus:fixed focus:top-2 focus:left-2 focus:z-50 focus:rounded-md focus:px-3 focus:py-2 focus:text-sm focus:font-medium focus:shadow-lg focus-visible:ring-2 focus-visible:ring-offset-2"
47
+ >
48
+ {skipToMain}
49
+ </a>
42
50
  <header
43
51
  class="border-sidebar-border bg-background/60 flex h-(--header-height) shrink-0 items-center gap-2 border-b backdrop-blur-xl transition-[width,height] ease-linear group-has-data-[collapsible=icon]/sidebar-wrapper:h-(--header-height)"
44
52
  >
@@ -56,6 +64,7 @@
56
64
  class="text-primary text-[13px] font-medium hover:border-[var(--lavender)] hover:bg-[var(--lavender-lighter)]"
57
65
  target="_blank"
58
66
  rel="noopener noreferrer"
67
+ aria-label={lang[interfaceLanguage.current].openSite}
59
68
  >
60
69
  <ExternalLinkIcon class="size-3.5" />
61
70
  <span class="hidden sm:inline">{lang[interfaceLanguage.current].openSite}</span>
@@ -1,18 +1,3 @@
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 SiteHeader: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
15
- [evt: string]: CustomEvent<any>;
16
- }, {}, {}, string>;
17
- type SiteHeader = InstanceType<typeof SiteHeader>;
1
+ declare const SiteHeader: import("svelte").Component<Record<string, never>, {}, "">;
2
+ type SiteHeader = ReturnType<typeof SiteHeader>;
18
3
  export default SiteHeader;
@@ -68,8 +68,12 @@
68
68
  <Field.Field>
69
69
  <Field.Label>{lang[interfaceLanguage.current].label}</Field.Label>
70
70
  <div class="flex w-full items-center space-x-2">
71
- <Input bind:value disabled={loading} />
72
- <Button type="button" variant="outline" onclick={updateName} disabled={loading}>
71
+ <Field.Control>
72
+ {#snippet child(props)}
73
+ <Input {...props} bind:value disabled={loading} />
74
+ {/snippet}
75
+ </Field.Control>
76
+ <Button type="button" variant="outline" onclick={updateName} loading={loading}>
73
77
  {lang[interfaceLanguage.current].save}
74
78
  </Button>
75
79
  </div>