@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,597 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import "@xiwebdesign/xicms-core/admin.css";
4
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
5
+ import { useSiteConfig } from "../../config";
6
+ import { useRegistry } from "../../blocks/context";
7
+ import { BlockErrorBoundary } from "../../blocks/BlockErrorBoundary";
8
+ import { InlineImageEditProvider } from "../../media/ImageContext";
9
+ import { MediaPickerDialog } from "../media/MediaPicker";
10
+ import { EmptyState } from "@astryxdesign/core/EmptyState";
11
+ import { buildBlockAddOptions } from "../../blocks/registry";
12
+ import { getDraftByPath, saveDraft, publishPage, subscribeDraft, subscribeVersions, restoreVersion } from "../lib/pagesClient";
13
+ import { isDemoActive } from "../../demo/demoStore";
14
+ import { builtinBlockEditors, GenericEditor } from "../blockEditors";
15
+ import { StyleEditor } from "../blockEditors/StyleEditor";
16
+ import { reorderBlocks } from "./reorder";
17
+ import { PatternInserter } from "../patterns/PatternInserter";
18
+ import { Button, Field, Input, Textarea } from "../ui/primitives";
19
+ import { Select } from "../ui/select";
20
+ import { ToastProvider, useToast } from "../ui/toast";
21
+ import { ConfirmHost, useConfirm } from "../ui/ConfirmDialog";
22
+ const INLINE_FIELDS = {
23
+ hero: [
24
+ { selector: ".xicms-hero__title", field: "title" },
25
+ { selector: ".xicms-hero__sub", field: "subtitle" }
26
+ ]
27
+ };
28
+ const GLOBAL_INLINE = [
29
+ { selector: ".xicms-richtext", field: "html", html: true },
30
+ { selector: "[data-xicms-edit]", field: "", html: false, fromData: true }
31
+ ];
32
+ function getPath(obj, path) {
33
+ return path.split(".").reduce((o, k) => o == null ? void 0 : o[k], obj);
34
+ }
35
+ function setPath(obj, path, value) {
36
+ const keys = path.split(".");
37
+ const clone = (v) => Array.isArray(v) ? [...v] : v && typeof v === "object" ? { ...v } : v;
38
+ const root = clone(obj);
39
+ let cur = root;
40
+ for (let i = 0; i < keys.length - 1; i++) {
41
+ cur[keys[i]] = clone(cur[keys[i]] ?? {});
42
+ cur = cur[keys[i]];
43
+ }
44
+ cur[keys[keys.length - 1]] = value;
45
+ return root;
46
+ }
47
+ function newKey() {
48
+ return (globalThis.crypto?.randomUUID?.() ?? `b${Date.now()}${Math.random()}`).slice(0, 12);
49
+ }
50
+ function stableStringify(value) {
51
+ if (Array.isArray(value)) return `[${value.map(stableStringify).join(",")}]`;
52
+ if (value && typeof value === "object") {
53
+ const entries = Object.entries(value).filter(([, v]) => v !== void 0).sort(([a], [b]) => a < b ? -1 : 1);
54
+ return `{${entries.map(([k, v]) => `${JSON.stringify(k)}:${stableStringify(v)}`).join(",")}}`;
55
+ }
56
+ return JSON.stringify(value) ?? "null";
57
+ }
58
+ function VisualEditor({ onClose }) {
59
+ return /* @__PURE__ */ jsx("div", { className: "xicms-admin xicms-ve", children: /* @__PURE__ */ jsx(ToastProvider, { children: /* @__PURE__ */ jsx(ConfirmHost, { children: /* @__PURE__ */ jsx(VisualEditorInner, { onClose }) }) }) });
60
+ }
61
+ function VisualEditorInner({ onClose }) {
62
+ const { siteId, name } = useSiteConfig();
63
+ const registry = useRegistry();
64
+ const { toast } = useToast();
65
+ const confirm = useConfirm();
66
+ const path = useMemo(() => typeof window !== "undefined" ? window.location.pathname || "/" : "/", []);
67
+ const [draft, setDraft] = useState(null);
68
+ const [status, setStatus] = useState("loading");
69
+ const [selectedKey, setSelectedKey] = useState(null);
70
+ const [publishing, setPublishing] = useState(false);
71
+ const [imgPicker, setImgPicker] = useState(null);
72
+ const firstSave = useRef(true);
73
+ const canvasRef = useRef(null);
74
+ const [conflict, setConflict] = useState(false);
75
+ const [dragIndex, setDragIndex] = useState(null);
76
+ const [dropIndex, setDropIndex] = useState(null);
77
+ const draggingRef = useRef(false);
78
+ const endDrag = useCallback(() => {
79
+ draggingRef.current = false;
80
+ setDragIndex(null);
81
+ setDropIndex(null);
82
+ }, []);
83
+ const draftRef = useRef(null);
84
+ const dirtyRef = useRef(false);
85
+ const lastSavedRef = useRef(null);
86
+ useEffect(() => {
87
+ draftRef.current = draft;
88
+ }, [draft]);
89
+ const historyRef = useRef({ past: [], future: [], lastPush: 0 });
90
+ const [, setHistVersion] = useState(0);
91
+ const pushHistory = useCallback((prev, coalesce) => {
92
+ const h = historyRef.current;
93
+ const now = Date.now();
94
+ if (!(coalesce && now - h.lastPush < 800 && h.past.length > 0)) {
95
+ h.past.push(prev);
96
+ if (h.past.length > 100) h.past.shift();
97
+ }
98
+ h.lastPush = now;
99
+ h.future = [];
100
+ setHistVersion((v) => v + 1);
101
+ }, []);
102
+ const mutateDraft = useCallback(
103
+ (updater, opts) => {
104
+ const d = draftRef.current;
105
+ if (!d) return;
106
+ const next = updater(d);
107
+ if (next === d) return;
108
+ pushHistory(d, opts?.coalesce ?? false);
109
+ draftRef.current = next;
110
+ setDraft(next);
111
+ },
112
+ [pushHistory]
113
+ );
114
+ const undo = useCallback(() => {
115
+ const h = historyRef.current;
116
+ const d = draftRef.current;
117
+ const prev = h.past.pop();
118
+ if (!prev || !d) return;
119
+ h.future.push(d);
120
+ h.lastPush = 0;
121
+ draftRef.current = prev;
122
+ setDraft(prev);
123
+ setHistVersion((v) => v + 1);
124
+ }, []);
125
+ const redo = useCallback(() => {
126
+ const h = historyRef.current;
127
+ const d = draftRef.current;
128
+ const next = h.future.pop();
129
+ if (!next || !d) return;
130
+ h.past.push(d);
131
+ h.lastPush = 0;
132
+ draftRef.current = next;
133
+ setDraft(next);
134
+ setHistVersion((v) => v + 1);
135
+ }, []);
136
+ const draftPayload = (d) => ({
137
+ blocks: d.blocks,
138
+ title: d.title,
139
+ slug: d.slug,
140
+ path: d.path,
141
+ seo: d.seo
142
+ });
143
+ const flushSave = useCallback(async () => {
144
+ const d = draftRef.current;
145
+ if (!d || !dirtyRef.current) return;
146
+ const payload = draftPayload(d);
147
+ await saveDraft(siteId, d.id, payload);
148
+ lastSavedRef.current = stableStringify(payload);
149
+ if (draftRef.current === d) {
150
+ dirtyRef.current = false;
151
+ setStatus("saved");
152
+ }
153
+ }, [siteId]);
154
+ const handleClose = useCallback(() => {
155
+ void flushSave().finally(() => onClose());
156
+ }, [flushSave, onClose]);
157
+ useEffect(() => {
158
+ let active = true;
159
+ getDraftByPath(siteId, path).then((d) => {
160
+ if (!active) return;
161
+ if (d) {
162
+ setDraft(d);
163
+ lastSavedRef.current = stableStringify({ blocks: d.blocks, title: d.title, slug: d.slug, path: d.path, seo: d.seo });
164
+ setStatus("idle");
165
+ } else {
166
+ setStatus("none");
167
+ }
168
+ }).catch(() => active && setStatus("none"));
169
+ return () => {
170
+ active = false;
171
+ };
172
+ }, [siteId, path]);
173
+ const draftId = draft?.id;
174
+ useEffect(() => {
175
+ if (!draftId) return;
176
+ return subscribeDraft(siteId, draftId, (remote, meta) => {
177
+ if (!meta.fromServer || !remote) return;
178
+ const remotePayload = stableStringify({ blocks: remote.blocks, title: remote.title, slug: remote.slug, path: remote.path, seo: remote.seo });
179
+ const local = draftRef.current;
180
+ const localPayload = local ? stableStringify(draftPayload(local)) : null;
181
+ if (remotePayload !== lastSavedRef.current && remotePayload !== localPayload) setConflict(true);
182
+ });
183
+ }, [siteId, draftId]);
184
+ const blocks = draft?.blocks ?? [];
185
+ const commitInline = useCallback(
186
+ (key, field, value) => {
187
+ mutateDraft(
188
+ (d) => {
189
+ const bl = d.blocks;
190
+ const idx = bl.findIndex((x) => x._key === key);
191
+ if (idx < 0 || getPath(bl[idx], field) === value) return d;
192
+ const next = [...bl];
193
+ next[idx] = setPath(next[idx], field, value);
194
+ return { ...d, blocks: next };
195
+ },
196
+ { coalesce: true }
197
+ );
198
+ },
199
+ [mutateDraft]
200
+ );
201
+ useEffect(() => {
202
+ if (!selectedKey) return;
203
+ const host = canvasRef.current?.querySelector(`[data-ve-content="${selectedKey}"]`);
204
+ if (!host) return;
205
+ const type = blocks.find((b) => b._key === selectedKey)?._type ?? "";
206
+ const specs = [...INLINE_FIELDS[type] ?? [], ...GLOBAL_INLINE];
207
+ const bound = /* @__PURE__ */ new Set();
208
+ const bind = (el, field, html) => {
209
+ if (el.dataset.veInline === "1") return;
210
+ el.dataset.veInline = "1";
211
+ el.setAttribute("contenteditable", "true");
212
+ el.setAttribute("spellcheck", "true");
213
+ el.classList.add("xicms-ve-inline");
214
+ el.addEventListener("blur", () => commitInline(selectedKey, field, html ? el.innerHTML : el.textContent ?? ""));
215
+ el.addEventListener("keydown", (e) => {
216
+ if (e.key === "Escape") el.blur();
217
+ else if (!html && e.key === "Enter") {
218
+ e.preventDefault();
219
+ el.blur();
220
+ }
221
+ });
222
+ bound.add(el);
223
+ };
224
+ const apply = () => {
225
+ for (const m of specs) {
226
+ host.querySelectorAll(m.selector).forEach(
227
+ (el) => bind(el, "fromData" in m && m.fromData ? el.dataset.xicmsEdit : m.field, !!m.html)
228
+ );
229
+ }
230
+ };
231
+ apply();
232
+ const obs = new MutationObserver(() => {
233
+ if (!draggingRef.current) apply();
234
+ });
235
+ obs.observe(host, { childList: true, subtree: true });
236
+ return () => {
237
+ obs.disconnect();
238
+ bound.forEach((el) => {
239
+ el.removeAttribute("contenteditable");
240
+ el.classList.remove("xicms-ve-inline");
241
+ delete el.dataset.veInline;
242
+ });
243
+ };
244
+ }, [selectedKey, blocks, commitInline]);
245
+ const dirtySinceRef = useRef(null);
246
+ useEffect(() => {
247
+ if (!draft) return;
248
+ if (firstSave.current) {
249
+ firstSave.current = false;
250
+ return;
251
+ }
252
+ dirtyRef.current = true;
253
+ dirtySinceRef.current ??= Date.now();
254
+ setStatus("saving");
255
+ const waited = Date.now() - dirtySinceRef.current;
256
+ const delay = Math.max(0, Math.min(700, 3e3 - waited));
257
+ const t = setTimeout(() => {
258
+ dirtySinceRef.current = null;
259
+ const payload = draftPayload(draft);
260
+ void saveDraft(siteId, draft.id, payload).then(() => {
261
+ lastSavedRef.current = stableStringify(payload);
262
+ if (draftRef.current === draft) {
263
+ dirtyRef.current = false;
264
+ setStatus("saved");
265
+ }
266
+ }).catch(() => setStatus("error"));
267
+ }, delay);
268
+ return () => clearTimeout(t);
269
+ }, [draft, siteId]);
270
+ useEffect(() => {
271
+ const beforeUnload = (e) => {
272
+ if (dirtyRef.current) {
273
+ e.preventDefault();
274
+ e.returnValue = "";
275
+ }
276
+ };
277
+ const onVisibility = () => {
278
+ if (document.visibilityState === "hidden") void flushSave().catch(() => {
279
+ });
280
+ };
281
+ const onKeyDown = (e) => {
282
+ if (e.key === "Escape") {
283
+ handleClose();
284
+ return;
285
+ }
286
+ const t = e.target;
287
+ const inField = !!t && (t.isContentEditable || t.tagName === "INPUT" || t.tagName === "TEXTAREA" || t.tagName === "SELECT");
288
+ if ((e.metaKey || e.ctrlKey) && !inField && (e.key.toLowerCase() === "z" || e.key.toLowerCase() === "y")) {
289
+ e.preventDefault();
290
+ if (e.key.toLowerCase() === "y" || e.shiftKey) redo();
291
+ else undo();
292
+ }
293
+ };
294
+ window.addEventListener("beforeunload", beforeUnload);
295
+ document.addEventListener("visibilitychange", onVisibility);
296
+ window.addEventListener("keydown", onKeyDown);
297
+ return () => {
298
+ window.removeEventListener("beforeunload", beforeUnload);
299
+ document.removeEventListener("visibilitychange", onVisibility);
300
+ window.removeEventListener("keydown", onKeyDown);
301
+ const d = draftRef.current;
302
+ if (d && dirtyRef.current) {
303
+ void saveDraft(siteId, d.id, draftPayload(d)).catch(
304
+ (err) => console.warn("[xicms] autosave bij sluiten mislukt:", err)
305
+ );
306
+ }
307
+ };
308
+ }, [siteId, handleClose, flushSave, undo, redo]);
309
+ function setBlocks(next, opts) {
310
+ mutateDraft((d) => ({ ...d, blocks: next }), opts);
311
+ }
312
+ function updateByKey(key, next) {
313
+ setBlocks(blocks.map((b) => b._key === key ? { ...next, _key: b._key, _type: b._type } : b), { coalesce: true });
314
+ }
315
+ function move(i, dir) {
316
+ const j = i + dir;
317
+ if (j < 0 || j >= blocks.length) return;
318
+ const copy = [...blocks];
319
+ [copy[i], copy[j]] = [copy[j], copy[i]];
320
+ setBlocks(copy);
321
+ }
322
+ function duplicate(i) {
323
+ const copy = [...blocks];
324
+ copy.splice(i + 1, 0, { ...blocks[i], _key: newKey() });
325
+ setBlocks(copy);
326
+ }
327
+ async function remove(i) {
328
+ const ok = await confirm({ title: "Blok verwijderen?", confirmLabel: "Verwijderen", tone: "danger" });
329
+ if (!ok) return;
330
+ const removed = blocks[i];
331
+ setBlocks(blocks.filter((_, idx) => idx !== i));
332
+ if (selectedKey === removed._key) setSelectedKey(null);
333
+ }
334
+ function addBlock(type) {
335
+ const def = registry.get(type);
336
+ const base = def?.defaults?.() ?? {};
337
+ const block = { _key: newKey(), _type: type, ...base };
338
+ insertAfterSelected([block]);
339
+ setSelectedKey(block._key);
340
+ }
341
+ function insertAfterSelected(newBlocks) {
342
+ const sel = blocks.findIndex((b) => b._key === selectedKey);
343
+ const copy = [...blocks];
344
+ copy.splice(sel >= 0 ? sel + 1 : blocks.length, 0, ...newBlocks);
345
+ setBlocks(copy);
346
+ }
347
+ async function onPublish() {
348
+ if (!draft) return;
349
+ const ok = await confirm({ title: "Pagina publiceren?", description: `De live site wordt bijgewerkt (${draft.path}).`, confirmLabel: "Publiceren" });
350
+ if (!ok) return;
351
+ setPublishing(true);
352
+ try {
353
+ await saveDraft(siteId, draft.id, { blocks: draft.blocks, title: draft.title, slug: draft.slug, path: draft.path, seo: draft.seo });
354
+ await publishPage(siteId, draft.id);
355
+ toast({ title: "Gepubliceerd", description: "Herlaad de pagina om het live resultaat te zien.", tone: "success" });
356
+ } catch (e) {
357
+ toast({ title: "Publiceren mislukt", description: e.message, tone: "error" });
358
+ } finally {
359
+ setPublishing(false);
360
+ }
361
+ }
362
+ const addOptions = useMemo(() => buildBlockAddOptions(registry.values()), [registry]);
363
+ const selectedIndex = blocks.findIndex((b) => b._key === selectedKey);
364
+ const selected = selectedIndex >= 0 ? blocks[selectedIndex] : null;
365
+ const canUndo = historyRef.current.past.length > 0;
366
+ const canRedo = historyRef.current.future.length > 0;
367
+ const reloadRemote = useCallback(async () => {
368
+ const remote = await getDraftByPath(siteId, path).catch(() => null);
369
+ if (remote) {
370
+ mutateDraft(() => remote);
371
+ lastSavedRef.current = stableStringify(draftPayload(remote));
372
+ dirtyRef.current = false;
373
+ setStatus("idle");
374
+ }
375
+ setConflict(false);
376
+ }, [siteId, path, mutateDraft]);
377
+ return /* @__PURE__ */ jsxs("div", { className: "xicms-ve__shell", role: "dialog", "aria-modal": "true", "aria-label": `Pagina bewerken: ${path}`, children: [
378
+ /* @__PURE__ */ jsxs("header", { className: "xicms-ve__bar", children: [
379
+ /* @__PURE__ */ jsxs("strong", { className: "xicms-ve__title", children: [
380
+ "Bewerken \xB7 ",
381
+ name
382
+ ] }),
383
+ /* @__PURE__ */ jsx("span", { className: "xicms-ve__path", children: path }),
384
+ /* @__PURE__ */ jsx("button", { type: "button", className: "xicms-ve__histbtn", disabled: !canUndo, onClick: undo, title: "Ongedaan maken (Ctrl+Z)", "aria-label": "Ongedaan maken (Ctrl+Z)", children: "\u21B6" }),
385
+ /* @__PURE__ */ jsx("button", { type: "button", className: "xicms-ve__histbtn", disabled: !canRedo, onClick: redo, title: "Opnieuw (Ctrl+Shift+Z)", "aria-label": "Opnieuw (Ctrl+Shift+Z)", children: "\u21B7" }),
386
+ /* @__PURE__ */ jsx("span", { className: "xicms-ve__status", "aria-live": "polite", children: status === "saving" ? "Opslaan\u2026" : status === "saved" ? "\u2713 Opgeslagen" : status === "error" ? "\u26A0 Niet opgeslagen" : "" }),
387
+ status === "error" && /* @__PURE__ */ jsx(Button, { size: "sm", variant: "secondary", onClick: () => void flushSave().catch(() => setStatus("error")), children: "Opnieuw opslaan" }),
388
+ /* @__PURE__ */ jsxs("div", { className: "xicms-ve__bar-actions", children: [
389
+ /* @__PURE__ */ jsx(Button, { size: "sm", disabled: publishing || !draft, onClick: onPublish, children: publishing ? "Bezig\u2026" : "Publiceren" }),
390
+ /* @__PURE__ */ jsx(Button, { size: "sm", variant: "secondary", onClick: handleClose, children: "Sluiten" })
391
+ ] })
392
+ ] }),
393
+ conflict && /* @__PURE__ */ jsxs("div", { className: "xicms-ve__conflict", role: "alert", children: [
394
+ /* @__PURE__ */ jsx("span", { children: "\u26A0 Deze pagina is intussen ergens anders gewijzigd (andere tab of collega). Doorwerken kan die wijzigingen overschrijven." }),
395
+ /* @__PURE__ */ jsx(Button, { size: "sm", onClick: () => void reloadRemote(), children: "Nieuwste versie laden" }),
396
+ /* @__PURE__ */ jsx(Button, { size: "sm", variant: "secondary", onClick: () => setConflict(false), children: "Mijn versie behouden" })
397
+ ] }),
398
+ /* @__PURE__ */ jsxs("div", { className: "xicms-ve__body", children: [
399
+ /* @__PURE__ */ jsxs("main", { className: "xicms-ve__canvas", children: [
400
+ status === "loading" && /* @__PURE__ */ jsx("p", { className: "xicms-ve__hint", children: "Laden\u2026" }),
401
+ status === "none" && /* @__PURE__ */ jsx(
402
+ EmptyState,
403
+ {
404
+ icon: "\u{1F4C4}",
405
+ title: "Geen werkversie gevonden",
406
+ description: `Voor deze pagina (${path}) bestaat nog geen werkversie. Maak de pagina eerst aan in /beheer \u2192 Pagina's.`
407
+ }
408
+ ),
409
+ draft && /* @__PURE__ */ jsxs("div", { className: "container", ref: canvasRef, children: [
410
+ blocks.length === 0 && /* @__PURE__ */ jsx(EmptyState, { icon: "\u{1F9F1}", title: "Nog geen blokken", description: "Voeg hieronder je eerste blok toe." }),
411
+ blocks.map((b, i) => {
412
+ const def = registry.get(b._type);
413
+ const Render = def?.Render;
414
+ const safe = (() => {
415
+ const parsed = def?.schema?.safeParse(b);
416
+ return parsed?.success ? parsed.data : b;
417
+ })();
418
+ const dropClass = dropIndex === i ? " is-drop-before" : dropIndex === i + 1 ? " is-drop-after" : "";
419
+ return /* @__PURE__ */ jsxs(
420
+ "div",
421
+ {
422
+ className: `xicms-ve-block${b._key === selectedKey ? " is-selected" : ""}${dragIndex === i ? " is-dragging" : ""}${dropClass}`,
423
+ onDragOver: (e) => {
424
+ if (dragIndex === null) return;
425
+ e.preventDefault();
426
+ e.dataTransfer.dropEffect = "move";
427
+ const rect = e.currentTarget.getBoundingClientRect();
428
+ setDropIndex(e.clientY < rect.top + rect.height / 2 ? i : i + 1);
429
+ },
430
+ onDrop: (e) => {
431
+ if (dragIndex === null || dropIndex === null) return;
432
+ e.preventDefault();
433
+ setBlocks(reorderBlocks(blocks, dragIndex, dropIndex));
434
+ endDrag();
435
+ },
436
+ children: [
437
+ /* @__PURE__ */ jsxs("div", { className: "xicms-ve-block__toolbar", children: [
438
+ /* @__PURE__ */ jsx(
439
+ "button",
440
+ {
441
+ type: "button",
442
+ className: "xicms-ve-block__drag",
443
+ draggable: true,
444
+ onDragStart: (e) => {
445
+ draggingRef.current = true;
446
+ setDragIndex(i);
447
+ e.dataTransfer.effectAllowed = "move";
448
+ e.dataTransfer.setData("text/plain", String(i));
449
+ const blockEl = e.currentTarget.closest(".xicms-ve-block");
450
+ if (blockEl) e.dataTransfer.setDragImage(blockEl, 24, 24);
451
+ },
452
+ onDragEnd: endDrag,
453
+ "aria-label": `Versleep ${def?.label ?? b._type}`,
454
+ title: "Slepen om te verplaatsen",
455
+ children: "\u22EE\u22EE"
456
+ }
457
+ ),
458
+ /* @__PURE__ */ jsx("span", { className: "xicms-ve-block__label", children: def?.label ?? b._type }),
459
+ /* @__PURE__ */ jsx("button", { type: "button", onClick: () => setSelectedKey(b._key), "aria-label": `Bewerk ${def?.label ?? b._type}`, title: "Bewerken", children: "\u270F\uFE0F" }),
460
+ /* @__PURE__ */ jsx("button", { type: "button", disabled: i === 0, onClick: () => move(i, -1), "aria-label": "Omhoog", children: "\u2191" }),
461
+ /* @__PURE__ */ jsx("button", { type: "button", disabled: i === blocks.length - 1, onClick: () => move(i, 1), "aria-label": "Omlaag", children: "\u2193" }),
462
+ /* @__PURE__ */ jsx("button", { type: "button", onClick: () => duplicate(i), "aria-label": "Dupliceren", children: "\u2398" }),
463
+ /* @__PURE__ */ jsx("button", { type: "button", onClick: () => void remove(i), "aria-label": "Verwijderen", children: "\u{1F5D1}" })
464
+ ] }),
465
+ /* @__PURE__ */ jsx("button", { type: "button", className: "xicms-ve-block__select", "aria-label": `Selecteer ${def?.label ?? b._type}`, onClick: () => setSelectedKey(b._key) }),
466
+ /* @__PURE__ */ jsx("div", { className: "xicms-ve-block__content", "data-ve-content": b._key, children: Render ? /* @__PURE__ */ jsx(BlockErrorBoundary, { mode: "preview", type: b._type, blockKey: b._key, children: /* @__PURE__ */ jsx(InlineImageEditProvider, { onReplace: b._key === selectedKey ? (field) => setImgPicker({ key: b._key, field }) : null, children: /* @__PURE__ */ jsx(Render, { block: safe, siteId, mode: "preview" }) }) }) : /* @__PURE__ */ jsxs("p", { className: "xicms-ve__hint", children: [
467
+ "Onbekend blok: ",
468
+ b._type
469
+ ] }) })
470
+ ]
471
+ },
472
+ b._key
473
+ );
474
+ }),
475
+ /* @__PURE__ */ jsxs("div", { className: "xicms-ve__inserter", children: [
476
+ /* @__PURE__ */ jsxs("span", { children: [
477
+ "Toevoegen",
478
+ selected ? " (na selectie)" : "",
479
+ ":"
480
+ ] }),
481
+ /* @__PURE__ */ jsx("div", { className: "xicms-ve__inserter-select", children: /* @__PURE__ */ jsx(Select, { value: "", placeholder: "Kies een blok\u2026", onValueChange: (v) => v && addBlock(v), options: addOptions }) }),
482
+ /* @__PURE__ */ jsx(PatternInserter, { onInsert: insertAfterSelected })
483
+ ] })
484
+ ] })
485
+ ] }),
486
+ /* @__PURE__ */ jsx("aside", { className: "xicms-ve__panel", children: selected ? /* @__PURE__ */ jsx(SelectedEditor, { block: selected, siteId, registry, onChange: (next) => updateByKey(selected._key, next) }, selected._key) : draft ? /* @__PURE__ */ jsxs("div", { className: "grid gap-4", children: [
487
+ /* @__PURE__ */ jsx("p", { className: "xicms-ve__hint", children: "Klik op een blok om het te bewerken." }),
488
+ /* @__PURE__ */ jsx(PageSettings, { draft, onChange: (part) => mutateDraft((d) => ({ ...d, ...part }), { coalesce: true }) }),
489
+ !isDemoActive() && /* @__PURE__ */ jsx(
490
+ VersionsPanel,
491
+ {
492
+ siteId,
493
+ pageId: draft.id,
494
+ onRestore: (restored) => {
495
+ mutateDraft((d) => ({ ...d, ...restored }));
496
+ toast({ title: "Versie hersteld naar werkversie", description: "Publiceer om hem live te zetten.", tone: "success" });
497
+ }
498
+ }
499
+ )
500
+ ] }) : /* @__PURE__ */ jsx("p", { className: "xicms-ve__hint", children: "Klik op een blok om het te bewerken." }) })
501
+ ] }),
502
+ /* @__PURE__ */ jsx(
503
+ MediaPickerDialog,
504
+ {
505
+ siteId,
506
+ open: !!imgPicker,
507
+ onOpenChange: (v) => {
508
+ if (!v) setImgPicker(null);
509
+ },
510
+ onSelect: (m) => {
511
+ if (imgPicker) commitInline(imgPicker.key, imgPicker.field, m.url);
512
+ setImgPicker(null);
513
+ }
514
+ }
515
+ )
516
+ ] });
517
+ }
518
+ function PageSettings({
519
+ draft,
520
+ onChange
521
+ }) {
522
+ const seo = draft.seo ?? {};
523
+ return /* @__PURE__ */ jsxs("details", { className: "xicms-ve__section", open: true, children: [
524
+ /* @__PURE__ */ jsx("summary", { className: "text-sm font-semibold", children: "Pagina-instellingen" }),
525
+ /* @__PURE__ */ jsxs("div", { className: "mt-2 grid gap-3", children: [
526
+ /* @__PURE__ */ jsx(Field, { label: "Paginatitel", children: /* @__PURE__ */ jsx(Input, { value: draft.title ?? "", onChange: (e) => onChange({ title: e.target.value }) }) }),
527
+ /* @__PURE__ */ jsx(Field, { label: "SEO-titel", hint: "Leeg = paginatitel", children: /* @__PURE__ */ jsx(Input, { value: seo.title ?? "", onChange: (e) => onChange({ seo: { ...seo, title: e.target.value } }) }) }),
528
+ /* @__PURE__ */ jsx(Field, { label: "SEO-omschrijving", hint: "Wordt getoond in zoekresultaten", children: /* @__PURE__ */ jsx(Textarea, { rows: 3, value: seo.description ?? "", onChange: (e) => onChange({ seo: { ...seo, description: e.target.value } }) }) })
529
+ ] })
530
+ ] });
531
+ }
532
+ function VersionsPanel({
533
+ siteId,
534
+ pageId,
535
+ onRestore
536
+ }) {
537
+ const [versions, setVersions] = useState([]);
538
+ const { toast } = useToast();
539
+ const confirm = useConfirm();
540
+ useEffect(() => subscribeVersions(siteId, pageId, setVersions), [siteId, pageId]);
541
+ if (versions.length === 0) return null;
542
+ const restore = async (versionId) => {
543
+ const ok = await confirm({
544
+ title: "Versie herstellen?",
545
+ description: "De snapshot vervangt je huidige werkversie (ongedaan te maken met Ctrl+Z). De live site verandert pas bij Publiceren.",
546
+ confirmLabel: "Herstellen"
547
+ });
548
+ if (!ok) return;
549
+ try {
550
+ const restored = await restoreVersion(siteId, pageId, versionId);
551
+ onRestore(restored);
552
+ } catch (e) {
553
+ toast({ title: "Herstellen mislukt", description: e.message, tone: "error" });
554
+ }
555
+ };
556
+ return /* @__PURE__ */ jsxs("details", { className: "xicms-ve__section", children: [
557
+ /* @__PURE__ */ jsx("summary", { className: "text-sm font-semibold", children: "Versiegeschiedenis" }),
558
+ /* @__PURE__ */ jsx("ul", { className: "mt-2 grid gap-1 text-sm", children: versions.slice(0, 10).map((v) => /* @__PURE__ */ jsxs("li", { className: "flex items-center justify-between gap-2", children: [
559
+ /* @__PURE__ */ jsxs("span", { children: [
560
+ v.label ?? (v.kind === "publish" ? "Gepubliceerd" : v.kind ?? "Snapshot"),
561
+ formatVersionDate(v.createdAt) && /* @__PURE__ */ jsxs("span", { className: "text-slate-400", children: [
562
+ " \xB7 ",
563
+ formatVersionDate(v.createdAt)
564
+ ] })
565
+ ] }),
566
+ /* @__PURE__ */ jsx(Button, { variant: "ghost", size: "sm", onClick: () => void restore(v.id), children: "Herstellen" })
567
+ ] }, v.id)) })
568
+ ] });
569
+ }
570
+ function formatVersionDate(createdAt) {
571
+ const date = createdAt && typeof createdAt.toDate === "function" ? createdAt.toDate() : typeof createdAt === "string" ? new Date(createdAt) : null;
572
+ return date && !Number.isNaN(date.getTime()) ? date.toLocaleString("nl-NL", { dateStyle: "short", timeStyle: "short" }) : "";
573
+ }
574
+ function SelectedEditor({
575
+ block,
576
+ siteId,
577
+ registry,
578
+ onChange
579
+ }) {
580
+ const def = registry.get(block._type);
581
+ const Editor = def?.Editor ?? builtinBlockEditors[block._type] ?? GenericEditor;
582
+ return /* @__PURE__ */ jsxs("div", { className: "grid gap-3", children: [
583
+ /* @__PURE__ */ jsx("h3", { className: "text-sm font-semibold", children: def?.label ?? block._type }),
584
+ /* @__PURE__ */ jsx(BlockErrorBoundary, { mode: "preview", type: block._type, blockKey: block._key, children: /* @__PURE__ */ jsx(Editor, { block, siteId, onChange }) }),
585
+ /* @__PURE__ */ jsx(
586
+ StyleEditor,
587
+ {
588
+ value: block._style,
589
+ onChange: (style) => onChange({ ...block, _style: style })
590
+ }
591
+ )
592
+ ] });
593
+ }
594
+ export {
595
+ VisualEditor as default
596
+ };
597
+ //# sourceMappingURL=VisualEditor.js.map