@snack-uikit/color-picker 0.0.1-preview-364c0f5c.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/CHANGELOG.md +5 -0
- package/LICENSE +201 -0
- package/README.md +24 -0
- package/dist/components/ColorPicker.d.ts +20 -0
- package/dist/components/ColorPicker.js +84 -0
- package/dist/components/index.d.ts +1 -0
- package/dist/components/index.js +1 -0
- package/dist/components/styles.module.css +61 -0
- package/dist/constants.d.ts +20 -0
- package/dist/constants.js +32 -0
- package/dist/helperComponents/FieldAlphaColor/FieldAlphaColor.d.ts +16 -0
- package/dist/helperComponents/FieldAlphaColor/FieldAlphaColor.js +8 -0
- package/dist/helperComponents/FieldAlphaColor/index.d.ts +1 -0
- package/dist/helperComponents/FieldAlphaColor/index.js +1 -0
- package/dist/helperComponents/FieldPrivate/FieldPrivate.d.ts +14 -0
- package/dist/helperComponents/FieldPrivate/FieldPrivate.js +30 -0
- package/dist/helperComponents/FieldPrivate/index.d.ts +1 -0
- package/dist/helperComponents/FieldPrivate/index.js +1 -0
- package/dist/helperComponents/FieldPrivate/styles.module.css +186 -0
- package/dist/helperComponents/index.d.ts +2 -0
- package/dist/helperComponents/index.js +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/types.d.ts +12 -0
- package/dist/types.js +1 -0
- package/dist/utils/convert.d.ts +12 -0
- package/dist/utils/convert.js +172 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.js +1 -0
- package/dist/utils/round.d.ts +1 -0
- package/dist/utils/round.js +1 -0
- package/dist/utils/typeGuards.d.ts +10 -0
- package/dist/utils/typeGuards.js +34 -0
- package/dist/utils/validate.d.ts +1 -0
- package/dist/utils/validate.js +10 -0
- package/package.json +49 -0
- package/src/components/ColorPicker.tsx +209 -0
- package/src/components/index.ts +1 -0
- package/src/components/styles.module.scss +82 -0
- package/src/constants.ts +45 -0
- package/src/helperComponents/FieldAlphaColor/FieldAlphaColor.tsx +26 -0
- package/src/helperComponents/FieldAlphaColor/index.ts +1 -0
- package/src/helperComponents/FieldPrivate/FieldPrivate.tsx +85 -0
- package/src/helperComponents/FieldPrivate/index.ts +1 -0
- package/src/helperComponents/FieldPrivate/styles.module.scss +136 -0
- package/src/helperComponents/index.ts +2 -0
- package/src/index.ts +2 -0
- package/src/types.ts +15 -0
- package/src/utils/convert.ts +229 -0
- package/src/utils/index.ts +1 -0
- package/src/utils/round.ts +2 -0
- package/src/utils/typeGuards.ts +47 -0
- package/src/utils/validate.ts +13 -0
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
.container{
|
|
2
|
+
background-color:var(--sys-neutral-background1-level, #fdfdfd);
|
|
3
|
+
border-color:var(--sys-neutral-decor-default, #dde0ea);
|
|
4
|
+
position:relative;
|
|
5
|
+
display:flex;
|
|
6
|
+
align-items:center;
|
|
7
|
+
justify-content:space-between;
|
|
8
|
+
box-sizing:border-box;
|
|
9
|
+
min-width:52px;
|
|
10
|
+
border-style:solid;
|
|
11
|
+
}
|
|
12
|
+
.container:hover{
|
|
13
|
+
background-color:var(--sys-neutral-background2-level, #ffffff);
|
|
14
|
+
border-color:var(--sys-primary-decor-hovered, #decdfb);
|
|
15
|
+
}
|
|
16
|
+
.container:not([data-readonly]):focus-within:not([data-disabled]), .container:not([data-readonly])[data-focused]:not([data-disabled]){
|
|
17
|
+
outline-width:var(--border-state-focus-m-border-width, 3px);
|
|
18
|
+
outline-style:var(--border-state-focus-m-border-style, solid);
|
|
19
|
+
outline-color:var(--border-state-focus-m-border-color, );
|
|
20
|
+
background-color:var(--sys-neutral-background2-level, #ffffff);
|
|
21
|
+
border-color:var(--sys-primary-accent-default, #794ed3);
|
|
22
|
+
outline-color:var(--sys-primary-decor-activated, #c5b2f1);
|
|
23
|
+
}
|
|
24
|
+
.container[data-validation=error]{
|
|
25
|
+
background-color:var(--sys-red-background1-level, #fef6f3);
|
|
26
|
+
border-color:var(--sys-red-decor-default, #fdd6cd);
|
|
27
|
+
}
|
|
28
|
+
.container[data-validation=error]:hover{
|
|
29
|
+
background-color:var(--sys-neutral-background2-level, #ffffff);
|
|
30
|
+
border-color:var(--sys-red-decor-hovered, #fac1b3);
|
|
31
|
+
}
|
|
32
|
+
.container[data-validation=error]:not([data-readonly]):focus-within:not([data-disabled]), .container[data-validation=error]:not([data-readonly])[data-focused]:not([data-disabled]){
|
|
33
|
+
outline-width:var(--border-state-focus-m-border-width, 3px);
|
|
34
|
+
outline-style:var(--border-state-focus-m-border-style, solid);
|
|
35
|
+
outline-color:var(--border-state-focus-m-border-color, );
|
|
36
|
+
background-color:var(--sys-neutral-background2-level, #ffffff);
|
|
37
|
+
border-color:var(--sys-red-accent-default, #cb3f3e);
|
|
38
|
+
outline-color:var(--sys-red-decor-activated, #fbab99);
|
|
39
|
+
}
|
|
40
|
+
.container[data-selectable],
|
|
41
|
+
.container[data-selectable] input,
|
|
42
|
+
.container[data-selectable] select,
|
|
43
|
+
.container[data-selectable] textarea,
|
|
44
|
+
.container[data-selectable] span{
|
|
45
|
+
cursor:pointer;
|
|
46
|
+
}
|
|
47
|
+
.container[data-readonly],
|
|
48
|
+
.container[data-readonly] input,
|
|
49
|
+
.container[data-readonly] select,
|
|
50
|
+
.container[data-readonly] textarea,
|
|
51
|
+
.container[data-readonly] span{
|
|
52
|
+
cursor:default;
|
|
53
|
+
}
|
|
54
|
+
.container[data-readonly], .container[data-readonly]:hover{
|
|
55
|
+
background-color:var(--sys-neutral-decor-disabled, #e6e8ef);
|
|
56
|
+
border-color:var(--sys-neutral-decor-disabled, #e6e8ef);
|
|
57
|
+
}
|
|
58
|
+
.container[data-readonly]:focus-within, .container[data-readonly][data-focused]{
|
|
59
|
+
outline-width:var(--border-state-focus-m-border-width, 3px);
|
|
60
|
+
outline-style:var(--border-state-focus-m-border-style, solid);
|
|
61
|
+
outline-color:var(--border-state-focus-m-border-color, );
|
|
62
|
+
background-color:var(--sys-neutral-decor-disabled, #e6e8ef);
|
|
63
|
+
border-color:var(--sys-neutral-decor-disabled, #e6e8ef);
|
|
64
|
+
outline:none;
|
|
65
|
+
}
|
|
66
|
+
.container[data-disabled],
|
|
67
|
+
.container[data-disabled] input,
|
|
68
|
+
.container[data-disabled] select,
|
|
69
|
+
.container[data-disabled] textarea,
|
|
70
|
+
.container[data-disabled] span{
|
|
71
|
+
cursor:not-allowed;
|
|
72
|
+
background-color:var(--sys-neutral-background, #eeeff3);
|
|
73
|
+
}
|
|
74
|
+
.container[data-disabled], .container[data-disabled]:focus-within, .container[data-disabled][data-focused], .container[data-disabled]:hover{
|
|
75
|
+
background-color:var(--sys-neutral-background, #eeeff3);
|
|
76
|
+
border-color:var(--sys-neutral-decor-disabled, #e6e8ef);
|
|
77
|
+
outline:none;
|
|
78
|
+
}
|
|
79
|
+
.container[data-size=s]{
|
|
80
|
+
border-radius:var(--radius-fields-s, 12px);
|
|
81
|
+
border-width:var(--border-width-fields-single, 2px);
|
|
82
|
+
}
|
|
83
|
+
.container[data-size=s],
|
|
84
|
+
.container[data-size=s] input,
|
|
85
|
+
.container[data-size=s] select,
|
|
86
|
+
.container[data-size=s] textarea,
|
|
87
|
+
.container[data-size=s] span{
|
|
88
|
+
font-family:var(--sans-body-s-font-family, SB Sans Interface);
|
|
89
|
+
font-weight:var(--sans-body-s-font-weight, Regular);
|
|
90
|
+
line-height:var(--sans-body-s-line-height, 16px);
|
|
91
|
+
font-size:var(--sans-body-s-font-size, 12px);
|
|
92
|
+
letter-spacing:var(--sans-body-s-letter-spacing, 0.1px);
|
|
93
|
+
paragraph-spacing:var(--sans-body-s-paragraph-spacing, 6.6px);
|
|
94
|
+
}
|
|
95
|
+
.container[data-size=s][data-variant=single-line-container]{
|
|
96
|
+
border-radius:var(--radius-fields-s, 12px);
|
|
97
|
+
border-width:var(--border-width-fields-single, 2px);
|
|
98
|
+
padding-left:var(--space-fields-single-line-container-s-left, 6px);
|
|
99
|
+
gap:var(--space-fields-single-line-container-s-gap, 4px);
|
|
100
|
+
padding-right:var(--space-fields-single-line-container-s-right, 6px);
|
|
101
|
+
height:var(--size-fields-s, 32px);
|
|
102
|
+
}
|
|
103
|
+
.container[data-size=s][data-variant=multi-line-container]{
|
|
104
|
+
border-radius:var(--radius-fields-s, 12px);
|
|
105
|
+
border-width:var(--border-width-fields-single, 2px);
|
|
106
|
+
padding-top:var(--space-fields-multi-line-container-s-top, 6px);
|
|
107
|
+
padding-bottom:var(--space-fields-multi-line-container-s-bottom, 2px);
|
|
108
|
+
padding-left:var(--space-fields-multi-line-container-s-left, 6px);
|
|
109
|
+
padding-right:var(--space-fields-multi-line-container-s-right, 2px);
|
|
110
|
+
}
|
|
111
|
+
.container[data-size=m]{
|
|
112
|
+
border-radius:var(--radius-fields-m, 14px);
|
|
113
|
+
border-width:var(--border-width-fields-single, 2px);
|
|
114
|
+
}
|
|
115
|
+
.container[data-size=m],
|
|
116
|
+
.container[data-size=m] input,
|
|
117
|
+
.container[data-size=m] select,
|
|
118
|
+
.container[data-size=m] textarea,
|
|
119
|
+
.container[data-size=m] span{
|
|
120
|
+
font-family:var(--sans-body-m-font-family, SB Sans Interface);
|
|
121
|
+
font-weight:var(--sans-body-m-font-weight, Regular);
|
|
122
|
+
line-height:var(--sans-body-m-line-height, 20px);
|
|
123
|
+
font-size:var(--sans-body-m-font-size, 14px);
|
|
124
|
+
letter-spacing:var(--sans-body-m-letter-spacing, 0.1px);
|
|
125
|
+
paragraph-spacing:var(--sans-body-m-paragraph-spacing, 7.7px);
|
|
126
|
+
}
|
|
127
|
+
.container[data-size=m][data-variant=single-line-container]{
|
|
128
|
+
border-radius:var(--radius-fields-m, 14px);
|
|
129
|
+
border-width:var(--border-width-fields-single, 2px);
|
|
130
|
+
padding-left:var(--space-fields-single-line-container-m-left, 8px);
|
|
131
|
+
gap:var(--space-fields-single-line-container-m-gap, 4px);
|
|
132
|
+
padding-right:var(--space-fields-single-line-container-m-right, 8px);
|
|
133
|
+
height:var(--size-fields-m, 40px);
|
|
134
|
+
}
|
|
135
|
+
.container[data-size=m][data-variant=multi-line-container]{
|
|
136
|
+
border-radius:var(--radius-fields-m, 14px);
|
|
137
|
+
border-width:var(--border-width-fields-single, 2px);
|
|
138
|
+
padding-top:var(--space-fields-multi-line-container-m-top, 8px);
|
|
139
|
+
padding-bottom:var(--space-fields-multi-line-container-m-bottom, 2px);
|
|
140
|
+
padding-left:var(--space-fields-multi-line-container-m-left, 8px);
|
|
141
|
+
padding-right:var(--space-fields-multi-line-container-m-right, 2px);
|
|
142
|
+
}
|
|
143
|
+
.container[data-size=l]{
|
|
144
|
+
border-radius:var(--radius-fields-l, 16px);
|
|
145
|
+
border-width:var(--border-width-fields-single, 2px);
|
|
146
|
+
}
|
|
147
|
+
.container[data-size=l],
|
|
148
|
+
.container[data-size=l] input,
|
|
149
|
+
.container[data-size=l] select,
|
|
150
|
+
.container[data-size=l] textarea,
|
|
151
|
+
.container[data-size=l] span{
|
|
152
|
+
font-family:var(--sans-body-l-font-family, SB Sans Interface);
|
|
153
|
+
font-weight:var(--sans-body-l-font-weight, Regular);
|
|
154
|
+
line-height:var(--sans-body-l-line-height, 24px);
|
|
155
|
+
font-size:var(--sans-body-l-font-size, 16px);
|
|
156
|
+
letter-spacing:var(--sans-body-l-letter-spacing, 0.1px);
|
|
157
|
+
paragraph-spacing:var(--sans-body-l-paragraph-spacing, 8.8px);
|
|
158
|
+
}
|
|
159
|
+
.container[data-size=l][data-variant=single-line-container]{
|
|
160
|
+
border-radius:var(--radius-fields-l, 16px);
|
|
161
|
+
border-width:var(--border-width-fields-single, 2px);
|
|
162
|
+
padding-left:var(--space-fields-single-line-container-l-left, 10px);
|
|
163
|
+
gap:var(--space-fields-single-line-container-l-gap, 8px);
|
|
164
|
+
padding-right:var(--space-fields-single-line-container-l-right, 10px);
|
|
165
|
+
height:var(--size-fields-l, 48px);
|
|
166
|
+
}
|
|
167
|
+
.container[data-size=l][data-variant=multi-line-container]{
|
|
168
|
+
border-radius:var(--radius-fields-l, 16px);
|
|
169
|
+
border-width:var(--border-width-fields-single, 2px);
|
|
170
|
+
padding-top:var(--space-fields-multi-line-container-l-top, 10px);
|
|
171
|
+
padding-bottom:var(--space-fields-multi-line-container-l-bottom, 2px);
|
|
172
|
+
padding-left:var(--space-fields-multi-line-container-l-left, 10px);
|
|
173
|
+
padding-right:var(--space-fields-multi-line-container-l-right, 2px);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
.prefix{
|
|
177
|
+
display:inline-flex;
|
|
178
|
+
flex-shrink:0;
|
|
179
|
+
color:var(--sys-neutral-text-disabled, #aaaebd);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
.postfix{
|
|
183
|
+
display:inline-flex;
|
|
184
|
+
flex-shrink:0;
|
|
185
|
+
gap:var(--space-fields-postfix-gap, 4px);
|
|
186
|
+
}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { HslaColor, HslColor, HsvaColor, HsvColor, RgbaColor, RgbColor } from 'react-colorful';
|
|
2
|
+
export type { HslaColor, HslColor, HsvaColor, HsvColor, RgbaColor, RgbColor };
|
|
3
|
+
export type Color = RgbColor | HslColor | HsvColor | RgbaColor | HslaColor | HsvaColor | string;
|
|
4
|
+
export type RawColor = {
|
|
5
|
+
hex: string;
|
|
6
|
+
rgb: RgbColor;
|
|
7
|
+
hsl: HslColor;
|
|
8
|
+
hsv: HsvColor;
|
|
9
|
+
rgba: RgbaColor;
|
|
10
|
+
hsla: HslaColor;
|
|
11
|
+
hsva: HsvaColor;
|
|
12
|
+
};
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { HslaColor, HslColor, HsvaColor, HsvColor, RgbaColor, RgbColor } from 'react-colorful';
|
|
2
|
+
import { Color, RawColor } from '../types';
|
|
3
|
+
export declare const hexToRgba: (hex: string) => RgbaColor;
|
|
4
|
+
export declare const hsvaToHsla: ({ h, s, v, a }: HsvaColor) => HslaColor;
|
|
5
|
+
export declare const rgbaToHex: ({ r, g, b, a }: RgbaColor) => string;
|
|
6
|
+
export declare const rgbaToHsva: ({ r, g, b, a }: RgbaColor) => HsvaColor;
|
|
7
|
+
export declare const roundHsva: (hsva: HsvaColor) => HsvaColor;
|
|
8
|
+
export declare const rgbaToRgb: ({ r, g, b }: RgbaColor) => RgbColor;
|
|
9
|
+
export declare const hslaToHsl: ({ h, s, l }: HslaColor) => HslColor;
|
|
10
|
+
export declare const hsvaToHsv: (hsva: HsvaColor) => HsvColor;
|
|
11
|
+
export declare function colorToHex(value: Color): string;
|
|
12
|
+
export declare function colorToRawValue(value: Color): RawColor;
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { HSVA_REGEX, RGBA_REGEX } from '../constants';
|
|
2
|
+
import { round } from './round';
|
|
3
|
+
import { isHslaColor, isHslaString, isHslColor, isHsvaColor, isHsvaString, isHsvColor, isRbgaString, isRbgColor, isRgbaColor, } from './typeGuards';
|
|
4
|
+
/**
|
|
5
|
+
* Valid CSS <angle> units.
|
|
6
|
+
* https://developer.mozilla.org/en-US/docs/Web/CSS/angle
|
|
7
|
+
*/
|
|
8
|
+
const angleUnits = {
|
|
9
|
+
grad: 360 / 400,
|
|
10
|
+
turn: 360,
|
|
11
|
+
rad: 360 / (Math.PI * 2),
|
|
12
|
+
};
|
|
13
|
+
const hexToHsva = (hex) => rgbaToHsva(hexToRgba(hex));
|
|
14
|
+
export const hexToRgba = (hex) => {
|
|
15
|
+
if (hex[0] === '#')
|
|
16
|
+
hex = hex.substring(1);
|
|
17
|
+
if (hex.length < 6) {
|
|
18
|
+
return {
|
|
19
|
+
r: parseInt(hex[0] + hex[0], 16),
|
|
20
|
+
g: parseInt(hex[1] + hex[1], 16),
|
|
21
|
+
b: parseInt(hex[2] + hex[2], 16),
|
|
22
|
+
a: hex.length === 4 ? round(parseInt(hex[3] + hex[3], 16) / 255, 2) : 1,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
r: parseInt(hex.substring(0, 2), 16),
|
|
27
|
+
g: parseInt(hex.substring(2, 4), 16),
|
|
28
|
+
b: parseInt(hex.substring(4, 6), 16),
|
|
29
|
+
a: hex.length === 8 ? round(parseInt(hex.substring(6, 8), 16) / 255, 2) : 1,
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
const parseHue = (value, unit = 'deg') => Number(value) * (angleUnits[unit] || 1);
|
|
33
|
+
const hslaStringToHsva = (hslString) => {
|
|
34
|
+
const matcher = /hsla?\(?\s*(-?\d*\.?\d+)(deg|rad|grad|turn)?[,\s]+(-?\d*\.?\d+)%?[,\s]+(-?\d*\.?\d+)%?,?\s*[/\s]*(-?\d*\.?\d+)?(%)?\s*\)?/i;
|
|
35
|
+
const match = matcher.exec(hslString);
|
|
36
|
+
if (!match)
|
|
37
|
+
return { h: 0, s: 0, v: 0, a: 1 };
|
|
38
|
+
return hslaToHsva({
|
|
39
|
+
h: parseHue(match[1], match[2]),
|
|
40
|
+
s: Number(match[3]),
|
|
41
|
+
l: Number(match[4]),
|
|
42
|
+
a: match[5] === undefined ? 1 : Number(match[5]) / (match[6] ? 100 : 1),
|
|
43
|
+
});
|
|
44
|
+
};
|
|
45
|
+
const hslaToHsva = ({ h, s, l, a }) => {
|
|
46
|
+
s *= (l < 50 ? l : 100 - l) / 100;
|
|
47
|
+
return {
|
|
48
|
+
h: h,
|
|
49
|
+
s: s > 0 ? ((2 * s) / (l + s)) * 100 : 0,
|
|
50
|
+
v: l + s,
|
|
51
|
+
a,
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
const hsvaToHex = (hsva) => rgbaToHex(hsvaToRgba(hsva));
|
|
55
|
+
export const hsvaToHsla = ({ h, s, v, a }) => {
|
|
56
|
+
const hh = ((200 - s) * v) / 100;
|
|
57
|
+
return {
|
|
58
|
+
h: round(h),
|
|
59
|
+
s: round(hh > 0 && hh < 200 ? ((s * v) / 100 / (hh <= 100 ? hh : 200 - hh)) * 100 : 0),
|
|
60
|
+
l: round(hh / 2),
|
|
61
|
+
a: round(a, 2),
|
|
62
|
+
};
|
|
63
|
+
};
|
|
64
|
+
const hsvaToRgba = ({ h, s, v, a }) => {
|
|
65
|
+
h = (h / 360) * 6;
|
|
66
|
+
s = s / 100;
|
|
67
|
+
v = v / 100;
|
|
68
|
+
const hh = Math.floor(h), b = v * (1 - s), c = v * (1 - (h - hh) * s), d = v * (1 - (1 - h + hh) * s), module = hh % 6;
|
|
69
|
+
return {
|
|
70
|
+
r: round([v, c, b, b, d, v][module] * 255),
|
|
71
|
+
g: round([d, v, v, c, b, b][module] * 255),
|
|
72
|
+
b: round([b, b, d, v, v, c][module] * 255),
|
|
73
|
+
a: round(a, 2),
|
|
74
|
+
};
|
|
75
|
+
};
|
|
76
|
+
const hsvaStringToHsva = (hsvString) => {
|
|
77
|
+
const matcher = HSVA_REGEX;
|
|
78
|
+
const match = matcher.exec(hsvString);
|
|
79
|
+
if (!match)
|
|
80
|
+
return { h: 0, s: 0, v: 0, a: 1 };
|
|
81
|
+
return roundHsva({
|
|
82
|
+
h: parseHue(match[1], match[2]),
|
|
83
|
+
s: Number(match[3]),
|
|
84
|
+
v: Number(match[4]),
|
|
85
|
+
a: match[5] === undefined ? 1 : Number(match[5]) / (match[6] ? 100 : 1),
|
|
86
|
+
});
|
|
87
|
+
};
|
|
88
|
+
const rgbaStringToHsva = (rgbaString) => {
|
|
89
|
+
const matcher = RGBA_REGEX;
|
|
90
|
+
const match = matcher.exec(rgbaString);
|
|
91
|
+
if (!match)
|
|
92
|
+
return { h: 0, s: 0, v: 0, a: 1 };
|
|
93
|
+
return rgbaToHsva({
|
|
94
|
+
r: Number(match[1]) / (match[2] ? 100 / 255 : 1),
|
|
95
|
+
g: Number(match[3]) / (match[4] ? 100 / 255 : 1),
|
|
96
|
+
b: Number(match[5]) / (match[6] ? 100 / 255 : 1),
|
|
97
|
+
a: match[7] === undefined ? 1 : Number(match[7]) / (match[8] ? 100 : 1),
|
|
98
|
+
});
|
|
99
|
+
};
|
|
100
|
+
const format = (number) => {
|
|
101
|
+
const hex = number.toString(16);
|
|
102
|
+
return hex.length < 2 ? '0' + hex : hex;
|
|
103
|
+
};
|
|
104
|
+
export const rgbaToHex = ({ r, g, b, a }) => {
|
|
105
|
+
const alphaHex = a < 1 ? format(round(a * 255)) : '';
|
|
106
|
+
return '#' + format(r) + format(g) + format(b) + alphaHex;
|
|
107
|
+
};
|
|
108
|
+
export const rgbaToHsva = ({ r, g, b, a }) => {
|
|
109
|
+
const max = Math.max(r, g, b);
|
|
110
|
+
const delta = max - Math.min(r, g, b);
|
|
111
|
+
// prettier-ignore
|
|
112
|
+
// eslint-disable-next-line no-nested-ternary
|
|
113
|
+
const hh = delta
|
|
114
|
+
// eslint-disable-next-line no-nested-ternary
|
|
115
|
+
? max === r
|
|
116
|
+
? (g - b) / delta
|
|
117
|
+
: max === g
|
|
118
|
+
? 2 + (b - r) / delta
|
|
119
|
+
: 4 + (r - g) / delta
|
|
120
|
+
: 0;
|
|
121
|
+
return {
|
|
122
|
+
h: round(60 * (hh < 0 ? hh + 6 : hh)),
|
|
123
|
+
s: round(max ? (delta / max) * 100 : 0),
|
|
124
|
+
v: round((max / 255) * 100),
|
|
125
|
+
a,
|
|
126
|
+
};
|
|
127
|
+
};
|
|
128
|
+
export const roundHsva = (hsva) => ({
|
|
129
|
+
h: round(hsva.h),
|
|
130
|
+
s: round(hsva.s),
|
|
131
|
+
v: round(hsva.v),
|
|
132
|
+
a: round(hsva.a, 2),
|
|
133
|
+
});
|
|
134
|
+
export const rgbaToRgb = ({ r, g, b }) => ({ r, g, b });
|
|
135
|
+
export const hslaToHsl = ({ h, s, l }) => ({ h, s, l });
|
|
136
|
+
export const hsvaToHsv = (hsva) => {
|
|
137
|
+
const { h, s, v } = roundHsva(hsva);
|
|
138
|
+
return { h, s, v };
|
|
139
|
+
};
|
|
140
|
+
export function colorToHex(value) {
|
|
141
|
+
if (isHslColor(value) || isHslaColor(value)) {
|
|
142
|
+
return hsvaToHex(hslaToHsva(Object.assign({ a: 1 }, value)));
|
|
143
|
+
}
|
|
144
|
+
if (isRbgColor(value) || isRgbaColor(value)) {
|
|
145
|
+
return rgbaToHex(Object.assign({ a: 1 }, value));
|
|
146
|
+
}
|
|
147
|
+
if (isHsvColor(value) || isHsvaColor(value)) {
|
|
148
|
+
return hsvaToHex(Object.assign({ a: 1 }, value));
|
|
149
|
+
}
|
|
150
|
+
if (isHslaString(value)) {
|
|
151
|
+
return hsvaToHex(hslaStringToHsva(value));
|
|
152
|
+
}
|
|
153
|
+
if (isRbgaString(value)) {
|
|
154
|
+
return hsvaToHex(rgbaStringToHsva(value));
|
|
155
|
+
}
|
|
156
|
+
if (isHsvaString(value)) {
|
|
157
|
+
return hsvaToHex(hsvaStringToHsva(value));
|
|
158
|
+
}
|
|
159
|
+
return value;
|
|
160
|
+
}
|
|
161
|
+
export function colorToRawValue(value) {
|
|
162
|
+
const hexColor = colorToHex(value);
|
|
163
|
+
return {
|
|
164
|
+
hex: hexColor,
|
|
165
|
+
rgb: rgbaToRgb(hexToRgba(hexColor)),
|
|
166
|
+
rgba: hexToRgba(hexColor),
|
|
167
|
+
hsv: hsvaToHsv(hexToHsva(hexColor)),
|
|
168
|
+
hsva: hexToHsva(hexColor),
|
|
169
|
+
hsl: hslaToHsl(hsvaToHsla(hexToHsva(hexColor))),
|
|
170
|
+
hsla: hsvaToHsla(hexToHsva(hexColor)),
|
|
171
|
+
};
|
|
172
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './convert';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './convert';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const round: (number: number, digits?: number, base?: number) => number;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const round = (number, digits = 0, base = Math.pow(10, digits)) => Math.round(base * number) / base;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Color, HslaColor, HslColor, HsvaColor, HsvColor, RgbaColor, RgbColor } from '../types';
|
|
2
|
+
export declare function isRbgColor(value: Color): value is RgbColor;
|
|
3
|
+
export declare function isRgbaColor(value: Color): value is RgbaColor;
|
|
4
|
+
export declare function isHslColor(value: Color): value is HslColor;
|
|
5
|
+
export declare function isHslaColor(value: Color): value is HslaColor;
|
|
6
|
+
export declare function isHsvColor(value: Color): value is HsvColor;
|
|
7
|
+
export declare function isHsvaColor(value: Color): value is HsvaColor;
|
|
8
|
+
export declare function isHslaString(value: string): boolean;
|
|
9
|
+
export declare function isHsvaString(value: string): boolean;
|
|
10
|
+
export declare function isRbgaString(value: string): boolean;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { HSLA_REGEX, HSVA_REGEX, RGBA_REGEX } from '../constants';
|
|
2
|
+
export function isRbgColor(value) {
|
|
3
|
+
return typeof value === 'object' && 'r' in value && 'g' in value && 'b' in value;
|
|
4
|
+
}
|
|
5
|
+
export function isRgbaColor(value) {
|
|
6
|
+
return typeof value === 'object' && isRbgColor(value) && 'a' in value;
|
|
7
|
+
}
|
|
8
|
+
export function isHslColor(value) {
|
|
9
|
+
return typeof value === 'object' && 'h' in value && 's' in value && 'l' in value;
|
|
10
|
+
}
|
|
11
|
+
export function isHslaColor(value) {
|
|
12
|
+
return typeof value === 'object' && isHslColor(value) && 'a' in value;
|
|
13
|
+
}
|
|
14
|
+
export function isHsvColor(value) {
|
|
15
|
+
return typeof value === 'object' && 'h' in value && 's' in value && 'v' in value;
|
|
16
|
+
}
|
|
17
|
+
export function isHsvaColor(value) {
|
|
18
|
+
return typeof value === 'object' && isHsvColor(value) && 'a' in value;
|
|
19
|
+
}
|
|
20
|
+
export function isHslaString(value) {
|
|
21
|
+
const matcher = HSLA_REGEX;
|
|
22
|
+
const match = matcher.exec(value);
|
|
23
|
+
return Boolean(match);
|
|
24
|
+
}
|
|
25
|
+
export function isHsvaString(value) {
|
|
26
|
+
const matcher = HSVA_REGEX;
|
|
27
|
+
const match = matcher.exec(value);
|
|
28
|
+
return Boolean(match);
|
|
29
|
+
}
|
|
30
|
+
export function isRbgaString(value) {
|
|
31
|
+
const matcher = RGBA_REGEX;
|
|
32
|
+
const match = matcher.exec(value);
|
|
33
|
+
return Boolean(match);
|
|
34
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const validHex: (value: string, alpha?: boolean) => boolean;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
const matcher = /^#?([0-9A-F]{3,8})$/i;
|
|
2
|
+
export const validHex = (value, alpha) => {
|
|
3
|
+
const match = matcher.exec(value);
|
|
4
|
+
const length = match ? match[1].length : 0;
|
|
5
|
+
return (length === 3 || // '#rgb' format
|
|
6
|
+
length === 6 || // '#rrggbb' format
|
|
7
|
+
(Boolean(alpha) && length === 4) || // '#rgba' format
|
|
8
|
+
(Boolean(alpha) && length === 8) // '#rrggbbaa' format
|
|
9
|
+
);
|
|
10
|
+
};
|
package/package.json
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@snack-uikit/color-picker",
|
|
3
|
+
"publishConfig": {
|
|
4
|
+
"access": "public"
|
|
5
|
+
},
|
|
6
|
+
"title": "Color Picker",
|
|
7
|
+
"version": "0.0.1-preview-364c0f5c.0",
|
|
8
|
+
"sideEffects": [
|
|
9
|
+
"*.css",
|
|
10
|
+
"*.woff",
|
|
11
|
+
"*.woff2"
|
|
12
|
+
],
|
|
13
|
+
"description": "",
|
|
14
|
+
"main": "./dist/index.js",
|
|
15
|
+
"module": "./dist/index.js",
|
|
16
|
+
"homepage": "https://cloud-ru-tech.github.io/snack-uikit/packages/color-picker",
|
|
17
|
+
"repository": {
|
|
18
|
+
"type": "git",
|
|
19
|
+
"url": "https://github.com/cloud-ru-tech/snack-uikit/tree/master",
|
|
20
|
+
"directory": "packages/color-picker"
|
|
21
|
+
},
|
|
22
|
+
"author": "Nikita Ershov <niershov@cloud.ru>",
|
|
23
|
+
"contributors": [
|
|
24
|
+
"Nikita Ershov <niershov@cloud.ru>"
|
|
25
|
+
],
|
|
26
|
+
"files": [
|
|
27
|
+
"dist",
|
|
28
|
+
"src",
|
|
29
|
+
"./CHANGELOG.md",
|
|
30
|
+
"./LICENSE"
|
|
31
|
+
],
|
|
32
|
+
"license": "Apache-2.0",
|
|
33
|
+
"scripts": {},
|
|
34
|
+
"dependencies": {
|
|
35
|
+
"@snack-uikit/button": "0.17.5",
|
|
36
|
+
"@snack-uikit/icons": "0.22.1",
|
|
37
|
+
"@snack-uikit/input-private": "3.2.1",
|
|
38
|
+
"@snack-uikit/segmented-control": "0.2.2",
|
|
39
|
+
"@snack-uikit/utils": "3.4.0",
|
|
40
|
+
"react-colorful": "5.6.1"
|
|
41
|
+
},
|
|
42
|
+
"devDependencies": {
|
|
43
|
+
"classnames": "2.5.1"
|
|
44
|
+
},
|
|
45
|
+
"peerDependencies": {
|
|
46
|
+
"@snack-uikit/locale": "*"
|
|
47
|
+
},
|
|
48
|
+
"gitHead": "ef1b9ca42284983d83cc6bca7c191f041401e031"
|
|
49
|
+
}
|