xdesign-vue-next
Version:
XDesign Component for vue-next
1 lines • 16.2 kB
Source Map (JSON)
{"version":3,"file":"linear-gradient.mjs","sources":["../../../src/color-picker/panel/linear-gradient.tsx"],"sourcesContent":["import { defineComponent, onBeforeUnmount, onMounted, reactive, ref, watch } from 'vue';\nimport cloneDeep from 'lodash/cloneDeep';\nimport { GRADIENT_SLIDER_DEFAULT_WIDTH } from '../const';\nimport { genGradientPoint, gradientColors2string, GradientColorPoint } from '../utils';\nimport { InputNumber as TInputNumber } from '../../input-number';\nimport { useBaseClassName } from '../hooks';\nimport { useCommonClassName } from '../../hooks/useConfig';\nimport baseProps from './base-props';\n\nconst DELETE_KEYS: string[] = ['delete', 'backspace'];\n\nexport default defineComponent({\n name: 'LinearGradient',\n\n inheritAttrs: false,\n props: {\n ...baseProps,\n enableMultipleGradient: {\n type: Boolean,\n default: true,\n },\n },\n setup(props) {\n const baseClassName = useBaseClassName();\n const { STATUS } = useCommonClassName();\n const statusClassNames = STATUS.value;\n const refSlider = ref<HTMLElement>(null);\n const sliderRect = reactive({\n left: 0,\n width: GRADIENT_SLIDER_DEFAULT_WIDTH,\n });\n const isDragging = ref<Boolean>(false);\n const isMoved = ref<Boolean>(false);\n const degree = ref(props.color.gradientDegree);\n const selectedId = ref(props.color.gradientSelectedId);\n const colors = ref<GradientColorPoint[]>(cloneDeep(props.color.gradientColors));\n\n watch(\n () => props.color.gradientDegree,\n (value) => (degree.value = value),\n );\n watch(\n () => props.color.gradientSelectedId,\n (value) => (selectedId.value = value),\n );\n watch(\n () => props.color.gradientColors,\n (value) => {\n colors.value = cloneDeep(value);\n },\n {\n deep: true,\n },\n );\n\n const handleChange = (key: 'degree' | 'selectedId' | 'colors', payload: any, addUsedColor?: boolean) => {\n if (props.disabled) {\n return;\n }\n props.onChange({\n key,\n payload,\n addUsedColor,\n });\n };\n\n const handleDegreeChange = (value: number) => {\n if (props.disabled || value === props.color.gradientDegree) {\n return;\n }\n degree.value = value;\n handleChange('degree', value, true);\n };\n\n const handleSelectedIdChange = (value: string) => {\n if (props.disabled) {\n return;\n }\n selectedId.value = value;\n handleChange('selectedId', value);\n };\n\n const handleColorsChange = (value: GradientColorPoint[], isEnded?: boolean) => {\n if (props.disabled) {\n return;\n }\n colors.value = value;\n handleChange('colors', value, isEnded);\n };\n\n /**\n * 设置bar的位置\n * @param left\n * @returns\n */\n const updateActiveThumbLeft = (left: number) => {\n const index = colors.value.findIndex((c) => c.id === selectedId.value);\n if (index === -1) {\n return;\n }\n const point = colors.value[index];\n left = Math.max(0, Math.min(sliderRect.width, left));\n const percentLeft = (left / sliderRect.width) * 100;\n colors.value.splice(index, 1, {\n color: point.color,\n left: percentLeft,\n id: point.id,\n });\n handleColorsChange(colors.value);\n };\n\n // 移动开始\n const handleStart = (id: string) => {\n const rect = refSlider.value.getBoundingClientRect();\n sliderRect.left = rect.left;\n sliderRect.width = rect.width || GRADIENT_SLIDER_DEFAULT_WIDTH;\n if (isDragging.value || props.disabled) {\n return;\n }\n isMoved.value = false;\n isDragging.value = true;\n handleSelectedIdChange(id);\n // 让slider获取焦点,以便键盘事件生效。\n refSlider.value.focus();\n window.addEventListener('mousemove', handleMove, false);\n window.addEventListener('mouseup', handleEnd, false);\n window.addEventListener('contextmenu', handleEnd, false);\n };\n\n // 移动中\n const handleMove = (e: MouseEvent) => {\n if (!isDragging.value || props.disabled) {\n return;\n }\n const left = e.clientX - sliderRect.left;\n isMoved.value = true;\n updateActiveThumbLeft(left);\n };\n\n // 移动结束\n const handleEnd = () => {\n if (!isDragging.value) {\n return;\n }\n setTimeout(() => {\n isDragging.value = false;\n }, 0);\n if (isMoved.value) {\n handleColorsChange(colors.value, true);\n isMoved.value = false;\n }\n window.removeEventListener('mousemove', handleMove, false);\n window.removeEventListener('mouseup', handleEnd, false);\n window.removeEventListener('contextmenu', handleEnd, false);\n };\n\n const handleKeyup = (e: KeyboardEvent) => {\n if (props.disabled) {\n return;\n }\n const points = colors.value;\n let pos = points.findIndex((c) => c.id === selectedId.value);\n const { length } = points;\n // 必须保证有两个点\n if (DELETE_KEYS.includes(e.key.toLocaleLowerCase()) && length > 2 && pos >= 0 && pos <= length - 1) {\n points.splice(pos, 1);\n if (!points[pos]) {\n // eslint-disable-next-line no-nested-ternary\n pos = points[pos + 1] ? pos + 1 : points[pos - 1] ? pos - 1 : 0;\n }\n const current = points[pos];\n handleColorsChange(points, true);\n handleSelectedIdChange(current?.id);\n }\n };\n\n const handleThumbBarClick = (e: MouseEvent) => {\n if (props.disabled || !props.enableMultipleGradient) {\n return;\n }\n let left = e.clientX - sliderRect.left;\n left = Math.max(0, Math.min(sliderRect.width, left));\n const percentLeft = (left / sliderRect.width) * 100;\n const newPoint = genGradientPoint(percentLeft, props.color.rgba);\n colors.value.push(newPoint);\n handleColorsChange(colors.value, true);\n handleSelectedIdChange(newPoint.id);\n };\n\n onMounted(() => {\n const rect = refSlider.value.getBoundingClientRect();\n sliderRect.left = rect.left;\n sliderRect.width = rect.width || GRADIENT_SLIDER_DEFAULT_WIDTH;\n });\n\n onBeforeUnmount(() => {\n window.removeEventListener('mousemove', handleMove, false);\n window.removeEventListener('mouseup', handleEnd, false);\n window.removeEventListener('contextmenu', handleEnd, false);\n });\n\n return {\n baseClassName,\n statusClassNames,\n refSlider,\n degree,\n selectedId,\n colors,\n handleDegreeChange,\n handleStart,\n handleMove,\n handleEnd,\n handleKeyup,\n handleThumbBarClick,\n };\n },\n render() {\n const { linearGradient, gradientColors } = this.color;\n const { colors, selectedId, degree, disabled, baseClassName, statusClassNames } = this;\n const thumbBackground = gradientColors2string({\n points: gradientColors,\n degree: 90,\n });\n return (\n <div class={`${baseClassName}__gradient`}>\n <div class={`${baseClassName}__gradient-slider`}>\n <div\n class={[`${baseClassName}__slider`, `${baseClassName}--bg-alpha`]}\n onKeyup={this.handleKeyup}\n tabindex={0}\n ref=\"refSlider\"\n >\n <ul\n class=\"gradient-thumbs\"\n onClick={this.handleThumbBarClick}\n style={{\n background: thumbBackground,\n }}\n >\n {colors.map((t) => {\n const left = `${Math.round(t.left * 100) / 100}%`;\n return (\n <li\n class={[\n `${baseClassName}__thumb`,\n 'gradient-thumbs__item',\n selectedId === t.id ? statusClassNames.active : '',\n ]}\n key={t.id}\n title={`${t.color} ${left}`}\n style={{\n color: t.color,\n left,\n }}\n onClick={(e: MouseEvent) => e.stopPropagation()}\n onMousedown={() => this.handleStart(t.id)}\n >\n <span class={['gradient-thumbs__item-inner', `${baseClassName}--bg-alpha`]}></span>\n </li>\n );\n })}\n </ul>\n </div>\n </div>\n <div class={`${baseClassName}__gradient-degree`} title={`${degree}deg`}>\n <TInputNumber\n size=\"small\"\n theme=\"normal\"\n min={0}\n max={360}\n step={1}\n format={(value: number) => `${value}°`}\n v-model={this.degree}\n onBlur={this.handleDegreeChange}\n onEnter={this.handleDegreeChange}\n disabled={disabled}\n />\n </div>\n <div class={[`${baseClassName}__gradient-preview`, `${baseClassName}--bg-alpha`]}>\n <span\n class=\"preview-inner\"\n style={{\n background: linearGradient,\n }}\n ></span>\n </div>\n </div>\n );\n },\n});\n"],"names":["name","inheritAttrs","props","enableMultipleGradient","type","left","width","cloneDeep","watch","colors","deep","key","payload","addUsedColor","handleChange","handleColorsChange","sliderRect","refSlider","setTimeout","points","handleSelectedIdChange","onMounted","onBeforeUnmount","baseClassName","statusClassNames","degree","selectedId","handleDegreeChange","handleStart","handleMove","handleEnd","handleKeyup","handleThumbBarClick","_createVNode","background"],"mappings":"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"}