diff --git a/packages/common b/packages/common index 5aedfdf7ab..916c9f675f 160000 --- a/packages/common +++ b/packages/common @@ -1 +1 @@ -Subproject commit 5aedfdf7ab0457141b0a886d2126e22bbdb42cae +Subproject commit 916c9f675fb43697b0a08f6c3155f219e8897e35 diff --git a/packages/components/color-picker/components/panel/header.tsx b/packages/components/color-picker/components/panel/header.tsx index 90426793a8..ca88e50cb1 100644 --- a/packages/components/color-picker/components/panel/header.tsx +++ b/packages/components/color-picker/components/panel/header.tsx @@ -2,6 +2,8 @@ import { defineComponent, PropType, ref, watch } from 'vue'; import { COLOR_MODES } from '@tdesign/common-js/color-picker/constants'; import { useConfig } from '@tdesign/shared-hooks'; +import { isEyeDropperSupported, pickColor } from '../../utils/eyedropper.js'; +import { Button as TButton } from '../../../button'; import { RadioButton as TRadioButton, RadioGroup as TRadioGroup } from '../../../radio'; import props from '../../color-picker-panel-props'; import { useBaseClassName } from '../../hooks'; @@ -21,12 +23,27 @@ export default defineComponent({ return () => {}; }, }, + onEyeDropperPick: { + type: Function, + default: () => { + return () => {}; + }, + }, }, - setup(props) { + emits: ['mode-change', 'eyedropper-pick'], + setup(props, { emit }) { const { globalConfig } = useConfig('colorPicker'); const baseClassName = useBaseClassName(); const modeValue = ref(props.mode); const handleModeChange = (v: string) => props.onModeChange(v); + const handleEyeDropperPick = async () => { + try { + const color = await pickColor(); + props.onEyeDropperPick(color); + } catch (error: any) { + console.warn('EyeDropper pick failed:', error); + } + }; watch( () => props.mode, (v) => (modeValue.value = v), @@ -46,6 +63,29 @@ export default defineComponent({ ))} + {isEyeDropperSupported() ? ( +
+ + + + + + + + + +
+ ) : null} ); }; diff --git a/packages/components/color-picker/components/panel/index.tsx b/packages/components/color-picker/components/panel/index.tsx index 9688bab301..109231fc88 100644 --- a/packages/components/color-picker/components/panel/index.tsx +++ b/packages/components/color-picker/components/panel/index.tsx @@ -98,6 +98,19 @@ export default defineComponent({ }); }; + /** + * 处理吸色事件 + * @param pickedColor 吸色器返回的颜色值(hex格式) + */ + const handleEyeDropperPick = (pickedColor: string) => { + // 更新颜色状态 + color.value.update(pickedColor); + // 强制更新 innerValue(触发响应式) + innerValue.value = color.value.getFormattedColor(props.format, props.enableAlpha); + // 触发变更事件 + emitColorChange('eyedropper'); + }; + watch( () => innerValue.value, (newColor) => { @@ -289,7 +302,12 @@ export default defineComponent({ return (
- +
{isGradient.value ? ( } 返回 hex 格式颜色值(如 "#123456") + */ +export async function pickColor() { + if (!isEyeDropperSupported()) { + throw new Error('EyeDropper API is not supported in this browser'); + } + + const eyeDropper = new window.EyeDropper(); + const result = await eyeDropper.open(); + return result.sRGBHex; +}