@oscarpalmer/atoms 0.190.0 → 0.191.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 (42) hide show
  1. package/dist/color/constants.d.mts +7 -1
  2. package/dist/color/constants.mjs +7 -1
  3. package/dist/color/index.d.mts +3 -3
  4. package/dist/color/index.mjs +2 -2
  5. package/dist/color/instance.mjs +27 -25
  6. package/dist/color/misc/alpha.d.mts +1 -1
  7. package/dist/color/misc/alpha.mjs +10 -7
  8. package/dist/color/misc/format.d.mts +7 -0
  9. package/dist/color/misc/format.mjs +20 -0
  10. package/dist/color/misc/get.mjs +16 -16
  11. package/dist/color/misc/is.d.mts +0 -36
  12. package/dist/color/misc/is.mjs +1 -37
  13. package/dist/color/misc/state.d.mts +3 -2
  14. package/dist/color/misc/state.mjs +69 -83
  15. package/dist/color/models.d.mts +28 -5
  16. package/dist/color/space/hex.d.mts +3 -2
  17. package/dist/color/space/hex.mjs +13 -1
  18. package/dist/color/space/hsl.d.mts +3 -2
  19. package/dist/color/space/hsl.mjs +13 -1
  20. package/dist/color/space/hwb.d.mts +3 -2
  21. package/dist/color/space/hwb.mjs +13 -1
  22. package/dist/color/space/rgb.d.mts +3 -2
  23. package/dist/color/space/rgb.mjs +14 -2
  24. package/dist/index.d.mts +23 -29
  25. package/dist/index.mjs +198 -184
  26. package/package.json +4 -4
  27. package/src/color/constants.ts +12 -0
  28. package/src/color/index.ts +26 -8
  29. package/src/color/instance.ts +60 -45
  30. package/src/color/misc/alpha.ts +12 -6
  31. package/src/color/misc/format.ts +29 -0
  32. package/src/color/misc/get.ts +20 -13
  33. package/src/color/misc/is.ts +7 -37
  34. package/src/color/misc/state.ts +115 -127
  35. package/src/color/models.ts +32 -4
  36. package/src/color/space/hex.ts +34 -1
  37. package/src/color/space/hsl.ts +40 -2
  38. package/src/color/space/hwb.ts +32 -2
  39. package/src/color/space/rgb.ts +33 -3
  40. package/dist/color/misc/index.d.mts +0 -7
  41. package/dist/color/misc/index.mjs +0 -15
  42. package/src/color/misc/index.ts +0 -29
@@ -1,6 +1,18 @@
1
1
  import {color} from './instance';
2
2
  import {isColor} from './misc/is';
3
- import type {Color, HSLAColor, HSLColor, HWBAColor, HWBColor, RGBAColor, RGBColor} from './models';
3
+ import type {
4
+ Color,
5
+ ColorType,
6
+ ColorTypeExtended,
7
+ ColorValue,
8
+ ColorValueExtended,
9
+ HSLAColor,
10
+ HSLColor,
11
+ HWBAColor,
12
+ HWBColor,
13
+ RGBAColor,
14
+ RGBColor,
15
+ } from './models';
4
16
 
5
17
  // #region Functions
6
18
 
@@ -32,22 +44,16 @@ export {
32
44
  getRgbaColor,
33
45
  getRgbColor,
34
46
  } from './misc/get';
35
-
36
47
  export {
37
48
  isColor,
38
49
  isHexColor,
39
50
  isHslaColor,
40
51
  isHslColor,
41
- isHslLike,
42
52
  isHwbaColor,
43
- isHwbaLike,
44
53
  isHwbColor,
45
- isHwbLike,
46
54
  isRgbaColor,
47
55
  isRgbColor,
48
- isRgbLike,
49
56
  } from './misc/is';
50
-
51
57
  export {
52
58
  getNormalizedHex,
53
59
  hexToHsl,
@@ -60,6 +66,18 @@ export {
60
66
  export {hslToHex, hslToHwb, hslToHwba, hslToRgb, hslToRgba} from './space/hsl';
61
67
  export {hwbToHex, hwbToHsl, hwbToHsla, hwbToRgb, hwbToRgba} from './space/hwb';
62
68
  export {rgbToHex, rgbToHsl, rgbToHsla, rgbToHwb, rgbToHwba} from './space/rgb';
63
- export type {Color, HSLAColor, HSLColor, HWBAColor, HWBColor, RGBAColor, RGBColor};
69
+ export type {
70
+ Color,
71
+ ColorType,
72
+ ColorTypeExtended,
73
+ ColorValue,
74
+ ColorValueExtended,
75
+ HSLAColor,
76
+ HSLColor,
77
+ HWBAColor,
78
+ HWBColor,
79
+ RGBAColor,
80
+ RGBColor,
81
+ };
64
82
 
65
83
  // #endregion
@@ -1,90 +1,105 @@
1
- import {formatHslColor, formatHwbColor, formatRgbColor} from './misc';
1
+ import {PROPERTY_COLOR, TYPE_HEX, TYPE_HSL, TYPE_HWB, TYPE_RGB} from './constants';
2
2
  import {getAlpha} from './misc/alpha';
3
- import {getColorState, setHexColor, setHSLColor, setHWBColor, setRGBColor} from './misc/state';
4
- import type {Color, ColorState} from './models';
3
+ import {formatHslColor, formatHwbColor, formatRgbColor} from './misc/format';
4
+ import {
5
+ getColorFromState,
6
+ getColorState,
7
+ setHexColor,
8
+ setHSLColor,
9
+ setHWBColor,
10
+ setRGBColor,
11
+ } from './misc/state';
12
+ import type {Color, ColorState, ColorType} from './models';
5
13
 
6
14
  // #region Types
7
15
 
16
+ type SetValue = (state: ColorState, value: any, alpha: boolean) => void;
17
+
18
+ type SetValues = Record<ColorType, SetValue>;
19
+
20
+ // #endregion
21
+
22
+ // #region Functions
23
+
8
24
  export function color(value: unknown): Color {
9
25
  const state = getColorState(value);
10
26
 
11
27
  const instance = {
12
28
  toHexString: (alpha?: boolean) =>
13
29
  `#${alpha === true ? (instance as Color).hexa : (instance as Color).hex}`,
14
- toHslString: (alpha?: boolean) => formatHslColor(state, alpha === true),
15
- toHwbString: (alpha?: boolean) => formatHwbColor(state, alpha === true),
16
- toRgbString: (alpha?: boolean) => formatRgbColor(state, alpha === true),
30
+ toHslString: (alpha?: boolean) => formatHslColor(state, alpha),
31
+ toHwbString: (alpha?: boolean) => formatHwbColor(state, alpha),
32
+ toRgbString: (alpha?: boolean) => formatRgbColor(state, alpha),
17
33
  toString: () => (instance as Color).toHexString(),
18
34
  };
19
35
 
20
36
  Object.defineProperties(instance, {
21
- $color: {
37
+ [PROPERTY_COLOR]: {
22
38
  enumerable: false,
23
- get: () => true,
39
+ value: true,
24
40
  },
25
41
  alpha: {
26
42
  enumerable: true,
27
43
  get: () => state.alpha.value,
28
- set: (value: number) => {
29
- if (typeof value === 'number' && !Number.isNaN(value)) {
30
- state.alpha = getAlpha(value);
31
- }
32
- },
44
+ set: (value: unknown) => setAlphaValue(state, value),
33
45
  },
34
- hex: getProperty('hex', state, false),
35
- hexa: getProperty('hex', state, true),
36
- hsl: getProperty('hsl', state, false),
37
- hsla: getProperty('hsl', state, true),
38
- hwb: getProperty('hwb', state, false),
39
- hwba: getProperty('hwb', state, true),
40
- rgb: getProperty('rgb', state, false),
41
- rgba: getProperty('rgb', state, true),
46
+ hex: getProperty(TYPE_HEX, state, false),
47
+ hexa: getProperty(TYPE_HEX, state, true),
48
+ hsl: getProperty(TYPE_HSL, state, false),
49
+ hsla: getProperty(TYPE_HSL, state, true),
50
+ hwb: getProperty(TYPE_HWB, state, false),
51
+ hwba: getProperty(TYPE_HWB, state, true),
52
+ origin: {
53
+ enumerable: true,
54
+ get: () => state.origin,
55
+ },
56
+ rgb: getProperty(TYPE_RGB, state, false),
57
+ rgba: getProperty(TYPE_RGB, state, true),
42
58
  });
43
59
 
44
60
  return Object.freeze(instance) as Color;
45
61
  }
46
62
 
47
- function getHex(state: ColorState, alpha: boolean): string {
48
- return alpha ? `${state.hex}${state.alpha.hex}` : state.hex;
49
- }
50
-
51
63
  function getProperty(
52
64
  space: keyof typeof setters,
53
65
  state: ColorState,
54
66
  alpha: boolean,
55
67
  ): PropertyDescriptor {
56
- const setter = setters[space];
68
+ const setValue = setters[space];
57
69
 
58
70
  return {
59
71
  enumerable: true,
60
- get: () => {
61
- const value = state[space];
72
+ get: () => getValue(space, state, alpha),
73
+ set: (value: unknown) => setValue(state, value, alpha),
74
+ };
75
+ }
76
+
77
+ function getValue(space: keyof typeof setters, state: ColorState, alpha: boolean) {
78
+ const value = getColorFromState(state, space);
79
+
80
+ if (typeof value === 'string') {
81
+ return alpha ? `${value}${state.alpha.hex}` : value;
82
+ }
62
83
 
63
- if (typeof value === 'string') {
64
- return getHex(state, alpha);
84
+ return alpha
85
+ ? {
86
+ ...value,
87
+ alpha: state.alpha.value,
65
88
  }
89
+ : {...value};
90
+ }
66
91
 
67
- return alpha
68
- ? {
69
- ...value,
70
- alpha: state.alpha.value,
71
- }
72
- : {...value};
73
- },
74
- set: (value: unknown) => {
75
- setter(state, value, alpha);
76
- },
77
- };
92
+ function setAlphaValue(state: ColorState, value: unknown): void {
93
+ if (typeof value === 'number' && !Number.isNaN(value)) {
94
+ state.alpha = getAlpha(value, false);
95
+ }
78
96
  }
79
97
 
80
98
  // #endregion
81
99
 
82
100
  // #region Variables
83
101
 
84
- const setters: Record<
85
- 'hex' | 'hsl' | 'hwb' | 'rgb',
86
- (state: ColorState, value: any, alpha: boolean) => void
87
- > = {
102
+ const setters: SetValues = {
88
103
  hex: setHexColor,
89
104
  hsl: setHSLColor,
90
105
  hwb: setHWBColor,
@@ -1,9 +1,11 @@
1
+ import {clamp} from '../..';
1
2
  import {round} from '../../internal/math/misc';
2
3
  import {
3
4
  ALPHA_FULL_HEX_LONG,
4
5
  ALPHA_NONE_HEX,
5
6
  ALPHA_NONE_VALUE,
6
7
  DEFAULT_ALPHA,
8
+ EXPRESSION_ALPHA_HEX,
7
9
  MAX_HEX,
8
10
  MAX_PERCENT,
9
11
  } from '../constants';
@@ -11,19 +13,23 @@ import type {Alpha} from '../models';
11
13
 
12
14
  // #region Functions
13
15
 
14
- export function getAlpha(value: unknown): Alpha {
16
+ export function getAlpha(value: unknown, hex: boolean): Alpha {
15
17
  if (typeof value === 'number') {
16
18
  return getAlphaFromValue(value);
17
19
  }
18
20
 
19
- if (typeof value === 'string' && value !== ALPHA_FULL_HEX_LONG) {
21
+ if (typeof value !== 'string' || value.toLowerCase() === ALPHA_FULL_HEX_LONG) {
22
+ return {...DEFAULT_ALPHA};
23
+ }
24
+
25
+ if (hex && EXPRESSION_ALPHA_HEX.test(value)) {
20
26
  return {
21
27
  hex: value,
22
28
  value: Number.parseInt(value, 16) / MAX_HEX,
23
29
  };
24
30
  }
25
31
 
26
- return {...DEFAULT_ALPHA};
32
+ return getAlphaFromValue(Number.parseFloat(value));
27
33
  }
28
34
 
29
35
  export function getAlphaHexadecimal(value: number): string {
@@ -35,7 +41,7 @@ export function getAlphaHexadecimal(value: number): string {
35
41
  return ALPHA_FULL_HEX_LONG;
36
42
  }
37
43
 
38
- return round(value * MAX_HEX).toString(16);
44
+ return round((value / MAX_PERCENT) * MAX_HEX).toString(16);
39
45
  }
40
46
 
41
47
  function getAlphaFromValue(value: number): Alpha {
@@ -48,11 +54,11 @@ function getAlphaFromValue(value: number): Alpha {
48
54
  }
49
55
 
50
56
  export function getAlphaValue(original: number): number {
51
- if (Number.isNaN(original) || original >= MAX_PERCENT) {
57
+ if (Number.isNaN(original)) {
52
58
  return MAX_PERCENT;
53
59
  }
54
60
 
55
- return original <= ALPHA_NONE_VALUE ? ALPHA_NONE_VALUE : original;
61
+ return clamp(original, ALPHA_NONE_VALUE, MAX_PERCENT);
56
62
  }
57
63
 
58
64
  // #endregion
@@ -0,0 +1,29 @@
1
+ import {TYPE_HSL, TYPE_HWB, TYPE_RGB} from '../constants';
2
+ import type {ColorState} from '../models';
3
+ import {getColorFromState} from './state';
4
+
5
+ // #region Functions
6
+
7
+ export function formatHslColor(state: ColorState, alpha?: boolean): string {
8
+ const {hue, lightness, saturation} = getColorFromState(state, TYPE_HSL);
9
+
10
+ return `hsl(${hue}deg ${saturation}% ${lightness}%${getSuffix(state, alpha)})`;
11
+ }
12
+
13
+ export function formatHwbColor(state: ColorState, alpha?: boolean): string {
14
+ const {blackness, hue, whiteness} = getColorFromState(state, TYPE_HWB);
15
+
16
+ return `hwb(${hue}deg ${whiteness}% ${blackness}%${getSuffix(state, alpha)})`;
17
+ }
18
+
19
+ export function formatRgbColor(state: ColorState, alpha?: boolean): string {
20
+ const {blue, green, red} = getColorFromState(state, TYPE_RGB);
21
+
22
+ return `rgb(${red} ${green} ${blue}${getSuffix(state, alpha)})`;
23
+ }
24
+
25
+ function getSuffix(state: ColorState, alpha?: boolean): string {
26
+ return alpha === true ? ` / ${state.alpha.value}%` : '';
27
+ }
28
+
29
+ // #endregion
@@ -15,10 +15,14 @@ import {
15
15
  SRGB_LUMINANCE_OFFSET,
16
16
  SRGB_LUMINANCE_RED,
17
17
  SRGB_LUMINANCE_THRESHOLD,
18
+ TYPE_HEX,
19
+ TYPE_HSL,
20
+ TYPE_HWB,
21
+ TYPE_RGB,
18
22
  } from '../constants';
19
23
  import {color} from '../instance';
20
24
  import type {Color, HSLAColor, HSLColor, HWBAColor, HWBColor, RGBAColor, RGBColor} from '../models';
21
- import {getColorState} from './state';
25
+ import {getColorFromState, getColorState} from './state';
22
26
 
23
27
  // #region Functions
24
28
 
@@ -56,8 +60,8 @@ export function getForegroundColor(value: unknown, hex: true): string;
56
60
  export function getForegroundColor(value: unknown): Color;
57
61
 
58
62
  export function getForegroundColor(value: unknown, hex?: unknown): string | Color {
59
- const state = getColorState(value);
60
- const {blue, green, red} = state.rgb;
63
+ const rgb = getColorFromState(getColorState(value), TYPE_RGB);
64
+ const {blue, green, red} = rgb;
61
65
 
62
66
  const values = [blue / MAX_HEX, green / MAX_HEX, red / MAX_HEX];
63
67
  const {length} = values;
@@ -109,7 +113,7 @@ export function getHexaColor(value: unknown): string {
109
113
  * @returns Hex color string
110
114
  */
111
115
  export function getHexColor(value: unknown): string {
112
- return getColorState(value).hex;
116
+ return getColorFromState(getColorState(value), TYPE_HEX);
113
117
  }
114
118
 
115
119
  export function getHexValue(value: unknown): number {
@@ -130,11 +134,12 @@ export function getDegrees(value: unknown): number {
130
134
  * @returns _HSLA_ color
131
135
  */
132
136
  export function getHslaColor(value: unknown): HSLAColor {
133
- const {alpha, hsl} = getColorState(value);
137
+ const state = getColorState(value);
138
+ const hsl = getColorFromState(state, TYPE_HSL);
134
139
 
135
140
  return {
136
141
  ...hsl,
137
- alpha: alpha.value,
142
+ alpha: state.alpha.value,
138
143
  };
139
144
  }
140
145
 
@@ -148,7 +153,7 @@ export function getHslaColor(value: unknown): HSLAColor {
148
153
  * @returns _HWB_ color
149
154
  */
150
155
  export function getHwbColor(value: unknown): HWBColor {
151
- return getColorState(value).hwb;
156
+ return getColorFromState(getColorState(value), TYPE_HWB);
152
157
  }
153
158
 
154
159
  /**
@@ -161,11 +166,12 @@ export function getHwbColor(value: unknown): HWBColor {
161
166
  * @returns _HWBA_ color
162
167
  */
163
168
  export function getHwbaColor(value: unknown): HWBAColor {
164
- const {alpha, hwb} = getColorState(value);
169
+ const state = getColorState(value);
170
+ const hwb = getColorFromState(state, TYPE_HWB);
165
171
 
166
172
  return {
167
173
  ...hwb,
168
- alpha: alpha.value,
174
+ alpha: state.alpha.value,
169
175
  };
170
176
  }
171
177
 
@@ -179,7 +185,7 @@ export function getHwbaColor(value: unknown): HWBAColor {
179
185
  * @returns _HSL_ color
180
186
  */
181
187
  export function getHslColor(value: unknown): HSLColor {
182
- return getColorState(value).hsl;
188
+ return getColorFromState(getColorState(value), TYPE_HSL);
183
189
  }
184
190
 
185
191
  export function getPercentage(value: unknown): number {
@@ -196,11 +202,12 @@ export function getPercentage(value: unknown): number {
196
202
  * @returns _RGBA_ color
197
203
  */
198
204
  export function getRgbaColor(value: unknown): RGBAColor {
199
- const {alpha, rgb} = getColorState(value);
205
+ const state = getColorState(value);
206
+ const rgb = getColorFromState(state, TYPE_RGB);
200
207
 
201
208
  return {
202
209
  ...rgb,
203
- alpha: alpha.value,
210
+ alpha: state.alpha.value,
204
211
  };
205
212
  }
206
213
 
@@ -214,7 +221,7 @@ export function getRgbaColor(value: unknown): RGBAColor {
214
221
  * @returns _RGB_ color
215
222
  */
216
223
  export function getRgbColor(value: unknown): RGBColor {
217
- return getColorState(value).rgb;
224
+ return getColorFromState(getColorState(value), TYPE_RGB);
218
225
  }
219
226
 
220
227
  // #endregion
@@ -16,6 +16,7 @@ import {
16
16
  MAX_DEGREE,
17
17
  MAX_HEX,
18
18
  MAX_PERCENT,
19
+ PROPERTY_COLOR,
19
20
  } from '../constants';
20
21
  import type {Color} from '../index';
21
22
  import type {
@@ -49,7 +50,12 @@ function isBytey(value: unknown): value is number {
49
50
  * @returns `true` if the value is a _Color_, otherwise `false`
50
51
  */
51
52
  export function isColor(value: unknown): value is Color {
52
- return typeof value === 'object' && value !== null && '$color' in value && value.$color === true;
53
+ return (
54
+ typeof value === 'object' &&
55
+ value !== null &&
56
+ PROPERTY_COLOR in value &&
57
+ value[PROPERTY_COLOR] === true
58
+ );
53
59
  }
54
60
 
55
61
  function isColorValue(obj: unknown, properties: ColorProperty[]): boolean {
@@ -128,12 +134,6 @@ export function isHslaColor(value: unknown): value is HSLAColor {
128
134
  return isColorValue(value, KEYS_HSLA);
129
135
  }
130
136
 
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
137
  export function isHslaLike(value: unknown): value is Record<keyof HSLAColor, unknown> {
138
138
  return hasKeys(value, KEYS_HSLA);
139
139
  }
@@ -148,12 +148,6 @@ export function isHslColor(value: unknown): value is HSLColor {
148
148
  return isColorValue(value, KEYS_HSLA) || isColorValue(value, KEYS_HSL);
149
149
  }
150
150
 
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
151
  export function isHslLike(value: unknown): value is Record<keyof HSLColor, unknown> {
158
152
  return hasKeys(value, KEYS_HSL);
159
153
  }
@@ -168,12 +162,6 @@ export function isHwbaColor(value: unknown): value is HWBAColor {
168
162
  return isColorValue(value, KEYS_HWBA);
169
163
  }
170
164
 
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
165
  export function isHwbaLike(value: unknown): value is Record<keyof HWBAColor, unknown> {
178
166
  return hasKeys(value, KEYS_HWBA);
179
167
  }
@@ -188,12 +176,6 @@ export function isHwbColor(value: unknown): value is HWBColor {
188
176
  return isColorValue(value, KEYS_HWB) || isColorValue(value, KEYS_HWBA);
189
177
  }
190
178
 
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
179
  export function isHwbLike(value: unknown): value is Record<keyof HWBColor, unknown> {
198
180
  return hasKeys(value, KEYS_HWB);
199
181
  }
@@ -208,12 +190,6 @@ export function isRgbaColor(value: unknown): value is RGBAColor {
208
190
  return isColorValue(value, KEYS_RGBA);
209
191
  }
210
192
 
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
193
  export function isRgbaLike(value: unknown): value is Record<keyof RGBAColor, unknown> {
218
194
  return hasKeys(value, KEYS_RGBA);
219
195
  }
@@ -228,12 +204,6 @@ export function isRgbColor(value: unknown): value is RGBColor {
228
204
  return isColorValue(value, KEYS_RGBA) || isColorValue(value, KEYS_RGB);
229
205
  }
230
206
 
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
207
  export function isRgbLike(value: unknown): value is Record<keyof RGBColor, unknown> {
238
208
  return hasKeys(value, KEYS_RGB);
239
209
  }