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
@@ -1,14 +1,10 @@
1
1
  <script lang="ts">
2
2
  import * as Card from '../../../components/ui/card/index.js';
3
- import { Badge } from '../../../components/ui/badge/index.js';
4
3
  import { accountLang } from './lang.js';
5
4
  import { useInterfaceLanguage } from '../../state/interface-language.svelte.js';
6
5
  import { toLocaleCode } from '../../utils/formatDate.js';
7
6
  import { authClient } from '../../auth-client.js';
8
7
  import { toast } from 'svelte-sonner';
9
- import DeviceDesktop from '@tabler/icons-svelte/icons/device-desktop';
10
- import DeviceMobile from '@tabler/icons-svelte/icons/device-mobile';
11
- import Loader2 from '@tabler/icons-svelte/icons/loader-2';
12
8
  import Button from '../../../components/ui/button/button.svelte';
13
9
  import { parseUserAgent } from '../../utils/parseUserAgent.js';
14
10
 
@@ -75,6 +71,10 @@
75
71
  minute: '2-digit'
76
72
  });
77
73
  }
74
+
75
+ function getDeviceLabel(ua: { browser: string; os: string }): string {
76
+ return `${ua.os} — ${ua.browser}`;
77
+ }
78
78
  </script>
79
79
 
80
80
  <Card.Root>
@@ -84,41 +84,43 @@
84
84
  <Card.Content>
85
85
  {#if loading}
86
86
  <div class="flex items-center justify-center py-8">
87
- <Loader2 class="text-muted-foreground size-6 animate-spin" />
87
+ <svg class="text-muted-foreground size-5 animate-spin" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 12a9 9 0 1 1-6.219-8.56"/></svg>
88
88
  </div>
89
89
  {:else}
90
- <div class="space-y-4">
90
+ <div>
91
91
  {#each sessions as session}
92
92
  {@const ua = parseUserAgent(session.userAgent)}
93
- <div
94
- class="flex items-center justify-between rounded-lg border p-4 {session.token ===
95
- currentSessionToken
96
- ? 'border-primary/30 bg-primary/5'
97
- : ''}"
98
- >
99
- <div class="flex items-center gap-4">
100
- <div class="text-muted-foreground">
101
- {#if ua.isMobile}
102
- <DeviceMobile class="size-6" />
103
- {:else}
104
- <DeviceDesktop class="size-6" />
93
+ {@const isCurrent = session.token === currentSessionToken}
94
+ <div class="acct-session-item">
95
+ <div class="acct-session-icon">
96
+ {#if ua.isMobile}
97
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="5" y="2" width="14" height="20" rx="2" ry="2"/><line x1="12" y1="18" x2="12.01" y2="18"/></svg>
98
+ {:else}
99
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="3" width="20" height="14" rx="2" ry="2"/><line x1="8" y1="21" x2="16" y2="21"/><line x1="12" y1="17" x2="12" y2="21"/></svg>
100
+ {/if}
101
+ </div>
102
+ <div class="min-w-0 flex-1">
103
+ <div class="flex items-center gap-2">
104
+ <span class="text-sm font-semibold">{getDeviceLabel(ua)}</span>
105
+ {#if isCurrent}
106
+ <span class="acct-session-badge">{lang.sessions.currentSession}</span>
105
107
  {/if}
106
108
  </div>
107
- <div>
108
- <div class="flex items-center gap-2">
109
- <span class="font-medium">{ua.browser} on {ua.os}</span>
110
- {#if session.token === currentSessionToken}
111
- <Badge variant="secondary">{lang.sessions.currentSession}</Badge>
112
- {/if}
113
- </div>
114
- <div class="text-muted-foreground text-sm">
115
- {session.ipAddress || 'Unknown IP'} &middot; {lang.sessions.lastActive}:{' '}
116
- {formatDate(session.updatedAt)}
117
- </div>
109
+ <div class="text-muted-foreground mt-0.5 flex items-center gap-1.5 text-xs">
110
+ {#if isCurrent}
111
+ <span class="acct-dot-online" aria-hidden="true"></span>
112
+ <span>{lang.sessions.online}</span>
113
+ <span aria-hidden="true">&middot;</span>
114
+ {/if}
115
+ {#if session.ipAddress}
116
+ <span>{session.ipAddress}</span>
117
+ <span aria-hidden="true">&middot;</span>
118
+ {/if}
119
+ <span>{formatDate(session.updatedAt)}</span>
118
120
  </div>
119
121
  </div>
120
- {#if session.token !== currentSessionToken}
121
- <Button variant="ghost" size="sm" class="text-destructive" onclick={() => revokeSession(session.token)}>
122
+ {#if !isCurrent}
123
+ <Button variant="ghost" size="sm" class="text-destructive shrink-0" onclick={() => revokeSession(session.token)}>
122
124
  {lang.sessions.revoke}
123
125
  </Button>
124
126
  {/if}
@@ -126,11 +128,10 @@
126
128
  {/each}
127
129
 
128
130
  {#if sessions.length > 1}
129
- <div class="border-t pt-4">
130
- <Button variant="ghost" size="sm" class="text-destructive" onclick={revokeAllSessions}>
131
+ <div class="acct-sessions-footer">
132
+ <Button variant="outline" class="border-destructive text-destructive hover:bg-error-bg" onclick={revokeAllSessions}>
131
133
  {lang.sessions.signOutEverywhere}
132
134
  </Button>
133
- <p class="text-muted-foreground mt-1 text-sm">{lang.sessions.signOutEverywhereDesc}</p>
134
135
  </div>
135
136
  {/if}
136
137
  </div>
@@ -12,12 +12,10 @@
12
12
  setContentLanguage(new ContentLanguage(languages, languages[0]));
13
13
  </script>
14
14
 
15
- <Sidebar.Provider
16
- style="--sidebar-width: calc(var(--spacing) * 72); --header-height: calc(var(--spacing) * 12);"
17
- >
18
- <AppSidebar variant="inset" />
15
+ <Sidebar.Provider style="--sidebar-width: 16rem; --header-height: calc(var(--spacing) * 13);">
16
+ <AppSidebar />
19
17
 
20
- <Sidebar.Inset class="h-[calc(100vh-1rem)] overflow-hidden">
18
+ <Sidebar.Inset class="h-screen overflow-hidden">
21
19
  <SiteHeader />
22
20
  <div class="flex grow flex-col overflow-auto">
23
21
  {@render children()}
@@ -4,6 +4,7 @@
4
4
  import { ModeWatcher } from 'mode-watcher';
5
5
  import { Toaster } from '../../../components/ui/sonner/index.js';
6
6
  import { MediaSort, setMediaSort } from '../../state/media-sort.svelte.js';
7
+ import AdminPreloader from './admin-preloader.svelte';
7
8
 
8
9
  setMediaSort(new MediaSort());
9
10
 
@@ -11,10 +12,10 @@
11
12
  </script>
12
13
 
13
14
  <ModeWatcher />
14
- <Toaster />
15
+ <Toaster richColors />
15
16
 
16
17
  <svelte:boundary>
17
- {#snippet pending()}Loading...{/snippet}
18
+ {#snippet pending()}<AdminPreloader />{/snippet}
18
19
 
19
20
  {@render children()}
20
21
  </svelte:boundary>
@@ -0,0 +1,36 @@
1
+ <script lang="ts">
2
+ import { fade } from 'svelte/transition';
3
+ </script>
4
+
5
+ <!-- Fullscreen preloader shown while admin shell loads -->
6
+ <div class="fixed inset-0 z-50 flex items-center justify-center bg-background" role="status" aria-live="polite" out:fade={{ duration: 300 }}>
7
+ <!-- Background orbs (reuse login orb classes) -->
8
+ <div class="fixed inset-0 overflow-hidden pointer-events-none" aria-hidden="true">
9
+ <div class="login-orb login-orb--1"></div>
10
+ <div class="login-orb login-orb--2"></div>
11
+ <div class="login-orb login-orb--3"></div>
12
+ </div>
13
+
14
+ <!-- Content -->
15
+ <div class="preloader-fade-in relative z-[1] flex flex-col items-center gap-8">
16
+ <!-- Logo -->
17
+ <div class="flex items-baseline gap-0.5" aria-label="AriaCMS">
18
+ <span class="text-primary text-[36px] leading-none font-extrabold max-[480px]:text-[28px]" aria-hidden="true">
19
+ Aria
20
+ </span>
21
+ <span class="text-primary text-[20px] leading-none font-light tracking-[0.15em] uppercase max-[480px]:text-[16px]" aria-hidden="true">
22
+ CMS
23
+ </span>
24
+ </div>
25
+
26
+ <!-- Spinner + text -->
27
+ <div class="flex flex-col items-center gap-5">
28
+ <div class="h-10 w-10 max-[480px]:h-8 max-[480px]:w-8" aria-hidden="true">
29
+ <div class="preloader-ring"></div>
30
+ </div>
31
+ <p class="text-muted-foreground text-[14px] font-medium tracking-[0.01em]">
32
+ Ładowanie…
33
+ </p>
34
+ </div>
35
+ </div>
36
+ </div>
@@ -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 AdminPreloader: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
15
+ [evt: string]: CustomEvent<any>;
16
+ }, {}, {}, string>;
17
+ type AdminPreloader = InstanceType<typeof AdminPreloader>;
18
+ export default AdminPreloader;
@@ -1,17 +1,16 @@
1
1
  <script lang="ts">
2
- import AccessibilityHub from '../../components/dashboard/accessibility-hub.svelte';
2
+ import OrphanedEntriesNotice from '../../components/dashboard/orphaned-entries-notice.svelte';
3
+ import WelcomeHeader from '../../components/dashboard/welcome-header.svelte';
4
+ import RecentEntries from '../../components/dashboard/recent-entries.svelte';
3
5
  import FormSubmissionsWidget from '../../components/dashboard/form-submissions-widget.svelte';
4
6
  import RecentActivity from '../../components/dashboard/recent-activity.svelte';
5
- import UpdatesBanner from '../../components/dashboard/updates-banner.svelte';
7
+ import A11yGauge from '../../components/dashboard/a11y-gauge.svelte';
8
+ import TipOfTheDay from '../../components/dashboard/tip-of-the-day.svelte';
6
9
  import { sidebarLang } from '../../components/layout/lang.js';
7
10
  import { getBreadcrumbs } from '../../state/breadcrumbs.svelte.js';
8
11
  import { useInterfaceLanguage } from '../../state/interface-language.svelte.js';
9
- import * as Alert from '../../../components/ui/alert/index.js';
10
- import { Button } from '../../../components/ui/button/index.js';
11
12
 
12
13
  import type { InterfaceLanguage } from '../../../types/languages.js';
13
- import AlertTriangleIcon from '@tabler/icons-svelte/icons/alert-triangle';
14
- import TrashIcon from '@tabler/icons-svelte/icons/trash';
15
14
 
16
15
  type OrphanedEntry = { id: string; slug: string; createdAt: string };
17
16
 
@@ -36,7 +35,11 @@
36
35
  }
37
36
 
38
37
  async function deleteOrphaned() {
39
- if (!confirm(orphanedLang[interfaceLanguage.current].confirmDelete)) return;
38
+ const msg: Record<InterfaceLanguage, string> = {
39
+ pl: 'Czy na pewno chcesz usunąć te wpisy? Tej operacji nie można cofnąć.',
40
+ en: 'Are you sure you want to delete these entries? This cannot be undone.'
41
+ };
42
+ if (!confirm(msg[interfaceLanguage.current])) return;
40
43
 
41
44
  deletingOrphaned = true;
42
45
  try {
@@ -62,69 +65,34 @@
62
65
  }
63
66
  ];
64
67
  });
65
-
66
- const orphanedLang: Record<
67
- InterfaceLanguage,
68
- { title: string; description: string; deleteBtn: string; confirmDelete: string }
69
- > = {
70
- pl: {
71
- title: 'Znaleziono osirocone wpisy',
72
- description:
73
- 'W bazie danych znajdują się wpisy, których konfiguracja została usunięta. Zalecane jest ich usunięcie.',
74
- deleteBtn: 'Usuń osirocone wpisy',
75
- confirmDelete: 'Czy na pewno chcesz usunąć wszystkie osirocone wpisy? Ta operacja jest nieodwracalna.'
76
- },
77
- en: {
78
- title: 'Orphaned entries found',
79
- description:
80
- 'The database contains entries whose configuration has been removed. It is recommended to delete them.',
81
- deleteBtn: 'Delete orphaned entries',
82
- confirmDelete: 'Are you sure you want to delete all orphaned entries? This operation is irreversible.'
83
- }
84
- };
85
68
  </script>
86
69
 
87
- <div class="min-h-[calc(100vh-var(--header-height))] bg-slate-50 p-4 dark:bg-slate-950 md:p-6">
88
- <div class="mx-auto max-w-7xl space-y-6">
89
- <UpdatesBanner />
70
+ <main class="dash-main">
71
+ {#if !loadingOrphaned}
72
+ <OrphanedEntriesNotice
73
+ entries={orphanedEntries}
74
+ deleting={deletingOrphaned}
75
+ ondelete={deleteOrphaned}
76
+ />
77
+ {/if}
90
78
 
91
- {#if !loadingOrphaned && orphanedEntries.length > 0}
92
- <Alert.Root
93
- variant="destructive"
94
- class="rounded-2xl border-orange-300/50 bg-orange-50 dark:border-orange-500/30 dark:bg-orange-950/60"
95
- >
96
- <AlertTriangleIcon class="text-orange-600 dark:text-orange-400" />
97
- <Alert.Title class="text-orange-800 dark:text-orange-200">
98
- {orphanedLang[interfaceLanguage.current].title} ({orphanedEntries.length})
99
- </Alert.Title>
100
- <Alert.Description class="text-orange-700 dark:text-orange-300">
101
- <p class="mb-3">{orphanedLang[interfaceLanguage.current].description}</p>
102
- <details class="mb-3">
103
- <summary class="cursor-pointer text-sm font-medium">Slugs</summary>
104
- <ul class="mt-2 list-inside list-disc text-sm">
105
- {#each orphanedEntries as entry}
106
- <li><code class="rounded bg-orange-200/50 px-1 dark:bg-orange-800/50">{entry.slug}</code></li>
107
- {/each}
108
- </ul>
109
- </details>
110
- <Button
111
- variant="destructive"
112
- size="sm"
113
- onclick={deleteOrphaned}
114
- disabled={deletingOrphaned}
115
- >
116
- <TrashIcon class="mr-1 h-4 w-4" />
117
- {orphanedLang[interfaceLanguage.current].deleteBtn}
118
- </Button>
119
- </Alert.Description>
120
- </Alert.Root>
121
- {/if}
79
+ <WelcomeHeader />
122
80
 
123
- <AccessibilityHub />
124
-
125
- <div class="grid gap-6 lg:grid-cols-2">
126
- <FormSubmissionsWidget />
127
- <RecentActivity />
81
+ <div class="flex gap-5">
82
+ <div class="flex-1">
83
+ <div class="grid grid-cols-2 gap-5">
84
+ <RecentEntries />
85
+ <FormSubmissionsWidget />
86
+ </div>
87
+ <div class="mt-5">
88
+ <RecentActivity />
89
+ </div>
90
+ </div>
91
+ <div class="max-w-80 flex-1 shrink-0">
92
+ <A11yGauge />
93
+ <div class="mt-5">
94
+ <TipOfTheDay />
95
+ </div>
128
96
  </div>
129
97
  </div>
130
- </div>
98
+ </main>
@@ -0,0 +1,45 @@
1
+ <script lang="ts">
2
+ import { useInterfaceLanguage } from '../../state/interface-language.svelte.js';
3
+ import type { InterfaceLanguage } from '../../../types/languages.js';
4
+
5
+ type Props = {
6
+ warningCount: number;
7
+ };
8
+
9
+ let { warningCount }: Props = $props();
10
+
11
+ const interfaceLanguage = useInterfaceLanguage();
12
+
13
+ const lang: Record<InterfaceLanguage, {
14
+ ok: string;
15
+ warnings: (n: number) => string;
16
+ problems: (n: number) => string;
17
+ }> = {
18
+ en: {
19
+ ok: 'Compliant',
20
+ warnings: (n) => `${n} note${n === 1 ? '' : 's'}`,
21
+ problems: (n) => `${n} issue${n === 1 ? '' : 's'}`
22
+ },
23
+ pl: {
24
+ ok: 'Zgodny',
25
+ warnings: (n) => `${n} ${n === 1 ? 'uwaga' : n < 5 ? 'uwagi' : 'uwag'}`,
26
+ problems: (n) => `${n} ${n === 1 ? 'problem' : n < 5 ? 'problemy' : 'problemów'}`
27
+ }
28
+ };
29
+
30
+ const t = $derived(lang[interfaceLanguage.current]);
31
+ </script>
32
+
33
+ {#if warningCount === 0}
34
+ <span class="inline-flex items-center gap-1 text-xs text-success font-medium whitespace-nowrap">
35
+ <span aria-hidden="true">✓</span> {t.ok}
36
+ </span>
37
+ {:else if warningCount <= 2}
38
+ <span class="inline-flex items-center gap-1 text-xs text-warning font-medium whitespace-nowrap">
39
+ <span aria-hidden="true">⚠</span> {t.warnings(warningCount)}
40
+ </span>
41
+ {:else}
42
+ <span class="inline-flex items-center gap-1 text-xs text-destructive font-medium whitespace-nowrap">
43
+ <span aria-hidden="true">✗</span> {t.problems(warningCount)}
44
+ </span>
45
+ {/if}
@@ -0,0 +1,6 @@
1
+ type Props = {
2
+ warningCount: number;
3
+ };
4
+ declare const A11yScoreCell: import("svelte").Component<Props, {}, "">;
5
+ type A11yScoreCell = ReturnType<typeof A11yScoreCell>;
6
+ export default A11yScoreCell;
@@ -0,0 +1,100 @@
1
+ <script lang="ts">
2
+ import Archive from '@tabler/icons-svelte/icons/archive';
3
+ import ArchiveOff from '@tabler/icons-svelte/icons/archive-off';
4
+ import Trash from '@tabler/icons-svelte/icons/trash';
5
+ import X from '@tabler/icons-svelte/icons/x';
6
+ import Button from '../../../components/ui/button/button.svelte';
7
+ import { fly } from 'svelte/transition';
8
+ import { useInterfaceLanguage } from '../../state/interface-language.svelte.js';
9
+ import type { InterfaceLanguage } from '../../../types/languages.js';
10
+
11
+ type Props = {
12
+ selectedCount: number;
13
+ onArchive: () => void;
14
+ onDelete: () => void;
15
+ onClear: () => void;
16
+ onRestore?: () => void;
17
+ };
18
+
19
+ let { selectedCount, onArchive, onDelete, onClear, onRestore }: Props = $props();
20
+
21
+ const interfaceLanguage = useInterfaceLanguage();
22
+
23
+ const lang: Record<InterfaceLanguage, {
24
+ selected: (n: number) => string;
25
+ archive: string;
26
+ restore: string;
27
+ delete: string;
28
+ }> = {
29
+ en: {
30
+ selected: (n) => `${n} selected`,
31
+ archive: 'Archive',
32
+ restore: 'Restore',
33
+ delete: 'Delete'
34
+ },
35
+ pl: {
36
+ selected: (n) => `Zaznaczono: ${n}`,
37
+ archive: 'Archiwizuj',
38
+ restore: 'Przywróć',
39
+ delete: 'Usuń'
40
+ }
41
+ };
42
+
43
+ const t = $derived(lang[interfaceLanguage.current]);
44
+ </script>
45
+
46
+ {#if selectedCount > 0}
47
+ <div
48
+ class="fixed bottom-6 left-1/2 z-50 -translate-x-1/2"
49
+ transition:fly={{ y: 40, duration: 200 }}
50
+ role="status"
51
+ aria-live="polite"
52
+ >
53
+ <div
54
+ class="flex items-center gap-3 rounded-xl bg-plum-darker px-5 py-3 text-white shadow-xl"
55
+ >
56
+ <span class="text-sm font-medium">{t.selected(selectedCount)}</span>
57
+
58
+ <div class="h-5 w-px bg-white/20"></div>
59
+
60
+ {#if onRestore}
61
+ <Button
62
+ variant="ghost"
63
+ size="sm"
64
+ class="text-white hover:bg-white/10 hover:text-white"
65
+ onclick={onRestore}
66
+ >
67
+ <ArchiveOff class="mr-1.5 size-3.5" />
68
+ {t.restore}
69
+ </Button>
70
+ {:else}
71
+ <Button
72
+ variant="ghost"
73
+ size="sm"
74
+ class="text-white hover:bg-white/10 hover:text-white"
75
+ onclick={onArchive}
76
+ >
77
+ <Archive class="mr-1.5 size-3.5" />
78
+ {t.archive}
79
+ </Button>
80
+ {/if}
81
+ <Button
82
+ variant="ghost"
83
+ size="sm"
84
+ class="text-white border border-white/20 hover:bg-white/10 hover:text-white"
85
+ onclick={onDelete}
86
+ >
87
+ <Trash class="mr-1.5 size-3.5" />
88
+ {t.delete}
89
+ </Button>
90
+
91
+ <button
92
+ class="ml-1 rounded-md p-1 text-white/60 hover:bg-white/10 hover:text-white"
93
+ onclick={onClear}
94
+ aria-label="Clear selection"
95
+ >
96
+ <X class="size-4" />
97
+ </button>
98
+ </div>
99
+ </div>
100
+ {/if}
@@ -0,0 +1,10 @@
1
+ type Props = {
2
+ selectedCount: number;
3
+ onArchive: () => void;
4
+ onDelete: () => void;
5
+ onClear: () => void;
6
+ onRestore?: () => void;
7
+ };
8
+ declare const BulkActionsBar: import("svelte").Component<Props, {}, "">;
9
+ type BulkActionsBar = ReturnType<typeof BulkActionsBar>;
10
+ export default BulkActionsBar;