@xiwebdesign/xicms-core 7.30.0 → 8.15.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 (463) hide show
  1. package/dist/XiCMSProvider.js +22 -7
  2. package/dist/XiCMSProvider.js.map +1 -1
  3. package/dist/admin/AdminApp.js +175 -93
  4. package/dist/admin/AdminApp.js.map +1 -1
  5. package/dist/admin/AdminHelp.d.ts +1 -1
  6. package/dist/admin/AdminHelp.js +44 -36
  7. package/dist/admin/AdminHelp.js.map +1 -1
  8. package/dist/admin/CoreVersion.d.ts +6 -3
  9. package/dist/admin/CoreVersion.js +60 -24
  10. package/dist/admin/CoreVersion.js.map +1 -1
  11. package/dist/admin/NewsEditor.d.ts +7 -0
  12. package/dist/admin/NewsEditor.js +117 -75
  13. package/dist/admin/NewsEditor.js.map +1 -1
  14. package/dist/admin/SuperadminPanel.js +1 -1
  15. package/dist/admin/SuperadminPanel.js.map +1 -1
  16. package/dist/admin/ZoekPalet.d.ts +15 -0
  17. package/dist/admin/ZoekPalet.js +123 -0
  18. package/dist/admin/ZoekPalet.js.map +1 -0
  19. package/dist/admin/blockEditors/GenericEditor.js +36 -18
  20. package/dist/admin/blockEditors/GenericEditor.js.map +1 -1
  21. package/dist/admin/blockEditors/StyleEditor.js +37 -3
  22. package/dist/admin/blockEditors/StyleEditor.js.map +1 -1
  23. package/dist/admin/blockEditors/SymbolRefEditor.js +44 -2
  24. package/dist/admin/blockEditors/SymbolRefEditor.js.map +1 -1
  25. package/dist/admin/blockEditors/index.js +154 -73
  26. package/dist/admin/blockEditors/index.js.map +1 -1
  27. package/dist/admin/customBlocks/CustomBlocksPanel.js +18 -7
  28. package/dist/admin/customBlocks/CustomBlocksPanel.js.map +1 -1
  29. package/dist/admin/dashboard/DashboardPanel.js +26 -16
  30. package/dist/admin/dashboard/DashboardPanel.js.map +1 -1
  31. package/dist/admin/editors/RichTextEditor.d.ts +4 -3
  32. package/dist/admin/editors/RichTextEditor.js +19 -56
  33. package/dist/admin/editors/RichTextEditor.js.map +1 -1
  34. package/dist/admin/editors/fontSizeExtension.js +7 -1
  35. package/dist/admin/editors/fontSizeExtension.js.map +1 -1
  36. package/dist/admin/editors/slashMenu.d.ts +18 -0
  37. package/dist/admin/editors/slashMenu.js +34 -0
  38. package/dist/admin/editors/slashMenu.js.map +1 -0
  39. package/dist/admin/editors/useRijkeTekst.d.ts +48 -0
  40. package/dist/admin/editors/useRijkeTekst.js +310 -0
  41. package/dist/admin/editors/useRijkeTekst.js.map +1 -0
  42. package/dist/admin/forms/FormsPanel.d.ts +11 -2
  43. package/dist/admin/forms/FormsPanel.js +218 -65
  44. package/dist/admin/forms/FormsPanel.js.map +1 -1
  45. package/dist/admin/lib/blokInfo.d.ts +17 -0
  46. package/dist/admin/lib/blokInfo.js +80 -0
  47. package/dist/admin/lib/blokInfo.js.map +1 -0
  48. package/dist/admin/lib/foutNaarMens.d.ts +1 -0
  49. package/dist/admin/lib/foutNaarMens.js +22 -0
  50. package/dist/admin/lib/foutNaarMens.js.map +1 -0
  51. package/dist/admin/lib/gewisteVelden.d.ts +13 -0
  52. package/dist/admin/lib/gewisteVelden.js +31 -0
  53. package/dist/admin/lib/gewisteVelden.js.map +1 -0
  54. package/dist/admin/lib/heroHulp.d.ts +11 -0
  55. package/dist/admin/lib/heroHulp.js +18 -0
  56. package/dist/admin/lib/heroHulp.js.map +1 -0
  57. package/dist/admin/lib/kleur.js +2 -3
  58. package/dist/admin/lib/kleur.js.map +1 -1
  59. package/dist/admin/lib/leesbaarheid.d.ts +34 -0
  60. package/dist/admin/lib/leesbaarheid.js +82 -0
  61. package/dist/admin/lib/leesbaarheid.js.map +1 -0
  62. package/dist/admin/lib/lengteAdvies.d.ts +1 -0
  63. package/dist/admin/lib/lengteAdvies.js +16 -0
  64. package/dist/admin/lib/lengteAdvies.js.map +1 -0
  65. package/dist/admin/lib/mediaLijst.d.ts +26 -0
  66. package/dist/admin/lib/mediaLijst.js +42 -0
  67. package/dist/admin/lib/mediaLijst.js.map +1 -0
  68. package/dist/admin/lib/mediaUsage.d.ts +12 -1
  69. package/dist/admin/lib/mediaUsage.js +43 -33
  70. package/dist/admin/lib/mediaUsage.js.map +1 -1
  71. package/dist/admin/lib/menuHulp.d.ts +16 -0
  72. package/dist/admin/lib/menuHulp.js +41 -0
  73. package/dist/admin/lib/menuHulp.js.map +1 -0
  74. package/dist/admin/lib/onopgeslagen.d.ts +10 -0
  75. package/dist/admin/lib/onopgeslagen.js +35 -0
  76. package/dist/admin/lib/onopgeslagen.js.map +1 -0
  77. package/dist/admin/lib/pagesClient.d.ts +55 -2
  78. package/dist/admin/lib/pagesClient.js +126 -28
  79. package/dist/admin/lib/pagesClient.js.map +1 -1
  80. package/dist/admin/lib/paginaGebruik.d.ts +56 -0
  81. package/dist/admin/lib/paginaGebruik.js +109 -0
  82. package/dist/admin/lib/paginaGebruik.js.map +1 -0
  83. package/dist/admin/lib/publicatieCheck.d.ts +25 -0
  84. package/dist/admin/lib/publicatieCheck.js +114 -0
  85. package/dist/admin/lib/publicatieCheck.js.map +1 -0
  86. package/dist/admin/lib/scrollNaarDetail.d.ts +6 -0
  87. package/dist/admin/lib/scrollNaarDetail.js +20 -0
  88. package/dist/admin/lib/scrollNaarDetail.js.map +1 -0
  89. package/dist/admin/lib/symbolsClient.d.ts +10 -0
  90. package/dist/admin/lib/symbolsClient.js +14 -1
  91. package/dist/admin/lib/symbolsClient.js.map +1 -1
  92. package/dist/admin/lib/tekstVeld.d.ts +8 -0
  93. package/dist/admin/lib/tekstVeld.js +10 -0
  94. package/dist/admin/lib/tekstVeld.js.map +1 -0
  95. package/dist/admin/lib/useIsSuperadmin.d.ts +2 -0
  96. package/dist/admin/lib/useIsSuperadmin.js +13 -0
  97. package/dist/admin/lib/useIsSuperadmin.js.map +1 -0
  98. package/dist/admin/lib/veldTaal.d.ts +14 -0
  99. package/dist/admin/lib/veldTaal.js +247 -0
  100. package/dist/admin/lib/veldTaal.js.map +1 -0
  101. package/dist/admin/lib/versieVergelijk.d.ts +17 -0
  102. package/dist/admin/lib/versieVergelijk.js +24 -0
  103. package/dist/admin/lib/versieVergelijk.js.map +1 -0
  104. package/dist/admin/lib/zodFields.js +22 -4
  105. package/dist/admin/lib/zodFields.js.map +1 -1
  106. package/dist/admin/lib/zodFout.d.ts +9 -0
  107. package/dist/admin/lib/zodFout.js +63 -0
  108. package/dist/admin/lib/zodFout.js.map +1 -0
  109. package/dist/admin/media/MediaManager.js +162 -32
  110. package/dist/admin/media/MediaManager.js.map +1 -1
  111. package/dist/admin/media/MediaPicker.d.ts +3 -0
  112. package/dist/admin/media/MediaPicker.js +84 -31
  113. package/dist/admin/media/MediaPicker.js.map +1 -1
  114. package/dist/admin/menu/MenuPanel.js +144 -83
  115. package/dist/admin/menu/MenuPanel.js.map +1 -1
  116. package/dist/admin/navContext.d.ts +3 -0
  117. package/dist/admin/navContext.js +13 -1
  118. package/dist/admin/navContext.js.map +1 -1
  119. package/dist/admin/pages/PageEditor.js +146 -30
  120. package/dist/admin/pages/PageEditor.js.map +1 -1
  121. package/dist/admin/pages/PagesPanel.js +215 -61
  122. package/dist/admin/pages/PagesPanel.js.map +1 -1
  123. package/dist/admin/pages/StarterKiezer.d.ts +12 -0
  124. package/dist/admin/pages/StarterKiezer.js +113 -0
  125. package/dist/admin/pages/StarterKiezer.js.map +1 -0
  126. package/dist/admin/panelRegistry.d.ts +1 -1
  127. package/dist/admin/panelRegistry.js +2 -1
  128. package/dist/admin/panelRegistry.js.map +1 -1
  129. package/dist/admin/patterns/PatternInserter.js +1 -1
  130. package/dist/admin/patterns/PatternInserter.js.map +1 -1
  131. package/dist/admin/settings/BedrijfInstellingen.d.ts +20 -0
  132. package/dist/admin/settings/BedrijfInstellingen.js +144 -0
  133. package/dist/admin/settings/BedrijfInstellingen.js.map +1 -0
  134. package/dist/admin/settings/MailSettings.js +2 -2
  135. package/dist/admin/settings/MailSettings.js.map +1 -1
  136. package/dist/admin/settings/MailTemplates.js +5 -4
  137. package/dist/admin/settings/MailTemplates.js.map +1 -1
  138. package/dist/admin/settings/SettingsPanel.js +120 -78
  139. package/dist/admin/settings/SettingsPanel.js.map +1 -1
  140. package/dist/admin/settings/SnapshotsCard.js +4 -4
  141. package/dist/admin/settings/SnapshotsCard.js.map +1 -1
  142. package/dist/admin/settings/VorigeTerugzetten.d.ts +15 -0
  143. package/dist/admin/settings/VorigeTerugzetten.js +89 -0
  144. package/dist/admin/settings/VorigeTerugzetten.js.map +1 -0
  145. package/dist/admin/shop/CategoriesTab.js +6 -4
  146. package/dist/admin/shop/CategoriesTab.js.map +1 -1
  147. package/dist/admin/shop/DiscountsTab.js +4 -2
  148. package/dist/admin/shop/DiscountsTab.js.map +1 -1
  149. package/dist/admin/shop/OrdersTab.js +57 -19
  150. package/dist/admin/shop/OrdersTab.js.map +1 -1
  151. package/dist/admin/shop/ProductPaneel.js +2 -1
  152. package/dist/admin/shop/ProductPaneel.js.map +1 -1
  153. package/dist/admin/shop/ProductsTab.js +40 -19
  154. package/dist/admin/shop/ProductsTab.js.map +1 -1
  155. package/dist/admin/shop/ShopPanel.js +13 -1
  156. package/dist/admin/shop/ShopPanel.js.map +1 -1
  157. package/dist/admin/shop/ShopSettingsTab.js +27 -1
  158. package/dist/admin/shop/ShopSettingsTab.js.map +1 -1
  159. package/dist/admin/shop/productClient.js +7 -3
  160. package/dist/admin/shop/productClient.js.map +1 -1
  161. package/dist/admin/stats/NietGevonden.d.ts +10 -0
  162. package/dist/admin/stats/NietGevonden.js +78 -0
  163. package/dist/admin/stats/NietGevonden.js.map +1 -0
  164. package/dist/admin/stats/StatsPanel.js +6 -1
  165. package/dist/admin/stats/StatsPanel.js.map +1 -1
  166. package/dist/admin/stats/lib.d.ts +2 -0
  167. package/dist/admin/stats/lib.js.map +1 -1
  168. package/dist/admin/ui/ConfirmDialog.js +10 -1
  169. package/dist/admin/ui/ConfirmDialog.js.map +1 -1
  170. package/dist/admin/ui/Icon.d.ts +34 -0
  171. package/dist/admin/ui/Icon.js +44 -0
  172. package/dist/admin/ui/Icon.js.map +1 -0
  173. package/dist/admin/ui/ImageField.d.ts +15 -0
  174. package/dist/admin/ui/ImageField.js +67 -0
  175. package/dist/admin/ui/ImageField.js.map +1 -0
  176. package/dist/admin/ui/KleurVeld.d.ts +25 -0
  177. package/dist/admin/ui/KleurVeld.js +76 -0
  178. package/dist/admin/ui/KleurVeld.js.map +1 -0
  179. package/dist/admin/ui/LaadStaat.d.ts +21 -0
  180. package/dist/admin/ui/LaadStaat.js +43 -0
  181. package/dist/admin/ui/LaadStaat.js.map +1 -0
  182. package/dist/admin/ui/LeesbaarheidPaneel.d.ts +10 -0
  183. package/dist/admin/ui/LeesbaarheidPaneel.js +68 -0
  184. package/dist/admin/ui/LeesbaarheidPaneel.js.map +1 -0
  185. package/dist/admin/ui/LinkDialog.d.ts +22 -0
  186. package/dist/admin/ui/LinkDialog.js +131 -0
  187. package/dist/admin/ui/LinkDialog.js.map +1 -0
  188. package/dist/admin/ui/LinkVeld.d.ts +14 -0
  189. package/dist/admin/ui/LinkVeld.js +49 -0
  190. package/dist/admin/ui/LinkVeld.js.map +1 -0
  191. package/dist/admin/ui/PreviewLinkResultaat.d.ts +14 -0
  192. package/dist/admin/ui/PreviewLinkResultaat.js +52 -0
  193. package/dist/admin/ui/PreviewLinkResultaat.js.map +1 -0
  194. package/dist/admin/ui/charts.js +5 -5
  195. package/dist/admin/ui/charts.js.map +1 -1
  196. package/dist/admin/ui/primitives.d.ts +16 -6
  197. package/dist/admin/ui/primitives.js +98 -26
  198. package/dist/admin/ui/primitives.js.map +1 -1
  199. package/dist/admin/ui/select.js +5 -2
  200. package/dist/admin/ui/select.js.map +1 -1
  201. package/dist/admin/ui/switch.d.ts +3 -1
  202. package/dist/admin/ui/switch.js +6 -3
  203. package/dist/admin/ui/switch.js.map +1 -1
  204. package/dist/admin/ui/toast.d.ts +2 -1
  205. package/dist/admin/ui/toast.js +17 -11
  206. package/dist/admin/ui/toast.js.map +1 -1
  207. package/dist/admin/visual/BlokKiezer.d.ts +34 -0
  208. package/dist/admin/visual/BlokKiezer.js +225 -0
  209. package/dist/admin/visual/BlokKiezer.js.map +1 -0
  210. package/dist/admin/visual/InlineGereedschap.d.ts +52 -0
  211. package/dist/admin/visual/InlineGereedschap.js +356 -0
  212. package/dist/admin/visual/InlineGereedschap.js.map +1 -0
  213. package/dist/admin/visual/InlineRijkeTekst.d.ts +23 -0
  214. package/dist/admin/visual/InlineRijkeTekst.js +152 -0
  215. package/dist/admin/visual/InlineRijkeTekst.js.map +1 -0
  216. package/dist/admin/visual/VisualEditor.js +273 -125
  217. package/dist/admin/visual/VisualEditor.js.map +1 -1
  218. package/dist/admin.css +1 -1
  219. package/dist/bedrijf/bedrijf.d.ts +36 -0
  220. package/dist/bedrijf/bedrijf.js +110 -0
  221. package/dist/bedrijf/bedrijf.js.map +1 -0
  222. package/dist/blocks/BlockRenderer.js +11 -1
  223. package/dist/blocks/BlockRenderer.js.map +1 -1
  224. package/dist/blocks/blockStyle.d.ts +7 -0
  225. package/dist/blocks/blockStyle.js +16 -3
  226. package/dist/blocks/blockStyle.js.map +1 -1
  227. package/dist/blocks/builtinSchemas.js +6 -0
  228. package/dist/blocks/builtinSchemas.js.map +1 -1
  229. package/dist/blocks/builtins/AgendaRender.d.ts +22 -0
  230. package/dist/blocks/builtins/AgendaRender.js +69 -9
  231. package/dist/blocks/builtins/AgendaRender.js.map +1 -1
  232. package/dist/blocks/builtins/Availability.d.ts +1 -0
  233. package/dist/blocks/builtins/Availability.js +23 -0
  234. package/dist/blocks/builtins/Availability.js.map +1 -0
  235. package/dist/blocks/builtins/AvailabilityRender.d.ts +12 -0
  236. package/dist/blocks/builtins/AvailabilityRender.js +105 -0
  237. package/dist/blocks/builtins/AvailabilityRender.js.map +1 -0
  238. package/dist/blocks/builtins/BeforeAfterRender.js +4 -3
  239. package/dist/blocks/builtins/BeforeAfterRender.js.map +1 -1
  240. package/dist/blocks/builtins/Booking.js +1 -1
  241. package/dist/blocks/builtins/Booking.js.map +1 -1
  242. package/dist/blocks/builtins/BreadcrumbsRender.d.ts +4 -3
  243. package/dist/blocks/builtins/BreadcrumbsRender.js +14 -8
  244. package/dist/blocks/builtins/BreadcrumbsRender.js.map +1 -1
  245. package/dist/blocks/builtins/ColumnsRender.d.ts +1 -1
  246. package/dist/blocks/builtins/ColumnsRender.js +3 -1
  247. package/dist/blocks/builtins/ColumnsRender.js.map +1 -1
  248. package/dist/blocks/builtins/Contact.js +1 -1
  249. package/dist/blocks/builtins/Contact.js.map +1 -1
  250. package/dist/blocks/builtins/ContactRender.d.ts +1 -1
  251. package/dist/blocks/builtins/ContactRender.js +29 -8
  252. package/dist/blocks/builtins/ContactRender.js.map +1 -1
  253. package/dist/blocks/builtins/Cta.js +1 -1
  254. package/dist/blocks/builtins/Cta.js.map +1 -1
  255. package/dist/blocks/builtins/CtaRender.d.ts +1 -1
  256. package/dist/blocks/builtins/CtaRender.js +5 -4
  257. package/dist/blocks/builtins/CtaRender.js.map +1 -1
  258. package/dist/blocks/builtins/Embed.js +1 -1
  259. package/dist/blocks/builtins/Embed.js.map +1 -1
  260. package/dist/blocks/builtins/FormBlock.js +1 -0
  261. package/dist/blocks/builtins/FormBlock.js.map +1 -1
  262. package/dist/blocks/builtins/FormBlockRender.d.ts +6 -0
  263. package/dist/blocks/builtins/FormBlockRender.js +88 -16
  264. package/dist/blocks/builtins/FormBlockRender.js.map +1 -1
  265. package/dist/blocks/builtins/GalleryRender.js +3 -2
  266. package/dist/blocks/builtins/GalleryRender.js.map +1 -1
  267. package/dist/blocks/builtins/Hero.js +1 -1
  268. package/dist/blocks/builtins/Hero.js.map +1 -1
  269. package/dist/blocks/builtins/HeroRender.js +7 -3
  270. package/dist/blocks/builtins/HeroRender.js.map +1 -1
  271. package/dist/blocks/builtins/OpenNowBadge.d.ts +4 -2
  272. package/dist/blocks/builtins/OpenNowBadge.js +6 -6
  273. package/dist/blocks/builtins/OpenNowBadge.js.map +1 -1
  274. package/dist/blocks/builtins/OpeningHoursRender.d.ts +8 -2
  275. package/dist/blocks/builtins/OpeningHoursRender.js +27 -6
  276. package/dist/blocks/builtins/OpeningHoursRender.js.map +1 -1
  277. package/dist/blocks/builtins/PriceList.d.ts +1 -0
  278. package/dist/blocks/builtins/PriceList.js +25 -0
  279. package/dist/blocks/builtins/PriceList.js.map +1 -0
  280. package/dist/blocks/builtins/PriceListRender.d.ts +17 -0
  281. package/dist/blocks/builtins/PriceListRender.js +87 -0
  282. package/dist/blocks/builtins/PriceListRender.js.map +1 -0
  283. package/dist/blocks/builtins/RichTextBlockRender.js +6 -1
  284. package/dist/blocks/builtins/RichTextBlockRender.js.map +1 -1
  285. package/dist/blocks/builtins/SectionHeading.d.ts +1 -0
  286. package/dist/blocks/builtins/SectionHeading.js +14 -0
  287. package/dist/blocks/builtins/SectionHeading.js.map +1 -0
  288. package/dist/blocks/builtins/SectionHeadingRender.d.ts +7 -0
  289. package/dist/blocks/builtins/SectionHeadingRender.js +14 -0
  290. package/dist/blocks/builtins/SectionHeadingRender.js.map +1 -0
  291. package/dist/blocks/builtins/SliderRender.js +3 -2
  292. package/dist/blocks/builtins/SliderRender.js.map +1 -1
  293. package/dist/blocks/builtins/SymbolRef.js +1 -1
  294. package/dist/blocks/builtins/SymbolRef.js.map +1 -1
  295. package/dist/blocks/builtins/TeamRender.js +6 -1
  296. package/dist/blocks/builtins/TeamRender.js.map +1 -1
  297. package/dist/blocks/builtins/Testimonials.js +3 -1
  298. package/dist/blocks/builtins/Testimonials.js.map +1 -1
  299. package/dist/blocks/builtins/TestimonialsRender.js +4 -0
  300. package/dist/blocks/builtins/TestimonialsRender.js.map +1 -1
  301. package/dist/blocks/builtins/WhatsappChatRender.d.ts +1 -1
  302. package/dist/blocks/builtins/WhatsappChatRender.js +1 -1
  303. package/dist/blocks/builtins/WhatsappChatRender.js.map +1 -1
  304. package/dist/blocks/builtins/Widgets.js +2 -2
  305. package/dist/blocks/builtins/Widgets.js.map +1 -1
  306. package/dist/blocks/builtins/WidgetsRender.js +3 -1
  307. package/dist/blocks/builtins/WidgetsRender.js.map +1 -1
  308. package/dist/blocks/builtins/index.d.ts +3 -0
  309. package/dist/blocks/builtins/index.js +6 -0
  310. package/dist/blocks/builtins/index.js.map +1 -1
  311. package/dist/blocks/builtins/lib/autoComplete.d.ts +7 -0
  312. package/dist/blocks/builtins/lib/autoComplete.js +20 -0
  313. package/dist/blocks/builtins/lib/autoComplete.js.map +1 -0
  314. package/dist/blocks/builtins/lib/bookingUrl.d.ts +2 -2
  315. package/dist/blocks/builtins/lib/bookingUrl.js +1 -1
  316. package/dist/blocks/builtins/lib/bookingUrl.js.map +1 -1
  317. package/dist/blocks/builtins/lib/ical.d.ts +24 -0
  318. package/dist/blocks/builtins/lib/ical.js +82 -0
  319. package/dist/blocks/builtins/lib/ical.js.map +1 -0
  320. package/dist/blocks/builtins/lib/vandaag.d.ts +8 -0
  321. package/dist/blocks/builtins/lib/vandaag.js +22 -0
  322. package/dist/blocks/builtins/lib/vandaag.js.map +1 -0
  323. package/dist/blocks/registry.d.ts +6 -0
  324. package/dist/blocks/registry.js.map +1 -1
  325. package/dist/blocks/ui/index.js +1 -0
  326. package/dist/blocks/ui/index.js.map +1 -1
  327. package/dist/components/EditBar.js +2 -4
  328. package/dist/components/EditBar.js.map +1 -1
  329. package/dist/components/News.js +26 -18
  330. package/dist/components/News.js.map +1 -1
  331. package/dist/components/PageView.d.ts +7 -1
  332. package/dist/components/PageView.js +17 -0
  333. package/dist/components/PageView.js.map +1 -1
  334. package/dist/components/ResponsiveImage.js +18 -20
  335. package/dist/components/ResponsiveImage.js.map +1 -1
  336. package/dist/components/site/SiteFooter.d.ts +6 -1
  337. package/dist/components/site/SiteFooter.js +61 -9
  338. package/dist/components/site/SiteFooter.js.map +1 -1
  339. package/dist/components/site/SiteHeader.d.ts +15 -0
  340. package/dist/components/site/SiteHeader.js +70 -0
  341. package/dist/components/site/SiteHeader.js.map +1 -0
  342. package/dist/components/site/SiteNav.d.ts +2 -0
  343. package/dist/components/site/SiteNav.js +29 -5
  344. package/dist/components/site/SiteNav.js.map +1 -1
  345. package/dist/demo/DemoStudio.js +2 -2
  346. package/dist/demo/DemoStudio.js.map +1 -1
  347. package/dist/demo/demoStore.d.ts +13 -0
  348. package/dist/demo/demoStore.js +36 -0
  349. package/dist/demo/demoStore.js.map +1 -1
  350. package/dist/editor/EditorProvider.js +15 -4
  351. package/dist/editor/EditorProvider.js.map +1 -1
  352. package/dist/index.d.ts +4 -1
  353. package/dist/index.js +16 -1
  354. package/dist/index.js.map +1 -1
  355. package/dist/media/ImageContext.d.ts +17 -0
  356. package/dist/media/ImageContext.js +65 -20
  357. package/dist/media/ImageContext.js.map +1 -1
  358. package/dist/media/altInHtml.d.ts +9 -0
  359. package/dist/media/altInHtml.js +17 -0
  360. package/dist/media/altInHtml.js.map +1 -0
  361. package/dist/media/srcset.d.ts +12 -0
  362. package/dist/media/srcset.js +13 -0
  363. package/dist/media/srcset.js.map +1 -0
  364. package/dist/modules/builtins.d.ts +1 -0
  365. package/dist/modules/builtins.js +16 -3
  366. package/dist/modules/builtins.js.map +1 -1
  367. package/dist/modules/shop/blocks/Cart.js +5 -3
  368. package/dist/modules/shop/blocks/Cart.js.map +1 -1
  369. package/dist/modules/shop/blocks/Checkout.js +56 -35
  370. package/dist/modules/shop/blocks/Checkout.js.map +1 -1
  371. package/dist/modules/shop/blocks/Donation.js +4 -4
  372. package/dist/modules/shop/blocks/Donation.js.map +1 -1
  373. package/dist/modules/shop/blocks/ProductDetail.js +19 -3
  374. package/dist/modules/shop/blocks/ProductDetail.js.map +1 -1
  375. package/dist/modules/shop/blocks/ProductGrid.d.ts +3 -1
  376. package/dist/modules/shop/blocks/ProductGrid.js +8 -4
  377. package/dist/modules/shop/blocks/ProductGrid.js.map +1 -1
  378. package/dist/modules/shop/blocks/ShopCategories.js +4 -3
  379. package/dist/modules/shop/blocks/ShopCategories.js.map +1 -1
  380. package/dist/modules/shop/lib.d.ts +4 -0
  381. package/dist/modules/shop/lib.js +14 -0
  382. package/dist/modules/shop/lib.js.map +1 -1
  383. package/dist/modules/shop/settings.d.ts +3 -0
  384. package/dist/modules/shop/settings.js +14 -0
  385. package/dist/modules/shop/settings.js.map +1 -1
  386. package/dist/modules/shop/strings.d.ts +4 -0
  387. package/dist/modules/shop/strings.js +8 -0
  388. package/dist/modules/shop/strings.js.map +1 -1
  389. package/dist/next/envCheck.d.ts +42 -0
  390. package/dist/next/envCheck.js +106 -0
  391. package/dist/next/envCheck.js.map +1 -0
  392. package/dist/next/index.cjs +185 -2
  393. package/dist/next/index.d.ts +2 -0
  394. package/dist/next/index.js +8 -1
  395. package/dist/next/index.js.map +1 -1
  396. package/dist/next/securityHeaders.d.ts +36 -0
  397. package/dist/next/securityHeaders.js +74 -0
  398. package/dist/next/securityHeaders.js.map +1 -0
  399. package/dist/patterns/builtins.d.ts +7 -0
  400. package/dist/patterns/builtins.js +138 -3
  401. package/dist/patterns/builtins.js.map +1 -1
  402. package/dist/releaseNotes.js +140 -0
  403. package/dist/releaseNotes.js.map +1 -1
  404. package/dist/render/PublishedPage.d.ts +2 -1
  405. package/dist/render/PublishedPage.js +10 -4
  406. package/dist/render/PublishedPage.js.map +1 -1
  407. package/dist/schema/blocks.d.ts +470 -0
  408. package/dist/schema/blocks.js +102 -4
  409. package/dist/schema/blocks.js.map +1 -1
  410. package/dist/schema/business.d.ts +117 -0
  411. package/dist/schema/business.js +73 -0
  412. package/dist/schema/business.js.map +1 -0
  413. package/dist/schema/fields.d.ts +2 -1
  414. package/dist/schema/fields.js.map +1 -1
  415. package/dist/schema/forms.d.ts +18 -0
  416. package/dist/schema/forms.js +18 -3
  417. package/dist/schema/forms.js.map +1 -1
  418. package/dist/schema/mail.d.ts +10 -0
  419. package/dist/schema/mail.js +7 -0
  420. package/dist/schema/mail.js.map +1 -1
  421. package/dist/schema/settings.d.ts +101 -0
  422. package/dist/schema/settings.js +24 -3
  423. package/dist/schema/settings.js.map +1 -1
  424. package/dist/schema/shop.d.ts +2 -0
  425. package/dist/schema/shop.js +4 -0
  426. package/dist/schema/shop.js.map +1 -1
  427. package/dist/schema/shopGeld.d.ts +1 -0
  428. package/dist/schema/shopGeld.js +1 -0
  429. package/dist/schema/shopGeld.js.map +1 -1
  430. package/dist/schema/siteConfig.d.ts +68 -1
  431. package/dist/schema/siteConfig.js +7 -2
  432. package/dist/schema/siteConfig.js.map +1 -1
  433. package/dist/server/blockData.d.ts +1 -1
  434. package/dist/server/blockData.js +74 -18
  435. package/dist/server/blockData.js.map +1 -1
  436. package/dist/server/cspRapport.d.ts +20 -0
  437. package/dist/server/cspRapport.js +56 -0
  438. package/dist/server/cspRapport.js.map +1 -0
  439. package/dist/server/fonts.d.ts +3 -0
  440. package/dist/server/fonts.js +39 -0
  441. package/dist/server/fonts.js.map +1 -0
  442. package/dist/server/index.d.ts +3 -0
  443. package/dist/server/index.js +8 -0
  444. package/dist/server/index.js.map +1 -1
  445. package/dist/server/sanitize.js +15 -2
  446. package/dist/server/sanitize.js.map +1 -1
  447. package/dist/settings/useSiteSettings.js +4 -1
  448. package/dist/settings/useSiteSettings.js.map +1 -1
  449. package/dist/starters/starters.d.ts +69 -0
  450. package/dist/starters/starters.js +171 -0
  451. package/dist/starters/starters.js.map +1 -0
  452. package/dist/styles.css +1149 -208
  453. package/dist/theme/color.d.ts +10 -0
  454. package/dist/theme/color.js +17 -1
  455. package/dist/theme/color.js.map +1 -1
  456. package/dist/theme/fontFallback.d.ts +23 -0
  457. package/dist/theme/fontFallback.js +58 -0
  458. package/dist/theme/fontFallback.js.map +1 -0
  459. package/dist/theme/fonts.d.ts +11 -0
  460. package/dist/theme/fonts.js +16 -0
  461. package/dist/theme/fonts.js.map +1 -0
  462. package/dist/version.js +1 -1
  463. package/package.json +6 -4
package/dist/admin.css CHANGED
@@ -1,2 +1,2 @@
1
1
  /*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
2
- @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-ease:initial}}}@layer theme{:root,:host{--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-200:oklch(88.5% .062 18.334);--color-red-600:oklch(57.7% .245 27.325);--color-red-700:oklch(50.5% .213 27.518);--color-amber-50:oklch(98.7% .022 95.277);--color-amber-200:oklch(92.4% .12 95.746);--color-amber-300:oklch(87.9% .169 91.605);--color-amber-600:oklch(66.6% .179 58.318);--color-amber-700:oklch(55.5% .163 48.998);--color-amber-800:oklch(47.3% .137 46.201);--color-amber-900:oklch(41.4% .112 45.904);--color-emerald-700:oklch(50.8% .118 165.612);--color-blue-600:oklch(54.6% .245 262.881);--color-indigo-500:oklch(58.5% .233 277.117);--color-slate-50:oklch(98.4% .003 247.858);--color-slate-100:oklch(96.8% .007 247.896);--color-slate-200:oklch(92.9% .013 255.508);--color-slate-300:oklch(86.9% .022 252.894);--color-slate-400:oklch(70.4% .04 256.788);--color-slate-500:oklch(55.4% .046 257.417);--color-slate-600:oklch(44.6% .043 257.281);--color-slate-700:oklch(37.2% .044 257.287);--color-slate-800:oklch(27.9% .041 260.031);--color-slate-900:oklch(20.8% .042 265.755);--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-3xl:48rem;--container-4xl:56rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-wide:.025em;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--ease-out:cubic-bezier(0, 0, .2, 1);--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--color-brand:#4f46e5;--color-brand-50:#eef2ff;--color-brand-500:#4f46e5;--color-brand-600:#4f46e5;--color-brand-700:#3730a3}}@scope(.xicms-admin){@layer utilities{.pointer-events-none{pointer-events:none!important}.visible{visibility:visible!important}.sr-only{clip-path:inset(50%)!important;white-space:nowrap!important;border-width:0!important;width:1px!important;height:1px!important;margin:-1px!important;padding:0!important;position:absolute!important;overflow:hidden!important}.absolute{position:absolute!important}.fixed{position:fixed!important}.relative{position:relative!important}.static{position:static!important}.sticky{position:sticky!important}.inset-x-0{inset-inline:0!important}.-top-0\.5{top:calc(var(--spacing) * -.5)!important}.-top-2{top:calc(var(--spacing) * -2)!important}.top-0{top:0!important}.-right-2{right:calc(var(--spacing) * -2)!important}.right-0{right:0!important}.-bottom-2{bottom:calc(var(--spacing) * -2)!important}.bottom-0{bottom:0!important}.-left-2{left:calc(var(--spacing) * -2)!important}.left-1\/2{left:50%!important}.z-10{z-index:10!important}.col-span-2{grid-column:span 2/span 2!important}.col-span-full{grid-column:1/-1!important}.container{width:100%!important}@media (min-width:40rem){.container{max-width:40rem!important}}@media (min-width:48rem){.container{max-width:48rem!important}}@media (min-width:64rem){.container{max-width:64rem!important}}@media (min-width:80rem){.container{max-width:80rem!important}}@media (min-width:96rem){.container{max-width:96rem!important}}.-mx-1{margin-inline:calc(var(--spacing) * -1)!important}.-mx-4{margin-inline:calc(var(--spacing) * -4)!important}.mt-0\.5{margin-top:calc(var(--spacing) * .5)!important}.mt-1{margin-top:var(--spacing)!important}.mt-2{margin-top:calc(var(--spacing) * 2)!important}.mt-3{margin-top:calc(var(--spacing) * 3)!important}.mt-4{margin-top:calc(var(--spacing) * 4)!important}.mt-5{margin-top:calc(var(--spacing) * 5)!important}.mt-6{margin-top:calc(var(--spacing) * 6)!important}.mt-auto{margin-top:auto!important}.mr-1{margin-right:var(--spacing)!important}.mr-2{margin-right:calc(var(--spacing) * 2)!important}.mb-1{margin-bottom:var(--spacing)!important}.mb-2{margin-bottom:calc(var(--spacing) * 2)!important}.mb-3{margin-bottom:calc(var(--spacing) * 3)!important}.mb-4{margin-bottom:calc(var(--spacing) * 4)!important}.ml-1{margin-left:var(--spacing)!important}.ml-1\.5{margin-left:calc(var(--spacing) * 1.5)!important}.ml-auto{margin-left:auto!important}.block{display:block!important}.contents{display:contents!important}.flex{display:flex!important}.grid{display:grid!important}.hidden{display:none!important}.inline{display:inline!important}.inline-block{display:inline-block!important}.inline-flex{display:inline-flex!important}.table{display:table!important}.aspect-square{aspect-ratio:1!important}.h-1\.5{height:calc(var(--spacing) * 1.5)!important}.h-2{height:calc(var(--spacing) * 2)!important}.h-4{height:calc(var(--spacing) * 4)!important}.h-5{height:calc(var(--spacing) * 5)!important}.h-6{height:calc(var(--spacing) * 6)!important}.h-8{height:calc(var(--spacing) * 8)!important}.h-9{height:calc(var(--spacing) * 9)!important}.h-10{height:calc(var(--spacing) * 10)!important}.h-12{height:calc(var(--spacing) * 12)!important}.h-14{height:calc(var(--spacing) * 14)!important}.h-16{height:calc(var(--spacing) * 16)!important}.h-28{height:calc(var(--spacing) * 28)!important}.h-32{height:calc(var(--spacing) * 32)!important}.h-\[70vh\]{height:70vh!important}.h-fit{height:fit-content!important}.h-full{height:100%!important}.max-h-\[55vh\]{max-height:55vh!important}.max-h-\[60vh\]{max-height:60vh!important}.min-h-\[8rem\]{min-height:8rem!important}.min-h-screen{min-height:100vh!important}.w-2{width:calc(var(--spacing) * 2)!important}.w-4{width:calc(var(--spacing) * 4)!important}.w-5{width:calc(var(--spacing) * 5)!important}.w-6{width:calc(var(--spacing) * 6)!important}.w-8{width:calc(var(--spacing) * 8)!important}.w-11{width:calc(var(--spacing) * 11)!important}.w-14{width:calc(var(--spacing) * 14)!important}.w-16{width:calc(var(--spacing) * 16)!important}.w-20{width:calc(var(--spacing) * 20)!important}.w-24{width:calc(var(--spacing) * 24)!important}.w-28{width:calc(var(--spacing) * 28)!important}.w-32{width:calc(var(--spacing) * 32)!important}.w-36{width:calc(var(--spacing) * 36)!important}.w-44{width:calc(var(--spacing) * 44)!important}.w-fit{width:fit-content!important}.w-full{width:100%!important}.max-w-3xl{max-width:var(--container-3xl)!important}.max-w-4xl{max-width:var(--container-4xl)!important}.max-w-40{max-width:calc(var(--spacing) * 40)!important}.max-w-md{max-width:var(--container-md)!important}.max-w-sm{max-width:var(--container-sm)!important}.max-w-xs{max-width:var(--container-xs)!important}.min-w-0{min-width:0!important}.min-w-8{min-width:calc(var(--spacing) * 8)!important}.flex-1{flex:1!important}.shrink-0{flex-shrink:0!important}.-translate-x-1\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1)!important;translate:var(--tw-translate-x) var(--tw-translate-y)!important}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1)!important;translate:var(--tw-translate-x) var(--tw-translate-y)!important}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)!important}.cursor-crosshair{cursor:crosshair!important}.cursor-default{cursor:default!important}.cursor-pointer{cursor:pointer!important}.resize{resize:both!important}.list-decimal{list-style-type:decimal!important}.list-disc{list-style-type:disc!important}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))!important}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))!important}.grid-cols-\[1fr_1\.4fr_auto\]{grid-template-columns:1fr 1.4fr auto!important}.grid-cols-\[1fr_1fr_90px_90px_auto\]{grid-template-columns:1fr 1fr 90px 90px auto!important}.grid-cols-\[1fr_150px_70px_auto\]{grid-template-columns:1fr 150px 70px auto!important}.grid-cols-\[120px_1fr\]{grid-template-columns:120px 1fr!important}.grid-cols-\[minmax\(0\,1fr\)_auto\]{grid-template-columns:minmax(0,1fr) auto!important}.flex-col{flex-direction:column!important}.flex-row{flex-direction:row!important}.flex-wrap{flex-wrap:wrap!important}.place-items-center{place-items:center!important}.items-baseline{align-items:baseline!important}.items-center{align-items:center!important}.items-end{align-items:flex-end!important}.items-start{align-items:flex-start!important}.justify-between{justify-content:space-between!important}.justify-center{justify-content:center!important}.justify-end{justify-content:flex-end!important}.gap-0\.5{gap:calc(var(--spacing) * .5)!important}.gap-1{gap:var(--spacing)!important}.gap-1\.5{gap:calc(var(--spacing) * 1.5)!important}.gap-2{gap:calc(var(--spacing) * 2)!important}.gap-2\.5{gap:calc(var(--spacing) * 2.5)!important}.gap-3{gap:calc(var(--spacing) * 3)!important}.gap-4{gap:calc(var(--spacing) * 4)!important}.gap-6{gap:calc(var(--spacing) * 6)!important}.gap-x-3{column-gap:calc(var(--spacing) * 3)!important}.gap-x-5{column-gap:calc(var(--spacing) * 5)!important}.gap-y-1{row-gap:var(--spacing)!important}.self-center{align-self:center!important}.self-end{align-self:flex-end!important}.truncate{text-overflow:ellipsis!important;white-space:nowrap!important;overflow:hidden!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-x-auto{overflow-x:auto!important}.overflow-y-auto{overflow-y:auto!important}.rounded{border-radius:.25rem!important}.rounded-full{border-radius:3.40282e38px!important}.rounded-lg{border-radius:var(--radius-lg)!important}.rounded-md{border-radius:var(--radius-md)!important}.rounded-xl{border-radius:var(--radius-xl)!important}.rounded-t-lg{border-top-left-radius:var(--radius-lg)!important;border-top-right-radius:var(--radius-lg)!important}.rounded-b-lg{border-bottom-right-radius:var(--radius-lg)!important;border-bottom-left-radius:var(--radius-lg)!important}.border{border-style:var(--tw-border-style)!important;border-width:1px!important}.border-2{border-style:var(--tw-border-style)!important;border-width:2px!important}.border-t{border-top-style:var(--tw-border-style)!important;border-top-width:1px!important}.border-t-0{border-top-style:var(--tw-border-style)!important;border-top-width:0!important}.border-b{border-bottom-style:var(--tw-border-style)!important;border-bottom-width:1px!important}.border-amber-200{border-color:var(--color-amber-200)!important}.border-amber-300{border-color:var(--color-amber-300)!important}.border-brand-500{border-color:var(--color-brand-500)!important}.border-red-200{border-color:var(--color-red-200)!important}.border-slate-100{border-color:var(--color-slate-100)!important}.border-slate-200{border-color:var(--color-slate-200)!important}.border-slate-300{border-color:var(--color-slate-300)!important}.border-white{border-color:var(--color-white)!important}.bg-amber-50{background-color:var(--color-amber-50)!important}.bg-amber-50\/40{background-color:#fffbeb66!important}@supports (color:color-mix(in lab, red, red)){.bg-amber-50\/40{background-color:color-mix(in oklab, var(--color-amber-50) 40%, transparent)!important}}.bg-brand-50{background-color:var(--color-brand-50)!important}.bg-brand-500{background-color:var(--color-brand-500)!important}.bg-red-50{background-color:var(--color-red-50)!important}.bg-slate-50{background-color:var(--color-slate-50)!important}.bg-slate-100{background-color:var(--color-slate-100)!important}.bg-slate-200{background-color:var(--color-slate-200)!important}.bg-slate-700{background-color:var(--color-slate-700)!important}.bg-transparent{background-color:#0000!important}.bg-white{background-color:var(--color-white)!important}.object-contain{object-fit:contain!important}.object-cover{object-fit:cover!important}.p-0\.5{padding:calc(var(--spacing) * .5)!important}.p-1{padding:var(--spacing)!important}.p-2{padding:calc(var(--spacing) * 2)!important}.p-3{padding:calc(var(--spacing) * 3)!important}.p-4{padding:calc(var(--spacing) * 4)!important}.p-5{padding:calc(var(--spacing) * 5)!important}.p-6{padding:calc(var(--spacing) * 6)!important}.px-1{padding-inline:var(--spacing)!important}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)!important}.px-2{padding-inline:calc(var(--spacing) * 2)!important}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)!important}.px-3{padding-inline:calc(var(--spacing) * 3)!important}.px-4{padding-inline:calc(var(--spacing) * 4)!important}.py-0\.5{padding-block:calc(var(--spacing) * .5)!important}.py-1{padding-block:var(--spacing)!important}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)!important}.py-2{padding-block:calc(var(--spacing) * 2)!important}.py-3{padding-block:calc(var(--spacing) * 3)!important}.py-8{padding-block:calc(var(--spacing) * 8)!important}.py-16{padding-block:calc(var(--spacing) * 16)!important}.pt-0{padding-top:0!important}.pt-1{padding-top:var(--spacing)!important}.pt-3{padding-top:calc(var(--spacing) * 3)!important}.pt-4{padding-top:calc(var(--spacing) * 4)!important}.pt-5{padding-top:calc(var(--spacing) * 5)!important}.pr-2{padding-right:calc(var(--spacing) * 2)!important}.pb-1{padding-bottom:var(--spacing)!important}.pb-2{padding-bottom:calc(var(--spacing) * 2)!important}.pl-1{padding-left:var(--spacing)!important}.pl-5{padding-left:calc(var(--spacing) * 5)!important}.text-center{text-align:center!important}.text-left{text-align:left!important}.text-right{text-align:right!important}.align-top{vertical-align:top!important}.font-mono{font-family:var(--font-mono)!important}.text-3xl{font-size:var(--text-3xl)!important;line-height:var(--tw-leading,var(--text-3xl--line-height))!important}.text-base{font-size:var(--text-base)!important;line-height:var(--tw-leading,var(--text-base--line-height))!important}.text-lg{font-size:var(--text-lg)!important;line-height:var(--tw-leading,var(--text-lg--line-height))!important}.text-sm{font-size:var(--text-sm)!important;line-height:var(--tw-leading,var(--text-sm--line-height))!important}.text-xl{font-size:var(--text-xl)!important;line-height:var(--tw-leading,var(--text-xl--line-height))!important}.text-xs{font-size:var(--text-xs)!important;line-height:var(--tw-leading,var(--text-xs--line-height))!important}.text-\[10px\]{font-size:10px!important}.text-\[11px\]{font-size:11px!important}.font-bold{--tw-font-weight:var(--font-weight-bold)!important;font-weight:var(--font-weight-bold)!important}.font-medium{--tw-font-weight:var(--font-weight-medium)!important;font-weight:var(--font-weight-medium)!important}.font-normal{--tw-font-weight:var(--font-weight-normal)!important;font-weight:var(--font-weight-normal)!important}.font-semibold{--tw-font-weight:var(--font-weight-semibold)!important;font-weight:var(--font-weight-semibold)!important}.tracking-wide{--tw-tracking:var(--tracking-wide)!important;letter-spacing:var(--tracking-wide)!important}.whitespace-nowrap{white-space:nowrap!important}.whitespace-pre-wrap{white-space:pre-wrap!important}.text-amber-600{color:var(--color-amber-600)!important}.text-amber-700{color:var(--color-amber-700)!important}.text-amber-800{color:var(--color-amber-800)!important}.text-amber-900{color:var(--color-amber-900)!important}.text-brand-700{color:var(--color-brand-700)!important}.text-brand-700\/70{color:#3730a3b3!important}@supports (color:color-mix(in lab, red, red)){.text-brand-700\/70{color:color-mix(in oklab, var(--color-brand-700) 70%, transparent)!important}}.text-emerald-700{color:var(--color-emerald-700)!important}.text-red-600{color:var(--color-red-600)!important}.text-red-700{color:var(--color-red-700)!important}.text-slate-400{color:var(--color-slate-400)!important}.text-slate-500{color:var(--color-slate-500)!important}.text-slate-600{color:var(--color-slate-600)!important}.text-slate-700{color:var(--color-slate-700)!important}.text-slate-800{color:var(--color-slate-800)!important}.text-slate-900{color:var(--color-slate-900)!important}.text-white{color:var(--color-white)!important}.uppercase{text-transform:uppercase!important}.italic{font-style:italic!important}.tabular-nums{--tw-numeric-spacing:tabular-nums!important;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)!important}.line-through{text-decoration-line:line-through!important}.underline{text-decoration-line:underline!important}.opacity-70{opacity:.7!important}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a)!important;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)!important}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a)!important;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)!important}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a)!important;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)!important}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor)!important;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)!important}.ring-brand-500{--tw-ring-color:var(--color-brand-500)!important}.outline{outline-style:var(--tw-outline-style)!important;outline-width:1px!important}.outline-2{outline-style:var(--tw-outline-style)!important;outline-width:2px!important}.outline-offset-4{outline-offset:4px!important}.outline-brand-500{outline-color:var(--color-brand-500)!important}.blur{--tw-blur:blur(8px)!important;filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)!important}.grayscale{--tw-grayscale:grayscale(100%)!important;filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)!important}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)!important}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events!important;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))!important;transition-duration:var(--tw-duration,var(--default-transition-duration))!important}.transition-\[filter\]{transition-property:filter!important;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))!important;transition-duration:var(--tw-duration,var(--default-transition-duration))!important}.ease-out{--tw-ease:var(--ease-out)!important;transition-timing-function:var(--ease-out)!important}.outline-dashed{--tw-outline-style:dashed!important;outline-style:dashed!important}.outline-none{--tw-outline-style:none!important;outline-style:none!important}@media (hover:hover){.group-hover\:opacity-80:is(:where(.group):hover *){opacity:.8!important}}.last\:border-0:last-child{border-style:var(--tw-border-style)!important;border-width:0!important}@media (hover:hover){.hover\:border-brand-500:hover{border-color:var(--color-brand-500)!important}.hover\:bg-slate-50:hover{background-color:var(--color-slate-50)!important}.hover\:bg-slate-100:hover{background-color:var(--color-slate-100)!important}.hover\:bg-slate-200:hover{background-color:var(--color-slate-200)!important}.hover\:text-slate-600:hover{color:var(--color-slate-600)!important}.hover\:text-slate-700:hover{color:var(--color-slate-700)!important}.hover\:text-slate-900:hover{color:var(--color-slate-900)!important}.hover\:underline:hover{text-decoration-line:underline!important}.hover\:brightness-95:hover{--tw-brightness:brightness(95%)!important;filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)!important}}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor)!important;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)!important}.focus\:ring-indigo-500:focus{--tw-ring-color:var(--color-indigo-500)!important}.focus\:outline-none:focus{--tw-outline-style:none!important;outline-style:none!important}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor)!important;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)!important}.focus-visible\:ring-brand-500:focus-visible{--tw-ring-color:var(--color-brand-500)!important}.focus-visible\:outline-2:focus-visible{outline-style:var(--tw-outline-style)!important;outline-width:2px!important}.focus-visible\:outline-offset-2:focus-visible{outline-offset:2px!important}.focus-visible\:outline-blue-600:focus-visible{outline-color:var(--color-blue-600)!important}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none!important;outline-style:none!important}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed!important}.disabled\:opacity-50:disabled{opacity:.5!important}.aria-\[current\=page\]\:bg-slate-200[aria-current=page]{background-color:var(--color-slate-200)!important}.aria-\[current\=page\]\:text-slate-900[aria-current=page]{color:var(--color-slate-900)!important}.data-\[state\=active\]\:border-b-2[data-state=active]{border-bottom-style:var(--tw-border-style)!important;border-bottom-width:2px!important}.data-\[state\=active\]\:border-brand-600[data-state=active]{border-color:var(--color-brand-600)!important}.data-\[state\=active\]\:bg-slate-100[data-state=active]{background-color:var(--color-slate-100)!important}.data-\[state\=active\]\:text-brand-700[data-state=active]{color:var(--color-brand-700)!important}.data-\[state\=active\]\:text-slate-900[data-state=active]{color:var(--color-slate-900)!important}.data-\[state\=active\]\:shadow-\[inset_2px_0_0_0_var\(--color-brand-500\)\][data-state=active]{--tw-shadow:inset 2px 0 0 0 var(--tw-shadow-color,var(--color-brand-500))!important;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)!important}@media (min-width:40rem){.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))!important}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))!important}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))!important}}@media (min-width:48rem){.md\:sticky{position:sticky!important}.md\:top-0{top:0!important}.md\:col-span-5{grid-column:span 5/span 5!important}.md\:block{display:block!important}.md\:flex{display:flex!important}.md\:grid{display:grid!important}.md\:h-screen{height:100vh!important}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))!important}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))!important}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))!important}.md\:grid-cols-\[1fr_1fr_140px_auto_auto\]{grid-template-columns:1fr 1fr 140px auto auto!important}.md\:grid-cols-\[1fr_110px\]{grid-template-columns:1fr 110px!important}.md\:grid-cols-\[1fr_130px_90px_110px_auto\]{grid-template-columns:1fr 130px 90px 110px auto!important}.md\:grid-cols-\[1fr_140px_1fr_150px\]{grid-template-columns:1fr 140px 1fr 150px!important}.md\:grid-cols-\[1fr_auto_1fr\]{grid-template-columns:1fr auto 1fr!important}.md\:grid-cols-\[248px_1fr\]{grid-template-columns:248px 1fr!important}.md\:grid-cols-\[260px_1fr\]{grid-template-columns:260px 1fr!important}.md\:grid-cols-\[280px_1fr\]{grid-template-columns:280px 1fr!important}.md\:grid-cols-\[300px_1fr\]{grid-template-columns:300px 1fr!important}.md\:grid-cols-\[340px_1fr\]{grid-template-columns:340px 1fr!important}.md\:flex-col{flex-direction:column!important}.md\:items-end{align-items:flex-end!important}.md\:overflow-visible{overflow:visible!important}.md\:border-r{border-right-style:var(--tw-border-style)!important;border-right-width:1px!important}.md\:border-b-0{border-bottom-style:var(--tw-border-style)!important;border-bottom-width:0!important}.md\:p-8{padding:calc(var(--spacing) * 8)!important}.md\:px-8{padding-inline:calc(var(--spacing) * 8)!important}}@media (min-width:64rem){.lg\:col-span-2{grid-column:span 2/span 2!important}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))!important}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))!important}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))!important}}}}.xicms-admin,.xicms-admin *,.xicms-admin :before,.xicms-admin :after{box-sizing:border-box}.xicms-admin{-webkit-font-smoothing:antialiased;--color-white:#fff;--color-slate-50:#faf9f6;--color-slate-100:#f3f1ec;--color-slate-200:#e5e2da;--color-slate-300:#d5d1c7;--color-slate-400:#a8a399;--color-slate-500:#6e6a62;--color-slate-600:#57534b;--color-slate-700:#403c36;--color-slate-900:#1b1a17;--color-brand:var(--xicms-primary,#4f46e5);--color-brand-500:var(--xicms-primary,#4f46e5);--color-brand-600:var(--xicms-primary,#4f46e5);--color-brand-700:var(--xicms-primary,#4f46e5);font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif;line-height:1.5}@supports (color:color-mix(in lab, red, red)){.xicms-admin{--color-brand-700:color-mix(in srgb, var(--xicms-primary,#4f46e5) 78%, #1b1a17)}}.xicms-admin{--color-brand-50:var(--xicms-primary,#4f46e5)}@supports (color:color-mix(in lab, red, red)){.xicms-admin{--color-brand-50:color-mix(in srgb, var(--xicms-primary,#4f46e5) 10%, #fff)}}.xicms-admin{--admin-canvas:#f6f5f2;--admin-sidebar:#f0eee9;--color-background-body:var(--color-white);--color-background-surface:var(--color-white);--color-background-card:var(--color-white);--color-background-muted:var(--color-slate-100);--color-text-primary:var(--color-slate-900);--color-text-secondary:var(--color-slate-500);--color-border:var(--color-slate-200);--color-accent:var(--color-brand-500);--color-on-accent:#fff;--color-error:#dc2626;color-scheme:light;color:var(--color-text-primary);background:var(--admin-canvas)}.xicms-admin h1,.xicms-admin h2,.xicms-admin h3,.xicms-admin p,.xicms-admin figure{margin:0}.xicms-admin button{font:inherit;cursor:pointer}.xicms-admin input,.xicms-admin textarea,.xicms-admin select{font:inherit;color:inherit}.xicms-admin .ProseMirror{outline:none;min-height:8rem}.xicms-admin .ProseMirror p{margin:0 0 .6rem}.xicms-admin .ProseMirror:focus{outline:none}@media (prefers-reduced-motion:reduce){.xicms-admin *,.xicms-admin :before,.xicms-admin :after,.xicms-ve *,.xicms-ve :before,.xicms-ve :after{transition-duration:.001ms!important;animation-duration:.001ms!important;animation-iteration-count:1!important}}.xicms-admin__midden,.xicms-admin__raster{min-height:100vh}.xicms-admin--ingebed .xicms-admin__midden{min-height:50vh}.xicms-admin--ingebed .xicms-admin__raster{min-height:60vh}.xicms-admin--ingebed .xicms-admin__lijst{flex:100%;min-width:0}.xicms-admin--ingebed{width:100vw;max-width:100vw;margin-left:calc(50% - 50vw);margin-right:calc(50% - 50vw)}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}
2
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-ease:initial}}}@layer theme{:root,:host{--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-200:oklch(88.5% .062 18.334);--color-red-600:oklch(57.7% .245 27.325);--color-red-700:oklch(50.5% .213 27.518);--color-red-800:oklch(44.4% .177 26.899);--color-amber-50:oklch(98.7% .022 95.277);--color-amber-200:oklch(92.4% .12 95.746);--color-amber-300:oklch(87.9% .169 91.605);--color-amber-600:oklch(66.6% .179 58.318);--color-amber-700:oklch(55.5% .163 48.998);--color-amber-800:oklch(47.3% .137 46.201);--color-amber-900:oklch(41.4% .112 45.904);--color-emerald-700:oklch(50.8% .118 165.612);--color-blue-600:oklch(54.6% .245 262.881);--color-indigo-500:oklch(58.5% .233 277.117);--color-slate-50:oklch(98.4% .003 247.858);--color-slate-100:oklch(96.8% .007 247.896);--color-slate-200:oklch(92.9% .013 255.508);--color-slate-300:oklch(86.9% .022 252.894);--color-slate-400:oklch(70.4% .04 256.788);--color-slate-500:oklch(55.4% .046 257.417);--color-slate-600:oklch(44.6% .043 257.281);--color-slate-700:oklch(37.2% .044 257.287);--color-slate-800:oklch(27.9% .041 260.031);--color-slate-900:oklch(20.8% .042 265.755);--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-3xl:48rem;--container-4xl:56rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wide:.025em;--leading-tight:1.25;--leading-snug:1.375;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--ease-out:cubic-bezier(0, 0, .2, 1);--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--color-brand:#4f46e5;--color-brand-50:#eef2ff;--color-brand-500:#4f46e5;--color-brand-600:#4f46e5;--color-brand-700:#3730a3}}@scope(.xicms-admin){@layer utilities{.pointer-events-none{pointer-events:none!important}.visible{visibility:visible!important}.sr-only{clip-path:inset(50%)!important;white-space:nowrap!important;border-width:0!important;width:1px!important;height:1px!important;margin:-1px!important;padding:0!important;position:absolute!important;overflow:hidden!important}.absolute{position:absolute!important}.fixed{position:fixed!important}.relative{position:relative!important}.static{position:static!important}.sticky{position:sticky!important}.inset-x-0{inset-inline:0!important}.inset-y-0{inset-block:0!important}.-top-0\.5{top:calc(var(--spacing) * -.5)!important}.-top-2{top:calc(var(--spacing) * -2)!important}.top-0{top:0!important}.top-1\.5{top:calc(var(--spacing) * 1.5)!important}.top-2{top:calc(var(--spacing) * 2)!important}.-right-2{right:calc(var(--spacing) * -2)!important}.right-0{right:0!important}.-bottom-2{bottom:calc(var(--spacing) * -2)!important}.bottom-0{bottom:0!important}.-left-2{left:calc(var(--spacing) * -2)!important}.left-0{left:0!important}.left-1\.5{left:calc(var(--spacing) * 1.5)!important}.left-1\/2{left:50%!important}.z-10{z-index:10!important}.col-span-2{grid-column:span 2/span 2!important}.col-span-full{grid-column:1/-1!important}.container{width:100%!important}@media (min-width:40rem){.container{max-width:40rem!important}}@media (min-width:48rem){.container{max-width:48rem!important}}@media (min-width:64rem){.container{max-width:64rem!important}}@media (min-width:80rem){.container{max-width:80rem!important}}@media (min-width:96rem){.container{max-width:96rem!important}}.-mx-1{margin-inline:calc(var(--spacing) * -1)!important}.-mx-4{margin-inline:calc(var(--spacing) * -4)!important}.-mt-1{margin-top:calc(var(--spacing) * -1)!important}.mt-0\.5{margin-top:calc(var(--spacing) * .5)!important}.mt-1{margin-top:var(--spacing)!important}.mt-2{margin-top:calc(var(--spacing) * 2)!important}.mt-3{margin-top:calc(var(--spacing) * 3)!important}.mt-4{margin-top:calc(var(--spacing) * 4)!important}.mt-5{margin-top:calc(var(--spacing) * 5)!important}.mt-6{margin-top:calc(var(--spacing) * 6)!important}.mt-auto{margin-top:auto!important}.mr-1{margin-right:var(--spacing)!important}.mr-2{margin-right:calc(var(--spacing) * 2)!important}.mr-auto{margin-right:auto!important}.mb-1{margin-bottom:var(--spacing)!important}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)!important}.mb-2{margin-bottom:calc(var(--spacing) * 2)!important}.mb-3{margin-bottom:calc(var(--spacing) * 3)!important}.mb-4{margin-bottom:calc(var(--spacing) * 4)!important}.ml-1{margin-left:var(--spacing)!important}.ml-1\.5{margin-left:calc(var(--spacing) * 1.5)!important}.ml-auto{margin-left:auto!important}.block{display:block!important}.contents{display:contents!important}.flex{display:flex!important}.grid{display:grid!important}.hidden{display:none!important}.inline{display:inline!important}.inline-block{display:inline-block!important}.inline-flex{display:inline-flex!important}.table{display:table!important}.\[field-sizing\:content\]{field-sizing:content!important}.aspect-square{aspect-ratio:1!important}.h-1\.5{height:calc(var(--spacing) * 1.5)!important}.h-2{height:calc(var(--spacing) * 2)!important}.h-4{height:calc(var(--spacing) * 4)!important}.h-5{height:calc(var(--spacing) * 5)!important}.h-6{height:calc(var(--spacing) * 6)!important}.h-7{height:calc(var(--spacing) * 7)!important}.h-8{height:calc(var(--spacing) * 8)!important}.h-9{height:calc(var(--spacing) * 9)!important}.h-10{height:calc(var(--spacing) * 10)!important}.h-11{height:calc(var(--spacing) * 11)!important}.h-12{height:calc(var(--spacing) * 12)!important}.h-14{height:calc(var(--spacing) * 14)!important}.h-16{height:calc(var(--spacing) * 16)!important}.h-24{height:calc(var(--spacing) * 24)!important}.h-28{height:calc(var(--spacing) * 28)!important}.h-\[70vh\]{height:70vh!important}.h-fit{height:fit-content!important}.h-full{height:100%!important}.max-h-\[55vh\]{max-height:55vh!important}.max-h-\[60vh\]{max-height:60vh!important}.min-h-\[8rem\]{min-height:8rem!important}.min-h-screen{min-height:100vh!important}.w-2{width:calc(var(--spacing) * 2)!important}.w-4{width:calc(var(--spacing) * 4)!important}.w-5{width:calc(var(--spacing) * 5)!important}.w-6{width:calc(var(--spacing) * 6)!important}.w-7{width:calc(var(--spacing) * 7)!important}.w-8{width:calc(var(--spacing) * 8)!important}.w-9{width:calc(var(--spacing) * 9)!important}.w-10{width:calc(var(--spacing) * 10)!important}.w-11{width:calc(var(--spacing) * 11)!important}.w-14{width:calc(var(--spacing) * 14)!important}.w-16{width:calc(var(--spacing) * 16)!important}.w-20{width:calc(var(--spacing) * 20)!important}.w-24{width:calc(var(--spacing) * 24)!important}.w-28{width:calc(var(--spacing) * 28)!important}.w-32{width:calc(var(--spacing) * 32)!important}.w-36{width:calc(var(--spacing) * 36)!important}.w-44{width:calc(var(--spacing) * 44)!important}.w-48{width:calc(var(--spacing) * 48)!important}.w-fit{width:fit-content!important}.w-full{width:100%!important}.max-w-3xl{max-width:var(--container-3xl)!important}.max-w-4xl{max-width:var(--container-4xl)!important}.max-w-40{max-width:calc(var(--spacing) * 40)!important}.max-w-48{max-width:calc(var(--spacing) * 48)!important}.max-w-md{max-width:var(--container-md)!important}.max-w-sm{max-width:var(--container-sm)!important}.max-w-xs{max-width:var(--container-xs)!important}.min-w-0{min-width:0!important}.min-w-8{min-width:calc(var(--spacing) * 8)!important}.min-w-9{min-width:calc(var(--spacing) * 9)!important}.min-w-48{min-width:calc(var(--spacing) * 48)!important}.flex-1{flex:1!important}.shrink-0{flex-shrink:0!important}.-translate-x-1\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1)!important;translate:var(--tw-translate-x) var(--tw-translate-y)!important}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1)!important;translate:var(--tw-translate-x) var(--tw-translate-y)!important}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)!important}.cursor-crosshair{cursor:crosshair!important}.cursor-default{cursor:default!important}.cursor-pointer{cursor:pointer!important}.resize{resize:both!important}.resize-none{resize:none!important}.scroll-mt-24{scroll-margin-top:calc(var(--spacing) * 24)!important}.list-\[circle\]{list-style-type:circle!important}.list-decimal{list-style-type:decimal!important}.list-disc{list-style-type:disc!important}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))!important}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))!important}.grid-cols-\[1fr_1\.4fr_auto\]{grid-template-columns:1fr 1.4fr auto!important}.grid-cols-\[1fr_1fr_90px_90px_auto\]{grid-template-columns:1fr 1fr 90px 90px auto!important}.grid-cols-\[1fr_150px_70px_auto\]{grid-template-columns:1fr 150px 70px auto!important}.grid-cols-\[1fr_auto\]{grid-template-columns:1fr auto!important}.grid-cols-\[120px_1fr\]{grid-template-columns:120px 1fr!important}.grid-cols-\[minmax\(0\,1fr\)\]{grid-template-columns:minmax(0,1fr)!important}.grid-cols-\[minmax\(0\,1fr\)_auto\]{grid-template-columns:minmax(0,1fr) auto!important}.flex-col{flex-direction:column!important}.flex-row{flex-direction:row!important}.flex-wrap{flex-wrap:wrap!important}.place-items-center{place-items:center!important}.content-start{align-content:flex-start!important}.items-baseline{align-items:baseline!important}.items-center{align-items:center!important}.items-end{align-items:flex-end!important}.items-start{align-items:flex-start!important}.justify-between{justify-content:space-between!important}.justify-center{justify-content:center!important}.justify-end{justify-content:flex-end!important}.justify-items-center{justify-items:center!important}.gap-0\.5{gap:calc(var(--spacing) * .5)!important}.gap-1{gap:var(--spacing)!important}.gap-1\.5{gap:calc(var(--spacing) * 1.5)!important}.gap-2{gap:calc(var(--spacing) * 2)!important}.gap-2\.5{gap:calc(var(--spacing) * 2.5)!important}.gap-3{gap:calc(var(--spacing) * 3)!important}.gap-4{gap:calc(var(--spacing) * 4)!important}.gap-6{gap:calc(var(--spacing) * 6)!important}.gap-x-3{column-gap:calc(var(--spacing) * 3)!important}.gap-x-5{column-gap:calc(var(--spacing) * 5)!important}.gap-y-1{row-gap:var(--spacing)!important}.self-center{align-self:center!important}.self-end{align-self:flex-end!important}.truncate{text-overflow:ellipsis!important;white-space:nowrap!important;overflow:hidden!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-x-auto{overflow-x:auto!important}.overflow-y-auto{overflow-y:auto!important}.rounded{border-radius:.25rem!important}.rounded-full{border-radius:3.40282e38px!important}.rounded-lg{border-radius:var(--radius-lg)!important}.rounded-md{border-radius:var(--radius-md)!important}.rounded-xl{border-radius:var(--radius-xl)!important}.rounded-t-lg{border-top-left-radius:var(--radius-lg)!important;border-top-right-radius:var(--radius-lg)!important}.rounded-b-lg{border-bottom-right-radius:var(--radius-lg)!important;border-bottom-left-radius:var(--radius-lg)!important}.border{border-style:var(--tw-border-style)!important;border-width:1px!important}.border-0{border-style:var(--tw-border-style)!important;border-width:0!important}.border-2{border-style:var(--tw-border-style)!important;border-width:2px!important}.border-t{border-top-style:var(--tw-border-style)!important;border-top-width:1px!important}.border-t-0{border-top-style:var(--tw-border-style)!important;border-top-width:0!important}.border-b{border-bottom-style:var(--tw-border-style)!important;border-bottom-width:1px!important}.border-dashed{--tw-border-style:dashed!important;border-style:dashed!important}.border-amber-200{border-color:var(--color-amber-200)!important}.border-amber-300{border-color:var(--color-amber-300)!important}.border-brand-500{border-color:var(--color-brand-500)!important}.border-brand-500\/40{border-color:#4f46e566!important}@supports (color:color-mix(in lab, red, red)){.border-brand-500\/40{border-color:color-mix(in oklab, var(--color-brand-500) 40%, transparent)!important}}.border-red-200{border-color:var(--color-red-200)!important}.border-slate-100{border-color:var(--color-slate-100)!important}.border-slate-200{border-color:var(--color-slate-200)!important}.border-slate-300{border-color:var(--color-slate-300)!important}.border-white{border-color:var(--color-white)!important}.bg-amber-50{background-color:var(--color-amber-50)!important}.bg-amber-50\/40{background-color:#fffbeb66!important}@supports (color:color-mix(in lab, red, red)){.bg-amber-50\/40{background-color:color-mix(in oklab, var(--color-amber-50) 40%, transparent)!important}}.bg-brand-50{background-color:var(--color-brand-50)!important}.bg-brand-500{background-color:var(--color-brand-500)!important}.bg-red-50{background-color:var(--color-red-50)!important}.bg-slate-50{background-color:var(--color-slate-50)!important}.bg-slate-100{background-color:var(--color-slate-100)!important}.bg-slate-200{background-color:var(--color-slate-200)!important}.bg-slate-700{background-color:var(--color-slate-700)!important}.bg-transparent{background-color:#0000!important}.bg-white{background-color:var(--color-white)!important}.bg-white\/90{background-color:#ffffffe6!important}@supports (color:color-mix(in lab, red, red)){.bg-white\/90{background-color:color-mix(in oklab, var(--color-white) 90%, transparent)!important}}.object-contain{object-fit:contain!important}.object-cover{object-fit:cover!important}.p-0{padding:0!important}.p-0\.5{padding:calc(var(--spacing) * .5)!important}.p-1{padding:var(--spacing)!important}.p-2{padding:calc(var(--spacing) * 2)!important}.p-2\.5{padding:calc(var(--spacing) * 2.5)!important}.p-3{padding:calc(var(--spacing) * 3)!important}.p-4{padding:calc(var(--spacing) * 4)!important}.p-5{padding:calc(var(--spacing) * 5)!important}.p-6{padding:calc(var(--spacing) * 6)!important}.px-1{padding-inline:var(--spacing)!important}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)!important}.px-2{padding-inline:calc(var(--spacing) * 2)!important}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)!important}.px-3{padding-inline:calc(var(--spacing) * 3)!important}.px-4{padding-inline:calc(var(--spacing) * 4)!important}.py-0\.5{padding-block:calc(var(--spacing) * .5)!important}.py-1{padding-block:var(--spacing)!important}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)!important}.py-2{padding-block:calc(var(--spacing) * 2)!important}.py-3{padding-block:calc(var(--spacing) * 3)!important}.py-6{padding-block:calc(var(--spacing) * 6)!important}.py-8{padding-block:calc(var(--spacing) * 8)!important}.py-16{padding-block:calc(var(--spacing) * 16)!important}.pt-0{padding-top:0!important}.pt-1{padding-top:var(--spacing)!important}.pt-3{padding-top:calc(var(--spacing) * 3)!important}.pt-4{padding-top:calc(var(--spacing) * 4)!important}.pt-5{padding-top:calc(var(--spacing) * 5)!important}.pr-1{padding-right:var(--spacing)!important}.pr-2{padding-right:calc(var(--spacing) * 2)!important}.pb-1{padding-bottom:var(--spacing)!important}.pb-2{padding-bottom:calc(var(--spacing) * 2)!important}.pl-1{padding-left:var(--spacing)!important}.pl-4{padding-left:calc(var(--spacing) * 4)!important}.pl-5{padding-left:calc(var(--spacing) * 5)!important}.pl-8{padding-left:calc(var(--spacing) * 8)!important}.text-center{text-align:center!important}.text-left{text-align:left!important}.text-right{text-align:right!important}.align-top{vertical-align:top!important}.font-mono{font-family:var(--font-mono)!important}.text-2xl{font-size:var(--text-2xl)!important;line-height:var(--tw-leading,var(--text-2xl--line-height))!important}.text-3xl{font-size:var(--text-3xl)!important;line-height:var(--tw-leading,var(--text-3xl--line-height))!important}.text-base{font-size:var(--text-base)!important;line-height:var(--tw-leading,var(--text-base--line-height))!important}.text-lg{font-size:var(--text-lg)!important;line-height:var(--tw-leading,var(--text-lg--line-height))!important}.text-sm{font-size:var(--text-sm)!important;line-height:var(--tw-leading,var(--text-sm--line-height))!important}.text-xl{font-size:var(--text-xl)!important;line-height:var(--tw-leading,var(--text-xl--line-height))!important}.text-xs{font-size:var(--text-xs)!important;line-height:var(--tw-leading,var(--text-xs--line-height))!important}.text-\[10px\]{font-size:10px!important}.text-\[11px\]{font-size:11px!important}.leading-none{--tw-leading:1!important;line-height:1!important}.leading-snug{--tw-leading:var(--leading-snug)!important;line-height:var(--leading-snug)!important}.leading-tight{--tw-leading:var(--leading-tight)!important;line-height:var(--leading-tight)!important}.font-bold{--tw-font-weight:var(--font-weight-bold)!important;font-weight:var(--font-weight-bold)!important}.font-medium{--tw-font-weight:var(--font-weight-medium)!important;font-weight:var(--font-weight-medium)!important}.font-normal{--tw-font-weight:var(--font-weight-normal)!important;font-weight:var(--font-weight-normal)!important}.font-semibold{--tw-font-weight:var(--font-weight-semibold)!important;font-weight:var(--font-weight-semibold)!important}.tracking-tight{--tw-tracking:var(--tracking-tight)!important;letter-spacing:var(--tracking-tight)!important}.tracking-wide{--tw-tracking:var(--tracking-wide)!important;letter-spacing:var(--tracking-wide)!important}.whitespace-nowrap{white-space:nowrap!important}.whitespace-pre-wrap{white-space:pre-wrap!important}.text-amber-600{color:var(--color-amber-600)!important}.text-amber-700{color:var(--color-amber-700)!important}.text-amber-800{color:var(--color-amber-800)!important}.text-amber-900{color:var(--color-amber-900)!important}.text-brand-700{color:var(--color-brand-700)!important}.text-brand-700\/70{color:#3730a3b3!important}@supports (color:color-mix(in lab, red, red)){.text-brand-700\/70{color:color-mix(in oklab, var(--color-brand-700) 70%, transparent)!important}}.text-emerald-700{color:var(--color-emerald-700)!important}.text-red-600{color:var(--color-red-600)!important}.text-red-700{color:var(--color-red-700)!important}.text-red-800{color:var(--color-red-800)!important}.text-slate-400{color:var(--color-slate-400)!important}.text-slate-500{color:var(--color-slate-500)!important}.text-slate-600{color:var(--color-slate-600)!important}.text-slate-700{color:var(--color-slate-700)!important}.text-slate-800{color:var(--color-slate-800)!important}.text-slate-900{color:var(--color-slate-900)!important}.text-white{color:var(--color-white)!important}.uppercase{text-transform:uppercase!important}.italic{font-style:italic!important}.tabular-nums{--tw-numeric-spacing:tabular-nums!important;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)!important}.line-through{text-decoration-line:line-through!important}.underline{text-decoration-line:underline!important}.accent-brand-600{accent-color:var(--color-brand-600)!important}.opacity-70{opacity:.7!important}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a)!important;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)!important}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a)!important;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)!important}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a)!important;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)!important}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor)!important;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)!important}.ring-brand-500{--tw-ring-color:var(--color-brand-500)!important}.outline{outline-style:var(--tw-outline-style)!important;outline-width:1px!important}.outline-2{outline-style:var(--tw-outline-style)!important;outline-width:2px!important}.outline-offset-4{outline-offset:4px!important}.outline-brand-500{outline-color:var(--color-brand-500)!important}.blur{--tw-blur:blur(8px)!important;filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)!important}.grayscale{--tw-grayscale:grayscale(100%)!important;filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)!important}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)!important}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events!important;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))!important;transition-duration:var(--tw-duration,var(--default-transition-duration))!important}.transition-\[filter\]{transition-property:filter!important;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function))!important;transition-duration:var(--tw-duration,var(--default-transition-duration))!important}.ease-out{--tw-ease:var(--ease-out)!important;transition-timing-function:var(--ease-out)!important}.outline-dashed{--tw-outline-style:dashed!important;outline-style:dashed!important}.outline-none{--tw-outline-style:none!important;outline-style:none!important}.select-none{-webkit-user-select:none!important;user-select:none!important}@media (hover:hover){.group-hover\:opacity-80:is(:where(.group):hover *){opacity:.8!important}}.placeholder\:text-slate-400::placeholder{color:var(--color-slate-400)!important}.last\:border-0:last-child{border-style:var(--tw-border-style)!important;border-width:0!important}@media (hover:hover){.hover\:border-brand-500:hover{border-color:var(--color-brand-500)!important}.hover\:border-slate-400:hover{border-color:var(--color-slate-400)!important}.hover\:bg-slate-50:hover{background-color:var(--color-slate-50)!important}.hover\:bg-slate-100:hover{background-color:var(--color-slate-100)!important}.hover\:bg-slate-200:hover{background-color:var(--color-slate-200)!important}.hover\:text-slate-600:hover{color:var(--color-slate-600)!important}.hover\:text-slate-700:hover{color:var(--color-slate-700)!important}.hover\:text-slate-900:hover{color:var(--color-slate-900)!important}.hover\:underline:hover{text-decoration-line:underline!important}.hover\:brightness-95:hover{--tw-brightness:brightness(95%)!important;filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)!important}}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor)!important;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)!important}.focus\:ring-indigo-500:focus{--tw-ring-color:var(--color-indigo-500)!important}.focus\:outline-none:focus{--tw-outline-style:none!important;outline-style:none!important}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor)!important;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)!important}.focus-visible\:ring-brand-500:focus-visible{--tw-ring-color:var(--color-brand-500)!important}.focus-visible\:outline-2:focus-visible{outline-style:var(--tw-outline-style)!important;outline-width:2px!important}.focus-visible\:outline-offset-2:focus-visible{outline-offset:2px!important}.focus-visible\:outline-blue-600:focus-visible{outline-color:var(--color-blue-600)!important}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none!important;outline-style:none!important}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed!important}.disabled\:opacity-50:disabled{opacity:.5!important}.disabled\:opacity-80:disabled{opacity:.8!important}.aria-\[checked\=true\]\:border-slate-900[aria-checked=true]{border-color:var(--color-slate-900)!important}.aria-\[checked\=true\]\:border-transparent[aria-checked=true]{border-color:#0000!important}.aria-\[checked\=true\]\:bg-slate-900[aria-checked=true]{background-color:var(--color-slate-900)!important}.aria-\[checked\=true\]\:text-white[aria-checked=true]{color:var(--color-white)!important}.aria-\[current\=page\]\:bg-slate-200[aria-current=page]{background-color:var(--color-slate-200)!important}.aria-\[current\=page\]\:text-slate-900[aria-current=page]{color:var(--color-slate-900)!important}.aria-\[pressed\=true\]\:ring-2[aria-pressed=true]{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor)!important;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)!important}.aria-\[pressed\=true\]\:ring-slate-900[aria-pressed=true]{--tw-ring-color:var(--color-slate-900)!important}.aria-\[selected\=true\]\:bg-white[aria-selected=true]{background-color:var(--color-white)!important}.aria-\[selected\=true\]\:text-slate-900[aria-selected=true]{color:var(--color-slate-900)!important}.aria-\[selected\=true\]\:shadow-sm[aria-selected=true]{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a)!important;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)!important}.data-\[state\=active\]\:border-b-2[data-state=active]{border-bottom-style:var(--tw-border-style)!important;border-bottom-width:2px!important}.data-\[state\=active\]\:border-brand-600[data-state=active]{border-color:var(--color-brand-600)!important}.data-\[state\=active\]\:bg-white[data-state=active]{background-color:var(--color-white)!important}.data-\[state\=active\]\:text-brand-700[data-state=active]{color:var(--color-brand-700)!important}.data-\[state\=active\]\:text-slate-900[data-state=active]{color:var(--color-slate-900)!important}.data-\[state\=active\]\:shadow-\[inset_2px_0_0_0_var\(--color-brand-500\)\,0_1px_2px_rgba\(27\,26\,23\,0\.08\)\][data-state=active]{--tw-shadow:inset 2px 0 0 0 var(--tw-shadow-color,var(--color-brand-500)), 0 1px 2px var(--tw-shadow-color,#1b1a1714)!important;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)!important}@media (min-width:40rem){.sm\:block{display:block!important}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))!important}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))!important}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))!important}}@media (min-width:48rem){.md\:sticky{position:sticky!important}.md\:top-0{top:0!important}.md\:col-span-3{grid-column:span 3/span 3!important}.md\:col-span-4{grid-column:span 4/span 4!important}.md\:block{display:block!important}.md\:grid{display:grid!important}.md\:h-screen{height:100vh!important}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))!important}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))!important}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))!important}.md\:grid-cols-\[1fr_110px\]{grid-template-columns:1fr 110px!important}.md\:grid-cols-\[1fr_130px_90px_110px_auto\]{grid-template-columns:1fr 130px 90px 110px auto!important}.md\:grid-cols-\[1fr_140px_1fr_150px\]{grid-template-columns:1fr 140px 1fr 150px!important}.md\:grid-cols-\[1fr_160px_auto_auto\]{grid-template-columns:1fr 160px auto auto!important}.md\:grid-cols-\[1fr_auto_1fr\]{grid-template-columns:1fr auto 1fr!important}.md\:grid-cols-\[2fr_1fr_1\.5fr\]{grid-template-columns:2fr 1fr 1.5fr!important}.md\:grid-cols-\[248px_1fr\]{grid-template-columns:248px 1fr!important}.md\:grid-cols-\[260px_1fr\]{grid-template-columns:260px 1fr!important}.md\:grid-cols-\[280px_1fr\]{grid-template-columns:280px 1fr!important}.md\:grid-cols-\[300px_1fr\]{grid-template-columns:300px 1fr!important}.md\:grid-cols-\[340px_1fr\]{grid-template-columns:340px 1fr!important}.md\:grid-cols-\[auto_auto_1fr_1fr\]{grid-template-columns:auto auto 1fr 1fr!important}.md\:flex-col{flex-direction:column!important}.md\:items-end{align-items:flex-end!important}.md\:items-stretch{align-items:stretch!important}.md\:overflow-visible{overflow:visible!important}.md\:border-r{border-right-style:var(--tw-border-style)!important;border-right-width:1px!important}.md\:border-b-0{border-bottom-style:var(--tw-border-style)!important;border-bottom-width:0!important}.md\:p-8{padding:calc(var(--spacing) * 8)!important}.md\:px-8{padding-inline:calc(var(--spacing) * 8)!important}}@media (min-width:64rem){.lg\:col-span-2{grid-column:span 2/span 2!important}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))!important}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))!important}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))!important}.lg\:grid-cols-\[minmax\(0\,1fr\)_300px\]{grid-template-columns:minmax(0,1fr) 300px!important}}}}.xicms-admin,.xicms-admin *,.xicms-admin :before,.xicms-admin :after{box-sizing:border-box}.xicms-admin{-webkit-font-smoothing:antialiased;--color-white:#fff;--color-slate-50:#faf9f6;--color-slate-100:#f3f1ec;--color-slate-200:#e5e2da;--color-slate-300:#d5d1c7;--color-slate-400:#a8a399;--color-slate-500:#6e6a62;--color-slate-600:#57534b;--color-slate-700:#403c36;--color-slate-800:#2b2925;--color-slate-900:#1b1a17;--color-slate-950:#12110f;--color-brand:var(--xicms-primary,#4f46e5);--color-brand-500:var(--xicms-primary,#4f46e5);--color-brand-600:var(--xicms-primary,#4f46e5);--color-brand-700:var(--xicms-primary,#4f46e5);font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif;line-height:1.5}@supports (color:color-mix(in lab, red, red)){.xicms-admin{--color-brand-700:color-mix(in srgb, var(--xicms-primary,#4f46e5) 78%, #1b1a17)}}.xicms-admin{--color-brand-50:var(--xicms-primary,#4f46e5)}@supports (color:color-mix(in lab, red, red)){.xicms-admin{--color-brand-50:color-mix(in srgb, var(--xicms-primary,#4f46e5) 10%, #fff)}}.xicms-admin{--admin-canvas:#f6f5f2;--admin-sidebar:#f0eee9;--color-background-body:var(--color-white);--color-background-surface:var(--color-white);--color-background-card:var(--color-white);--color-background-muted:var(--color-slate-100);--color-text-primary:var(--color-slate-900);--color-text-secondary:var(--color-slate-500);--color-border:var(--color-slate-200);--color-accent:var(--color-brand-500);--color-on-accent:var(--xicms-on-primary,#fff);--color-error:#dc2626;color-scheme:light;color:var(--color-text-primary);background:var(--admin-canvas)}.xicms-admin h1,.xicms-admin h2,.xicms-admin h3,.xicms-admin p,.xicms-admin figure{margin:0}.xicms-admin button{font:inherit;cursor:pointer}.xicms-admin input,.xicms-admin textarea,.xicms-admin select{font:inherit;color:inherit}.xicms-admin .ProseMirror{outline:none;min-height:8rem}.xicms-admin .ProseMirror p{margin:0 0 .6rem}.xicms-admin .ProseMirror:focus{outline:none}.xicms-admin .ProseMirror table{border-collapse:collapse;table-layout:fixed;width:100%;margin:0 0 .6rem}.xicms-admin .ProseMirror th,.xicms-admin .ProseMirror td{vertical-align:top;border:1px solid #cbd5e1;min-width:3rem;padding:.35rem .5rem}.xicms-admin .ProseMirror th{text-align:left;background:#f1f5f9;font-weight:600}.xicms-admin .ProseMirror th p,.xicms-admin .ProseMirror td p{margin:0}.xicms-admin .ProseMirror .selectedCell{background:var(--color-accent,#4f46e5)}@supports (color:color-mix(in lab, red, red)){.xicms-admin .ProseMirror .selectedCell{background:color-mix(in srgb, var(--color-accent,#4f46e5) 12%, transparent)}}.xicms-admin .xicms-admin-btn:focus-visible,.xicms-admin .xicms-admin-native:focus-visible{outline:2px solid var(--color-accent,#4f46e5);outline-offset:2px}.xicms-admin .xicms-richtext-editor:focus{box-shadow:0 0 0 2px var(--color-accent,#4f46e5)}@media (prefers-reduced-motion:reduce){.xicms-admin *,.xicms-admin :before,.xicms-admin :after,.xicms-ve *,.xicms-ve :before,.xicms-ve :after{transition-duration:.001ms!important;animation-duration:.001ms!important;animation-iteration-count:1!important}}.xicms-admin__midden,.xicms-admin__raster{min-height:100vh}.xicms-admin--ingebed .xicms-admin__midden{min-height:50vh}.xicms-admin--ingebed .xicms-admin__raster{min-height:60vh}.xicms-admin--ingebed .xicms-admin__lijst{flex:100%;min-width:0}.xicms-admin--ingebed{width:100vw;max-width:100vw;margin-left:calc(50% - 50vw);margin-right:calc(50% - 50vw)}.xicms-slash{z-index:10020;color:#0f172a;background:#fff;border:1px solid #e2e8f0;border-radius:10px;width:270px;max-height:320px;padding:4px;font:400 14px/1.35 system-ui,-apple-system,Segoe UI,sans-serif;position:fixed;overflow-y:auto;box-shadow:0 12px 32px #0f172a29}.xicms-slash__item{text-align:left;cursor:pointer;width:100%;color:inherit;font:inherit;background:0 0;border:0;border-radius:7px;align-items:center;gap:10px;padding:6px 8px;display:flex}.xicms-slash__item[aria-selected=true]{background:#f1f5f9}.xicms-slash__icoon{background:#fff;border:1px solid #e2e8f0;border-radius:6px;flex-shrink:0;place-items:center;width:30px;height:30px;font-size:12px;font-weight:600;display:grid}.xicms-slash__titel{font-weight:500;display:block}.xicms-slash__uitleg{color:#64748b;font-size:12px;display:block}.xicms-slash__leeg{color:#64748b;margin:0;padding:8px;font-size:13px}.xicms-bubbel{z-index:10020;background:#0f172a;border-radius:9px;gap:2px;padding:3px;display:flex;box-shadow:0 8px 24px #0f172a40}.xicms-bubbel button{color:#fff;cursor:pointer;background:0 0;border:0;border-radius:6px;min-width:30px;height:30px;padding:0 8px;font:600 13px/1 system-ui,-apple-system,Segoe UI,sans-serif}.xicms-bubbel button:hover,.xicms-bubbel button[aria-pressed=true]{background:#ffffff29}.xicms-bubbel button:focus-visible{outline-offset:1px;outline:2px solid #fff}.xicms-admin .xicms-admin-spinner{border:2px solid;border-right-color:#0000;border-radius:999px;width:.95em;height:.95em;animation:.7s linear infinite xicms-admin-draai}@keyframes xicms-admin-draai{to{transform:rotate(360deg)}}@media (prefers-reduced-motion:reduce){.xicms-admin .xicms-admin-spinner{animation-duration:2s}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}
@@ -0,0 +1,36 @@
1
+ import type { Business, BusinessException } from "../schema/business.js";
2
+ import { type HoursRow } from "../blocks/builtins/lib/openingHours.js";
3
+ /**
4
+ * Pure hulpjes rond het bedrijfsprofiel (8.13). Geen React, geen Firestore — zodat de server
5
+ * (JSON-LD), de blokken (contact, openingstijden) en de tests dezelfde regels gebruiken.
6
+ */
7
+ /** "2026-12-25" voor een Date, in lokale tijd (niet UTC: om 00:30 is het in NL al de volgende dag). */
8
+ export declare function isoDatum(d: Date): string;
9
+ /** De afwijking die op deze dag geldt (een losse dag of een periode), of undefined. */
10
+ export declare function afwijkingOp(datum: Date, afwijkingen: BusinessException[] | undefined): BusinessException | undefined;
11
+ /** Afwijkingen die vandaag of binnen `dagen` beginnen, of nu lopen — gesorteerd. */
12
+ export declare function komendeAfwijkingen(afwijkingen: BusinessException[] | undefined, nu?: Date, dagen?: number): BusinessException[];
13
+ /** "do 25 december" of "25 december – 2 januari". */
14
+ export declare function afwijkingDatumTekst(a: BusinessException): string;
15
+ /**
16
+ * Nu open, met de afwijkingen erbij: op een gesloten feestdag is het "gesloten", ook al zegt het
17
+ * gewone rooster "maandag 09:00 – 17:00". null = niet te bepalen.
18
+ */
19
+ export declare function isOpenNuMetAfwijkingen(rijen: HoursRow[], afwijkingen: BusinessException[] | undefined, nu?: Date): boolean | null;
20
+ /** Adres als regels: ["Tuinderslaan 12", "3991 AB Houten"]. */
21
+ export declare function adresRegels(b: Business | undefined): string[];
22
+ /** Een tel:-link van een telefoonnummer zoals de klant het typt ("030 – 123 45 67"). */
23
+ export declare function telLink(nummer: string | undefined): string | undefined;
24
+ /** Route plannen naar het adres (Google Maps werkt op elk toestel, ook zonder app). */
25
+ export declare function routeLink(b: Business | undefined): string | undefined;
26
+ /** Heeft het profiel genoeg om iets mee te doen? */
27
+ export declare function heeftProfiel(b: Business | undefined): boolean;
28
+ /**
29
+ * LocalBusiness-JSON-LD uit het profiel, of null als er (nog) niets in staat. Zelfde `@id` als de
30
+ * contact- en openingstijdenblokken (`#business`), zodat Google alles samenvoegt tot één bedrijf.
31
+ */
32
+ export declare function bedrijfJsonLd(b: Business | undefined, site: {
33
+ name?: string;
34
+ domain?: string;
35
+ logo?: string;
36
+ }): Record<string, unknown> | null;
@@ -0,0 +1,110 @@
1
+ import { isOpenNow, openingHoursSpecJsonLd, parseTimeRange } from "../blocks/builtins/lib/openingHours.js";
2
+ function isoDatum(d) {
3
+ return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, "0")}-${String(d.getDate()).padStart(2, "0")}`;
4
+ }
5
+ function afwijkingOp(datum, afwijkingen) {
6
+ const dag = isoDatum(datum);
7
+ return (afwijkingen ?? []).find((a) => a.until ? a.date <= dag && dag <= a.until : a.date === dag);
8
+ }
9
+ function komendeAfwijkingen(afwijkingen, nu = /* @__PURE__ */ new Date(), dagen = 21) {
10
+ const van = isoDatum(nu);
11
+ const grens = new Date(nu);
12
+ grens.setDate(grens.getDate() + dagen);
13
+ const tot = isoDatum(grens);
14
+ return (afwijkingen ?? []).filter((a) => (a.until ?? a.date) >= van && a.date <= tot).sort((a, b) => a.date.localeCompare(b.date));
15
+ }
16
+ function afwijkingDatumTekst(a) {
17
+ const fmt = (iso, metDag) => {
18
+ const [j, m, d] = iso.split("-").map(Number);
19
+ const datum = new Date(j, m - 1, d);
20
+ return datum.toLocaleDateString("nl-NL", metDag ? { weekday: "short", day: "numeric", month: "long" } : { day: "numeric", month: "long" });
21
+ };
22
+ return a.until && a.until !== a.date ? `${fmt(a.date, false)} \u2013 ${fmt(a.until, false)}` : fmt(a.date, true);
23
+ }
24
+ function isOpenNuMetAfwijkingen(rijen, afwijkingen, nu = /* @__PURE__ */ new Date()) {
25
+ const a = afwijkingOp(nu, afwijkingen);
26
+ if (a) {
27
+ const bereik = parseTimeRange(a.hours);
28
+ if (!bereik) return /gesloten/i.test(a.hours) ? false : isOpenNow(rijen, nu);
29
+ const min = nu.getHours() * 60 + nu.getMinutes();
30
+ return min >= bereik.open && min < bereik.close;
31
+ }
32
+ return isOpenNow(rijen, nu);
33
+ }
34
+ function adresRegels(b) {
35
+ const a = b?.address;
36
+ if (!a) return [];
37
+ const regel2 = [a.postalCode, a.city].filter(Boolean).join(" ");
38
+ return [a.street, regel2, a.country && a.country.toLowerCase() !== "nederland" ? a.country : void 0].filter((x) => Boolean(x?.trim()));
39
+ }
40
+ function telLink(nummer) {
41
+ if (!nummer?.trim()) return void 0;
42
+ const kaal = nummer.replace(/[^\d+]/g, "");
43
+ return kaal ? `tel:${kaal.startsWith("0") && !kaal.startsWith("00") ? `+31${kaal.slice(1)}` : kaal}` : void 0;
44
+ }
45
+ function routeLink(b) {
46
+ if (b?.geo) return `https://www.google.com/maps/dir/?api=1&destination=${b.geo.lat},${b.geo.lng}`;
47
+ const regels = adresRegels(b);
48
+ return regels.length ? `https://www.google.com/maps/dir/?api=1&destination=${encodeURIComponent(regels.join(", "))}` : void 0;
49
+ }
50
+ function heeftProfiel(b) {
51
+ return Boolean(b && (b.phone || b.email || b.address?.street || b.address?.city || (b.hours?.length ?? 0) > 0));
52
+ }
53
+ function bedrijfJsonLd(b, site) {
54
+ if (!heeftProfiel(b) || !b) return null;
55
+ const base = site.domain ? `https://${site.domain.replace(/^https?:\/\//, "").replace(/\/+$/, "")}` : void 0;
56
+ const out = {
57
+ "@context": "https://schema.org",
58
+ "@type": b.type || "LocalBusiness",
59
+ "@id": "#business",
60
+ name: b.name || site.name
61
+ };
62
+ if (b.description) out.description = b.description;
63
+ if (base) out.url = base;
64
+ if (site.logo) out.image = site.logo;
65
+ if (b.phone) out.telephone = b.phone;
66
+ if (b.email) out.email = b.email;
67
+ if (b.priceRange) out.priceRange = b.priceRange;
68
+ const a = b.address;
69
+ if (a && (a.street || a.city || a.postalCode)) {
70
+ out.address = {
71
+ "@type": "PostalAddress",
72
+ ...a.street ? { streetAddress: a.street } : {},
73
+ ...a.postalCode ? { postalCode: a.postalCode } : {},
74
+ ...a.city ? { addressLocality: a.city } : {},
75
+ addressCountry: a.country?.trim() || "NL"
76
+ };
77
+ }
78
+ if (b.geo) out.geo = { "@type": "GeoCoordinates", latitude: b.geo.lat, longitude: b.geo.lng };
79
+ const spec = openingHoursSpecJsonLd(b.hours ?? []);
80
+ if (spec.length) out.openingHoursSpecification = spec;
81
+ const vandaag = isoDatum(/* @__PURE__ */ new Date());
82
+ const speciaal = (b.exceptions ?? []).filter((x) => (x.until ?? x.date) >= vandaag).map((x) => {
83
+ const bereik = parseTimeRange(x.hours);
84
+ const fmt = (m) => `${String(Math.floor(m / 60) % 24).padStart(2, "0")}:${String(m % 60).padStart(2, "0")}`;
85
+ return {
86
+ "@type": "OpeningHoursSpecification",
87
+ validFrom: x.date,
88
+ validThrough: x.until ?? x.date,
89
+ opens: bereik ? fmt(bereik.open) : "00:00",
90
+ closes: bereik ? fmt(bereik.close) : "00:00"
91
+ };
92
+ });
93
+ if (speciaal.length) out.specialOpeningHoursSpecification = speciaal;
94
+ const sameAs = (b.sameAs ?? []).filter((u) => /^https?:\/\//.test(u));
95
+ if (sameAs.length) out.sameAs = sameAs;
96
+ return out;
97
+ }
98
+ export {
99
+ adresRegels,
100
+ afwijkingDatumTekst,
101
+ afwijkingOp,
102
+ bedrijfJsonLd,
103
+ heeftProfiel,
104
+ isOpenNuMetAfwijkingen,
105
+ isoDatum,
106
+ komendeAfwijkingen,
107
+ routeLink,
108
+ telLink
109
+ };
110
+ //# sourceMappingURL=bedrijf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/bedrijf/bedrijf.ts"],"sourcesContent":["import type { Business, BusinessException } from \"../schema/business\";\nimport { isOpenNow, openingHoursSpecJsonLd, parseTimeRange, type HoursRow } from \"../blocks/builtins/lib/openingHours\";\n\n/**\n * Pure hulpjes rond het bedrijfsprofiel (8.13). Geen React, geen Firestore — zodat de server\n * (JSON-LD), de blokken (contact, openingstijden) en de tests dezelfde regels gebruiken.\n */\n\n/** \"2026-12-25\" voor een Date, in lokale tijd (niet UTC: om 00:30 is het in NL al de volgende dag). */\nexport function isoDatum(d: Date): string {\n return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, \"0\")}-${String(d.getDate()).padStart(2, \"0\")}`;\n}\n\n/** De afwijking die op deze dag geldt (een losse dag of een periode), of undefined. */\nexport function afwijkingOp(datum: Date, afwijkingen: BusinessException[] | undefined): BusinessException | undefined {\n const dag = isoDatum(datum);\n return (afwijkingen ?? []).find((a) => (a.until ? a.date <= dag && dag <= a.until : a.date === dag));\n}\n\n/** Afwijkingen die vandaag of binnen `dagen` beginnen, of nu lopen — gesorteerd. */\nexport function komendeAfwijkingen(afwijkingen: BusinessException[] | undefined, nu = new Date(), dagen = 21): BusinessException[] {\n const van = isoDatum(nu);\n const grens = new Date(nu);\n grens.setDate(grens.getDate() + dagen);\n const tot = isoDatum(grens);\n return (afwijkingen ?? [])\n .filter((a) => (a.until ?? a.date) >= van && a.date <= tot)\n .sort((a, b) => a.date.localeCompare(b.date));\n}\n\n/** \"do 25 december\" of \"25 december – 2 januari\". */\nexport function afwijkingDatumTekst(a: BusinessException): string {\n const fmt = (iso: string, metDag: boolean) => {\n const [j, m, d] = iso.split(\"-\").map(Number);\n const datum = new Date(j, m - 1, d);\n return datum.toLocaleDateString(\"nl-NL\", metDag ? { weekday: \"short\", day: \"numeric\", month: \"long\" } : { day: \"numeric\", month: \"long\" });\n };\n return a.until && a.until !== a.date ? `${fmt(a.date, false)} – ${fmt(a.until, false)}` : fmt(a.date, true);\n}\n\n/**\n * Nu open, met de afwijkingen erbij: op een gesloten feestdag is het \"gesloten\", ook al zegt het\n * gewone rooster \"maandag 09:00 – 17:00\". null = niet te bepalen.\n */\nexport function isOpenNuMetAfwijkingen(rijen: HoursRow[], afwijkingen: BusinessException[] | undefined, nu = new Date()): boolean | null {\n const a = afwijkingOp(nu, afwijkingen);\n if (a) {\n const bereik = parseTimeRange(a.hours);\n if (!bereik) return /gesloten/i.test(a.hours) ? false : isOpenNow(rijen, nu);\n const min = nu.getHours() * 60 + nu.getMinutes();\n return min >= bereik.open && min < bereik.close;\n }\n return isOpenNow(rijen, nu);\n}\n\n/** Adres als regels: [\"Tuinderslaan 12\", \"3991 AB Houten\"]. */\nexport function adresRegels(b: Business | undefined): string[] {\n const a = b?.address;\n if (!a) return [];\n const regel2 = [a.postalCode, a.city].filter(Boolean).join(\" \");\n return [a.street, regel2, a.country && a.country.toLowerCase() !== \"nederland\" ? a.country : undefined].filter((x): x is string => Boolean(x?.trim()));\n}\n\n/** Een tel:-link van een telefoonnummer zoals de klant het typt (\"030 – 123 45 67\"). */\nexport function telLink(nummer: string | undefined): string | undefined {\n if (!nummer?.trim()) return undefined;\n const kaal = nummer.replace(/[^\\d+]/g, \"\");\n return kaal ? `tel:${kaal.startsWith(\"0\") && !kaal.startsWith(\"00\") ? `+31${kaal.slice(1)}` : kaal}` : undefined;\n}\n\n/** Route plannen naar het adres (Google Maps werkt op elk toestel, ook zonder app). */\nexport function routeLink(b: Business | undefined): string | undefined {\n if (b?.geo) return `https://www.google.com/maps/dir/?api=1&destination=${b.geo.lat},${b.geo.lng}`;\n const regels = adresRegels(b);\n return regels.length ? `https://www.google.com/maps/dir/?api=1&destination=${encodeURIComponent(regels.join(\", \"))}` : undefined;\n}\n\n/** Heeft het profiel genoeg om iets mee te doen? */\nexport function heeftProfiel(b: Business | undefined): boolean {\n return Boolean(b && (b.phone || b.email || b.address?.street || b.address?.city || (b.hours?.length ?? 0) > 0));\n}\n\n/**\n * LocalBusiness-JSON-LD uit het profiel, of null als er (nog) niets in staat. Zelfde `@id` als de\n * contact- en openingstijdenblokken (`#business`), zodat Google alles samenvoegt tot één bedrijf.\n */\nexport function bedrijfJsonLd(\n b: Business | undefined,\n site: { name?: string; domain?: string; logo?: string },\n): Record<string, unknown> | null {\n if (!heeftProfiel(b) || !b) return null;\n const base = site.domain ? `https://${site.domain.replace(/^https?:\\/\\//, \"\").replace(/\\/+$/, \"\")}` : undefined;\n const out: Record<string, unknown> = {\n \"@context\": \"https://schema.org\",\n \"@type\": b.type || \"LocalBusiness\",\n \"@id\": \"#business\",\n name: b.name || site.name,\n };\n if (b.description) out.description = b.description;\n if (base) out.url = base;\n if (site.logo) out.image = site.logo;\n if (b.phone) out.telephone = b.phone;\n if (b.email) out.email = b.email;\n if (b.priceRange) out.priceRange = b.priceRange;\n const a = b.address;\n if (a && (a.street || a.city || a.postalCode)) {\n out.address = {\n \"@type\": \"PostalAddress\",\n ...(a.street ? { streetAddress: a.street } : {}),\n ...(a.postalCode ? { postalCode: a.postalCode } : {}),\n ...(a.city ? { addressLocality: a.city } : {}),\n addressCountry: a.country?.trim() || \"NL\",\n };\n }\n if (b.geo) out.geo = { \"@type\": \"GeoCoordinates\", latitude: b.geo.lat, longitude: b.geo.lng };\n const spec = openingHoursSpecJsonLd(b.hours ?? []);\n if (spec.length) out.openingHoursSpecification = spec;\n // Afwijkende dagen (feestdagen, vakantie) — Google toont ze als \"aangepaste openingstijden\".\n const vandaag = isoDatum(new Date());\n const speciaal = (b.exceptions ?? [])\n .filter((x) => (x.until ?? x.date) >= vandaag)\n .map((x) => {\n const bereik = parseTimeRange(x.hours);\n const fmt = (m: number) => `${String(Math.floor(m / 60) % 24).padStart(2, \"0\")}:${String(m % 60).padStart(2, \"0\")}`;\n return {\n \"@type\": \"OpeningHoursSpecification\",\n validFrom: x.date,\n validThrough: x.until ?? x.date,\n opens: bereik ? fmt(bereik.open) : \"00:00\",\n closes: bereik ? fmt(bereik.close) : \"00:00\",\n };\n });\n if (speciaal.length) out.specialOpeningHoursSpecification = speciaal;\n const sameAs = (b.sameAs ?? []).filter((u) => /^https?:\\/\\//.test(u));\n if (sameAs.length) out.sameAs = sameAs;\n return out;\n}\n"],"mappings":"AACA,SAAS,WAAW,wBAAwB,sBAAqC;AAQ1E,SAAS,SAAS,GAAiB;AACxC,SAAO,GAAG,EAAE,YAAY,CAAC,IAAI,OAAO,EAAE,SAAS,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC;AAChH;AAGO,SAAS,YAAY,OAAa,aAA6E;AACpH,QAAM,MAAM,SAAS,KAAK;AAC1B,UAAQ,eAAe,CAAC,GAAG,KAAK,CAAC,MAAO,EAAE,QAAQ,EAAE,QAAQ,OAAO,OAAO,EAAE,QAAQ,EAAE,SAAS,GAAI;AACrG;AAGO,SAAS,mBAAmB,aAA8C,KAAK,oBAAI,KAAK,GAAG,QAAQ,IAAyB;AACjI,QAAM,MAAM,SAAS,EAAE;AACvB,QAAM,QAAQ,IAAI,KAAK,EAAE;AACzB,QAAM,QAAQ,MAAM,QAAQ,IAAI,KAAK;AACrC,QAAM,MAAM,SAAS,KAAK;AAC1B,UAAQ,eAAe,CAAC,GACrB,OAAO,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,OAAO,EAAE,QAAQ,GAAG,EACzD,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AAChD;AAGO,SAAS,oBAAoB,GAA8B;AAChE,QAAM,MAAM,CAAC,KAAa,WAAoB;AAC5C,UAAM,CAAC,GAAG,GAAG,CAAC,IAAI,IAAI,MAAM,GAAG,EAAE,IAAI,MAAM;AAC3C,UAAM,QAAQ,IAAI,KAAK,GAAG,IAAI,GAAG,CAAC;AAClC,WAAO,MAAM,mBAAmB,SAAS,SAAS,EAAE,SAAS,SAAS,KAAK,WAAW,OAAO,OAAO,IAAI,EAAE,KAAK,WAAW,OAAO,OAAO,CAAC;AAAA,EAC3I;AACA,SAAO,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,GAAG,IAAI,EAAE,MAAM,KAAK,CAAC,WAAM,IAAI,EAAE,OAAO,KAAK,CAAC,KAAK,IAAI,EAAE,MAAM,IAAI;AAC5G;AAMO,SAAS,uBAAuB,OAAmB,aAA8C,KAAK,oBAAI,KAAK,GAAmB;AACvI,QAAM,IAAI,YAAY,IAAI,WAAW;AACrC,MAAI,GAAG;AACL,UAAM,SAAS,eAAe,EAAE,KAAK;AACrC,QAAI,CAAC,OAAQ,QAAO,YAAY,KAAK,EAAE,KAAK,IAAI,QAAQ,UAAU,OAAO,EAAE;AAC3E,UAAM,MAAM,GAAG,SAAS,IAAI,KAAK,GAAG,WAAW;AAC/C,WAAO,OAAO,OAAO,QAAQ,MAAM,OAAO;AAAA,EAC5C;AACA,SAAO,UAAU,OAAO,EAAE;AAC5B;AAGO,SAAS,YAAY,GAAmC;AAC7D,QAAM,IAAI,GAAG;AACb,MAAI,CAAC,EAAG,QAAO,CAAC;AAChB,QAAM,SAAS,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAC9D,SAAO,CAAC,EAAE,QAAQ,QAAQ,EAAE,WAAW,EAAE,QAAQ,YAAY,MAAM,cAAc,EAAE,UAAU,MAAS,EAAE,OAAO,CAAC,MAAmB,QAAQ,GAAG,KAAK,CAAC,CAAC;AACvJ;AAGO,SAAS,QAAQ,QAAgD;AACtE,MAAI,CAAC,QAAQ,KAAK,EAAG,QAAO;AAC5B,QAAM,OAAO,OAAO,QAAQ,WAAW,EAAE;AACzC,SAAO,OAAO,OAAO,KAAK,WAAW,GAAG,KAAK,CAAC,KAAK,WAAW,IAAI,IAAI,MAAM,KAAK,MAAM,CAAC,CAAC,KAAK,IAAI,KAAK;AACzG;AAGO,SAAS,UAAU,GAA6C;AACrE,MAAI,GAAG,IAAK,QAAO,sDAAsD,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG;AAC/F,QAAM,SAAS,YAAY,CAAC;AAC5B,SAAO,OAAO,SAAS,sDAAsD,mBAAmB,OAAO,KAAK,IAAI,CAAC,CAAC,KAAK;AACzH;AAGO,SAAS,aAAa,GAAkC;AAC7D,SAAO,QAAQ,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,UAAU,EAAE,SAAS,SAAS,EAAE,OAAO,UAAU,KAAK,EAAE;AAChH;AAMO,SAAS,cACd,GACA,MACgC;AAChC,MAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAG,QAAO;AACnC,QAAM,OAAO,KAAK,SAAS,WAAW,KAAK,OAAO,QAAQ,gBAAgB,EAAE,EAAE,QAAQ,QAAQ,EAAE,CAAC,KAAK;AACtG,QAAM,MAA+B;AAAA,IACnC,YAAY;AAAA,IACZ,SAAS,EAAE,QAAQ;AAAA,IACnB,OAAO;AAAA,IACP,MAAM,EAAE,QAAQ,KAAK;AAAA,EACvB;AACA,MAAI,EAAE,YAAa,KAAI,cAAc,EAAE;AACvC,MAAI,KAAM,KAAI,MAAM;AACpB,MAAI,KAAK,KAAM,KAAI,QAAQ,KAAK;AAChC,MAAI,EAAE,MAAO,KAAI,YAAY,EAAE;AAC/B,MAAI,EAAE,MAAO,KAAI,QAAQ,EAAE;AAC3B,MAAI,EAAE,WAAY,KAAI,aAAa,EAAE;AACrC,QAAM,IAAI,EAAE;AACZ,MAAI,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa;AAC7C,QAAI,UAAU;AAAA,MACZ,SAAS;AAAA,MACT,GAAI,EAAE,SAAS,EAAE,eAAe,EAAE,OAAO,IAAI,CAAC;AAAA,MAC9C,GAAI,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,IAAI,CAAC;AAAA,MACnD,GAAI,EAAE,OAAO,EAAE,iBAAiB,EAAE,KAAK,IAAI,CAAC;AAAA,MAC5C,gBAAgB,EAAE,SAAS,KAAK,KAAK;AAAA,IACvC;AAAA,EACF;AACA,MAAI,EAAE,IAAK,KAAI,MAAM,EAAE,SAAS,kBAAkB,UAAU,EAAE,IAAI,KAAK,WAAW,EAAE,IAAI,IAAI;AAC5F,QAAM,OAAO,uBAAuB,EAAE,SAAS,CAAC,CAAC;AACjD,MAAI,KAAK,OAAQ,KAAI,4BAA4B;AAEjD,QAAM,UAAU,SAAS,oBAAI,KAAK,CAAC;AACnC,QAAM,YAAY,EAAE,cAAc,CAAC,GAChC,OAAO,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,OAAO,EAC5C,IAAI,CAAC,MAAM;AACV,UAAM,SAAS,eAAe,EAAE,KAAK;AACrC,UAAM,MAAM,CAAC,MAAc,GAAG,OAAO,KAAK,MAAM,IAAI,EAAE,IAAI,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,OAAO,IAAI,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC;AACjH,WAAO;AAAA,MACL,SAAS;AAAA,MACT,WAAW,EAAE;AAAA,MACb,cAAc,EAAE,SAAS,EAAE;AAAA,MAC3B,OAAO,SAAS,IAAI,OAAO,IAAI,IAAI;AAAA,MACnC,QAAQ,SAAS,IAAI,OAAO,KAAK,IAAI;AAAA,IACvC;AAAA,EACF,CAAC;AACH,MAAI,SAAS,OAAQ,KAAI,mCAAmC;AAC5D,QAAM,UAAU,EAAE,UAAU,CAAC,GAAG,OAAO,CAAC,MAAM,eAAe,KAAK,CAAC,CAAC;AACpE,MAAI,OAAO,OAAQ,KAAI,SAAS;AAChC,SAAO;AACT;","names":[]}
@@ -24,9 +24,19 @@ function BlockRenderer({
24
24
  "data-xicms-animate": attrs.dataAnimate,
25
25
  "data-xicms-block": b._key,
26
26
  "data-xicms-block-type": b._type,
27
+ "data-xicms-block-label": mode === "preview" ? def.label : void 0,
27
28
  children: rendered
28
29
  }
29
- ) : /* @__PURE__ */ jsx("div", { style: { display: "contents" }, "data-xicms-block": b._key, "data-xicms-block-type": b._type, children: rendered }) }, b._key);
30
+ ) : /* @__PURE__ */ jsx(
31
+ "div",
32
+ {
33
+ style: { display: "contents" },
34
+ "data-xicms-block": b._key,
35
+ "data-xicms-block-type": b._type,
36
+ "data-xicms-block-label": mode === "preview" ? def.label : void 0,
37
+ children: rendered
38
+ }
39
+ ) }, b._key);
30
40
  }) });
31
41
  }
32
42
  export {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/blocks/BlockRenderer.tsx"],"sourcesContent":["import { validateBlocks, type BlockRegistry } from \"./registry\";\nimport { BlockErrorBoundary } from \"./BlockErrorBoundary\";\nimport { blockStyleAttrs } from \"./blockStyle\";\nimport type { BlockStyle } from \"../schema/blocks\";\n\n/**\n * Rendert een blocks-array via de registry. Server-safe (geen \"use client\"): bruikbaar in\n * React Server Components én client. Geef de registry expliciet mee (zo werkt server-rendering);\n * client-componenten kunnen `useRegistry()` gebruiken om hem te verkrijgen.\n *\n * Elk block wordt in een `BlockErrorBoundary` gewikkeld zodat één kapot block nooit de hele\n * pagina sloopt (foolproof).\n */\nexport function BlockRenderer({\n blocks,\n registry,\n siteId,\n mode = \"view\",\n}: {\n blocks: unknown[] | undefined;\n registry: BlockRegistry;\n siteId: string;\n mode?: \"view\" | \"preview\";\n}) {\n const valid = validateBlocks(blocks, registry);\n return (\n <>\n {valid.map((b) => {\n const def = registry.get(b._type);\n if (!def) return null;\n const Render = def.Render;\n // Gedeelde blokstijl (ruimte/achtergrond/breedte/uitlijning/anker) centraal toepassen.\n const attrs = blockStyleAttrs((b as { _style?: BlockStyle })._style);\n const rendered = <Render block={b} siteId={siteId} mode={mode} />;\n // Altijd een DOM-wrapper met een stabiele block-identifier, zodat het feedback-widget\n // (en andere tooling) een onderdeel op de pagina kan aanwijzen via\n // `closest('[data-xicms-block]')`. Zonder eigen blokstijl gebruiken we `display:contents`\n // zodat de wrapper layout-neutraal is (hij traverseert wél mee in `closest()`).\n return (\n <BlockErrorBoundary key={b._key} mode={mode} type={b._type} blockKey={b._key} siteId={siteId}>\n {attrs ? (\n <div\n id={attrs.id}\n className={attrs.className}\n style={attrs.style}\n data-xicms-animate={attrs.dataAnimate}\n data-xicms-block={b._key}\n data-xicms-block-type={b._type}\n >\n {rendered}\n </div>\n ) : (\n <div style={{ display: \"contents\" }} data-xicms-block={b._key} data-xicms-block-type={b._type}>\n {rendered}\n </div>\n )}\n </BlockErrorBoundary>\n );\n })}\n </>\n );\n}\n"],"mappings":"AA0BI,mBAOqB,WAPrB;AA1BJ,SAAS,sBAA0C;AACnD,SAAS,0BAA0B;AACnC,SAAS,uBAAuB;AAWzB,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AACT,GAKG;AACD,QAAM,QAAQ,eAAe,QAAQ,QAAQ;AAC7C,SACE,gCACG,gBAAM,IAAI,CAAC,MAAM;AAChB,UAAM,MAAM,SAAS,IAAI,EAAE,KAAK;AAChC,QAAI,CAAC,IAAK,QAAO;AACjB,UAAM,SAAS,IAAI;AAEnB,UAAM,QAAQ,gBAAiB,EAA8B,MAAM;AACnE,UAAM,WAAW,oBAAC,UAAO,OAAO,GAAG,QAAgB,MAAY;AAK/D,WACE,oBAAC,sBAAgC,MAAY,MAAM,EAAE,OAAO,UAAU,EAAE,MAAM,QAC3E,kBACC;AAAA,MAAC;AAAA;AAAA,QACC,IAAI,MAAM;AAAA,QACV,WAAW,MAAM;AAAA,QACjB,OAAO,MAAM;AAAA,QACb,sBAAoB,MAAM;AAAA,QAC1B,oBAAkB,EAAE;AAAA,QACpB,yBAAuB,EAAE;AAAA,QAExB;AAAA;AAAA,IACH,IAEA,oBAAC,SAAI,OAAO,EAAE,SAAS,WAAW,GAAG,oBAAkB,EAAE,MAAM,yBAAuB,EAAE,OACrF,oBACH,KAfqB,EAAE,IAiB3B;AAAA,EAEJ,CAAC,GACH;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../src/blocks/BlockRenderer.tsx"],"sourcesContent":["import { validateBlocks, type BlockRegistry } from \"./registry\";\nimport { BlockErrorBoundary } from \"./BlockErrorBoundary\";\nimport { blockStyleAttrs } from \"./blockStyle\";\nimport type { BlockStyle } from \"../schema/blocks\";\n\n/**\n * Rendert een blocks-array via de registry. Server-safe (geen \"use client\"): bruikbaar in\n * React Server Components én client. Geef de registry expliciet mee (zo werkt server-rendering);\n * client-componenten kunnen `useRegistry()` gebruiken om hem te verkrijgen.\n *\n * Elk block wordt in een `BlockErrorBoundary` gewikkeld zodat één kapot block nooit de hele\n * pagina sloopt (foolproof).\n */\nexport function BlockRenderer({\n blocks,\n registry,\n siteId,\n mode = \"view\",\n}: {\n blocks: unknown[] | undefined;\n registry: BlockRegistry;\n siteId: string;\n mode?: \"view\" | \"preview\";\n}) {\n const valid = validateBlocks(blocks, registry);\n return (\n <>\n {valid.map((b) => {\n const def = registry.get(b._type);\n if (!def) return null;\n const Render = def.Render;\n // Gedeelde blokstijl (ruimte/achtergrond/breedte/uitlijning/anker) centraal toepassen.\n const attrs = blockStyleAttrs((b as { _style?: BlockStyle })._style);\n const rendered = <Render block={b} siteId={siteId} mode={mode} />;\n // Altijd een DOM-wrapper met een stabiele block-identifier, zodat het feedback-widget\n // (en andere tooling) een onderdeel op de pagina kan aanwijzen via\n // `closest('[data-xicms-block]')`. Zonder eigen blokstijl gebruiken we `display:contents`\n // zodat de wrapper layout-neutraal is (hij traverseert wél mee in `closest()`).\n return (\n <BlockErrorBoundary key={b._key} mode={mode} type={b._type} blockKey={b._key} siteId={siteId}>\n {attrs ? (\n <div\n id={attrs.id}\n className={attrs.className}\n style={attrs.style}\n data-xicms-animate={attrs.dataAnimate}\n data-xicms-block={b._key}\n data-xicms-block-type={b._type}\n data-xicms-block-label={mode === \"preview\" ? def.label : undefined}\n >\n {rendered}\n </div>\n ) : (\n <div\n style={{ display: \"contents\" }}\n data-xicms-block={b._key}\n data-xicms-block-type={b._type}\n data-xicms-block-label={mode === \"preview\" ? def.label : undefined}\n >\n {rendered}\n </div>\n )}\n </BlockErrorBoundary>\n );\n })}\n </>\n );\n}\n"],"mappings":"AA0BI,mBAOqB,WAPrB;AA1BJ,SAAS,sBAA0C;AACnD,SAAS,0BAA0B;AACnC,SAAS,uBAAuB;AAWzB,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AACT,GAKG;AACD,QAAM,QAAQ,eAAe,QAAQ,QAAQ;AAC7C,SACE,gCACG,gBAAM,IAAI,CAAC,MAAM;AAChB,UAAM,MAAM,SAAS,IAAI,EAAE,KAAK;AAChC,QAAI,CAAC,IAAK,QAAO;AACjB,UAAM,SAAS,IAAI;AAEnB,UAAM,QAAQ,gBAAiB,EAA8B,MAAM;AACnE,UAAM,WAAW,oBAAC,UAAO,OAAO,GAAG,QAAgB,MAAY;AAK/D,WACE,oBAAC,sBAAgC,MAAY,MAAM,EAAE,OAAO,UAAU,EAAE,MAAM,QAC3E,kBACC;AAAA,MAAC;AAAA;AAAA,QACC,IAAI,MAAM;AAAA,QACV,WAAW,MAAM;AAAA,QACjB,OAAO,MAAM;AAAA,QACb,sBAAoB,MAAM;AAAA,QAC1B,oBAAkB,EAAE;AAAA,QACpB,yBAAuB,EAAE;AAAA,QACzB,0BAAwB,SAAS,YAAY,IAAI,QAAQ;AAAA,QAExD;AAAA;AAAA,IACH,IAEA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,EAAE,SAAS,WAAW;AAAA,QAC7B,oBAAkB,EAAE;AAAA,QACpB,yBAAuB,EAAE;AAAA,QACzB,0BAAwB,SAAS,YAAY,IAAI,QAAQ;AAAA,QAExD;AAAA;AAAA,IACH,KArBqB,EAAE,IAuB3B;AAAA,EAEJ,CAAC,GACH;AAEJ;","names":[]}
@@ -10,5 +10,12 @@ export interface BlockStyleAttrs {
10
10
  * Vertaalt de gedeelde `_style` van een block naar wrapper-attributen. Gebruikt classNames +
11
11
  * CSS-variabelen (te overschrijven per site) en alleen inline-CSS waar een vrije waarde nodig is
12
12
  * (achtergrondkleur). Geeft `null` terug als er niets te stylen valt (dan rendert het block kaal).
13
+ *
14
+ * 8.10 — een achtergrondkleur is een vlak, geen verfstreep:
15
+ * - de tekstkleur rekent mee (wit of donker, wat het meeste contrast geeft). Tot nu toe bleef de
16
+ * tekst in de themakleur: donkere tekst op donkerblauw, of — in donkere modus — witte tekst op
17
+ * de staal "Wit";
18
+ * - zonder gekozen ruimte krijgt het vlak lucht (`pad-lg`), anders plakt de tekst tegen de rand;
19
+ * - een oude, niet-hex waarde (gradient, var(), url()) werkt zoals altijd, zonder automatiek.
13
20
  */
14
21
  export declare function blockStyleAttrs(style: BlockStyle | undefined): BlockStyleAttrs | null;
@@ -1,11 +1,24 @@
1
+ import { tekstOpKleur } from "../theme/color.js";
1
2
  function blockStyleAttrs(style) {
2
3
  if (!style || Object.keys(style).length === 0) return null;
3
4
  const cls = ["xicms-block"];
4
- if (style.paddingY) cls.push(`xicms-block--pad-${style.paddingY}`);
5
+ const css = {};
6
+ const bg = style.background?.trim();
7
+ const tekst = bg ? tekstOpKleur(bg) : null;
8
+ if (bg && tekst) {
9
+ css.backgroundColor = bg.startsWith("#") ? bg : `#${bg}`;
10
+ css.color = tekst;
11
+ css["--xicms-fg"] = tekst;
12
+ css["--color-text-primary"] = tekst;
13
+ css["--color-text-secondary"] = tekst === "#ffffff" ? "rgba(255, 255, 255, 0.78)" : "rgba(15, 23, 42, 0.72)";
14
+ cls.push("xicms-block--bg", tekst === "#ffffff" ? "xicms-block--bg-donker" : "xicms-block--bg-licht");
15
+ } else if (bg) {
16
+ css.background = bg;
17
+ }
18
+ const paddingY = style.paddingY ?? (bg && tekst ? "lg" : void 0);
19
+ if (paddingY) cls.push(`xicms-block--pad-${paddingY}`);
5
20
  if (style.width) cls.push(`xicms-block--${style.width}`);
6
21
  if (style.align) cls.push(`xicms-block--align-${style.align}`);
7
- const css = {};
8
- if (style.background) css.background = style.background;
9
22
  return { id: style.anchorId || void 0, className: cls.join(" "), style: css, dataAnimate: style.animate };
10
23
  }
11
24
  export {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/blocks/blockStyle.ts"],"sourcesContent":["import type { CSSProperties } from \"react\";\nimport type { BlockStyle } from \"../schema/blocks\";\n\nexport interface BlockStyleAttrs {\n id?: string;\n className: string;\n style: CSSProperties;\n dataAnimate?: string;\n}\n\n/**\n * Vertaalt de gedeelde `_style` van een block naar wrapper-attributen. Gebruikt classNames +\n * CSS-variabelen (te overschrijven per site) en alleen inline-CSS waar een vrije waarde nodig is\n * (achtergrondkleur). Geeft `null` terug als er niets te stylen valt (dan rendert het block kaal).\n */\nexport function blockStyleAttrs(style: BlockStyle | undefined): BlockStyleAttrs | null {\n if (!style || Object.keys(style).length === 0) return null;\n const cls = [\"xicms-block\"];\n if (style.paddingY) cls.push(`xicms-block--pad-${style.paddingY}`);\n if (style.width) cls.push(`xicms-block--${style.width}`);\n if (style.align) cls.push(`xicms-block--align-${style.align}`);\n const css: CSSProperties = {};\n if (style.background) css.background = style.background;\n return { id: style.anchorId || undefined, className: cls.join(\" \"), style: css, dataAnimate: style.animate };\n}\n"],"mappings":"AAeO,SAAS,gBAAgB,OAAuD;AACrF,MAAI,CAAC,SAAS,OAAO,KAAK,KAAK,EAAE,WAAW,EAAG,QAAO;AACtD,QAAM,MAAM,CAAC,aAAa;AAC1B,MAAI,MAAM,SAAU,KAAI,KAAK,oBAAoB,MAAM,QAAQ,EAAE;AACjE,MAAI,MAAM,MAAO,KAAI,KAAK,gBAAgB,MAAM,KAAK,EAAE;AACvD,MAAI,MAAM,MAAO,KAAI,KAAK,sBAAsB,MAAM,KAAK,EAAE;AAC7D,QAAM,MAAqB,CAAC;AAC5B,MAAI,MAAM,WAAY,KAAI,aAAa,MAAM;AAC7C,SAAO,EAAE,IAAI,MAAM,YAAY,QAAW,WAAW,IAAI,KAAK,GAAG,GAAG,OAAO,KAAK,aAAa,MAAM,QAAQ;AAC7G;","names":[]}
1
+ {"version":3,"sources":["../../src/blocks/blockStyle.ts"],"sourcesContent":["import type { CSSProperties } from \"react\";\nimport type { BlockStyle } from \"../schema/blocks\";\nimport { tekstOpKleur } from \"../theme/color\";\n\nexport interface BlockStyleAttrs {\n id?: string;\n className: string;\n style: CSSProperties;\n dataAnimate?: string;\n}\n\n/**\n * Vertaalt de gedeelde `_style` van een block naar wrapper-attributen. Gebruikt classNames +\n * CSS-variabelen (te overschrijven per site) en alleen inline-CSS waar een vrije waarde nodig is\n * (achtergrondkleur). Geeft `null` terug als er niets te stylen valt (dan rendert het block kaal).\n *\n * 8.10 — een achtergrondkleur is een vlak, geen verfstreep:\n * - de tekstkleur rekent mee (wit of donker, wat het meeste contrast geeft). Tot nu toe bleef de\n * tekst in de themakleur: donkere tekst op donkerblauw, of — in donkere modus — witte tekst op\n * de staal \"Wit\";\n * - zonder gekozen ruimte krijgt het vlak lucht (`pad-lg`), anders plakt de tekst tegen de rand;\n * - een oude, niet-hex waarde (gradient, var(), url()) werkt zoals altijd, zonder automatiek.\n */\nexport function blockStyleAttrs(style: BlockStyle | undefined): BlockStyleAttrs | null {\n if (!style || Object.keys(style).length === 0) return null;\n const cls = [\"xicms-block\"];\n const css: CSSProperties & Record<`--${string}`, string> = {};\n const bg = style.background?.trim();\n const tekst = bg ? tekstOpKleur(bg) : null;\n if (bg && tekst) {\n css.backgroundColor = bg.startsWith(\"#\") ? bg : `#${bg}`;\n css.color = tekst;\n css[\"--xicms-fg\"] = tekst;\n css[\"--color-text-primary\"] = tekst;\n css[\"--color-text-secondary\"] = tekst === \"#ffffff\" ? \"rgba(255, 255, 255, 0.78)\" : \"rgba(15, 23, 42, 0.72)\";\n cls.push(\"xicms-block--bg\", tekst === \"#ffffff\" ? \"xicms-block--bg-donker\" : \"xicms-block--bg-licht\");\n } else if (bg) {\n css.background = bg;\n }\n const paddingY = style.paddingY ?? (bg && tekst ? \"lg\" : undefined);\n if (paddingY) cls.push(`xicms-block--pad-${paddingY}`);\n if (style.width) cls.push(`xicms-block--${style.width}`);\n if (style.align) cls.push(`xicms-block--align-${style.align}`);\n return { id: style.anchorId || undefined, className: cls.join(\" \"), style: css, dataAnimate: style.animate };\n}\n"],"mappings":"AAEA,SAAS,oBAAoB;AAqBtB,SAAS,gBAAgB,OAAuD;AACrF,MAAI,CAAC,SAAS,OAAO,KAAK,KAAK,EAAE,WAAW,EAAG,QAAO;AACtD,QAAM,MAAM,CAAC,aAAa;AAC1B,QAAM,MAAqD,CAAC;AAC5D,QAAM,KAAK,MAAM,YAAY,KAAK;AAClC,QAAM,QAAQ,KAAK,aAAa,EAAE,IAAI;AACtC,MAAI,MAAM,OAAO;AACf,QAAI,kBAAkB,GAAG,WAAW,GAAG,IAAI,KAAK,IAAI,EAAE;AACtD,QAAI,QAAQ;AACZ,QAAI,YAAY,IAAI;AACpB,QAAI,sBAAsB,IAAI;AAC9B,QAAI,wBAAwB,IAAI,UAAU,YAAY,8BAA8B;AACpF,QAAI,KAAK,mBAAmB,UAAU,YAAY,2BAA2B,uBAAuB;AAAA,EACtG,WAAW,IAAI;AACb,QAAI,aAAa;AAAA,EACnB;AACA,QAAM,WAAW,MAAM,aAAa,MAAM,QAAQ,OAAO;AACzD,MAAI,SAAU,KAAI,KAAK,oBAAoB,QAAQ,EAAE;AACrD,MAAI,MAAM,MAAO,KAAI,KAAK,gBAAgB,MAAM,KAAK,EAAE;AACvD,MAAI,MAAM,MAAO,KAAI,KAAK,sBAAsB,MAAM,KAAK,EAAE;AAC7D,SAAO,EAAE,IAAI,MAAM,YAAY,QAAW,WAAW,IAAI,KAAK,GAAG,GAAG,OAAO,KAAK,aAAa,MAAM,QAAQ;AAC7G;","names":[]}
@@ -9,6 +9,9 @@ import {
9
9
  BreadcrumbsBlockSchema,
10
10
  ButtonsBlockSchema,
11
11
  CardsBlockSchema,
12
+ PriceListBlockSchema,
13
+ SectionHeadingBlockSchema,
14
+ AvailabilityBlockSchema,
12
15
  CardsWidgetSchema,
13
16
  ColumnsBlockSchema,
14
17
  ContactBlockSchema,
@@ -70,6 +73,9 @@ const builtinBlockSchemas = {
70
73
  breadcrumbs: BreadcrumbsBlockSchema,
71
74
  buttons: ButtonsBlockSchema,
72
75
  cards: CardsBlockSchema,
76
+ priceList: PriceListBlockSchema,
77
+ sectionHeading: SectionHeadingBlockSchema,
78
+ availability: AvailabilityBlockSchema,
73
79
  cardsWidget: CardsWidgetSchema,
74
80
  columns: ColumnsBlockSchema,
75
81
  contact: ContactBlockSchema,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/blocks/builtinSchemas.ts"],"sourcesContent":["/**\n * Lazy schema-registratie voor de ingebouwde blokken (7.13).\n *\n * De schema's zijn EDITOR-kennis: het formulier in het zijpaneel, de inline-veldlabels, de\n * vertaal-overlay en de validatie bij bewerken komen eruit voort. Een publieke bezoeker heeft\n * er niets aan — en toch reisden alle schema's plus de zod-runtime (±73 KB gzip) mee in élke\n * paginabundel, omdat elk blok zijn schema in zijn eigen client-module droeg.\n *\n * Dit bestand is de enige plek die de schema's nog als WAARDE importeert, en het wordt alleen\n * geladen door de admin/editor-chunks (AdminApp, VisualEditor) — die waren al lazy. Het plugt\n * ook de zod-parser in de registry (`setSchemaParser`), zodat validatie weer volledig is zodra\n * er bewerkt wordt; publiek volstaat de lichte vormcheck (zie registry.validateBlocks).\n *\n * NIEUW BLOK? `npm test` bewaakt dat elk ingebouwd blok hier een schema heeft (builtinSchemas.test).\n */\nimport { safeParse, type $ZodType } from \"zod/v4/core\";\nimport {\n AccordionBlockSchema,\n AgendaBlockSchema,\n AgendaWidgetSchema,\n BannerBlockSchema,\n BeforeAfterBlockSchema,\n BookingBlockSchema,\n BreadcrumbsBlockSchema,\n ButtonsBlockSchema,\n CardsBlockSchema,\n CardsWidgetSchema,\n ColumnsBlockSchema,\n ContactBlockSchema,\n ContactWidgetSchema,\n CountdownBlockSchema,\n CountdownWidgetSchema,\n CountersBlockSchema,\n CtaBlockSchema,\n CtaWidgetSchema,\n DividerBlockSchema,\n DownloadsBlockSchema,\n DownloadsWidgetSchema,\n EmbedBlockSchema,\n FaqBlockSchema,\n FeatureBlockSchema,\n FormBlockSchema,\n GalleryBlockSchema,\n GalleryWidgetSchema,\n HeroBlockSchema,\n ImageBlockSchema,\n JobsBlockSchema,\n LogosBlockSchema,\n MapBlockSchema,\n NewsListBlockSchema,\n NewsWidgetSchema,\n NewsletterBlockSchema,\n NewsletterWidgetSchema,\n OpeningHoursBlockSchema,\n OpeningHoursWidgetSchema,\n PdfBlockSchema,\n PortfolioBlockSchema,\n PricingBlockSchema,\n QuoteBlockSchema,\n RichTextBlockSchema,\n SearchBlockSchema,\n SliderBlockSchema,\n SocialBlockSchema,\n SocialWidgetSchema,\n SpacerBlockSchema,\n SymbolRefBlockSchema,\n TabsBlockSchema,\n TeamBlockSchema,\n TestimonialsBlockSchema,\n TestimonialsWidgetSchema,\n TimelineBlockSchema,\n VideoBlockSchema,\n WhatsappChatBlockSchema,\n WithSidebarBlockSchema,\n} from \"../schema/blocks\";\nimport { setSchemaParser, type BlockDefinition } from \"./registry\";\nimport { builtinBlocks } from \"./builtins/index\";\n\n/** type → schema, voor elk ingebouwd blok. */\nexport const builtinBlockSchemas: Record<string, $ZodType> = {\n accordion: AccordionBlockSchema,\n agenda: AgendaBlockSchema,\n agendaWidget: AgendaWidgetSchema,\n banner: BannerBlockSchema,\n beforeAfter: BeforeAfterBlockSchema,\n booking: BookingBlockSchema,\n breadcrumbs: BreadcrumbsBlockSchema,\n buttons: ButtonsBlockSchema,\n cards: CardsBlockSchema,\n cardsWidget: CardsWidgetSchema,\n columns: ColumnsBlockSchema,\n contact: ContactBlockSchema,\n contactWidget: ContactWidgetSchema,\n countdown: CountdownBlockSchema,\n countdownWidget: CountdownWidgetSchema,\n counters: CountersBlockSchema,\n cta: CtaBlockSchema,\n ctaWidget: CtaWidgetSchema,\n divider: DividerBlockSchema,\n downloads: DownloadsBlockSchema,\n downloadsWidget: DownloadsWidgetSchema,\n embed: EmbedBlockSchema,\n faq: FaqBlockSchema,\n feature: FeatureBlockSchema,\n form: FormBlockSchema,\n gallery: GalleryBlockSchema,\n galleryWidget: GalleryWidgetSchema,\n hero: HeroBlockSchema,\n image: ImageBlockSchema,\n jobs: JobsBlockSchema,\n logos: LogosBlockSchema,\n map: MapBlockSchema,\n newsList: NewsListBlockSchema,\n newsWidget: NewsWidgetSchema,\n newsletter: NewsletterBlockSchema,\n newsletterWidget: NewsletterWidgetSchema,\n openingHours: OpeningHoursBlockSchema,\n openingHoursWidget: OpeningHoursWidgetSchema,\n pdf: PdfBlockSchema,\n portfolio: PortfolioBlockSchema,\n pricing: PricingBlockSchema,\n quote: QuoteBlockSchema,\n richText: RichTextBlockSchema,\n search: SearchBlockSchema,\n slider: SliderBlockSchema,\n social: SocialBlockSchema,\n socialWidget: SocialWidgetSchema,\n spacer: SpacerBlockSchema,\n symbolRef: SymbolRefBlockSchema,\n tabs: TabsBlockSchema,\n team: TeamBlockSchema,\n testimonials: TestimonialsBlockSchema,\n testimonialsWidget: TestimonialsWidgetSchema,\n timeline: TimelineBlockSchema,\n video: VideoBlockSchema,\n whatsappChat: WhatsappChatBlockSchema,\n withSidebar: WithSidebarBlockSchema,\n};\n\nlet geregistreerd = false;\n\n/**\n * Hangt de schema's aan de (module-singleton) builtin-defs en plugt de zod-parser in.\n * Idempotent; aan te roepen vanuit elke admin/editor-ingang.\n */\nexport function registerBuiltinSchemas(): void {\n if (geregistreerd) return;\n geregistreerd = true;\n setSchemaParser((schema, raw) => {\n const res = safeParse(schema, raw);\n return res.success ? { success: true, data: res.data } : { success: false, issues: res.error.issues };\n });\n for (const def of builtinBlocks as Array<BlockDefinition & { schema?: unknown }>) {\n if (!def.schema && builtinBlockSchemas[def.type]) def.schema = builtinBlockSchemas[def.type];\n }\n}\n"],"mappings":"AAeA,SAAS,iBAAgC;AACzC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,uBAA6C;AACtD,SAAS,qBAAqB;AAGvB,MAAM,sBAAgD;AAAA,EAC3D,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,SAAS;AAAA,EACT,OAAO;AAAA,EACP,aAAa;AAAA,EACb,SAAS;AAAA,EACT,SAAS;AAAA,EACT,eAAe;AAAA,EACf,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,UAAU;AAAA,EACV,KAAK;AAAA,EACL,WAAW;AAAA,EACX,SAAS;AAAA,EACT,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,OAAO;AAAA,EACP,KAAK;AAAA,EACL,SAAS;AAAA,EACT,MAAM;AAAA,EACN,SAAS;AAAA,EACT,eAAe;AAAA,EACf,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,KAAK;AAAA,EACL,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,cAAc;AAAA,EACd,oBAAoB;AAAA,EACpB,KAAK;AAAA,EACL,WAAW;AAAA,EACX,SAAS;AAAA,EACT,OAAO;AAAA,EACP,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,MAAM;AAAA,EACN,MAAM;AAAA,EACN,cAAc;AAAA,EACd,oBAAoB;AAAA,EACpB,UAAU;AAAA,EACV,OAAO;AAAA,EACP,cAAc;AAAA,EACd,aAAa;AACf;AAEA,IAAI,gBAAgB;AAMb,SAAS,yBAA+B;AAC7C,MAAI,cAAe;AACnB,kBAAgB;AAChB,kBAAgB,CAAC,QAAQ,QAAQ;AAC/B,UAAM,MAAM,UAAU,QAAQ,GAAG;AACjC,WAAO,IAAI,UAAU,EAAE,SAAS,MAAM,MAAM,IAAI,KAAK,IAAI,EAAE,SAAS,OAAO,QAAQ,IAAI,MAAM,OAAO;AAAA,EACtG,CAAC;AACD,aAAW,OAAO,eAAgE;AAChF,QAAI,CAAC,IAAI,UAAU,oBAAoB,IAAI,IAAI,EAAG,KAAI,SAAS,oBAAoB,IAAI,IAAI;AAAA,EAC7F;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/blocks/builtinSchemas.ts"],"sourcesContent":["/**\n * Lazy schema-registratie voor de ingebouwde blokken (7.13).\n *\n * De schema's zijn EDITOR-kennis: het formulier in het zijpaneel, de inline-veldlabels, de\n * vertaal-overlay en de validatie bij bewerken komen eruit voort. Een publieke bezoeker heeft\n * er niets aan — en toch reisden alle schema's plus de zod-runtime (±73 KB gzip) mee in élke\n * paginabundel, omdat elk blok zijn schema in zijn eigen client-module droeg.\n *\n * Dit bestand is de enige plek die de schema's nog als WAARDE importeert, en het wordt alleen\n * geladen door de admin/editor-chunks (AdminApp, VisualEditor) — die waren al lazy. Het plugt\n * ook de zod-parser in de registry (`setSchemaParser`), zodat validatie weer volledig is zodra\n * er bewerkt wordt; publiek volstaat de lichte vormcheck (zie registry.validateBlocks).\n *\n * NIEUW BLOK? `npm test` bewaakt dat elk ingebouwd blok hier een schema heeft (builtinSchemas.test).\n */\nimport { safeParse, type $ZodType } from \"zod/v4/core\";\nimport {\n AccordionBlockSchema,\n AgendaBlockSchema,\n AgendaWidgetSchema,\n BannerBlockSchema,\n BeforeAfterBlockSchema,\n BookingBlockSchema,\n BreadcrumbsBlockSchema,\n ButtonsBlockSchema,\n CardsBlockSchema,\n PriceListBlockSchema,\n SectionHeadingBlockSchema,\n AvailabilityBlockSchema,\n CardsWidgetSchema,\n ColumnsBlockSchema,\n ContactBlockSchema,\n ContactWidgetSchema,\n CountdownBlockSchema,\n CountdownWidgetSchema,\n CountersBlockSchema,\n CtaBlockSchema,\n CtaWidgetSchema,\n DividerBlockSchema,\n DownloadsBlockSchema,\n DownloadsWidgetSchema,\n EmbedBlockSchema,\n FaqBlockSchema,\n FeatureBlockSchema,\n FormBlockSchema,\n GalleryBlockSchema,\n GalleryWidgetSchema,\n HeroBlockSchema,\n ImageBlockSchema,\n JobsBlockSchema,\n LogosBlockSchema,\n MapBlockSchema,\n NewsListBlockSchema,\n NewsWidgetSchema,\n NewsletterBlockSchema,\n NewsletterWidgetSchema,\n OpeningHoursBlockSchema,\n OpeningHoursWidgetSchema,\n PdfBlockSchema,\n PortfolioBlockSchema,\n PricingBlockSchema,\n QuoteBlockSchema,\n RichTextBlockSchema,\n SearchBlockSchema,\n SliderBlockSchema,\n SocialBlockSchema,\n SocialWidgetSchema,\n SpacerBlockSchema,\n SymbolRefBlockSchema,\n TabsBlockSchema,\n TeamBlockSchema,\n TestimonialsBlockSchema,\n TestimonialsWidgetSchema,\n TimelineBlockSchema,\n VideoBlockSchema,\n WhatsappChatBlockSchema,\n WithSidebarBlockSchema,\n} from \"../schema/blocks\";\nimport { setSchemaParser, type BlockDefinition } from \"./registry\";\nimport { builtinBlocks } from \"./builtins/index\";\n\n/** type → schema, voor elk ingebouwd blok. */\nexport const builtinBlockSchemas: Record<string, $ZodType> = {\n accordion: AccordionBlockSchema,\n agenda: AgendaBlockSchema,\n agendaWidget: AgendaWidgetSchema,\n banner: BannerBlockSchema,\n beforeAfter: BeforeAfterBlockSchema,\n booking: BookingBlockSchema,\n breadcrumbs: BreadcrumbsBlockSchema,\n buttons: ButtonsBlockSchema,\n cards: CardsBlockSchema,\n priceList: PriceListBlockSchema,\n sectionHeading: SectionHeadingBlockSchema,\n availability: AvailabilityBlockSchema,\n cardsWidget: CardsWidgetSchema,\n columns: ColumnsBlockSchema,\n contact: ContactBlockSchema,\n contactWidget: ContactWidgetSchema,\n countdown: CountdownBlockSchema,\n countdownWidget: CountdownWidgetSchema,\n counters: CountersBlockSchema,\n cta: CtaBlockSchema,\n ctaWidget: CtaWidgetSchema,\n divider: DividerBlockSchema,\n downloads: DownloadsBlockSchema,\n downloadsWidget: DownloadsWidgetSchema,\n embed: EmbedBlockSchema,\n faq: FaqBlockSchema,\n feature: FeatureBlockSchema,\n form: FormBlockSchema,\n gallery: GalleryBlockSchema,\n galleryWidget: GalleryWidgetSchema,\n hero: HeroBlockSchema,\n image: ImageBlockSchema,\n jobs: JobsBlockSchema,\n logos: LogosBlockSchema,\n map: MapBlockSchema,\n newsList: NewsListBlockSchema,\n newsWidget: NewsWidgetSchema,\n newsletter: NewsletterBlockSchema,\n newsletterWidget: NewsletterWidgetSchema,\n openingHours: OpeningHoursBlockSchema,\n openingHoursWidget: OpeningHoursWidgetSchema,\n pdf: PdfBlockSchema,\n portfolio: PortfolioBlockSchema,\n pricing: PricingBlockSchema,\n quote: QuoteBlockSchema,\n richText: RichTextBlockSchema,\n search: SearchBlockSchema,\n slider: SliderBlockSchema,\n social: SocialBlockSchema,\n socialWidget: SocialWidgetSchema,\n spacer: SpacerBlockSchema,\n symbolRef: SymbolRefBlockSchema,\n tabs: TabsBlockSchema,\n team: TeamBlockSchema,\n testimonials: TestimonialsBlockSchema,\n testimonialsWidget: TestimonialsWidgetSchema,\n timeline: TimelineBlockSchema,\n video: VideoBlockSchema,\n whatsappChat: WhatsappChatBlockSchema,\n withSidebar: WithSidebarBlockSchema,\n};\n\nlet geregistreerd = false;\n\n/**\n * Hangt de schema's aan de (module-singleton) builtin-defs en plugt de zod-parser in.\n * Idempotent; aan te roepen vanuit elke admin/editor-ingang.\n */\nexport function registerBuiltinSchemas(): void {\n if (geregistreerd) return;\n geregistreerd = true;\n setSchemaParser((schema, raw) => {\n const res = safeParse(schema, raw);\n return res.success ? { success: true, data: res.data } : { success: false, issues: res.error.issues };\n });\n for (const def of builtinBlocks as Array<BlockDefinition & { schema?: unknown }>) {\n if (!def.schema && builtinBlockSchemas[def.type]) def.schema = builtinBlockSchemas[def.type];\n }\n}\n"],"mappings":"AAeA,SAAS,iBAAgC;AACzC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,uBAA6C;AACtD,SAAS,qBAAqB;AAGvB,MAAM,sBAAgD;AAAA,EAC3D,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,EACb,SAAS;AAAA,EACT,OAAO;AAAA,EACP,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd,aAAa;AAAA,EACb,SAAS;AAAA,EACT,SAAS;AAAA,EACT,eAAe;AAAA,EACf,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,UAAU;AAAA,EACV,KAAK;AAAA,EACL,WAAW;AAAA,EACX,SAAS;AAAA,EACT,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,OAAO;AAAA,EACP,KAAK;AAAA,EACL,SAAS;AAAA,EACT,MAAM;AAAA,EACN,SAAS;AAAA,EACT,eAAe;AAAA,EACf,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,KAAK;AAAA,EACL,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,cAAc;AAAA,EACd,oBAAoB;AAAA,EACpB,KAAK;AAAA,EACL,WAAW;AAAA,EACX,SAAS;AAAA,EACT,OAAO;AAAA,EACP,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,MAAM;AAAA,EACN,MAAM;AAAA,EACN,cAAc;AAAA,EACd,oBAAoB;AAAA,EACpB,UAAU;AAAA,EACV,OAAO;AAAA,EACP,cAAc;AAAA,EACd,aAAa;AACf;AAEA,IAAI,gBAAgB;AAMb,SAAS,yBAA+B;AAC7C,MAAI,cAAe;AACnB,kBAAgB;AAChB,kBAAgB,CAAC,QAAQ,QAAQ;AAC/B,UAAM,MAAM,UAAU,QAAQ,GAAG;AACjC,WAAO,IAAI,UAAU,EAAE,SAAS,MAAM,MAAM,IAAI,KAAK,IAAI,EAAE,SAAS,OAAO,QAAQ,IAAI,MAAM,OAAO;AAAA,EACtG,CAAC;AACD,aAAW,OAAO,eAAgE;AAChF,QAAI,CAAC,IAAI,UAAU,oBAAoB,IAAI,IAAI,EAAG,KAAI,SAAS,oBAAoB,IAAI,IAAI;AAAA,EAC7F;AACF;","names":[]}
@@ -10,7 +10,18 @@ export interface AgendaEvent {
10
10
  location?: string;
11
11
  description?: string;
12
12
  url?: string;
13
+ /** 8.15: terugkerend. */
14
+ herhaal?: "wekelijks" | "tweewekelijks" | "maandelijks";
15
+ /** Laatste datum van de herhaling ("2027-06-30"); leeg = een jaar vooruit. */
16
+ herhaalTot?: string;
13
17
  }
18
+ /**
19
+ * Terugkerende activiteiten uitvouwen (8.15): "elke dinsdag koor" staat één keer in het beheer en
20
+ * verschijnt op de site als losse data — tot de einddatum, anders een jaar vooruit, en nooit meer
21
+ * dan 60 keer. Elke herhaling houdt de index van het origineel (`_i`), dus bewerken op de pagina
22
+ * past de reeks aan.
23
+ */
24
+ export declare function vouwHerhalingenUit<T extends AgendaEvent>(events: T[], vanaf?: Date): T[];
14
25
  /**
15
26
  * Parseert een event-datum als LOKALE tijd. Cruciaal voor datum-zonder-tijd: `new Date("2026-08-01")`
16
27
  * is per spec UTC-middernacht, waardoor west-van-UTC-bezoekers "31 juli" te zien kregen (en de
@@ -28,7 +39,18 @@ export declare function formatEventDate(value: string): string;
28
39
  export declare function selectAgendaEvents<T extends AgendaEvent>(events: T[] | undefined, opts?: {
29
40
  hidePast?: boolean;
30
41
  limit?: number;
42
+ vandaag?: Date | null;
31
43
  }): T[];
44
+ /**
45
+ * Event-JSON-LD (8.14 vollediger): adres (eigen adres of dat uit het bedrijfsprofiel), afbeelding,
46
+ * prijs, status (afgelast/verplaatst/online) en de organisator. Google vroeg in Search Console bij
47
+ * de oude versie om "ontbrekend veld: address / image / offers / organizer".
48
+ */
49
+ export declare function eventJsonLd(events: Agenda["events"], bedrijf?: {
50
+ name?: string;
51
+ url?: string;
52
+ address?: string;
53
+ }): Record<string, unknown>;
32
54
  /** Agenda/evenementen. Server-safe (geen client-state); `hidePast` filtert verlopen events. */
33
55
  export declare function AgendaRender({ block }: BlockRenderProps<Agenda>): import("react").JSX.Element | null;
34
56
  export {};