@xiwebdesign/xicms-core 4.18.0 → 5.0.1

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 (117) hide show
  1. package/dist/XiCMSProvider.d.ts +7 -0
  2. package/dist/XiCMSProvider.js +29 -6
  3. package/dist/XiCMSProvider.js.map +1 -1
  4. package/dist/admin/blockEditors/GenericEditor.d.ts +22 -0
  5. package/dist/admin/blockEditors/GenericEditor.js +201 -0
  6. package/dist/admin/blockEditors/GenericEditor.js.map +1 -0
  7. package/dist/admin/blockEditors/SymbolRefEditor.d.ts +2 -0
  8. package/dist/admin/blockEditors/SymbolRefEditor.js +55 -0
  9. package/dist/admin/blockEditors/SymbolRefEditor.js.map +1 -0
  10. package/dist/admin/blockEditors/index.d.ts +11 -6
  11. package/dist/admin/blockEditors/index.js +4 -608
  12. package/dist/admin/blockEditors/index.js.map +1 -1
  13. package/dist/admin/customBlocks/CustomBlocksPanel.d.ts +3 -0
  14. package/dist/admin/customBlocks/CustomBlocksPanel.js +145 -0
  15. package/dist/admin/customBlocks/CustomBlocksPanel.js.map +1 -0
  16. package/dist/admin/lib/symbolsClient.d.ts +13 -0
  17. package/dist/admin/lib/symbolsClient.js +51 -0
  18. package/dist/admin/lib/symbolsClient.js.map +1 -0
  19. package/dist/admin/lib/zodFields.d.ts +18 -0
  20. package/dist/admin/lib/zodFields.js +65 -2
  21. package/dist/admin/lib/zodFields.js.map +1 -1
  22. package/dist/admin/panelRegistry.js +3 -0
  23. package/dist/admin/panelRegistry.js.map +1 -1
  24. package/dist/admin/settings/SettingsPanel.js +2 -0
  25. package/dist/admin/settings/SettingsPanel.js.map +1 -1
  26. package/dist/admin/settings/SnapshotsCard.d.ts +3 -0
  27. package/dist/admin/settings/SnapshotsCard.js +98 -0
  28. package/dist/admin/settings/SnapshotsCard.js.map +1 -0
  29. package/dist/admin/ui/dialog.js +11 -4
  30. package/dist/admin/ui/dialog.js.map +1 -1
  31. package/dist/admin/visual/TranslationPanel.d.ts +13 -0
  32. package/dist/admin/visual/TranslationPanel.js +73 -0
  33. package/dist/admin/visual/TranslationPanel.js.map +1 -0
  34. package/dist/admin/visual/VisualEditor.js +142 -17
  35. package/dist/admin/visual/VisualEditor.js.map +1 -1
  36. package/dist/admin.css +1 -1
  37. package/dist/agentFiles/catalog.d.ts +21 -0
  38. package/dist/agentFiles/catalog.js +78 -0
  39. package/dist/agentFiles/catalog.js.map +1 -0
  40. package/dist/agentFiles/files.d.ts +59 -0
  41. package/dist/agentFiles/files.js +109 -0
  42. package/dist/agentFiles/files.js.map +1 -0
  43. package/dist/blocks/builtins/BeforeAfter.js +1 -0
  44. package/dist/blocks/builtins/BeforeAfter.js.map +1 -1
  45. package/dist/blocks/builtins/Cards.js +1 -0
  46. package/dist/blocks/builtins/Cards.js.map +1 -1
  47. package/dist/blocks/builtins/Cta.js +1 -0
  48. package/dist/blocks/builtins/Cta.js.map +1 -1
  49. package/dist/blocks/builtins/Elements.js +1 -0
  50. package/dist/blocks/builtins/Elements.js.map +1 -1
  51. package/dist/blocks/builtins/Hero.js +2 -2
  52. package/dist/blocks/builtins/Hero.js.map +1 -1
  53. package/dist/blocks/builtins/Jobs.js +1 -0
  54. package/dist/blocks/builtins/Jobs.js.map +1 -1
  55. package/dist/blocks/builtins/Sections.js +1 -0
  56. package/dist/blocks/builtins/Sections.js.map +1 -1
  57. package/dist/blocks/builtins/SymbolRef.d.ts +2 -0
  58. package/dist/blocks/builtins/SymbolRef.js +61 -0
  59. package/dist/blocks/builtins/SymbolRef.js.map +1 -0
  60. package/dist/blocks/customTemplate/definition.d.ts +7 -0
  61. package/dist/blocks/customTemplate/definition.js +34 -0
  62. package/dist/blocks/customTemplate/definition.js.map +1 -0
  63. package/dist/blocks/customTemplate/interpret.d.ts +10 -0
  64. package/dist/blocks/customTemplate/interpret.js +136 -0
  65. package/dist/blocks/customTemplate/interpret.js.map +1 -0
  66. package/dist/blocks/registry.d.ts +8 -0
  67. package/dist/blocks/registry.js.map +1 -1
  68. package/dist/i18n/overlay.d.ts +61 -0
  69. package/dist/i18n/overlay.js +90 -0
  70. package/dist/i18n/overlay.js.map +1 -0
  71. package/dist/index.d.ts +10 -8
  72. package/dist/index.js +32 -9
  73. package/dist/index.js.map +1 -1
  74. package/dist/modules/builtins.js +3 -2
  75. package/dist/modules/builtins.js.map +1 -1
  76. package/dist/schema/blocks.d.ts +159 -0
  77. package/dist/schema/blocks.js +8 -0
  78. package/dist/schema/blocks.js.map +1 -1
  79. package/dist/schema/customBlocks.d.ts +47 -0
  80. package/dist/schema/customBlocks.js +32 -0
  81. package/dist/schema/customBlocks.js.map +1 -0
  82. package/dist/schema/fields.d.ts +122 -0
  83. package/dist/schema/fields.js +120 -0
  84. package/dist/schema/fields.js.map +1 -0
  85. package/dist/schema/forms.d.ts +6 -6
  86. package/dist/schema/pages.d.ts +15 -1
  87. package/dist/schema/pages.js +6 -2
  88. package/dist/schema/pages.js.map +1 -1
  89. package/dist/schema/siteConfig.d.ts +14 -8
  90. package/dist/schema/siteConfig.js +2 -1
  91. package/dist/schema/siteConfig.js.map +1 -1
  92. package/dist/schema/symbols.d.ts +205 -0
  93. package/dist/schema/symbols.js +18 -0
  94. package/dist/schema/symbols.js.map +1 -0
  95. package/dist/server/index.d.ts +2 -1
  96. package/dist/server/index.js +24 -0
  97. package/dist/server/index.js.map +1 -1
  98. package/dist/server/pages.d.ts +21 -0
  99. package/dist/server/pages.js +77 -0
  100. package/dist/server/pages.js.map +1 -1
  101. package/dist/server/seo.d.ts +10 -3
  102. package/dist/server/seo.js +22 -10
  103. package/dist/server/seo.js.map +1 -1
  104. package/dist/styles.css +27 -0
  105. package/package.json +9 -9
  106. package/dist/components/EditableImage.d.ts +0 -18
  107. package/dist/components/EditableImage.js +0 -62
  108. package/dist/components/EditableImage.js.map +0 -1
  109. package/dist/components/EditableRichText.d.ts +0 -14
  110. package/dist/components/EditableRichText.js +0 -26
  111. package/dist/components/EditableRichText.js.map +0 -1
  112. package/dist/components/EditableText.d.ts +0 -21
  113. package/dist/components/EditableText.js +0 -25
  114. package/dist/components/EditableText.js.map +0 -1
  115. package/dist/content/ContentProvider.d.ts +0 -23
  116. package/dist/content/ContentProvider.js +0 -86
  117. package/dist/content/ContentProvider.js.map +0 -1
@@ -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":[]}