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
@@ -0,0 +1,99 @@
1
+ const strings = {
2
+ en: {
3
+ subject: "You've been invited to AriaCMS",
4
+ heading: "You're invited!",
5
+ body: 'You\'ve been invited to manage content on <strong>{domain}</strong> as <strong>{role}</strong>.',
6
+ cta: 'Accept invitation',
7
+ expires: 'This link expires in 7 days.',
8
+ footer: "If you didn't expect this email, you can safely ignore it.",
9
+ roleLabels: { admin: 'Administrator', user: 'User' }
10
+ },
11
+ pl: {
12
+ subject: 'Zaproszenie do AriaCMS',
13
+ heading: 'Masz zaproszenie!',
14
+ body: 'Otrzymujesz zaproszenie do zarządzania treścią na <strong>{domain}</strong> w roli <strong>{role}</strong>.',
15
+ cta: 'Przyjmij zaproszenie',
16
+ expires: 'Link wygasa za 7 dni.',
17
+ footer: 'Jeśli nie spodziewasz się tego e-maila, możesz go zignorować.',
18
+ roleLabels: { admin: 'Administrator', user: 'Użytkownik' }
19
+ }
20
+ };
21
+ export function inviteEmailTemplate(params) {
22
+ const lang = params.lang === 'pl' ? 'pl' : 'en';
23
+ const t = strings[lang];
24
+ const roleLabel = t.roleLabels[params.role] ?? params.role;
25
+ const domain = new URL(params.inviteUrl).hostname;
26
+ const body = t.body.replace('{role}', roleLabel).replace('{domain}', domain);
27
+ const html = `<!DOCTYPE html>
28
+ <html lang="${lang}" dir="ltr">
29
+ <head>
30
+ <meta charset="utf-8">
31
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
32
+ <meta name="color-scheme" content="light dark">
33
+ <title>${t.subject}</title>
34
+ <style>
35
+ @media (prefers-color-scheme: dark) {
36
+ .email-body { background-color: #1A1A2E !important; }
37
+ .email-card { background-color: #2E2558 !important; }
38
+ .email-heading, .email-text { color: #EEEAF8 !important; }
39
+ .email-footer-text { color: #B8A9E8 !important; }
40
+ .email-separator { border-color: #463879 !important; }
41
+ }
42
+ </style>
43
+ </head>
44
+ <body style="margin:0;padding:0;background-color:#FAFAFE;font-family:'Plus Jakarta Sans',-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;">
45
+ <table role="presentation" width="100%" cellpadding="0" cellspacing="0" border="0">
46
+ <tr><td align="center" style="padding:32px 16px;" class="email-body">
47
+
48
+ <!-- Card -->
49
+ <table role="presentation" width="600" cellpadding="0" cellspacing="0" border="0" style="max-width:600px;width:100%;border-radius:12px;overflow:hidden;background-color:#ffffff;" class="email-card">
50
+
51
+ <!-- Header -->
52
+ <tr>
53
+ <td style="background-color:#5B4A9E;padding:28px 32px;text-align:center;">
54
+ <span style="font-size:22px;color:#ffffff;letter-spacing:1px;">
55
+ <strong style="font-weight:800;">Aria</strong><span style="font-weight:300;">CMS</span>
56
+ </span>
57
+ </td>
58
+ </tr>
59
+
60
+ <!-- Body -->
61
+ <tr>
62
+ <td style="padding:40px 32px 32px;">
63
+ <h1 style="margin:0 0 16px;font-size:28px;font-weight:800;color:#1A1A2E;letter-spacing:-0.5px;" class="email-heading">${t.heading}</h1>
64
+ <p style="margin:0 0 28px;font-size:16px;line-height:1.6;color:#1A1A2E;" class="email-text">${body}</p>
65
+
66
+ <!-- CTA -->
67
+ <table role="presentation" cellpadding="0" cellspacing="0" border="0">
68
+ <tr>
69
+ <td style="border-radius:8px;background-color:#5B4A9E;">
70
+ <a href="${params.inviteUrl}" target="_blank" style="display:inline-block;padding:14px 32px;font-size:16px;font-weight:600;color:#ffffff;text-decoration:none;border-radius:8px;">${t.cta}</a>
71
+ </td>
72
+ </tr>
73
+ </table>
74
+
75
+ <p style="margin:24px 0 0;font-size:14px;color:#555566;" class="email-text">${t.expires}</p>
76
+ </td>
77
+ </tr>
78
+
79
+ <!-- Footer -->
80
+ <tr>
81
+ <td style="padding:0 32px;">
82
+ <hr style="border:none;border-top:1px solid #E2DFF0;margin:0;" class="email-separator">
83
+ </td>
84
+ </tr>
85
+ <tr>
86
+ <td style="padding:20px 32px 28px;">
87
+ <p style="margin:0;font-size:13px;line-height:1.5;color:#8888A0;" class="email-footer-text">${t.footer}</p>
88
+ </td>
89
+ </tr>
90
+
91
+ </table>
92
+ <!-- /Card -->
93
+
94
+ </td></tr>
95
+ </table>
96
+ </body>
97
+ </html>`;
98
+ return { subject: t.subject, html };
99
+ }
@@ -0,0 +1,7 @@
1
+ export declare function resetPasswordEmailTemplate(params: {
2
+ resetUrl: string;
3
+ lang?: string;
4
+ }): {
5
+ subject: string;
6
+ html: string;
7
+ };
@@ -0,0 +1,96 @@
1
+ const strings = {
2
+ en: {
3
+ subject: 'Reset your password — AriaCMS',
4
+ heading: 'Reset your password',
5
+ body: 'Someone requested a password reset for your account on <strong>{domain}</strong>. Click the button below to set a new password.',
6
+ cta: 'Set new password',
7
+ expires: 'This link expires in 1 hour.',
8
+ footer: "If you didn't request this, you can safely ignore this email — your password won't change."
9
+ },
10
+ pl: {
11
+ subject: 'Zmiana hasła — AriaCMS',
12
+ heading: 'Zmień hasło',
13
+ body: 'Ktoś poprosił o zmianę hasła do Twojego konta na <strong>{domain}</strong>. Kliknij przycisk poniżej, żeby ustawić nowe hasło.',
14
+ cta: 'Ustaw nowe hasło',
15
+ expires: 'Link wygasa za 1 godzinę.',
16
+ footer: 'Jeśli to nie Ty — zignoruj tę wiadomość, hasło się nie zmieni.'
17
+ }
18
+ };
19
+ export function resetPasswordEmailTemplate(params) {
20
+ const lang = params.lang === 'pl' ? 'pl' : 'en';
21
+ const t = strings[lang];
22
+ const domain = new URL(params.resetUrl).hostname;
23
+ const body = t.body.replace('{domain}', domain);
24
+ const html = `<!DOCTYPE html>
25
+ <html lang="${lang}" dir="ltr">
26
+ <head>
27
+ <meta charset="utf-8">
28
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
29
+ <meta name="color-scheme" content="light dark">
30
+ <title>${t.subject}</title>
31
+ <style>
32
+ @media (prefers-color-scheme: dark) {
33
+ .email-body { background-color: #1A1A2E !important; }
34
+ .email-card { background-color: #2E2558 !important; }
35
+ .email-heading, .email-text { color: #EEEAF8 !important; }
36
+ .email-footer-text { color: #B8A9E8 !important; }
37
+ .email-separator { border-color: #463879 !important; }
38
+ }
39
+ </style>
40
+ </head>
41
+ <body style="margin:0;padding:0;background-color:#FAFAFE;font-family:'Plus Jakarta Sans',-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;">
42
+ <table role="presentation" width="100%" cellpadding="0" cellspacing="0" border="0">
43
+ <tr><td align="center" style="padding:32px 16px;" class="email-body">
44
+
45
+ <!-- Card -->
46
+ <table role="presentation" width="600" cellpadding="0" cellspacing="0" border="0" style="max-width:600px;width:100%;border-radius:12px;overflow:hidden;background-color:#ffffff;" class="email-card">
47
+
48
+ <!-- Header -->
49
+ <tr>
50
+ <td style="background-color:#5B4A9E;padding:28px 32px;text-align:center;">
51
+ <span style="font-size:22px;color:#ffffff;letter-spacing:1px;">
52
+ <strong style="font-weight:800;">Aria</strong><span style="font-weight:300;">CMS</span>
53
+ </span>
54
+ </td>
55
+ </tr>
56
+
57
+ <!-- Body -->
58
+ <tr>
59
+ <td style="padding:40px 32px 32px;">
60
+ <h1 style="margin:0 0 16px;font-size:28px;font-weight:800;color:#1A1A2E;letter-spacing:-0.5px;" class="email-heading">${t.heading}</h1>
61
+ <p style="margin:0 0 28px;font-size:16px;line-height:1.6;color:#1A1A2E;" class="email-text">${body}</p>
62
+
63
+ <!-- CTA -->
64
+ <table role="presentation" cellpadding="0" cellspacing="0" border="0">
65
+ <tr>
66
+ <td style="border-radius:8px;background-color:#5B4A9E;">
67
+ <a href="${params.resetUrl}" target="_blank" style="display:inline-block;padding:14px 32px;font-size:16px;font-weight:600;color:#ffffff;text-decoration:none;border-radius:8px;">${t.cta}</a>
68
+ </td>
69
+ </tr>
70
+ </table>
71
+
72
+ <p style="margin:24px 0 0;font-size:14px;color:#555566;" class="email-text">${t.expires}</p>
73
+ </td>
74
+ </tr>
75
+
76
+ <!-- Footer -->
77
+ <tr>
78
+ <td style="padding:0 32px;">
79
+ <hr style="border:none;border-top:1px solid #E2DFF0;margin:0;" class="email-separator">
80
+ </td>
81
+ </tr>
82
+ <tr>
83
+ <td style="padding:20px 32px 28px;">
84
+ <p style="margin:0;font-size:13px;line-height:1.5;color:#8888A0;" class="email-footer-text">${t.footer}</p>
85
+ </td>
86
+ </tr>
87
+
88
+ </table>
89
+ <!-- /Card -->
90
+
91
+ </td></tr>
92
+ </table>
93
+ </body>
94
+ </html>`;
95
+ return { subject: t.subject, html };
96
+ }
@@ -1,3 +1,4 @@
1
1
  export declare const generateAltText: import("@sveltejs/kit").RemoteCommand<{
2
2
  fileId: string;
3
3
  }, Promise<string>>;
4
+ export declare const isAIAvailable: import("@sveltejs/kit").RemoteQueryFunction<void, boolean>;
@@ -1,4 +1,4 @@
1
- import { command } from '$app/server';
1
+ import { command, query } from '$app/server';
2
2
  import { getCMS } from '../../core/cms.js';
3
3
  import z from 'zod';
4
4
  export const generateAltText = command(z.object({
@@ -6,3 +6,6 @@ export const generateAltText = command(z.object({
6
6
  }), async ({ fileId }) => {
7
7
  return getCMS().aiAdapter?.generateAltText(fileId) || '';
8
8
  });
9
+ export const isAIAvailable = query(async () => {
10
+ return getCMS().aiAdapter !== null;
11
+ });
@@ -61,6 +61,14 @@ export declare const getEntryVersion: import("@sveltejs/kit").RemoteQueryFunctio
61
61
  id: string;
62
62
  language: string;
63
63
  }, import("../../types/entries.js").Entry | null>;
64
+ export declare const getRecentEntries: import("@sveltejs/kit").RemoteQueryFunction<number | undefined, {
65
+ entryId: string;
66
+ slug: string;
67
+ collectionLabel: Record<string, string>;
68
+ label: string | null;
69
+ status: "draft" | "published" | "scheduled";
70
+ updatedAt: Date;
71
+ }[]>;
64
72
  export declare const getRecentActivity: import("@sveltejs/kit").RemoteQueryFunction<number | undefined, {
65
73
  type: "entry_edit";
66
74
  entryId: string;
@@ -2,7 +2,7 @@ import { command, query } from '$app/server';
2
2
  import { createEntry as createEntryOperation, createEntrySchema, createEntryVersion } from '../../core/server/entries/operations/create.js';
3
3
  import { getRawEntries as getRawEntriesOperation, countRawEntries as countRawEntriesOperation, getRawEntry as getRawEntryOperation, getRawEntryOrThrow, getDbEntry, getDbEntryOrThrow, getEntries as getEntriesOperation, getEntry as getEntryOperation, getEntryVersion as getEntryVersionOperation } from '../../core/server/entries/operations/get.js';
4
4
  import { getCMS } from '../../core/cms.js';
5
- import { pruneOldDraftVersions, unpublishEntry, updateEntry, updateEntrySchema, updateEntryVersionCommandTypes } from '../../core/server/entries/operations/update.js';
5
+ import { pruneOldDraftVersions, unpublishEntry, upsertDraftVersion, updateEntry, updateEntrySchema, updateEntryVersionCommandTypes } from '../../core/server/entries/operations/update.js';
6
6
  import z from 'zod';
7
7
  import { requireAuth } from './middleware/auth.js';
8
8
  import { entryStatuses } from '../../types/entries.js';
@@ -94,7 +94,7 @@ export const updateEntryVersionCommand = command(updateEntryVersionCommandSchema
94
94
  let result;
95
95
  switch (input.type) {
96
96
  case 'draft':
97
- result = await createEntryVersion(input, { skipValidation: true });
97
+ result = await upsertDraftVersion(input.entryId, input.data, { skipValidation: true });
98
98
  break;
99
99
  case 'published-now': {
100
100
  const existingEntry = await getDbEntryOrThrow({ id: input.entryId });
@@ -134,8 +134,12 @@ export const updateEntryVersionCommand = command(updateEntryVersionCommandSchema
134
134
  result = await unpublishEntry(input.entryId);
135
135
  break;
136
136
  }
137
- // Prune old draft versions after save
138
- await pruneOldDraftVersions(input.entryId);
137
+ // Prune old draft versions only after publish/schedule (drafts upsert in-place)
138
+ if (input.type !== 'draft') {
139
+ await pruneOldDraftVersions(input.entryId);
140
+ // Refresh cached entry so UI reactively updates (status badge, version history)
141
+ await getEntryForEntryPage(input.entryId).refresh();
142
+ }
139
143
  return result;
140
144
  });
141
145
  const updateEntryCommandSchema = z.object({
@@ -173,6 +177,51 @@ export const getEntryVersion = query(z.object({
173
177
  }), async (input) => {
174
178
  return getEntryVersionOperation(input);
175
179
  });
180
+ export const getRecentEntries = query(z.number().default(6), async (limit) => {
181
+ const entries = await getRawEntriesOperation({
182
+ orderBy: { column: 'updatedAt', direction: 'desc' },
183
+ limit
184
+ });
185
+ return entries.map((entry) => {
186
+ let config = null;
187
+ try {
188
+ config = getCMS().getBySlug(entry.slug);
189
+ }
190
+ catch {
191
+ // orphaned entry
192
+ }
193
+ const latestVersion = entry.versions[0];
194
+ let label = null;
195
+ if (config && config.type === 'collection' && config.entryAdminTitle && latestVersion) {
196
+ const titleData = latestVersion.data[config.entryAdminTitle];
197
+ if (titleData && typeof titleData === 'object') {
198
+ label = String(Object.values(titleData)[0] || '');
199
+ }
200
+ }
201
+ let collectionLabel = { pl: entry.slug, en: entry.slug };
202
+ if (config) {
203
+ if (config.type === 'collection' && config.labels) {
204
+ collectionLabel = config.labels.plural ?? config.labels.singular ?? collectionLabel;
205
+ }
206
+ else if (config.type === 'single' && config.label) {
207
+ collectionLabel = config.label;
208
+ }
209
+ }
210
+ const status = entry.publishedVersionId
211
+ ? 'published'
212
+ : entry.scheduledVersion
213
+ ? 'scheduled'
214
+ : 'draft';
215
+ return {
216
+ entryId: entry.id,
217
+ slug: entry.slug,
218
+ collectionLabel,
219
+ label,
220
+ status,
221
+ updatedAt: entry.updatedAt
222
+ };
223
+ });
224
+ });
176
225
  export const getRecentActivity = query(z.number().default(10), async (limit) => {
177
226
  const entries = await getRawEntriesOperation({});
178
227
  const activity = [];
@@ -1,6 +1,7 @@
1
1
  import { command } from '$app/server';
2
2
  import { getCMS } from '../../core/cms.js';
3
3
  import { populateEntryData } from '../../core/server/fields/populateEntry.js';
4
+ import { getFieldsFromConfig } from '../../core/fields/layoutUtils.js';
4
5
  import z from 'zod';
5
6
  const schema = z.object({
6
7
  data: z.record(z.string(), z.unknown()),
@@ -9,5 +10,5 @@ const schema = z.object({
9
10
  });
10
11
  export const populatePreviewData = command(schema, async ({ data, slug, language }) => {
11
12
  const config = getCMS().getBySlug(slug);
12
- return populateEntryData(data, config.fields, language);
13
+ return populateEntryData(data, getFieldsFromConfig(config), language);
13
14
  });
@@ -0,0 +1,5 @@
1
+ import { z } from 'zod';
2
+ export declare function passwordField(errors: {
3
+ minLength: string;
4
+ requirements: string;
5
+ }): z.ZodString;
@@ -0,0 +1,10 @@
1
+ import { z } from 'zod';
2
+ export function passwordField(errors) {
3
+ return z
4
+ .string()
5
+ .min(8, errors.minLength)
6
+ .max(255)
7
+ .regex(/[A-Z]/, errors.requirements)
8
+ .regex(/[0-9]/, errors.requirements)
9
+ .regex(/[^A-Za-z0-9]/, errors.requirements);
10
+ }