@xiwebdesign/xicms-core 7.12.1 → 7.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (164) hide show
  1. package/dist/admin/AdminApp.js +2 -0
  2. package/dist/admin/AdminApp.js.map +1 -1
  3. package/dist/admin/lib/mediaUsage.d.ts +17 -0
  4. package/dist/admin/lib/mediaUsage.js +32 -1
  5. package/dist/admin/lib/mediaUsage.js.map +1 -1
  6. package/dist/admin/lib/zodFields.d.ts +2 -2
  7. package/dist/admin/lib/zodFields.js +2 -0
  8. package/dist/admin/lib/zodFields.js.map +1 -1
  9. package/dist/admin/media/MediaManager.js +74 -17
  10. package/dist/admin/media/MediaManager.js.map +1 -1
  11. package/dist/admin/ui/toast.d.ts +4 -0
  12. package/dist/admin/ui/toast.js +9 -3
  13. package/dist/admin/ui/toast.js.map +1 -1
  14. package/dist/admin/visual/VisualEditor.js +69 -5
  15. package/dist/admin/visual/VisualEditor.js.map +1 -1
  16. package/dist/blocks/BlockErrorBoundary.d.ts +1 -0
  17. package/dist/blocks/BlockErrorBoundary.js +4 -0
  18. package/dist/blocks/BlockErrorBoundary.js.map +1 -1
  19. package/dist/blocks/BlockRenderer.js +1 -1
  20. package/dist/blocks/BlockRenderer.js.map +1 -1
  21. package/dist/blocks/builtinSchemas.d.ts +23 -0
  22. package/dist/blocks/builtinSchemas.js +138 -0
  23. package/dist/blocks/builtinSchemas.js.map +1 -0
  24. package/dist/blocks/builtins/Accordion.js +0 -2
  25. package/dist/blocks/builtins/Accordion.js.map +1 -1
  26. package/dist/blocks/builtins/Agenda.js +0 -2
  27. package/dist/blocks/builtins/Agenda.js.map +1 -1
  28. package/dist/blocks/builtins/Banner.js +0 -2
  29. package/dist/blocks/builtins/Banner.js.map +1 -1
  30. package/dist/blocks/builtins/BeforeAfter.js +0 -2
  31. package/dist/blocks/builtins/BeforeAfter.js.map +1 -1
  32. package/dist/blocks/builtins/Booking.js +0 -2
  33. package/dist/blocks/builtins/Booking.js.map +1 -1
  34. package/dist/blocks/builtins/Breadcrumbs.js +0 -2
  35. package/dist/blocks/builtins/Breadcrumbs.js.map +1 -1
  36. package/dist/blocks/builtins/Cards.js +0 -2
  37. package/dist/blocks/builtins/Cards.js.map +1 -1
  38. package/dist/blocks/builtins/Columns.js +0 -2
  39. package/dist/blocks/builtins/Columns.js.map +1 -1
  40. package/dist/blocks/builtins/Contact.d.ts +1 -1
  41. package/dist/blocks/builtins/Contact.js +0 -3
  42. package/dist/blocks/builtins/Contact.js.map +1 -1
  43. package/dist/blocks/builtins/Countdown.js +0 -2
  44. package/dist/blocks/builtins/Countdown.js.map +1 -1
  45. package/dist/blocks/builtins/Cta.js +0 -2
  46. package/dist/blocks/builtins/Cta.js.map +1 -1
  47. package/dist/blocks/builtins/Downloads.js +0 -2
  48. package/dist/blocks/builtins/Downloads.js.map +1 -1
  49. package/dist/blocks/builtins/Elements.js +0 -4
  50. package/dist/blocks/builtins/Elements.js.map +1 -1
  51. package/dist/blocks/builtins/Embed.js +0 -2
  52. package/dist/blocks/builtins/Embed.js.map +1 -1
  53. package/dist/blocks/builtins/Faq.js +0 -2
  54. package/dist/blocks/builtins/Faq.js.map +1 -1
  55. package/dist/blocks/builtins/FormBlock.js +0 -2
  56. package/dist/blocks/builtins/FormBlock.js.map +1 -1
  57. package/dist/blocks/builtins/Gallery.d.ts +1 -1
  58. package/dist/blocks/builtins/Gallery.js +0 -2
  59. package/dist/blocks/builtins/Gallery.js.map +1 -1
  60. package/dist/blocks/builtins/Hero.js +0 -2
  61. package/dist/blocks/builtins/Hero.js.map +1 -1
  62. package/dist/blocks/builtins/ImageBlock.js +0 -2
  63. package/dist/blocks/builtins/ImageBlock.js.map +1 -1
  64. package/dist/blocks/builtins/Jobs.d.ts +1 -1
  65. package/dist/blocks/builtins/Jobs.js +0 -2
  66. package/dist/blocks/builtins/Jobs.js.map +1 -1
  67. package/dist/blocks/builtins/Layout.js +0 -3
  68. package/dist/blocks/builtins/Layout.js.map +1 -1
  69. package/dist/blocks/builtins/MapBlock.js +0 -2
  70. package/dist/blocks/builtins/MapBlock.js.map +1 -1
  71. package/dist/blocks/builtins/NewsListBlock.js +0 -2
  72. package/dist/blocks/builtins/NewsListBlock.js.map +1 -1
  73. package/dist/blocks/builtins/Newsletter.js +0 -2
  74. package/dist/blocks/builtins/Newsletter.js.map +1 -1
  75. package/dist/blocks/builtins/OpeningHours.js +0 -2
  76. package/dist/blocks/builtins/OpeningHours.js.map +1 -1
  77. package/dist/blocks/builtins/PdfBlock.js +0 -2
  78. package/dist/blocks/builtins/PdfBlock.js.map +1 -1
  79. package/dist/blocks/builtins/Portfolio.js +0 -2
  80. package/dist/blocks/builtins/Portfolio.js.map +1 -1
  81. package/dist/blocks/builtins/Pricing.d.ts +1 -1
  82. package/dist/blocks/builtins/Pricing.js +0 -2
  83. package/dist/blocks/builtins/Pricing.js.map +1 -1
  84. package/dist/blocks/builtins/RichTextBlock.js +0 -2
  85. package/dist/blocks/builtins/RichTextBlock.js.map +1 -1
  86. package/dist/blocks/builtins/Search.js +0 -2
  87. package/dist/blocks/builtins/Search.js.map +1 -1
  88. package/dist/blocks/builtins/Sections.js +0 -10
  89. package/dist/blocks/builtins/Sections.js.map +1 -1
  90. package/dist/blocks/builtins/Slider.js +0 -2
  91. package/dist/blocks/builtins/Slider.js.map +1 -1
  92. package/dist/blocks/builtins/Spacer.js +0 -2
  93. package/dist/blocks/builtins/Spacer.js.map +1 -1
  94. package/dist/blocks/builtins/SymbolRef.js +3 -5
  95. package/dist/blocks/builtins/SymbolRef.js.map +1 -1
  96. package/dist/blocks/builtins/Team.js +0 -2
  97. package/dist/blocks/builtins/Team.js.map +1 -1
  98. package/dist/blocks/builtins/Testimonials.d.ts +1 -1
  99. package/dist/blocks/builtins/Testimonials.js +0 -2
  100. package/dist/blocks/builtins/Testimonials.js.map +1 -1
  101. package/dist/blocks/builtins/Video.d.ts +1 -1
  102. package/dist/blocks/builtins/Video.js +0 -2
  103. package/dist/blocks/builtins/Video.js.map +1 -1
  104. package/dist/blocks/builtins/WhatsappChat.js +0 -2
  105. package/dist/blocks/builtins/WhatsappChat.js.map +1 -1
  106. package/dist/blocks/builtins/Widgets.js +0 -26
  107. package/dist/blocks/builtins/Widgets.js.map +1 -1
  108. package/dist/blocks/customTemplate/definition.js +1 -1
  109. package/dist/blocks/customTemplate/definition.js.map +1 -1
  110. package/dist/blocks/registry.d.ts +24 -13
  111. package/dist/blocks/registry.js +15 -4
  112. package/dist/blocks/registry.js.map +1 -1
  113. package/dist/blocks/reportRenderFout.d.ts +13 -0
  114. package/dist/blocks/reportRenderFout.js +31 -0
  115. package/dist/blocks/reportRenderFout.js.map +1 -0
  116. package/dist/media/ImageContext.js +24 -1
  117. package/dist/media/ImageContext.js.map +1 -1
  118. package/dist/modules/shop/blocks/Cart.js +1 -2
  119. package/dist/modules/shop/blocks/Cart.js.map +1 -1
  120. package/dist/modules/shop/blocks/Checkout.js +1 -2
  121. package/dist/modules/shop/blocks/Checkout.js.map +1 -1
  122. package/dist/modules/shop/blocks/Donation.js +1 -2
  123. package/dist/modules/shop/blocks/Donation.js.map +1 -1
  124. package/dist/modules/shop/blocks/OrderStatus.js +0 -2
  125. package/dist/modules/shop/blocks/OrderStatus.js.map +1 -1
  126. package/dist/modules/shop/blocks/ProductDetail.js +1 -7
  127. package/dist/modules/shop/blocks/ProductDetail.js.map +1 -1
  128. package/dist/modules/shop/blocks/ProductGrid.js +1 -2
  129. package/dist/modules/shop/blocks/ProductGrid.js.map +1 -1
  130. package/dist/modules/shop/blocks/ShopCategories.js +0 -2
  131. package/dist/modules/shop/blocks/ShopCategories.js.map +1 -1
  132. package/dist/modules/shop/module.js +1 -0
  133. package/dist/modules/shop/module.js.map +1 -1
  134. package/dist/modules/shop/schemas.d.ts +1 -0
  135. package/dist/modules/shop/schemas.js +32 -0
  136. package/dist/modules/shop/schemas.js.map +1 -0
  137. package/dist/modules/types.d.ts +6 -0
  138. package/dist/schema/blockBase.d.ts +99 -0
  139. package/dist/schema/blockBase.js +22 -0
  140. package/dist/schema/blockBase.js.map +1 -0
  141. package/dist/schema/blocks.d.ts +1 -91
  142. package/dist/schema/blocks.js +64 -77
  143. package/dist/schema/blocks.js.map +1 -1
  144. package/dist/schema/pages.js +1 -1
  145. package/dist/schema/pages.js.map +1 -1
  146. package/dist/schema/shop.d.ts +1 -11
  147. package/dist/schema/shop.js +2 -21
  148. package/dist/schema/shop.js.map +1 -1
  149. package/dist/schema/shopGeld.d.ts +18 -0
  150. package/dist/schema/shopGeld.js +27 -0
  151. package/dist/schema/shopGeld.js.map +1 -0
  152. package/dist/schema/symbols.js +1 -1
  153. package/dist/schema/symbols.js.map +1 -1
  154. package/dist/server/blockData.js +14 -1
  155. package/dist/server/blockData.js.map +1 -1
  156. package/dist/server/index.d.ts +1 -1
  157. package/dist/server/index.js +2 -1
  158. package/dist/server/index.js.map +1 -1
  159. package/dist/server/pages.d.ts +16 -0
  160. package/dist/server/pages.js +9 -0
  161. package/dist/server/pages.js.map +1 -1
  162. package/dist/styles.css +62 -0
  163. package/dist/version.js +1 -1
  164. package/package.json +1 -1
@@ -1,5 +1,8 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { registerBuiltinSchemas } from "../../blocks/builtinSchemas.js";
4
+ import { useModules } from "../../modules/context.js";
5
+ registerBuiltinSchemas();
3
6
  import "@xiwebdesign/xicms-core/admin.css";
4
7
  import { useCallback, useEffect, useMemo, useRef, useState } from "react";
5
8
  import { useSiteConfig } from "../../config.js";
@@ -130,6 +133,27 @@ function VisualEditorInner({ onClose }) {
130
133
  draftRef.current = draft;
131
134
  }, [draft]);
132
135
  const historyRef = useRef({ past: [], future: [], lastPush: 0 });
136
+ const undoOpslagSleutel = useCallback((id) => `xicms-undo:${siteId}:${id}`, [siteId]);
137
+ const bewaarHistory = useCallback(() => {
138
+ try {
139
+ const id = draftRef.current?.id;
140
+ if (!id) return;
141
+ sessionStorage.setItem(undoOpslagSleutel(id), JSON.stringify(historyRef.current.past.slice(-25)));
142
+ } catch {
143
+ }
144
+ }, [undoOpslagSleutel]);
145
+ const herstelHistory = useCallback((id) => {
146
+ try {
147
+ const raw = sessionStorage.getItem(undoOpslagSleutel(id));
148
+ if (!raw || historyRef.current.past.length > 0) return;
149
+ const past = JSON.parse(raw);
150
+ if (Array.isArray(past) && past.length) {
151
+ historyRef.current.past = past;
152
+ setHistVersion((v) => v + 1);
153
+ }
154
+ } catch {
155
+ }
156
+ }, [undoOpslagSleutel]);
133
157
  const [, setHistVersion] = useState(0);
134
158
  const pushHistory = useCallback((prev, coalesce) => {
135
159
  const h = historyRef.current;
@@ -203,6 +227,20 @@ function VisualEditorInner({ onClose }) {
203
227
  const handleClose = useCallback(() => {
204
228
  void flushSave().finally(() => onClose());
205
229
  }, [flushSave, onClose]);
230
+ const [toonStartHint, setToonStartHint] = useState(false);
231
+ useEffect(() => {
232
+ try {
233
+ if (!localStorage.getItem("xicms-hint-bewerken-v1")) setToonStartHint(true);
234
+ } catch {
235
+ }
236
+ }, []);
237
+ const sluitStartHint = useCallback(() => {
238
+ setToonStartHint(false);
239
+ try {
240
+ localStorage.setItem("xicms-hint-bewerken-v1", "1");
241
+ } catch {
242
+ }
243
+ }, []);
206
244
  useEffect(() => {
207
245
  let active = true;
208
246
  getDraftByPath(siteId, path).then((d) => {
@@ -210,6 +248,7 @@ function VisualEditorInner({ onClose }) {
210
248
  if (d) {
211
249
  setDraft(d);
212
250
  lastSavedRef.current = stableStringify(draftPayload(d));
251
+ herstelHistory(d.id);
213
252
  setStatus("idle");
214
253
  } else {
215
254
  setStatus("none");
@@ -279,6 +318,13 @@ function VisualEditorInner({ onClose }) {
279
318
  );
280
319
  nietLiveRef.current = wijzigingen.iets;
281
320
  const { publishDraft, zetFotoVervanger } = useEditor();
321
+ const actieveModules = useModules();
322
+ useEffect(() => {
323
+ for (const m of actieveModules.defs) {
324
+ if (actieveModules.activeIds.has(m.id)) void m.loadSchemas?.().catch(() => {
325
+ });
326
+ }
327
+ }, [actieveModules]);
282
328
  useEffect(() => {
283
329
  zetFotoVervanger((field, blockKey) => {
284
330
  if (blockKey) setImgPicker({ key: blockKey, field });
@@ -711,10 +757,14 @@ function VisualEditorInner({ onClose }) {
711
757
  e.preventDefault();
712
758
  e.returnValue = "";
713
759
  }
760
+ bewaarHistory();
714
761
  };
715
762
  const onVisibility = () => {
716
- if (document.visibilityState === "hidden") void flushSave().catch(() => {
717
- });
763
+ if (document.visibilityState === "hidden") {
764
+ void flushSave().catch(() => {
765
+ });
766
+ bewaarHistory();
767
+ }
718
768
  };
719
769
  const onKeyDown = (e) => {
720
770
  if (e.key === "Escape") {
@@ -749,7 +799,7 @@ function VisualEditorInner({ onClose }) {
749
799
  );
750
800
  }
751
801
  };
752
- }, [siteId, handleClose, flushSave, undo, redo]);
802
+ }, [siteId, handleClose, flushSave, undo, redo, bewaarHistory]);
753
803
  function setBlocks(next, opts) {
754
804
  mutateDraft((d) => ({ ...d, blocks: next }), opts);
755
805
  }
@@ -856,8 +906,10 @@ function VisualEditorInner({ onClose }) {
856
906
  setLiveBlocks(structuredClone(d.blocks));
857
907
  toast({
858
908
  title: "Gepubliceerd",
859
- description: demo ? "In deze demo blijft de wijziging in je browser staan." : "Zelf zie je de nieuwe tekst meteen. Voor overige bezoekers duurt het nog ongeveer 15 minuten.",
860
- tone: "success"
909
+ description: demo ? "In deze demo blijft de wijziging in je browser staan." : "Binnen enkele seconden zichtbaar voor iedereen.",
910
+ tone: "success",
911
+ // Sluit de mentale lus "staat het er nu echt?": één klik en je kijkt als bezoeker.
912
+ action: { label: "Bekijk als bezoeker \u2192", onClick: handleClose }
861
913
  });
862
914
  } catch (e) {
863
915
  toast({ title: "Publiceren mislukt", description: e.message, tone: "error" });
@@ -881,6 +933,18 @@ function VisualEditorInner({ onClose }) {
881
933
  setConflict(false);
882
934
  }, [siteId, path, mutateDraft]);
883
935
  return /* @__PURE__ */ jsxs("div", { ref: containerRef, className: "xicms-ve__shell", "data-xicms-tooling": "", role: "group", "aria-label": `Pagina bewerken: ${path}`, children: [
936
+ toonStartHint && /* @__PURE__ */ jsxs("div", { className: "xicms-ve-starthint", role: "status", children: [
937
+ /* @__PURE__ */ jsxs("span", { children: [
938
+ "\u270F\uFE0F Klik het ",
939
+ /* @__PURE__ */ jsx("strong", { children: "potlood" }),
940
+ " naast een tekst om die op de pagina zelf te bewerken; foto's wissel je met ",
941
+ /* @__PURE__ */ jsx("strong", { children: "\u{1F4F7} Foto wijzigen" }),
942
+ ". Klaar? ",
943
+ /* @__PURE__ */ jsx("strong", { children: "Publiceren" }),
944
+ " staat rechtsonder."
945
+ ] }),
946
+ /* @__PURE__ */ jsx("button", { type: "button", onClick: sluitStartHint, children: "Begrepen" })
947
+ ] }),
884
948
  /* @__PURE__ */ jsxs("header", { className: "xicms-ve__bar", role: "toolbar", "aria-label": "Beheer", children: [
885
949
  /* @__PURE__ */ jsx("span", { className: "xicms-editbar__brand", children: isDemoActive() ? "XiCMS \xB7 demo" : "XiCMS" }),
886
950
  /* @__PURE__ */ jsx(