includio-cms 0.1.3 → 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 (313) hide show
  1. package/CHANGELOG.md +76 -0
  2. package/ROADMAP.md +23 -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 -256
  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/paraglide/.prettierignore +3 -0
  272. package/dist/paraglide/messages/_index.d.ts +36 -0
  273. package/dist/paraglide/messages/_index.js +72 -0
  274. package/dist/paraglide/messages/en.d.ts +5 -0
  275. package/dist/paraglide/messages/en.js +14 -0
  276. package/dist/paraglide/messages/pl.d.ts +5 -0
  277. package/dist/paraglide/messages/pl.js +14 -0
  278. package/dist/paraglide/messages.d.ts +2 -0
  279. package/dist/paraglide/messages.js +4 -0
  280. package/dist/paraglide/registry.d.ts +21 -0
  281. package/dist/paraglide/registry.js +31 -0
  282. package/dist/paraglide/runtime.d.ts +583 -0
  283. package/dist/paraglide/runtime.js +1402 -0
  284. package/dist/paraglide/server.d.ts +67 -0
  285. package/dist/paraglide/server.js +175 -0
  286. package/dist/server/auth.d.ts +5 -0
  287. package/dist/server/auth.js +12 -1
  288. package/dist/sveltekit/components/structured-content.svelte +204 -0
  289. package/dist/sveltekit/components/structured-content.svelte.d.ts +21 -0
  290. package/dist/sveltekit/config.d.ts +13 -3
  291. package/dist/sveltekit/index.d.ts +3 -0
  292. package/dist/sveltekit/index.js +3 -0
  293. package/dist/sveltekit/server/handle.js +1 -0
  294. package/dist/types/config.d.ts +3 -0
  295. package/dist/types/fields.d.ts +19 -2
  296. package/dist/types/index.d.ts +2 -0
  297. package/dist/types/index.js +2 -0
  298. package/dist/types/layout.d.ts +54 -0
  299. package/dist/types/layout.js +6 -0
  300. package/dist/types/structured-content.d.ts +63 -0
  301. package/dist/types/structured-content.js +1 -0
  302. package/dist/updates/0.1.4/index.d.ts +2 -0
  303. package/dist/updates/0.1.4/index.js +11 -0
  304. package/dist/updates/0.1.5/index.d.ts +2 -0
  305. package/dist/updates/0.1.5/index.js +18 -0
  306. package/dist/updates/0.2.0/index.d.ts +2 -0
  307. package/dist/updates/0.2.0/index.js +11 -0
  308. package/dist/updates/0.2.2/index.d.ts +2 -0
  309. package/dist/updates/0.2.2/index.js +13 -0
  310. package/dist/updates/0.5.0/index.d.ts +2 -0
  311. package/dist/updates/0.5.0/index.js +14 -0
  312. package/dist/updates/index.js +6 -1
  313. package/package.json +17 -10
package/CHANGELOG.md CHANGED
@@ -3,6 +3,82 @@
3
3
  All notable changes to includio-cms are documented here.
4
4
  Generated from `src/lib/updates/` — do not edit manually.
5
5
 
6
+ ## 0.5.0 — 2026-02-22
7
+
8
+ Frontend rendering for structured content
9
+
10
+ ### Added
11
+ - `StructuredContent` Svelte component for rendering structured content on frontend
12
+ - `structuredToHtml()` — convert structured content to HTML (RSS, email)
13
+ - Query helpers: `extractBlocks()`, `extractInlineBlocks()`, `extractText()`, `extractMediaRefs()`
14
+ - Media resolution in population pipeline for `content` field — figure/video nodes enriched with `_media`
15
+
16
+ ### Migration
17
+
18
+ ```sql
19
+ No migration needed. Import `StructuredContent` from `includio/sveltekit` to render content fields.
20
+ ```
21
+
22
+ ## 0.2.2 — 2026-02-21
23
+
24
+ Structured Content field (TipTap JSON)
25
+
26
+ ### Added
27
+ - New `content` field type — stores TipTap JSON instead of HTML
28
+ - Extracted shared editor toolbar component
29
+ - Content field link resolution in resolve pipeline
30
+
31
+ ### Migration
32
+
33
+ ```sql
34
+ No migration needed. Add type:"content" fields to collection/single configs. Existing richtext fields unchanged.
35
+ ```
36
+
37
+ ## 0.2.0 — 2026-02-21
38
+
39
+ Array→Blocks rename, new simple array field
40
+
41
+ ### Added
42
+ - Simple array field for flat lists (text, number, url)
43
+
44
+ ### Breaking
45
+ - type:"array" with objects renamed to type:"blocks". Update collection/single configs.
46
+
47
+ ### Migration
48
+
49
+ ```sql
50
+ Config-only: rename type:"array" to type:"blocks" in field definitions. Stored data unchanged.
51
+ ```
52
+
53
+ ## 0.1.5 — 2026-02-21
54
+
55
+ Simplified entry versioning
56
+
57
+ ### Added
58
+ - Auto-save now updates draft in-place instead of creating new versions
59
+ - Ctrl/Cmd+S shortcut for immediate save
60
+ - Simplified status badge — no version numbers, green dot for published
61
+ - Version history shows only meaningful changes with semantic grouping
62
+ - Cleaning migration removes duplicate versions with identical data
63
+
64
+ ### Fixed
65
+ - Auto-save no longer creates dozens of empty versions
66
+ - Pruning no longer deletes important versions to make room for empty ones
67
+
68
+ ### Migration
69
+
70
+ ```sql
71
+ Removes duplicate entry versions where data is identical to the previous version. Preserves published, scheduled, and latest draft versions.
72
+ ```
73
+
74
+ ## 0.1.4 — 2026-02-19
75
+
76
+ Build & reactivity fixes
77
+
78
+ ### Fixed
79
+ - Prepack: remove dist/paraglide/.gitignore before publint (fixes publish validation)
80
+ - Collection entries: wrap query blocks in {#key} to force re-fetch on param change
81
+
6
82
  ## 0.1.3 — 2026-02-18
7
83
 
8
84
  Admin DX — route scaffolding & boilerplate reduction
package/ROADMAP.md CHANGED
@@ -48,34 +48,42 @@
48
48
 
49
49
  - [x] `[feature]` `[P1]` Admin route scaffolding — CLI `includio scaffold admin`, catch-all API handler, page.params fallbacks for CollectionPage/EntryPage <!-- files: src/lib/cli/scaffold/admin.ts, src/lib/admin/api/handler.ts, src/lib/admin/client/collection/collection-page.svelte, src/lib/admin/client/entry/entry-page.svelte -->
50
50
 
51
- ## 0.2.0Plugin system
51
+ ## 0.1.4Build & reactivity fixes
52
+
53
+ - [x] `[fix]` `[P0]` Prepack: remove dist/paraglide/.gitignore before publint (publish validation) <!-- files: package.json -->
54
+ - [x] `[fix]` `[P1]` Collection entries: {#key} wrapper on query blocks to force re-fetch on param change <!-- files: src/lib/admin/client/collection/collection-entries.svelte -->
55
+
56
+ ## 0.2.1–0.5.0 — Hybrid Editor System
57
+
58
+ > Szczegóły w **[ROADMAP-EDITOR.md](./ROADMAP-EDITOR.md)**
59
+
60
+ - **0.2.1** — array→blocks rename + simple array `[breaking]`
61
+ - **0.2.2** — Structured Content field (TipTap JSON output)
62
+ - **0.3.0** — Bard-style inline blocks
63
+ - **0.4.0** — Zone system (layout orchestration)
64
+ - **0.4.1** — Accessibility layer (ATAG Part B)
65
+ - **0.5.0** — Frontend rendering
66
+
67
+ ## 0.6.0 — Plugin system _(deferred from 0.2.0)_
52
68
 
53
69
  - [ ] `[feature]` `[P0]` Wire plugin hooks into CRUD operations (before/afterCreate, Update, Delete) <!-- files: src/lib/types/plugins.ts, src/lib/core/server/entries/operations/ -->
54
70
  - [ ] `[feature]` `[P0]` Plugin registration API — public surface for external plugins
55
71
  - [ ] `[chore]` `[P1]` Plugin system documentation
56
72
 
57
- ## 0.2.1 — CMS API improvements
58
-
59
- - [ ] `[feature]` `[P1]` Server-side pagination API (formalize 0.1.0 fix)
60
- - [ ] `[feature]` `[P1]` Improved type generation <!-- files: src/lib/core/server/generator/ -->
61
- - [ ] `[feature]` `[P1]` Proper filtering API (SQL-level, not JS post-query)
62
- - [ ] `[feature]` `[breaking]` `[P1]` Simple array field — `type: 'array'` with `of: 'text' | 'number' | ...` for flat lists (tags, categories) <!-- files: src/lib/types/fields.ts, src/lib/admin/components/fields/array-field.svelte, src/lib/core/fields/fieldSchemaToTs.ts -->
63
- - [ ] `[feature]` `[breaking]` `[P1]` Rename array → blocks — current array becomes `type: 'blocks'`, keeps `of: ObjectField[]` and accordion/DnD UI <!-- files: src/lib/types/fields.ts, src/lib/admin/components/fields/array-field.svelte, src/lib/admin/components/fields/field-renderer.svelte, src/lib/core/server/fields/resolve*.ts -->
64
-
65
- ## 0.3.0 — Admin experience
73
+ ## 0.6.1 — Admin experience
66
74
 
67
75
  - [ ] `[feature]` `[P1]` Admin overlay — built-in admin bar on site (quick edit, preview, audit)
68
76
  - [ ] `[feature]` `[P1]` Media gallery virtualization/pagination <!-- files: src/lib/admin/components/media/files-list.svelte -->
69
77
  - [ ] `[feature]` `[P2]` Image styles UI — preview generated variants in editor
70
78
 
71
- ## 0.3.1 — SEO module
79
+ ## 0.7.0 — SEO module
72
80
 
73
81
  - [ ] `[feature]` `[P1]` SERP preview + character limits for title/description <!-- files: src/lib/admin/components/fields/seo-field.svelte -->
74
82
  - [ ] `[feature]` `[P1]` Global SEO settings
75
83
  - [ ] `[feature]` `[P1]` Dedicated frontend SEO components <!-- files: src/lib/sveltekit/components/seo.svelte -->
76
84
  - [ ] `[feature]` `[P2]` Sitemap generation
77
85
 
78
- ## 0.4.0 — WCAG/ATAG compliance
86
+ ## 0.8.0 — WCAG/ATAG compliance
79
87
 
80
88
  - [ ] `[chore]` `[P0]` Full WCAG/ATAG audit
81
89
  - [ ] `[feature]` `[P0]` Accessibility rework based on audit findings
@@ -91,8 +99,10 @@
91
99
 
92
100
  ## Backlog
93
101
 
102
+ - [ ] `[feature]` `[P1]` Server-side pagination API (formalize 0.1.0 fix)
103
+ - [ ] `[feature]` `[P1]` Improved type generation <!-- files: src/lib/core/server/generator/ -->
104
+ - [ ] `[feature]` `[P1]` Proper filtering API (SQL-level, not JS post-query)
94
105
  - [ ] `[feature]` `[P1]` Ban/unban UI — reason + expiry, `banUser`/`unbanUser` <!-- files: src/lib/admin/client/users/ban-user-dialog.svelte -->
95
106
  - [ ] `[feature]` `[P1]` Impersonation UI — impersonate/stop bar <!-- files: src/lib/admin/client/users/impersonation-bar.svelte -->
96
- - [ ] `[feature]` `[P2]` Alternative richtext editor — Word-like mode, single richtext field instead of blocks
97
107
  - [ ] `[chore]` `[P2]` Caching/performance layer (scope TBD)
98
108
  - [ ] `[feature]` `[P2]` API/CLI for configuration (setup DX for less technical users)
@@ -1,11 +1,7 @@
1
1
  import { getInvitationByToken, markInvitationUsed } from '../remote/invite.js';
2
- import { getCMS } from '../../core/cms.js';
2
+ import { auth } from '../../server/auth.js';
3
3
  import { json } from '@sveltejs/kit';
4
4
  export const POST = async ({ request }) => {
5
- const auth = getCMS().auth;
6
- if (!auth) {
7
- return json({ error: 'Auth adapter not configured' }, { status: 500 });
8
- }
9
5
  const { token, name, password } = await request.json();
10
6
  if (!token || !name || !password) {
11
7
  return json({ error: 'Token, name and password are required' }, { status: 400 });
@@ -2,9 +2,10 @@ import { requireRole } from '../remote/middleware/auth.js';
2
2
  import { createInvitation, getPendingInvitations, deleteInvitation, checkEmailExists, getInvitationById } from '../remote/invite.js';
3
3
  import { getCMS } from '../../core/cms.js';
4
4
  import { json } from '@sveltejs/kit';
5
+ import { inviteEmailTemplate } from '../email/invite-template.js';
5
6
  export const POST = async ({ request, url }) => {
6
7
  const { user } = requireRole('admin');
7
- const { email, role } = await request.json();
8
+ const { email, role, lang } = await request.json();
8
9
  if (!email || !role) {
9
10
  return json({ error: 'Email and role are required' }, { status: 400 });
10
11
  }
@@ -19,13 +20,8 @@ export const POST = async ({ request, url }) => {
19
20
  const inv = await createInvitation(email, role, user.id);
20
21
  const inviteUrl = `${url.origin}/admin/accept-invite?token=${inv.token}`;
21
22
  try {
22
- await emailAdapter.sendMail({
23
- to: [email],
24
- subject: 'You have been invited to includio CMS',
25
- html: `<p>You have been invited to join the CMS as <strong>${role}</strong>.</p>
26
- <p><a href="${inviteUrl}">Click here to accept the invitation</a></p>
27
- <p>This link expires in 7 days.</p>`
28
- });
23
+ const { subject, html } = inviteEmailTemplate({ inviteUrl, role, lang });
24
+ await emailAdapter.sendMail({ to: [email], subject, html });
29
25
  }
30
26
  catch (err) {
31
27
  await deleteInvitation(inv.id);
@@ -40,7 +36,7 @@ export const GET = async () => {
40
36
  };
41
37
  export const PATCH = async ({ request, url }) => {
42
38
  requireRole('admin');
43
- const { id } = await request.json();
39
+ const { id, lang } = await request.json();
44
40
  if (!id) {
45
41
  return json({ error: 'Invitation id is required' }, { status: 400 });
46
42
  }
@@ -54,13 +50,8 @@ export const PATCH = async ({ request, url }) => {
54
50
  }
55
51
  const inviteUrl = `${url.origin}/admin/accept-invite?token=${inv.token}`;
56
52
  try {
57
- await emailAdapter.sendMail({
58
- to: [inv.email],
59
- subject: 'You have been invited to includio CMS',
60
- html: `<p>You have been invited to join the CMS as <strong>${inv.role}</strong>.</p>
61
- <p><a href="${inviteUrl}">Click here to accept the invitation</a></p>
62
- <p>This link expires in 7 days.</p>`
63
- });
53
+ const { subject, html } = inviteEmailTemplate({ inviteUrl, role: inv.role, lang });
54
+ await emailAdapter.sendMail({ to: [inv.email], subject, html });
64
55
  }
65
56
  catch (err) {
66
57
  return json({ error: 'Failed to send email: ' + (err instanceof Error ? err.message : 'Unknown error') }, { status: 502 });
@@ -1,70 +1,40 @@
1
1
  <script lang="ts">
2
- import * as Tabs from '../../../components/ui/tabs/index.js';
3
2
  import { accountLang } from './lang.js';
4
3
  import { useInterfaceLanguage } from '../../state/interface-language.svelte.js';
5
- import { page } from '$app/stores';
6
- import { goto } from '$app/navigation';
4
+ import { getBreadcrumbs } from '../../state/breadcrumbs.svelte.js';
7
5
  import ProfileSection from './profile-section.svelte';
8
6
  import SecuritySection from './security-section.svelte';
9
7
  import PreferencesSection from './preferences-section.svelte';
10
8
  import SessionsSection from './sessions-section.svelte';
11
- import UserCircle from '@tabler/icons-svelte/icons/user-circle';
12
- import Shield from '@tabler/icons-svelte/icons/shield';
13
- import Settings from '@tabler/icons-svelte/icons/settings';
14
- import Devices from '@tabler/icons-svelte/icons/devices';
15
9
 
16
10
  const interfaceLanguage = useInterfaceLanguage();
17
-
18
- let activeTab = $derived($page.url.searchParams.get('tab') || 'profile');
19
-
20
11
  const lang = $derived(accountLang[interfaceLanguage.current]);
12
+ const breadcrumbs = getBreadcrumbs();
21
13
 
22
- function handleTabChange(value: string) {
23
- const url = new URL($page.url);
24
- url.searchParams.set('tab', value);
25
- goto(url.toString(), { replaceState: true, keepFocus: true });
26
- }
27
-
28
- const tabs = [
29
- { value: 'profile', icon: UserCircle },
30
- { value: 'security', icon: Shield },
31
- { value: 'preferences', icon: Settings },
32
- { value: 'sessions', icon: Devices }
33
- ] as const;
14
+ $effect(() => {
15
+ breadcrumbs.state = [
16
+ { label: lang.title }
17
+ ];
18
+ });
34
19
  </script>
35
20
 
36
- <div class="container mx-auto max-w-5xl px-4 py-8">
37
- <h1 class="mb-8 text-2xl font-bold">{lang.title}</h1>
38
-
39
- <Tabs.Root value={activeTab} onValueChange={handleTabChange} class="flex flex-col gap-6 md:flex-row">
40
- <Tabs.List
41
- class="inline-flex h-auto w-full shrink-0 flex-row items-start justify-start gap-1 overflow-x-auto border-none bg-transparent p-0 shadow-none md:w-44 md:flex-col md:overflow-visible dark:border-none dark:bg-transparent dark:shadow-none"
42
- >
43
- {#each tabs as tab}
44
- {@const Icon = tab.icon}
45
- <Tabs.Trigger
46
- value={tab.value}
47
- class="text-muted-foreground hover:bg-muted/50 hover:text-foreground data-[state=active]:bg-muted data-[state=active]:text-foreground h-auto w-full flex-none justify-start gap-2 rounded-md border-none px-3 py-2 text-sm font-medium shadow-none ring-0 transition-colors focus-visible:ring-0 focus-visible:ring-offset-0 data-[state=active]:shadow-none"
48
- >
49
- <Icon class="size-4" />
50
- {lang.tabs[tab.value]}
51
- </Tabs.Trigger>
52
- {/each}
53
- </Tabs.List>
21
+ <div class="acct-content">
22
+ <div class="acct-inner">
23
+ <h1 class="mb-6 text-2xl font-bold">{lang.title}</h1>
54
24
 
55
- <div class="min-w-0 flex-1">
56
- <Tabs.Content value="profile" class="mt-0">
25
+ <div class="flex flex-col gap-5">
26
+ <div class="acct-fade-up">
57
27
  <ProfileSection />
58
- </Tabs.Content>
59
- <Tabs.Content value="security" class="mt-0">
28
+ </div>
29
+ <div class="acct-fade-up">
60
30
  <SecuritySection />
61
- </Tabs.Content>
62
- <Tabs.Content value="preferences" class="mt-0">
31
+ </div>
32
+ <div class="acct-fade-up">
63
33
  <PreferencesSection />
64
- </Tabs.Content>
65
- <Tabs.Content value="sessions" class="mt-0">
34
+ </div>
35
+ <div class="acct-fade-up">
66
36
  <SessionsSection />
67
- </Tabs.Content>
37
+ </div>
68
38
  </div>
69
- </Tabs.Root>
39
+ </div>
70
40
  </div>
@@ -1,44 +1,33 @@
1
1
  export declare const accountLang: Record<string, {
2
2
  title: string;
3
- tabs: {
4
- profile: string;
5
- security: string;
6
- preferences: string;
7
- sessions: string;
8
- };
9
3
  profile: {
10
4
  title: string;
11
5
  name: string;
12
6
  email: string;
7
+ emailHint: string;
13
8
  role: string;
14
- memberSince: string;
15
9
  save: string;
16
10
  saved: string;
17
11
  };
18
12
  security: {
19
- title: string;
20
13
  changePassword: string;
21
14
  currentPassword: string;
22
15
  newPassword: string;
23
16
  confirmPassword: string;
24
17
  updatePassword: string;
25
18
  passwordUpdated: string;
26
- deleteAccount: string;
27
- deleteAccountDesc: string;
28
- deleteAccountButton: string;
29
- deleteConfirmTitle: string;
30
- deleteConfirmDesc: string;
31
- deleteConfirmPassword: string;
32
- cancel: string;
33
- delete: string;
19
+ passwordHint: string;
20
+ showPassword: string;
21
+ hidePassword: string;
22
+ strengthWeak: string;
23
+ strengthMedium: string;
24
+ strengthStrong: string;
25
+ strengthVeryStrong: string;
26
+ strengthLabel: string;
34
27
  };
35
- preferences: {
28
+ language: {
36
29
  title: string;
37
- theme: string;
38
- themeLight: string;
39
- themeDark: string;
40
- themeSystem: string;
41
- language: string;
30
+ select: string;
42
31
  };
43
32
  sessions: {
44
33
  title: string;
@@ -49,11 +38,14 @@ export declare const accountLang: Record<string, {
49
38
  signOutEverywhereDesc: string;
50
39
  sessionRevoked: string;
51
40
  allSessionsRevoked: string;
41
+ online: string;
52
42
  };
53
43
  errors: {
44
+ nameRequired: string;
54
45
  passwordMismatch: string;
55
46
  passwordMinLength: string;
47
+ passwordRequirements: string;
56
48
  currentPasswordRequired: string;
57
- deletePasswordRequired: string;
49
+ confirmPasswordRequired: string;
58
50
  };
59
51
  }>;
@@ -1,120 +1,104 @@
1
1
  export const accountLang = {
2
2
  pl: {
3
3
  title: 'Ustawienia konta',
4
- tabs: {
5
- profile: 'Profil',
6
- security: 'Bezpieczeństwo',
7
- preferences: 'Preferencje',
8
- sessions: 'Sesje'
9
- },
10
4
  profile: {
11
5
  title: 'Profil',
12
- name: 'Imię',
13
- email: 'E-mail',
6
+ name: 'Nazwa',
7
+ email: 'Adres e-mail',
8
+ emailHint: 'Zarządzane przez dostawcę logowania',
14
9
  role: 'Rola',
15
- memberSince: 'Członek od',
16
- save: 'Zapisz',
10
+ save: 'Zapisz zmiany',
17
11
  saved: 'Zapisano'
18
12
  },
19
13
  security: {
20
- title: 'Bezpieczeństwo',
21
- changePassword: 'Zmień hasło',
22
- currentPassword: 'Obecne hasło',
14
+ changePassword: 'Zmiana hasła',
15
+ currentPassword: 'Aktualne hasło',
23
16
  newPassword: 'Nowe hasło',
24
- confirmPassword: 'Potwierdź hasło',
17
+ confirmPassword: 'Potwierdź nowe hasło',
25
18
  updatePassword: 'Zmień hasło',
26
19
  passwordUpdated: 'Hasło zostało zmienione',
27
- deleteAccount: 'Usuń konto',
28
- deleteAccountDesc: 'Trwale usuń swoje konto i wszystkie dane',
29
- deleteAccountButton: 'Usuń konto',
30
- deleteConfirmTitle: 'Czy na pewno?',
31
- deleteConfirmDesc: 'Ta akcja jest nieodwracalna. Spowoduje trwałe usunięcie Twojego konta.',
32
- deleteConfirmPassword: 'Wprowadź hasło, aby potwierdzić',
33
- cancel: 'Anuluj',
34
- delete: 'Usuń'
20
+ passwordHint: 'Min. 8 znaków, wielka litera, cyfra i znak specjalny',
21
+ showPassword: 'Pokaż hasło',
22
+ hidePassword: 'Ukryj hasło',
23
+ strengthWeak: 'Słabe',
24
+ strengthMedium: 'Średnie',
25
+ strengthStrong: 'Silne',
26
+ strengthVeryStrong: 'Bardzo silne',
27
+ strengthLabel: 'Siła hasła'
35
28
  },
36
- preferences: {
37
- title: 'Preferencje',
38
- theme: 'Motyw',
39
- themeLight: 'Jasny',
40
- themeDark: 'Ciemny',
41
- themeSystem: 'Systemowy',
42
- language: 'Język'
29
+ language: {
30
+ title: 'Język interfejsu',
31
+ select: 'Wybierz język'
43
32
  },
44
33
  sessions: {
45
34
  title: 'Aktywne sesje',
46
- currentSession: 'Obecna sesja',
35
+ currentSession: 'Ten komputer',
47
36
  lastActive: 'Ostatnio aktywna',
48
37
  revoke: 'Zakończ',
49
- signOutEverywhere: 'Wyloguj wszędzie',
38
+ signOutEverywhere: 'Wyloguj ze wszystkich urządzeń',
50
39
  signOutEverywhereDesc: 'Zakończ wszystkie sesje oprócz obecnej',
51
40
  sessionRevoked: 'Sesja została zakończona',
52
- allSessionsRevoked: 'Wszystkie sesje zostały zakończone'
41
+ allSessionsRevoked: 'Wszystkie sesje zostały zakończone',
42
+ online: 'Online'
53
43
  },
54
44
  errors: {
45
+ nameRequired: 'Nazwa jest wymagana',
55
46
  passwordMismatch: 'Hasła nie są zgodne',
56
- passwordMinLength: 'Hasło musi mieć min. 6 znaków',
57
- currentPasswordRequired: 'Obecne hasło jest wymagane',
58
- deletePasswordRequired: 'Hasło jest wymagane do usunięcia konta'
47
+ passwordMinLength: 'Hasło musi mieć min. 8 znaków',
48
+ passwordRequirements: 'Hasło musi zawierać wielką literę, cyfrę i znak specjalny',
49
+ currentPasswordRequired: 'Aktualne hasło jest wymagane',
50
+ confirmPasswordRequired: 'Potwierdź nowe hasło'
59
51
  }
60
52
  },
61
53
  en: {
62
54
  title: 'Account Settings',
63
- tabs: {
64
- profile: 'Profile',
65
- security: 'Security',
66
- preferences: 'Preferences',
67
- sessions: 'Sessions'
68
- },
69
55
  profile: {
70
56
  title: 'Profile',
71
57
  name: 'Name',
72
- email: 'Email',
58
+ email: 'Email address',
59
+ emailHint: 'Managed by login provider',
73
60
  role: 'Role',
74
- memberSince: 'Member since',
75
- save: 'Save',
61
+ save: 'Save changes',
76
62
  saved: 'Saved'
77
63
  },
78
64
  security: {
79
- title: 'Security',
80
65
  changePassword: 'Change password',
81
66
  currentPassword: 'Current password',
82
67
  newPassword: 'New password',
83
- confirmPassword: 'Confirm password',
84
- updatePassword: 'Update password',
68
+ confirmPassword: 'Confirm new password',
69
+ updatePassword: 'Change password',
85
70
  passwordUpdated: 'Password updated',
86
- deleteAccount: 'Delete account',
87
- deleteAccountDesc: 'Permanently delete your account and all data',
88
- deleteAccountButton: 'Delete account',
89
- deleteConfirmTitle: 'Are you sure?',
90
- deleteConfirmDesc: 'This action is irreversible. It will permanently delete your account.',
91
- deleteConfirmPassword: 'Enter your password to confirm',
92
- cancel: 'Cancel',
93
- delete: 'Delete'
71
+ passwordHint: 'Min. 8 characters, uppercase, number and special character',
72
+ showPassword: 'Show password',
73
+ hidePassword: 'Hide password',
74
+ strengthWeak: 'Weak',
75
+ strengthMedium: 'Medium',
76
+ strengthStrong: 'Strong',
77
+ strengthVeryStrong: 'Very strong',
78
+ strengthLabel: 'Password strength'
94
79
  },
95
- preferences: {
96
- title: 'Preferences',
97
- theme: 'Theme',
98
- themeLight: 'Light',
99
- themeDark: 'Dark',
100
- themeSystem: 'System',
101
- language: 'Language'
80
+ language: {
81
+ title: 'Interface language',
82
+ select: 'Select language'
102
83
  },
103
84
  sessions: {
104
85
  title: 'Active sessions',
105
- currentSession: 'Current session',
86
+ currentSession: 'This computer',
106
87
  lastActive: 'Last active',
107
88
  revoke: 'Revoke',
108
- signOutEverywhere: 'Sign out everywhere',
89
+ signOutEverywhere: 'Sign out from all devices',
109
90
  signOutEverywhereDesc: 'End all sessions except the current one',
110
91
  sessionRevoked: 'Session revoked',
111
- allSessionsRevoked: 'All sessions revoked'
92
+ allSessionsRevoked: 'All sessions revoked',
93
+ online: 'Online'
112
94
  },
113
95
  errors: {
96
+ nameRequired: 'Name is required',
114
97
  passwordMismatch: 'Passwords do not match',
115
- passwordMinLength: 'Password must be at least 6 characters',
98
+ passwordMinLength: 'Password must be at least 8 characters',
99
+ passwordRequirements: 'Password must contain an uppercase letter, a number and a special character',
116
100
  currentPasswordRequired: 'Current password is required',
117
- deletePasswordRequired: 'Password is required to delete account'
101
+ confirmPasswordRequired: 'Please confirm your new password'
118
102
  }
119
103
  }
120
104
  };