@oscarpalmer/atoms 0.190.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.
Files changed (57) hide show
  1. package/dist/beacon.d.mts +6 -44
  2. package/dist/beacon.mjs +20 -67
  3. package/dist/color/constants.d.mts +82 -35
  4. package/dist/color/constants.mjs +106 -61
  5. package/dist/color/index.d.mts +3 -3
  6. package/dist/color/index.mjs +2 -2
  7. package/dist/color/instance.mjs +60 -35
  8. package/dist/color/misc/alpha.d.mts +1 -1
  9. package/dist/color/misc/alpha.mjs +12 -10
  10. package/dist/color/misc/format.d.mts +7 -0
  11. package/dist/color/misc/format.mjs +20 -0
  12. package/dist/color/misc/get.mjs +25 -25
  13. package/dist/color/misc/is.d.mts +0 -36
  14. package/dist/color/misc/is.mjs +22 -57
  15. package/dist/color/misc/state.d.mts +8 -6
  16. package/dist/color/misc/state.mjs +79 -88
  17. package/dist/color/models.d.mts +106 -6
  18. package/dist/color/space/hex.d.mts +3 -2
  19. package/dist/color/space/hex.mjs +22 -10
  20. package/dist/color/space/hsl.d.mts +3 -2
  21. package/dist/color/space/hsl.mjs +26 -14
  22. package/dist/color/space/hwb.d.mts +3 -2
  23. package/dist/color/space/hwb.mjs +20 -8
  24. package/dist/color/space/rgb.d.mts +3 -2
  25. package/dist/color/space/rgb.mjs +27 -15
  26. package/dist/herald.d.mts +2 -3
  27. package/dist/index.d.mts +139 -73
  28. package/dist/index.mjs +653 -477
  29. package/dist/internal/subscription.d.mts +52 -0
  30. package/dist/internal/subscription.mjs +127 -0
  31. package/dist/models.d.mts +5 -1
  32. package/package.json +4 -4
  33. package/src/beacon.ts +32 -117
  34. package/src/color/constants.ts +115 -66
  35. package/src/color/index.ts +26 -8
  36. package/src/color/instance.ts +113 -45
  37. package/src/color/misc/alpha.ts +18 -20
  38. package/src/color/misc/format.ts +29 -0
  39. package/src/color/misc/get.ts +31 -41
  40. package/src/color/misc/is.ts +31 -71
  41. package/src/color/misc/state.ts +165 -141
  42. package/src/color/models.ts +126 -5
  43. package/src/color/space/hex.ts +46 -18
  44. package/src/color/space/hsl.ts +44 -14
  45. package/src/color/space/hwb.ts +38 -8
  46. package/src/color/space/rgb.ts +48 -15
  47. package/src/herald.ts +1 -3
  48. package/src/index.ts +1 -0
  49. package/src/internal/subscription.ts +264 -0
  50. package/src/models.ts +5 -0
  51. package/src/string/fuzzy.ts +1 -1
  52. package/src/value/freeze.ts +2 -2
  53. package/src/value/shake.ts +1 -1
  54. package/src/value/transform.ts +1 -1
  55. package/dist/color/misc/index.d.mts +0 -7
  56. package/dist/color/misc/index.mjs +0 -15
  57. package/src/color/misc/index.ts +0 -29
@@ -1,21 +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
- ALPHA_NONE_VALUE,
5
- EXPRESSION_HEX_LONG,
6
- EXPRESSION_HEX_SHORT,
7
- EXPRESSION_PREFIX,
8
- KEYS_HSL,
9
- KEYS_HSLA,
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,
5
+ COLOR_ALPHA,
6
+ COLOR_EXPRESSION,
7
+ COLOR_KEYS,
8
+ COLOR_LENGTHS,
9
+ COLOR_MAX,
10
+ COLOR_PROPERTY,
19
11
  } from '../constants';
20
12
  import type {Color} from '../index';
21
13
  import type {
@@ -35,11 +27,11 @@ function hasKeys(value: unknown, keys: ColorProperty[]): boolean {
35
27
  }
36
28
 
37
29
  function isAlpha(value: unknown): value is number {
38
- return typeof value === 'number' && between(value, ALPHA_NONE_VALUE, MAX_PERCENT);
30
+ return typeof value === 'number' && between(value, COLOR_ALPHA.noneValue, COLOR_MAX.percent);
39
31
  }
40
32
 
41
33
  function isBytey(value: unknown): value is number {
42
- return typeof value === 'number' && between(value, 0, MAX_HEX);
34
+ return typeof value === 'number' && between(value, 0, COLOR_MAX.hex);
43
35
  }
44
36
 
45
37
  /**
@@ -49,7 +41,9 @@ function isBytey(value: unknown): value is number {
49
41
  * @returns `true` if the value is a _Color_, otherwise `false`
50
42
  */
51
43
  export function isColor(value: unknown): value is Color {
52
- return typeof value === 'object' && value !== null && '$color' in value && value.$color === true;
44
+ return (
45
+ isPlainObject(value) && COLOR_PROPERTY.name in value && value[COLOR_PROPERTY.name] === true
46
+ );
53
47
  }
54
48
 
55
49
  function isColorValue(obj: unknown, properties: ColorProperty[]): boolean {
@@ -81,7 +75,7 @@ function isColorValue(obj: unknown, properties: ColorProperty[]): boolean {
81
75
  }
82
76
 
83
77
  function isDegree(value: unknown): value is number {
84
- return typeof value === 'number' && between(value, 0, MAX_DEGREE);
78
+ return typeof value === 'number' && between(value, 0, COLOR_MAX.degree);
85
79
  }
86
80
 
87
81
  /**
@@ -105,14 +99,16 @@ export function isHexColor(value: unknown, alpha?: boolean): value is string {
105
99
  return false;
106
100
  }
107
101
 
108
- if (!(EXPRESSION_HEX_SHORT.test(value) || EXPRESSION_HEX_LONG.test(value))) {
102
+ if (!(COLOR_EXPRESSION.hexShort.test(value) || COLOR_EXPRESSION.hexLong.test(value))) {
109
103
  return false;
110
104
  }
111
105
 
112
106
  if (alpha === false) {
113
- const unprefixed = value.replace(EXPRESSION_PREFIX, '');
107
+ const unprefixed = value.replace(COLOR_EXPRESSION.prefix, '');
114
108
 
115
- return unprefixed.length === LENGTH_SHORT || unprefixed.length === LENGTH_LONG;
109
+ return (
110
+ unprefixed.length === COLOR_LENGTHS.hexShort || unprefixed.length === COLOR_LENGTHS.hexLong
111
+ );
116
112
  }
117
113
 
118
114
  return true;
@@ -125,17 +121,11 @@ export function isHexColor(value: unknown, alpha?: boolean): value is string {
125
121
  * @returns `true` if the value is an _HSLA_ color, otherwise `false`
126
122
  */
127
123
  export function isHslaColor(value: unknown): value is HSLAColor {
128
- return isColorValue(value, KEYS_HSLA);
124
+ return isColorValue(value, COLOR_KEYS.hsla);
129
125
  }
130
126
 
131
- /**
132
- * Is the value like an _HSLA_ color?
133
- *
134
- * @param value Value to check
135
- * @returns `true` if the value is like an _HSLA_ color, otherwise `false`
136
- */
137
127
  export function isHslaLike(value: unknown): value is Record<keyof HSLAColor, unknown> {
138
- return hasKeys(value, KEYS_HSLA);
128
+ return hasKeys(value, COLOR_KEYS.hsla);
139
129
  }
140
130
 
141
131
  /**
@@ -145,17 +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, KEYS_HSLA) || isColorValue(value, KEYS_HSL);
138
+ return isColorValue(value, COLOR_KEYS.hsla) || isColorValue(value, COLOR_KEYS.hsl);
149
139
  }
150
140
 
151
- /**
152
- * Is the value like an _HSL_ color?
153
- *
154
- * @param value Value to check
155
- * @returns `true` if the value is like an _HSL_ color, otherwise `false`
156
- */
157
141
  export function isHslLike(value: unknown): value is Record<keyof HSLColor, unknown> {
158
- return hasKeys(value, KEYS_HSL);
142
+ return hasKeys(value, COLOR_KEYS.hsl);
159
143
  }
160
144
 
161
145
  /**
@@ -165,17 +149,11 @@ export function isHslLike(value: unknown): value is Record<keyof HSLColor, unkno
165
149
  * @returns `true` if the value is an _HWBA_ color, otherwise `false`
166
150
  */
167
151
  export function isHwbaColor(value: unknown): value is HWBAColor {
168
- return isColorValue(value, KEYS_HWBA);
152
+ return isColorValue(value, COLOR_KEYS.hwba);
169
153
  }
170
154
 
171
- /**
172
- * Is the value like an _HWBA_ color?
173
- *
174
- * @param value Value to check
175
- * @returns `true` if the value is like an _HWBA_ color, otherwise `false`
176
- */
177
155
  export function isHwbaLike(value: unknown): value is Record<keyof HWBAColor, unknown> {
178
- return hasKeys(value, KEYS_HWBA);
156
+ return hasKeys(value, COLOR_KEYS.hwba);
179
157
  }
180
158
 
181
159
  /**
@@ -185,17 +163,11 @@ export function isHwbaLike(value: unknown): value is Record<keyof HWBAColor, unk
185
163
  * @returns `true` if the value is an _HWB_ color, otherwise `false`
186
164
  */
187
165
  export function isHwbColor(value: unknown): value is HWBColor {
188
- return isColorValue(value, KEYS_HWB) || isColorValue(value, KEYS_HWBA);
166
+ return isColorValue(value, COLOR_KEYS.hwb) || isColorValue(value, COLOR_KEYS.hwba);
189
167
  }
190
168
 
191
- /**
192
- * Is the value like an _HWB_ color?
193
- *
194
- * @param value Value to check
195
- * @returns `true` if the value is like an _HWB_ color, otherwise `false`
196
- */
197
169
  export function isHwbLike(value: unknown): value is Record<keyof HWBColor, unknown> {
198
- return hasKeys(value, KEYS_HWB);
170
+ return hasKeys(value, COLOR_KEYS.hwb);
199
171
  }
200
172
 
201
173
  /**
@@ -205,17 +177,11 @@ export function isHwbLike(value: unknown): value is Record<keyof HWBColor, unkno
205
177
  * @returns `true` if the value is an _RGBA_ color, otherwise `false`
206
178
  */
207
179
  export function isRgbaColor(value: unknown): value is RGBAColor {
208
- return isColorValue(value, KEYS_RGBA);
180
+ return isColorValue(value, COLOR_KEYS.rgba);
209
181
  }
210
182
 
211
- /**
212
- * Is the value like an _RGBA_ color?
213
- *
214
- * @param value Value to check
215
- * @returns `true` if the value is like an _RGBA_ color, otherwise `false`
216
- */
217
183
  export function isRgbaLike(value: unknown): value is Record<keyof RGBAColor, unknown> {
218
- return hasKeys(value, KEYS_RGBA);
184
+ return hasKeys(value, COLOR_KEYS.rgba);
219
185
  }
220
186
 
221
187
  /**
@@ -225,21 +191,15 @@ export function isRgbaLike(value: unknown): value is Record<keyof RGBAColor, unk
225
191
  * @returns `true` if the value is an _RGB_ color, otherwise `false`
226
192
  */
227
193
  export function isRgbColor(value: unknown): value is RGBColor {
228
- return isColorValue(value, KEYS_RGBA) || isColorValue(value, KEYS_RGB);
194
+ return isColorValue(value, COLOR_KEYS.rgba) || isColorValue(value, COLOR_KEYS.rgb);
229
195
  }
230
196
 
231
- /**
232
- * Is the value like an _RGB_ color?
233
- *
234
- * @param value Value to check
235
- * @returns `true` if the value is like an _RGB_ color, otherwise `false`
236
- */
237
197
  export function isRgbLike(value: unknown): value is Record<keyof RGBColor, unknown> {
238
- return hasKeys(value, KEYS_RGB);
198
+ return hasKeys(value, COLOR_KEYS.rgb);
239
199
  }
240
200
 
241
201
  function isPercentage(value: unknown): value is number {
242
- return typeof value === 'number' && between(value, 0, MAX_PERCENT);
202
+ return typeof value === 'number' && between(value, 0, COLOR_MAX.percent);
243
203
  }
244
204
 
245
205
  // #endregion
@@ -1,16 +1,9 @@
1
- import {
2
- DEFAULT_HSL,
3
- DEFAULT_HWB,
4
- DEFAULT_RGB,
5
- HEX_BLACK,
6
- KEYS_HSL,
7
- KEYS_HWB,
8
- KEYS_RGB,
9
- LENGTH_LONG,
10
- MAX_PERCENT,
11
- } from '../constants';
1
+ import type {Subscriptions} from '../../internal/subscription';
2
+ import {COLOR_DEFAULTS, COLOR_KEYS, COLOR_LENGTHS, COLOR_MAX, COLOR_TYPE} from '../constants';
12
3
  import type {
4
+ Color,
13
5
  ColorState,
6
+ ColorType,
14
7
  HSLAColor,
15
8
  HSLColor,
16
9
  HWBAColor,
@@ -18,202 +11,233 @@ import type {
18
11
  RGBAColor,
19
12
  RGBColor,
20
13
  } from '../models';
21
- import {getNormalizedHex, hexToHsl, hexToRgb} from '../space/hex';
22
- import {getHslValue, hslToHex, hslToHwb, hslToRgb} from '../space/hsl';
23
- import {getHwbValue, hwbToHex, hwbToHsl, hwbToRgb} from '../space/hwb';
24
- import {getRgbValue, rgbToHex, rgbToHsl, rgbToHwb} from '../space/rgb';
14
+ import {getColorFromHex, getNormalizedHex} from '../space/hex';
15
+ import {getColorFromHsl, getHslValue} from '../space/hsl';
16
+ import {getColorFromHwb, getHwbValue} from '../space/hwb';
17
+ import {getColorFromRgb, getRgbValue} from '../space/rgb';
25
18
  import {getAlpha} from './alpha';
26
19
  import {getDegrees, getHexValue, getPercentage} from './get';
27
20
  import {isColor, isHexColor, isHslLike, isHwbLike, isRgbLike} from './is';
28
21
 
29
22
  // #region Functions
30
23
 
24
+ export function getColorFromState<Type extends ColorType>(
25
+ state: ColorState,
26
+ type: Type,
27
+ ): NonNullable<ColorState[Type]> {
28
+ const {origin} = state;
29
+
30
+ if (type === origin) {
31
+ return state[origin] as NonNullable<ColorState[Type]>;
32
+ }
33
+
34
+ return state[type] ?? (getters[origin](state, type) as NonNullable<ColorState[Type]>);
35
+ }
36
+
31
37
  export function getColorState(value: unknown): ColorState {
32
38
  if (typeof value === 'string') {
33
39
  return getColorStateForHex(value);
34
40
  }
35
41
 
36
42
  if (isColor(value)) {
43
+ const {origin} = value;
44
+
37
45
  return {
38
- hex: value.hex,
39
- hsl: value.hsl,
40
- hwb: value.hwb,
41
- rgb: value.rgb,
42
- alpha: getAlpha(value.alpha),
46
+ origin,
47
+ [origin]: value[origin],
48
+ alpha: getAlpha(value.alpha, false),
43
49
  };
44
50
  }
45
51
 
46
- const state: Partial<ColorState> = {};
47
-
48
52
  if (typeof value === 'object' && value !== null) {
49
- state.alpha = getAlpha((value as HSLAColor).alpha);
50
-
51
- if (KEYS_HSL.every(key => key in value)) {
52
- return getColorStateForHsl(state, value as Record<keyof HSLColor, unknown>);
53
- }
53
+ const state: ColorState = {
54
+ alpha: getAlpha((value as HSLAColor).alpha, false),
55
+ origin: undefined as never,
56
+ };
54
57
 
55
- if (KEYS_HWB.every(key => key in value)) {
56
- return getColorStateForHwb(state, value as Record<keyof HWBColor, unknown>);
58
+ if (COLOR_KEYS.hsl.every(key => key in value)) {
59
+ state.hsl = getHslValue(value as Record<keyof HSLColor, unknown>);
60
+ state.origin = COLOR_TYPE.hsl;
61
+ } else if (COLOR_KEYS.hwb.every(key => key in value)) {
62
+ state.hwb = getHwbValue(value as Record<keyof HWBColor, unknown>);
63
+ state.origin = COLOR_TYPE.hwb;
64
+ } else if (COLOR_KEYS.rgb.every(key => key in value)) {
65
+ state.rgb = getRgbValue(value as Record<keyof RGBColor, unknown>);
66
+ state.origin = COLOR_TYPE.rgb;
57
67
  }
58
68
 
59
- if (KEYS_RGB.every(key => key in value)) {
60
- return getColorStateForRgb(state, value as Record<keyof RGBColor, unknown>);
69
+ if (state.origin != null) {
70
+ return state;
61
71
  }
62
72
  }
63
73
 
64
- return getDefaultColorState(state);
74
+ return getDefaultColorState();
65
75
  }
66
76
 
67
77
  function getColorStateForHex(value: string): ColorState {
68
78
  const normalized = getNormalizedHex(value, true);
69
- const hex = normalized.slice(0, LENGTH_LONG);
70
-
71
- const hsl = hexToHsl(hex);
79
+ const hex = normalized.slice(0, COLOR_LENGTHS.hexLong);
72
80
 
73
81
  return {
74
82
  hex,
75
- hsl,
76
- alpha: getAlpha(normalized.slice(LENGTH_LONG)),
77
- hwb: hslToHwb(hsl),
78
- rgb: hslToRgb(hsl),
83
+ alpha: getAlpha(normalized.slice(COLOR_LENGTHS.hexLong), true),
84
+ origin: COLOR_TYPE.hex,
79
85
  };
80
86
  }
81
87
 
82
- function getColorStateForHsl(
83
- state: Partial<ColorState>,
84
- value: Record<keyof HSLColor, unknown>,
85
- ): ColorState {
86
- state.hsl = getHslValue(value);
87
-
88
- state.rgb = hslToRgb(state.hsl);
89
- state.hex = hslToHex(state.hsl);
90
- state.hwb = hslToHwb(state.hsl);
91
-
92
- return state as ColorState;
93
- }
94
-
95
- function getColorStateForHwb(
96
- state: Partial<ColorState>,
97
- value: Record<keyof HWBColor, unknown>,
98
- ): ColorState {
99
- state.hwb = getHwbValue(value);
100
-
101
- state.hsl = hwbToHsl(state.hwb);
102
- state.rgb = hwbToRgb(state.hwb);
103
- state.hex = hwbToHex(state.hwb);
104
-
105
- return state as ColorState;
88
+ function getDefaultColorState(): ColorState {
89
+ return {
90
+ alpha: getAlpha(COLOR_MAX.percent, false),
91
+ hex: COLOR_DEFAULTS.hexBlack,
92
+ hsl: {...COLOR_DEFAULTS.hsl},
93
+ hwb: {...COLOR_DEFAULTS.hwb},
94
+ rgb: {...COLOR_DEFAULTS.rgb},
95
+ origin: COLOR_TYPE.hex,
96
+ };
106
97
  }
107
98
 
108
- function getColorStateForRgb(
109
- state: Partial<ColorState>,
110
- value: Record<keyof RGBColor, unknown>,
111
- ): ColorState {
112
- state.rgb = getRgbValue(value);
113
-
114
- state.hex = rgbToHex(state.rgb);
115
- state.hsl = rgbToHsl(state.rgb);
116
- state.hwb = rgbToHwb(state.rgb);
99
+ function setColorValue<Type extends ColorType>(
100
+ color: Color,
101
+ state: ColorState,
102
+ subscriptions: Subscriptions<Function>,
103
+ type: Type,
104
+ value: ColorState[Type],
105
+ alpha?: number | string,
106
+ ): void {
107
+ state.hex = undefined;
108
+ state.hsl = undefined;
109
+ state.hwb = undefined;
110
+ state.rgb = undefined;
111
+
112
+ state.origin = type;
113
+ state[type] = value;
114
+
115
+ if (alpha != null) {
116
+ state.alpha = getAlpha(alpha, type === COLOR_TYPE.hex);
117
+ }
117
118
 
118
- return state as ColorState;
119
- }
119
+ for (const type of COLOR_TYPE.all) {
120
+ const callbacks = subscriptions.values.to.keyed?.get(type);
120
121
 
121
- function getDefaultColorState(state: Partial<ColorState>): ColorState {
122
- state.alpha = getAlpha(MAX_PERCENT);
123
- state.hex = HEX_BLACK;
124
- state.hsl = {...DEFAULT_HSL};
125
- state.hwb = {...DEFAULT_HWB};
126
- state.rgb = {...DEFAULT_RGB};
122
+ if (callbacks != null) {
123
+ for (const callback of callbacks.values()) {
124
+ callback(color[type]);
125
+ }
126
+ }
127
+ }
127
128
 
128
- return state as ColorState;
129
+ for (const callback of subscriptions.values.to.any.values()) {
130
+ callback(color);
131
+ }
129
132
  }
130
133
 
131
- export function setHexColor(state: ColorState, value: string, alpha: boolean): void {
134
+ export function setHexColor(
135
+ color: Color,
136
+ state: ColorState,
137
+ subscriptions: Subscriptions<Function>,
138
+ value: string,
139
+ alpha: boolean,
140
+ ): void {
132
141
  if (!isHexColor(value) || (!alpha && value === state.hex)) {
133
142
  return;
134
143
  }
135
144
 
136
145
  const normalized = getNormalizedHex(value, true);
137
- const hex = normalized.slice(0, LENGTH_LONG);
138
- const hsl = hexToHsl(hex);
139
146
 
140
- state.hex = hex;
141
- state.hsl = hsl;
142
-
143
- state.rgb = hslToRgb(hsl);
144
- state.hwb = hslToHwb(hsl);
145
-
146
- if (alpha) {
147
- state.alpha = getAlpha(normalized.slice(LENGTH_LONG));
148
- }
147
+ setColorValue(
148
+ color,
149
+ state,
150
+ subscriptions,
151
+ COLOR_TYPE.hex,
152
+ normalized.slice(0, COLOR_LENGTHS.hexLong),
153
+ alpha ? normalized.slice(COLOR_LENGTHS.hexLong) : undefined,
154
+ );
149
155
  }
150
156
 
151
- export function setHSLColor(state: ColorState, value: unknown, alpha: boolean): void {
157
+ export function setHSLColor(
158
+ color: Color,
159
+ state: ColorState,
160
+ subscriptions: Subscriptions<Function>,
161
+ value: unknown,
162
+ alpha: boolean,
163
+ ): void {
152
164
  if (!isHslLike(value)) {
153
165
  return;
154
166
  }
155
167
 
156
- const hsl = {
157
- hue: getDegrees((value as HSLColor).hue),
158
- saturation: getPercentage((value as HSLColor).saturation),
159
- lightness: getPercentage((value as HSLColor).lightness),
160
- };
161
-
162
- state.hsl = hsl;
163
-
164
- state.hex = hslToHex(hsl);
165
- state.hwb = hslToHwb(hsl);
166
- state.rgb = hslToRgb(hsl);
167
-
168
- if (alpha) {
169
- state.alpha = getAlpha((value as HSLAColor).alpha);
170
- }
168
+ setColorValue(
169
+ color,
170
+ state,
171
+ subscriptions,
172
+ COLOR_TYPE.hsl,
173
+ {
174
+ hue: getDegrees((value as HSLColor).hue),
175
+ saturation: getPercentage((value as HSLColor).saturation),
176
+ lightness: getPercentage((value as HSLColor).lightness),
177
+ },
178
+ alpha ? (value as HSLAColor).alpha : undefined,
179
+ );
171
180
  }
172
181
 
173
- export function setHWBColor(state: ColorState, value: unknown, alpha: boolean): void {
182
+ export function setHWBColor(
183
+ color: Color,
184
+ state: ColorState,
185
+ subscriptions: Subscriptions<Function>,
186
+ value: unknown,
187
+ alpha: boolean,
188
+ ): void {
174
189
  if (!isHwbLike(value)) {
175
190
  return;
176
191
  }
177
192
 
178
- const hwb = {
179
- hue: getDegrees((value as HWBColor).hue),
180
- whiteness: getPercentage((value as HWBColor).whiteness),
181
- blackness: getPercentage((value as HWBColor).blackness),
182
- };
183
-
184
- state.hwb = hwb;
185
-
186
- state.hex = hwbToHex(hwb);
187
- state.hsl = hwbToHsl(hwb);
188
- state.rgb = hwbToRgb(hwb);
189
-
190
- if (alpha) {
191
- state.alpha = getAlpha((value as HWBAColor).alpha);
192
- }
193
+ setColorValue(
194
+ color,
195
+ state,
196
+ subscriptions,
197
+ COLOR_TYPE.hwb,
198
+ {
199
+ hue: getDegrees((value as HWBColor).hue),
200
+ whiteness: getPercentage((value as HWBColor).whiteness),
201
+ blackness: getPercentage((value as HWBColor).blackness),
202
+ },
203
+ alpha ? (value as HWBAColor).alpha : undefined,
204
+ );
193
205
  }
194
206
 
195
- export function setRGBColor(state: ColorState, value: unknown, alpha: boolean): void {
207
+ export function setRGBColor(
208
+ color: Color,
209
+ state: ColorState,
210
+ subscriptions: Subscriptions<Function>,
211
+ value: unknown,
212
+ alpha: boolean,
213
+ ): void {
196
214
  if (!isRgbLike(value)) {
197
215
  return;
198
216
  }
199
217
 
200
- const rgb = {
201
- blue: getHexValue((value as RGBColor).blue),
202
- green: getHexValue((value as RGBColor).green),
203
- red: getHexValue((value as RGBColor).red),
204
- };
205
-
206
- const hsl = rgbToHsl(rgb);
218
+ setColorValue(
219
+ color,
220
+ state,
221
+ subscriptions,
222
+ COLOR_TYPE.rgb,
223
+ {
224
+ red: getHexValue((value as RGBColor).red),
225
+ green: getHexValue((value as RGBColor).green),
226
+ blue: getHexValue((value as RGBColor).blue),
227
+ },
228
+ alpha ? (value as RGBAColor).alpha : undefined,
229
+ );
230
+ }
207
231
 
208
- state.hsl = hsl;
209
- state.rgb = rgb;
232
+ // #endregion
210
233
 
211
- state.hex = hslToHex(hsl);
212
- state.hwb = hslToHwb(hsl);
234
+ // #region Variables
213
235
 
214
- if (alpha) {
215
- state.alpha = getAlpha((value as RGBAColor).alpha);
216
- }
217
- }
236
+ const getters: Record<ColorType, (state: ColorState, type: ColorType) => any> = {
237
+ hex: getColorFromHex,
238
+ hsl: getColorFromHsl,
239
+ hwb: getColorFromHwb,
240
+ rgb: getColorFromRgb,
241
+ };
218
242
 
219
243
  // #endregion