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
@@ -0,0 +1,181 @@
1
+ import { Extension } from '@tiptap/core';
2
+ import Suggestion, {} from '@tiptap/suggestion';
3
+ import tippy, {} from 'tippy.js';
4
+ import { mount, unmount } from 'svelte';
5
+ import SlashCommandPopup from './SlashCommandPopup.svelte';
6
+ function getStandardItems(editor) {
7
+ return [
8
+ {
9
+ id: 'heading2',
10
+ label: 'Nagłówek 2',
11
+ description: 'Główna sekcja',
12
+ group: 'Formatowanie',
13
+ tier: 1,
14
+ action: () => editor.chain().focus().toggleHeading({ level: 2 }).run()
15
+ },
16
+ {
17
+ id: 'heading3',
18
+ label: 'Nagłówek 3',
19
+ description: 'Podsekcja',
20
+ group: 'Formatowanie',
21
+ tier: 1,
22
+ action: () => editor.chain().focus().toggleHeading({ level: 3 }).run()
23
+ },
24
+ {
25
+ id: 'bulletList',
26
+ label: 'Lista punktowa',
27
+ description: 'Lista bez numeracji',
28
+ group: 'Formatowanie',
29
+ tier: 1,
30
+ action: () => editor.chain().focus().toggleBulletList().run()
31
+ },
32
+ {
33
+ id: 'orderedList',
34
+ label: 'Lista numerowana',
35
+ description: 'Lista numerowana',
36
+ group: 'Formatowanie',
37
+ tier: 1,
38
+ action: () => editor.chain().focus().toggleOrderedList().run()
39
+ },
40
+ {
41
+ id: 'blockquote',
42
+ label: 'Cytat',
43
+ description: 'Cytat blokowy',
44
+ group: 'Formatowanie',
45
+ tier: 2,
46
+ action: () => editor.chain().focus().toggleBlockquote().run()
47
+ },
48
+ {
49
+ id: 'codeBlock',
50
+ label: 'Blok kodu',
51
+ description: 'Blok kodu',
52
+ group: 'Formatowanie',
53
+ tier: 2,
54
+ action: () => editor.chain().focus().toggleCodeBlock().run()
55
+ },
56
+ {
57
+ id: 'horizontalRule',
58
+ label: 'Linia pozioma',
59
+ description: 'Linia oddzielająca',
60
+ group: 'Formatowanie',
61
+ tier: 2,
62
+ action: () => editor.chain().focus().setHorizontalRule().run()
63
+ }
64
+ ];
65
+ }
66
+ function getInlineBlockItems(inlineBlocks, editor) {
67
+ return inlineBlocks.map((block) => ({
68
+ id: `block-${block.slug}`,
69
+ label: block.label ? Object.values(block.label)[0] : block.slug,
70
+ group: 'Bloki',
71
+ action: () => {
72
+ editor.commands.insertInlineBlock({ blockType: block.slug });
73
+ }
74
+ }));
75
+ }
76
+ export const SlashCommand = Extension.create({
77
+ name: 'slashCommand',
78
+ addOptions() {
79
+ return {
80
+ inlineBlocks: [],
81
+ suggestion: {
82
+ char: '/',
83
+ startOfLine: true
84
+ }
85
+ };
86
+ },
87
+ addProseMirrorPlugins() {
88
+ const { inlineBlocks } = this.options;
89
+ return [
90
+ Suggestion({
91
+ editor: this.editor,
92
+ char: '/',
93
+ startOfLine: true,
94
+ command: ({ editor, range, props: item }) => {
95
+ // Delete the "/" + query text, then run the item's action
96
+ editor.chain().focus().deleteRange(range).run();
97
+ item.action(editor.commands);
98
+ },
99
+ items: ({ query }) => {
100
+ const allItems = [
101
+ ...getInlineBlockItems(inlineBlocks, this.editor),
102
+ ...getStandardItems(this.editor)
103
+ ];
104
+ if (!query)
105
+ return allItems;
106
+ const q = query.toLowerCase();
107
+ return allItems.filter((item) => item.label.toLowerCase().includes(q) ||
108
+ item.group.toLowerCase().includes(q));
109
+ },
110
+ render: () => {
111
+ let popup;
112
+ let component;
113
+ let container;
114
+ return {
115
+ onStart: (props) => {
116
+ container = document.createElement('div');
117
+ component = mount(SlashCommandPopup, {
118
+ target: container,
119
+ props: {
120
+ items: props.items,
121
+ command: props.command
122
+ }
123
+ });
124
+ popup = tippy(document.body, {
125
+ getReferenceClientRect: () => props.clientRect?.(),
126
+ appendTo: () => document.body,
127
+ content: container,
128
+ showOnCreate: true,
129
+ interactive: true,
130
+ trigger: 'manual',
131
+ placement: 'bottom-start',
132
+ maxWidth: 320
133
+ });
134
+ },
135
+ onUpdate: (props) => {
136
+ if (!component || !container)
137
+ return;
138
+ // Re-mount with updated props
139
+ unmount(component);
140
+ component = mount(SlashCommandPopup, {
141
+ target: container,
142
+ props: {
143
+ items: props.items,
144
+ command: props.command
145
+ }
146
+ });
147
+ popup?.setProps({
148
+ getReferenceClientRect: () => props.clientRect?.()
149
+ });
150
+ },
151
+ onKeyDown: (props) => {
152
+ if (props.event.key === 'Escape') {
153
+ popup?.hide();
154
+ return true;
155
+ }
156
+ // Delegate arrow/enter to the popup via custom event
157
+ const el = container?.querySelector('[data-slash-popup]');
158
+ if (el) {
159
+ const handled = el.dispatchEvent(new CustomEvent('slash-keydown', {
160
+ detail: { key: props.event.key },
161
+ bubbles: false,
162
+ cancelable: true
163
+ }));
164
+ // If the event wasn't cancelled, the popup handled it
165
+ return !handled;
166
+ }
167
+ return false;
168
+ },
169
+ onExit: () => {
170
+ popup?.destroy();
171
+ if (component)
172
+ unmount(component);
173
+ container = undefined;
174
+ component = undefined;
175
+ }
176
+ };
177
+ }
178
+ })
179
+ ];
180
+ }
181
+ });
@@ -0,0 +1,21 @@
1
+ import type { SCNode, SCMark, StructuredContentDoc } from '../../../types/structured-content.js';
2
+ /** Generic tree walker — visits every node depth-first. */
3
+ export declare function walkNodes(nodes: SCNode[] | undefined, visitor: (node: SCNode) => void): void;
4
+ /** Extract all `data-entry-id` values from link marks in a StructuredContentDoc. */
5
+ export declare function extractEntryIds(doc: StructuredContentDoc): string[];
6
+ /** Extract all `data-media-id` values from figure/video/image nodes and inlineBlock blockData. */
7
+ export declare function extractMediaIds(doc: StructuredContentDoc): string[];
8
+ /** Validate & type-narrow unknown JSON to StructuredContentDoc. Throws on invalid input.
9
+ * Parses inlineBlock blockData from JSON string → object. */
10
+ export declare function tiptapDocToStructured(json: unknown): StructuredContentDoc;
11
+ /** Convert StructuredContentDoc to TipTap-compatible JSON.
12
+ * Stringifies inlineBlock blockData object → JSON string for PM attr safety. */
13
+ export declare function structuredToTiptapDoc(doc: StructuredContentDoc): Record<string, unknown>;
14
+ /** Deep clone a StructuredContentDoc. */
15
+ export declare function cloneDoc(doc: StructuredContentDoc): StructuredContentDoc;
16
+ /** Walk link marks in a doc, calling replacer for each. Mutates the doc in place. */
17
+ export declare function walkLinkMarks(doc: StructuredContentDoc, replacer: (mark: SCMark) => void): void;
18
+ /** Walk inlineBlock nodes in a doc, calling replacer for each. Mutates in place. */
19
+ export declare function walkInlineBlockNodes(doc: StructuredContentDoc, replacer: (node: SCNode) => void): void;
20
+ /** Walk media nodes (figure/video/image) in a doc, calling replacer for each. Mutates in place. */
21
+ export declare function walkMediaNodes(doc: StructuredContentDoc, replacer: (node: SCNode) => void): void;
@@ -0,0 +1,150 @@
1
+ /** Generic tree walker — visits every node depth-first. */
2
+ export function walkNodes(nodes, visitor) {
3
+ if (!nodes)
4
+ return;
5
+ for (const node of nodes) {
6
+ visitor(node);
7
+ if (node.content) {
8
+ walkNodes(node.content, visitor);
9
+ }
10
+ }
11
+ }
12
+ /** Extract relation/entry IDs from inlineBlock blockData values. */
13
+ function extractIdsFromBlockData(blockData, key) {
14
+ const ids = [];
15
+ for (const val of Object.values(blockData)) {
16
+ if (typeof val === 'string' && val.length === 36 && key === 'relation') {
17
+ ids.push(val);
18
+ }
19
+ else if (Array.isArray(val)) {
20
+ for (const item of val) {
21
+ if (typeof item === 'string' && item.length === 36)
22
+ ids.push(item);
23
+ }
24
+ }
25
+ }
26
+ return ids;
27
+ }
28
+ /** Extract all `data-entry-id` values from link marks in a StructuredContentDoc. */
29
+ export function extractEntryIds(doc) {
30
+ const ids = [];
31
+ walkNodes(doc.content, (node) => {
32
+ if (!node.marks)
33
+ return;
34
+ for (const mark of node.marks) {
35
+ if (mark.type === 'link' && mark.attrs?.['data-entry-id']) {
36
+ ids.push(mark.attrs['data-entry-id']);
37
+ }
38
+ }
39
+ });
40
+ return ids;
41
+ }
42
+ /** Extract all `data-media-id` values from figure/video/image nodes and inlineBlock blockData. */
43
+ export function extractMediaIds(doc) {
44
+ const ids = [];
45
+ walkNodes(doc.content, (node) => {
46
+ if (['figure', 'video', 'image'].includes(node.type) && node.attrs?.['data-media-id']) {
47
+ ids.push(node.attrs['data-media-id']);
48
+ }
49
+ if (node.type === 'inlineBlock' && node.attrs?.blockData && typeof node.attrs.blockData === 'object') {
50
+ const data = node.attrs.blockData;
51
+ for (const val of Object.values(data)) {
52
+ // media/image fields store UUID strings
53
+ if (typeof val === 'string' && val.length === 36)
54
+ ids.push(val);
55
+ if (Array.isArray(val)) {
56
+ for (const item of val) {
57
+ if (typeof item === 'string' && item.length === 36)
58
+ ids.push(item);
59
+ }
60
+ }
61
+ }
62
+ }
63
+ });
64
+ return ids;
65
+ }
66
+ /** Parse inlineBlock blockData from JSON string → object (deep, in-place). */
67
+ function parseInlineBlockData(nodes) {
68
+ if (!nodes)
69
+ return;
70
+ for (const node of nodes) {
71
+ if (node.type === 'inlineBlock' && node.attrs?.blockData && typeof node.attrs.blockData === 'string') {
72
+ try {
73
+ node.attrs.blockData = JSON.parse(node.attrs.blockData);
74
+ }
75
+ catch {
76
+ // keep string on parse failure
77
+ }
78
+ }
79
+ if (node.content)
80
+ parseInlineBlockData(node.content);
81
+ }
82
+ }
83
+ /** Stringify inlineBlock blockData from object → JSON string (deep, in-place). */
84
+ function stringifyInlineBlockData(nodes) {
85
+ if (!nodes)
86
+ return;
87
+ for (const node of nodes) {
88
+ if (node.type === 'inlineBlock' && node.attrs?.blockData && typeof node.attrs.blockData === 'object') {
89
+ node.attrs.blockData = JSON.stringify(node.attrs.blockData);
90
+ }
91
+ if (node.content)
92
+ stringifyInlineBlockData(node.content);
93
+ }
94
+ }
95
+ /** Validate & type-narrow unknown JSON to StructuredContentDoc. Throws on invalid input.
96
+ * Parses inlineBlock blockData from JSON string → object. */
97
+ export function tiptapDocToStructured(json) {
98
+ if (!json || typeof json !== 'object') {
99
+ throw new Error('Invalid structured content: expected object');
100
+ }
101
+ const obj = json;
102
+ if (obj.type !== 'doc') {
103
+ throw new Error(`Invalid structured content: root type must be "doc", got "${obj.type}"`);
104
+ }
105
+ if (!Array.isArray(obj.content)) {
106
+ throw new Error('Invalid structured content: "content" must be an array');
107
+ }
108
+ const doc = JSON.parse(JSON.stringify(json));
109
+ parseInlineBlockData(doc.content);
110
+ return doc;
111
+ }
112
+ /** Convert StructuredContentDoc to TipTap-compatible JSON.
113
+ * Stringifies inlineBlock blockData object → JSON string for PM attr safety. */
114
+ export function structuredToTiptapDoc(doc) {
115
+ const cloned = JSON.parse(JSON.stringify(doc));
116
+ stringifyInlineBlockData(cloned.content);
117
+ return cloned;
118
+ }
119
+ /** Deep clone a StructuredContentDoc. */
120
+ export function cloneDoc(doc) {
121
+ return JSON.parse(JSON.stringify(doc));
122
+ }
123
+ /** Walk link marks in a doc, calling replacer for each. Mutates the doc in place. */
124
+ export function walkLinkMarks(doc, replacer) {
125
+ walkNodes(doc.content, (node) => {
126
+ if (!node.marks)
127
+ return;
128
+ for (const mark of node.marks) {
129
+ if (mark.type === 'link') {
130
+ replacer(mark);
131
+ }
132
+ }
133
+ });
134
+ }
135
+ /** Walk inlineBlock nodes in a doc, calling replacer for each. Mutates in place. */
136
+ export function walkInlineBlockNodes(doc, replacer) {
137
+ walkNodes(doc.content, (node) => {
138
+ if (node.type === 'inlineBlock') {
139
+ replacer(node);
140
+ }
141
+ });
142
+ }
143
+ /** Walk media nodes (figure/video/image) in a doc, calling replacer for each. Mutates in place. */
144
+ export function walkMediaNodes(doc, replacer) {
145
+ walkNodes(doc.content, (node) => {
146
+ if (['figure', 'video', 'image'].includes(node.type)) {
147
+ replacer(node);
148
+ }
149
+ });
150
+ }
@@ -4,39 +4,22 @@
4
4
  import BubbleMenu from '@tiptap/extension-bubble-menu';
5
5
  import { extensions } from './extensions.js';
6
6
  import ToolbarButton from './toolbar-button.svelte';
7
+ import EditorToolbar from './editor-toolbar.svelte';
7
8
  import LinkDialog from './link-dialog.svelte';
8
9
  import ImageDialog from './image-dialog.svelte';
9
10
  import VideoDialog from './video-dialog.svelte';
10
11
  import TableDialog from './table-dialog.svelte';
11
12
  import Textarea from '../../../components/ui/textarea/textarea.svelte';
12
13
  import * as Tooltip from '../../../components/ui/tooltip/index.js';
13
- import * as DropdownMenu from '../../../components/ui/dropdown-menu/index.js';
14
- import Button from '../../../components/ui/button/button.svelte';
15
14
  import Separator from '../../../components/ui/separator/separator.svelte';
16
15
 
17
- // Icons
18
- import H_2 from '@tabler/icons-svelte/icons/h-2';
19
- import H_3 from '@tabler/icons-svelte/icons/h-3';
20
- import LetterP from '@tabler/icons-svelte/icons/letter-p';
16
+ // Icons (bubble menu only)
21
17
  import Bold from '@tabler/icons-svelte/icons/bold';
22
18
  import Italic from '@tabler/icons-svelte/icons/italic';
23
19
  import Underline from '@tabler/icons-svelte/icons/underline';
24
20
  import Strikethrough from '@tabler/icons-svelte/icons/strikethrough';
25
21
  import Highlight from '@tabler/icons-svelte/icons/highlight';
26
- import AlignLeft from '@tabler/icons-svelte/icons/align-left';
27
- import AlignCenter from '@tabler/icons-svelte/icons/align-center';
28
- import AlignRight from '@tabler/icons-svelte/icons/align-right';
29
- import AlignJustified from '@tabler/icons-svelte/icons/align-justified';
30
- import List from '@tabler/icons-svelte/icons/list';
31
- import ListNumbers from '@tabler/icons-svelte/icons/list-numbers';
32
- import Quote from '@tabler/icons-svelte/icons/quote';
33
22
  import LinkIcon from '@tabler/icons-svelte/icons/link';
34
- import Photo from '@tabler/icons-svelte/icons/photo';
35
- import VideoIcon from '@tabler/icons-svelte/icons/video';
36
- import Table from '@tabler/icons-svelte/icons/table';
37
- import Code from '@tabler/icons-svelte/icons/code';
38
- import FileCode from '@tabler/icons-svelte/icons/file-code';
39
- import SourceCode from '@tabler/icons-svelte/icons/source-code';
40
23
  import RowInsertBottom from '@tabler/icons-svelte/icons/row-insert-bottom';
41
24
  import RowInsertTop from '@tabler/icons-svelte/icons/row-insert-top';
42
25
  import ColumnInsertLeft from '@tabler/icons-svelte/icons/column-insert-left';
@@ -108,171 +91,16 @@
108
91
  <div class="border-input bg-background rounded-lg border">
109
92
  <!-- Toolbar -->
110
93
  {#if ed}
111
- <div class="flex flex-wrap items-center gap-0.5 border-b p-1 sticky top-0 z-10 bg-background">
112
- <!-- Headings -->
113
- <ToolbarButton
114
- label="Nagłówek 2"
115
- active={ed.isActive('heading', { level: 2 })}
116
- onclick={() => ed.chain().focus().toggleHeading({ level: 2 }).run()}
117
- >
118
- <H_2 class="h-4 w-4" />
119
- </ToolbarButton>
120
- <ToolbarButton
121
- label="Nagłówek 3"
122
- active={ed.isActive('heading', { level: 3 })}
123
- onclick={() => ed.chain().focus().toggleHeading({ level: 3 }).run()}
124
- >
125
- <H_3 class="h-4 w-4" />
126
- </ToolbarButton>
127
- <ToolbarButton
128
- label="Paragraf"
129
- active={ed.isActive('paragraph') && !ed.isActive('heading')}
130
- onclick={() => ed.chain().focus().setParagraph().run()}
131
- >
132
- <LetterP class="h-4 w-4" />
133
- </ToolbarButton>
134
-
135
- <Separator orientation="vertical" class="mx-1 h-6" />
136
-
137
- <!-- Text formatting -->
138
- <ToolbarButton
139
- label="Pogrubienie"
140
- active={ed.isActive('bold')}
141
- onclick={() => ed.chain().focus().toggleBold().run()}
142
- >
143
- <Bold class="h-4 w-4" />
144
- </ToolbarButton>
145
- <ToolbarButton
146
- label="Kursywa"
147
- active={ed.isActive('italic')}
148
- onclick={() => ed.chain().focus().toggleItalic().run()}
149
- >
150
- <Italic class="h-4 w-4" />
151
- </ToolbarButton>
152
- <ToolbarButton
153
- label="Podkreślenie"
154
- active={ed.isActive('underline')}
155
- onclick={() => ed.chain().focus().toggleUnderline().run()}
156
- >
157
- <Underline class="h-4 w-4" />
158
- </ToolbarButton>
159
- <ToolbarButton
160
- label="Przekreślenie"
161
- active={ed.isActive('strike')}
162
- onclick={() => ed.chain().focus().toggleStrike().run()}
163
- >
164
- <Strikethrough class="h-4 w-4" />
165
- </ToolbarButton>
166
- <ToolbarButton
167
- label="Wyróżnienie"
168
- active={ed.isActive('highlight')}
169
- onclick={() => ed.chain().focus().toggleHighlight().run()}
170
- >
171
- <Highlight class="h-4 w-4" />
172
- </ToolbarButton>
173
-
174
- <Separator orientation="vertical" class="mx-1 h-6" />
175
-
176
- <!-- Alignment -->
177
- <ToolbarButton
178
- label="Do lewej"
179
- active={ed.isActive({ textAlign: 'left' })}
180
- onclick={() => ed.chain().focus().setTextAlign('left').run()}
181
- >
182
- <AlignLeft class="h-4 w-4" />
183
- </ToolbarButton>
184
- <ToolbarButton
185
- label="Wyśrodkuj"
186
- active={ed.isActive({ textAlign: 'center' })}
187
- onclick={() => ed.chain().focus().setTextAlign('center').run()}
188
- >
189
- <AlignCenter class="h-4 w-4" />
190
- </ToolbarButton>
191
- <ToolbarButton
192
- label="Do prawej"
193
- active={ed.isActive({ textAlign: 'right' })}
194
- onclick={() => ed.chain().focus().setTextAlign('right').run()}
195
- >
196
- <AlignRight class="h-4 w-4" />
197
- </ToolbarButton>
198
- <ToolbarButton
199
- label="Wyjustuj"
200
- active={ed.isActive({ textAlign: 'justify' })}
201
- onclick={() => ed.chain().focus().setTextAlign('justify').run()}
202
- >
203
- <AlignJustified class="h-4 w-4" />
204
- </ToolbarButton>
205
-
206
- <Separator orientation="vertical" class="mx-1 h-6" />
207
-
208
- <!-- Lists & Quote -->
209
- <ToolbarButton
210
- label="Lista punktowa"
211
- active={ed.isActive('bulletList')}
212
- onclick={() => ed.chain().focus().toggleBulletList().run()}
213
- >
214
- <List class="h-4 w-4" />
215
- </ToolbarButton>
216
- <ToolbarButton
217
- label="Lista numerowana"
218
- active={ed.isActive('orderedList')}
219
- onclick={() => ed.chain().focus().toggleOrderedList().run()}
220
- >
221
- <ListNumbers class="h-4 w-4" />
222
- </ToolbarButton>
223
- <ToolbarButton
224
- label="Cytat"
225
- active={ed.isActive('blockquote')}
226
- onclick={() => ed.chain().focus().toggleBlockquote().run()}
227
- >
228
- <Quote class="h-4 w-4" />
229
- </ToolbarButton>
230
-
231
- <Separator orientation="vertical" class="mx-1 h-6" />
232
-
233
- <!-- Link, Image, Table -->
234
- <ToolbarButton
235
- label="Link"
236
- active={ed.isActive('link')}
237
- onclick={() => (linkDialogOpen = true)}
238
- >
239
- <LinkIcon class="h-4 w-4" />
240
- </ToolbarButton>
241
- <ToolbarButton label="Obrazek" active={false} onclick={() => (imageDialogOpen = true)}>
242
- <Photo class="h-4 w-4" />
243
- </ToolbarButton>
244
- <ToolbarButton label="Wideo" active={false} onclick={() => (videoDialogOpen = true)}>
245
- <VideoIcon class="h-4 w-4" />
246
- </ToolbarButton>
247
- <ToolbarButton label="Tabela" active={false} onclick={() => (tableDialogOpen = true)}>
248
- <Table class="h-4 w-4" />
249
- </ToolbarButton>
250
-
251
- <Separator orientation="vertical" class="mx-1 h-6" />
252
-
253
- <!-- Code -->
254
- <ToolbarButton
255
- label="Kod inline"
256
- active={ed.isActive('code')}
257
- onclick={() => ed.chain().focus().toggleCode().run()}
258
- >
259
- <Code class="h-4 w-4" />
260
- </ToolbarButton>
261
- <ToolbarButton
262
- label="Blok kodu"
263
- active={ed.isActive('codeBlock')}
264
- onclick={() => ed.chain().focus().toggleCodeBlock().run()}
265
- >
266
- <FileCode class="h-4 w-4" />
267
- </ToolbarButton>
268
-
269
- <Separator orientation="vertical" class="mx-1 h-6" />
270
-
271
- <!-- HTML View -->
272
- <ToolbarButton label="Widok HTML" active={isCodeViewActive} onclick={toggleCodeView}>
273
- <SourceCode class="h-4 w-4" />
274
- </ToolbarButton>
275
- </div>
94
+ <EditorToolbar
95
+ editor={ed}
96
+ onLinkDialog={() => (linkDialogOpen = true)}
97
+ onImageDialog={() => (imageDialogOpen = true)}
98
+ onVideoDialog={() => (videoDialogOpen = true)}
99
+ onTableDialog={() => (tableDialogOpen = true)}
100
+ showCodeView={true}
101
+ {isCodeViewActive}
102
+ onToggleCodeView={toggleCodeView}
103
+ />
276
104
  {/if}
277
105
 
278
106
  <!-- Bubble Menu -->
@@ -444,23 +272,23 @@
444
272
 
445
273
  :global(.ProseMirror th),
446
274
  :global(.ProseMirror td) {
447
- border: 1px solid hsl(var(--border));
275
+ border: 1px solid var(--border);
448
276
  padding: 0.5em;
449
277
  text-align: left;
450
278
  }
451
279
 
452
280
  :global(.ProseMirror th) {
453
- background-color: hsl(var(--muted));
281
+ background-color: var(--muted);
454
282
  font-weight: 600;
455
283
  }
456
284
 
457
285
  :global(.ProseMirror .selectedCell) {
458
- background-color: hsl(var(--accent));
286
+ background-color: var(--accent);
459
287
  }
460
288
 
461
289
  /* Code block styles */
462
290
  :global(.ProseMirror pre) {
463
- background-color: hsl(var(--muted));
291
+ background-color: var(--muted);
464
292
  border-radius: 0.5rem;
465
293
  padding: 1rem;
466
294
  overflow-x: auto;
@@ -517,7 +345,7 @@
517
345
 
518
346
  :global(.tiptap-figure figcaption) {
519
347
  font-size: 0.875rem;
520
- color: hsl(var(--muted-foreground));
348
+ color: var(--muted-foreground);
521
349
  text-align: center;
522
350
  margin-top: 0.5rem;
523
351
  }
@@ -525,7 +353,7 @@
525
353
  /* Syntax highlighting */
526
354
  :global(.hljs-comment),
527
355
  :global(.hljs-quote) {
528
- color: hsl(var(--muted-foreground));
356
+ color: var(--muted-foreground);
529
357
  font-style: italic;
530
358
  }
531
359
 
@@ -0,0 +1,8 @@
1
+ export declare function inviteEmailTemplate(params: {
2
+ inviteUrl: string;
3
+ role: string;
4
+ lang?: string;
5
+ }): {
6
+ subject: string;
7
+ html: string;
8
+ };