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,18 @@
1
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
2
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
3
+ $$bindings?: Bindings;
4
+ } & Exports;
5
+ (internal: unknown, props: {
6
+ $$events?: Events;
7
+ $$slots?: Slots;
8
+ }): Exports & {
9
+ $set?: any;
10
+ $on?: any;
11
+ };
12
+ z_$$bindings?: Bindings;
13
+ }
14
+ declare const RecentEntries: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
15
+ [evt: string]: CustomEvent<any>;
16
+ }, {}, {}, string>;
17
+ type RecentEntries = InstanceType<typeof RecentEntries>;
18
+ export default RecentEntries;
@@ -12,7 +12,7 @@
12
12
  let { label, value, trend, icon, variant = 'default' }: Props = $props();
13
13
 
14
14
  const variantClasses = {
15
- default: 'text-slate-900 dark:text-slate-100',
15
+ default: 'text-foreground',
16
16
  success: 'text-emerald-600 dark:text-emerald-400',
17
17
  warning: 'text-amber-600 dark:text-amber-400',
18
18
  danger: 'text-rose-600 dark:text-rose-400'
@@ -21,7 +21,7 @@
21
21
 
22
22
  <div class="flex items-center gap-3">
23
23
  {#if icon}
24
- <div class="rounded-lg bg-slate-100 p-2 dark:bg-slate-800">
24
+ <div class="rounded-lg bg-muted p-2">
25
25
  {@render icon()}
26
26
  </div>
27
27
  {/if}
@@ -0,0 +1,109 @@
1
+ <script lang="ts">
2
+ import { useInterfaceLanguage } from '../../state/interface-language.svelte.js';
3
+ import type { InterfaceLanguage } from '../../../types/languages.js';
4
+
5
+ const interfaceLanguage = useInterfaceLanguage();
6
+
7
+ interface Tip {
8
+ text: Record<InterfaceLanguage, string>;
9
+ link?: string;
10
+ }
11
+
12
+ const tips: Tip[] = [
13
+ {
14
+ text: {
15
+ pl: 'Dodaj opis do każdego zdjęcia — osoby niewidome używają czytników ekranu, które odczytują ten tekst zamiast obrazu.',
16
+ en: 'Add a description to every image — blind users rely on screen readers that read this text instead of the image.'
17
+ },
18
+ link: 'https://www.w3.org/WAI/tutorials/images/'
19
+ },
20
+ {
21
+ text: {
22
+ pl: 'Używaj nagłówków w kolejności (H1 → H2 → H3). Pomijanie poziomów dezorientuje użytkowników czytników ekranu.',
23
+ en: 'Use headings in order (H1 → H2 → H3). Skipping levels confuses screen reader users.'
24
+ },
25
+ link: 'https://www.w3.org/WAI/tutorials/page-structure/headings/'
26
+ },
27
+ {
28
+ text: {
29
+ pl: 'Linki powinny opisywać cel — „Czytaj artykuł" jest lepsze niż „Kliknij tutaj".',
30
+ en: 'Links should describe their destination — "Read the article" is better than "Click here".'
31
+ },
32
+ link: 'https://www.w3.org/WAI/tips/writing/#provide-informative-unique-page-titles'
33
+ },
34
+ {
35
+ text: {
36
+ pl: 'Kontrast tekstu powinien wynosić min. 4.5:1 (WCAG AA). Używaj jasnego tła z ciemnym tekstem lub odwrotnie.',
37
+ en: 'Text contrast should be at least 4.5:1 (WCAG AA). Use light backgrounds with dark text or vice versa.'
38
+ }
39
+ },
40
+ {
41
+ text: {
42
+ pl: 'Tabele danych potrzebują nagłówków (<th>) — bez nich czytnik ekranu nie powie, co oznacza dana komórka.',
43
+ en: 'Data tables need headers (<th>) — without them, screen readers can\'t tell what each cell means.'
44
+ }
45
+ },
46
+ {
47
+ text: {
48
+ pl: 'Formularze powinny mieć etykiety (<label>) powiązane z polami. Placeholder nie zastępuje etykiety.',
49
+ en: 'Form fields should have associated labels. Placeholder text is not a replacement for labels.'
50
+ }
51
+ },
52
+ {
53
+ text: {
54
+ pl: 'Treść powinna być zrozumiała dla jak najszerszego grona odbiorców. Unikaj żargonu i skomplikowanych zdań.',
55
+ en: 'Content should be understandable by the widest audience possible. Avoid jargon and complex sentences.'
56
+ }
57
+ },
58
+ {
59
+ text: {
60
+ pl: 'Nie przekazuj informacji wyłącznie kolorem — osoby z daltonizmem mogą ich nie rozróżnić. Dodaj ikonę lub tekst.',
61
+ en: 'Don\'t convey information through color alone — people with color blindness may not distinguish them. Add an icon or text.'
62
+ }
63
+ },
64
+ {
65
+ text: {
66
+ pl: 'Wideo powinno mieć napisy — pomagają osobom niesłyszącym i tym, którzy oglądają bez dźwięku.',
67
+ en: 'Videos should have captions — they help deaf users and those watching without sound.'
68
+ }
69
+ },
70
+ {
71
+ text: {
72
+ pl: 'Język strony powinien być ustawiony w atrybucie lang. Pomaga to czytnikom ekranu poprawnie wymawiać treść.',
73
+ en: 'The page language should be set in the lang attribute. This helps screen readers pronounce content correctly.'
74
+ }
75
+ }
76
+ ];
77
+
78
+ function getDayOfYear(): number {
79
+ const now = new Date();
80
+ const start = new Date(now.getFullYear(), 0, 0);
81
+ const diff = now.getTime() - start.getTime();
82
+ return Math.floor(diff / (1000 * 60 * 60 * 24));
83
+ }
84
+
85
+ const tip = $derived(tips[getDayOfYear() % tips.length]);
86
+
87
+ const labelText: Record<InterfaceLanguage, string> = {
88
+ pl: 'Wskazówka dnia',
89
+ en: 'Tip of the day'
90
+ };
91
+
92
+ const learnMore: Record<InterfaceLanguage, string> = {
93
+ pl: 'Dowiedz się więcej →',
94
+ en: 'Learn more →'
95
+ };
96
+ </script>
97
+
98
+ <div class="dash-card dash-card--tip tip-card">
99
+ <div class="tip-card-label">
100
+ <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><path d="M9 18h6"/><path d="M10 22h4"/><path d="M12 2a7 7 0 0 0-4 12.7V17h8v-2.3A7 7 0 0 0 12 2z"/></svg>
101
+ {labelText[interfaceLanguage.current]}
102
+ </div>
103
+ <p class="tip-card-text">{tip.text[interfaceLanguage.current]}</p>
104
+ {#if tip.link}
105
+ <a href={tip.link} class="tip-card-link" target="_blank" rel="noopener noreferrer">
106
+ {learnMore[interfaceLanguage.current]}
107
+ </a>
108
+ {/if}
109
+ </div>
@@ -0,0 +1,3 @@
1
+ declare const TipOfTheDay: import("svelte").Component<Record<string, never>, {}, "">;
2
+ type TipOfTheDay = ReturnType<typeof TipOfTheDay>;
3
+ export default TipOfTheDay;
@@ -0,0 +1,45 @@
1
+ <script lang="ts">
2
+ import { authClient } from '../../auth-client.js';
3
+ import { useInterfaceLanguage } from '../../state/interface-language.svelte.js';
4
+ import type { InterfaceLanguage } from '../../../types/languages.js';
5
+
6
+ let session = authClient.useSession();
7
+ const interfaceLanguage = useInterfaceLanguage();
8
+
9
+ const firstName = $derived($session.data?.user?.name?.split(' ')[0] ?? '');
10
+
11
+ const lang: Record<InterfaceLanguage, { greeting: (name: string) => string }> = {
12
+ pl: {
13
+ greeting: (name) => {
14
+ const h = new Date().getHours();
15
+ if (h < 12) return `Dzień dobry, ${name}`;
16
+ if (h < 18) return `Cześć, ${name}`;
17
+ return `Dobry wieczór, ${name}`;
18
+ }
19
+ },
20
+ en: {
21
+ greeting: (name) => {
22
+ const h = new Date().getHours();
23
+ if (h < 12) return `Good morning, ${name}`;
24
+ if (h < 18) return `Good afternoon, ${name}`;
25
+ return `Good evening, ${name}`;
26
+ }
27
+ }
28
+ };
29
+
30
+ const formattedDate = $derived(
31
+ new Date().toLocaleDateString(interfaceLanguage.current === 'pl' ? 'pl-PL' : 'en-US', {
32
+ weekday: 'long',
33
+ year: 'numeric',
34
+ month: 'long',
35
+ day: 'numeric'
36
+ })
37
+ );
38
+ </script>
39
+
40
+ <section class="welcome-header" aria-label={interfaceLanguage.current === 'pl' ? 'Powitanie' : 'Welcome'}>
41
+ <div>
42
+ <h1 class="welcome-title">{lang[interfaceLanguage.current].greeting(firstName)}</h1>
43
+ <p class="welcome-date"><time datetime={new Date().toISOString().split('T')[0]}>{formattedDate}</time></p>
44
+ </div>
45
+ </section>
@@ -0,0 +1,3 @@
1
+ declare const WelcomeHeader: import("svelte").Component<Record<string, never>, {}, "">;
2
+ type WelcomeHeader = ReturnType<typeof WelcomeHeader>;
3
+ export default WelcomeHeader;
@@ -13,7 +13,7 @@
13
13
  } from 'sveltekit-superforms';
14
14
  import { joinPath, normalizePath } from '../../utils/objectPath.js';
15
15
  import type {
16
- ArrayField,
16
+ BlocksField,
17
17
  ObjectField as ObjectFieldType,
18
18
  ObjectFieldData
19
19
  } from '../../../types/fields.js';
@@ -46,7 +46,7 @@
46
46
  }
47
47
 
48
48
  type Props = {
49
- field: ArrayField;
49
+ field: BlocksField;
50
50
  form: SuperForm<T>;
51
51
  path: FormPathLeaves<T, ObjectFieldData[] | undefined>;
52
52
  focusedPath?: string | null;
@@ -295,7 +295,7 @@
295
295
  {#if objectField}
296
296
  <Accordion.Item value={index.toString()} class="border-0" data-depth={depth + 1}>
297
297
  <Accordion.Trigger
298
- class="items-center border px-4 text-base font-normal data-[state=open]:rounded-b-none dark:bg-slate-800/30 dark:hover:bg-slate-700/40 dark:border-white/[0.08]"
298
+ class="items-center border px-4 text-base font-normal data-[state=open]:rounded-b-none"
299
299
  >
300
300
  <div class="flex grow items-center justify-between gap-4">
301
301
  <div class="flex items-center gap-4">
@@ -353,7 +353,7 @@
353
353
  </div>
354
354
  </Accordion.Trigger>
355
355
  <Accordion.Content
356
- class="space-y-4 rounded-b-md border border-t-0 dark:bg-slate-900/30 dark:shadow-[inset_0_2px_4px_rgb(0_0_0/0.1)] dark:border-white/[0.08]"
356
+ class="space-y-4 rounded-b-md border border-t-0"
357
357
  style="padding: {Math.max(4, 16 - depth * 3)}px;"
358
358
  >
359
359
  {@const itemPath = joinPath(path, index)}
@@ -1,8 +1,8 @@
1
1
  import { type FormPathLeaves, type SuperForm } from 'sveltekit-superforms';
2
- import type { ArrayField, ObjectFieldData } from '../../../types/fields.js';
2
+ import type { BlocksField, ObjectFieldData } from '../../../types/fields.js';
3
3
  declare function $$render<T extends Record<string, unknown>>(): {
4
4
  props: {
5
- field: ArrayField;
5
+ field: BlocksField;
6
6
  form: SuperForm<T>;
7
7
  path: FormPathLeaves<T, ObjectFieldData[] | undefined>;
8
8
  focusedPath?: string | null;
@@ -28,6 +28,6 @@ interface $$IsomorphicComponent {
28
28
  <T extends Record<string, unknown>>(internal: unknown, props: ReturnType<__sveltets_Render<T>['props']> & {}): ReturnType<__sveltets_Render<T>['exports']>;
29
29
  z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
30
30
  }
31
- declare const ArrayField: $$IsomorphicComponent;
32
- type ArrayField<T extends Record<string, unknown>> = InstanceType<typeof ArrayField<T>>;
33
- export default ArrayField;
31
+ declare const BlocksField: $$IsomorphicComponent;
32
+ type BlocksField<T extends Record<string, unknown>> = InstanceType<typeof BlocksField<T>>;
33
+ export default BlocksField;
@@ -0,0 +1,27 @@
1
+ <script lang="ts" module>
2
+ type T = Record<string, unknown>;
3
+ </script>
4
+
5
+ <script lang="ts" generics="T extends Record<string, unknown>">
6
+ import {
7
+ formFieldProxy,
8
+ type FormFieldProxy,
9
+ type FormPathLeaves,
10
+ type SuperForm
11
+ } from 'sveltekit-superforms';
12
+ import ContentEditor from '../tiptap/content-editor.svelte';
13
+ import type { ContentField } from '../../../types/fields.js';
14
+ import type { StructuredContentDoc } from '../../../types/structured-content.js';
15
+
16
+ type Props = {
17
+ field: ContentField;
18
+ form: SuperForm<T>;
19
+ path: FormPathLeaves<T, StructuredContentDoc | undefined>;
20
+ };
21
+
22
+ let { field, form, path, ...props }: Props = $props();
23
+
24
+ const { value } = formFieldProxy(form, path) satisfies FormFieldProxy<StructuredContentDoc | undefined>;
25
+ </script>
26
+
27
+ <ContentEditor bind:value={$value} inlineBlocks={field.inlineBlocks} />
@@ -0,0 +1,31 @@
1
+ import { type FormPathLeaves, type SuperForm } from 'sveltekit-superforms';
2
+ import type { ContentField } from '../../../types/fields.js';
3
+ import type { StructuredContentDoc } from '../../../types/structured-content.js';
4
+ declare function $$render<T extends Record<string, unknown>>(): {
5
+ props: {
6
+ field: ContentField;
7
+ form: SuperForm<T>;
8
+ path: FormPathLeaves<T, StructuredContentDoc | undefined>;
9
+ };
10
+ exports: {};
11
+ bindings: "";
12
+ slots: {};
13
+ events: {};
14
+ };
15
+ declare class __sveltets_Render<T extends Record<string, unknown>> {
16
+ props(): ReturnType<typeof $$render<T>>['props'];
17
+ events(): ReturnType<typeof $$render<T>>['events'];
18
+ slots(): ReturnType<typeof $$render<T>>['slots'];
19
+ bindings(): "";
20
+ exports(): {};
21
+ }
22
+ interface $$IsomorphicComponent {
23
+ new <T extends Record<string, unknown>>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<T>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<T>['props']>, ReturnType<__sveltets_Render<T>['events']>, ReturnType<__sveltets_Render<T>['slots']>> & {
24
+ $$bindings?: ReturnType<__sveltets_Render<T>['bindings']>;
25
+ } & ReturnType<__sveltets_Render<T>['exports']>;
26
+ <T extends Record<string, unknown>>(internal: unknown, props: ReturnType<__sveltets_Render<T>['props']> & {}): ReturnType<__sveltets_Render<T>['exports']>;
27
+ z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
28
+ }
29
+ declare const ContentField: $$IsomorphicComponent;
30
+ type ContentField<T extends Record<string, unknown>> = InstanceType<typeof ContentField<T>>;
31
+ export default ContentField;
@@ -32,13 +32,13 @@
32
32
 
33
33
  const interfaceLanguage = useInterfaceLanguage();
34
34
 
35
- const fieldsWithNoDescription: FieldType[] = ['boolean', 'object', 'array', 'seo'];
36
- const fieldsWithNoLabel: FieldType[] = ['boolean', 'object', 'array', 'seo'];
35
+ const fieldsWithNoDescription: FieldType[] = ['boolean', 'object', 'blocks', 'seo'];
36
+ const fieldsWithNoLabel: FieldType[] = ['boolean', 'object', 'blocks', 'seo'];
37
37
 
38
- const fieldsWithAlternativeDescription: FieldType[] = ['image', 'media', 'object', 'array'];
38
+ const fieldsWithAlternativeDescription: FieldType[] = ['image', 'media', 'object', 'blocks'];
39
39
 
40
- function isTextField(field: Field): field is Extract<Field, { type: 'text' | 'richtext' }> {
41
- return ['text', 'richtext'].includes(field.type);
40
+ function isTextField(field: Field): field is Extract<Field, { type: 'text' | 'richtext' | 'content' }> {
41
+ return ['text', 'richtext', 'content'].includes(field.type);
42
42
  }
43
43
 
44
44
  function isRadioField(field: Field): field is Extract<Field, { type: 'radio' }> {
@@ -106,7 +106,7 @@
106
106
  {#snippet children({ props })}
107
107
  <div class="space-y-2">
108
108
  {#if field.label && !fieldsWithNoLabel.includes(field.type)}
109
- <RequiredLabel required={field.required} class={field.type === 'array' ? 'text-lg font-medium' : ''}>
109
+ <RequiredLabel required={field.required} class={field.type === 'blocks' ? 'text-lg font-medium' : ''}>
110
110
  {getLocalizedLabel(field.label, interfaceLanguage.current)}
111
111
  </RequiredLabel>
112
112
  {/if}
@@ -121,8 +121,10 @@
121
121
  <LazyField loader={() => import('./media-field.svelte')} props={{ field, form, path, ...props }} skeletonClass="h-24" />
122
122
  {:else if field.type === 'file'}
123
123
  <LazyField loader={() => import('./file-field.svelte')} props={{ field, form, path, ...props }} skeletonClass="h-12" />
124
+ {:else if field.type === 'blocks'}
125
+ <LazyField loader={() => import('./blocks-field.svelte')} props={{ field, form, path, focusedPath, flashingPath, depth, ...props }} skeletonClass="h-20" />
124
126
  {:else if field.type === 'array'}
125
- <LazyField loader={() => import('./array-field.svelte')} props={{ field, form, path, focusedPath, flashingPath, depth, ...props }} skeletonClass="h-20" />
127
+ <LazyField loader={() => import('./simple-array-field.svelte')} props={{ field, form, path, ...props }} skeletonClass="h-12" />
126
128
  {:else if field.type === 'object'}
127
129
  <LazyField loader={() => import('./object-field.svelte')} props={{ field, form, path, objectFieldType, focusedPath, flashingPath, depth, ...props }} skeletonClass="h-20" />
128
130
  {:else if field.type === 'slug'}
@@ -108,7 +108,7 @@
108
108
  <div class="absolute inset-x-0 top-1/2 flex -translate-y-1/2 justify-between px-1 pointer-events-none">
109
109
  <button
110
110
  type="button"
111
- class="pointer-events-auto flex h-8 w-8 items-center justify-center rounded-full bg-white/80 backdrop-blur shadow-md transition hover:bg-white hover:scale-105 dark:bg-slate-900/80 dark:hover:bg-slate-900"
111
+ class="pointer-events-auto flex h-8 w-8 items-center justify-center rounded-full bg-white/80 backdrop-blur shadow-md transition hover:bg-white hover:scale-105 dark:bg-background/80 dark:hover:bg-background"
112
112
  onclick={(e) => {
113
113
  e.stopPropagation();
114
114
  currentIndex = currentIndex > 0 ? currentIndex - 1 : valueArr.length - 1;
@@ -118,7 +118,7 @@
118
118
  </button>
119
119
  <button
120
120
  type="button"
121
- class="pointer-events-auto flex h-8 w-8 items-center justify-center rounded-full bg-white/80 backdrop-blur shadow-md transition hover:bg-white hover:scale-105 dark:bg-slate-900/80 dark:hover:bg-slate-900"
121
+ class="pointer-events-auto flex h-8 w-8 items-center justify-center rounded-full bg-white/80 backdrop-blur shadow-md transition hover:bg-white hover:scale-105 dark:bg-background/80 dark:hover:bg-background"
122
122
  onclick={(e) => {
123
123
  e.stopPropagation();
124
124
  currentIndex = currentIndex < valueArr.length - 1 ? currentIndex + 1 : 0;
@@ -280,14 +280,14 @@
280
280
  <div class="absolute inset-x-0 top-1/2 flex -translate-y-1/2 justify-between px-1 pointer-events-none">
281
281
  <button
282
282
  type="button"
283
- class="pointer-events-auto flex h-8 w-8 items-center justify-center rounded-full bg-white/80 backdrop-blur shadow-md transition hover:bg-white hover:scale-105 dark:bg-slate-900/80 dark:hover:bg-slate-900"
283
+ class="pointer-events-auto flex h-8 w-8 items-center justify-center rounded-full bg-white/80 backdrop-blur shadow-md transition hover:bg-white hover:scale-105 dark:bg-background/80 dark:hover:bg-background"
284
284
  onclick={(e) => { e.stopPropagation(); currentIndex = currentIndex > 0 ? currentIndex - 1 : valueArr.length - 1; }}
285
285
  >
286
286
  <ChevronLeft class="h-5 w-5" />
287
287
  </button>
288
288
  <button
289
289
  type="button"
290
- class="pointer-events-auto flex h-8 w-8 items-center justify-center rounded-full bg-white/80 backdrop-blur shadow-md transition hover:bg-white hover:scale-105 dark:bg-slate-900/80 dark:hover:bg-slate-900"
290
+ class="pointer-events-auto flex h-8 w-8 items-center justify-center rounded-full bg-white/80 backdrop-blur shadow-md transition hover:bg-white hover:scale-105 dark:bg-background/80 dark:hover:bg-background"
291
291
  onclick={(e) => { e.stopPropagation(); currentIndex = currentIndex < valueArr.length - 1 ? currentIndex + 1 : 0; }}
292
292
  >
293
293
  <ChevronRight class="h-5 w-5" />