10
10
* governing permissions and limitations under the License.
11
11
*/
12
12
13
- export const generateRGB_R = ( orientation , dir : boolean , zValue : number ) => {
13
+ import { CSSProperties , useMemo } from 'react' ;
14
+
15
+ const generateRGB_R = ( orientation , dir : boolean , zValue : number ) => {
14
16
let maskImage = `linear-gradient(to ${ orientation [ Number ( ! dir ) ] } , transparent, #000)` ;
15
17
let result = {
16
18
colorAreaStyles : {
@@ -25,7 +27,7 @@ export const generateRGB_R = (orientation, dir: boolean, zValue: number) => {
25
27
return result ;
26
28
} ;
27
29
28
- export const generateRGB_G = ( orientation , dir : boolean , zValue : number ) => {
30
+ const generateRGB_G = ( orientation , dir : boolean , zValue : number ) => {
29
31
let maskImage = `linear-gradient(to ${ orientation [ Number ( ! dir ) ] } , transparent, #000)` ;
30
32
let result = {
31
33
colorAreaStyles : {
@@ -40,7 +42,7 @@ export const generateRGB_G = (orientation, dir: boolean, zValue: number) => {
40
42
return result ;
41
43
} ;
42
44
43
- export const generateRGB_B = ( orientation , dir : boolean , zValue : number ) => {
45
+ const generateRGB_B = ( orientation , dir : boolean , zValue : number ) => {
44
46
let maskImage = `linear-gradient(to ${ orientation [ Number ( ! dir ) ] } , transparent, #000)` ;
45
47
let result = {
46
48
colorAreaStyles : {
@@ -56,7 +58,7 @@ export const generateRGB_B = (orientation, dir: boolean, zValue: number) => {
56
58
} ;
57
59
58
60
59
- export const generateHSL_H = ( orientation , dir : boolean , zValue : number ) => {
61
+ const generateHSL_H = ( orientation , dir : boolean , zValue : number ) => {
60
62
let result = {
61
63
colorAreaStyles : { } ,
62
64
gradientStyles : {
@@ -70,7 +72,7 @@ export const generateHSL_H = (orientation, dir: boolean, zValue: number) => {
70
72
return result ;
71
73
} ;
72
74
73
- export const generateHSL_S = ( orientation , dir : boolean , alphaValue : number ) => {
75
+ const generateHSL_S = ( orientation , dir : boolean , alphaValue : number ) => {
74
76
let result = {
75
77
colorAreaStyles : { } ,
76
78
gradientStyles : {
@@ -84,7 +86,7 @@ export const generateHSL_S = (orientation, dir: boolean, alphaValue: number) =>
84
86
return result ;
85
87
} ;
86
88
87
- export const generateHSL_L = ( orientation , dir : boolean , zValue : number ) => {
89
+ const generateHSL_L = ( orientation , dir : boolean , zValue : number ) => {
88
90
let result = {
89
91
colorAreaStyles : { } ,
90
92
gradientStyles : {
@@ -98,7 +100,7 @@ export const generateHSL_L = (orientation, dir: boolean, zValue: number) => {
98
100
} ;
99
101
100
102
101
- export const generateHSB_H = ( orientation , dir : boolean , zValue : number ) => {
103
+ const generateHSB_H = ( orientation , dir : boolean , zValue : number ) => {
102
104
let result = {
103
105
colorAreaStyles : { } ,
104
106
gradientStyles : {
@@ -112,7 +114,7 @@ export const generateHSB_H = (orientation, dir: boolean, zValue: number) => {
112
114
return result ;
113
115
} ;
114
116
115
- export const generateHSB_S = ( orientation , dir : boolean , alphaValue : number ) => {
117
+ const generateHSB_S = ( orientation , dir : boolean , alphaValue : number ) => {
116
118
let result = {
117
119
colorAreaStyles : { } ,
118
120
gradientStyles : {
@@ -126,7 +128,7 @@ export const generateHSB_S = (orientation, dir: boolean, alphaValue: number) =>
126
128
return result ;
127
129
} ;
128
130
129
- export const generateHSB_B = ( orientation , dir : boolean , alphaValue : number ) => {
131
+ const generateHSB_B = ( orientation , dir : boolean , alphaValue : number ) => {
130
132
let result = {
131
133
colorAreaStyles : { } ,
132
134
gradientStyles : {
@@ -139,3 +141,109 @@ export const generateHSB_B = (orientation, dir: boolean, alphaValue: number) =>
139
141
} ;
140
142
return result ;
141
143
} ;
144
+
145
+
146
+ interface Gradients {
147
+ colorAreaStyleProps : {
148
+ style : CSSProperties
149
+ } ,
150
+ gradientStyleProps : {
151
+ style : CSSProperties
152
+ } ,
153
+ thumbStyleProps : {
154
+ style : CSSProperties
155
+ }
156
+ }
157
+
158
+ export function useColorAreaGradient ( { direction, state, zChannel, xChannel, isDisabled} ) : Gradients {
159
+ let returnVal = useMemo < Gradients > ( ( ) => {
160
+ let orientation = [ 'top' , direction === 'rtl' ? 'left' : 'right' ] ;
161
+ let dir = false ;
162
+ let background = { colorAreaStyles : { } , gradientStyles : { } } ;
163
+ let zValue = state . value . getChannelValue ( zChannel ) ;
164
+ let { minValue : zMin , maxValue : zMax } = state . value . getChannelRange ( zChannel ) ;
165
+ let alphaValue = ( zValue - zMin ) / ( zMax - zMin ) ;
166
+ let isHSL = state . value . getColorSpace ( ) === 'hsl' ;
167
+ if ( ! isDisabled ) {
168
+ switch ( zChannel ) {
169
+ case 'red' : {
170
+ dir = xChannel === 'green' ;
171
+ background = generateRGB_R ( orientation , dir , zValue ) ;
172
+ break ;
173
+ }
174
+ case 'green' : {
175
+ dir = xChannel === 'red' ;
176
+ background = generateRGB_G ( orientation , dir , zValue ) ;
177
+ break ;
178
+ }
179
+ case 'blue' : {
180
+ dir = xChannel === 'red' ;
181
+ background = generateRGB_B ( orientation , dir , zValue ) ;
182
+ break ;
183
+ }
184
+ case 'hue' : {
185
+ dir = xChannel !== 'saturation' ;
186
+ if ( isHSL ) {
187
+ background = generateHSL_H ( orientation , dir , zValue ) ;
188
+ } else {
189
+ background = generateHSB_H ( orientation , dir , zValue ) ;
190
+ }
191
+ break ;
192
+ }
193
+ case 'saturation' : {
194
+ dir = xChannel === 'hue' ;
195
+ if ( isHSL ) {
196
+ background = generateHSL_S ( orientation , dir , alphaValue ) ;
197
+ } else {
198
+ background = generateHSB_S ( orientation , dir , alphaValue ) ;
199
+ }
200
+ break ;
201
+ }
202
+ case 'brightness' : {
203
+ dir = xChannel === 'hue' ;
204
+ background = generateHSB_B ( orientation , dir , alphaValue ) ;
205
+ break ;
206
+ }
207
+ case 'lightness' : {
208
+ dir = xChannel === 'hue' ;
209
+ background = generateHSL_L ( orientation , dir , zValue ) ;
210
+ break ;
211
+ }
212
+ }
213
+ }
214
+
215
+ let { x, y} = state . getThumbPosition ( ) ;
216
+
217
+ if ( direction === 'rtl' ) {
218
+ x = 1 - x ;
219
+ }
220
+
221
+ return {
222
+ colorAreaStyleProps : {
223
+ style : {
224
+ position : 'relative' ,
225
+ touchAction : 'none' ,
226
+ ...background . colorAreaStyles
227
+ }
228
+ } ,
229
+ gradientStyleProps : {
230
+ style : {
231
+ touchAction : 'none' ,
232
+ ...background . gradientStyles
233
+ }
234
+ } ,
235
+ thumbStyleProps : {
236
+ style : {
237
+ position : 'absolute' ,
238
+ left : `${ x * 100 } %` ,
239
+ top : `${ y * 100 } %` ,
240
+ transform : 'translate(0%, 0%)' ,
241
+ touchAction : 'none'
242
+ }
243
+ }
244
+ } ;
245
+ } , [ direction , state , zChannel , xChannel , isDisabled ] ) ;
246
+
247
+ return returnVal ;
248
+ }
249
+
0 commit comments