element-plus
Version:
A Component Library for Vue 3
1 lines • 4.21 kB
Source Map (JSON)
{"version":3,"file":"color-picker-panel2.mjs","names":[],"sources":["../../../../../../packages/components/color-picker-panel/src/color-picker-panel.vue"],"sourcesContent":["<template>\n <div\n :class=\"[ns.b(), ns.is('disabled', disabled), ns.is('border', border)]\"\n @focusout=\"handleFocusout\"\n >\n <div :class=\"ns.e('wrapper')\">\n <hue-slider\n ref=\"hueRef\"\n :color=\"color\"\n vertical\n :disabled=\"disabled\"\n :class=\"['hue-slider', hueSliderClass]\"\n :style=\"hueSliderStyle\"\n />\n <sv-panel ref=\"svRef\" :color=\"color\" :disabled=\"disabled\" />\n </div>\n <alpha-slider\n v-if=\"showAlpha\"\n ref=\"alphaRef\"\n :color=\"color\"\n :disabled=\"disabled\"\n />\n <predefine\n v-if=\"predefine\"\n ref=\"predefine\"\n :enable-alpha=\"showAlpha\"\n :color=\"color\"\n :colors=\"predefine\"\n :disabled=\"disabled\"\n />\n <div :class=\"ns.e('footer')\">\n <el-input\n ref=\"inputRef\"\n v-model=\"customInput\"\n :validate-event=\"false\"\n size=\"small\"\n :disabled=\"disabled\"\n @change=\"handleConfirm\"\n />\n <slot name=\"footer\" />\n </div>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { computed, inject, nextTick, onMounted, provide, ref, watch } from 'vue'\nimport { ElInput } from '@element-plus/components/input'\nimport { useFormDisabled, useFormItem } from '@element-plus/components/form'\nimport { useNamespace } from '@element-plus/hooks'\nimport { debugWarn } from '@element-plus/utils'\nimport { UPDATE_MODEL_EVENT } from '@element-plus/constants'\nimport AlphaSlider from './components/alpha-slider.vue'\nimport HueSlider from './components/hue-slider.vue'\nimport Predefine from './components/predefine.vue'\nimport SvPanel from './components/sv-panel.vue'\nimport {\n ROOT_COMMON_COLOR_INJECTION_KEY,\n colorPickerPanelContextKey,\n colorPickerPanelEmits,\n} from './color-picker-panel'\nimport { useCommonColor } from './composables/use-common-color'\n\nimport type { ColorPickerPanelProps } from './color-picker-panel'\nimport type { InputInstance } from '@element-plus/components/input'\n\ndefineOptions({\n name: 'ElColorPickerPanel',\n})\nconst props = withDefaults(defineProps<ColorPickerPanelProps>(), {\n modelValue: undefined,\n border: true,\n validateEvent: true,\n showAlpha: false,\n})\nconst emit = defineEmits(colorPickerPanelEmits)\n\nconst ns = useNamespace('color-picker-panel')\nconst { formItem } = useFormItem()\nconst disabled = useFormDisabled()\nconst hueRef = ref<InstanceType<typeof HueSlider>>()\nconst svRef = ref<InstanceType<typeof SvPanel>>()\nconst alphaRef = ref<InstanceType<typeof AlphaSlider>>()\nconst inputRef = ref<InputInstance>()\nconst customInput = ref('')\n\nconst { color } = inject(\n ROOT_COMMON_COLOR_INJECTION_KEY,\n () => useCommonColor(props, emit),\n true\n)\n\nfunction handleConfirm() {\n color.fromString(customInput.value)\n if (color.value !== customInput.value) {\n customInput.value = color.value\n }\n}\n\nfunction handleFocusout() {\n if (props.validateEvent) {\n formItem?.validate?.('blur').catch((err) => debugWarn(err))\n }\n}\n\nfunction update() {\n hueRef.value?.update()\n svRef.value?.update()\n alphaRef.value?.update()\n}\n\nonMounted(() => {\n if (props.modelValue) {\n customInput.value = color.value\n }\n nextTick(update)\n})\n\nwatch(\n () => props.modelValue,\n (newVal) => {\n if (newVal !== color.value) {\n newVal ? color.fromString(newVal) : color.clear()\n }\n }\n)\n\nwatch(\n () => color.value,\n (val) => {\n emit(UPDATE_MODEL_EVENT, val)\n customInput.value = val\n if (props.validateEvent) {\n formItem?.validate('change').catch((err) => debugWarn(err))\n }\n }\n)\n\nprovide(colorPickerPanelContextKey, {\n currentColor: computed(() => color.value),\n})\n\ndefineExpose({\n /**\n * @description current color object\n */\n color,\n /**\n * @description custom input ref\n */\n inputRef,\n /**\n * @description update sub components\n */\n update,\n})\n</script>\n"],"mappings":""}