@thednp/color-picker 0.0.2-alpha4 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,8 +1,43 @@
1
+ @import "variables";
2
+
1
3
  /* :host */
2
4
  color-picker,
3
5
  .color-picker {
4
6
  position: relative;
5
7
  display: flex;
8
+
9
+ @each $name in "white", "black" {
10
+ @each $lvl in $transparency-levels {
11
+ @if (type-of($name) == "string" and type-of($lvl) == "number") {
12
+ $color: #fff;
13
+ @if $name == "black" {
14
+ $color: #000;
15
+ }
16
+ $rgba: rgba($color, $lvl * .01);
17
+ --#{$name}-#{$lvl}: #{$rgba};
18
+ }
19
+ }
20
+ }
21
+ --dropdown-transition: #{$dropdown-transition};
22
+ --btn-transition: #{$btn-transition};
23
+ --options-transition: #{$options-transition};
24
+ --dropdown-bg: var(--black-75);
25
+ --dropdown-color: var(--white-75);
26
+ --dropdown-shadow: 0 6px 12px var(--black-33);
27
+ --dropdown-scrollbar-bg: var(--white-33);
28
+ --dropdown-scrollbar-bg-hover: var(--white-50);
29
+ --knob-bg: #000;
30
+ --knob-border: 1px solid var(--white-90);
31
+ --knob-shadow-hover: 0 0 0 6px var(--white-50);
32
+ --knob-shadow-active: 0 0 0 6px var(--white-90);
33
+ --input-border: 1px solid var(--white-15);
34
+ --input-border-hover: 1px solid var(--white-33);
35
+ --input-bg-hover: var(--black-15);
36
+ --option-color-hover: var(--black-75);
37
+ --option-bg-hover: var(--white-50);
38
+ --option-color-active: var(--black-75);
39
+ --option-bg-active: var(--white-90);
40
+ --visual-shadow: 0 0 0 1px var(--white-15) inset;
6
41
  }
7
42
 
8
43
  color-picker:focus,
@@ -18,12 +53,12 @@ color-picker:focus,
18
53
  flex-direction: column;
19
54
  width: min-content;
20
55
  padding: .5rem;
21
- color: rgba(255,255,255,.8);
22
- background: rgba(0,0,0,.75);
56
+ color: var(--dropdown-color);
57
+ background: var(--dropdown-bg);
23
58
  border-radius: .5rem;
24
- box-shadow: 0 6px 12px rgba(0, 0, 0, .4);
59
+ box-shadow: var(--dropdown-shadow);
25
60
  opacity: 0;
26
- transition: transform .33s ease, opacity .33s ease;
61
+ transition: var(--dropdown-transition);
27
62
  }
28
63
 
29
64
  .color-dropdown.picker { left: 0; }
@@ -65,12 +100,13 @@ color-picker:focus,
65
100
  border-radius: .25rem;
66
101
  outline: none;
67
102
  appearance: none;
68
- transition-duration: .33s;
69
- transition-property: box-shadow, border;
103
+ // transition-duration: .33s;
104
+ // transition-property: box-shadow, border;
105
+ transition: var(--btn-transition);
70
106
  }
71
107
  .btn-appearance:focus,
72
108
  .btn-appearance:hover {
73
- box-shadow: 0 0 0 3px rgba(0,0,0,.15);
109
+ box-shadow: 0 0 0 3px var(--black-15);
74
110
  }
75
111
 
76
112
  /* color-preview */
@@ -80,23 +116,23 @@ color-picker:focus,
80
116
  }
81
117
 
82
118
  .txt-dark .color-preview {
83
- color: rgba(255,255,255,.8);
119
+ color: var(--white-75);
84
120
  }
85
121
  .txt-dark .color-preview:focus {
86
- box-shadow: 0 0 0 1px rgb(255,255,255) inset, 0 0 0 3px rgba(0,0,0,.15);
122
+ box-shadow: 0 0 0 1px #fff inset, 0 0 0 3px var(--black-15);
87
123
  }
88
124
  .txt-dark .color-preview::placeholder {
89
- color: rgba(255,255,255,.6);
125
+ color: var(--white-50);
90
126
  }
91
127
  .txt-light .color-preview {
92
- color: rgba(0,0,0,.8);
128
+ color: var(--black-75);
93
129
  }
94
130
  .txt-light .color-preview:focus {
95
- color: rgba(0,0,0,.8);
96
- box-shadow: 0 0 0 1px rgba(0,0,0,.5) inset, 0 0 0 3px rgba(0,0,0,.15);
131
+ color: var(--black-75);
132
+ box-shadow: 0 0 0 1px var(--black-50) inset, 0 0 0 3px var(--black-15);
97
133
  }
98
134
  .txt-light .color-preview::placeholder {
99
- color: rgba(0,0,0,.6);
135
+ color: var(--black-50);
100
136
  }
101
137
 
102
138
  /* picker-toggle */
@@ -128,18 +164,18 @@ color-picker:focus,
128
164
  border-radius: 0 .25rem .25rem 0;
129
165
  }
130
166
  .txt-light .menu-toggle {
131
- background: rgba(0,0,0,.5);
167
+ background: var(--black-50);
132
168
  }
133
169
  .txt-light .menu-toggle:focus,
134
170
  .txt-light .menu-toggle:focus {
135
- background: rgba(0,0,0,.7);
171
+ background: var(--black-75);
136
172
  }
137
173
  .txt-dark .menu-toggle {
138
- background: rgba(255,255,255,.33);
174
+ background: var(--white-33);
139
175
  }
140
176
  .txt-dark .menu-toggle:focus,
141
177
  .txt-dark .menu-toggle:focus {
142
- background: rgba(255,255,255,.5);
178
+ background: var(--white-50);
143
179
  }
144
180
  .menu-toggle svg {
145
181
  width: auto;
@@ -168,11 +204,11 @@ color-picker:focus,
168
204
  }
169
205
 
170
206
  .scrollable:hover::-webkit-scrollbar-thumb {
171
- background-color: rgba(255,255,255,.33);
207
+ background-color: var(--dropdown-scrollbar-bg);
172
208
  }
173
209
 
174
210
  .scrollable::-webkit-scrollbar-thumb:hover {
175
- background-color: #fff;
211
+ background-color: var(--dropdown-scrollbar-bg-hover);
176
212
  }
177
213
 
178
214
  /* color-defaults */
@@ -205,27 +241,28 @@ color-picker:focus,
205
241
 
206
242
  .color-defaults .color-option:focus,
207
243
  .color-defaults .color-option:hover {
208
- background: rgba(255,255,255,.3);
244
+ color: var(--option-color-hover);
245
+ background: var(--option-bg-hover);
209
246
  outline: none;
210
247
  }
211
248
 
212
249
  .color-defaults .color-option:active,
213
250
  .color-defaults .color-option.active {
214
- color: #000;
215
- background: #fff;
251
+ color: var(--option-color-active);
252
+ background: var(--option-bg-active);
216
253
  }
217
254
 
218
255
  /* color-options grid */
219
256
  .color-options {
220
- display: grid;
221
- padding: 0;
222
- margin: 0;
223
- list-style: none;
224
257
  --grid-item-size: 2rem; // grid item width / height
225
258
  --grid-fit: 5; // grid columns
226
259
  --grid-gap: .25rem; // grid vertical / horizontal spacing
227
260
  --grid-height: auto; // default height
228
261
  --grid-hover-height: auto; // height on hover
262
+ display: grid;
263
+ padding: 0;
264
+ margin: 0;
265
+ list-style: none;
229
266
  grid-template-columns: repeat(var(--grid-fit), var(--grid-item-size));
230
267
  grid-template-rows: repeat(auto-fill, var(--grid-item-size));
231
268
  gap: var(--grid-gap);
@@ -234,7 +271,7 @@ color-picker:focus,
234
271
  height: var(--grid-height);
235
272
  margin: 0 -.5rem 0 0; // 0.5rem is the scrollbar width
236
273
  overflow-y: scroll;
237
- transition: height .33s ease;
274
+ transition: var(--options-transition);
238
275
  }
239
276
  .color-options.scrollable:hover {
240
277
  height: var(--grid-hover-height);
@@ -272,7 +309,7 @@ color-picker:focus,
272
309
  .color-options .color-option:active::before,
273
310
  .color-options .color-option:focus::before {
274
311
  content: "";
275
- border: 3px solid rgba(255,255,255.3,.75);
312
+ border: 3px solid var(--white-75);
276
313
  mix-blend-mode: difference;
277
314
  }
278
315
 
@@ -294,10 +331,10 @@ color-picker:focus,
294
331
  }
295
332
  }
296
333
  .txt-dark .color-options .color-option.active:after {
297
- box-shadow: 0 0 0 4px rgba(255,255,255,.9);
334
+ box-shadow: 0 0 0 4px var(--white-90);
298
335
  }
299
336
  .txt-light .color-options .color-option.active:after {
300
- box-shadow: 0 0 0 4px rgba(0,0,0,.9);
337
+ box-shadow: 0 0 0 4px var(--black-90);
301
338
  }
302
339
 
303
340
  /* color-form */
@@ -328,25 +365,27 @@ color-picker:focus,
328
365
  color: inherit;
329
366
  text-align: right;
330
367
  background: transparent;
331
- border: 1px solid rgba(255,255,255,.15);
368
+ border: var(--input-border);
332
369
  outline: none;
333
370
  }
334
371
 
335
372
  .color-input.hex {
336
373
  width: 92.5%;
337
374
  max-width: 92.5%;
338
- /* width: calc(100% - 4% - 1rem); */
339
375
  }
340
376
 
341
377
  .color-input:active,
342
378
  .color-input:focus {
343
- background: rgba(0,0,0,.25);
344
- border: 1px solid rgba(255,255,255,.33);
379
+ background: var(--input-bg-hover);
380
+ border: var(--input-border-hover);
345
381
  }
346
382
 
347
383
  /* visual control */
348
384
  .visual-control {
349
385
  height: 150px;
386
+ /* important for mobile devices */
387
+ touch-action: none;
388
+ box-shadow: var(--visual-shadow);
350
389
  }
351
390
 
352
391
  .visual-control1 {
@@ -389,20 +428,22 @@ color-picker:focus,
389
428
  top: 0;
390
429
  left: 0;
391
430
  height: 7px;
431
+ /* important for mobile devices */
432
+ touch-action: none;
392
433
  user-select: none;
393
- background-color: #000;
394
- border: 1px solid #fff;
434
+ background-color: var(--knob-bg);
435
+ border: var(--knob-border);
395
436
  border-radius: 5px;
396
437
  outline: none;
397
438
  will-change: transform;
398
439
  }
399
440
  .knob:hover {
400
- box-shadow: 0 0 0 6px rgba(255,255,255,.5);
441
+ box-shadow: var(--knob-shadow-hover);
401
442
  }
402
443
  .knob:focus,
403
444
  .knob:active {
404
445
  z-index: 1;
405
- box-shadow: 0 0 0 6px rgba(255,255,255,.9);
446
+ box-shadow: var(--knob-shadow-active);
406
447
  }
407
448
 
408
449
  /* color-pointer */
@@ -413,26 +454,26 @@ color-picker:focus,
413
454
  }
414
455
 
415
456
  .txt-dark .color-pointer {
416
- box-shadow: 0 0 0 5px rgba(255,255,255,.5);
457
+ box-shadow: 0 0 0 5px var(--white-50);
417
458
  }
418
459
  .txt-light .color-pointer {
419
- box-shadow: 0 0 0 5px rgba(0,0,0,.5);
460
+ box-shadow: 0 0 0 5px var(--black-50);
420
461
  }
421
462
 
422
463
  .txt-dark .color-pointer:hover {
423
- box-shadow: 0 0 0 5px rgba(255,255,255,.75);
464
+ box-shadow: 0 0 0 5px var(--white-75);
424
465
  }
425
466
  .txt-light .color-pointer:hover {
426
- box-shadow: 0 0 0 5px rgba(0,0,0,.75);
467
+ box-shadow: 0 0 0 5px var(--black-75);
427
468
  }
428
469
 
429
470
  .txt-dark .color-pointer:focus,
430
471
  .txt-dark .color-pointer:active {
431
- box-shadow: 0 0 0 5px rgba(255,255,255,.9);
472
+ box-shadow: 0 0 0 5px var(--white-90);
432
473
  }
433
474
  .txt-light .color-pointer:focus,
434
475
  .txt-light .color-pointer:active {
435
- box-shadow: 0 0 0 5px rgba(0,0,0,.9);
476
+ box-shadow: 0 0 0 5px var(--black-90);
436
477
  }
437
478
 
438
479
  /* utility */
package/types/index.d.ts CHANGED
@@ -45,4 +45,4 @@ declare module "@thednp/color-picker/src/js/color-picker-element" {
45
45
  }
46
46
 
47
47
  export * as SHORTER from "shorter-js";
48
- export * as EventListener from "event-listener.js";
48
+ export * as EventListener from "@thednp/event-listener";
@@ -32,9 +32,6 @@ export interface RGBA extends RGB {
32
32
  * @link https://en.wikibooks.org/wiki/Color_Models:_RGB,_HSV,_HSL#HSL
33
33
  */
34
34
  export interface HSL {
35
- // h: number | string;
36
- // s: number | string;
37
- // l: number | string;
38
35
  h: number;
39
36
  s: number;
40
37
  l: number;
@@ -79,12 +76,17 @@ export interface ColorPickerOptions {
79
76
  colorLabels?: string[];
80
77
  componentLabels?: Record<string, string>;
81
78
  format?: ColorFormats;
82
- colorPresets?: string[];
79
+ colorPresets?: string[] | {
80
+ hue: number,
81
+ lightSteps: number,
82
+ hueSteps: number,
83
+ colors: string[],
84
+ };
83
85
  colorKeywords?: string[];
84
86
  }
85
87
 
86
88
  export type ColorInput = string | RGB | RGBA | HSL | HSLA | HSV | HSVA | HWB | ColorObject;
87
89
  export type ColorFormats = string | 'rgb' | 'hex' | 'hex3' | 'hex4' | 'hex6' | 'hex8' | 'hsl' | 'hsv' | 'hwb';
88
90
 
89
- export type GetInstance<T> = (element: string | HTMLInputElement) => T | null;
90
- export type InitCallback<T> = (element: string | HTMLInputElement) => T;
91
+ export type GetInstance<T, ET> = (target: ET | string, component: string) => T | null;
92
+ export type InitCallback<T> = (element: HTMLInputElement | string ) => T;