@xiwebdesign/xicms-core 4.17.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 (436) hide show
  1. package/dist/XiCMSProvider.d.ts +58 -0
  2. package/dist/XiCMSProvider.js +165 -0
  3. package/dist/XiCMSProvider.js.map +1 -0
  4. package/dist/admin/AdminApp.d.ts +4 -0
  5. package/dist/admin/AdminApp.js +62 -0
  6. package/dist/admin/AdminApp.js.map +1 -0
  7. package/dist/admin/AdminHelp.d.ts +2 -0
  8. package/dist/admin/AdminHelp.js +65 -0
  9. package/dist/admin/AdminHelp.js.map +1 -0
  10. package/dist/admin/NewsEditor.d.ts +2 -0
  11. package/dist/admin/NewsEditor.js +171 -0
  12. package/dist/admin/NewsEditor.js.map +1 -0
  13. package/dist/admin/SuperadminPanel.d.ts +4 -0
  14. package/dist/admin/SuperadminPanel.js +101 -0
  15. package/dist/admin/SuperadminPanel.js.map +1 -0
  16. package/dist/admin/blockEditors/StyleEditor.d.ts +10 -0
  17. package/dist/admin/blockEditors/StyleEditor.js +78 -0
  18. package/dist/admin/blockEditors/StyleEditor.js.map +1 -0
  19. package/dist/admin/blockEditors/index.d.ts +16 -0
  20. package/dist/admin/blockEditors/index.js +1602 -0
  21. package/dist/admin/blockEditors/index.js.map +1 -0
  22. package/dist/admin/editors/RichTextEditor.d.ts +10 -0
  23. package/dist/admin/editors/RichTextEditor.js +86 -0
  24. package/dist/admin/editors/RichTextEditor.js.map +1 -0
  25. package/dist/admin/forms/FormsPanel.d.ts +3 -0
  26. package/dist/admin/forms/FormsPanel.js +203 -0
  27. package/dist/admin/forms/FormsPanel.js.map +1 -0
  28. package/dist/admin/index.d.ts +21 -0
  29. package/dist/admin/index.js +38 -0
  30. package/dist/admin/index.js.map +1 -0
  31. package/dist/admin/lib/compressImage.d.ts +12 -0
  32. package/dist/admin/lib/compressImage.js +53 -0
  33. package/dist/admin/lib/compressImage.js.map +1 -0
  34. package/dist/admin/lib/mediaUsage.d.ts +9 -0
  35. package/dist/admin/lib/mediaUsage.js +25 -0
  36. package/dist/admin/lib/mediaUsage.js.map +1 -0
  37. package/dist/admin/lib/pagesClient.d.ts +38 -0
  38. package/dist/admin/lib/pagesClient.js +143 -0
  39. package/dist/admin/lib/pagesClient.js.map +1 -0
  40. package/dist/admin/lib/slugify.d.ts +2 -0
  41. package/dist/admin/lib/slugify.js +7 -0
  42. package/dist/admin/lib/slugify.js.map +1 -0
  43. package/dist/admin/lib/upload.d.ts +13 -0
  44. package/dist/admin/lib/upload.js +40 -0
  45. package/dist/admin/lib/upload.js.map +1 -0
  46. package/dist/admin/lib/zodFields.d.ts +27 -0
  47. package/dist/admin/lib/zodFields.js +48 -0
  48. package/dist/admin/lib/zodFields.js.map +1 -0
  49. package/dist/admin/media/MediaManager.d.ts +3 -0
  50. package/dist/admin/media/MediaManager.js +132 -0
  51. package/dist/admin/media/MediaManager.js.map +1 -0
  52. package/dist/admin/media/MediaPicker.d.ts +24 -0
  53. package/dist/admin/media/MediaPicker.js +93 -0
  54. package/dist/admin/media/MediaPicker.js.map +1 -0
  55. package/dist/admin/pages/PageEditor.d.ts +5 -0
  56. package/dist/admin/pages/PageEditor.js +239 -0
  57. package/dist/admin/pages/PageEditor.js.map +1 -0
  58. package/dist/admin/pages/PagesPanel.d.ts +3 -0
  59. package/dist/admin/pages/PagesPanel.js +92 -0
  60. package/dist/admin/pages/PagesPanel.js.map +1 -0
  61. package/dist/admin/panelRegistry.d.ts +20 -0
  62. package/dist/admin/panelRegistry.js +23 -0
  63. package/dist/admin/panelRegistry.js.map +1 -0
  64. package/dist/admin/patterns/PatternInserter.d.ts +10 -0
  65. package/dist/admin/patterns/PatternInserter.js +58 -0
  66. package/dist/admin/patterns/PatternInserter.js.map +1 -0
  67. package/dist/admin/settings/SettingsPanel.d.ts +3 -0
  68. package/dist/admin/settings/SettingsPanel.js +304 -0
  69. package/dist/admin/settings/SettingsPanel.js.map +1 -0
  70. package/dist/admin/settings/moduleSettingsForm.d.ts +12 -0
  71. package/dist/admin/settings/moduleSettingsForm.js +45 -0
  72. package/dist/admin/settings/moduleSettingsForm.js.map +1 -0
  73. package/dist/admin/stats/StatsPanel.d.ts +4 -0
  74. package/dist/admin/stats/StatsPanel.js +80 -0
  75. package/dist/admin/stats/StatsPanel.js.map +1 -0
  76. package/dist/admin/ui/ArrayEditor.d.ts +16 -0
  77. package/dist/admin/ui/ArrayEditor.js +38 -0
  78. package/dist/admin/ui/ArrayEditor.js.map +1 -0
  79. package/dist/admin/ui/ConfirmDialog.d.ts +22 -0
  80. package/dist/admin/ui/ConfirmDialog.js +47 -0
  81. package/dist/admin/ui/ConfirmDialog.js.map +1 -0
  82. package/dist/admin/ui/cn.d.ts +3 -0
  83. package/dist/admin/ui/cn.js +9 -0
  84. package/dist/admin/ui/cn.js.map +1 -0
  85. package/dist/admin/ui/dialog.d.ts +9 -0
  86. package/dist/admin/ui/dialog.js +47 -0
  87. package/dist/admin/ui/dialog.js.map +1 -0
  88. package/dist/admin/ui/index.d.ts +7 -0
  89. package/dist/admin/ui/index.js +29 -0
  90. package/dist/admin/ui/index.js.map +1 -0
  91. package/dist/admin/ui/primitives.d.ts +37 -0
  92. package/dist/admin/ui/primitives.js +137 -0
  93. package/dist/admin/ui/primitives.js.map +1 -0
  94. package/dist/admin/ui/select.d.ts +11 -0
  95. package/dist/admin/ui/select.js +27 -0
  96. package/dist/admin/ui/select.js.map +1 -0
  97. package/dist/admin/ui/switch.d.ts +6 -0
  98. package/dist/admin/ui/switch.js +22 -0
  99. package/dist/admin/ui/switch.js.map +1 -0
  100. package/dist/admin/ui/tabs.d.ts +5 -0
  101. package/dist/admin/ui/tabs.js +36 -0
  102. package/dist/admin/ui/tabs.js.map +1 -0
  103. package/dist/admin/ui/toast.d.ts +19 -0
  104. package/dist/admin/ui/toast.js +24 -0
  105. package/dist/admin/ui/toast.js.map +1 -0
  106. package/dist/admin/visual/VisualEditor.d.ts +10 -0
  107. package/dist/admin/visual/VisualEditor.js +597 -0
  108. package/dist/admin/visual/VisualEditor.js.map +1 -0
  109. package/dist/admin/visual/reorder.d.ts +6 -0
  110. package/dist/admin/visual/reorder.js +12 -0
  111. package/dist/admin/visual/reorder.js.map +1 -0
  112. package/dist/admin.css +1 -0
  113. package/dist/auth/AuthProvider.d.ts +30 -0
  114. package/dist/auth/AuthProvider.js +110 -0
  115. package/dist/auth/AuthProvider.js.map +1 -0
  116. package/dist/auth/LoginForm.d.ts +4 -0
  117. package/dist/auth/LoginForm.js +122 -0
  118. package/dist/auth/LoginForm.js.map +1 -0
  119. package/dist/auth/roles.d.ts +15 -0
  120. package/dist/auth/roles.js +21 -0
  121. package/dist/auth/roles.js.map +1 -0
  122. package/dist/blocks/BlockErrorBoundary.d.ts +32 -0
  123. package/dist/blocks/BlockErrorBoundary.js +39 -0
  124. package/dist/blocks/BlockErrorBoundary.js.map +1 -0
  125. package/dist/blocks/BlockRenderer.d.ts +15 -0
  126. package/dist/blocks/BlockRenderer.js +24 -0
  127. package/dist/blocks/BlockRenderer.js.map +1 -0
  128. package/dist/blocks/blockStyle.d.ts +14 -0
  129. package/dist/blocks/blockStyle.js +14 -0
  130. package/dist/blocks/blockStyle.js.map +1 -0
  131. package/dist/blocks/builtins/Accordion.d.ts +2 -0
  132. package/dist/blocks/builtins/Accordion.js +45 -0
  133. package/dist/blocks/builtins/Accordion.js.map +1 -0
  134. package/dist/blocks/builtins/Agenda.d.ts +23 -0
  135. package/dist/blocks/builtins/Agenda.js +102 -0
  136. package/dist/blocks/builtins/Agenda.js.map +1 -0
  137. package/dist/blocks/builtins/Banner.d.ts +2 -0
  138. package/dist/blocks/builtins/Banner.js +45 -0
  139. package/dist/blocks/builtins/Banner.js.map +1 -0
  140. package/dist/blocks/builtins/BeforeAfter.d.ts +2 -0
  141. package/dist/blocks/builtins/BeforeAfter.js +44 -0
  142. package/dist/blocks/builtins/BeforeAfter.js.map +1 -0
  143. package/dist/blocks/builtins/Booking.d.ts +2 -0
  144. package/dist/blocks/builtins/Booking.js +27 -0
  145. package/dist/blocks/builtins/Booking.js.map +1 -0
  146. package/dist/blocks/builtins/Breadcrumbs.d.ts +10 -0
  147. package/dist/blocks/builtins/Breadcrumbs.js +73 -0
  148. package/dist/blocks/builtins/Breadcrumbs.js.map +1 -0
  149. package/dist/blocks/builtins/Cards.d.ts +2 -0
  150. package/dist/blocks/builtins/Cards.js +94 -0
  151. package/dist/blocks/builtins/Cards.js.map +1 -0
  152. package/dist/blocks/builtins/Columns.d.ts +2 -0
  153. package/dist/blocks/builtins/Columns.js +22 -0
  154. package/dist/blocks/builtins/Columns.js.map +1 -0
  155. package/dist/blocks/builtins/Contact.d.ts +7 -0
  156. package/dist/blocks/builtins/Contact.js +121 -0
  157. package/dist/blocks/builtins/Contact.js.map +1 -0
  158. package/dist/blocks/builtins/Countdown.d.ts +18 -0
  159. package/dist/blocks/builtins/Countdown.js +65 -0
  160. package/dist/blocks/builtins/Countdown.js.map +1 -0
  161. package/dist/blocks/builtins/Cta.d.ts +2 -0
  162. package/dist/blocks/builtins/Cta.js +52 -0
  163. package/dist/blocks/builtins/Cta.js.map +1 -0
  164. package/dist/blocks/builtins/Downloads.d.ts +2 -0
  165. package/dist/blocks/builtins/Downloads.js +32 -0
  166. package/dist/blocks/builtins/Downloads.js.map +1 -0
  167. package/dist/blocks/builtins/Elements.d.ts +4 -0
  168. package/dist/blocks/builtins/Elements.js +64 -0
  169. package/dist/blocks/builtins/Elements.js.map +1 -0
  170. package/dist/blocks/builtins/Embed.d.ts +2 -0
  171. package/dist/blocks/builtins/Embed.js +30 -0
  172. package/dist/blocks/builtins/Embed.js.map +1 -0
  173. package/dist/blocks/builtins/Faq.d.ts +6 -0
  174. package/dist/blocks/builtins/Faq.js +110 -0
  175. package/dist/blocks/builtins/Faq.js.map +1 -0
  176. package/dist/blocks/builtins/FormBlock.d.ts +2 -0
  177. package/dist/blocks/builtins/FormBlock.js +221 -0
  178. package/dist/blocks/builtins/FormBlock.js.map +1 -0
  179. package/dist/blocks/builtins/Gallery.d.ts +23 -0
  180. package/dist/blocks/builtins/Gallery.js +177 -0
  181. package/dist/blocks/builtins/Gallery.js.map +1 -0
  182. package/dist/blocks/builtins/Hero.d.ts +2 -0
  183. package/dist/blocks/builtins/Hero.js +47 -0
  184. package/dist/blocks/builtins/Hero.js.map +1 -0
  185. package/dist/blocks/builtins/ImageBlock.d.ts +2 -0
  186. package/dist/blocks/builtins/ImageBlock.js +24 -0
  187. package/dist/blocks/builtins/ImageBlock.js.map +1 -0
  188. package/dist/blocks/builtins/Jobs.d.ts +8 -0
  189. package/dist/blocks/builtins/Jobs.js +65 -0
  190. package/dist/blocks/builtins/Jobs.js.map +1 -0
  191. package/dist/blocks/builtins/Layout.d.ts +3 -0
  192. package/dist/blocks/builtins/Layout.js +67 -0
  193. package/dist/blocks/builtins/Layout.js.map +1 -0
  194. package/dist/blocks/builtins/MapBlock.d.ts +2 -0
  195. package/dist/blocks/builtins/MapBlock.js +31 -0
  196. package/dist/blocks/builtins/MapBlock.js.map +1 -0
  197. package/dist/blocks/builtins/NewsListBlock.d.ts +2 -0
  198. package/dist/blocks/builtins/NewsListBlock.js +24 -0
  199. package/dist/blocks/builtins/NewsListBlock.js.map +1 -0
  200. package/dist/blocks/builtins/Newsletter.d.ts +2 -0
  201. package/dist/blocks/builtins/Newsletter.js +84 -0
  202. package/dist/blocks/builtins/Newsletter.js.map +1 -0
  203. package/dist/blocks/builtins/OpenNowBadge.d.ts +9 -0
  204. package/dist/blocks/builtins/OpenNowBadge.js +20 -0
  205. package/dist/blocks/builtins/OpenNowBadge.js.map +1 -0
  206. package/dist/blocks/builtins/OpeningHours.d.ts +2 -0
  207. package/dist/blocks/builtins/OpeningHours.js +47 -0
  208. package/dist/blocks/builtins/OpeningHours.js.map +1 -0
  209. package/dist/blocks/builtins/PdfBlock.d.ts +2 -0
  210. package/dist/blocks/builtins/PdfBlock.js +97 -0
  211. package/dist/blocks/builtins/PdfBlock.js.map +1 -0
  212. package/dist/blocks/builtins/Portfolio.d.ts +2 -0
  213. package/dist/blocks/builtins/Portfolio.js +94 -0
  214. package/dist/blocks/builtins/Portfolio.js.map +1 -0
  215. package/dist/blocks/builtins/Pricing.d.ts +6 -0
  216. package/dist/blocks/builtins/Pricing.js +77 -0
  217. package/dist/blocks/builtins/Pricing.js.map +1 -0
  218. package/dist/blocks/builtins/RichTextBlock.d.ts +2 -0
  219. package/dist/blocks/builtins/RichTextBlock.js +18 -0
  220. package/dist/blocks/builtins/RichTextBlock.js.map +1 -0
  221. package/dist/blocks/builtins/Search.d.ts +2 -0
  222. package/dist/blocks/builtins/Search.js +99 -0
  223. package/dist/blocks/builtins/Search.js.map +1 -0
  224. package/dist/blocks/builtins/Sections.d.ts +5 -0
  225. package/dist/blocks/builtins/Sections.js +183 -0
  226. package/dist/blocks/builtins/Sections.js.map +1 -0
  227. package/dist/blocks/builtins/Slider.d.ts +2 -0
  228. package/dist/blocks/builtins/Slider.js +131 -0
  229. package/dist/blocks/builtins/Slider.js.map +1 -0
  230. package/dist/blocks/builtins/Spacer.d.ts +2 -0
  231. package/dist/blocks/builtins/Spacer.js +19 -0
  232. package/dist/blocks/builtins/Spacer.js.map +1 -0
  233. package/dist/blocks/builtins/Team.d.ts +2 -0
  234. package/dist/blocks/builtins/Team.js +70 -0
  235. package/dist/blocks/builtins/Team.js.map +1 -0
  236. package/dist/blocks/builtins/Testimonials.d.ts +8 -0
  237. package/dist/blocks/builtins/Testimonials.js +82 -0
  238. package/dist/blocks/builtins/Testimonials.js.map +1 -0
  239. package/dist/blocks/builtins/Video.d.ts +9 -0
  240. package/dist/blocks/builtins/Video.js +77 -0
  241. package/dist/blocks/builtins/Video.js.map +1 -0
  242. package/dist/blocks/builtins/WhatsappChat.d.ts +8 -0
  243. package/dist/blocks/builtins/WhatsappChat.js +51 -0
  244. package/dist/blocks/builtins/WhatsappChat.js.map +1 -0
  245. package/dist/blocks/builtins/Widgets.d.ts +13 -0
  246. package/dist/blocks/builtins/Widgets.js +308 -0
  247. package/dist/blocks/builtins/Widgets.js.map +1 -0
  248. package/dist/blocks/builtins/consentEmbed.d.ts +17 -0
  249. package/dist/blocks/builtins/consentEmbed.js +31 -0
  250. package/dist/blocks/builtins/consentEmbed.js.map +1 -0
  251. package/dist/blocks/builtins/index.d.ts +46 -0
  252. package/dist/blocks/builtins/index.js +121 -0
  253. package/dist/blocks/builtins/index.js.map +1 -0
  254. package/dist/blocks/builtins/lib/bookingUrl.d.ts +8 -0
  255. package/dist/blocks/builtins/lib/bookingUrl.js +50 -0
  256. package/dist/blocks/builtins/lib/bookingUrl.js.map +1 -0
  257. package/dist/blocks/builtins/lib/fileIcon.d.ts +2 -0
  258. package/dist/blocks/builtins/lib/fileIcon.js +45 -0
  259. package/dist/blocks/builtins/lib/fileIcon.js.map +1 -0
  260. package/dist/blocks/builtins/lib/ics.d.ts +17 -0
  261. package/dist/blocks/builtins/lib/ics.js +50 -0
  262. package/dist/blocks/builtins/lib/ics.js.map +1 -0
  263. package/dist/blocks/builtins/lib/openingHours.d.ts +20 -0
  264. package/dist/blocks/builtins/lib/openingHours.js +79 -0
  265. package/dist/blocks/builtins/lib/openingHours.js.map +1 -0
  266. package/dist/blocks/builtins/lib/searchRank.d.ts +22 -0
  267. package/dist/blocks/builtins/lib/searchRank.js +45 -0
  268. package/dist/blocks/builtins/lib/searchRank.js.map +1 -0
  269. package/dist/blocks/builtins/lib/submitForm.d.ts +6 -0
  270. package/dist/blocks/builtins/lib/submitForm.js +14 -0
  271. package/dist/blocks/builtins/lib/submitForm.js.map +1 -0
  272. package/dist/blocks/context.d.ts +8 -0
  273. package/dist/blocks/context.js +20 -0
  274. package/dist/blocks/context.js.map +1 -0
  275. package/dist/blocks/index.d.ts +9 -0
  276. package/dist/blocks/index.js +21 -0
  277. package/dist/blocks/index.js.map +1 -0
  278. package/dist/blocks/registry.d.ts +75 -0
  279. package/dist/blocks/registry.js +71 -0
  280. package/dist/blocks/registry.js.map +1 -0
  281. package/dist/blocks/ui/index.d.ts +35 -0
  282. package/dist/blocks/ui/index.js +48 -0
  283. package/dist/blocks/ui/index.js.map +1 -0
  284. package/dist/components/EditBar.d.ts +2 -0
  285. package/dist/components/EditBar.js +20 -0
  286. package/dist/components/EditBar.js.map +1 -0
  287. package/dist/components/EditableImage.d.ts +18 -0
  288. package/dist/components/EditableImage.js +62 -0
  289. package/dist/components/EditableImage.js.map +1 -0
  290. package/dist/components/EditableRichText.d.ts +14 -0
  291. package/dist/components/EditableRichText.js +26 -0
  292. package/dist/components/EditableRichText.js.map +1 -0
  293. package/dist/components/EditableText.d.ts +21 -0
  294. package/dist/components/EditableText.js +25 -0
  295. package/dist/components/EditableText.js.map +1 -0
  296. package/dist/components/News.d.ts +38 -0
  297. package/dist/components/News.js +128 -0
  298. package/dist/components/News.js.map +1 -0
  299. package/dist/components/PageView.d.ts +8 -0
  300. package/dist/components/PageView.js +28 -0
  301. package/dist/components/PageView.js.map +1 -0
  302. package/dist/components/ResponsiveImage.d.ts +16 -0
  303. package/dist/components/ResponsiveImage.js +39 -0
  304. package/dist/components/ResponsiveImage.js.map +1 -0
  305. package/dist/components/site/SiteFooter.d.ts +12 -0
  306. package/dist/components/site/SiteFooter.js +34 -0
  307. package/dist/components/site/SiteFooter.js.map +1 -0
  308. package/dist/config.d.ts +8 -0
  309. package/dist/config.js +17 -0
  310. package/dist/config.js.map +1 -0
  311. package/dist/content/ContentProvider.d.ts +23 -0
  312. package/dist/content/ContentProvider.js +86 -0
  313. package/dist/content/ContentProvider.js.map +1 -0
  314. package/dist/content/types.d.ts +41 -0
  315. package/dist/content/types.js +1 -0
  316. package/dist/content/types.js.map +1 -0
  317. package/dist/demo/DemoStudio.d.ts +7 -0
  318. package/dist/demo/DemoStudio.js +54 -0
  319. package/dist/demo/DemoStudio.js.map +1 -0
  320. package/dist/demo/demoStore.d.ts +26 -0
  321. package/dist/demo/demoStore.js +115 -0
  322. package/dist/demo/demoStore.js.map +1 -0
  323. package/dist/editor/EditorProvider.d.ts +12 -0
  324. package/dist/editor/EditorProvider.js +22 -0
  325. package/dist/editor/EditorProvider.js.map +1 -0
  326. package/dist/firebase/admin.d.ts +7 -0
  327. package/dist/firebase/admin.js +31 -0
  328. package/dist/firebase/admin.js.map +1 -0
  329. package/dist/firebase/appcheck.d.ts +6 -0
  330. package/dist/firebase/appcheck.js +23 -0
  331. package/dist/firebase/appcheck.js.map +1 -0
  332. package/dist/firebase/client.d.ts +9 -0
  333. package/dist/firebase/client.js +44 -0
  334. package/dist/firebase/client.js.map +1 -0
  335. package/dist/firebase/region.d.ts +5 -0
  336. package/dist/firebase/region.js +7 -0
  337. package/dist/firebase/region.js.map +1 -0
  338. package/dist/index.d.ts +54 -0
  339. package/dist/index.js +172 -0
  340. package/dist/index.js.map +1 -0
  341. package/dist/layers.css +13 -0
  342. package/dist/lock/DemoLock.d.ts +5 -0
  343. package/dist/lock/DemoLock.js +35 -0
  344. package/dist/lock/DemoLock.js.map +1 -0
  345. package/dist/media/ImageContext.d.ts +41 -0
  346. package/dist/media/ImageContext.js +74 -0
  347. package/dist/media/ImageContext.js.map +1 -0
  348. package/dist/modules/builtins.d.ts +46 -0
  349. package/dist/modules/builtins.js +462 -0
  350. package/dist/modules/builtins.js.map +1 -0
  351. package/dist/modules/consent/ConsentBanner.d.ts +42 -0
  352. package/dist/modules/consent/ConsentBanner.js +119 -0
  353. package/dist/modules/consent/ConsentBanner.js.map +1 -0
  354. package/dist/modules/consent/useConsent.d.ts +28 -0
  355. package/dist/modules/consent/useConsent.js +52 -0
  356. package/dist/modules/consent/useConsent.js.map +1 -0
  357. package/dist/modules/context.d.ts +20 -0
  358. package/dist/modules/context.js +31 -0
  359. package/dist/modules/context.js.map +1 -0
  360. package/dist/modules/contract.d.ts +9 -0
  361. package/dist/modules/contract.js +38 -0
  362. package/dist/modules/contract.js.map +1 -0
  363. package/dist/modules/defineModule.d.ts +11 -0
  364. package/dist/modules/defineModule.js +7 -0
  365. package/dist/modules/defineModule.js.map +1 -0
  366. package/dist/modules/index.d.ts +13 -0
  367. package/dist/modules/index.js +44 -0
  368. package/dist/modules/index.js.map +1 -0
  369. package/dist/modules/overrides.d.ts +17 -0
  370. package/dist/modules/overrides.js +25 -0
  371. package/dist/modules/overrides.js.map +1 -0
  372. package/dist/modules/registry.d.ts +40 -0
  373. package/dist/modules/registry.js +79 -0
  374. package/dist/modules/registry.js.map +1 -0
  375. package/dist/modules/types.d.ts +66 -0
  376. package/dist/modules/types.js +1 -0
  377. package/dist/modules/types.js.map +1 -0
  378. package/dist/patterns/builtins.d.ts +31 -0
  379. package/dist/patterns/builtins.js +415 -0
  380. package/dist/patterns/builtins.js.map +1 -0
  381. package/dist/patterns/index.d.ts +6 -0
  382. package/dist/patterns/index.js +9 -0
  383. package/dist/patterns/index.js.map +1 -0
  384. package/dist/patterns/patterns.d.ts +28 -0
  385. package/dist/patterns/patterns.js +53 -0
  386. package/dist/patterns/patterns.js.map +1 -0
  387. package/dist/render/PageRenderer.d.ts +13 -0
  388. package/dist/render/PageRenderer.js +14 -0
  389. package/dist/render/PageRenderer.js.map +1 -0
  390. package/dist/render/PublishedPage.d.ts +13 -0
  391. package/dist/render/PublishedPage.js +16 -0
  392. package/dist/render/PublishedPage.js.map +1 -0
  393. package/dist/schema/blocks.d.ts +15052 -0
  394. package/dist/schema/blocks.js +794 -0
  395. package/dist/schema/blocks.js.map +1 -0
  396. package/dist/schema/forms.d.ts +111 -0
  397. package/dist/schema/forms.js +47 -0
  398. package/dist/schema/forms.js.map +1 -0
  399. package/dist/schema/index.d.ts +11 -0
  400. package/dist/schema/index.js +16 -0
  401. package/dist/schema/index.js.map +1 -0
  402. package/dist/schema/pages.d.ts +674 -0
  403. package/dist/schema/pages.js +37 -0
  404. package/dist/schema/pages.js.map +1 -0
  405. package/dist/schema/seo.d.ts +29 -0
  406. package/dist/schema/seo.js +17 -0
  407. package/dist/schema/seo.js.map +1 -0
  408. package/dist/schema/settings.d.ts +1126 -0
  409. package/dist/schema/settings.js +128 -0
  410. package/dist/schema/settings.js.map +1 -0
  411. package/dist/schema/siteConfig.d.ts +722 -0
  412. package/dist/schema/siteConfig.js +39 -0
  413. package/dist/schema/siteConfig.js.map +1 -0
  414. package/dist/server/env.d.ts +10 -0
  415. package/dist/server/env.js +36 -0
  416. package/dist/server/env.js.map +1 -0
  417. package/dist/server/index.d.ts +10 -0
  418. package/dist/server/index.js +51 -0
  419. package/dist/server/index.js.map +1 -0
  420. package/dist/server/pages.d.ts +15 -0
  421. package/dist/server/pages.js +99 -0
  422. package/dist/server/pages.js.map +1 -0
  423. package/dist/server/sanitize.d.ts +2 -0
  424. package/dist/server/sanitize.js +55 -0
  425. package/dist/server/sanitize.js.map +1 -0
  426. package/dist/server/seo.d.ts +116 -0
  427. package/dist/server/seo.js +179 -0
  428. package/dist/server/seo.js.map +1 -0
  429. package/dist/settings/useSiteSettings.d.ts +25 -0
  430. package/dist/settings/useSiteSettings.js +68 -0
  431. package/dist/settings/useSiteSettings.js.map +1 -0
  432. package/dist/styles.css +2495 -0
  433. package/dist/theme/presets.d.ts +12 -0
  434. package/dist/theme/presets.js +147 -0
  435. package/dist/theme/presets.js.map +1 -0
  436. package/package.json +112 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/admin/NewsEditor.tsx"],"sourcesContent":["\"use client\";\n\nimport { useRef, useState } from \"react\";\nimport { addDoc, collection, deleteDoc, doc, serverTimestamp, updateDoc } from \"firebase/firestore\";\nimport { getDb } from \"../firebase/client\";\nimport { useSiteConfig } from \"../config\";\nimport { useNews } from \"../components/News\";\nimport { uploadImage } from \"./lib/upload\";\nimport { slugify } from \"./lib/slugify\";\nimport { useConfirm } from \"./ui/ConfirmDialog\";\nimport { useToast } from \"./ui/toast\";\nimport { Button, Card, Field, Input, Textarea, Badge } from \"./ui/primitives\";\nimport { RichTextEditor } from \"./editors/RichTextEditor\";\nimport type { NewsArticle } from \"../content/types\";\n\nconst empty = { title: \"\", excerpt: \"\", body: \"\", bodyHtml: \"\", coverUrl: \"\", date: \"\", published: false };\n\n/** Beheer van nieuwsartikelen — zelfde look & feel als de rest van /beheer. */\nexport function NewsEditor() {\n const { siteId } = useSiteConfig();\n const { articles } = useNews({ onlyPublished: false });\n const confirm = useConfirm();\n const { toast } = useToast();\n const [form, setForm] = useState<typeof empty>(empty);\n const [editingId, setEditingId] = useState<string | null>(null);\n const [busy, setBusy] = useState(false);\n const [coverBusy, setCoverBusy] = useState(false);\n const coverInputRef = useRef<HTMLInputElement>(null);\n\n function reset() {\n setForm(empty);\n setEditingId(null);\n }\n\n function loadIntoForm(a: NewsArticle) {\n setEditingId(a.id);\n setForm({\n title: a.title,\n excerpt: a.excerpt ?? \"\",\n body: a.body,\n bodyHtml: a.bodyHtml ?? \"\",\n coverUrl: a.coverUrl ?? \"\",\n date: a.date,\n published: a.published,\n });\n }\n\n async function save() {\n const db = getDb();\n if (!db) return;\n if (!form.title.trim()) {\n toast({ title: \"Titel ontbreekt\", description: \"Geef het artikel een titel.\", tone: \"error\" });\n return;\n }\n setBusy(true);\n try {\n const payload = {\n title: form.title.trim(),\n slug: slugify(form.title),\n excerpt: form.excerpt.trim(),\n body: form.body,\n // Rich text (client-side al door DOMPurify gehaald in de editor; de weergave sanitized\n // bovendien opnieuw bij het renderen — dubbele verdediging).\n bodyHtml: form.bodyHtml,\n coverUrl: form.coverUrl.trim(),\n date: form.date || new Date().toISOString().slice(0, 10),\n published: form.published,\n updatedAt: serverTimestamp(),\n };\n if (editingId) {\n await updateDoc(doc(db, \"sites\", siteId, \"news\", editingId), payload);\n } else {\n await addDoc(collection(db, \"sites\", siteId, \"news\"), { ...payload, createdAt: serverTimestamp() });\n }\n toast({ title: editingId ? \"Artikel bijgewerkt\" : \"Artikel opgeslagen\", tone: \"success\" });\n reset();\n } catch (e) {\n toast({ title: \"Opslaan mislukt\", description: (e as Error).message, tone: \"error\" });\n } finally {\n setBusy(false);\n }\n }\n\n async function remove(id: string, title: string) {\n const db = getDb();\n if (!db) return;\n const ok = await confirm({\n title: \"Artikel verwijderen?\",\n description: `“${title}” wordt definitief verwijderd.`,\n confirmLabel: \"Verwijderen\",\n tone: \"danger\",\n });\n if (!ok) return;\n await deleteDoc(doc(db, \"sites\", siteId, \"news\", id));\n if (editingId === id) reset();\n toast({ title: \"Artikel verwijderd\", tone: \"success\" });\n }\n\n async function onCover(file: File) {\n setCoverBusy(true);\n try {\n const { url } = await uploadImage(siteId, file);\n setForm((prev) => ({ ...prev, coverUrl: url }));\n toast({ title: \"Foto toegevoegd\", description: \"Automatisch verkleind voor het web.\", tone: \"success\" });\n } catch (e) {\n toast({ title: \"Upload mislukt\", description: (e as Error).message, tone: \"error\" });\n } finally {\n setCoverBusy(false);\n }\n }\n\n return (\n <div className=\"grid gap-4\">\n <Card>\n <div className=\"mb-3 flex items-center justify-between\">\n <h3 className=\"text-base font-semibold\">{editingId ? \"Artikel bewerken\" : \"Nieuw artikel\"}</h3>\n {editingId && (\n <Button variant=\"secondary\" size=\"sm\" onClick={reset}>+ Nieuw artikel</Button>\n )}\n </div>\n <div className=\"grid gap-3\">\n <Field label=\"Titel\">\n <Input value={form.title} onChange={(e) => setForm({ ...form, title: e.target.value })} placeholder=\"Kop van het artikel\" />\n </Field>\n <Field label=\"Korte samenvatting\" hint=\"Verschijnt in de nieuwslijst.\">\n <Input value={form.excerpt} onChange={(e) => setForm({ ...form, excerpt: e.target.value })} />\n </Field>\n <Field label=\"Coverfoto\">\n <div className=\"flex items-center gap-2\">\n <Input value={form.coverUrl} onChange={(e) => setForm({ ...form, coverUrl: e.target.value })} placeholder=\"URL of upload →\" />\n <Button type=\"button\" variant=\"secondary\" size=\"sm\" disabled={coverBusy} onClick={() => coverInputRef.current?.click()}>\n {coverBusy ? \"Uploaden…\" : \"Upload\"}\n </Button>\n <input\n ref={coverInputRef}\n type=\"file\"\n accept=\"image/*\"\n hidden\n onChange={(e) => {\n const f = e.target.files?.[0];\n if (f) void onCover(f);\n e.target.value = \"\";\n }}\n />\n </div>\n </Field>\n {form.coverUrl && (\n // eslint-disable-next-line @next/next/no-img-element\n <img src={form.coverUrl} alt=\"\" className=\"h-32 w-full rounded-lg object-cover\" />\n )}\n <div className=\"grid gap-3 md:grid-cols-2\">\n <Field label=\"Datum\">\n <Input type=\"date\" value={form.date} onChange={(e) => setForm({ ...form, date: e.target.value })} />\n </Field>\n <Field label=\"Zichtbaarheid\" hint=\"Aangevinkt = direct zichtbaar op de site; uit = concept.\">\n <label className=\"flex h-9 items-center gap-2 text-sm\">\n <input type=\"checkbox\" checked={form.published} onChange={(e) => setForm({ ...form, published: e.target.checked })} />\n Gepubliceerd\n </label>\n </Field>\n </div>\n <Field label=\"Tekst\" hint=\"Met opmaak (koppen, lijsten, links, afbeeldingen). Bestaande artikelen zonder opmaak blijven gewoon werken.\">\n <RichTextEditor\n siteId={siteId}\n value={form.bodyHtml || (form.body ? `<p>${form.body.split(/\\n{2,}/).join(\"</p><p>\")}</p>` : \"\")}\n onChange={(html) => setForm((f) => ({ ...f, bodyHtml: html }))}\n />\n </Field>\n <div>\n <Button disabled={busy} onClick={() => void save()}>\n {busy ? \"Opslaan…\" : editingId ? \"Wijzigingen opslaan\" : \"Artikel opslaan\"}\n </Button>\n </div>\n </div>\n </Card>\n\n <Card>\n <h3 className=\"mb-3 text-base font-semibold\">Artikelen</h3>\n {articles.length === 0 ? (\n <p className=\"text-sm text-slate-500\">Nog geen artikelen. Maak hierboven je eerste nieuwsartikel.</p>\n ) : (\n <div className=\"grid gap-2\">\n {articles.map((a) => (\n <div key={a.id} className=\"flex items-center justify-between gap-3 rounded-lg border border-slate-200 p-3\">\n <span className=\"flex items-center gap-2 text-sm\">\n <span className=\"font-medium\">{a.title}</span>\n <span className=\"text-slate-400\">· {a.date}</span>\n {a.published ? <Badge tone=\"green\">zichtbaar</Badge> : <Badge tone=\"amber\">concept</Badge>}\n </span>\n <span className=\"flex gap-2\">\n <Button variant=\"ghost\" size=\"sm\" onClick={() => loadIntoForm(a)}>Bewerk</Button>\n <Button variant=\"ghost\" size=\"sm\" onClick={() => void remove(a.id, a.title)}>Verwijder</Button>\n </span>\n </div>\n ))}\n </div>\n )}\n </Card>\n </div>\n );\n}\n"],"mappings":";AAkHQ,SACE,KADF;AAhHR,SAAS,QAAQ,gBAAgB;AACjC,SAAS,QAAQ,YAAY,WAAW,KAAK,iBAAiB,iBAAiB;AAC/E,SAAS,aAAa;AACtB,SAAS,qBAAqB;AAC9B,SAAS,eAAe;AACxB,SAAS,mBAAmB;AAC5B,SAAS,eAAe;AACxB,SAAS,kBAAkB;AAC3B,SAAS,gBAAgB;AACzB,SAAS,QAAQ,MAAM,OAAO,OAAiB,aAAa;AAC5D,SAAS,sBAAsB;AAG/B,MAAM,QAAQ,EAAE,OAAO,IAAI,SAAS,IAAI,MAAM,IAAI,UAAU,IAAI,UAAU,IAAI,MAAM,IAAI,WAAW,MAAM;AAGlG,SAAS,aAAa;AAC3B,QAAM,EAAE,OAAO,IAAI,cAAc;AACjC,QAAM,EAAE,SAAS,IAAI,QAAQ,EAAE,eAAe,MAAM,CAAC;AACrD,QAAM,UAAU,WAAW;AAC3B,QAAM,EAAE,MAAM,IAAI,SAAS;AAC3B,QAAM,CAAC,MAAM,OAAO,IAAI,SAAuB,KAAK;AACpD,QAAM,CAAC,WAAW,YAAY,IAAI,SAAwB,IAAI;AAC9D,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,KAAK;AACtC,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,KAAK;AAChD,QAAM,gBAAgB,OAAyB,IAAI;AAEnD,WAAS,QAAQ;AACf,YAAQ,KAAK;AACb,iBAAa,IAAI;AAAA,EACnB;AAEA,WAAS,aAAa,GAAgB;AACpC,iBAAa,EAAE,EAAE;AACjB,YAAQ;AAAA,MACN,OAAO,EAAE;AAAA,MACT,SAAS,EAAE,WAAW;AAAA,MACtB,MAAM,EAAE;AAAA,MACR,UAAU,EAAE,YAAY;AAAA,MACxB,UAAU,EAAE,YAAY;AAAA,MACxB,MAAM,EAAE;AAAA,MACR,WAAW,EAAE;AAAA,IACf,CAAC;AAAA,EACH;AAEA,iBAAe,OAAO;AACpB,UAAM,KAAK,MAAM;AACjB,QAAI,CAAC,GAAI;AACT,QAAI,CAAC,KAAK,MAAM,KAAK,GAAG;AACtB,YAAM,EAAE,OAAO,mBAAmB,aAAa,+BAA+B,MAAM,QAAQ,CAAC;AAC7F;AAAA,IACF;AACA,YAAQ,IAAI;AACZ,QAAI;AACF,YAAM,UAAU;AAAA,QACd,OAAO,KAAK,MAAM,KAAK;AAAA,QACvB,MAAM,QAAQ,KAAK,KAAK;AAAA,QACxB,SAAS,KAAK,QAAQ,KAAK;AAAA,QAC3B,MAAM,KAAK;AAAA;AAAA;AAAA,QAGX,UAAU,KAAK;AAAA,QACf,UAAU,KAAK,SAAS,KAAK;AAAA,QAC7B,MAAM,KAAK,SAAQ,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AAAA,QACvD,WAAW,KAAK;AAAA,QAChB,WAAW,gBAAgB;AAAA,MAC7B;AACA,UAAI,WAAW;AACb,cAAM,UAAU,IAAI,IAAI,SAAS,QAAQ,QAAQ,SAAS,GAAG,OAAO;AAAA,MACtE,OAAO;AACL,cAAM,OAAO,WAAW,IAAI,SAAS,QAAQ,MAAM,GAAG,EAAE,GAAG,SAAS,WAAW,gBAAgB,EAAE,CAAC;AAAA,MACpG;AACA,YAAM,EAAE,OAAO,YAAY,uBAAuB,sBAAsB,MAAM,UAAU,CAAC;AACzF,YAAM;AAAA,IACR,SAAS,GAAG;AACV,YAAM,EAAE,OAAO,mBAAmB,aAAc,EAAY,SAAS,MAAM,QAAQ,CAAC;AAAA,IACtF,UAAE;AACA,cAAQ,KAAK;AAAA,IACf;AAAA,EACF;AAEA,iBAAe,OAAO,IAAY,OAAe;AAC/C,UAAM,KAAK,MAAM;AACjB,QAAI,CAAC,GAAI;AACT,UAAM,KAAK,MAAM,QAAQ;AAAA,MACvB,OAAO;AAAA,MACP,aAAa,SAAI,KAAK;AAAA,MACtB,cAAc;AAAA,MACd,MAAM;AAAA,IACR,CAAC;AACD,QAAI,CAAC,GAAI;AACT,UAAM,UAAU,IAAI,IAAI,SAAS,QAAQ,QAAQ,EAAE,CAAC;AACpD,QAAI,cAAc,GAAI,OAAM;AAC5B,UAAM,EAAE,OAAO,sBAAsB,MAAM,UAAU,CAAC;AAAA,EACxD;AAEA,iBAAe,QAAQ,MAAY;AACjC,iBAAa,IAAI;AACjB,QAAI;AACF,YAAM,EAAE,IAAI,IAAI,MAAM,YAAY,QAAQ,IAAI;AAC9C,cAAQ,CAAC,UAAU,EAAE,GAAG,MAAM,UAAU,IAAI,EAAE;AAC9C,YAAM,EAAE,OAAO,mBAAmB,aAAa,uCAAuC,MAAM,UAAU,CAAC;AAAA,IACzG,SAAS,GAAG;AACV,YAAM,EAAE,OAAO,kBAAkB,aAAc,EAAY,SAAS,MAAM,QAAQ,CAAC;AAAA,IACrF,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF;AAEA,SACE,qBAAC,SAAI,WAAU,cACb;AAAA,yBAAC,QACC;AAAA,2BAAC,SAAI,WAAU,0CACb;AAAA,4BAAC,QAAG,WAAU,2BAA2B,sBAAY,qBAAqB,iBAAgB;AAAA,QACzF,aACC,oBAAC,UAAO,SAAQ,aAAY,MAAK,MAAK,SAAS,OAAO,6BAAe;AAAA,SAEzE;AAAA,MACA,qBAAC,SAAI,WAAU,cACb;AAAA,4BAAC,SAAM,OAAM,SACX,8BAAC,SAAM,OAAO,KAAK,OAAO,UAAU,CAAC,MAAM,QAAQ,EAAE,GAAG,MAAM,OAAO,EAAE,OAAO,MAAM,CAAC,GAAG,aAAY,uBAAsB,GAC5H;AAAA,QACA,oBAAC,SAAM,OAAM,sBAAqB,MAAK,iCACrC,8BAAC,SAAM,OAAO,KAAK,SAAS,UAAU,CAAC,MAAM,QAAQ,EAAE,GAAG,MAAM,SAAS,EAAE,OAAO,MAAM,CAAC,GAAG,GAC9F;AAAA,QACA,oBAAC,SAAM,OAAM,aACX,+BAAC,SAAI,WAAU,2BACb;AAAA,8BAAC,SAAM,OAAO,KAAK,UAAU,UAAU,CAAC,MAAM,QAAQ,EAAE,GAAG,MAAM,UAAU,EAAE,OAAO,MAAM,CAAC,GAAG,aAAY,wBAAkB;AAAA,UAC5H,oBAAC,UAAO,MAAK,UAAS,SAAQ,aAAY,MAAK,MAAK,UAAU,WAAW,SAAS,MAAM,cAAc,SAAS,MAAM,GAClH,sBAAY,mBAAc,UAC7B;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,KAAK;AAAA,cACL,MAAK;AAAA,cACL,QAAO;AAAA,cACP,QAAM;AAAA,cACN,UAAU,CAAC,MAAM;AACf,sBAAM,IAAI,EAAE,OAAO,QAAQ,CAAC;AAC5B,oBAAI,EAAG,MAAK,QAAQ,CAAC;AACrB,kBAAE,OAAO,QAAQ;AAAA,cACnB;AAAA;AAAA,UACF;AAAA,WACF,GACF;AAAA,QACC,KAAK;AAAA,QAEJ,oBAAC,SAAI,KAAK,KAAK,UAAU,KAAI,IAAG,WAAU,uCAAsC;AAAA,QAElF,qBAAC,SAAI,WAAU,6BACb;AAAA,8BAAC,SAAM,OAAM,SACX,8BAAC,SAAM,MAAK,QAAO,OAAO,KAAK,MAAM,UAAU,CAAC,MAAM,QAAQ,EAAE,GAAG,MAAM,MAAM,EAAE,OAAO,MAAM,CAAC,GAAG,GACpG;AAAA,UACA,oBAAC,SAAM,OAAM,iBAAgB,MAAK,4DAChC,+BAAC,WAAM,WAAU,uCACf;AAAA,gCAAC,WAAM,MAAK,YAAW,SAAS,KAAK,WAAW,UAAU,CAAC,MAAM,QAAQ,EAAE,GAAG,MAAM,WAAW,EAAE,OAAO,QAAQ,CAAC,GAAG;AAAA,YAAE;AAAA,aAExH,GACF;AAAA,WACF;AAAA,QACA,oBAAC,SAAM,OAAM,SAAQ,MAAK,+GACxB;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA,OAAO,KAAK,aAAa,KAAK,OAAO,MAAM,KAAK,KAAK,MAAM,QAAQ,EAAE,KAAK,SAAS,CAAC,SAAS;AAAA,YAC7F,UAAU,CAAC,SAAS,QAAQ,CAAC,OAAO,EAAE,GAAG,GAAG,UAAU,KAAK,EAAE;AAAA;AAAA,QAC/D,GACF;AAAA,QACA,oBAAC,SACC,8BAAC,UAAO,UAAU,MAAM,SAAS,MAAM,KAAK,KAAK,GAC9C,iBAAO,kBAAa,YAAY,wBAAwB,mBAC3D,GACF;AAAA,SACF;AAAA,OACF;AAAA,IAEA,qBAAC,QACC;AAAA,0BAAC,QAAG,WAAU,gCAA+B,uBAAS;AAAA,MACrD,SAAS,WAAW,IACnB,oBAAC,OAAE,WAAU,0BAAyB,yEAA2D,IAEjG,oBAAC,SAAI,WAAU,cACZ,mBAAS,IAAI,CAAC,MACb,qBAAC,SAAe,WAAU,kFACxB;AAAA,6BAAC,UAAK,WAAU,mCACd;AAAA,8BAAC,UAAK,WAAU,eAAe,YAAE,OAAM;AAAA,UACvC,qBAAC,UAAK,WAAU,kBAAiB;AAAA;AAAA,YAAG,EAAE;AAAA,aAAK;AAAA,UAC1C,EAAE,YAAY,oBAAC,SAAM,MAAK,SAAQ,uBAAS,IAAW,oBAAC,SAAM,MAAK,SAAQ,qBAAO;AAAA,WACpF;AAAA,QACA,qBAAC,UAAK,WAAU,cACd;AAAA,8BAAC,UAAO,SAAQ,SAAQ,MAAK,MAAK,SAAS,MAAM,aAAa,CAAC,GAAG,oBAAM;AAAA,UACxE,oBAAC,UAAO,SAAQ,SAAQ,MAAK,MAAK,SAAS,MAAM,KAAK,OAAO,EAAE,IAAI,EAAE,KAAK,GAAG,uBAAS;AAAA,WACxF;AAAA,WATQ,EAAE,EAUZ,CACD,GACH;AAAA,OAEJ;AAAA,KACF;AAEJ;","names":[]}
@@ -0,0 +1,4 @@
1
+ /** Superadmin: sites/accounts aanmaken, wachtwoord-reset versturen en audit-log inzien. */
2
+ export declare function SuperadminPanel({ siteId }: {
3
+ siteId: string;
4
+ }): import("react").JSX.Element;
@@ -0,0 +1,101 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { useEffect, useState } from "react";
4
+ import { collection, getDocs, limit, orderBy, query, where } from "firebase/firestore";
5
+ import { getFunctions, httpsCallable } from "firebase/functions";
6
+ import { getDb, getFirebaseApp } from "../firebase/client";
7
+ import { functionsRegion } from "../firebase/region";
8
+ import { Button, Card, Field, Input } from "./ui/primitives";
9
+ import { Select } from "./ui/select";
10
+ import { useToast } from "./ui/toast";
11
+ function callable(name) {
12
+ const app = getFirebaseApp();
13
+ if (!app) throw new Error("Firebase niet geconfigureerd.");
14
+ return httpsCallable(getFunctions(app, functionsRegion()), name);
15
+ }
16
+ function SuperadminPanel({ siteId }) {
17
+ const { toast } = useToast();
18
+ const [site, setSite] = useState({ siteId: "", name: "", domain: "" });
19
+ const [account, setAccount] = useState({ siteId: "", email: "", password: "", role: "siteadmin" });
20
+ const [resetEmail, setResetEmail] = useState("");
21
+ const [busy, setBusy] = useState(false);
22
+ const [audit, setAudit] = useState([]);
23
+ useEffect(() => {
24
+ const db = getDb();
25
+ if (!db) return;
26
+ const q = query(
27
+ collection(db, "audit_log"),
28
+ where("siteId", "in", [siteId, "*"]),
29
+ orderBy("at", "desc"),
30
+ limit(20)
31
+ );
32
+ getDocs(q).then((snap) => setAudit(snap.docs.map((d) => ({ id: d.id, ...d.data() })))).catch(() => setAudit([]));
33
+ }, [siteId]);
34
+ async function run(fn, ok) {
35
+ setBusy(true);
36
+ try {
37
+ const res = await fn();
38
+ toast({ title: res.data.message ?? ok, tone: "success" });
39
+ } catch (e) {
40
+ toast({ title: "Mislukt", description: e.message, tone: "error" });
41
+ } finally {
42
+ setBusy(false);
43
+ }
44
+ }
45
+ return /* @__PURE__ */ jsxs("div", { className: "grid gap-4 lg:grid-cols-2", children: [
46
+ /* @__PURE__ */ jsxs(Card, { children: [
47
+ /* @__PURE__ */ jsx("h3", { className: "mb-3 text-base font-semibold", children: "Nieuwe site" }),
48
+ /* @__PURE__ */ jsxs("div", { className: "grid gap-3", children: [
49
+ /* @__PURE__ */ jsx(Field, { label: "siteId", children: /* @__PURE__ */ jsx(Input, { value: site.siteId, onChange: (e) => setSite({ ...site, siteId: e.target.value }), placeholder: "bv. bakkerij-jansen" }) }),
50
+ /* @__PURE__ */ jsx(Field, { label: "Naam", children: /* @__PURE__ */ jsx(Input, { value: site.name, onChange: (e) => setSite({ ...site, name: e.target.value }) }) }),
51
+ /* @__PURE__ */ jsx(Field, { label: "Domein", children: /* @__PURE__ */ jsx(Input, { value: site.domain, onChange: (e) => setSite({ ...site, domain: e.target.value }) }) }),
52
+ /* @__PURE__ */ jsx(Button, { disabled: busy || !site.siteId, onClick: () => run(() => callable("createSite")(site), "Site aangemaakt"), children: "Site aanmaken" })
53
+ ] })
54
+ ] }),
55
+ /* @__PURE__ */ jsxs(Card, { children: [
56
+ /* @__PURE__ */ jsx("h3", { className: "mb-3 text-base font-semibold", children: "Beheeraccount" }),
57
+ /* @__PURE__ */ jsxs("div", { className: "grid gap-3", children: [
58
+ /* @__PURE__ */ jsx(Field, { label: "siteId", children: /* @__PURE__ */ jsx(Input, { value: account.siteId, onChange: (e) => setAccount({ ...account, siteId: e.target.value }) }) }),
59
+ /* @__PURE__ */ jsx(Field, { label: "E-mail", children: /* @__PURE__ */ jsx(Input, { type: "email", value: account.email, onChange: (e) => setAccount({ ...account, email: e.target.value }) }) }),
60
+ /* @__PURE__ */ jsx(Field, { label: "Tijdelijk wachtwoord", children: /* @__PURE__ */ jsx(Input, { value: account.password, onChange: (e) => setAccount({ ...account, password: e.target.value }) }) }),
61
+ /* @__PURE__ */ jsx(Field, { label: "Rol", children: /* @__PURE__ */ jsx(
62
+ Select,
63
+ {
64
+ value: account.role,
65
+ onValueChange: (v) => setAccount({ ...account, role: v }),
66
+ options: [
67
+ { value: "siteadmin", label: "siteadmin (volledig)" },
68
+ { value: "editor", label: "editor (alleen content)" }
69
+ ]
70
+ }
71
+ ) }),
72
+ /* @__PURE__ */ jsx(Button, { disabled: busy || !account.siteId || !account.email, onClick: () => run(() => callable("createSiteAccount")(account), "Account aangemaakt"), children: "Account aanmaken" })
73
+ ] })
74
+ ] }),
75
+ /* @__PURE__ */ jsxs(Card, { children: [
76
+ /* @__PURE__ */ jsx("h3", { className: "mb-3 text-base font-semibold", children: "Wachtwoord-reset versturen" }),
77
+ /* @__PURE__ */ jsxs("div", { className: "grid gap-3", children: [
78
+ /* @__PURE__ */ jsx(Field, { label: "E-mail", children: /* @__PURE__ */ jsx(Input, { type: "email", value: resetEmail, onChange: (e) => setResetEmail(e.target.value) }) }),
79
+ /* @__PURE__ */ jsx(Button, { variant: "secondary", disabled: busy || !resetEmail, onClick: () => run(() => callable("requestPasswordReset")({ email: resetEmail }), "Reset-link verstuurd"), children: "Reset-link versturen" })
80
+ ] })
81
+ ] }),
82
+ /* @__PURE__ */ jsxs(Card, { children: [
83
+ /* @__PURE__ */ jsx("h3", { className: "mb-3 text-base font-semibold", children: "Audit-log (laatste 20)" }),
84
+ audit.length === 0 ? /* @__PURE__ */ jsx("p", { className: "text-sm text-slate-500", children: "Geen recente acties (of geen rechten/index)." }) : /* @__PURE__ */ jsx("ul", { className: "text-sm text-slate-600", children: audit.map((a) => /* @__PURE__ */ jsxs("li", { className: "border-b border-slate-100 py-1 last:border-0", children: [
85
+ /* @__PURE__ */ jsx("span", { className: "font-medium", children: a.action }),
86
+ " \xB7 ",
87
+ a.target,
88
+ " ",
89
+ /* @__PURE__ */ jsxs("span", { className: "text-slate-400", children: [
90
+ "(",
91
+ a.actorUid?.slice(0, 6),
92
+ ")"
93
+ ] })
94
+ ] }, a.id)) })
95
+ ] })
96
+ ] });
97
+ }
98
+ export {
99
+ SuperadminPanel
100
+ };
101
+ //# sourceMappingURL=SuperadminPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/admin/SuperadminPanel.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { collection, getDocs, limit, orderBy, query, where } from \"firebase/firestore\";\nimport { getFunctions, httpsCallable } from \"firebase/functions\";\nimport { getDb, getFirebaseApp } from \"../firebase/client\";\nimport { functionsRegion } from \"../firebase/region\";\nimport { Button, Card, Field, Input } from \"./ui/primitives\";\nimport { Select } from \"./ui/select\";\nimport { useToast } from \"./ui/toast\";\n\nfunction callable<T>(name: string) {\n const app = getFirebaseApp();\n if (!app) throw new Error(\"Firebase niet geconfigureerd.\");\n return httpsCallable<T, { message?: string }>(getFunctions(app, functionsRegion()), name);\n}\n\n/** Superadmin: sites/accounts aanmaken, wachtwoord-reset versturen en audit-log inzien. */\nexport function SuperadminPanel({ siteId }: { siteId: string }) {\n const { toast } = useToast();\n const [site, setSite] = useState({ siteId: \"\", name: \"\", domain: \"\" });\n const [account, setAccount] = useState({ siteId: \"\", email: \"\", password: \"\", role: \"siteadmin\" });\n const [resetEmail, setResetEmail] = useState(\"\");\n const [busy, setBusy] = useState(false);\n const [audit, setAudit] = useState<{ id: string; action?: string; target?: string; actorUid?: string }[]>([]);\n\n useEffect(() => {\n const db = getDb();\n if (!db) return;\n const q = query(\n collection(db, \"audit_log\"),\n where(\"siteId\", \"in\", [siteId, \"*\"]),\n orderBy(\"at\", \"desc\"),\n limit(20),\n );\n getDocs(q)\n .then((snap) => setAudit(snap.docs.map((d) => ({ id: d.id, ...(d.data() as Record<string, string>) }))))\n .catch(() => setAudit([]));\n }, [siteId]);\n\n async function run(fn: () => Promise<{ data: { message?: string } }>, ok: string) {\n setBusy(true);\n try {\n const res = await fn();\n toast({ title: res.data.message ?? ok, tone: \"success\" });\n } catch (e) {\n toast({ title: \"Mislukt\", description: (e as Error).message, tone: \"error\" });\n } finally {\n setBusy(false);\n }\n }\n\n return (\n <div className=\"grid gap-4 lg:grid-cols-2\">\n <Card>\n <h3 className=\"mb-3 text-base font-semibold\">Nieuwe site</h3>\n <div className=\"grid gap-3\">\n <Field label=\"siteId\"><Input value={site.siteId} onChange={(e) => setSite({ ...site, siteId: e.target.value })} placeholder=\"bv. bakkerij-jansen\" /></Field>\n <Field label=\"Naam\"><Input value={site.name} onChange={(e) => setSite({ ...site, name: e.target.value })} /></Field>\n <Field label=\"Domein\"><Input value={site.domain} onChange={(e) => setSite({ ...site, domain: e.target.value })} /></Field>\n <Button disabled={busy || !site.siteId} onClick={() => run(() => callable<typeof site>(\"createSite\")(site), \"Site aangemaakt\")}>\n Site aanmaken\n </Button>\n </div>\n </Card>\n\n <Card>\n <h3 className=\"mb-3 text-base font-semibold\">Beheeraccount</h3>\n <div className=\"grid gap-3\">\n <Field label=\"siteId\"><Input value={account.siteId} onChange={(e) => setAccount({ ...account, siteId: e.target.value })} /></Field>\n <Field label=\"E-mail\"><Input type=\"email\" value={account.email} onChange={(e) => setAccount({ ...account, email: e.target.value })} /></Field>\n <Field label=\"Tijdelijk wachtwoord\"><Input value={account.password} onChange={(e) => setAccount({ ...account, password: e.target.value })} /></Field>\n <Field label=\"Rol\">\n <Select\n value={account.role}\n onValueChange={(v) => setAccount({ ...account, role: v })}\n options={[\n { value: \"siteadmin\", label: \"siteadmin (volledig)\" },\n { value: \"editor\", label: \"editor (alleen content)\" },\n ]}\n />\n </Field>\n <Button disabled={busy || !account.siteId || !account.email} onClick={() => run(() => callable<typeof account>(\"createSiteAccount\")(account), \"Account aangemaakt\")}>\n Account aanmaken\n </Button>\n </div>\n </Card>\n\n <Card>\n <h3 className=\"mb-3 text-base font-semibold\">Wachtwoord-reset versturen</h3>\n <div className=\"grid gap-3\">\n <Field label=\"E-mail\"><Input type=\"email\" value={resetEmail} onChange={(e) => setResetEmail(e.target.value)} /></Field>\n <Button variant=\"secondary\" disabled={busy || !resetEmail} onClick={() => run(() => callable<{ email: string }>(\"requestPasswordReset\")({ email: resetEmail }), \"Reset-link verstuurd\")}>\n Reset-link versturen\n </Button>\n </div>\n </Card>\n\n <Card>\n <h3 className=\"mb-3 text-base font-semibold\">Audit-log (laatste 20)</h3>\n {audit.length === 0 ? (\n <p className=\"text-sm text-slate-500\">Geen recente acties (of geen rechten/index).</p>\n ) : (\n <ul className=\"text-sm text-slate-600\">\n {audit.map((a) => (\n <li key={a.id} className=\"border-b border-slate-100 py-1 last:border-0\">\n <span className=\"font-medium\">{a.action}</span> · {a.target} <span className=\"text-slate-400\">({a.actorUid?.slice(0, 6)})</span>\n </li>\n ))}\n </ul>\n )}\n </Card>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,10 @@
1
+ import type { BlockStyle } from "../../schema/blocks";
2
+ /**
3
+ * Inklapbare "Blokstijl"-sectie die voor ELK block beschikbaar is (gedeelde `_style`): verticale
4
+ * ruimte, achtergrond, breedte, uitlijning en een anker-id. Wordt generiek aan de block-editors
5
+ * toegevoegd, dus elk block krijgt deze opties zonder zijn editor te wijzigen.
6
+ */
7
+ export declare function StyleEditor({ value, onChange, }: {
8
+ value?: BlockStyle;
9
+ onChange: (style: BlockStyle) => void;
10
+ }): import("react").JSX.Element;
@@ -0,0 +1,78 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { Field, Input } from "../ui/primitives";
4
+ import { Select } from "../ui/select";
5
+ function StyleEditor({
6
+ value = {},
7
+ onChange
8
+ }) {
9
+ const update = (part) => onChange({ ...value, ...part });
10
+ return /* @__PURE__ */ jsxs("details", { className: "rounded-lg border border-slate-200 p-3", children: [
11
+ /* @__PURE__ */ jsx("summary", { className: "cursor-pointer text-sm font-medium text-slate-700", children: "Blokstijl" }),
12
+ /* @__PURE__ */ jsxs("div", { className: "mt-3 grid gap-3", children: [
13
+ /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-3", children: [
14
+ /* @__PURE__ */ jsx(Field, { label: "Ruimte boven/onder", children: /* @__PURE__ */ jsx(
15
+ Select,
16
+ {
17
+ value: value.paddingY ?? "",
18
+ onValueChange: (v) => update({ paddingY: v || void 0 }),
19
+ options: [
20
+ { value: "", label: "Standaard" },
21
+ { value: "none", label: "Geen" },
22
+ { value: "sm", label: "Klein" },
23
+ { value: "md", label: "Normaal" },
24
+ { value: "lg", label: "Groot" },
25
+ { value: "xl", label: "Extra groot" }
26
+ ]
27
+ }
28
+ ) }),
29
+ /* @__PURE__ */ jsx(Field, { label: "Breedte", children: /* @__PURE__ */ jsx(
30
+ Select,
31
+ {
32
+ value: value.width ?? "",
33
+ onValueChange: (v) => update({ width: v || void 0 }),
34
+ options: [
35
+ { value: "", label: "Standaard" },
36
+ { value: "narrow", label: "Smal" },
37
+ { value: "container", label: "Container" },
38
+ { value: "full", label: "Volle breedte" }
39
+ ]
40
+ }
41
+ ) }),
42
+ /* @__PURE__ */ jsx(Field, { label: "Uitlijning", children: /* @__PURE__ */ jsx(
43
+ Select,
44
+ {
45
+ value: value.align ?? "",
46
+ onValueChange: (v) => update({ align: v || void 0 }),
47
+ options: [
48
+ { value: "", label: "Standaard" },
49
+ { value: "left", label: "Links" },
50
+ { value: "center", label: "Midden" },
51
+ { value: "right", label: "Rechts" }
52
+ ]
53
+ }
54
+ ) }),
55
+ /* @__PURE__ */ jsx(Field, { label: "Achtergrond (kleur)", children: /* @__PURE__ */ jsx(Input, { value: value.background ?? "", onChange: (e) => update({ background: e.target.value || void 0 }), placeholder: "#f8fafc" }) })
56
+ ] }),
57
+ /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-3", children: [
58
+ /* @__PURE__ */ jsx(Field, { label: "Anker-id (voor #deeplinks)", children: /* @__PURE__ */ jsx(Input, { value: value.anchorId ?? "", onChange: (e) => update({ anchorId: e.target.value || void 0 }), placeholder: "bv. contact" }) }),
59
+ /* @__PURE__ */ jsx(Field, { label: "Animatie (bij scrollen)", children: /* @__PURE__ */ jsx(
60
+ Select,
61
+ {
62
+ value: value.animate ?? "",
63
+ onValueChange: (v) => update({ animate: v || void 0 }),
64
+ options: [
65
+ { value: "", label: "Geen" },
66
+ { value: "fade", label: "Vervagen" },
67
+ { value: "up", label: "Omhoog schuiven" }
68
+ ]
69
+ }
70
+ ) })
71
+ ] })
72
+ ] })
73
+ ] });
74
+ }
75
+ export {
76
+ StyleEditor
77
+ };
78
+ //# sourceMappingURL=StyleEditor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/admin/blockEditors/StyleEditor.tsx"],"sourcesContent":["\"use client\";\n\nimport type { BlockStyle } from \"../../schema/blocks\";\nimport { Field, Input } from \"../ui/primitives\";\nimport { Select } from \"../ui/select\";\n\n/**\n * Inklapbare \"Blokstijl\"-sectie die voor ELK block beschikbaar is (gedeelde `_style`): verticale\n * ruimte, achtergrond, breedte, uitlijning en een anker-id. Wordt generiek aan de block-editors\n * toegevoegd, dus elk block krijgt deze opties zonder zijn editor te wijzigen.\n */\nexport function StyleEditor({\n value = {},\n onChange,\n}: {\n value?: BlockStyle;\n onChange: (style: BlockStyle) => void;\n}) {\n const update = (part: Partial<BlockStyle>) => onChange({ ...value, ...part });\n return (\n <details className=\"rounded-lg border border-slate-200 p-3\">\n <summary className=\"cursor-pointer text-sm font-medium text-slate-700\">Blokstijl</summary>\n <div className=\"mt-3 grid gap-3\">\n <div className=\"grid grid-cols-2 gap-3\">\n <Field label=\"Ruimte boven/onder\">\n <Select\n value={value.paddingY ?? \"\"}\n onValueChange={(v) => update({ paddingY: (v || undefined) as BlockStyle[\"paddingY\"] })}\n options={[\n { value: \"\", label: \"Standaard\" },\n { value: \"none\", label: \"Geen\" },\n { value: \"sm\", label: \"Klein\" },\n { value: \"md\", label: \"Normaal\" },\n { value: \"lg\", label: \"Groot\" },\n { value: \"xl\", label: \"Extra groot\" },\n ]}\n />\n </Field>\n <Field label=\"Breedte\">\n <Select\n value={value.width ?? \"\"}\n onValueChange={(v) => update({ width: (v || undefined) as BlockStyle[\"width\"] })}\n options={[\n { value: \"\", label: \"Standaard\" },\n { value: \"narrow\", label: \"Smal\" },\n { value: \"container\", label: \"Container\" },\n { value: \"full\", label: \"Volle breedte\" },\n ]}\n />\n </Field>\n <Field label=\"Uitlijning\">\n <Select\n value={value.align ?? \"\"}\n onValueChange={(v) => update({ align: (v || undefined) as BlockStyle[\"align\"] })}\n options={[\n { value: \"\", label: \"Standaard\" },\n { value: \"left\", label: \"Links\" },\n { value: \"center\", label: \"Midden\" },\n { value: \"right\", label: \"Rechts\" },\n ]}\n />\n </Field>\n <Field label=\"Achtergrond (kleur)\">\n <Input value={value.background ?? \"\"} onChange={(e) => update({ background: e.target.value || undefined })} placeholder=\"#f8fafc\" />\n </Field>\n </div>\n <div className=\"grid grid-cols-2 gap-3\">\n <Field label=\"Anker-id (voor #deeplinks)\">\n <Input value={value.anchorId ?? \"\"} onChange={(e) => update({ anchorId: e.target.value || undefined })} placeholder=\"bv. contact\" />\n </Field>\n <Field label=\"Animatie (bij scrollen)\">\n <Select\n value={value.animate ?? \"\"}\n onValueChange={(v) => update({ animate: (v || undefined) as BlockStyle[\"animate\"] })}\n options={[\n { value: \"\", label: \"Geen\" },\n { value: \"fade\", label: \"Vervagen\" },\n { value: \"up\", label: \"Omhoog schuiven\" },\n ]}\n />\n </Field>\n </div>\n </div>\n </details>\n );\n}\n"],"mappings":";AAqBM,cAEE,YAFF;AAlBN,SAAS,OAAO,aAAa;AAC7B,SAAS,cAAc;AAOhB,SAAS,YAAY;AAAA,EAC1B,QAAQ,CAAC;AAAA,EACT;AACF,GAGG;AACD,QAAM,SAAS,CAAC,SAA8B,SAAS,EAAE,GAAG,OAAO,GAAG,KAAK,CAAC;AAC5E,SACE,qBAAC,aAAQ,WAAU,0CACjB;AAAA,wBAAC,aAAQ,WAAU,qDAAoD,uBAAS;AAAA,IAChF,qBAAC,SAAI,WAAU,mBACb;AAAA,2BAAC,SAAI,WAAU,0BACb;AAAA,4BAAC,SAAM,OAAM,sBACX;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,MAAM,YAAY;AAAA,YACzB,eAAe,CAAC,MAAM,OAAO,EAAE,UAAW,KAAK,OAAqC,CAAC;AAAA,YACrF,SAAS;AAAA,cACP,EAAE,OAAO,IAAI,OAAO,YAAY;AAAA,cAChC,EAAE,OAAO,QAAQ,OAAO,OAAO;AAAA,cAC/B,EAAE,OAAO,MAAM,OAAO,QAAQ;AAAA,cAC9B,EAAE,OAAO,MAAM,OAAO,UAAU;AAAA,cAChC,EAAE,OAAO,MAAM,OAAO,QAAQ;AAAA,cAC9B,EAAE,OAAO,MAAM,OAAO,cAAc;AAAA,YACtC;AAAA;AAAA,QACF,GACF;AAAA,QACA,oBAAC,SAAM,OAAM,WACX;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,MAAM,SAAS;AAAA,YACtB,eAAe,CAAC,MAAM,OAAO,EAAE,OAAQ,KAAK,OAAkC,CAAC;AAAA,YAC/E,SAAS;AAAA,cACP,EAAE,OAAO,IAAI,OAAO,YAAY;AAAA,cAChC,EAAE,OAAO,UAAU,OAAO,OAAO;AAAA,cACjC,EAAE,OAAO,aAAa,OAAO,YAAY;AAAA,cACzC,EAAE,OAAO,QAAQ,OAAO,gBAAgB;AAAA,YAC1C;AAAA;AAAA,QACF,GACF;AAAA,QACA,oBAAC,SAAM,OAAM,cACX;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,MAAM,SAAS;AAAA,YACtB,eAAe,CAAC,MAAM,OAAO,EAAE,OAAQ,KAAK,OAAkC,CAAC;AAAA,YAC/E,SAAS;AAAA,cACP,EAAE,OAAO,IAAI,OAAO,YAAY;AAAA,cAChC,EAAE,OAAO,QAAQ,OAAO,QAAQ;AAAA,cAChC,EAAE,OAAO,UAAU,OAAO,SAAS;AAAA,cACnC,EAAE,OAAO,SAAS,OAAO,SAAS;AAAA,YACpC;AAAA;AAAA,QACF,GACF;AAAA,QACA,oBAAC,SAAM,OAAM,uBACX,8BAAC,SAAM,OAAO,MAAM,cAAc,IAAI,UAAU,CAAC,MAAM,OAAO,EAAE,YAAY,EAAE,OAAO,SAAS,OAAU,CAAC,GAAG,aAAY,WAAU,GACpI;AAAA,SACF;AAAA,MACA,qBAAC,SAAI,WAAU,0BACb;AAAA,4BAAC,SAAM,OAAM,8BACX,8BAAC,SAAM,OAAO,MAAM,YAAY,IAAI,UAAU,CAAC,MAAM,OAAO,EAAE,UAAU,EAAE,OAAO,SAAS,OAAU,CAAC,GAAG,aAAY,eAAc,GACpI;AAAA,QACA,oBAAC,SAAM,OAAM,2BACX;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,MAAM,WAAW;AAAA,YACxB,eAAe,CAAC,MAAM,OAAO,EAAE,SAAU,KAAK,OAAoC,CAAC;AAAA,YACnF,SAAS;AAAA,cACP,EAAE,OAAO,IAAI,OAAO,OAAO;AAAA,cAC3B,EAAE,OAAO,QAAQ,OAAO,WAAW;AAAA,cACnC,EAAE,OAAO,MAAM,OAAO,kBAAkB;AAAA,YAC1C;AAAA;AAAA,QACF,GACF;AAAA,SACF;AAAA,OACF;AAAA,KACF;AAEJ;","names":[]}
@@ -0,0 +1,16 @@
1
+ import { type ComponentType } from "react";
2
+ export interface BlockEditorProps {
3
+ block: Record<string, unknown>;
4
+ siteId: string;
5
+ onChange: (next: Record<string, unknown>) => void;
6
+ }
7
+ /**
8
+ * Fallback-editor voor bloktypes zonder eigen `Editor` (bv. agent-gebouwde maatwerkblokken):
9
+ * genereert automatisch een formulier uit het Zod-schema van het blok. Primitieve velden krijgen
10
+ * echte invoervelden (tekst/getal/schakelaar/keuze, `html` → rich text, beeld-URL's → mediakiezer);
11
+ * complexe velden (lijsten/objecten) een JSON-veld met validatie vóór opslaan. Zo is een blok
12
+ * zonder maatwerk-editor nooit een doodlopend pad voor de klant.
13
+ */
14
+ declare function GenericEditor({ block, siteId, onChange }: BlockEditorProps): import("react").JSX.Element;
15
+ export declare const builtinBlockEditors: Record<string, ComponentType<BlockEditorProps>>;
16
+ export { GenericEditor };