includio-cms 0.1.3 → 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 (313) hide show
  1. package/CHANGELOG.md +76 -0
  2. package/ROADMAP.md +23 -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 -256
  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/paraglide/.prettierignore +3 -0
  272. package/dist/paraglide/messages/_index.d.ts +36 -0
  273. package/dist/paraglide/messages/_index.js +72 -0
  274. package/dist/paraglide/messages/en.d.ts +5 -0
  275. package/dist/paraglide/messages/en.js +14 -0
  276. package/dist/paraglide/messages/pl.d.ts +5 -0
  277. package/dist/paraglide/messages/pl.js +14 -0
  278. package/dist/paraglide/messages.d.ts +2 -0
  279. package/dist/paraglide/messages.js +4 -0
  280. package/dist/paraglide/registry.d.ts +21 -0
  281. package/dist/paraglide/registry.js +31 -0
  282. package/dist/paraglide/runtime.d.ts +583 -0
  283. package/dist/paraglide/runtime.js +1402 -0
  284. package/dist/paraglide/server.d.ts +67 -0
  285. package/dist/paraglide/server.js +175 -0
  286. package/dist/server/auth.d.ts +5 -0
  287. package/dist/server/auth.js +12 -1
  288. package/dist/sveltekit/components/structured-content.svelte +204 -0
  289. package/dist/sveltekit/components/structured-content.svelte.d.ts +21 -0
  290. package/dist/sveltekit/config.d.ts +13 -3
  291. package/dist/sveltekit/index.d.ts +3 -0
  292. package/dist/sveltekit/index.js +3 -0
  293. package/dist/sveltekit/server/handle.js +1 -0
  294. package/dist/types/config.d.ts +3 -0
  295. package/dist/types/fields.d.ts +19 -2
  296. package/dist/types/index.d.ts +2 -0
  297. package/dist/types/index.js +2 -0
  298. package/dist/types/layout.d.ts +54 -0
  299. package/dist/types/layout.js +6 -0
  300. package/dist/types/structured-content.d.ts +63 -0
  301. package/dist/types/structured-content.js +1 -0
  302. package/dist/updates/0.1.4/index.d.ts +2 -0
  303. package/dist/updates/0.1.4/index.js +11 -0
  304. package/dist/updates/0.1.5/index.d.ts +2 -0
  305. package/dist/updates/0.1.5/index.js +18 -0
  306. package/dist/updates/0.2.0/index.d.ts +2 -0
  307. package/dist/updates/0.2.0/index.js +11 -0
  308. package/dist/updates/0.2.2/index.d.ts +2 -0
  309. package/dist/updates/0.2.2/index.js +13 -0
  310. package/dist/updates/0.5.0/index.d.ts +2 -0
  311. package/dist/updates/0.5.0/index.js +14 -0
  312. package/dist/updates/index.js +6 -1
  313. package/package.json +17 -10
@@ -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,8 +1,11 @@
1
1
  <script lang="ts">
2
- import AccessibilityHub from '../../components/dashboard/accessibility-hub.svelte';
2
+ import UpdatesBanner from '../../components/dashboard/updates-banner.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';
@@ -84,47 +87,58 @@
84
87
  };
85
88
  </script>
86
89
 
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 />
90
+ <main class="dash-main">
91
+ <UpdatesBanner />
90
92
 
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}
93
+ {#if !loadingOrphaned && orphanedEntries.length > 0}
94
+ <Alert.Root
95
+ variant="destructive"
96
+ class="mb-5 rounded-2xl border-orange-300/50 bg-orange-50 dark:border-orange-500/30 dark:bg-orange-950/60"
97
+ >
98
+ <AlertTriangleIcon class="text-orange-600 dark:text-orange-400" />
99
+ <Alert.Title class="text-orange-800 dark:text-orange-200">
100
+ {orphanedLang[interfaceLanguage.current].title} ({orphanedEntries.length})
101
+ </Alert.Title>
102
+ <Alert.Description class="text-orange-700 dark:text-orange-300">
103
+ <p class="mb-3">{orphanedLang[interfaceLanguage.current].description}</p>
104
+ <details class="mb-3">
105
+ <summary class="cursor-pointer text-sm font-medium">Slugs</summary>
106
+ <ul class="mt-2 list-inside list-disc text-sm">
107
+ {#each orphanedEntries as entry}
108
+ <li><code class="rounded bg-orange-200/50 px-1 dark:bg-orange-800/50">{entry.slug}</code></li>
109
+ {/each}
110
+ </ul>
111
+ </details>
112
+ <Button
113
+ variant="destructive"
114
+ size="sm"
115
+ onclick={deleteOrphaned}
116
+ disabled={deletingOrphaned}
117
+ >
118
+ <TrashIcon class="mr-1 h-4 w-4" />
119
+ {orphanedLang[interfaceLanguage.current].deleteBtn}
120
+ </Button>
121
+ </Alert.Description>
122
+ </Alert.Root>
123
+ {/if}
122
124
 
123
- <AccessibilityHub />
125
+ <WelcomeHeader />
124
126
 
125
- <div class="grid gap-6 lg:grid-cols-2">
126
- <FormSubmissionsWidget />
127
- <RecentActivity />
127
+ <div class="dashboard-grid">
128
+ <div class="dashboard-grid-main">
129
+ <div class="content-duo">
130
+ <RecentEntries />
131
+ <FormSubmissionsWidget />
132
+ </div>
133
+ <div style="margin-top:20px">
134
+ <RecentActivity />
135
+ </div>
136
+ </div>
137
+ <div class="dashboard-grid-aside">
138
+ <A11yGauge />
139
+ <div style="margin-top:20px">
140
+ <TipOfTheDay />
141
+ </div>
128
142
  </div>
129
143
  </div>
130
- </div>
144
+ </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,83 @@
1
+ <script lang="ts">
2
+ import Archive from '@tabler/icons-svelte/icons/archive';
3
+ import Trash from '@tabler/icons-svelte/icons/trash';
4
+ import X from '@tabler/icons-svelte/icons/x';
5
+ import Button from '../../../components/ui/button/button.svelte';
6
+ import { fly } from 'svelte/transition';
7
+ import { useInterfaceLanguage } from '../../state/interface-language.svelte.js';
8
+ import type { InterfaceLanguage } from '../../../types/languages.js';
9
+
10
+ type Props = {
11
+ selectedCount: number;
12
+ onArchive: () => void;
13
+ onDelete: () => void;
14
+ onClear: () => void;
15
+ };
16
+
17
+ let { selectedCount, onArchive, onDelete, onClear }: Props = $props();
18
+
19
+ const interfaceLanguage = useInterfaceLanguage();
20
+
21
+ const lang: Record<InterfaceLanguage, {
22
+ selected: (n: number) => string;
23
+ archive: string;
24
+ delete: string;
25
+ }> = {
26
+ en: {
27
+ selected: (n) => `${n} selected`,
28
+ archive: 'Archive',
29
+ delete: 'Delete'
30
+ },
31
+ pl: {
32
+ selected: (n) => `Zaznaczono: ${n}`,
33
+ archive: 'Archiwizuj',
34
+ delete: 'Usuń'
35
+ }
36
+ };
37
+
38
+ const t = $derived(lang[interfaceLanguage.current]);
39
+ </script>
40
+
41
+ {#if selectedCount > 0}
42
+ <div
43
+ class="fixed bottom-6 left-1/2 z-50 -translate-x-1/2"
44
+ transition:fly={{ y: 40, duration: 200 }}
45
+ role="status"
46
+ aria-live="polite"
47
+ >
48
+ <div
49
+ class="flex items-center gap-3 rounded-xl bg-plum-darker px-5 py-3 text-white shadow-xl"
50
+ >
51
+ <span class="text-sm font-medium">{t.selected(selectedCount)}</span>
52
+
53
+ <div class="h-5 w-px bg-white/20"></div>
54
+
55
+ <Button
56
+ variant="ghost"
57
+ size="sm"
58
+ class="text-white hover:bg-white/10 hover:text-white"
59
+ onclick={onArchive}
60
+ >
61
+ <Archive class="mr-1.5 size-3.5" />
62
+ {t.archive}
63
+ </Button>
64
+ <Button
65
+ variant="ghost"
66
+ size="sm"
67
+ class="text-white border border-white/20 hover:bg-white/10 hover:text-white"
68
+ onclick={onDelete}
69
+ >
70
+ <Trash class="mr-1.5 size-3.5" />
71
+ {t.delete}
72
+ </Button>
73
+
74
+ <button
75
+ class="ml-1 rounded-md p-1 text-white/60 hover:bg-white/10 hover:text-white"
76
+ onclick={onClear}
77
+ aria-label="Clear selection"
78
+ >
79
+ <X class="size-4" />
80
+ </button>
81
+ </div>
82
+ </div>
83
+ {/if}
@@ -0,0 +1,9 @@
1
+ type Props = {
2
+ selectedCount: number;
3
+ onArchive: () => void;
4
+ onDelete: () => void;
5
+ onClear: () => void;
6
+ };
7
+ declare const BulkActionsBar: import("svelte").Component<Props, {}, "">;
8
+ type BulkActionsBar = ReturnType<typeof BulkActionsBar>;
9
+ export default BulkActionsBar;