1
1
<script setup lang="ts">
2
- import { effectScope , watch , reactive , computed } from ' vue' ;
2
+ import { watch , computed , reactive } from ' vue' ;
3
3
import tinycolor from ' tinycolor2' ;
4
4
5
- import Chrome from ' ../src/components/ChromePicker.vue' ;
6
- import Compact from ' ../src/components/CompactPicker.vue' ;
7
- import Grayscale from ' ../src/components/GrayscalePicker.vue' ;
8
- import Material from ' ../src/components/MaterialPicker.vue' ;
9
- import Photoshop from ' ../src/components/PhotoshopPicker.vue' ;
10
- import Sketch from ' ../src/components/SketchPicker.vue' ;
11
- import Slider from ' ../src/components/SliderPicker.vue' ;
12
- import Swatches from ' ../src/components/SwatchesPicker.vue' ;
13
- import Twitter from ' ../src/components/TwitterPicker.vue' ;
5
+ import {
6
+ ChromePicker ,
7
+ SketchPicker ,
8
+ PhotoshopPicker ,
9
+ CompactPicker ,
10
+ GrayscalePicker ,
11
+ MaterialPicker ,
12
+ SliderPicker ,
13
+ TwitterPicker ,
14
+ SwatchesPicker ,
15
+ HueSlider
16
+ } from ' ../src' ;
14
17
15
18
const tinyColor = defineModel (' tinycolor' , {
16
- default: ' #F5F7FA'
19
+ default: tinycolor ( ' #F5F7FA' )
17
20
});
18
21
19
22
const color = defineModel ({
20
23
default : () => reactive ({r: 0 , g: 0 , b: 255 , a: 1 })
21
24
});
22
25
23
- const scope = effectScope ();
24
-
25
- scope .run (() => {
26
- watch (color , () => console .log (' color changed ==>' , color .value ));
27
- });
26
+ watch (tinyColor , () => console .log (' color changed ==>' , tinyColor .value ));
28
27
29
28
function invertColor(rgb : { r: number ; g: number ; b: number }): string {
30
29
const inverted = {
@@ -44,10 +43,10 @@ const background = computed(() => {
44
43
});
45
44
46
45
const hsva = computed (() => {
47
- const hsv = tinycolor (tinyColor .value ).toHsv ();
46
+ const hsva = tinycolor (tinyColor .value ).toHsv ();
48
47
const res: Record <string , number > = {};
49
- for (const [key, value] of Object .entries (hsv )) {
50
- res [key ] = value .toFixed ();
48
+ for (const [key, value] of Object .entries (hsva )) {
49
+ res [key ] = value .toFixed (2 );
51
50
}
52
51
return res ;
53
52
});
@@ -56,6 +55,10 @@ const textColor = computed(() => {
56
55
return invertColor (tinycolor (tinyColor .value ).toRgb ());
57
56
});
58
57
58
+ const updateHue = (newHue : number ) => {
59
+ tinyColor .value = tinycolor (tinyColor .value ).spin (newHue - hsva .value .h ).clone ();
60
+ }
61
+
59
62
</script >
60
63
61
64
<template >
@@ -79,58 +82,63 @@ const textColor = computed(() => {
79
82
<div :style =" {flex: 0.8}" >
80
83
<div class =" row" >
81
84
<div class =" col" >
82
- <div class =" roboto current-color" :style =" {color: textColor, opacity: 0.5}" :aria-hidden = " true " >
85
+ <div class =" roboto current-color" :style =" {color: textColor, opacity: 0.5}" >
83
86
{{ hex }}<br />
84
87
{{ color }}<br />
85
88
{{ hsva }}
86
89
</div >
87
90
<div class =" picker-container" >
88
- <Chrome v-model:tinyColor =" tinyColor" v-model =" color" />
91
+ <ChromePicker v-model:tinyColor =" tinyColor" v-model =" color" />
89
92
<div class =" picker-title roboto" :style =" {color: textColor, opacity: 0.5}" >< ; ChromePicker /> ; </div >
90
93
</div >
91
94
</div >
92
95
93
96
<div class =" picker-container" >
94
- <div ><Sketch v-model:tinyColor =" tinyColor" v-model =" color" /></div >
97
+ <div ><SketchPicker v-model:tinyColor =" tinyColor" v-model =" color" /></div >
95
98
<div class =" picker-title roboto" :style =" {color: textColor, opacity: 0.5}" >< ; SketchPicker /> ; </div >
96
99
</div >
97
100
98
101
<div class =" picker-container" >
99
- <div ><Photoshop v-model:tinyColor =" tinyColor" v-model =" color" :hasResetButton = " true " /></div >
102
+ <div ><PhotoshopPicker v-model:tinyColor =" tinyColor" v-model =" color" /></div >
100
103
<div class =" picker-title roboto" :style =" {color: textColor, opacity: 0.5}" >< ; PhotoshopPicker /> ; </div >
101
104
</div >
102
105
</div >
103
106
<div class =" row" :style =" {marginTop: '5%'}" >
104
107
<div class =" col" >
105
108
<div class =" picker-container" >
106
- <div ><Compact v-model:tinyColor =" tinyColor" v-model =" color" /></div >
109
+ <div ><CompactPicker v-model:tinyColor =" tinyColor" v-model =" color" /></div >
107
110
<div class =" picker-title roboto" :style =" {color: textColor, opacity: 0.5}" >< ; CompactPicker /> ; </div >
108
111
</div >
109
112
<div class =" picker-container" >
110
- <div ><Grayscale v-model:tinyColor =" tinyColor" v-model =" color" /></div >
113
+ <div ><GrayscalePicker v-model:tinyColor =" tinyColor" v-model =" color" /></div >
111
114
<div class =" picker-title roboto" :style =" {color: textColor, opacity: 0.5}" >< ; GrayscalePicker /> ; </div >
112
115
</div >
113
116
<div class =" picker-container" >
114
- <div ><Material v-model:tinyColor =" tinyColor" v-model =" color" /></div >
117
+ <div ><MaterialPicker v-model:tinyColor =" tinyColor" v-model =" color" /></div >
115
118
<div class =" picker-title roboto" :style =" {color: textColor, opacity: 0.5}" >< ; MaterialPicker /> ; </div >
116
119
</div >
117
120
</div >
118
121
119
122
<div class =" col" >
120
123
<div class =" picker-container" >
121
- <div ><Slider v-model:tinyColor =" tinyColor" v-model =" color" /></div >
124
+ <div :style =" {width: '410px'}" ><HueSlider :modelValue =" hsva.h" @update:modelValue =" updateHue" /></div >
125
+ <div class =" picker-title roboto" :style =" {color: textColor, opacity: 0.5}" >< ; HueSlider /> ; </div >
126
+ </div >
127
+
128
+ <div class =" picker-container" >
129
+ <div ><SliderPicker v-model:tinyColor =" tinyColor" v-model =" color" /></div >
122
130
<div class =" picker-title roboto" :style =" {color: textColor, opacity: 0.5}" >< ; SliderPicker /> ; </div >
123
131
</div >
124
132
125
133
<div class =" picker-container" >
126
- <div ><Twitter v-model:tinyColor =" tinyColor" v-model =" color" /></div >
134
+ <div ><TwitterPicker v-model:tinyColor =" tinyColor" v-model =" color" /></div >
127
135
<div class =" picker-title roboto" :style =" {color: textColor, opacity: 0.5}" >< ; TwitterPicker /> ; </div >
128
136
</div >
129
137
</div >
130
138
131
139
<div class =" col" >
132
140
<div class =" picker-container" >
133
- <div ><Swatches v-model:tinyColor =" tinyColor" v-model =" color" /></div >
141
+ <div ><SwatchesPicker v-model:tinyColor =" tinyColor" v-model =" color" /></div >
134
142
<div class =" picker-title roboto" :style =" {color: textColor, opacity: 0.5}" >< ; SwatchesPicker /> ; </div >
135
143
</div >
136
144
</div >
@@ -231,6 +239,7 @@ const textColor = computed(() => {
231
239
.current-color {
232
240
padding : 10px ;
233
241
width : 240px ;
242
+ height : 100px ;
234
243
line-height : 1.5 ;
235
244
}
236
245
</style >
0 commit comments