UNPKG

element-plus

Version:

A Component Library for Vue 3

1 lines 9.14 kB
{"version":3,"file":"use-slider.mjs","names":[],"sources":["../../../../../../../packages/components/color-picker-panel/src/composables/use-slider.ts"],"sourcesContent":["import {\n computed,\n getCurrentInstance,\n onMounted,\n ref,\n shallowRef,\n watch,\n} from 'vue'\nimport { addUnit, getClientXY, getEventCode } from '@element-plus/utils'\nimport { useNamespace } from '@element-plus/hooks'\nimport { EVENT_CODE } from '@element-plus/constants'\nimport { draggable } from '../utils/draggable'\n\nimport type { AlphaSliderProps } from '../props/slider'\n\ninterface UseSliderOptions {\n key: 'hue' | 'alpha'\n minValue: number\n maxValue: number\n}\n\nexport const useSlider = (\n props: AlphaSliderProps,\n { key, minValue, maxValue }: UseSliderOptions\n) => {\n const instance = getCurrentInstance()!\n\n const thumb = shallowRef<HTMLElement>()\n const bar = shallowRef<HTMLElement>()\n\n const currentValue = computed(() => props.color.get(key))\n\n function handleClick(event: MouseEvent | TouchEvent) {\n if (props.disabled) return\n const target = event.target\n\n if (target !== thumb.value) {\n handleDrag(event)\n }\n thumb.value?.focus()\n }\n\n function handleDrag(event: MouseEvent | TouchEvent) {\n if (!bar.value || !thumb.value || props.disabled) return\n\n const el = instance.vnode.el as HTMLElement\n const rect = el.getBoundingClientRect()\n const { clientX, clientY } = getClientXY(event)\n let value\n\n if (!props.vertical) {\n let left = clientX - rect.left\n left = Math.max(thumb.value.offsetWidth / 2, left)\n left = Math.min(left, rect.width - thumb.value.offsetWidth / 2)\n\n value = Math.round(\n ((left - thumb.value.offsetWidth / 2) /\n (rect.width - thumb.value.offsetWidth)) *\n maxValue\n )\n } else {\n let top = clientY - rect.top\n top = Math.max(thumb.value.offsetHeight / 2, top)\n top = Math.min(top, rect.height - thumb.value.offsetHeight / 2)\n\n value = Math.round(\n ((top - thumb.value.offsetHeight / 2) /\n (rect.height - thumb.value.offsetHeight)) *\n maxValue\n )\n }\n props.color.set(key, value)\n }\n\n function handleKeydown(event: KeyboardEvent) {\n if (props.disabled) return\n const { shiftKey } = event\n const code = getEventCode(event)\n const step = shiftKey ? 10 : 1\n // NOTE: The hue-slider is opposite in direction to the regular slider, so the hue slider has been reversed here.\n // But this is not the best way to handle it.\n const reverse = key === 'hue' ? -1 : 1\n let isPreventDefault = true\n\n switch (code) {\n case EVENT_CODE.left:\n case EVENT_CODE.down:\n incrementPosition(-step * reverse)\n break\n case EVENT_CODE.right:\n case EVENT_CODE.up:\n incrementPosition(step * reverse)\n break\n case EVENT_CODE.home:\n props.color.set(key, key === 'hue' ? maxValue : minValue)\n break\n case EVENT_CODE.end:\n props.color.set(key, key === 'hue' ? minValue : maxValue)\n break\n case EVENT_CODE.pageDown:\n incrementPosition(-4 * reverse)\n break\n case EVENT_CODE.pageUp:\n incrementPosition(4 * reverse)\n break\n default:\n isPreventDefault = false\n break\n }\n\n isPreventDefault && event.preventDefault()\n }\n\n function incrementPosition(step: number) {\n let next = currentValue.value + step\n next = next < minValue ? minValue : next > maxValue ? maxValue : next\n props.color.set(key, next)\n }\n\n return {\n thumb,\n bar,\n currentValue,\n handleDrag,\n handleClick,\n handleKeydown,\n }\n}\n\ninterface UseSliderDOMOptions extends Pick<\n ReturnType<typeof useSlider>,\n 'bar' | 'thumb' | 'currentValue' | 'handleDrag'\n> {\n namespace: string\n maxValue: number\n getBackground?: () => string\n}\n\nexport const useSliderDOM = (\n props: AlphaSliderProps,\n {\n namespace,\n maxValue,\n bar,\n thumb,\n currentValue,\n handleDrag,\n getBackground,\n }: UseSliderDOMOptions\n) => {\n const instance = getCurrentInstance()!\n const ns = useNamespace(namespace)\n\n const thumbLeft = ref(0)\n const thumbTop = ref(0)\n const background = ref<string>()\n\n function getThumbLeft() {\n if (!thumb.value) return 0\n\n if (props.vertical) return 0\n const el = instance.vnode.el\n const value = currentValue.value\n\n if (!el) return 0\n return Math.round(\n (value * (el.offsetWidth - thumb.value.offsetWidth / 2)) / maxValue\n )\n }\n\n function getThumbTop() {\n if (!thumb.value) return 0\n\n const el = instance.vnode.el\n if (!props.vertical) return 0\n const value = currentValue.value\n\n if (!el) return 0\n return Math.round(\n (value * (el.offsetHeight - thumb.value.offsetHeight / 2)) / maxValue\n )\n }\n\n function update() {\n thumbLeft.value = getThumbLeft()\n thumbTop.value = getThumbTop()\n background.value = getBackground?.()\n }\n\n onMounted(() => {\n if (!bar.value || !thumb.value) return\n\n const dragConfig = {\n drag: (event: MouseEvent | TouchEvent) => {\n handleDrag(event)\n },\n end: (event: MouseEvent | TouchEvent) => {\n handleDrag(event)\n },\n }\n\n draggable(bar.value, dragConfig)\n draggable(thumb.value, dragConfig)\n update()\n })\n\n watch(currentValue, () => update())\n\n watch(\n () => props.color.value,\n () => update()\n )\n\n const rootKls = computed(() => [\n ns.b(),\n ns.is('vertical', props.vertical),\n ns.is('disabled', props.disabled),\n ])\n const barKls = computed(() => ns.e('bar'))\n const thumbKls = computed(() => ns.e('thumb'))\n const barStyle = computed(() => ({ background: background.value }))\n const thumbStyle = computed(() => ({\n left: addUnit(thumbLeft.value),\n top: addUnit(thumbTop.value),\n }))\n\n return {\n rootKls,\n barKls,\n barStyle,\n thumbKls,\n thumbStyle,\n thumbLeft,\n thumbTop,\n update,\n }\n}\n"],"mappings":"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"}