@fluixi/utils 1.0.0-alpha.100
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/LICENSE +21 -0
- package/README.md +68 -0
- package/dist/index.cjs +2858 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1 -0
- package/dist/index.mjs +2838 -0
- package/dist/lib/array/advanced.cjs +2227 -0
- package/dist/lib/array/advanced.d.ts +1116 -0
- package/dist/lib/array/advanced.d.ts.map +1 -0
- package/dist/lib/array/advanced.js +2429 -0
- package/dist/lib/array/advanced.mjs +2204 -0
- package/dist/lib/array/array.cjs +57 -0
- package/dist/lib/array/array.d.ts +6 -0
- package/dist/lib/array/array.d.ts.map +1 -0
- package/dist/lib/array/array.js +31 -0
- package/dist/lib/array/array.mjs +36 -0
- package/dist/lib/array/index.cjs +2344 -0
- package/dist/lib/array/index.d.ts +4 -0
- package/dist/lib/array/index.d.ts.map +1 -0
- package/dist/lib/array/index.js +3 -0
- package/dist/lib/array/index.mjs +2322 -0
- package/dist/lib/array/utils.cjs +103 -0
- package/dist/lib/array/utils.d.ts +100 -0
- package/dist/lib/array/utils.d.ts.map +1 -0
- package/dist/lib/array/utils.js +165 -0
- package/dist/lib/array/utils.mjs +82 -0
- package/dist/lib/color/color.cjs +2190 -0
- package/dist/lib/color/color.d.ts +366 -0
- package/dist/lib/color/color.d.ts.map +1 -0
- package/dist/lib/color/color.js +722 -0
- package/dist/lib/color/color.mjs +2167 -0
- package/dist/lib/color/constants.cjs +380 -0
- package/dist/lib/color/constants.d.ts +361 -0
- package/dist/lib/color/constants.d.ts.map +1 -0
- package/dist/lib/color/constants.js +358 -0
- package/dist/lib/color/constants.mjs +359 -0
- package/dist/lib/color/conversions.cjs +629 -0
- package/dist/lib/color/conversions.d.ts +166 -0
- package/dist/lib/color/conversions.d.ts.map +1 -0
- package/dist/lib/color/conversions.js +766 -0
- package/dist/lib/color/conversions.mjs +608 -0
- package/dist/lib/color/helpers.cjs +2534 -0
- package/dist/lib/color/helpers.d.ts +75 -0
- package/dist/lib/color/helpers.d.ts.map +1 -0
- package/dist/lib/color/helpers.js +419 -0
- package/dist/lib/color/helpers.mjs +2511 -0
- package/dist/lib/color/index.cjs +2641 -0
- package/dist/lib/color/index.d.ts +12 -0
- package/dist/lib/color/index.d.ts.map +1 -0
- package/dist/lib/color/index.js +15 -0
- package/dist/lib/color/index.mjs +2619 -0
- package/dist/lib/color/types.cjs +18 -0
- package/dist/lib/color/types.d.ts +179 -0
- package/dist/lib/color/types.d.ts.map +1 -0
- package/dist/lib/color/types.js +1 -0
- package/dist/lib/color/types.mjs +0 -0
- package/dist/lib/color/utils.cjs +962 -0
- package/dist/lib/color/utils.d.ts +199 -0
- package/dist/lib/color/utils.d.ts.map +1 -0
- package/dist/lib/color/utils.js +858 -0
- package/dist/lib/color/utils.mjs +939 -0
- package/dist/lib/compare/comparators.cjs +171 -0
- package/dist/lib/compare/comparators.d.ts +65 -0
- package/dist/lib/compare/comparators.d.ts.map +1 -0
- package/dist/lib/compare/comparators.js +210 -0
- package/dist/lib/compare/comparators.mjs +150 -0
- package/dist/lib/compare/index.cjs +172 -0
- package/dist/lib/compare/index.d.ts +2 -0
- package/dist/lib/compare/index.d.ts.map +1 -0
- package/dist/lib/compare/index.js +1 -0
- package/dist/lib/compare/index.mjs +152 -0
- package/dist/lib/cookie/codec.cjs +72 -0
- package/dist/lib/cookie/codec.d.ts +22 -0
- package/dist/lib/cookie/codec.d.ts.map +1 -0
- package/dist/lib/cookie/codec.js +67 -0
- package/dist/lib/cookie/codec.mjs +51 -0
- package/dist/lib/cookie/index.cjs +75 -0
- package/dist/lib/cookie/index.d.ts +2 -0
- package/dist/lib/cookie/index.d.ts.map +1 -0
- package/dist/lib/cookie/index.js +1 -0
- package/dist/lib/cookie/index.mjs +53 -0
- package/dist/lib/crypto/hash.cjs +83 -0
- package/dist/lib/crypto/hash.d.ts +6 -0
- package/dist/lib/crypto/hash.d.ts.map +1 -0
- package/dist/lib/crypto/hash.js +53 -0
- package/dist/lib/crypto/hash.mjs +62 -0
- package/dist/lib/crypto/index.cjs +85 -0
- package/dist/lib/crypto/index.d.ts +2 -0
- package/dist/lib/crypto/index.d.ts.map +1 -0
- package/dist/lib/crypto/index.js +1 -0
- package/dist/lib/crypto/index.mjs +62 -0
- package/dist/lib/dom/events.cjs +40 -0
- package/dist/lib/dom/events.d.ts +159 -0
- package/dist/lib/dom/events.d.ts.map +1 -0
- package/dist/lib/dom/events.js +50 -0
- package/dist/lib/dom/events.mjs +19 -0
- package/dist/lib/dom/index.cjs +78 -0
- package/dist/lib/dom/index.d.ts +3 -0
- package/dist/lib/dom/index.d.ts.map +1 -0
- package/dist/lib/dom/index.js +2 -0
- package/dist/lib/dom/index.mjs +56 -0
- package/dist/lib/dom/utils.cjs +57 -0
- package/dist/lib/dom/utils.d.ts +6 -0
- package/dist/lib/dom/utils.d.ts.map +1 -0
- package/dist/lib/dom/utils.js +37 -0
- package/dist/lib/dom/utils.mjs +36 -0
- package/dist/lib/functions/functions.cjs +366 -0
- package/dist/lib/functions/functions.d.ts +329 -0
- package/dist/lib/functions/functions.d.ts.map +1 -0
- package/dist/lib/functions/functions.js +585 -0
- package/dist/lib/functions/functions.mjs +345 -0
- package/dist/lib/functions/index.cjs +369 -0
- package/dist/lib/functions/index.d.ts +3 -0
- package/dist/lib/functions/index.d.ts.map +1 -0
- package/dist/lib/functions/index.js +1 -0
- package/dist/lib/functions/index.mjs +347 -0
- package/dist/lib/functions/types.cjs +18 -0
- package/dist/lib/functions/types.d.ts +2 -0
- package/dist/lib/functions/types.d.ts.map +1 -0
- package/dist/lib/functions/types.js +1 -0
- package/dist/lib/functions/types.mjs +0 -0
- package/dist/lib/helpers.cjs +78 -0
- package/dist/lib/helpers.d.ts +13 -0
- package/dist/lib/helpers.d.ts.map +1 -0
- package/dist/lib/helpers.js +66 -0
- package/dist/lib/helpers.mjs +59 -0
- package/dist/lib/index.cjs +2857 -0
- package/dist/lib/index.d.ts +6 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +8 -0
- package/dist/lib/index.mjs +2836 -0
- package/dist/lib/maths/constants.cjs +70 -0
- package/dist/lib/maths/constants.d.ts +84 -0
- package/dist/lib/maths/constants.d.ts.map +1 -0
- package/dist/lib/maths/constants.js +79 -0
- package/dist/lib/maths/constants.mjs +50 -0
- package/dist/lib/maths/fn/advanced.cjs +231 -0
- package/dist/lib/maths/fn/advanced.d.ts +149 -0
- package/dist/lib/maths/fn/advanced.d.ts.map +1 -0
- package/dist/lib/maths/fn/advanced.js +264 -0
- package/dist/lib/maths/fn/advanced.mjs +208 -0
- package/dist/lib/maths/fn/basic.cjs +212 -0
- package/dist/lib/maths/fn/basic.d.ts +182 -0
- package/dist/lib/maths/fn/basic.d.ts.map +1 -0
- package/dist/lib/maths/fn/basic.js +343 -0
- package/dist/lib/maths/fn/basic.mjs +191 -0
- package/dist/lib/maths/fn/complex.cjs +268 -0
- package/dist/lib/maths/fn/complex.d.ts +153 -0
- package/dist/lib/maths/fn/complex.d.ts.map +1 -0
- package/dist/lib/maths/fn/complex.js +383 -0
- package/dist/lib/maths/fn/complex.mjs +247 -0
- package/dist/lib/maths/fn/index.cjs +877 -0
- package/dist/lib/maths/fn/index.d.ts +10 -0
- package/dist/lib/maths/fn/index.d.ts.map +1 -0
- package/dist/lib/maths/fn/index.js +9 -0
- package/dist/lib/maths/fn/index.mjs +855 -0
- package/dist/lib/maths/fn/trigo.cjs +179 -0
- package/dist/lib/maths/fn/trigo.d.ts +147 -0
- package/dist/lib/maths/fn/trigo.d.ts.map +1 -0
- package/dist/lib/maths/fn/trigo.js +227 -0
- package/dist/lib/maths/fn/trigo.mjs +156 -0
- package/dist/lib/maths/fn/vector.cjs +728 -0
- package/dist/lib/maths/fn/vector.d.ts +512 -0
- package/dist/lib/maths/fn/vector.d.ts.map +1 -0
- package/dist/lib/maths/fn/vector.js +1136 -0
- package/dist/lib/maths/fn/vector.mjs +707 -0
- package/dist/lib/maths/formatter.cjs +61 -0
- package/dist/lib/maths/formatter.d.ts +35 -0
- package/dist/lib/maths/formatter.d.ts.map +1 -0
- package/dist/lib/maths/formatter.js +56 -0
- package/dist/lib/maths/formatter.mjs +40 -0
- package/dist/lib/maths/guards.cjs +164 -0
- package/dist/lib/maths/guards.d.ts +166 -0
- package/dist/lib/maths/guards.d.ts.map +1 -0
- package/dist/lib/maths/guards.js +315 -0
- package/dist/lib/maths/guards.mjs +144 -0
- package/dist/lib/maths/index.cjs +1152 -0
- package/dist/lib/maths/index.d.ts +24 -0
- package/dist/lib/maths/index.d.ts.map +1 -0
- package/dist/lib/maths/index.js +29 -0
- package/dist/lib/maths/index.mjs +1130 -0
- package/dist/lib/maths/parser.cjs +75 -0
- package/dist/lib/maths/parser.d.ts +20 -0
- package/dist/lib/maths/parser.d.ts.map +1 -0
- package/dist/lib/maths/parser.js +78 -0
- package/dist/lib/maths/parser.mjs +54 -0
- package/dist/lib/maths/random.cjs +49 -0
- package/dist/lib/maths/random.d.ts +27 -0
- package/dist/lib/maths/random.d.ts.map +1 -0
- package/dist/lib/maths/random.js +49 -0
- package/dist/lib/maths/random.mjs +28 -0
- package/dist/lib/maths/types/advanced.cjs +18 -0
- package/dist/lib/maths/types/advanced.d.ts +357 -0
- package/dist/lib/maths/types/advanced.d.ts.map +1 -0
- package/dist/lib/maths/types/advanced.js +5 -0
- package/dist/lib/maths/types/advanced.mjs +0 -0
- package/dist/lib/maths/types/basic.cjs +18 -0
- package/dist/lib/maths/types/basic.d.ts +95 -0
- package/dist/lib/maths/types/basic.d.ts.map +1 -0
- package/dist/lib/maths/types/basic.js +5 -0
- package/dist/lib/maths/types/basic.mjs +0 -0
- package/dist/lib/maths/types/index.cjs +19 -0
- package/dist/lib/maths/types/index.d.ts +4 -0
- package/dist/lib/maths/types/index.d.ts.map +1 -0
- package/dist/lib/maths/types/index.js +3 -0
- package/dist/lib/maths/types/index.mjs +1 -0
- package/dist/lib/maths/types/negative.cjs +18 -0
- package/dist/lib/maths/types/negative.d.ts +51 -0
- package/dist/lib/maths/types/negative.d.ts.map +1 -0
- package/dist/lib/maths/types/negative.js +5 -0
- package/dist/lib/maths/types/negative.mjs +0 -0
- package/dist/lib/maths/types/operations.cjs +18 -0
- package/dist/lib/maths/types/operations.d.ts +188 -0
- package/dist/lib/maths/types/operations.d.ts.map +1 -0
- package/dist/lib/maths/types/operations.js +6 -0
- package/dist/lib/maths/types/operations.mjs +0 -0
- package/dist/lib/object/clone.cjs +88 -0
- package/dist/lib/object/clone.d.ts +46 -0
- package/dist/lib/object/clone.d.ts.map +1 -0
- package/dist/lib/object/clone.js +104 -0
- package/dist/lib/object/clone.mjs +65 -0
- package/dist/lib/object/diff.cjs +573 -0
- package/dist/lib/object/diff.d.ts +203 -0
- package/dist/lib/object/diff.d.ts.map +1 -0
- package/dist/lib/object/diff.js +805 -0
- package/dist/lib/object/diff.mjs +550 -0
- package/dist/lib/object/getter-setter.cjs +2351 -0
- package/dist/lib/object/getter-setter.d.ts +361 -0
- package/dist/lib/object/getter-setter.d.ts.map +1 -0
- package/dist/lib/object/getter-setter.js +1771 -0
- package/dist/lib/object/getter-setter.mjs +2330 -0
- package/dist/lib/object/index.cjs +3956 -0
- package/dist/lib/object/index.d.ts +13 -0
- package/dist/lib/object/index.d.ts.map +1 -0
- package/dist/lib/object/index.js +12 -0
- package/dist/lib/object/index.mjs +3936 -0
- package/dist/lib/object/merge.cjs +1029 -0
- package/dist/lib/object/merge.d.ts +93 -0
- package/dist/lib/object/merge.d.ts.map +1 -0
- package/dist/lib/object/merge.js +474 -0
- package/dist/lib/object/merge.mjs +1006 -0
- package/dist/lib/object/object.cjs +280 -0
- package/dist/lib/object/object.d.ts +128 -0
- package/dist/lib/object/object.d.ts.map +1 -0
- package/dist/lib/object/object.js +432 -0
- package/dist/lib/object/object.mjs +257 -0
- package/dist/lib/object/omit.cjs +2022 -0
- package/dist/lib/object/omit.d.ts +351 -0
- package/dist/lib/object/omit.d.ts.map +1 -0
- package/dist/lib/object/omit.js +656 -0
- package/dist/lib/object/omit.mjs +1999 -0
- package/dist/lib/object/reconcile.cjs +126 -0
- package/dist/lib/object/reconcile.d.ts +7 -0
- package/dist/lib/object/reconcile.d.ts.map +1 -0
- package/dist/lib/object/reconcile.js +122 -0
- package/dist/lib/object/reconcile.mjs +105 -0
- package/dist/lib/object/selector.cjs +303 -0
- package/dist/lib/object/selector.d.ts +50 -0
- package/dist/lib/object/selector.d.ts.map +1 -0
- package/dist/lib/object/selector.js +371 -0
- package/dist/lib/object/selector.mjs +282 -0
- package/dist/lib/object/sort.cjs +209 -0
- package/dist/lib/object/sort.d.ts +149 -0
- package/dist/lib/object/sort.d.ts.map +1 -0
- package/dist/lib/object/sort.js +298 -0
- package/dist/lib/object/sort.mjs +186 -0
- package/dist/lib/object/transform.cjs +2211 -0
- package/dist/lib/object/transform.d.ts +620 -0
- package/dist/lib/object/transform.d.ts.map +1 -0
- package/dist/lib/object/transform.js +1058 -0
- package/dist/lib/object/transform.mjs +2190 -0
- package/dist/lib/object/types.cjs +18 -0
- package/dist/lib/object/types.d.ts +250 -0
- package/dist/lib/object/types.d.ts.map +1 -0
- package/dist/lib/object/types.js +1 -0
- package/dist/lib/object/types.mjs +0 -0
- package/dist/lib/object/utils.cjs +326 -0
- package/dist/lib/object/utils.d.ts +165 -0
- package/dist/lib/object/utils.d.ts.map +1 -0
- package/dist/lib/object/utils.js +444 -0
- package/dist/lib/object/utils.mjs +305 -0
- package/dist/lib/primitive/boolean/boolean.cjs +407 -0
- package/dist/lib/primitive/boolean/boolean.d.ts +276 -0
- package/dist/lib/primitive/boolean/boolean.d.ts.map +1 -0
- package/dist/lib/primitive/boolean/boolean.js +615 -0
- package/dist/lib/primitive/boolean/boolean.mjs +386 -0
- package/dist/lib/primitive/boolean/index.cjs +382 -0
- package/dist/lib/primitive/boolean/index.d.ts +3 -0
- package/dist/lib/primitive/boolean/index.d.ts.map +1 -0
- package/dist/lib/primitive/boolean/index.js +2 -0
- package/dist/lib/primitive/boolean/index.mjs +359 -0
- package/dist/lib/primitive/boolean/types.cjs +18 -0
- package/dist/lib/primitive/boolean/types.d.ts +14 -0
- package/dist/lib/primitive/boolean/types.d.ts.map +1 -0
- package/dist/lib/primitive/boolean/types.js +1 -0
- package/dist/lib/primitive/boolean/types.mjs +0 -0
- package/dist/lib/primitive/date/date.cjs +1126 -0
- package/dist/lib/primitive/date/date.d.ts +641 -0
- package/dist/lib/primitive/date/date.d.ts.map +1 -0
- package/dist/lib/primitive/date/date.js +1998 -0
- package/dist/lib/primitive/date/date.mjs +1105 -0
- package/dist/lib/primitive/date/index.cjs +1128 -0
- package/dist/lib/primitive/date/index.d.ts +3 -0
- package/dist/lib/primitive/date/index.d.ts.map +1 -0
- package/dist/lib/primitive/date/index.js +2 -0
- package/dist/lib/primitive/date/index.mjs +1105 -0
- package/dist/lib/primitive/date/types.cjs +18 -0
- package/dist/lib/primitive/date/types.d.ts +205 -0
- package/dist/lib/primitive/date/types.d.ts.map +1 -0
- package/dist/lib/primitive/date/types.js +7 -0
- package/dist/lib/primitive/date/types.mjs +0 -0
- package/dist/lib/primitive/index.cjs +2338 -0
- package/dist/lib/primitive/index.d.ts +5 -0
- package/dist/lib/primitive/index.d.ts.map +1 -0
- package/dist/lib/primitive/index.js +4 -0
- package/dist/lib/primitive/index.mjs +2316 -0
- package/dist/lib/primitive/string/index.cjs +875 -0
- package/dist/lib/primitive/string/index.d.ts +3 -0
- package/dist/lib/primitive/string/index.d.ts.map +1 -0
- package/dist/lib/primitive/string/index.js +2 -0
- package/dist/lib/primitive/string/index.mjs +852 -0
- package/dist/lib/primitive/string/parser-2.cjs +543 -0
- package/dist/lib/primitive/string/parser-2.d.ts +17 -0
- package/dist/lib/primitive/string/parser-2.d.ts.map +1 -0
- package/dist/lib/primitive/string/parser-2.js +656 -0
- package/dist/lib/primitive/string/parser-2.mjs +522 -0
- package/dist/lib/primitive/string/parser.cjs +236 -0
- package/dist/lib/primitive/string/parser.d.ts +9 -0
- package/dist/lib/primitive/string/parser.d.ts.map +1 -0
- package/dist/lib/primitive/string/parser.js +775 -0
- package/dist/lib/primitive/string/parser.mjs +215 -0
- package/dist/lib/primitive/string/string.cjs +926 -0
- package/dist/lib/primitive/string/string.d.ts +535 -0
- package/dist/lib/primitive/string/string.d.ts.map +1 -0
- package/dist/lib/primitive/string/string.js +1301 -0
- package/dist/lib/primitive/string/string.mjs +903 -0
- package/dist/lib/primitive/string/types.cjs +18 -0
- package/dist/lib/primitive/string/types.d.ts +318 -0
- package/dist/lib/primitive/string/types.d.ts.map +1 -0
- package/dist/lib/primitive/string/types.js +5 -0
- package/dist/lib/primitive/string/types.mjs +0 -0
- package/dist/lib/primitive/types.cjs +18 -0
- package/dist/lib/primitive/types.d.ts +27 -0
- package/dist/lib/primitive/types.d.ts.map +1 -0
- package/dist/lib/primitive/types.js +1 -0
- package/dist/lib/primitive/types.mjs +0 -0
- package/dist/lib/url/index.cjs +327 -0
- package/dist/lib/url/index.d.ts +3 -0
- package/dist/lib/url/index.d.ts.map +1 -0
- package/dist/lib/url/index.js +2 -0
- package/dist/lib/url/index.mjs +304 -0
- package/dist/lib/url/parser.cjs +325 -0
- package/dist/lib/url/parser.d.ts +216 -0
- package/dist/lib/url/parser.d.ts.map +1 -0
- package/dist/lib/url/parser.js +488 -0
- package/dist/lib/url/parser.mjs +304 -0
- package/dist/lib/url/types.cjs +18 -0
- package/dist/lib/url/types.d.ts +18 -0
- package/dist/lib/url/types.d.ts.map +1 -0
- package/dist/lib/url/types.js +1 -0
- package/dist/lib/url/types.mjs +0 -0
- package/dist/tsconfig.lib.tsbuildinfo +1 -0
- package/package.json +127 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Advanced color helper utilities
|
|
3
|
+
* Provides temperature adjustments, color blindness simulation, and other advanced operations
|
|
4
|
+
*/
|
|
5
|
+
import type { ColorTemperatureOptions } from './types.js';
|
|
6
|
+
import { Color } from './color.js';
|
|
7
|
+
/**
|
|
8
|
+
* Color temperature adjustment
|
|
9
|
+
* Adjusts color temperature (warm/cool)
|
|
10
|
+
*/
|
|
11
|
+
export declare function adjustTemperature(color: string | Color, options?: ColorTemperatureOptions): Color;
|
|
12
|
+
/**
|
|
13
|
+
* Simulate color blindness
|
|
14
|
+
* Types: protanopia, deuteranopia, tritanopia, achromatopsia
|
|
15
|
+
*/
|
|
16
|
+
export declare function simulateColorBlindness(color: string | Color, type?: 'protanopia' | 'deuteranopia' | 'tritanopia' | 'achromatopsia'): Color;
|
|
17
|
+
/**
|
|
18
|
+
* Invert color
|
|
19
|
+
*/
|
|
20
|
+
export declare function invertColor(color: string | Color, bw?: boolean): Color;
|
|
21
|
+
/**
|
|
22
|
+
* Grayscale conversion
|
|
23
|
+
*/
|
|
24
|
+
export declare function toGrayscale(color: string | Color, method?: 'average' | 'luminosity' | 'lightness'): Color;
|
|
25
|
+
/**
|
|
26
|
+
* Sepia tone effect
|
|
27
|
+
*/
|
|
28
|
+
export declare function toSepia(color: string | Color, intensity?: number): Color;
|
|
29
|
+
/**
|
|
30
|
+
* Calculate color distance using Delta E (CIE2000)
|
|
31
|
+
* Returns a value where 0 = identical, >100 = very different
|
|
32
|
+
*/
|
|
33
|
+
export declare function colorDistance(color1: string | Color, color2: string | Color): number;
|
|
34
|
+
/**
|
|
35
|
+
* Find closest color from a palette
|
|
36
|
+
*/
|
|
37
|
+
export declare function findClosestColor(color: string | Color, palette: (string | Color)[]): Color;
|
|
38
|
+
/**
|
|
39
|
+
* Generate gradient colors
|
|
40
|
+
*/
|
|
41
|
+
export declare function generateGradient(startColor: string | Color, endColor: string | Color, steps?: number, colorSpace?: 'rgb' | 'hsl' | 'lab' | 'oklab' | 'oklch'): Color[];
|
|
42
|
+
/**
|
|
43
|
+
* Calculate perceptual brightness (0-1)
|
|
44
|
+
*/
|
|
45
|
+
export declare function getPerceivedBrightness(color: string | Color): number;
|
|
46
|
+
/**
|
|
47
|
+
* Check if color is light (brightness > 0.5)
|
|
48
|
+
*/
|
|
49
|
+
export declare function isLight(color: string | Color): boolean;
|
|
50
|
+
/**
|
|
51
|
+
* Check if color is dark (brightness <= 0.5)
|
|
52
|
+
*/
|
|
53
|
+
export declare function isDark(color: string | Color): boolean;
|
|
54
|
+
/**
|
|
55
|
+
* Blend two colors using various blend modes
|
|
56
|
+
*/
|
|
57
|
+
export declare function blendColors(base: string | Color, blend: string | Color, mode?: 'multiply' | 'screen' | 'overlay' | 'normal', opacity?: number): Color;
|
|
58
|
+
/**
|
|
59
|
+
* Get dominant color component
|
|
60
|
+
*/
|
|
61
|
+
export declare function getDominantComponent(color: string | Color): 'red' | 'green' | 'blue' | 'gray';
|
|
62
|
+
/**
|
|
63
|
+
* Get color name (basic approximation)
|
|
64
|
+
*/
|
|
65
|
+
export declare function getColorName(color: string | Color): string;
|
|
66
|
+
/**
|
|
67
|
+
* Random color generator with constraints
|
|
68
|
+
*/
|
|
69
|
+
export declare function randomColor(options?: {
|
|
70
|
+
hue?: [number, number];
|
|
71
|
+
saturation?: [number, number];
|
|
72
|
+
lightness?: [number, number];
|
|
73
|
+
alpha?: number;
|
|
74
|
+
}): Color;
|
|
75
|
+
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/lib/color/helpers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAY,uBAAuB,EAAE,MAAM,YAAY,CAAC;AACpE,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAYnC;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,GAAG,KAAK,EACrB,OAAO,GAAE,uBAA4B,GACpC,KAAK,CA2BP;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,MAAM,GAAG,KAAK,EACrB,IAAI,GACA,YAAY,GACZ,cAAc,GACd,YAAY,GACZ,eAA8B,GACjC,KAAK,CAgEP;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,EAAE,EAAE,GAAE,OAAe,GAAG,KAAK,CAY7E;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,MAAM,GAAG,KAAK,EACrB,MAAM,GAAE,SAAS,GAAG,YAAY,GAAG,WAA0B,GAC5D,KAAK,CA0BP;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,EAAE,SAAS,GAAE,MAAU,GAAG,KAAK,CAwB3E;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,GAAG,KAAK,EACtB,MAAM,EAAE,MAAM,GAAG,KAAK,GACrB,MAAM,CAaR;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,GAAG,KAAK,EACrB,OAAO,EAAE,CAAC,MAAM,GAAG,KAAK,CAAC,EAAE,GAC1B,KAAK,CAeP;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,MAAM,GAAG,KAAK,EAC1B,QAAQ,EAAE,MAAM,GAAG,KAAK,EACxB,KAAK,GAAE,MAAU,EACjB,UAAU,GAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,OAAO,GAAG,OAAe,GAC5D,KAAK,EAAE,CAoHT;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,CAMpE;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,GAAG,OAAO,CAEtD;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,GAAG,OAAO,CAErD;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,GAAG,KAAK,EACpB,KAAK,EAAE,MAAM,GAAG,KAAK,EACrB,IAAI,GAAE,UAAU,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAmB,EAC7D,OAAO,GAAE,MAAU,GAClB,KAAK,CAyCP;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,MAAM,GAAG,KAAK,GACpB,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAenC;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,CAmC1D;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,OAAO,GAAE;IACP,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvB,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;CACX,GACL,KAAK,CAcP"}
|
|
@@ -0,0 +1,419 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Advanced color helper utilities
|
|
3
|
+
* Provides temperature adjustments, color blindness simulation, and other advanced operations
|
|
4
|
+
*/
|
|
5
|
+
import { Color } from './color.js';
|
|
6
|
+
import { rgbToHsl, hslToRgb, rgbToLab, labToRgb, rgbToOklab, oklabToRgb, rgbToOklch, oklchToRgb, } from './conversions.js';
|
|
7
|
+
/**
|
|
8
|
+
* Color temperature adjustment
|
|
9
|
+
* Adjusts color temperature (warm/cool)
|
|
10
|
+
*/
|
|
11
|
+
export function adjustTemperature(color, options = {}) {
|
|
12
|
+
const { temperature = 0, intensity = 0.5 } = options;
|
|
13
|
+
const colorObj = color instanceof Color ? color : new Color(color);
|
|
14
|
+
const rgb = colorObj.getRgbObject();
|
|
15
|
+
// Normalized temperature (-1 to 1)
|
|
16
|
+
const normalizedTemp = Math.max(-1, Math.min(1, temperature / 10000));
|
|
17
|
+
// Adjust RGB channels based on temperature
|
|
18
|
+
let r = rgb.r;
|
|
19
|
+
let g = rgb.g;
|
|
20
|
+
let b = rgb.b;
|
|
21
|
+
if (normalizedTemp > 0) {
|
|
22
|
+
// Warmer (add red/yellow)
|
|
23
|
+
r = Math.min(255, r + normalizedTemp * 255 * intensity);
|
|
24
|
+
g = Math.min(255, g + normalizedTemp * 200 * intensity);
|
|
25
|
+
b = Math.max(0, b - normalizedTemp * 100 * intensity);
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
// Cooler (add blue)
|
|
29
|
+
const coolness = Math.abs(normalizedTemp);
|
|
30
|
+
r = Math.max(0, r - coolness * 100 * intensity);
|
|
31
|
+
g = Math.max(0, g - coolness * 50 * intensity);
|
|
32
|
+
b = Math.min(255, b + coolness * 255 * intensity);
|
|
33
|
+
}
|
|
34
|
+
return new Color([Math.round(r), Math.round(g), Math.round(b), rgb.a || 1]);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Simulate color blindness
|
|
38
|
+
* Types: protanopia, deuteranopia, tritanopia, achromatopsia
|
|
39
|
+
*/
|
|
40
|
+
export function simulateColorBlindness(color, type = 'protanopia') {
|
|
41
|
+
const colorObj = color instanceof Color ? color : new Color(color);
|
|
42
|
+
const rgb = colorObj.getRgbObject();
|
|
43
|
+
let r = rgb.r / 255;
|
|
44
|
+
let g = rgb.g / 255;
|
|
45
|
+
let b = rgb.b / 255;
|
|
46
|
+
// Transformation matrices for different types of color blindness
|
|
47
|
+
let matrix;
|
|
48
|
+
switch (type) {
|
|
49
|
+
case 'protanopia': // Red-blind
|
|
50
|
+
matrix = [
|
|
51
|
+
[0.56667, 0.43333, 0.0],
|
|
52
|
+
[0.55833, 0.44167, 0.0],
|
|
53
|
+
[0.0, 0.24167, 0.75833],
|
|
54
|
+
];
|
|
55
|
+
break;
|
|
56
|
+
case 'deuteranopia': // Green-blind
|
|
57
|
+
matrix = [
|
|
58
|
+
[0.625, 0.375, 0.0],
|
|
59
|
+
[0.7, 0.3, 0.0],
|
|
60
|
+
[0.0, 0.3, 0.7],
|
|
61
|
+
];
|
|
62
|
+
break;
|
|
63
|
+
case 'tritanopia': // Blue-blind
|
|
64
|
+
matrix = [
|
|
65
|
+
[0.95, 0.05, 0.0],
|
|
66
|
+
[0.0, 0.43333, 0.56667],
|
|
67
|
+
[0.0, 0.475, 0.525],
|
|
68
|
+
];
|
|
69
|
+
break;
|
|
70
|
+
case 'achromatopsia': // Complete color blindness (grayscale)
|
|
71
|
+
const gray = 0.299 * r + 0.587 * g + 0.114 * b;
|
|
72
|
+
return new Color([
|
|
73
|
+
Math.round(gray * 255),
|
|
74
|
+
Math.round(gray * 255),
|
|
75
|
+
Math.round(gray * 255),
|
|
76
|
+
rgb.a || 1,
|
|
77
|
+
]);
|
|
78
|
+
default:
|
|
79
|
+
matrix = [
|
|
80
|
+
[1, 0, 0],
|
|
81
|
+
[0, 1, 0],
|
|
82
|
+
[0, 0, 1],
|
|
83
|
+
];
|
|
84
|
+
}
|
|
85
|
+
// Apply transformation
|
|
86
|
+
const newR = matrix[0][0] * r + matrix[0][1] * g + matrix[0][2] * b;
|
|
87
|
+
const newG = matrix[1][0] * r + matrix[1][1] * g + matrix[1][2] * b;
|
|
88
|
+
const newB = matrix[2][0] * r + matrix[2][1] * g + matrix[2][2] * b;
|
|
89
|
+
return new Color([
|
|
90
|
+
Math.round(Math.max(0, Math.min(255, newR * 255))),
|
|
91
|
+
Math.round(Math.max(0, Math.min(255, newG * 255))),
|
|
92
|
+
Math.round(Math.max(0, Math.min(255, newB * 255))),
|
|
93
|
+
rgb.a || 1,
|
|
94
|
+
]);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Invert color
|
|
98
|
+
*/
|
|
99
|
+
export function invertColor(color, bw = false) {
|
|
100
|
+
const colorObj = color instanceof Color ? color : new Color(color);
|
|
101
|
+
const rgb = colorObj.getRgbObject();
|
|
102
|
+
if (bw) {
|
|
103
|
+
// Black or white inversion based on luminance
|
|
104
|
+
const luminance = (0.299 * rgb.r + 0.587 * rgb.g + 0.114 * rgb.b) / 255;
|
|
105
|
+
return luminance > 0.5 ? Color.black : Color.white;
|
|
106
|
+
}
|
|
107
|
+
// RGB inversion
|
|
108
|
+
return new Color([255 - rgb.r, 255 - rgb.g, 255 - rgb.b, rgb.a || 1]);
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Grayscale conversion
|
|
112
|
+
*/
|
|
113
|
+
export function toGrayscale(color, method = 'luminosity') {
|
|
114
|
+
const colorObj = color instanceof Color ? color : new Color(color);
|
|
115
|
+
const rgb = colorObj.getRgbObject();
|
|
116
|
+
let gray;
|
|
117
|
+
switch (method) {
|
|
118
|
+
case 'average':
|
|
119
|
+
gray = (rgb.r + rgb.g + rgb.b) / 3;
|
|
120
|
+
break;
|
|
121
|
+
case 'luminosity':
|
|
122
|
+
gray = 0.299 * rgb.r + 0.587 * rgb.g + 0.114 * rgb.b;
|
|
123
|
+
break;
|
|
124
|
+
case 'lightness':
|
|
125
|
+
gray =
|
|
126
|
+
(Math.max(rgb.r, rgb.g, rgb.b) + Math.min(rgb.r, rgb.g, rgb.b)) / 2;
|
|
127
|
+
break;
|
|
128
|
+
default:
|
|
129
|
+
gray = 0.299 * rgb.r + 0.587 * rgb.g + 0.114 * rgb.b;
|
|
130
|
+
}
|
|
131
|
+
const value = Math.round(gray);
|
|
132
|
+
return new Color([value, value, value, rgb.a || 1]);
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Sepia tone effect
|
|
136
|
+
*/
|
|
137
|
+
export function toSepia(color, intensity = 1) {
|
|
138
|
+
const colorObj = color instanceof Color ? color : new Color(color);
|
|
139
|
+
const rgb = colorObj.getRgbObject();
|
|
140
|
+
const r = rgb.r / 255;
|
|
141
|
+
const g = rgb.g / 255;
|
|
142
|
+
const b = rgb.b / 255;
|
|
143
|
+
// Sepia transformation matrix
|
|
144
|
+
let newR = 0.393 * r + 0.769 * g + 0.189 * b;
|
|
145
|
+
let newG = 0.349 * r + 0.686 * g + 0.168 * b;
|
|
146
|
+
let newB = 0.272 * r + 0.534 * g + 0.131 * b;
|
|
147
|
+
// Apply intensity
|
|
148
|
+
newR = r + (newR - r) * intensity;
|
|
149
|
+
newG = g + (newG - g) * intensity;
|
|
150
|
+
newB = b + (newB - b) * intensity;
|
|
151
|
+
return new Color([
|
|
152
|
+
Math.round(Math.max(0, Math.min(255, newR * 255))),
|
|
153
|
+
Math.round(Math.max(0, Math.min(255, newG * 255))),
|
|
154
|
+
Math.round(Math.max(0, Math.min(255, newB * 255))),
|
|
155
|
+
rgb.a || 1,
|
|
156
|
+
]);
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Calculate color distance using Delta E (CIE2000)
|
|
160
|
+
* Returns a value where 0 = identical, >100 = very different
|
|
161
|
+
*/
|
|
162
|
+
export function colorDistance(color1, color2) {
|
|
163
|
+
const c1 = color1 instanceof Color ? color1 : new Color(color1);
|
|
164
|
+
const c2 = color2 instanceof Color ? color2 : new Color(color2);
|
|
165
|
+
const lab1 = rgbToLab(c1.getRgbObject());
|
|
166
|
+
const lab2 = rgbToLab(c2.getRgbObject());
|
|
167
|
+
// Simplified Delta E calculation (Euclidean distance in LAB space)
|
|
168
|
+
const deltaL = lab1.l - lab2.l;
|
|
169
|
+
const deltaA = lab1.a - lab2.a;
|
|
170
|
+
const deltaB = lab1.b - lab2.b;
|
|
171
|
+
return Math.sqrt(deltaL * deltaL + deltaA * deltaA + deltaB * deltaB);
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Find closest color from a palette
|
|
175
|
+
*/
|
|
176
|
+
export function findClosestColor(color, palette) {
|
|
177
|
+
const targetColor = color instanceof Color ? color : new Color(color);
|
|
178
|
+
let closestColor = null;
|
|
179
|
+
let minDistance = Infinity;
|
|
180
|
+
for (const paletteColor of palette) {
|
|
181
|
+
const distance = colorDistance(targetColor, paletteColor);
|
|
182
|
+
if (distance < minDistance) {
|
|
183
|
+
minDistance = distance;
|
|
184
|
+
closestColor =
|
|
185
|
+
paletteColor instanceof Color ? paletteColor : new Color(paletteColor);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return closestColor || targetColor;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Generate gradient colors
|
|
192
|
+
*/
|
|
193
|
+
export function generateGradient(startColor, endColor, steps = 5, colorSpace = 'rgb') {
|
|
194
|
+
const start = startColor instanceof Color ? startColor : new Color(startColor);
|
|
195
|
+
const end = endColor instanceof Color ? endColor : new Color(endColor);
|
|
196
|
+
const colors = [];
|
|
197
|
+
if (steps < 2) {
|
|
198
|
+
return [start];
|
|
199
|
+
}
|
|
200
|
+
for (let i = 0; i < steps; i++) {
|
|
201
|
+
const t = i / (steps - 1);
|
|
202
|
+
let interpolated;
|
|
203
|
+
switch (colorSpace) {
|
|
204
|
+
case 'hsl': {
|
|
205
|
+
const hsl1 = rgbToHsl(start.getRgbObject());
|
|
206
|
+
const hsl2 = rgbToHsl(end.getRgbObject());
|
|
207
|
+
// Handle hue interpolation (shortest path around color wheel)
|
|
208
|
+
let h1 = hsl1.h;
|
|
209
|
+
let h2 = hsl2.h;
|
|
210
|
+
const diff = h2 - h1;
|
|
211
|
+
if (Math.abs(diff) > 180) {
|
|
212
|
+
if (h1 < h2) {
|
|
213
|
+
h1 += 360;
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
h2 += 360;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
const h = (h1 + (h2 - h1) * t) % 360;
|
|
220
|
+
const s = hsl1.s + (hsl2.s - hsl1.s) * t;
|
|
221
|
+
const l = hsl1.l + (hsl2.l - hsl1.l) * t;
|
|
222
|
+
const a = (hsl1.a ?? 1) + ((hsl2.a ?? 1) - (hsl1.a ?? 1)) * t;
|
|
223
|
+
interpolated = hslToRgb({ h, s, l, a });
|
|
224
|
+
break;
|
|
225
|
+
}
|
|
226
|
+
case 'lab': {
|
|
227
|
+
const lab1 = rgbToLab(start.getRgbObject());
|
|
228
|
+
const lab2 = rgbToLab(end.getRgbObject());
|
|
229
|
+
const l = lab1.l + (lab2.l - lab1.l) * t;
|
|
230
|
+
const a = lab1.a + (lab2.a - lab1.a) * t;
|
|
231
|
+
const b = lab1.b + (lab2.b - lab1.b) * t;
|
|
232
|
+
const alpha = (lab1.alpha ?? 1) + ((lab2.alpha ?? 1) - (lab1.alpha ?? 1)) * t;
|
|
233
|
+
interpolated = labToRgb({ l, a, b, alpha });
|
|
234
|
+
break;
|
|
235
|
+
}
|
|
236
|
+
case 'oklab': {
|
|
237
|
+
const oklab1 = rgbToOklab(start.getRgbObject());
|
|
238
|
+
const oklab2 = rgbToOklab(end.getRgbObject());
|
|
239
|
+
const l = oklab1.l + (oklab2.l - oklab1.l) * t;
|
|
240
|
+
const a = oklab1.a + (oklab2.a - oklab1.a) * t;
|
|
241
|
+
const b = oklab1.b + (oklab2.b - oklab1.b) * t;
|
|
242
|
+
const alpha = (oklab1.alpha ?? 1) + ((oklab2.alpha ?? 1) - (oklab1.alpha ?? 1)) * t;
|
|
243
|
+
interpolated = oklabToRgb({ l, a, b, alpha });
|
|
244
|
+
break;
|
|
245
|
+
}
|
|
246
|
+
case 'oklch': {
|
|
247
|
+
const oklch1 = rgbToOklch(start.getRgbObject());
|
|
248
|
+
const oklch2 = rgbToOklch(end.getRgbObject());
|
|
249
|
+
// Handle hue interpolation (shortest path around color wheel)
|
|
250
|
+
let h1 = oklch1.h;
|
|
251
|
+
let h2 = oklch2.h;
|
|
252
|
+
const diff = h2 - h1;
|
|
253
|
+
if (Math.abs(diff) > 180) {
|
|
254
|
+
if (h1 < h2) {
|
|
255
|
+
h1 += 360;
|
|
256
|
+
}
|
|
257
|
+
else {
|
|
258
|
+
h2 += 360;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
const l = oklch1.l + (oklch2.l - oklch1.l) * t;
|
|
262
|
+
const c = oklch1.c + (oklch2.c - oklch1.c) * t;
|
|
263
|
+
const h = (h1 + (h2 - h1) * t) % 360;
|
|
264
|
+
const alpha = (oklch1.alpha ?? 1) + ((oklch2.alpha ?? 1) - (oklch1.alpha ?? 1)) * t;
|
|
265
|
+
interpolated = oklchToRgb({ l, c, h, alpha });
|
|
266
|
+
break;
|
|
267
|
+
}
|
|
268
|
+
case 'rgb':
|
|
269
|
+
default: {
|
|
270
|
+
const rgb1 = start.getRgbObject();
|
|
271
|
+
const rgb2 = end.getRgbObject();
|
|
272
|
+
interpolated = {
|
|
273
|
+
r: Math.round(rgb1.r + (rgb2.r - rgb1.r) * t),
|
|
274
|
+
g: Math.round(rgb1.g + (rgb2.g - rgb1.g) * t),
|
|
275
|
+
b: Math.round(rgb1.b + (rgb2.b - rgb1.b) * t),
|
|
276
|
+
a: (rgb1.a ?? 1) + ((rgb2.a ?? 1) - (rgb1.a ?? 1)) * t,
|
|
277
|
+
};
|
|
278
|
+
break;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
colors.push(new Color(interpolated));
|
|
282
|
+
}
|
|
283
|
+
return colors;
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Calculate perceptual brightness (0-1)
|
|
287
|
+
*/
|
|
288
|
+
export function getPerceivedBrightness(color) {
|
|
289
|
+
const colorObj = color instanceof Color ? color : new Color(color);
|
|
290
|
+
const rgb = colorObj.getRgbObject();
|
|
291
|
+
// Using W3C formula for perceived brightness
|
|
292
|
+
return (0.299 * rgb.r + 0.587 * rgb.g + 0.114 * rgb.b) / 255;
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Check if color is light (brightness > 0.5)
|
|
296
|
+
*/
|
|
297
|
+
export function isLight(color) {
|
|
298
|
+
return getPerceivedBrightness(color) > 0.5;
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Check if color is dark (brightness <= 0.5)
|
|
302
|
+
*/
|
|
303
|
+
export function isDark(color) {
|
|
304
|
+
return !isLight(color);
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Blend two colors using various blend modes
|
|
308
|
+
*/
|
|
309
|
+
export function blendColors(base, blend, mode = 'normal', opacity = 1) {
|
|
310
|
+
const baseColor = base instanceof Color ? base : new Color(base);
|
|
311
|
+
const blendColor = blend instanceof Color ? blend : new Color(blend);
|
|
312
|
+
const b = baseColor.getRgbObject();
|
|
313
|
+
const a = blendColor.getRgbObject();
|
|
314
|
+
const blendChannel = (base, blend) => {
|
|
315
|
+
const b = base / 255;
|
|
316
|
+
const a = blend / 255;
|
|
317
|
+
let result;
|
|
318
|
+
switch (mode) {
|
|
319
|
+
case 'multiply':
|
|
320
|
+
result = b * a;
|
|
321
|
+
break;
|
|
322
|
+
case 'screen':
|
|
323
|
+
result = 1 - (1 - b) * (1 - a);
|
|
324
|
+
break;
|
|
325
|
+
case 'overlay':
|
|
326
|
+
result = b < 0.5 ? 2 * b * a : 1 - 2 * (1 - b) * (1 - a);
|
|
327
|
+
break;
|
|
328
|
+
case 'normal':
|
|
329
|
+
default:
|
|
330
|
+
result = a * opacity + b * (1 - opacity);
|
|
331
|
+
break;
|
|
332
|
+
}
|
|
333
|
+
return Math.round(Math.max(0, Math.min(255, result * 255)));
|
|
334
|
+
};
|
|
335
|
+
return new Color([
|
|
336
|
+
blendChannel(b.r, a.r),
|
|
337
|
+
blendChannel(b.g, a.g),
|
|
338
|
+
blendChannel(b.b, a.b),
|
|
339
|
+
b.a || 1,
|
|
340
|
+
]);
|
|
341
|
+
}
|
|
342
|
+
/**
|
|
343
|
+
* Get dominant color component
|
|
344
|
+
*/
|
|
345
|
+
export function getDominantComponent(color) {
|
|
346
|
+
const colorObj = color instanceof Color ? color : new Color(color);
|
|
347
|
+
const rgb = colorObj.getRgbObject();
|
|
348
|
+
const max = Math.max(rgb.r, rgb.g, rgb.b);
|
|
349
|
+
const min = Math.min(rgb.r, rgb.g, rgb.b);
|
|
350
|
+
// Check if color is grayscale
|
|
351
|
+
if (max - min < 20) {
|
|
352
|
+
return 'gray';
|
|
353
|
+
}
|
|
354
|
+
if (rgb.r === max)
|
|
355
|
+
return 'red';
|
|
356
|
+
if (rgb.g === max)
|
|
357
|
+
return 'green';
|
|
358
|
+
return 'blue';
|
|
359
|
+
}
|
|
360
|
+
/**
|
|
361
|
+
* Get color name (basic approximation)
|
|
362
|
+
*/
|
|
363
|
+
export function getColorName(color) {
|
|
364
|
+
const colorObj = color instanceof Color ? color : new Color(color);
|
|
365
|
+
const hsl = rgbToHsl(colorObj.getRgbObject());
|
|
366
|
+
// Determine saturation level
|
|
367
|
+
if (hsl.s < 10) {
|
|
368
|
+
if (hsl.l > 90)
|
|
369
|
+
return 'white';
|
|
370
|
+
if (hsl.l < 10)
|
|
371
|
+
return 'black';
|
|
372
|
+
if (hsl.l > 60)
|
|
373
|
+
return 'light gray';
|
|
374
|
+
if (hsl.l < 40)
|
|
375
|
+
return 'dark gray';
|
|
376
|
+
return 'gray';
|
|
377
|
+
}
|
|
378
|
+
// Determine hue
|
|
379
|
+
const h = hsl.h;
|
|
380
|
+
let hueName;
|
|
381
|
+
if (h < 15 || h >= 345)
|
|
382
|
+
hueName = 'red';
|
|
383
|
+
else if (h < 45)
|
|
384
|
+
hueName = 'orange';
|
|
385
|
+
else if (h < 75)
|
|
386
|
+
hueName = 'yellow';
|
|
387
|
+
else if (h < 165)
|
|
388
|
+
hueName = 'green';
|
|
389
|
+
else if (h < 255)
|
|
390
|
+
hueName = 'blue';
|
|
391
|
+
else if (h < 285)
|
|
392
|
+
hueName = 'purple';
|
|
393
|
+
else if (h < 315)
|
|
394
|
+
hueName = 'magenta';
|
|
395
|
+
else
|
|
396
|
+
hueName = 'pink';
|
|
397
|
+
// Add lightness modifier
|
|
398
|
+
if (hsl.l < 30)
|
|
399
|
+
return `dark ${hueName}`;
|
|
400
|
+
if (hsl.l > 70)
|
|
401
|
+
return `light ${hueName}`;
|
|
402
|
+
// Add saturation modifier
|
|
403
|
+
if (hsl.s < 30)
|
|
404
|
+
return `dull ${hueName}`;
|
|
405
|
+
if (hsl.s > 70)
|
|
406
|
+
return `vivid ${hueName}`;
|
|
407
|
+
return hueName;
|
|
408
|
+
}
|
|
409
|
+
/**
|
|
410
|
+
* Random color generator with constraints
|
|
411
|
+
*/
|
|
412
|
+
export function randomColor(options = {}) {
|
|
413
|
+
const { hue = [0, 360], saturation = [0, 100], lightness = [0, 100], alpha = 1, } = options;
|
|
414
|
+
const h = hue[0] + Math.random() * (hue[1] - hue[0]);
|
|
415
|
+
const s = saturation[0] + Math.random() * (saturation[1] - saturation[0]);
|
|
416
|
+
const l = lightness[0] + Math.random() * (lightness[1] - lightness[0]);
|
|
417
|
+
const rgb = hslToRgb({ h, s, l, a: alpha });
|
|
418
|
+
return new Color(rgb);
|
|
419
|
+
}
|