-
-
- {Object.keys(COLOR_MODES).map((key) => (
-
- {Reflect.get(globalConfig.value, COLOR_MODES[key as keyof typeof COLOR_MODES])}
-
- ))}
-
-
+ {showModeSwitch && (
+
+
+ {Object.keys(COLOR_MODES).map((key) => (
+
+ {Reflect.get(globalConfig.value, COLOR_MODES[key as keyof typeof COLOR_MODES])}
+
+ ))}
+
+
+ )}
+ {showEyeDropper && (
+
+ )}
);
};
diff --git a/packages/components/color-picker/components/panel/index.tsx b/packages/components/color-picker/components/panel/index.tsx
index 9688bab301..af1af38985 100644
--- a/packages/components/color-picker/components/panel/index.tsx
+++ b/packages/components/color-picker/components/panel/index.tsx
@@ -111,6 +111,11 @@ export default defineComponent({
},
);
+ const handleEyeDropperPick = (hex: string) => {
+ color.value.update(hex);
+ emitColorChange('eyedropper');
+ };
+
/**
* mode change
* @param newMode
@@ -289,7 +294,7 @@ export default defineComponent({
return (
-
+
{isGradient.value ? (
| boolean | null;
@@ -198,7 +208,8 @@ export type ColorPickerChangeTrigger =
| 'palette-alpha-bar'
| 'input'
| 'preset'
- | 'recent';
+ | 'recent'
+ | 'eyedropper';
export interface ColorObject {
alpha: number;
diff --git a/packages/components/color-picker/utils/eyedropper.ts b/packages/components/color-picker/utils/eyedropper.ts
new file mode 100644
index 0000000000..04e8c1e623
--- /dev/null
+++ b/packages/components/color-picker/utils/eyedropper.ts
@@ -0,0 +1,26 @@
+interface EyeDropperInstance {
+ open(options?: { signal?: AbortSignal }): Promise<{ sRGBHex: string }>;
+}
+
+interface EyeDropperConstructor {
+ new (): EyeDropperInstance;
+}
+
+function getEyeDropperCtor(): EyeDropperConstructor | undefined {
+ if (typeof window === 'undefined') return undefined;
+ const { EyeDropper } = window as Window & { EyeDropper?: unknown };
+ return typeof EyeDropper === 'function' ? (EyeDropper as EyeDropperConstructor) : undefined;
+}
+
+export const isEyeDropperSupported = (): boolean => getEyeDropperCtor() !== undefined;
+
+export const openEyeDropper = async (signal?: AbortSignal): Promise => {
+ const Ctor = getEyeDropperCtor();
+ if (!Ctor) return null;
+ try {
+ const result = await new Ctor().open(signal ? { signal } : undefined);
+ return result.sRGBHex;
+ } catch {
+ return null;
+ }
+};