@xiwebdesign/xicms-core 7.13.0 → 7.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.
- package/dist/admin/lib/mediaUsage.d.ts +17 -0
- package/dist/admin/lib/mediaUsage.js +32 -1
- package/dist/admin/lib/mediaUsage.js.map +1 -1
- package/dist/admin/media/MediaManager.js +74 -17
- package/dist/admin/media/MediaManager.js.map +1 -1
- package/dist/admin/visual/VisualEditor.js +37 -3
- package/dist/admin/visual/VisualEditor.js.map +1 -1
- package/dist/blocks/BlockErrorBoundary.d.ts +1 -0
- package/dist/blocks/BlockErrorBoundary.js +4 -0
- package/dist/blocks/BlockErrorBoundary.js.map +1 -1
- package/dist/blocks/BlockRenderer.js +1 -1
- package/dist/blocks/BlockRenderer.js.map +1 -1
- package/dist/blocks/builtins/Accordion.d.ts +1 -2
- package/dist/blocks/builtins/Accordion.js +2 -39
- package/dist/blocks/builtins/Accordion.js.map +1 -1
- package/dist/blocks/builtins/AccordionRender.d.ts +7 -0
- package/dist/blocks/builtins/AccordionRender.js +42 -0
- package/dist/blocks/builtins/AccordionRender.js.map +1 -0
- package/dist/blocks/builtins/Agenda.d.ts +1 -29
- package/dist/blocks/builtins/Agenda.js +3 -94
- package/dist/blocks/builtins/Agenda.js.map +1 -1
- package/dist/blocks/builtins/AgendaRender.d.ts +34 -0
- package/dist/blocks/builtins/AgendaRender.js +96 -0
- package/dist/blocks/builtins/AgendaRender.js.map +1 -0
- package/dist/blocks/builtins/Banner.d.ts +1 -2
- package/dist/blocks/builtins/Banner.js +2 -32
- package/dist/blocks/builtins/Banner.js.map +1 -1
- package/dist/blocks/builtins/BannerRender.d.ts +11 -0
- package/dist/blocks/builtins/BannerRender.js +35 -0
- package/dist/blocks/builtins/BannerRender.js.map +1 -0
- package/dist/blocks/builtins/BeforeAfter.d.ts +1 -2
- package/dist/blocks/builtins/BeforeAfter.js +2 -31
- package/dist/blocks/builtins/BeforeAfter.js.map +1 -1
- package/dist/blocks/builtins/BeforeAfterRender.d.ts +11 -0
- package/dist/blocks/builtins/BeforeAfterRender.js +34 -0
- package/dist/blocks/builtins/BeforeAfterRender.js.map +1 -0
- package/dist/blocks/builtins/Booking.d.ts +1 -2
- package/dist/blocks/builtins/Booking.js +2 -14
- package/dist/blocks/builtins/Booking.js.map +1 -1
- package/dist/blocks/builtins/BookingRender.d.ts +8 -0
- package/dist/blocks/builtins/BookingRender.js +17 -0
- package/dist/blocks/builtins/BookingRender.js.map +1 -0
- package/dist/blocks/builtins/Breadcrumbs.d.ts +1 -10
- package/dist/blocks/builtins/Breadcrumbs.js +3 -69
- package/dist/blocks/builtins/Breadcrumbs.js.map +1 -1
- package/dist/blocks/builtins/BreadcrumbsRender.d.ts +18 -0
- package/dist/blocks/builtins/BreadcrumbsRender.js +71 -0
- package/dist/blocks/builtins/BreadcrumbsRender.js.map +1 -0
- package/dist/blocks/builtins/Cards.d.ts +1 -2
- package/dist/blocks/builtins/Cards.js +2 -74
- package/dist/blocks/builtins/Cards.js.map +1 -1
- package/dist/blocks/builtins/CardsRender.d.ts +7 -0
- package/dist/blocks/builtins/CardsRender.js +77 -0
- package/dist/blocks/builtins/CardsRender.js.map +1 -0
- package/dist/blocks/builtins/Columns.d.ts +1 -2
- package/dist/blocks/builtins/Columns.js +2 -9
- package/dist/blocks/builtins/Columns.js.map +1 -1
- package/dist/blocks/builtins/ColumnsRender.d.ts +6 -0
- package/dist/blocks/builtins/ColumnsRender.js +12 -0
- package/dist/blocks/builtins/ColumnsRender.js.map +1 -0
- package/dist/blocks/builtins/Contact.d.ts +2 -7
- package/dist/blocks/builtins/Contact.js +3 -102
- package/dist/blocks/builtins/Contact.js.map +1 -1
- package/dist/blocks/builtins/ContactRender.d.ts +9 -0
- package/dist/blocks/builtins/ContactRender.js +105 -0
- package/dist/blocks/builtins/ContactRender.js.map +1 -0
- package/dist/blocks/builtins/Countdown.d.ts +1 -18
- package/dist/blocks/builtins/Countdown.js +3 -53
- package/dist/blocks/builtins/Countdown.js.map +1 -1
- package/dist/blocks/builtins/CountdownRender.d.ts +22 -0
- package/dist/blocks/builtins/CountdownRender.js +55 -0
- package/dist/blocks/builtins/CountdownRender.js.map +1 -0
- package/dist/blocks/builtins/Cta.d.ts +1 -2
- package/dist/blocks/builtins/Cta.js +2 -39
- package/dist/blocks/builtins/Cta.js.map +1 -1
- package/dist/blocks/builtins/CtaRender.d.ts +6 -0
- package/dist/blocks/builtins/CtaRender.js +42 -0
- package/dist/blocks/builtins/CtaRender.js.map +1 -0
- package/dist/blocks/builtins/Downloads.d.ts +1 -2
- package/dist/blocks/builtins/Downloads.js +2 -16
- package/dist/blocks/builtins/Downloads.js.map +1 -1
- package/dist/blocks/builtins/DownloadsRender.d.ts +7 -0
- package/dist/blocks/builtins/DownloadsRender.js +19 -0
- package/dist/blocks/builtins/DownloadsRender.js.map +1 -0
- package/dist/blocks/builtins/Elements.d.ts +3 -4
- package/dist/blocks/builtins/Elements.js +4 -38
- package/dist/blocks/builtins/Elements.js.map +1 -1
- package/dist/blocks/builtins/ElementsRender.d.ts +10 -0
- package/dist/blocks/builtins/ElementsRender.js +41 -0
- package/dist/blocks/builtins/ElementsRender.js.map +1 -0
- package/dist/blocks/builtins/Embed.d.ts +1 -2
- package/dist/blocks/builtins/Embed.js +2 -19
- package/dist/blocks/builtins/Embed.js.map +1 -1
- package/dist/blocks/builtins/EmbedRender.d.ts +7 -0
- package/dist/blocks/builtins/EmbedRender.js +22 -0
- package/dist/blocks/builtins/EmbedRender.js.map +1 -0
- package/dist/blocks/builtins/Faq.d.ts +1 -6
- package/dist/blocks/builtins/Faq.js +3 -103
- package/dist/blocks/builtins/Faq.js.map +1 -1
- package/dist/blocks/builtins/FaqRender.d.ts +10 -0
- package/dist/blocks/builtins/FaqRender.js +105 -0
- package/dist/blocks/builtins/FaqRender.js.map +1 -0
- package/dist/blocks/builtins/FormBlock.d.ts +1 -2
- package/dist/blocks/builtins/FormBlock.js +2 -222
- package/dist/blocks/builtins/FormBlock.js.map +1 -1
- package/dist/blocks/builtins/FormBlockRender.d.ts +6 -0
- package/dist/blocks/builtins/FormBlockRender.js +225 -0
- package/dist/blocks/builtins/FormBlockRender.js.map +1 -0
- package/dist/blocks/builtins/Gallery.d.ts +1 -23
- package/dist/blocks/builtins/Gallery.js +2 -164
- package/dist/blocks/builtins/Gallery.js.map +1 -1
- package/dist/blocks/builtins/GalleryRender.d.ts +25 -0
- package/dist/blocks/builtins/GalleryRender.js +167 -0
- package/dist/blocks/builtins/GalleryRender.js.map +1 -0
- package/dist/blocks/builtins/Hero.d.ts +1 -2
- package/dist/blocks/builtins/Hero.js +2 -73
- package/dist/blocks/builtins/Hero.js.map +1 -1
- package/dist/blocks/builtins/HeroRender.d.ts +6 -0
- package/dist/blocks/builtins/HeroRender.js +76 -0
- package/dist/blocks/builtins/HeroRender.js.map +1 -0
- package/dist/blocks/builtins/ImageBlock.d.ts +1 -2
- package/dist/blocks/builtins/ImageBlock.js +2 -22
- package/dist/blocks/builtins/ImageBlock.js.map +1 -1
- package/dist/blocks/builtins/ImageBlockRender.d.ts +6 -0
- package/dist/blocks/builtins/ImageBlockRender.js +25 -0
- package/dist/blocks/builtins/ImageBlockRender.js.map +1 -0
- package/dist/blocks/builtins/Jobs.d.ts +1 -15
- package/dist/blocks/builtins/Jobs.js +3 -69
- package/dist/blocks/builtins/Jobs.js.map +1 -1
- package/dist/blocks/builtins/JobsRender.d.ts +17 -0
- package/dist/blocks/builtins/JobsRender.js +71 -0
- package/dist/blocks/builtins/JobsRender.js.map +1 -0
- package/dist/blocks/builtins/Layout.d.ts +2 -3
- package/dist/blocks/builtins/Layout.js +3 -39
- package/dist/blocks/builtins/Layout.js.map +1 -1
- package/dist/blocks/builtins/LayoutRender.d.ts +8 -0
- package/dist/blocks/builtins/LayoutRender.js +42 -0
- package/dist/blocks/builtins/LayoutRender.js.map +1 -0
- package/dist/blocks/builtins/MapBlock.d.ts +1 -2
- package/dist/blocks/builtins/MapBlock.js +2 -45
- package/dist/blocks/builtins/MapBlock.js.map +1 -1
- package/dist/blocks/builtins/MapBlockRender.d.ts +6 -0
- package/dist/blocks/builtins/MapBlockRender.js +48 -0
- package/dist/blocks/builtins/MapBlockRender.js.map +1 -0
- package/dist/blocks/builtins/NewsListBlock.d.ts +1 -2
- package/dist/blocks/builtins/NewsListBlock.js +2 -11
- package/dist/blocks/builtins/NewsListBlock.js.map +1 -1
- package/dist/blocks/builtins/NewsListBlockRender.d.ts +6 -0
- package/dist/blocks/builtins/NewsListBlockRender.js +14 -0
- package/dist/blocks/builtins/NewsListBlockRender.js.map +1 -0
- package/dist/blocks/builtins/Newsletter.d.ts +1 -2
- package/dist/blocks/builtins/Newsletter.js +2 -89
- package/dist/blocks/builtins/Newsletter.js.map +1 -1
- package/dist/blocks/builtins/NewsletterRender.d.ts +13 -0
- package/dist/blocks/builtins/NewsletterRender.js +92 -0
- package/dist/blocks/builtins/NewsletterRender.js.map +1 -0
- package/dist/blocks/builtins/OpeningHours.d.ts +1 -2
- package/dist/blocks/builtins/OpeningHours.js +2 -28
- package/dist/blocks/builtins/OpeningHours.js.map +1 -1
- package/dist/blocks/builtins/OpeningHoursRender.d.ts +7 -0
- package/dist/blocks/builtins/OpeningHoursRender.js +31 -0
- package/dist/blocks/builtins/OpeningHoursRender.js.map +1 -0
- package/dist/blocks/builtins/PdfBlock.d.ts +1 -2
- package/dist/blocks/builtins/PdfBlock.js +2 -76
- package/dist/blocks/builtins/PdfBlock.js.map +1 -1
- package/dist/blocks/builtins/PdfBlockRender.d.ts +11 -0
- package/dist/blocks/builtins/PdfBlockRender.js +79 -0
- package/dist/blocks/builtins/PdfBlockRender.js.map +1 -0
- package/dist/blocks/builtins/Portfolio.d.ts +1 -2
- package/dist/blocks/builtins/Portfolio.js +2 -75
- package/dist/blocks/builtins/Portfolio.js.map +1 -1
- package/dist/blocks/builtins/PortfolioRender.d.ts +7 -0
- package/dist/blocks/builtins/PortfolioRender.js +78 -0
- package/dist/blocks/builtins/PortfolioRender.js.map +1 -0
- package/dist/blocks/builtins/Pricing.d.ts +1 -8
- package/dist/blocks/builtins/Pricing.js +3 -73
- package/dist/blocks/builtins/Pricing.js.map +1 -1
- package/dist/blocks/builtins/PricingRender.d.ts +10 -0
- package/dist/blocks/builtins/PricingRender.js +75 -0
- package/dist/blocks/builtins/PricingRender.js.map +1 -0
- package/dist/blocks/builtins/RichTextBlock.d.ts +1 -2
- package/dist/blocks/builtins/RichTextBlock.js +2 -5
- package/dist/blocks/builtins/RichTextBlock.js.map +1 -1
- package/dist/blocks/builtins/RichTextBlockRender.d.ts +6 -0
- package/dist/blocks/builtins/RichTextBlockRender.js +8 -0
- package/dist/blocks/builtins/RichTextBlockRender.js.map +1 -0
- package/dist/blocks/builtins/Search.d.ts +1 -2
- package/dist/blocks/builtins/Search.js +2 -80
- package/dist/blocks/builtins/Search.js.map +1 -1
- package/dist/blocks/builtins/SearchRender.d.ts +7 -0
- package/dist/blocks/builtins/SearchRender.js +83 -0
- package/dist/blocks/builtins/SearchRender.js.map +1 -0
- package/dist/blocks/builtins/Sections.d.ts +4 -5
- package/dist/blocks/builtins/Sections.js +5 -142
- package/dist/blocks/builtins/Sections.js.map +1 -1
- package/dist/blocks/builtins/SectionsRender.d.ts +12 -0
- package/dist/blocks/builtins/SectionsRender.js +145 -0
- package/dist/blocks/builtins/SectionsRender.js.map +1 -0
- package/dist/blocks/builtins/Slider.d.ts +1 -2
- package/dist/blocks/builtins/Slider.js +2 -134
- package/dist/blocks/builtins/Slider.js.map +1 -1
- package/dist/blocks/builtins/SliderRender.d.ts +7 -0
- package/dist/blocks/builtins/SliderRender.js +137 -0
- package/dist/blocks/builtins/SliderRender.js.map +1 -0
- package/dist/blocks/builtins/Spacer.d.ts +1 -2
- package/dist/blocks/builtins/Spacer.js +2 -6
- package/dist/blocks/builtins/Spacer.js.map +1 -1
- package/dist/blocks/builtins/SpacerRender.d.ts +6 -0
- package/dist/blocks/builtins/SpacerRender.js +9 -0
- package/dist/blocks/builtins/SpacerRender.js.map +1 -0
- package/dist/blocks/builtins/SymbolRef.d.ts +1 -2
- package/dist/blocks/builtins/SymbolRef.js +2 -76
- package/dist/blocks/builtins/SymbolRef.js.map +1 -1
- package/dist/blocks/builtins/SymbolRefRender.d.ts +13 -0
- package/dist/blocks/builtins/SymbolRefRender.js +79 -0
- package/dist/blocks/builtins/SymbolRefRender.js.map +1 -0
- package/dist/blocks/builtins/Team.d.ts +1 -2
- package/dist/blocks/builtins/Team.js +2 -55
- package/dist/blocks/builtins/Team.js.map +1 -1
- package/dist/blocks/builtins/TeamRender.d.ts +7 -0
- package/dist/blocks/builtins/TeamRender.js +58 -0
- package/dist/blocks/builtins/TeamRender.js.map +1 -0
- package/dist/blocks/builtins/Testimonials.d.ts +1 -8
- package/dist/blocks/builtins/Testimonials.js +2 -69
- package/dist/blocks/builtins/Testimonials.js.map +1 -1
- package/dist/blocks/builtins/TestimonialsRender.d.ts +10 -0
- package/dist/blocks/builtins/TestimonialsRender.js +72 -0
- package/dist/blocks/builtins/TestimonialsRender.js.map +1 -0
- package/dist/blocks/builtins/Video.d.ts +1 -9
- package/dist/blocks/builtins/Video.js +2 -64
- package/dist/blocks/builtins/Video.js.map +1 -1
- package/dist/blocks/builtins/VideoRender.d.ts +10 -0
- package/dist/blocks/builtins/VideoRender.js +67 -0
- package/dist/blocks/builtins/VideoRender.js.map +1 -0
- package/dist/blocks/builtins/WhatsappChat.d.ts +1 -8
- package/dist/blocks/builtins/WhatsappChat.js +2 -37
- package/dist/blocks/builtins/WhatsappChat.js.map +1 -1
- package/dist/blocks/builtins/WhatsappChatRender.d.ts +17 -0
- package/dist/blocks/builtins/WhatsappChatRender.js +40 -0
- package/dist/blocks/builtins/WhatsappChatRender.js.map +1 -0
- package/dist/blocks/builtins/Widgets.d.ts +12 -13
- package/dist/blocks/builtins/Widgets.js +13 -175
- package/dist/blocks/builtins/Widgets.js.map +1 -1
- package/dist/blocks/builtins/WidgetsRender.d.ts +34 -0
- package/dist/blocks/builtins/WidgetsRender.js +178 -0
- package/dist/blocks/builtins/WidgetsRender.js.map +1 -0
- package/dist/blocks/reportRenderFout.d.ts +13 -0
- package/dist/blocks/reportRenderFout.js +31 -0
- package/dist/blocks/reportRenderFout.js.map +1 -0
- package/dist/modules/contract.js +2 -1
- package/dist/modules/contract.js.map +1 -1
- package/dist/modules/shop/blocks/Cart.js +1 -2
- package/dist/modules/shop/blocks/Cart.js.map +1 -1
- package/dist/modules/shop/blocks/Checkout.js +1 -2
- package/dist/modules/shop/blocks/Checkout.js.map +1 -1
- package/dist/modules/shop/blocks/Donation.js +1 -2
- package/dist/modules/shop/blocks/Donation.js.map +1 -1
- package/dist/modules/shop/blocks/OrderStatus.js +0 -2
- package/dist/modules/shop/blocks/OrderStatus.js.map +1 -1
- package/dist/modules/shop/blocks/ProductDetail.js +1 -7
- package/dist/modules/shop/blocks/ProductDetail.js.map +1 -1
- package/dist/modules/shop/blocks/ProductGrid.js +1 -2
- package/dist/modules/shop/blocks/ProductGrid.js.map +1 -1
- package/dist/modules/shop/blocks/ShopCategories.js +0 -2
- package/dist/modules/shop/blocks/ShopCategories.js.map +1 -1
- package/dist/modules/shop/module.js +1 -0
- package/dist/modules/shop/module.js.map +1 -1
- package/dist/modules/shop/schemas.d.ts +1 -0
- package/dist/modules/shop/schemas.js +32 -0
- package/dist/modules/shop/schemas.js.map +1 -0
- package/dist/modules/types.d.ts +6 -0
- package/dist/schema/shop.d.ts +1 -11
- package/dist/schema/shop.js +1 -20
- package/dist/schema/shop.js.map +1 -1
- package/dist/schema/shopGeld.d.ts +18 -0
- package/dist/schema/shopGeld.js +27 -0
- package/dist/schema/shopGeld.js.map +1 -0
- package/dist/styles.css +17 -0
- package/dist/version.js +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useEffect, useState } from "react";
|
|
4
|
+
function storageKey(block) {
|
|
5
|
+
return `xicms-banner:${block._key}${block.dismissVersion ? `:${block.dismissVersion}` : ""}`;
|
|
6
|
+
}
|
|
7
|
+
function BannerRender({ block, mode }) {
|
|
8
|
+
const [closed, setClosed] = useState(false);
|
|
9
|
+
useEffect(() => {
|
|
10
|
+
if (mode === "preview" || !block.dismissible) return;
|
|
11
|
+
try {
|
|
12
|
+
if (window.localStorage.getItem(storageKey(block)) === "1") setClosed(true);
|
|
13
|
+
} catch {
|
|
14
|
+
}
|
|
15
|
+
}, [block, mode]);
|
|
16
|
+
const dismiss = () => {
|
|
17
|
+
setClosed(true);
|
|
18
|
+
try {
|
|
19
|
+
window.localStorage.setItem(storageKey(block), "1");
|
|
20
|
+
} catch {
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
if (!block.text || closed && mode !== "preview") return null;
|
|
24
|
+
return /* @__PURE__ */ jsxs("div", { className: "xicms-banner", "data-tone": block.tone, role: "region", "aria-label": "Aankondiging", children: [
|
|
25
|
+
/* @__PURE__ */ jsxs("span", { children: [
|
|
26
|
+
/* @__PURE__ */ jsx("span", { "data-xicms-edit": "text", children: block.text }),
|
|
27
|
+
block.href && /* @__PURE__ */ jsx("a", { className: "xicms-banner__link", href: block.href, "data-xicms-edit": "linkLabel", children: block.linkLabel ?? "Meer" })
|
|
28
|
+
] }),
|
|
29
|
+
block.dismissible && /* @__PURE__ */ jsx("button", { type: "button", className: "xicms-banner__close", "aria-label": "Sluiten", onClick: dismiss, children: "\u2715" })
|
|
30
|
+
] });
|
|
31
|
+
}
|
|
32
|
+
export {
|
|
33
|
+
BannerRender
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=BannerRender.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/blocks/builtins/BannerRender.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport type { z } from \"zod\";\nimport type { BannerBlockSchema } from \"../../schema/blocks\";\nimport type { BlockRenderProps } from \"../registry\";\n\ntype Banner = z.infer<typeof BannerBlockSchema>;\n\n/** Sleutel per blok (+ optionele versie): wegklikken onthouden we per banner-inhoud. */\nfunction storageKey(block: Banner): string {\n return `xicms-banner:${block._key}${block.dismissVersion ? `:${block.dismissVersion}` : \"\"}`;\n}\n\n/**\n * Aankondigingsbalk, optioneel sluitbaar. Wegklikken wordt in localStorage onthouden (per blok +\n * `dismissVersion`), zodat de balk niet bij elke paginaweergave terugkomt. In de editor-preview\n * tonen we hem altijd (anders kan een editor zijn eigen weggeklikte banner niet meer bewerken).\n */\nexport function BannerRender({ block, mode }: BlockRenderProps<Banner>) {\n const [closed, setClosed] = useState(false);\n\n // localStorage pas na mount lezen (SSR-veilig; voorkomt hydration-mismatch).\n useEffect(() => {\n if (mode === \"preview\" || !block.dismissible) return;\n try {\n if (window.localStorage.getItem(storageKey(block)) === \"1\") setClosed(true);\n } catch {\n /* opslag onbeschikbaar: banner gewoon tonen */\n }\n }, [block, mode]);\n\n const dismiss = () => {\n setClosed(true);\n try {\n window.localStorage.setItem(storageKey(block), \"1\");\n } catch {\n /* opslag geweigerd: sluiten geldt dan alleen voor deze weergave */\n }\n };\n\n if (!block.text || (closed && mode !== \"preview\")) return null;\n return (\n <div className=\"xicms-banner\" data-tone={block.tone} role=\"region\" aria-label=\"Aankondiging\">\n <span>\n <span data-xicms-edit=\"text\">{block.text}</span>\n {block.href && (\n <a className=\"xicms-banner__link\" href={block.href} data-xicms-edit=\"linkLabel\">\n {block.linkLabel ?? \"Meer\"}\n </a>\n )}\n </span>\n {block.dismissible && (\n <button type=\"button\" className=\"xicms-banner__close\" aria-label=\"Sluiten\" onClick={dismiss}>\n ✕\n </button>\n )}\n </div>\n );\n}\n"],"mappings":";AA4CM,SACE,KADF;AA1CN,SAAS,WAAW,gBAAgB;AAQpC,SAAS,WAAW,OAAuB;AACzC,SAAO,gBAAgB,MAAM,IAAI,GAAG,MAAM,iBAAiB,IAAI,MAAM,cAAc,KAAK,EAAE;AAC5F;AAOO,SAAS,aAAa,EAAE,OAAO,KAAK,GAA6B;AACtE,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,KAAK;AAG1C,YAAU,MAAM;AACd,QAAI,SAAS,aAAa,CAAC,MAAM,YAAa;AAC9C,QAAI;AACF,UAAI,OAAO,aAAa,QAAQ,WAAW,KAAK,CAAC,MAAM,IAAK,WAAU,IAAI;AAAA,IAC5E,QAAQ;AAAA,IAER;AAAA,EACF,GAAG,CAAC,OAAO,IAAI,CAAC;AAEhB,QAAM,UAAU,MAAM;AACpB,cAAU,IAAI;AACd,QAAI;AACF,aAAO,aAAa,QAAQ,WAAW,KAAK,GAAG,GAAG;AAAA,IACpD,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,MAAI,CAAC,MAAM,QAAS,UAAU,SAAS,UAAY,QAAO;AAC1D,SACE,qBAAC,SAAI,WAAU,gBAAe,aAAW,MAAM,MAAM,MAAK,UAAS,cAAW,gBAC5E;AAAA,yBAAC,UACC;AAAA,0BAAC,UAAK,mBAAgB,QAAQ,gBAAM,MAAK;AAAA,MACxC,MAAM,QACL,oBAAC,OAAE,WAAU,sBAAqB,MAAM,MAAM,MAAM,mBAAgB,aACjE,gBAAM,aAAa,QACtB;AAAA,OAEJ;AAAA,IACC,MAAM,eACL,oBAAC,YAAO,MAAK,UAAS,WAAU,uBAAsB,cAAW,WAAU,SAAS,SAAS,oBAE7F;AAAA,KAEJ;AAEJ;","names":[]}
|
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
export declare const beforeAfterBlock: import("../index.js").BlockDefinition<z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
|
|
1
|
+
export declare const beforeAfterBlock: import("../index.js").BlockDefinition<import("zod/v4/core").$ZodType<unknown, unknown, import("zod/v4/core").$ZodTypeInternals<unknown, unknown>>>;
|
|
@@ -1,38 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
-
import { useState } from "react";
|
|
1
|
+
import dynamic from "next/dynamic";
|
|
4
2
|
import { defineBlock } from "../registry.js";
|
|
5
|
-
function BeforeAfterRender({ block }) {
|
|
6
|
-
const [pos, setPos] = useState(50);
|
|
7
|
-
if (!block.beforeUrl || !block.afterUrl) return null;
|
|
8
|
-
return /* @__PURE__ */ jsxs("figure", { className: "xicms-beforeafter", style: { aspectRatio: block.aspectRatio.replace("/", " / ") }, children: [
|
|
9
|
-
block.heading && /* @__PURE__ */ jsx("figcaption", { className: "xicms-beforeafter__heading", "data-xicms-edit": "heading", children: block.heading }),
|
|
10
|
-
/* @__PURE__ */ jsxs("div", { className: "xicms-beforeafter__stage", children: [
|
|
11
|
-
/* @__PURE__ */ jsx("img", { className: "xicms-beforeafter__img", src: block.beforeUrl, alt: block.alt || block.beforeLabel, loading: "lazy" }),
|
|
12
|
-
/* @__PURE__ */ jsx("div", { className: "xicms-beforeafter__clip", style: { clipPath: `inset(0 0 0 ${pos}%)` }, "aria-hidden": true, children: /* @__PURE__ */ jsx("img", { className: "xicms-beforeafter__img", src: block.afterUrl, alt: "", loading: "lazy" }) }),
|
|
13
|
-
/* @__PURE__ */ jsx("div", { className: "xicms-beforeafter__divider", style: { left: `${pos}%` }, "aria-hidden": true, children: /* @__PURE__ */ jsx("span", { className: "xicms-beforeafter__handle", children: "\u27E8\u27E9" }) }),
|
|
14
|
-
/* @__PURE__ */ jsx("span", { className: "xicms-beforeafter__badge xicms-beforeafter__badge--before", "data-xicms-edit": "beforeLabel", children: block.beforeLabel }),
|
|
15
|
-
/* @__PURE__ */ jsx("span", { className: "xicms-beforeafter__badge xicms-beforeafter__badge--after", "data-xicms-edit": "afterLabel", children: block.afterLabel }),
|
|
16
|
-
/* @__PURE__ */ jsx(
|
|
17
|
-
"input",
|
|
18
|
-
{
|
|
19
|
-
className: "xicms-beforeafter__range",
|
|
20
|
-
type: "range",
|
|
21
|
-
min: 0,
|
|
22
|
-
max: 100,
|
|
23
|
-
value: pos,
|
|
24
|
-
onChange: (e) => setPos(Number(e.target.value)),
|
|
25
|
-
"aria-label": `Vergelijk ${block.beforeLabel} en ${block.afterLabel}`,
|
|
26
|
-
"aria-valuetext": `${pos}% ${block.afterLabel}`
|
|
27
|
-
}
|
|
28
|
-
)
|
|
29
|
-
] })
|
|
30
|
-
] });
|
|
31
|
-
}
|
|
32
3
|
const beforeAfterBlock = defineBlock({
|
|
33
4
|
type: "beforeAfter",
|
|
34
5
|
fields: { beforeUrl: { type: "image" }, afterUrl: { type: "image" } },
|
|
35
|
-
Render: BeforeAfterRender,
|
|
6
|
+
Render: dynamic(() => import("./BeforeAfterRender.js").then((m) => m.BeforeAfterRender)),
|
|
36
7
|
label: "Voor / na",
|
|
37
8
|
icon: "\u{1F500}",
|
|
38
9
|
defaults: () => ({ beforeUrl: "", afterUrl: "", beforeLabel: "Voor", afterLabel: "Na", aspectRatio: "4/3" })
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/blocks/builtins/BeforeAfter.tsx"],"sourcesContent":["
|
|
1
|
+
{"version":3,"sources":["../../../src/blocks/builtins/BeforeAfter.tsx"],"sourcesContent":["import dynamic from \"next/dynamic\";\nimport { defineBlock } from \"../registry\";\n\nexport const beforeAfterBlock = defineBlock({\n type: \"beforeAfter\",\n fields: { beforeUrl: { type: \"image\" }, afterUrl: { type: \"image\" } },\n Render: dynamic(() => import(\"./BeforeAfterRender\").then((m) => m.BeforeAfterRender)),\n label: \"Voor / na\",\n icon: \"🔀\",\n defaults: () => ({ beforeUrl: \"\", afterUrl: \"\", beforeLabel: \"Voor\", afterLabel: \"Na\", aspectRatio: \"4/3\" }),\n});\n"],"mappings":"AAAA,OAAO,aAAa;AACpB,SAAS,mBAAmB;AAErB,MAAM,mBAAmB,YAAY;AAAA,EAC1C,MAAM;AAAA,EACN,QAAQ,EAAE,WAAW,EAAE,MAAM,QAAQ,GAAG,UAAU,EAAE,MAAM,QAAQ,EAAE;AAAA,EACpE,QAAQ,QAAQ,MAAM,OAAO,qBAAqB,EAAE,KAAK,CAAC,MAAM,EAAE,iBAAiB,CAAC;AAAA,EACpF,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU,OAAO,EAAE,WAAW,IAAI,UAAU,IAAI,aAAa,QAAQ,YAAY,MAAM,aAAa,MAAM;AAC5G,CAAC;","names":[]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { z } from "zod";
|
|
2
|
+
import type { BeforeAfterBlockSchema } from "../../schema/blocks.js";
|
|
3
|
+
import type { BlockRenderProps } from "../registry.js";
|
|
4
|
+
type BeforeAfter = z.infer<typeof BeforeAfterBlockSchema>;
|
|
5
|
+
/**
|
|
6
|
+
* Voor/na-vergelijker: het "na"-beeld wordt geclipt op de sleppositie. De greep is een échte
|
|
7
|
+
* range-input (over de hele breedte, transparant) — slepen, klikken én pijltjestoetsen werken
|
|
8
|
+
* daarmee gratis en toegankelijk (aria-label + waarde in %).
|
|
9
|
+
*/
|
|
10
|
+
export declare function BeforeAfterRender({ block }: BlockRenderProps<BeforeAfter>): import("react").JSX.Element | null;
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
function BeforeAfterRender({ block }) {
|
|
5
|
+
const [pos, setPos] = useState(50);
|
|
6
|
+
if (!block.beforeUrl || !block.afterUrl) return null;
|
|
7
|
+
return /* @__PURE__ */ jsxs("figure", { className: "xicms-beforeafter", style: { aspectRatio: block.aspectRatio.replace("/", " / ") }, children: [
|
|
8
|
+
block.heading && /* @__PURE__ */ jsx("figcaption", { className: "xicms-beforeafter__heading", "data-xicms-edit": "heading", children: block.heading }),
|
|
9
|
+
/* @__PURE__ */ jsxs("div", { className: "xicms-beforeafter__stage", children: [
|
|
10
|
+
/* @__PURE__ */ jsx("img", { className: "xicms-beforeafter__img", src: block.beforeUrl, alt: block.alt || block.beforeLabel, loading: "lazy" }),
|
|
11
|
+
/* @__PURE__ */ jsx("div", { className: "xicms-beforeafter__clip", style: { clipPath: `inset(0 0 0 ${pos}%)` }, "aria-hidden": true, children: /* @__PURE__ */ jsx("img", { className: "xicms-beforeafter__img", src: block.afterUrl, alt: "", loading: "lazy" }) }),
|
|
12
|
+
/* @__PURE__ */ jsx("div", { className: "xicms-beforeafter__divider", style: { left: `${pos}%` }, "aria-hidden": true, children: /* @__PURE__ */ jsx("span", { className: "xicms-beforeafter__handle", children: "\u27E8\u27E9" }) }),
|
|
13
|
+
/* @__PURE__ */ jsx("span", { className: "xicms-beforeafter__badge xicms-beforeafter__badge--before", "data-xicms-edit": "beforeLabel", children: block.beforeLabel }),
|
|
14
|
+
/* @__PURE__ */ jsx("span", { className: "xicms-beforeafter__badge xicms-beforeafter__badge--after", "data-xicms-edit": "afterLabel", children: block.afterLabel }),
|
|
15
|
+
/* @__PURE__ */ jsx(
|
|
16
|
+
"input",
|
|
17
|
+
{
|
|
18
|
+
className: "xicms-beforeafter__range",
|
|
19
|
+
type: "range",
|
|
20
|
+
min: 0,
|
|
21
|
+
max: 100,
|
|
22
|
+
value: pos,
|
|
23
|
+
onChange: (e) => setPos(Number(e.target.value)),
|
|
24
|
+
"aria-label": `Vergelijk ${block.beforeLabel} en ${block.afterLabel}`,
|
|
25
|
+
"aria-valuetext": `${pos}% ${block.afterLabel}`
|
|
26
|
+
}
|
|
27
|
+
)
|
|
28
|
+
] })
|
|
29
|
+
] });
|
|
30
|
+
}
|
|
31
|
+
export {
|
|
32
|
+
BeforeAfterRender
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=BeforeAfterRender.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/blocks/builtins/BeforeAfterRender.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport type { z } from \"zod\";\nimport type { BeforeAfterBlockSchema } from \"../../schema/blocks\";\nimport type { BlockRenderProps } from \"../registry\";\n\ntype BeforeAfter = z.infer<typeof BeforeAfterBlockSchema>;\n\n/**\n * Voor/na-vergelijker: het \"na\"-beeld wordt geclipt op de sleppositie. De greep is een échte\n * range-input (over de hele breedte, transparant) — slepen, klikken én pijltjestoetsen werken\n * daarmee gratis en toegankelijk (aria-label + waarde in %).\n */\nexport function BeforeAfterRender({ block }: BlockRenderProps<BeforeAfter>) {\n const [pos, setPos] = useState(50);\n if (!block.beforeUrl || !block.afterUrl) return null;\n return (\n <figure className=\"xicms-beforeafter\" style={{ aspectRatio: block.aspectRatio.replace(\"/\", \" / \") }}>\n {block.heading && <figcaption className=\"xicms-beforeafter__heading\" data-xicms-edit=\"heading\">{block.heading}</figcaption>}\n <div className=\"xicms-beforeafter__stage\">\n {/* eslint-disable-next-line @next/next/no-img-element */}\n <img className=\"xicms-beforeafter__img\" src={block.beforeUrl} alt={block.alt || block.beforeLabel} loading=\"lazy\" />\n <div className=\"xicms-beforeafter__clip\" style={{ clipPath: `inset(0 0 0 ${pos}%)` }} aria-hidden>\n {/* eslint-disable-next-line @next/next/no-img-element */}\n <img className=\"xicms-beforeafter__img\" src={block.afterUrl} alt=\"\" loading=\"lazy\" />\n </div>\n <div className=\"xicms-beforeafter__divider\" style={{ left: `${pos}%` }} aria-hidden>\n <span className=\"xicms-beforeafter__handle\">⟨⟩</span>\n </div>\n <span className=\"xicms-beforeafter__badge xicms-beforeafter__badge--before\" data-xicms-edit=\"beforeLabel\">{block.beforeLabel}</span>\n <span className=\"xicms-beforeafter__badge xicms-beforeafter__badge--after\" data-xicms-edit=\"afterLabel\">{block.afterLabel}</span>\n <input\n className=\"xicms-beforeafter__range\"\n type=\"range\"\n min={0}\n max={100}\n value={pos}\n onChange={(e) => setPos(Number(e.target.value))}\n aria-label={`Vergelijk ${block.beforeLabel} en ${block.afterLabel}`}\n aria-valuetext={`${pos}% ${block.afterLabel}`}\n />\n </div>\n </figure>\n );\n}\n"],"mappings":";AAmBwB,cAClB,YADkB;AAjBxB,SAAS,gBAAgB;AAYlB,SAAS,kBAAkB,EAAE,MAAM,GAAkC;AAC1E,QAAM,CAAC,KAAK,MAAM,IAAI,SAAS,EAAE;AACjC,MAAI,CAAC,MAAM,aAAa,CAAC,MAAM,SAAU,QAAO;AAChD,SACE,qBAAC,YAAO,WAAU,qBAAoB,OAAO,EAAE,aAAa,MAAM,YAAY,QAAQ,KAAK,KAAK,EAAE,GAC/F;AAAA,UAAM,WAAW,oBAAC,gBAAW,WAAU,8BAA6B,mBAAgB,WAAW,gBAAM,SAAQ;AAAA,IAC9G,qBAAC,SAAI,WAAU,4BAEb;AAAA,0BAAC,SAAI,WAAU,0BAAyB,KAAK,MAAM,WAAW,KAAK,MAAM,OAAO,MAAM,aAAa,SAAQ,QAAO;AAAA,MAClH,oBAAC,SAAI,WAAU,2BAA0B,OAAO,EAAE,UAAU,eAAe,GAAG,KAAK,GAAG,eAAW,MAE/F,8BAAC,SAAI,WAAU,0BAAyB,KAAK,MAAM,UAAU,KAAI,IAAG,SAAQ,QAAO,GACrF;AAAA,MACA,oBAAC,SAAI,WAAU,8BAA6B,OAAO,EAAE,MAAM,GAAG,GAAG,IAAI,GAAG,eAAW,MACjF,8BAAC,UAAK,WAAU,6BAA4B,0BAAE,GAChD;AAAA,MACA,oBAAC,UAAK,WAAU,6DAA4D,mBAAgB,eAAe,gBAAM,aAAY;AAAA,MAC7H,oBAAC,UAAK,WAAU,4DAA2D,mBAAgB,cAAc,gBAAM,YAAW;AAAA,MAC1H;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,MAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,UACL,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,OAAO,OAAO,EAAE,OAAO,KAAK,CAAC;AAAA,UAC9C,cAAY,aAAa,MAAM,WAAW,OAAO,MAAM,UAAU;AAAA,UACjE,kBAAgB,GAAG,GAAG,KAAK,MAAM,UAAU;AAAA;AAAA,MAC7C;AAAA,OACF;AAAA,KACF;AAEJ;","names":[]}
|
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
export declare const bookingBlock: import("../index.js").BlockDefinition<z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
|
|
1
|
+
export declare const bookingBlock: import("../index.js").BlockDefinition<import("zod/v4/core").$ZodType<unknown, unknown, import("zod/v4/core").$ZodTypeInternals<unknown, unknown>>>;
|
|
@@ -1,20 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
import { jsx, jsxs } from "react/jsx-runtime";
|
|
1
|
+
import dynamic from "next/dynamic";
|
|
3
2
|
import { defineBlock } from "../registry.js";
|
|
4
|
-
import { Heading } from "../ui/index.js";
|
|
5
|
-
import { ConsentEmbed } from "./consentEmbed.js";
|
|
6
|
-
import { buildBookingUrl } from "./lib/bookingUrl.js";
|
|
7
|
-
function BookingRender({ block, mode }) {
|
|
8
|
-
const src = buildBookingUrl(block.provider ?? "custom", block.embedUrl);
|
|
9
|
-
if (!src) return null;
|
|
10
|
-
return /* @__PURE__ */ jsxs("section", { className: "xicms-booking", children: [
|
|
11
|
-
block.heading && /* @__PURE__ */ jsx(Heading, { level: 2, "data-xicms-edit": "heading", children: block.heading }),
|
|
12
|
-
/* @__PURE__ */ jsx("div", { className: "xicms-booking__frame", style: { height: `${block.height}px` }, children: /* @__PURE__ */ jsx(ConsentEmbed, { gated: block.consentGated, preview: mode === "preview", label: "Afspraak/booking", children: /* @__PURE__ */ jsx("iframe", { src, title: block.heading ?? "Afspraak maken", loading: "lazy", referrerPolicy: "no-referrer-when-downgrade", sandbox: "allow-scripts allow-same-origin allow-forms allow-popups", style: { border: 0, width: "100%", height: "100%" } }) }) })
|
|
13
|
-
] });
|
|
14
|
-
}
|
|
15
3
|
const bookingBlock = defineBlock({
|
|
16
4
|
type: "booking",
|
|
17
|
-
Render: BookingRender,
|
|
5
|
+
Render: dynamic(() => import("./BookingRender.js").then((m) => m.BookingRender)),
|
|
18
6
|
label: "Afspraak/booking",
|
|
19
7
|
icon: "\u{1F4C6}",
|
|
20
8
|
defaults: () => ({ embedUrl: "", height: 630, consentGated: true })
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/blocks/builtins/Booking.tsx"],"sourcesContent":["
|
|
1
|
+
{"version":3,"sources":["../../../src/blocks/builtins/Booking.tsx"],"sourcesContent":["import dynamic from \"next/dynamic\";\nimport { defineBlock } from \"../registry\";\n\nexport const bookingBlock = defineBlock({\n type: \"booking\",\n Render: dynamic(() => import(\"./BookingRender\").then((m) => m.BookingRender)),\n label: \"Afspraak/booking\",\n icon: \"📆\",\n defaults: () => ({ embedUrl: \"\", height: 630, consentGated: true }),\n});\n"],"mappings":"AAAA,OAAO,aAAa;AACpB,SAAS,mBAAmB;AAErB,MAAM,eAAe,YAAY;AAAA,EACtC,MAAM;AAAA,EACN,QAAQ,QAAQ,MAAM,OAAO,iBAAiB,EAAE,KAAK,CAAC,MAAM,EAAE,aAAa,CAAC;AAAA,EAC5E,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU,OAAO,EAAE,UAAU,IAAI,QAAQ,KAAK,cAAc,KAAK;AACnE,CAAC;","names":[]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { z } from "zod";
|
|
2
|
+
import type { BookingBlockSchema } from "../../schema/blocks.js";
|
|
3
|
+
import type { BlockRenderProps } from "../registry.js";
|
|
4
|
+
type Booking = z.infer<typeof BookingBlockSchema>;
|
|
5
|
+
/** Boekings-/afspraak-embed (bv. Calendly). Consent-gated by default. De provider-keuze bouwt de
|
|
6
|
+
* volledige embed-URL uit een geplakte link óf een kale slug/id (buildBookingUrl). */
|
|
7
|
+
export declare function BookingRender({ block, mode }: BlockRenderProps<Booking>): import("react").JSX.Element | null;
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Heading } from "../ui/index.js";
|
|
4
|
+
import { ConsentEmbed } from "./consentEmbed.js";
|
|
5
|
+
import { buildBookingUrl } from "./lib/bookingUrl.js";
|
|
6
|
+
function BookingRender({ block, mode }) {
|
|
7
|
+
const src = buildBookingUrl(block.provider ?? "custom", block.embedUrl);
|
|
8
|
+
if (!src) return null;
|
|
9
|
+
return /* @__PURE__ */ jsxs("section", { className: "xicms-booking", children: [
|
|
10
|
+
block.heading && /* @__PURE__ */ jsx(Heading, { level: 2, "data-xicms-edit": "heading", children: block.heading }),
|
|
11
|
+
/* @__PURE__ */ jsx("div", { className: "xicms-booking__frame", style: { height: `${block.height}px` }, children: /* @__PURE__ */ jsx(ConsentEmbed, { gated: block.consentGated, preview: mode === "preview", label: "Afspraak/booking", children: /* @__PURE__ */ jsx("iframe", { src, title: block.heading ?? "Afspraak maken", loading: "lazy", referrerPolicy: "no-referrer-when-downgrade", sandbox: "allow-scripts allow-same-origin allow-forms allow-popups", style: { border: 0, width: "100%", height: "100%" } }) }) })
|
|
12
|
+
] });
|
|
13
|
+
}
|
|
14
|
+
export {
|
|
15
|
+
BookingRender
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=BookingRender.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/blocks/builtins/BookingRender.tsx"],"sourcesContent":["\"use client\";\n\nimport type { z } from \"zod\";\nimport type { BookingBlockSchema } from \"../../schema/blocks\";\nimport type { BlockRenderProps } from \"../registry\";\nimport { Heading } from \"../ui\";\nimport { ConsentEmbed } from \"./consentEmbed\";\nimport { buildBookingUrl, type BookingProvider } from \"./lib/bookingUrl\";\n\ntype Booking = z.infer<typeof BookingBlockSchema>;\n\n/** Boekings-/afspraak-embed (bv. Calendly). Consent-gated by default. De provider-keuze bouwt de\n * volledige embed-URL uit een geplakte link óf een kale slug/id (buildBookingUrl). */\nexport function BookingRender({ block, mode }: BlockRenderProps<Booking>) {\n const src = buildBookingUrl((block.provider ?? \"custom\") as BookingProvider, block.embedUrl);\n if (!src) return null;\n return (\n <section className=\"xicms-booking\">\n {block.heading && <Heading level={2} data-xicms-edit=\"heading\">{block.heading}</Heading>}\n <div className=\"xicms-booking__frame\" style={{ height: `${block.height}px` }}>\n <ConsentEmbed gated={block.consentGated} preview={mode === \"preview\"} label=\"Afspraak/booking\">\n <iframe src={src} title={block.heading ?? \"Afspraak maken\"} loading=\"lazy\" referrerPolicy=\"no-referrer-when-downgrade\" sandbox=\"allow-scripts allow-same-origin allow-forms allow-popups\" style={{ border: 0, width: \"100%\", height: \"100%\" }} />\n </ConsentEmbed>\n </div>\n </section>\n );\n}\n"],"mappings":";AAiBI,SACoB,KADpB;AAZJ,SAAS,eAAe;AACxB,SAAS,oBAAoB;AAC7B,SAAS,uBAA6C;AAM/C,SAAS,cAAc,EAAE,OAAO,KAAK,GAA8B;AACxE,QAAM,MAAM,gBAAiB,MAAM,YAAY,UAA8B,MAAM,QAAQ;AAC3F,MAAI,CAAC,IAAK,QAAO;AACjB,SACE,qBAAC,aAAQ,WAAU,iBAChB;AAAA,UAAM,WAAW,oBAAC,WAAQ,OAAO,GAAG,mBAAgB,WAAW,gBAAM,SAAQ;AAAA,IAC9E,oBAAC,SAAI,WAAU,wBAAuB,OAAO,EAAE,QAAQ,GAAG,MAAM,MAAM,KAAK,GACzE,8BAAC,gBAAa,OAAO,MAAM,cAAc,SAAS,SAAS,WAAW,OAAM,oBAC1E,8BAAC,YAAO,KAAU,OAAO,MAAM,WAAW,kBAAkB,SAAQ,QAAO,gBAAe,8BAA6B,SAAQ,4DAA2D,OAAO,EAAE,QAAQ,GAAG,OAAO,QAAQ,QAAQ,OAAO,GAAG,GACjP,GACF;AAAA,KACF;AAEJ;","names":[]}
|
|
@@ -1,10 +1 @@
|
|
|
1
|
-
|
|
2
|
-
export interface Crumb {
|
|
3
|
-
label: string;
|
|
4
|
-
href: string;
|
|
5
|
-
}
|
|
6
|
-
/** Kruimels uit een pad: "/diensten/tuinaanleg" → Home / Diensten / Tuinaanleg. Puur en getest. */
|
|
7
|
-
export declare function crumbsFromPath(path: string, homeLabel?: string): Crumb[];
|
|
8
|
-
/** BreadcrumbList-JSON-LD. Puur en getest. */
|
|
9
|
-
export declare function breadcrumbsJsonLd(crumbs: Crumb[]): Record<string, unknown>;
|
|
10
|
-
export declare const breadcrumbsBlock: import("../index.js").BlockDefinition<z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
|
|
1
|
+
export declare const breadcrumbsBlock: import("../index.js").BlockDefinition<import("zod/v4/core").$ZodType<unknown, unknown, import("zod/v4/core").$ZodTypeInternals<unknown, unknown>>>;
|
|
@@ -1,79 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
-
import { useEffect, useState } from "react";
|
|
1
|
+
import dynamic from "next/dynamic";
|
|
4
2
|
import { defineBlock } from "../registry.js";
|
|
5
|
-
import { useLinkComponent } from "@astryxdesign/core/Link";
|
|
6
|
-
import { jsonLdHtml } from "./jsonld.js";
|
|
7
|
-
function crumbsFromPath(path, homeLabel = "Home") {
|
|
8
|
-
const segments = path.split("/").filter(Boolean);
|
|
9
|
-
const crumbs = [{ label: homeLabel, href: "/" }];
|
|
10
|
-
let href = "";
|
|
11
|
-
for (const seg of segments) {
|
|
12
|
-
href += `/${seg}`;
|
|
13
|
-
let decoded = seg;
|
|
14
|
-
try {
|
|
15
|
-
decoded = decodeURIComponent(seg);
|
|
16
|
-
} catch {
|
|
17
|
-
}
|
|
18
|
-
const label = decoded.replace(/[-_]+/g, " ").replace(/^./, (c) => c.toUpperCase());
|
|
19
|
-
crumbs.push({ label, href });
|
|
20
|
-
}
|
|
21
|
-
return crumbs;
|
|
22
|
-
}
|
|
23
|
-
function breadcrumbsJsonLd(crumbs) {
|
|
24
|
-
return {
|
|
25
|
-
"@context": "https://schema.org",
|
|
26
|
-
"@type": "BreadcrumbList",
|
|
27
|
-
itemListElement: crumbs.map((c, i) => ({
|
|
28
|
-
"@type": "ListItem",
|
|
29
|
-
position: i + 1,
|
|
30
|
-
name: c.label,
|
|
31
|
-
item: c.href
|
|
32
|
-
}))
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
function BreadcrumbsRender({ block, mode }) {
|
|
36
|
-
const LinkC = useLinkComponent();
|
|
37
|
-
const [path, setPath] = useState(null);
|
|
38
|
-
useEffect(() => {
|
|
39
|
-
setPath(window.location.pathname);
|
|
40
|
-
}, []);
|
|
41
|
-
if (mode === "preview" && (path === null || path === "/")) {
|
|
42
|
-
return /* @__PURE__ */ jsxs("nav", { className: "xicms-breadcrumbs", "aria-label": "Kruimelpad", children: [
|
|
43
|
-
/* @__PURE__ */ jsx("span", { "data-xicms-edit": "homeLabel", children: block.homeLabel }),
|
|
44
|
-
" / Voorbeeldpagina"
|
|
45
|
-
] });
|
|
46
|
-
}
|
|
47
|
-
if (path === null || path === "/") return null;
|
|
48
|
-
const crumbs = crumbsFromPath(path, block.homeLabel);
|
|
49
|
-
return /* @__PURE__ */ jsxs("nav", { className: "xicms-breadcrumbs", "aria-label": "Kruimelpad", children: [
|
|
50
|
-
/* @__PURE__ */ jsx("ol", { className: "xicms-breadcrumbs__list", children: crumbs.map((c, i) => /* @__PURE__ */ jsx("li", { className: "xicms-breadcrumbs__item", children: i < crumbs.length - 1 ? (
|
|
51
|
-
// De eerste kruimel ís `homeLabel`; de rest komt uit het pad en is dus geen blokveld.
|
|
52
|
-
/* @__PURE__ */ jsx(LinkC, { href: c.href, children: i === 0 ? /* @__PURE__ */ jsx("span", { "data-xicms-edit": "homeLabel", children: c.label }) : c.label })
|
|
53
|
-
) : /* @__PURE__ */ jsx("span", { "aria-current": "page", children: c.label }) }, c.href)) }),
|
|
54
|
-
block.jsonLd && /* @__PURE__ */ jsx(
|
|
55
|
-
"script",
|
|
56
|
-
{
|
|
57
|
-
type: "application/ld+json",
|
|
58
|
-
dangerouslySetInnerHTML: {
|
|
59
|
-
__html: jsonLdHtml(
|
|
60
|
-
breadcrumbsJsonLd(crumbs.map((c) => ({ ...c, href: `${window.location.origin}${c.href}` })))
|
|
61
|
-
)
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
)
|
|
65
|
-
] });
|
|
66
|
-
}
|
|
67
3
|
const breadcrumbsBlock = defineBlock({
|
|
68
4
|
type: "breadcrumbs",
|
|
69
|
-
Render: BreadcrumbsRender,
|
|
5
|
+
Render: dynamic(() => import("./BreadcrumbsRender.js").then((m) => m.BreadcrumbsRender)),
|
|
70
6
|
label: "Kruimelpad",
|
|
71
7
|
icon: "\u{1F9ED}",
|
|
72
8
|
defaults: () => ({ homeLabel: "Home", jsonLd: true })
|
|
73
9
|
});
|
|
74
10
|
export {
|
|
75
|
-
breadcrumbsBlock
|
|
76
|
-
breadcrumbsJsonLd,
|
|
77
|
-
crumbsFromPath
|
|
11
|
+
breadcrumbsBlock
|
|
78
12
|
};
|
|
79
13
|
//# sourceMappingURL=Breadcrumbs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/blocks/builtins/Breadcrumbs.tsx"],"sourcesContent":["
|
|
1
|
+
{"version":3,"sources":["../../../src/blocks/builtins/Breadcrumbs.tsx"],"sourcesContent":["import dynamic from \"next/dynamic\";\nimport { defineBlock } from \"../registry\";\n\nexport const breadcrumbsBlock = defineBlock({\n type: \"breadcrumbs\",\n Render: dynamic(() => import(\"./BreadcrumbsRender\").then((m) => m.BreadcrumbsRender)),\n label: \"Kruimelpad\",\n icon: \"🧭\",\n defaults: () => ({ homeLabel: \"Home\", jsonLd: true }),\n});\n"],"mappings":"AAAA,OAAO,aAAa;AACpB,SAAS,mBAAmB;AAErB,MAAM,mBAAmB,YAAY;AAAA,EAC1C,MAAM;AAAA,EACN,QAAQ,QAAQ,MAAM,OAAO,qBAAqB,EAAE,KAAK,CAAC,MAAM,EAAE,iBAAiB,CAAC;AAAA,EACpF,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU,OAAO,EAAE,WAAW,QAAQ,QAAQ,KAAK;AACrD,CAAC;","names":[]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { z } from "zod";
|
|
2
|
+
import type { BreadcrumbsBlockSchema } from "../../schema/blocks.js";
|
|
3
|
+
import type { BlockRenderProps } from "../registry.js";
|
|
4
|
+
type Breadcrumbs = z.infer<typeof BreadcrumbsBlockSchema>;
|
|
5
|
+
export interface Crumb {
|
|
6
|
+
label: string;
|
|
7
|
+
href: string;
|
|
8
|
+
}
|
|
9
|
+
/** Kruimels uit een pad: "/diensten/tuinaanleg" → Home / Diensten / Tuinaanleg. Puur en getest. */
|
|
10
|
+
export declare function crumbsFromPath(path: string, homeLabel?: string): Crumb[];
|
|
11
|
+
/** BreadcrumbList-JSON-LD. Puur en getest. */
|
|
12
|
+
export declare function breadcrumbsJsonLd(crumbs: Crumb[]): Record<string, unknown>;
|
|
13
|
+
/**
|
|
14
|
+
* Kruimelpad, afgeleid van de URL (client, ná mount — hydration-veilig). Op de homepage
|
|
15
|
+
* (alleen "Home") wordt niets getoond.
|
|
16
|
+
*/
|
|
17
|
+
export declare function BreadcrumbsRender({ block, mode }: BlockRenderProps<Breadcrumbs>): import("react").JSX.Element | null;
|
|
18
|
+
export {};
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useEffect, useState } from "react";
|
|
4
|
+
import { useLinkComponent } from "@astryxdesign/core/Link";
|
|
5
|
+
import { jsonLdHtml } from "./jsonld.js";
|
|
6
|
+
function crumbsFromPath(path, homeLabel = "Home") {
|
|
7
|
+
const segments = path.split("/").filter(Boolean);
|
|
8
|
+
const crumbs = [{ label: homeLabel, href: "/" }];
|
|
9
|
+
let href = "";
|
|
10
|
+
for (const seg of segments) {
|
|
11
|
+
href += `/${seg}`;
|
|
12
|
+
let decoded = seg;
|
|
13
|
+
try {
|
|
14
|
+
decoded = decodeURIComponent(seg);
|
|
15
|
+
} catch {
|
|
16
|
+
}
|
|
17
|
+
const label = decoded.replace(/[-_]+/g, " ").replace(/^./, (c) => c.toUpperCase());
|
|
18
|
+
crumbs.push({ label, href });
|
|
19
|
+
}
|
|
20
|
+
return crumbs;
|
|
21
|
+
}
|
|
22
|
+
function breadcrumbsJsonLd(crumbs) {
|
|
23
|
+
return {
|
|
24
|
+
"@context": "https://schema.org",
|
|
25
|
+
"@type": "BreadcrumbList",
|
|
26
|
+
itemListElement: crumbs.map((c, i) => ({
|
|
27
|
+
"@type": "ListItem",
|
|
28
|
+
position: i + 1,
|
|
29
|
+
name: c.label,
|
|
30
|
+
item: c.href
|
|
31
|
+
}))
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
function BreadcrumbsRender({ block, mode }) {
|
|
35
|
+
const LinkC = useLinkComponent();
|
|
36
|
+
const [path, setPath] = useState(null);
|
|
37
|
+
useEffect(() => {
|
|
38
|
+
setPath(window.location.pathname);
|
|
39
|
+
}, []);
|
|
40
|
+
if (mode === "preview" && (path === null || path === "/")) {
|
|
41
|
+
return /* @__PURE__ */ jsxs("nav", { className: "xicms-breadcrumbs", "aria-label": "Kruimelpad", children: [
|
|
42
|
+
/* @__PURE__ */ jsx("span", { "data-xicms-edit": "homeLabel", children: block.homeLabel }),
|
|
43
|
+
" / Voorbeeldpagina"
|
|
44
|
+
] });
|
|
45
|
+
}
|
|
46
|
+
if (path === null || path === "/") return null;
|
|
47
|
+
const crumbs = crumbsFromPath(path, block.homeLabel);
|
|
48
|
+
return /* @__PURE__ */ jsxs("nav", { className: "xicms-breadcrumbs", "aria-label": "Kruimelpad", children: [
|
|
49
|
+
/* @__PURE__ */ jsx("ol", { className: "xicms-breadcrumbs__list", children: crumbs.map((c, i) => /* @__PURE__ */ jsx("li", { className: "xicms-breadcrumbs__item", children: i < crumbs.length - 1 ? (
|
|
50
|
+
// De eerste kruimel ís `homeLabel`; de rest komt uit het pad en is dus geen blokveld.
|
|
51
|
+
/* @__PURE__ */ jsx(LinkC, { href: c.href, children: i === 0 ? /* @__PURE__ */ jsx("span", { "data-xicms-edit": "homeLabel", children: c.label }) : c.label })
|
|
52
|
+
) : /* @__PURE__ */ jsx("span", { "aria-current": "page", children: c.label }) }, c.href)) }),
|
|
53
|
+
block.jsonLd && /* @__PURE__ */ jsx(
|
|
54
|
+
"script",
|
|
55
|
+
{
|
|
56
|
+
type: "application/ld+json",
|
|
57
|
+
dangerouslySetInnerHTML: {
|
|
58
|
+
__html: jsonLdHtml(
|
|
59
|
+
breadcrumbsJsonLd(crumbs.map((c) => ({ ...c, href: `${window.location.origin}${c.href}` })))
|
|
60
|
+
)
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
)
|
|
64
|
+
] });
|
|
65
|
+
}
|
|
66
|
+
export {
|
|
67
|
+
BreadcrumbsRender,
|
|
68
|
+
breadcrumbsJsonLd,
|
|
69
|
+
crumbsFromPath
|
|
70
|
+
};
|
|
71
|
+
//# sourceMappingURL=BreadcrumbsRender.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/blocks/builtins/BreadcrumbsRender.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport type { z } from \"zod\";\nimport type { BreadcrumbsBlockSchema } from \"../../schema/blocks\";\nimport type { BlockRenderProps } from \"../registry\";\nimport { useLinkComponent } from \"@astryxdesign/core/Link\";\nimport { jsonLdHtml } from \"./jsonld\";\n\ntype Breadcrumbs = z.infer<typeof BreadcrumbsBlockSchema>;\n\nexport interface Crumb {\n label: string;\n href: string;\n}\n\n/** Kruimels uit een pad: \"/diensten/tuinaanleg\" → Home / Diensten / Tuinaanleg. Puur en getest. */\nexport function crumbsFromPath(path: string, homeLabel = \"Home\"): Crumb[] {\n const segments = path.split(\"/\").filter(Boolean);\n const crumbs: Crumb[] = [{ label: homeLabel, href: \"/\" }];\n let href = \"\";\n for (const seg of segments) {\n href += `/${seg}`;\n // decodeURIComponent gooit op misvormde percent-encoding (\"%E0%A4%A\") — dan het rauwe segment.\n let decoded = seg;\n try {\n decoded = decodeURIComponent(seg);\n } catch {\n /* rauw segment als label */\n }\n const label = decoded.replace(/[-_]+/g, \" \").replace(/^./, (c) => c.toUpperCase());\n crumbs.push({ label, href });\n }\n return crumbs;\n}\n\n/** BreadcrumbList-JSON-LD. Puur en getest. */\nexport function breadcrumbsJsonLd(crumbs: Crumb[]): Record<string, unknown> {\n return {\n \"@context\": \"https://schema.org\",\n \"@type\": \"BreadcrumbList\",\n itemListElement: crumbs.map((c, i) => ({\n \"@type\": \"ListItem\",\n position: i + 1,\n name: c.label,\n item: c.href,\n })),\n };\n}\n\n/**\n * Kruimelpad, afgeleid van de URL (client, ná mount — hydration-veilig). Op de homepage\n * (alleen \"Home\") wordt niets getoond.\n */\nexport function BreadcrumbsRender({ block, mode }: BlockRenderProps<Breadcrumbs>) {\n const LinkC = useLinkComponent();\n const [path, setPath] = useState<string | null>(null);\n useEffect(() => {\n setPath(window.location.pathname);\n }, []);\n\n if (mode === \"preview\" && (path === null || path === \"/\")) {\n return <nav className=\"xicms-breadcrumbs\" aria-label=\"Kruimelpad\"><span data-xicms-edit=\"homeLabel\">{block.homeLabel}</span> / Voorbeeldpagina</nav>;\n }\n if (path === null || path === \"/\") return null;\n const crumbs = crumbsFromPath(path, block.homeLabel);\n\n return (\n <nav className=\"xicms-breadcrumbs\" aria-label=\"Kruimelpad\">\n <ol className=\"xicms-breadcrumbs__list\">\n {crumbs.map((c, i) => (\n <li key={c.href} className=\"xicms-breadcrumbs__item\">\n {i < crumbs.length - 1 ? (\n // De eerste kruimel ís `homeLabel`; de rest komt uit het pad en is dus geen blokveld.\n <LinkC href={c.href}>{i === 0 ? <span data-xicms-edit=\"homeLabel\">{c.label}</span> : c.label}</LinkC>\n ) : (\n <span aria-current=\"page\">{c.label}</span>\n )}\n </li>\n ))}\n </ol>\n {block.jsonLd && (\n <script\n type=\"application/ld+json\"\n // eslint-disable-next-line react/no-danger\n // Absolute URL's: Google wil volledige item-URL's in BreadcrumbList (dit rendert\n // client-side ná mount, dus window.location.origin is beschikbaar).\n dangerouslySetInnerHTML={{\n __html: jsonLdHtml(\n breadcrumbsJsonLd(crumbs.map((c) => ({ ...c, href: `${window.location.origin}${c.href}` }))),\n ),\n }}\n />\n )}\n </nav>\n );\n}\n"],"mappings":";AA8DW,SAA2D,KAA3D;AA5DX,SAAS,WAAW,gBAAgB;AAIpC,SAAS,wBAAwB;AACjC,SAAS,kBAAkB;AAUpB,SAAS,eAAe,MAAc,YAAY,QAAiB;AACxE,QAAM,WAAW,KAAK,MAAM,GAAG,EAAE,OAAO,OAAO;AAC/C,QAAM,SAAkB,CAAC,EAAE,OAAO,WAAW,MAAM,IAAI,CAAC;AACxD,MAAI,OAAO;AACX,aAAW,OAAO,UAAU;AAC1B,YAAQ,IAAI,GAAG;AAEf,QAAI,UAAU;AACd,QAAI;AACF,gBAAU,mBAAmB,GAAG;AAAA,IAClC,QAAQ;AAAA,IAER;AACA,UAAM,QAAQ,QAAQ,QAAQ,UAAU,GAAG,EAAE,QAAQ,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC;AACjF,WAAO,KAAK,EAAE,OAAO,KAAK,CAAC;AAAA,EAC7B;AACA,SAAO;AACT;AAGO,SAAS,kBAAkB,QAA0C;AAC1E,SAAO;AAAA,IACL,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,iBAAiB,OAAO,IAAI,CAAC,GAAG,OAAO;AAAA,MACrC,SAAS;AAAA,MACT,UAAU,IAAI;AAAA,MACd,MAAM,EAAE;AAAA,MACR,MAAM,EAAE;AAAA,IACV,EAAE;AAAA,EACJ;AACF;AAMO,SAAS,kBAAkB,EAAE,OAAO,KAAK,GAAkC;AAChF,QAAM,QAAQ,iBAAiB;AAC/B,QAAM,CAAC,MAAM,OAAO,IAAI,SAAwB,IAAI;AACpD,YAAU,MAAM;AACd,YAAQ,OAAO,SAAS,QAAQ;AAAA,EAClC,GAAG,CAAC,CAAC;AAEL,MAAI,SAAS,cAAc,SAAS,QAAQ,SAAS,MAAM;AACzD,WAAO,qBAAC,SAAI,WAAU,qBAAoB,cAAW,cAAa;AAAA,0BAAC,UAAK,mBAAgB,aAAa,gBAAM,WAAU;AAAA,MAAO;AAAA,OAAkB;AAAA,EAChJ;AACA,MAAI,SAAS,QAAQ,SAAS,IAAK,QAAO;AAC1C,QAAM,SAAS,eAAe,MAAM,MAAM,SAAS;AAEnD,SACE,qBAAC,SAAI,WAAU,qBAAoB,cAAW,cAC5C;AAAA,wBAAC,QAAG,WAAU,2BACX,iBAAO,IAAI,CAAC,GAAG,MACd,oBAAC,QAAgB,WAAU,2BACxB,cAAI,OAAO,SAAS;AAAA;AAAA,MAEnB,oBAAC,SAAM,MAAM,EAAE,MAAO,gBAAM,IAAI,oBAAC,UAAK,mBAAgB,aAAa,YAAE,OAAM,IAAU,EAAE,OAAM;AAAA,QAE7F,oBAAC,UAAK,gBAAa,QAAQ,YAAE,OAAM,KAL9B,EAAE,IAOX,CACD,GACH;AAAA,IACC,MAAM,UACL;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QAIL,yBAAyB;AAAA,UACvB,QAAQ;AAAA,YACN,kBAAkB,OAAO,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,MAAM,GAAG,OAAO,SAAS,MAAM,GAAG,EAAE,IAAI,GAAG,EAAE,CAAC;AAAA,UAC7F;AAAA,QACF;AAAA;AAAA,IACF;AAAA,KAEJ;AAEJ;","names":[]}
|
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
export declare const cardsBlock: import("../index.js").BlockDefinition<z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
|
|
1
|
+
export declare const cardsBlock: import("../index.js").BlockDefinition<import("zod/v4/core").$ZodType<unknown, unknown, import("zod/v4/core").$ZodTypeInternals<unknown, unknown>>>;
|
|
@@ -1,81 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
import { jsx, jsxs } from "react/jsx-runtime";
|
|
1
|
+
import dynamic from "next/dynamic";
|
|
3
2
|
import { defineBlock } from "../registry.js";
|
|
4
|
-
import { VStack, Grid, Card, Heading, Text } from "../ui/index.js";
|
|
5
|
-
import { useLinkComponent } from "@astryxdesign/core/Link";
|
|
6
|
-
import { Img } from "../../media/ImageContext.js";
|
|
7
|
-
function CardsRender({ block }) {
|
|
8
|
-
const LinkC = useLinkComponent();
|
|
9
|
-
const items = (block.items ?? []).map((c, i) => ({ ...c, _i: i })).filter((c) => c.title || c.text || c.imageUrl);
|
|
10
|
-
if (items.length === 0 && !block.heading) return null;
|
|
11
|
-
return /* @__PURE__ */ jsxs(VStack, { gap: 4, as: "section", className: "xicms-cards", children: [
|
|
12
|
-
(block.heading || block.intro) && /* @__PURE__ */ jsxs(VStack, { gap: 1, hAlign: "center", style: { textAlign: "center" }, children: [
|
|
13
|
-
block.heading && /* @__PURE__ */ jsx(Heading, { level: 2, "data-xicms-edit": "heading", children: block.heading }),
|
|
14
|
-
block.intro && /* @__PURE__ */ jsx(Text, { type: "large", color: "secondary", "data-xicms-edit": "intro", children: block.intro })
|
|
15
|
-
] }),
|
|
16
|
-
/* @__PURE__ */ jsx(Grid, { columns: { minWidth: 240, max: block.columns }, gap: 4, children: items.map((c) => {
|
|
17
|
-
const i = c._i;
|
|
18
|
-
const cover = block.imageStyle === "cover" && Boolean(c.imageUrl);
|
|
19
|
-
const body = /* @__PURE__ */ jsxs(VStack, { gap: 2, style: cover ? { padding: "1.1rem 1.25rem 1.25rem" } : void 0, children: [
|
|
20
|
-
c.title && /* @__PURE__ */ jsx(Heading, { level: 3, className: "xicms-cards__title", "data-xicms-edit": `items.${i}.title`, children: c.title }),
|
|
21
|
-
c.text && /* @__PURE__ */ jsx(Text, { color: "secondary", className: "xicms-cards__text", "data-xicms-edit": `items.${i}.text`, children: c.text }),
|
|
22
|
-
c.href && c.linkLabel && /* @__PURE__ */ jsxs(Text, { type: "label", style: { color: "var(--color-accent)" }, children: [
|
|
23
|
-
/* @__PURE__ */ jsx("span", { "data-xicms-edit": `items.${i}.linkLabel`, children: c.linkLabel }),
|
|
24
|
-
" \u2192"
|
|
25
|
-
] })
|
|
26
|
-
] });
|
|
27
|
-
const inner = cover ? /* @__PURE__ */ jsxs(VStack, { gap: 0, style: { height: "100%" }, children: [
|
|
28
|
-
/* @__PURE__ */ jsx(
|
|
29
|
-
Img,
|
|
30
|
-
{
|
|
31
|
-
src: c.imageUrl,
|
|
32
|
-
alt: c.title ?? "",
|
|
33
|
-
width: 600,
|
|
34
|
-
height: 360,
|
|
35
|
-
sizes: "(max-width: 720px) 100vw, 33vw",
|
|
36
|
-
editField: `items.${i}.imageUrl`,
|
|
37
|
-
style: { width: "100%", aspectRatio: "16 / 10", objectFit: "cover", display: "block" }
|
|
38
|
-
}
|
|
39
|
-
),
|
|
40
|
-
body
|
|
41
|
-
] }) : /* @__PURE__ */ jsxs(VStack, { gap: 2, children: [
|
|
42
|
-
c.imageUrl ? /* @__PURE__ */ jsx(
|
|
43
|
-
Img,
|
|
44
|
-
{
|
|
45
|
-
src: c.imageUrl,
|
|
46
|
-
alt: c.title ?? "",
|
|
47
|
-
width: 480,
|
|
48
|
-
height: 300,
|
|
49
|
-
sizes: "(max-width: 720px) 100vw, 33vw",
|
|
50
|
-
editField: `items.${i}.imageUrl`,
|
|
51
|
-
style: { width: "100%", height: 160, objectFit: "cover", borderRadius: "var(--radius-element)" }
|
|
52
|
-
}
|
|
53
|
-
) : c.icon ? /* @__PURE__ */ jsx("div", { "aria-hidden": "true", style: { fontSize: "2rem", lineHeight: 1 }, children: c.icon }) : null,
|
|
54
|
-
c.title && /* @__PURE__ */ jsx(Heading, { level: 3, className: "xicms-cards__title", "data-xicms-edit": `items.${i}.title`, children: c.title }),
|
|
55
|
-
c.text && /* @__PURE__ */ jsx(Text, { color: "secondary", className: "xicms-cards__text", "data-xicms-edit": `items.${i}.text`, children: c.text }),
|
|
56
|
-
c.href && c.linkLabel && /* @__PURE__ */ jsxs(Text, { type: "label", style: { color: "var(--color-accent)" }, children: [
|
|
57
|
-
/* @__PURE__ */ jsx("span", { "data-xicms-edit": `items.${i}.linkLabel`, children: c.linkLabel }),
|
|
58
|
-
" \u2192"
|
|
59
|
-
] })
|
|
60
|
-
] });
|
|
61
|
-
const card = /* @__PURE__ */ jsx(
|
|
62
|
-
Card,
|
|
63
|
-
{
|
|
64
|
-
padding: cover ? 0 : 4,
|
|
65
|
-
height: "100%",
|
|
66
|
-
className: `xicms-cards__card${c.featured ? " xicms-cards__card--featured" : ""}`,
|
|
67
|
-
style: cover ? { overflow: "hidden" } : void 0,
|
|
68
|
-
children: inner
|
|
69
|
-
}
|
|
70
|
-
);
|
|
71
|
-
return c.href ? /* @__PURE__ */ jsx(LinkC, { href: c.href, style: { textDecoration: "none", color: "inherit", display: "block" }, children: card }, i) : /* @__PURE__ */ jsx("div", { children: card }, i);
|
|
72
|
-
}) })
|
|
73
|
-
] });
|
|
74
|
-
}
|
|
75
3
|
const cardsBlock = defineBlock({
|
|
76
4
|
type: "cards",
|
|
77
5
|
fields: { "items.icon": { type: "icon" } },
|
|
78
|
-
Render: CardsRender,
|
|
6
|
+
Render: dynamic(() => import("./CardsRender.js").then((m) => m.CardsRender)),
|
|
79
7
|
label: "Diensten / kaarten",
|
|
80
8
|
icon: "\u{1F9E9}",
|
|
81
9
|
defaults: () => ({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/blocks/builtins/Cards.tsx"],"sourcesContent":["
|
|
1
|
+
{"version":3,"sources":["../../../src/blocks/builtins/Cards.tsx"],"sourcesContent":["import dynamic from \"next/dynamic\";\nimport { defineBlock } from \"../registry\";\n\nexport const cardsBlock = defineBlock({\n type: \"cards\",\n fields: { \"items.icon\": { type: \"icon\" } },\n Render: dynamic(() => import(\"./CardsRender\").then((m) => m.CardsRender)),\n label: \"Diensten / kaarten\",\n icon: \"🧩\",\n defaults: () => ({\n heading: \"Onze diensten\",\n columns: 3,\n items: [\n { icon: \"⭐\", title: \"Dienst één\", text: \"Korte omschrijving van wat je biedt.\" },\n { icon: \"⚡\", title: \"Dienst twee\", text: \"Korte omschrijving van wat je biedt.\" },\n { icon: \"💬\", title: \"Dienst drie\", text: \"Korte omschrijving van wat je biedt.\" },\n ],\n }),\n});\n"],"mappings":"AAAA,OAAO,aAAa;AACpB,SAAS,mBAAmB;AAErB,MAAM,aAAa,YAAY;AAAA,EACpC,MAAM;AAAA,EACN,QAAQ,EAAE,cAAc,EAAE,MAAM,OAAO,EAAE;AAAA,EACzC,QAAQ,QAAQ,MAAM,OAAO,eAAe,EAAE,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC;AAAA,EACxE,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU,OAAO;AAAA,IACf,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,MACL,EAAE,MAAM,UAAK,OAAO,oBAAc,MAAM,uCAAuC;AAAA,MAC/E,EAAE,MAAM,UAAK,OAAO,eAAe,MAAM,uCAAuC;AAAA,MAChF,EAAE,MAAM,aAAM,OAAO,eAAe,MAAM,uCAAuC;AAAA,IACnF;AAAA,EACF;AACF,CAAC;","names":[]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { z } from "zod";
|
|
2
|
+
import type { CardsBlockSchema } from "../../schema/blocks.js";
|
|
3
|
+
import type { BlockRenderProps } from "../registry.js";
|
|
4
|
+
type Cards = z.infer<typeof CardsBlockSchema>;
|
|
5
|
+
/** Diensten/uitgelichte kaarten in een responsive grid (Astryx). */
|
|
6
|
+
export declare function CardsRender({ block }: BlockRenderProps<Cards>): import("react").JSX.Element | null;
|
|
7
|
+
export {};
|