@amphore-dev/shades 0.5.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 (103) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +317 -0
  3. package/dist/classes/ShadesEngine.d.ts +65 -0
  4. package/dist/classes/ShadesEngine.d.ts.map +1 -0
  5. package/dist/classes/ShadesEngine.js +386 -0
  6. package/dist/classes/ShadesEngine.js.map +1 -0
  7. package/dist/classes/index.d.ts +3 -0
  8. package/dist/classes/index.d.ts.map +1 -0
  9. package/dist/classes/index.js +3 -0
  10. package/dist/classes/index.js.map +1 -0
  11. package/dist/classes/shapes/BaseShape.d.ts +20 -0
  12. package/dist/classes/shapes/BaseShape.d.ts.map +1 -0
  13. package/dist/classes/shapes/BaseShape.js +45 -0
  14. package/dist/classes/shapes/BaseShape.js.map +1 -0
  15. package/dist/classes/shapes/CircleShape.d.ts +11 -0
  16. package/dist/classes/shapes/CircleShape.d.ts.map +1 -0
  17. package/dist/classes/shapes/CircleShape.js +25 -0
  18. package/dist/classes/shapes/CircleShape.js.map +1 -0
  19. package/dist/classes/shapes/ImageShape.d.ts +22 -0
  20. package/dist/classes/shapes/ImageShape.d.ts.map +1 -0
  21. package/dist/classes/shapes/ImageShape.js +107 -0
  22. package/dist/classes/shapes/ImageShape.js.map +1 -0
  23. package/dist/classes/shapes/SpiralShape.d.ts +11 -0
  24. package/dist/classes/shapes/SpiralShape.d.ts.map +1 -0
  25. package/dist/classes/shapes/SpiralShape.js +28 -0
  26. package/dist/classes/shapes/SpiralShape.js.map +1 -0
  27. package/dist/classes/shapes/SquaredShape.d.ts +11 -0
  28. package/dist/classes/shapes/SquaredShape.d.ts.map +1 -0
  29. package/dist/classes/shapes/SquaredShape.js +25 -0
  30. package/dist/classes/shapes/SquaredShape.js.map +1 -0
  31. package/dist/classes/shapes/TextShape.d.ts +16 -0
  32. package/dist/classes/shapes/TextShape.d.ts.map +1 -0
  33. package/dist/classes/shapes/TextShape.js +35 -0
  34. package/dist/classes/shapes/TextShape.js.map +1 -0
  35. package/dist/classes/shapes/TriangleShape.d.ts +11 -0
  36. package/dist/classes/shapes/TriangleShape.d.ts.map +1 -0
  37. package/dist/classes/shapes/TriangleShape.js +46 -0
  38. package/dist/classes/shapes/TriangleShape.js.map +1 -0
  39. package/dist/classes/shapes/index.d.ts +8 -0
  40. package/dist/classes/shapes/index.d.ts.map +1 -0
  41. package/dist/classes/shapes/index.js +10 -0
  42. package/dist/classes/shapes/index.js.map +1 -0
  43. package/dist/constants/CColors.d.ts +6 -0
  44. package/dist/constants/CColors.d.ts.map +1 -0
  45. package/dist/constants/CColors.js +35 -0
  46. package/dist/constants/CColors.js.map +1 -0
  47. package/dist/constants/CFilters.d.ts +8 -0
  48. package/dist/constants/CFilters.d.ts.map +1 -0
  49. package/dist/constants/CFilters.js +15 -0
  50. package/dist/constants/CFilters.js.map +1 -0
  51. package/dist/constants/CShades.d.ts +3 -0
  52. package/dist/constants/CShades.d.ts.map +1 -0
  53. package/dist/constants/CShades.js +10 -0
  54. package/dist/constants/CShades.js.map +1 -0
  55. package/dist/constants/index.d.ts +4 -0
  56. package/dist/constants/index.d.ts.map +1 -0
  57. package/dist/constants/index.js +4 -0
  58. package/dist/constants/index.js.map +1 -0
  59. package/dist/index.d.ts +5 -0
  60. package/dist/index.d.ts.map +1 -0
  61. package/dist/index.js +8 -0
  62. package/dist/index.js.map +1 -0
  63. package/dist/types/TPoints.d.ts +8 -0
  64. package/dist/types/TPoints.d.ts.map +1 -0
  65. package/dist/types/TPoints.js +2 -0
  66. package/dist/types/TPoints.js.map +1 -0
  67. package/dist/types/TShadeItem.d.ts +6 -0
  68. package/dist/types/TShadeItem.d.ts.map +1 -0
  69. package/dist/types/TShadeItem.js +2 -0
  70. package/dist/types/TShadeItem.js.map +1 -0
  71. package/dist/types/TShades.d.ts +11 -0
  72. package/dist/types/TShades.d.ts.map +1 -0
  73. package/dist/types/TShades.js +10 -0
  74. package/dist/types/TShades.js.map +1 -0
  75. package/dist/types/TShadesConfig.d.ts +26 -0
  76. package/dist/types/TShadesConfig.d.ts.map +1 -0
  77. package/dist/types/TShadesConfig.js +2 -0
  78. package/dist/types/TShadesConfig.js.map +1 -0
  79. package/dist/types/TShapeOptions.d.ts +6 -0
  80. package/dist/types/TShapeOptions.d.ts.map +1 -0
  81. package/dist/types/TShapeOptions.js +2 -0
  82. package/dist/types/TShapeOptions.js.map +1 -0
  83. package/dist/types/index.d.ts +6 -0
  84. package/dist/types/index.d.ts.map +1 -0
  85. package/dist/types/index.js +6 -0
  86. package/dist/types/index.js.map +1 -0
  87. package/dist/utils/UColors.d.ts +18 -0
  88. package/dist/utils/UColors.d.ts.map +1 -0
  89. package/dist/utils/UColors.js +44 -0
  90. package/dist/utils/UColors.js.map +1 -0
  91. package/dist/utils/UMaths.d.ts +9 -0
  92. package/dist/utils/UMaths.d.ts.map +1 -0
  93. package/dist/utils/UMaths.js +14 -0
  94. package/dist/utils/UMaths.js.map +1 -0
  95. package/dist/utils/UShadeUtils.d.ts +8 -0
  96. package/dist/utils/UShadeUtils.d.ts.map +1 -0
  97. package/dist/utils/UShadeUtils.js +75 -0
  98. package/dist/utils/UShadeUtils.js.map +1 -0
  99. package/dist/utils/index.d.ts +4 -0
  100. package/dist/utils/index.d.ts.map +1 -0
  101. package/dist/utils/index.js +4 -0
  102. package/dist/utils/index.js.map +1 -0
  103. package/package.json +71 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Amphore Dev
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,317 @@
1
+ # 🎨 Shades
2
+
3
+ Library for creating animated shape visualizations on canvas.
4
+
5
+ ## 🚀 Live Demo
6
+
7
+ [View the interactive demo](https://amphore-dev.github.io/Shades/) (deployed from the [`example/`](./example/) directory)
8
+
9
+ ## Features
10
+
11
+ ✨ **Framework-agnostic** - Works with React, Vue, Angular, Svelte, or vanilla JavaScript
12
+ 🎯 **TypeScript** - Full type safety and IntelliSense support
13
+ 🎨 **Multiple shapes** - Circles, squares, triangles, text, spirals, and images
14
+ 🎭 **Smooth animations** - Buttery smooth 60fps animations
15
+ ⚡ **Performant** - Optimized canvas rendering
16
+ 🎮 **Interactive** - Mouse/touch controls and zoom
17
+ 🐛 **Debug mode** - Built-in performance monitoring
18
+
19
+ ## Installation
20
+
21
+ ```bash
22
+ npm install @amphore-dev/shades
23
+ # or
24
+ yarn add @amphore-dev/shades
25
+ ```
26
+
27
+ ## Quick Start
28
+
29
+ ### Vanilla JavaScript/TypeScript
30
+
31
+ ```typescript
32
+ import { ShadesEngine } from "@amphore-dev/shades";
33
+
34
+ const canvas = document.getElementById("myCanvas") as HTMLCanvasElement;
35
+
36
+ const shades = new ShadesEngine(canvas, {
37
+ randomized: true,
38
+ debug: false,
39
+ });
40
+
41
+ shades.generate(); // Generate shapes
42
+ shades.start(); // Start animation
43
+ ```
44
+
45
+ ### With React
46
+
47
+ ```tsx
48
+ import { useEffect, useRef } from "react";
49
+ import { ShadesEngine } from "@amphore-dev/shades";
50
+
51
+ function ShadesComponent() {
52
+ const canvasRef = useRef<HTMLCanvasElement>(null);
53
+ const shadesRef = useRef<ShadesEngine>();
54
+
55
+ useEffect(() => {
56
+ if (canvasRef.current) {
57
+ shadesRef.current = new ShadesEngine(canvasRef.current, {
58
+ randomized: true,
59
+ });
60
+
61
+ shadesRef.current.generate();
62
+ shadesRef.current.start();
63
+ }
64
+
65
+ return () => {
66
+ shadesRef.current?.destroy();
67
+ };
68
+ }, []);
69
+
70
+ return <canvas ref={canvasRef} className="w-full h-full" />;
71
+ }
72
+ ```
73
+
74
+ ### With Vue 3
75
+
76
+ ```vue
77
+ <template>
78
+ <canvas ref="canvasRef" class="w-full h-full" />
79
+ </template>
80
+
81
+ <script setup lang="ts">
82
+ import { ref, onMounted, onUnmounted } from "vue";
83
+ import { ShadesEngine } from "@amphore-dev/shades";
84
+
85
+ const canvasRef = ref<HTMLCanvasElement>();
86
+ let shades: ShadesEngine;
87
+
88
+ onMounted(() => {
89
+ if (canvasRef.value) {
90
+ shades = new ShadesEngine(canvasRef.value, {
91
+ randomized: true,
92
+ });
93
+
94
+ shades.generate();
95
+ shades.start();
96
+ }
97
+ });
98
+
99
+ onUnmounted(() => {
100
+ shades?.destroy();
101
+ });
102
+ </script>
103
+ ```
104
+
105
+ ## API Reference
106
+
107
+ ### Constructor
108
+
109
+ ```typescript
110
+ new ShadesEngine(canvas: HTMLCanvasElement, options?: TShadesEngineOptions)
111
+ ```
112
+
113
+ #### Options
114
+
115
+ ```typescript
116
+ interface TShadesEngineOptions {
117
+ shapes?: TShadeType[]; // Shape types to use for generation (ex: ["circle", "star"])
118
+ customShapes?: Record<string, TShadeTypeConstructor>; // Custom shape classes (ex: { "star": StarShape })
119
+ randomized?: boolean; // Enable randomized generation
120
+ debug?: boolean; // Show debug information
121
+ fadeDuration?: number; // Fade duration in milliseconds (default: 500ms)
122
+ }
123
+ ```
124
+
125
+ ### Methods
126
+
127
+ | Method | Description |
128
+ | ---------------------------- | ---------------------------------- |
129
+ | `generate()` | Generate shapes and setup |
130
+ | `start()` | Start animation |
131
+ | `pause()` | Pause animation |
132
+ | `regenerate()` | Generate new shapes |
133
+ | `destroy()` | Cleanup and remove event listeners |
134
+ | `zoom(scale: number)` | Zoom in/out |
135
+ | `setDebug(enabled: boolean)` | Toggle debug mode |
136
+ | `getShadesConfig()` | Get current configuration |
137
+ | `isAnimating()` | Check if animation is running |
138
+
139
+ ### Controls
140
+
141
+ - **Click** - Regenerate shapes
142
+ - **Mouse move** - Parallax effect
143
+ - **Mouse wheel** - Zoom in/out
144
+
145
+ ## Custom Shapes
146
+
147
+ Create your own custom shapes by extending the `ShadeItem` class:
148
+
149
+ ### Creating a Custom Shape
150
+
151
+ ```typescript
152
+ import {
153
+ ShadeItem,
154
+ TShadeColor,
155
+ TShadeConfig,
156
+ TShapeOptions,
157
+ TPoint,
158
+ } from "@amphore-dev/shades";
159
+
160
+ export class StarShape extends ShadeItem {
161
+ constructor(
162
+ x: number,
163
+ y: number,
164
+ color: TShadeColor,
165
+ options: TShapeOptions = {}
166
+ ) {
167
+ super(x, y, color, { filled: true, rotation: true, ...options });
168
+ this.type = "star";
169
+ }
170
+
171
+ draw = (
172
+ ctx: CanvasRenderingContext2D,
173
+ config: TShadeConfig,
174
+ offset: TPoint
175
+ ) => {
176
+ const { gradRatio, nbrShades, totalWidth, totalHeight, center, width } =
177
+ config;
178
+
179
+ for (let i = 0; i < nbrShades; i++) {
180
+ this.setColors(ctx, gradRatio, i);
181
+ ctx.beginPath();
182
+
183
+ const x =
184
+ center.x +
185
+ (this.position.x - totalWidth / 2 + width / 2) +
186
+ offset.x * (1 - (gradRatio * i) / 100);
187
+ const y =
188
+ center.y +
189
+ (this.position.y - totalHeight / 2 + width / 2) +
190
+ offset.y * (1 - (gradRatio * i) / 100);
191
+
192
+ this.drawStar(ctx, x, y, width / 2, width / 4, 5);
193
+ this.drawPath(ctx);
194
+ ctx.closePath();
195
+
196
+ if (this.rotation) {
197
+ this.angle += ((0.5 / nbrShades) * Math.PI) / 180;
198
+ }
199
+ }
200
+ };
201
+
202
+ private drawStar(
203
+ ctx: CanvasRenderingContext2D,
204
+ x: number,
205
+ y: number,
206
+ outer: number,
207
+ inner: number,
208
+ points: number
209
+ ) {
210
+ const step = Math.PI / points;
211
+ let rot = (Math.PI / 2) * 3 + this.angle;
212
+
213
+ ctx.moveTo(x, y - outer);
214
+ for (let i = 0; i < points; i++) {
215
+ ctx.lineTo(x + Math.cos(rot) * outer, y + Math.sin(rot) * outer);
216
+ rot += step;
217
+ ctx.lineTo(x + Math.cos(rot) * inner, y + Math.sin(rot) * inner);
218
+ rot += step;
219
+ }
220
+ ctx.lineTo(x, y - outer);
221
+ }
222
+ }
223
+ ```
224
+
225
+ ### Using Custom Shapes
226
+
227
+ ```typescript
228
+ import { ShadesEngine } from "@amphore-dev/shades";
229
+ import { StarShape } from "./StarShape";
230
+
231
+ const engine = new ShadesEngine(canvas, {
232
+ shapes: ["star", "circle", "heart"], // Mix built-in and custom
233
+ customShapes: {
234
+ star: StarShape, // Register your custom shape
235
+ },
236
+ fadeDuration: 800,
237
+ });
238
+
239
+ engine.generate();
240
+ engine.start();
241
+ ```
242
+
243
+ ### Benefits
244
+
245
+ - ✅ **Full extensibility** - Create any imaginable shape
246
+ - ✅ **Seamless integration** - Mix with built-in shapes
247
+ - ✅ **Type safety** - Complete TypeScript support
248
+ - ✅ **Performance** - No overhead, direct compilation
249
+
250
+ ## Advanced Usage
251
+
252
+ ```typescript
253
+ import { ShadesEngine } from "@amphore-dev/shades";
254
+
255
+ const shades = new ShadesEngine(canvas, {
256
+ shapes: [
257
+ {
258
+ type: "circle",
259
+ nbrItemsX: 10,
260
+ nbrItemsY: 10,
261
+ spacing: 20,
262
+ colors: [
263
+ { r: 255, g: 100, b: 100 },
264
+ { r: 100, g: 255, b: 100 },
265
+ ],
266
+ },
267
+ ],
268
+ });
269
+ ```
270
+
271
+ ## Advanced Usage
272
+
273
+ ### Custom Colors
274
+
275
+ ```typescript
276
+ import { ShadesEngine, getRandColors } from "@amphore-dev/shades";
277
+
278
+ const customColors = [
279
+ { r: 255, g: 0, b: 0 },
280
+ { r: 0, g: 255, b: 0 },
281
+ { r: 0, g: 0, b: 255 },
282
+ ];
283
+
284
+ const shades = new ShadesEngine(canvas, {
285
+ shapes: [{ colors: customColors }],
286
+ });
287
+ ```
288
+
289
+ ### Event Handling
290
+
291
+ The engine automatically handles:
292
+
293
+ - Canvas resize
294
+ - Mouse/touch events
295
+ - Animation frame management
296
+ - Memory cleanup
297
+
298
+ ## Examples
299
+
300
+ Check out `example/example-vanilla.html` for a complete example with controls.
301
+
302
+ ## Building From Source
303
+
304
+ ```bash
305
+ git clone https://github.com/Amphore-Dev/shades.git
306
+ cd shades
307
+ npm install
308
+ npm run build
309
+ ```
310
+
311
+ ## License
312
+
313
+ MIT © [Your Name]
314
+
315
+ ---
316
+
317
+ **Framework-agnostic by design** 🚀
@@ -0,0 +1,65 @@
1
+ import { ShadeItem } from "./index.js";
2
+ import { TShadeConfig, TShadeTypeConstructor, TShadeType } from "../types/index.js";
3
+ export type TShadesEngineDebugOptions = {
4
+ className?: string;
5
+ };
6
+ export type TShadesEngineOptions = {
7
+ shapes?: TShadeType[];
8
+ customShapes?: Record<string, TShadeTypeConstructor>;
9
+ randomized?: boolean;
10
+ debug?: boolean | TShadesEngineDebugOptions;
11
+ fadeDuration?: number;
12
+ };
13
+ export declare class ShadesEngine {
14
+ private canvas;
15
+ private context;
16
+ private options;
17
+ private items;
18
+ private config;
19
+ private offset;
20
+ private targetOffset;
21
+ private genCount;
22
+ private fade;
23
+ private animationFrameId;
24
+ private isPlaying;
25
+ private elapsedTime;
26
+ private framesCount;
27
+ private boundHandleClick;
28
+ private boundHandleMouseMove;
29
+ private boundHandleWheel;
30
+ private boundHandleResize;
31
+ private debug;
32
+ private debugContainer;
33
+ constructor(canvas: HTMLCanvasElement, options?: TShadesEngineOptions);
34
+ private setupCanvas;
35
+ generate(): void;
36
+ private initDefaultGeneration;
37
+ private getConfig;
38
+ private genItems;
39
+ private animate;
40
+ private getCenter;
41
+ private handleMouseMove;
42
+ private zoomShades;
43
+ private handleWheel;
44
+ private handleClick;
45
+ private handleResize;
46
+ private attachEventListeners;
47
+ private detachEventListeners;
48
+ start(): void;
49
+ pause(): void;
50
+ destroy(): void;
51
+ regenerate(): void;
52
+ getShadesConfig(): TShadeConfig;
53
+ getItems(): ShadeItem[];
54
+ isAnimating(): boolean;
55
+ zoom(scale: number): void;
56
+ private initializeDebug;
57
+ private startFPSCounter;
58
+ private updateDebug;
59
+ getDebugInfo(): {
60
+ genCount: number;
61
+ config: TShadeConfig;
62
+ };
63
+ setDebug(value: boolean | TShadesEngineDebugOptions): void;
64
+ }
65
+ //# sourceMappingURL=ShadesEngine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ShadesEngine.d.ts","sourceRoot":"","sources":["../../src/classes/ShadesEngine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAyB,MAAM,YAAY,CAAC;AAC9D,OAAO,EAGL,YAAY,EAEZ,qBAAqB,EACrB,UAAU,EACX,MAAM,mBAAmB,CAAC;AAI3B,MAAM,MAAM,yBAAyB,GAAG;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;IACrD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,GAAG,yBAAyB,CAAC;IAC5C,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,OAAO,CAAuB;IAGtC,OAAO,CAAC,KAAK,CAAmB;IAChC,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,YAAY,CAA0B;IAC9C,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,IAAI,CAOV;IAGF,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,WAAW,CAAwB;IAG3C,OAAO,CAAC,gBAAgB,CAAa;IACrC,OAAO,CAAC,oBAAoB,CAA0B;IACtD,OAAO,CAAC,gBAAgB,CAA0B;IAClD,OAAO,CAAC,iBAAiB,CAAa;IAGtC,OAAO,CAAC,KAAK,CAA8C;IAC3D,OAAO,CAAC,cAAc,CAA+B;gBAEzC,MAAM,EAAE,iBAAiB,EAAE,OAAO,GAAE,oBAAyB;IA0BzE,OAAO,CAAC,WAAW;IAKZ,QAAQ,IAAI,IAAI;IA0BvB,OAAO,CAAC,qBAAqB;IAiB7B,OAAO,CAAC,SAAS;IAQjB,OAAO,CAAC,QAAQ;IA4EhB,OAAO,CAAC,OAAO;IAyEf,OAAO,CAAC,SAAS;IAOjB,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,UAAU;IAclB,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,WAAW;IA2BnB,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,oBAAoB;IAO5B,OAAO,CAAC,oBAAoB;IASrB,KAAK,IAAI,IAAI;IAQb,KAAK,IAAI,IAAI;IAQb,OAAO,IAAI,IAAI;IAiBf,UAAU,IAAI,IAAI;IAIlB,eAAe,IAAI,YAAY;IAI/B,QAAQ,IAAI,SAAS,EAAE;IAIvB,WAAW,IAAI,OAAO;IAItB,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAMhC,OAAO,CAAC,eAAe;IA2BvB,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,WAAW;IAeZ,YAAY,IAAI;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,YAAY,CAAA;KAAE;IAO1D,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,yBAAyB,GAAG,IAAI;CAWlE"}