@xiwebdesign/xicms-core 4.17.1 → 5.0.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/XiCMSProvider.d.ts +7 -0
- package/dist/XiCMSProvider.js +32 -7
- package/dist/XiCMSProvider.js.map +1 -1
- package/dist/admin/blockEditors/GenericEditor.d.ts +22 -0
- package/dist/admin/blockEditors/GenericEditor.js +201 -0
- package/dist/admin/blockEditors/GenericEditor.js.map +1 -0
- package/dist/admin/blockEditors/SymbolRefEditor.d.ts +2 -0
- package/dist/admin/blockEditors/SymbolRefEditor.js +55 -0
- package/dist/admin/blockEditors/SymbolRefEditor.js.map +1 -0
- package/dist/admin/blockEditors/index.d.ts +11 -6
- package/dist/admin/blockEditors/index.js +49 -620
- package/dist/admin/blockEditors/index.js.map +1 -1
- package/dist/admin/customBlocks/CustomBlocksPanel.d.ts +3 -0
- package/dist/admin/customBlocks/CustomBlocksPanel.js +145 -0
- package/dist/admin/customBlocks/CustomBlocksPanel.js.map +1 -0
- package/dist/admin/lib/compressImage.d.ts +4 -2
- package/dist/admin/lib/compressImage.js +7 -5
- package/dist/admin/lib/compressImage.js.map +1 -1
- package/dist/admin/lib/mediaUsage.d.ts +4 -3
- package/dist/admin/lib/mediaUsage.js +21 -10
- package/dist/admin/lib/mediaUsage.js.map +1 -1
- package/dist/admin/lib/symbolsClient.d.ts +13 -0
- package/dist/admin/lib/symbolsClient.js +51 -0
- package/dist/admin/lib/symbolsClient.js.map +1 -0
- package/dist/admin/lib/upload.d.ts +4 -0
- package/dist/admin/lib/upload.js +26 -6
- package/dist/admin/lib/upload.js.map +1 -1
- package/dist/admin/lib/zodFields.d.ts +18 -0
- package/dist/admin/lib/zodFields.js +65 -2
- package/dist/admin/lib/zodFields.js.map +1 -1
- package/dist/admin/media/MediaManager.js +23 -7
- package/dist/admin/media/MediaManager.js.map +1 -1
- package/dist/admin/media/MediaPicker.js +12 -2
- package/dist/admin/media/MediaPicker.js.map +1 -1
- package/dist/admin/panelRegistry.js +3 -0
- package/dist/admin/panelRegistry.js.map +1 -1
- package/dist/admin/settings/SettingsPanel.js +6 -1
- package/dist/admin/settings/SettingsPanel.js.map +1 -1
- package/dist/admin/settings/SnapshotsCard.d.ts +3 -0
- package/dist/admin/settings/SnapshotsCard.js +98 -0
- package/dist/admin/settings/SnapshotsCard.js.map +1 -0
- package/dist/admin/visual/TranslationPanel.d.ts +13 -0
- package/dist/admin/visual/TranslationPanel.js +73 -0
- package/dist/admin/visual/TranslationPanel.js.map +1 -0
- package/dist/admin/visual/VisualEditor.js +146 -18
- package/dist/admin/visual/VisualEditor.js.map +1 -1
- package/dist/admin.css +1 -1
- package/dist/agentFiles/catalog.d.ts +21 -0
- package/dist/agentFiles/catalog.js +78 -0
- package/dist/agentFiles/catalog.js.map +1 -0
- package/dist/agentFiles/files.d.ts +59 -0
- package/dist/agentFiles/files.js +109 -0
- package/dist/agentFiles/files.js.map +1 -0
- package/dist/blocks/builtins/Agenda.d.ts +6 -0
- package/dist/blocks/builtins/Agenda.js +14 -6
- package/dist/blocks/builtins/Agenda.js.map +1 -1
- package/dist/blocks/builtins/BeforeAfter.js +1 -0
- package/dist/blocks/builtins/BeforeAfter.js.map +1 -1
- package/dist/blocks/builtins/Breadcrumbs.js +5 -1
- package/dist/blocks/builtins/Breadcrumbs.js.map +1 -1
- package/dist/blocks/builtins/Cards.js +4 -2
- package/dist/blocks/builtins/Cards.js.map +1 -1
- package/dist/blocks/builtins/Contact.js +2 -1
- package/dist/blocks/builtins/Contact.js.map +1 -1
- package/dist/blocks/builtins/Cta.js +1 -0
- package/dist/blocks/builtins/Cta.js.map +1 -1
- package/dist/blocks/builtins/Elements.js +1 -0
- package/dist/blocks/builtins/Elements.js.map +1 -1
- package/dist/blocks/builtins/Faq.js +5 -4
- package/dist/blocks/builtins/Faq.js.map +1 -1
- package/dist/blocks/builtins/Gallery.js +2 -2
- package/dist/blocks/builtins/Gallery.js.map +1 -1
- package/dist/blocks/builtins/Hero.js +2 -2
- package/dist/blocks/builtins/Hero.js.map +1 -1
- package/dist/blocks/builtins/Jobs.d.ts +8 -1
- package/dist/blocks/builtins/Jobs.js +38 -21
- package/dist/blocks/builtins/Jobs.js.map +1 -1
- package/dist/blocks/builtins/MapBlock.js +31 -4
- package/dist/blocks/builtins/MapBlock.js.map +1 -1
- package/dist/blocks/builtins/PdfBlock.js +2 -3
- package/dist/blocks/builtins/PdfBlock.js.map +1 -1
- package/dist/blocks/builtins/Portfolio.js +2 -2
- package/dist/blocks/builtins/Portfolio.js.map +1 -1
- package/dist/blocks/builtins/Pricing.d.ts +2 -0
- package/dist/blocks/builtins/Pricing.js +18 -10
- package/dist/blocks/builtins/Pricing.js.map +1 -1
- package/dist/blocks/builtins/Sections.js +4 -2
- package/dist/blocks/builtins/Sections.js.map +1 -1
- package/dist/blocks/builtins/Slider.js +21 -3
- package/dist/blocks/builtins/Slider.js.map +1 -1
- package/dist/blocks/builtins/SymbolRef.d.ts +2 -0
- package/dist/blocks/builtins/SymbolRef.js +61 -0
- package/dist/blocks/builtins/SymbolRef.js.map +1 -0
- package/dist/blocks/builtins/Testimonials.js +21 -18
- package/dist/blocks/builtins/Testimonials.js.map +1 -1
- package/dist/blocks/builtins/WhatsappChat.js +1 -1
- package/dist/blocks/builtins/WhatsappChat.js.map +1 -1
- package/dist/blocks/builtins/Widgets.js +2 -3
- package/dist/blocks/builtins/Widgets.js.map +1 -1
- package/dist/blocks/builtins/lib/ics.js +1 -1
- package/dist/blocks/builtins/lib/ics.js.map +1 -1
- package/dist/blocks/builtins/lib/openingHours.d.ts +4 -1
- package/dist/blocks/builtins/lib/openingHours.js +11 -5
- package/dist/blocks/builtins/lib/openingHours.js.map +1 -1
- package/dist/blocks/customTemplate/definition.d.ts +7 -0
- package/dist/blocks/customTemplate/definition.js +34 -0
- package/dist/blocks/customTemplate/definition.js.map +1 -0
- package/dist/blocks/customTemplate/interpret.d.ts +10 -0
- package/dist/blocks/customTemplate/interpret.js +136 -0
- package/dist/blocks/customTemplate/interpret.js.map +1 -0
- package/dist/blocks/registry.d.ts +8 -0
- package/dist/blocks/registry.js.map +1 -1
- package/dist/demo/demoStore.d.ts +11 -1
- package/dist/demo/demoStore.js +50 -0
- package/dist/demo/demoStore.js.map +1 -1
- package/dist/firebase/client.js +2 -1
- package/dist/firebase/client.js.map +1 -1
- package/dist/i18n/overlay.d.ts +61 -0
- package/dist/i18n/overlay.js +90 -0
- package/dist/i18n/overlay.js.map +1 -0
- package/dist/index.d.ts +11 -9
- package/dist/index.js +34 -9
- package/dist/index.js.map +1 -1
- package/dist/modules/builtins.js +3 -2
- package/dist/modules/builtins.js.map +1 -1
- package/dist/modules/consent/useConsent.js +15 -3
- package/dist/modules/consent/useConsent.js.map +1 -1
- package/dist/schema/blocks.d.ts +183 -3
- package/dist/schema/blocks.js +12 -1
- package/dist/schema/blocks.js.map +1 -1
- package/dist/schema/customBlocks.d.ts +47 -0
- package/dist/schema/customBlocks.js +32 -0
- package/dist/schema/customBlocks.js.map +1 -0
- package/dist/schema/fields.d.ts +122 -0
- package/dist/schema/fields.js +120 -0
- package/dist/schema/fields.js.map +1 -0
- package/dist/schema/forms.d.ts +6 -6
- package/dist/schema/pages.d.ts +15 -1
- package/dist/schema/pages.js +6 -2
- package/dist/schema/pages.js.map +1 -1
- package/dist/schema/siteConfig.d.ts +14 -8
- package/dist/schema/siteConfig.js +2 -1
- package/dist/schema/siteConfig.js.map +1 -1
- package/dist/schema/symbols.d.ts +205 -0
- package/dist/schema/symbols.js +18 -0
- package/dist/schema/symbols.js.map +1 -0
- package/dist/server/index.d.ts +2 -1
- package/dist/server/index.js +24 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/pages.d.ts +21 -0
- package/dist/server/pages.js +77 -0
- package/dist/server/pages.js.map +1 -1
- package/dist/server/seo.d.ts +12 -3
- package/dist/server/seo.js +23 -11
- package/dist/server/seo.js.map +1 -1
- package/dist/styles.css +62 -6
- package/package.json +1 -1
- package/dist/components/EditableImage.d.ts +0 -18
- package/dist/components/EditableImage.js +0 -62
- package/dist/components/EditableImage.js.map +0 -1
- package/dist/components/EditableRichText.d.ts +0 -14
- package/dist/components/EditableRichText.js +0 -26
- package/dist/components/EditableRichText.js.map +0 -1
- package/dist/components/EditableText.d.ts +0 -21
- package/dist/components/EditableText.js +0 -25
- package/dist/components/EditableText.js.map +0 -1
- package/dist/content/ContentProvider.d.ts +0 -23
- package/dist/content/ContentProvider.js +0 -86
- package/dist/content/ContentProvider.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/EditableImage.tsx"],"sourcesContent":["\"use client\";\n\nimport { useRef, useState, type CSSProperties } from \"react\";\nimport { useContent } from \"../content/ContentProvider\";\nimport { useSiteConfig } from \"../config\";\nimport { uploadImage } from \"../admin/lib/upload\";\n\ninterface EditableImageProps {\n /** Stabiel content-id, bv. \"home.hero.image\". */\n id: string;\n /** Standaard-afbeelding (URL) zolang er geen upload is. */\n src?: string;\n alt?: string;\n className?: string;\n style?: CSSProperties;\n}\n\n/**\n * Bewerkbare afbeelding. In bewerk-modus kan een nieuwe afbeelding worden geüpload via dezelfde\n * gedeelde pipeline als het beheer (`uploadImage`: automatische webp-compressie + media-registratie),\n * zodat inline bewerken en de block-editor consistent zijn. De URL wordt als content-waarde opgeslagen.\n */\n/** @deprecated Legacy inline (v1). Gebruik een image-block (inline vervangen via de mediakiezer). */\nexport function EditableImage({ id, src, alt = \"\", className, style }: EditableImageProps) {\n const { get, set, editMode, canEdit } = useContent();\n const { siteId } = useSiteConfig();\n const inputRef = useRef<HTMLInputElement>(null);\n const [busy, setBusy] = useState(false);\n const url = get(id, src ?? \"\");\n\n async function handleFile(file: File) {\n setBusy(true);\n try {\n const { url: uploaded } = await uploadImage(siteId, file);\n await set(id, uploaded);\n } catch (e) {\n // eslint-disable-next-line no-alert\n if (typeof window !== \"undefined\") window.alert(`Upload mislukt: ${(e as Error).message}`);\n } finally {\n setBusy(false);\n }\n }\n\n const img = url ? (\n // eslint-disable-next-line @next/next/no-img-element\n <img src={url} alt={alt} className={className} style={style} />\n ) : (\n <div className={className} style={{ background: \"#e5e7eb\", ...style }} aria-label={alt} />\n );\n\n if (editMode && canEdit) {\n return (\n <div style={{ position: \"relative\", display: \"inline-block\" }} className=\"xicms-editable\">\n {img}\n <button\n type=\"button\"\n className=\"xicms-btn\"\n style={{ position: \"absolute\", bottom: 8, left: 8 }}\n disabled={busy}\n onClick={() => inputRef.current?.click()}\n >\n {busy ? \"Uploaden…\" : \"Afbeelding wijzigen\"}\n </button>\n <input\n ref={inputRef}\n type=\"file\"\n accept=\"image/*\"\n hidden\n onChange={(e) => {\n const f = e.target.files?.[0];\n if (f) void handleFile(f);\n }}\n />\n </div>\n );\n }\n\n return img;\n}\n"],"mappings":";AA6CI,cAOE,YAPF;AA3CJ,SAAS,QAAQ,gBAAoC;AACrD,SAAS,kBAAkB;AAC3B,SAAS,qBAAqB;AAC9B,SAAS,mBAAmB;AAkBrB,SAAS,cAAc,EAAE,IAAI,KAAK,MAAM,IAAI,WAAW,MAAM,GAAuB;AACzF,QAAM,EAAE,KAAK,KAAK,UAAU,QAAQ,IAAI,WAAW;AACnD,QAAM,EAAE,OAAO,IAAI,cAAc;AACjC,QAAM,WAAW,OAAyB,IAAI;AAC9C,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,KAAK;AACtC,QAAM,MAAM,IAAI,IAAI,OAAO,EAAE;AAE7B,iBAAe,WAAW,MAAY;AACpC,YAAQ,IAAI;AACZ,QAAI;AACF,YAAM,EAAE,KAAK,SAAS,IAAI,MAAM,YAAY,QAAQ,IAAI;AACxD,YAAM,IAAI,IAAI,QAAQ;AAAA,IACxB,SAAS,GAAG;AAEV,UAAI,OAAO,WAAW,YAAa,QAAO,MAAM,mBAAoB,EAAY,OAAO,EAAE;AAAA,IAC3F,UAAE;AACA,cAAQ,KAAK;AAAA,IACf;AAAA,EACF;AAEA,QAAM,MAAM;AAAA;AAAA,IAEV,oBAAC,SAAI,KAAK,KAAK,KAAU,WAAsB,OAAc;AAAA,MAE7D,oBAAC,SAAI,WAAsB,OAAO,EAAE,YAAY,WAAW,GAAG,MAAM,GAAG,cAAY,KAAK;AAG1F,MAAI,YAAY,SAAS;AACvB,WACE,qBAAC,SAAI,OAAO,EAAE,UAAU,YAAY,SAAS,eAAe,GAAG,WAAU,kBACtE;AAAA;AAAA,MACD;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,OAAO,EAAE,UAAU,YAAY,QAAQ,GAAG,MAAM,EAAE;AAAA,UAClD,UAAU;AAAA,UACV,SAAS,MAAM,SAAS,SAAS,MAAM;AAAA,UAEtC,iBAAO,mBAAc;AAAA;AAAA,MACxB;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,KAAK;AAAA,UACL,MAAK;AAAA,UACL,QAAO;AAAA,UACP,QAAM;AAAA,UACN,UAAU,CAAC,MAAM;AACf,kBAAM,IAAI,EAAE,OAAO,QAAQ,CAAC;AAC5B,gBAAI,EAAG,MAAK,WAAW,CAAC;AAAA,UAC1B;AAAA;AAAA,MACF;AAAA,OACF;AAAA,EAEJ;AAEA,SAAO;AACT;","names":[]}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { type CSSProperties } from "react";
|
|
2
|
-
interface EditableRichTextProps {
|
|
3
|
-
id: string;
|
|
4
|
-
className?: string;
|
|
5
|
-
style?: CSSProperties;
|
|
6
|
-
children?: string;
|
|
7
|
-
}
|
|
8
|
-
/**
|
|
9
|
-
* Meerregelig bewerkbaar tekstblok (platte tekst, regelafbrekingen blijven behouden).
|
|
10
|
-
* In bewerk-modus een textarea; daarbuiten paragrafen. Bewust géén HTML, om XSS te vermijden.
|
|
11
|
-
*/
|
|
12
|
-
/** @deprecated Legacy inline (v1). Gebruik een richText-block + de visuele editor. */
|
|
13
|
-
export declare function EditableRichText({ id, className, style, children }: EditableRichTextProps): import("react").JSX.Element;
|
|
14
|
-
export {};
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import { jsx } from "react/jsx-runtime";
|
|
3
|
-
import { useContent } from "../content/ContentProvider";
|
|
4
|
-
function EditableRichText({ id, className, style, children }) {
|
|
5
|
-
const { get, set, editMode, canEdit } = useContent();
|
|
6
|
-
const value = get(id, children ?? "");
|
|
7
|
-
if (editMode && canEdit) {
|
|
8
|
-
return /* @__PURE__ */ jsx(
|
|
9
|
-
"textarea",
|
|
10
|
-
{
|
|
11
|
-
className: `${className ?? ""} xicms-editable`.trim(),
|
|
12
|
-
style: { width: "100%", minHeight: 120, ...style },
|
|
13
|
-
defaultValue: value,
|
|
14
|
-
"data-xicms-id": id,
|
|
15
|
-
onBlur: (e) => {
|
|
16
|
-
if (e.currentTarget.value !== value) void set(id, e.currentTarget.value);
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
);
|
|
20
|
-
}
|
|
21
|
-
return /* @__PURE__ */ jsx("div", { className, style, children: value.split(/\n{2,}/).map((para, i) => /* @__PURE__ */ jsx("p", { style: { whiteSpace: "pre-wrap" }, children: para }, i)) });
|
|
22
|
-
}
|
|
23
|
-
export {
|
|
24
|
-
EditableRichText
|
|
25
|
-
};
|
|
26
|
-
//# sourceMappingURL=EditableRichText.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/EditableRichText.tsx"],"sourcesContent":["\"use client\";\n\nimport { type CSSProperties } from \"react\";\nimport { useContent } from \"../content/ContentProvider\";\n\ninterface EditableRichTextProps {\n id: string;\n className?: string;\n style?: CSSProperties;\n children?: string;\n}\n\n/**\n * Meerregelig bewerkbaar tekstblok (platte tekst, regelafbrekingen blijven behouden).\n * In bewerk-modus een textarea; daarbuiten paragrafen. Bewust géén HTML, om XSS te vermijden.\n */\n/** @deprecated Legacy inline (v1). Gebruik een richText-block + de visuele editor. */\nexport function EditableRichText({ id, className, style, children }: EditableRichTextProps) {\n const { get, set, editMode, canEdit } = useContent();\n const value = get(id, children ?? \"\");\n\n if (editMode && canEdit) {\n return (\n <textarea\n className={`${className ?? \"\"} xicms-editable`.trim()}\n style={{ width: \"100%\", minHeight: 120, ...style }}\n defaultValue={value}\n data-xicms-id={id}\n onBlur={(e) => {\n if (e.currentTarget.value !== value) void set(id, e.currentTarget.value);\n }}\n />\n );\n }\n\n return (\n <div className={className} style={style}>\n {value.split(/\\n{2,}/).map((para, i) => (\n <p key={i} style={{ whiteSpace: \"pre-wrap\" }}>\n {para}\n </p>\n ))}\n </div>\n );\n}\n"],"mappings":";AAuBM;AApBN,SAAS,kBAAkB;AAcpB,SAAS,iBAAiB,EAAE,IAAI,WAAW,OAAO,SAAS,GAA0B;AAC1F,QAAM,EAAE,KAAK,KAAK,UAAU,QAAQ,IAAI,WAAW;AACnD,QAAM,QAAQ,IAAI,IAAI,YAAY,EAAE;AAEpC,MAAI,YAAY,SAAS;AACvB,WACE;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,GAAG,aAAa,EAAE,kBAAkB,KAAK;AAAA,QACpD,OAAO,EAAE,OAAO,QAAQ,WAAW,KAAK,GAAG,MAAM;AAAA,QACjD,cAAc;AAAA,QACd,iBAAe;AAAA,QACf,QAAQ,CAAC,MAAM;AACb,cAAI,EAAE,cAAc,UAAU,MAAO,MAAK,IAAI,IAAI,EAAE,cAAc,KAAK;AAAA,QACzE;AAAA;AAAA,IACF;AAAA,EAEJ;AAEA,SACE,oBAAC,SAAI,WAAsB,OACxB,gBAAM,MAAM,QAAQ,EAAE,IAAI,CAAC,MAAM,MAChC,oBAAC,OAAU,OAAO,EAAE,YAAY,WAAW,GACxC,kBADK,CAER,CACD,GACH;AAEJ;","names":[]}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { type CSSProperties } from "react";
|
|
2
|
-
interface EditableTextProps {
|
|
3
|
-
/** Stabiel content-id, bv. "home.hero.title". */
|
|
4
|
-
id: string;
|
|
5
|
-
/** HTML-element waarin de tekst wordt gerenderd. */
|
|
6
|
-
as?: keyof React.JSX.IntrinsicElements;
|
|
7
|
-
className?: string;
|
|
8
|
-
style?: CSSProperties;
|
|
9
|
-
/** Standaardtekst als er nog geen waarde is. */
|
|
10
|
-
children?: string;
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* Inline bewerkbaar tekstblok. In bewerk-modus (voor wie mag bewerken) wordt het element
|
|
14
|
-
* `contentEditable`; bij blur wordt de tekst opgeslagen. Buiten bewerk-modus is het gewone tekst.
|
|
15
|
-
*/
|
|
16
|
-
/** @deprecated Legacy inline (v1). Gebruik een block met `data-xicms-edit` + de visuele editor. */
|
|
17
|
-
export declare function EditableText({ id, as, className, style, children }: EditableTextProps): import("react").ReactElement<{
|
|
18
|
-
className: string | undefined;
|
|
19
|
-
style: CSSProperties | undefined;
|
|
20
|
-
}, string | import("react").JSXElementConstructor<any>>;
|
|
21
|
-
export {};
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import { createElement } from "react";
|
|
3
|
-
import { useContent } from "../content/ContentProvider";
|
|
4
|
-
function EditableText({ id, as = "span", className, style, children }) {
|
|
5
|
-
const { get, set, editMode, canEdit } = useContent();
|
|
6
|
-
const value = get(id, children ?? "");
|
|
7
|
-
if (editMode && canEdit) {
|
|
8
|
-
return createElement(as, {
|
|
9
|
-
className: `${className ?? ""} xicms-editable`.trim(),
|
|
10
|
-
style,
|
|
11
|
-
contentEditable: true,
|
|
12
|
-
suppressContentEditableWarning: true,
|
|
13
|
-
"data-xicms-id": id,
|
|
14
|
-
onBlur: (e) => {
|
|
15
|
-
const next = e.currentTarget.textContent ?? "";
|
|
16
|
-
if (next !== value) void set(id, next);
|
|
17
|
-
}
|
|
18
|
-
}, value);
|
|
19
|
-
}
|
|
20
|
-
return createElement(as, { className, style }, value);
|
|
21
|
-
}
|
|
22
|
-
export {
|
|
23
|
-
EditableText
|
|
24
|
-
};
|
|
25
|
-
//# sourceMappingURL=EditableText.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/EditableText.tsx"],"sourcesContent":["\"use client\";\n\nimport { createElement, type CSSProperties, type FocusEvent } from \"react\";\nimport { useContent } from \"../content/ContentProvider\";\n\ninterface EditableTextProps {\n /** Stabiel content-id, bv. \"home.hero.title\". */\n id: string;\n /** HTML-element waarin de tekst wordt gerenderd. */\n as?: keyof React.JSX.IntrinsicElements;\n className?: string;\n style?: CSSProperties;\n /** Standaardtekst als er nog geen waarde is. */\n children?: string;\n}\n\n/**\n * Inline bewerkbaar tekstblok. In bewerk-modus (voor wie mag bewerken) wordt het element\n * `contentEditable`; bij blur wordt de tekst opgeslagen. Buiten bewerk-modus is het gewone tekst.\n */\n/** @deprecated Legacy inline (v1). Gebruik een block met `data-xicms-edit` + de visuele editor. */\nexport function EditableText({ id, as = \"span\", className, style, children }: EditableTextProps) {\n const { get, set, editMode, canEdit } = useContent();\n const value = get(id, children ?? \"\");\n\n if (editMode && canEdit) {\n return createElement(as, {\n className: `${className ?? \"\"} xicms-editable`.trim(),\n style,\n contentEditable: true,\n suppressContentEditableWarning: true,\n \"data-xicms-id\": id,\n onBlur: (e: FocusEvent<HTMLElement>) => {\n const next = e.currentTarget.textContent ?? \"\";\n if (next !== value) void set(id, next);\n },\n }, value);\n }\n\n return createElement(as, { className, style }, value);\n}\n"],"mappings":";AAEA,SAAS,qBAA0D;AACnE,SAAS,kBAAkB;AAkBpB,SAAS,aAAa,EAAE,IAAI,KAAK,QAAQ,WAAW,OAAO,SAAS,GAAsB;AAC/F,QAAM,EAAE,KAAK,KAAK,UAAU,QAAQ,IAAI,WAAW;AACnD,QAAM,QAAQ,IAAI,IAAI,YAAY,EAAE;AAEpC,MAAI,YAAY,SAAS;AACvB,WAAO,cAAc,IAAI;AAAA,MACvB,WAAW,GAAG,aAAa,EAAE,kBAAkB,KAAK;AAAA,MACpD;AAAA,MACA,iBAAiB;AAAA,MACjB,gCAAgC;AAAA,MAChC,iBAAiB;AAAA,MACjB,QAAQ,CAAC,MAA+B;AACtC,cAAM,OAAO,EAAE,cAAc,eAAe;AAC5C,YAAI,SAAS,MAAO,MAAK,IAAI,IAAI,IAAI;AAAA,MACvC;AAAA,IACF,GAAG,KAAK;AAAA,EACV;AAEA,SAAO,cAAc,IAAI,EAAE,WAAW,MAAM,GAAG,KAAK;AACtD;","names":[]}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { type ReactNode } from "react";
|
|
2
|
-
interface ContentState {
|
|
3
|
-
/** Haal een waarde op; valt terug op defaults en daarna op `fallback`. */
|
|
4
|
-
get: (key: string, fallback?: string) => string;
|
|
5
|
-
/** Sla een waarde op (alleen als de gebruiker mag bewerken). */
|
|
6
|
-
set: (key: string, value: string) => Promise<void>;
|
|
7
|
-
/** Of de bewerk-modus aanstaat. */
|
|
8
|
-
editMode: boolean;
|
|
9
|
-
setEditMode: (on: boolean) => void;
|
|
10
|
-
/** Of de huidige gebruiker content mag bewerken. */
|
|
11
|
-
canEdit: boolean;
|
|
12
|
-
loading: boolean;
|
|
13
|
-
}
|
|
14
|
-
/** @deprecated LEGACY v1 (plat `cms/content`-model). Vervangen door het block-model (pagina's/
|
|
15
|
-
* drafts) + de visuele editor. Blijft werken voor bestaande sites; verwijdering volgt in een major. */
|
|
16
|
-
export declare function ContentProvider({ siteId, defaults, children, }: {
|
|
17
|
-
siteId: string;
|
|
18
|
-
defaults?: Record<string, string>;
|
|
19
|
-
children: ReactNode;
|
|
20
|
-
}): import("react").JSX.Element;
|
|
21
|
-
/** @deprecated Hoort bij het legacy `cms/content`-model. Voor rechten: `useAuth()` + `canEdit(role)`. */
|
|
22
|
-
export declare function useContent(): ContentState;
|
|
23
|
-
export {};
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import { jsx } from "react/jsx-runtime";
|
|
3
|
-
import {
|
|
4
|
-
createContext,
|
|
5
|
-
useContext,
|
|
6
|
-
useEffect,
|
|
7
|
-
useMemo,
|
|
8
|
-
useState
|
|
9
|
-
} from "react";
|
|
10
|
-
import { doc, getDoc, onSnapshot, setDoc, serverTimestamp } from "firebase/firestore";
|
|
11
|
-
import { getDb } from "../firebase/client";
|
|
12
|
-
import { useAuth } from "../auth/AuthProvider";
|
|
13
|
-
import { canEdit } from "../auth/roles";
|
|
14
|
-
const ContentContext = createContext(null);
|
|
15
|
-
function ContentProvider({
|
|
16
|
-
siteId,
|
|
17
|
-
defaults = {},
|
|
18
|
-
children
|
|
19
|
-
}) {
|
|
20
|
-
const { role } = useAuth();
|
|
21
|
-
const editable = canEdit(role);
|
|
22
|
-
const [values, setValues] = useState({});
|
|
23
|
-
const [editMode, setEditMode] = useState(false);
|
|
24
|
-
const [loading, setLoading] = useState(true);
|
|
25
|
-
useEffect(() => {
|
|
26
|
-
const db = getDb();
|
|
27
|
-
if (!db) {
|
|
28
|
-
setLoading(false);
|
|
29
|
-
return;
|
|
30
|
-
}
|
|
31
|
-
const ref = doc(db, "sites", siteId, "cms", "content");
|
|
32
|
-
const apply = (snap) => {
|
|
33
|
-
const data = snap.data();
|
|
34
|
-
setValues(data?.values ?? {});
|
|
35
|
-
setLoading(false);
|
|
36
|
-
};
|
|
37
|
-
if (editable) {
|
|
38
|
-
const unsub = onSnapshot(ref, apply, () => setLoading(false));
|
|
39
|
-
return () => unsub();
|
|
40
|
-
}
|
|
41
|
-
let active = true;
|
|
42
|
-
getDoc(ref).then((snap) => {
|
|
43
|
-
if (active) apply(snap);
|
|
44
|
-
}).catch(() => {
|
|
45
|
-
if (active) setLoading(false);
|
|
46
|
-
});
|
|
47
|
-
return () => {
|
|
48
|
-
active = false;
|
|
49
|
-
};
|
|
50
|
-
}, [siteId, editable]);
|
|
51
|
-
useEffect(() => {
|
|
52
|
-
if (!editable && editMode) setEditMode(false);
|
|
53
|
-
}, [editable, editMode]);
|
|
54
|
-
const value = useMemo(
|
|
55
|
-
() => ({
|
|
56
|
-
get: (key, fallback = "") => values[key] ?? defaults[key] ?? fallback,
|
|
57
|
-
set: async (key, val) => {
|
|
58
|
-
if (!editable) return;
|
|
59
|
-
const db = getDb();
|
|
60
|
-
if (!db) return;
|
|
61
|
-
const ref = doc(db, "sites", siteId, "cms", "content");
|
|
62
|
-
await setDoc(
|
|
63
|
-
ref,
|
|
64
|
-
{ values: { [key]: val }, updatedAt: serverTimestamp() },
|
|
65
|
-
{ merge: true }
|
|
66
|
-
);
|
|
67
|
-
},
|
|
68
|
-
editMode,
|
|
69
|
-
setEditMode,
|
|
70
|
-
canEdit: editable,
|
|
71
|
-
loading
|
|
72
|
-
}),
|
|
73
|
-
[values, defaults, editMode, editable, loading, siteId]
|
|
74
|
-
);
|
|
75
|
-
return /* @__PURE__ */ jsx(ContentContext.Provider, { value, children });
|
|
76
|
-
}
|
|
77
|
-
function useContent() {
|
|
78
|
-
const ctx = useContext(ContentContext);
|
|
79
|
-
if (!ctx) throw new Error("useContent moet binnen <XiCMSProvider> worden gebruikt.");
|
|
80
|
-
return ctx;
|
|
81
|
-
}
|
|
82
|
-
export {
|
|
83
|
-
ContentProvider,
|
|
84
|
-
useContent
|
|
85
|
-
};
|
|
86
|
-
//# sourceMappingURL=ContentProvider.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/content/ContentProvider.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n createContext,\n useContext,\n useEffect,\n useMemo,\n useState,\n type ReactNode,\n} from \"react\";\nimport { doc, getDoc, onSnapshot, setDoc, serverTimestamp } from \"firebase/firestore\";\nimport { getDb } from \"../firebase/client\";\nimport { useAuth } from \"../auth/AuthProvider\";\nimport { canEdit } from \"../auth/roles\";\n\ninterface ContentState {\n /** Haal een waarde op; valt terug op defaults en daarna op `fallback`. */\n get: (key: string, fallback?: string) => string;\n /** Sla een waarde op (alleen als de gebruiker mag bewerken). */\n set: (key: string, value: string) => Promise<void>;\n /** Of de bewerk-modus aanstaat. */\n editMode: boolean;\n setEditMode: (on: boolean) => void;\n /** Of de huidige gebruiker content mag bewerken. */\n canEdit: boolean;\n loading: boolean;\n}\n\nconst ContentContext = createContext<ContentState | null>(null);\n\n/** @deprecated LEGACY v1 (plat `cms/content`-model). Vervangen door het block-model (pagina's/\n * drafts) + de visuele editor. Blijft werken voor bestaande sites; verwijdering volgt in een major. */\nexport function ContentProvider({\n siteId,\n defaults = {},\n children,\n}: {\n siteId: string;\n defaults?: Record<string, string>;\n children: ReactNode;\n}) {\n const { role } = useAuth();\n const editable = canEdit(role);\n const [values, setValues] = useState<Record<string, string>>({});\n const [editMode, setEditMode] = useState(false);\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n const db = getDb();\n if (!db) {\n setLoading(false);\n return;\n }\n const ref = doc(db, \"sites\", siteId, \"cms\", \"content\");\n const apply = (snap: { data: () => unknown }) => {\n const data = snap.data() as { values?: Record<string, string> } | undefined;\n setValues(data?.values ?? {});\n setLoading(false);\n };\n\n // Kostenbesparing: publieke bezoekers (geen bewerkrechten) lezen de content één keer\n // (getDoc) i.p.v. een realtime listener per bezoeker. Editors houden onSnapshot zodat ze\n // hun eigen wijzigingen meteen terugzien.\n if (editable) {\n const unsub = onSnapshot(ref, apply, () => setLoading(false));\n return () => unsub();\n }\n let active = true;\n getDoc(ref)\n .then((snap) => {\n if (active) apply(snap);\n })\n .catch(() => {\n if (active) setLoading(false);\n });\n return () => {\n active = false;\n };\n }, [siteId, editable]);\n\n // Geen bewerk-rechten? Forceer edit-modus uit.\n useEffect(() => {\n if (!editable && editMode) setEditMode(false);\n }, [editable, editMode]);\n\n const value = useMemo<ContentState>(\n () => ({\n get: (key, fallback = \"\") => values[key] ?? defaults[key] ?? fallback,\n set: async (key, val) => {\n if (!editable) return;\n const db = getDb();\n if (!db) return;\n const ref = doc(db, \"sites\", siteId, \"cms\", \"content\");\n await setDoc(\n ref,\n { values: { [key]: val }, updatedAt: serverTimestamp() },\n { merge: true },\n );\n },\n editMode,\n setEditMode,\n canEdit: editable,\n loading,\n }),\n [values, defaults, editMode, editable, loading, siteId],\n );\n\n return <ContentContext.Provider value={value}>{children}</ContentContext.Provider>;\n}\n\n/** @deprecated Hoort bij het legacy `cms/content`-model. Voor rechten: `useAuth()` + `canEdit(role)`. */\nexport function useContent(): ContentState {\n const ctx = useContext(ContentContext);\n if (!ctx) throw new Error(\"useContent moet binnen <XiCMSProvider> worden gebruikt.\");\n return ctx;\n}\n"],"mappings":";AA2GS;AAzGT;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP,SAAS,KAAK,QAAQ,YAAY,QAAQ,uBAAuB;AACjE,SAAS,aAAa;AACtB,SAAS,eAAe;AACxB,SAAS,eAAe;AAexB,MAAM,iBAAiB,cAAmC,IAAI;AAIvD,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA,WAAW,CAAC;AAAA,EACZ;AACF,GAIG;AACD,QAAM,EAAE,KAAK,IAAI,QAAQ;AACzB,QAAM,WAAW,QAAQ,IAAI;AAC7B,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAiC,CAAC,CAAC;AAC/D,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,KAAK;AAC9C,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,IAAI;AAE3C,YAAU,MAAM;AACd,UAAM,KAAK,MAAM;AACjB,QAAI,CAAC,IAAI;AACP,iBAAW,KAAK;AAChB;AAAA,IACF;AACA,UAAM,MAAM,IAAI,IAAI,SAAS,QAAQ,OAAO,SAAS;AACrD,UAAM,QAAQ,CAAC,SAAkC;AAC/C,YAAM,OAAO,KAAK,KAAK;AACvB,gBAAU,MAAM,UAAU,CAAC,CAAC;AAC5B,iBAAW,KAAK;AAAA,IAClB;AAKA,QAAI,UAAU;AACZ,YAAM,QAAQ,WAAW,KAAK,OAAO,MAAM,WAAW,KAAK,CAAC;AAC5D,aAAO,MAAM,MAAM;AAAA,IACrB;AACA,QAAI,SAAS;AACb,WAAO,GAAG,EACP,KAAK,CAAC,SAAS;AACd,UAAI,OAAQ,OAAM,IAAI;AAAA,IACxB,CAAC,EACA,MAAM,MAAM;AACX,UAAI,OAAQ,YAAW,KAAK;AAAA,IAC9B,CAAC;AACH,WAAO,MAAM;AACX,eAAS;AAAA,IACX;AAAA,EACF,GAAG,CAAC,QAAQ,QAAQ,CAAC;AAGrB,YAAU,MAAM;AACd,QAAI,CAAC,YAAY,SAAU,aAAY,KAAK;AAAA,EAC9C,GAAG,CAAC,UAAU,QAAQ,CAAC;AAEvB,QAAM,QAAQ;AAAA,IACZ,OAAO;AAAA,MACL,KAAK,CAAC,KAAK,WAAW,OAAO,OAAO,GAAG,KAAK,SAAS,GAAG,KAAK;AAAA,MAC7D,KAAK,OAAO,KAAK,QAAQ;AACvB,YAAI,CAAC,SAAU;AACf,cAAM,KAAK,MAAM;AACjB,YAAI,CAAC,GAAI;AACT,cAAM,MAAM,IAAI,IAAI,SAAS,QAAQ,OAAO,SAAS;AACrD,cAAM;AAAA,UACJ;AAAA,UACA,EAAE,QAAQ,EAAE,CAAC,GAAG,GAAG,IAAI,GAAG,WAAW,gBAAgB,EAAE;AAAA,UACvD,EAAE,OAAO,KAAK;AAAA,QAChB;AAAA,MACF;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS;AAAA,MACT;AAAA,IACF;AAAA,IACA,CAAC,QAAQ,UAAU,UAAU,UAAU,SAAS,MAAM;AAAA,EACxD;AAEA,SAAO,oBAAC,eAAe,UAAf,EAAwB,OAAe,UAAS;AAC1D;AAGO,SAAS,aAA2B;AACzC,QAAM,MAAM,WAAW,cAAc;AACrC,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,yDAAyD;AACnF,SAAO;AACT;","names":[]}
|