@oscarpalmer/atoms 0.191.0 → 0.192.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/dist/beacon.d.mts +6 -44
- package/dist/beacon.mjs +20 -67
- package/dist/color/constants.d.mts +82 -41
- package/dist/color/constants.mjs +102 -63
- package/dist/color/instance.mjs +36 -13
- package/dist/color/misc/alpha.mjs +9 -10
- package/dist/color/misc/format.mjs +4 -4
- package/dist/color/misc/get.mjs +18 -18
- package/dist/color/misc/is.mjs +22 -21
- package/dist/color/misc/state.d.mts +6 -5
- package/dist/color/misc/state.mjs +31 -26
- package/dist/color/models.d.mts +78 -1
- package/dist/color/space/hex.mjs +12 -12
- package/dist/color/space/hsl.mjs +16 -16
- package/dist/color/space/hwb.mjs +10 -10
- package/dist/color/space/rgb.mjs +16 -16
- package/dist/herald.d.mts +2 -3
- package/dist/index.d.mts +117 -45
- package/dist/index.mjs +522 -360
- package/dist/internal/subscription.d.mts +52 -0
- package/dist/internal/subscription.mjs +127 -0
- package/dist/models.d.mts +5 -1
- package/package.json +1 -1
- package/src/beacon.ts +32 -117
- package/src/color/constants.ts +115 -78
- package/src/color/instance.ts +65 -12
- package/src/color/misc/alpha.ts +13 -21
- package/src/color/misc/format.ts +4 -4
- package/src/color/misc/get.ts +23 -40
- package/src/color/misc/is.ts +29 -39
- package/src/color/misc/state.ts +77 -41
- package/src/color/models.ts +94 -1
- package/src/color/space/hex.ts +18 -23
- package/src/color/space/hsl.ts +16 -24
- package/src/color/space/hwb.ts +10 -10
- package/src/color/space/rgb.ts +19 -16
- package/src/herald.ts +1 -3
- package/src/index.ts +1 -0
- package/src/internal/subscription.ts +264 -0
- package/src/models.ts +5 -0
- package/src/string/fuzzy.ts +1 -1
- package/src/value/freeze.ts +2 -2
- package/src/value/shake.ts +1 -1
- package/src/value/transform.ts +1 -1
package/src/color/instance.ts
CHANGED
|
@@ -1,4 +1,12 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
clearSubscriptions,
|
|
3
|
+
getSubscription,
|
|
4
|
+
getSubscriptions,
|
|
5
|
+
type Subscription,
|
|
6
|
+
type SubscriptionProperty,
|
|
7
|
+
type Subscriptions,
|
|
8
|
+
} from '../internal/subscription';
|
|
9
|
+
import {COLOR_PROPERTY, COLOR_TYPE} from './constants';
|
|
2
10
|
import {getAlpha} from './misc/alpha';
|
|
3
11
|
import {formatHslColor, formatHwbColor, formatRgbColor} from './misc/format';
|
|
4
12
|
import {
|
|
@@ -13,7 +21,13 @@ import type {Color, ColorState, ColorType} from './models';
|
|
|
13
21
|
|
|
14
22
|
// #region Types
|
|
15
23
|
|
|
16
|
-
type SetValue = (
|
|
24
|
+
type SetValue = (
|
|
25
|
+
color: Color,
|
|
26
|
+
state: ColorState,
|
|
27
|
+
subscriptions: Subscriptions<Function>,
|
|
28
|
+
value: any,
|
|
29
|
+
alpha: boolean,
|
|
30
|
+
) => void;
|
|
17
31
|
|
|
18
32
|
type SetValues = Record<ColorType, SetValue>;
|
|
19
33
|
|
|
@@ -24,17 +38,22 @@ type SetValues = Record<ColorType, SetValue>;
|
|
|
24
38
|
export function color(value: unknown): Color {
|
|
25
39
|
const state = getColorState(value);
|
|
26
40
|
|
|
41
|
+
const subscriptions = getSubscriptions<Function>(COLOR_TYPE.all);
|
|
42
|
+
|
|
27
43
|
const instance = {
|
|
44
|
+
subscribe: (first?: unknown, second?: unknown) =>
|
|
45
|
+
subscribeToColor(subscriptions, first, second),
|
|
28
46
|
toHexString: (alpha?: boolean) =>
|
|
29
47
|
`#${alpha === true ? (instance as Color).hexa : (instance as Color).hex}`,
|
|
30
48
|
toHslString: (alpha?: boolean) => formatHslColor(state, alpha),
|
|
31
49
|
toHwbString: (alpha?: boolean) => formatHwbColor(state, alpha),
|
|
32
50
|
toRgbString: (alpha?: boolean) => formatRgbColor(state, alpha),
|
|
33
51
|
toString: () => (instance as Color).toHexString(),
|
|
52
|
+
unsubscribe: () => clearSubscriptions(subscriptions),
|
|
34
53
|
};
|
|
35
54
|
|
|
36
55
|
Object.defineProperties(instance, {
|
|
37
|
-
[
|
|
56
|
+
[COLOR_PROPERTY.name]: {
|
|
38
57
|
enumerable: false,
|
|
39
58
|
value: true,
|
|
40
59
|
},
|
|
@@ -43,18 +62,18 @@ export function color(value: unknown): Color {
|
|
|
43
62
|
get: () => state.alpha.value,
|
|
44
63
|
set: (value: unknown) => setAlphaValue(state, value),
|
|
45
64
|
},
|
|
46
|
-
hex: getProperty(
|
|
47
|
-
hexa: getProperty(
|
|
48
|
-
hsl: getProperty(
|
|
49
|
-
hsla: getProperty(
|
|
50
|
-
hwb: getProperty(
|
|
51
|
-
hwba: getProperty(
|
|
65
|
+
hex: getProperty(COLOR_TYPE.hex, instance as Color, state, subscriptions, false),
|
|
66
|
+
hexa: getProperty(COLOR_TYPE.hex, instance as Color, state, subscriptions, true),
|
|
67
|
+
hsl: getProperty(COLOR_TYPE.hsl, instance as Color, state, subscriptions, false),
|
|
68
|
+
hsla: getProperty(COLOR_TYPE.hsl, instance as Color, state, subscriptions, true),
|
|
69
|
+
hwb: getProperty(COLOR_TYPE.hwb, instance as Color, state, subscriptions, false),
|
|
70
|
+
hwba: getProperty(COLOR_TYPE.hwb, instance as Color, state, subscriptions, true),
|
|
52
71
|
origin: {
|
|
53
72
|
enumerable: true,
|
|
54
73
|
get: () => state.origin,
|
|
55
74
|
},
|
|
56
|
-
rgb: getProperty(
|
|
57
|
-
rgba: getProperty(
|
|
75
|
+
rgb: getProperty(COLOR_TYPE.rgb, instance as Color, state, subscriptions, false),
|
|
76
|
+
rgba: getProperty(COLOR_TYPE.rgb, instance as Color, state, subscriptions, true),
|
|
58
77
|
});
|
|
59
78
|
|
|
60
79
|
return Object.freeze(instance) as Color;
|
|
@@ -62,7 +81,9 @@ export function color(value: unknown): Color {
|
|
|
62
81
|
|
|
63
82
|
function getProperty(
|
|
64
83
|
space: keyof typeof setters,
|
|
84
|
+
color: Color,
|
|
65
85
|
state: ColorState,
|
|
86
|
+
subscriptions: Subscriptions<Function>,
|
|
66
87
|
alpha: boolean,
|
|
67
88
|
): PropertyDescriptor {
|
|
68
89
|
const setValue = setters[space];
|
|
@@ -70,7 +91,7 @@ function getProperty(
|
|
|
70
91
|
return {
|
|
71
92
|
enumerable: true,
|
|
72
93
|
get: () => getValue(space, state, alpha),
|
|
73
|
-
set: (value: unknown) => setValue(state, value, alpha),
|
|
94
|
+
set: (value: unknown) => setValue(color, state, subscriptions, value, alpha),
|
|
74
95
|
};
|
|
75
96
|
}
|
|
76
97
|
|
|
@@ -95,10 +116,42 @@ function setAlphaValue(state: ColorState, value: unknown): void {
|
|
|
95
116
|
}
|
|
96
117
|
}
|
|
97
118
|
|
|
119
|
+
function subscribeToColor(
|
|
120
|
+
subscriptions: Subscriptions,
|
|
121
|
+
first: unknown,
|
|
122
|
+
second?: unknown,
|
|
123
|
+
): Subscription {
|
|
124
|
+
let key: string | undefined;
|
|
125
|
+
let value: Function | undefined;
|
|
126
|
+
|
|
127
|
+
if (typeof first === 'string') {
|
|
128
|
+
key = first;
|
|
129
|
+
value = second as Function;
|
|
130
|
+
} else if (typeof first === 'function') {
|
|
131
|
+
value = first;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
if (typeof value !== 'function') {
|
|
135
|
+
throw new Error();
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
return getSubscription({
|
|
139
|
+
key,
|
|
140
|
+
subscriptions,
|
|
141
|
+
value,
|
|
142
|
+
property: colorSubscription,
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
|
|
98
146
|
// #endregion
|
|
99
147
|
|
|
100
148
|
// #region Variables
|
|
101
149
|
|
|
150
|
+
const colorSubscription: SubscriptionProperty = {
|
|
151
|
+
key: COLOR_PROPERTY.name,
|
|
152
|
+
value: COLOR_PROPERTY.subscription,
|
|
153
|
+
};
|
|
154
|
+
|
|
102
155
|
const setters: SetValues = {
|
|
103
156
|
hex: setHexColor,
|
|
104
157
|
hsl: setHSLColor,
|
package/src/color/misc/alpha.ts
CHANGED
|
@@ -1,14 +1,6 @@
|
|
|
1
|
-
import {clamp} from '../..';
|
|
2
1
|
import {round} from '../../internal/math/misc';
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
ALPHA_NONE_HEX,
|
|
6
|
-
ALPHA_NONE_VALUE,
|
|
7
|
-
DEFAULT_ALPHA,
|
|
8
|
-
EXPRESSION_ALPHA_HEX,
|
|
9
|
-
MAX_HEX,
|
|
10
|
-
MAX_PERCENT,
|
|
11
|
-
} from '../constants';
|
|
2
|
+
import {clamp} from '../../internal/number';
|
|
3
|
+
import {COLOR_ALPHA, COLOR_DEFAULTS, COLOR_EXPRESSION, COLOR_MAX} from '../constants';
|
|
12
4
|
import type {Alpha} from '../models';
|
|
13
5
|
|
|
14
6
|
// #region Functions
|
|
@@ -18,14 +10,14 @@ export function getAlpha(value: unknown, hex: boolean): Alpha {
|
|
|
18
10
|
return getAlphaFromValue(value);
|
|
19
11
|
}
|
|
20
12
|
|
|
21
|
-
if (typeof value !== 'string' || value.toLowerCase() ===
|
|
22
|
-
return {...
|
|
13
|
+
if (typeof value !== 'string' || value.toLowerCase() === COLOR_ALPHA.fullHexLong) {
|
|
14
|
+
return {...COLOR_DEFAULTS.alpha};
|
|
23
15
|
}
|
|
24
16
|
|
|
25
|
-
if (hex &&
|
|
17
|
+
if (hex && COLOR_EXPRESSION.alphaHex.test(value)) {
|
|
26
18
|
return {
|
|
27
19
|
hex: value,
|
|
28
|
-
value: Number.parseInt(value, 16) /
|
|
20
|
+
value: Number.parseInt(value, 16) / COLOR_MAX.hex,
|
|
29
21
|
};
|
|
30
22
|
}
|
|
31
23
|
|
|
@@ -33,15 +25,15 @@ export function getAlpha(value: unknown, hex: boolean): Alpha {
|
|
|
33
25
|
}
|
|
34
26
|
|
|
35
27
|
export function getAlphaHexadecimal(value: number): string {
|
|
36
|
-
if (value ===
|
|
37
|
-
return
|
|
28
|
+
if (value === COLOR_ALPHA.noneValue) {
|
|
29
|
+
return COLOR_ALPHA.noneHex;
|
|
38
30
|
}
|
|
39
31
|
|
|
40
|
-
if (value ===
|
|
41
|
-
return
|
|
32
|
+
if (value === COLOR_MAX.percent) {
|
|
33
|
+
return COLOR_ALPHA.fullHexLong;
|
|
42
34
|
}
|
|
43
35
|
|
|
44
|
-
return round((value /
|
|
36
|
+
return round((value / COLOR_MAX.percent) * COLOR_MAX.hex).toString(16);
|
|
45
37
|
}
|
|
46
38
|
|
|
47
39
|
function getAlphaFromValue(value: number): Alpha {
|
|
@@ -55,10 +47,10 @@ function getAlphaFromValue(value: number): Alpha {
|
|
|
55
47
|
|
|
56
48
|
export function getAlphaValue(original: number): number {
|
|
57
49
|
if (Number.isNaN(original)) {
|
|
58
|
-
return
|
|
50
|
+
return COLOR_MAX.percent;
|
|
59
51
|
}
|
|
60
52
|
|
|
61
|
-
return clamp(original,
|
|
53
|
+
return clamp(original, COLOR_ALPHA.noneValue, COLOR_MAX.percent);
|
|
62
54
|
}
|
|
63
55
|
|
|
64
56
|
// #endregion
|
package/src/color/misc/format.ts
CHANGED
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {COLOR_TYPE} from '../constants';
|
|
2
2
|
import type {ColorState} from '../models';
|
|
3
3
|
import {getColorFromState} from './state';
|
|
4
4
|
|
|
5
5
|
// #region Functions
|
|
6
6
|
|
|
7
7
|
export function formatHslColor(state: ColorState, alpha?: boolean): string {
|
|
8
|
-
const {hue, lightness, saturation} = getColorFromState(state,
|
|
8
|
+
const {hue, lightness, saturation} = getColorFromState(state, COLOR_TYPE.hsl);
|
|
9
9
|
|
|
10
10
|
return `hsl(${hue}deg ${saturation}% ${lightness}%${getSuffix(state, alpha)})`;
|
|
11
11
|
}
|
|
12
12
|
|
|
13
13
|
export function formatHwbColor(state: ColorState, alpha?: boolean): string {
|
|
14
|
-
const {blackness, hue, whiteness} = getColorFromState(state,
|
|
14
|
+
const {blackness, hue, whiteness} = getColorFromState(state, COLOR_TYPE.hwb);
|
|
15
15
|
|
|
16
16
|
return `hwb(${hue}deg ${whiteness}% ${blackness}%${getSuffix(state, alpha)})`;
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
export function formatRgbColor(state: ColorState, alpha?: boolean): string {
|
|
20
|
-
const {blue, green, red} = getColorFromState(state,
|
|
20
|
+
const {blue, green, red} = getColorFromState(state, COLOR_TYPE.rgb);
|
|
21
21
|
|
|
22
22
|
return `rgb(${red} ${green} ${blue}${getSuffix(state, alpha)})`;
|
|
23
23
|
}
|
package/src/color/misc/get.ts
CHANGED
|
@@ -1,25 +1,6 @@
|
|
|
1
1
|
import {round} from '../../internal/math/misc';
|
|
2
|
-
import {clamp} from '../../number';
|
|
3
|
-
import {
|
|
4
|
-
HEX_BLACK,
|
|
5
|
-
HEX_WHITE,
|
|
6
|
-
MAX_DEGREE,
|
|
7
|
-
MAX_HEX,
|
|
8
|
-
MAX_PERCENT,
|
|
9
|
-
SRGB_LUMINANCE_BLUE,
|
|
10
|
-
SRGB_LUMINANCE_EXPONENT,
|
|
11
|
-
SRGB_LUMINANCE_GREEN,
|
|
12
|
-
SRGB_LUMINANCE_MINIMUM,
|
|
13
|
-
SRGB_LUMINANCE_MODIFIER,
|
|
14
|
-
SRGB_LUMINANCE_MULTIPLIER,
|
|
15
|
-
SRGB_LUMINANCE_OFFSET,
|
|
16
|
-
SRGB_LUMINANCE_RED,
|
|
17
|
-
SRGB_LUMINANCE_THRESHOLD,
|
|
18
|
-
TYPE_HEX,
|
|
19
|
-
TYPE_HSL,
|
|
20
|
-
TYPE_HWB,
|
|
21
|
-
TYPE_RGB,
|
|
22
|
-
} from '../constants';
|
|
2
|
+
import {clamp} from '../../internal/number';
|
|
3
|
+
import {COLOR_DEFAULTS, COLOR_MAX, COLOR_SRGB, COLOR_TYPE} from '../constants';
|
|
23
4
|
import {color} from '../instance';
|
|
24
5
|
import type {Color, HSLAColor, HSLColor, HWBAColor, HWBColor, RGBAColor, RGBColor} from '../models';
|
|
25
6
|
import {getColorFromState, getColorState} from './state';
|
|
@@ -60,30 +41,32 @@ export function getForegroundColor(value: unknown, hex: true): string;
|
|
|
60
41
|
export function getForegroundColor(value: unknown): Color;
|
|
61
42
|
|
|
62
43
|
export function getForegroundColor(value: unknown, hex?: unknown): string | Color {
|
|
63
|
-
const rgb = getColorFromState(getColorState(value),
|
|
44
|
+
const rgb = getColorFromState(getColorState(value), COLOR_TYPE.rgb);
|
|
64
45
|
const {blue, green, red} = rgb;
|
|
65
46
|
|
|
66
|
-
const values = [blue /
|
|
47
|
+
const values = [blue / COLOR_MAX.hex, green / COLOR_MAX.hex, red / COLOR_MAX.hex];
|
|
67
48
|
const {length} = values;
|
|
68
49
|
|
|
69
50
|
for (let index = 0; index < length; index += 1) {
|
|
70
51
|
const color = values[index];
|
|
71
52
|
|
|
72
|
-
if (color <=
|
|
73
|
-
values[index] /=
|
|
53
|
+
if (color <= COLOR_SRGB.luminanceMinimum) {
|
|
54
|
+
values[index] /= COLOR_SRGB.luminanceMultiplier;
|
|
74
55
|
} else {
|
|
75
56
|
values[index] =
|
|
76
|
-
((color +
|
|
57
|
+
((color + COLOR_SRGB.luminanceOffset) / COLOR_SRGB.luminanceModifier) **
|
|
58
|
+
COLOR_SRGB.luminanceExponent;
|
|
77
59
|
}
|
|
78
60
|
}
|
|
79
61
|
|
|
80
62
|
const luminance =
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
63
|
+
COLOR_SRGB.luminanceRed * values[2] +
|
|
64
|
+
COLOR_SRGB.luminanceGreen * values[1] +
|
|
65
|
+
COLOR_SRGB.luminanceBlue * values[0];
|
|
84
66
|
|
|
85
67
|
// Rudimentary and ureliable?; implement APCA for more reliable results?
|
|
86
|
-
const foreground =
|
|
68
|
+
const foreground =
|
|
69
|
+
luminance > COLOR_SRGB.luminanceThreshold ? COLOR_DEFAULTS.hexBlack : COLOR_DEFAULTS.hexWhite;
|
|
87
70
|
|
|
88
71
|
return hex === true ? foreground : color(foreground);
|
|
89
72
|
}
|
|
@@ -113,15 +96,15 @@ export function getHexaColor(value: unknown): string {
|
|
|
113
96
|
* @returns Hex color string
|
|
114
97
|
*/
|
|
115
98
|
export function getHexColor(value: unknown): string {
|
|
116
|
-
return getColorFromState(getColorState(value),
|
|
99
|
+
return getColorFromState(getColorState(value), COLOR_TYPE.hex);
|
|
117
100
|
}
|
|
118
101
|
|
|
119
102
|
export function getHexValue(value: unknown): number {
|
|
120
|
-
return getClampedValue(value, 0,
|
|
103
|
+
return getClampedValue(value, 0, COLOR_MAX.hex, true);
|
|
121
104
|
}
|
|
122
105
|
|
|
123
106
|
export function getDegrees(value: unknown): number {
|
|
124
|
-
return getClampedValue(value, 0,
|
|
107
|
+
return getClampedValue(value, 0, COLOR_MAX.degree);
|
|
125
108
|
}
|
|
126
109
|
|
|
127
110
|
/**
|
|
@@ -135,7 +118,7 @@ export function getDegrees(value: unknown): number {
|
|
|
135
118
|
*/
|
|
136
119
|
export function getHslaColor(value: unknown): HSLAColor {
|
|
137
120
|
const state = getColorState(value);
|
|
138
|
-
const hsl = getColorFromState(state,
|
|
121
|
+
const hsl = getColorFromState(state, COLOR_TYPE.hsl);
|
|
139
122
|
|
|
140
123
|
return {
|
|
141
124
|
...hsl,
|
|
@@ -153,7 +136,7 @@ export function getHslaColor(value: unknown): HSLAColor {
|
|
|
153
136
|
* @returns _HWB_ color
|
|
154
137
|
*/
|
|
155
138
|
export function getHwbColor(value: unknown): HWBColor {
|
|
156
|
-
return getColorFromState(getColorState(value),
|
|
139
|
+
return getColorFromState(getColorState(value), COLOR_TYPE.hwb);
|
|
157
140
|
}
|
|
158
141
|
|
|
159
142
|
/**
|
|
@@ -167,7 +150,7 @@ export function getHwbColor(value: unknown): HWBColor {
|
|
|
167
150
|
*/
|
|
168
151
|
export function getHwbaColor(value: unknown): HWBAColor {
|
|
169
152
|
const state = getColorState(value);
|
|
170
|
-
const hwb = getColorFromState(state,
|
|
153
|
+
const hwb = getColorFromState(state, COLOR_TYPE.hwb);
|
|
171
154
|
|
|
172
155
|
return {
|
|
173
156
|
...hwb,
|
|
@@ -185,11 +168,11 @@ export function getHwbaColor(value: unknown): HWBAColor {
|
|
|
185
168
|
* @returns _HSL_ color
|
|
186
169
|
*/
|
|
187
170
|
export function getHslColor(value: unknown): HSLColor {
|
|
188
|
-
return getColorFromState(getColorState(value),
|
|
171
|
+
return getColorFromState(getColorState(value), COLOR_TYPE.hsl);
|
|
189
172
|
}
|
|
190
173
|
|
|
191
174
|
export function getPercentage(value: unknown): number {
|
|
192
|
-
return getClampedValue(value, 0,
|
|
175
|
+
return getClampedValue(value, 0, COLOR_MAX.percent);
|
|
193
176
|
}
|
|
194
177
|
|
|
195
178
|
/**
|
|
@@ -203,7 +186,7 @@ export function getPercentage(value: unknown): number {
|
|
|
203
186
|
*/
|
|
204
187
|
export function getRgbaColor(value: unknown): RGBAColor {
|
|
205
188
|
const state = getColorState(value);
|
|
206
|
-
const rgb = getColorFromState(state,
|
|
189
|
+
const rgb = getColorFromState(state, COLOR_TYPE.rgb);
|
|
207
190
|
|
|
208
191
|
return {
|
|
209
192
|
...rgb,
|
|
@@ -221,7 +204,7 @@ export function getRgbaColor(value: unknown): RGBAColor {
|
|
|
221
204
|
* @returns _RGB_ color
|
|
222
205
|
*/
|
|
223
206
|
export function getRgbColor(value: unknown): RGBColor {
|
|
224
|
-
return getColorFromState(getColorState(value),
|
|
207
|
+
return getColorFromState(getColorState(value), COLOR_TYPE.rgb);
|
|
225
208
|
}
|
|
226
209
|
|
|
227
210
|
// #endregion
|
package/src/color/misc/is.ts
CHANGED
|
@@ -1,22 +1,13 @@
|
|
|
1
|
+
import {isPlainObject} from '../../internal/is';
|
|
1
2
|
import {between} from '../../internal/number';
|
|
2
3
|
import type {PlainObject} from '../../models';
|
|
3
4
|
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
KEYS_HWB,
|
|
11
|
-
KEYS_HWBA,
|
|
12
|
-
KEYS_RGB,
|
|
13
|
-
KEYS_RGBA,
|
|
14
|
-
LENGTH_LONG,
|
|
15
|
-
LENGTH_SHORT,
|
|
16
|
-
MAX_DEGREE,
|
|
17
|
-
MAX_HEX,
|
|
18
|
-
MAX_PERCENT,
|
|
19
|
-
PROPERTY_COLOR,
|
|
5
|
+
COLOR_ALPHA,
|
|
6
|
+
COLOR_EXPRESSION,
|
|
7
|
+
COLOR_KEYS,
|
|
8
|
+
COLOR_LENGTHS,
|
|
9
|
+
COLOR_MAX,
|
|
10
|
+
COLOR_PROPERTY,
|
|
20
11
|
} from '../constants';
|
|
21
12
|
import type {Color} from '../index';
|
|
22
13
|
import type {
|
|
@@ -36,11 +27,11 @@ function hasKeys(value: unknown, keys: ColorProperty[]): boolean {
|
|
|
36
27
|
}
|
|
37
28
|
|
|
38
29
|
function isAlpha(value: unknown): value is number {
|
|
39
|
-
return typeof value === 'number' && between(value,
|
|
30
|
+
return typeof value === 'number' && between(value, COLOR_ALPHA.noneValue, COLOR_MAX.percent);
|
|
40
31
|
}
|
|
41
32
|
|
|
42
33
|
function isBytey(value: unknown): value is number {
|
|
43
|
-
return typeof value === 'number' && between(value, 0,
|
|
34
|
+
return typeof value === 'number' && between(value, 0, COLOR_MAX.hex);
|
|
44
35
|
}
|
|
45
36
|
|
|
46
37
|
/**
|
|
@@ -51,10 +42,7 @@ function isBytey(value: unknown): value is number {
|
|
|
51
42
|
*/
|
|
52
43
|
export function isColor(value: unknown): value is Color {
|
|
53
44
|
return (
|
|
54
|
-
|
|
55
|
-
value !== null &&
|
|
56
|
-
PROPERTY_COLOR in value &&
|
|
57
|
-
value[PROPERTY_COLOR] === true
|
|
45
|
+
isPlainObject(value) && COLOR_PROPERTY.name in value && value[COLOR_PROPERTY.name] === true
|
|
58
46
|
);
|
|
59
47
|
}
|
|
60
48
|
|
|
@@ -87,7 +75,7 @@ function isColorValue(obj: unknown, properties: ColorProperty[]): boolean {
|
|
|
87
75
|
}
|
|
88
76
|
|
|
89
77
|
function isDegree(value: unknown): value is number {
|
|
90
|
-
return typeof value === 'number' && between(value, 0,
|
|
78
|
+
return typeof value === 'number' && between(value, 0, COLOR_MAX.degree);
|
|
91
79
|
}
|
|
92
80
|
|
|
93
81
|
/**
|
|
@@ -111,14 +99,16 @@ export function isHexColor(value: unknown, alpha?: boolean): value is string {
|
|
|
111
99
|
return false;
|
|
112
100
|
}
|
|
113
101
|
|
|
114
|
-
if (!(
|
|
102
|
+
if (!(COLOR_EXPRESSION.hexShort.test(value) || COLOR_EXPRESSION.hexLong.test(value))) {
|
|
115
103
|
return false;
|
|
116
104
|
}
|
|
117
105
|
|
|
118
106
|
if (alpha === false) {
|
|
119
|
-
const unprefixed = value.replace(
|
|
107
|
+
const unprefixed = value.replace(COLOR_EXPRESSION.prefix, '');
|
|
120
108
|
|
|
121
|
-
return
|
|
109
|
+
return (
|
|
110
|
+
unprefixed.length === COLOR_LENGTHS.hexShort || unprefixed.length === COLOR_LENGTHS.hexLong
|
|
111
|
+
);
|
|
122
112
|
}
|
|
123
113
|
|
|
124
114
|
return true;
|
|
@@ -131,11 +121,11 @@ export function isHexColor(value: unknown, alpha?: boolean): value is string {
|
|
|
131
121
|
* @returns `true` if the value is an _HSLA_ color, otherwise `false`
|
|
132
122
|
*/
|
|
133
123
|
export function isHslaColor(value: unknown): value is HSLAColor {
|
|
134
|
-
return isColorValue(value,
|
|
124
|
+
return isColorValue(value, COLOR_KEYS.hsla);
|
|
135
125
|
}
|
|
136
126
|
|
|
137
127
|
export function isHslaLike(value: unknown): value is Record<keyof HSLAColor, unknown> {
|
|
138
|
-
return hasKeys(value,
|
|
128
|
+
return hasKeys(value, COLOR_KEYS.hsla);
|
|
139
129
|
}
|
|
140
130
|
|
|
141
131
|
/**
|
|
@@ -145,11 +135,11 @@ export function isHslaLike(value: unknown): value is Record<keyof HSLAColor, unk
|
|
|
145
135
|
* @returns `true` if the value is an _HSL_ color, otherwise `false`
|
|
146
136
|
*/
|
|
147
137
|
export function isHslColor(value: unknown): value is HSLColor {
|
|
148
|
-
return isColorValue(value,
|
|
138
|
+
return isColorValue(value, COLOR_KEYS.hsla) || isColorValue(value, COLOR_KEYS.hsl);
|
|
149
139
|
}
|
|
150
140
|
|
|
151
141
|
export function isHslLike(value: unknown): value is Record<keyof HSLColor, unknown> {
|
|
152
|
-
return hasKeys(value,
|
|
142
|
+
return hasKeys(value, COLOR_KEYS.hsl);
|
|
153
143
|
}
|
|
154
144
|
|
|
155
145
|
/**
|
|
@@ -159,11 +149,11 @@ export function isHslLike(value: unknown): value is Record<keyof HSLColor, unkno
|
|
|
159
149
|
* @returns `true` if the value is an _HWBA_ color, otherwise `false`
|
|
160
150
|
*/
|
|
161
151
|
export function isHwbaColor(value: unknown): value is HWBAColor {
|
|
162
|
-
return isColorValue(value,
|
|
152
|
+
return isColorValue(value, COLOR_KEYS.hwba);
|
|
163
153
|
}
|
|
164
154
|
|
|
165
155
|
export function isHwbaLike(value: unknown): value is Record<keyof HWBAColor, unknown> {
|
|
166
|
-
return hasKeys(value,
|
|
156
|
+
return hasKeys(value, COLOR_KEYS.hwba);
|
|
167
157
|
}
|
|
168
158
|
|
|
169
159
|
/**
|
|
@@ -173,11 +163,11 @@ export function isHwbaLike(value: unknown): value is Record<keyof HWBAColor, unk
|
|
|
173
163
|
* @returns `true` if the value is an _HWB_ color, otherwise `false`
|
|
174
164
|
*/
|
|
175
165
|
export function isHwbColor(value: unknown): value is HWBColor {
|
|
176
|
-
return isColorValue(value,
|
|
166
|
+
return isColorValue(value, COLOR_KEYS.hwb) || isColorValue(value, COLOR_KEYS.hwba);
|
|
177
167
|
}
|
|
178
168
|
|
|
179
169
|
export function isHwbLike(value: unknown): value is Record<keyof HWBColor, unknown> {
|
|
180
|
-
return hasKeys(value,
|
|
170
|
+
return hasKeys(value, COLOR_KEYS.hwb);
|
|
181
171
|
}
|
|
182
172
|
|
|
183
173
|
/**
|
|
@@ -187,11 +177,11 @@ export function isHwbLike(value: unknown): value is Record<keyof HWBColor, unkno
|
|
|
187
177
|
* @returns `true` if the value is an _RGBA_ color, otherwise `false`
|
|
188
178
|
*/
|
|
189
179
|
export function isRgbaColor(value: unknown): value is RGBAColor {
|
|
190
|
-
return isColorValue(value,
|
|
180
|
+
return isColorValue(value, COLOR_KEYS.rgba);
|
|
191
181
|
}
|
|
192
182
|
|
|
193
183
|
export function isRgbaLike(value: unknown): value is Record<keyof RGBAColor, unknown> {
|
|
194
|
-
return hasKeys(value,
|
|
184
|
+
return hasKeys(value, COLOR_KEYS.rgba);
|
|
195
185
|
}
|
|
196
186
|
|
|
197
187
|
/**
|
|
@@ -201,15 +191,15 @@ export function isRgbaLike(value: unknown): value is Record<keyof RGBAColor, unk
|
|
|
201
191
|
* @returns `true` if the value is an _RGB_ color, otherwise `false`
|
|
202
192
|
*/
|
|
203
193
|
export function isRgbColor(value: unknown): value is RGBColor {
|
|
204
|
-
return isColorValue(value,
|
|
194
|
+
return isColorValue(value, COLOR_KEYS.rgba) || isColorValue(value, COLOR_KEYS.rgb);
|
|
205
195
|
}
|
|
206
196
|
|
|
207
197
|
export function isRgbLike(value: unknown): value is Record<keyof RGBColor, unknown> {
|
|
208
|
-
return hasKeys(value,
|
|
198
|
+
return hasKeys(value, COLOR_KEYS.rgb);
|
|
209
199
|
}
|
|
210
200
|
|
|
211
201
|
function isPercentage(value: unknown): value is number {
|
|
212
|
-
return typeof value === 'number' && between(value, 0,
|
|
202
|
+
return typeof value === 'number' && between(value, 0, COLOR_MAX.percent);
|
|
213
203
|
}
|
|
214
204
|
|
|
215
205
|
// #endregion
|