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
@@ -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
+ });
@@ -36,6 +36,7 @@ export declare const createEntry: import("@sveltejs/kit").RemoteCommand<{
36
36
  export declare const getRawEntry: import("@sveltejs/kit").RemoteQueryFunction<{
37
37
  id?: string | undefined;
38
38
  slug?: string | undefined;
39
+ includeArchived?: boolean | undefined;
39
40
  }, RawEntry | null>;
40
41
  export declare const getEntryForEntryPage: import("@sveltejs/kit").RemoteQueryFunction<string, RawEntry>;
41
42
  export declare const updateEntryVersionCommand: import("@sveltejs/kit").RemoteCommand<{
@@ -61,6 +62,14 @@ export declare const getEntryVersion: import("@sveltejs/kit").RemoteQueryFunctio
61
62
  id: string;
62
63
  language: string;
63
64
  }, import("../../types/entries.js").Entry | null>;
65
+ export declare const getRecentEntries: import("@sveltejs/kit").RemoteQueryFunction<number | undefined, {
66
+ entryId: string;
67
+ slug: string;
68
+ collectionLabel: Record<string, string>;
69
+ label: string | null;
70
+ status: "draft" | "published" | "scheduled";
71
+ updatedAt: Date;
72
+ }[]>;
64
73
  export declare const getRecentActivity: import("@sveltejs/kit").RemoteQueryFunction<number | undefined, {
65
74
  type: "entry_edit";
66
75
  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';
@@ -52,7 +52,8 @@ export const createEntry = command(createEntrySchema, async (input) => {
52
52
  });
53
53
  export const getRawEntry = query(z.object({
54
54
  id: z.string().uuid().optional(),
55
- slug: z.string().optional()
55
+ slug: z.string().optional(),
56
+ includeArchived: z.boolean().optional()
56
57
  }), async (input) => {
57
58
  return getRawEntryOperation(input);
58
59
  });
@@ -61,7 +62,7 @@ export const getEntryForEntryPage = query(z.string(), async (id) => {
61
62
  const isUUID = parsedIdentifier.success;
62
63
  if (isUUID) {
63
64
  const uuid = parsedIdentifier.data;
64
- return getRawEntryOrThrow({ id: uuid });
65
+ return getRawEntryOrThrow({ id: uuid, includeArchived: true });
65
66
  }
66
67
  else {
67
68
  // We assume this is singleton
@@ -70,7 +71,7 @@ export const getEntryForEntryPage = query(z.string(), async (id) => {
70
71
  if (!config) {
71
72
  throw new Error(`Singleton with slug "${slug}" not found`);
72
73
  }
73
- const entry = await getRawEntry({ slug });
74
+ const entry = await getRawEntry({ slug, includeArchived: true });
74
75
  if (entry) {
75
76
  return entry;
76
77
  }
@@ -80,7 +81,7 @@ export const getEntryForEntryPage = query(z.string(), async (id) => {
80
81
  slug: config.slug,
81
82
  type: 'singleton'
82
83
  });
83
- return await getRawEntryOrThrow({ slug });
84
+ return await getRawEntryOrThrow({ slug, includeArchived: true });
84
85
  }
85
86
  });
86
87
  const updateEntryVersionCommandSchema = z.object({
@@ -94,7 +95,7 @@ export const updateEntryVersionCommand = command(updateEntryVersionCommandSchema
94
95
  let result;
95
96
  switch (input.type) {
96
97
  case 'draft':
97
- result = await createEntryVersion(input, { skipValidation: true });
98
+ result = await upsertDraftVersion(input.entryId, input.data, { skipValidation: true });
98
99
  break;
99
100
  case 'published-now': {
100
101
  const existingEntry = await getDbEntryOrThrow({ id: input.entryId });
@@ -134,8 +135,12 @@ export const updateEntryVersionCommand = command(updateEntryVersionCommandSchema
134
135
  result = await unpublishEntry(input.entryId);
135
136
  break;
136
137
  }
137
- // Prune old draft versions after save
138
- await pruneOldDraftVersions(input.entryId);
138
+ // Prune old draft versions only after publish/schedule (drafts upsert in-place)
139
+ if (input.type !== 'draft') {
140
+ await pruneOldDraftVersions(input.entryId);
141
+ // Refresh cached entry so UI reactively updates (status badge, version history)
142
+ await getEntryForEntryPage(input.entryId).refresh();
143
+ }
139
144
  return result;
140
145
  });
141
146
  const updateEntryCommandSchema = z.object({
@@ -173,6 +178,51 @@ export const getEntryVersion = query(z.object({
173
178
  }), async (input) => {
174
179
  return getEntryVersionOperation(input);
175
180
  });
181
+ export const getRecentEntries = query(z.number().default(6), async (limit) => {
182
+ const entries = await getRawEntriesOperation({
183
+ orderBy: { column: 'updatedAt', direction: 'desc' },
184
+ limit
185
+ });
186
+ return entries.map((entry) => {
187
+ let config = null;
188
+ try {
189
+ config = getCMS().getBySlug(entry.slug);
190
+ }
191
+ catch {
192
+ // orphaned entry
193
+ }
194
+ const latestVersion = entry.versions[0];
195
+ let label = null;
196
+ if (config && config.type === 'collection' && config.entryAdminTitle && latestVersion) {
197
+ const titleData = latestVersion.data[config.entryAdminTitle];
198
+ if (titleData && typeof titleData === 'object') {
199
+ label = String(Object.values(titleData)[0] || '');
200
+ }
201
+ }
202
+ let collectionLabel = { pl: entry.slug, en: entry.slug };
203
+ if (config) {
204
+ if (config.type === 'collection' && config.labels) {
205
+ collectionLabel = config.labels.plural ?? config.labels.singular ?? collectionLabel;
206
+ }
207
+ else if (config.type === 'single' && config.label) {
208
+ collectionLabel = config.label;
209
+ }
210
+ }
211
+ const status = entry.publishedVersionId
212
+ ? 'published'
213
+ : entry.scheduledVersion
214
+ ? 'scheduled'
215
+ : 'draft';
216
+ return {
217
+ entryId: entry.id,
218
+ slug: entry.slug,
219
+ collectionLabel,
220
+ label,
221
+ status,
222
+ updatedAt: entry.updatedAt
223
+ };
224
+ });
225
+ });
176
226
  export const getRecentActivity = query(z.number().default(10), async (limit) => {
177
227
  const entries = await getRawEntriesOperation({});
178
228
  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
+ }
@@ -2,6 +2,7 @@ export declare const getContentLanguage: () => ContentLanguage, setContentLangua
2
2
  type _ContentLanguage = {
3
3
  all: string[];
4
4
  current: string;
5
+ referenceMode: boolean;
5
6
  };
6
7
  export declare class ContentLanguage {
7
8
  #private;
@@ -9,5 +10,7 @@ export declare class ContentLanguage {
9
10
  get all(): string[];
10
11
  get current(): _ContentLanguage["current"];
11
12
  set current(value: _ContentLanguage['current']);
13
+ get referenceMode(): boolean;
14
+ set referenceMode(value: boolean);
12
15
  }
13
16
  export {};
@@ -3,9 +3,11 @@ export const [getContentLanguage, setContentLanguage] = createContext();
3
3
  export class ContentLanguage {
4
4
  #all;
5
5
  #current;
6
+ #referenceMode;
6
7
  constructor(all, current) {
7
8
  this.#all = $state(all);
8
9
  this.#current = $state(current);
10
+ this.#referenceMode = $state(false);
9
11
  }
10
12
  get all() {
11
13
  return this.#all;
@@ -16,4 +18,10 @@ export class ContentLanguage {
16
18
  set current(value) {
17
19
  this.#current = value;
18
20
  }
21
+ get referenceMode() {
22
+ return this.#referenceMode;
23
+ }
24
+ set referenceMode(value) {
25
+ this.#referenceMode = value;
26
+ }
19
27
  }