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.
- package/CHANGELOG.md +83 -0
- package/ROADMAP.md +26 -13
- package/dist/admin/api/accept-invite.js +1 -5
- package/dist/admin/api/invite.js +7 -16
- package/dist/admin/client/account/account-page.svelte +20 -50
- package/dist/admin/client/account/lang.d.ts +15 -23
- package/dist/admin/client/account/lang.js +51 -67
- package/dist/admin/client/account/preferences-section.svelte +26 -84
- package/dist/admin/client/account/profile-section.svelte +60 -40
- package/dist/admin/client/account/schema.d.ts +11 -3
- package/dist/admin/client/account/schema.js +25 -16
- package/dist/admin/client/account/security-section.svelte +139 -105
- package/dist/admin/client/account/sessions-section.svelte +35 -34
- package/dist/admin/client/admin/admin-after-login-layout-content.svelte +3 -5
- package/dist/admin/client/admin/admin-layout.svelte +3 -2
- package/dist/admin/client/admin/admin-preloader.svelte +36 -0
- package/dist/admin/client/admin/admin-preloader.svelte.d.ts +18 -0
- package/dist/admin/client/admin/dashboard-page.svelte +35 -67
- package/dist/admin/client/collection/a11y-score-cell.svelte +45 -0
- package/dist/admin/client/collection/a11y-score-cell.svelte.d.ts +6 -0
- package/dist/admin/client/collection/bulk-actions-bar.svelte +100 -0
- package/dist/admin/client/collection/bulk-actions-bar.svelte.d.ts +10 -0
- package/dist/admin/client/collection/collection-entries.svelte +277 -258
- package/dist/admin/client/collection/collection-view.svelte.d.ts +4 -3
- package/dist/admin/client/collection/collection-view.svelte.js +9 -5
- package/dist/admin/client/collection/collection.svelte +22 -12
- package/dist/admin/client/collection/data-table.svelte +50 -39
- package/dist/admin/client/collection/data-table.svelte.d.ts +1 -0
- package/dist/admin/client/collection/date-cell.svelte +7 -5
- package/dist/admin/client/collection/date-cell.svelte.d.ts +1 -1
- package/dist/admin/client/collection/empty-state.svelte +28 -0
- package/dist/admin/client/collection/empty-state.svelte.d.ts +9 -0
- package/dist/admin/client/collection/entry-link.svelte +10 -4
- package/dist/admin/client/collection/entry-link.svelte.d.ts +1 -0
- package/dist/admin/client/collection/grid-view.svelte +21 -23
- package/dist/admin/client/collection/grid-view.svelte.d.ts +1 -2
- package/dist/admin/client/collection/row-actions.svelte +69 -0
- package/dist/admin/client/collection/row-actions.svelte.d.ts +10 -0
- package/dist/admin/client/collection/status-badge.svelte +7 -8
- package/dist/admin/client/collection/table-pagination.svelte +122 -79
- package/dist/admin/client/collection/table-pagination.svelte.d.ts +1 -0
- package/dist/admin/client/collection/table-toolbar.svelte +108 -88
- package/dist/admin/client/collection/table-toolbar.svelte.d.ts +8 -9
- package/dist/admin/client/entry/entry-form.svelte +109 -1
- package/dist/admin/client/entry/entry-header.svelte +143 -37
- package/dist/admin/client/entry/entry-header.svelte.d.ts +8 -0
- package/dist/admin/client/entry/entry.svelte +272 -61
- package/dist/admin/client/entry/header/a11y-validator.d.ts +47 -0
- package/dist/admin/client/entry/header/a11y-validator.js +352 -0
- package/dist/admin/client/entry/header/publish-panel.svelte +531 -129
- package/dist/admin/client/entry/header/publish-panel.svelte.d.ts +4 -0
- package/dist/admin/client/entry/header/save-indicator.svelte +33 -23
- package/dist/admin/client/entry/header/schedule-popover.svelte +1 -1
- package/dist/admin/client/entry/header/status-badge.svelte +25 -118
- package/dist/admin/client/entry/header/version-history-sheet.svelte +322 -98
- package/dist/admin/client/form/form-submission/form-submission.svelte +271 -83
- package/dist/admin/client/form/form-submission/submission-field.svelte +12 -12
- package/dist/admin/client/form/form-submissions.svelte +421 -139
- package/dist/admin/client/form/submission-link.svelte +8 -2
- package/dist/admin/client/form/submission-link.svelte.d.ts +1 -0
- package/dist/admin/client/form/submission-status-badge.svelte +18 -4
- package/dist/admin/client/form/submission-status-badge.svelte.d.ts +1 -0
- package/dist/admin/client/login/lang.d.ts +32 -0
- package/dist/admin/client/login/lang.js +66 -2
- package/dist/admin/client/login/login-form.svelte +237 -95
- package/dist/admin/client/login/login-form.svelte.d.ts +2 -17
- package/dist/admin/client/login/login-page.svelte +34 -98
- package/dist/admin/client/login/reset-password-page.svelte +235 -0
- package/dist/admin/client/login/reset-password-page.svelte.d.ts +4 -0
- package/dist/admin/client/login/schema.d.ts +15 -0
- package/dist/admin/client/login/schema.js +21 -0
- package/dist/admin/client/users/accept-invite-page.svelte +166 -37
- package/dist/admin/client/users/create-user-dialog.svelte +15 -7
- package/dist/admin/client/users/delete-user-dialog.svelte +81 -16
- package/dist/admin/client/users/delete-user-dialog.svelte.d.ts +4 -1
- package/dist/admin/client/users/edit-user-dialog.svelte +3 -0
- package/dist/admin/client/users/invite-user-dialog.svelte +16 -3
- package/dist/admin/client/users/lang.d.ts +27 -0
- package/dist/admin/client/users/lang.js +64 -10
- package/dist/admin/client/users/pending-invitations.svelte +59 -23
- package/dist/admin/client/users/users-page.svelte +471 -72
- package/dist/admin/components/accessibility/accessibility-overview.svelte +2 -7
- package/dist/admin/components/dashboard/a11y-gauge.svelte +90 -0
- package/dist/admin/components/dashboard/a11y-gauge.svelte.d.ts +18 -0
- package/dist/admin/components/dashboard/accessibility-hub.svelte +13 -12
- package/dist/admin/components/dashboard/changelog-dialog.svelte +157 -0
- package/dist/admin/components/dashboard/changelog-dialog.svelte.d.ts +6 -0
- package/dist/admin/components/dashboard/form-submissions-widget.svelte +71 -113
- package/dist/admin/components/dashboard/index.d.ts +4 -2
- package/dist/admin/components/dashboard/index.js +4 -2
- package/dist/admin/components/dashboard/orphaned-entries-notice.svelte +240 -0
- package/dist/admin/components/dashboard/orphaned-entries-notice.svelte.d.ts +13 -0
- package/dist/admin/components/dashboard/recent-activity.svelte +53 -75
- package/dist/admin/components/dashboard/recent-entries.svelte +94 -0
- package/dist/admin/components/dashboard/recent-entries.svelte.d.ts +18 -0
- package/dist/admin/components/dashboard/stat-card.svelte +2 -2
- package/dist/admin/components/dashboard/tip-of-the-day.svelte +109 -0
- package/dist/admin/components/dashboard/tip-of-the-day.svelte.d.ts +3 -0
- package/dist/admin/components/dashboard/welcome-header.svelte +45 -0
- package/dist/admin/components/dashboard/welcome-header.svelte.d.ts +3 -0
- package/dist/admin/components/fields/{array-field.svelte → blocks-field.svelte} +4 -4
- package/dist/admin/components/fields/{array-field.svelte.d.ts → blocks-field.svelte.d.ts} +5 -5
- package/dist/admin/components/fields/content-field.svelte +27 -0
- package/dist/admin/components/fields/content-field.svelte.d.ts +31 -0
- package/dist/admin/components/fields/field-renderer.svelte +9 -7
- package/dist/admin/components/fields/image-field.svelte +2 -2
- package/dist/admin/components/fields/media-field.svelte +2 -2
- package/dist/admin/components/fields/seo-field.svelte +205 -25
- package/dist/admin/components/fields/simple-array-field.svelte +289 -0
- package/dist/admin/components/fields/simple-array-field.svelte.d.ts +30 -0
- package/dist/admin/components/fields/slug-field.svelte +3 -2
- package/dist/admin/components/fields/standalone-field-renderer.svelte +148 -0
- package/dist/admin/components/fields/standalone-field-renderer.svelte.d.ts +9 -0
- package/dist/admin/components/fields/text-field-wrapper.svelte +147 -3
- package/dist/admin/components/fields/text-field-wrapper.svelte.d.ts +2 -2
- package/dist/admin/components/fields/url-field.svelte +5 -4
- package/dist/admin/components/layout/app-sidebar.svelte +27 -24
- package/dist/admin/components/layout/lang.d.ts +6 -0
- package/dist/admin/components/layout/lang.js +13 -1
- package/dist/admin/components/layout/layout-renderer.svelte +352 -0
- package/dist/admin/components/layout/layout-renderer.svelte.d.ts +14 -0
- package/dist/admin/components/layout/nav-breadcrumbs.svelte +4 -4
- package/dist/admin/components/layout/nav-collections.svelte +65 -36
- package/dist/admin/components/layout/nav-footer.svelte +38 -0
- package/dist/admin/components/layout/nav-footer.svelte.d.ts +3 -0
- package/dist/admin/components/layout/nav-forms.svelte +55 -30
- package/dist/admin/components/layout/nav-main.svelte +14 -52
- package/dist/admin/components/layout/nav-search.svelte +4 -3
- package/dist/admin/components/layout/nav-singletons.svelte +59 -17
- package/dist/admin/components/layout/nav-singletons.svelte.d.ts +17 -8
- package/dist/admin/components/layout/site-header.svelte +74 -13
- package/dist/admin/components/media/alt-input.svelte +32 -22
- package/dist/admin/components/media/bulk-action-bar.svelte +139 -150
- package/dist/admin/components/media/file/file-details.svelte +299 -217
- package/dist/admin/components/media/file/file-miniature.svelte +54 -41
- package/dist/admin/components/media/file/file-miniature.svelte.d.ts +1 -0
- package/dist/admin/components/media/file/file-preview.svelte +1 -1
- package/dist/admin/components/media/file-upload.svelte +24 -26
- package/dist/admin/components/media/files-list.svelte +112 -40
- package/dist/admin/components/media/files-list.svelte.d.ts +2 -0
- package/dist/admin/components/media/focal-point-input.svelte +122 -26
- package/dist/admin/components/media/media-library.svelte +127 -70
- package/dist/admin/components/media/media-search.svelte +6 -6
- package/dist/admin/components/media/media-sort.svelte +3 -1
- package/dist/admin/components/media/multi-file-summary.svelte +88 -68
- package/dist/admin/components/media/tag-combobox.svelte +141 -66
- package/dist/admin/components/media/tag-combobox.svelte.d.ts +1 -0
- package/dist/admin/components/media/tag-sidebar.svelte +139 -121
- package/dist/admin/components/tiptap/FigureNodeView.svelte +144 -15
- package/dist/admin/components/tiptap/InlineBlockNodeView.svelte +254 -0
- package/dist/admin/components/tiptap/InlineBlockNodeView.svelte.d.ts +4 -0
- package/dist/admin/components/tiptap/SlashCommandPopup.svelte +212 -0
- package/dist/admin/components/tiptap/SlashCommandPopup.svelte.d.ts +8 -0
- package/dist/admin/components/tiptap/content-editor.svelte +280 -0
- package/dist/admin/components/tiptap/content-editor.svelte.d.ts +9 -0
- package/dist/admin/components/tiptap/editor-toolbar.svelte +230 -0
- package/dist/admin/components/tiptap/editor-toolbar.svelte.d.ts +16 -0
- package/dist/admin/components/tiptap/heading-a11y-plugin.d.ts +2 -0
- package/dist/admin/components/tiptap/heading-a11y-plugin.js +67 -0
- package/dist/admin/components/tiptap/image-dialog.svelte +172 -11
- package/dist/admin/components/tiptap/inline-block-node.d.ts +19 -0
- package/dist/admin/components/tiptap/inline-block-node.js +98 -0
- package/dist/admin/components/tiptap/link-dialog.svelte +9 -4
- package/dist/admin/components/tiptap/slash-command.d.ts +17 -0
- package/dist/admin/components/tiptap/slash-command.js +181 -0
- package/dist/admin/components/tiptap/structured-content-utils.d.ts +21 -0
- package/dist/admin/components/tiptap/structured-content-utils.js +150 -0
- package/dist/admin/components/tiptap/tiptap-editor.svelte +18 -190
- package/dist/admin/email/invite-template.d.ts +8 -0
- package/dist/admin/email/invite-template.js +99 -0
- package/dist/admin/email/reset-password-template.d.ts +7 -0
- package/dist/admin/email/reset-password-template.js +96 -0
- package/dist/admin/remote/ai.remote.d.ts +1 -0
- package/dist/admin/remote/ai.remote.js +4 -1
- package/dist/admin/remote/entry.remote.d.ts +9 -0
- package/dist/admin/remote/entry.remote.js +58 -8
- package/dist/admin/remote/preview.remote.js +2 -1
- package/dist/admin/shared/password-schema.d.ts +5 -0
- package/dist/admin/shared/password-schema.js +10 -0
- package/dist/admin/state/content-language.svelte.d.ts +3 -0
- package/dist/admin/state/content-language.svelte.js +8 -0
- package/dist/admin/styles/admin.css +1530 -151
- package/dist/admin/utils/formatDate.d.ts +1 -0
- package/dist/admin/utils/formatDate.js +8 -0
- package/dist/admin/utils/roleLabel.d.ts +2 -0
- package/dist/admin/utils/roleLabel.js +13 -0
- package/dist/admin/utils/translationStatus.d.ts +17 -0
- package/dist/admin/utils/translationStatus.js +134 -0
- package/dist/ai-claude/index.d.ts +2 -0
- package/dist/ai-claude/index.js +56 -0
- package/dist/cms/runtime/api.d.ts +6 -1
- package/dist/cms/runtime/api.js +3 -0
- package/dist/cms/runtime/schemas.d.ts +9 -1
- package/dist/cms/runtime/schemas.js +8 -0
- package/dist/cms/runtime/types.d.ts +82 -10
- package/dist/cms/runtime/types.js +4 -0
- package/dist/components/ui/accordion/accordion.stories.svelte +39 -0
- package/dist/components/ui/accordion/accordion.stories.svelte.d.ts +27 -0
- package/dist/components/ui/alert/alert.stories.svelte +53 -0
- package/dist/components/ui/alert/alert.stories.svelte.d.ts +27 -0
- package/dist/components/ui/alert/alert.svelte +5 -0
- package/dist/components/ui/alert/alert.svelte.d.ts +9 -0
- package/dist/components/ui/avatar/avatar.stories.svelte +16 -0
- package/dist/components/ui/avatar/avatar.stories.svelte.d.ts +27 -0
- package/dist/components/ui/badge/badge.stories.svelte +33 -0
- package/dist/components/ui/badge/badge.stories.svelte.d.ts +27 -0
- package/dist/components/ui/breadcrumb/breadcrumb.stories.svelte +33 -0
- package/dist/components/ui/breadcrumb/breadcrumb.stories.svelte.d.ts +27 -0
- package/dist/components/ui/button/button.stories.svelte +43 -0
- package/dist/components/ui/button/button.stories.svelte.d.ts +27 -0
- package/dist/components/ui/button/button.svelte +1 -2
- package/dist/components/ui/button/button.svelte.d.ts +0 -3
- package/dist/components/ui/button-group/button-group-separator.svelte.d.ts +1 -1
- package/dist/components/ui/card/card.stories.svelte +42 -0
- package/dist/components/ui/card/card.stories.svelte.d.ts +27 -0
- package/dist/components/ui/command/command.stories.svelte +51 -0
- package/dist/components/ui/command/command.stories.svelte.d.ts +27 -0
- package/dist/components/ui/dialog/dialog.stories.svelte +29 -0
- package/dist/components/ui/dialog/dialog.stories.svelte.d.ts +27 -0
- package/dist/components/ui/field/field-label.svelte.d.ts +1 -1
- package/dist/components/ui/field/field.stories.svelte +21 -0
- package/dist/components/ui/field/field.stories.svelte.d.ts +27 -0
- package/dist/components/ui/input/input.stories.svelte +40 -0
- package/dist/components/ui/input/input.stories.svelte.d.ts +27 -0
- package/dist/components/ui/input/input.svelte +2 -4
- package/dist/components/ui/item/item-separator.svelte.d.ts +1 -1
- package/dist/components/ui/label/label.stories.svelte +20 -0
- package/dist/components/ui/label/label.stories.svelte.d.ts +27 -0
- package/dist/components/ui/popover/popover.stories.svelte +29 -0
- package/dist/components/ui/popover/popover.stories.svelte.d.ts +27 -0
- package/dist/components/ui/select/select-group-heading.svelte.d.ts +1 -1
- package/dist/components/ui/select/select.stories.svelte +23 -0
- package/dist/components/ui/select/select.stories.svelte.d.ts +27 -0
- package/dist/components/ui/separator/separator.stories.svelte +24 -0
- package/dist/components/ui/separator/separator.stories.svelte.d.ts +27 -0
- package/dist/components/ui/sheet/sheet.stories.svelte +29 -0
- package/dist/components/ui/sheet/sheet.stories.svelte.d.ts +27 -0
- package/dist/components/ui/sidebar/sidebar-group.svelte +3 -3
- package/dist/components/ui/sidebar/sidebar-group.svelte.d.ts +2 -2
- package/dist/components/ui/sidebar/sidebar-menu-button.svelte +28 -30
- package/dist/components/ui/sidebar/sidebar-menu-button.svelte.d.ts +7 -7
- package/dist/components/ui/sidebar/sidebar-separator.svelte.d.ts +1 -1
- package/dist/components/ui/sidebar/sidebar-trigger.svelte +4 -4
- package/dist/components/ui/sonner/sonner.stories.svelte +22 -0
- package/dist/components/ui/sonner/sonner.stories.svelte.d.ts +26 -0
- package/dist/components/ui/sonner/sonner.svelte +8 -2
- package/dist/components/ui/sonner/toast-demo.svelte +29 -0
- package/dist/components/ui/sonner/toast-demo.svelte.d.ts +6 -0
- package/dist/components/ui/textarea/textarea.stories.svelte +22 -0
- package/dist/components/ui/textarea/textarea.stories.svelte.d.ts +27 -0
- package/dist/components/ui/textarea/textarea.svelte +0 -2
- package/dist/components/ui/toggle/toggle.stories.svelte +22 -0
- package/dist/components/ui/toggle/toggle.stories.svelte.d.ts +27 -0
- package/dist/components/ui/toggle-group/toggle-group.stories.svelte +17 -0
- package/dist/components/ui/toggle-group/toggle-group.stories.svelte.d.ts +27 -0
- package/dist/components/ui/tooltip/tooltip.stories.svelte +26 -0
- package/dist/components/ui/tooltip/tooltip.stories.svelte.d.ts +27 -0
- package/dist/core/fields/fieldSchemaToTs.d.ts +1 -0
- package/dist/core/fields/fieldSchemaToTs.js +133 -1
- package/dist/core/fields/layoutUtils.d.ts +17 -0
- package/dist/core/fields/layoutUtils.js +149 -0
- package/dist/core/fields/structuredToHtml.d.ts +9 -0
- package/dist/core/fields/structuredToHtml.js +161 -0
- package/dist/core/server/entries/operations/create.js +2 -1
- package/dist/core/server/entries/operations/get.js +10 -7
- package/dist/core/server/entries/operations/update.d.ts +3 -0
- package/dist/core/server/entries/operations/update.js +30 -2
- package/dist/core/server/fields/queryStructuredContent.d.ts +15 -0
- package/dist/core/server/fields/queryStructuredContent.js +65 -0
- package/dist/core/server/fields/resolveImageFields.js +51 -2
- package/dist/core/server/fields/resolveRelationFields.js +2 -2
- package/dist/core/server/fields/resolveRichtextLinks.js +80 -13
- package/dist/core/server/fields/resolveUrlFields.js +57 -6
- package/dist/core/server/fields/slugResolver.d.ts +10 -0
- package/dist/core/server/fields/slugResolver.js +34 -0
- package/dist/core/server/generator/fields.js +15 -4
- package/dist/core/server/generator/generator.js +3 -2
- package/dist/db-postgres/index.js +10 -6
- package/dist/files-local/index.js +126 -64
- package/dist/server/auth.d.ts +5 -0
- package/dist/server/auth.js +12 -1
- package/dist/sveltekit/components/structured-content.svelte +204 -0
- package/dist/sveltekit/components/structured-content.svelte.d.ts +21 -0
- package/dist/sveltekit/config.d.ts +13 -3
- package/dist/sveltekit/index.d.ts +3 -0
- package/dist/sveltekit/index.js +3 -0
- package/dist/sveltekit/server/handle.js +1 -0
- package/dist/types/config.d.ts +3 -0
- package/dist/types/entries.d.ts +3 -0
- package/dist/types/fields.d.ts +19 -2
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.js +2 -0
- package/dist/types/layout.d.ts +54 -0
- package/dist/types/layout.js +6 -0
- package/dist/types/structured-content.d.ts +63 -0
- package/dist/types/structured-content.js +1 -0
- package/dist/updates/0.1.5/index.d.ts +2 -0
- package/dist/updates/0.1.5/index.js +18 -0
- package/dist/updates/0.2.0/index.d.ts +2 -0
- package/dist/updates/0.2.0/index.js +11 -0
- package/dist/updates/0.2.2/index.d.ts +2 -0
- package/dist/updates/0.2.2/index.js +13 -0
- package/dist/updates/0.5.0/index.d.ts +2 -0
- package/dist/updates/0.5.0/index.js +14 -0
- package/dist/updates/0.5.1/index.d.ts +2 -0
- package/dist/updates/0.5.1/index.js +17 -0
- package/dist/updates/index.js +6 -1
- package/package.json +16 -9
- package/dist/admin/components/dashboard/updates-banner.svelte +0 -170
- 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,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,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
|
|
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
|
|
138
|
-
|
|
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
|
|
13
|
+
return populateEntryData(data, getFieldsFromConfig(config), language);
|
|
13
14
|
});
|
|
@@ -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
|
}
|