includio-cms 0.1.4 → 0.5.1

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 (310) hide show
  1. package/CHANGELOG.md +83 -0
  2. package/ROADMAP.md +26 -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 +35 -67
  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 +100 -0
  22. package/dist/admin/client/collection/bulk-actions-bar.svelte.d.ts +10 -0
  23. package/dist/admin/client/collection/collection-entries.svelte +277 -258
  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 +69 -0
  38. package/dist/admin/client/collection/row-actions.svelte.d.ts +10 -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 +143 -37
  46. package/dist/admin/client/entry/entry-header.svelte.d.ts +8 -0
  47. package/dist/admin/client/entry/entry.svelte +272 -61
  48. package/dist/admin/client/entry/header/a11y-validator.d.ts +47 -0
  49. package/dist/admin/client/entry/header/a11y-validator.js +352 -0
  50. package/dist/admin/client/entry/header/publish-panel.svelte +531 -129
  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 +322 -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/changelog-dialog.svelte +157 -0
  87. package/dist/admin/components/dashboard/changelog-dialog.svelte.d.ts +6 -0
  88. package/dist/admin/components/dashboard/form-submissions-widget.svelte +71 -113
  89. package/dist/admin/components/dashboard/index.d.ts +4 -2
  90. package/dist/admin/components/dashboard/index.js +4 -2
  91. package/dist/admin/components/dashboard/orphaned-entries-notice.svelte +240 -0
  92. package/dist/admin/components/dashboard/orphaned-entries-notice.svelte.d.ts +13 -0
  93. package/dist/admin/components/dashboard/recent-activity.svelte +53 -75
  94. package/dist/admin/components/dashboard/recent-entries.svelte +94 -0
  95. package/dist/admin/components/dashboard/recent-entries.svelte.d.ts +18 -0
  96. package/dist/admin/components/dashboard/stat-card.svelte +2 -2
  97. package/dist/admin/components/dashboard/tip-of-the-day.svelte +109 -0
  98. package/dist/admin/components/dashboard/tip-of-the-day.svelte.d.ts +3 -0
  99. package/dist/admin/components/dashboard/welcome-header.svelte +45 -0
  100. package/dist/admin/components/dashboard/welcome-header.svelte.d.ts +3 -0
  101. package/dist/admin/components/fields/{array-field.svelte → blocks-field.svelte} +4 -4
  102. package/dist/admin/components/fields/{array-field.svelte.d.ts → blocks-field.svelte.d.ts} +5 -5
  103. package/dist/admin/components/fields/content-field.svelte +27 -0
  104. package/dist/admin/components/fields/content-field.svelte.d.ts +31 -0
  105. package/dist/admin/components/fields/field-renderer.svelte +9 -7
  106. package/dist/admin/components/fields/image-field.svelte +2 -2
  107. package/dist/admin/components/fields/media-field.svelte +2 -2
  108. package/dist/admin/components/fields/seo-field.svelte +205 -25
  109. package/dist/admin/components/fields/simple-array-field.svelte +289 -0
  110. package/dist/admin/components/fields/simple-array-field.svelte.d.ts +30 -0
  111. package/dist/admin/components/fields/slug-field.svelte +3 -2
  112. package/dist/admin/components/fields/standalone-field-renderer.svelte +148 -0
  113. package/dist/admin/components/fields/standalone-field-renderer.svelte.d.ts +9 -0
  114. package/dist/admin/components/fields/text-field-wrapper.svelte +147 -3
  115. package/dist/admin/components/fields/text-field-wrapper.svelte.d.ts +2 -2
  116. package/dist/admin/components/fields/url-field.svelte +5 -4
  117. package/dist/admin/components/layout/app-sidebar.svelte +27 -24
  118. package/dist/admin/components/layout/lang.d.ts +6 -0
  119. package/dist/admin/components/layout/lang.js +13 -1
  120. package/dist/admin/components/layout/layout-renderer.svelte +352 -0
  121. package/dist/admin/components/layout/layout-renderer.svelte.d.ts +14 -0
  122. package/dist/admin/components/layout/nav-breadcrumbs.svelte +4 -4
  123. package/dist/admin/components/layout/nav-collections.svelte +65 -36
  124. package/dist/admin/components/layout/nav-footer.svelte +38 -0
  125. package/dist/admin/components/layout/nav-footer.svelte.d.ts +3 -0
  126. package/dist/admin/components/layout/nav-forms.svelte +55 -30
  127. package/dist/admin/components/layout/nav-main.svelte +14 -52
  128. package/dist/admin/components/layout/nav-search.svelte +4 -3
  129. package/dist/admin/components/layout/nav-singletons.svelte +59 -17
  130. package/dist/admin/components/layout/nav-singletons.svelte.d.ts +17 -8
  131. package/dist/admin/components/layout/site-header.svelte +74 -13
  132. package/dist/admin/components/media/alt-input.svelte +32 -22
  133. package/dist/admin/components/media/bulk-action-bar.svelte +139 -150
  134. package/dist/admin/components/media/file/file-details.svelte +299 -217
  135. package/dist/admin/components/media/file/file-miniature.svelte +54 -41
  136. package/dist/admin/components/media/file/file-miniature.svelte.d.ts +1 -0
  137. package/dist/admin/components/media/file/file-preview.svelte +1 -1
  138. package/dist/admin/components/media/file-upload.svelte +24 -26
  139. package/dist/admin/components/media/files-list.svelte +112 -40
  140. package/dist/admin/components/media/files-list.svelte.d.ts +2 -0
  141. package/dist/admin/components/media/focal-point-input.svelte +122 -26
  142. package/dist/admin/components/media/media-library.svelte +127 -70
  143. package/dist/admin/components/media/media-search.svelte +6 -6
  144. package/dist/admin/components/media/media-sort.svelte +3 -1
  145. package/dist/admin/components/media/multi-file-summary.svelte +88 -68
  146. package/dist/admin/components/media/tag-combobox.svelte +141 -66
  147. package/dist/admin/components/media/tag-combobox.svelte.d.ts +1 -0
  148. package/dist/admin/components/media/tag-sidebar.svelte +139 -121
  149. package/dist/admin/components/tiptap/FigureNodeView.svelte +144 -15
  150. package/dist/admin/components/tiptap/InlineBlockNodeView.svelte +254 -0
  151. package/dist/admin/components/tiptap/InlineBlockNodeView.svelte.d.ts +4 -0
  152. package/dist/admin/components/tiptap/SlashCommandPopup.svelte +212 -0
  153. package/dist/admin/components/tiptap/SlashCommandPopup.svelte.d.ts +8 -0
  154. package/dist/admin/components/tiptap/content-editor.svelte +280 -0
  155. package/dist/admin/components/tiptap/content-editor.svelte.d.ts +9 -0
  156. package/dist/admin/components/tiptap/editor-toolbar.svelte +230 -0
  157. package/dist/admin/components/tiptap/editor-toolbar.svelte.d.ts +16 -0
  158. package/dist/admin/components/tiptap/heading-a11y-plugin.d.ts +2 -0
  159. package/dist/admin/components/tiptap/heading-a11y-plugin.js +67 -0
  160. package/dist/admin/components/tiptap/image-dialog.svelte +172 -11
  161. package/dist/admin/components/tiptap/inline-block-node.d.ts +19 -0
  162. package/dist/admin/components/tiptap/inline-block-node.js +98 -0
  163. package/dist/admin/components/tiptap/link-dialog.svelte +9 -4
  164. package/dist/admin/components/tiptap/slash-command.d.ts +17 -0
  165. package/dist/admin/components/tiptap/slash-command.js +181 -0
  166. package/dist/admin/components/tiptap/structured-content-utils.d.ts +21 -0
  167. package/dist/admin/components/tiptap/structured-content-utils.js +150 -0
  168. package/dist/admin/components/tiptap/tiptap-editor.svelte +18 -190
  169. package/dist/admin/email/invite-template.d.ts +8 -0
  170. package/dist/admin/email/invite-template.js +99 -0
  171. package/dist/admin/email/reset-password-template.d.ts +7 -0
  172. package/dist/admin/email/reset-password-template.js +96 -0
  173. package/dist/admin/remote/ai.remote.d.ts +1 -0
  174. package/dist/admin/remote/ai.remote.js +4 -1
  175. package/dist/admin/remote/entry.remote.d.ts +9 -0
  176. package/dist/admin/remote/entry.remote.js +58 -8
  177. package/dist/admin/remote/preview.remote.js +2 -1
  178. package/dist/admin/shared/password-schema.d.ts +5 -0
  179. package/dist/admin/shared/password-schema.js +10 -0
  180. package/dist/admin/state/content-language.svelte.d.ts +3 -0
  181. package/dist/admin/state/content-language.svelte.js +8 -0
  182. package/dist/admin/styles/admin.css +1530 -151
  183. package/dist/admin/utils/formatDate.d.ts +1 -0
  184. package/dist/admin/utils/formatDate.js +8 -0
  185. package/dist/admin/utils/roleLabel.d.ts +2 -0
  186. package/dist/admin/utils/roleLabel.js +13 -0
  187. package/dist/admin/utils/translationStatus.d.ts +17 -0
  188. package/dist/admin/utils/translationStatus.js +134 -0
  189. package/dist/ai-claude/index.d.ts +2 -0
  190. package/dist/ai-claude/index.js +56 -0
  191. package/dist/cms/runtime/api.d.ts +6 -1
  192. package/dist/cms/runtime/api.js +3 -0
  193. package/dist/cms/runtime/schemas.d.ts +9 -1
  194. package/dist/cms/runtime/schemas.js +8 -0
  195. package/dist/cms/runtime/types.d.ts +82 -10
  196. package/dist/cms/runtime/types.js +4 -0
  197. package/dist/components/ui/accordion/accordion.stories.svelte +39 -0
  198. package/dist/components/ui/accordion/accordion.stories.svelte.d.ts +27 -0
  199. package/dist/components/ui/alert/alert.stories.svelte +53 -0
  200. package/dist/components/ui/alert/alert.stories.svelte.d.ts +27 -0
  201. package/dist/components/ui/alert/alert.svelte +5 -0
  202. package/dist/components/ui/alert/alert.svelte.d.ts +9 -0
  203. package/dist/components/ui/avatar/avatar.stories.svelte +16 -0
  204. package/dist/components/ui/avatar/avatar.stories.svelte.d.ts +27 -0
  205. package/dist/components/ui/badge/badge.stories.svelte +33 -0
  206. package/dist/components/ui/badge/badge.stories.svelte.d.ts +27 -0
  207. package/dist/components/ui/breadcrumb/breadcrumb.stories.svelte +33 -0
  208. package/dist/components/ui/breadcrumb/breadcrumb.stories.svelte.d.ts +27 -0
  209. package/dist/components/ui/button/button.stories.svelte +43 -0
  210. package/dist/components/ui/button/button.stories.svelte.d.ts +27 -0
  211. package/dist/components/ui/button/button.svelte +1 -2
  212. package/dist/components/ui/button/button.svelte.d.ts +0 -3
  213. package/dist/components/ui/button-group/button-group-separator.svelte.d.ts +1 -1
  214. package/dist/components/ui/card/card.stories.svelte +42 -0
  215. package/dist/components/ui/card/card.stories.svelte.d.ts +27 -0
  216. package/dist/components/ui/command/command.stories.svelte +51 -0
  217. package/dist/components/ui/command/command.stories.svelte.d.ts +27 -0
  218. package/dist/components/ui/dialog/dialog.stories.svelte +29 -0
  219. package/dist/components/ui/dialog/dialog.stories.svelte.d.ts +27 -0
  220. package/dist/components/ui/field/field-label.svelte.d.ts +1 -1
  221. package/dist/components/ui/field/field.stories.svelte +21 -0
  222. package/dist/components/ui/field/field.stories.svelte.d.ts +27 -0
  223. package/dist/components/ui/input/input.stories.svelte +40 -0
  224. package/dist/components/ui/input/input.stories.svelte.d.ts +27 -0
  225. package/dist/components/ui/input/input.svelte +2 -4
  226. package/dist/components/ui/item/item-separator.svelte.d.ts +1 -1
  227. package/dist/components/ui/label/label.stories.svelte +20 -0
  228. package/dist/components/ui/label/label.stories.svelte.d.ts +27 -0
  229. package/dist/components/ui/popover/popover.stories.svelte +29 -0
  230. package/dist/components/ui/popover/popover.stories.svelte.d.ts +27 -0
  231. package/dist/components/ui/select/select-group-heading.svelte.d.ts +1 -1
  232. package/dist/components/ui/select/select.stories.svelte +23 -0
  233. package/dist/components/ui/select/select.stories.svelte.d.ts +27 -0
  234. package/dist/components/ui/separator/separator.stories.svelte +24 -0
  235. package/dist/components/ui/separator/separator.stories.svelte.d.ts +27 -0
  236. package/dist/components/ui/sheet/sheet.stories.svelte +29 -0
  237. package/dist/components/ui/sheet/sheet.stories.svelte.d.ts +27 -0
  238. package/dist/components/ui/sidebar/sidebar-group.svelte +3 -3
  239. package/dist/components/ui/sidebar/sidebar-group.svelte.d.ts +2 -2
  240. package/dist/components/ui/sidebar/sidebar-menu-button.svelte +28 -30
  241. package/dist/components/ui/sidebar/sidebar-menu-button.svelte.d.ts +7 -7
  242. package/dist/components/ui/sidebar/sidebar-separator.svelte.d.ts +1 -1
  243. package/dist/components/ui/sidebar/sidebar-trigger.svelte +4 -4
  244. package/dist/components/ui/sonner/sonner.stories.svelte +22 -0
  245. package/dist/components/ui/sonner/sonner.stories.svelte.d.ts +26 -0
  246. package/dist/components/ui/sonner/sonner.svelte +8 -2
  247. package/dist/components/ui/sonner/toast-demo.svelte +29 -0
  248. package/dist/components/ui/sonner/toast-demo.svelte.d.ts +6 -0
  249. package/dist/components/ui/textarea/textarea.stories.svelte +22 -0
  250. package/dist/components/ui/textarea/textarea.stories.svelte.d.ts +27 -0
  251. package/dist/components/ui/textarea/textarea.svelte +0 -2
  252. package/dist/components/ui/toggle/toggle.stories.svelte +22 -0
  253. package/dist/components/ui/toggle/toggle.stories.svelte.d.ts +27 -0
  254. package/dist/components/ui/toggle-group/toggle-group.stories.svelte +17 -0
  255. package/dist/components/ui/toggle-group/toggle-group.stories.svelte.d.ts +27 -0
  256. package/dist/components/ui/tooltip/tooltip.stories.svelte +26 -0
  257. package/dist/components/ui/tooltip/tooltip.stories.svelte.d.ts +27 -0
  258. package/dist/core/fields/fieldSchemaToTs.d.ts +1 -0
  259. package/dist/core/fields/fieldSchemaToTs.js +133 -1
  260. package/dist/core/fields/layoutUtils.d.ts +17 -0
  261. package/dist/core/fields/layoutUtils.js +149 -0
  262. package/dist/core/fields/structuredToHtml.d.ts +9 -0
  263. package/dist/core/fields/structuredToHtml.js +161 -0
  264. package/dist/core/server/entries/operations/create.js +2 -1
  265. package/dist/core/server/entries/operations/get.js +10 -7
  266. package/dist/core/server/entries/operations/update.d.ts +3 -0
  267. package/dist/core/server/entries/operations/update.js +30 -2
  268. package/dist/core/server/fields/queryStructuredContent.d.ts +15 -0
  269. package/dist/core/server/fields/queryStructuredContent.js +65 -0
  270. package/dist/core/server/fields/resolveImageFields.js +51 -2
  271. package/dist/core/server/fields/resolveRelationFields.js +2 -2
  272. package/dist/core/server/fields/resolveRichtextLinks.js +80 -13
  273. package/dist/core/server/fields/resolveUrlFields.js +57 -6
  274. package/dist/core/server/fields/slugResolver.d.ts +10 -0
  275. package/dist/core/server/fields/slugResolver.js +34 -0
  276. package/dist/core/server/generator/fields.js +15 -4
  277. package/dist/core/server/generator/generator.js +3 -2
  278. package/dist/db-postgres/index.js +10 -6
  279. package/dist/files-local/index.js +126 -64
  280. package/dist/server/auth.d.ts +5 -0
  281. package/dist/server/auth.js +12 -1
  282. package/dist/sveltekit/components/structured-content.svelte +204 -0
  283. package/dist/sveltekit/components/structured-content.svelte.d.ts +21 -0
  284. package/dist/sveltekit/config.d.ts +13 -3
  285. package/dist/sveltekit/index.d.ts +3 -0
  286. package/dist/sveltekit/index.js +3 -0
  287. package/dist/sveltekit/server/handle.js +1 -0
  288. package/dist/types/config.d.ts +3 -0
  289. package/dist/types/entries.d.ts +3 -0
  290. package/dist/types/fields.d.ts +19 -2
  291. package/dist/types/index.d.ts +2 -0
  292. package/dist/types/index.js +2 -0
  293. package/dist/types/layout.d.ts +54 -0
  294. package/dist/types/layout.js +6 -0
  295. package/dist/types/structured-content.d.ts +63 -0
  296. package/dist/types/structured-content.js +1 -0
  297. package/dist/updates/0.1.5/index.d.ts +2 -0
  298. package/dist/updates/0.1.5/index.js +18 -0
  299. package/dist/updates/0.2.0/index.d.ts +2 -0
  300. package/dist/updates/0.2.0/index.js +11 -0
  301. package/dist/updates/0.2.2/index.d.ts +2 -0
  302. package/dist/updates/0.2.2/index.js +13 -0
  303. package/dist/updates/0.5.0/index.d.ts +2 -0
  304. package/dist/updates/0.5.0/index.js +14 -0
  305. package/dist/updates/0.5.1/index.d.ts +2 -0
  306. package/dist/updates/0.5.1/index.js +17 -0
  307. package/dist/updates/index.js +6 -1
  308. package/package.json +16 -9
  309. package/dist/admin/components/dashboard/updates-banner.svelte +0 -170
  310. package/dist/admin/components/dashboard/updates-banner.svelte.d.ts +0 -3
package/CHANGELOG.md CHANGED
@@ -3,6 +3,89 @@
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.1 — 2026-02-24
7
+
8
+ Restore archived entries, dashboard redesign, translation fixes
9
+
10
+ ### Added
11
+ - Restore archived entries from collection list (single + bulk)
12
+ - Archived entry page: read-only with restore banner
13
+ - Dashboard: changelog modal, orphaned entries redesign, grid layout
14
+
15
+ ### Fixed
16
+ - Opening archived entry no longer returns 500 (getRawEntry now supports includeArchived)
17
+ - Translation flow: reactive status, switcher UX, dynamic ref, copyFrom crash, panel scroll
18
+ - False "Niezapisane zmiany" alert on entry load
19
+ - Hide translation dots for non-required empty fields
20
+
21
+ ## 0.5.0 — 2026-02-22
22
+
23
+ Frontend rendering for structured content
24
+
25
+ ### Added
26
+ - `StructuredContent` Svelte component for rendering structured content on frontend
27
+ - `structuredToHtml()` — convert structured content to HTML (RSS, email)
28
+ - Query helpers: `extractBlocks()`, `extractInlineBlocks()`, `extractText()`, `extractMediaRefs()`
29
+ - Media resolution in population pipeline for `content` field — figure/video nodes enriched with `_media`
30
+
31
+ ### Migration
32
+
33
+ ```sql
34
+ No migration needed. Import `StructuredContent` from `includio/sveltekit` to render content fields.
35
+ ```
36
+
37
+ ## 0.2.2 — 2026-02-21
38
+
39
+ Structured Content field (TipTap JSON)
40
+
41
+ ### Added
42
+ - New `content` field type — stores TipTap JSON instead of HTML
43
+ - Extracted shared editor toolbar component
44
+ - Content field link resolution in resolve pipeline
45
+
46
+ ### Migration
47
+
48
+ ```sql
49
+ No migration needed. Add type:"content" fields to collection/single configs. Existing richtext fields unchanged.
50
+ ```
51
+
52
+ ## 0.2.0 — 2026-02-21
53
+
54
+ Array→Blocks rename, new simple array field
55
+
56
+ ### Added
57
+ - Simple array field for flat lists (text, number, url)
58
+
59
+ ### Breaking
60
+ - type:"array" with objects renamed to type:"blocks". Update collection/single configs.
61
+
62
+ ### Migration
63
+
64
+ ```sql
65
+ Config-only: rename type:"array" to type:"blocks" in field definitions. Stored data unchanged.
66
+ ```
67
+
68
+ ## 0.1.5 — 2026-02-21
69
+
70
+ Simplified entry versioning
71
+
72
+ ### Added
73
+ - Auto-save now updates draft in-place instead of creating new versions
74
+ - Ctrl/Cmd+S shortcut for immediate save
75
+ - Simplified status badge — no version numbers, green dot for published
76
+ - Version history shows only meaningful changes with semantic grouping
77
+ - Cleaning migration removes duplicate versions with identical data
78
+
79
+ ### Fixed
80
+ - Auto-save no longer creates dozens of empty versions
81
+ - Pruning no longer deletes important versions to make room for empty ones
82
+
83
+ ### Migration
84
+
85
+ ```sql
86
+ Removes duplicate entry versions where data is identical to the previous version. Preserves published, scheduled, and latest draft versions.
87
+ ```
88
+
6
89
  ## 0.1.4 — 2026-02-19
7
90
 
8
91
  Build & reactivity fixes
package/ROADMAP.md CHANGED
@@ -53,34 +53,45 @@
53
53
  - [x] `[fix]` `[P0]` Prepack: remove dist/paraglide/.gitignore before publint (publish validation) <!-- files: package.json -->
54
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
55
 
56
- ## 0.2.0 — Plugin system
56
+ ## 0.2.1–0.5.0Hybrid 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.5.1 — Patches & dashboard
68
+
69
+ - [x] `[feature]` `[P1]` Restore archived entries — banner, read-only mode, list actions
70
+ - [x] `[feature]` `[P2]` Dashboard: changelog modal, orphaned entries redesign, grid layout
71
+ - [x] `[fix]` `[P1]` Translation flow — reactive status, switcher UX, dynamic ref, copyFrom crash, panel scroll
72
+ - [x] `[fix]` `[P1]` False "Niezapisane zmiany" on entry load
73
+ - [x] `[fix]` `[P2]` Hide translation dots for non-required empty fields
74
+
75
+ ## 0.6.0 — Plugin system _(deferred from 0.2.0)_
57
76
 
58
77
  - [ ] `[feature]` `[P0]` Wire plugin hooks into CRUD operations (before/afterCreate, Update, Delete) <!-- files: src/lib/types/plugins.ts, src/lib/core/server/entries/operations/ -->
59
78
  - [ ] `[feature]` `[P0]` Plugin registration API — public surface for external plugins
60
79
  - [ ] `[chore]` `[P1]` Plugin system documentation
61
80
 
62
- ## 0.2.1 — CMS API improvements
63
-
64
- - [ ] `[feature]` `[P1]` Server-side pagination API (formalize 0.1.0 fix)
65
- - [ ] `[feature]` `[P1]` Improved type generation <!-- files: src/lib/core/server/generator/ -->
66
- - [ ] `[feature]` `[P1]` Proper filtering API (SQL-level, not JS post-query)
67
- - [ ] `[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 -->
68
- - [ ] `[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 -->
69
-
70
- ## 0.3.0 — Admin experience
81
+ ## 0.6.1 — Admin experience
71
82
 
72
83
  - [ ] `[feature]` `[P1]` Admin overlay — built-in admin bar on site (quick edit, preview, audit)
73
84
  - [ ] `[feature]` `[P1]` Media gallery virtualization/pagination <!-- files: src/lib/admin/components/media/files-list.svelte -->
74
85
  - [ ] `[feature]` `[P2]` Image styles UI — preview generated variants in editor
75
86
 
76
- ## 0.3.1 — SEO module
87
+ ## 0.7.0 — SEO module
77
88
 
78
89
  - [ ] `[feature]` `[P1]` SERP preview + character limits for title/description <!-- files: src/lib/admin/components/fields/seo-field.svelte -->
79
90
  - [ ] `[feature]` `[P1]` Global SEO settings
80
91
  - [ ] `[feature]` `[P1]` Dedicated frontend SEO components <!-- files: src/lib/sveltekit/components/seo.svelte -->
81
92
  - [ ] `[feature]` `[P2]` Sitemap generation
82
93
 
83
- ## 0.4.0 — WCAG/ATAG compliance
94
+ ## 0.8.0 — WCAG/ATAG compliance
84
95
 
85
96
  - [ ] `[chore]` `[P0]` Full WCAG/ATAG audit
86
97
  - [ ] `[feature]` `[P0]` Accessibility rework based on audit findings
@@ -96,8 +107,10 @@
96
107
 
97
108
  ## Backlog
98
109
 
110
+ - [ ] `[feature]` `[P1]` Server-side pagination API (formalize 0.1.0 fix)
111
+ - [ ] `[feature]` `[P1]` Improved type generation <!-- files: src/lib/core/server/generator/ -->
112
+ - [ ] `[feature]` `[P1]` Proper filtering API (SQL-level, not JS post-query)
99
113
  - [ ] `[feature]` `[P1]` Ban/unban UI — reason + expiry, `banUser`/`unbanUser` <!-- files: src/lib/admin/client/users/ban-user-dialog.svelte -->
100
114
  - [ ] `[feature]` `[P1]` Impersonation UI — impersonate/stop bar <!-- files: src/lib/admin/client/users/impersonation-bar.svelte -->
101
- - [ ] `[feature]` `[P2]` Alternative richtext editor — Word-like mode, single richtext field instead of blocks
102
115
  - [ ] `[chore]` `[P2]` Caching/performance layer (scope TBD)
103
116
  - [ ] `[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
  };