<template>
|
<div class="el-color-svpanel"
|
:style="{
|
backgroundColor: background
|
}">
|
<div class="el-color-svpanel__white"></div>
|
<div class="el-color-svpanel__black"></div>
|
<div class="el-color-svpanel__cursor"
|
:style="{
|
top: cursorTop + 'px',
|
left: cursorLeft + 'px'
|
}">
|
<div></div>
|
</div>
|
</div>
|
</template>
|
|
<script>
|
import draggable from '../draggable';
|
|
export default {
|
name: 'el-sl-panel',
|
|
props: {
|
color: {
|
required: true
|
}
|
},
|
|
computed: {
|
colorValue() {
|
const hue = this.color.get('hue');
|
const value = this.color.get('value');
|
return { hue, value };
|
}
|
},
|
|
watch: {
|
colorValue() {
|
this.update();
|
}
|
},
|
|
methods: {
|
update() {
|
const saturation = this.color.get('saturation');
|
const value = this.color.get('value');
|
|
const el = this.$el;
|
let { clientWidth: width, clientHeight: height } = el;
|
|
this.cursorLeft = saturation * width / 100;
|
this.cursorTop = (100 - value) * height / 100;
|
|
this.background = 'hsl(' + this.color.get('hue') + ', 100%, 50%)';
|
},
|
|
handleDrag(event) {
|
const el = this.$el;
|
const rect = el.getBoundingClientRect();
|
|
let left = event.clientX - rect.left;
|
let top = event.clientY - rect.top;
|
left = Math.max(0, left);
|
left = Math.min(left, rect.width);
|
|
top = Math.max(0, top);
|
top = Math.min(top, rect.height);
|
|
this.cursorLeft = left;
|
this.cursorTop = top;
|
this.color.set({
|
saturation: left / rect.width * 100,
|
value: 100 - top / rect.height * 100
|
});
|
}
|
},
|
|
mounted() {
|
draggable(this.$el, {
|
drag: (event) => {
|
this.handleDrag(event);
|
},
|
end: (event) => {
|
this.handleDrag(event);
|
}
|
});
|
|
this.update();
|
},
|
|
data() {
|
return {
|
cursorTop: 0,
|
cursorLeft: 0,
|
background: 'hsl(0, 100%, 50%)'
|
};
|
}
|
};
|
</script>
|