@nextsparkjs/core 0.1.0-beta.67 → 0.1.0-beta.68

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 (58) hide show
  1. package/dist/components/dashboard/block-editor/block-picker.d.ts +7 -2
  2. package/dist/components/dashboard/block-editor/block-picker.d.ts.map +1 -1
  3. package/dist/components/dashboard/block-editor/block-picker.js +27 -20
  4. package/dist/components/dashboard/block-editor/block-preview-canvas.d.ts.map +1 -1
  5. package/dist/components/dashboard/block-editor/block-preview-canvas.js +37 -37
  6. package/dist/components/dashboard/block-editor/block-settings-panel.js +3 -3
  7. package/dist/components/dashboard/block-editor/builder-editor-view.d.ts.map +1 -1
  8. package/dist/components/dashboard/block-editor/builder-editor-view.js +124 -82
  9. package/dist/components/dashboard/block-editor/config-panel.d.ts +18 -0
  10. package/dist/components/dashboard/block-editor/config-panel.d.ts.map +1 -0
  11. package/dist/components/dashboard/block-editor/config-panel.js +413 -0
  12. package/dist/components/dashboard/block-editor/floating-block-toolbar.js +1 -1
  13. package/dist/components/dashboard/block-editor/pattern-card.js +1 -1
  14. package/dist/components/dashboard/block-editor/pattern-reference-preview.js +1 -1
  15. package/dist/components/dashboard/block-editor/sortable-block.js +1 -1
  16. package/dist/components/dashboard/block-editor/tree-view-node.d.ts +11 -0
  17. package/dist/components/dashboard/block-editor/tree-view-node.d.ts.map +1 -0
  18. package/dist/components/dashboard/block-editor/tree-view-node.js +91 -0
  19. package/dist/components/dashboard/block-editor/tree-view.d.ts +17 -0
  20. package/dist/components/dashboard/block-editor/tree-view.d.ts.map +1 -0
  21. package/dist/components/dashboard/block-editor/tree-view.js +125 -0
  22. package/dist/components/dashboard/block-editor/viewport-toggle.d.ts +10 -0
  23. package/dist/components/dashboard/block-editor/viewport-toggle.d.ts.map +1 -0
  24. package/dist/components/dashboard/block-editor/viewport-toggle.js +55 -0
  25. package/dist/components/public/pageBuilder/PageRenderer.d.ts.map +1 -1
  26. package/dist/components/public/pageBuilder/PageRenderer.js +10 -1
  27. package/dist/components/ui/dynamic-icon.d.ts +12 -0
  28. package/dist/components/ui/dynamic-icon.d.ts.map +1 -0
  29. package/dist/components/ui/dynamic-icon.js +11 -0
  30. package/dist/lib/selectors/core-selectors.d.ts +98 -44
  31. package/dist/lib/selectors/core-selectors.d.ts.map +1 -1
  32. package/dist/lib/selectors/domains/block-editor.selectors.d.ts +136 -71
  33. package/dist/lib/selectors/domains/block-editor.selectors.d.ts.map +1 -1
  34. package/dist/lib/selectors/domains/block-editor.selectors.js +130 -60
  35. package/dist/lib/selectors/selectors.d.ts +196 -88
  36. package/dist/lib/selectors/selectors.d.ts.map +1 -1
  37. package/dist/messages/en/admin.json +15 -1
  38. package/dist/messages/en/index.d.ts +14 -0
  39. package/dist/messages/en/index.d.ts.map +1 -1
  40. package/dist/messages/es/admin.json +16 -1
  41. package/dist/messages/es/index.d.ts +15 -0
  42. package/dist/messages/es/index.d.ts.map +1 -1
  43. package/dist/presets/blocks/cta-section/component.tsx +4 -4
  44. package/dist/presets/blocks/features-grid/component.tsx +5 -5
  45. package/dist/presets/blocks/hero/component.tsx +2 -2
  46. package/dist/presets/blocks/testimonials/component.tsx +4 -4
  47. package/dist/presets/blocks/text-content/component.tsx +2 -2
  48. package/dist/presets/theme/blocks/hero/component.tsx +2 -2
  49. package/dist/presets/theme/tests/cypress/src/core/BlockEditorBasePOM.ts +123 -24
  50. package/dist/styles/classes.json +9 -2
  51. package/dist/styles/ui.css +1 -1
  52. package/dist/templates/features/blog/blocks/post-content/component.tsx +2 -2
  53. package/dist/templates/features/pages/blocks/hero/component.tsx +2 -2
  54. package/dist/templates/next.config.mjs +5 -3
  55. package/package.json +5 -4
  56. package/templates/features/blog/blocks/post-content/component.tsx +2 -2
  57. package/templates/features/pages/blocks/hero/component.tsx +2 -2
  58. package/templates/next.config.mjs +5 -3
@@ -8,16 +8,16 @@ import { v4 as uuidv4 } from "uuid";
8
8
  import { Button } from "../../ui/button.js";
9
9
  import { Input } from "../../ui/input.js";
10
10
  import { Separator } from "../../ui/separator.js";
11
- import { ArrowLeft, Save, ExternalLink, Eye, PenTool, Settings } from "lucide-react";
11
+ import { ArrowLeft, Save, ExternalLink, Eye, Settings } from "lucide-react";
12
12
  import Link from "next/link";
13
13
  import { toast } from "sonner";
14
14
  import { sel } from "../../../lib/test/index.js";
15
15
  import { BlockPicker } from "./block-picker.js";
16
- import { BlockCanvas } from "./block-canvas.js";
17
16
  import { BlockPreviewCanvas } from "./block-preview-canvas.js";
18
17
  import { BlockSettingsPanel } from "./block-settings-panel.js";
19
- import { PageSettingsPanel } from "./page-settings-panel.js";
20
18
  import { BlockService } from "../../../lib/services/block.service.js";
19
+ import { ViewportToggle } from "./viewport-toggle.js";
20
+ import { ConfigPanel } from "./config-panel.js";
21
21
  import { useSidebar } from "../../../contexts/sidebar-context.js";
22
22
  import { cn } from "../../../lib/utils.js";
23
23
  function getTeamId() {
@@ -42,7 +42,7 @@ function slugify(text) {
42
42
  return text.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "").replace(/[^a-z0-9\s-]/g, "").trim().replace(/\s+/g, "-").replace(/-+/g, "-");
43
43
  }
44
44
  function BuilderEditorView({ entitySlug, entityConfig, id, mode }) {
45
- var _a, _b;
45
+ var _a;
46
46
  const router = useRouter();
47
47
  const t = useTranslations("admin.builder");
48
48
  const queryClient = useQueryClient();
@@ -55,6 +55,7 @@ function BuilderEditorView({ entitySlug, entityConfig, id, mode }) {
55
55
  const [status, setStatus] = useState("draft");
56
56
  const [hasUnsavedChanges, setHasUnsavedChanges] = useState(false);
57
57
  const [viewMode, setViewMode] = useState("preview");
58
+ const [viewportMode, setViewportMode] = useState("desktop");
58
59
  const [leftSidebarMode, setLeftSidebarMode] = useState("blocks");
59
60
  const [pageSettings, setPageSettings] = useState({
60
61
  seo: {},
@@ -64,8 +65,8 @@ function BuilderEditorView({ entitySlug, entityConfig, id, mode }) {
64
65
  const [validationErrors, setValidationErrors] = useState({});
65
66
  const titleInputRef = useRef(null);
66
67
  const showFieldsOption = useMemo(() => {
67
- var _a2, _b2, _c;
68
- return (((_b2 = (_a2 = entityConfig.builder) == null ? void 0 : _a2.sidebarFields) == null ? void 0 : _b2.length) ?? 0) > 0 || ((_c = entityConfig.taxonomies) == null ? void 0 : _c.enabled);
68
+ var _a2, _b, _c;
69
+ return (((_b = (_a2 = entityConfig.builder) == null ? void 0 : _a2.sidebarFields) == null ? void 0 : _b.length) ?? 0) > 0 || ((_c = entityConfig.taxonomies) == null ? void 0 : _c.enabled);
69
70
  }, [entityConfig]);
70
71
  const showPatternsTab = useMemo(() => {
71
72
  return entitySlug !== "patterns";
@@ -94,7 +95,7 @@ function BuilderEditorView({ entitySlug, entityConfig, id, mode }) {
94
95
  enabled: mode === "edit" && !!id
95
96
  });
96
97
  useEffect(() => {
97
- var _a2, _b2;
98
+ var _a2, _b;
98
99
  if (mode === "edit" && (entityData == null ? void 0 : entityData.data)) {
99
100
  const entity = entityData.data;
100
101
  setTitle(entity.title ?? "");
@@ -104,7 +105,7 @@ function BuilderEditorView({ entitySlug, entityConfig, id, mode }) {
104
105
  setBlocks(entity.blocks || []);
105
106
  setPageSettings(entity.settings || { seo: {}, customFields: [] });
106
107
  const fields = {};
107
- (_b2 = (_a2 = entityConfig.builder) == null ? void 0 : _a2.sidebarFields) == null ? void 0 : _b2.forEach((field) => {
108
+ (_b = (_a2 = entityConfig.builder) == null ? void 0 : _a2.sidebarFields) == null ? void 0 : _b.forEach((field) => {
108
109
  if (entity[field] !== void 0) {
109
110
  fields[field] = entity[field];
110
111
  }
@@ -113,7 +114,7 @@ function BuilderEditorView({ entitySlug, entityConfig, id, mode }) {
113
114
  }
114
115
  }, [entityData, entityConfig, mode]);
115
116
  useEffect(() => {
116
- var _a2, _b2;
117
+ var _a2, _b;
117
118
  if (mode === "create") {
118
119
  setHasUnsavedChanges(title.length > 0 || blocks.length > 0 || status !== "draft");
119
120
  return;
@@ -121,7 +122,7 @@ function BuilderEditorView({ entitySlug, entityConfig, id, mode }) {
121
122
  if (!(entityData == null ? void 0 : entityData.data)) return;
122
123
  const entity = entityData.data;
123
124
  const hasChanges = title !== entity.title || slug !== entity.slug || status !== (entity.status || "draft") || JSON.stringify(blocks) !== JSON.stringify(entity.blocks || []) || JSON.stringify(pageSettings) !== JSON.stringify(entity.settings || { seo: {}, customFields: [] }) || JSON.stringify(entityFields) !== JSON.stringify(
124
- ((_b2 = (_a2 = entityConfig.builder) == null ? void 0 : _a2.sidebarFields) == null ? void 0 : _b2.reduce((acc, field) => {
125
+ ((_b = (_a2 = entityConfig.builder) == null ? void 0 : _a2.sidebarFields) == null ? void 0 : _b.reduce((acc, field) => {
125
126
  if (entity[field] !== void 0) acc[field] = entity[field];
126
127
  return acc;
127
128
  }, {})) || {}
@@ -238,9 +239,19 @@ function BuilderEditorView({ entitySlug, entityConfig, id, mode }) {
238
239
  blockSlug,
239
240
  props: {}
240
241
  };
242
+ if (selectedBlockId) {
243
+ const index = blocks.findIndex((b) => b.id === selectedBlockId);
244
+ if (index !== -1) {
245
+ const newBlocks = [...blocks];
246
+ newBlocks.splice(index + 1, 0, newBlock);
247
+ setBlocks(newBlocks);
248
+ setSelectedBlockId(newBlock.id);
249
+ return;
250
+ }
251
+ }
241
252
  setBlocks((prev) => [...prev, newBlock]);
242
253
  setSelectedBlockId(newBlock.id);
243
- }, []);
254
+ }, [blocks, selectedBlockId]);
244
255
  const handleAddPattern = useCallback((patternId) => {
245
256
  const patternRef = {
246
257
  type: "pattern",
@@ -278,7 +289,7 @@ function BuilderEditorView({ entitySlug, entityConfig, id, mode }) {
278
289
  ));
279
290
  }, []);
280
291
  const handleReorderBlocks = useCallback((newBlocks) => {
281
- setBlocks(newBlocks);
292
+ setBlocks(newBlocks.filter((b) => !("ref" in b)));
282
293
  }, []);
283
294
  const handleMoveBlockUp = useCallback((blockId) => {
284
295
  setBlocks((prev) => {
@@ -308,11 +319,17 @@ function BuilderEditorView({ entitySlug, entityConfig, id, mode }) {
308
319
  setLeftSidebarMode(value);
309
320
  }
310
321
  }, [leftSidebarMode]);
322
+ const handleViewModeChange = useCallback((mode2) => {
323
+ setViewMode(mode2);
324
+ if (mode2 === "settings") {
325
+ setSelectedBlockId(null);
326
+ }
327
+ }, []);
311
328
  const selectedBlock = selectedBlockId ? blocks.find((b) => b.id === selectedBlockId) : void 0;
312
329
  const publicUrl = useMemo(() => {
313
- var _a2, _b2, _c;
330
+ var _a2, _b, _c;
314
331
  if (status !== "published" || !slug) return null;
315
- const basePath = ((_a2 = entityConfig.access) == null ? void 0 : _a2.basePath) ?? ((_c = (_b2 = entityConfig.builder) == null ? void 0 : _b2.public) == null ? void 0 : _c.basePath) ?? "";
332
+ const basePath = ((_a2 = entityConfig.access) == null ? void 0 : _a2.basePath) ?? ((_c = (_b = entityConfig.builder) == null ? void 0 : _b.public) == null ? void 0 : _c.basePath) ?? "";
316
333
  return basePath === "/" ? `/${slug}` : `${basePath}/${slug}`;
317
334
  }, [status, slug, entityConfig]);
318
335
  const leftSidebarOptions = useMemo(() => {
@@ -344,7 +361,7 @@ function BuilderEditorView({ entitySlug, entityConfig, id, mode }) {
344
361
  return /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center h-screen", children: /* @__PURE__ */ jsx("p", { className: "text-muted-foreground", children: t("loading") }) });
345
362
  }
346
363
  return /* @__PURE__ */ jsxs("div", { className: cn(
347
- "fixed inset-0 pt-14 pb-20 lg:top-16 lg:pt-0 lg:pb-0 flex flex-col bg-background z-20 transition-all duration-300",
364
+ "fixed inset-0 pt-14 pb-20 lg:top-16 lg:pt-0 lg:pb-0 flex flex-col bg-background z-20 transition-[width,padding] duration-300",
348
365
  isCollapsed ? "lg:left-16" : "lg:left-64"
349
366
  ), "data-cy": sel("blockEditor.container"), children: [
350
367
  /* @__PURE__ */ jsx(
@@ -438,45 +455,54 @@ function BuilderEditorView({ entitySlug, entityConfig, id, mode }) {
438
455
  )
439
456
  ] })
440
457
  ] }),
441
- /* @__PURE__ */ jsxs(
442
- "div",
443
- {
444
- className: "bg-muted p-1 rounded-lg flex items-center text-sm font-medium",
445
- "data-cy": sel("blockEditor.header.viewToggle"),
446
- children: [
447
- /* @__PURE__ */ jsxs(
448
- "button",
449
- {
450
- className: cn(
451
- "px-3 py-1.5 rounded-md transition-all flex items-center gap-2",
452
- viewMode === "layout" ? "bg-background text-foreground shadow-sm" : "text-muted-foreground hover:text-foreground hover:bg-muted-foreground/10"
453
- ),
454
- onClick: () => setViewMode("layout"),
455
- "data-cy": sel("blockEditor.header.viewEditor"),
456
- children: [
457
- /* @__PURE__ */ jsx(PenTool, { className: "h-3.5 w-3.5" }),
458
- /* @__PURE__ */ jsx("span", { children: t("viewMode.layout") })
459
- ]
460
- }
461
- ),
462
- /* @__PURE__ */ jsxs(
463
- "button",
464
- {
465
- className: cn(
466
- "px-3 py-1.5 rounded-md transition-all flex items-center gap-2",
467
- viewMode === "preview" ? "bg-background text-foreground shadow-sm" : "text-muted-foreground hover:text-foreground hover:bg-muted-foreground/10"
468
- ),
469
- onClick: () => setViewMode("preview"),
470
- "data-cy": sel("blockEditor.header.viewPreview"),
471
- children: [
472
- /* @__PURE__ */ jsx(Eye, { className: "h-3.5 w-3.5" }),
473
- /* @__PURE__ */ jsx("span", { children: t("viewMode.preview") })
474
- ]
475
- }
476
- )
477
- ]
478
- }
479
- ),
458
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
459
+ /* @__PURE__ */ jsxs(
460
+ "div",
461
+ {
462
+ className: "bg-muted p-1 rounded-lg flex items-center text-sm font-medium",
463
+ "data-cy": sel("blockEditor.header.viewToggle"),
464
+ children: [
465
+ /* @__PURE__ */ jsxs(
466
+ "button",
467
+ {
468
+ className: cn(
469
+ "px-3 py-1.5 rounded-md transition-colors flex items-center gap-2",
470
+ viewMode === "preview" ? "bg-background text-foreground shadow-sm" : "text-muted-foreground hover:text-foreground hover:bg-muted-foreground/10"
471
+ ),
472
+ onClick: () => handleViewModeChange("preview"),
473
+ "data-cy": sel("blockEditor.header.viewPreview"),
474
+ children: [
475
+ /* @__PURE__ */ jsx(Eye, { className: "h-3.5 w-3.5" }),
476
+ /* @__PURE__ */ jsx("span", { children: t("viewMode.preview") })
477
+ ]
478
+ }
479
+ ),
480
+ /* @__PURE__ */ jsxs(
481
+ "button",
482
+ {
483
+ className: cn(
484
+ "px-3 py-1.5 rounded-md transition-colors flex items-center gap-2",
485
+ viewMode === "settings" ? "bg-background text-foreground shadow-sm" : "text-muted-foreground hover:text-foreground hover:bg-muted-foreground/10"
486
+ ),
487
+ onClick: () => handleViewModeChange("settings"),
488
+ "data-cy": sel("blockEditor.header.viewSettings"),
489
+ children: [
490
+ /* @__PURE__ */ jsx(Settings, { className: "h-3.5 w-3.5" }),
491
+ /* @__PURE__ */ jsx("span", { children: t("viewMode.settings") })
492
+ ]
493
+ }
494
+ )
495
+ ]
496
+ }
497
+ ),
498
+ viewMode === "preview" && /* @__PURE__ */ jsx(
499
+ ViewportToggle,
500
+ {
501
+ value: viewportMode,
502
+ onChange: setViewportMode
503
+ }
504
+ )
505
+ ] }),
480
506
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 flex-1 justify-end", children: [
481
507
  /* @__PURE__ */ jsxs(
482
508
  "div",
@@ -557,42 +583,58 @@ function BuilderEditorView({ entitySlug, entityConfig, id, mode }) {
557
583
  entityFields,
558
584
  onEntityFieldChange: handleEntityFieldChange,
559
585
  showFieldsTab: !!showFieldsOption,
560
- showPatternsTab
586
+ showPatternsTab,
587
+ pageBlocks: blocks,
588
+ selectedBlockId,
589
+ onSelectBlock: setSelectedBlockId,
590
+ onReorderBlocks: handleReorderBlocks
561
591
  }
562
592
  ) }),
563
- /* @__PURE__ */ jsx("div", { className: "flex-1 overflow-y-auto bg-gray-100", children: viewMode === "layout" ? /* @__PURE__ */ jsx("div", { className: "p-6", children: /* @__PURE__ */ jsxs("div", { className: "max-w-4xl mx-auto", children: [
593
+ /* @__PURE__ */ jsxs("div", { className: "flex-1 overflow-hidden", children: [
564
594
  /* @__PURE__ */ jsx(
565
- BlockCanvas,
595
+ "div",
566
596
  {
567
- blocks,
568
- selectedBlockId,
569
- onSelectBlock: setSelectedBlockId,
570
- onRemoveBlock: handleRemoveBlock,
571
- onDuplicateBlock: handleDuplicateBlock,
572
- onReorder: handleReorderBlocks,
573
- onUpdateProps: handleUpdateBlockProps,
574
- onAddBlock: handleAddBlock
597
+ className: cn(
598
+ "h-full overflow-y-auto bg-muted/30",
599
+ viewMode !== "preview" && "hidden"
600
+ ),
601
+ "data-cy": sel("blockEditor.previewCanvas.container"),
602
+ children: /* @__PURE__ */ jsx(
603
+ "div",
604
+ {
605
+ className: "mx-auto transition-[width] duration-200 min-h-full",
606
+ style: {
607
+ width: viewportMode === "mobile" ? "375px" : "100%",
608
+ maxWidth: "100%"
609
+ },
610
+ "data-cy": sel("blockEditor.previewCanvas.viewport", { mode: viewportMode }),
611
+ children: /* @__PURE__ */ jsx("div", { className: "min-h-full bg-background", children: /* @__PURE__ */ jsx(
612
+ BlockPreviewCanvas,
613
+ {
614
+ blocks,
615
+ selectedBlockId,
616
+ onSelectBlock: setSelectedBlockId,
617
+ onMoveUp: handleMoveBlockUp,
618
+ onMoveDown: handleMoveBlockDown,
619
+ onDuplicate: handleDuplicateBlock,
620
+ onRemove: handleRemoveBlock
621
+ }
622
+ ) })
623
+ }
624
+ )
575
625
  }
576
626
  ),
577
- ((_b = entityConfig.builder) == null ? void 0 : _b.seo) && /* @__PURE__ */ jsx(
578
- PageSettingsPanel,
627
+ /* @__PURE__ */ jsx("div", { className: cn(viewMode !== "settings" && "hidden"), children: /* @__PURE__ */ jsx(
628
+ ConfigPanel,
579
629
  {
580
- settings: pageSettings,
581
- onChange: setPageSettings
630
+ entityConfig,
631
+ entityFields,
632
+ onEntityFieldChange: handleEntityFieldChange,
633
+ pageSettings,
634
+ onPageSettingsChange: setPageSettings
582
635
  }
583
- )
584
- ] }) }) : /* @__PURE__ */ jsx("div", { className: "bg-background", children: /* @__PURE__ */ jsx(
585
- BlockPreviewCanvas,
586
- {
587
- blocks,
588
- selectedBlockId,
589
- onSelectBlock: setSelectedBlockId,
590
- onMoveUp: handleMoveBlockUp,
591
- onMoveDown: handleMoveBlockDown,
592
- onDuplicate: handleDuplicateBlock,
593
- onRemove: handleRemoveBlock
594
- }
595
- ) }) }),
636
+ ) })
637
+ ] }),
596
638
  /* @__PURE__ */ jsx("div", { className: "w-96 border-l overflow-hidden shadow-sm", children: /* @__PURE__ */ jsx(
597
639
  BlockSettingsPanel,
598
640
  {
@@ -0,0 +1,18 @@
1
+ import type { ClientEntityConfig } from '@nextsparkjs/registries/entity-registry.client';
2
+ import type { PageSettings } from './page-settings-panel';
3
+ interface ConfigPanelProps {
4
+ entityConfig: ClientEntityConfig;
5
+ entityFields: Record<string, unknown>;
6
+ onEntityFieldChange: (field: string, value: unknown) => void;
7
+ pageSettings: PageSettings;
8
+ onPageSettingsChange: (settings: PageSettings) => void;
9
+ }
10
+ /**
11
+ * ConfigPanel - Settings view for the center column
12
+ *
13
+ * Combines entity fields and SEO/meta settings in a single scrollable panel
14
+ * with two collapsible sections.
15
+ */
16
+ export declare function ConfigPanel({ entityConfig, entityFields, onEntityFieldChange, pageSettings, onPageSettingsChange }: ConfigPanelProps): import("react/jsx-runtime").JSX.Element;
17
+ export {};
18
+ //# sourceMappingURL=config-panel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-panel.d.ts","sourceRoot":"","sources":["../../../../src/components/dashboard/block-editor/config-panel.tsx"],"names":[],"mappings":"AA8BA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gDAAgD,CAAA;AACxF,OAAO,KAAK,EAAE,YAAY,EAAoC,MAAM,uBAAuB,CAAA;AAS3F,UAAU,gBAAgB;IACxB,YAAY,EAAE,kBAAkB,CAAA;IAChC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACrC,mBAAmB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IAC5D,YAAY,EAAE,YAAY,CAAA;IAC1B,oBAAoB,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,IAAI,CAAA;CACvD;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,EAC1B,YAAY,EACZ,YAAY,EACZ,mBAAmB,EACnB,YAAY,EACZ,oBAAoB,EACrB,EAAE,gBAAgB,2CAyZlB"}