@xiwebdesign/xicms-core 7.31.0 → 8.16.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 (482) hide show
  1. package/dist/XiCMSProvider.js +23 -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 -60
  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 +248 -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 +159 -0
  133. package/dist/admin/settings/BedrijfInstellingen.js.map +1 -0
  134. package/dist/admin/settings/MailTemplates.js +5 -4
  135. package/dist/admin/settings/MailTemplates.js.map +1 -1
  136. package/dist/admin/settings/SettingsPanel.js +120 -78
  137. package/dist/admin/settings/SettingsPanel.js.map +1 -1
  138. package/dist/admin/settings/SnapshotsCard.js +4 -4
  139. package/dist/admin/settings/SnapshotsCard.js.map +1 -1
  140. package/dist/admin/settings/VorigeTerugzetten.d.ts +15 -0
  141. package/dist/admin/settings/VorigeTerugzetten.js +89 -0
  142. package/dist/admin/settings/VorigeTerugzetten.js.map +1 -0
  143. package/dist/admin/shop/CategoriesTab.js +6 -4
  144. package/dist/admin/shop/CategoriesTab.js.map +1 -1
  145. package/dist/admin/shop/DiscountsTab.js +4 -2
  146. package/dist/admin/shop/DiscountsTab.js.map +1 -1
  147. package/dist/admin/shop/OrdersTab.js +57 -19
  148. package/dist/admin/shop/OrdersTab.js.map +1 -1
  149. package/dist/admin/shop/ProductPaneel.js +2 -1
  150. package/dist/admin/shop/ProductPaneel.js.map +1 -1
  151. package/dist/admin/shop/ProductsTab.js +40 -19
  152. package/dist/admin/shop/ProductsTab.js.map +1 -1
  153. package/dist/admin/shop/ShopPanel.js +13 -1
  154. package/dist/admin/shop/ShopPanel.js.map +1 -1
  155. package/dist/admin/shop/ShopSettingsTab.js +56 -17
  156. package/dist/admin/shop/ShopSettingsTab.js.map +1 -1
  157. package/dist/admin/shop/productClient.js +7 -3
  158. package/dist/admin/shop/productClient.js.map +1 -1
  159. package/dist/admin/stats/NietGevonden.d.ts +10 -0
  160. package/dist/admin/stats/NietGevonden.js +78 -0
  161. package/dist/admin/stats/NietGevonden.js.map +1 -0
  162. package/dist/admin/stats/StatsPanel.js +6 -1
  163. package/dist/admin/stats/StatsPanel.js.map +1 -1
  164. package/dist/admin/stats/lib.d.ts +2 -0
  165. package/dist/admin/stats/lib.js.map +1 -1
  166. package/dist/admin/ui/ConfirmDialog.js +10 -1
  167. package/dist/admin/ui/ConfirmDialog.js.map +1 -1
  168. package/dist/admin/ui/Icon.d.ts +34 -0
  169. package/dist/admin/ui/Icon.js +44 -0
  170. package/dist/admin/ui/Icon.js.map +1 -0
  171. package/dist/admin/ui/ImageField.d.ts +15 -0
  172. package/dist/admin/ui/ImageField.js +67 -0
  173. package/dist/admin/ui/ImageField.js.map +1 -0
  174. package/dist/admin/ui/KleurVeld.d.ts +25 -0
  175. package/dist/admin/ui/KleurVeld.js +76 -0
  176. package/dist/admin/ui/KleurVeld.js.map +1 -0
  177. package/dist/admin/ui/LaadStaat.d.ts +21 -0
  178. package/dist/admin/ui/LaadStaat.js +43 -0
  179. package/dist/admin/ui/LaadStaat.js.map +1 -0
  180. package/dist/admin/ui/LeesbaarheidPaneel.d.ts +10 -0
  181. package/dist/admin/ui/LeesbaarheidPaneel.js +68 -0
  182. package/dist/admin/ui/LeesbaarheidPaneel.js.map +1 -0
  183. package/dist/admin/ui/LinkDialog.d.ts +22 -0
  184. package/dist/admin/ui/LinkDialog.js +131 -0
  185. package/dist/admin/ui/LinkDialog.js.map +1 -0
  186. package/dist/admin/ui/LinkVeld.d.ts +14 -0
  187. package/dist/admin/ui/LinkVeld.js +49 -0
  188. package/dist/admin/ui/LinkVeld.js.map +1 -0
  189. package/dist/admin/ui/PreviewLinkResultaat.d.ts +14 -0
  190. package/dist/admin/ui/PreviewLinkResultaat.js +52 -0
  191. package/dist/admin/ui/PreviewLinkResultaat.js.map +1 -0
  192. package/dist/admin/ui/charts.js +5 -5
  193. package/dist/admin/ui/charts.js.map +1 -1
  194. package/dist/admin/ui/primitives.d.ts +16 -6
  195. package/dist/admin/ui/primitives.js +98 -26
  196. package/dist/admin/ui/primitives.js.map +1 -1
  197. package/dist/admin/ui/select.js +5 -2
  198. package/dist/admin/ui/select.js.map +1 -1
  199. package/dist/admin/ui/switch.d.ts +3 -1
  200. package/dist/admin/ui/switch.js +6 -3
  201. package/dist/admin/ui/switch.js.map +1 -1
  202. package/dist/admin/ui/toast.d.ts +2 -1
  203. package/dist/admin/ui/toast.js +17 -11
  204. package/dist/admin/ui/toast.js.map +1 -1
  205. package/dist/admin/visual/BlokKiezer.d.ts +34 -0
  206. package/dist/admin/visual/BlokKiezer.js +225 -0
  207. package/dist/admin/visual/BlokKiezer.js.map +1 -0
  208. package/dist/admin/visual/InlineGereedschap.d.ts +52 -0
  209. package/dist/admin/visual/InlineGereedschap.js +356 -0
  210. package/dist/admin/visual/InlineGereedschap.js.map +1 -0
  211. package/dist/admin/visual/InlineRijkeTekst.d.ts +23 -0
  212. package/dist/admin/visual/InlineRijkeTekst.js +152 -0
  213. package/dist/admin/visual/InlineRijkeTekst.js.map +1 -0
  214. package/dist/admin/visual/VisualEditor.js +273 -125
  215. package/dist/admin/visual/VisualEditor.js.map +1 -1
  216. package/dist/admin.css +1 -1
  217. package/dist/auth/AuthProvider.js +1 -0
  218. package/dist/auth/AuthProvider.js.map +1 -1
  219. package/dist/bedrijf/bedrijf.d.ts +44 -0
  220. package/dist/bedrijf/bedrijf.js +125 -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 +37 -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 +3 -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/consentEmbed.js +26 -9
  309. package/dist/blocks/builtins/consentEmbed.js.map +1 -1
  310. package/dist/blocks/builtins/index.d.ts +3 -0
  311. package/dist/blocks/builtins/index.js +6 -0
  312. package/dist/blocks/builtins/index.js.map +1 -1
  313. package/dist/blocks/builtins/lib/autoComplete.d.ts +7 -0
  314. package/dist/blocks/builtins/lib/autoComplete.js +20 -0
  315. package/dist/blocks/builtins/lib/autoComplete.js.map +1 -0
  316. package/dist/blocks/builtins/lib/bookingUrl.d.ts +2 -2
  317. package/dist/blocks/builtins/lib/bookingUrl.js +1 -1
  318. package/dist/blocks/builtins/lib/bookingUrl.js.map +1 -1
  319. package/dist/blocks/builtins/lib/ical.d.ts +24 -0
  320. package/dist/blocks/builtins/lib/ical.js +82 -0
  321. package/dist/blocks/builtins/lib/ical.js.map +1 -0
  322. package/dist/blocks/builtins/lib/vandaag.d.ts +8 -0
  323. package/dist/blocks/builtins/lib/vandaag.js +22 -0
  324. package/dist/blocks/builtins/lib/vandaag.js.map +1 -0
  325. package/dist/blocks/registry.d.ts +6 -0
  326. package/dist/blocks/registry.js.map +1 -1
  327. package/dist/blocks/ui/index.js +1 -0
  328. package/dist/blocks/ui/index.js.map +1 -1
  329. package/dist/components/EditBar.js +2 -4
  330. package/dist/components/EditBar.js.map +1 -1
  331. package/dist/components/News.js +26 -18
  332. package/dist/components/News.js.map +1 -1
  333. package/dist/components/PageView.d.ts +7 -1
  334. package/dist/components/PageView.js +17 -0
  335. package/dist/components/PageView.js.map +1 -1
  336. package/dist/components/ResponsiveImage.js +18 -20
  337. package/dist/components/ResponsiveImage.js.map +1 -1
  338. package/dist/components/onderOffset.d.ts +13 -0
  339. package/dist/components/onderOffset.js +74 -0
  340. package/dist/components/onderOffset.js.map +1 -0
  341. package/dist/components/site/Bedrijfsnummers.d.ts +9 -0
  342. package/dist/components/site/Bedrijfsnummers.js +12 -0
  343. package/dist/components/site/Bedrijfsnummers.js.map +1 -0
  344. package/dist/components/site/SiteFooter.d.ts +6 -1
  345. package/dist/components/site/SiteFooter.js +62 -9
  346. package/dist/components/site/SiteFooter.js.map +1 -1
  347. package/dist/components/site/SiteHeader.d.ts +15 -0
  348. package/dist/components/site/SiteHeader.js +70 -0
  349. package/dist/components/site/SiteHeader.js.map +1 -0
  350. package/dist/components/site/SiteNav.d.ts +2 -0
  351. package/dist/components/site/SiteNav.js +29 -5
  352. package/dist/components/site/SiteNav.js.map +1 -1
  353. package/dist/demo/DemoStudio.js +2 -2
  354. package/dist/demo/DemoStudio.js.map +1 -1
  355. package/dist/demo/demoStore.d.ts +13 -0
  356. package/dist/demo/demoStore.js +36 -0
  357. package/dist/demo/demoStore.js.map +1 -1
  358. package/dist/editor/EditorProvider.js +15 -4
  359. package/dist/editor/EditorProvider.js.map +1 -1
  360. package/dist/firebase/functionsClient.js +5 -1
  361. package/dist/firebase/functionsClient.js.map +1 -1
  362. package/dist/index.d.ts +5 -1
  363. package/dist/index.js +20 -1
  364. package/dist/index.js.map +1 -1
  365. package/dist/media/ImageContext.d.ts +17 -0
  366. package/dist/media/ImageContext.js +65 -20
  367. package/dist/media/ImageContext.js.map +1 -1
  368. package/dist/media/altInHtml.d.ts +9 -0
  369. package/dist/media/altInHtml.js +17 -0
  370. package/dist/media/altInHtml.js.map +1 -0
  371. package/dist/media/srcset.d.ts +12 -0
  372. package/dist/media/srcset.js +13 -0
  373. package/dist/media/srcset.js.map +1 -0
  374. package/dist/modules/builtins.d.ts +1 -0
  375. package/dist/modules/builtins.js +22 -9
  376. package/dist/modules/builtins.js.map +1 -1
  377. package/dist/modules/consent/ConsentBanner.d.ts +5 -0
  378. package/dist/modules/consent/ConsentBanner.js +8 -7
  379. package/dist/modules/consent/ConsentBanner.js.map +1 -1
  380. package/dist/modules/consent/standaard.d.ts +12 -0
  381. package/dist/modules/consent/standaard.js +10 -0
  382. package/dist/modules/consent/standaard.js.map +1 -0
  383. package/dist/modules/consent/useConsent.d.ts +4 -0
  384. package/dist/modules/consent/useConsent.js +30 -1
  385. package/dist/modules/consent/useConsent.js.map +1 -1
  386. package/dist/modules/shop/blocks/Cart.js +5 -3
  387. package/dist/modules/shop/blocks/Cart.js.map +1 -1
  388. package/dist/modules/shop/blocks/Checkout.js +56 -35
  389. package/dist/modules/shop/blocks/Checkout.js.map +1 -1
  390. package/dist/modules/shop/blocks/Donation.js +4 -4
  391. package/dist/modules/shop/blocks/Donation.js.map +1 -1
  392. package/dist/modules/shop/blocks/ProductDetail.js +19 -3
  393. package/dist/modules/shop/blocks/ProductDetail.js.map +1 -1
  394. package/dist/modules/shop/blocks/ProductGrid.d.ts +3 -1
  395. package/dist/modules/shop/blocks/ProductGrid.js +8 -4
  396. package/dist/modules/shop/blocks/ProductGrid.js.map +1 -1
  397. package/dist/modules/shop/blocks/ShopCategories.js +4 -3
  398. package/dist/modules/shop/blocks/ShopCategories.js.map +1 -1
  399. package/dist/modules/shop/lib.d.ts +4 -0
  400. package/dist/modules/shop/lib.js +14 -0
  401. package/dist/modules/shop/lib.js.map +1 -1
  402. package/dist/modules/shop/settings.d.ts +3 -0
  403. package/dist/modules/shop/settings.js +14 -0
  404. package/dist/modules/shop/settings.js.map +1 -1
  405. package/dist/modules/shop/strings.d.ts +4 -0
  406. package/dist/modules/shop/strings.js +8 -0
  407. package/dist/modules/shop/strings.js.map +1 -1
  408. package/dist/next/envCheck.d.ts +42 -0
  409. package/dist/next/envCheck.js +106 -0
  410. package/dist/next/envCheck.js.map +1 -0
  411. package/dist/next/index.cjs +185 -2
  412. package/dist/next/index.d.ts +2 -0
  413. package/dist/next/index.js +8 -1
  414. package/dist/next/index.js.map +1 -1
  415. package/dist/next/securityHeaders.d.ts +36 -0
  416. package/dist/next/securityHeaders.js +74 -0
  417. package/dist/next/securityHeaders.js.map +1 -0
  418. package/dist/patterns/builtins.d.ts +7 -0
  419. package/dist/patterns/builtins.js +138 -3
  420. package/dist/patterns/builtins.js.map +1 -1
  421. package/dist/releaseNotes.js +148 -0
  422. package/dist/releaseNotes.js.map +1 -1
  423. package/dist/render/PublishedPage.d.ts +2 -1
  424. package/dist/render/PublishedPage.js +10 -4
  425. package/dist/render/PublishedPage.js.map +1 -1
  426. package/dist/schema/blocks.d.ts +473 -0
  427. package/dist/schema/blocks.js +105 -5
  428. package/dist/schema/blocks.js.map +1 -1
  429. package/dist/schema/business.d.ts +118 -0
  430. package/dist/schema/business.js +75 -0
  431. package/dist/schema/business.js.map +1 -0
  432. package/dist/schema/fields.d.ts +2 -1
  433. package/dist/schema/fields.js.map +1 -1
  434. package/dist/schema/forms.d.ts +18 -0
  435. package/dist/schema/forms.js +18 -3
  436. package/dist/schema/forms.js.map +1 -1
  437. package/dist/schema/mail.d.ts +10 -0
  438. package/dist/schema/mail.js +7 -0
  439. package/dist/schema/mail.js.map +1 -1
  440. package/dist/schema/settings.d.ts +103 -0
  441. package/dist/schema/settings.js +24 -3
  442. package/dist/schema/settings.js.map +1 -1
  443. package/dist/schema/shop.d.ts +2 -0
  444. package/dist/schema/shop.js +4 -0
  445. package/dist/schema/shop.js.map +1 -1
  446. package/dist/schema/shopGeld.d.ts +1 -0
  447. package/dist/schema/shopGeld.js +1 -0
  448. package/dist/schema/shopGeld.js.map +1 -1
  449. package/dist/schema/siteConfig.d.ts +69 -1
  450. package/dist/schema/siteConfig.js +7 -2
  451. package/dist/schema/siteConfig.js.map +1 -1
  452. package/dist/server/blockData.d.ts +1 -1
  453. package/dist/server/blockData.js +74 -18
  454. package/dist/server/blockData.js.map +1 -1
  455. package/dist/server/cspRapport.d.ts +20 -0
  456. package/dist/server/cspRapport.js +56 -0
  457. package/dist/server/cspRapport.js.map +1 -0
  458. package/dist/server/fonts.d.ts +3 -0
  459. package/dist/server/fonts.js +39 -0
  460. package/dist/server/fonts.js.map +1 -0
  461. package/dist/server/index.d.ts +3 -0
  462. package/dist/server/index.js +8 -0
  463. package/dist/server/index.js.map +1 -1
  464. package/dist/server/sanitize.js +2 -0
  465. package/dist/server/sanitize.js.map +1 -1
  466. package/dist/settings/useSiteSettings.js +4 -1
  467. package/dist/settings/useSiteSettings.js.map +1 -1
  468. package/dist/starters/starters.d.ts +69 -0
  469. package/dist/starters/starters.js +171 -0
  470. package/dist/starters/starters.js.map +1 -0
  471. package/dist/styles.css +1181 -212
  472. package/dist/theme/color.d.ts +10 -0
  473. package/dist/theme/color.js +17 -1
  474. package/dist/theme/color.js.map +1 -1
  475. package/dist/theme/fontFallback.d.ts +23 -0
  476. package/dist/theme/fontFallback.js +58 -0
  477. package/dist/theme/fontFallback.js.map +1 -0
  478. package/dist/theme/fonts.d.ts +11 -0
  479. package/dist/theme/fonts.js +16 -0
  480. package/dist/theme/fonts.js.map +1 -0
  481. package/dist/version.js +1 -1
  482. package/package.json +5 -4
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
- import { forwardRef } from "react";
3
+ import { createContext, forwardRef, useContext } from "react";
4
4
  import { cn } from "./cn.js";
5
5
  import { TextInput } from "@astryxdesign/core/TextInput";
6
6
  import { NumberInput } from "@astryxdesign/core/NumberInput";
@@ -9,7 +9,9 @@ const VARIANT_STYLE = {
9
9
  primary: { background: "var(--color-accent)", color: "var(--color-on-accent, #fff)" },
10
10
  secondary: { background: "var(--color-background-muted)", color: "var(--color-text-primary)", border: "1px solid var(--color-border)" },
11
11
  ghost: { background: "transparent", color: "var(--color-text-primary)" },
12
- danger: { background: "var(--color-error, #dc2626)", color: "#fff" }
12
+ danger: { background: "var(--color-error, #dc2626)", color: "#fff" },
13
+ /** Verwijderen binnen een lijst (8.2): rustig, maar herkenbaar rood. Eén stijl i.p.v. drie. */
14
+ dangerGhost: { background: "transparent", color: "var(--color-error, #b91c1c)" }
13
15
  };
14
16
  const SIZES = {
15
17
  sm: "h-8 px-3 text-sm",
@@ -21,51 +23,94 @@ const controlStyle = {
21
23
  background: "var(--color-background-body, #fff)",
22
24
  color: "var(--color-text-primary)"
23
25
  };
24
- const Button = forwardRef(function Button2({ className, variant = "primary", size = "md", style, ...props }, ref) {
25
- return /* @__PURE__ */ jsx(
26
+ const Button = forwardRef(function Button2({ className, variant = "primary", size = "md", style, loading, disabled, children, ...props }, ref) {
27
+ return /* @__PURE__ */ jsxs(
26
28
  "button",
27
29
  {
28
30
  ref,
29
31
  className: cn(
30
- "inline-flex items-center justify-center gap-2 font-medium transition-[filter] hover:brightness-95 focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50",
32
+ "xicms-admin-btn inline-flex items-center justify-center gap-2 font-medium transition-[filter] hover:brightness-95 disabled:cursor-not-allowed disabled:opacity-50",
31
33
  SIZES[size],
34
+ loading && "disabled:opacity-80",
32
35
  className
33
36
  ),
34
37
  style: { borderRadius: "var(--radius-element, 8px)", ...VARIANT_STYLE[variant], ...style },
35
- ...props
38
+ disabled: disabled || loading,
39
+ "aria-busy": loading || void 0,
40
+ ...props,
41
+ children: [
42
+ loading && /* @__PURE__ */ jsx("span", { className: "xicms-admin-spinner", "aria-hidden": true }),
43
+ children
44
+ ]
36
45
  }
37
46
  );
38
47
  });
48
+ function LegeStaat({ titel, tekst, actie }) {
49
+ return /* @__PURE__ */ jsxs("div", { className: "col-span-full grid justify-items-center gap-2 rounded-xl border border-dashed border-slate-300 px-4 py-8 text-center", children: [
50
+ /* @__PURE__ */ jsx("span", { className: "grid h-10 w-10 place-items-center rounded-full bg-slate-100 text-slate-500", "aria-hidden": true, children: /* @__PURE__ */ jsx("svg", { viewBox: "0 0 24 24", width: "20", height: "20", fill: "none", stroke: "currentColor", strokeWidth: "1.6", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx("path", { d: "M4 7h16v12H4z M4 7l2-3h12l2 3 M9 12h6" }) }) }),
51
+ /* @__PURE__ */ jsx("p", { className: "text-sm font-medium text-slate-700", children: titel }),
52
+ tekst && /* @__PURE__ */ jsx("p", { className: "max-w-sm text-sm text-slate-500", children: tekst }),
53
+ actie && /* @__PURE__ */ jsx("div", { className: "mt-1", children: actie })
54
+ ] });
55
+ }
39
56
  function syntheticEvent(value) {
40
57
  return { target: { value }, currentTarget: { value } };
41
58
  }
59
+ const FieldLabelContext = createContext(null);
60
+ function useFieldLabel(fallback) {
61
+ return useContext(FieldLabelContext) ?? fallback;
62
+ }
63
+ function doorgeef(rest) {
64
+ const uit = {};
65
+ for (const [k, v] of Object.entries(rest)) {
66
+ if (v === void 0) continue;
67
+ if (["id", "onBlur", "onFocus", "onKeyDown", "onPaste", "title", "role", "tabIndex"].includes(k) || k.startsWith("aria-") || k.startsWith("data-")) {
68
+ uit[k] = v;
69
+ }
70
+ }
71
+ return uit;
72
+ }
73
+ const TEXT_TYPES = /* @__PURE__ */ new Set(["text", "email", "password"]);
42
74
  const Input = forwardRef(
43
- function Input2({ className, style, type = "text", value, onChange, placeholder, ...rest }, ref) {
44
- const lbl = rest["aria-label"] || placeholder || "Veld";
75
+ function Input2({ className, style, type = "text", value, onChange, placeholder, readOnly, disabled, required, name, autoFocus, autoComplete, maxLength, min, max, step, ...rest }, ref) {
76
+ const lbl = useFieldLabel(rest["aria-label"] || placeholder || "Invoer");
77
+ const gemeen = {
78
+ ref,
79
+ label: lbl,
80
+ isLabelHidden: true,
81
+ placeholder,
82
+ isReadOnly: readOnly || void 0,
83
+ isDisabled: disabled || void 0,
84
+ isRequired: required || void 0,
85
+ htmlName: name,
86
+ hasAutoFocus: autoFocus || void 0,
87
+ autoComplete,
88
+ containerClassName: className,
89
+ containerStyle: style,
90
+ ...doorgeef(rest)
91
+ };
45
92
  if (type === "number") {
93
+ const getal = (x) => x === void 0 || x === "" ? void 0 : Number(x);
46
94
  return /* @__PURE__ */ jsx(
47
95
  NumberInput,
48
96
  {
49
- ref,
50
- label: lbl,
51
- isLabelHidden: true,
52
- placeholder,
97
+ ...gemeen,
98
+ min: getal(min),
99
+ max: getal(max),
100
+ step: getal(step),
53
101
  value: value === "" || value == null ? void 0 : Number(value),
54
102
  onChange: (n) => onChange?.(syntheticEvent(n == null ? "" : String(n)))
55
103
  }
56
104
  );
57
105
  }
58
- if (type === "text" || type === "email" || type === "password") {
106
+ if (TEXT_TYPES.has(type)) {
59
107
  return /* @__PURE__ */ jsx(
60
108
  TextInput,
61
109
  {
62
- ref,
63
- label: lbl,
64
- isLabelHidden: true,
110
+ ...gemeen,
65
111
  type,
66
- placeholder,
67
112
  value: String(value ?? ""),
68
- onChange: (v) => onChange?.(syntheticEvent(v))
113
+ onChange: (v) => onChange?.(syntheticEvent(maxLength != null && maxLength >= 0 ? v.slice(0, maxLength) : v))
69
114
  }
70
115
  );
71
116
  }
@@ -77,7 +122,18 @@ const Input = forwardRef(
77
122
  value,
78
123
  onChange,
79
124
  placeholder,
80
- className: cn("h-10 w-full px-3 text-sm outline-none focus:ring-2", className),
125
+ readOnly,
126
+ disabled,
127
+ required,
128
+ name,
129
+ autoFocus,
130
+ autoComplete,
131
+ maxLength,
132
+ min,
133
+ max,
134
+ step,
135
+ "aria-label": lbl,
136
+ className: cn("xicms-admin-native h-10 w-full px-3 text-sm", className),
81
137
  style: { ...controlStyle, ...style },
82
138
  ...rest
83
139
  }
@@ -85,26 +141,40 @@ const Input = forwardRef(
85
141
  }
86
142
  );
87
143
  const Textarea = forwardRef(
88
- function Textarea2({ value, onChange, placeholder, rows = 4, "aria-label": ariaLabel, ...rest }, ref) {
89
- void rest;
144
+ function Textarea2({ value, onChange, placeholder, rows = 4, className, style, readOnly, disabled, required, name, autoFocus, autoComplete, maxLength, spellCheck, ...rest }, ref) {
145
+ const lbl = useFieldLabel(rest["aria-label"] || placeholder || "Tekst");
90
146
  return /* @__PURE__ */ jsx(
91
147
  TextArea,
92
148
  {
93
149
  ref,
94
- label: ariaLabel || placeholder || "Tekst",
150
+ label: lbl,
95
151
  isLabelHidden: true,
96
152
  rows,
97
153
  placeholder,
154
+ isReadOnly: readOnly || void 0,
155
+ isDisabled: disabled || void 0,
156
+ isRequired: required || void 0,
157
+ htmlName: name,
158
+ hasAutoFocus: autoFocus || void 0,
159
+ autoComplete,
160
+ maxLength,
161
+ hasSpellCheck: spellCheck === void 0 ? void 0 : Boolean(spellCheck),
162
+ containerClassName: className,
163
+ containerStyle: style,
164
+ ...doorgeef(rest),
98
165
  value: String(value ?? ""),
99
- onChange: (v) => onChange?.({ target: { value: v }, currentTarget: { value: v } })
166
+ onChange: (raw) => {
167
+ const v = maxLength != null && maxLength >= 0 ? raw.slice(0, maxLength) : raw;
168
+ onChange?.({ target: { value: v }, currentTarget: { value: v } });
169
+ }
100
170
  }
101
171
  );
102
172
  }
103
173
  );
104
174
  function Field({ label, children, hint }) {
105
175
  return /* @__PURE__ */ jsxs("div", { className: "grid gap-1.5", children: [
106
- /* @__PURE__ */ jsx("span", { className: "text-sm font-medium", style: { color: "var(--color-text-primary)" }, children: label }),
107
- children,
176
+ /* @__PURE__ */ jsx("span", { className: "text-sm font-medium", style: { color: "var(--color-text-primary)" }, "aria-hidden": true, children: label }),
177
+ /* @__PURE__ */ jsx(FieldLabelContext.Provider, { value: label, children }),
108
178
  hint && /* @__PURE__ */ jsx("span", { className: "text-xs", style: { color: "var(--color-text-secondary)" }, children: hint })
109
179
  ] });
110
180
  }
@@ -132,6 +202,8 @@ export {
132
202
  Card,
133
203
  Field,
134
204
  Input,
135
- Textarea
205
+ LegeStaat,
206
+ Textarea,
207
+ useFieldLabel
136
208
  };
137
209
  //# sourceMappingURL=primitives.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/admin/ui/primitives.tsx"],"sourcesContent":["\"use client\";\n\nimport { forwardRef, type ButtonHTMLAttributes, type ChangeEvent, type CSSProperties, type InputHTMLAttributes, type TextareaHTMLAttributes } from \"react\";\nimport { cn } from \"./cn\";\nimport { TextInput } from \"@astryxdesign/core/TextInput\";\nimport { NumberInput } from \"@astryxdesign/core/NumberInput\";\nimport { TextArea } from \"@astryxdesign/core/TextArea\";\n\n/**\n * Admin-primitieven op het **Astryx design system**. Form-controls (Input/Textarea) renderen echte\n * Astryx-componenten; bijzondere input-types (datetime-local, file…) die Astryx niet kent vallen\n * robuust terug op een token-gestylede native input. Button/Card/Badge zijn token-gestyled (zelfde\n * Astryx-huisstijl) — bewust geen Astryx Button (die werkt op `label`/`clickAction` i.p.v. children/\n * onClick, wat de ~honderd editor-call-sites zou breken). De API blijft gelijk → robuust.\n */\n\ntype Variant = \"primary\" | \"secondary\" | \"ghost\" | \"danger\";\ntype Size = \"sm\" | \"md\";\n\nconst VARIANT_STYLE: Record<Variant, CSSProperties> = {\n primary: { background: \"var(--color-accent)\", color: \"var(--color-on-accent, #fff)\" },\n secondary: { background: \"var(--color-background-muted)\", color: \"var(--color-text-primary)\", border: \"1px solid var(--color-border)\" },\n ghost: { background: \"transparent\", color: \"var(--color-text-primary)\" },\n danger: { background: \"var(--color-error, #dc2626)\", color: \"#fff\" },\n};\nconst SIZES: Record<Size, string> = {\n sm: \"h-8 px-3 text-sm\",\n md: \"h-10 px-4 text-sm\",\n};\n\nconst controlStyle: CSSProperties = {\n borderRadius: \"var(--radius-element, 8px)\",\n border: \"1px solid var(--color-border)\",\n background: \"var(--color-background-body, #fff)\",\n color: \"var(--color-text-primary)\",\n};\n\nexport const Button = forwardRef<\n HTMLButtonElement,\n ButtonHTMLAttributes<HTMLButtonElement> & { variant?: Variant; size?: Size }\n>(function Button({ className, variant = \"primary\", size = \"md\", style, ...props }, ref) {\n return (\n <button\n ref={ref}\n className={cn(\n \"inline-flex items-center justify-center gap-2 font-medium transition-[filter] hover:brightness-95 focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50\",\n SIZES[size],\n className,\n )}\n style={{ borderRadius: \"var(--radius-element, 8px)\", ...VARIANT_STYLE[variant], ...style }}\n {...props}\n />\n );\n});\n\n/** Bouwt een minimale synthetische change-event zodat bestaande `onChange={(e)=>…e.target.value}` blijft werken. */\nfunction syntheticEvent(value: string) {\n return { target: { value }, currentTarget: { value } } as unknown as ChangeEvent<HTMLInputElement>;\n}\n\n/**\n * Tekstinvoer. text/email → Astryx TextInput; number → Astryx NumberInput; overige types\n * (datetime-local, search, …) → token-gestylede native input. Het label komt van het omliggende\n * `Field`; hier dus `isLabelHidden`.\n */\nexport const Input = forwardRef<HTMLInputElement, InputHTMLAttributes<HTMLInputElement>>(\n function Input({ className, style, type = \"text\", value, onChange, placeholder, ...rest }, ref) {\n const lbl = (rest[\"aria-label\"] as string) || placeholder || \"Veld\";\n if (type === \"number\") {\n return (\n <NumberInput\n ref={ref}\n label={lbl}\n isLabelHidden\n placeholder={placeholder}\n value={value === \"\" || value == null ? undefined : Number(value)}\n onChange={(n) => onChange?.(syntheticEvent(n == null ? \"\" : String(n)))}\n />\n );\n }\n if (type === \"text\" || type === \"email\" || type === \"password\") {\n return (\n <TextInput\n ref={ref}\n label={lbl}\n isLabelHidden\n type={type as \"text\" | \"email\" | \"password\"}\n placeholder={placeholder}\n value={String(value ?? \"\")}\n onChange={(v) => onChange?.(syntheticEvent(v))}\n />\n );\n }\n // datetime-local, search, url, file, … → native, in de Astryx-huisstijl getokeniseerd.\n return (\n <input\n ref={ref}\n type={type}\n value={value}\n onChange={onChange}\n placeholder={placeholder}\n className={cn(\"h-10 w-full px-3 text-sm outline-none focus:ring-2\", className)}\n style={{ ...controlStyle, ...style }}\n {...rest}\n />\n );\n },\n);\n\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaHTMLAttributes<HTMLTextAreaElement>>(\n function Textarea({ value, onChange, placeholder, rows = 4, \"aria-label\": ariaLabel, ...rest }, ref) {\n void rest;\n return (\n <TextArea\n ref={ref}\n label={(ariaLabel as string) || placeholder || \"Tekst\"}\n isLabelHidden\n rows={rows}\n placeholder={placeholder}\n value={String(value ?? \"\")}\n onChange={(v) =>\n onChange?.({ target: { value: v }, currentTarget: { value: v } } as unknown as ChangeEvent<HTMLTextAreaElement>)\n }\n />\n );\n },\n);\n\n/** Label-wrapper. Een `<div>` (geen `<label>`) zodat het geen geneste label vormt met de\n * Astryx-controls (die hun eigen, verborgen label dragen). */\nexport function Field({ label, children, hint }: { label: string; children: React.ReactNode; hint?: string }) {\n return (\n <div className=\"grid gap-1.5\">\n <span className=\"text-sm font-medium\" style={{ color: \"var(--color-text-primary)\" }}>{label}</span>\n {children}\n {hint && <span className=\"text-xs\" style={{ color: \"var(--color-text-secondary)\" }}>{hint}</span>}\n </div>\n );\n}\n\nexport function Card({ className, children }: { className?: string; children: React.ReactNode }) {\n return (\n <div\n className={cn(\"p-5\", className)}\n style={{ borderRadius: \"var(--radius-container, 14px)\", border: \"1px solid var(--color-border)\", background: \"var(--color-background-card)\" }}\n >\n {children}\n </div>\n );\n}\n\nexport function Badge({ children, tone = \"slate\" }: { children: React.ReactNode; tone?: \"slate\" | \"green\" | \"amber\" }) {\n const tones: Record<string, CSSProperties> = {\n slate: { background: \"var(--color-background-muted)\", color: \"var(--color-text-secondary)\" },\n green: { background: \"var(--color-background-green, #dcfce7)\", color: \"var(--color-text-green, #15803d)\" },\n amber: { background: \"var(--color-background-orange, #ffedd5)\", color: \"var(--color-text-orange, #c2410c)\" },\n };\n return (\n <span className=\"rounded-full px-2 py-0.5 text-xs font-medium\" style={tones[tone]}>\n {children}\n </span>\n );\n}\n"],"mappings":";AA0CI,cA0FA,YA1FA;AAxCJ,SAAS,kBAA0I;AACnJ,SAAS,UAAU;AACnB,SAAS,iBAAiB;AAC1B,SAAS,mBAAmB;AAC5B,SAAS,gBAAgB;AAazB,MAAM,gBAAgD;AAAA,EACpD,SAAS,EAAE,YAAY,uBAAuB,OAAO,+BAA+B;AAAA,EACpF,WAAW,EAAE,YAAY,iCAAiC,OAAO,6BAA6B,QAAQ,gCAAgC;AAAA,EACtI,OAAO,EAAE,YAAY,eAAe,OAAO,4BAA4B;AAAA,EACvE,QAAQ,EAAE,YAAY,+BAA+B,OAAO,OAAO;AACrE;AACA,MAAM,QAA8B;AAAA,EAClC,IAAI;AAAA,EACJ,IAAI;AACN;AAEA,MAAM,eAA8B;AAAA,EAClC,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,OAAO;AACT;AAEO,MAAM,SAAS,WAGpB,SAASA,QAAO,EAAE,WAAW,UAAU,WAAW,OAAO,MAAM,OAAO,GAAG,MAAM,GAAG,KAAK;AACvF,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA,MAAM,IAAI;AAAA,QACV;AAAA,MACF;AAAA,MACA,OAAO,EAAE,cAAc,8BAA8B,GAAG,cAAc,OAAO,GAAG,GAAG,MAAM;AAAA,MACxF,GAAG;AAAA;AAAA,EACN;AAEJ,CAAC;AAGD,SAAS,eAAe,OAAe;AACrC,SAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,eAAe,EAAE,MAAM,EAAE;AACvD;AAOO,MAAM,QAAQ;AAAA,EACnB,SAASC,OAAM,EAAE,WAAW,OAAO,OAAO,QAAQ,OAAO,UAAU,aAAa,GAAG,KAAK,GAAG,KAAK;AAC9F,UAAM,MAAO,KAAK,YAAY,KAAgB,eAAe;AAC7D,QAAI,SAAS,UAAU;AACrB,aACE;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,OAAO;AAAA,UACP,eAAa;AAAA,UACb;AAAA,UACA,OAAO,UAAU,MAAM,SAAS,OAAO,SAAY,OAAO,KAAK;AAAA,UAC/D,UAAU,CAAC,MAAM,WAAW,eAAe,KAAK,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC;AAAA;AAAA,MACxE;AAAA,IAEJ;AACA,QAAI,SAAS,UAAU,SAAS,WAAW,SAAS,YAAY;AAC9D,aACE;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,OAAO;AAAA,UACP,eAAa;AAAA,UACb;AAAA,UACA;AAAA,UACA,OAAO,OAAO,SAAS,EAAE;AAAA,UACzB,UAAU,CAAC,MAAM,WAAW,eAAe,CAAC,CAAC;AAAA;AAAA,MAC/C;AAAA,IAEJ;AAEA,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,WAAW,GAAG,sDAAsD,SAAS;AAAA,QAC7E,OAAO,EAAE,GAAG,cAAc,GAAG,MAAM;AAAA,QAClC,GAAG;AAAA;AAAA,IACN;AAAA,EAEJ;AACF;AAEO,MAAM,WAAW;AAAA,EACtB,SAASC,UAAS,EAAE,OAAO,UAAU,aAAa,OAAO,GAAG,cAAc,WAAW,GAAG,KAAK,GAAG,KAAK;AACnG,SAAK;AACL,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,OAAQ,aAAwB,eAAe;AAAA,QAC/C,eAAa;AAAA,QACb;AAAA,QACA;AAAA,QACA,OAAO,OAAO,SAAS,EAAE;AAAA,QACzB,UAAU,CAAC,MACT,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,eAAe,EAAE,OAAO,EAAE,EAAE,CAAgD;AAAA;AAAA,IAEnH;AAAA,EAEJ;AACF;AAIO,SAAS,MAAM,EAAE,OAAO,UAAU,KAAK,GAAgE;AAC5G,SACE,qBAAC,SAAI,WAAU,gBACb;AAAA,wBAAC,UAAK,WAAU,uBAAsB,OAAO,EAAE,OAAO,4BAA4B,GAAI,iBAAM;AAAA,IAC3F;AAAA,IACA,QAAQ,oBAAC,UAAK,WAAU,WAAU,OAAO,EAAE,OAAO,8BAA8B,GAAI,gBAAK;AAAA,KAC5F;AAEJ;AAEO,SAAS,KAAK,EAAE,WAAW,SAAS,GAAsD;AAC/F,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,OAAO,SAAS;AAAA,MAC9B,OAAO,EAAE,cAAc,iCAAiC,QAAQ,iCAAiC,YAAY,+BAA+B;AAAA,MAE3I;AAAA;AAAA,EACH;AAEJ;AAEO,SAAS,MAAM,EAAE,UAAU,OAAO,QAAQ,GAAsE;AACrH,QAAM,QAAuC;AAAA,IAC3C,OAAO,EAAE,YAAY,iCAAiC,OAAO,8BAA8B;AAAA,IAC3F,OAAO,EAAE,YAAY,0CAA0C,OAAO,mCAAmC;AAAA,IACzG,OAAO,EAAE,YAAY,2CAA2C,OAAO,oCAAoC;AAAA,EAC7G;AACA,SACE,oBAAC,UAAK,WAAU,gDAA+C,OAAO,MAAM,IAAI,GAC7E,UACH;AAEJ;","names":["Button","Input","Textarea"]}
1
+ {"version":3,"sources":["../../../src/admin/ui/primitives.tsx"],"sourcesContent":["\"use client\";\n\nimport { createContext, forwardRef, useContext, type ButtonHTMLAttributes, type ChangeEvent, type CSSProperties, type InputHTMLAttributes, type ReactNode, type TextareaHTMLAttributes } from \"react\";\nimport { cn } from \"./cn\";\nimport { TextInput } from \"@astryxdesign/core/TextInput\";\nimport { NumberInput } from \"@astryxdesign/core/NumberInput\";\nimport { TextArea } from \"@astryxdesign/core/TextArea\";\n\n/**\n * Admin-primitieven op het **Astryx design system**. Form-controls (Input/Textarea) renderen echte\n * Astryx-componenten; bijzondere input-types (datetime-local, file…) die Astryx niet kent vallen\n * robuust terug op een token-gestylede native input. Button/Card/Badge zijn token-gestyled (zelfde\n * Astryx-huisstijl) — bewust geen Astryx Button (die werkt op `label`/`clickAction` i.p.v. children/\n * onClick, wat de ~honderd editor-call-sites zou breken). De API blijft gelijk → robuust.\n */\n\ntype Variant = \"primary\" | \"secondary\" | \"ghost\" | \"danger\" | \"dangerGhost\";\ntype Size = \"sm\" | \"md\";\n\nconst VARIANT_STYLE: Record<Variant, CSSProperties> = {\n primary: { background: \"var(--color-accent)\", color: \"var(--color-on-accent, #fff)\" },\n secondary: { background: \"var(--color-background-muted)\", color: \"var(--color-text-primary)\", border: \"1px solid var(--color-border)\" },\n ghost: { background: \"transparent\", color: \"var(--color-text-primary)\" },\n danger: { background: \"var(--color-error, #dc2626)\", color: \"#fff\" },\n /** Verwijderen binnen een lijst (8.2): rustig, maar herkenbaar rood. Eén stijl i.p.v. drie. */\n dangerGhost: { background: \"transparent\", color: \"var(--color-error, #b91c1c)\" },\n};\nconst SIZES: Record<Size, string> = {\n sm: \"h-8 px-3 text-sm\",\n md: \"h-10 px-4 text-sm\",\n};\n\nconst controlStyle: CSSProperties = {\n borderRadius: \"var(--radius-element, 8px)\",\n border: \"1px solid var(--color-border)\",\n background: \"var(--color-background-body, #fff)\",\n color: \"var(--color-text-primary)\",\n};\n\nexport const Button = forwardRef<\n HTMLButtonElement,\n ButtonHTMLAttributes<HTMLButtonElement> & {\n variant?: Variant;\n size?: Size;\n /**\n * 8.12: bezig. Toont een draaiertje vóór het label en zet de knop uit — het label blijft staan.\n * Tot nu toe werd de tekst \"Bezig…\": de knop sprong van breedte en je zag niet meer wát er bezig was.\n */\n loading?: boolean;\n }\n>(function Button({ className, variant = \"primary\", size = \"md\", style, loading, disabled, children, ...props }, ref) {\n return (\n <button\n ref={ref}\n className={cn(\n \"xicms-admin-btn inline-flex items-center justify-center gap-2 font-medium transition-[filter] hover:brightness-95 disabled:cursor-not-allowed disabled:opacity-50\",\n SIZES[size],\n loading && \"disabled:opacity-80\",\n className,\n )}\n style={{ borderRadius: \"var(--radius-element, 8px)\", ...VARIANT_STYLE[variant], ...style }}\n disabled={disabled || loading}\n aria-busy={loading || undefined}\n {...props}\n >\n {loading && <span className=\"xicms-admin-spinner\" aria-hidden />}\n {children}\n </button>\n );\n});\n\n/**\n * Een lege lijst als uitnodiging (8.12): icoon, één zin en de eerste stap — in plaats van een kale\n * grijze regel \"Nog geen media.\" waar de klant niets mee kon.\n */\nexport function LegeStaat({ titel, tekst, actie }: { titel: string; tekst?: ReactNode; actie?: ReactNode }) {\n return (\n <div className=\"col-span-full grid justify-items-center gap-2 rounded-xl border border-dashed border-slate-300 px-4 py-8 text-center\">\n <span className=\"grid h-10 w-10 place-items-center rounded-full bg-slate-100 text-slate-500\" aria-hidden>\n <svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M4 7h16v12H4z M4 7l2-3h12l2 3 M9 12h6\" />\n </svg>\n </span>\n <p className=\"text-sm font-medium text-slate-700\">{titel}</p>\n {tekst && <p className=\"max-w-sm text-sm text-slate-500\">{tekst}</p>}\n {actie && <div className=\"mt-1\">{actie}</div>}\n </div>\n );\n}\n\n/** Bouwt een minimale synthetische change-event zodat bestaande `onChange={(e)=>…e.target.value}` blijft werken. */\nfunction syntheticEvent(value: string) {\n return { target: { value }, currentTarget: { value } } as unknown as ChangeEvent<HTMLInputElement>;\n}\n\n/**\n * Het label van het omliggende `Field` (8.0). Vroeger kregen controls `aria-label = placeholder ||\n * \"Veld\"`, dus een schermlezer hoorde \"Veld\" of \"bv. Over ons\" in plaats van \"Paginatitel\". Nu\n * geeft `Field` zijn label door en draagt de Astryx-control het als (visueel verborgen) label.\n */\nconst FieldLabelContext = createContext<string | null>(null);\nexport function useFieldLabel(fallback: string): string {\n return useContext(FieldLabelContext) ?? fallback;\n}\n\n/**\n * DOM-props die Astryx' inputs gewoon doorgeven (via BaseProps). Tot 8.0 gooiden `Input` en\n * `Textarea` álles behalve value/onChange/placeholder weg: `onBlur` (alt-tekst opslaan, adres\n * normaliseren), `readOnly` (previewlink), `disabled` en `className` deden stilletjes niets.\n */\ntype Doorgeef = Pick<\n InputHTMLAttributes<HTMLElement>,\n \"id\" | \"onBlur\" | \"onFocus\" | \"onKeyDown\" | \"onPaste\" | \"title\" | \"role\" | \"tabIndex\" | \"aria-describedby\" | \"aria-invalid\"\n>;\nfunction doorgeef(rest: Record<string, unknown>): Doorgeef & Record<`data-${string}`, unknown> {\n const uit: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(rest)) {\n if (v === undefined) continue;\n if ([\"id\", \"onBlur\", \"onFocus\", \"onKeyDown\", \"onPaste\", \"title\", \"role\", \"tabIndex\"].includes(k) || k.startsWith(\"aria-\") || k.startsWith(\"data-\")) {\n uit[k] = v;\n }\n }\n return uit as Doorgeef & Record<`data-${string}`, unknown>;\n}\n\n/**\n * Tekstinvoer. text/email/password → Astryx TextInput (meer types kent die niet); number → Astryx NumberInput;\n * overige types (tel, url, datetime-local, date, file, …) → token-gestylede native input. Het zichtbare label\n * komt van het omliggende `Field`; hier dus `isLabelHidden`.\n */\nconst TEXT_TYPES = new Set([\"text\", \"email\", \"password\"]);\n\nexport const Input = forwardRef<HTMLInputElement, InputHTMLAttributes<HTMLInputElement>>(\n function Input(\n { className, style, type = \"text\", value, onChange, placeholder, readOnly, disabled, required, name, autoFocus, autoComplete, maxLength, min, max, step, ...rest },\n ref,\n ) {\n const lbl = useFieldLabel((rest[\"aria-label\"] as string) || placeholder || \"Invoer\");\n const gemeen = {\n ref,\n label: lbl,\n isLabelHidden: true,\n placeholder,\n isReadOnly: readOnly || undefined,\n isDisabled: disabled || undefined,\n isRequired: required || undefined,\n htmlName: name,\n hasAutoFocus: autoFocus || undefined,\n autoComplete,\n containerClassName: className,\n containerStyle: style,\n ...doorgeef(rest),\n };\n if (type === \"number\") {\n const getal = (x: unknown) => (x === undefined || x === \"\" ? undefined : Number(x));\n return (\n <NumberInput\n {...gemeen}\n min={getal(min)}\n max={getal(max)}\n step={getal(step)}\n value={value === \"\" || value == null ? undefined : Number(value)}\n onChange={(n) => onChange?.(syntheticEvent(n == null ? \"\" : String(n)))}\n />\n );\n }\n if (TEXT_TYPES.has(type)) {\n return (\n <TextInput\n {...gemeen}\n type={type as \"text\" | \"email\" | \"password\"}\n value={String(value ?? \"\")}\n // TextInput kent geen maxLength; afkappen hier houdt dezelfde belofte.\n onChange={(v) => onChange?.(syntheticEvent(maxLength != null && maxLength >= 0 ? v.slice(0, maxLength) : v))}\n />\n );\n }\n // datetime-local, date, file, … → native, in de Astryx-huisstijl getokeniseerd.\n return (\n <input\n ref={ref}\n type={type}\n value={value}\n onChange={onChange}\n placeholder={placeholder}\n readOnly={readOnly}\n disabled={disabled}\n required={required}\n name={name}\n autoFocus={autoFocus}\n autoComplete={autoComplete}\n maxLength={maxLength}\n min={min}\n max={max}\n step={step}\n aria-label={lbl}\n className={cn(\"xicms-admin-native h-10 w-full px-3 text-sm\", className)}\n style={{ ...controlStyle, ...style }}\n {...rest}\n />\n );\n },\n);\n\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaHTMLAttributes<HTMLTextAreaElement>>(\n function Textarea(\n { value, onChange, placeholder, rows = 4, className, style, readOnly, disabled, required, name, autoFocus, autoComplete, maxLength, spellCheck, ...rest },\n ref,\n ) {\n const lbl = useFieldLabel((rest[\"aria-label\"] as string) || placeholder || \"Tekst\");\n return (\n <TextArea\n ref={ref}\n label={lbl}\n isLabelHidden\n rows={rows}\n placeholder={placeholder}\n isReadOnly={readOnly || undefined}\n isDisabled={disabled || undefined}\n isRequired={required || undefined}\n htmlName={name}\n hasAutoFocus={autoFocus || undefined}\n autoComplete={autoComplete}\n maxLength={maxLength}\n hasSpellCheck={spellCheck === undefined ? undefined : Boolean(spellCheck)}\n containerClassName={className}\n containerStyle={style}\n {...doorgeef(rest)}\n value={String(value ?? \"\")}\n // Astryx toont bij maxLength een teller, maar dwingt niet af; afkappen houdt de belofte.\n onChange={(raw) => {\n const v = maxLength != null && maxLength >= 0 ? raw.slice(0, maxLength) : raw;\n onChange?.({ target: { value: v }, currentTarget: { value: v } } as unknown as ChangeEvent<HTMLTextAreaElement>);\n }}\n />\n );\n },\n);\n\n/** Label-wrapper. Een `<div>` (geen `<label>`) zodat het geen geneste label vormt met de\n * Astryx-controls; het label gaat via context naar de control zelf (toegankelijke naam). */\nexport function Field({ label, children, hint }: { label: string; children: React.ReactNode; hint?: string }) {\n return (\n <div className=\"grid gap-1.5\">\n <span className=\"text-sm font-medium\" style={{ color: \"var(--color-text-primary)\" }} aria-hidden>\n {label}\n </span>\n <FieldLabelContext.Provider value={label}>{children}</FieldLabelContext.Provider>\n {hint && <span className=\"text-xs\" style={{ color: \"var(--color-text-secondary)\" }}>{hint}</span>}\n </div>\n );\n}\n\nexport function Card({ className, children }: { className?: string; children: React.ReactNode }) {\n return (\n <div\n className={cn(\"p-5\", className)}\n style={{ borderRadius: \"var(--radius-container, 14px)\", border: \"1px solid var(--color-border)\", background: \"var(--color-background-card)\" }}\n >\n {children}\n </div>\n );\n}\n\nexport function Badge({ children, tone = \"slate\" }: { children: React.ReactNode; tone?: \"slate\" | \"green\" | \"amber\" }) {\n const tones: Record<string, CSSProperties> = {\n slate: { background: \"var(--color-background-muted)\", color: \"var(--color-text-secondary)\" },\n green: { background: \"var(--color-background-green, #dcfce7)\", color: \"var(--color-text-green, #15803d)\" },\n amber: { background: \"var(--color-background-orange, #ffedd5)\", color: \"var(--color-text-orange, #c2410c)\" },\n };\n return (\n <span className=\"rounded-full px-2 py-0.5 text-xs font-medium\" style={tones[tone]}>\n {children}\n </span>\n );\n}\n"],"mappings":"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","names":["Button","Input","Textarea"]}
@@ -1,6 +1,7 @@
1
1
  "use client";
2
2
  import { jsx } from "react/jsx-runtime";
3
3
  import { Selector } from "@astryxdesign/core/Selector";
4
+ import { useFieldLabel } from "./primitives.js";
4
5
  function Select({
5
6
  value,
6
7
  onValueChange,
@@ -8,13 +9,15 @@ function Select({
8
9
  placeholder = "Kies\u2026",
9
10
  className
10
11
  }) {
12
+ const label = useFieldLabel(placeholder);
11
13
  return /* @__PURE__ */ jsx(
12
14
  Selector,
13
15
  {
14
- label: placeholder,
16
+ label,
15
17
  isLabelHidden: true,
16
18
  placeholder,
17
- className,
19
+ containerClassName: className,
20
+ presentation: "adaptive",
18
21
  options: options.map((o) => ({ value: o.value, label: o.label })),
19
22
  value,
20
23
  onChange: (v) => onValueChange(v ?? "")
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/admin/ui/select.tsx"],"sourcesContent":["\"use client\";\n\nimport { Selector } from \"@astryxdesign/core/Selector\";\n\n/** Admin-select op de Astryx Selector. API ongewijzigd (value/onValueChange/options). */\nexport function Select({\n value,\n onValueChange,\n options,\n placeholder = \"Kies…\",\n className,\n}: {\n value: string;\n onValueChange: (v: string) => void;\n options: { value: string; label: string }[];\n placeholder?: string;\n className?: string;\n}) {\n return (\n <Selector\n label={placeholder}\n isLabelHidden\n placeholder={placeholder}\n className={className}\n options={options.map((o) => ({ value: o.value, label: o.label }))}\n value={value}\n onChange={(v) => onValueChange((v as string) ?? \"\")}\n />\n );\n}\n"],"mappings":";AAmBI;AAjBJ,SAAS,gBAAgB;AAGlB,SAAS,OAAO;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd;AACF,GAMG;AACD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,MACP,eAAa;AAAA,MACb;AAAA,MACA;AAAA,MACA,SAAS,QAAQ,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,OAAO,EAAE,MAAM,EAAE;AAAA,MAChE;AAAA,MACA,UAAU,CAAC,MAAM,cAAe,KAAgB,EAAE;AAAA;AAAA,EACpD;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/admin/ui/select.tsx"],"sourcesContent":["\"use client\";\n\nimport { Selector } from \"@astryxdesign/core/Selector\";\nimport { useFieldLabel } from \"./primitives\";\n\n/** Admin-select op de Astryx Selector. API ongewijzigd (value/onValueChange/options). */\nexport function Select({\n value,\n onValueChange,\n options,\n placeholder = \"Kies…\",\n className,\n}: {\n value: string;\n onValueChange: (v: string) => void;\n options: { value: string; label: string }[];\n placeholder?: string;\n className?: string;\n}) {\n const label = useFieldLabel(placeholder);\n return (\n <Selector\n label={label}\n isLabelHidden\n placeholder={placeholder}\n containerClassName={className}\n // 0.7: op een telefoon opent de lijst als bottom sheet i.p.v. een klein dropdownmenu.\n presentation=\"adaptive\"\n options={options.map((o) => ({ value: o.value, label: o.label }))}\n value={value}\n onChange={(v) => onValueChange((v as string) ?? \"\")}\n />\n );\n}\n"],"mappings":";AAqBI;AAnBJ,SAAS,gBAAgB;AACzB,SAAS,qBAAqB;AAGvB,SAAS,OAAO;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd;AACF,GAMG;AACD,QAAM,QAAQ,cAAc,WAAW;AACvC,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,eAAa;AAAA,MACb;AAAA,MACA,oBAAoB;AAAA,MAEpB,cAAa;AAAA,MACb,SAAS,QAAQ,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,OAAO,EAAE,MAAM,EAAE;AAAA,MAChE;AAAA,MACA,UAAU,CAAC,MAAM,cAAe,KAAgB,EAAE;AAAA;AAAA,EACpD;AAEJ;","names":[]}
@@ -1,6 +1,8 @@
1
1
  /** Admin-switch op de Astryx Switch. API ongewijzigd (checked/onCheckedChange/label). */
2
- export declare function Switch({ checked, onCheckedChange, label, }: {
2
+ export declare function Switch({ checked, onCheckedChange, label, labelVerborgen, }: {
3
3
  checked: boolean;
4
4
  onCheckedChange: (v: boolean) => void;
5
5
  label?: string;
6
+ /** Label alleen voor schermlezers (bv. in een tabel waar de kolomkop het al zegt). */
7
+ labelVerborgen?: boolean;
6
8
  }): import("react").JSX.Element;
@@ -1,16 +1,19 @@
1
1
  "use client";
2
2
  import { jsx } from "react/jsx-runtime";
3
3
  import { Switch as AstryxSwitch } from "@astryxdesign/core/Switch";
4
+ import { useFieldLabel } from "./primitives.js";
4
5
  function Switch({
5
6
  checked,
6
7
  onCheckedChange,
7
- label
8
+ label,
9
+ labelVerborgen
8
10
  }) {
11
+ const veldLabel = useFieldLabel("Aan/uit");
9
12
  return /* @__PURE__ */ jsx(
10
13
  AstryxSwitch,
11
14
  {
12
- label: label ?? "Schakelaar",
13
- isLabelHidden: !label,
15
+ label: label ?? veldLabel,
16
+ isLabelHidden: !label || labelVerborgen,
14
17
  value: checked,
15
18
  onChange: (c) => onCheckedChange(c)
16
19
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/admin/ui/switch.tsx"],"sourcesContent":["\"use client\";\n\nimport { Switch as AstryxSwitch } from \"@astryxdesign/core/Switch\";\n\n/** Admin-switch op de Astryx Switch. API ongewijzigd (checked/onCheckedChange/label). */\nexport function Switch({\n checked,\n onCheckedChange,\n label,\n}: {\n checked: boolean;\n onCheckedChange: (v: boolean) => void;\n label?: string;\n}) {\n return (\n <AstryxSwitch\n label={label ?? \"Schakelaar\"}\n isLabelHidden={!label}\n value={checked}\n onChange={(c) => onCheckedChange(c)}\n />\n );\n}\n"],"mappings":";AAeI;AAbJ,SAAS,UAAU,oBAAoB;AAGhC,SAAS,OAAO;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,SAAS;AAAA,MAChB,eAAe,CAAC;AAAA,MAChB,OAAO;AAAA,MACP,UAAU,CAAC,MAAM,gBAAgB,CAAC;AAAA;AAAA,EACpC;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/admin/ui/switch.tsx"],"sourcesContent":["\"use client\";\n\nimport { Switch as AstryxSwitch } from \"@astryxdesign/core/Switch\";\nimport { useFieldLabel } from \"./primitives\";\n\n/** Admin-switch op de Astryx Switch. API ongewijzigd (checked/onCheckedChange/label). */\nexport function Switch({\n checked,\n onCheckedChange,\n label,\n labelVerborgen,\n}: {\n checked: boolean;\n onCheckedChange: (v: boolean) => void;\n label?: string;\n /** Label alleen voor schermlezers (bv. in een tabel waar de kolomkop het al zegt). */\n labelVerborgen?: boolean;\n}) {\n const veldLabel = useFieldLabel(\"Aan/uit\");\n return (\n <AstryxSwitch\n label={label ?? veldLabel}\n isLabelHidden={!label || labelVerborgen}\n value={checked}\n onChange={(c) => onCheckedChange(c)}\n />\n );\n}\n"],"mappings":";AAoBI;AAlBJ,SAAS,UAAU,oBAAoB;AACvC,SAAS,qBAAqB;AAGvB,SAAS,OAAO;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMG;AACD,QAAM,YAAY,cAAc,SAAS;AACzC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,SAAS;AAAA,MAChB,eAAe,CAAC,SAAS;AAAA,MACzB,OAAO;AAAA,MACP,UAAU,CAAC,MAAM,gBAAgB,CAAC;AAAA;AAAA,EACpC;AAEJ;","names":[]}
@@ -16,8 +16,9 @@ interface ToastApi {
16
16
  * `toast({title, description, tone})` blijft, zodat de editors ongewijzigd blijven. Fouten blijven
17
17
  * staan tot de gebruiker ze sluit (auto-hide uit); overige verdwijnen vanzelf.
18
18
  */
19
- export declare function ToastProvider({ children }: {
19
+ export declare function ToastProvider({ children, positie }: {
20
20
  children: ReactNode;
21
+ positie?: "bottomEnd" | "topEnd";
21
22
  }): import("react").JSX.Element;
22
23
  /**
23
24
  * `toast` MOET stabiel zijn over renders heen.
@@ -2,24 +2,30 @@
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import { useCallback, useMemo, useRef } from "react";
4
4
  import { useToast as useAstryxToast, ToastViewport } from "@astryxdesign/core/Toast";
5
- function ToastProvider({ children }) {
6
- return /* @__PURE__ */ jsx(ToastViewport, { position: "bottomEnd", maxVisible: 4, children });
5
+ import { Icon } from "./Icon.js";
6
+ import { foutNaarMens } from "../lib/foutNaarMens.js";
7
+ function ToastProvider({ children, positie = "bottomEnd" }) {
8
+ return /* @__PURE__ */ jsx(ToastViewport, { position: positie, maxVisible: 4, children });
7
9
  }
8
10
  function useToast() {
9
11
  const show = useAstryxToast();
10
12
  const showRef = useRef(show);
11
13
  showRef.current = show;
12
14
  const toast = useCallback(({ title, description, tone = "default", action }) => {
15
+ const uitleg = tone === "error" ? foutNaarMens(description) : description;
13
16
  showRef.current({
14
- body: /* @__PURE__ */ jsxs("span", { children: [
15
- /* @__PURE__ */ jsx("strong", { children: title }),
16
- description ? /* @__PURE__ */ jsx("span", { style: { display: "block", opacity: 0.8 }, children: description }) : null,
17
- action ? (
18
- // Eén optionele vervolg-actie in de melding zelf ("Bekijk als bezoeker →"): de melding
19
- // is precies het moment waarop die vraag leeft, en een knop sluit de mentale lus die
20
- // een instructie in prozavorm open laat staan.
21
- /* @__PURE__ */ jsx("button", { type: "button", className: "xicms-toast__actie", onClick: action.onClick, children: action.label })
22
- ) : null
17
+ body: /* @__PURE__ */ jsxs("span", { style: { display: "flex", gap: "0.6rem", alignItems: "flex-start" }, children: [
18
+ tone === "success" ? /* @__PURE__ */ jsx("span", { "aria-hidden": true, style: { color: "#16a34a", marginTop: 2 }, children: /* @__PURE__ */ jsx(Icon, { naam: "vink", grootte: 18 }) }) : null,
19
+ /* @__PURE__ */ jsxs("span", { children: [
20
+ /* @__PURE__ */ jsx("strong", { children: title }),
21
+ uitleg ? /* @__PURE__ */ jsx("span", { style: { display: "block", opacity: 0.8 }, children: uitleg }) : null,
22
+ action ? (
23
+ // Eén optionele vervolg-actie in de melding zelf ("Bekijk als bezoeker →"): de melding
24
+ // is precies het moment waarop die vraag leeft, en een knop sluit de mentale lus die
25
+ // een instructie in prozavorm open laat staan.
26
+ /* @__PURE__ */ jsx("button", { type: "button", className: "xicms-toast__actie", onClick: action.onClick, children: action.label })
27
+ ) : null
28
+ ] })
23
29
  ] }),
24
30
  type: tone === "error" ? "error" : "info",
25
31
  isAutoHide: tone !== "error" && !action
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/admin/ui/toast.tsx"],"sourcesContent":["\"use client\";\n\nimport { useCallback, useMemo, useRef, type ReactNode } from \"react\";\nimport { useToast as useAstryxToast, ToastViewport } from \"@astryxdesign/core/Toast\";\n\ntype ToastTone = \"default\" | \"success\" | \"error\";\ninterface ToastApi {\n toast: (t: { title: string; description?: string; tone?: ToastTone; action?: { label: string; onClick: () => void } }) => void;\n}\n\n/**\n * Admin-toasts op de **Astryx Toast** (ToastViewport + useToast). De bestaande API\n * `toast({title, description, tone})` blijft, zodat de editors ongewijzigd blijven. Fouten blijven\n * staan tot de gebruiker ze sluit (auto-hide uit); overige verdwijnen vanzelf.\n */\nexport function ToastProvider({ children }: { children: ReactNode }) {\n return (\n <ToastViewport position=\"bottomEnd\" maxVisible={4}>\n {children}\n </ToastViewport>\n );\n}\n\n/**\n * `toast` MOET stabiel zijn over renders heen.\n *\n * Dit gaf `{ toast: (t) => … }` terug — een nieuw object met een nieuwe functie bij ELKE render.\n * Op zichzelf onschuldig, tot je bedenkt dat drie effecten in het beheer `toast` in hun\n * afhankelijkheden hebben (de mediakiezer, de mediabeheerder en de visuele editor). Zo'n effect\n * draait dan bij elke render opnieuw, zet state, en die state veroorzaakt weer een render:\n * \"Maximum update depth exceeded\", en een pagina die niet meer laadt.\n *\n * Dat maakte de visuele editor onbruikbaar op élke pagina mét werkversie — daar hangt de\n * mediakiezer in de boom. Op een pagina zónder werkversie kwam de editor nooit zo ver, en precies\n * daarom kon dit lang onopgemerkt blijven: wie het probeerde op een lege pagina zag niets bijzonders.\n *\n * `show` komt uit Astryx en biedt geen garantie over zijn eigen stabiliteit; daarom via een ref, en\n * niet als afhankelijkheid. Anders verplaatsen we het probleem alleen maar één laag.\n */\nexport function useToast(): ToastApi {\n const show = useAstryxToast();\n const showRef = useRef(show);\n showRef.current = show;\n\n const toast = useCallback<ToastApi[\"toast\"]>(({ title, description, tone = \"default\", action }) => {\n showRef.current({\n body: (\n <span>\n <strong>{title}</strong>\n {description ? <span style={{ display: \"block\", opacity: 0.8 }}>{description}</span> : null}\n {action ? (\n // Eén optionele vervolg-actie in de melding zelf (\"Bekijk als bezoeker →\"): de melding\n // is precies het moment waarop die vraag leeft, en een knop sluit de mentale lus die\n // een instructie in prozavorm open laat staan.\n <button type=\"button\" className=\"xicms-toast__actie\" onClick={action.onClick}>\n {action.label}\n </button>\n ) : null}\n </span>\n ),\n type: tone === \"error\" ? \"error\" : \"info\",\n isAutoHide: tone !== \"error\" && !action,\n });\n }, []);\n\n return useMemo(() => ({ toast }), [toast]);\n}\n"],"mappings":";AAiBI,cA8BI,YA9BJ;AAfJ,SAAS,aAAa,SAAS,cAA8B;AAC7D,SAAS,YAAY,gBAAgB,qBAAqB;AAYnD,SAAS,cAAc,EAAE,SAAS,GAA4B;AACnE,SACE,oBAAC,iBAAc,UAAS,aAAY,YAAY,GAC7C,UACH;AAEJ;AAkBO,SAAS,WAAqB;AACnC,QAAM,OAAO,eAAe;AAC5B,QAAM,UAAU,OAAO,IAAI;AAC3B,UAAQ,UAAU;AAElB,QAAM,QAAQ,YAA+B,CAAC,EAAE,OAAO,aAAa,OAAO,WAAW,OAAO,MAAM;AACjG,YAAQ,QAAQ;AAAA,MACd,MACE,qBAAC,UACC;AAAA,4BAAC,YAAQ,iBAAM;AAAA,QACd,cAAc,oBAAC,UAAK,OAAO,EAAE,SAAS,SAAS,SAAS,IAAI,GAAI,uBAAY,IAAU;AAAA,QACtF;AAAA;AAAA;AAAA;AAAA,UAIC,oBAAC,YAAO,MAAK,UAAS,WAAU,sBAAqB,SAAS,OAAO,SAClE,iBAAO,OACV;AAAA,YACE;AAAA,SACN;AAAA,MAEF,MAAM,SAAS,UAAU,UAAU;AAAA,MACnC,YAAY,SAAS,WAAW,CAAC;AAAA,IACnC,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,SAAO,QAAQ,OAAO,EAAE,MAAM,IAAI,CAAC,KAAK,CAAC;AAC3C;","names":[]}
1
+ {"version":3,"sources":["../../../src/admin/ui/toast.tsx"],"sourcesContent":["\"use client\";\n\nimport { useCallback, useMemo, useRef, type ReactNode } from \"react\";\nimport { useToast as useAstryxToast, ToastViewport } from \"@astryxdesign/core/Toast\";\nimport { Icon } from \"./Icon\";\nimport { foutNaarMens } from \"../lib/foutNaarMens\";\n\ntype ToastTone = \"default\" | \"success\" | \"error\";\ninterface ToastApi {\n toast: (t: { title: string; description?: string; tone?: ToastTone; action?: { label: string; onClick: () => void } }) => void;\n}\n\n/**\n * Admin-toasts op de **Astryx Toast** (ToastViewport + useToast). De bestaande API\n * `toast({title, description, tone})` blijft, zodat de editors ongewijzigd blijven. Fouten blijven\n * staan tot de gebruiker ze sluit (auto-hide uit); overige verdwijnen vanzelf.\n */\nexport function ToastProvider({ children, positie = \"bottomEnd\" }: { children: ReactNode; positie?: \"bottomEnd\" | \"topEnd\" }) {\n return (\n <ToastViewport position={positie} maxVisible={4}>\n {children}\n </ToastViewport>\n );\n}\n\n/**\n * `toast` MOET stabiel zijn over renders heen.\n *\n * Dit gaf `{ toast: (t) => … }` terug — een nieuw object met een nieuwe functie bij ELKE render.\n * Op zichzelf onschuldig, tot je bedenkt dat drie effecten in het beheer `toast` in hun\n * afhankelijkheden hebben (de mediakiezer, de mediabeheerder en de visuele editor). Zo'n effect\n * draait dan bij elke render opnieuw, zet state, en die state veroorzaakt weer een render:\n * \"Maximum update depth exceeded\", en een pagina die niet meer laadt.\n *\n * Dat maakte de visuele editor onbruikbaar op élke pagina mét werkversie — daar hangt de\n * mediakiezer in de boom. Op een pagina zónder werkversie kwam de editor nooit zo ver, en precies\n * daarom kon dit lang onopgemerkt blijven: wie het probeerde op een lege pagina zag niets bijzonders.\n *\n * `show` komt uit Astryx en biedt geen garantie over zijn eigen stabiliteit; daarom via een ref, en\n * niet als afhankelijkheid. Anders verplaatsen we het probleem alleen maar één laag.\n */\nexport function useToast(): ToastApi {\n const show = useAstryxToast();\n const showRef = useRef(show);\n showRef.current = show;\n\n const toast = useCallback<ToastApi[\"toast\"]>(({ title, description, tone = \"default\", action }) => {\n // 8.12: technische (Firebase-)fouten in gewone woorden, op één plek voor het hele beheer.\n const uitleg = tone === \"error\" ? foutNaarMens(description) : description;\n showRef.current({\n body: (\n <span style={{ display: \"flex\", gap: \"0.6rem\", alignItems: \"flex-start\" }}>\n {/* Astryx kent alleen info/error; een geslaagde actie krijgt zijn eigen groene vinkje. */}\n {tone === \"success\" ? (\n <span aria-hidden style={{ color: \"#16a34a\", marginTop: 2 }}><Icon naam=\"vink\" grootte={18} /></span>\n ) : null}\n <span>\n <strong>{title}</strong>\n {uitleg ? <span style={{ display: \"block\", opacity: 0.8 }}>{uitleg}</span> : null}\n {action ? (\n // Eén optionele vervolg-actie in de melding zelf (\"Bekijk als bezoeker →\"): de melding\n // is precies het moment waarop die vraag leeft, en een knop sluit de mentale lus die\n // een instructie in prozavorm open laat staan.\n <button type=\"button\" className=\"xicms-toast__actie\" onClick={action.onClick}>\n {action.label}\n </button>\n ) : null}\n </span>\n </span>\n ),\n type: tone === \"error\" ? \"error\" : \"info\",\n isAutoHide: tone !== \"error\" && !action,\n });\n }, []);\n\n return useMemo(() => ({ toast }), [toast]);\n}\n"],"mappings":";AAmBI,cAqCM,YArCN;AAjBJ,SAAS,aAAa,SAAS,cAA8B;AAC7D,SAAS,YAAY,gBAAgB,qBAAqB;AAC1D,SAAS,YAAY;AACrB,SAAS,oBAAoB;AAYtB,SAAS,cAAc,EAAE,UAAU,UAAU,YAAY,GAA8D;AAC5H,SACE,oBAAC,iBAAc,UAAU,SAAS,YAAY,GAC3C,UACH;AAEJ;AAkBO,SAAS,WAAqB;AACnC,QAAM,OAAO,eAAe;AAC5B,QAAM,UAAU,OAAO,IAAI;AAC3B,UAAQ,UAAU;AAElB,QAAM,QAAQ,YAA+B,CAAC,EAAE,OAAO,aAAa,OAAO,WAAW,OAAO,MAAM;AAEjG,UAAM,SAAS,SAAS,UAAU,aAAa,WAAW,IAAI;AAC9D,YAAQ,QAAQ;AAAA,MACd,MACE,qBAAC,UAAK,OAAO,EAAE,SAAS,QAAQ,KAAK,UAAU,YAAY,aAAa,GAErE;AAAA,iBAAS,YACR,oBAAC,UAAK,eAAW,MAAC,OAAO,EAAE,OAAO,WAAW,WAAW,EAAE,GAAG,8BAAC,QAAK,MAAK,QAAO,SAAS,IAAI,GAAE,IAC5F;AAAA,QACJ,qBAAC,UACD;AAAA,8BAAC,YAAQ,iBAAM;AAAA,UACd,SAAS,oBAAC,UAAK,OAAO,EAAE,SAAS,SAAS,SAAS,IAAI,GAAI,kBAAO,IAAU;AAAA,UAC5E;AAAA;AAAA;AAAA;AAAA,YAIC,oBAAC,YAAO,MAAK,UAAS,WAAU,sBAAqB,SAAS,OAAO,SAClE,iBAAO,OACV;AAAA,cACE;AAAA,WACJ;AAAA,SACF;AAAA,MAEF,MAAM,SAAS,UAAU,UAAU;AAAA,MACnC,YAAY,SAAS,WAAW,CAAC;AAAA,IACnC,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,SAAO,QAAQ,OAAO,EAAE,MAAM,IAAI,CAAC,KAAK,CAAC;AAC3C;","names":[]}
@@ -0,0 +1,34 @@
1
+ import { type Pattern } from "../../patterns/index.js";
2
+ /**
3
+ * De blokkiezer (8.11): wat wil je hier toevoegen?
4
+ *
5
+ * Verving een platte keuzelijst van zo'n zestig namen. Nu: een zoekveld, groepen ("Over je bedrijf",
6
+ * "Contact en afspraken"), per blok één zin uitleg, en een tweede tabblad met kant-en-klare secties
7
+ * (de patronen) — die zaten achter een aparte knop in de zijbalk. Opent vanaf de "+" tussen twee
8
+ * blokken op de pagina én vanuit de zijbalk.
9
+ */
10
+ export declare function BlokKiezer({ open, onOpenChange, onBlok, onSectie, patterns, }: {
11
+ open: boolean;
12
+ onOpenChange: (v: boolean) => void;
13
+ onBlok: (type: string) => void;
14
+ onSectie: (blocks: Array<Record<string, unknown>>) => void;
15
+ patterns?: Pattern[];
16
+ }): import("react").JSX.Element | null;
17
+ /**
18
+ * Een "+" op de naad onder het blok waar je muis is: hier iets invoegen. Alleen voor blokken op het
19
+ * hoogste niveau van de pagina (`sleutels`), niet voor blokken in kolommen of tabbladen.
20
+ */
21
+ export declare function TussenPlus({ sleutels, onKies }: {
22
+ sleutels: string[];
23
+ onKies: (na: string) => void;
24
+ }): import("react").JSX.Element | null;
25
+ /**
26
+ * Kaders (8.11): een stippellijn met de naam rond het blok onder je muis, een doorgetrokken lijn
27
+ * rond het blok dat je bewerkt. Zonder kader was niet te zien waar een blok begon en eindigde — de
28
+ * CSS ervoor bestond nog uit de tijd van het canvas, maar niets gebruikte hem.
29
+ */
30
+ export declare function BlokKader({ sleutels, gekozen, labelVoor }: {
31
+ sleutels: string[];
32
+ gekozen: string | null;
33
+ labelVoor: (key: string) => string;
34
+ }): import("react").JSX.Element;