toosoon-utils 1.1.0 → 1.3.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.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # TOOSOON UTILS
2
2
 
3
- TOOSOON utility functions.
3
+ Utility functions & classes.
4
4
 
5
5
  ## Installation
6
6
 
@@ -18,375 +18,936 @@ $ npm install toosoon-utils
18
18
 
19
19
  ## Usage
20
20
 
21
- ```js
21
+ ```ts
22
22
  import { lerp } from 'toosoon-utils/maths';
23
23
 
24
24
  console.log(lerp(0.5, 0, 5)); // 2.5
25
25
  ```
26
26
 
27
- ## Functions
27
+ ## Utility functions
28
28
 
29
29
  ### Colors
30
30
 
31
+ ##### normalizeHexString(hex)
32
+
33
+ Normalize an hexadecimal string.
34
+
35
+ - `hex`: Hexadecimal string.
36
+
31
37
  ```ts
32
- // Normalize an hexadecimal string
33
- normalizeHexString(hex: string) => string;
38
+ normalizeHexString(hex: string): string;
34
39
  ```
35
40
 
41
+ ##### rgbToHex(rgb)
42
+
43
+ Convert RGB to hexadecimal.
44
+
45
+ - `rgb`: RGB color.
46
+
36
47
  ```ts
37
- // Convert RGB to hexadecimal
38
- rgbToHex([r, g, b]: [number, number, number]) => number;
48
+ rgbToHex([r, g, b]: [number, number, number]): number;
39
49
  ```
40
50
 
51
+ ##### rgbToHexString(rgb)
52
+
53
+ Convert RGB to hexadecimal string.
54
+
55
+ - `rgb`: RGB color.
56
+
41
57
  ```ts
42
- // Convert RGB to hexadecimal string
43
- rgbToHexString([r, g, b]: [number, number, number]) => string;
58
+ rgbToHexString([r, g, b]: [number, number, number]): string;
44
59
  ```
45
60
 
61
+ ##### hexToRgb(hex)
62
+
63
+ Convert hexadecimal to RGB.
64
+
65
+ - `hex`: Hexadecimal color.
66
+
46
67
  ```ts
47
- // Convert hexadecimal to RGB
48
- hexToRgb(hex: number | string) => [number, number, number];
68
+ hexToRgb(hex: number | string): [number, number, number];
49
69
  ```
50
70
 
71
+ ##### lighten(hex, amount)
72
+
73
+ Lighten a color.
74
+
75
+ - `hex`: Hexadecimal color.
76
+ - `[amount=0]`: Amount of the color offset.
77
+
51
78
  ```ts
52
- // Lighten a color
53
- lighten(hex: string, amount?: number) => string;
79
+ lighten(hex: string, amount?: number): string;
54
80
  ```
55
81
 
82
+ ##### darken(hex, amount)
83
+
84
+ Darken a color.
85
+
86
+ - `hex`: Hexadecimal color.
87
+ - `[amount=0]`: Amount of the color offset.
88
+
56
89
  ```ts
57
- // Darken a color
58
- darken(hex: string, amount?: number) => string;
90
+ darken(hex: string, amount?: number): string;
59
91
  ```
60
92
 
93
+ ##### normalizeHslString(hsl)
94
+
95
+ Normalize an HSL string.
96
+
97
+ - `hsl`: HSL string (format: `'hsl(360, 100%, 100%)'`).
98
+
61
99
  ```ts
62
- // Normalize an HSL string
63
- normalizeHslString(hsl: string) => [number, number, number];
100
+ normalizeHslString(hsl: string): [number, number, number];
64
101
  ```
65
102
 
103
+ ##### rgbToHsl(rgb)
104
+
105
+ Convert RGB to HSL.
106
+
107
+ - `rgb`: RGB color.
108
+
66
109
  ```ts
67
- // Convert RGB to HSL
68
- rgbToHsl([r, g, b]: [number, number, number]) => [number, number, number];
110
+ rgbToHsl([r, g, b]: [number, number, number]): [number, number, number];
69
111
  ```
70
112
 
113
+ ##### hslToRgb(hsl)
114
+
115
+ Convert HSL to RGB.
116
+
117
+ - `hsl`: HSL color.
118
+
71
119
  ```ts
72
- // Convert HSL to RGB
73
- hslToRgb([h, s, l]: [number, number, number]) => [number, number, number];
120
+ hslToRgb([h, s, l]: [number, number, number]): [number, number, number];
74
121
  ```
75
122
 
123
+ ##### rgbToHsb(rgb)
124
+
125
+ Convert RGB to HSB.
126
+
127
+ - `rgb`: RGB color.
128
+
76
129
  ```ts
77
- // Convert RGB to HSB
78
- rgbToHsb([r, g, b]: [number, number, number]) => [number, number, number];
130
+ rgbToHsb([r, g, b]: [number, number, number]): [number, number, number];
79
131
  ```
80
132
 
133
+ ##### hsbToRgb(hsb)
134
+
135
+ Convert HSB to RGB.
136
+
137
+ - `hsb`: HSB color.
138
+
81
139
  ```ts
82
- // Convert HSB to RGB
83
- hsbToRgb([h, s, b]: [number, number, number]) => [number, number, number];
140
+ hsbToRgb([h, s, b]: [number, number, number]): [number, number, number];
84
141
  ```
85
142
 
143
+ ##### labToHcl(lab)
144
+
145
+ Convert LAB to HCL.
146
+
147
+ - `lab`: LAB color.
148
+
86
149
  ```ts
87
- // Convert LAB to HCL
88
- labToHcl([l, a, b]: [number, number, number]) => [number, number, number];
150
+ labToHcl([l, a, b]: [number, number, number]): [number, number, number];
89
151
  ```
90
152
 
153
+ ##### hclToLab(hcl)
154
+
155
+ Convert HCL to LAB.
156
+
157
+ - `hcl`: HCL color.
158
+
91
159
  ```ts
92
- // Convert HCL to LAB
93
- hclToLab([h, c, l]: [number, number, number]) => [number, number, number];
160
+ hclToLab([h, c, l]: [number, number, number]): [number, number, number];
94
161
  ```
95
162
 
163
+ ##### labToRgb(lab)
164
+
165
+ Convert LAB to RGB.
166
+
167
+ - `lab`: LAB color.
168
+
96
169
  ```ts
97
- // Convert LAB to RGB
98
- labToRgb([l, a, b]: [number, number, number]) => [number, number, number];
170
+ labToRgb([l, a, b]: [number, number, number]): [number, number, number];
99
171
  ```
100
172
 
173
+ ##### rgbToLab(rgb)
174
+
175
+ Convert RGB to LAB.
176
+
177
+ - `rgb`: RGB color.
178
+
101
179
  ```ts
102
- // Convert RGB to LAB
103
- rgbToLab([r, g, b]: [number, number, number]) => [number, number, number];
180
+ rgbToLab([r, g, b]: [number, number, number]): [number, number, number];
104
181
  ```
105
182
 
183
+ ##### deltaE(labA, labB)
184
+
185
+ Get the delta from two LAB colors.
186
+
187
+ - `labA`: First LAB color.
188
+ - `labB`: Second LAB color.
189
+
106
190
  ```ts
107
- // Get the delta from two LAB colors
108
- deltaE(labA: [number, number, number], labB: [number, number, number]) => number;
191
+ deltaE(labA: [number, number, number], labB: [number, number, number]): number;
109
192
  ```
110
193
 
194
+ ##### rgbToHcl(rgb)
195
+
196
+ Convert RGB to HCL.
197
+
198
+ - `rgb`: RGB color.
199
+
111
200
  ```ts
112
- // Convert RGB to HCL
113
- rgbToHcl([r, g, b]: [number, number, number]) => [number, number, number];
201
+ rgbToHcl([r, g, b]: [number, number, number]): [number, number, number];
114
202
  ```
115
203
 
204
+ ##### hclToRgb(hcl)
205
+
206
+ Convert HCL to RGB.
207
+
208
+ - `hcl`: HCL color.
209
+
116
210
  ```ts
117
- // Convert HCL to RGB
118
- hclToRgb([h, c, l]: [number, number, number]) => [number, number, number];
211
+ hclToRgb([h, c, l]: [number, number, number]): [number, number, number];
119
212
  ```
120
213
 
121
214
  ### DOM
122
215
 
216
+ ##### closest(element, selector)
217
+
218
+ Find the closest parent that matches a selector.
219
+
220
+ - `element`: Target element.
221
+ - `selector`: Selector or parent to match.
222
+
123
223
  ```ts
124
- // Find the closest parent that matches a selector
125
- closest(element: Element, selector: Element | string) => Element | null;
224
+ closest(element: Element, selector: Element | string): Element | null;
126
225
  ```
127
226
 
227
+ ##### createCanvas(width, height)
228
+
229
+ Create a canvas and 2d context.
230
+
231
+ - `width`: Width of the canvas.
232
+ - `height`: Height of the canvas.
233
+
128
234
  ```ts
129
- // Create a canvas and 2d context
130
- createCanvas(width: number, height: number) => { canvas: HTMLCanvasElement; ctx: CanvasRenderingContext2D };
235
+ createCanvas(width: number, height: number): { canvas: HTMLCanvasElement; ctx: CanvasRenderingContext2D };
131
236
  ```
132
237
 
238
+ ##### injectStyles(styles)
239
+
240
+ Inject CSS styles in `document.head`.
241
+
242
+ - `styles`: CSS styles to inject.
243
+
133
244
  ```ts
134
- // Inject CSS styles in `document.head`
135
- injectStyles(cssContent: string) => void;
245
+ injectStyles(styles: string): void;
136
246
  ```
137
247
 
138
248
  ### Files
139
249
 
250
+ ##### download(blob, filename)
251
+
252
+ Download a Blob object into user files.
253
+
254
+ - `blob`: Blob object to download.
255
+ - `filename`: Downloaded file name.
256
+
140
257
  ```ts
141
- // Download a Blob object into user files
142
- download(blob: Blob, filename: string) => void;
258
+ download(blob: Blob, filename: string): void;
143
259
  ```
144
260
 
261
+ ##### upload(onLoad)
262
+
263
+ Upload a file from user files.
264
+
265
+ - `onLoad`: Callback called once the file is loaded.
266
+ - `[accept='']` MIME type the file input should accept.
267
+
145
268
  ```ts
146
- // Upload a file from user files
147
- upload(onLoad: (dataUrl: string) => void, accept?: string) => void;
269
+ upload(onLoad: (dataUrl: string) => void, accept?: string): void;
148
270
  ```
149
271
 
150
272
  ### Functions
151
273
 
274
+ ##### noop()
275
+
276
+ No-op function.
277
+
152
278
  ```ts
153
- // No-op function
154
- noop() => void;
279
+ noop(): void;
155
280
  ```
156
281
 
282
+ ##### wait(timeout)
283
+
284
+ Promise wrapped setTimeout.
285
+
286
+ - `[timeout=0]`: Time to wait (in milliseconds).
287
+
288
+ ```ts
289
+ wait(timeout?: number): Promise<void>;
290
+ ```
291
+
292
+ ##### defer()
293
+
294
+ Deferred promise implementation.
295
+
157
296
  ```ts
158
- // Promise wrapped setTimeout
159
- wait(timeout: number) => Promise<void>;
297
+ defer<T>(): Deferred<T>;
160
298
  ```
161
299
 
300
+ ##### now()
301
+
302
+ Polyfill for `now()` functions.
303
+
162
304
  ```ts
163
- // Deferred promise implementation
164
- defer<T>() => Deferred<T>;
305
+ now(): number;
165
306
  ```
166
307
 
167
308
  ### Geometry
168
309
 
310
+ ##### toDegrees(radians)
311
+
312
+ Convert a radians value into degrees.
313
+
314
+ - `radians`: Angle in radians.
315
+
169
316
  ```ts
170
- // Convert a radians value into degrees
171
- toDegrees(radians: number) => number;
317
+ toDegrees(radians: number): number;
172
318
  ```
173
319
 
320
+ ##### toRadians(degrees)
321
+
322
+ Convert a degrees value into radians.
323
+
324
+ - `degrees`: Angle in degrees.
325
+
174
326
  ```ts
175
- // Convert a degrees value into radians
176
- toRadians(degrees: number) => number;
327
+ toRadians(degrees: number): number;
177
328
  ```
178
329
 
330
+ ##### angle(x1, y1, x2, y2)
331
+
332
+ Calculate the angle from a point to another.
333
+
334
+ - `x1`: X value of the first point.
335
+ - `y1`: Y value of the first point.
336
+ - `x2`: X value of the second point.
337
+ - `y2`: Y value of the second point.
338
+
179
339
  ```ts
180
- // Calculate the angle from a point to another
181
- angle(x1: number, y1: number, x2: number, y2: number) => number;
340
+ angle(x1: number, y1: number, x2: number, y2: number): number;
182
341
  ```
183
342
 
343
+ ##### closestAngle(source, target)
344
+
345
+ Find the closest angle between to angles.
346
+
347
+ - `source`: Source angle in radians.
348
+ - `target`: Target angle in radians.
349
+
184
350
  ```ts
185
- // Find the closest angle between to angles
186
- closestAngle(source: number, target: number) => number;
351
+ closestAngle(source: number, target: number): number;
187
352
  ```
188
353
 
354
+ ##### distance(x1, y1, x2, y2)
355
+
356
+ Calculate the distance between two points.
357
+
358
+ - `x1`: X coord of the first point.
359
+ - `y1`: Y coord of the first point.
360
+ - `x2`: X coord of the second point.
361
+ - `y2`: Y coord of the second point.
362
+
189
363
  ```ts
190
- // Calculate the distance between two points
191
- distance(x1: number, y1: number, x2: number, y2: number) => number;
364
+ distance(x1: number, y1: number, x2: number, y2: number): number;
192
365
  ```
193
366
 
367
+ ##### diagonal(width, height)
368
+
369
+ Calculate the length of the diagonal of a rectangle.
370
+
371
+ - `width`: Width of the rectangle.
372
+ - `height`: Height of the rectangle.
373
+
194
374
  ```ts
195
- // Calculate the length of the diagonal of a rectangle
196
- diagonal(width: number, height: number) => number;
375
+ diagonal(width: number, height: number): number;
197
376
  ```
198
377
 
378
+ ##### radToSphere(radius, phi, theta)
379
+
380
+ Convert radians to a 3D point on the surface of a unit sphere.
381
+
382
+ - `radius`: Radius of the sphere
383
+ - `phi`: Polar angle from the y (up) axis [0, PI]
384
+ - `theta`: Equator angle around the y (up) axis [0, 2*PI]
385
+ - `[target]`: Target vector
386
+
199
387
  ```ts
200
- // Convert radians to a 3D point on the surface of a unit sphere
201
- radToSphere(radius: number, phi: number, theta: number, target?: Vector3) => Vector3;
388
+ radToSphere(radius: number, phi: number, theta: number, target?: Vector3): Vector3;
202
389
  ```
203
390
 
391
+ ##### cover(target, container)
392
+
393
+ Make a target fit a container (cover mode).
394
+
395
+ - `target`: Dimension of the target.
396
+ - `container`: Dimension of the container.
397
+
204
398
  ```ts
205
- // Make a target fit a container (cover mode)
206
- cover(target: FitInput, container: FitInput) => FitOutput;
399
+ cover(target: object, container: object): object;
207
400
  ```
208
401
 
402
+ ##### contain(target, container)
403
+
404
+ Make a target fit a container (contain mode).
405
+
406
+ - `target`: Dimension of the target.
407
+ - `container`: Dimension of the container.
408
+
209
409
  ```ts
210
- // Make a target fit a container (contain mode)
211
- contain(target: FitInput, container: FitInput) => FitOutput;
410
+ contain(target: object, container: object): object;
212
411
  ```
213
412
 
214
413
  ### Maths
215
414
 
415
+ ##### isEven(value)
416
+
417
+ Check if a number is even.
418
+
419
+ - `value`: Value to check.
420
+
421
+ ```ts
422
+ isEven(value: number): boolean;
423
+ ```
424
+
425
+ ##### isOdd(value)
426
+
427
+ Check if a number is odd.
428
+
429
+ - `value`: Value to check.
430
+
431
+ ```ts
432
+ isOdd(value: number): boolean;
433
+ ```
434
+
435
+ ##### isPowerOf2(value)
436
+
437
+ Check if a number is a power of 2.
438
+
439
+ - `value`: Value to check.
440
+
441
+ ```ts
442
+ isPowerOf2(value: number): boolean;
443
+ ```
444
+
445
+ ##### toPowerOf2(value)
446
+
447
+ Find closest power of 2 that fits a number.
448
+
449
+ - `value`: Incoming value.
450
+ - `[mode='ceil']`: Can be `'floor'`, `'ceil'` or `'round'`.
451
+
452
+ ```ts
453
+ toPowerOf2(value: number, mode?: string): number;
454
+ ```
455
+
456
+ ##### sign(value)
457
+
458
+ Return the sign (positive or negative) of a number.
459
+
460
+ - `value`: Value to check.
461
+
462
+ ```ts
463
+ sign(value: number): number;
464
+ ```
465
+
466
+ ##### clamp(value, min, max)
467
+
468
+ Clamp a value between two bounds.
469
+
470
+ - `value`: Value to clamp.
471
+ - `[min=0]`: Minimum boundary.
472
+ - `[max=1]`: Maximum boundary.
473
+
216
474
  ```ts
217
- // Check if a number is even
218
- isEven(value: number) => boolean;
475
+ clamp(value: number, min?: number, max?: number): number;
219
476
  ```
220
477
 
478
+ ##### lerp(value, min, max)
479
+
480
+ Linear interpolation between two values (lerping).
481
+
482
+ - `value`: Normalized value to interpolate.
483
+ - `min`: Minimum value.
484
+ - `max`: Maximum value.
485
+
221
486
  ```ts
222
- // Check if a number is odd
223
- isOdd(value: number) => boolean;
487
+ lerp(value: number, min: number, max: number): number;
224
488
  ```
225
489
 
490
+ ##### triLerp(value, min, max, target)
491
+
492
+ Triangular interpolation between two values.
493
+
494
+ - `value`: Normalized value to interpolate.
495
+ - `min`: Minimum value.
496
+ - `max`: Maximum value.
497
+ - `target`: Triangle target value.
498
+
226
499
  ```ts
227
- // Check if a number is a power of 2
228
- isPowerOf2(value: number) => boolean;
500
+ triLerp(value: number, min: number, max: number, target: number): number;
229
501
  ```
230
502
 
503
+ ##### expLerp(value, currentMin, currentMax, targetMin, targetMax)
504
+
505
+ Exponential interpolation between two values.
506
+
507
+ - `value`: Value to interpolate.
508
+ - `currentMin`: Lower bound of the value's current range.
509
+ - `currentMax`: Upper bound of the value's current range.
510
+ - `targetMin`: Lower bound of the value's target range.
511
+ - `targetMax`: Upper bound of the value's target range.
512
+
231
513
  ```ts
232
- // Find closest power of 2 that fits a number
233
- toPowerOf2(value: number, mode?: 'floor' | 'ceil' | 'round') => number;
514
+ expLerp(value: number, currentMin: number, currentMax: number, targetMin: number, targetMax: number): number;
234
515
  ```
235
516
 
517
+ ##### normalize(value, min, max)
518
+
519
+ Normalize a value between two bounds.
520
+
521
+ - `value`: Value to normalize.
522
+ - `min`: Minimum boundary.
523
+ - `max`: Maximum boundary.
524
+
236
525
  ```ts
237
- // Return the sign (positive or negative) of a number
238
- sign(number: number) => number;
526
+ normalize(value: number, min: number, max: number): number;
239
527
  ```
240
528
 
529
+ ##### map(value, currentMin, currentMax, targetMin, targetMax)
530
+
531
+ Re-map a number from one range to another.
532
+
533
+ - `value`: Value to re-map.
534
+ - `currentMin`: Lower bound of the value's current range.
535
+ - `currentMax`: Upper bound of the value's current range.
536
+ - `targetMin`: Lower bound of the value's target range.
537
+ - `targetMax`: Upper bound of the value's target range.
538
+
241
539
  ```ts
242
- // Clamp a value between two bounds
243
- clamp(value: number, min?: number, max?: number) => number;
540
+ map(value: number, currentMin: number, currentMax: number, targetMin: number, targetMax: number): number;
244
541
  ```
245
542
 
543
+ ##### roundTo(value, multiple)
544
+
545
+ Round a number up to a nearest multiple.
546
+
547
+ - `value`: Value to round.
548
+ - `[multiple=1]`: Multiple to round to.
549
+
246
550
  ```ts
247
- // Linear interpolation between two values (lerping)
248
- lerp(value: number, min: number, max: number) => number;
551
+ roundTo(value: number, multiple?: number): number;
249
552
  ```
250
553
 
554
+ ##### modAbs(value, length)
555
+
556
+ Modulo absolute a value based on a length.
557
+
558
+ - `value`: Value to modulate.
559
+ - `length`: Total length.
560
+
251
561
  ```ts
252
- // Triangular interpolation between two values
253
- triLerp(value: number, min: number, max: number, target: number) => number;
562
+ modAbs(value: number, length: number): number;
254
563
  ```
255
564
 
565
+ ##### pingPong(value, length)
566
+
567
+ Move back and forth a value between 0 and length, so that it is never larger than length and never smaller than 0.
568
+
569
+ - `value`: Value to modulate.
570
+ - `length`: Total length.
571
+
256
572
  ```ts
257
- // Exponential interpolation between two values
258
- expLerp(value: number, min: number, max: number) => number;
573
+ pingPong(value: number, length: number): number;
259
574
  ```
260
575
 
576
+ ##### smoothstep(value, min, max)
577
+
578
+ Smooth a value using cubic Hermite interpolation.
579
+
580
+ - `value`: Value to smooth.
581
+ - `[min=0]`: Minimum boundary.
582
+ - `[max=1]`: Maximum boundary.
583
+
261
584
  ```ts
262
- // Normalize a value between two bounds
263
- normalize(value: number, min: number, max: number) => number;
585
+ smoothstep(value: number, min?: number, max?: number): number;
264
586
  ```
265
587
 
588
+ ##### parabola(x, power)
589
+
590
+ Re-map the [0, 1] interval into [0, 1] parabola, such that corners are remaped to 0 and the center to 1.
591
+
592
+ - `x`: Normalized coordinate on X axis.
593
+ - `[power=1]`: Parabola power.
594
+
266
595
  ```ts
267
- // Re-map a number from one range to another
268
- map(value: number, currentMin: number, currentMax: number, targetMin: number, targetMax: number) => number;
596
+ parabola(x: number, power?: number): number;
269
597
  ```
270
598
 
599
+ ##### sum(array)
600
+
601
+ Return the sum of numbers.
602
+
603
+ - `array`: Array of numbers.
604
+
271
605
  ```ts
272
- // Round a number up to a nearest multiple
273
- roundTo(value: number, multiple?: number) => number;
606
+ sum(array: number[]): number;
274
607
  ```
275
608
 
609
+ ##### average(array)
610
+
611
+ Return the average of numbers.
612
+
613
+ - `array`: Array of numbers.
614
+
276
615
  ```ts
277
- // Modulo absolute a value based on a length
278
- modAbs(value: number, length: number) => number;
616
+ average(array: number[]): number;
279
617
  ```
280
618
 
619
+ ##### damp(value, target, damping, delta)
620
+
621
+ Smoothly interpolate a number toward another.
622
+
623
+ - `value`: Value to interpolate.
624
+ - `target`: Destination of the interpolation.
625
+ - `damping`: A higher value will make the movement more sudden, and a lower value will make the movement more gradual.
626
+ - `delta`: Delta time (in seconds).
627
+
281
628
  ```ts
282
- // Move back and forth a value between 0 and length, so that it is never larger than length and never smaller than 0
283
- pingPong(value: number, length: number) => number;
629
+ damp(value: number, target: number, damping: number, delta: number): number;
284
630
  ```
285
631
 
632
+ ### Pseudo-Random Number Generator (PRNG)
633
+
634
+ **Credits**: [Seeding random number generator](https://stackoverflow.com/questions/521295/seeding-the-random-number-generator-in-javascript)
635
+
636
+ ##### cyrb128(seed)
637
+
638
+ Produce a 128-bit hash value from a string.
639
+
640
+ `seed`: Initial seed state.
641
+
286
642
  ```ts
287
- // Smooth a value using cubic Hermite interpolation
288
- smoothstep(value: number, min?: number, max?: number) => number;
643
+ cyrb128(seed: string): [number, number, number, number];
289
644
  ```
290
645
 
646
+ ##### sfc32(a, b, c, d)
647
+
648
+ _Simple Fast Counter_, Generator with a 128-bit state.
649
+
291
650
  ```ts
292
- // Re-map the [0, 1] interval into [0, 1] parabola, such that corners are remaped to 0 and the center to 1
293
- parabola(x: number, power?: number) => number;
651
+ sfc32(a: number, b: number, c: number, d: number): number;
294
652
  ```
295
653
 
654
+ ##### splitmix32(a)
655
+
656
+ _SplitMix32_, Generator with a 32-bit state.
657
+
296
658
  ```ts
297
- // Return the sum of numbers
298
- sum(array: number[]) => number;
659
+ splitmix32(a: number): number;
299
660
  ```
300
661
 
662
+ ##### mulberry32(a)
663
+
664
+ _Mulberry32_, Generator with a 32-bit state.
665
+
301
666
  ```ts
302
- // Return the average of numbers
303
- average(array: number[]) => number;
667
+ mulberry32(a: number): number;
304
668
  ```
305
669
 
670
+ ##### jsf32(a, b, c, d)
671
+
672
+ _Jenkins' Small Fast_, Generator with a 32-bit state.
673
+
306
674
  ```ts
307
- // Smoothly interpolate a number toward another
308
- damp(value: number, target: number, damping: number, delta: number) => number;
675
+ jsf32(a: number, b: number, c: number, d: number): number;
309
676
  ```
310
677
 
311
- ### Now
678
+ ##### xoshiro128ss(a, b, c, d)
679
+
680
+ _xoshiro128\*\*_, Generator with a 128-bit state.
312
681
 
313
682
  ```ts
314
- // Polyfill for "now()" functions
315
- now() => number;
683
+ xoshiro128ss(a: number, b: number, c: number, d: number): number;
316
684
  ```
317
685
 
318
686
  ### Random
319
687
 
688
+ ##### randomBoolean(probability)
689
+
690
+ Generate a random boolean (true or false).
691
+
692
+ - `[probability=0.5]`: Probability to get `true`.
693
+
320
694
  ```ts
321
- // Generate a random boolean (true or false)
322
- randomBoolean(probability?: number) => boolean;
695
+ randomBoolean(probability?: number): boolean;
323
696
  ```
324
697
 
698
+ ##### randomSign(probability)
699
+
700
+ Generate a random sign (1 or -1).
701
+
702
+ - `[probability=0.5]`: Probability to get 1.
703
+
325
704
  ```ts
326
- // Generate a random sign (1 or -1)
327
- randomSign(probability?: number) => number;
705
+ randomSign(probability?: number): number;
328
706
  ```
329
707
 
708
+ ##### randomFloat(min, max)
709
+
710
+ Generate a random floating-point number within a specified range.
711
+
712
+ - `[min=0]`: Minimum boundary.
713
+ - `[max=1]`: Maximum boundary.
714
+ - `[precision=2]`: Number of digits after the decimal point.
715
+
330
716
  ```ts
331
- // Generate a random float number
332
- randomFloat(min?: number, max?: number, precision?: number) => number;
717
+ randomFloat(min?: number, max?: number, precision?: number): number;
333
718
  ```
334
719
 
720
+ ##### randomInt(min, max)
721
+
722
+ Generate a random integer number within a specified range.
723
+
724
+ - `min`: Minimum boundary.
725
+ - `max`: Maximum boundary.
726
+
335
727
  ```ts
336
- // Generate a random integer number
337
- randomInt(min: number, max: number) => number;
728
+ randomInt(min: number, max: number): number;
338
729
  ```
339
730
 
731
+ ##### randomHexColor()
732
+
733
+ Generate a random hexadecimal color.
734
+
340
735
  ```ts
341
- // Generate a random hexadecimal color
342
- randomHexColor() => string;
736
+ randomHexColor(): string;
343
737
  ```
344
738
 
739
+ ##### randomItem(array)
740
+
741
+ Pick a random item from a given array.
742
+
743
+ - `array`: Array to pick the item from.
744
+
345
745
  ```ts
346
- // Pick a random item from an array
347
- randomItem<T>(array: T[] = []) => T | undefined;
746
+ randomItem<T>(array: T[]): T | undefined;
348
747
  ```
349
748
 
749
+ ##### randomObjectProperty(object)
750
+
751
+ Pick a random property value from a given object.
752
+
753
+ - `object`: Object to pick the property from.
754
+
350
755
  ```ts
351
- // Pick a random property from an object
352
- randomObjectProperty<T>(object: { [key: string]: T }) => T | undefined;
756
+ randomObjectProperty<T>(object: { [key: string]: T }): T | undefined;
353
757
  ```
354
758
 
759
+ ##### randomIndex(weights)
760
+
761
+ Select a random index from an array of weighted items.
762
+
763
+ - `weights`: Array of weights.
764
+
355
765
  ```ts
356
- // Return a random index from an array of weights
357
- randomIndex(weights?: number[]) => number;
766
+ randomIndex(weights?: number[]): number;
358
767
  ```
359
768
 
769
+ ##### onCircle(radius)
770
+
771
+ Produce a random 2D point around the perimiter of a unit circle.
772
+
773
+ - `[radius=1]`: Radius of the circle.
774
+ - `[target]`: Target vector.
775
+
360
776
  ```ts
361
- // Produce a random 2D point around the perimiter of a unit circle
362
- onCircle(radius?: number, target?: Vector2) => Vector2;
777
+ onCircle(radius?: number, target?: Vector2): Vector2;
363
778
  ```
364
779
 
780
+ ##### insideCircle(radius)
781
+
782
+ Produce a random 2D point inside a unit circle.
783
+
784
+ - `[radius=1]`: Radius of the circle.
785
+ - `[target]` Target vector.
786
+
365
787
  ```ts
366
- // Produce a random 2D point inside a unit circle
367
- insideCircle(radius?: number, target?: Vector2) => Vector2;
788
+ insideCircle(radius?: number, target?: Vector2): Vector2;
368
789
  ```
369
790
 
791
+ ##### onSphere(radius)
792
+
793
+ Produce a random 3D point on the surface of a unit sphere.
794
+
795
+ - `[radius=1]`: Radius of the sphere.
796
+ - `[target]`: Target vector.
797
+
370
798
  ```ts
371
- // Produce a random 3D point on the surface of a unit sphere
372
- onSphere(radius?: number, target?: Vector3) => Vector3;
799
+ onSphere(radius?: number, target?: Vector3): Vector3;
373
800
  ```
374
801
 
802
+ ##### insideSphere(radius)
803
+
804
+ Produce a random 3D point inside a unit sphere.
805
+
806
+ - `[radius=1]`: Radius of the sphere.
807
+ - `[target]`: Target vector.
808
+
375
809
  ```ts
376
- // Produce a random 3D point inside a unit sphere
377
- insideSphere(radius?: number, target?: Vector3) => Vector3;
810
+ insideSphere(radius?: number, target?: Vector3): Vector3;
378
811
  ```
379
812
 
380
813
  ### Strings
381
814
 
815
+ ##### capitalize(string)
816
+
817
+ Capitalize a string.
818
+
819
+ - `string`: String to capitalize.
820
+
821
+ ```ts
822
+ capitalize(string: string): string;
823
+ ```
824
+
825
+ ##### cleanPath(path)
826
+
827
+ Clean a path by removing params.
828
+
829
+ - `path`: Path to clean.
830
+
831
+ ```ts
832
+ cleanPath(path: string): string;
833
+ ```
834
+
835
+ ## Utility classes
836
+
837
+ ### Color scale
838
+
839
+ Utility class for generating color scales and interpolating between colors.
840
+
841
+ - [new ColorScale(input, target)](#color-scale-constructor)
842
+ - [.colors](#color-scale-colors): `Array<[number, number, number]>`
843
+ - `static` [.generate(input, target, length)](#color-scale-static-generate-method): `Array<[number, number, number]>`
844
+ - `static` [.interpolate(inputColor, targetColor, value)](#color-scale-static-interpolate-method): `[number, number, number]`
845
+
846
+ #### Constructor <a id="color-scale-constructor"></a>
847
+
848
+ | Parameter | Type | Default | Description |
849
+ | --------------------- | ---------------------------------- | ----------------------- | ------------------------------------------- |
850
+ | input | `ColorRepresentation` | | Input color representation. |
851
+ | target | `ColorRepresentation` | | Target color representation. |
852
+ | length | `number` | `5` | Amount of colors composing the color scale. |
853
+ | settings | `ColorScaleSettings` | `{ colorSpace: 'rgb' }` | Color scale generation settings. |
854
+ | [settings.colorSpace] | `'rgb' \| 'hsl' \| 'hsb' \| 'hcl'` | `'rgb'` | Color scale color space. |
855
+
856
+ ##### HCL color scales
857
+
858
+ HCL color scales come with a bunch of other settings, so when `settings.colorSpace` is equal to `'hcl'`, the following settings are parameterable:
859
+
860
+ | Parameter | Type | Default | Description |
861
+ | -------------------------- | ---------------------------------------------- | ------- | ---------------------------------------- |
862
+ | [settings.mode] | `'qualitative' \| 'sequential' \| 'diverging'` | | Color scale mode. |
863
+ | [settings.triangular] | `number` | | Triangular interpolation `target` value. |
864
+ | [settings.powerStrength] | `number` | `1` | Interpolation power strength value. |
865
+ | [settings.hueOffset] | `number` | `0` | Target color hue offset. |
866
+ | [settings.chromaOffset] | `number` | `0` | Target color chroma offset. |
867
+ | [settings.luminanceOffset] | `number` | `0` | Target color luminance offset. |
868
+
869
+ Learn more about [HCL-Based Color Palettes](https://colorspace.r-forge.r-project.org/articles/hcl_palettes.html).
870
+
871
+ #### Properties
872
+
873
+ ##### colors <a id="color-scale-colors"></a>
874
+
875
+ Array of colors composing the color scale.
876
+
877
+ ```ts
878
+ ColorScale.colors: Array<[number, number, number]>;
879
+ ```
880
+
881
+ #### Methods
882
+
883
+ ##### `static` generate(input, target, length) <a id="color-scale-static-generate-method"></a>
884
+
885
+ Static method for generating a color scale.
886
+
887
+ - `input`: Input color representation.
888
+ - `target`: Target color representation.
889
+ - `length`: Amount of colors composing the color scale.
890
+ - `[settings]`: Color scale generation settings.
891
+
382
892
  ```ts
383
- // Capitalize a string
384
- capitalize(string: string) => string;
893
+ static ColorScale.generate(
894
+ input: ColorRepresentation,
895
+ target: ColorRepresentation,
896
+ length: number,
897
+ settings?: ColorScaleSettings
898
+ ): Array<[number, number, number]>;
385
899
  ```
386
900
 
901
+ ##### `static` interpolate(inputColor, targetColor, value) <a id="color-scale-static-interpolate-method"></a>
902
+
903
+ Static method for interpolating between colors.
904
+
905
+ - `inputColor`: Input color.
906
+ - `targetColor`: Target color.
907
+ - `value`: Interpolation normalized value.
908
+ - `[settings]`: Color scale settings.
909
+
910
+ ```ts
911
+ static ColorScale.interpolate(
912
+ inputColor: [number, number, number],
913
+ targetColor: [number, number, number],
914
+ value: number,
915
+ settings?: ColorScaleSettings
916
+ ): [number, number, number];
917
+ ```
918
+
919
+ ### Frame rate
920
+
921
+ Utility class for controlling FPS calls.
922
+
923
+ - [new FrameRate()](#frame-rate-constructor)
924
+ - [.fps](#frame-rate-fps): `number`
925
+ - [.update()](#frame-rate-update-method): `boolean`
926
+
927
+ #### Constructor <a id="frame-rate-constructor"></a>
928
+
929
+ | Parameter | Type | Default | Description |
930
+ | --------- | -------- | ------- | ----------------------- |
931
+ | fps | `number` | `30` | Frame per second limit. |
932
+
933
+ #### Properties
934
+
935
+ ##### fps <a id="frame-rate-fps"></a>
936
+
937
+ Frame per second limit.
938
+
939
+ ```ts
940
+ FrameRate.fps: number;
941
+ ```
942
+
943
+ #### Methods
944
+
945
+ ##### update() <a id="frame-rate-update-method"></a>
946
+
947
+ Return true if elapsed time since last update is higher than current FPS.
948
+
387
949
  ```ts
388
- // Clean a path by removing params
389
- cleanPath(path: string) => string;
950
+ FrameRate.update(): boolean;
390
951
  ```
391
952
 
392
953
  ## Constants