vuetify
Version:
Vue Material Component Framework
166 lines (165 loc) • 5.28 kB
JavaScript
import { Fragment as _Fragment, createVNode as _createVNode, createElementVNode as _createElementVNode, mergeProps as _mergeProps } from "vue";
// Styles
import "./VColorPicker.css";
// Components
import { VColorPickerCanvas } from "./VColorPickerCanvas.js";
import { VColorPickerEdit } from "./VColorPickerEdit.js";
import { VColorPickerPreview } from "./VColorPickerPreview.js";
import { VColorPickerSwatches } from "./VColorPickerSwatches.js";
import { makeVPickerProps, VPicker } from "../../labs/VPicker/VPicker.js"; // Composables
import { useRtl } from "../../composables/index.js";
import { provideDefaults } from "../../composables/defaults.js";
import { useProxiedModel } from "../../composables/proxiedModel.js"; // Utilities
import { computed, onBeforeMount, ref, watch } from 'vue';
import { extractColor, modes, nullColor } from "./util/index.js";
import { consoleWarn, defineComponent, HSVtoCSS, parseColor, propsFactory, RGBtoHSV, useRender } from "../../util/index.js"; // Types
export const makeVColorPickerProps = propsFactory({
canvasHeight: {
type: [String, Number],
default: 150
},
disabled: Boolean,
dotSize: {
type: [Number, String],
default: 10
},
hideCanvas: Boolean,
hideSliders: Boolean,
hideInputs: Boolean,
mode: {
type: String,
default: 'rgba',
validator: v => Object.keys(modes).includes(v)
},
modes: {
type: Array,
default: () => Object.keys(modes),
validator: v => Array.isArray(v) && v.every(m => Object.keys(modes).includes(m))
},
showSwatches: Boolean,
swatches: Array,
swatchesMaxHeight: {
type: [Number, String],
default: 150
},
modelValue: {
type: [Object, String]
},
...makeVPickerProps({
hideHeader: true
})
}, 'VColorPicker');
export const VColorPicker = defineComponent({
name: 'VColorPicker',
props: makeVColorPickerProps(),
emits: {
'update:modelValue': color => true,
'update:mode': mode => true
},
setup(props, _ref) {
let {
slots
} = _ref;
const mode = useProxiedModel(props, 'mode');
const hue = ref(null);
const model = useProxiedModel(props, 'modelValue', undefined, v => {
if (v == null || v === '') return null;
let c;
try {
c = RGBtoHSV(parseColor(v));
} catch (err) {
consoleWarn(err);
return null;
}
return c;
}, v => {
if (!v) return null;
return extractColor(v, props.modelValue);
});
const currentColor = computed(() => {
return model.value ? {
...model.value,
h: hue.value ?? model.value.h
} : null;
});
const {
rtlClasses
} = useRtl();
let externalChange = true;
watch(model, v => {
if (!externalChange) {
// prevent hue shift from rgb conversion inaccuracy
externalChange = true;
return;
}
if (!v) return;
hue.value = v.h;
}, {
immediate: true
});
const updateColor = hsva => {
externalChange = false;
hue.value = hsva.h;
model.value = hsva;
};
onBeforeMount(() => {
if (!props.modes.includes(mode.value)) mode.value = props.modes[0];
});
provideDefaults({
VSlider: {
color: undefined,
trackColor: undefined,
trackFillColor: undefined
}
});
useRender(() => {
const pickerProps = VPicker.filterProps(props);
return _createVNode(VPicker, _mergeProps(pickerProps, {
"class": ['v-color-picker', rtlClasses.value, props.class],
"style": [{
'--v-color-picker-color-hsv': HSVtoCSS({
...(currentColor.value ?? nullColor),
a: 1
})
}, props.style]
}), {
...slots,
default: () => _createElementVNode(_Fragment, null, [!props.hideCanvas && _createVNode(VColorPickerCanvas, {
"key": "canvas",
"color": currentColor.value,
"onUpdate:color": updateColor,
"disabled": props.disabled,
"dotSize": props.dotSize,
"width": props.width,
"height": props.canvasHeight
}, null), (!props.hideSliders || !props.hideInputs) && _createElementVNode("div", {
"key": "controls",
"class": "v-color-picker__controls"
}, [!props.hideSliders && _createVNode(VColorPickerPreview, {
"key": "preview",
"color": currentColor.value,
"onUpdate:color": updateColor,
"hideAlpha": !mode.value.endsWith('a'),
"disabled": props.disabled
}, null), !props.hideInputs && _createVNode(VColorPickerEdit, {
"key": "edit",
"modes": props.modes,
"mode": mode.value,
"onUpdate:mode": m => mode.value = m,
"color": currentColor.value,
"onUpdate:color": updateColor,
"disabled": props.disabled
}, null)]), props.showSwatches && _createVNode(VColorPickerSwatches, {
"key": "swatches",
"color": currentColor.value,
"onUpdate:color": updateColor,
"maxHeight": props.swatchesMaxHeight,
"swatches": props.swatches,
"disabled": props.disabled
}, null)])
});
});
return {};
}
});
//# sourceMappingURL=VColorPicker.js.map