includio-cms 0.1.4 → 0.5.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 (296) hide show
  1. package/CHANGELOG.md +68 -0
  2. package/ROADMAP.md +18 -13
  3. package/dist/admin/api/accept-invite.js +1 -5
  4. package/dist/admin/api/invite.js +7 -16
  5. package/dist/admin/client/account/account-page.svelte +20 -50
  6. package/dist/admin/client/account/lang.d.ts +15 -23
  7. package/dist/admin/client/account/lang.js +51 -67
  8. package/dist/admin/client/account/preferences-section.svelte +26 -84
  9. package/dist/admin/client/account/profile-section.svelte +60 -40
  10. package/dist/admin/client/account/schema.d.ts +11 -3
  11. package/dist/admin/client/account/schema.js +25 -16
  12. package/dist/admin/client/account/security-section.svelte +139 -105
  13. package/dist/admin/client/account/sessions-section.svelte +35 -34
  14. package/dist/admin/client/admin/admin-after-login-layout-content.svelte +3 -5
  15. package/dist/admin/client/admin/admin-layout.svelte +3 -2
  16. package/dist/admin/client/admin/admin-preloader.svelte +36 -0
  17. package/dist/admin/client/admin/admin-preloader.svelte.d.ts +18 -0
  18. package/dist/admin/client/admin/dashboard-page.svelte +55 -41
  19. package/dist/admin/client/collection/a11y-score-cell.svelte +45 -0
  20. package/dist/admin/client/collection/a11y-score-cell.svelte.d.ts +6 -0
  21. package/dist/admin/client/collection/bulk-actions-bar.svelte +83 -0
  22. package/dist/admin/client/collection/bulk-actions-bar.svelte.d.ts +9 -0
  23. package/dist/admin/client/collection/collection-entries.svelte +255 -260
  24. package/dist/admin/client/collection/collection-view.svelte.d.ts +4 -3
  25. package/dist/admin/client/collection/collection-view.svelte.js +9 -5
  26. package/dist/admin/client/collection/collection.svelte +22 -12
  27. package/dist/admin/client/collection/data-table.svelte +50 -39
  28. package/dist/admin/client/collection/data-table.svelte.d.ts +1 -0
  29. package/dist/admin/client/collection/date-cell.svelte +7 -5
  30. package/dist/admin/client/collection/date-cell.svelte.d.ts +1 -1
  31. package/dist/admin/client/collection/empty-state.svelte +28 -0
  32. package/dist/admin/client/collection/empty-state.svelte.d.ts +9 -0
  33. package/dist/admin/client/collection/entry-link.svelte +10 -4
  34. package/dist/admin/client/collection/entry-link.svelte.d.ts +1 -0
  35. package/dist/admin/client/collection/grid-view.svelte +21 -23
  36. package/dist/admin/client/collection/grid-view.svelte.d.ts +1 -2
  37. package/dist/admin/client/collection/row-actions.svelte +60 -0
  38. package/dist/admin/client/collection/row-actions.svelte.d.ts +9 -0
  39. package/dist/admin/client/collection/status-badge.svelte +7 -8
  40. package/dist/admin/client/collection/table-pagination.svelte +122 -79
  41. package/dist/admin/client/collection/table-pagination.svelte.d.ts +1 -0
  42. package/dist/admin/client/collection/table-toolbar.svelte +108 -88
  43. package/dist/admin/client/collection/table-toolbar.svelte.d.ts +8 -9
  44. package/dist/admin/client/entry/entry-form.svelte +109 -1
  45. package/dist/admin/client/entry/entry-header.svelte +96 -37
  46. package/dist/admin/client/entry/entry-header.svelte.d.ts +5 -0
  47. package/dist/admin/client/entry/entry.svelte +171 -60
  48. package/dist/admin/client/entry/header/a11y-validator.d.ts +46 -0
  49. package/dist/admin/client/entry/header/a11y-validator.js +311 -0
  50. package/dist/admin/client/entry/header/publish-panel.svelte +373 -131
  51. package/dist/admin/client/entry/header/publish-panel.svelte.d.ts +4 -0
  52. package/dist/admin/client/entry/header/save-indicator.svelte +33 -23
  53. package/dist/admin/client/entry/header/schedule-popover.svelte +1 -1
  54. package/dist/admin/client/entry/header/status-badge.svelte +25 -118
  55. package/dist/admin/client/entry/header/version-history-sheet.svelte +314 -98
  56. package/dist/admin/client/form/form-submission/form-submission.svelte +271 -83
  57. package/dist/admin/client/form/form-submission/submission-field.svelte +12 -12
  58. package/dist/admin/client/form/form-submissions.svelte +421 -139
  59. package/dist/admin/client/form/submission-link.svelte +8 -2
  60. package/dist/admin/client/form/submission-link.svelte.d.ts +1 -0
  61. package/dist/admin/client/form/submission-status-badge.svelte +18 -4
  62. package/dist/admin/client/form/submission-status-badge.svelte.d.ts +1 -0
  63. package/dist/admin/client/login/lang.d.ts +32 -0
  64. package/dist/admin/client/login/lang.js +66 -2
  65. package/dist/admin/client/login/login-form.svelte +237 -95
  66. package/dist/admin/client/login/login-form.svelte.d.ts +2 -17
  67. package/dist/admin/client/login/login-page.svelte +34 -98
  68. package/dist/admin/client/login/reset-password-page.svelte +235 -0
  69. package/dist/admin/client/login/reset-password-page.svelte.d.ts +4 -0
  70. package/dist/admin/client/login/schema.d.ts +15 -0
  71. package/dist/admin/client/login/schema.js +21 -0
  72. package/dist/admin/client/users/accept-invite-page.svelte +166 -37
  73. package/dist/admin/client/users/create-user-dialog.svelte +15 -7
  74. package/dist/admin/client/users/delete-user-dialog.svelte +81 -16
  75. package/dist/admin/client/users/delete-user-dialog.svelte.d.ts +4 -1
  76. package/dist/admin/client/users/edit-user-dialog.svelte +3 -0
  77. package/dist/admin/client/users/invite-user-dialog.svelte +16 -3
  78. package/dist/admin/client/users/lang.d.ts +27 -0
  79. package/dist/admin/client/users/lang.js +64 -10
  80. package/dist/admin/client/users/pending-invitations.svelte +59 -23
  81. package/dist/admin/client/users/users-page.svelte +471 -72
  82. package/dist/admin/components/accessibility/accessibility-overview.svelte +2 -7
  83. package/dist/admin/components/dashboard/a11y-gauge.svelte +90 -0
  84. package/dist/admin/components/dashboard/a11y-gauge.svelte.d.ts +18 -0
  85. package/dist/admin/components/dashboard/accessibility-hub.svelte +13 -12
  86. package/dist/admin/components/dashboard/form-submissions-widget.svelte +71 -113
  87. package/dist/admin/components/dashboard/index.d.ts +4 -2
  88. package/dist/admin/components/dashboard/index.js +4 -2
  89. package/dist/admin/components/dashboard/recent-activity.svelte +53 -75
  90. package/dist/admin/components/dashboard/recent-entries.svelte +94 -0
  91. package/dist/admin/components/dashboard/recent-entries.svelte.d.ts +18 -0
  92. package/dist/admin/components/dashboard/stat-card.svelte +2 -2
  93. package/dist/admin/components/dashboard/tip-of-the-day.svelte +109 -0
  94. package/dist/admin/components/dashboard/tip-of-the-day.svelte.d.ts +3 -0
  95. package/dist/admin/components/dashboard/welcome-header.svelte +45 -0
  96. package/dist/admin/components/dashboard/welcome-header.svelte.d.ts +3 -0
  97. package/dist/admin/components/fields/{array-field.svelte → blocks-field.svelte} +4 -4
  98. package/dist/admin/components/fields/{array-field.svelte.d.ts → blocks-field.svelte.d.ts} +5 -5
  99. package/dist/admin/components/fields/content-field.svelte +27 -0
  100. package/dist/admin/components/fields/content-field.svelte.d.ts +31 -0
  101. package/dist/admin/components/fields/field-renderer.svelte +9 -7
  102. package/dist/admin/components/fields/image-field.svelte +2 -2
  103. package/dist/admin/components/fields/media-field.svelte +2 -2
  104. package/dist/admin/components/fields/seo-field.svelte +205 -25
  105. package/dist/admin/components/fields/simple-array-field.svelte +289 -0
  106. package/dist/admin/components/fields/simple-array-field.svelte.d.ts +30 -0
  107. package/dist/admin/components/fields/slug-field.svelte +3 -2
  108. package/dist/admin/components/fields/standalone-field-renderer.svelte +148 -0
  109. package/dist/admin/components/fields/standalone-field-renderer.svelte.d.ts +9 -0
  110. package/dist/admin/components/fields/text-field-wrapper.svelte +13 -1
  111. package/dist/admin/components/fields/text-field-wrapper.svelte.d.ts +2 -2
  112. package/dist/admin/components/fields/url-field.svelte +5 -4
  113. package/dist/admin/components/layout/app-sidebar.svelte +27 -24
  114. package/dist/admin/components/layout/lang.d.ts +6 -0
  115. package/dist/admin/components/layout/lang.js +13 -1
  116. package/dist/admin/components/layout/layout-renderer.svelte +352 -0
  117. package/dist/admin/components/layout/layout-renderer.svelte.d.ts +14 -0
  118. package/dist/admin/components/layout/nav-breadcrumbs.svelte +4 -4
  119. package/dist/admin/components/layout/nav-collections.svelte +65 -36
  120. package/dist/admin/components/layout/nav-footer.svelte +31 -0
  121. package/dist/admin/components/layout/nav-footer.svelte.d.ts +18 -0
  122. package/dist/admin/components/layout/nav-forms.svelte +55 -30
  123. package/dist/admin/components/layout/nav-main.svelte +14 -52
  124. package/dist/admin/components/layout/nav-search.svelte +4 -3
  125. package/dist/admin/components/layout/nav-singletons.svelte +59 -17
  126. package/dist/admin/components/layout/nav-singletons.svelte.d.ts +17 -8
  127. package/dist/admin/components/layout/site-header.svelte +74 -13
  128. package/dist/admin/components/media/alt-input.svelte +32 -22
  129. package/dist/admin/components/media/bulk-action-bar.svelte +139 -150
  130. package/dist/admin/components/media/file/file-details.svelte +299 -217
  131. package/dist/admin/components/media/file/file-miniature.svelte +54 -41
  132. package/dist/admin/components/media/file/file-miniature.svelte.d.ts +1 -0
  133. package/dist/admin/components/media/file/file-preview.svelte +1 -1
  134. package/dist/admin/components/media/file-upload.svelte +24 -26
  135. package/dist/admin/components/media/files-list.svelte +112 -40
  136. package/dist/admin/components/media/files-list.svelte.d.ts +2 -0
  137. package/dist/admin/components/media/focal-point-input.svelte +122 -26
  138. package/dist/admin/components/media/media-library.svelte +127 -70
  139. package/dist/admin/components/media/media-search.svelte +6 -6
  140. package/dist/admin/components/media/media-sort.svelte +3 -1
  141. package/dist/admin/components/media/multi-file-summary.svelte +88 -68
  142. package/dist/admin/components/media/tag-combobox.svelte +141 -66
  143. package/dist/admin/components/media/tag-combobox.svelte.d.ts +1 -0
  144. package/dist/admin/components/media/tag-sidebar.svelte +139 -121
  145. package/dist/admin/components/tiptap/FigureNodeView.svelte +144 -15
  146. package/dist/admin/components/tiptap/InlineBlockNodeView.svelte +254 -0
  147. package/dist/admin/components/tiptap/InlineBlockNodeView.svelte.d.ts +4 -0
  148. package/dist/admin/components/tiptap/SlashCommandPopup.svelte +212 -0
  149. package/dist/admin/components/tiptap/SlashCommandPopup.svelte.d.ts +8 -0
  150. package/dist/admin/components/tiptap/content-editor.svelte +280 -0
  151. package/dist/admin/components/tiptap/content-editor.svelte.d.ts +9 -0
  152. package/dist/admin/components/tiptap/editor-toolbar.svelte +230 -0
  153. package/dist/admin/components/tiptap/editor-toolbar.svelte.d.ts +16 -0
  154. package/dist/admin/components/tiptap/heading-a11y-plugin.d.ts +2 -0
  155. package/dist/admin/components/tiptap/heading-a11y-plugin.js +67 -0
  156. package/dist/admin/components/tiptap/image-dialog.svelte +172 -11
  157. package/dist/admin/components/tiptap/inline-block-node.d.ts +19 -0
  158. package/dist/admin/components/tiptap/inline-block-node.js +98 -0
  159. package/dist/admin/components/tiptap/link-dialog.svelte +9 -4
  160. package/dist/admin/components/tiptap/slash-command.d.ts +17 -0
  161. package/dist/admin/components/tiptap/slash-command.js +181 -0
  162. package/dist/admin/components/tiptap/structured-content-utils.d.ts +21 -0
  163. package/dist/admin/components/tiptap/structured-content-utils.js +150 -0
  164. package/dist/admin/components/tiptap/tiptap-editor.svelte +18 -190
  165. package/dist/admin/email/invite-template.d.ts +8 -0
  166. package/dist/admin/email/invite-template.js +99 -0
  167. package/dist/admin/email/reset-password-template.d.ts +7 -0
  168. package/dist/admin/email/reset-password-template.js +96 -0
  169. package/dist/admin/remote/ai.remote.d.ts +1 -0
  170. package/dist/admin/remote/ai.remote.js +4 -1
  171. package/dist/admin/remote/entry.remote.d.ts +8 -0
  172. package/dist/admin/remote/entry.remote.js +53 -4
  173. package/dist/admin/remote/preview.remote.js +2 -1
  174. package/dist/admin/shared/password-schema.d.ts +5 -0
  175. package/dist/admin/shared/password-schema.js +10 -0
  176. package/dist/admin/styles/admin.css +1530 -151
  177. package/dist/admin/utils/formatDate.d.ts +1 -0
  178. package/dist/admin/utils/formatDate.js +8 -0
  179. package/dist/admin/utils/roleLabel.d.ts +2 -0
  180. package/dist/admin/utils/roleLabel.js +13 -0
  181. package/dist/ai-claude/index.d.ts +2 -0
  182. package/dist/ai-claude/index.js +56 -0
  183. package/dist/cms/runtime/api.d.ts +6 -1
  184. package/dist/cms/runtime/api.js +3 -0
  185. package/dist/cms/runtime/schemas.d.ts +9 -1
  186. package/dist/cms/runtime/schemas.js +8 -0
  187. package/dist/cms/runtime/types.d.ts +82 -10
  188. package/dist/cms/runtime/types.js +4 -0
  189. package/dist/components/ui/accordion/accordion.stories.svelte +39 -0
  190. package/dist/components/ui/accordion/accordion.stories.svelte.d.ts +27 -0
  191. package/dist/components/ui/alert/alert.stories.svelte +53 -0
  192. package/dist/components/ui/alert/alert.stories.svelte.d.ts +27 -0
  193. package/dist/components/ui/alert/alert.svelte +5 -0
  194. package/dist/components/ui/alert/alert.svelte.d.ts +9 -0
  195. package/dist/components/ui/avatar/avatar.stories.svelte +16 -0
  196. package/dist/components/ui/avatar/avatar.stories.svelte.d.ts +27 -0
  197. package/dist/components/ui/badge/badge.stories.svelte +33 -0
  198. package/dist/components/ui/badge/badge.stories.svelte.d.ts +27 -0
  199. package/dist/components/ui/breadcrumb/breadcrumb.stories.svelte +33 -0
  200. package/dist/components/ui/breadcrumb/breadcrumb.stories.svelte.d.ts +27 -0
  201. package/dist/components/ui/button/button.stories.svelte +43 -0
  202. package/dist/components/ui/button/button.stories.svelte.d.ts +27 -0
  203. package/dist/components/ui/button/button.svelte +1 -2
  204. package/dist/components/ui/button/button.svelte.d.ts +0 -3
  205. package/dist/components/ui/button-group/button-group-separator.svelte.d.ts +1 -1
  206. package/dist/components/ui/card/card.stories.svelte +42 -0
  207. package/dist/components/ui/card/card.stories.svelte.d.ts +27 -0
  208. package/dist/components/ui/command/command.stories.svelte +51 -0
  209. package/dist/components/ui/command/command.stories.svelte.d.ts +27 -0
  210. package/dist/components/ui/dialog/dialog.stories.svelte +29 -0
  211. package/dist/components/ui/dialog/dialog.stories.svelte.d.ts +27 -0
  212. package/dist/components/ui/field/field-label.svelte.d.ts +1 -1
  213. package/dist/components/ui/field/field.stories.svelte +21 -0
  214. package/dist/components/ui/field/field.stories.svelte.d.ts +27 -0
  215. package/dist/components/ui/input/input.stories.svelte +40 -0
  216. package/dist/components/ui/input/input.stories.svelte.d.ts +27 -0
  217. package/dist/components/ui/input/input.svelte +2 -4
  218. package/dist/components/ui/item/item-separator.svelte.d.ts +1 -1
  219. package/dist/components/ui/label/label.stories.svelte +20 -0
  220. package/dist/components/ui/label/label.stories.svelte.d.ts +27 -0
  221. package/dist/components/ui/popover/popover.stories.svelte +29 -0
  222. package/dist/components/ui/popover/popover.stories.svelte.d.ts +27 -0
  223. package/dist/components/ui/select/select-group-heading.svelte.d.ts +1 -1
  224. package/dist/components/ui/select/select.stories.svelte +23 -0
  225. package/dist/components/ui/select/select.stories.svelte.d.ts +27 -0
  226. package/dist/components/ui/separator/separator.stories.svelte +24 -0
  227. package/dist/components/ui/separator/separator.stories.svelte.d.ts +27 -0
  228. package/dist/components/ui/sheet/sheet.stories.svelte +29 -0
  229. package/dist/components/ui/sheet/sheet.stories.svelte.d.ts +27 -0
  230. package/dist/components/ui/sidebar/sidebar-group.svelte +3 -3
  231. package/dist/components/ui/sidebar/sidebar-group.svelte.d.ts +2 -2
  232. package/dist/components/ui/sidebar/sidebar-menu-button.svelte +28 -30
  233. package/dist/components/ui/sidebar/sidebar-menu-button.svelte.d.ts +7 -7
  234. package/dist/components/ui/sidebar/sidebar-separator.svelte.d.ts +1 -1
  235. package/dist/components/ui/sidebar/sidebar-trigger.svelte +4 -4
  236. package/dist/components/ui/sonner/sonner.stories.svelte +22 -0
  237. package/dist/components/ui/sonner/sonner.stories.svelte.d.ts +26 -0
  238. package/dist/components/ui/sonner/sonner.svelte +8 -2
  239. package/dist/components/ui/sonner/toast-demo.svelte +29 -0
  240. package/dist/components/ui/sonner/toast-demo.svelte.d.ts +6 -0
  241. package/dist/components/ui/textarea/textarea.stories.svelte +22 -0
  242. package/dist/components/ui/textarea/textarea.stories.svelte.d.ts +27 -0
  243. package/dist/components/ui/textarea/textarea.svelte +0 -2
  244. package/dist/components/ui/toggle/toggle.stories.svelte +22 -0
  245. package/dist/components/ui/toggle/toggle.stories.svelte.d.ts +27 -0
  246. package/dist/components/ui/toggle-group/toggle-group.stories.svelte +17 -0
  247. package/dist/components/ui/toggle-group/toggle-group.stories.svelte.d.ts +27 -0
  248. package/dist/components/ui/tooltip/tooltip.stories.svelte +26 -0
  249. package/dist/components/ui/tooltip/tooltip.stories.svelte.d.ts +27 -0
  250. package/dist/core/fields/fieldSchemaToTs.d.ts +1 -0
  251. package/dist/core/fields/fieldSchemaToTs.js +133 -1
  252. package/dist/core/fields/layoutUtils.d.ts +17 -0
  253. package/dist/core/fields/layoutUtils.js +149 -0
  254. package/dist/core/fields/structuredToHtml.d.ts +9 -0
  255. package/dist/core/fields/structuredToHtml.js +161 -0
  256. package/dist/core/server/entries/operations/create.js +2 -1
  257. package/dist/core/server/entries/operations/get.js +8 -6
  258. package/dist/core/server/entries/operations/update.d.ts +3 -0
  259. package/dist/core/server/entries/operations/update.js +30 -2
  260. package/dist/core/server/fields/queryStructuredContent.d.ts +15 -0
  261. package/dist/core/server/fields/queryStructuredContent.js +65 -0
  262. package/dist/core/server/fields/resolveImageFields.js +51 -2
  263. package/dist/core/server/fields/resolveRelationFields.js +2 -2
  264. package/dist/core/server/fields/resolveRichtextLinks.js +80 -13
  265. package/dist/core/server/fields/resolveUrlFields.js +57 -6
  266. package/dist/core/server/fields/slugResolver.d.ts +10 -0
  267. package/dist/core/server/fields/slugResolver.js +34 -0
  268. package/dist/core/server/generator/fields.js +15 -4
  269. package/dist/core/server/generator/generator.js +3 -2
  270. package/dist/files-local/index.js +126 -64
  271. package/dist/server/auth.d.ts +5 -0
  272. package/dist/server/auth.js +12 -1
  273. package/dist/sveltekit/components/structured-content.svelte +204 -0
  274. package/dist/sveltekit/components/structured-content.svelte.d.ts +21 -0
  275. package/dist/sveltekit/config.d.ts +13 -3
  276. package/dist/sveltekit/index.d.ts +3 -0
  277. package/dist/sveltekit/index.js +3 -0
  278. package/dist/sveltekit/server/handle.js +1 -0
  279. package/dist/types/config.d.ts +3 -0
  280. package/dist/types/fields.d.ts +19 -2
  281. package/dist/types/index.d.ts +2 -0
  282. package/dist/types/index.js +2 -0
  283. package/dist/types/layout.d.ts +54 -0
  284. package/dist/types/layout.js +6 -0
  285. package/dist/types/structured-content.d.ts +63 -0
  286. package/dist/types/structured-content.js +1 -0
  287. package/dist/updates/0.1.5/index.d.ts +2 -0
  288. package/dist/updates/0.1.5/index.js +18 -0
  289. package/dist/updates/0.2.0/index.d.ts +2 -0
  290. package/dist/updates/0.2.0/index.js +11 -0
  291. package/dist/updates/0.2.2/index.d.ts +2 -0
  292. package/dist/updates/0.2.2/index.js +13 -0
  293. package/dist/updates/0.5.0/index.d.ts +2 -0
  294. package/dist/updates/0.5.0/index.js +14 -0
  295. package/dist/updates/index.js +5 -1
  296. package/package.json +16 -9
@@ -1,7 +1,8 @@
1
1
  export const usersLang = {
2
2
  en: {
3
3
  title: 'Users',
4
- name: 'Name',
4
+ description: 'Manage team members and their permissions.',
5
+ name: 'Full name',
5
6
  email: 'Email',
6
7
  role: 'Role',
7
8
  createdAt: 'Created At',
@@ -13,17 +14,36 @@ export const usersLang = {
13
14
  save: 'Save',
14
15
  cancel: 'Cancel',
15
16
  password: 'Password',
16
- roleAdmin: 'Admin',
17
+ passwordHint: 'Min. 8 characters, uppercase, number and special character',
18
+ passwordMinLength: 'Password must be at least 8 characters',
19
+ passwordRequirements: 'Password must contain an uppercase letter, a number and a special character',
20
+ passwordMismatch: 'Passwords do not match',
21
+ roleAdmin: 'Administrator',
17
22
  roleUser: 'User',
23
+ roleHint: 'Administrators have full access to the panel and all settings.',
18
24
  deleteConfirmTitle: 'Delete user?',
19
25
  deleteConfirmDescription: 'This action cannot be undone. The user will be permanently deleted.',
26
+ deleteWarningTitle: 'This action cannot be undone',
27
+ deleteWarningDesc: (name) => `User <strong>${name}</strong> will be permanently deleted along with all their data.`,
28
+ deleteConfirmType: 'Type <strong>DELETE</strong> to confirm',
29
+ deleteConfirmWord: 'DELETE',
20
30
  userCreated: 'User created',
21
31
  userUpdated: 'User updated',
22
32
  userDeleted: 'User deleted',
23
33
  cannotDeleteSelf: 'You cannot delete your own account',
24
34
  cannotChangeSelfRole: 'You cannot change your own role',
25
35
  noResults: 'No users found',
26
- generatePassword: 'Generate password',
36
+ generatePassword: 'Generate',
37
+ filterByRole: 'Filter by role',
38
+ allRoles: 'All roles',
39
+ showing: (start, end, total) => `Showing ${start}–${end} of ${total}`,
40
+ selected: (n) => `${n} selected`,
41
+ changeRole: 'Change role',
42
+ emptyTitle: 'No users yet',
43
+ emptyDescription: 'Create your first user to start managing your team.',
44
+ addUser: 'Add user',
45
+ selectAll: 'Select all',
46
+ selectUser: 'Select user',
27
47
  sessions: {
28
48
  title: 'User Sessions',
29
49
  noSessions: 'No active sessions',
@@ -48,16 +68,24 @@ export const usersLang = {
48
68
  acceptDescription: 'Set up your account to get started.',
49
69
  confirmPassword: 'Confirm password',
50
70
  acceptInvite: 'Create Account',
51
- accepted: 'Account created! Redirecting to login...',
71
+ accepted: 'Account created!',
72
+ goToLogin: 'Go to login',
52
73
  invalidToken: 'Invalid or expired invitation link',
53
74
  emailConfigRequired: 'Email adapter not configured',
54
75
  resend: 'Resend',
55
- resent: 'Invitation resent'
76
+ resent: 'Invitation resent',
77
+ emailPlaceholder: 'john@company.com',
78
+ emailHint: 'The user will receive an email with a link to create their account.',
79
+ roleHint: 'You can change the role later.',
80
+ expiringSoon: 'Expiring soon',
81
+ resendLabel: (email) => `Resend invitation to ${email}`,
82
+ cancelLabel: (email) => `Cancel invitation for ${email}`
56
83
  }
57
84
  },
58
85
  pl: {
59
86
  title: 'Użytkownicy',
60
- name: 'Imię',
87
+ description: 'Zarządzaj członkami zespołu i ich uprawnieniami.',
88
+ name: 'Imię i nazwisko',
61
89
  email: 'E-mail',
62
90
  role: 'Rola',
63
91
  createdAt: 'Utworzono',
@@ -69,17 +97,36 @@ export const usersLang = {
69
97
  save: 'Zapisz',
70
98
  cancel: 'Anuluj',
71
99
  password: 'Hasło',
72
- roleAdmin: 'Admin',
100
+ passwordHint: 'Min. 8 znaków, wielka litera, cyfra i znak specjalny',
101
+ passwordMinLength: 'Hasło musi mieć min. 8 znaków',
102
+ passwordRequirements: 'Hasło musi zawierać wielką literę, cyfrę i znak specjalny',
103
+ passwordMismatch: 'Hasła nie są zgodne',
104
+ roleAdmin: 'Administrator',
73
105
  roleUser: 'Użytkownik',
106
+ roleHint: 'Administratorzy mają pełen dostęp do panelu i wszystkich ustawień.',
74
107
  deleteConfirmTitle: 'Usunąć użytkownika?',
75
108
  deleteConfirmDescription: 'Ta akcja jest nieodwracalna. Użytkownik zostanie trwale usunięty.',
109
+ deleteWarningTitle: 'Tej operacji nie można cofnąć',
110
+ deleteWarningDesc: (name) => `Użytkownik <strong>${name}</strong> zostanie trwale usunięty wraz ze wszystkimi danymi.`,
111
+ deleteConfirmType: 'Wpisz <strong>USUŃ</strong>, żeby potwierdzić',
112
+ deleteConfirmWord: 'USUŃ',
76
113
  userCreated: 'Użytkownik utworzony',
77
114
  userUpdated: 'Użytkownik zaktualizowany',
78
115
  userDeleted: 'Użytkownik usunięty',
79
116
  cannotDeleteSelf: 'Nie możesz usunąć swojego konta',
80
117
  cannotChangeSelfRole: 'Nie możesz zmienić swojej roli',
81
118
  noResults: 'Nie znaleziono użytkowników',
82
- generatePassword: 'Wygeneruj hasło',
119
+ generatePassword: 'Generuj',
120
+ filterByRole: 'Filtruj po roli',
121
+ allRoles: 'Wszystkie role',
122
+ showing: (start, end, total) => `Wyświetlono ${start}–${end} z ${total}`,
123
+ selected: (n) => `Zaznaczono: ${n}`,
124
+ changeRole: 'Zmień rolę',
125
+ emptyTitle: 'Brak użytkowników',
126
+ emptyDescription: 'Utwórz pierwszego użytkownika, żeby zacząć zarządzać zespołem.',
127
+ addUser: 'Dodaj użytkownika',
128
+ selectAll: 'Zaznacz wszystkich',
129
+ selectUser: 'Zaznacz użytkownika',
83
130
  sessions: {
84
131
  title: 'Sesje użytkownika',
85
132
  noSessions: 'Brak aktywnych sesji',
@@ -104,11 +151,18 @@ export const usersLang = {
104
151
  acceptDescription: 'Skonfiguruj swoje konto, aby rozpocząć.',
105
152
  confirmPassword: 'Potwierdź hasło',
106
153
  acceptInvite: 'Utwórz konto',
107
- accepted: 'Konto utworzone! Przekierowywanie do logowania...',
154
+ accepted: 'Konto utworzone!',
155
+ goToLogin: 'Przejdź do logowania',
108
156
  invalidToken: 'Nieprawidłowy lub wygasły link zaproszenia',
109
157
  emailConfigRequired: 'Adapter e-mail nie jest skonfigurowany',
110
158
  resend: 'Wyślij ponownie',
111
- resent: 'Zaproszenie wysłane ponownie'
159
+ resent: 'Zaproszenie wysłane ponownie',
160
+ emailPlaceholder: 'jan@firma.pl',
161
+ emailHint: 'Użytkownik otrzyma e-mail z linkiem do utworzenia konta.',
162
+ roleHint: 'Możesz zmienić rolę później.',
163
+ expiringSoon: 'Wygasa wkrótce',
164
+ resendLabel: (email) => `Wyślij ponownie zaproszenie do ${email}`,
165
+ cancelLabel: (email) => `Anuluj zaproszenie dla ${email}`
112
166
  }
113
167
  }
114
168
  };
@@ -1,14 +1,14 @@
1
1
  <script lang="ts">
2
2
  import * as Table from '../../../components/ui/table/index.js';
3
- import { Badge } from '../../../components/ui/badge/index.js';
4
3
  import Button from '../../../components/ui/button/button.svelte';
5
4
  import Loader2 from '@tabler/icons-svelte/icons/loader-2';
6
- import Trash from '@tabler/icons-svelte/icons/trash';
7
- import Send from '@tabler/icons-svelte/icons/send';
5
+ import Refresh from '@tabler/icons-svelte/icons/refresh';
6
+ import X from '@tabler/icons-svelte/icons/x';
8
7
  import { toast } from 'svelte-sonner';
9
8
  import { usersLang } from './lang.js';
10
9
  import { useInterfaceLanguage } from '../../state/interface-language.svelte.js';
11
10
  import { toLocaleCode } from '../../utils/formatDate.js';
11
+ import { getRoleLabel } from '../../utils/roleLabel.js';
12
12
 
13
13
  type Props = {
14
14
  refreshTrigger?: number;
@@ -30,6 +30,12 @@
30
30
  let invitations = $state<Invitation[]>([]);
31
31
  let loading = $state(true);
32
32
 
33
+ const EXPIRING_SOON_MS = 48 * 60 * 60 * 1000;
34
+
35
+ function isExpiringSoon(expiresAt: string): boolean {
36
+ return new Date(expiresAt).getTime() - Date.now() < EXPIRING_SOON_MS;
37
+ }
38
+
33
39
  $effect(() => {
34
40
  // eslint-disable-next-line @typescript-eslint/no-unused-expressions
35
41
  refreshTrigger;
@@ -52,7 +58,7 @@
52
58
  const res = await fetch('/admin/api/invite', {
53
59
  method: 'PATCH',
54
60
  headers: { 'Content-Type': 'application/json' },
55
- body: JSON.stringify({ id })
61
+ body: JSON.stringify({ id, lang: interfaceLanguage.current })
56
62
  });
57
63
 
58
64
  if (res.ok) {
@@ -85,54 +91,84 @@
85
91
  }
86
92
  </script>
87
93
 
88
- <div class="mt-8">
89
- <h2 class="mb-4 text-lg font-semibold">{lang.invite.pendingInvitations}</h2>
94
+ <section class="mt-10 users-fade-up" aria-labelledby="invitations-heading">
95
+ <div class="mb-4 flex items-center gap-2.5">
96
+ <h2 id="invitations-heading" class="text-lg font-semibold">{lang.invite.pendingInvitations}</h2>
97
+ {#if !loading && invitations.length > 0}
98
+ <span
99
+ class="inline-flex items-center justify-center rounded-full px-2 py-0.5 text-[11px] font-bold"
100
+ style="background: var(--warning-bg); color: var(--warning);"
101
+ >
102
+ {invitations.length}
103
+ </span>
104
+ {/if}
105
+ </div>
90
106
 
91
107
  {#if loading}
92
108
  <div class="flex items-center justify-center py-8">
93
- <Loader2 class="text-muted-foreground size-6 animate-spin" />
109
+ <Loader2 class="size-6 animate-spin" style="color: var(--muted-foreground);" />
94
110
  </div>
95
111
  {:else if invitations.length === 0}
96
- <p class="text-muted-foreground py-4 text-center text-sm">{lang.invite.noPending}</p>
112
+ <p class="py-4 text-center text-sm" style="color: var(--muted-foreground);">
113
+ {lang.invite.noPending}
114
+ </p>
97
115
  {:else}
98
- <div class="overflow-hidden rounded-2xl border">
116
+ <div class="overflow-hidden rounded-xl border bg-card shadow-sm">
99
117
  <Table.Root>
100
118
  <Table.Header>
101
- <Table.Row>
119
+ <Table.Row class="bg-muted/50">
102
120
  <Table.Head>{lang.email}</Table.Head>
103
121
  <Table.Head>{lang.role}</Table.Head>
104
122
  <Table.Head>{lang.invite.expires}</Table.Head>
105
- <Table.Head class="text-right">{lang.actions}</Table.Head>
123
+ <Table.Head class="w-[100px]">
124
+ <span class="sr-only">{lang.actions}</span>
125
+ </Table.Head>
106
126
  </Table.Row>
107
127
  </Table.Header>
108
128
  <Table.Body>
109
129
  {#each invitations as inv (inv.id)}
110
- <Table.Row>
111
- <Table.Cell>{inv.email}</Table.Cell>
130
+ <Table.Row class="transition-colors hover:bg-[var(--lavender-lighter)]">
131
+ <Table.Cell class="font-medium">{inv.email}</Table.Cell>
112
132
  <Table.Cell>
113
- <Badge variant={inv.role === 'admin' ? 'default' : 'secondary'}>
114
- {inv.role === 'admin' ? lang.roleAdmin : lang.roleUser}
115
- </Badge>
133
+ <span
134
+ class="users-role-badge"
135
+ class:users-role-admin={inv.role === 'admin'}
136
+ class:users-role-user={inv.role !== 'admin'}
137
+ >
138
+ {getRoleLabel(inv.role, interfaceLanguage.current)}
139
+ </span>
116
140
  </Table.Cell>
117
- <Table.Cell>{formatDate(inv.expiresAt)}</Table.Cell>
118
- <Table.Cell class="text-right">
119
- <div class="flex items-center justify-end gap-1">
141
+ <Table.Cell>
142
+ <span
143
+ class="text-xs"
144
+ class:users-expiring-soon={isExpiringSoon(inv.expiresAt)}
145
+ style={isExpiringSoon(inv.expiresAt) ? '' : 'color: var(--muted-foreground);'}
146
+ >
147
+ {formatDate(inv.expiresAt)}
148
+ {#if isExpiringSoon(inv.expiresAt)}
149
+ — {lang.invite.expiringSoon}
150
+ {/if}
151
+ </span>
152
+ </Table.Cell>
153
+ <Table.Cell>
154
+ <div class="flex items-center justify-end gap-0.5">
120
155
  <Button
121
156
  variant="ghost"
122
157
  size="icon"
123
158
  class="h-8 w-8"
124
- title={lang.invite.resend}
125
159
  onclick={() => resendInvitation(inv.id)}
160
+ aria-label={lang.invite.resendLabel(inv.email)}
126
161
  >
127
- <Send class="size-4" />
162
+ <Refresh class="size-4" />
128
163
  </Button>
129
164
  <Button
130
165
  variant="ghost"
131
166
  size="icon"
132
167
  class="text-destructive h-8 w-8"
133
168
  onclick={() => cancelInvitation(inv.id)}
169
+ aria-label={lang.invite.cancelLabel(inv.email)}
134
170
  >
135
- <Trash class="size-4" />
171
+ <X class="size-4" />
136
172
  </Button>
137
173
  </div>
138
174
  </Table.Cell>
@@ -142,4 +178,4 @@
142
178
  </Table.Root>
143
179
  </div>
144
180
  {/if}
145
- </div>
181
+ </section>