@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
|
@@ -1,95 +1,8 @@
|
|
|
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 { Button } from "@astryxdesign/core/Button";
|
|
6
|
-
import { TextInput } from "@astryxdesign/core/TextInput";
|
|
7
|
-
import { CheckboxInput } from "@astryxdesign/core/CheckboxInput";
|
|
8
|
-
import { VStack, Card, Heading, Text } from "../ui/index.js";
|
|
9
|
-
import { isDemoActive } from "../../demo/demoStore.js";
|
|
10
|
-
import { Onvoltooid } from "./lib/Onvoltooid.js";
|
|
11
|
-
import { isFirebaseConfigured } from "../../firebase/config.js";
|
|
12
|
-
import { submitFormValues } from "./lib/submitForm.js";
|
|
13
|
-
function NewsletterRender({ block, siteId, mode }) {
|
|
14
|
-
const [email, setEmail] = useState("");
|
|
15
|
-
const [agreed, setAgreed] = useState(false);
|
|
16
|
-
const [status, setStatus] = useState("idle");
|
|
17
|
-
const [demo, setDemo] = useState(false);
|
|
18
|
-
useEffect(() => setDemo(isDemoActive()), []);
|
|
19
|
-
const useXicmsForm = !block.actionUrl && (Boolean(block.formId) || demo);
|
|
20
|
-
async function submitViaXicms(e) {
|
|
21
|
-
e.preventDefault();
|
|
22
|
-
if (mode === "preview") return;
|
|
23
|
-
if (!block.formId && !demo) return;
|
|
24
|
-
if (isDemoActive() || !isFirebaseConfigured()) {
|
|
25
|
-
setStatus("ok");
|
|
26
|
-
return;
|
|
27
|
-
}
|
|
28
|
-
setStatus("busy");
|
|
29
|
-
try {
|
|
30
|
-
await submitFormValues(siteId, block.formId, { email });
|
|
31
|
-
setStatus("ok");
|
|
32
|
-
setEmail("");
|
|
33
|
-
} catch {
|
|
34
|
-
setStatus("error");
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
const consentBox = block.consentText ? /* @__PURE__ */ jsx("div", { style: { textAlign: "left", maxWidth: 440, width: "100%" }, children: /* @__PURE__ */ jsx(CheckboxInput, { label: block.consentText, isRequired: true, value: agreed, onChange: setAgreed }) }) : null;
|
|
38
|
-
const emailInput = /* @__PURE__ */ jsx("div", { style: { flex: 1, minWidth: 200, textAlign: "left" }, children: /* @__PURE__ */ jsx(
|
|
39
|
-
TextInput,
|
|
40
|
-
{
|
|
41
|
-
label: "E-mailadres",
|
|
42
|
-
isLabelHidden: true,
|
|
43
|
-
type: "email",
|
|
44
|
-
htmlName: "EMAIL",
|
|
45
|
-
isRequired: true,
|
|
46
|
-
placeholder: "je@email.nl",
|
|
47
|
-
value: email,
|
|
48
|
-
onChange: setEmail
|
|
49
|
-
}
|
|
50
|
-
) });
|
|
51
|
-
const rowStyle = { display: "flex", gap: "0.75rem", flexWrap: "wrap", alignItems: "end", justifyContent: "center", maxWidth: 440, width: "100%" };
|
|
52
|
-
return /* @__PURE__ */ jsx(Card, { padding: 5, variant: "muted", children: /* @__PURE__ */ jsxs(VStack, { gap: 2, hAlign: "center", style: { textAlign: "center" }, children: [
|
|
53
|
-
block.heading && /* @__PURE__ */ jsx(Heading, { level: 2, "data-xicms-edit": "heading", children: block.heading }),
|
|
54
|
-
block.text && /* @__PURE__ */ jsx(Text, { color: "secondary", "data-xicms-edit": "text", children: block.text }),
|
|
55
|
-
status === "ok" ? /* @__PURE__ */ jsx(Text, { role: "status", children: "Bedankt voor je aanmelding!" }) : block.actionUrl ? /* @__PURE__ */ jsxs(
|
|
56
|
-
"form",
|
|
57
|
-
{
|
|
58
|
-
action: block.actionUrl,
|
|
59
|
-
method: "post",
|
|
60
|
-
target: "_blank",
|
|
61
|
-
style: rowStyle,
|
|
62
|
-
onSubmit: (e) => {
|
|
63
|
-
if (block.consentText && !agreed) e.preventDefault();
|
|
64
|
-
},
|
|
65
|
-
children: [
|
|
66
|
-
emailInput,
|
|
67
|
-
consentBox,
|
|
68
|
-
block.consentText && /* @__PURE__ */ jsx("input", { type: "hidden", name: "CONSENT", value: agreed ? "yes" : "" }),
|
|
69
|
-
/* @__PURE__ */ jsx(Button, { label: block.buttonLabel, variant: "primary", size: "lg", type: "submit", children: /* @__PURE__ */ jsx("span", { "data-xicms-edit": "buttonLabel", children: block.buttonLabel }) })
|
|
70
|
-
]
|
|
71
|
-
}
|
|
72
|
-
) : useXicmsForm ? /* @__PURE__ */ jsxs("form", { onSubmit: submitViaXicms, style: rowStyle, children: [
|
|
73
|
-
emailInput,
|
|
74
|
-
consentBox,
|
|
75
|
-
/* @__PURE__ */ jsx(
|
|
76
|
-
Button,
|
|
77
|
-
{
|
|
78
|
-
label: status === "busy" ? "Aanmelden\u2026" : block.buttonLabel,
|
|
79
|
-
variant: "primary",
|
|
80
|
-
size: "lg",
|
|
81
|
-
type: "submit",
|
|
82
|
-
isLoading: status === "busy",
|
|
83
|
-
children: status === "busy" ? void 0 : /* @__PURE__ */ jsx("span", { "data-xicms-edit": "buttonLabel", children: block.buttonLabel })
|
|
84
|
-
}
|
|
85
|
-
),
|
|
86
|
-
status === "error" && /* @__PURE__ */ jsx(Text, { role: "alert", type: "supporting", style: { color: "var(--color-error, #c0392b)" }, children: "Aanmelden mislukt. Probeer het later opnieuw." })
|
|
87
|
-
] }) : /* @__PURE__ */ jsx(Onvoltooid, { children: "Dit nieuwsbrief-blok is nog leeg: kies een aanmeld-URL of een formulier via het tandwiel. Bezoekers zien dit blok niet." })
|
|
88
|
-
] }) });
|
|
89
|
-
}
|
|
90
3
|
const newsletterBlock = defineBlock({
|
|
91
4
|
type: "newsletter",
|
|
92
|
-
Render: NewsletterRender,
|
|
5
|
+
Render: dynamic(() => import("./NewsletterRender.js").then((m) => m.NewsletterRender)),
|
|
93
6
|
label: "Nieuwsbrief",
|
|
94
7
|
icon: "\u2709\uFE0F",
|
|
95
8
|
defaults: () => ({ heading: "Blijf op de hoogte", buttonLabel: "Aanmelden" })
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/blocks/builtins/Newsletter.tsx"],"sourcesContent":["
|
|
1
|
+
{"version":3,"sources":["../../../src/blocks/builtins/Newsletter.tsx"],"sourcesContent":["import dynamic from \"next/dynamic\";\nimport { defineBlock } from \"../registry\";\n\nexport const newsletterBlock = defineBlock({\n type: \"newsletter\",\n Render: dynamic(() => import(\"./NewsletterRender\").then((m) => m.NewsletterRender)),\n label: \"Nieuwsbrief\",\n icon: \"βοΈ\",\n defaults: () => ({ heading: \"Blijf op de hoogte\", buttonLabel: \"Aanmelden\" }),\n});\n"],"mappings":"AAAA,OAAO,aAAa;AACpB,SAAS,mBAAmB;AAErB,MAAM,kBAAkB,YAAY;AAAA,EACzC,MAAM;AAAA,EACN,QAAQ,QAAQ,MAAM,OAAO,oBAAoB,EAAE,KAAK,CAAC,MAAM,EAAE,gBAAgB,CAAC;AAAA,EAClF,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU,OAAO,EAAE,SAAS,sBAAsB,aAAa,YAAY;AAC7E,CAAC;","names":[]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { z } from "zod";
|
|
2
|
+
import type { NewsletterBlockSchema } from "../../schema/blocks.js";
|
|
3
|
+
import type { BlockRenderProps } from "../registry.js";
|
|
4
|
+
type Newsletter = z.infer<typeof NewsletterBlockSchema>;
|
|
5
|
+
/**
|
|
6
|
+
* Nieuwsbrief-aanmelding. Twee modi:
|
|
7
|
+
* - `actionUrl` (bv. de embed-action van Mailchimp/Brevo): native form-POST naar de provider.
|
|
8
|
+
* - `formId` (zonder actionUrl): opslag via het XiCMS-formulier (submitForm-callable) β inzendingen
|
|
9
|
+
* verschijnen in /beheer β Formulieren, met dezelfde rate-limiting/validatie als het formulier-blok.
|
|
10
|
+
* Optionele AVG-checkbox via `consentText`.
|
|
11
|
+
*/
|
|
12
|
+
export declare function NewsletterRender({ block, siteId, mode }: BlockRenderProps<Newsletter>): import("react").JSX.Element;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useEffect, useState } from "react";
|
|
4
|
+
import { Button } from "@astryxdesign/core/Button";
|
|
5
|
+
import { TextInput } from "@astryxdesign/core/TextInput";
|
|
6
|
+
import { CheckboxInput } from "@astryxdesign/core/CheckboxInput";
|
|
7
|
+
import { VStack, Card, Heading, Text } from "../ui/index.js";
|
|
8
|
+
import { isDemoActive } from "../../demo/demoStore.js";
|
|
9
|
+
import { Onvoltooid } from "./lib/Onvoltooid.js";
|
|
10
|
+
import { isFirebaseConfigured } from "../../firebase/config.js";
|
|
11
|
+
import { submitFormValues } from "./lib/submitForm.js";
|
|
12
|
+
function NewsletterRender({ block, siteId, mode }) {
|
|
13
|
+
const [email, setEmail] = useState("");
|
|
14
|
+
const [agreed, setAgreed] = useState(false);
|
|
15
|
+
const [status, setStatus] = useState("idle");
|
|
16
|
+
const [demo, setDemo] = useState(false);
|
|
17
|
+
useEffect(() => setDemo(isDemoActive()), []);
|
|
18
|
+
const useXicmsForm = !block.actionUrl && (Boolean(block.formId) || demo);
|
|
19
|
+
async function submitViaXicms(e) {
|
|
20
|
+
e.preventDefault();
|
|
21
|
+
if (mode === "preview") return;
|
|
22
|
+
if (!block.formId && !demo) return;
|
|
23
|
+
if (isDemoActive() || !isFirebaseConfigured()) {
|
|
24
|
+
setStatus("ok");
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
setStatus("busy");
|
|
28
|
+
try {
|
|
29
|
+
await submitFormValues(siteId, block.formId, { email });
|
|
30
|
+
setStatus("ok");
|
|
31
|
+
setEmail("");
|
|
32
|
+
} catch {
|
|
33
|
+
setStatus("error");
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
const consentBox = block.consentText ? /* @__PURE__ */ jsx("div", { style: { textAlign: "left", maxWidth: 440, width: "100%" }, children: /* @__PURE__ */ jsx(CheckboxInput, { label: block.consentText, isRequired: true, value: agreed, onChange: setAgreed }) }) : null;
|
|
37
|
+
const emailInput = /* @__PURE__ */ jsx("div", { style: { flex: 1, minWidth: 200, textAlign: "left" }, children: /* @__PURE__ */ jsx(
|
|
38
|
+
TextInput,
|
|
39
|
+
{
|
|
40
|
+
label: "E-mailadres",
|
|
41
|
+
isLabelHidden: true,
|
|
42
|
+
type: "email",
|
|
43
|
+
htmlName: "EMAIL",
|
|
44
|
+
isRequired: true,
|
|
45
|
+
placeholder: "je@email.nl",
|
|
46
|
+
value: email,
|
|
47
|
+
onChange: setEmail
|
|
48
|
+
}
|
|
49
|
+
) });
|
|
50
|
+
const rowStyle = { display: "flex", gap: "0.75rem", flexWrap: "wrap", alignItems: "end", justifyContent: "center", maxWidth: 440, width: "100%" };
|
|
51
|
+
return /* @__PURE__ */ jsx(Card, { padding: 5, variant: "muted", children: /* @__PURE__ */ jsxs(VStack, { gap: 2, hAlign: "center", style: { textAlign: "center" }, children: [
|
|
52
|
+
block.heading && /* @__PURE__ */ jsx(Heading, { level: 2, "data-xicms-edit": "heading", children: block.heading }),
|
|
53
|
+
block.text && /* @__PURE__ */ jsx(Text, { color: "secondary", "data-xicms-edit": "text", children: block.text }),
|
|
54
|
+
status === "ok" ? /* @__PURE__ */ jsx(Text, { role: "status", children: "Bedankt voor je aanmelding!" }) : block.actionUrl ? /* @__PURE__ */ jsxs(
|
|
55
|
+
"form",
|
|
56
|
+
{
|
|
57
|
+
action: block.actionUrl,
|
|
58
|
+
method: "post",
|
|
59
|
+
target: "_blank",
|
|
60
|
+
style: rowStyle,
|
|
61
|
+
onSubmit: (e) => {
|
|
62
|
+
if (block.consentText && !agreed) e.preventDefault();
|
|
63
|
+
},
|
|
64
|
+
children: [
|
|
65
|
+
emailInput,
|
|
66
|
+
consentBox,
|
|
67
|
+
block.consentText && /* @__PURE__ */ jsx("input", { type: "hidden", name: "CONSENT", value: agreed ? "yes" : "" }),
|
|
68
|
+
/* @__PURE__ */ jsx(Button, { label: block.buttonLabel, variant: "primary", size: "lg", type: "submit", children: /* @__PURE__ */ jsx("span", { "data-xicms-edit": "buttonLabel", children: block.buttonLabel }) })
|
|
69
|
+
]
|
|
70
|
+
}
|
|
71
|
+
) : useXicmsForm ? /* @__PURE__ */ jsxs("form", { onSubmit: submitViaXicms, style: rowStyle, children: [
|
|
72
|
+
emailInput,
|
|
73
|
+
consentBox,
|
|
74
|
+
/* @__PURE__ */ jsx(
|
|
75
|
+
Button,
|
|
76
|
+
{
|
|
77
|
+
label: status === "busy" ? "Aanmelden\u2026" : block.buttonLabel,
|
|
78
|
+
variant: "primary",
|
|
79
|
+
size: "lg",
|
|
80
|
+
type: "submit",
|
|
81
|
+
isLoading: status === "busy",
|
|
82
|
+
children: status === "busy" ? void 0 : /* @__PURE__ */ jsx("span", { "data-xicms-edit": "buttonLabel", children: block.buttonLabel })
|
|
83
|
+
}
|
|
84
|
+
),
|
|
85
|
+
status === "error" && /* @__PURE__ */ jsx(Text, { role: "alert", type: "supporting", style: { color: "var(--color-error, #c0392b)" }, children: "Aanmelden mislukt. Probeer het later opnieuw." })
|
|
86
|
+
] }) : /* @__PURE__ */ jsx(Onvoltooid, { children: "Dit nieuwsbrief-blok is nog leeg: kies een aanmeld-URL of een formulier via het tandwiel. Bezoekers zien dit blok niet." })
|
|
87
|
+
] }) });
|
|
88
|
+
}
|
|
89
|
+
export {
|
|
90
|
+
NewsletterRender
|
|
91
|
+
};
|
|
92
|
+
//# sourceMappingURL=NewsletterRender.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/blocks/builtins/NewsletterRender.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useState, type FormEvent } from \"react\";\nimport type { z } from \"zod\";\nimport type { NewsletterBlockSchema } from \"../../schema/blocks\";\nimport type { BlockRenderProps } from \"../registry\";\nimport { Button } from \"@astryxdesign/core/Button\";\nimport { TextInput } from \"@astryxdesign/core/TextInput\";\nimport { CheckboxInput } from \"@astryxdesign/core/CheckboxInput\";\nimport { VStack, Card, Heading, Text } from \"../ui\";\nimport { isDemoActive } from \"../../demo/demoStore\";\nimport { Onvoltooid } from \"./lib/Onvoltooid\";\nimport { isFirebaseConfigured } from \"../../firebase/config\";\nimport { submitFormValues } from \"./lib/submitForm\";\n\ntype Newsletter = z.infer<typeof NewsletterBlockSchema>;\n\n/**\n * Nieuwsbrief-aanmelding. Twee modi:\n * - `actionUrl` (bv. de embed-action van Mailchimp/Brevo): native form-POST naar de provider.\n * - `formId` (zonder actionUrl): opslag via het XiCMS-formulier (submitForm-callable) β inzendingen\n * verschijnen in /beheer β Formulieren, met dezelfde rate-limiting/validatie als het formulier-blok.\n * Optionele AVG-checkbox via `consentText`.\n */\nexport function NewsletterRender({ block, siteId, mode }: BlockRenderProps<Newsletter>) {\n const [email, setEmail] = useState(\"\");\n const [agreed, setAgreed] = useState(false);\n const [status, setStatus] = useState<\"idle\" | \"busy\" | \"ok\" | \"error\">(\"idle\");\n /**\n * In een demo is er altijd een werkend formulier: het slaat lokaal \"op\" (zie submitViaXicms),\n * precies zoals het formulier-blok. Een demo die om configuratie vraagt verkoopt niets.\n *\n * Via state + effect en niet rechtstreeks in de render: `setDemoActive` draait in een effect van\n * de provider, dus tijdens de eerste render is `isDemoActive()` nog false en zou dit blok zich\n * één keer verkeerd aankleden β en zonder eigen re-render zo blijven staan. FormBlock leert\n * dezelfde les op dezelfde manier.\n */\n const [demo, setDemo] = useState(false);\n useEffect(() => setDemo(isDemoActive()), []);\n const useXicmsForm = !block.actionUrl && (Boolean(block.formId) || demo);\n\n async function submitViaXicms(e: FormEvent) {\n e.preventDefault();\n if (mode === \"preview\") return;\n // Zonder formId kan er alleen in demo iets \"verzonden\" worden β de guard hieronder vangt dat af\n // met een lokaal succes vΓ³Γ³r submitFormValues ooit wordt bereikt.\n if (!block.formId && !demo) return;\n // Zelfde vangnet als het formulier-blok: in demo of zonder Firebase-backend lokaal \"slagen\"\n // i.p.v. een foutmelding tonen op een statische (referentie)site.\n if (isDemoActive() || !isFirebaseConfigured()) {\n setStatus(\"ok\");\n return;\n }\n setStatus(\"busy\");\n try {\n // Niet-demo-pad; hierboven afgevangen als formId ontbreekt, dus hier bestaat hij.\n await submitFormValues(siteId, block.formId as string, { email });\n setStatus(\"ok\");\n setEmail(\"\");\n } catch {\n setStatus(\"error\");\n }\n }\n\n const consentBox = block.consentText ? (\n <div style={{ textAlign: \"left\", maxWidth: 440, width: \"100%\" }}>\n <CheckboxInput label={block.consentText} isRequired value={agreed} onChange={setAgreed} />\n </div>\n ) : null;\n\n const emailInput = (\n <div style={{ flex: 1, minWidth: 200, textAlign: \"left\" }}>\n <TextInput\n label=\"E-mailadres\"\n isLabelHidden\n type=\"email\"\n htmlName=\"EMAIL\"\n isRequired\n placeholder=\"je@email.nl\"\n value={email}\n onChange={setEmail}\n />\n </div>\n );\n const rowStyle = { display: \"flex\", gap: \"0.75rem\", flexWrap: \"wrap\", alignItems: \"end\", justifyContent: \"center\", maxWidth: 440, width: \"100%\" } as const;\n\n return (\n <Card padding={5} variant=\"muted\">\n <VStack gap={2} hAlign=\"center\" style={{ textAlign: \"center\" }}>\n {block.heading && <Heading level={2} data-xicms-edit=\"heading\">{block.heading}</Heading>}\n {block.text && <Text color=\"secondary\" data-xicms-edit=\"text\">{block.text}</Text>}\n {status === \"ok\" ? (\n <Text role=\"status\">Bedankt voor je aanmelding!</Text>\n ) : block.actionUrl ? (\n <form\n action={block.actionUrl}\n method=\"post\"\n target=\"_blank\"\n style={rowStyle}\n // AVG: zonder deze guard kon de native POST doorgaan zonder aangevinkte toestemming\n // (Astryx CheckboxInput heeft geen htmlName, dus de browser hield 'm niet tegen).\n onSubmit={(e) => {\n if (block.consentText && !agreed) e.preventDefault();\n }}\n >\n {emailInput}\n {consentBox}\n {/* De toestemmingswaarde ook daadwerkelijk meesturen naar de provider. */}\n {block.consentText && <input type=\"hidden\" name=\"CONSENT\" value={agreed ? \"yes\" : \"\"} />}\n <Button label={block.buttonLabel} variant=\"primary\" size=\"lg\" type=\"submit\">\n <span data-xicms-edit=\"buttonLabel\">{block.buttonLabel}</span>\n </Button>\n </form>\n ) : useXicmsForm ? (\n <form onSubmit={submitViaXicms} style={rowStyle}>\n {emailInput}\n {consentBox}\n <Button\n label={status === \"busy\" ? \"Aanmeldenβ¦\" : block.buttonLabel}\n variant=\"primary\"\n size=\"lg\"\n type=\"submit\"\n isLoading={status === \"busy\"}\n >\n {/* Tijdens versturen wint het wachtlabel: `undefined` laat Astryx op `label` terugvallen. */}\n {status === \"busy\" ? undefined : <span data-xicms-edit=\"buttonLabel\">{block.buttonLabel}</span>}\n </Button>\n {status === \"error\" && (\n <Text role=\"alert\" type=\"supporting\" style={{ color: \"var(--color-error, #c0392b)\" }}>\n Aanmelden mislukt. Probeer het later opnieuw.\n </Text>\n )}\n </form>\n ) : (\n <Onvoltooid>Dit nieuwsbrief-blok is nog leeg: kies een aanmeld-URL of een formulier via het tandwiel. Bezoekers zien dit blok niet.</Onvoltooid>\n )}\n </VStack>\n </Card>\n );\n}\n"],"mappings":";AAkEM,cA4BI,YA5BJ;AAhEN,SAAS,WAAW,gBAAgC;AAIpD,SAAS,cAAc;AACvB,SAAS,iBAAiB;AAC1B,SAAS,qBAAqB;AAC9B,SAAS,QAAQ,MAAM,SAAS,YAAY;AAC5C,SAAS,oBAAoB;AAC7B,SAAS,kBAAkB;AAC3B,SAAS,4BAA4B;AACrC,SAAS,wBAAwB;AAW1B,SAAS,iBAAiB,EAAE,OAAO,QAAQ,KAAK,GAAiC;AACtF,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,EAAE;AACrC,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,KAAK;AAC1C,QAAM,CAAC,QAAQ,SAAS,IAAI,SAA2C,MAAM;AAU7E,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,KAAK;AACtC,YAAU,MAAM,QAAQ,aAAa,CAAC,GAAG,CAAC,CAAC;AAC3C,QAAM,eAAe,CAAC,MAAM,cAAc,QAAQ,MAAM,MAAM,KAAK;AAEnE,iBAAe,eAAe,GAAc;AAC1C,MAAE,eAAe;AACjB,QAAI,SAAS,UAAW;AAGxB,QAAI,CAAC,MAAM,UAAU,CAAC,KAAM;AAG5B,QAAI,aAAa,KAAK,CAAC,qBAAqB,GAAG;AAC7C,gBAAU,IAAI;AACd;AAAA,IACF;AACA,cAAU,MAAM;AAChB,QAAI;AAEF,YAAM,iBAAiB,QAAQ,MAAM,QAAkB,EAAE,MAAM,CAAC;AAChE,gBAAU,IAAI;AACd,eAAS,EAAE;AAAA,IACb,QAAQ;AACN,gBAAU,OAAO;AAAA,IACnB;AAAA,EACF;AAEA,QAAM,aAAa,MAAM,cACvB,oBAAC,SAAI,OAAO,EAAE,WAAW,QAAQ,UAAU,KAAK,OAAO,OAAO,GAC5D,8BAAC,iBAAc,OAAO,MAAM,aAAa,YAAU,MAAC,OAAO,QAAQ,UAAU,WAAW,GAC1F,IACE;AAEJ,QAAM,aACJ,oBAAC,SAAI,OAAO,EAAE,MAAM,GAAG,UAAU,KAAK,WAAW,OAAO,GACtD;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MACN,eAAa;AAAA,MACb,MAAK;AAAA,MACL,UAAS;AAAA,MACT,YAAU;AAAA,MACV,aAAY;AAAA,MACZ,OAAO;AAAA,MACP,UAAU;AAAA;AAAA,EACZ,GACF;AAEF,QAAM,WAAW,EAAE,SAAS,QAAQ,KAAK,WAAW,UAAU,QAAQ,YAAY,OAAO,gBAAgB,UAAU,UAAU,KAAK,OAAO,OAAO;AAEhJ,SACE,oBAAC,QAAK,SAAS,GAAG,SAAQ,SACxB,+BAAC,UAAO,KAAK,GAAG,QAAO,UAAS,OAAO,EAAE,WAAW,SAAS,GAC1D;AAAA,UAAM,WAAW,oBAAC,WAAQ,OAAO,GAAG,mBAAgB,WAAW,gBAAM,SAAQ;AAAA,IAC7E,MAAM,QAAQ,oBAAC,QAAK,OAAM,aAAY,mBAAgB,QAAQ,gBAAM,MAAK;AAAA,IACzE,WAAW,OACV,oBAAC,QAAK,MAAK,UAAS,yCAA2B,IAC7C,MAAM,YACR;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ,MAAM;AAAA,QACd,QAAO;AAAA,QACP,QAAO;AAAA,QACP,OAAO;AAAA,QAGP,UAAU,CAAC,MAAM;AACf,cAAI,MAAM,eAAe,CAAC,OAAQ,GAAE,eAAe;AAAA,QACrD;AAAA,QAEC;AAAA;AAAA,UACA;AAAA,UAEA,MAAM,eAAe,oBAAC,WAAM,MAAK,UAAS,MAAK,WAAU,OAAO,SAAS,QAAQ,IAAI;AAAA,UACtF,oBAAC,UAAO,OAAO,MAAM,aAAa,SAAQ,WAAU,MAAK,MAAK,MAAK,UACjE,8BAAC,UAAK,mBAAgB,eAAe,gBAAM,aAAY,GACzD;AAAA;AAAA;AAAA,IACF,IACE,eACF,qBAAC,UAAK,UAAU,gBAAgB,OAAO,UACpC;AAAA;AAAA,MACA;AAAA,MACD;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,WAAW,SAAS,oBAAe,MAAM;AAAA,UAChD,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,MAAK;AAAA,UACL,WAAW,WAAW;AAAA,UAGrB,qBAAW,SAAS,SAAY,oBAAC,UAAK,mBAAgB,eAAe,gBAAM,aAAY;AAAA;AAAA,MAC1F;AAAA,MACC,WAAW,WACV,oBAAC,QAAK,MAAK,SAAQ,MAAK,cAAa,OAAO,EAAE,OAAO,8BAA8B,GAAG,2DAEtF;AAAA,OAEJ,IAEA,oBAAC,cAAW,qIAAuH;AAAA,KAEvI,GACF;AAEJ;","names":[]}
|
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
export declare const openingHoursBlock: import("../index.js").BlockDefinition<z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
|
|
1
|
+
export declare const openingHoursBlock: import("../index.js").BlockDefinition<import("zod/v4/core").$ZodType<unknown, unknown, import("zod/v4/core").$ZodTypeInternals<unknown, unknown>>>;
|
|
@@ -1,34 +1,8 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { jsonLdHtml } from "./jsonld.js";
|
|
1
|
+
import dynamic from "next/dynamic";
|
|
3
2
|
import { defineBlock } from "../registry.js";
|
|
4
|
-
import { Heading } from "../ui/index.js";
|
|
5
|
-
import { OpenNowBadge } from "./OpenNowBadge.js";
|
|
6
|
-
import { openingHoursSpecJsonLd } from "./lib/openingHours.js";
|
|
7
|
-
function OpeningHoursRender({ block }) {
|
|
8
|
-
const rows = block.rows ?? [];
|
|
9
|
-
const spec = block.jsonLd ? openingHoursSpecJsonLd(rows) : [];
|
|
10
|
-
return /* @__PURE__ */ jsxs("section", { className: "xicms-hours", children: [
|
|
11
|
-
block.heading && /* @__PURE__ */ jsx(Heading, { level: 2, "data-xicms-edit": "heading", children: block.heading }),
|
|
12
|
-
block.showStatus && /* @__PURE__ */ jsx(OpenNowBadge, { rows }),
|
|
13
|
-
/* @__PURE__ */ jsx("table", { className: "xicms-hours-table", children: /* @__PURE__ */ jsx("tbody", { children: rows.map((r, i) => /* @__PURE__ */ jsxs("tr", { children: [
|
|
14
|
-
/* @__PURE__ */ jsx("th", { scope: "row", "data-xicms-edit": `rows.${i}.day`, children: r.day }),
|
|
15
|
-
/* @__PURE__ */ jsx("td", { "data-xicms-edit": `rows.${i}.hours`, children: r.hours })
|
|
16
|
-
] }, i)) }) }),
|
|
17
|
-
spec.length > 0 && /* @__PURE__ */ jsx(
|
|
18
|
-
"script",
|
|
19
|
-
{
|
|
20
|
-
type: "application/ld+json",
|
|
21
|
-
dangerouslySetInnerHTML: {
|
|
22
|
-
// Zelfde @id als contact-/layout-JSON-LD β Google voegt de drie samen tot één bedrijf.
|
|
23
|
-
__html: jsonLdHtml({ "@context": "https://schema.org", "@type": "LocalBusiness", "@id": "#business", openingHoursSpecification: spec })
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
)
|
|
27
|
-
] });
|
|
28
|
-
}
|
|
29
3
|
const openingHoursBlock = defineBlock({
|
|
30
4
|
type: "openingHours",
|
|
31
|
-
Render: OpeningHoursRender,
|
|
5
|
+
Render: dynamic(() => import("./OpeningHoursRender.js").then((m) => m.OpeningHoursRender)),
|
|
32
6
|
label: "Openingstijden",
|
|
33
7
|
icon: "\u{1F552}",
|
|
34
8
|
defaults: () => ({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/blocks/builtins/OpeningHours.tsx"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"sources":["../../../src/blocks/builtins/OpeningHours.tsx"],"sourcesContent":["import dynamic from \"next/dynamic\";\nimport { defineBlock } from \"../registry\";\n\nexport const openingHoursBlock = defineBlock({\n type: \"openingHours\",\n Render: dynamic(() => import(\"./OpeningHoursRender\").then((m) => m.OpeningHoursRender)),\n label: \"Openingstijden\",\n icon: \"π\",\n defaults: () => ({\n heading: \"Openingstijden\",\n rows: [\n { day: \"Maandag t/m vrijdag\", hours: \"09:00 β 17:00\" },\n { day: \"Zaterdag\", hours: \"10:00 β 16:00\" },\n { day: \"Zondag\", hours: \"Gesloten\" },\n ],\n }),\n});\n"],"mappings":"AAAA,OAAO,aAAa;AACpB,SAAS,mBAAmB;AAErB,MAAM,oBAAoB,YAAY;AAAA,EAC3C,MAAM;AAAA,EACN,QAAQ,QAAQ,MAAM,OAAO,sBAAsB,EAAE,KAAK,CAAC,MAAM,EAAE,kBAAkB,CAAC;AAAA,EACtF,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU,OAAO;AAAA,IACf,SAAS;AAAA,IACT,MAAM;AAAA,MACJ,EAAE,KAAK,uBAAuB,OAAO,qBAAgB;AAAA,MACrD,EAAE,KAAK,YAAY,OAAO,qBAAgB;AAAA,MAC1C,EAAE,KAAK,UAAU,OAAO,WAAW;AAAA,IACrC;AAAA,EACF;AACF,CAAC;","names":[]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { z } from "zod";
|
|
2
|
+
import type { OpeningHoursBlockSchema } from "../../schema/blocks.js";
|
|
3
|
+
import type { BlockRenderProps } from "../registry.js";
|
|
4
|
+
type OpeningHours = z.infer<typeof OpeningHoursBlockSchema>;
|
|
5
|
+
/** Openingstijden-tabel. Server-safe; de optionele "Nu geopend"-badge is een client-eiland. */
|
|
6
|
+
export declare function OpeningHoursRender({ block }: BlockRenderProps<OpeningHours>): import("react").JSX.Element;
|
|
7
|
+
export {};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { jsonLdHtml } from "./jsonld.js";
|
|
3
|
+
import { Heading } from "../ui/index.js";
|
|
4
|
+
import { OpenNowBadge } from "./OpenNowBadge.js";
|
|
5
|
+
import { openingHoursSpecJsonLd } from "./lib/openingHours.js";
|
|
6
|
+
function OpeningHoursRender({ block }) {
|
|
7
|
+
const rows = block.rows ?? [];
|
|
8
|
+
const spec = block.jsonLd ? openingHoursSpecJsonLd(rows) : [];
|
|
9
|
+
return /* @__PURE__ */ jsxs("section", { className: "xicms-hours", children: [
|
|
10
|
+
block.heading && /* @__PURE__ */ jsx(Heading, { level: 2, "data-xicms-edit": "heading", children: block.heading }),
|
|
11
|
+
block.showStatus && /* @__PURE__ */ jsx(OpenNowBadge, { rows }),
|
|
12
|
+
/* @__PURE__ */ jsx("table", { className: "xicms-hours-table", children: /* @__PURE__ */ jsx("tbody", { children: rows.map((r, i) => /* @__PURE__ */ jsxs("tr", { children: [
|
|
13
|
+
/* @__PURE__ */ jsx("th", { scope: "row", "data-xicms-edit": `rows.${i}.day`, children: r.day }),
|
|
14
|
+
/* @__PURE__ */ jsx("td", { "data-xicms-edit": `rows.${i}.hours`, children: r.hours })
|
|
15
|
+
] }, i)) }) }),
|
|
16
|
+
spec.length > 0 && /* @__PURE__ */ jsx(
|
|
17
|
+
"script",
|
|
18
|
+
{
|
|
19
|
+
type: "application/ld+json",
|
|
20
|
+
dangerouslySetInnerHTML: {
|
|
21
|
+
// Zelfde @id als contact-/layout-JSON-LD β Google voegt de drie samen tot één bedrijf.
|
|
22
|
+
__html: jsonLdHtml({ "@context": "https://schema.org", "@type": "LocalBusiness", "@id": "#business", openingHoursSpecification: spec })
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
)
|
|
26
|
+
] });
|
|
27
|
+
}
|
|
28
|
+
export {
|
|
29
|
+
OpeningHoursRender
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=OpeningHoursRender.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/blocks/builtins/OpeningHoursRender.tsx"],"sourcesContent":["import type { z } from \"zod\";\nimport { jsonLdHtml } from \"./jsonld\";\nimport type { OpeningHoursBlockSchema } from \"../../schema/blocks\";\nimport type { BlockRenderProps } from \"../registry\";\nimport { Heading } from \"../ui\";\nimport { OpenNowBadge } from \"./OpenNowBadge\";\nimport { openingHoursSpecJsonLd } from \"./lib/openingHours\";\n\ntype OpeningHours = z.infer<typeof OpeningHoursBlockSchema>;\n\n/** Openingstijden-tabel. Server-safe; de optionele \"Nu geopend\"-badge is een client-eiland. */\nexport function OpeningHoursRender({ block }: BlockRenderProps<OpeningHours>) {\n const rows = block.rows ?? [];\n const spec = block.jsonLd ? openingHoursSpecJsonLd(rows) : [];\n return (\n <section className=\"xicms-hours\">\n {block.heading && <Heading level={2} data-xicms-edit=\"heading\">{block.heading}</Heading>}\n {block.showStatus && <OpenNowBadge rows={rows} />}\n <table className=\"xicms-hours-table\">\n <tbody>\n {rows.map((r, i) => (\n <tr key={i}>\n <th scope=\"row\" data-xicms-edit={`rows.${i}.day`}>{r.day}</th>\n <td data-xicms-edit={`rows.${i}.hours`}>{r.hours}</td>\n </tr>\n ))}\n </tbody>\n </table>\n {spec.length > 0 && (\n <script\n type=\"application/ld+json\"\n // eslint-disable-next-line react/no-danger\n dangerouslySetInnerHTML={{\n // Zelfde @id als contact-/layout-JSON-LD β Google voegt de drie samen tot één bedrijf.\n __html: jsonLdHtml({ \"@context\": \"https://schema.org\", \"@type\": \"LocalBusiness\", \"@id\": \"#business\", openingHoursSpecification: spec }),\n }}\n />\n )}\n </section>\n );\n}\n"],"mappings":"AAgBwB,cAKZ,YALY;AAfxB,SAAS,kBAAkB;AAG3B,SAAS,eAAe;AACxB,SAAS,oBAAoB;AAC7B,SAAS,8BAA8B;AAKhC,SAAS,mBAAmB,EAAE,MAAM,GAAmC;AAC5E,QAAM,OAAO,MAAM,QAAQ,CAAC;AAC5B,QAAM,OAAO,MAAM,SAAS,uBAAuB,IAAI,IAAI,CAAC;AAC5D,SACE,qBAAC,aAAQ,WAAU,eAChB;AAAA,UAAM,WAAW,oBAAC,WAAQ,OAAO,GAAG,mBAAgB,WAAW,gBAAM,SAAQ;AAAA,IAC7E,MAAM,cAAc,oBAAC,gBAAa,MAAY;AAAA,IAC/C,oBAAC,WAAM,WAAU,qBACf,8BAAC,WACE,eAAK,IAAI,CAAC,GAAG,MACZ,qBAAC,QACC;AAAA,0BAAC,QAAG,OAAM,OAAM,mBAAiB,QAAQ,CAAC,QAAS,YAAE,KAAI;AAAA,MACzD,oBAAC,QAAG,mBAAiB,QAAQ,CAAC,UAAW,YAAE,OAAM;AAAA,SAF1C,CAGT,CACD,GACH,GACF;AAAA,IACC,KAAK,SAAS,KACb;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QAEL,yBAAyB;AAAA;AAAA,UAEvB,QAAQ,WAAW,EAAE,YAAY,sBAAsB,SAAS,iBAAiB,OAAO,aAAa,2BAA2B,KAAK,CAAC;AAAA,QACxI;AAAA;AAAA,IACF;AAAA,KAEJ;AAEJ;","names":[]}
|
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
export declare const pdfBlock: import("../index.js").BlockDefinition<z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
|
|
1
|
+
export declare const pdfBlock: import("../index.js").BlockDefinition<import("zod/v4/core").$ZodType<unknown, unknown, import("zod/v4/core").$ZodTypeInternals<unknown, unknown>>>;
|
|
@@ -1,82 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
-
import { useState } from "react";
|
|
4
|
-
import { Onvoltooid } from "./lib/Onvoltooid.js";
|
|
1
|
+
import dynamic from "next/dynamic";
|
|
5
2
|
import { defineBlock } from "../registry.js";
|
|
6
|
-
import { VStack, HStack, Heading, Text } from "../ui/index.js";
|
|
7
|
-
function PdfRender({ block, mode }) {
|
|
8
|
-
const docs = (block.documents ?? []).map((d, i) => ({ ...d, _i: i })).filter((d) => d.url);
|
|
9
|
-
const [active, setActive] = useState(0);
|
|
10
|
-
if (docs.length === 0 && !block.heading) return null;
|
|
11
|
-
const current = docs[Math.min(active, docs.length - 1)];
|
|
12
|
-
return /* @__PURE__ */ jsxs(VStack, { gap: 3, as: "section", children: [
|
|
13
|
-
block.heading && /* @__PURE__ */ jsx(Heading, { level: 2, "data-xicms-edit": "heading", children: block.heading }),
|
|
14
|
-
docs.length > 1 && /* @__PURE__ */ jsx(HStack, { gap: 1, style: { flexWrap: "wrap" }, role: "group", "aria-label": "Kies document", children: docs.map((d, i) => /* @__PURE__ */ jsx(
|
|
15
|
-
"button",
|
|
16
|
-
{
|
|
17
|
-
type: "button",
|
|
18
|
-
"aria-pressed": i === active,
|
|
19
|
-
onClick: () => setActive(i),
|
|
20
|
-
style: {
|
|
21
|
-
padding: "0.4rem 0.9rem",
|
|
22
|
-
borderRadius: "var(--radius-full, 999px)",
|
|
23
|
-
border: "1px solid var(--color-border)",
|
|
24
|
-
cursor: "pointer",
|
|
25
|
-
fontWeight: 600,
|
|
26
|
-
fontSize: "0.9rem",
|
|
27
|
-
background: i === active ? "var(--color-accent)" : "transparent",
|
|
28
|
-
color: i === active ? "var(--color-on-accent)" : "var(--color-text-primary)"
|
|
29
|
-
},
|
|
30
|
-
children: /* @__PURE__ */ jsx("span", { "data-xicms-edit": `documents.${d._i}.label`, children: d.label || `Document ${i + 1}` })
|
|
31
|
-
},
|
|
32
|
-
i
|
|
33
|
-
)) }),
|
|
34
|
-
current ? /* @__PURE__ */ jsx(
|
|
35
|
-
"div",
|
|
36
|
-
{
|
|
37
|
-
style: {
|
|
38
|
-
borderRadius: "var(--radius-container)",
|
|
39
|
-
overflow: "hidden",
|
|
40
|
-
border: "1px solid var(--color-border)",
|
|
41
|
-
background: "var(--color-background-muted, rgba(0,0,0,0.03))"
|
|
42
|
-
},
|
|
43
|
-
children: mode === "preview" ? /* @__PURE__ */ jsx("div", { className: "xicms-embed-consent xicms-embed-preview", role: "note", style: { height: Math.min(block.height, 360) }, children: /* @__PURE__ */ jsxs("p", { children: [
|
|
44
|
-
"\u{1F4C4} PDF \u201C",
|
|
45
|
-
current.label || "document",
|
|
46
|
-
"\u201D \u2014 wordt op de live site geladen (niet in de editor)."
|
|
47
|
-
] }) }) : (
|
|
48
|
-
// <object> i.p.v. <iframe>: browsers zonder inline PDF-viewer (veel mobiel) tonen
|
|
49
|
-
// dan de fallback-inhoud met een open/download-knop i.p.v. een leeg vlak.
|
|
50
|
-
/* @__PURE__ */ jsx(
|
|
51
|
-
"object",
|
|
52
|
-
{
|
|
53
|
-
data: `${current.url}#view=FitH`,
|
|
54
|
-
type: "application/pdf",
|
|
55
|
-
"aria-label": current.label || block.heading || "PDF",
|
|
56
|
-
style: { border: 0, width: "100%", height: block.height, display: "block" },
|
|
57
|
-
children: /* @__PURE__ */ jsxs("div", { style: { display: "grid", placeItems: "center", gap: "0.6rem", padding: "2.5rem 1rem", textAlign: "center" }, children: [
|
|
58
|
-
/* @__PURE__ */ jsx(Text, { color: "secondary", children: "Je browser kan deze PDF niet inline tonen." }),
|
|
59
|
-
/* @__PURE__ */ jsxs("a", { className: "xicms-btn", href: current.url, target: "_blank", rel: "noopener noreferrer", children: [
|
|
60
|
-
"\u{1F4C4} Open \u201C",
|
|
61
|
-
current.label || "PDF",
|
|
62
|
-
"\u201D"
|
|
63
|
-
] })
|
|
64
|
-
] })
|
|
65
|
-
}
|
|
66
|
-
)
|
|
67
|
-
)
|
|
68
|
-
}
|
|
69
|
-
) : /* @__PURE__ */ jsx(Onvoltooid, { children: "Dit PDF-blok is nog leeg: kies een document via het tandwiel. Bezoekers zien dit blok niet." }),
|
|
70
|
-
block.showDownload && current && /* @__PURE__ */ jsx("a", { href: current.url, target: "_blank", rel: "noopener noreferrer", style: { color: "var(--color-accent)" }, children: /* @__PURE__ */ jsxs(Text, { type: "label", children: [
|
|
71
|
-
"\u2197 Open \u201C",
|
|
72
|
-
current.label || "PDF",
|
|
73
|
-
"\u201D in een nieuw tabblad"
|
|
74
|
-
] }) })
|
|
75
|
-
] });
|
|
76
|
-
}
|
|
77
3
|
const pdfBlock = defineBlock({
|
|
78
4
|
type: "pdf",
|
|
79
|
-
Render: PdfRender,
|
|
5
|
+
Render: dynamic(() => import("./PdfBlockRender.js").then((m) => m.PdfRender)),
|
|
80
6
|
label: "PDF-lezer (menu/document)",
|
|
81
7
|
icon: "\u{1F4C4}",
|
|
82
8
|
defaults: () => ({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/blocks/builtins/PdfBlock.tsx"],"sourcesContent":["
|
|
1
|
+
{"version":3,"sources":["../../../src/blocks/builtins/PdfBlock.tsx"],"sourcesContent":["import dynamic from \"next/dynamic\";\nimport { defineBlock } from \"../registry\";\n\nexport const pdfBlock = defineBlock({\n type: \"pdf\",\n Render: dynamic(() => import(\"./PdfBlockRender\").then((m) => m.PdfRender)),\n label: \"PDF-lezer (menu/document)\",\n icon: \"π\",\n defaults: () => ({\n heading: \"Onze kaart\",\n documents: [\n { label: \"Lunchkaart\", url: \"\" },\n { label: \"Dinerkaart\", url: \"\" },\n ],\n height: 820,\n showDownload: true,\n }),\n});\n"],"mappings":"AAAA,OAAO,aAAa;AACpB,SAAS,mBAAmB;AAErB,MAAM,WAAW,YAAY;AAAA,EAClC,MAAM;AAAA,EACN,QAAQ,QAAQ,MAAM,OAAO,kBAAkB,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC;AAAA,EACzE,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU,OAAO;AAAA,IACf,SAAS;AAAA,IACT,WAAW;AAAA,MACT,EAAE,OAAO,cAAc,KAAK,GAAG;AAAA,MAC/B,EAAE,OAAO,cAAc,KAAK,GAAG;AAAA,IACjC;AAAA,IACA,QAAQ;AAAA,IACR,cAAc;AAAA,EAChB;AACF,CAAC;","names":[]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { z } from "zod";
|
|
2
|
+
import type { PdfBlockSchema } from "../../schema/blocks.js";
|
|
3
|
+
import type { BlockRenderProps } from "../registry.js";
|
|
4
|
+
type Pdf = z.infer<typeof PdfBlockSchema>;
|
|
5
|
+
/**
|
|
6
|
+
* Inline PDF-lezer voor bv. menukaarten. EΓ©n of meer PDF's; bij meerdere verschijnen tabs
|
|
7
|
+
* (lunchkaart/dinerkaart/wijnkaartβ¦). De klant vervangt de PDF's zelf in de editor (URL of
|
|
8
|
+
* media-upload). In de editor (mode="preview") tonen we een lichte placeholder i.p.v. de iframe.
|
|
9
|
+
*/
|
|
10
|
+
export declare function PdfRender({ block, mode }: BlockRenderProps<Pdf>): import("react").JSX.Element | null;
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
import { Onvoltooid } from "./lib/Onvoltooid.js";
|
|
5
|
+
import { VStack, HStack, Heading, Text } from "../ui/index.js";
|
|
6
|
+
function PdfRender({ block, mode }) {
|
|
7
|
+
const docs = (block.documents ?? []).map((d, i) => ({ ...d, _i: i })).filter((d) => d.url);
|
|
8
|
+
const [active, setActive] = useState(0);
|
|
9
|
+
if (docs.length === 0 && !block.heading) return null;
|
|
10
|
+
const current = docs[Math.min(active, docs.length - 1)];
|
|
11
|
+
return /* @__PURE__ */ jsxs(VStack, { gap: 3, as: "section", children: [
|
|
12
|
+
block.heading && /* @__PURE__ */ jsx(Heading, { level: 2, "data-xicms-edit": "heading", children: block.heading }),
|
|
13
|
+
docs.length > 1 && /* @__PURE__ */ jsx(HStack, { gap: 1, style: { flexWrap: "wrap" }, role: "group", "aria-label": "Kies document", children: docs.map((d, i) => /* @__PURE__ */ jsx(
|
|
14
|
+
"button",
|
|
15
|
+
{
|
|
16
|
+
type: "button",
|
|
17
|
+
"aria-pressed": i === active,
|
|
18
|
+
onClick: () => setActive(i),
|
|
19
|
+
style: {
|
|
20
|
+
padding: "0.4rem 0.9rem",
|
|
21
|
+
borderRadius: "var(--radius-full, 999px)",
|
|
22
|
+
border: "1px solid var(--color-border)",
|
|
23
|
+
cursor: "pointer",
|
|
24
|
+
fontWeight: 600,
|
|
25
|
+
fontSize: "0.9rem",
|
|
26
|
+
background: i === active ? "var(--color-accent)" : "transparent",
|
|
27
|
+
color: i === active ? "var(--color-on-accent)" : "var(--color-text-primary)"
|
|
28
|
+
},
|
|
29
|
+
children: /* @__PURE__ */ jsx("span", { "data-xicms-edit": `documents.${d._i}.label`, children: d.label || `Document ${i + 1}` })
|
|
30
|
+
},
|
|
31
|
+
i
|
|
32
|
+
)) }),
|
|
33
|
+
current ? /* @__PURE__ */ jsx(
|
|
34
|
+
"div",
|
|
35
|
+
{
|
|
36
|
+
style: {
|
|
37
|
+
borderRadius: "var(--radius-container)",
|
|
38
|
+
overflow: "hidden",
|
|
39
|
+
border: "1px solid var(--color-border)",
|
|
40
|
+
background: "var(--color-background-muted, rgba(0,0,0,0.03))"
|
|
41
|
+
},
|
|
42
|
+
children: mode === "preview" ? /* @__PURE__ */ jsx("div", { className: "xicms-embed-consent xicms-embed-preview", role: "note", style: { height: Math.min(block.height, 360) }, children: /* @__PURE__ */ jsxs("p", { children: [
|
|
43
|
+
"\u{1F4C4} PDF \u201C",
|
|
44
|
+
current.label || "document",
|
|
45
|
+
"\u201D \u2014 wordt op de live site geladen (niet in de editor)."
|
|
46
|
+
] }) }) : (
|
|
47
|
+
// <object> i.p.v. <iframe>: browsers zonder inline PDF-viewer (veel mobiel) tonen
|
|
48
|
+
// dan de fallback-inhoud met een open/download-knop i.p.v. een leeg vlak.
|
|
49
|
+
/* @__PURE__ */ jsx(
|
|
50
|
+
"object",
|
|
51
|
+
{
|
|
52
|
+
data: `${current.url}#view=FitH`,
|
|
53
|
+
type: "application/pdf",
|
|
54
|
+
"aria-label": current.label || block.heading || "PDF",
|
|
55
|
+
style: { border: 0, width: "100%", height: block.height, display: "block" },
|
|
56
|
+
children: /* @__PURE__ */ jsxs("div", { style: { display: "grid", placeItems: "center", gap: "0.6rem", padding: "2.5rem 1rem", textAlign: "center" }, children: [
|
|
57
|
+
/* @__PURE__ */ jsx(Text, { color: "secondary", children: "Je browser kan deze PDF niet inline tonen." }),
|
|
58
|
+
/* @__PURE__ */ jsxs("a", { className: "xicms-btn", href: current.url, target: "_blank", rel: "noopener noreferrer", children: [
|
|
59
|
+
"\u{1F4C4} Open \u201C",
|
|
60
|
+
current.label || "PDF",
|
|
61
|
+
"\u201D"
|
|
62
|
+
] })
|
|
63
|
+
] })
|
|
64
|
+
}
|
|
65
|
+
)
|
|
66
|
+
)
|
|
67
|
+
}
|
|
68
|
+
) : /* @__PURE__ */ jsx(Onvoltooid, { children: "Dit PDF-blok is nog leeg: kies een document via het tandwiel. Bezoekers zien dit blok niet." }),
|
|
69
|
+
block.showDownload && current && /* @__PURE__ */ jsx("a", { href: current.url, target: "_blank", rel: "noopener noreferrer", style: { color: "var(--color-accent)" }, children: /* @__PURE__ */ jsxs(Text, { type: "label", children: [
|
|
70
|
+
"\u2197 Open \u201C",
|
|
71
|
+
current.label || "PDF",
|
|
72
|
+
"\u201D in een nieuw tabblad"
|
|
73
|
+
] }) })
|
|
74
|
+
] });
|
|
75
|
+
}
|
|
76
|
+
export {
|
|
77
|
+
PdfRender
|
|
78
|
+
};
|
|
79
|
+
//# sourceMappingURL=PdfBlockRender.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/blocks/builtins/PdfBlockRender.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport type { z } from \"zod\";\nimport { Onvoltooid } from \"./lib/Onvoltooid\";\nimport type { PdfBlockSchema } from \"../../schema/blocks\";\nimport type { BlockRenderProps } from \"../registry\";\nimport { VStack, HStack, Heading, Text } from \"../ui\";\n\ntype Pdf = z.infer<typeof PdfBlockSchema>;\n\n/**\n * Inline PDF-lezer voor bv. menukaarten. EΓ©n of meer PDF's; bij meerdere verschijnen tabs\n * (lunchkaart/dinerkaart/wijnkaartβ¦). De klant vervangt de PDF's zelf in de editor (URL of\n * media-upload). In de editor (mode=\"preview\") tonen we een lichte placeholder i.p.v. de iframe.\n */\nexport function PdfRender({ block, mode }: BlockRenderProps<Pdf>) {\n // _i = index in de OORSPRONKELIJKE array β de lijst wordt gefilterd op url.\n const docs = (block.documents ?? []).map((d, i) => ({ ...d, _i: i })).filter((d) => d.url);\n const [active, setActive] = useState(0);\n if (docs.length === 0 && !block.heading) return null;\n const current = docs[Math.min(active, docs.length - 1)];\n\n return (\n <VStack gap={3} as=\"section\">\n {block.heading && <Heading level={2} data-xicms-edit=\"heading\">{block.heading}</Heading>}\n\n {/* Gewone toggle-knoppen: een echt tabs-patroon vereist tabpanel-koppeling + pijltjesnavigatie. */}\n {docs.length > 1 && (\n <HStack gap={1} style={{ flexWrap: \"wrap\" }} role=\"group\" aria-label=\"Kies document\">\n {docs.map((d, i) => (\n <button\n key={i}\n type=\"button\"\n aria-pressed={i === active}\n onClick={() => setActive(i)}\n style={{\n padding: \"0.4rem 0.9rem\",\n borderRadius: \"var(--radius-full, 999px)\",\n border: \"1px solid var(--color-border)\",\n cursor: \"pointer\",\n fontWeight: 600,\n fontSize: \"0.9rem\",\n background: i === active ? \"var(--color-accent)\" : \"transparent\",\n color: i === active ? \"var(--color-on-accent)\" : \"var(--color-text-primary)\",\n }}\n >\n <span data-xicms-edit={`documents.${d._i}.label`}>{d.label || `Document ${i + 1}`}</span>\n </button>\n ))}\n </HStack>\n )}\n\n {current ? (\n <div\n style={{\n borderRadius: \"var(--radius-container)\",\n overflow: \"hidden\",\n border: \"1px solid var(--color-border)\",\n background: \"var(--color-background-muted, rgba(0,0,0,0.03))\",\n }}\n >\n {mode === \"preview\" ? (\n <div className=\"xicms-embed-consent xicms-embed-preview\" role=\"note\" style={{ height: Math.min(block.height, 360) }}>\n <p>π PDF β{current.label || \"document\"}β β wordt op de live site geladen (niet in de editor).</p>\n </div>\n ) : (\n // <object> i.p.v. <iframe>: browsers zonder inline PDF-viewer (veel mobiel) tonen\n // dan de fallback-inhoud met een open/download-knop i.p.v. een leeg vlak.\n <object\n data={`${current.url}#view=FitH`}\n type=\"application/pdf\"\n aria-label={current.label || block.heading || \"PDF\"}\n style={{ border: 0, width: \"100%\", height: block.height, display: \"block\" }}\n >\n <div style={{ display: \"grid\", placeItems: \"center\", gap: \"0.6rem\", padding: \"2.5rem 1rem\", textAlign: \"center\" }}>\n <Text color=\"secondary\">Je browser kan deze PDF niet inline tonen.</Text>\n <a className=\"xicms-btn\" href={current.url} target=\"_blank\" rel=\"noopener noreferrer\">\n π Open β{current.label || \"PDF\"}β\n </a>\n </div>\n </object>\n )}\n </div>\n ) : (\n <Onvoltooid>Dit PDF-blok is nog leeg: kies een document via het tandwiel. Bezoekers zien dit blok niet.</Onvoltooid>\n )}\n\n {block.showDownload && current && (\n <a href={current.url} target=\"_blank\" rel=\"noopener noreferrer\" style={{ color: \"var(--color-accent)\" }}>\n <Text type=\"label\">β Open β{current.label || \"PDF\"}β in een nieuw tabblad</Text>\n </a>\n )}\n </VStack>\n );\n}\n"],"mappings":";AAyBwB,cAuCV,YAvCU;AAvBxB,SAAS,gBAAgB;AAEzB,SAAS,kBAAkB;AAG3B,SAAS,QAAQ,QAAQ,SAAS,YAAY;AASvC,SAAS,UAAU,EAAE,OAAO,KAAK,GAA0B;AAEhE,QAAM,QAAQ,MAAM,aAAa,CAAC,GAAG,IAAI,CAAC,GAAG,OAAO,EAAE,GAAG,GAAG,IAAI,EAAE,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE,GAAG;AACzF,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,CAAC;AACtC,MAAI,KAAK,WAAW,KAAK,CAAC,MAAM,QAAS,QAAO;AAChD,QAAM,UAAU,KAAK,KAAK,IAAI,QAAQ,KAAK,SAAS,CAAC,CAAC;AAEtD,SACE,qBAAC,UAAO,KAAK,GAAG,IAAG,WAChB;AAAA,UAAM,WAAW,oBAAC,WAAQ,OAAO,GAAG,mBAAgB,WAAW,gBAAM,SAAQ;AAAA,IAG7E,KAAK,SAAS,KACb,oBAAC,UAAO,KAAK,GAAG,OAAO,EAAE,UAAU,OAAO,GAAG,MAAK,SAAQ,cAAW,iBAClE,eAAK,IAAI,CAAC,GAAG,MACZ;AAAA,MAAC;AAAA;AAAA,QAEC,MAAK;AAAA,QACL,gBAAc,MAAM;AAAA,QACpB,SAAS,MAAM,UAAU,CAAC;AAAA,QAC1B,OAAO;AAAA,UACL,SAAS;AAAA,UACT,cAAc;AAAA,UACd,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,YAAY,MAAM,SAAS,wBAAwB;AAAA,UACnD,OAAO,MAAM,SAAS,2BAA2B;AAAA,QACnD;AAAA,QAEA,8BAAC,UAAK,mBAAiB,aAAa,EAAE,EAAE,UAAW,YAAE,SAAS,YAAY,IAAI,CAAC,IAAG;AAAA;AAAA,MAf7E;AAAA,IAgBP,CACD,GACH;AAAA,IAGD,UACC;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,cAAc;AAAA,UACd,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,YAAY;AAAA,QACd;AAAA,QAEC,mBAAS,YACR,oBAAC,SAAI,WAAU,2CAA0C,MAAK,QAAO,OAAO,EAAE,QAAQ,KAAK,IAAI,MAAM,QAAQ,GAAG,EAAE,GAChH,+BAAC,OAAE;AAAA;AAAA,UAAS,QAAQ,SAAS;AAAA,UAAW;AAAA,WAAsD,GAChG;AAAA;AAAA;AAAA,UAIA;AAAA,YAAC;AAAA;AAAA,cACC,MAAM,GAAG,QAAQ,GAAG;AAAA,cACpB,MAAK;AAAA,cACL,cAAY,QAAQ,SAAS,MAAM,WAAW;AAAA,cAC9C,OAAO,EAAE,QAAQ,GAAG,OAAO,QAAQ,QAAQ,MAAM,QAAQ,SAAS,QAAQ;AAAA,cAE1E,+BAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,UAAU,SAAS,eAAe,WAAW,SAAS,GAC9G;AAAA,oCAAC,QAAK,OAAM,aAAY,wDAA0C;AAAA,gBAClE,qBAAC,OAAE,WAAU,aAAY,MAAM,QAAQ,KAAK,QAAO,UAAS,KAAI,uBAAsB;AAAA;AAAA,kBAC1E,QAAQ,SAAS;AAAA,kBAAM;AAAA,mBACnC;AAAA,iBACF;AAAA;AAAA,UACF;AAAA;AAAA;AAAA,IAEJ,IAEA,oBAAC,cAAW,yGAA2F;AAAA,IAGxG,MAAM,gBAAgB,WACrB,oBAAC,OAAE,MAAM,QAAQ,KAAK,QAAO,UAAS,KAAI,uBAAsB,OAAO,EAAE,OAAO,sBAAsB,GACpG,+BAAC,QAAK,MAAK,SAAQ;AAAA;AAAA,MAAS,QAAQ,SAAS;AAAA,MAAM;AAAA,OAAsB,GAC3E;AAAA,KAEJ;AAEJ;","names":[]}
|
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
export declare const portfolioBlock: import("../index.js").BlockDefinition<z.core.$ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>>;
|
|
1
|
+
export declare const portfolioBlock: import("../index.js").BlockDefinition<import("zod/v4/core").$ZodType<unknown, unknown, import("zod/v4/core").$ZodTypeInternals<unknown, unknown>>>;
|