UNPKG

element-plus

Version:

A Component Library for Vue 3

1 lines 6.94 kB
{"version":3,"file":"use-sv-panel.mjs","names":[],"sources":["../../../../../../../packages/components/color-picker-panel/src/composables/use-sv-panel.ts"],"sourcesContent":["import { computed, getCurrentInstance, onMounted, ref, watch } from 'vue'\nimport { EVENT_CODE } from '@element-plus/constants'\nimport { useNamespace } from '@element-plus/hooks'\nimport { addUnit, getClientXY, getEventCode } from '@element-plus/utils'\nimport { draggable } from '../utils/draggable'\n\nimport type { SvPanelProps } from '../props/sv-panel'\n\nexport const useSvPanel = (props: SvPanelProps) => {\n const instance = getCurrentInstance()!\n\n const cursorRef = ref<HTMLElement>()\n const cursorTop = ref(0)\n const cursorLeft = ref(0)\n const background = ref('hsl(0, 100%, 50%)')\n\n const saturation = computed(() => props.color.get('saturation'))\n const brightness = computed(() => props.color.get('value'))\n const hue = computed(() => props.color.get('hue'))\n\n function handleClick(event: MouseEvent | TouchEvent) {\n if (props.disabled) return\n const target = event.target\n\n if (target !== cursorRef.value) {\n handleDrag(event)\n }\n cursorRef.value?.focus({ preventScroll: true })\n }\n\n function handleDrag(event: MouseEvent | TouchEvent) {\n if (props.disabled) return\n\n const el = instance.vnode.el!\n const rect = el.getBoundingClientRect()\n const { clientX, clientY } = getClientXY(event)\n\n let left = clientX - rect.left\n let top = clientY - rect.top\n left = Math.max(0, left)\n left = Math.min(left, rect.width)\n\n top = Math.max(0, top)\n top = Math.min(top, rect.height)\n\n cursorLeft.value = left\n cursorTop.value = top\n props.color.set({\n saturation: (left / rect.width) * 100,\n value: 100 - (top / rect.height) * 100,\n })\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 let isPreventDefault = true\n\n switch (code) {\n case EVENT_CODE.left:\n incrementSaturation(-step)\n break\n case EVENT_CODE.right:\n incrementSaturation(step)\n break\n case EVENT_CODE.up:\n incrementBrightness(step)\n break\n case EVENT_CODE.down:\n incrementBrightness(-step)\n break\n default:\n isPreventDefault = false\n break\n }\n\n isPreventDefault && event.preventDefault()\n }\n\n function incrementSaturation(step: number) {\n let next = saturation.value + step\n next = next < 0 ? 0 : next > 100 ? 100 : next\n props.color.set('saturation', next)\n }\n\n function incrementBrightness(step: number) {\n let next = brightness.value + step\n next = next < 0 ? 0 : next > 100 ? 100 : next\n props.color.set('value', next)\n }\n\n return {\n cursorRef,\n cursorTop,\n cursorLeft,\n background,\n saturation,\n brightness,\n hue,\n handleClick,\n handleDrag,\n handleKeydown,\n }\n}\n\nexport const useSvPanelDOM = (\n props: SvPanelProps,\n {\n cursorTop,\n cursorLeft,\n background,\n handleDrag,\n }: Pick<\n ReturnType<typeof useSvPanel>,\n 'cursorTop' | 'cursorLeft' | 'background' | 'handleDrag'\n >\n) => {\n const instance = getCurrentInstance()!\n const ns = useNamespace('color-svpanel')\n\n function update() {\n const saturation = props.color.get('saturation')\n const brightness = props.color.get('value')\n\n const el = instance.vnode.el!\n const { clientWidth: width, clientHeight: height } = el\n\n cursorLeft.value = (saturation * width) / 100\n cursorTop.value = ((100 - brightness) * height) / 100\n\n background.value = `hsl(${props.color.get('hue')}, 100%, 50%)`\n }\n\n onMounted(() => {\n draggable(instance.vnode.el as HTMLElement, {\n drag: (event) => {\n handleDrag(event)\n },\n end: (event) => {\n handleDrag(event)\n },\n })\n\n update()\n })\n\n watch(\n [\n () => props.color.get('hue'),\n () => props.color.get('value'),\n () => props.color.value,\n ],\n () => update()\n )\n\n const rootKls = computed(() => ns.b())\n const cursorKls = computed(() => ns.e('cursor'))\n const rootStyle = computed(() => ({\n backgroundColor: background.value,\n }))\n const cursorStyle = computed(() => ({\n top: addUnit(cursorTop.value),\n left: addUnit(cursorLeft.value),\n }))\n\n return {\n rootKls,\n cursorKls,\n rootStyle,\n cursorStyle,\n update,\n }\n}\n"],"mappings":"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"}