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,15 @@
1
1
  import type { SortingState } from '@tanstack/table-core';
2
+ import type { EntryStatus } from '../../../types/entries.js';
2
3
  export type ViewMode = 'list' | 'grid';
3
4
  export type DateFormat = 'relative' | 'absolute';
4
- export type ActiveTab = 'active' | 'archived';
5
+ export type StatusFilter = EntryStatus | 'all' | null;
5
6
  export interface CollectionViewState {
6
7
  viewMode: ViewMode;
7
8
  dateFormat: DateFormat;
8
9
  pageSize: number;
9
10
  sorting: SortingState;
10
11
  pageIndex: number;
11
- activeTab: ActiveTab;
12
+ statusFilter: StatusFilter;
12
13
  }
13
14
  export declare function createCollectionViewState(collectionSlug: string): {
14
15
  viewMode: ViewMode;
@@ -16,5 +17,5 @@ export declare function createCollectionViewState(collectionSlug: string): {
16
17
  pageSize: number;
17
18
  sorting: SortingState;
18
19
  pageIndex: number;
19
- activeTab: ActiveTab;
20
+ statusFilter: StatusFilter;
20
21
  };
@@ -4,7 +4,7 @@ const DEFAULT_STATE = {
4
4
  pageSize: 10,
5
5
  sorting: [],
6
6
  pageIndex: 0,
7
- activeTab: 'active'
7
+ statusFilter: null
8
8
  };
9
9
  function getStorageKey(collectionSlug) {
10
10
  return `includio-collection-${collectionSlug}-view`;
@@ -16,6 +16,10 @@ function loadState(collectionSlug) {
16
16
  const stored = localStorage.getItem(getStorageKey(collectionSlug));
17
17
  if (stored) {
18
18
  const parsed = JSON.parse(stored);
19
+ // Migration: drop old activeTab key
20
+ if ('activeTab' in parsed) {
21
+ delete parsed.activeTab;
22
+ }
19
23
  return { ...DEFAULT_STATE, ...parsed };
20
24
  }
21
25
  }
@@ -72,11 +76,11 @@ export function createCollectionViewState(collectionSlug) {
72
76
  set pageIndex(value) {
73
77
  state.pageIndex = value;
74
78
  },
75
- get activeTab() {
76
- return state.activeTab;
79
+ get statusFilter() {
80
+ return state.statusFilter;
77
81
  },
78
- set activeTab(value) {
79
- state.activeTab = value;
82
+ set statusFilter(value) {
83
+ state.statusFilter = value;
80
84
  state.pageIndex = 0;
81
85
  }
82
86
  };
@@ -1,6 +1,4 @@
1
1
  <script lang="ts">
2
- import Plus from '@tabler/icons-svelte/icons/plus';
3
- import Button from '../../../components/ui/button/button.svelte';
4
2
  import { goto } from '$app/navigation';
5
3
  import { getRemotes } from '../../context/remotes.js';
6
4
  import CollectionEntries from './collection-entries.svelte';
@@ -13,9 +11,9 @@
13
11
  const remotes = getRemotes();
14
12
  const interfaceLanguage = useInterfaceLanguage();
15
13
 
16
- const lang: Record<InterfaceLanguage, { add: string }> = {
17
- en: { add: 'Create new' },
18
- pl: { add: 'Dodaj' }
14
+ const lang: Record<InterfaceLanguage, { add: string; collections: string }> = {
15
+ en: { add: 'Create new', collections: 'Collections' },
16
+ pl: { add: 'Dodaj', collections: 'Kolekcje' }
19
17
  };
20
18
 
21
19
  type Props = {
@@ -39,7 +37,10 @@
39
37
  $effect(() => {
40
38
  breadcrumbs.state = [
41
39
  {
42
- label: entryCount !== null ? `${collectionLabel} (${entryCount})` : collectionLabel
40
+ label: lang[interfaceLanguage.current].collections
41
+ },
42
+ {
43
+ label: collectionLabel
43
44
  }
44
45
  ];
45
46
  });
@@ -51,10 +52,19 @@
51
52
  });
52
53
  </script>
53
54
 
54
- <div class="p-4 md:p-6">
55
- <div
56
- class="overflow-hidden rounded-2xl border border-slate-200/50 bg-white/80 shadow-lg backdrop-blur-xl dark:border-white/10 dark:bg-slate-900/60"
57
- >
58
- <CollectionEntries {collection} {onCreateEntry} addLabel={lang[interfaceLanguage.current].add} />
59
- </div>
55
+ <div class="p-5 pb-24 md:p-7">
56
+ <header class="mb-6">
57
+ <div class="mb-1 flex items-center gap-3">
58
+ <h1 class="text-foreground text-2xl font-bold">{collectionLabel}</h1>
59
+ {#if entryCount !== null}
60
+ <span
61
+ class="bg-muted text-muted-foreground inline-flex items-center justify-center rounded-full px-2.5 py-0.5 text-xs font-semibold"
62
+ >
63
+ {entryCount}
64
+ </span>
65
+ {/if}
66
+ </div>
67
+ </header>
68
+
69
+ <CollectionEntries {collection} {onCreateEntry} addLabel={lang[interfaceLanguage.current].add} />
60
70
  </div>
@@ -13,6 +13,8 @@
13
13
  } from '@tanstack/table-core';
14
14
  import { createSvelteTable, FlexRender } from '../../../components/ui/data-table/index.js';
15
15
  import * as Table from '../../../components/ui/table/index.js';
16
+ import { useInterfaceLanguage } from '../../state/interface-language.svelte.js';
17
+ import type { InterfaceLanguage } from '../../../types/languages.js';
16
18
 
17
19
  type DataTableProps<TData, TValue> = {
18
20
  columns: ColumnDef<TData, TValue>[];
@@ -32,6 +34,7 @@
32
34
  manualPagination?: boolean;
33
35
  pageCount?: number;
34
36
  rowCount?: number;
37
+ emptyMessage?: string;
35
38
  };
36
39
 
37
40
  let {
@@ -51,9 +54,17 @@
51
54
  tableRef,
52
55
  manualPagination: manualPaginationProp = false,
53
56
  pageCount: pageCountProp,
54
- rowCount: rowCountProp
57
+ rowCount: rowCountProp,
58
+ emptyMessage
55
59
  }: DataTableProps<TData, TValue> = $props();
56
60
 
61
+ const interfaceLanguage = useInterfaceLanguage();
62
+
63
+ const defaultEmptyMessages: Record<InterfaceLanguage, string> = {
64
+ en: 'No results.',
65
+ pl: 'Brak wyników.'
66
+ };
67
+
57
68
  const table = createSvelteTable({
58
69
  get data() {
59
70
  return data;
@@ -102,41 +113,41 @@
102
113
  });
103
114
  </script>
104
115
 
105
- <div class="overflow-hidden rounded-2xl">
106
- <Table.Root>
107
- <Table.Header>
108
- {#each table.getHeaderGroups() as headerGroup (headerGroup.id)}
109
- <Table.Row>
110
- {#each headerGroup.headers as header (header.id)}
111
- <Table.Head>
112
- {#if !header.isPlaceholder}
113
- <FlexRender
114
- content={header.column.columnDef.header}
115
- context={header.getContext()}
116
- />
117
- {/if}
118
- </Table.Head>
119
- {/each}
120
- </Table.Row>
121
- {/each}
122
- </Table.Header>
123
- <Table.Body>
124
- {#each table.getRowModel().rows as row (row.id)}
125
- <Table.Row
126
- data-state={row.getIsSelected() && 'selected'}
127
- class="hover:bg-slate-50 dark:hover:bg-slate-800/50"
128
- >
129
- {#each row.getVisibleCells() as cell (cell.id)}
130
- <Table.Cell>
131
- <FlexRender content={cell.column.columnDef.cell} context={cell.getContext()} />
132
- </Table.Cell>
133
- {/each}
134
- </Table.Row>
135
- {:else}
136
- <Table.Row>
137
- <Table.Cell colspan={columns.length} class="h-24 text-center">No results.</Table.Cell>
138
- </Table.Row>
139
- {/each}
140
- </Table.Body>
141
- </Table.Root>
142
- </div>
116
+ <Table.Root>
117
+ <Table.Header class="bg-muted sticky top-0 z-10">
118
+ {#each table.getHeaderGroups() as headerGroup (headerGroup.id)}
119
+ <Table.Row class="border-b-0 hover:bg-transparent">
120
+ {#each headerGroup.headers as header (header.id)}
121
+ <Table.Head class="text-[11px] font-bold uppercase tracking-[0.04em] text-muted-foreground h-10">
122
+ {#if !header.isPlaceholder}
123
+ <FlexRender
124
+ content={header.column.columnDef.header}
125
+ context={header.getContext()}
126
+ />
127
+ {/if}
128
+ </Table.Head>
129
+ {/each}
130
+ </Table.Row>
131
+ {/each}
132
+ </Table.Header>
133
+ <Table.Body>
134
+ {#each table.getRowModel().rows as row, i (row.id)}
135
+ <Table.Row
136
+ data-state={row.getIsSelected() && 'selected'}
137
+ class="hover:bg-lavender-lighter/50 data-[state=selected]:bg-lavender-lighter/30 {i === table.getRowModel().rows.length - 1 ? 'border-b-0' : ''}"
138
+ >
139
+ {#each row.getVisibleCells() as cell (cell.id)}
140
+ <Table.Cell class="py-3">
141
+ <FlexRender content={cell.column.columnDef.cell} context={cell.getContext()} />
142
+ </Table.Cell>
143
+ {/each}
144
+ </Table.Row>
145
+ {:else}
146
+ <Table.Row>
147
+ <Table.Cell colspan={columns.length} class="h-24 text-center text-muted-foreground">
148
+ {emptyMessage ?? defaultEmptyMessages[interfaceLanguage.current]}
149
+ </Table.Cell>
150
+ </Table.Row>
151
+ {/each}
152
+ </Table.Body>
153
+ </Table.Root>
@@ -17,6 +17,7 @@ type DataTableProps<TData, TValue> = {
17
17
  manualPagination?: boolean;
18
18
  pageCount?: number;
19
19
  rowCount?: number;
20
+ emptyMessage?: string;
20
21
  };
21
22
  declare function $$render<TData, TValue>(): {
22
23
  props: DataTableProps<TData, TValue>;
@@ -1,25 +1,27 @@
1
1
  <script lang="ts">
2
- import { formatRelativeDate, formatAbsoluteDate } from '../../utils/formatDate.js';
2
+ import { formatRelativeDate, formatAbsoluteDate, formatShortDate } from '../../utils/formatDate.js';
3
3
  import { useInterfaceLanguage } from '../../state/interface-language.svelte.js';
4
4
 
5
5
  type Props = {
6
6
  date: Date | string;
7
- format: 'relative' | 'absolute';
7
+ format: 'relative' | 'absolute' | 'short';
8
8
  };
9
9
 
10
- let { date, format }: Props = $props();
10
+ let { date, format = 'short' }: Props = $props();
11
11
 
12
12
  const interfaceLanguage = useInterfaceLanguage();
13
13
 
14
14
  const formattedDate = $derived(
15
15
  format === 'relative'
16
16
  ? formatRelativeDate(date, interfaceLanguage.current)
17
- : formatAbsoluteDate(date, interfaceLanguage.current)
17
+ : format === 'short'
18
+ ? formatShortDate(date, interfaceLanguage.current)
19
+ : formatAbsoluteDate(date, interfaceLanguage.current)
18
20
  );
19
21
 
20
22
  const absoluteDate = $derived(formatAbsoluteDate(date, interfaceLanguage.current));
21
23
  </script>
22
24
 
23
- <span title={absoluteDate} class="text-muted-foreground text-sm">
25
+ <span title={absoluteDate} class="text-muted-foreground text-sm whitespace-nowrap">
24
26
  {formattedDate}
25
27
  </span>
@@ -1,6 +1,6 @@
1
1
  type Props = {
2
2
  date: Date | string;
3
- format: 'relative' | 'absolute';
3
+ format: 'relative' | 'absolute' | 'short';
4
4
  };
5
5
  declare const DateCell: import("svelte").Component<Props, {}, "">;
6
6
  type DateCell = ReturnType<typeof DateCell>;
@@ -0,0 +1,28 @@
1
+ <script lang="ts">
2
+ import FileText from '@tabler/icons-svelte/icons/file-text';
3
+ import Button from '../../../components/ui/button/button.svelte';
4
+ import Plus from '@tabler/icons-svelte/icons/plus';
5
+
6
+ type Props = {
7
+ title: string;
8
+ description: string;
9
+ ctaLabel?: string;
10
+ onCta?: () => void;
11
+ };
12
+
13
+ let { title, description, ctaLabel, onCta }: Props = $props();
14
+ </script>
15
+
16
+ <div class="flex flex-col items-center justify-center py-16 px-4 text-center">
17
+ <div class="flex items-center justify-center w-[72px] h-[72px] rounded-2xl bg-muted mb-5">
18
+ <FileText class="size-8 text-muted-foreground" />
19
+ </div>
20
+ <h3 class="text-lg font-bold text-foreground mb-2">{title}</h3>
21
+ <p class="text-sm text-muted-foreground max-w-[360px] mb-6">{description}</p>
22
+ {#if ctaLabel && onCta}
23
+ <Button variant="default" onclick={onCta}>
24
+ <Plus class="size-4 mr-1.5" />
25
+ {ctaLabel}
26
+ </Button>
27
+ {/if}
28
+ </div>
@@ -0,0 +1,9 @@
1
+ type Props = {
2
+ title: string;
3
+ description: string;
4
+ ctaLabel?: string;
5
+ onCta?: () => void;
6
+ };
7
+ declare const EmptyState: import("svelte").Component<Props, {}, "">;
8
+ type EmptyState = ReturnType<typeof EmptyState>;
9
+ export default EmptyState;
@@ -2,11 +2,17 @@
2
2
  type Props = {
3
3
  name: string;
4
4
  url: string;
5
+ slug?: string;
5
6
  };
6
7
 
7
- let { name, url }: Props = $props();
8
+ let { name, url, slug }: Props = $props();
8
9
  </script>
9
10
 
10
- <a href={url} class="hover:underline">
11
- {name}
12
- </a>
11
+ <div>
12
+ <a href={url} class="font-medium text-foreground hover:text-primary hover:underline">
13
+ {name}
14
+ </a>
15
+ {#if slug}
16
+ <div class="text-[11px] text-muted-foreground font-mono mt-0.5 truncate max-w-[200px]">/{slug}</div>
17
+ {/if}
18
+ </div>
@@ -1,6 +1,7 @@
1
1
  type Props = {
2
2
  name: string;
3
3
  url: string;
4
+ slug?: string;
4
5
  };
5
6
  declare const EntryLink: import("svelte").Component<Props, {}, "">;
6
7
  type EntryLink = ReturnType<typeof EntryLink>;
@@ -4,11 +4,12 @@
4
4
  import DateCell from './date-cell.svelte';
5
5
  import SelectionCell from './selection-cell.svelte';
6
6
  import Photo from '@tabler/icons-svelte/icons/photo';
7
- import type { DateFormat } from './collection-view.svelte.js';
7
+ import { useInterfaceLanguage } from '../../state/interface-language.svelte.js';
8
8
 
9
9
  export interface GridItem {
10
10
  id: string;
11
11
  name: string;
12
+ slug?: string;
12
13
  status: EntryStatus;
13
14
  url: string;
14
15
  thumbnail: string | null;
@@ -17,14 +18,14 @@
17
18
 
18
19
  type Props = {
19
20
  items: GridItem[];
20
- dateFormat: DateFormat;
21
21
  enableSelection?: boolean;
22
22
  selectedIds: Set<string>;
23
23
  onSelectionChange: (ids: Set<string>) => void;
24
24
  };
25
25
 
26
- let { items, dateFormat, enableSelection = false, selectedIds, onSelectionChange }: Props =
27
- $props();
26
+ const interfaceLanguage = useInterfaceLanguage();
27
+
28
+ let { items, enableSelection = false, selectedIds, onSelectionChange }: Props = $props();
28
29
 
29
30
  function toggleSelection(id: string) {
30
31
  const newSet = new Set(selectedIds);
@@ -37,15 +38,15 @@
37
38
  }
38
39
  </script>
39
40
 
40
- <div class="grid grid-cols-2 gap-4 p-4 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 xl:grid-cols-6">
41
+ <div class="grid grid-cols-2 gap-4 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 xl:grid-cols-6">
41
42
  {#each items as item (item.id)}
42
43
  <a
43
44
  href={item.url}
44
- class="group relative flex flex-col overflow-hidden rounded-xl border border-slate-200 bg-white transition-all hover:border-slate-300 hover:shadow-md dark:border-slate-700 dark:bg-slate-800 dark:hover:border-slate-600"
45
+ class="group border-border bg-card hover:bg-lavender-lighter/40 relative flex flex-col overflow-hidden rounded-xl border transition-all hover:shadow-md"
45
46
  >
46
47
  {#if enableSelection}
47
48
  <div
48
- class="absolute left-2 top-2 z-10"
49
+ class="absolute top-2 left-2 z-10"
49
50
  onclick={(e) => {
50
51
  e.preventDefault();
51
52
  e.stopPropagation();
@@ -68,31 +69,28 @@
68
69
  </div>
69
70
  {/if}
70
71
 
71
- <div
72
- class="flex aspect-video items-center justify-center bg-slate-100 dark:bg-slate-700"
73
- >
72
+ <div class="bg-muted flex aspect-video items-center justify-center">
74
73
  {#if item.thumbnail}
75
- <img
76
- src={item.thumbnail}
77
- alt={item.name}
78
- class="h-full w-full object-cover"
79
- />
74
+ <img src={item.thumbnail} alt={item.name} class="h-full w-full object-cover" />
80
75
  {:else}
81
76
  <Photo class="text-muted-foreground size-8 opacity-30" />
82
77
  {/if}
83
78
  </div>
84
79
 
85
80
  <div class="flex flex-1 flex-col gap-1 p-3">
86
- <div class="flex items-start justify-between gap-2">
87
- <h3
88
- class="line-clamp-2 flex-1 text-sm font-medium leading-tight group-hover:text-primary"
89
- >
90
- {item.name}
91
- </h3>
92
- </div>
81
+ <h3
82
+ class="text-foreground group-hover:text-primary line-clamp-2 text-sm leading-tight font-medium"
83
+ >
84
+ {item.name}
85
+ </h3>
86
+ {#if item.slug}
87
+ <div class="text-muted-foreground truncate font-mono text-[10px]">
88
+ /{item.slug?.[interfaceLanguage.current]}
89
+ </div>
90
+ {/if}
93
91
  <div class="mt-auto flex flex-col items-start gap-1.5 pt-2">
94
92
  <StatusBadge status={item.status} />
95
- <DateCell date={item.updatedAt} format={dateFormat} />
93
+ <DateCell date={item.updatedAt} format="short" />
96
94
  </div>
97
95
  </div>
98
96
  </a>
@@ -1,8 +1,8 @@
1
1
  import type { EntryStatus } from '../../../types/entries.js';
2
- import type { DateFormat } from './collection-view.svelte.js';
3
2
  export interface GridItem {
4
3
  id: string;
5
4
  name: string;
5
+ slug?: string;
6
6
  status: EntryStatus;
7
7
  url: string;
8
8
  thumbnail: string | null;
@@ -10,7 +10,6 @@ export interface GridItem {
10
10
  }
11
11
  type Props = {
12
12
  items: GridItem[];
13
- dateFormat: DateFormat;
14
13
  enableSelection?: boolean;
15
14
  selectedIds: Set<string>;
16
15
  onSelectionChange: (ids: Set<string>) => void;
@@ -0,0 +1,60 @@
1
+ <script lang="ts">
2
+ import DotsVertical from '@tabler/icons-svelte/icons/dots-vertical';
3
+ import ExternalLink from '@tabler/icons-svelte/icons/external-link';
4
+ import Archive from '@tabler/icons-svelte/icons/archive';
5
+ import Trash from '@tabler/icons-svelte/icons/trash';
6
+ import Button from '../../../components/ui/button/button.svelte';
7
+ import * as DropdownMenu from '../../../components/ui/dropdown-menu/index.js';
8
+ import { useInterfaceLanguage } from '../../state/interface-language.svelte.js';
9
+ import type { InterfaceLanguage } from '../../../types/languages.js';
10
+
11
+ type Props = {
12
+ entryUrl: string;
13
+ entryName: string;
14
+ onArchive: () => void;
15
+ onDelete: () => void;
16
+ };
17
+
18
+ let { entryUrl, entryName, onArchive, onDelete }: Props = $props();
19
+
20
+ const interfaceLanguage = useInterfaceLanguage();
21
+
22
+ const lang: Record<InterfaceLanguage, { open: string; archive: string; delete: string; moreActions: string }> = {
23
+ en: { open: 'Open', archive: 'Archive', delete: 'Delete', moreActions: 'More actions for' },
24
+ pl: { open: 'Otwórz', archive: 'Archiwizuj', delete: 'Usuń', moreActions: 'Więcej akcji dla' }
25
+ };
26
+
27
+ const t = $derived(lang[interfaceLanguage.current]);
28
+ </script>
29
+
30
+ <DropdownMenu.Root>
31
+ <DropdownMenu.Trigger>
32
+ {#snippet child({ props })}
33
+ <Button
34
+ {...props}
35
+ variant="ghost"
36
+ size="icon"
37
+ class="h-8 w-8 text-muted-foreground hover:text-foreground"
38
+ aria-label="{t.moreActions} {entryName}"
39
+ onclick={(e) => e.stopPropagation()}
40
+ >
41
+ <DotsVertical class="size-4" />
42
+ </Button>
43
+ {/snippet}
44
+ </DropdownMenu.Trigger>
45
+ <DropdownMenu.Content align="end" class="w-40">
46
+ <DropdownMenu.Item href={entryUrl}>
47
+ <ExternalLink class="mr-2 size-4" />
48
+ {t.open}
49
+ </DropdownMenu.Item>
50
+ <DropdownMenu.Separator />
51
+ <DropdownMenu.Item onclick={onArchive}>
52
+ <Archive class="mr-2 size-4" />
53
+ {t.archive}
54
+ </DropdownMenu.Item>
55
+ <DropdownMenu.Item class="text-destructive focus:text-destructive" onclick={onDelete}>
56
+ <Trash class="mr-2 size-4" />
57
+ {t.delete}
58
+ </DropdownMenu.Item>
59
+ </DropdownMenu.Content>
60
+ </DropdownMenu.Root>
@@ -0,0 +1,9 @@
1
+ type Props = {
2
+ entryUrl: string;
3
+ entryName: string;
4
+ onArchive: () => void;
5
+ onDelete: () => void;
6
+ };
7
+ declare const RowActions: import("svelte").Component<Props, {}, "">;
8
+ type RowActions = ReturnType<typeof RowActions>;
9
+ export default RowActions;
@@ -26,18 +26,17 @@
26
26
  }
27
27
  };
28
28
 
29
- const statusClasses: Record<EntryStatus, string> = {
30
- published: 'bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-400',
31
- draft: 'bg-gray-100 text-gray-800 dark:bg-gray-800 dark:text-gray-300',
32
- scheduled: 'bg-amber-100 text-amber-800 dark:bg-amber-900/30 dark:text-amber-400',
33
- archived: 'bg-purple-100 text-purple-800 dark:bg-purple-900/30 dark:text-purple-400'
29
+ const statusConfig: Record<EntryStatus, { dot: string; classes: string }> = {
30
+ published: { dot: '●', classes: 'bg-success-bg text-success' },
31
+ draft: { dot: '○', classes: 'bg-muted text-muted-foreground' },
32
+ scheduled: { dot: '◐', classes: 'bg-warning-bg text-warning' },
33
+ archived: { dot: '◎', classes: 'bg-muted text-muted-foreground' }
34
34
  };
35
35
  </script>
36
36
 
37
37
  <span
38
- class="inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium {statusClasses[
39
- status
40
- ]}"
38
+ class="inline-flex items-center gap-1.5 rounded-full px-2.5 py-0.5 text-[11px] font-semibold leading-none {statusConfig[status].classes}"
41
39
  >
40
+ <span class="text-[9px]" aria-hidden="true">{statusConfig[status].dot}</span>
42
41
  {labels[interfaceLanguage.current][status]}
43
42
  </span>