UNPKG

vexip-ui

Version:

A Vue 3 UI library, Highly customizability, full TypeScript, performance pretty good

1 lines 4.1 kB
{"version":3,"file":"color-alpha.vue.cjs","sources":["../../../components/color-picker/color-alpha.vue"],"sourcesContent":["<template>\n <div\n ref=\"wrapper\"\n :class=\"nh.be('alpha')\"\n tabindex=\"-1\"\n role=\"group\"\n >\n <div\n :class=\"nh.be('opacity')\"\n :style=\"{\n backgroundImage: `linear-gradient(to right, rgba(${rgbString}, 0) 0%, rgb(${rgbString}) 100%)`\n }\"\n ></div>\n <div :class=\"nh.be('alpha-handler')\" :style=\"{ left: `${currentLeft}%` }\"></div>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, ref, watch } from 'vue'\n\nimport { useNameHelper } from '@vexip-ui/config'\nimport { useModifier, useMoving } from '@vexip-ui/hooks'\nimport { boundRange, toFixed } from '@vexip-ui/utils'\n\nimport type { PropType } from 'vue'\nimport type { RGBColor } from '@vexip-ui/utils'\n\nexport default defineComponent({\n name: 'ColorAlpha',\n props: {\n rgb: {\n type: Object as PropType<RGBColor>,\n default: () => {\n return { r: 0, g: 0, b: 0 }\n },\n validator: (value: RGBColor) => {\n return 'r' in value && 'g' in value && 'b' in value\n },\n },\n alpha: {\n type: Number,\n default: 1,\n validator: (value: number) => {\n return value >= 0 && value <= 1\n },\n },\n },\n emits: ['edit-start', 'edit-end', 'change'],\n setup(props, { emit }) {\n const currentLeft = ref(props.alpha * 100)\n\n let prevLeft = currentLeft.value\n let widthLimit: number\n let leftStartAt: number\n\n const { target: wrapper } = useModifier({\n passive: false,\n onKeyDown: (event, modifier) => {\n if (modifier.left || modifier.right) {\n event.preventDefault()\n\n const step = event.ctrlKey ? 10 : event.altKey ? 0.5 : 2\n const delta = step * (modifier.left ? -1 : 1)\n\n currentLeft.value += delta\n\n verifyPosition()\n prevLeft = currentLeft.value\n handleChange()\n }\n },\n })\n\n const { moving: editing } = useMoving({\n target: wrapper,\n onStart: (state, event) => {\n if (!wrapper.value || event.button > 0) {\n return false\n }\n\n const rect = wrapper.value.getBoundingClientRect()\n const { left, width } = rect\n\n widthLimit = width\n currentLeft.value = ((leftStartAt = state.clientX - left) / width) * 100\n\n verifyPosition()\n emit('edit-start')\n\n if (Math.abs(currentLeft.value - prevLeft) >= 0.01) {\n prevLeft = currentLeft.value\n handleChange()\n }\n },\n onMove: state => {\n currentLeft.value = ((leftStartAt + state.deltaX) / widthLimit) * 100\n\n verifyPosition()\n handleChange()\n },\n onEnd: () => {\n emit('edit-end')\n },\n })\n\n const rgbString = computed(() => {\n const { r, g, b } = props.rgb\n\n return `${r}, ${g}, ${b}`\n })\n\n verifyPosition()\n\n watch(\n () => props.alpha,\n value => {\n currentLeft.value = value * 100\n verifyPosition()\n },\n { immediate: true },\n )\n\n function verifyPosition() {\n currentLeft.value = toFixed(boundRange(currentLeft.value, 0, 100), 3)\n }\n\n function handleChange() {\n emit('change', currentLeft.value / 100)\n }\n\n return {\n nh: useNameHelper('color-picker'),\n currentLeft,\n editing,\n\n rgbString,\n\n wrapper,\n }\n },\n})\n</script>\n"],"names":["_createElementBlock","_normalizeClass","_ctx","_createElementVNode","_normalizeStyle"],"mappings":"+KACEA,EAaM,mBAAA,MAAA,CAZJ,IAAI,UACH,MAAKC,EAAE,eAAAC,EAAA,GAAG,GAAE,OAAA,CAAA,EACb,SAAS,KACT,KAAK,OAAA,EAAA,CAELC,EAAAA,mBAKO,MAAA,CAJJ,MAAKF,EAAE,eAAAC,EAAA,GAAG,GAAE,SAAA,CAAA,EACZ,MAAKE,EAAAA,eAAA,CAA+D,gBAAA,kCAAAF,EAAA,SAAS,gBAAgBA,EAAS,SAAA,SAAA,CAAA,WAIzGC,EAAAA,mBAAgF,MAAA,CAA1E,MAAKF,EAAE,eAAAC,EAAA,GAAG,GAAE,eAAA,CAAA,EAAoB,MAAKE,0BAAaF,EAAW,WAAA,GAAA,CAAA,CAAA,EAAA,KAAA,CAAA"}