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,16 +1,22 @@
1
1
  <script lang="ts">
2
2
  import { getContentLanguage } from '../../state/content-language.svelte.js';
3
- import type { DbEntryVersion, EntryStatus, RawEntry } from '../../../types/entries.js';
4
- import * as ToggleGroup from '../../../components/ui/toggle-group/index.js';
3
+ import type { DbEntryVersion, RawEntry } from '../../../types/entries.js';
5
4
  import Button from '../../../components/ui/button/button.svelte';
6
5
  import { useInterfaceLanguage } from '../../state/interface-language.svelte.js';
7
6
  import type { InterfaceLanguage } from '../../../types/languages.js';
8
7
  import StatusBadge from './header/status-badge.svelte';
9
8
  import SaveIndicator from './header/save-indicator.svelte';
10
9
  import type { UpdateEntryVersionCommandType } from '../../../core/server/entries/operations/update.js';
10
+ import type { Field } from '../../../types/fields.js';
11
11
  import LayoutSidebar from '@tabler/icons-svelte/icons/layout-sidebar';
12
+ import SendIcon from '@tabler/icons-svelte/icons/send';
13
+ import ChevronDownIcon from '@tabler/icons-svelte/icons/chevron-down';
14
+ import LanguageIcon from '@tabler/icons-svelte/icons/language';
15
+ import * as DropdownMenu from '../../../components/ui/dropdown-menu/index.js';
12
16
  import { hasHybridContext, getHybridContext } from './hybrid/hybrid-context.svelte.js';
13
17
  import { getEntryStatus } from './utils.js';
18
+ import { onMount } from 'svelte';
19
+ import type { LangStatus } from '../../utils/translationStatus.js';
14
20
 
15
21
  const contentLanguage = getContentLanguage();
16
22
  const interfaceLanguage = useInterfaceLanguage();
@@ -26,7 +32,7 @@
26
32
  en: {
27
33
  publish: 'Publish',
28
34
  update: 'Update',
29
- saveDraft: 'Save Draft'
35
+ saveDraft: 'Save draft'
30
36
  },
31
37
  pl: {
32
38
  publish: 'Publikuj',
@@ -40,12 +46,30 @@
40
46
  type Props = {
41
47
  entry: RawEntry;
42
48
  version: DbEntryVersion;
49
+ fields?: Field[];
50
+ getFormData?: () => Record<string, unknown>;
43
51
  onSave: (type: UpdateEntryVersionCommandType, scheduledAt?: Date) => void;
52
+ onSaveDraft: () => void;
44
53
  onArchive: () => void;
45
54
  saveStatus?: SaveStatus;
55
+ isArchived?: boolean;
56
+ onScrollToIssue?: (fieldSlug: string, nodePos: number) => void;
57
+ translationStatus?: Record<string, LangStatus> | null;
46
58
  };
47
59
 
48
- let { entry, onSave, onArchive, version, saveStatus = 'idle' }: Props = $props();
60
+ let {
61
+ entry,
62
+ onSave,
63
+ onSaveDraft,
64
+ onArchive,
65
+ version,
66
+ fields = [],
67
+ getFormData,
68
+ saveStatus = 'idle',
69
+ isArchived = false,
70
+ onScrollToIssue,
71
+ translationStatus = null
72
+ }: Props = $props();
49
73
  let { collection } = entry;
50
74
 
51
75
  const hybridContext = hasHybridContext() ? getHybridContext() : null;
@@ -62,52 +86,134 @@
62
86
  return t.publish;
63
87
  }
64
88
  });
89
+
90
+ let isMac = $state(false);
91
+ onMount(() => {
92
+ isMac = /Mac|iPhone|iPad|iPod/.test(navigator.platform);
93
+ });
94
+ const shortcutLabel = $derived(isMac ? '⌘S' : 'Ctrl+S');
95
+
96
+ function statusDotClass(status: LangStatus | undefined): string {
97
+ if (!status) return 'bg-[var(--text-light)]';
98
+ if (status.status === 'complete') return 'bg-[var(--success)]';
99
+ if (status.status === 'partial') return 'bg-[var(--warning)]';
100
+ return 'bg-[var(--text-light)]';
101
+ }
102
+
103
+ function statusLabel(lang: string, status: LangStatus | undefined): string {
104
+ if (!status) return lang.toUpperCase();
105
+ if (status.status === 'complete') return `${lang.toUpperCase()} \u2713`;
106
+ if (status.status === 'partial') return `${lang.toUpperCase()} \u26A0`;
107
+ return lang.toUpperCase();
108
+ }
109
+
110
+ function statusTooltip(lang: string, status: LangStatus | undefined): string {
111
+ if (!status) return lang.toUpperCase();
112
+ if (status.status === 'complete') return `${lang.toUpperCase()}: 100%`;
113
+ const missing = status.missingFields.map((f) => f.label).join(', ');
114
+ return `${lang.toUpperCase()}: ${status.percentage}% — ${interfaceLanguage.current === 'pl' ? 'brakuje' : 'missing'}: ${missing}`;
115
+ }
116
+
117
+ const isNonDefaultLang = $derived(
118
+ contentLanguage.all.length > 1 && contentLanguage.current !== contentLanguage.all[0]
119
+ );
65
120
  </script>
66
121
 
67
122
  <div
68
- class="sticky top-0 z-50 flex items-center justify-between gap-4 border-b border-slate-200/30 bg-white/60 px-4 py-3 backdrop-blur-xl dark:border-white/10 dark:bg-slate-900/60 md:px-6"
123
+ class="bg-background/60 sticky top-0 z-50 flex h-12 shrink-0 items-center justify-between gap-4 border-b px-6 backdrop-blur-xl"
69
124
  >
70
- <div class="flex items-center gap-4">
125
+ <!-- Left: Status + Save indicator -->
126
+ <div class="flex items-center gap-2.5">
71
127
  <StatusBadge {entry} {version} />
72
128
  <SaveIndicator status={saveStatus} />
73
129
  </div>
74
130
 
75
- <div class="flex items-center gap-2">
131
+ <!-- Right: grouped actions -->
132
+ <div class="flex items-center gap-1.5">
133
+ <!-- Language switcher -->
76
134
  {#if contentLanguage.all.length > 1}
77
- <ToggleGroup.Root
78
- size="sm"
79
- type="single"
80
- variant="outline"
81
- onValueChange={(val) => {
82
- if (val) {
83
- contentLanguage.current = val;
84
- }
85
- }}
86
- value={contentLanguage.current}
87
- >
135
+ <div class="border-border bg-muted inline-flex overflow-hidden rounded-lg border">
88
136
  {#each contentLanguage.all as lang}
89
- <ToggleGroup.Item value={lang}>
90
- {lang.toUpperCase()}
91
- </ToggleGroup.Item>
137
+ {@const langStatus = translationStatus?.[lang]}
138
+ <button
139
+ type="button"
140
+ role="tab"
141
+ aria-selected={lang === contentLanguage.current}
142
+ title={statusTooltip(lang, langStatus)}
143
+ class="inline-flex items-center gap-1.5 px-2.5 py-1 text-xs font-semibold transition-colors {lang ===
144
+ contentLanguage.current
145
+ ? 'text-primary bg-white shadow-sm ring-1 ring-primary/20'
146
+ : 'text-muted-foreground hover:text-foreground bg-transparent'}"
147
+ onclick={() => (contentLanguage.current = lang)}
148
+ >
149
+ <span class="size-2 shrink-0 rounded-full {statusDotClass(langStatus)}"></span>
150
+ {statusLabel(lang, langStatus)}
151
+ </button>
92
152
  {/each}
93
- </ToggleGroup.Root>
94
- {/if}
153
+ </div>
154
+
155
+ <!-- Reference mode toggle -->
156
+ <Button
157
+ variant="ghost"
158
+ size="icon-sm"
159
+ class={contentLanguage.referenceMode ? 'text-primary bg-[var(--lavender-lighter)]' : ''}
160
+ onclick={() => (contentLanguage.referenceMode = !contentLanguage.referenceMode)}
161
+ title={interfaceLanguage.current === 'pl' ? 'Tryb referencyjny' : 'Reference mode'}
162
+ >
163
+ <LanguageIcon class="size-4" />
164
+ </Button>
95
165
 
96
- <Button size="sm" type="button" variant="ghost" onclick={() => onSave('draft')}
97
- >{lang[interfaceLanguage.current].saveDraft}</Button
98
- >
166
+ <div class="bg-border mx-1 h-5 w-px shrink-0"></div>
167
+ {/if}
99
168
 
100
- <Button
101
- size="sm"
102
- type="button"
103
- variant="gradient"
104
- onclick={() => onSave('published-now')}
105
- >
106
- {primaryButtonLabel}
107
- </Button>
169
+ {#if !isArchived}
170
+ <!-- Split button: Publish + Save Draft -->
171
+ <div class="inline-flex items-stretch rounded-lg shadow-[0_1px_3px_rgba(91,74,158,0.3)]">
172
+ <button
173
+ type="button"
174
+ class="bg-primary text-primary-foreground hover:bg-primary/90 inline-flex items-center gap-1.5 rounded-l-lg px-4 py-1.5 text-[13px] font-semibold transition-colors"
175
+ onclick={() => onSave('published-now')}
176
+ >
177
+ <SendIcon class="size-3.5" />
178
+ {primaryButtonLabel}
179
+ </button>
180
+
181
+ <DropdownMenu.Root>
182
+ <DropdownMenu.Trigger>
183
+ {#snippet child({ props })}
184
+ <button
185
+ {...props}
186
+ type="button"
187
+ class="bg-primary text-primary-foreground hover:bg-primary/90 inline-flex items-center rounded-r-lg border-l border-white/20 px-1.5 py-1.5 transition-colors"
188
+ aria-label={lang[interfaceLanguage.current].saveDraft}
189
+ >
190
+ <ChevronDownIcon class="size-3.5" />
191
+ </button>
192
+ {/snippet}
193
+ </DropdownMenu.Trigger>
194
+ <DropdownMenu.Content align="end" class="w-48">
195
+ <DropdownMenu.Item onclick={onSaveDraft}>
196
+ {lang[interfaceLanguage.current].saveDraft}
197
+ <DropdownMenu.Shortcut>{shortcutLabel}</DropdownMenu.Shortcut>
198
+ </DropdownMenu.Item>
199
+ </DropdownMenu.Content>
200
+ </DropdownMenu.Root>
201
+ </div>
202
+
203
+ <div class="bg-border mx-1 h-5 w-px shrink-0"></div>
204
+ {/if}
108
205
 
206
+ <!-- Panel triggers + Hybrid toggle -->
109
207
  {#await import('./header/publish-panel.svelte') then { default: PublishPanel }}
110
- <PublishPanel {entry} {version} {onSave} {onArchive} />
208
+ <PublishPanel
209
+ {entry}
210
+ {version}
211
+ {fields}
212
+ {getFormData}
213
+ {onSave}
214
+ {onArchive}
215
+ {onScrollToIssue}
216
+ />
111
217
  {/await}
112
218
 
113
219
  {#await import('./header/version-history-sheet.svelte') then { default: VersionHistorySheet }}
@@ -116,14 +222,14 @@
116
222
 
117
223
  {#if hybridContext?.enabled}
118
224
  <Button
119
- variant={hybridContext.mode === 'hybrid' ? 'secondary' : 'outline'}
225
+ variant="ghost"
120
226
  size="icon"
227
+ class={hybridContext.mode === 'hybrid' ? 'text-primary bg-[var(--lavender-lighter)]' : ''}
121
228
  onclick={() => hybridContext.toggle()}
122
229
  title="Hybrid Editor"
123
230
  >
124
231
  <LayoutSidebar class="size-4" />
125
232
  </Button>
126
233
  {/if}
127
-
128
234
  </div>
129
235
  </div>
@@ -1,12 +1,20 @@
1
1
  import type { DbEntryVersion, RawEntry } from '../../../types/entries.js';
2
2
  import type { UpdateEntryVersionCommandType } from '../../../core/server/entries/operations/update.js';
3
+ import type { Field } from '../../../types/fields.js';
4
+ import type { LangStatus } from '../../utils/translationStatus.js';
3
5
  type SaveStatus = 'idle' | 'saving' | 'saved' | 'unsaved' | 'error';
4
6
  type Props = {
5
7
  entry: RawEntry;
6
8
  version: DbEntryVersion;
9
+ fields?: Field[];
10
+ getFormData?: () => Record<string, unknown>;
7
11
  onSave: (type: UpdateEntryVersionCommandType, scheduledAt?: Date) => void;
12
+ onSaveDraft: () => void;
8
13
  onArchive: () => void;
9
14
  saveStatus?: SaveStatus;
15
+ isArchived?: boolean;
16
+ onScrollToIssue?: (fieldSlug: string, nodePos: number) => void;
17
+ translationStatus?: Record<string, LangStatus> | null;
10
18
  };
11
19
  declare const EntryHeader: import("svelte").Component<Props, {}, "">;
12
20
  type EntryHeader = ReturnType<typeof EntryHeader>;