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
@@ -0,0 +1,22 @@
1
+ <script module>
2
+ import { defineMeta } from '@storybook/addon-svelte-csf';
3
+ import { Toggle } from './index.js';
4
+
5
+ const { Story } = defineMeta({
6
+ title: 'UI/Actions/Toggle',
7
+ component: Toggle,
8
+ tags: ['autodocs'],
9
+ });
10
+ </script>
11
+
12
+ <Story name="Default">
13
+ <Toggle aria-label="Wyróżniony artykuł">
14
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/></svg>
15
+ </Toggle>
16
+ </Story>
17
+
18
+ <Story name="Pressed">
19
+ <Toggle pressed aria-label="Wyróżniony artykuł">
20
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/></svg>
21
+ </Toggle>
22
+ </Story>
@@ -0,0 +1,27 @@
1
+ export default Toggle;
2
+ type Toggle = SvelteComponent<{
3
+ [x: string]: never;
4
+ }, {
5
+ [evt: string]: CustomEvent<any>;
6
+ }, {}> & {
7
+ $$bindings?: string | undefined;
8
+ };
9
+ declare const Toggle: $$__sveltets_2_IsomorphicComponent<{
10
+ [x: string]: never;
11
+ }, {
12
+ [evt: string]: CustomEvent<any>;
13
+ }, {}, {}, string>;
14
+ import { Toggle } from './index.js';
15
+ 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> {
16
+ new (options: import("svelte").ComponentConstructorOptions<Props>): import("svelte").SvelteComponent<Props, Events, Slots> & {
17
+ $$bindings?: Bindings;
18
+ } & Exports;
19
+ (internal: unknown, props: {
20
+ $$events?: Events;
21
+ $$slots?: Slots;
22
+ }): Exports & {
23
+ $set?: any;
24
+ $on?: any;
25
+ };
26
+ z_$$bindings?: Bindings;
27
+ }
@@ -0,0 +1,17 @@
1
+ <script module>
2
+ import { defineMeta } from '@storybook/addon-svelte-csf';
3
+ import { ToggleGroup, ToggleGroupItem } from './index.js';
4
+
5
+ const { Story } = defineMeta({
6
+ title: 'UI/Actions/ToggleGroup',
7
+ component: ToggleGroup,
8
+ tags: ['autodocs'],
9
+ });
10
+ </script>
11
+
12
+ <Story name="Language Toggle">
13
+ <ToggleGroup type="single" value="pl">
14
+ <ToggleGroupItem value="pl" style="font-weight:600;font-size:12px;">PL</ToggleGroupItem>
15
+ <ToggleGroupItem value="en" style="font-weight:600;font-size:12px;">EN</ToggleGroupItem>
16
+ </ToggleGroup>
17
+ </Story>
@@ -0,0 +1,27 @@
1
+ export default ToggleGroup;
2
+ type ToggleGroup = SvelteComponent<{
3
+ [x: string]: never;
4
+ }, {
5
+ [evt: string]: CustomEvent<any>;
6
+ }, {}> & {
7
+ $$bindings?: string | undefined;
8
+ };
9
+ declare const ToggleGroup: $$__sveltets_2_IsomorphicComponent<{
10
+ [x: string]: never;
11
+ }, {
12
+ [evt: string]: CustomEvent<any>;
13
+ }, {}, {}, string>;
14
+ import { ToggleGroup } from './index.js';
15
+ 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> {
16
+ new (options: import("svelte").ComponentConstructorOptions<Props>): import("svelte").SvelteComponent<Props, Events, Slots> & {
17
+ $$bindings?: Bindings;
18
+ } & Exports;
19
+ (internal: unknown, props: {
20
+ $$events?: Events;
21
+ $$slots?: Slots;
22
+ }): Exports & {
23
+ $set?: any;
24
+ $on?: any;
25
+ };
26
+ z_$$bindings?: Bindings;
27
+ }
@@ -0,0 +1,26 @@
1
+ <script module>
2
+ import { defineMeta } from '@storybook/addon-svelte-csf';
3
+ import { Tooltip, TooltipContent, TooltipTrigger, TooltipProvider } from './index.js';
4
+ import { Button } from '../button/index.js';
5
+
6
+ const { Story } = defineMeta({
7
+ title: 'UI/Feedback/Tooltip',
8
+ component: Tooltip,
9
+ tags: ['autodocs'],
10
+ });
11
+ </script>
12
+
13
+ <Story name="Plum Tooltip">
14
+ <TooltipProvider>
15
+ <Tooltip>
16
+ <TooltipTrigger>
17
+ <Button variant="ghost" size="icon">
18
+ <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><circle cx="12" cy="12" r="10"/><polyline points="12 6 12 12 16 14"/></svg>
19
+ </Button>
20
+ </TooltipTrigger>
21
+ <TooltipContent>
22
+ <p>Historia</p>
23
+ </TooltipContent>
24
+ </Tooltip>
25
+ </TooltipProvider>
26
+ </Story>
@@ -0,0 +1,27 @@
1
+ export default Tooltip;
2
+ type Tooltip = SvelteComponent<{
3
+ [x: string]: never;
4
+ }, {
5
+ [evt: string]: CustomEvent<any>;
6
+ }, {}> & {
7
+ $$bindings?: string | undefined;
8
+ };
9
+ declare const Tooltip: $$__sveltets_2_IsomorphicComponent<{
10
+ [x: string]: never;
11
+ }, {
12
+ [evt: string]: CustomEvent<any>;
13
+ }, {}, {}, string>;
14
+ import { Tooltip } from './index.js';
15
+ 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> {
16
+ new (options: import("svelte").ComponentConstructorOptions<Props>): import("svelte").SvelteComponent<Props, Events, Slots> & {
17
+ $$bindings?: Bindings;
18
+ } & Exports;
19
+ (internal: unknown, props: {
20
+ $$events?: Events;
21
+ $$slots?: Slots;
22
+ }): Exports & {
23
+ $set?: any;
24
+ $on?: any;
25
+ };
26
+ z_$$bindings?: Bindings;
27
+ }
@@ -3,6 +3,7 @@ import { z } from 'zod';
3
3
  type AnyZodObject = z.ZodObject<any, any>;
4
4
  interface GenerateZodSchemaOptions {
5
5
  parentRequired?: boolean;
6
+ localized?: boolean;
6
7
  }
7
8
  export declare function generateZodSchemaFromField(field: Field, languages: string[], options?: GenerateZodSchemaOptions): z.ZodType;
8
9
  export declare function generateZodSchemaFromFields(fields: Field[], languages: string[], options?: GenerateZodSchemaOptions): AnyZodObject;
@@ -2,6 +2,7 @@ import { z } from 'zod';
2
2
  export function generateZodSchemaFromField(field, languages, options = {
3
3
  parentRequired: true
4
4
  }) {
5
+ const localized = options.localized !== false;
5
6
  switch (field.type) {
6
7
  case 'text': {
7
8
  let schema = z.string();
@@ -13,14 +14,92 @@ export function generateZodSchemaFromField(field, languages, options = {
13
14
  schema = schema.max(field.maxLength, { message: `Maksimum ${field.maxLength} znaków` });
14
15
  if (field.pattern !== undefined)
15
16
  schema = schema.regex(new RegExp(field.pattern), { message: 'Nieprawidłowy format' });
17
+ if (!localized)
18
+ return schema;
16
19
  return z.object(Object.fromEntries(languages.map((lang) => [lang, schema])));
17
20
  }
18
21
  case 'richtext': {
19
22
  let schema = z.string();
20
23
  if (field.required)
21
24
  schema = schema.min(1, { message: 'Pole wymagane' });
25
+ if (!localized)
26
+ return schema;
22
27
  return z.object(Object.fromEntries(languages.map((lang) => [lang, schema])));
23
28
  }
29
+ case 'content': {
30
+ const markSchema = z.object({
31
+ type: z.string(),
32
+ attrs: z.record(z.string(), z.unknown()).optional()
33
+ });
34
+ const nodeSchema = z.lazy(() => z.object({
35
+ type: z.string(),
36
+ attrs: z.record(z.string(), z.unknown()).optional(),
37
+ content: z.array(nodeSchema).optional(),
38
+ marks: z.array(markSchema).optional(),
39
+ text: z.string().optional()
40
+ }));
41
+ let docSchema = z.object({
42
+ type: z.literal('doc'),
43
+ content: z.array(nodeSchema)
44
+ });
45
+ // If inline blocks defined, validate their blockData
46
+ if (field.inlineBlocks && field.inlineBlocks.length > 0) {
47
+ const blockSchemas = new Map();
48
+ for (const blockDef of field.inlineBlocks) {
49
+ blockSchemas.set(blockDef.slug, generateZodSchemaFromFields(blockDef.fields, languages, {
50
+ parentRequired: false,
51
+ localized: false
52
+ }));
53
+ }
54
+ docSchema = z
55
+ .object({
56
+ type: z.literal('doc'),
57
+ content: z.array(nodeSchema)
58
+ })
59
+ .superRefine((doc, ctx) => {
60
+ for (let i = 0; i < doc.content.length; i++) {
61
+ const node = doc.content[i];
62
+ if (node.type !== 'inlineBlock')
63
+ continue;
64
+ const blockType = node.attrs?.blockType;
65
+ const blockData = node.attrs?.blockData;
66
+ const schema = blockSchemas.get(blockType);
67
+ if (!schema) {
68
+ ctx.addIssue({
69
+ code: z.ZodIssueCode.custom,
70
+ message: `Nieznany typ bloku: ${blockType}`,
71
+ path: ['content', i, 'attrs', 'blockType']
72
+ });
73
+ continue;
74
+ }
75
+ let data = blockData;
76
+ if (typeof data === 'string') {
77
+ try {
78
+ data = JSON.parse(data);
79
+ }
80
+ catch {
81
+ ctx.addIssue({
82
+ code: z.ZodIssueCode.custom,
83
+ message: 'Nieprawidłowe dane bloku',
84
+ path: ['content', i, 'attrs', 'blockData']
85
+ });
86
+ continue;
87
+ }
88
+ }
89
+ const result = schema.safeParse(data);
90
+ if (!result.success) {
91
+ for (const issue of result.error.issues) {
92
+ ctx.addIssue({
93
+ ...issue,
94
+ path: ['content', i, 'attrs', 'blockData', ...issue.path]
95
+ });
96
+ }
97
+ }
98
+ }
99
+ });
100
+ }
101
+ return z.object(Object.fromEntries(languages.map((lang) => [lang, docSchema])));
102
+ }
24
103
  case 'number': {
25
104
  let schema = z.number({ message: 'Wymagana liczba' });
26
105
  if (field.min !== undefined)
@@ -68,7 +147,7 @@ export function generateZodSchemaFromField(field, languages, options = {
68
147
  data: finalData
69
148
  });
70
149
  }
71
- case 'array': {
150
+ case 'blocks': {
72
151
  const schemas = field.of.map((f) => generateZodSchemaFromField(f, languages, { parentRequired: field.required }));
73
152
  const itemSchema = schemas.length > 1
74
153
  ? z.discriminatedUnion('slug', schemas)
@@ -94,6 +173,37 @@ export function generateZodSchemaFromField(field, languages, options = {
94
173
  }
95
174
  return schema.default([]); // Default to empty array if not required
96
175
  }
176
+ case 'array': {
177
+ let itemSchema;
178
+ switch (field.of) {
179
+ case 'text':
180
+ itemSchema = field.localized
181
+ ? z.record(z.string(), z.string())
182
+ : z.string();
183
+ break;
184
+ case 'number':
185
+ itemSchema = z.number();
186
+ break;
187
+ case 'url':
188
+ itemSchema = z.object({
189
+ id: z.string().optional(),
190
+ url: z.record(z.string(), z.string()),
191
+ text: z.record(z.string(), z.string()).optional(),
192
+ newTab: z.boolean().optional()
193
+ });
194
+ break;
195
+ }
196
+ let schema = z.array(itemSchema);
197
+ if (field.minItems !== undefined)
198
+ schema = schema.min(field.minItems, {
199
+ message: `Minimum ${field.minItems} elementów`
200
+ });
201
+ if (field.maxItems !== undefined)
202
+ schema = schema.max(field.maxItems, {
203
+ message: `Maksimum ${field.maxItems} elementów`
204
+ });
205
+ return schema.default([]);
206
+ }
97
207
  case 'slug': {
98
208
  let schema = z.string();
99
209
  if (field.required)
@@ -101,6 +211,17 @@ export function generateZodSchemaFromField(field, languages, options = {
101
211
  return schema;
102
212
  }
103
213
  case 'seo': {
214
+ if (!localized) {
215
+ return z.object({
216
+ slug: z.string(),
217
+ canonicalUrl: z.string().optional(),
218
+ title: z.string(),
219
+ description: z.string(),
220
+ keywords: z.string().optional(),
221
+ ogImage: z.string(),
222
+ customCode: z.string().optional()
223
+ });
224
+ }
104
225
  return z.object({
105
226
  slug: z.object(Object.fromEntries(languages.map((lang) => [lang, z.string()]))),
106
227
  canonicalUrl: z.object(Object.fromEntries(languages.map((lang) => [lang, z.string().optional()]))),
@@ -112,6 +233,17 @@ export function generateZodSchemaFromField(field, languages, options = {
112
233
  });
113
234
  }
114
235
  case 'url': {
236
+ if (!localized) {
237
+ const flatShape = {
238
+ url: z.string().default(''),
239
+ id: z.string().optional()
240
+ };
241
+ if (field.text)
242
+ flatShape.text = z.string().default('');
243
+ if (field.newTab)
244
+ flatShape.newTab = z.boolean().optional();
245
+ return z.object(flatShape);
246
+ }
115
247
  const langString = z.string().default('');
116
248
  const urlShape = {
117
249
  url: z.object(Object.fromEntries(languages.map((lang) => [lang, langString]))),
@@ -0,0 +1,17 @@
1
+ import type { Field } from '../../types/fields.js';
2
+ import type { ConfigBase } from '../../types/config.js';
3
+ import type { Layout, LayoutNode } from '../../types/layout.js';
4
+ export declare function getFieldsFromConfig(config: ConfigBase): Field[];
5
+ export declare function hasLayout(config: ConfigBase): boolean;
6
+ /** Collect all field slugs referenced in layout nodes (depth-first order) */
7
+ export declare function collectFieldSlugs(nodes: LayoutNode[]): string[];
8
+ export interface LayoutValidationError {
9
+ type: 'missing_field' | 'duplicate_field' | 'depth_exceeded' | 'columns_mismatch';
10
+ message: string;
11
+ }
12
+ /** Validate layout against fields — returns errors or empty array */
13
+ export declare function validateLayout(nodes: LayoutNode[], fields: Field[]): LayoutValidationError[];
14
+ /** Expand a preset into LayoutNode[] */
15
+ export declare function resolveLayout(layout: Layout, fields: Field[]): LayoutNode[];
16
+ /** Resolve layout + append orphan fields in a trailing section */
17
+ export declare function resolveLayoutWithOrphans(config: ConfigBase): LayoutNode[];
@@ -0,0 +1,149 @@
1
+ import { isLayoutBranch, isLayoutLeaf } from '../../types/layout.js';
2
+ export function getFieldsFromConfig(config) {
3
+ return config.fields;
4
+ }
5
+ export function hasLayout(config) {
6
+ return !!config.layout;
7
+ }
8
+ /** Collect all field slugs referenced in layout nodes (depth-first order) */
9
+ export function collectFieldSlugs(nodes) {
10
+ const slugs = [];
11
+ for (const node of nodes) {
12
+ if (isLayoutLeaf(node)) {
13
+ slugs.push(...node.fields);
14
+ }
15
+ if (isLayoutBranch(node)) {
16
+ slugs.push(...collectFieldSlugs(node.children));
17
+ }
18
+ }
19
+ return slugs;
20
+ }
21
+ /** Count columns expected by a ratio string */
22
+ function columnCount(ratio) {
23
+ return ratio.split(' ').length;
24
+ }
25
+ /** Validate layout against fields — returns errors or empty array */
26
+ export function validateLayout(nodes, fields) {
27
+ const errors = [];
28
+ const fieldSlugs = new Set(fields.map((f) => f.slug));
29
+ const referencedSlugs = collectFieldSlugs(nodes);
30
+ // Check for missing fields
31
+ for (const slug of referencedSlugs) {
32
+ if (!fieldSlugs.has(slug)) {
33
+ errors.push({ type: 'missing_field', message: `Field "${slug}" not found in fields[]` });
34
+ }
35
+ }
36
+ // Check for duplicates
37
+ const seen = new Set();
38
+ for (const slug of referencedSlugs) {
39
+ if (seen.has(slug)) {
40
+ errors.push({ type: 'duplicate_field', message: `Field "${slug}" referenced multiple times` });
41
+ }
42
+ seen.add(slug);
43
+ }
44
+ // Check depth + columns
45
+ function walk(nodeList, depth) {
46
+ if (depth > 2) {
47
+ errors.push({ type: 'depth_exceeded', message: `Nesting depth ${depth} exceeds max of 2` });
48
+ return;
49
+ }
50
+ for (const node of nodeList) {
51
+ if (node.type === 'columns') {
52
+ const expected = columnCount(node.ratio);
53
+ const actual = node.children?.length ?? 0;
54
+ if (actual !== expected) {
55
+ errors.push({
56
+ type: 'columns_mismatch',
57
+ message: `Columns ratio "${node.ratio}" expects ${expected} children, got ${actual}`
58
+ });
59
+ }
60
+ }
61
+ if (isLayoutBranch(node)) {
62
+ walk(node.children, depth + 1);
63
+ }
64
+ }
65
+ }
66
+ walk(nodes, 0);
67
+ return errors;
68
+ }
69
+ /** Expand a preset into LayoutNode[] */
70
+ export function resolveLayout(layout, fields) {
71
+ if (Array.isArray(layout))
72
+ return layout;
73
+ return expandPreset(layout, fields);
74
+ }
75
+ /** Resolve layout + append orphan fields in a trailing section */
76
+ export function resolveLayoutWithOrphans(config) {
77
+ if (!config.layout) {
78
+ // No layout — single section with all fields
79
+ return [
80
+ {
81
+ type: 'section',
82
+ label: { en: 'Fields', pl: 'Pola' },
83
+ fields: config.fields.map((f) => f.slug)
84
+ }
85
+ ];
86
+ }
87
+ const nodes = resolveLayout(config.layout, config.fields);
88
+ const referenced = new Set(collectFieldSlugs(nodes));
89
+ const orphans = config.fields.filter((f) => !referenced.has(f.slug)).map((f) => f.slug);
90
+ if (orphans.length === 0)
91
+ return nodes;
92
+ return [
93
+ ...nodes,
94
+ {
95
+ type: 'section',
96
+ label: { en: 'Other', pl: 'Pozostałe' },
97
+ fields: orphans
98
+ }
99
+ ];
100
+ }
101
+ function expandPreset(preset, fields) {
102
+ const allSlugs = fields.map((f) => f.slug);
103
+ if (preset === 'sidebar-right') {
104
+ // Heuristic: last 2 fields → sidebar
105
+ const sidebarSlugs = allSlugs.slice(-2);
106
+ const mainSlugs = allSlugs.slice(0, -2);
107
+ return buildSidebarRight(mainSlugs, sidebarSlugs);
108
+ }
109
+ if (preset === 'two-column') {
110
+ const half = Math.ceil(allSlugs.length / 2);
111
+ return buildTwoColumn(allSlugs.slice(0, half), allSlugs.slice(half));
112
+ }
113
+ if (typeof preset === 'object' && preset.preset === 'sidebar-right') {
114
+ const sidebarSet = new Set(preset.sidebar);
115
+ const mainSlugs = allSlugs.filter((s) => !sidebarSet.has(s));
116
+ return buildSidebarRight(mainSlugs, preset.sidebar);
117
+ }
118
+ if (typeof preset === 'object' && preset.preset === 'two-column') {
119
+ const leftSet = new Set(preset.left ?? []);
120
+ const left = preset.left ?? allSlugs.slice(0, Math.ceil(allSlugs.length / 2));
121
+ const right = allSlugs.filter((s) => !leftSet.has(s));
122
+ return buildTwoColumn(left, right);
123
+ }
124
+ return [];
125
+ }
126
+ function buildSidebarRight(main, sidebar) {
127
+ return [
128
+ {
129
+ type: 'columns',
130
+ ratio: '2fr 1fr',
131
+ children: [
132
+ { type: 'stack', fields: main },
133
+ { type: 'stack', fields: sidebar }
134
+ ]
135
+ }
136
+ ];
137
+ }
138
+ function buildTwoColumn(left, right) {
139
+ return [
140
+ {
141
+ type: 'columns',
142
+ ratio: '1fr 1fr',
143
+ children: [
144
+ { type: 'stack', fields: left },
145
+ { type: 'stack', fields: right }
146
+ ]
147
+ }
148
+ ];
149
+ }
@@ -0,0 +1,9 @@
1
+ import type { StructuredContentDoc } from '../../types/structured-content.js';
2
+ export interface StructuredToHtmlOptions {
3
+ /** Custom renderer for inline blocks. Return HTML string. */
4
+ inlineBlock?: (blockType: string, blockData: Record<string, unknown>) => string;
5
+ /** Base URL prefix for relative URLs (useful for RSS feeds). */
6
+ baseUrl?: string;
7
+ }
8
+ /** Convert a StructuredContentDoc to an HTML string. */
9
+ export declare function structuredToHtml(doc: StructuredContentDoc, options?: StructuredToHtmlOptions): string;