nhb-toolbox 4.0.32 → 4.0.40

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.
@@ -2,6 +2,8 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createOptionsArray = void 0;
4
4
  exports.removeDuplicatesFromArray = removeDuplicatesFromArray;
5
+ exports.getDuplicates = getDuplicates;
6
+ exports.findMissingElements = findMissingElements;
5
7
  exports.splitArray = splitArray;
6
8
  exports.rotateArray = rotateArray;
7
9
  exports.moveArrayElement = moveArrayElement;
@@ -35,6 +37,48 @@ exports.createOptionsArray = createOptionsArray;
35
37
  function removeDuplicatesFromArray(array) {
36
38
  return array.filter((item, index, self) => index === self.findIndex((el) => (0, utils_1.isDeepEqual)(el, item)));
37
39
  }
40
+ /**
41
+ * * Finds duplicate values in an array, runs deep comparison for objects and arrays.
42
+ *
43
+ * @param array - The array in which to find duplicates.
44
+ * @returns An array containing all duplicate entries (each one only once).
45
+ */
46
+ function getDuplicates(array) {
47
+ const seen = [];
48
+ const duplicates = [];
49
+ for (const item of array) {
50
+ const hasSeen = seen.find((el) => (0, utils_1.isDeepEqual)(el, item));
51
+ const hasDuplicate = duplicates.find((el) => (0, utils_1.isDeepEqual)(el, item));
52
+ if (hasSeen && !hasDuplicate) {
53
+ duplicates.push(item);
54
+ }
55
+ else if (!hasSeen) {
56
+ seen.push(item);
57
+ }
58
+ }
59
+ return duplicates;
60
+ }
61
+ /**
62
+ * * Finds elements missing from one array compared to another using deep comparison.
63
+ *
64
+ * @param options - Configuration to specify which array to compare and direction of check.
65
+ * @returns An array of missing elements based on the comparison direction.
66
+ */
67
+ /**
68
+ * * Finds elements missing from one array compared to another using deep comparison.
69
+ *
70
+ * @param array1 The first array to compare.
71
+ * @param array2 The second array to compare.
72
+ * @param missingFrom Which direction to compare for missing values:.
73
+ * - `'from-first'` → values in `array1` missing in `array2`.
74
+ * - `'from-second'` → values in `array2` missing in `array1`.
75
+ * @returns An array of missing elements based on the comparison direction.
76
+ */
77
+ function findMissingElements(array1, array2, missingFrom) {
78
+ const source = missingFrom === 'from-first' ? array1 : array2;
79
+ const target = missingFrom === 'from-first' ? array2 : array1;
80
+ return source.filter((item) => !target.some((t) => (0, utils_1.isDeepEqual)(t, item)));
81
+ }
38
82
  /**
39
83
  * * Splits an array into chunks of a given size.
40
84
  *
@@ -8,7 +8,7 @@ const hsl = (0, random_1.generateRandomHSLColor)();
8
8
  const { hex, rgb } = (0, convert_1.convertColorCode)(hsl);
9
9
  /**
10
10
  * * Class representing a color and its conversions among `Hex`, `Hex8` `RGB`, `RGBA`, `HSL` and `HSLA` formats.
11
- * * It has 1 instance method `applyOpacity()` to apply opacity to `Hex`, `Hex8` `RGB`, `RGBA`, `HSL` or `HSLA` color.
11
+ * * It has 13 instance methods to manipulate and play with the color values.
12
12
  * * It has 6 static methods that can be used to check if a color is in `Hex`, `Hex8` `RGB`, `RGBA`, `HSL` or `HSLA` format.
13
13
  *
14
14
  * @property hex - The color in `Hex` format.
@@ -41,7 +41,7 @@ class Color {
41
41
  * If no color is passed, a random color will be generated.
42
42
  *
43
43
  * Additionally:
44
- * - Use `.applyOpacity(opacity)` to modify or add opacity to the color.
44
+ * - It has 13 instance methods to manipulate and play with the color values.
45
45
  * - Use static methods like `Color.isHex6(color)` to validate color strings.
46
46
  *
47
47
  * @param toConvert - An optional input color string in any supported format (`Hex`, `Hex8`, `RGB`, `RGBA`, `HSL`, or `HSLA`) to convert in all other (includes the current format) formats.
@@ -118,12 +118,12 @@ class Color {
118
118
  yield this.hsla;
119
119
  }
120
120
  /**
121
- * * Applies or modifies the opacity of a color.
122
- * - For solid colors (Hex6/RGB/HSL): Adds an alpha channel with the specified opacity
123
- * - For alpha colors (Hex8/RGBA/HSLA): Updates the existing alpha channel
121
+ * @instance Applies or modifies the opacity of a color. Mutate the original instance.
122
+ * - For solid colors (Hex6/RGB/HSL): Adds an alpha channel with the specified opacity.
123
+ * - For alpha colors (Hex8/RGBA/HSLA): Updates the existing alpha channel.
124
124
  *
125
- * @param opacity - A number between 0-100 representing the opacity percentage
126
- * @returns An object containing all color formats with the applied opacity
125
+ * @param opacity - A number between 0-100 representing the opacity percentage.
126
+ * @returns A new instance of `Color` containing all color formats with the applied opacity.
127
127
  *
128
128
  * @example
129
129
  * const color = new Color("#ff0000");
@@ -141,14 +141,168 @@ class Color {
141
141
  const alphaDecimal = validOpacity / 100;
142
142
  const rgbValues = (0, helpers_1._extractSolidColorValues)(this.rgb);
143
143
  const hslValues = (0, helpers_1._extractSolidColorValues)(this.hsl);
144
- return {
144
+ return Color.#fromParts({
145
145
  hex: this.hex.slice(0, 7).toUpperCase(),
146
146
  hex8: `${this.hex.slice(0, 7)}${alphaHex}`.toUpperCase(),
147
147
  rgb: `rgb(${rgbValues[0]}, ${rgbValues[1]}, ${rgbValues[2]})`,
148
148
  rgba: `rgba(${rgbValues[0]}, ${rgbValues[1]}, ${rgbValues[2]}, ${alphaDecimal})`,
149
149
  hsl: `hsl(${hslValues[0]}, ${hslValues[1]}%, ${hslValues[2]}%)`,
150
150
  hsla: `hsla(${hslValues[0]}, ${hslValues[1]}%, ${hslValues[2]}%, ${alphaDecimal})`,
151
+ });
152
+ }
153
+ /**
154
+ * @instance Darkens the color by reducing the lightness by the given percentage.
155
+ * @param percent - The percentage to darken (0–100).
156
+ * @returns A new `Color` instance with the modified darkness.
157
+ */
158
+ applyDarkness(percent) {
159
+ const [h, s, l] = (0, helpers_1._extractSolidColorValues)(this.hsl);
160
+ const newL = Math.max(0, l - percent);
161
+ const newHSL = `hsl(${h}, ${s}%, ${newL}%)`;
162
+ return new Color(newHSL);
163
+ }
164
+ /**
165
+ * @instance Lightens the color by increasing the lightness by the given percentage.
166
+ * @param percent - The percentage to brighten (0–100).
167
+ * @returns A new `Color` instance with the modified lightness.
168
+ */
169
+ applyBrightness(percent) {
170
+ const [h, s, l] = (0, helpers_1._extractSolidColorValues)(this.hsl);
171
+ const newL = Math.min(100, l + percent);
172
+ const newHSL = `hsl(${h}, ${s}%, ${newL}%)`;
173
+ return new Color(newHSL);
174
+ }
175
+ /**
176
+ * @instance Reduces the saturation of the color to make it appear duller.
177
+ * @param percent - The percentage to reduce saturation (0–100).
178
+ * @returns A new `Color` instance with the modified saturation.
179
+ */
180
+ applyDullness(percent) {
181
+ const [h, s, l] = (0, helpers_1._extractSolidColorValues)(this.hsl);
182
+ const newS = Math.max(0, s - percent);
183
+ const newHSL = `hsl(${h}, ${newS}%, ${l}%)`;
184
+ return new Color(newHSL);
185
+ }
186
+ /**
187
+ * @instance Softens the color toward white by reducing saturation and increasing lightness based on a percentage.
188
+ * - *This creates a soft UI-like white shade effect (similar to some UI libraries' light color scale).*
189
+ * @param percent - Value from 0 to 100 representing how far to push the color toward white.
190
+ * @returns A new `Color` instance shifted toward white.
191
+ */
192
+ applyWhiteShade(percent) {
193
+ const [h, s, l] = (0, helpers_1._extractSolidColorValues)(this.hsl);
194
+ // Cap values to avoid overshooting
195
+ const newS = Math.max(0, s - (s * percent) / 100);
196
+ const newL = Math.min(100, l + ((100 - l) * percent) / 100);
197
+ const newHSL = `hsl(${h}, ${newS}%, ${newL}%)`;
198
+ return new Color(newHSL);
199
+ }
200
+ /**
201
+ * @instance Blends the current color with another color based on the given weight.
202
+ * @param other - The color in any 6 `(Hex, Hex8 RGB, RGBA, HSL or HSLA)` to blend with.
203
+ * @param weight - A number from 0 to 1 indicating the weight of the other color. Defaults to `0.5`.
204
+ * - `weight = 0` → only the original color (this)
205
+ * - `weight = 1` → only the other color
206
+ * - `weight = 0.5` → equal blend between the two
207
+ * @returns A new `Color` instance representing the blended result.
208
+ */
209
+ blendWith(other, weight = 0.5) {
210
+ const w = Math.max(0, Math.min(1, weight));
211
+ const converted = new Color(other);
212
+ const rgb1 = (0, helpers_1._extractSolidColorValues)(this.rgb);
213
+ const rgb2 = (0, helpers_1._extractSolidColorValues)(converted.rgb);
214
+ const blended = rgb1.map((c, i) => Math.round(c * (1 - w) + rgb2[i] * w));
215
+ const blendedRGB = `rgb(${blended[0]}, ${blended[1]}, ${blended[2]})`;
216
+ return new Color(blendedRGB);
217
+ }
218
+ /**
219
+ * @instance Calculates the contrast ratio between this color and another color (WCAG).
220
+ * @param other - The other color to compare against.
221
+ * @returns A number representing the contrast ratio (rounded to 2 decimal places).
222
+ */
223
+ contrastRatio(other) {
224
+ const newColor = new Color(other);
225
+ const luminance = (rgb) => {
226
+ const [r, g, b] = (0, helpers_1._extractSolidColorValues)(rgb).map((v) => {
227
+ const c = v / 255;
228
+ return c <= 0.03928 ?
229
+ c / 12.92
230
+ : Math.pow((c + 0.055) / 1.055, 2.4);
231
+ });
232
+ return 0.2126 * r + 0.7152 * g + 0.0722 * b;
151
233
  };
234
+ const lum1 = luminance(this.rgb);
235
+ const lum2 = luminance(newColor.rgb);
236
+ const brighter = Math.max(lum1, lum2);
237
+ const darker = Math.min(lum1, lum2);
238
+ const ratio = (brighter + 0.05) / (darker + 0.05);
239
+ return Math.round(ratio * 100) / 100;
240
+ }
241
+ /**
242
+ * @instance Returns the complementary color by rotating the hue 180 degrees.
243
+ * @returns A new Color that is the complement of the current color.
244
+ */
245
+ getComplementaryColor() {
246
+ const [h, s, l] = (0, helpers_1._extractSolidColorValues)(this.hsl);
247
+ const newHue = (h + 180) % 360;
248
+ const newHSL = `hsl(${newHue}, ${s}%, ${l}%)`;
249
+ return new Color(newHSL);
250
+ }
251
+ /**
252
+ * @instance Generates a color scheme of analogous colors, including the base color.
253
+ * Analogous colors are next to each other on the color wheel (±30°).
254
+ * @returns An array of three Color instances: [base, left, right].
255
+ */
256
+ getAnalogousColors() {
257
+ const [h, s, l] = (0, helpers_1._extractSolidColorValues)(this.hsl);
258
+ const left = `hsl(${(h + 330) % 360}, ${s}%, ${l}%)`;
259
+ const right = `hsl(${(h + 30) % 360}, ${s}%, ${l}%)`;
260
+ return [this, new Color(left), new Color(right)];
261
+ }
262
+ /**
263
+ * @instance Generates a color triad scheme including the base color.
264
+ * Triadic colors are evenly spaced (120° apart) on the color wheel.
265
+ * @returns An array of three Color instances: [base, triad1, triad2].
266
+ */
267
+ getTriadColors() {
268
+ const [h, s, l] = (0, helpers_1._extractSolidColorValues)(this.hsl);
269
+ const c1 = `hsl(${(h + 120) % 360}, ${s}%, ${l}%)`;
270
+ const c2 = `hsl(${(h + 240) % 360}, ${s}%, ${l}%)`;
271
+ return [this, new Color(c1), new Color(c2)];
272
+ }
273
+ /**
274
+ * @instance Generates a tetradic color scheme including the base color.
275
+ * Tetradic colors form a rectangle on the color wheel (90° apart).
276
+ * @returns An array of four Color instances: [base, tetrad1, tetrad2, tetrad3].
277
+ */
278
+ getTetradColors() {
279
+ const [h, s, l] = (0, helpers_1._extractSolidColorValues)(this.hsl);
280
+ const c1 = `hsl(${(h + 90) % 360}, ${s}%, ${l}%)`;
281
+ const c2 = `hsl(${(h + 180) % 360}, ${s}%, ${l}%)`;
282
+ const c3 = `hsl(${(h + 270) % 360}, ${s}%, ${l}%)`;
283
+ return [this, new Color(c1), new Color(c2), new Color(c3)];
284
+ }
285
+ /**
286
+ * @instance Gets the `WCAG` accessibility rating between this and another color.
287
+ * @param other - The other color to test contrast against.
288
+ * @returns 'Fail', 'AA', or 'AAA' based on `WCAG 2.1` contrast standards.
289
+ */
290
+ getWCAGRating(other) {
291
+ const ratio = this.contrastRatio(other);
292
+ if (ratio >= 7)
293
+ return 'AAA';
294
+ if (ratio >= 4.5)
295
+ return 'AA';
296
+ return 'Fail';
297
+ }
298
+ /**
299
+ * @instance Determines if the color is light based on its perceived brightness.
300
+ * @returns `true` if light, `false` if dark.
301
+ */
302
+ isLightColor() {
303
+ const [r, g, b] = (0, helpers_1._extractSolidColorValues)(this.rgb);
304
+ const brightness = (r * 299 + g * 587 + b * 114) / 1000;
305
+ return brightness > 127.5;
152
306
  }
153
307
  /**
154
308
  * @static Checks if a color is in `Hex6` format.
@@ -169,40 +323,40 @@ class Color {
169
323
  return /^#[0-9A-Fa-f]{8}$/.test(color);
170
324
  }
171
325
  /**
172
- * @static Checks if a color is in `RGB` format.
326
+ * @static Checks if a color is in `RGB` format and within valid ranges.
173
327
  *
174
328
  * @param color Color to check.
175
- * @returns Boolean: `true` if it's an `RGB` color, `false` if not.
329
+ * @returns `true` if it's a `RGB` color, `false` if not.
176
330
  */
177
331
  static isRGB(color) {
178
- return /^rgb\(\d{1,3},\s*\d{1,3},\s*\d{1,3}\)$/.test(color);
332
+ return (0, helpers_1._isRGB)(color);
179
333
  }
180
334
  /**
181
- * @static Checks if a color is in `RGBA` format.
335
+ * @static Checks if a color is in `RGBA` format and within valid ranges.
182
336
  *
183
337
  * @param color Color to check.
184
- * @returns Boolean: `true` if it's an `RGBA` color, `false` if not.
338
+ * @returns `true` if it's a `RGBA` color, `false` if not.
185
339
  */
186
340
  static isRGBA(color) {
187
- return /^rgba\(\d{1,3},\s*\d{1,3},\s*\d{1,3},\s*(0|1|0?\.\d+)\)$/.test(color);
341
+ return (0, helpers_1._isRGBA)(color);
188
342
  }
189
343
  /**
190
- * @static Checks if a color is in `HSL` format.
344
+ * @static Checks if a color is in `HSL` format and within valid ranges.
191
345
  *
192
346
  * @param color Color to check.
193
- * @returns Boolean: `true` if it's an `HSL` color, `false` if not.
347
+ * @returns `true` if it's a `HSL` color, `false` if not.
194
348
  */
195
349
  static isHSL(color) {
196
- return /^hsl\(\d{1,3},\s*\d{1,3}%,\s*\d{1,3}%\)$/.test(color);
350
+ return (0, helpers_1._isHSL)(color);
197
351
  }
198
352
  /**
199
- * @static Checks if a color is in `HSLA` format.
353
+ * @static Checks if a color is in `HSLA` format and within valid ranges.
200
354
  *
201
355
  * @param color Color to check.
202
- * @returns Boolean: `true` if it's an `HSLA` color, `false` if not.
356
+ * @returns `true` if it's a `HSLA` color, `false` if not.
203
357
  */
204
358
  static isHSLA(color) {
205
- return /^hsla\(\d{1,3},\s*\d{1,3}%,\s*\d{1,3}%,\s*(0|1|0?\.\d+)\)$/.test(color);
359
+ return (0, helpers_1._isHSLA)(color);
206
360
  }
207
361
  /**
208
362
  * @private Converts the given color to all other formats while preserving the original.
@@ -237,5 +391,20 @@ class Color {
237
391
  }
238
392
  throw new Error(`Unrecognized color format: ${color}`);
239
393
  }
394
+ /**
395
+ * @private @static Internal factory to create a Color instance from parsed parts.
396
+ * @param parts All the color parts as object.
397
+ * @returns An instance of `Color`.
398
+ */
399
+ static #fromParts(parts) {
400
+ const color = Object.create(Color.prototype);
401
+ color.hex = parts.hex;
402
+ color.hex8 = parts.hex8;
403
+ color.rgb = parts.rgb;
404
+ color.rgba = parts.rgba;
405
+ color.hsl = parts.hsl;
406
+ color.hsla = parts.hsla;
407
+ return color;
408
+ }
240
409
  }
241
410
  exports.Color = Color;
@@ -2,12 +2,15 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports._extractAlphaColorValues = exports._extractSolidColorValues = exports._isSimilarToLast = exports._generateRandomHSL = exports._applyOpacity = exports._convertOpacityToHex = void 0;
4
4
  exports._isHex6 = _isHex6;
5
- exports._isRGB = _isRGB;
6
- exports._isHSL = _isHSL;
7
5
  exports._isHex8 = _isHex8;
6
+ exports._isRGB = _isRGB;
8
7
  exports._isRGBA = _isRGBA;
8
+ exports._isHSL = _isHSL;
9
9
  exports._isHSLA = _isHSLA;
10
10
  exports._isValidAlpha = _isValidAlpha;
11
+ exports._isValidRGBComponent = _isValidRGBComponent;
12
+ exports._isValidHue = _isValidHue;
13
+ exports._isValidPercentage = _isValidPercentage;
11
14
  /**
12
15
  * * Converts opacity percentage (0-100) to a 2-digit hex string.
13
16
  *
@@ -97,7 +100,7 @@ const _extractAlphaColorValues = (colorString) => {
97
100
  };
98
101
  exports._extractAlphaColorValues = _extractAlphaColorValues;
99
102
  /**
100
- * * Checks if a color is in `Hex` format.
103
+ * @private Checks if a color is in `Hex` format.
101
104
  *
102
105
  * @param color Color to check.
103
106
  * @returns Boolean: `true` if it's a `Hex` color, `false` if not.
@@ -106,58 +109,92 @@ function _isHex6(color) {
106
109
  return /^#[0-9A-Fa-f]{6}$/.test(color);
107
110
  }
108
111
  /**
109
- * * Checks if a color is in `RGB` format.
112
+ * @private Checks if a color is in `Hex8` format.
110
113
  *
111
114
  * @param color Color to check.
112
- * @returns Boolean: `true` if it's an `RGB` color, `false` if not.
115
+ * @returns Boolean: `true` if it's a `Hex8` color, `false` if not.
113
116
  */
114
- function _isRGB(color) {
115
- return /^rgb\(\d{1,3},\s*\d{1,3},\s*\d{1,3}\)$/.test(color);
117
+ function _isHex8(color) {
118
+ return /^#[0-9A-Fa-f]{8}$/.test(color);
116
119
  }
117
120
  /**
118
- * * Checks if a color is in `HSL` format.
121
+ * @private Checks if a color is in `RGB` format and within valid ranges.
119
122
  *
120
123
  * @param color Color to check.
121
- * @returns Boolean: `true` if it's an `HSL` color, `false` if not.
124
+ * @returns `true` if it's a `RGB` color, `false` if not.
122
125
  */
123
- function _isHSL(color) {
124
- return /^hsl\(\d{1,3},\s*\d{1,3}%,\s*\d{1,3}%\)$/.test(color);
126
+ function _isRGB(color) {
127
+ const match = color.match(/^rgb\(\s*(\d{1,3}(?:\.\d+)?),\s*(\d{1,3}(?:\.\d+)?),\s*(\d{1,3}(?:\.\d+)?)\s*\)$/);
128
+ if (!match)
129
+ return false;
130
+ const [r, g, b] = match.slice(1).map(Number);
131
+ return (_isValidRGBComponent(r) &&
132
+ _isValidRGBComponent(g) &&
133
+ _isValidRGBComponent(b));
125
134
  }
126
135
  /**
127
- * @static
128
- * Checks if a color is in `Hex8` format.
136
+ * @private Checks if a color is in `RGBA` format and within valid ranges.
129
137
  *
130
138
  * @param color Color to check.
131
- * @returns Boolean: `true` if it's a `Hex8` color, `false` if not.
139
+ * @returns `true` if it's a `RGBA` color, `false` if not.
132
140
  */
133
- function _isHex8(color) {
134
- return /^#[0-9A-Fa-f]{8}$/.test(color);
141
+ function _isRGBA(color) {
142
+ const match = color.match(/^rgba\(\s*(\d{1,3}(?:\.\d+)?),\s*(\d{1,3}(?:\.\d+)?),\s*(\d{1,3}(?:\.\d+)?),\s*(0|1|0?\.\d+)\s*\)$/);
143
+ if (!match)
144
+ return false;
145
+ const [r, g, b, a] = match.slice(1).map(Number);
146
+ return (_isValidRGBComponent(r) &&
147
+ _isValidRGBComponent(g) &&
148
+ _isValidRGBComponent(b) &&
149
+ _isValidAlpha(a));
135
150
  }
136
151
  /**
137
- * @static
138
- * Checks if a color is in `RGBA` format.
152
+ * @private Checks if a color is in `HSL` format and within valid ranges.
139
153
  *
140
154
  * @param color Color to check.
141
- * @returns Boolean: `true` if it's an `RGBA` color, `false` if not.
155
+ * @returns `true` if it's a `HSL` color, `false` if not.
142
156
  */
143
- function _isRGBA(color) {
144
- return /^rgba\(\d{1,3},\s*\d{1,3},\s*\d{1,3},\s*(0|1|0?\.\d+)\)$/.test(color);
157
+ function _isHSL(color) {
158
+ const match = color.match(/^hsl\(\s*(\d{1,3}(?:\.\d+)?),\s*(\d{1,3}(?:\.\d+)?)%,\s*(\d{1,3}(?:\.\d+)?)%\s*\)$/);
159
+ if (!match)
160
+ return false;
161
+ const [h, s, l] = match.slice(1).map(Number);
162
+ return _isValidHue(h) && _isValidPercentage(s) && _isValidPercentage(l);
145
163
  }
146
164
  /**
147
- * @static
148
- * Checks if a color is in `HSLA` format.
165
+ * @private Checks if a color is in `HSLA` format and within valid ranges.
149
166
  *
150
167
  * @param color Color to check.
151
- * @returns Boolean: `true` if it's an `HSLA` color, `false` if not.
168
+ * @returns `true` if it's a `HSLA` color, `false` if not.
152
169
  */
153
170
  function _isHSLA(color) {
154
- return /^hsla\(\d{1,3},\s*\d{1,3}%,\s*\d{1,3}%,\s*(0|1|0?\.\d+)\)$/.test(color);
171
+ const match = color.match(/^hsla\(\s*(\d{1,3}(?:\.\d+)?),\s*(\d{1,3}(?:\.\d+)?)%,\s*(\d{1,3}(?:\.\d+)?)%,\s*(0|1|0?\.\d+)\s*\)$/);
172
+ if (!match)
173
+ return false;
174
+ const [h, s, l, a] = match.slice(1).map(Number);
175
+ return (_isValidHue(h) &&
176
+ _isValidPercentage(s) &&
177
+ _isValidPercentage(l) &&
178
+ _isValidAlpha(a));
155
179
  }
156
180
  /**
157
- * * Type guard to validate alpha value.
181
+ * @private Checks if a number is valid alpha value.
182
+ *
158
183
  * @param value Alpha value to check.
159
- * @returns Boolean: `true` if it's a valid alpha value, `false` if not.
184
+ * @returns `true` if it's a valid alpha value, `false` if not.
160
185
  */
161
186
  function _isValidAlpha(value) {
162
187
  return value >= 0 && value <= 1 && !isNaN(value);
163
188
  }
189
+ /** * @private Validates RGB component (0–255). */
190
+ function _isValidRGBComponent(value) {
191
+ return value >= 0 && value <= 255;
192
+ }
193
+ /** * @private Validates HSL hue (0–360). */
194
+ function _isValidHue(value) {
195
+ return value >= 0 && value <= 360;
196
+ }
197
+ /** * @private Validates HSL percentage components (0–100). */
198
+ function _isValidPercentage(value) {
199
+ return value >= 0 && value <= 100;
200
+ }
package/dist/cjs/index.js CHANGED
@@ -1,11 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.areInvalidNumbers = exports.getNthFibonacci = exports.getMemoizedFibonacciSeries = exports.getMemoizedFibonacci = exports.getFibonacciSeriesMemo = exports.getFibonacciSeries = exports.getFibonacciNumbers = exports.getFibonacci = exports.generateFibonacci = exports.fibonacciGenerator = exports.calculatePercentage = exports.sumOfNumbers = exports.sumNumbers = exports.sumDigits = exports.reverseNumber = exports.getSumOfNumbers = exports.getRandomNumber = exports.getAverageOfNumbers = exports.getAverage = exports.convertToDecimal = exports.calculateLCM = exports.calculateLCD = exports.calculateHCF = exports.calculateGCD = exports.calculateAverage = exports.levenshteinDistance = exports.getLevenshteinDistance = exports.extractNumbersFromString = exports.slugifyString = exports.reverseString = exports.replaceAllInString = exports.normalizeString = exports.maskString = exports.formatWithPlural = exports.formatUnitWithPlural = exports.formatNumberWithPluralUnit = exports.extractURLs = exports.extractEmails = exports.convertStringCase = exports.isSnakeCase = exports.isPascalCase = exports.isPalindrome = exports.isKebabCase = exports.isEmojiOnly = exports.isCamelCase = exports.generateAnagrams = exports.truncateString = exports.trimString = exports.generateRandomID = exports.capitalizeString = void 0;
4
- exports.convertRgbToRgba = exports.convertRgbToHsl = exports.convertRgbToHex = exports.convertRgbaToHsla = exports.convertRgbaToHex8 = exports.convertHslToRgb = exports.convertHslToHex = exports.convertHslaToRgba = exports.convertHslaToHex8 = exports.convertHexToRgb = exports.convertHexToHsl = exports.convertHex8ToRgba = exports.convertHex8ToHsla = exports.convertColorCode = exports.generateRandomHSLColor = exports.generateRandomColorInHexRGB = exports.getColorForInitial = exports.getNumbersInRange = exports.roundToNearestInterval = exports.roundToNearest = exports.roundNumberToNearestInterval = exports.roundNumber = exports.numberToOrdinal = exports.getRandomFloat = exports.getRandomDecimal = exports.getOrdinalNumber = exports.getOrdinal = exports.formatCurrency = exports.convertToOrdinal = exports.convertNumberToOrdinal = exports.convertNumberToCurrency = exports.clampNumber = exports.cardinalToOrdinal = exports.isPrimeNumber = exports.isPrime = exports.getPrimeNumbers = exports.findPrimeNumbers = exports.numberToWords = exports.convertToRomanNumerals = exports.convertNumberToWords = exports.isPerfectSquare = exports.isParOfFibonacciSeries = exports.isParOfFibonacci = exports.isOddNumber = exports.isOdd = exports.isMultiple = exports.isInvalidNumbers = exports.isFibonacci = exports.isEvenNumber = exports.isEven = void 0;
5
- exports.convertIntoFormData = exports.naturalSortForString = exports.naturalSort = exports.compareSorter = exports.compareNaturally = exports.splitArray = exports.rotateArray = exports.removeDuplicatesFromArray = exports.moveArrayElement = exports.createOptionsArray = exports.sortAnArray = exports.shuffleArray = exports.isValidEmptyArray = exports.isInvalidOrEmptyArray = exports.getLastArrayElement = exports.flattenArray = exports.filterArrayOfObjects = exports.minutesToUTCOffset = exports.getTotalMinutesFromUTC = exports.getTotalMinutesFromTime = exports.getTotalMinutes = exports.getTimeStringFromUTC = exports.getMinutesFromUTC = exports.getCurrentTime = exports.getCurrentDateTime = exports.formatUTCOffset = exports.extractTotalMinutesFromTime = exports.extractTimeStringFromUTC = exports.extractTimeFromUTC = exports.extractMinutesFromUTC = exports.extractHourMinute = exports.convertMinutesToUTCOffset = exports.chronusts = exports.chronusjs = exports.chronus = exports.chronosts = exports.chronosjs = exports.chronos = exports.Chronus = exports.Chronos = exports.isValidUTCOffSet = exports.isValidUTC = exports.isValidTimeString = exports.isValidTime = exports.isLeapYear = exports.greet = exports.getGreeting = exports.generateGreeting = exports.Colour = exports.Color = void 0;
6
- exports.countInstanceMethods = exports.convertArrayToString = exports.saveToSessionStorage = exports.saveToLocalStorage = exports.removeFromSessionStorage = exports.removeFromLocalStorage = exports.getFromSessionStorage = exports.getFromLocalStorage = exports.toggleFullScreen = exports.smoothScrollTo = exports.copyToClipboard = exports.updateQueryParam = exports.getQueryParams = exports.generateQueryParams = exports.formatQueryParams = exports.createQueryParams = exports.remapObjectFields = exports.remapFields = exports.pickObjectFieldsByCondition = exports.pickObjectFields = exports.pickFieldsByCondition = exports.pickFields = exports.convertObjectValues = exports.sanitizeData = exports.parseStringifiedValues = exports.parseStringifiedPrimitives = exports.parseStringifiedObjectValues = exports.parsePrimitives = exports.parsePrimitiveData = exports.parseObjectValues = exports.mergeObjects = exports.mergeAndFlattenObjects = exports.flattenObjectKeyValue = exports.flattenObjectDotNotation = exports.extractUpdatedFields = exports.extractUpdatedAndNewFields = exports.extractNewFields = exports.countObjectFields = exports.cloneObject = exports.isValidFormData = exports.isOriginFileObj = exports.isFileUpload = exports.isFileList = exports.isFileArray = exports.isCustomFileArray = exports.isCustomFile = exports.serializeForm = exports.parseFormData = exports.createFormData = exports.createControlledFormData = void 0;
7
- exports.isValidSet = exports.isValidObject = exports.isValidMap = exports.isValidJSON = exports.isValidArray = exports.isSet = exports.isReturningPromise = exports.isRegularExpression = exports.isRegExp = exports.isPromise = exports.isObjectWithKeys = exports.isObjectEmpty = exports.isObject = exports.isNotEmptyObject = exports.isMethodDescriptor = exports.isMethod = exports.isMap = exports.isJSONObject = exports.isJSON = exports.isFunction = exports.isError = exports.isEmptyObjectGuard = exports.isEmptyObject = exports.isDate = exports.isBigInt = exports.isArrayWithLength = exports.isArrayOfType = exports.isArray = exports.doesReturnPromise = exports.isUndefined = exports.isTruthy = exports.isSymbol = exports.isString = exports.isPrimitive = exports.isPositiveInteger = exports.isNumber = exports.isNull = exports.isNonEmptyString = exports.isInteger = exports.isFalsy = exports.isBoolean = exports.throttleAction = exports.isDeepEqual = exports.getStaticMethodsCount = exports.getStaticMethodNames = exports.getInstanceMethodsCount = exports.getInstanceMethodNames = exports.getClassDetails = exports.debounceAction = exports.countStaticMethods = void 0;
8
- exports.isValidURL = exports.isValidEmail = exports.isUUID = exports.isURL = exports.isPhoneNumber = exports.isNumericString = exports.isNodeEnvironment = exports.isNodeENV = exports.isNode = exports.isIPAddress = exports.isExpectedNodeENV = exports.isEnvironment = exports.isEmailArray = exports.isEmail = exports.isDateString = exports.isBrowser = exports.isBase64 = void 0;
3
+ exports.getMemoizedFibonacci = exports.getFibonacciSeriesMemo = exports.getFibonacciSeries = exports.getFibonacciNumbers = exports.getFibonacci = exports.generateFibonacci = exports.fibonacciGenerator = exports.calculatePercentage = exports.sumOfNumbers = exports.sumNumbers = exports.sumDigits = exports.reverseNumber = exports.getSumOfNumbers = exports.getRandomNumber = exports.getAverageOfNumbers = exports.getAverage = exports.convertToDecimal = exports.calculateLCM = exports.calculateLCD = exports.calculateHCF = exports.calculateGCD = exports.calculateAverage = exports.countWordsInString = exports.wordCount = exports.countWords = exports.levenshteinDistance = exports.getLevenshteinDistance = exports.extractNumbersFromString = exports.slugifyString = exports.reverseString = exports.replaceAllInString = exports.normalizeString = exports.maskString = exports.formatWithPlural = exports.formatUnitWithPlural = exports.formatNumberWithPluralUnit = exports.extractURLs = exports.extractEmails = exports.convertStringCase = exports.isSnakeCase = exports.isPascalCase = exports.isPalindrome = exports.isKebabCase = exports.isEmojiOnly = exports.isCamelCase = exports.generateAnagrams = exports.truncateString = exports.trimString = exports.generateRandomID = exports.capitalizeString = void 0;
4
+ exports.convertRgbaToHsla = exports.convertRgbaToHex8 = exports.convertHslToRgb = exports.convertHslToHex = exports.convertHslaToRgba = exports.convertHslaToHex8 = exports.convertHexToRgb = exports.convertHexToHsl = exports.convertHex8ToRgba = exports.convertHex8ToHsla = exports.convertColorCode = exports.generateRandomHSLColor = exports.generateRandomColorInHexRGB = exports.getColorForInitial = exports.getNumbersInRange = exports.roundToNearestInterval = exports.roundToNearest = exports.roundNumberToNearestInterval = exports.roundNumber = exports.numberToOrdinal = exports.getRandomFloat = exports.getRandomDecimal = exports.getOrdinalNumber = exports.getOrdinal = exports.formatCurrency = exports.convertToOrdinal = exports.convertNumberToOrdinal = exports.convertNumberToCurrency = exports.clampNumber = exports.cardinalToOrdinal = exports.isPrimeNumber = exports.isPrime = exports.getPrimeNumbers = exports.findPrimeNumbers = exports.numberToWords = exports.convertToRomanNumerals = exports.convertNumberToWords = exports.isPerfectSquare = exports.isParOfFibonacciSeries = exports.isParOfFibonacci = exports.isOddNumber = exports.isOdd = exports.isMultiple = exports.isInvalidNumbers = exports.isFibonacci = exports.isEvenNumber = exports.isEven = exports.areInvalidNumbers = exports.getNthFibonacci = exports.getMemoizedFibonacciSeries = void 0;
5
+ exports.getDuplicatesFromArray = exports.getDuplicates = exports.findMissingElements = exports.extractMissingElements = exports.extractDuplicatesFromArray = exports.extractDuplicates = exports.createOptionsArray = exports.sortAnArray = exports.shuffleArray = exports.isValidEmptyArray = exports.isInvalidOrEmptyArray = exports.getLastArrayElement = exports.flattenArray = exports.filterArrayOfObjects = exports.minutesToUTCOffset = exports.getTotalMinutesFromUTC = exports.getTotalMinutesFromTime = exports.getTotalMinutes = exports.getTimeStringFromUTC = exports.getMinutesFromUTC = exports.getCurrentTime = exports.getCurrentDateTime = exports.formatUTCOffset = exports.extractTotalMinutesFromTime = exports.extractTimeStringFromUTC = exports.extractTimeFromUTC = exports.extractMinutesFromUTC = exports.extractHourMinute = exports.convertMinutesToUTCOffset = exports.chronusts = exports.chronusjs = exports.chronus = exports.chronosts = exports.chronosjs = exports.chronos = exports.Chronus = exports.Chronos = exports.isValidUTCOffSet = exports.isValidUTC = exports.isValidTimeString = exports.isValidTime = exports.isLeapYear = exports.greet = exports.getGreeting = exports.generateGreeting = exports.Colour = exports.Color = exports.convertRgbToRgba = exports.convertRgbToHsl = exports.convertRgbToHex = void 0;
6
+ exports.updateQueryParam = exports.getQueryParams = exports.generateQueryParams = exports.formatQueryParams = exports.createQueryParams = exports.remapObjectFields = exports.remapFields = exports.pickObjectFieldsByCondition = exports.pickObjectFields = exports.pickFieldsByCondition = exports.pickFields = exports.convertObjectValues = exports.sanitizeData = exports.parseStringifiedValues = exports.parseStringifiedPrimitives = exports.parseStringifiedObjectValues = exports.parsePrimitives = exports.parsePrimitiveData = exports.parseObjectValues = exports.mergeObjects = exports.mergeAndFlattenObjects = exports.flattenObjectKeyValue = exports.flattenObjectDotNotation = exports.extractUpdatedFields = exports.extractUpdatedAndNewFields = exports.extractNewFields = exports.countObjectFields = exports.cloneObject = exports.isValidFormData = exports.isOriginFileObj = exports.isFileUpload = exports.isFileList = exports.isFileArray = exports.isCustomFileArray = exports.isCustomFile = exports.serializeForm = exports.parseFormData = exports.createFormData = exports.createControlledFormData = exports.convertIntoFormData = exports.naturalSortForString = exports.naturalSort = exports.compareSorter = exports.compareNaturally = exports.splitArray = exports.rotateArray = exports.removeDuplicatesFromArray = exports.removeDuplicates = exports.moveArrayElement = exports.getMissingElements = void 0;
7
+ exports.isObjectEmpty = exports.isObject = exports.isNotEmptyObject = exports.isMethodDescriptor = exports.isMethod = exports.isMap = exports.isJSONObject = exports.isJSON = exports.isFunction = exports.isError = exports.isEmptyObjectGuard = exports.isEmptyObject = exports.isDate = exports.isBigInt = exports.isArrayWithLength = exports.isArrayOfType = exports.isArray = exports.doesReturnPromise = exports.isUndefined = exports.isTruthy = exports.isSymbol = exports.isString = exports.isPrimitive = exports.isPositiveInteger = exports.isNumber = exports.isNull = exports.isNonEmptyString = exports.isInteger = exports.isFalsy = exports.isBoolean = exports.throttleAction = exports.isDeepEqual = exports.getStaticMethodsCount = exports.getStaticMethodNames = exports.getInstanceMethodsCount = exports.getInstanceMethodNames = exports.getClassDetails = exports.debounceAction = exports.countStaticMethods = exports.countInstanceMethods = exports.convertArrayToString = exports.saveToSessionStorage = exports.saveToLocalStorage = exports.removeFromSessionStorage = exports.removeFromLocalStorage = exports.getFromSessionStorage = exports.getFromLocalStorage = exports.toggleFullScreen = exports.smoothScrollTo = exports.copyToClipboard = void 0;
8
+ exports.isValidURL = exports.isValidEmail = exports.isUUID = exports.isURL = exports.isPhoneNumber = exports.isNumericString = exports.isNodeEnvironment = exports.isNodeENV = exports.isNode = exports.isIPAddress = exports.isExpectedNodeENV = exports.isEnvironment = exports.isEmailArray = exports.isEmail = exports.isDateString = exports.isBrowser = exports.isBase64 = exports.isValidSet = exports.isValidObject = exports.isValidMap = exports.isValidJSON = exports.isValidArray = exports.isSet = exports.isReturningPromise = exports.isRegularExpression = exports.isRegExp = exports.isPromise = exports.isObjectWithKeys = void 0;
9
9
  // ! String Utilities
10
10
  var basics_1 = require("./string/basics");
11
11
  Object.defineProperty(exports, "capitalizeString", { enumerable: true, get: function () { return basics_1.capitalizeString; } });
@@ -37,6 +37,9 @@ var utilities_1 = require("./string/utilities");
37
37
  Object.defineProperty(exports, "extractNumbersFromString", { enumerable: true, get: function () { return utilities_1.extractNumbersFromString; } });
38
38
  Object.defineProperty(exports, "getLevenshteinDistance", { enumerable: true, get: function () { return utilities_1.getLevenshteinDistance; } });
39
39
  Object.defineProperty(exports, "levenshteinDistance", { enumerable: true, get: function () { return utilities_1.getLevenshteinDistance; } });
40
+ Object.defineProperty(exports, "countWords", { enumerable: true, get: function () { return utilities_1.countWords; } });
41
+ Object.defineProperty(exports, "wordCount", { enumerable: true, get: function () { return utilities_1.countWords; } });
42
+ Object.defineProperty(exports, "countWordsInString", { enumerable: true, get: function () { return utilities_1.countWords; } });
40
43
  // ! Number Utilities
41
44
  var basics_2 = require("./number/basics");
42
45
  Object.defineProperty(exports, "calculateAverage", { enumerable: true, get: function () { return basics_2.getAverage; } });
@@ -177,7 +180,15 @@ var sort_1 = require("./array/sort");
177
180
  Object.defineProperty(exports, "sortAnArray", { enumerable: true, get: function () { return sort_1.sortAnArray; } });
178
181
  var transform_1 = require("./array/transform");
179
182
  Object.defineProperty(exports, "createOptionsArray", { enumerable: true, get: function () { return transform_1.createOptionsArray; } });
183
+ Object.defineProperty(exports, "extractDuplicates", { enumerable: true, get: function () { return transform_1.getDuplicates; } });
184
+ Object.defineProperty(exports, "extractDuplicatesFromArray", { enumerable: true, get: function () { return transform_1.getDuplicates; } });
185
+ Object.defineProperty(exports, "extractMissingElements", { enumerable: true, get: function () { return transform_1.findMissingElements; } });
186
+ Object.defineProperty(exports, "findMissingElements", { enumerable: true, get: function () { return transform_1.findMissingElements; } });
187
+ Object.defineProperty(exports, "getDuplicates", { enumerable: true, get: function () { return transform_1.getDuplicates; } });
188
+ Object.defineProperty(exports, "getDuplicatesFromArray", { enumerable: true, get: function () { return transform_1.getDuplicates; } });
189
+ Object.defineProperty(exports, "getMissingElements", { enumerable: true, get: function () { return transform_1.findMissingElements; } });
180
190
  Object.defineProperty(exports, "moveArrayElement", { enumerable: true, get: function () { return transform_1.moveArrayElement; } });
191
+ Object.defineProperty(exports, "removeDuplicates", { enumerable: true, get: function () { return transform_1.removeDuplicatesFromArray; } });
181
192
  Object.defineProperty(exports, "removeDuplicatesFromArray", { enumerable: true, get: function () { return transform_1.removeDuplicatesFromArray; } });
182
193
  Object.defineProperty(exports, "rotateArray", { enumerable: true, get: function () { return transform_1.rotateArray; } });
183
194
  Object.defineProperty(exports, "splitArray", { enumerable: true, get: function () { return transform_1.splitArray; } });
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getLevenshteinDistance = exports.extractNumbersFromString = void 0;
4
+ exports.countWords = countWords;
4
5
  /**
5
6
  * * Extracts all numbers from a string as array of numbers.
6
7
  * @param input - The string to extract numbers from.
@@ -33,3 +34,12 @@ const getLevenshteinDistance = (a, b) => {
33
34
  return dp[lenA][lenB];
34
35
  };
35
36
  exports.getLevenshteinDistance = getLevenshteinDistance;
37
+ /**
38
+ * * Counts the number of words in a string, supporting multiple languages and scripts.
39
+ *
40
+ * @param text - The input string to count words from.
41
+ * @returns Number of words (Unicode-aware).
42
+ */
43
+ function countWords(text) {
44
+ return (text.match(/\p{L}[\p{L}\p{M}\p{Pd}'’]*/gu) || []).length;
45
+ }
@@ -15,6 +15,30 @@ export declare const createOptionsArray: <T extends GenericObject, K1 extends st
15
15
  * @returns A new array with duplicates removed.
16
16
  */
17
17
  export declare function removeDuplicatesFromArray<T>(array: T[]): T[];
18
+ /**
19
+ * * Finds duplicate values in an array, runs deep comparison for objects and arrays.
20
+ *
21
+ * @param array - The array in which to find duplicates.
22
+ * @returns An array containing all duplicate entries (each one only once).
23
+ */
24
+ export declare function getDuplicates<T>(array: T[]): T[];
25
+ /**
26
+ * * Finds elements missing from one array compared to another using deep comparison.
27
+ *
28
+ * @param options - Configuration to specify which array to compare and direction of check.
29
+ * @returns An array of missing elements based on the comparison direction.
30
+ */
31
+ /**
32
+ * * Finds elements missing from one array compared to another using deep comparison.
33
+ *
34
+ * @param array1 The first array to compare.
35
+ * @param array2 The second array to compare.
36
+ * @param missingFrom Which direction to compare for missing values:.
37
+ * - `'from-first'` → values in `array1` missing in `array2`.
38
+ * - `'from-second'` → values in `array2` missing in `array1`.
39
+ * @returns An array of missing elements based on the comparison direction.
40
+ */
41
+ export declare function findMissingElements<T, U>(array1: T[], array2: U[], missingFrom: 'from-first' | 'from-second'): (T | U)[];
18
42
  /**
19
43
  * * Splits an array into chunks of a given size.
20
44
  *
@@ -1 +1 @@
1
- {"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../../../src/array/transform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAErD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,GAC9B,CAAC,SAAS,aAAa,EACvB,EAAE,SAAS,MAAM,YACjB,EAAE,SAAS,MAAM,kBAEX,CAAC,EAAE,UACD,aAAa,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,KAC9B,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,MAAM,GAAE,EAgB5B,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAK5D;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,CAAC,EAAE,EAAE,CAQhE;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,CAQ3D;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EACjC,GAAG,EAAE,CAAC,EAAE,EACR,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACb,CAAC,EAAE,CAQL"}
1
+ {"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../../../src/array/transform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAErD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,GAC9B,CAAC,SAAS,aAAa,EACvB,EAAE,SAAS,MAAM,YACjB,EAAE,SAAS,MAAM,kBAEX,CAAC,EAAE,UACD,aAAa,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,KAC9B,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,MAAM,GAAE,EAgB5B,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAK5D;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAgBhD;AAED;;;;;GAKG;AAEH;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,CAAC,EACvC,MAAM,EAAE,CAAC,EAAE,EACX,MAAM,EAAE,CAAC,EAAE,EACX,WAAW,EAAE,YAAY,GAAG,aAAa,GACvC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAKX;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,CAAC,EAAE,EAAE,CAQhE;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,CAQ3D;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EACjC,GAAG,EAAE,CAAC,EAAE,EACR,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACb,CAAC,EAAE,CAQL"}