zuljaman-banner-components 1.0.22 → 1.0.24

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/README.md +228 -131
  2. package/dist/components/BannerRenderer/BannerRenderer.d.ts +8 -0
  3. package/dist/components/BannerRenderer/BannerRenderer.d.ts.map +1 -0
  4. package/dist/components/BannerRenderer/BannerRenderer.js +325 -0
  5. package/dist/components/BannerRenderer/components/CopyElement.d.ts +62 -0
  6. package/dist/components/BannerRenderer/components/CopyElement.d.ts.map +1 -0
  7. package/dist/components/BannerRenderer/components/CopyElement.js +220 -0
  8. package/dist/components/BannerRenderer/components/InteractiveLines.d.ts +26 -0
  9. package/dist/components/BannerRenderer/components/InteractiveLines.d.ts.map +1 -0
  10. package/dist/components/BannerRenderer/components/InteractiveLines.js +172 -0
  11. package/dist/components/BannerRenderer/components/LogoElement.d.ts +55 -0
  12. package/dist/components/BannerRenderer/components/LogoElement.d.ts.map +1 -0
  13. package/dist/components/BannerRenderer/components/LogoElement.js +53 -0
  14. package/dist/components/BannerRenderer/components/VisualGuides.d.ts +43 -0
  15. package/dist/components/BannerRenderer/components/VisualGuides.d.ts.map +1 -0
  16. package/dist/components/BannerRenderer/components/VisualGuides.js +110 -0
  17. package/dist/components/BannerRenderer/components/index.d.ts +12 -0
  18. package/dist/components/BannerRenderer/components/index.d.ts.map +1 -0
  19. package/dist/components/BannerRenderer/components/index.js +14 -0
  20. package/dist/components/BannerRenderer/constants.d.ts +15 -0
  21. package/dist/components/BannerRenderer/constants.d.ts.map +1 -0
  22. package/dist/components/BannerRenderer/constants.js +36 -0
  23. package/dist/components/BannerRenderer/hooks/index.d.ts +14 -0
  24. package/dist/components/BannerRenderer/hooks/index.d.ts.map +1 -0
  25. package/dist/components/BannerRenderer/hooks/index.js +16 -0
  26. package/dist/components/BannerRenderer/hooks/useAutoPositioning/debugPositions.d.ts +30 -0
  27. package/dist/components/BannerRenderer/hooks/useAutoPositioning/debugPositions.d.ts.map +1 -0
  28. package/dist/components/BannerRenderer/hooks/useAutoPositioning/debugPositions.js +87 -0
  29. package/dist/components/BannerRenderer/hooks/useAutoPositioning/index.d.ts +13 -0
  30. package/dist/components/BannerRenderer/hooks/useAutoPositioning/index.d.ts.map +1 -0
  31. package/dist/components/BannerRenderer/hooks/useAutoPositioning/index.js +21 -0
  32. package/dist/components/BannerRenderer/hooks/useAutoPositioning/useAnchorEdgeLocking.d.ts +71 -0
  33. package/dist/components/BannerRenderer/hooks/useAutoPositioning/useAnchorEdgeLocking.d.ts.map +1 -0
  34. package/dist/components/BannerRenderer/hooks/useAutoPositioning/useAnchorEdgeLocking.js +151 -0
  35. package/dist/components/BannerRenderer/hooks/useAutoPositioning/useAutoPositioningMain.d.ts +66 -0
  36. package/dist/components/BannerRenderer/hooks/useAutoPositioning/useAutoPositioningMain.d.ts.map +1 -0
  37. package/dist/components/BannerRenderer/hooks/useAutoPositioning/useAutoPositioningMain.js +332 -0
  38. package/dist/components/BannerRenderer/hooks/useAutoPositioning/useChainPositioning.d.ts +61 -0
  39. package/dist/components/BannerRenderer/hooks/useAutoPositioning/useChainPositioning.d.ts.map +1 -0
  40. package/dist/components/BannerRenderer/hooks/useAutoPositioning/useChainPositioning.js +180 -0
  41. package/dist/components/BannerRenderer/hooks/useAutoPositioning/useHeightCompensation.d.ts +60 -0
  42. package/dist/components/BannerRenderer/hooks/useAutoPositioning/useHeightCompensation.d.ts.map +1 -0
  43. package/dist/components/BannerRenderer/hooks/useAutoPositioning/useHeightCompensation.js +178 -0
  44. package/dist/components/BannerRenderer/hooks/useAutoPositioning.d.ts +8 -0
  45. package/dist/components/BannerRenderer/hooks/useAutoPositioning.d.ts.map +1 -0
  46. package/dist/components/BannerRenderer/hooks/useAutoPositioning.js +12 -0
  47. package/dist/components/BannerRenderer/hooks/useDragSnap.d.ts +30 -0
  48. package/dist/components/BannerRenderer/hooks/useDragSnap.d.ts.map +1 -0
  49. package/dist/components/BannerRenderer/hooks/useDragSnap.js +90 -0
  50. package/dist/components/BannerRenderer/hooks/useElementRefs.d.ts +22 -0
  51. package/dist/components/BannerRenderer/hooks/useElementRefs.d.ts.map +1 -0
  52. package/dist/components/BannerRenderer/hooks/useElementRefs.js +70 -0
  53. package/dist/components/BannerRenderer/hooks/useLineDrawing.d.ts +40 -0
  54. package/dist/components/BannerRenderer/hooks/useLineDrawing.d.ts.map +1 -0
  55. package/dist/components/BannerRenderer/hooks/useLineDrawing.js +198 -0
  56. package/dist/components/BannerRenderer/hooks/useProximityDetection.d.ts +43 -0
  57. package/dist/components/BannerRenderer/hooks/useProximityDetection.d.ts.map +1 -0
  58. package/dist/components/BannerRenderer/hooks/useProximityDetection.js +491 -0
  59. package/dist/components/BannerRenderer/index.d.ts +6 -0
  60. package/dist/components/BannerRenderer/index.d.ts.map +1 -0
  61. package/dist/components/BannerRenderer/index.js +8 -0
  62. package/dist/components/{BannerRenderer.d.ts → BannerRenderer/types.d.ts} +29 -8
  63. package/dist/components/BannerRenderer/types.d.ts.map +1 -0
  64. package/dist/components/BannerRenderer/types.js +5 -0
  65. package/dist/components/BannerRenderer/utils/alignmentUtils.d.ts +38 -0
  66. package/dist/components/BannerRenderer/utils/alignmentUtils.d.ts.map +1 -0
  67. package/dist/components/BannerRenderer/utils/alignmentUtils.js +138 -0
  68. package/dist/components/BannerRenderer/utils/elementCheckUtils.d.ts +22 -0
  69. package/dist/components/BannerRenderer/utils/elementCheckUtils.d.ts.map +1 -0
  70. package/dist/components/BannerRenderer/utils/elementCheckUtils.js +37 -0
  71. package/dist/components/BannerRenderer/utils/elementIdUtils.d.ts +25 -0
  72. package/dist/components/BannerRenderer/utils/elementIdUtils.d.ts.map +1 -0
  73. package/dist/components/BannerRenderer/utils/elementIdUtils.js +56 -0
  74. package/dist/components/BannerRenderer/utils/fontUtils.d.ts +12 -0
  75. package/dist/components/BannerRenderer/utils/fontUtils.d.ts.map +1 -0
  76. package/dist/components/BannerRenderer/utils/fontUtils.js +26 -0
  77. package/dist/components/BannerRenderer/utils/graphUtils.d.ts +54 -0
  78. package/dist/components/BannerRenderer/utils/graphUtils.d.ts.map +1 -0
  79. package/dist/components/BannerRenderer/utils/graphUtils.js +138 -0
  80. package/dist/components/BannerRenderer/utils/index.d.ts +12 -0
  81. package/dist/components/BannerRenderer/utils/index.d.ts.map +1 -0
  82. package/dist/components/BannerRenderer/utils/index.js +27 -0
  83. package/dist/components/BannerRenderer/utils/snapUtils.d.ts +38 -0
  84. package/dist/components/BannerRenderer/utils/snapUtils.d.ts.map +1 -0
  85. package/dist/components/BannerRenderer/utils/snapUtils.js +109 -0
  86. package/dist/components/BannerVisor.d.ts.map +1 -1
  87. package/dist/components/BannerVisor.js +8 -1
  88. package/dist/components/index.js +1 -1
  89. package/dist/components/shared/DraggableElement.d.ts +11 -0
  90. package/dist/components/shared/DraggableElement.d.ts.map +1 -1
  91. package/dist/components/shared/DraggableElement.js +51 -51
  92. package/dist/components/styles/Style1/substyleConfig.d.ts.map +1 -1
  93. package/dist/components/styles/Style1/substyleConfig.js +53 -54
  94. package/dist/components/styles/Style2/substyleConfig.js +78 -78
  95. package/dist/components/styles/Style3/substyleConfig.d.ts.map +1 -1
  96. package/dist/components/styles/Style3/substyleConfig.js +40 -37
  97. package/dist/components/styles/Style4/substyleConfig.js +57 -57
  98. package/dist/components/styles/types/substyleTypes.d.ts +32 -15
  99. package/dist/components/styles/types/substyleTypes.d.ts.map +1 -1
  100. package/dist/components/styles/utils/chainValidation.d.ts +41 -0
  101. package/dist/components/styles/utils/chainValidation.d.ts.map +1 -0
  102. package/dist/components/styles/utils/chainValidation.js +148 -0
  103. package/dist/components/styles/utils/positioningUtils.d.ts +207 -11
  104. package/dist/components/styles/utils/positioningUtils.d.ts.map +1 -1
  105. package/dist/components/styles/utils/positioningUtils.js +520 -19
  106. package/dist/constants/characterLimits.d.ts +4 -16
  107. package/dist/constants/characterLimits.d.ts.map +1 -1
  108. package/dist/constants/characterLimits.js +28 -26
  109. package/dist/constants/styleConfigs.js +6 -6
  110. package/dist/styleConfig.d.ts +4 -4
  111. package/dist/styleConfig.d.ts.map +1 -1
  112. package/dist/styleConfig.js +8 -16
  113. package/dist/types.d.ts +42 -0
  114. package/dist/types.d.ts.map +1 -1
  115. package/package.json +1 -1
  116. package/dist/components/BannerRenderer.d.ts.map +0 -1
  117. package/dist/components/BannerRenderer.js +0 -559
@@ -0,0 +1,198 @@
1
+ "use strict";
2
+ /**
3
+ * useLineDrawing hook
4
+ * Manages manual line drawing state and interactions for auto-positioning
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || (function () {
23
+ var ownKeys = function(o) {
24
+ ownKeys = Object.getOwnPropertyNames || function (o) {
25
+ var ar = [];
26
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
+ return ar;
28
+ };
29
+ return ownKeys(o);
30
+ };
31
+ return function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ })();
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.useLineDrawing = useLineDrawing;
41
+ const react_1 = __importStar(require("react"));
42
+ const utils_1 = require("../utils");
43
+ /**
44
+ * Hook that manages line drawing state and interactions for manual auto-positioning links.
45
+ */
46
+ function useLineDrawing({ bannerContainerRef, copies, sizeMultiplier, creationMode, areElementsOverlapping, areVerticallyAligned, autoPositioningConfig, configKey, }) {
47
+ // Line drawing state
48
+ const [drawingFrom, setDrawingFrom] = (0, react_1.useState)(null);
49
+ const [drawingMousePos, setDrawingMousePos] = (0, react_1.useState)(null);
50
+ const [completedLines, setCompletedLines] = (0, react_1.useState)(new Map());
51
+ const [manualLines, setManualLines] = (0, react_1.useState)(new Set());
52
+ // Reset ALL state when configKey changes (style/substyle change)
53
+ // This ensures the library self-resets without requiring consumer to use key prop
54
+ // IMPORTANT: useLayoutEffect ensures reset happens BEFORE next paint (sync)
55
+ (0, react_1.useLayoutEffect)(() => {
56
+ var _a;
57
+ if (!configKey)
58
+ return; // Skip if configKey not provided (backward compat)
59
+ // Reset drawing state
60
+ setDrawingFrom(null);
61
+ setDrawingMousePos(null);
62
+ // Reset completedLines from autoPositioningConfig
63
+ if ((_a = autoPositioningConfig === null || autoPositioningConfig === void 0 ? void 0 : autoPositioningConfig.links) === null || _a === void 0 ? void 0 : _a.length) {
64
+ const initial = new Map();
65
+ autoPositioningConfig.links.forEach(link => {
66
+ initial.set(link.fromElement, link.toElement);
67
+ });
68
+ setCompletedLines(initial);
69
+ }
70
+ else {
71
+ setCompletedLines(new Map());
72
+ }
73
+ // Reset manual lines
74
+ setManualLines(new Set());
75
+ }, [configKey]); // eslint-disable-line react-hooks/exhaustive-deps
76
+ // ^ Intentionally only depend on configKey - we want to reset when config changes
77
+ // Helper: Convert element ID to styleSlot format
78
+ const convertToStyleSlotId = react_1.default.useCallback((elementId) => (0, utils_1.convertToStyleSlotId)(elementId, copies), [copies]);
79
+ // Toggle interactive line drawing for an element
80
+ const handleToggleAutoPositioning = react_1.default.useCallback((elementId) => {
81
+ if (!creationMode)
82
+ return;
83
+ // Convert to styleSlot format for checking completedLines
84
+ const styleSlotId = convertToStyleSlotId(elementId);
85
+ setCompletedLines(prev => {
86
+ // If element already has a line, remove it (check using canonical format)
87
+ if (prev.has(styleSlotId)) {
88
+ const targetId = prev.get(styleSlotId);
89
+ const newMap = new Map(prev);
90
+ newMap.delete(styleSlotId);
91
+ // Also remove from manual lines (already in canonical format)
92
+ if (targetId) {
93
+ setManualLines(prevManual => {
94
+ const newSet = new Set(prevManual);
95
+ newSet.delete(`${styleSlotId}->${targetId}`);
96
+ return newSet;
97
+ });
98
+ }
99
+ return newMap;
100
+ }
101
+ return prev;
102
+ });
103
+ // If element is currently drawing, cancel it
104
+ if (drawingFrom === elementId) {
105
+ setDrawingFrom(null);
106
+ setDrawingMousePos(null);
107
+ return;
108
+ }
109
+ // If another element is drawing, do nothing (must complete or cancel first)
110
+ if (drawingFrom !== null) {
111
+ return;
112
+ }
113
+ // Start drawing from this element (keep original UUID for ref lookup during drawing)
114
+ setDrawingFrom(elementId);
115
+ }, [drawingFrom, creationMode, convertToStyleSlotId]);
116
+ // Handle mouse move to update drawing line position
117
+ const handleMouseMove = react_1.default.useCallback((e) => {
118
+ if (!drawingFrom || !bannerContainerRef.current)
119
+ return;
120
+ const bannerBounds = bannerContainerRef.current.getBoundingClientRect();
121
+ const bannerCenterX = bannerBounds.left + bannerBounds.width / 2;
122
+ const bannerCenterY = bannerBounds.top + bannerBounds.height / 2;
123
+ // Calculate mouse position relative to banner center (in unscaled pixels)
124
+ const mouseX = (e.clientX - bannerCenterX) / sizeMultiplier;
125
+ const mouseY = (e.clientY - bannerCenterY) / sizeMultiplier;
126
+ setDrawingMousePos({ x: mouseX, y: mouseY });
127
+ }, [drawingFrom, bannerContainerRef, sizeMultiplier]);
128
+ // Handle container click to cancel drawing
129
+ const handleContainerClick = react_1.default.useCallback((e) => {
130
+ // Only handle if currently drawing
131
+ if (!creationMode || !drawingFrom)
132
+ return;
133
+ // Check if click was on the banner container itself (not on an element)
134
+ if (e.target === e.currentTarget || e.target.closest('.banner-container-bg')) {
135
+ // Cancel drawing
136
+ setDrawingFrom(null);
137
+ setDrawingMousePos(null);
138
+ }
139
+ }, [drawingFrom, creationMode]);
140
+ // Complete line drawing when target element is clicked
141
+ const handleCompleteLineTo = react_1.default.useCallback((targetId) => {
142
+ if (!creationMode || !drawingFrom || drawingFrom === targetId) {
143
+ return;
144
+ }
145
+ // Validate that elements are NOT overlapping
146
+ const isOverlapping = areElementsOverlapping(drawingFrom, targetId);
147
+ if (isOverlapping) {
148
+ setDrawingFrom(null);
149
+ setDrawingMousePos(null);
150
+ return;
151
+ }
152
+ // Validate that elements are vertically aligned (one above the other)
153
+ const isVerticallyAligned = areVerticallyAligned(drawingFrom, targetId);
154
+ if (!isVerticallyAligned) {
155
+ setDrawingFrom(null);
156
+ setDrawingMousePos(null);
157
+ return;
158
+ }
159
+ // Convert IDs to styleSlot format (copy-N) before storing
160
+ const fromStyleSlot = convertToStyleSlotId(drawingFrom);
161
+ const toStyleSlot = convertToStyleSlotId(targetId);
162
+ // Add completed line using canonical copy-N format
163
+ // When connecting A → B, remove any existing connection B → A to prevent duplicate links
164
+ setCompletedLines(prev => {
165
+ const newMap = new Map(prev);
166
+ // Remove reverse connection if it exists
167
+ if (newMap.get(toStyleSlot) === fromStyleSlot) {
168
+ newMap.delete(toStyleSlot);
169
+ }
170
+ newMap.set(fromStyleSlot, toStyleSlot);
171
+ return newMap;
172
+ });
173
+ // Mark this line as manual and clean up old reverse line if needed
174
+ setManualLines(prev => {
175
+ const newSet = new Set(prev);
176
+ // Remove reverse line entry if it exists (use canonical format)
177
+ newSet.delete(`${toStyleSlot}->${fromStyleSlot}`);
178
+ newSet.add(`${fromStyleSlot}->${toStyleSlot}`);
179
+ return newSet;
180
+ });
181
+ // Clear drawing state
182
+ setDrawingFrom(null);
183
+ setDrawingMousePos(null);
184
+ }, [drawingFrom, creationMode, areElementsOverlapping, areVerticallyAligned, convertToStyleSlotId]);
185
+ return {
186
+ drawingFrom,
187
+ drawingMousePos,
188
+ completedLines,
189
+ manualLines,
190
+ setCompletedLines,
191
+ setManualLines,
192
+ handleToggleAutoPositioning,
193
+ handleMouseMove,
194
+ handleContainerClick,
195
+ handleCompleteLineTo,
196
+ convertToStyleSlotId,
197
+ };
198
+ }
@@ -0,0 +1,43 @@
1
+ /**
2
+ * useProximityDetection hook
3
+ * Handles auto-detection of proximity chains and visual proximity indicators
4
+ */
5
+ import React from 'react';
6
+ import type { CopyConfig } from '../../../types';
7
+ export interface ProximityLine {
8
+ fromId: string;
9
+ toId: string;
10
+ distance: number;
11
+ fromPos: {
12
+ x: number;
13
+ y: number;
14
+ };
15
+ toPos: {
16
+ x: number;
17
+ y: number;
18
+ };
19
+ }
20
+ export interface UseProximityDetectionParams {
21
+ logoRef: React.RefObject<HTMLDivElement | null>;
22
+ copyRefs: React.MutableRefObject<(HTMLDivElement | null)[]>;
23
+ bannerContainerRef: React.RefObject<HTMLDivElement | null>;
24
+ copies: CopyConfig[];
25
+ sizeMultiplier: number;
26
+ creationMode: boolean;
27
+ manualLines: Set<string>;
28
+ completedLines: Map<string, string>;
29
+ setCompletedLines: React.Dispatch<React.SetStateAction<Map<string, string>>>;
30
+ setLineGaps: React.Dispatch<React.SetStateAction<Map<string, number>>>;
31
+ getElementRef: (elementId: string) => HTMLDivElement | null;
32
+ }
33
+ export interface UseProximityDetectionReturn {
34
+ proximityLines: ProximityLine[];
35
+ setProximityLines: React.Dispatch<React.SetStateAction<ProximityLine[]>>;
36
+ detectProximityLines: (draggedElementId: string) => void;
37
+ calculateProximityLines: (draggedElementId: string) => void;
38
+ }
39
+ /**
40
+ * Hook that handles auto-detection of proximity chains and visual proximity line indicators.
41
+ */
42
+ export declare function useProximityDetection({ logoRef, copyRefs, bannerContainerRef, copies, sizeMultiplier, creationMode, manualLines, completedLines, setCompletedLines, setLineGaps, getElementRef, }: UseProximityDetectionParams): UseProximityDetectionReturn;
43
+ //# sourceMappingURL=useProximityDetection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useProximityDetection.d.ts","sourceRoot":"","sources":["../../../../src/components/BannerRenderer/hooks/useProximityDetection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAmB,MAAM,OAAO,CAAC;AACxC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAOjD,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAClC,KAAK,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACjC;AAED,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAChD,QAAQ,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAC,cAAc,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;IAC5D,kBAAkB,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAC3D,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACzB,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,iBAAiB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAC7E,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IACvE,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,cAAc,GAAG,IAAI,CAAC;CAC7D;AAED,MAAM,WAAW,2BAA2B;IAC1C,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,iBAAiB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;IACzE,oBAAoB,EAAE,CAAC,gBAAgB,EAAE,MAAM,KAAK,IAAI,CAAC;IACzD,uBAAuB,EAAE,CAAC,gBAAgB,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,EACpC,OAAO,EACP,QAAQ,EACR,kBAAkB,EAClB,MAAM,EACN,cAAc,EACd,YAAY,EACZ,WAAW,EACX,cAAc,EACd,iBAAiB,EACjB,WAAW,EACX,aAAa,GACd,EAAE,2BAA2B,GAAG,2BAA2B,CA0gB3D"}