@xiwebdesign/xicms-core 6.5.0 → 7.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (381) hide show
  1. package/dist/SiteChrome.d.ts +12 -0
  2. package/dist/SiteChrome.js +24 -0
  3. package/dist/SiteChrome.js.map +1 -0
  4. package/dist/XiCMSProvider.d.ts +16 -8
  5. package/dist/XiCMSProvider.js +90 -61
  6. package/dist/XiCMSProvider.js.map +1 -1
  7. package/dist/admin/AdminApp.d.ts +1 -1
  8. package/dist/admin/AdminApp.js +81 -35
  9. package/dist/admin/AdminApp.js.map +1 -1
  10. package/dist/admin/AdminHelp.d.ts +8 -1
  11. package/dist/admin/AdminHelp.js +2 -2
  12. package/dist/admin/AdminHelp.js.map +1 -1
  13. package/dist/admin/CoreVersion.d.ts +13 -0
  14. package/dist/admin/CoreVersion.js +38 -0
  15. package/dist/admin/CoreVersion.js.map +1 -0
  16. package/dist/admin/NewsEditor.js +9 -9
  17. package/dist/admin/SuperadminPanel.js +5 -5
  18. package/dist/admin/blockEditors/GenericEditor.d.ts +2 -2
  19. package/dist/admin/blockEditors/GenericEditor.js +12 -11
  20. package/dist/admin/blockEditors/GenericEditor.js.map +1 -1
  21. package/dist/admin/blockEditors/StyleEditor.d.ts +1 -1
  22. package/dist/admin/blockEditors/StyleEditor.js +2 -2
  23. package/dist/admin/blockEditors/SymbolRefEditor.d.ts +1 -1
  24. package/dist/admin/blockEditors/SymbolRefEditor.js +5 -5
  25. package/dist/admin/blockEditors/index.d.ts +1 -1
  26. package/dist/admin/blockEditors/index.js +10 -10
  27. package/dist/admin/customBlocks/CustomBlocksPanel.js +7 -7
  28. package/dist/admin/editors/RichTextEditor.js +8 -7
  29. package/dist/admin/editors/RichTextEditor.js.map +1 -1
  30. package/dist/admin/editors/fontSizeExtension.js +1 -1
  31. package/dist/admin/editors/fontSizeExtension.js.map +1 -1
  32. package/dist/admin/forms/FormsPanel.js +9 -9
  33. package/dist/admin/index.d.ts +16 -16
  34. package/dist/admin/index.js +16 -16
  35. package/dist/admin/lib/mediaUsage.js +1 -1
  36. package/dist/admin/lib/pagesClient.d.ts +1 -1
  37. package/dist/admin/lib/pagesClient.js +11 -7
  38. package/dist/admin/lib/pagesClient.js.map +1 -1
  39. package/dist/admin/lib/sanitizeDraft.d.ts +9 -0
  40. package/dist/admin/lib/sanitizeDraft.js +28 -0
  41. package/dist/admin/lib/sanitizeDraft.js.map +1 -0
  42. package/dist/admin/lib/symbolsClient.d.ts +1 -1
  43. package/dist/admin/lib/symbolsClient.js +3 -3
  44. package/dist/admin/lib/upload.js +3 -3
  45. package/dist/admin/lib/useNestedDialog.d.ts +15 -0
  46. package/dist/admin/lib/useNestedDialog.js +23 -0
  47. package/dist/admin/lib/useNestedDialog.js.map +1 -0
  48. package/dist/admin/lib/zodFields.d.ts +4 -18
  49. package/dist/admin/lib/zodFields.js +54 -35
  50. package/dist/admin/lib/zodFields.js.map +1 -1
  51. package/dist/admin/media/MediaManager.js +7 -7
  52. package/dist/admin/media/MediaPicker.js +7 -7
  53. package/dist/admin/media/MediaPicker.js.map +1 -1
  54. package/dist/admin/pages/PageEditor.d.ts +1 -1
  55. package/dist/admin/pages/PageEditor.js +13 -13
  56. package/dist/admin/pages/PagesPanel.js +30 -30
  57. package/dist/admin/pages/PagesPanel.js.map +1 -1
  58. package/dist/admin/panelRegistry.js +7 -7
  59. package/dist/admin/patterns/PatternInserter.d.ts +1 -1
  60. package/dist/admin/patterns/PatternInserter.js +5 -5
  61. package/dist/admin/patterns/PatternInserter.js.map +1 -1
  62. package/dist/admin/settings/MailSettings.js +5 -5
  63. package/dist/admin/settings/MailTemplates.d.ts +1 -1
  64. package/dist/admin/settings/MailTemplates.js +5 -5
  65. package/dist/admin/settings/SettingsPanel.js +66 -20
  66. package/dist/admin/settings/SettingsPanel.js.map +1 -1
  67. package/dist/admin/settings/SnapshotsCard.js +5 -5
  68. package/dist/admin/settings/moduleSettingsForm.d.ts +1 -1
  69. package/dist/admin/settings/moduleSettingsForm.js +4 -4
  70. package/dist/admin/settings/moduleSettingsForm.js.map +1 -1
  71. package/dist/admin/shop/CategoriesTab.js +8 -8
  72. package/dist/admin/shop/ConnectionsTab.js +3 -3
  73. package/dist/admin/shop/DiscountsTab.js +8 -8
  74. package/dist/admin/shop/OrdersTab.js +10 -10
  75. package/dist/admin/shop/OrdersTab.js.map +1 -1
  76. package/dist/admin/shop/ProductsTab.js +10 -10
  77. package/dist/admin/shop/ShopPanel.js +9 -9
  78. package/dist/admin/shop/ShopSettingsTab.js +4 -4
  79. package/dist/admin/shop/index.d.ts +2 -2
  80. package/dist/admin/shop/index.js +2 -2
  81. package/dist/admin/shop/lib.js +2 -2
  82. package/dist/admin/stats/StatsPanel.js +2 -2
  83. package/dist/admin/ui/ArrayEditor.js +1 -1
  84. package/dist/admin/ui/PanelIcon.d.ts +3 -0
  85. package/dist/admin/ui/PanelIcon.js +34 -0
  86. package/dist/admin/ui/PanelIcon.js.map +1 -0
  87. package/dist/admin/ui/dialog.d.ts +21 -6
  88. package/dist/admin/ui/dialog.js +55 -34
  89. package/dist/admin/ui/dialog.js.map +1 -1
  90. package/dist/admin/ui/index.d.ts +7 -7
  91. package/dist/admin/ui/index.js +7 -7
  92. package/dist/admin/ui/primitives.js +1 -1
  93. package/dist/admin/ui/tabs.js +1 -1
  94. package/dist/admin/visual/TranslationPanel.d.ts +1 -1
  95. package/dist/admin/visual/TranslationPanel.js +3 -3
  96. package/dist/admin/visual/VisualEditor.js +47 -25
  97. package/dist/admin/visual/VisualEditor.js.map +1 -1
  98. package/dist/admin.css +2 -1
  99. package/dist/agentFiles/catalog.d.ts +2 -2
  100. package/dist/agentFiles/catalog.js +6 -5
  101. package/dist/agentFiles/catalog.js.map +1 -1
  102. package/dist/agentFiles/files.d.ts +5 -5
  103. package/dist/agentFiles/files.js +17 -17
  104. package/dist/agentFiles/files.js.map +1 -1
  105. package/dist/all.d.ts +4 -4
  106. package/dist/all.js +6 -6
  107. package/dist/auth/AuthProvider.d.ts +2 -2
  108. package/dist/auth/AuthProvider.js +51 -28
  109. package/dist/auth/AuthProvider.js.map +1 -1
  110. package/dist/auth/LoginForm.js +1 -1
  111. package/dist/auth/roles.js +4 -1
  112. package/dist/auth/roles.js.map +1 -1
  113. package/dist/blocks/BlockRenderer.d.ts +1 -1
  114. package/dist/blocks/BlockRenderer.js +3 -3
  115. package/dist/blocks/blockStyle.d.ts +1 -1
  116. package/dist/blocks/builtins/Accordion.d.ts +1 -1
  117. package/dist/blocks/builtins/Accordion.js +13 -6
  118. package/dist/blocks/builtins/Accordion.js.map +1 -1
  119. package/dist/blocks/builtins/Agenda.d.ts +1 -1
  120. package/dist/blocks/builtins/Agenda.js +5 -5
  121. package/dist/blocks/builtins/Banner.d.ts +1 -1
  122. package/dist/blocks/builtins/Banner.js +2 -2
  123. package/dist/blocks/builtins/BeforeAfter.d.ts +1 -1
  124. package/dist/blocks/builtins/BeforeAfter.js +4 -4
  125. package/dist/blocks/builtins/BeforeAfter.js.map +1 -1
  126. package/dist/blocks/builtins/Booking.d.ts +1 -1
  127. package/dist/blocks/builtins/Booking.js +5 -5
  128. package/dist/blocks/builtins/Breadcrumbs.d.ts +1 -1
  129. package/dist/blocks/builtins/Breadcrumbs.js +3 -3
  130. package/dist/blocks/builtins/Cards.d.ts +1 -1
  131. package/dist/blocks/builtins/Cards.js +5 -5
  132. package/dist/blocks/builtins/Cards.js.map +1 -1
  133. package/dist/blocks/builtins/Columns.d.ts +1 -1
  134. package/dist/blocks/builtins/Columns.js +4 -4
  135. package/dist/blocks/builtins/Contact.d.ts +3 -3
  136. package/dist/blocks/builtins/Contact.js +4 -4
  137. package/dist/blocks/builtins/Countdown.d.ts +1 -1
  138. package/dist/blocks/builtins/Countdown.js +4 -4
  139. package/dist/blocks/builtins/Countdown.js.map +1 -1
  140. package/dist/blocks/builtins/Cta.d.ts +1 -1
  141. package/dist/blocks/builtins/Cta.js +3 -3
  142. package/dist/blocks/builtins/Downloads.d.ts +1 -1
  143. package/dist/blocks/builtins/Downloads.js +4 -4
  144. package/dist/blocks/builtins/Elements.d.ts +3 -3
  145. package/dist/blocks/builtins/Elements.js +3 -3
  146. package/dist/blocks/builtins/Embed.d.ts +1 -1
  147. package/dist/blocks/builtins/Embed.js +3 -3
  148. package/dist/blocks/builtins/Faq.d.ts +1 -1
  149. package/dist/blocks/builtins/Faq.js +14 -6
  150. package/dist/blocks/builtins/Faq.js.map +1 -1
  151. package/dist/blocks/builtins/FormBlock.d.ts +1 -1
  152. package/dist/blocks/builtins/FormBlock.js +28 -18
  153. package/dist/blocks/builtins/FormBlock.js.map +1 -1
  154. package/dist/blocks/builtins/Gallery.d.ts +2 -2
  155. package/dist/blocks/builtins/Gallery.js +5 -5
  156. package/dist/blocks/builtins/Hero.d.ts +1 -1
  157. package/dist/blocks/builtins/Hero.js +4 -4
  158. package/dist/blocks/builtins/ImageBlock.d.ts +1 -1
  159. package/dist/blocks/builtins/ImageBlock.js +3 -3
  160. package/dist/blocks/builtins/Jobs.d.ts +2 -2
  161. package/dist/blocks/builtins/Jobs.js +5 -5
  162. package/dist/blocks/builtins/Layout.d.ts +2 -2
  163. package/dist/blocks/builtins/Layout.js +4 -4
  164. package/dist/blocks/builtins/MapBlock.d.ts +1 -1
  165. package/dist/blocks/builtins/MapBlock.js +3 -3
  166. package/dist/blocks/builtins/NewsListBlock.d.ts +1 -1
  167. package/dist/blocks/builtins/NewsListBlock.js +4 -4
  168. package/dist/blocks/builtins/Newsletter.d.ts +1 -1
  169. package/dist/blocks/builtins/Newsletter.js +7 -7
  170. package/dist/blocks/builtins/Newsletter.js.map +1 -1
  171. package/dist/blocks/builtins/OpenNowBadge.d.ts +1 -1
  172. package/dist/blocks/builtins/OpenNowBadge.js +8 -3
  173. package/dist/blocks/builtins/OpenNowBadge.js.map +1 -1
  174. package/dist/blocks/builtins/OpeningHours.d.ts +1 -1
  175. package/dist/blocks/builtins/OpeningHours.js +6 -6
  176. package/dist/blocks/builtins/PdfBlock.d.ts +1 -1
  177. package/dist/blocks/builtins/PdfBlock.js +3 -3
  178. package/dist/blocks/builtins/Portfolio.d.ts +1 -1
  179. package/dist/blocks/builtins/Portfolio.js +5 -5
  180. package/dist/blocks/builtins/Pricing.d.ts +2 -2
  181. package/dist/blocks/builtins/Pricing.js +5 -5
  182. package/dist/blocks/builtins/Pricing.js.map +1 -1
  183. package/dist/blocks/builtins/RichTextBlock.d.ts +1 -1
  184. package/dist/blocks/builtins/RichTextBlock.js +2 -2
  185. package/dist/blocks/builtins/RichTextBlock.js.map +1 -1
  186. package/dist/blocks/builtins/Search.d.ts +1 -1
  187. package/dist/blocks/builtins/Search.js +9 -7
  188. package/dist/blocks/builtins/Search.js.map +1 -1
  189. package/dist/blocks/builtins/Sections.d.ts +4 -4
  190. package/dist/blocks/builtins/Sections.js +4 -4
  191. package/dist/blocks/builtins/Slider.d.ts +1 -1
  192. package/dist/blocks/builtins/Slider.js +3 -3
  193. package/dist/blocks/builtins/Spacer.d.ts +1 -1
  194. package/dist/blocks/builtins/Spacer.js +2 -2
  195. package/dist/blocks/builtins/SymbolRef.d.ts +1 -1
  196. package/dist/blocks/builtins/SymbolRef.js +31 -17
  197. package/dist/blocks/builtins/SymbolRef.js.map +1 -1
  198. package/dist/blocks/builtins/Team.d.ts +1 -1
  199. package/dist/blocks/builtins/Team.js +4 -4
  200. package/dist/blocks/builtins/Testimonials.d.ts +2 -2
  201. package/dist/blocks/builtins/Testimonials.js +4 -4
  202. package/dist/blocks/builtins/Video.d.ts +2 -2
  203. package/dist/blocks/builtins/Video.js +4 -4
  204. package/dist/blocks/builtins/Video.js.map +1 -1
  205. package/dist/blocks/builtins/WhatsappChat.d.ts +1 -1
  206. package/dist/blocks/builtins/WhatsappChat.js +2 -2
  207. package/dist/blocks/builtins/Widgets.d.ts +12 -12
  208. package/dist/blocks/builtins/Widgets.js +19 -19
  209. package/dist/blocks/builtins/Widgets.js.map +1 -1
  210. package/dist/blocks/builtins/consentEmbed.js +2 -2
  211. package/dist/blocks/builtins/index.d.ts +40 -40
  212. package/dist/blocks/builtins/index.js +40 -40
  213. package/dist/blocks/builtins/lib/submitForm.js +5 -3
  214. package/dist/blocks/builtins/lib/submitForm.js.map +1 -1
  215. package/dist/blocks/context.d.ts +1 -1
  216. package/dist/blocks/customTemplate/definition.d.ts +3 -3
  217. package/dist/blocks/customTemplate/definition.js +6 -6
  218. package/dist/blocks/customTemplate/definition.js.map +1 -1
  219. package/dist/blocks/customTemplate/interpret.js +1 -1
  220. package/dist/blocks/index.d.ts +5 -5
  221. package/dist/blocks/index.js +5 -5
  222. package/dist/blocks/registry.d.ts +17 -7
  223. package/dist/blocks/registry.js +2 -1
  224. package/dist/blocks/registry.js.map +1 -1
  225. package/dist/components/EditBar.js +3 -3
  226. package/dist/components/FeedbackWidget.js +4 -4
  227. package/dist/components/News.d.ts +1 -1
  228. package/dist/components/News.js +50 -37
  229. package/dist/components/News.js.map +1 -1
  230. package/dist/components/PageView.js +11 -8
  231. package/dist/components/PageView.js.map +1 -1
  232. package/dist/components/ResponsiveImage.d.ts +1 -1
  233. package/dist/components/site/SiteFooter.d.ts +1 -1
  234. package/dist/components/site/SiteFooter.js +2 -2
  235. package/dist/config.d.ts +1 -1
  236. package/dist/demo/DemoStudio.js +3 -3
  237. package/dist/demo/demoStore.d.ts +3 -3
  238. package/dist/demo/index.d.ts +2 -2
  239. package/dist/demo/index.js +2 -2
  240. package/dist/editor/EditorProvider.js +1 -1
  241. package/dist/firebase/admin.d.ts +0 -2
  242. package/dist/firebase/admin.js +0 -6
  243. package/dist/firebase/admin.js.map +1 -1
  244. package/dist/firebase/appcheck.d.ts +1 -1
  245. package/dist/firebase/appcheck.js +5 -3
  246. package/dist/firebase/appcheck.js.map +1 -1
  247. package/dist/firebase/client.d.ts +2 -1
  248. package/dist/firebase/client.js +2 -14
  249. package/dist/firebase/client.js.map +1 -1
  250. package/dist/firebase/config.d.ts +31 -0
  251. package/dist/firebase/config.js +39 -0
  252. package/dist/firebase/config.js.map +1 -0
  253. package/dist/firebase/feedback.js +5 -3
  254. package/dist/firebase/feedback.js.map +1 -1
  255. package/dist/i18n/overlay.d.ts +2 -2
  256. package/dist/i18n/overlay.js +6 -4
  257. package/dist/i18n/overlay.js.map +1 -1
  258. package/dist/index.d.ts +46 -44
  259. package/dist/index.js +39 -33
  260. package/dist/index.js.map +1 -1
  261. package/dist/lock/DemoLock.js +1 -1
  262. package/dist/modules/builtins.d.ts +1 -1
  263. package/dist/modules/builtins.js +53 -55
  264. package/dist/modules/builtins.js.map +1 -1
  265. package/dist/modules/consent/ConsentBanner.js +1 -1
  266. package/dist/modules/consent/useConsent.js +1 -1
  267. package/dist/modules/context.d.ts +1 -1
  268. package/dist/modules/contract.d.ts +1 -1
  269. package/dist/modules/defineModule.d.ts +1 -1
  270. package/dist/modules/index.d.ts +9 -9
  271. package/dist/modules/index.js +8 -8
  272. package/dist/modules/overrides.d.ts +1 -1
  273. package/dist/modules/registry.d.ts +2 -7
  274. package/dist/modules/registry.js +2 -1
  275. package/dist/modules/registry.js.map +1 -1
  276. package/dist/modules/shop/blocks/Cart.d.ts +1 -1
  277. package/dist/modules/shop/blocks/Cart.js +6 -6
  278. package/dist/modules/shop/blocks/Checkout.d.ts +1 -1
  279. package/dist/modules/shop/blocks/Checkout.js +6 -6
  280. package/dist/modules/shop/blocks/Donation.d.ts +1 -1
  281. package/dist/modules/shop/blocks/Donation.js +5 -5
  282. package/dist/modules/shop/blocks/OrderStatus.d.ts +1 -1
  283. package/dist/modules/shop/blocks/OrderStatus.js +5 -5
  284. package/dist/modules/shop/blocks/ProductDetail.d.ts +1 -1
  285. package/dist/modules/shop/blocks/ProductDetail.js +8 -8
  286. package/dist/modules/shop/blocks/ProductGrid.d.ts +3 -3
  287. package/dist/modules/shop/blocks/ProductGrid.js +7 -7
  288. package/dist/modules/shop/blocks/ShopCategories.d.ts +1 -1
  289. package/dist/modules/shop/blocks/ShopCategories.js +6 -6
  290. package/dist/modules/shop/index.d.ts +5 -5
  291. package/dist/modules/shop/index.js +5 -5
  292. package/dist/modules/shop/lib.d.ts +2 -2
  293. package/dist/modules/shop/lib.js +18 -13
  294. package/dist/modules/shop/lib.js.map +1 -1
  295. package/dist/modules/shop/module.d.ts +1 -1
  296. package/dist/modules/shop/module.js +9 -9
  297. package/dist/modules/shop/settings.d.ts +18 -50
  298. package/dist/modules/shop/settings.js +16 -16
  299. package/dist/modules/shop/settings.js.map +1 -1
  300. package/dist/modules/shop/strings.js +1 -1
  301. package/dist/modules/shop/types.d.ts +1 -1
  302. package/dist/modules/types.d.ts +2 -2
  303. package/dist/patterns/builtins.d.ts +1 -1
  304. package/dist/patterns/builtins.js +1 -1
  305. package/dist/patterns/index.d.ts +2 -2
  306. package/dist/patterns/index.js +2 -2
  307. package/dist/render/PageRenderer.d.ts +2 -2
  308. package/dist/render/PageRenderer.js +1 -1
  309. package/dist/render/PublishedPage.d.ts +1 -1
  310. package/dist/render/PublishedPage.js +2 -2
  311. package/dist/schema/blocks.d.ts +6793 -15095
  312. package/dist/schema/blocks.js +335 -355
  313. package/dist/schema/blocks.js.map +1 -1
  314. package/dist/schema/customBlocks.d.ts +10 -29
  315. package/dist/schema/customBlocks.js +14 -13
  316. package/dist/schema/customBlocks.js.map +1 -1
  317. package/dist/schema/fields.d.ts +10 -16
  318. package/dist/schema/fields.js +37 -37
  319. package/dist/schema/fields.js.map +1 -1
  320. package/dist/schema/forms.d.ts +62 -111
  321. package/dist/schema/forms.js +17 -17
  322. package/dist/schema/forms.js.map +1 -1
  323. package/dist/schema/index.d.ts +7 -7
  324. package/dist/schema/index.js +7 -7
  325. package/dist/schema/mail.d.ts +39 -87
  326. package/dist/schema/mail.js +4 -4
  327. package/dist/schema/mail.js.map +1 -1
  328. package/dist/schema/pages.d.ts +152 -674
  329. package/dist/schema/pages.js +26 -15
  330. package/dist/schema/pages.js.map +1 -1
  331. package/dist/schema/seo.d.ts +9 -27
  332. package/dist/schema/seo.js +7 -7
  333. package/dist/schema/seo.js.map +1 -1
  334. package/dist/schema/settings.d.ts +233 -1074
  335. package/dist/schema/settings.js +71 -56
  336. package/dist/schema/settings.js.map +1 -1
  337. package/dist/schema/shop.d.ts +470 -1214
  338. package/dist/schema/shop.js +124 -124
  339. package/dist/schema/shop.js.map +1 -1
  340. package/dist/schema/siteConfig.d.ts +78 -597
  341. package/dist/schema/siteConfig.js +17 -17
  342. package/dist/schema/siteConfig.js.map +1 -1
  343. package/dist/schema/symbols.d.ts +34 -191
  344. package/dist/schema/symbols.js +8 -8
  345. package/dist/schema/symbols.js.map +1 -1
  346. package/dist/server/auth.d.ts +17 -0
  347. package/dist/server/auth.js +11 -0
  348. package/dist/server/auth.js.map +1 -0
  349. package/dist/server/bundle.d.ts +15 -6
  350. package/dist/server/bundle.js +5 -1
  351. package/dist/server/bundle.js.map +1 -1
  352. package/dist/server/draft.d.ts +16 -0
  353. package/dist/server/draft.js +12 -0
  354. package/dist/server/draft.js.map +1 -0
  355. package/dist/server/env.js +8 -8
  356. package/dist/server/env.js.map +1 -1
  357. package/dist/server/index.d.ts +11 -9
  358. package/dist/server/index.js +13 -10
  359. package/dist/server/index.js.map +1 -1
  360. package/dist/server/pages.d.ts +11 -4
  361. package/dist/server/pages.js +43 -15
  362. package/dist/server/pages.js.map +1 -1
  363. package/dist/server/revalidate.js +11 -2
  364. package/dist/server/revalidate.js.map +1 -1
  365. package/dist/server/seo.d.ts +3 -3
  366. package/dist/server/seo.js +1 -1
  367. package/dist/server/shop.d.ts +3 -3
  368. package/dist/server/shop.js +6 -3
  369. package/dist/server/shop.js.map +1 -1
  370. package/dist/server/version.d.ts +16 -0
  371. package/dist/server/version.js +17 -0
  372. package/dist/server/version.js.map +1 -0
  373. package/dist/settings/useSiteSettings.d.ts +2 -2
  374. package/dist/settings/useSiteSettings.js +48 -28
  375. package/dist/settings/useSiteSettings.js.map +1 -1
  376. package/dist/styles.css +30 -4
  377. package/dist/theme/presets.d.ts +1 -1
  378. package/dist/version.d.ts +8 -0
  379. package/dist/version.js +16 -0
  380. package/dist/version.js.map +1 -0
  381. package/package.json +35 -34
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { getFunctions, httpsCallable } from "firebase/functions";
3
- import { getFirebaseApp } from "../../firebase/client";
4
- import { functionsRegion } from "../../firebase/region";
3
+ import { getFirebaseApp } from "../../firebase/client.js";
4
+ import { functionsRegion } from "../../firebase/region.js";
5
5
  function shopCallable(name) {
6
6
  return async (data) => {
7
7
  const app = getFirebaseApp();
@@ -2,8 +2,8 @@
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import { useEffect, useMemo, useState } from "react";
4
4
  import { collection, getDocs } from "firebase/firestore";
5
- import { getDb } from "../../firebase/client";
6
- import { Card } from "../ui/primitives";
5
+ import { getDb } from "../../firebase/client.js";
6
+ import { Card } from "../ui/primitives.js";
7
7
  function StatsPanel({ siteId }) {
8
8
  const [months, setMonths] = useState([]);
9
9
  const [loading, setLoading] = useState(true);
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import { useRef } from "react";
4
- import { Button } from "./primitives";
4
+ import { Button } from "./primitives.js";
5
5
  let keyCounter = 0;
6
6
  const genKey = () => `row-${++keyCounter}`;
7
7
  function ArrayEditor({
@@ -0,0 +1,3 @@
1
+ export declare function PanelIcon({ id }: {
2
+ id: string;
3
+ }): import("react").JSX.Element;
@@ -0,0 +1,34 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ const PADEN = {
4
+ pages: "M4 3h9l4 4v14H4z M13 3v5h4",
5
+ news: "M4 5h16v14H4z M7 9h10 M7 13h10 M7 17h6",
6
+ media: "M3 5h18v14H3z M3 15l5-5 4 4 3-3 6 6",
7
+ forms: "M5 3h14v18H5z M9 8h6 M9 12h6 M9 16h3",
8
+ stats: "M4 20V10 M10 20V4 M16 20v-7 M22 20H2",
9
+ blocks: "M4 4h7v7H4z M13 4h7v7h-7z M4 13h7v7H4z M13 13h7v7h-7z",
10
+ settings: "M12 15a3 3 0 100-6 3 3 0 000 6z M19.4 15a1.6 1.6 0 00.3 1.8l.1.1a2 2 0 11-2.8 2.8l-.1-.1a1.6 1.6 0 00-2.7 1.1V21a2 2 0 11-4 0v-.1A1.6 1.6 0 007.5 19.4l-.1.1a2 2 0 11-2.8-2.8l.1-.1A1.6 1.6 0 003 14.6H3a2 2 0 110-4h.1A1.6 1.6 0 004.6 7.5l-.1-.1a2 2 0 112.8-2.8l.1.1a1.6 1.6 0 001.8.3H9.4a1.6 1.6 0 001-1.5V3a2 2 0 114 0v.1a1.6 1.6 0 001 1.5 1.6 1.6 0 001.8-.3l.1-.1a2 2 0 112.8 2.8l-.1.1a1.6 1.6 0 00-.3 1.8v.1a1.6 1.6 0 001.5 1H21a2 2 0 110 4h-.1a1.6 1.6 0 00-1.5 1z"
11
+ };
12
+ const FALLBACK = "M12 3l9 9-9 9-9-9z";
13
+ function PanelIcon({ id }) {
14
+ return /* @__PURE__ */ jsx(
15
+ "svg",
16
+ {
17
+ "aria-hidden": "true",
18
+ viewBox: "0 0 24 24",
19
+ width: "18",
20
+ height: "18",
21
+ fill: "none",
22
+ stroke: "currentColor",
23
+ strokeWidth: "1.6",
24
+ strokeLinecap: "round",
25
+ strokeLinejoin: "round",
26
+ className: "shrink-0",
27
+ children: (PADEN[id] ?? FALLBACK).split(" M").map((d, i) => /* @__PURE__ */ jsx("path", { d: i === 0 ? d : `M${d}` }, i))
28
+ }
29
+ );
30
+ }
31
+ export {
32
+ PanelIcon
33
+ };
34
+ //# sourceMappingURL=PanelIcon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/admin/ui/PanelIcon.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * Kleine lijn-iconen voor de zijbalk. Bewust inline SVG en geen icoon-pakket: het zijn er zeven,\n * en een dependency voor zeven paden is niet te verdedigen in een bundel die élke klantsite laadt.\n *\n * Iconen zijn hier geen versiering maar herkenning: de beheerder van een hoveniersbedrijf logt een\n * keer per maand in en zoekt \"waar stond die tekst ook alweer\" — een vorm vindt hij sneller terug\n * dan een woord.\n */\nconst PADEN: Record<string, string> = {\n pages: \"M4 3h9l4 4v14H4z M13 3v5h4\",\n news: \"M4 5h16v14H4z M7 9h10 M7 13h10 M7 17h6\",\n media: \"M3 5h18v14H3z M3 15l5-5 4 4 3-3 6 6\",\n forms: \"M5 3h14v18H5z M9 8h6 M9 12h6 M9 16h3\",\n stats: \"M4 20V10 M10 20V4 M16 20v-7 M22 20H2\",\n blocks: \"M4 4h7v7H4z M13 4h7v7h-7z M4 13h7v7H4z M13 13h7v7h-7z\",\n settings: \"M12 15a3 3 0 100-6 3 3 0 000 6z M19.4 15a1.6 1.6 0 00.3 1.8l.1.1a2 2 0 11-2.8 2.8l-.1-.1a1.6 1.6 0 00-2.7 1.1V21a2 2 0 11-4 0v-.1A1.6 1.6 0 007.5 19.4l-.1.1a2 2 0 11-2.8-2.8l.1-.1A1.6 1.6 0 003 14.6H3a2 2 0 110-4h.1A1.6 1.6 0 004.6 7.5l-.1-.1a2 2 0 112.8-2.8l.1.1a1.6 1.6 0 001.8.3H9.4a1.6 1.6 0 001-1.5V3a2 2 0 114 0v.1a1.6 1.6 0 001 1.5 1.6 1.6 0 001.8-.3l.1-.1a2 2 0 112.8 2.8l-.1.1a1.6 1.6 0 00-.3 1.8v.1a1.6 1.6 0 001.5 1H21a2 2 0 110 4h-.1a1.6 1.6 0 00-1.5 1z\",\n};\n/** Onbekende module (klant-paneel): een neutrale ruit, zodat het rijtje visueel niet breekt. */\nconst FALLBACK = \"M12 3l9 9-9 9-9-9z\";\n\nexport function PanelIcon({ id }: { id: string }) {\n return (\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 24 24\"\n width=\"18\"\n height=\"18\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"shrink-0\"\n >\n {(PADEN[id] ?? FALLBACK).split(\" M\").map((d, i) => (\n <path key={i} d={i === 0 ? d : `M${d}`} />\n ))}\n </svg>\n );\n}\n"],"mappings":";AAqCQ;AA3BR,MAAM,QAAgC;AAAA,EACpC,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,UAAU;AACZ;AAEA,MAAM,WAAW;AAEV,SAAS,UAAU,EAAE,GAAG,GAAmB;AAChD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAY;AAAA,MACZ,SAAQ;AAAA,MACR,OAAM;AAAA,MACN,QAAO;AAAA,MACP,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,MACd,gBAAe;AAAA,MACf,WAAU;AAAA,MAER,iBAAM,EAAE,KAAK,UAAU,MAAM,IAAI,EAAE,IAAI,CAAC,GAAG,MAC3C,oBAAC,UAAa,GAAG,MAAM,IAAI,IAAI,IAAI,CAAC,MAAzB,CAA6B,CACzC;AAAA;AAAA,EACH;AAEJ;","names":[]}
@@ -1,9 +1,24 @@
1
- import * as DialogPrimitive from "@radix-ui/react-dialog";
2
- export declare const Dialog: import("react").FC<DialogPrimitive.DialogProps>;
3
- export declare const DialogTrigger: import("react").ForwardRefExoticComponent<DialogPrimitive.DialogTriggerProps & import("react").RefAttributes<HTMLButtonElement>>;
4
- export declare const DialogClose: import("react").ForwardRefExoticComponent<DialogPrimitive.DialogCloseProps & import("react").RefAttributes<HTMLButtonElement>>;
5
- export declare function DialogContent({ className, children, title, ...props }: React.ComponentProps<typeof DialogPrimitive.Content> & {
1
+ import { type ReactNode } from "react";
2
+ export declare function Dialog({ open: controlled, onOpenChange, children, }: {
3
+ open?: boolean;
4
+ onOpenChange?: (v: boolean) => void;
5
+ children: ReactNode;
6
+ }): import("react").JSX.Element;
7
+ /** `asChild` blijft geaccepteerd voor een ongewijzigde aanroep-API; het kind wordt altijd gekloond. */
8
+ export declare function DialogTrigger({ children }: {
9
+ children: ReactNode;
10
+ asChild?: boolean;
11
+ }): import("react").JSX.Element;
12
+ export declare function DialogClose({ children }: {
13
+ children: ReactNode;
14
+ asChild?: boolean;
15
+ }): import("react").JSX.Element;
16
+ export declare function DialogContent({ title, width, className, children, }: {
6
17
  title: string;
18
+ /** Breedte van de dialoog. Verving de `max-w-*`-klassen: Astryx zet de breedte inline. */
19
+ width?: number | string;
20
+ className?: string;
21
+ children: ReactNode;
7
22
  }): import("react").JSX.Element;
8
- export declare function DialogDescription({ className, ...props }: React.ComponentProps<typeof DialogPrimitive.Description>): import("react").JSX.Element;
23
+ export declare function DialogDescription({ className, ...props }: React.ComponentProps<"p">): import("react").JSX.Element;
9
24
  export declare function DialogFooter({ className, ...props }: React.ComponentProps<"div">): import("react").JSX.Element;
@@ -1,44 +1,65 @@
1
1
  "use client";
2
- import { jsx, jsxs } from "react/jsx-runtime";
3
- import * as DialogPrimitive from "@radix-ui/react-dialog";
4
- import { cn } from "./cn";
5
- const Dialog = DialogPrimitive.Root;
6
- const DialogTrigger = DialogPrimitive.Trigger;
7
- const DialogClose = DialogPrimitive.Close;
2
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
+ import {
4
+ cloneElement,
5
+ createContext,
6
+ isValidElement,
7
+ useContext,
8
+ useState
9
+ } from "react";
10
+ import { Dialog as AstryxDialog, DialogHeader } from "@astryxdesign/core/Dialog";
11
+ import { cn } from "./cn.js";
12
+ const Ctx = createContext(null);
13
+ const useDialog = () => {
14
+ const ctx = useContext(Ctx);
15
+ if (!ctx) throw new Error("Dialog-onderdelen horen binnen <Dialog> te staan.");
16
+ return ctx;
17
+ };
18
+ function withClick(children, action) {
19
+ if (!isValidElement(children)) return children;
20
+ const el = children;
21
+ return cloneElement(el, {
22
+ onClick: (e) => {
23
+ el.props.onClick?.(e);
24
+ action();
25
+ }
26
+ });
27
+ }
28
+ function Dialog({
29
+ open: controlled,
30
+ onOpenChange,
31
+ children
32
+ }) {
33
+ const [uncontrolled, setUncontrolled] = useState(false);
34
+ const open = controlled ?? uncontrolled;
35
+ const setOpen = (v) => {
36
+ if (controlled === void 0) setUncontrolled(v);
37
+ onOpenChange?.(v);
38
+ };
39
+ return /* @__PURE__ */ jsx(Ctx.Provider, { value: { open, setOpen }, children });
40
+ }
41
+ function DialogTrigger({ children }) {
42
+ const { setOpen } = useDialog();
43
+ return /* @__PURE__ */ jsx(Fragment, { children: withClick(children, () => setOpen(true)) });
44
+ }
45
+ function DialogClose({ children }) {
46
+ const { setOpen } = useDialog();
47
+ return /* @__PURE__ */ jsx(Fragment, { children: withClick(children, () => setOpen(false)) });
48
+ }
8
49
  function DialogContent({
9
- className,
10
- children,
11
50
  title,
12
- ...props
51
+ width = "min(92vw, 32rem)",
52
+ className,
53
+ children
13
54
  }) {
14
- const container = typeof document !== "undefined" ? document.querySelector(".xicms-ve") ?? document.querySelector(".xicms-admin") : null;
15
- return /* @__PURE__ */ jsxs(DialogPrimitive.Portal, { container: container ?? void 0, children: [
16
- /* @__PURE__ */ jsx(DialogPrimitive.Overlay, { className: "fixed inset-0 z-[10010] bg-black/50" }),
17
- /* @__PURE__ */ jsxs(
18
- DialogPrimitive.Content,
19
- {
20
- style: {
21
- position: "fixed",
22
- left: "50%",
23
- top: "50%",
24
- transform: "translate(-50%, -50%)",
25
- width: "min(92vw, 32rem)",
26
- maxHeight: "85vh",
27
- overflowY: "auto",
28
- zIndex: 10011
29
- },
30
- className: cn("rounded-xl bg-white p-5 shadow-xl focus:outline-none", className),
31
- ...props,
32
- children: [
33
- /* @__PURE__ */ jsx(DialogPrimitive.Title, { className: "mb-3 text-lg font-semibold", children: title }),
34
- children
35
- ]
36
- }
37
- )
55
+ const { open, setOpen } = useDialog();
56
+ return /* @__PURE__ */ jsxs(AstryxDialog, { isOpen: open, onOpenChange: setOpen, width, purpose: "form", className, children: [
57
+ /* @__PURE__ */ jsx(DialogHeader, { title }),
58
+ children
38
59
  ] });
39
60
  }
40
61
  function DialogDescription({ className, ...props }) {
41
- return /* @__PURE__ */ jsx(DialogPrimitive.Description, { className: cn("text-sm text-slate-600", className), ...props });
62
+ return /* @__PURE__ */ jsx("p", { className: cn("text-sm text-slate-600", className), ...props });
42
63
  }
43
64
  function DialogFooter({ className, ...props }) {
44
65
  return /* @__PURE__ */ jsx("div", { className: cn("mt-5 flex items-center justify-end gap-2", className), ...props });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/admin/ui/dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport { cn } from \"./cn\";\n\nexport const Dialog = DialogPrimitive.Root;\nexport const DialogTrigger = DialogPrimitive.Trigger;\nexport const DialogClose = DialogPrimitive.Close;\n\nexport function DialogContent({\n className,\n children,\n title,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Content> & { title: string }) {\n // De admin-Tailwind is gescoped onder `.xicms-admin` (important: \".xicms-admin\"). Radix portalt\n // standaard naar <body> — buiten die scope, waardoor de dialog volledig ONGESTYLED zou renderen\n // (static, geen achtergrond, achter de editor). Daarom portalen we IN de admin-scope.\n const container =\n typeof document !== \"undefined\"\n ? document.querySelector<HTMLElement>(\".xicms-ve\") ?? document.querySelector<HTMLElement>(\".xicms-admin\")\n : null;\n return (\n <DialogPrimitive.Portal container={container ?? undefined}>\n {/* Boven de VisualEditor-overlay (z-index 10000) zodat de kiezer niet erachter verdwijnt. */}\n <DialogPrimitive.Overlay className=\"fixed inset-0 z-[10010] bg-black/50\" />\n <DialogPrimitive.Content\n // Centreren + maat via INLINE style i.p.v. Tailwind-utilities: `-translate-x-1/2` werd in de\n // gescopete/geportalde admin-context (Tailwind v4) niet toegepast, waardoor de dialog op\n // `left:50%` bleef hangen en op smalle schermen rechts buiten beeld liep. Inline styles omzeilen\n // de scoping/laag-volgorde volledig en winnen altijd. Content blijft een directe Portal-child\n // (wrappen in een <div> brak Radix → \"Maximum update depth exceeded\"). max-height + overflow\n // houdt de kiezer op mobiel binnen het scherm.\n style={{\n position: \"fixed\",\n left: \"50%\",\n top: \"50%\",\n transform: \"translate(-50%, -50%)\",\n width: \"min(92vw, 32rem)\",\n maxHeight: \"85vh\",\n overflowY: \"auto\",\n zIndex: 10011,\n }}\n className={cn(\"rounded-xl bg-white p-5 shadow-xl focus:outline-none\", className)}\n {...props}\n >\n <DialogPrimitive.Title className=\"mb-3 text-lg font-semibold\">{title}</DialogPrimitive.Title>\n {children}\n </DialogPrimitive.Content>\n </DialogPrimitive.Portal>\n );\n}\n\nexport function DialogDescription({ className, ...props }: React.ComponentProps<typeof DialogPrimitive.Description>) {\n return <DialogPrimitive.Description className={cn(\"text-sm text-slate-600\", className)} {...props} />;\n}\n\nexport function DialogFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return <div className={cn(\"mt-5 flex items-center justify-end gap-2\", className)} {...props} />;\n}\n"],"mappings":";AAyBM,cACA,YADA;AAvBN,YAAY,qBAAqB;AACjC,SAAS,UAAU;AAEZ,MAAM,SAAS,gBAAgB;AAC/B,MAAM,gBAAgB,gBAAgB;AACtC,MAAM,cAAc,gBAAgB;AAEpC,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAA6E;AAI3E,QAAM,YACJ,OAAO,aAAa,cAChB,SAAS,cAA2B,WAAW,KAAK,SAAS,cAA2B,cAAc,IACtG;AACN,SACE,qBAAC,gBAAgB,QAAhB,EAAuB,WAAW,aAAa,QAE9C;AAAA,wBAAC,gBAAgB,SAAhB,EAAwB,WAAU,uCAAsC;AAAA,IACzE;AAAA,MAAC,gBAAgB;AAAA,MAAhB;AAAA,QAOC,OAAO;AAAA,UACL,UAAU;AAAA,UACV,MAAM;AAAA,UACN,KAAK;AAAA,UACL,WAAW;AAAA,UACX,OAAO;AAAA,UACP,WAAW;AAAA,UACX,WAAW;AAAA,UACX,QAAQ;AAAA,QACV;AAAA,QACA,WAAW,GAAG,wDAAwD,SAAS;AAAA,QAC9E,GAAG;AAAA,QAEJ;AAAA,8BAAC,gBAAgB,OAAhB,EAAsB,WAAU,8BAA8B,iBAAM;AAAA,UACpE;AAAA;AAAA;AAAA,IACH;AAAA,KACF;AAEJ;AAEO,SAAS,kBAAkB,EAAE,WAAW,GAAG,MAAM,GAA6D;AACnH,SAAO,oBAAC,gBAAgB,aAAhB,EAA4B,WAAW,GAAG,0BAA0B,SAAS,GAAI,GAAG,OAAO;AACrG;AAEO,SAAS,aAAa,EAAE,WAAW,GAAG,MAAM,GAAgC;AACjF,SAAO,oBAAC,SAAI,WAAW,GAAG,4CAA4C,SAAS,GAAI,GAAG,OAAO;AAC/F;","names":[]}
1
+ {"version":3,"sources":["../../../src/admin/ui/dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n cloneElement,\n createContext,\n isValidElement,\n useContext,\n useState,\n type MouseEvent,\n type ReactElement,\n type ReactNode,\n} from \"react\";\nimport { Dialog as AstryxDialog, DialogHeader } from \"@astryxdesign/core/Dialog\";\nimport { cn } from \"./cn\";\n\n/**\n * Dialogen op Astryx in plaats van Radix.\n *\n * De aanroep-API blijft ongewijzigd (Dialog/DialogTrigger/DialogContent/DialogClose), zodat de\n * mediakiezer, de bevestiging, de patroonkiezer en de factuurweergave hetzelfde blijven lezen.\n *\n * Waarom dit een vereenvoudiging is: Astryx rendert een NATIEVE `<dialog>` en opent hem met\n * `showModal()`. Daarmee staat hij in de top layer van de browser, boven alles — inclusief de\n * editor-overlay. De hele reeks workarounds die het Radix-pad nodig had, vervalt:\n *\n * - portalen ín `.xicms-ve`/`.xicms-admin` omdat Radix anders buiten de gescopete admin-CSS\n * landde en volledig ongestyled rendeerde;\n * - `z-index: 10010/10011` om boven die overlay te komen;\n * - inline centreren omdat `-translate-x-1/2` in de gescopete Tailwind-context niet aansloeg,\n * waardoor de dialoog op smalle schermen rechts buiten beeld liep.\n *\n * Astryx regelt bovendien zelf scroll-lock, focus-insluiting én focusherstel naar het element dat\n * de dialoog opende, en stemt zijn Escape-afhandeling af op een actieve focus trap.\n */\ninterface DialogCtx {\n open: boolean;\n setOpen: (v: boolean) => void;\n}\nconst Ctx = createContext<DialogCtx | null>(null);\nconst useDialog = (): DialogCtx => {\n const ctx = useContext(Ctx);\n if (!ctx) throw new Error(\"Dialog-onderdelen horen binnen <Dialog> te staan.\");\n return ctx;\n};\n\n/** Kloont het kind en hangt er een klik-actie aan (het `asChild`-patroon van de vorige API). */\nfunction withClick(children: ReactNode, action: () => void): ReactNode {\n if (!isValidElement(children)) return children;\n const el = children as ReactElement<{ onClick?: (e: MouseEvent) => void }>;\n return cloneElement(el, {\n onClick: (e: MouseEvent) => {\n el.props.onClick?.(e);\n action();\n },\n });\n}\n\nexport function Dialog({\n open: controlled,\n onOpenChange,\n children,\n}: {\n open?: boolean;\n onOpenChange?: (v: boolean) => void;\n children: ReactNode;\n}) {\n const [uncontrolled, setUncontrolled] = useState(false);\n const open = controlled ?? uncontrolled;\n const setOpen = (v: boolean) => {\n if (controlled === undefined) setUncontrolled(v);\n onOpenChange?.(v);\n };\n return <Ctx.Provider value={{ open, setOpen }}>{children}</Ctx.Provider>;\n}\n\n/** `asChild` blijft geaccepteerd voor een ongewijzigde aanroep-API; het kind wordt altijd gekloond. */\nexport function DialogTrigger({ children }: { children: ReactNode; asChild?: boolean }) {\n const { setOpen } = useDialog();\n return <>{withClick(children, () => setOpen(true))}</>;\n}\n\nexport function DialogClose({ children }: { children: ReactNode; asChild?: boolean }) {\n const { setOpen } = useDialog();\n return <>{withClick(children, () => setOpen(false))}</>;\n}\n\nexport function DialogContent({\n title,\n width = \"min(92vw, 32rem)\",\n className,\n children,\n}: {\n title: string;\n /** Breedte van de dialoog. Verving de `max-w-*`-klassen: Astryx zet de breedte inline. */\n width?: number | string;\n className?: string;\n children: ReactNode;\n}) {\n const { open, setOpen } = useDialog();\n return (\n <AstryxDialog isOpen={open} onOpenChange={setOpen} width={width} purpose=\"form\" className={className}>\n <DialogHeader title={title} />\n {children}\n </AstryxDialog>\n );\n}\n\nexport function DialogDescription({ className, ...props }: React.ComponentProps<\"p\">) {\n return <p className={cn(\"text-sm text-slate-600\", className)} {...props} />;\n}\n\nexport function DialogFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return <div className={cn(\"mt-5 flex items-center justify-end gap-2\", className)} {...props} />;\n}\n"],"mappings":";AAwES,SAMA,UANA,KA4BL,YA5BK;AAtET;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAIK;AACP,SAAS,UAAU,cAAc,oBAAoB;AACrD,SAAS,UAAU;AAyBnB,MAAM,MAAM,cAAgC,IAAI;AAChD,MAAM,YAAY,MAAiB;AACjC,QAAM,MAAM,WAAW,GAAG;AAC1B,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,mDAAmD;AAC7E,SAAO;AACT;AAGA,SAAS,UAAU,UAAqB,QAA+B;AACrE,MAAI,CAAC,eAAe,QAAQ,EAAG,QAAO;AACtC,QAAM,KAAK;AACX,SAAO,aAAa,IAAI;AAAA,IACtB,SAAS,CAAC,MAAkB;AAC1B,SAAG,MAAM,UAAU,CAAC;AACpB,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AACH;AAEO,SAAS,OAAO;AAAA,EACrB,MAAM;AAAA,EACN;AAAA,EACA;AACF,GAIG;AACD,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,KAAK;AACtD,QAAM,OAAO,cAAc;AAC3B,QAAM,UAAU,CAAC,MAAe;AAC9B,QAAI,eAAe,OAAW,iBAAgB,CAAC;AAC/C,mBAAe,CAAC;AAAA,EAClB;AACA,SAAO,oBAAC,IAAI,UAAJ,EAAa,OAAO,EAAE,MAAM,QAAQ,GAAI,UAAS;AAC3D;AAGO,SAAS,cAAc,EAAE,SAAS,GAA+C;AACtF,QAAM,EAAE,QAAQ,IAAI,UAAU;AAC9B,SAAO,gCAAG,oBAAU,UAAU,MAAM,QAAQ,IAAI,CAAC,GAAE;AACrD;AAEO,SAAS,YAAY,EAAE,SAAS,GAA+C;AACpF,QAAM,EAAE,QAAQ,IAAI,UAAU;AAC9B,SAAO,gCAAG,oBAAU,UAAU,MAAM,QAAQ,KAAK,CAAC,GAAE;AACtD;AAEO,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA;AACF,GAMG;AACD,QAAM,EAAE,MAAM,QAAQ,IAAI,UAAU;AACpC,SACE,qBAAC,gBAAa,QAAQ,MAAM,cAAc,SAAS,OAAc,SAAQ,QAAO,WAC9E;AAAA,wBAAC,gBAAa,OAAc;AAAA,IAC3B;AAAA,KACH;AAEJ;AAEO,SAAS,kBAAkB,EAAE,WAAW,GAAG,MAAM,GAA8B;AACpF,SAAO,oBAAC,OAAE,WAAW,GAAG,0BAA0B,SAAS,GAAI,GAAG,OAAO;AAC3E;AAEO,SAAS,aAAa,EAAE,WAAW,GAAG,MAAM,GAAgC;AACjF,SAAO,oBAAC,SAAI,WAAW,GAAG,4CAA4C,SAAS,GAAI,GAAG,OAAO;AAC/F;","names":[]}
@@ -1,7 +1,7 @@
1
- export { cn } from "./cn";
2
- export { Button, Input, Textarea, Field, Card, Badge } from "./primitives";
3
- export { ToastProvider, useToast } from "./toast";
4
- export { Tabs, TabsList, TabsTrigger, TabsContent } from "./tabs";
5
- export { Dialog, DialogTrigger, DialogClose, DialogContent } from "./dialog";
6
- export { Select } from "./select";
7
- export { Switch } from "./switch";
1
+ export { cn } from "./cn.js";
2
+ export { Button, Input, Textarea, Field, Card, Badge } from "./primitives.js";
3
+ export { ToastProvider, useToast } from "./toast.js";
4
+ export { Tabs, TabsList, TabsTrigger, TabsContent } from "./tabs.js";
5
+ export { Dialog, DialogTrigger, DialogClose, DialogContent } from "./dialog.js";
6
+ export { Select } from "./select.js";
7
+ export { Switch } from "./switch.js";
@@ -1,10 +1,10 @@
1
- import { cn } from "./cn";
2
- import { Button, Input, Textarea, Field, Card, Badge } from "./primitives";
3
- import { ToastProvider, useToast } from "./toast";
4
- import { Tabs, TabsList, TabsTrigger, TabsContent } from "./tabs";
5
- import { Dialog, DialogTrigger, DialogClose, DialogContent } from "./dialog";
6
- import { Select } from "./select";
7
- import { Switch } from "./switch";
1
+ import { cn } from "./cn.js";
2
+ import { Button, Input, Textarea, Field, Card, Badge } from "./primitives.js";
3
+ import { ToastProvider, useToast } from "./toast.js";
4
+ import { Tabs, TabsList, TabsTrigger, TabsContent } from "./tabs.js";
5
+ import { Dialog, DialogTrigger, DialogClose, DialogContent } from "./dialog.js";
6
+ import { Select } from "./select.js";
7
+ import { Switch } from "./switch.js";
8
8
  export {
9
9
  Badge,
10
10
  Button,
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import { forwardRef } from "react";
4
- import { cn } from "./cn";
4
+ import { cn } from "./cn.js";
5
5
  import { TextInput } from "@astryxdesign/core/TextInput";
6
6
  import { NumberInput } from "@astryxdesign/core/NumberInput";
7
7
  import { TextArea } from "@astryxdesign/core/TextArea";
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { jsx } from "react/jsx-runtime";
3
3
  import * as TabsPrimitive from "@radix-ui/react-tabs";
4
- import { cn } from "./cn";
4
+ import { cn } from "./cn.js";
5
5
  const Tabs = TabsPrimitive.Root;
6
6
  function TabsList({ className, ...props }) {
7
7
  return /* @__PURE__ */ jsx(
@@ -1,4 +1,4 @@
1
- import type { BlockRegistry } from "../../blocks/registry";
1
+ import type { BlockRegistry } from "../../blocks/registry.js";
2
2
  export declare function TranslationPanel({ block, siteId, registry, locale, overlay, onTranslate, }: {
3
3
  block: Record<string, unknown> & {
4
4
  _key: string;
@@ -1,9 +1,9 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import { useMemo } from "react";
4
- import { introspectToFields } from "../lib/zodFields";
5
- import { RichTextEditor } from "../editors/RichTextEditor";
6
- import { Field as FieldRow, Input, Textarea } from "../ui/primitives";
4
+ import { introspectToFields } from "../lib/zodFields.js";
5
+ import { RichTextEditor } from "../editors/RichTextEditor.js";
6
+ import { Field as FieldRow, Input, Textarea } from "../ui/primitives.js";
7
7
  function collectEntries(fields, value, prefix = "", labelPrefix = "") {
8
8
  const out = [];
9
9
  for (const f of fields) {
@@ -2,28 +2,38 @@
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import "@xiwebdesign/xicms-core/admin.css";
4
4
  import { useCallback, useEffect, useMemo, useRef, useState } from "react";
5
- import { useSiteConfig } from "../../config";
6
- import { useRegistry } from "../../blocks/context";
7
- import { introspectToFields } from "../lib/zodFields";
8
- import { BlockErrorBoundary } from "../../blocks/BlockErrorBoundary";
9
- import { InlineImageEditProvider } from "../../media/ImageContext";
10
- import { MediaPickerDialog } from "../media/MediaPicker";
5
+ import { useSiteConfig } from "../../config.js";
6
+ import { useRegistry } from "../../blocks/context.js";
7
+ import { introspectToFields } from "../lib/zodFields.js";
8
+ import { BlockErrorBoundary } from "../../blocks/BlockErrorBoundary.js";
9
+ import { InlineImageEditProvider } from "../../media/ImageContext.js";
10
+ import { MediaPickerDialog } from "../media/MediaPicker.js";
11
11
  import { EmptyState } from "@astryxdesign/core/EmptyState";
12
- import { buildBlockAddOptions } from "../../blocks/registry";
12
+ import { useFocusTrap, useScrollLock } from "@astryxdesign/core/hooks";
13
+ import { useNestedDialogOpen } from "../lib/useNestedDialog.js";
14
+ import { useThemeVars } from "../../XiCMSProvider.js";
15
+ import { buildBlockAddOptions } from "../../blocks/registry.js";
16
+ import { safeParse } from "zod/v4/core";
13
17
  import DOMPurify from "dompurify";
14
- import { createPage, getDraftByPath, saveDraft, publishPage, subscribeDraft, subscribeVersions, restoreVersion } from "../lib/pagesClient";
15
- import { isDemoActive } from "../../demo/demoStore";
16
- import { builtinBlockEditors, GenericEditor } from "../blockEditors";
17
- import { StyleEditor } from "../blockEditors/StyleEditor";
18
- import { siteLocales, parseLocaleSlugs, localizeBlocks } from "../../i18n/overlay";
19
- import { TranslationPanel } from "./TranslationPanel";
20
- import { reorderBlocks } from "./reorder";
21
- import { PatternInserter } from "../patterns/PatternInserter";
22
- import { Button, Field, Input, Textarea } from "../ui/primitives";
23
- import { Select } from "../ui/select";
24
- import { ToastProvider, useToast } from "../ui/toast";
25
- import { ConfirmHost, useConfirm } from "../ui/ConfirmDialog";
18
+ import { createPage, getDraftByPath, saveDraft, publishPage, subscribeDraft, subscribeVersions, restoreVersion } from "../lib/pagesClient.js";
19
+ import { isDemoActive } from "../../demo/demoStore.js";
20
+ import { builtinBlockEditors, GenericEditor } from "../blockEditors/index.js";
21
+ import { StyleEditor } from "../blockEditors/StyleEditor.js";
22
+ import { siteLocales, parseLocaleSlugs, localizeBlocks } from "../../i18n/overlay.js";
23
+ import { TranslationPanel } from "./TranslationPanel.js";
24
+ import { reorderBlocks } from "./reorder.js";
25
+ import { PatternInserter } from "../patterns/PatternInserter.js";
26
+ import { Button, Field, Input, Textarea } from "../ui/primitives.js";
27
+ import { Select } from "../ui/select.js";
28
+ import { ToastProvider, useToast } from "../ui/toast.js";
29
+ import { ConfirmHost, useConfirm } from "../ui/ConfirmDialog.js";
26
30
  const GLOBAL_INLINE = [
31
+ // `field: "html"` is de AANNAME, geen wet: een element mag met `data-xicms-edit` zeggen welk veld
32
+ // het werkelijk toont, en dat wint (zie de bind hieronder). Zonder die voorrang schreef élk
33
+ // `.xicms-richtext`-element naar een veld dat letterlijk "html" heet — waar de FAQ zijn antwoord
34
+ // in `items[].aHtml` bewaart en het accordeon in `items[].bodyHtml`. Inline bewerken van een
35
+ // FAQ-antwoord landde daardoor op een niet-bestaand veld: de wijziging verdween stil en het blok
36
+ // hield een zwerfveld over.
27
37
  { selector: ".xicms-richtext", field: "html", html: true },
28
38
  { selector: "[data-xicms-edit]", field: "", html: false, fromData: true }
29
39
  ];
@@ -90,6 +100,15 @@ function VisualEditorInner({ onClose }) {
90
100
  const firstSave = useRef(true);
91
101
  const canvasRef = useRef(null);
92
102
  const [conflict, setConflict] = useState(false);
103
+ const { vars: themeVars, darkAuto } = useThemeVars();
104
+ const nestedDialogOpen = useNestedDialogOpen();
105
+ const { containerRef, focusFirst } = useFocusTrap({ isActive: !nestedDialogOpen });
106
+ useScrollLock(true);
107
+ useEffect(() => {
108
+ const opener = document.activeElement;
109
+ focusFirst();
110
+ return () => opener?.focus?.();
111
+ }, [focusFirst]);
93
112
  const [dragIndex, setDragIndex] = useState(null);
94
113
  const [dropIndex, setDropIndex] = useState(null);
95
114
  const draggingRef = useRef(false);
@@ -323,7 +342,10 @@ function VisualEditorInner({ onClose }) {
323
342
  const apply = () => {
324
343
  for (const m of specs) {
325
344
  host.querySelectorAll(m.selector).forEach(
326
- (el) => bind(el, "fromData" in m && m.fromData ? el.dataset.xicmsEdit : m.field, !!m.html)
345
+ (el) => (
346
+ // Een expliciete `data-xicms-edit` wint altijd; anders het veld van de matcher.
347
+ bind(el, el.dataset.xicmsEdit ?? m.field, !!m.html)
348
+ )
327
349
  );
328
350
  }
329
351
  };
@@ -382,7 +404,7 @@ function VisualEditorInner({ onClose }) {
382
404
  if (e.key === "Escape") {
383
405
  const t2 = e.target;
384
406
  const inField2 = !!t2 && (t2.isContentEditable || t2.tagName === "INPUT" || t2.tagName === "TEXTAREA" || t2.tagName === "SELECT");
385
- const dialogOpen = document.querySelector('[role="dialog"][data-state="open"], [role="alertdialog"][data-state="open"]');
407
+ const dialogOpen = document.querySelector('dialog[open], [role="dialog"][data-state="open"], [role="alertdialog"][data-state="open"]');
386
408
  if (!inField2 && !dialogOpen) handleClose();
387
409
  return;
388
410
  }
@@ -436,7 +458,7 @@ function VisualEditorInner({ onClose }) {
436
458
  confirmLabel: "Loskoppelen"
437
459
  });
438
460
  if (!ok) return;
439
- const { getSymbolOnce } = await import("../lib/symbolsClient");
461
+ const { getSymbolOnce } = await import("../lib/symbolsClient.js");
440
462
  const sym = await getSymbolOnce(siteId, blk.symbolId);
441
463
  if (!sym) {
442
464
  toast({ title: "Symbool niet gevonden", tone: "error" });
@@ -509,7 +531,7 @@ function VisualEditorInner({ onClose }) {
509
531
  }
510
532
  setConflict(false);
511
533
  }, [siteId, path, mutateDraft]);
512
- return /* @__PURE__ */ jsxs("div", { className: "xicms-ve__shell", role: "dialog", "aria-modal": "true", "aria-label": `Pagina bewerken: ${path}`, children: [
534
+ return /* @__PURE__ */ jsxs("div", { ref: containerRef, className: "xicms-ve__shell", role: "dialog", "aria-modal": "true", "aria-label": `Pagina bewerken: ${path}`, children: [
513
535
  /* @__PURE__ */ jsxs("header", { className: "xicms-ve__bar", children: [
514
536
  /* @__PURE__ */ jsxs("strong", { className: "xicms-ve__title", children: [
515
537
  "Bewerken \xB7 ",
@@ -542,7 +564,7 @@ function VisualEditorInner({ onClose }) {
542
564
  /* @__PURE__ */ jsx(Button, { size: "sm", variant: "secondary", onClick: () => setConflict(false), children: "Mijn versie behouden" })
543
565
  ] }),
544
566
  /* @__PURE__ */ jsxs("div", { className: "xicms-ve__body", children: [
545
- /* @__PURE__ */ jsxs("main", { className: "xicms-ve__canvas", children: [
567
+ /* @__PURE__ */ jsxs("main", { className: "xicms-ve__canvas xicms-root", "data-dark": darkAuto ? "auto" : void 0, style: themeVars, children: [
546
568
  status === "loading" && /* @__PURE__ */ jsx("p", { className: "xicms-ve__hint", children: "Laden\u2026" }),
547
569
  status === "none" && /* @__PURE__ */ jsxs("div", { className: "xicms-ve__empty", children: [
548
570
  /* @__PURE__ */ jsx(
@@ -561,7 +583,7 @@ function VisualEditorInner({ onClose }) {
561
583
  const def = registry.get(b._type);
562
584
  const Render = def?.Render;
563
585
  const safe = (() => {
564
- const parsed = def?.schema?.safeParse(b);
586
+ const parsed = def?.schema ? safeParse(def.schema, b) : void 0;
565
587
  return parsed?.success ? parsed.data : b;
566
588
  })();
567
589
  const dropClass = dropIndex === i ? " is-drop-before" : dropIndex === i + 1 ? " is-drop-after" : "";