From 942d824e44a188d5b8e09fbb6bfc81e0cdfdb786 Mon Sep 17 00:00:00 2001 From: zjh0326 <1286638188@qq.com> Date: Wed, 1 Jul 2026 16:32:36 +0800 Subject: [PATCH 1/3] feat: add eye-dropper button to ColorPicker panel header --- .../color-picker/components/panel/header.tsx | 41 ++++++++++++++++++- .../color-picker/components/panel/index.tsx | 19 ++++++++- .../color-picker/utils/eyedropper.js | 21 ++++++++++ 3 files changed, 79 insertions(+), 2 deletions(-) create mode 100644 packages/components/color-picker/utils/eyedropper.js diff --git a/packages/components/color-picker/components/panel/header.tsx b/packages/components/color-picker/components/panel/header.tsx index 90426793a8..35cfee99d3 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,31 @@ 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 { + console.log('[EyeDropper Header] Button clicked!'); + const color = await pickColor(); + console.log('[EyeDropper Header] Color picked:', color); + console.log('[EyeDropper Header] Calling onEyeDropperPick prop...'); + props.onEyeDropperPick(color); + console.log('[EyeDropper Header] onEyeDropperPick called!'); + } catch (error: any) { + console.warn('EyeDropper pick failed:', error); + } + }; watch( () => props.mode, (v) => (modeValue.value = v), @@ -46,6 +67,24 @@ 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..f029dbe5f8 100644 --- a/packages/components/color-picker/components/panel/index.tsx +++ b/packages/components/color-picker/components/panel/index.tsx @@ -98,6 +98,23 @@ export default defineComponent({ }); }; + /** + * 处理吸色事件 + * @param pickedColor 吸色器返回的颜色值(hex格式) + */ + const handleEyeDropperPick = (pickedColor: string) => { + console.log('[EyeDropper] Picked color:', pickedColor); + // 更新颜色状态 + color.value.update(pickedColor); + console.log('[EyeDropper] Color after update:', color.value.rgba); + // 强制更新 innerValue(触发响应式) + innerValue.value = color.value.getFormattedColor(props.format, props.enableAlpha); + console.log('[EyeDropper] innerValue after update:', innerValue.value); + // 触发变更事件 + emitColorChange('eyedropper'); + console.log('[EyeDropper] emitColorChange called'); + }; + watch( () => innerValue.value, (newColor) => { @@ -289,7 +306,7 @@ 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; +} From 08235661ab593dc910a858d830a14d7168c0aa8c Mon Sep 17 00:00:00 2001 From: zjh0326 <1286638188@qq.com> Date: Wed, 1 Jul 2026 17:25:06 +0800 Subject: [PATCH 2/3] feat: add eye-dropper support to ColorPicker component - Add eyedropper.ts utility in tdesign-common - Add eye-dropper button to ColorPicker panel header - Support color picking via native EyeDropper API - Button only shows when browser supports the API (Chrome/Edge 95+) - Handle errors when user cancels picking - Add 'eyedropper' to ColorPickerChangeTrigger type - Replace title with tip prop in Button component - Remove console.log statements for production readiness --- .../color-picker/components/panel/header.tsx | 35 ++++++++++--------- .../color-picker/components/panel/index.tsx | 11 +++--- packages/components/color-picker/type.ts | 3 +- 3 files changed, 26 insertions(+), 23 deletions(-) diff --git a/packages/components/color-picker/components/panel/header.tsx b/packages/components/color-picker/components/panel/header.tsx index 35cfee99d3..ca88e50cb1 100644 --- a/packages/components/color-picker/components/panel/header.tsx +++ b/packages/components/color-picker/components/panel/header.tsx @@ -38,12 +38,8 @@ export default defineComponent({ const handleModeChange = (v: string) => props.onModeChange(v); const handleEyeDropperPick = async () => { try { - console.log('[EyeDropper Header] Button clicked!'); const color = await pickColor(); - console.log('[EyeDropper Header] Color picked:', color); - console.log('[EyeDropper Header] Calling onEyeDropperPick prop...'); props.onEyeDropperPick(color); - console.log('[EyeDropper Header] onEyeDropperPick called!'); } catch (error: any) { console.warn('EyeDropper pick failed:', error); } @@ -69,19 +65,24 @@ 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 f029dbe5f8..109231fc88 100644 --- a/packages/components/color-picker/components/panel/index.tsx +++ b/packages/components/color-picker/components/panel/index.tsx @@ -103,16 +103,12 @@ export default defineComponent({ * @param pickedColor 吸色器返回的颜色值(hex格式) */ const handleEyeDropperPick = (pickedColor: string) => { - console.log('[EyeDropper] Picked color:', pickedColor); // 更新颜色状态 color.value.update(pickedColor); - console.log('[EyeDropper] Color after update:', color.value.rgba); // 强制更新 innerValue(触发响应式) innerValue.value = color.value.getFormattedColor(props.format, props.enableAlpha); - console.log('[EyeDropper] innerValue after update:', innerValue.value); // 触发变更事件 emitColorChange('eyedropper'); - console.log('[EyeDropper] emitColorChange called'); }; watch( @@ -306,7 +302,12 @@ export default defineComponent({ return (
- +
{isGradient.value ? ( Date: Wed, 29 Jul 2026 11:18:26 +0000 Subject: [PATCH 3/3] chore: update common to PR 2582 --- packages/common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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