void;
+ onClick?: () => void;
};
const ColorBlock = defineComponent({
name: 'ColorBlock',
- inheritAttrs: false,
props: ['color', 'prefixCls', 'onClick'],
setup(props: ColorBlockProps) {
const colorBlockCls = computed(() => `${props.prefixCls}-color-block`);
-
return () => (
, EventHan
const dragRef = shallowRef({
flag: false,
});
+ const initOffset = () => {
+ if (offsetValue.value.x !== 0 || offsetValue.value.y !== 0) return;
+ if (
+ Object.values(containerRef.value.getBoundingClientRect().toJSON()).some(item => item === 0)
+ ) {
+ requestAnimationFrame(initOffset);
+ return;
+ }
+ const calcOffset = calculate?.(containerRef);
+ if (calcOffset) {
+ offsetValue.value = calcOffset;
+ }
+ };
onMounted(() => {
- nextTick(() => {
- if (
- Object.values(containerRef.value.getBoundingClientRect().toJSON()).some(item => item === 0)
- ) {
- setTimeout(() => {
- const calcOffset = calculate?.(containerRef);
- if (calcOffset) {
- offsetValue.value = calcOffset;
- }
- }, 0);
- }
- });
+ initOffset();
});
watch(
() => [colorRef, containerRef],
From 45719322bbda28be763efcb41d40ce2ad1bbd569 Mon Sep 17 00:00:00 2001
From: CCherry07 <2405693142@qq.com>
Date: Mon, 10 Jul 2023 22:56:28 +0800
Subject: [PATCH 04/23] chore: add demo Allow Clear
---
components/color-picker/demo/allowClear.vue | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/components/color-picker/demo/allowClear.vue b/components/color-picker/demo/allowClear.vue
index 3ce480aa79..3dc574fba5 100644
--- a/components/color-picker/demo/allowClear.vue
+++ b/components/color-picker/demo/allowClear.vue
@@ -2,17 +2,18 @@
---
order: 1
title:
- zh-CN: asdasdasda
- en-US: Basic Usage
+ zh-CN: 清除颜色
+ en-US: Allow Clear
---
## zh-CN
-最简单的用法。
+清除已选择的颜色。
## en-US
-The simplest usage.
+Clear Color.
+
From 8898fba5265aef63d878d65eee31151db0d2581f Mon Sep 17 00:00:00 2001
From: CCherry07 <2405693142@qq.com>
Date: Tue, 11 Jul 2023 01:26:40 +0800
Subject: [PATCH 05/23] feat: add locale with ColorPicker
---
components/color-picker/ColorPicker.tsx | 10 ++++++----
components/color-picker/components/ColorPresets.tsx | 13 ++++++++-----
components/locale/en_US.ts | 3 +++
components/locale/index.tsx | 3 +++
components/locale/zh_CN.ts | 3 +++
5 files changed, 23 insertions(+), 9 deletions(-)
diff --git a/components/color-picker/ColorPicker.tsx b/components/color-picker/ColorPicker.tsx
index 35ac81d79e..0df077623a 100644
--- a/components/color-picker/ColorPicker.tsx
+++ b/components/color-picker/ColorPicker.tsx
@@ -42,7 +42,7 @@ const colorPickerProps = () => ({
default: 'click',
},
format: {
- type: String as PropType,
+ type: String as PropType<'hex' | 'hsb' | 'rgb'>,
default: 'hex',
},
allowClear: {
@@ -98,13 +98,13 @@ const ColorPicker = defineComponent({
value,
defaultValue: props.defaultValue,
});
+
const open = computed(() => props.open);
const [popupOpen, setPopupOpen] = useMergedState(false, {
value: open,
postState: openData => !props.disabled && openData,
onChange: props.onOpenChange,
});
-
const colorCleared = shallowRef(false);
const [wrapSSR, hashId] = useStyle(prefixCls);
@@ -128,7 +128,9 @@ const ColorPicker = defineComponent({
emit('update:value', color, color.toHexString());
emit('change', color, color.toHexString());
};
-
+ const onFormatChange = (format: ColorFormat) => {
+ emit('formatChange', format);
+ };
const popoverProps: ComputedRef = computed(() => ({
open: popupOpen.value,
trigger: props.trigger,
@@ -146,7 +148,7 @@ const ColorPicker = defineComponent({
disabled: props.disabled,
presets: props.presets,
format: props.format,
- onFormatChange: props.onFormatChange,
+ onFormatChange,
}));
watch(colorCleared, (val, oldVal) => {
if (!oldVal && val) {
diff --git a/components/color-picker/components/ColorPresets.tsx b/components/color-picker/components/ColorPresets.tsx
index ea80e331eb..8a7b77ebc8 100644
--- a/components/color-picker/components/ColorPresets.tsx
+++ b/components/color-picker/components/ColorPresets.tsx
@@ -1,13 +1,12 @@
import { computed, defineComponent } from 'vue';
+import type { ColorPickerBaseProps, PresetsItem } from '../interface';
import Collapse from '../../collapse';
import type { Color } from '../color';
import useMergedState from '../../_util/hooks/useMergedState';
import { ColorBlock } from '../../vc-color-picker';
-import type { ColorPickerBaseProps, PresetsItem } from '../interface';
import { generateColor } from '../util';
-import classNames from 'ant-design-vue/es/_util/classNames';
-import locale from 'ant-design-vue/es/locale';
-
+import classNames from '../../_util/classNames';
+import { useConfigContextInject } from '../../config-provider/context';
const { Panel } = Collapse;
interface ColorPresetsProps extends Pick {
@@ -34,6 +33,8 @@ const ColorPresets = defineComponent({
name: 'ColorPresets',
props: ['prefixCls', 'presets', 'value', 'onChange', 'color'],
setup(props: ColorPresetsProps) {
+ const conetext = useConfigContextInject();
+ const locale = computed(() => conetext.locale.value.ColorPicker);
const colorPresetsPrefixCls = computed(() => `${props.prefixCls}-presets`);
const presets = computed(() => genPresetColor(props.presets));
const [presetsValue] = useMergedState(genPresetColor(props.presets), {
@@ -68,7 +69,9 @@ const ColorPresets = defineComponent({
/>
))
) : (
- {locale.presetEmpty}
+
+ {locale.value.presetEmpty}
+
)}
diff --git a/components/locale/en_US.ts b/components/locale/en_US.ts
index ae0af4a551..9898fa59ee 100644
--- a/components/locale/en_US.ts
+++ b/components/locale/en_US.ts
@@ -140,6 +140,9 @@ const localeValues: Locale = {
expired: 'QR code expired',
refresh: 'Refresh',
},
+ ColorPicker: {
+ presetEmpty: 'Empty',
+ },
};
export default localeValues;
diff --git a/components/locale/index.tsx b/components/locale/index.tsx
index 2985422d78..f3c0edf94e 100644
--- a/components/locale/index.tsx
+++ b/components/locale/index.tsx
@@ -49,6 +49,9 @@ export interface Locale {
expired?: string;
refresh?: string;
};
+ ColorPicker?: {
+ presetEmpty: string;
+ };
}
export interface LocaleProviderProps {
diff --git a/components/locale/zh_CN.ts b/components/locale/zh_CN.ts
index 3455f4f082..358a70f930 100644
--- a/components/locale/zh_CN.ts
+++ b/components/locale/zh_CN.ts
@@ -139,6 +139,9 @@ const localeValues: Locale = {
expired: '二维码已过期',
refresh: '点击刷新',
},
+ ColorPicker: {
+ presetEmpty: '暂无',
+ },
};
export default localeValues;
From cd949cf750737d31d94f66e6147988d42729a222 Mon Sep 17 00:00:00 2001
From: CCherry07 <2405693142@qq.com>
Date: Tue, 11 Jul 2023 01:27:30 +0800
Subject: [PATCH 06/23] feat: add demo
---
components/color-picker/demo/allowClear.vue | 1 -
components/color-picker/demo/base.vue | 2 +-
components/color-picker/demo/controlled.vue | 27 ++++++
components/color-picker/demo/disabled.vue | 21 +++++
components/color-picker/demo/format.vue | 96 +++++++++++++++++++++
components/color-picker/demo/index.vue | 14 ++-
components/color-picker/demo/presets.vue | 63 ++++++++++++++
7 files changed, 221 insertions(+), 3 deletions(-)
create mode 100644 components/color-picker/demo/controlled.vue
create mode 100644 components/color-picker/demo/disabled.vue
create mode 100644 components/color-picker/demo/format.vue
create mode 100644 components/color-picker/demo/presets.vue
diff --git a/components/color-picker/demo/allowClear.vue b/components/color-picker/demo/allowClear.vue
index 3dc574fba5..ec110773d2 100644
--- a/components/color-picker/demo/allowClear.vue
+++ b/components/color-picker/demo/allowClear.vue
@@ -19,4 +19,3 @@ Clear Color.
-
diff --git a/components/color-picker/demo/base.vue b/components/color-picker/demo/base.vue
index f182cac8f3..98bffd6ab7 100644
--- a/components/color-picker/demo/base.vue
+++ b/components/color-picker/demo/base.vue
@@ -20,5 +20,5 @@ The simplest usage.
diff --git a/components/color-picker/demo/controlled.vue b/components/color-picker/demo/controlled.vue
new file mode 100644
index 0000000000..b2acb7ccbb
--- /dev/null
+++ b/components/color-picker/demo/controlled.vue
@@ -0,0 +1,27 @@
+
+---
+order: 3
+title:
+ zh-CN: 受控模式
+ en-US: Controlled
+---
+## zh-CN
+
+通过 `value` 和 `onChange` 设置组件为受控模式。
+
+## en-US
+
+Set the component to controlled mode.
+
+
+
+
+
+
+
diff --git a/components/color-picker/demo/disabled.vue b/components/color-picker/demo/disabled.vue
new file mode 100644
index 0000000000..4f3fafa9b8
--- /dev/null
+++ b/components/color-picker/demo/disabled.vue
@@ -0,0 +1,21 @@
+
+---
+order: 4
+title:
+ zh-CN: 禁用
+ en-US: disabled
+---
+
+## zh-CN
+
+设置为禁用状态。
+
+## en-US
+
+Set to disabled state.
+
+
+
+
+
+
diff --git a/components/color-picker/demo/format.vue b/components/color-picker/demo/format.vue
new file mode 100644
index 0000000000..33e33988e0
--- /dev/null
+++ b/components/color-picker/demo/format.vue
@@ -0,0 +1,96 @@
+
+---
+order: 5
+title:
+ zh-CN: 编码格式
+ en-US: Encoding formats
+---
+
+## zh-CN
+
+编码格式,支持`HEX`、`HSB`、`RGB`。
+
+## en-US
+
+Encoding formats, support `HEX`, `HSB`, `RGB`.
+
+
+
+
+
+
+
+
+
+
+
+ HEX:
+ {{ hexString }}
+
+
+
+
+
+
+
+
+
+ HSB:
+ {{ hsbString }}
+
+
+
+
+
+
+
+
+
+ RGB:
+ {{ rgbString }}
+
+
+
+
+
+
diff --git a/components/color-picker/demo/index.vue b/components/color-picker/demo/index.vue
index 8235f3f663..2d74d6bafa 100644
--- a/components/color-picker/demo/index.vue
+++ b/components/color-picker/demo/index.vue
@@ -2,15 +2,23 @@
+
+
+
+
From 9fb41159a4da849ac4a0afa9a734c3659e2ce966 Mon Sep 17 00:00:00 2001
From: CCherry07 <2405693142@qq.com>
Date: Tue, 11 Jul 2023 01:29:11 +0800
Subject: [PATCH 07/23] docs(ColorPicker): add docs
---
components/color-picker/index.en-US.md | 23 +++--------------------
components/color-picker/index.zh-CN.md | 23 ++++-------------------
2 files changed, 7 insertions(+), 39 deletions(-)
diff --git a/components/color-picker/index.en-US.md b/components/color-picker/index.en-US.md
index f386923ebc..6701e645d9 100644
--- a/components/color-picker/index.en-US.md
+++ b/components/color-picker/index.en-US.md
@@ -3,11 +3,6 @@ category: Components
title: ColorPicker
cover: https://mdn.alipayobjects.com/huamei_7uahnr/afts/img/A*PpY4RYNM8UcAAAAAAAAAAAAADrJ8AQ/original
coverDark: https://mdn.alipayobjects.com/huamei_7uahnr/afts/img/A*EHL-QYJofZsAAAAAAAAAAAAADrJ8AQ/original
-tag: New
-demo:
- cols: 2
-group:
- title: Data Entry
---
Components providing color selection, Available since `5.5.0`.
@@ -16,18 +11,6 @@ Components providing color selection, Available since `5.5.0`.
Used when the user needs to customize the color selection.
-## Examples
-
-
-
Basic Usage
-
controlled mode
-
Disable
-
Clear Color
-
Custom Trigger
-
Color Format
-
Preset Colors
-
Pure Render
-
## API
> This component is available since `antd@5.5.0`.
@@ -40,9 +23,9 @@ Used when the user needs to customize the color selection.
| value | Value of color | string \| `Color` | - |
| defaultValue | Default value of color | string \| `Color` | - |
| onChange | Callback when `value` is changed | `(value: Color, hex: string) => void` | - |
-| allowClear | Allow clearing color selected | boolean | false |
-| presets | Preset colors | `{ label: ReactNode, colors: Array
}[]` | - |
-| children | Trigger of ColorPicker | React.ReactNode | - |
+| allowClear | Allow clearing color selected | boolean | false |
+| presets | Preset colors | `{ label: VueNode, colors: Array }[]` | - |
+| children | Trigger of ColorPicker | VueNode | - |
| trigger | ColorPicker trigger mode | `hover` \| `click` | `click` |
| open | Whether to show popup | boolean | - |
| onOpenChange | Callback when `open` is changed | `(open: boolean) => void` | - |
diff --git a/components/color-picker/index.zh-CN.md b/components/color-picker/index.zh-CN.md
index 76d23d3bf5..8ed8939ddb 100644
--- a/components/color-picker/index.zh-CN.md
+++ b/components/color-picker/index.zh-CN.md
@@ -4,14 +4,9 @@ subtitle: 颜色选择器
title: ColorPicker
cover: https://mdn.alipayobjects.com/huamei_7uahnr/afts/img/A*PpY4RYNM8UcAAAAAAAAAAAAADrJ8AQ/original
coverDark: https://mdn.alipayobjects.com/huamei_7uahnr/afts/img/A*EHL-QYJofZsAAAAAAAAAAAAADrJ8AQ/original
-tag: New
-demo:
- cols: 2
-group:
- title: 数据录入
---
-提供颜色选取的组件,自 `5.5.0` 版本开始提供该组件。
+提供颜色选取的组件,自 `4.0.0` 版本开始提供该组件。
## 何时使用
@@ -19,19 +14,9 @@ group:
## 代码演示
-
-基本使用
-受控模式
-禁用
-清除颜色
-自定义触发器
-颜色编码
-预设颜色
-Pure Render
-
## API
-> 自 `antd@5.5.0` 版本开始提供该组件。
+> 自 `antdv@4.0.0` 版本开始提供该组件。
| 参数 | 说明 | 类型 | 默认值 |
@@ -42,8 +27,8 @@ group:
| defaultValue | 颜色默认的值 | string \| `Color` | - |
| onChange | 颜色变化的回调 | `(value: Color, hex: string) => void` | - |
| allowClear | 允许清除选择的颜色 | boolean | false |
-| presets | 预设的颜色 | `{ label: ReactNode, colors: Array }[]` | - |
-| children | 颜色选择器的触发器 | React.ReactNode | - |
+| presets | 预设的颜色 | `{ label: VueNode, colors: Array }[]` | - |
+| children | 颜色选择器的触发器 | VueNode | - |
| trigger | 颜色选择器的触发模式 | `hover` \| `click` | `click` |
| open | 是否显示弹出窗口 | boolean | - |
| onOpenChange | 当 `open` 被改变时的回调 | `(open: boolean) => void` | - |
From c8ed00a66944fc775dc8507237bad11e2bffcfb4 Mon Sep 17 00:00:00 2001
From: CCherry07 <2405693142@qq.com>
Date: Tue, 11 Jul 2023 01:36:24 +0800
Subject: [PATCH 08/23] test(ColorPicker): upload demo snap
---
.../__tests__/__snapshots__/demo.test.js.snap | 106 ++++++++++++++++++
.../color-picker/__tests__/demo.test.js | 3 +
.../color-picker/__tests__/index.test.js | 0
3 files changed, 109 insertions(+)
create mode 100644 components/color-picker/__tests__/__snapshots__/demo.test.js.snap
create mode 100644 components/color-picker/__tests__/demo.test.js
create mode 100644 components/color-picker/__tests__/index.test.js
diff --git a/components/color-picker/__tests__/__snapshots__/demo.test.js.snap b/components/color-picker/__tests__/__snapshots__/demo.test.js.snap
new file mode 100644
index 0000000000..c9b3cb16b4
--- /dev/null
+++ b/components/color-picker/__tests__/__snapshots__/demo.test.js.snap
@@ -0,0 +1,106 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`renders ./components/color-picker/demo/allowClear.vue correctly 1`] = `
+
+`;
+
+exports[`renders ./components/color-picker/demo/base.vue correctly 1`] = `
+
+`;
+
+exports[`renders ./components/color-picker/demo/controlled.vue correctly 1`] = `
+
+`;
+
+exports[`renders ./components/color-picker/demo/disabled.vue correctly 1`] = `
+
+`;
+
+exports[`renders ./components/color-picker/demo/format.vue correctly 1`] = `
+
+
+
+
+
+
+
+
+
+
HSB: "hsb(215, 91%, 100%)"
+
+
+
+
+
+
+
+
+
+
+ RGB: "rgb(22, 119, 255)"
+
+
+
+
+
+`;
+
+exports[`renders ./components/color-picker/demo/presets.vue correctly 1`] = `
+
+`;
diff --git a/components/color-picker/__tests__/demo.test.js b/components/color-picker/__tests__/demo.test.js
new file mode 100644
index 0000000000..131bad76c9
--- /dev/null
+++ b/components/color-picker/__tests__/demo.test.js
@@ -0,0 +1,3 @@
+import demoTest from '../../../tests/shared/demoTest';
+
+demoTest('color-picker');
diff --git a/components/color-picker/__tests__/index.test.js b/components/color-picker/__tests__/index.test.js
new file mode 100644
index 0000000000..e69de29bb2
From ec82d22ed3a51a783bbb7d3699516a0a51dae862 Mon Sep 17 00:00:00 2001
From: CCherry07 <2405693142@qq.com>
Date: Tue, 11 Jul 2023 01:43:00 +0800
Subject: [PATCH 09/23] fix: word spelling mistake
---
components/color-picker/demo/format.vue | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/components/color-picker/demo/format.vue b/components/color-picker/demo/format.vue
index 33e33988e0..0361700e8b 100644
--- a/components/color-picker/demo/format.vue
+++ b/components/color-picker/demo/format.vue
@@ -17,7 +17,7 @@ Encoding formats, support `HEX`, `HSB`, `RGB`.
-
+
@@ -49,7 +49,7 @@ Encoding formats, support `HEX`, `HSB`, `RGB`.
-
+
{{ rgbString }}
-
+
From 65f22ee3e07cfba83aa4ab1a3a2accf6b3591217 Mon Sep 17 00:00:00 2001
From: CCherry07 <2405693142@qq.com>
Date: Tue, 11 Jul 2023 01:43:37 +0800
Subject: [PATCH 10/23] test(ColorPicker): upload demo snap
---
.../__tests__/__snapshots__/demo.test.js.snap | 22 ++++++++++++-------
1 file changed, 14 insertions(+), 8 deletions(-)
diff --git a/components/color-picker/__tests__/__snapshots__/demo.test.js.snap b/components/color-picker/__tests__/__snapshots__/demo.test.js.snap
index c9b3cb16b4..e0193bcc6d 100644
--- a/components/color-picker/__tests__/__snapshots__/demo.test.js.snap
+++ b/components/color-picker/__tests__/__snapshots__/demo.test.js.snap
@@ -80,17 +80,23 @@ exports[`renders ./components/color-picker/demo/format.vue correctly 1`] = `
-
-
-
-
-
+
+
-
RGB: "rgb(22, 119, 255)"
-
+
+
+
RGB: "rgb(22, 119, 255)"
+
+
+
From fe3a422d94374f0a6060285ef3bb6675f5d5dfbe Mon Sep 17 00:00:00 2001
From: CCherry07 <2405693142@qq.com>
Date: Tue, 11 Jul 2023 01:44:43 +0800
Subject: [PATCH 11/23] docs: update docs
---
components/color-picker/index.zh-CN.md | 2 --
1 file changed, 2 deletions(-)
diff --git a/components/color-picker/index.zh-CN.md b/components/color-picker/index.zh-CN.md
index 8ed8939ddb..f2b6badbfc 100644
--- a/components/color-picker/index.zh-CN.md
+++ b/components/color-picker/index.zh-CN.md
@@ -12,8 +12,6 @@ coverDark: https://mdn.alipayobjects.com/huamei_7uahnr/afts/img/A*EHL-QYJofZsAAA
当用户需要自定义颜色选择的时候使用。
-## 代码演示
-
## API
> 自 `antdv@4.0.0` 版本开始提供该组件。
From 35221cb1872096a3cd6e76f51fce56a9107158d5 Mon Sep 17 00:00:00 2001
From: CCherry07 <2405693142@qq.com>
Date: Tue, 11 Jul 2023 23:36:07 +0800
Subject: [PATCH 12/23] style(ColorPicker): code style
---
components/color-picker/ColorPicker.tsx | 22 +++++++++++--------
components/color-picker/ColorPickerPanel.tsx | 9 +++++---
.../components/ColorAlphaInput.tsx | 4 +++-
.../color-picker/components/ColorClear.tsx | 6 +++--
.../color-picker/components/ColorHexInput.tsx | 7 ++++--
.../color-picker/components/ColorHsbInput.tsx | 8 ++++---
.../color-picker/components/ColorInput.tsx | 10 ++++++---
.../color-picker/components/ColorPresets.tsx | 10 +++++----
.../color-picker/components/ColorRgbInput.tsx | 5 ++++-
.../color-picker/components/ColorSteppers.tsx | 7 ++++--
.../color-picker/components/ColorTrigger.tsx | 8 +++++--
components/color-picker/util.ts | 3 ++-
components/vc-color-picker/ColorPicker.tsx | 6 ++---
components/vc-color-picker/color.ts | 3 ++-
.../vc-color-picker/components/Gradient.tsx | 5 +++--
.../vc-color-picker/components/Handler.tsx | 1 +
.../vc-color-picker/components/Picker.tsx | 3 ++-
.../vc-color-picker/components/Slider.tsx | 9 ++++----
.../vc-color-picker/components/Transform.tsx | 3 ++-
.../vc-color-picker/hooks/useColorDrag.ts | 4 +++-
.../vc-color-picker/hooks/useColorState.ts | 6 +++--
components/vc-color-picker/index.tsx | 4 ++++
components/vc-color-picker/util.ts | 3 ++-
typings/global.d.ts | 2 ++
24 files changed, 99 insertions(+), 49 deletions(-)
diff --git a/components/color-picker/ColorPicker.tsx b/components/color-picker/ColorPicker.tsx
index 0df077623a..0a45432708 100644
--- a/components/color-picker/ColorPicker.tsx
+++ b/components/color-picker/ColorPicker.tsx
@@ -1,13 +1,23 @@
-import { computed, defineComponent, shallowRef, watch } from 'vue';
-import PropTypes from '../_util/vue-types';
+import type { CSSProperties, ComputedRef, ExtractPropTypes, PropType } from 'vue';
import type { HsbaColorType } from '../vc-color-picker';
import type { PopoverProps } from '../popover';
+import type { Color } from './color';
+
+import { computed, defineComponent, shallowRef, watch } from 'vue';
+
+import useConfigInject from '../config-provider/hooks/useConfigInject';
import Popover from '../popover';
import theme from '../theme';
+import { generateColor } from './util';
+import PropTypes from '../_util/vue-types';
+import useMergedState from '../_util/hooks/useMergedState';
+import classNames from '../_util/classNames';
+
import ColorPickerPanel from './ColorPickerPanel';
-import type { Color } from './color';
import ColorTrigger from './components/ColorTrigger';
import useColorState from './hooks/useColorState';
+import useStyle from './style';
+
import type {
ColorFormat,
ColorPickerBaseProps,
@@ -15,12 +25,6 @@ import type {
TriggerPlacement,
TriggerType,
} from './interface';
-import useStyle from './style/index';
-import { generateColor } from './util';
-import type { CSSProperties, ComputedRef, ExtractPropTypes, PropType } from 'vue';
-import useConfigInject from '../config-provider/hooks/useConfigInject';
-import useMergedState from '../_util/hooks/useMergedState';
-import classNames from '../_util/classNames';
const colorPickerProps = () => ({
value: {
diff --git a/components/color-picker/ColorPickerPanel.tsx b/components/color-picker/ColorPickerPanel.tsx
index 7d02539a31..7bf32ab921 100644
--- a/components/color-picker/ColorPickerPanel.tsx
+++ b/components/color-picker/ColorPickerPanel.tsx
@@ -1,13 +1,16 @@
import type { HsbaColorType } from '../vc-color-picker';
+import type { ColorPickerBaseProps } from './interface';
+import type { VueNode } from '../_util/type';
+import type { Color } from './color';
+
import { computed, defineComponent } from 'vue';
+
import VcColorPicker from '../vc-color-picker';
import Divider from '../divider';
-import type { Color } from './color';
+
import ColorClear from './components/ColorClear';
import ColorInput from './components/ColorInput';
import ColorPresets from './components/ColorPresets';
-import type { ColorPickerBaseProps } from './interface';
-import type { VueNode } from '../_util/type';
interface ColorPickerPanelProps extends ColorPickerBaseProps {
onChange?: (value?: Color, type?: HsbaColorType) => void;
diff --git a/components/color-picker/components/ColorAlphaInput.tsx b/components/color-picker/components/ColorAlphaInput.tsx
index c5e6960eea..90a4428055 100644
--- a/components/color-picker/components/ColorAlphaInput.tsx
+++ b/components/color-picker/components/ColorAlphaInput.tsx
@@ -1,6 +1,8 @@
-import { computed, defineComponent, ref, watch } from 'vue';
import type { Color } from '../color';
import type { ColorPickerBaseProps } from '../interface';
+
+import { computed, defineComponent, ref, watch } from 'vue';
+
import { generateColor, getAlphaColor } from '../util';
import ColorSteppers from './ColorSteppers';
diff --git a/components/color-picker/components/ColorClear.tsx b/components/color-picker/components/ColorClear.tsx
index 8dad6b9e19..1923584259 100644
--- a/components/color-picker/components/ColorClear.tsx
+++ b/components/color-picker/components/ColorClear.tsx
@@ -1,6 +1,8 @@
-import { defineComponent } from 'vue';
-import type { Color } from '../color';
import type { ColorPickerBaseProps } from '../interface';
+import type { Color } from '../color';
+
+import { defineComponent } from 'vue';
+
import { generateColor } from '../util';
interface ColorClearProps extends Pick
{
diff --git a/components/color-picker/components/ColorHexInput.tsx b/components/color-picker/components/ColorHexInput.tsx
index 0aadce6a38..9d51aaae01 100644
--- a/components/color-picker/components/ColorHexInput.tsx
+++ b/components/color-picker/components/ColorHexInput.tsx
@@ -1,7 +1,10 @@
-import { computed, defineComponent, ref, watch } from 'vue';
-import Input from '../../input';
import type { Color } from '../color';
import type { ColorPickerBaseProps } from '../interface';
+
+import { computed, defineComponent, ref, watch } from 'vue';
+
+import Input from '../../input';
+
import { generateColor, toHexFormat } from '../util';
interface ColorHexInputProps extends Pick {
diff --git a/components/color-picker/components/ColorHsbInput.tsx b/components/color-picker/components/ColorHsbInput.tsx
index f04ae74e00..78ee7ac011 100644
--- a/components/color-picker/components/ColorHsbInput.tsx
+++ b/components/color-picker/components/ColorHsbInput.tsx
@@ -1,10 +1,12 @@
-import { computed, defineComponent, ref, watch } from 'vue';
-
-import { getRoundNumber } from '../../vc-color-picker/color';
import type { HSB } from '../../vc-color-picker';
import type { Color } from '../color';
import type { ColorPickerBaseProps } from '../interface';
+
+import { computed, defineComponent, ref, watch } from 'vue';
+
+import { getRoundNumber } from '../../vc-color-picker/color';
import { generateColor } from '../util';
+
import ColorSteppers from './ColorSteppers';
interface ColorHsbInputProps extends Pick {
diff --git a/components/color-picker/components/ColorInput.tsx b/components/color-picker/components/ColorInput.tsx
index 163c163b7e..f9567a6635 100644
--- a/components/color-picker/components/ColorInput.tsx
+++ b/components/color-picker/components/ColorInput.tsx
@@ -1,14 +1,18 @@
import type { VNode } from 'vue';
-import { computed, defineComponent } from 'vue';
-import Select from '../../select';
import type { Color } from '../color';
import type { ColorPickerBaseProps } from '../interface';
+
+import { computed, defineComponent } from 'vue';
+
+import useMergedState from '../../_util/hooks/useMergedState';
+
+import Select from '../../select';
+
import { ColorFormat } from '../interface';
import ColorAlphaInput from './ColorAlphaInput';
import ColorHexInput from './ColorHexInput';
import ColorHsbInput from './ColorHsbInput';
import ColorRgbInput from './ColorRgbInput';
-import useMergedState from '../../_util/hooks/useMergedState';
interface ColorInputProps
extends Pick {
diff --git a/components/color-picker/components/ColorPresets.tsx b/components/color-picker/components/ColorPresets.tsx
index 8a7b77ebc8..b3f6f0b1ee 100644
--- a/components/color-picker/components/ColorPresets.tsx
+++ b/components/color-picker/components/ColorPresets.tsx
@@ -1,13 +1,15 @@
-import { computed, defineComponent } from 'vue';
import type { ColorPickerBaseProps, PresetsItem } from '../interface';
-import Collapse from '../../collapse';
import type { Color } from '../color';
+
+import { computed, defineComponent } from 'vue';
+const { Panel } = Collapse;
+
+import { useConfigContextInject } from '../../config-provider/context';
+import Collapse from '../../collapse';
import useMergedState from '../../_util/hooks/useMergedState';
import { ColorBlock } from '../../vc-color-picker';
import { generateColor } from '../util';
import classNames from '../../_util/classNames';
-import { useConfigContextInject } from '../../config-provider/context';
-const { Panel } = Collapse;
interface ColorPresetsProps extends Pick {
presets: PresetsItem[];
diff --git a/components/color-picker/components/ColorRgbInput.tsx b/components/color-picker/components/ColorRgbInput.tsx
index 664d24c991..3b4261da03 100644
--- a/components/color-picker/components/ColorRgbInput.tsx
+++ b/components/color-picker/components/ColorRgbInput.tsx
@@ -1,14 +1,17 @@
-import { computed, defineComponent, ref, watch } from 'vue';
import type { RGB } from '../../vc-color-picker';
import type { Color } from '../color';
import type { ColorPickerBaseProps } from '../interface';
+
+import { computed, defineComponent, ref, watch } from 'vue';
import { generateColor } from '../util';
+
import ColorSteppers from './ColorSteppers';
interface ColorRgbInputProps extends Pick {
value?: Color;
onChange?: (value: Color) => void;
}
+
const ColorRgbInput = defineComponent({
name: 'ColorRgbInput',
props: ['prefixCls', 'value', 'onChange'],
diff --git a/components/color-picker/components/ColorSteppers.tsx b/components/color-picker/components/ColorSteppers.tsx
index 5b7841670d..3db3dc8377 100644
--- a/components/color-picker/components/ColorSteppers.tsx
+++ b/components/color-picker/components/ColorSteppers.tsx
@@ -1,8 +1,10 @@
-import { computed, defineComponent, ref, watch } from 'vue';
import type { VueNode } from '../../_util/type';
import type { InputNumberProps } from '../../input-number';
-import InputNumber from '../../input-number';
import type { ColorPickerBaseProps } from '../interface';
+
+import { computed, defineComponent, ref, watch } from 'vue';
+
+import InputNumber from '../../input-number';
import classNames from '../../_util/classNames';
interface ColorSteppersProps extends Pick {
@@ -14,6 +16,7 @@ interface ColorSteppersProps extends Pick {
prefix?: (prefixCls: string) => VueNode;
formatter?: InputNumberProps['formatter'];
}
+
const ColorSteppers = defineComponent({
name: 'ColorSteppers',
props: ['prefixCls', 'value', 'min', 'max', 'onChange', 'formatter'],
diff --git a/components/color-picker/components/ColorTrigger.tsx b/components/color-picker/components/ColorTrigger.tsx
index 34e2ac0c57..3e8583dfb4 100644
--- a/components/color-picker/components/ColorTrigger.tsx
+++ b/components/color-picker/components/ColorTrigger.tsx
@@ -1,8 +1,11 @@
-import { computed, defineComponent, shallowRef } from 'vue';
+import type { VueNode } from '../../_util/type';
import type { ColorPickerBaseProps } from '../interface';
+
+import { computed, defineComponent, shallowRef } from 'vue';
+
import { ColorBlock } from '../../vc-color-picker';
-import type { VueNode } from '../../_util/type';
import classNames from '../../_util/classNames';
+
import ColorClear from './ColorClear';
interface colorTriggerProps
@@ -10,6 +13,7 @@ interface colorTriggerProps
color: Exclude;
open?: boolean;
}
+
const ColorTrigger = defineComponent({
name: 'ColorTrigger',
props: ['prefixCls', 'colorCleared', 'disabled', 'color', 'open'],
diff --git a/components/color-picker/util.ts b/components/color-picker/util.ts
index d1f529a6e7..53c1bb94d7 100644
--- a/components/color-picker/util.ts
+++ b/components/color-picker/util.ts
@@ -1,6 +1,7 @@
import type { ColorGenInput } from '../vc-color-picker';
-import { getRoundNumber } from '../vc-color-picker/color';
import type { Color } from './color';
+
+import { getRoundNumber } from '../vc-color-picker/color';
import { ColorFactory } from './color';
export const customizePrefixCls = 'ant-color-picker';
diff --git a/components/vc-color-picker/ColorPicker.tsx b/components/vc-color-picker/ColorPicker.tsx
index 371c6f2b57..73d13e0600 100644
--- a/components/vc-color-picker/ColorPicker.tsx
+++ b/components/vc-color-picker/ColorPicker.tsx
@@ -1,14 +1,14 @@
import { defineComponent, type CSSProperties, computed, shallowRef } from 'vue';
+import type { BaseColorPickerProps, ColorGenInput } from './interface';
+import type { VueNode } from '../_util/type';
import { ColorPickerPrefixCls, defaultColor, generateColor } from './util';
+import classNames from '../_util/classNames';
import ColorBlock from './components/ColorBlock';
import Picker from './components/Picker';
import Slider from './components/Slider';
import useColorState from './hooks/useColorState';
-import type { BaseColorPickerProps, ColorGenInput } from './interface';
-import type { VueNode } from '../_util/type';
-import classNames from '../_util/classNames';
const hueColor = [
'rgb(255, 0, 0) 0%',
diff --git a/components/vc-color-picker/color.ts b/components/vc-color-picker/color.ts
index 9ab847d1a2..70c86d9d2c 100644
--- a/components/vc-color-picker/color.ts
+++ b/components/vc-color-picker/color.ts
@@ -1,7 +1,8 @@
import type { ColorInput, HSVA, Numberify } from '@ctrl/tinycolor';
-import { TinyColor } from '@ctrl/tinycolor';
import type { ColorGenInput, HSB, HSBA } from './interface';
+import { TinyColor } from '@ctrl/tinycolor';
+
export const getRoundNumber = (value: number) => Math.round(Number(value || 0));
const convertHsb2Hsv = (color: ColorGenInput): ColorInput => {
diff --git a/components/vc-color-picker/components/Gradient.tsx b/components/vc-color-picker/components/Gradient.tsx
index f0a79bcfd2..376afae6d0 100644
--- a/components/vc-color-picker/components/Gradient.tsx
+++ b/components/vc-color-picker/components/Gradient.tsx
@@ -1,7 +1,8 @@
-import { computed, defineComponent } from 'vue';
-
import type { Color } from '../color';
import type { HsbaColorType } from '../interface';
+
+import { computed, defineComponent } from 'vue';
+
import { generateColor } from '../util';
interface ColorBlockProps {
diff --git a/components/vc-color-picker/components/Handler.tsx b/components/vc-color-picker/components/Handler.tsx
index 14b46e014e..d5c484cbf9 100644
--- a/components/vc-color-picker/components/Handler.tsx
+++ b/components/vc-color-picker/components/Handler.tsx
@@ -1,5 +1,6 @@
import classNames from '../../_util/classNames';
import { computed, defineComponent } from 'vue';
+
type HandlerSize = 'default' | 'small';
interface HandlerProps {
diff --git a/components/vc-color-picker/components/Picker.tsx b/components/vc-color-picker/components/Picker.tsx
index 90d046d9f5..f149e81d45 100644
--- a/components/vc-color-picker/components/Picker.tsx
+++ b/components/vc-color-picker/components/Picker.tsx
@@ -1,6 +1,7 @@
+import type { BaseColorPickerProps } from '../interface';
import { defineComponent, ref, shallowRef, watchEffect } from 'vue';
+
import useColorDrag from '../hooks/useColorDrag';
-import type { BaseColorPickerProps } from '../interface';
import { calculateColor, calculateOffset } from '../util';
import Handler from './Handler';
diff --git a/components/vc-color-picker/components/Slider.tsx b/components/vc-color-picker/components/Slider.tsx
index 92ba276bab..a35979f389 100644
--- a/components/vc-color-picker/components/Slider.tsx
+++ b/components/vc-color-picker/components/Slider.tsx
@@ -1,14 +1,15 @@
+import type { BaseColorPickerProps, HsbaColorType } from '../interface';
+
import { computed, defineComponent, ref, shallowRef, watchEffect } from 'vue';
-import useColorDrag from '../hooks/useColorDrag';
-import type { BaseColorPickerProps, HsbaColorType } from '../interface';
+import classNames from '../../_util/classNames';
+
import { calculateColor, calculateOffset } from '../util';
+import useColorDrag from '../hooks/useColorDrag';
import Palette from './Palette';
-
import Gradient from './Gradient';
import Handler from './Handler';
import Transform from './Transform';
-import classNames from 'ant-design-vue/es/_util/classNames';
interface SliderProps extends BaseColorPickerProps {
gradientColors: string[];
diff --git a/components/vc-color-picker/components/Transform.tsx b/components/vc-color-picker/components/Transform.tsx
index d6a049b0b3..05e4790d61 100644
--- a/components/vc-color-picker/components/Transform.tsx
+++ b/components/vc-color-picker/components/Transform.tsx
@@ -1,5 +1,6 @@
-import { defineComponent, shallowRef } from 'vue';
import type { TransformOffset } from '../interface';
+import { defineComponent, shallowRef } from 'vue';
+
const Transform = defineComponent({
name: 'Transform',
props: ['offset'],
diff --git a/components/vc-color-picker/hooks/useColorDrag.ts b/components/vc-color-picker/hooks/useColorDrag.ts
index 096036d29b..fc99189720 100644
--- a/components/vc-color-picker/hooks/useColorDrag.ts
+++ b/components/vc-color-picker/hooks/useColorDrag.ts
@@ -1,6 +1,8 @@
-import { ref, shallowRef, type Ref, watch, onUnmounted, onMounted } from 'vue';
import type { Color } from '../color';
import type { TransformOffset } from '../interface';
+
+import { ref, shallowRef, type Ref, watch, onUnmounted, onMounted } from 'vue';
+
type EventType = MouseEvent | TouchEvent;
type EventHandle = (e: EventType) => void;
diff --git a/components/vc-color-picker/hooks/useColorState.ts b/components/vc-color-picker/hooks/useColorState.ts
index eb1497afb6..b8b15d84b7 100644
--- a/components/vc-color-picker/hooks/useColorState.ts
+++ b/components/vc-color-picker/hooks/useColorState.ts
@@ -1,8 +1,10 @@
import type { Ref } from 'vue';
-import { watch } from 'vue';
-import useState from '../../_util/hooks/useState';
import type { ColorGenInput } from '../interface';
+
+import { watch } from 'vue';
+
import { generateColor } from '../util';
+import useState from '../../_util/hooks/useState';
type ColorValue = ColorGenInput | undefined;
diff --git a/components/vc-color-picker/index.tsx b/components/vc-color-picker/index.tsx
index 3d87d7d6df..80c7f60923 100644
--- a/components/vc-color-picker/index.tsx
+++ b/components/vc-color-picker/index.tsx
@@ -1,8 +1,12 @@
import ColorPicker from './ColorPicker';
+
export { Color } from './color';
+
export type { ColorPickerProps } from './ColorPicker';
+
export { default as ColorBlock } from './components/ColorBlock';
export type { ColorBlockProps } from './components/ColorBlock';
+
export * from './interface';
export default ColorPicker;
diff --git a/components/vc-color-picker/util.ts b/components/vc-color-picker/util.ts
index 99e927a588..4d666d49b9 100644
--- a/components/vc-color-picker/util.ts
+++ b/components/vc-color-picker/util.ts
@@ -1,7 +1,8 @@
import type { Ref } from 'vue';
-import { Color } from './color';
import type { ColorGenInput, HsbaColorType, TransformOffset } from './interface';
+import { Color } from './color';
+
export const ColorPickerPrefixCls = 'rc-color-picker';
export const generateColor = (color: ColorGenInput): Color => {
diff --git a/typings/global.d.ts b/typings/global.d.ts
index fd5c97863d..c0a9b17fdb 100644
--- a/typings/global.d.ts
+++ b/typings/global.d.ts
@@ -264,6 +264,8 @@ declare module 'vue' {
ABackTop: typeof import('ant-design-vue')['BackTop'];
AWatermark: typeof import('ant-design-vue')['Watermark'];
+
+ AColorPicker: typeof import('ant-design-vue')['ColorPicker'];
}
}
export {};
From 6191a759317d8d9f51c65855174a84e5c843a58d Mon Sep 17 00:00:00 2001
From: CCherry07 <2405693142@qq.com>
Date: Tue, 11 Jul 2023 23:56:30 +0800
Subject: [PATCH 13/23] fix: other error
---
components/color-picker/components/ColorPresets.tsx | 2 +-
components/color-picker/demo/format.vue | 6 +++---
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/components/color-picker/components/ColorPresets.tsx b/components/color-picker/components/ColorPresets.tsx
index b3f6f0b1ee..4344bb7b76 100644
--- a/components/color-picker/components/ColorPresets.tsx
+++ b/components/color-picker/components/ColorPresets.tsx
@@ -2,7 +2,6 @@ import type { ColorPickerBaseProps, PresetsItem } from '../interface';
import type { Color } from '../color';
import { computed, defineComponent } from 'vue';
-const { Panel } = Collapse;
import { useConfigContextInject } from '../../config-provider/context';
import Collapse from '../../collapse';
@@ -11,6 +10,7 @@ import { ColorBlock } from '../../vc-color-picker';
import { generateColor } from '../util';
import classNames from '../../_util/classNames';
+const { Panel } = Collapse;
interface ColorPresetsProps extends Pick {
presets: PresetsItem[];
value?: Color;
diff --git a/components/color-picker/demo/format.vue b/components/color-picker/demo/format.vue
index 0361700e8b..c5e5f30988 100644
--- a/components/color-picker/demo/format.vue
+++ b/components/color-picker/demo/format.vue
@@ -22,7 +22,7 @@ Encoding formats, support `HEX`, `HSB`, `RGB`.
@@ -37,7 +37,7 @@ Encoding formats, support `HEX`, `HSB`, `RGB`.
@@ -52,7 +52,7 @@ Encoding formats, support `HEX`, `HSB`, `RGB`.
From 1453d3f5e51b35d79b1f33bccbd7c008dd95f74b Mon Sep 17 00:00:00 2001
From: CCherry07 <2405693142@qq.com>
Date: Wed, 12 Jul 2023 02:37:27 +0800
Subject: [PATCH 14/23] feat(ColorPicker): Sync with antd
---
components/color-picker/ColorPicker.tsx | 92 +++++++++++----
components/color-picker/ColorPickerPanel.tsx | 95 ++++++++-------
components/color-picker/color.ts | 6 +-
.../color-picker/components/ColorClear.tsx | 5 +-
.../color-picker/components/ColorTrigger.tsx | 32 ++++-
.../color-picker/components/PanelPicker.tsx | 49 ++++++++
.../color-picker/components/PanelPresets.tsx | 26 +++++
components/color-picker/context.tsx | 16 +++
components/color-picker/demo/index.vue | 3 +
components/color-picker/demo/text-render.vue | 44 +++++++
components/color-picker/interface.ts | 1 +
components/color-picker/style/color-block.ts | 8 +-
components/color-picker/style/index.ts | 109 +++++++++++++++---
components/color-picker/style/picker.ts | 7 +-
components/color-picker/style/presets.ts | 3 +-
components/color-picker/util.ts | 2 +-
16 files changed, 397 insertions(+), 101 deletions(-)
create mode 100644 components/color-picker/components/PanelPicker.tsx
create mode 100644 components/color-picker/components/PanelPresets.tsx
create mode 100644 components/color-picker/context.tsx
create mode 100644 components/color-picker/demo/text-render.vue
diff --git a/components/color-picker/ColorPicker.tsx b/components/color-picker/ColorPicker.tsx
index 0a45432708..285af2dab0 100644
--- a/components/color-picker/ColorPicker.tsx
+++ b/components/color-picker/ColorPicker.tsx
@@ -25,6 +25,8 @@ import type {
TriggerPlacement,
TriggerType,
} from './interface';
+import type { VueNode } from '../_util/type';
+import { useCompactItemContext } from '../space/Compact';
const colorPickerProps = () => ({
value: {
@@ -62,7 +64,7 @@ const colorPickerProps = () => ({
default: true,
},
styles: {
- type: Object as PropType<{ popup?: CSSProperties }>,
+ type: Object as PropType<{ popup?: CSSProperties; popupOverlayInner?: StyleSheet }>,
default: () => ({}),
},
rootClassName: PropTypes.string,
@@ -86,6 +88,16 @@ const colorPickerProps = () => ({
type: Boolean as PropType,
default: true,
},
+ onChangeComplete: {
+ type: Function as PropType<(value: Color) => void>,
+ default: () => {},
+ },
+ showText: {
+ type: [Boolean, Function] as PropType VueNode)>,
+ default: false,
+ },
+ size: PropTypes.oneOf(['small', 'middle', 'large']),
+ destroyTooltipOnHide: PropTypes.looseBool,
});
export type ColorPickerProps = Partial>>;
@@ -109,13 +121,38 @@ const ColorPicker = defineComponent({
postState: openData => !props.disabled && openData,
onChange: props.onOpenChange,
});
- const colorCleared = shallowRef(false);
+ const format = computed(() => props.format);
+
+ const [formatValue, setFormatValue] = useMergedState(props.format, {
+ value: format,
+ onChange: props.onFormatChange,
+ });
+ // ===================== Style =====================
+ const { compactSize } = useCompactItemContext(prefixCls, direction);
+ const mergedSize = computed(() => props.size || compactSize.value);
const [wrapSSR, hashId] = useStyle(prefixCls);
- const handleClear = (clear: boolean) => {
- colorCleared.value = clear;
- };
- const handleChange = (data: Color, type?: HsbaColorType) => {
+
+ const rtlCls = computed(() => ({ [`${prefixCls.value}-rtl`]: direction.value }));
+ const mergeCls = computed(() => {
+ const mergeRootCls = classNames(props.rootClassName, rtlCls.value);
+ return classNames(
+ {
+ [`${prefixCls.value}-sm`]: mergedSize.value === 'small',
+ [`${prefixCls.value}-lg`]: mergedSize.value === 'large',
+ },
+ mergeRootCls,
+ hashId.value,
+ );
+ });
+
+ const mergePopupCls = computed(() => classNames(prefixCls.value, rtlCls.value));
+
+ const colorCleared = shallowRef(false);
+
+ const popupAllowCloseRef = shallowRef(true);
+
+ const handleChange = (data: Color, type?: HsbaColorType, pickColor?: boolean) => {
let color: Color = generateColor(data);
if (colorCleared.value) {
colorCleared.value = false;
@@ -126,13 +163,26 @@ const ColorPicker = defineComponent({
color = generateColor(hsba);
}
}
- if (!props.value) {
- setColorValue(color);
+ if (pickColor) {
+ popupAllowCloseRef.value = false;
}
+
+ setColorValue(color);
emit('update:value', color, color.toHexString());
emit('change', color, color.toHexString());
};
+
+ const handleClear = () => {
+ colorCleared.value = true;
+ emit('clear');
+ };
+ const handleChangeComplete = color => {
+ popupAllowCloseRef.value = true;
+ emit('changeComplete', generateColor(color));
+ };
+
const onFormatChange = (format: ColorFormat) => {
+ setFormatValue(format);
emit('formatChange', format);
};
const popoverProps: ComputedRef = computed(() => ({
@@ -143,6 +193,7 @@ const ColorPicker = defineComponent({
rootClassName: props.rootClassName,
getPopupContainer: getPopupContainer.value,
autoAdjustOverflow: props.autoAdjustOverflow,
+ destroyTooltipOnHide: props.destroyTooltipOnHide,
}));
const colorBaseProps: ComputedRef = computed(() => ({
prefixCls: prefixCls.value,
@@ -151,24 +202,22 @@ const ColorPicker = defineComponent({
colorCleared: colorCleared.value,
disabled: props.disabled,
presets: props.presets,
- format: props.format,
+ format: formatValue.value,
onFormatChange,
+ onChangeComplete: handleChangeComplete,
}));
- watch(colorCleared, (val, oldVal) => {
- if (!oldVal && val) {
- setPopupOpen(false);
- }
- });
return () => {
- const mergeRootCls = classNames(props.rootClassName, {
- [`${prefixCls.value}-rtl`]: direction,
- });
- const mergeCls = classNames(mergeRootCls, hashId.value);
return wrapSSR(
{
+ if (popupAllowCloseRef.value) {
+ setPopupOpen(visible);
+ }
+ }}
content={
}
- overlayClassName={prefixCls.value}
+ overlayClassName={mergePopupCls.value}
{...popoverProps.value}
>
{slots.children?.() || (
)}
diff --git a/components/color-picker/ColorPickerPanel.tsx b/components/color-picker/ColorPickerPanel.tsx
index 7bf32ab921..5dc884b382 100644
--- a/components/color-picker/ColorPickerPanel.tsx
+++ b/components/color-picker/ColorPickerPanel.tsx
@@ -1,68 +1,67 @@
import type { HsbaColorType } from '../vc-color-picker';
import type { ColorPickerBaseProps } from './interface';
-import type { VueNode } from '../_util/type';
import type { Color } from './color';
-import { computed, defineComponent } from 'vue';
-
-import VcColorPicker from '../vc-color-picker';
+import { computed, defineComponent, provide } from 'vue';
+import { PanelPickerContext, PanelPresetsContext } from './context';
import Divider from '../divider';
-
-import ColorClear from './components/ColorClear';
-import ColorInput from './components/ColorInput';
-import ColorPresets from './components/ColorPresets';
+import PanelPicker from './components/PanelPicker';
+import PanelPresets from './components/PanelPresets';
+import type { VueNode } from '../_util/type';
interface ColorPickerPanelProps extends ColorPickerBaseProps {
onChange?: (value?: Color, type?: HsbaColorType) => void;
onClear?: (clear?: boolean) => void;
+ panelRender?: (
+ innerPanel: VueNode,
+ {
+ components,
+ }: {
+ components: { PanelPicker: typeof PanelPicker; PanelPresets: typeof PanelPresets };
+ },
+ ) => VueNode;
}
const ColorPickerPanel = defineComponent({
name: 'ColorPickerPanel',
inheritAttrs: false,
- props: ['prefixCls', 'allowClear', 'presets', 'onChange', 'onClear', 'color'],
+ props: ['prefixCls', 'presets', 'onChange', 'onClear', 'color', 'panelRender'],
setup(props: ColorPickerPanelProps, { attrs }) {
- const colorPickerPanelPrefixCls = computed(() => `${props.prefixCls}-inner-panel`);
- const newLocal = (panel: VueNode) => (
-
- {props.allowClear && (
-
{
- props.onChange?.(clearColor);
- props.onClear?.(true);
- }}
- {...attrs}
- />
- )}
- {panel}
-
+ const colorPickerPanelPrefixCls = computed(() => `${props.prefixCls}-inner-content`);
+ // ==== Inject props ===
+ const panelPickerProps = computed(() => ({
+ prefixCls: props.prefixCls,
+ value: props.color,
+ onChange: props.onChange,
+ onClear: props.onClear,
+ ...attrs,
+ }));
+ const panelPresetsProps = computed(() => ({
+ prefixCls: props.prefixCls,
+ value: props.color,
+ presets: props.presets,
+ onChange: props.onChange,
+ }));
+ // ==== Inject ===
+ provide(PanelPickerContext, panelPickerProps);
+ provide(PanelPresetsContext, panelPresetsProps);
+ // ==== Render ===
+ const innerPanel = computed(() => (
+ <>
+
{Array.isArray(props.presets) && (
- <>
-
-
- >
+
)}
-
- );
- const extraPanelRender = newLocal;
+
+ >
+ ));
return () => (
-
+
+ {typeof props.panelRender === 'function'
+ ? props.panelRender(innerPanel.value, {
+ components: { Picker: PanelPicker, Presets: PanelPresets },
+ })
+ : innerPanel.value}
+
);
},
});
diff --git a/components/color-picker/color.ts b/components/color-picker/color.ts
index 1a478d3073..766c9c3920 100644
--- a/components/color-picker/color.ts
+++ b/components/color-picker/color.ts
@@ -1,8 +1,12 @@
/* eslint-disable class-methods-use-this */
-import { getHex } from './util';
import type { ColorGenInput } from '../vc-color-picker';
import { Color as RcColor } from '../vc-color-picker';
+export const toHexFormat = (value?: string, alpha?: boolean) =>
+ value?.replace(/[^\w/]/gi, '').slice(0, alpha ? 8 : 6) || '';
+
+export const getHex = (value?: string, alpha?: boolean) => (value ? toHexFormat(value, alpha) : '');
+
export type Color = Pick<
RcColor,
'toHsb' | 'toHsbString' | 'toHex' | 'toHexString' | 'toRgb' | 'toRgbString'
diff --git a/components/color-picker/components/ColorClear.tsx b/components/color-picker/components/ColorClear.tsx
index 1923584259..94f69b1c49 100644
--- a/components/color-picker/components/ColorClear.tsx
+++ b/components/color-picker/components/ColorClear.tsx
@@ -7,14 +7,15 @@ import { generateColor } from '../util';
interface ColorClearProps extends Pick {
value?: Color;
+ colorCleared?: boolean;
onChange?: (value: Color) => void;
}
const ColorClear = defineComponent({
name: 'ColorClear',
- props: ['prefixCls', 'value', 'onChange'],
+ props: ['prefixCls', 'value', 'onChange', 'colorCleared'],
setup(props: ColorClearProps) {
const handleClick = () => {
- if (props.value) {
+ if (props.value && !props.colorCleared) {
const hsba = props.value.toHsb();
hsba.a = 0;
const genColor = generateColor(hsba);
diff --git a/components/color-picker/components/ColorTrigger.tsx b/components/color-picker/components/ColorTrigger.tsx
index 3e8583dfb4..1f21fbfbe3 100644
--- a/components/color-picker/components/ColorTrigger.tsx
+++ b/components/color-picker/components/ColorTrigger.tsx
@@ -7,16 +7,19 @@ import { ColorBlock } from '../../vc-color-picker';
import classNames from '../../_util/classNames';
import ColorClear from './ColorClear';
+import { getAlphaColor } from '../util';
interface colorTriggerProps
extends Pick {
color: Exclude;
open?: boolean;
+ showText?: boolean | ((color: ColorPickerBaseProps['color']) => VueNode);
+ format?: 'hex' | 'hsb' | 'rgb';
}
const ColorTrigger = defineComponent({
name: 'ColorTrigger',
- props: ['prefixCls', 'colorCleared', 'disabled', 'color', 'open'],
+ props: ['prefixCls', 'colorCleared', 'disabled', 'color', 'open', 'showText', 'format'],
setup(props: colorTriggerProps, { expose }) {
const colorTriggerPrefixCls = computed(() => `${props.prefixCls}-trigger`);
const containerNode = computed(() =>
@@ -27,7 +30,31 @@ const ColorTrigger = defineComponent({
),
);
+ const genColorString = () => {
+ const hexString = props.color.toHexString().toUpperCase();
+ const alpha = getAlphaColor(props.color);
+ switch (props.format) {
+ case 'rgb':
+ return props.color.toRgbString();
+ case 'hsb':
+ return props.color.toHsbString();
+ case 'hex':
+ default:
+ return alpha < 100 ? `${hexString.slice(0, 7)},${alpha}%` : hexString;
+ }
+ };
+
const colorTriggerRef = shallowRef();
+
+ const renderText = computed(() => {
+ if (typeof props.showText === 'function') {
+ return props.showText(props.color);
+ }
+ if (props.showText) {
+ return genColorString();
+ }
+ return null;
+ });
expose({
getRef: () => colorTriggerRef.value,
});
@@ -41,6 +68,9 @@ const ColorTrigger = defineComponent({
})}
>
{containerNode.value}
+ {props.showText && (
+ {renderText.value}
+ )}
);
},
diff --git a/components/color-picker/components/PanelPicker.tsx b/components/color-picker/components/PanelPicker.tsx
new file mode 100644
index 0000000000..804f121275
--- /dev/null
+++ b/components/color-picker/components/PanelPicker.tsx
@@ -0,0 +1,49 @@
+import type { HsbaColorType } from '../../vc-color-picker';
+import type { Color } from '../color';
+import type { ColorPickerBaseProps } from '../interface';
+
+import { defineComponent } from 'vue';
+import VcColorPicker from '../../vc-color-picker';
+import { usePanelPickerContext } from '../context';
+import ColorClear from './ColorClear';
+import ColorInput from './ColorInput';
+export interface PanelPickerProps
+ extends Pick<
+ ColorPickerBaseProps,
+ 'prefixCls' | 'colorCleared' | 'allowClear' | 'onChangeComplete'
+ > {
+ value?: Color;
+ onChange?: (value?: Color, type?: HsbaColorType, pickColor?: boolean) => void;
+ onClear?: () => void;
+}
+const PanelPicker = defineComponent({
+ name: 'PanelPicker',
+ setup() {
+ const context = usePanelPickerContext();
+ return () => (
+ <>
+ {context.value.allowClear && (
+ {
+ context.value.onChange?.(clearColor);
+ context.value.onClear?.(clearColor);
+ }}
+ />
+ )}
+ context.value.onChange?.(colorValue, type, true)}
+ onChangeComplete={context.value.onChangeComplete}
+ />
+
+ >
+ );
+ },
+});
+
+export default PanelPicker;
diff --git a/components/color-picker/components/PanelPresets.tsx b/components/color-picker/components/PanelPresets.tsx
new file mode 100644
index 0000000000..ad3b3e1a5f
--- /dev/null
+++ b/components/color-picker/components/PanelPresets.tsx
@@ -0,0 +1,26 @@
+import type { Color } from '../color';
+import type { ColorPickerBaseProps } from '../interface';
+import { defineComponent } from 'vue';
+import { usePanelPresetsContext } from '../context';
+import ColorPresets from './ColorPresets';
+
+export interface PanelPresetsProps extends Pick {
+ value?: Color;
+ onChange?: (value: Color) => void;
+}
+const PanelPresets = defineComponent({
+ name: 'PanelPresets',
+ setup() {
+ const context = usePanelPresetsContext();
+ return () =>
+ Array.isArray(context.value.presets) ? (
+
+ ) : null;
+ },
+});
+export default PanelPresets;
diff --git a/components/color-picker/context.tsx b/components/color-picker/context.tsx
new file mode 100644
index 0000000000..cdf7c3f036
--- /dev/null
+++ b/components/color-picker/context.tsx
@@ -0,0 +1,16 @@
+import type { ComputedRef } from 'vue';
+import { inject } from 'vue';
+import type { PanelPickerProps } from './components/PanelPicker';
+import type { PanelPresetsProps } from './components/PanelPresets';
+
+export const PanelPickerContext = Symbol('PanelPickerContext');
+
+export const usePanelPickerContext = () => {
+ return inject>(PanelPickerContext);
+};
+
+export const PanelPresetsContext = Symbol('PanelPresetsContext');
+
+export const usePanelPresetsContext = () => {
+ return inject>(PanelPresetsContext);
+};
diff --git a/components/color-picker/demo/index.vue b/components/color-picker/demo/index.vue
index 2d74d6bafa..54cbdf2522 100644
--- a/components/color-picker/demo/index.vue
+++ b/components/color-picker/demo/index.vue
@@ -6,6 +6,7 @@
+
@@ -17,6 +18,7 @@ import Controlled from './controlled.vue';
import Disabled from './disabled.vue';
import Format from './format.vue';
import Presets from './presets.vue';
+import TextRender from './text-render.vue';
import CN from '../index.zh-CN.md';
import US from '../index.en-US.md';
@@ -30,6 +32,7 @@ export default defineComponent({
Disabled,
Format,
Presets,
+ TextRender,
},
setup() {
return {};
diff --git a/components/color-picker/demo/text-render.vue b/components/color-picker/demo/text-render.vue
new file mode 100644
index 0000000000..28f3eaadec
--- /dev/null
+++ b/components/color-picker/demo/text-render.vue
@@ -0,0 +1,44 @@
+
+---
+order: 0
+title:
+ zh-CN: 渲染触发器的默认文本
+ en-US: Renders the default text of the trigger
+---
+
+## zh-CN
+
+渲染触发器的默认文本, `showText` 为 `true` 时生效。自定义文本时,可以使用 `showText` 为函数的方式,返回自定义的文本。
+
+## en-US
+
+Renders the default text of the trigger, effective when `showText` is `true`. When customizing text, you can use `showText` as a function to return custom text.
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/color-picker/interface.ts b/components/color-picker/interface.ts
index b720bb3bb1..dc0a203d7c 100644
--- a/components/color-picker/interface.ts
+++ b/components/color-picker/interface.ts
@@ -30,4 +30,5 @@ export interface ColorPickerBaseProps {
disabled?: boolean;
presets?: PresetsItem[];
onFormatChange?: ColorPickerProps['onFormatChange'];
+ onChangeComplete?: ColorPickerProps['onChangeComplete'];
}
diff --git a/components/color-picker/style/color-block.ts b/components/color-picker/style/color-block.ts
index 67a6602590..110164d2ce 100644
--- a/components/color-picker/style/color-block.ts
+++ b/components/color-picker/style/color-block.ts
@@ -1,13 +1,11 @@
import { CSSObject } from '../../_util/cssinjs';
import type { ColorPickerToken } from './index';
-const TRANSPARENT_DOT_COLOR = '#EEE';
-
/**
* @private Internal usage only
*/
-export const getTransBg = (size: string): CSSObject => ({
- backgroundImage: `conic-gradient(${TRANSPARENT_DOT_COLOR} 0 25%, transparent 0 50%, ${TRANSPARENT_DOT_COLOR} 0 75%, transparent 0)`,
+export const getTransBg = (size: string, colorFill: string): CSSObject => ({
+ backgroundImage: `conic-gradient(${colorFill} 0 25%, transparent 0 50%, ${colorFill} 0 75%, transparent 0)`,
backgroundSize: `${size} ${size}`,
});
@@ -21,7 +19,7 @@ const genColorBlockStyle = (token: ColorPickerToken, size: number): CSSObject =>
width: size,
height: size,
boxShadow: colorPickerInsetShadow,
- ...getTransBg('50%'),
+ ...getTransBg('50%', token.colorFillSecondary),
[`${componentCls}-color-block-inner`]: {
width: '100%',
height: '100%',
diff --git a/components/color-picker/style/index.ts b/components/color-picker/style/index.ts
index d322ae6b1d..54cd70810f 100644
--- a/components/color-picker/style/index.ts
+++ b/components/color-picker/style/index.ts
@@ -28,7 +28,29 @@ export const genActiveStyle = (token: ColorPickerToken) => ({
outline: 0,
});
-const genClearStyle = (token: ColorPickerToken, size: number): CSSObject => {
+const genRtlStyle = (token: ColorPickerToken): CSSObject => {
+ const { componentCls } = token;
+ return {
+ '&-rtl': {
+ [`${componentCls}-presets-color`]: {
+ '&::after': {
+ direction: 'ltr',
+ },
+ },
+ [`${componentCls}-clear`]: {
+ '&::after': {
+ direction: 'ltr',
+ },
+ },
+ },
+ };
+};
+
+const genClearStyle = (
+ token: ColorPickerToken,
+ size: number,
+ extraStyle?: CSSObject,
+): CSSObject => {
const { componentCls, borderRadiusSM, lineWidth, colorSplit, red6 = '#f5222d' } = token;
return {
@@ -40,6 +62,7 @@ const genClearStyle = (token: ColorPickerToken, size: number): CSSObject => {
position: 'relative',
cursor: 'pointer',
overflow: 'hidden',
+ ...extraStyle,
'&::after': {
content: '""',
position: 'absolute',
@@ -56,6 +79,46 @@ const genClearStyle = (token: ColorPickerToken, size: number): CSSObject => {
};
};
+const genSizeStyle = (token: ColorPickerToken): CSSObject => {
+ const {
+ componentCls,
+ controlHeightLG,
+ controlHeightSM,
+ controlHeight,
+ controlHeightXS,
+ borderRadius,
+ borderRadiusSM,
+ borderRadiusXS,
+ borderRadiusLG,
+ fontSizeLG,
+ } = token;
+ return {
+ [`&${componentCls}-lg`]: {
+ minWidth: controlHeightLG,
+ height: controlHeightLG,
+ borderRadius: borderRadiusLG,
+ [`${componentCls}-color-block`]: {
+ width: controlHeight,
+ height: controlHeight,
+ borderRadius,
+ },
+ [`${componentCls}-trigger-text`]: {
+ fontSize: fontSizeLG,
+ },
+ },
+ [`&${componentCls}-sm`]: {
+ minWidth: controlHeightSM,
+ height: controlHeightSM,
+ borderRadius: borderRadiusSM,
+ [`${componentCls}-color-block`]: {
+ width: controlHeightXS,
+ height: controlHeightXS,
+ borderRadius: borderRadiusXS,
+ },
+ },
+ };
+};
+
const genColorPickerStyle: GenerateStyle = token => {
const {
componentCls,
@@ -64,6 +127,7 @@ const genColorPickerStyle: GenerateStyle = token => {
motionDurationMid,
colorBgElevated,
colorTextDisabled,
+ colorText,
colorBgContainerDisabled,
borderRadius,
marginXS,
@@ -72,44 +136,54 @@ const genColorPickerStyle: GenerateStyle = token => {
controlHeightSM,
colorBgTextActive,
colorPickerPresetColorSize,
+ colorPickerPreviewSize,
lineWidth,
colorBorder,
+ paddingXXS,
+ fontSize,
} = token;
+
return [
{
[componentCls]: {
- [`${componentCls}-panel`]: {
+ [`${componentCls}-inner-content`]: {
display: 'flex',
flexDirection: 'column',
width: colorPickerWidth,
- [`${componentCls}-inner-panel`]: {
- [`${componentCls}-clear`]: {
- marginInlineStart: 'auto',
- marginBottom: marginXS,
- },
- '&-divider': {
- margin: `${marginSM}px 0 ${marginXS}px`,
- },
+ '&-divider': {
+ margin: `${marginSM}px 0 ${marginXS}px`,
},
-
- ...genPickerStyle(token),
+ [`${componentCls}-panel`]: {
+ ...genPickerStyle(token),
+ },
+ ...genColorBlockStyle(token, colorPickerPreviewSize),
...genInputStyle(token),
...genPresetsStyle(token),
- ...genClearStyle(token, colorPickerPresetColorSize),
+ ...genClearStyle(token, colorPickerPresetColorSize, {
+ marginInlineStart: 'auto',
+ marginBottom: marginXS,
+ }),
},
'&-trigger': {
- width: controlHeight,
+ minWidth: controlHeight,
height: controlHeight,
borderRadius,
border: `${lineWidth}px solid ${colorBorder}`,
cursor: 'pointer',
- display: 'flex',
+ display: 'inline-flex',
alignItems: 'center',
justifyContent: 'center',
transition: `all ${motionDurationMid}`,
background: colorBgElevated,
+ padding: paddingXXS - lineWidth,
+ [`${componentCls}-trigger-text`]: {
+ marginInlineStart: marginXS,
+ marginInlineEnd: marginXS - (paddingXXS - lineWidth),
+ fontSize,
+ color: colorText,
+ },
'&-active': {
...genActiveStyle(token),
borderColor: colorPrimary,
@@ -124,10 +198,15 @@ const genColorPickerStyle: GenerateStyle = token => {
'&:hover': {
borderColor: colorBgTextActive,
},
+ [`${componentCls}-trigger-text`]: {
+ color: colorTextDisabled,
+ },
},
...genClearStyle(token, controlHeightSM),
...genColorBlockStyle(token, controlHeightSM),
+ ...genSizeStyle(token),
},
+ ...genRtlStyle(token),
},
},
];
diff --git a/components/color-picker/style/picker.ts b/components/color-picker/style/picker.ts
index 36ed22f1c6..d64e0b8d2b 100644
--- a/components/color-picker/style/picker.ts
+++ b/components/color-picker/style/picker.ts
@@ -1,6 +1,6 @@
import { CSSObject } from '../../_util/cssinjs';
import type { GenerateStyle } from '../../theme/internal';
-import genColorBlockStyle, { getTransBg } from './color-block';
+import { getTransBg } from './color-block';
import type { ColorPickerToken } from './index';
const genPickerStyle: GenerateStyle = token => {
@@ -16,7 +16,6 @@ const genPickerStyle: GenerateStyle = token => {
colorPickerHandlerSize,
colorPickerHandlerSizeSM,
colorPickerSliderHeight,
- colorPickerPreviewSize,
} = token;
return {
@@ -58,7 +57,7 @@ const genPickerStyle: GenerateStyle = token => {
borderRadius: colorPickerSliderHeight / 2,
boxShadow: colorPickerInsetShadow,
},
- '&-alpha': getTransBg(`${colorPickerSliderHeight}px`),
+ '&-alpha': getTransBg(`${colorPickerSliderHeight}px`, token.colorFillSecondary),
marginBottom: marginSM,
},
@@ -69,8 +68,6 @@ const genPickerStyle: GenerateStyle = token => {
flex: 1,
},
},
-
- ...genColorBlockStyle(token, colorPickerPreviewSize),
};
};
diff --git a/components/color-picker/style/presets.ts b/components/color-picker/style/presets.ts
index e53f8424b0..3e96146efb 100644
--- a/components/color-picker/style/presets.ts
+++ b/components/color-picker/style/presets.ts
@@ -16,7 +16,6 @@ const genPresetsStyle: GenerateStyle = token => {
borderRadius,
colorFill,
colorWhite,
- colorTextTertiary,
marginXXS,
paddingXS,
} = token;
@@ -96,7 +95,7 @@ const genPresetsStyle: GenerateStyle = token => {
},
[`&${componentCls}-presets-color-bright`]: {
'&::after': {
- borderColor: colorTextTertiary,
+ borderColor: 'rgba(0, 0, 0, 0.45)',
},
},
},
diff --git a/components/color-picker/util.ts b/components/color-picker/util.ts
index 53c1bb94d7..e681f16717 100644
--- a/components/color-picker/util.ts
+++ b/components/color-picker/util.ts
@@ -1,7 +1,6 @@
import type { ColorGenInput } from '../vc-color-picker';
import type { Color } from './color';
-import { getRoundNumber } from '../vc-color-picker/color';
import { ColorFactory } from './color';
export const customizePrefixCls = 'ant-color-picker';
@@ -12,6 +11,7 @@ export const generateColor = (color: ColorGenInput): Color => {
}
return new ColorFactory(color);
};
+export const getRoundNumber = (value: number) => Math.round(Number(value || 0));
export const getAlphaColor = (color: Color) => getRoundNumber(color.toHsb().a * 100);
From ab11c676c62857405756e605df1798d99be8c10c Mon Sep 17 00:00:00 2001
From: "2405693142@qq.com"
Date: Wed, 12 Jul 2023 14:35:15 +0800
Subject: [PATCH 15/23] feat: color action
---
components/color-picker/ColorPicker.tsx | 18 ++++++++++++----
components/color-picker/ColorPickerPanel.tsx | 21 +++++++++++--------
.../color-picker/components/PanelPicker.tsx | 2 +-
3 files changed, 27 insertions(+), 14 deletions(-)
diff --git a/components/color-picker/ColorPicker.tsx b/components/color-picker/ColorPicker.tsx
index 285af2dab0..15b977ca3a 100644
--- a/components/color-picker/ColorPicker.tsx
+++ b/components/color-picker/ColorPicker.tsx
@@ -2,8 +2,9 @@ import type { CSSProperties, ComputedRef, ExtractPropTypes, PropType } from 'vue
import type { HsbaColorType } from '../vc-color-picker';
import type { PopoverProps } from '../popover';
import type { Color } from './color';
+import type { PanelRender } from './ColorPickerPanel';
-import { computed, defineComponent, shallowRef, watch } from 'vue';
+import { computed, defineComponent, shallowRef } from 'vue';
import useConfigInject from '../config-provider/hooks/useConfigInject';
import Popover from '../popover';
@@ -12,8 +13,8 @@ import { generateColor } from './util';
import PropTypes from '../_util/vue-types';
import useMergedState from '../_util/hooks/useMergedState';
import classNames from '../_util/classNames';
-
import ColorPickerPanel from './ColorPickerPanel';
+
import ColorTrigger from './components/ColorTrigger';
import useColorState from './hooks/useColorState';
import useStyle from './style';
@@ -96,8 +97,15 @@ const colorPickerProps = () => ({
type: [Boolean, Function] as PropType VueNode)>,
default: false,
},
+
size: PropTypes.oneOf(['small', 'middle', 'large']),
+
destroyTooltipOnHide: PropTypes.looseBool,
+
+ panelRender: {
+ type: Function as PropType,
+ default: undefined,
+ },
});
export type ColorPickerProps = Partial>>;
@@ -154,7 +162,8 @@ const ColorPicker = defineComponent({
const handleChange = (data: Color, type?: HsbaColorType, pickColor?: boolean) => {
let color: Color = generateColor(data);
- if (colorCleared.value) {
+ const isNull = value.value === null || (!value.value && props.defaultValue === null);
+ if (colorCleared.value || isNull) {
colorCleared.value = false;
const hsba = color.toHsb();
// ignore alpha slider
@@ -203,6 +212,7 @@ const ColorPicker = defineComponent({
disabled: props.disabled,
presets: props.presets,
format: formatValue.value,
+ panelRender: props.panelRender,
onFormatChange,
onChangeComplete: handleChangeComplete,
}));
@@ -233,7 +243,7 @@ const ColorPicker = defineComponent({
open={popupOpen.value}
class={mergeCls.value}
style={attrs.style}
- color={colorValue.value}
+ color={props.value ? generateColor(props.value) : colorValue.value}
prefixCls={prefixCls.value}
disabled={props.disabled}
showText={props.showText}
diff --git a/components/color-picker/ColorPickerPanel.tsx b/components/color-picker/ColorPickerPanel.tsx
index 5dc884b382..e6980c5f87 100644
--- a/components/color-picker/ColorPickerPanel.tsx
+++ b/components/color-picker/ColorPickerPanel.tsx
@@ -9,18 +9,21 @@ import PanelPicker from './components/PanelPicker';
import PanelPresets from './components/PanelPresets';
import type { VueNode } from '../_util/type';
+export type PanelRender = (
+ innerPanel: VueNode,
+ {
+ components,
+ }: {
+ components: { Picker: typeof PanelPicker; Presets: typeof PanelPresets };
+ },
+) => VueNode;
+
interface ColorPickerPanelProps extends ColorPickerBaseProps {
onChange?: (value?: Color, type?: HsbaColorType) => void;
onClear?: (clear?: boolean) => void;
- panelRender?: (
- innerPanel: VueNode,
- {
- components,
- }: {
- components: { PanelPicker: typeof PanelPicker; PanelPresets: typeof PanelPresets };
- },
- ) => VueNode;
+ panelRender?: PanelRender;
}
+
const ColorPickerPanel = defineComponent({
name: 'ColorPickerPanel',
inheritAttrs: false,
@@ -58,7 +61,7 @@ const ColorPickerPanel = defineComponent({
{typeof props.panelRender === 'function'
? props.panelRender(innerPanel.value, {
- components: { Picker: PanelPicker, Presets: PanelPresets },
+ components: { Picker: PanelPicker, Presets: PanelPresets } as any,
})
: innerPanel.value}
diff --git a/components/color-picker/components/PanelPicker.tsx b/components/color-picker/components/PanelPicker.tsx
index 804f121275..735d69e177 100644
--- a/components/color-picker/components/PanelPicker.tsx
+++ b/components/color-picker/components/PanelPicker.tsx
@@ -30,7 +30,7 @@ const PanelPicker = defineComponent({
{...context.value}
onChange={clearColor => {
context.value.onChange?.(clearColor);
- context.value.onClear?.(clearColor);
+ context.value.onClear?.();
}}
/>
)}
From 3674c23b84543cf8ae0b60fd42c7e808c2fb64f6 Mon Sep 17 00:00:00 2001
From: "2405693142@qq.com"
Date: Wed, 12 Jul 2023 14:35:35 +0800
Subject: [PATCH 16/23] demo(colorpicker): add som demo
---
.../color-picker/demo/change-completed.vue | 31 ++++
components/color-picker/demo/index.vue | 13 ++
components/color-picker/demo/panel-render.vue | 150 ++++++++++++++++++
components/color-picker/demo/size.vue | 31 ++++
.../color-picker/demo/trigger-event.vue | 21 +++
5 files changed, 246 insertions(+)
create mode 100644 components/color-picker/demo/change-completed.vue
create mode 100644 components/color-picker/demo/panel-render.vue
create mode 100644 components/color-picker/demo/size.vue
create mode 100644 components/color-picker/demo/trigger-event.vue
diff --git a/components/color-picker/demo/change-completed.vue b/components/color-picker/demo/change-completed.vue
new file mode 100644
index 0000000000..c3bf18151d
--- /dev/null
+++ b/components/color-picker/demo/change-completed.vue
@@ -0,0 +1,31 @@
+
+
+---
+order: 7
+title:
+ zh-CN: 颜色完成选择
+ en-US: Color completed selection
+---
+
+## zh-CN
+
+颜色选择完成才会触发回调
+
+## en-US
+
+The callback will be called only when the color selection is completed.
+
+
+
+
+
+
+
diff --git a/components/color-picker/demo/index.vue b/components/color-picker/demo/index.vue
index 54cbdf2522..4e78e29984 100644
--- a/components/color-picker/demo/index.vue
+++ b/components/color-picker/demo/index.vue
@@ -6,7 +6,11 @@
+
+
+
+
@@ -19,6 +23,11 @@ import Disabled from './disabled.vue';
import Format from './format.vue';
import Presets from './presets.vue';
import TextRender from './text-render.vue';
+import ChangeCompleted from './change-completed.vue';
+import TriggerEvent from './trigger-event.vue';
+import Size from './size.vue';
+import PanelRender from './panel-render.vue';
+
import CN from '../index.zh-CN.md';
import US from '../index.en-US.md';
@@ -33,6 +42,10 @@ export default defineComponent({
Format,
Presets,
TextRender,
+ ChangeCompleted,
+ Size,
+ TriggerEvent,
+ PanelRender,
},
setup() {
return {};
diff --git a/components/color-picker/demo/panel-render.vue b/components/color-picker/demo/panel-render.vue
new file mode 100644
index 0000000000..979ecd41a0
--- /dev/null
+++ b/components/color-picker/demo/panel-render.vue
@@ -0,0 +1,150 @@
+
+---
+order: 8
+title:
+ zh-CN: 自定义面板
+ en-US: Custom panel
+---
+## zh-CN
+
+通过 `panelRender` 自由控制面板的渲染。
+
+## en-US
+
+Rendering of the free control panel via `panelRender`.
+
+
+
+
+
+
+ Add title:
+
+
+
+
+
+
+
+ Horizontal layout:
+
+
+
+
+
+
+
+
diff --git a/components/color-picker/demo/size.vue b/components/color-picker/demo/size.vue
new file mode 100644
index 0000000000..8e7a07f347
--- /dev/null
+++ b/components/color-picker/demo/size.vue
@@ -0,0 +1,31 @@
+
+---
+order: 8
+title:
+ zh-CN: 触发器尺寸大小
+ en-US: Trigger size
+---
+
+## zh-CN
+
+触发器有大、中、小三种尺寸,若不设置 size,则尺寸为中。
+
+## en-US
+
+The trigger has three sizes: large, medium and small. If size is not set, the size will be medium.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/color-picker/demo/trigger-event.vue b/components/color-picker/demo/trigger-event.vue
new file mode 100644
index 0000000000..e337c0db9e
--- /dev/null
+++ b/components/color-picker/demo/trigger-event.vue
@@ -0,0 +1,21 @@
+
+---
+order: 2
+title:
+ zh-CN: 自定义粗发事件
+ en-US: Custom trigger event
+---
+
+## zh-CN
+
+自定义颜色面板的触发事件,提供 `click` 和 `hover` 两个选项。
+
+## en-US
+
+Triggers event for customizing color panels, provide options `click` and `hover`.
+
+
+
+
+
+
From 9ea2b120c586023b98b6b92d88969481f8b92fdc Mon Sep 17 00:00:00 2001
From: "2405693142@qq.com"
Date: Wed, 12 Jul 2023 14:35:55 +0800
Subject: [PATCH 17/23] test: upload demo snap
---
.../__tests__/__snapshots__/demo.test.js.snap | 199 +++++++++++++++++-
1 file changed, 191 insertions(+), 8 deletions(-)
diff --git a/components/color-picker/__tests__/__snapshots__/demo.test.js.snap b/components/color-picker/__tests__/__snapshots__/demo.test.js.snap
index e0193bcc6d..610a760235 100644
--- a/components/color-picker/__tests__/__snapshots__/demo.test.js.snap
+++ b/components/color-picker/__tests__/__snapshots__/demo.test.js.snap
@@ -1,34 +1,47 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`renders ./components/color-picker/demo/allowClear.vue correctly 1`] = `
-
+
`;
exports[`renders ./components/color-picker/demo/base.vue correctly 1`] = `
-
+
+`;
+
+exports[`renders ./components/color-picker/demo/change-completed.vue correctly 1`] = `
+
`;
exports[`renders ./components/color-picker/demo/controlled.vue correctly 1`] = `
-
+
`;
exports[`renders ./components/color-picker/demo/disabled.vue correctly 1`] = `
-
+
`;
@@ -39,10 +52,11 @@ exports[`renders ./components/color-picker/demo/format.vue correctly 1`] = `
-
@@ -61,10 +75,11 @@ exports[`renders ./components/color-picker/demo/format.vue correctly 1`] = `
-
@@ -83,10 +98,11 @@ exports[`renders ./components/color-picker/demo/format.vue correctly 1`] = `
-
@@ -103,10 +119,177 @@ exports[`renders ./components/color-picker/demo/format.vue correctly 1`] = `
`;
+exports[`renders ./components/color-picker/demo/panel-render.vue correctly 1`] = `
+
+
+
+
+
+
+
Horizontal layout:
+
+
+
+
+
+
+
+
+`;
+
exports[`renders ./components/color-picker/demo/presets.vue correctly 1`] = `
-
+
+`;
+
+exports[`renders ./components/color-picker/demo/size.vue correctly 1`] = `
+
+`;
+
+exports[`renders ./components/color-picker/demo/text-render.vue correctly 1`] = `
+
+
+
+
+
+
+
Custom Text (#1677ff)
+
+
+
+
+
+
+
+`;
+
+exports[`renders ./components/color-picker/demo/trigger-event.vue correctly 1`] = `
+
`;
From 1cd640900818a36db1d657fd44ba606524a9b4c0 Mon Sep 17 00:00:00 2001
From: CCherry07 <2405693142@qq.com>
Date: Thu, 13 Jul 2023 22:45:33 +0800
Subject: [PATCH 18/23] docs(colorpicker): update docs
---
components/color-picker/index.en-US.md | 50 +++++++++++++-----------
components/color-picker/index.zh-CN.md | 54 +++++++++++++++-----------
2 files changed, 60 insertions(+), 44 deletions(-)
diff --git a/components/color-picker/index.en-US.md b/components/color-picker/index.en-US.md
index 6701e645d9..fec7bba583 100644
--- a/components/color-picker/index.en-US.md
+++ b/components/color-picker/index.en-US.md
@@ -5,7 +5,7 @@ cover: https://mdn.alipayobjects.com/huamei_7uahnr/afts/img/A*PpY4RYNM8UcAAAAAAA
coverDark: https://mdn.alipayobjects.com/huamei_7uahnr/afts/img/A*EHL-QYJofZsAAAAAAAAAAAAADrJ8AQ/original
---
-Components providing color selection, Available since `5.5.0`.
+Components providing color selection, Available since `4.0.0`.
## When To Use
@@ -13,37 +13,43 @@ Used when the user needs to customize the color selection.
## API
-> This component is available since `antd@5.5.0`.
+> This component is available since `antdv@4.0.0`.
-| Property | Description | Type | Default |
-| :-- | :-- | :-- | :-- |
-| format | Format of color | `rgb` \| `hex` \| `hsb` | `hex` |
-| onFormatChange | Callback when `format` is changed | `(format: 'hex' \| 'rgb' \| 'hsb') => void` | - |
-| value | Value of color | string \| `Color` | - |
-| defaultValue | Default value of color | string \| `Color` | - |
-| onChange | Callback when `value` is changed | `(value: Color, hex: string) => void` | - |
-| allowClear | Allow clearing color selected | boolean | false |
-| presets | Preset colors | `{ label: VueNode, colors: Array
}[]` | - |
-| children | Trigger of ColorPicker | VueNode | - |
-| trigger | ColorPicker trigger mode | `hover` \| `click` | `click` |
-| open | Whether to show popup | boolean | - |
-| onOpenChange | Callback when `open` is changed | `(open: boolean) => void` | - |
-| disabled | Disable ColorPicker | boolean | - |
-| placement | Placement of popup | `top` \| `topLeft` \| `topRight` \| `bottom` \| `bottomLeft` \| `bottomRight` | `bottomLeft` |
-| arrow | Configuration for popup arrow | `boolean \| { pointAtCenter: boolean }` | `true` | - |
+| Property | Description | Type | Default | Version |
+| :-- | :-- | :-- | :-- | :-- |
+| allowClear | Allow clearing color selected | boolean | false | |
+| arrow | Configuration for popup arrow | `boolean \| { pointAtCenter: boolean }` | true | |
+| children | Trigger of ColorPicker | VueNode | - | |
+| defaultValue | Default value of color | string \| `Color` | - | |
+| disabled | Disable ColorPicker | boolean | - | |
+| destroyTooltipOnHide | Whether destroy popover when hidden | `boolean` | false | - |
+| format | Format of color | `rgb` \| `hex` \| `hsb` | `hex` | |
+| open | Whether to show popup | boolean | - | |
+| presets | Preset colors | `{ label: ReactNode, colors: Array }[]` | - | |
+| placement | Placement of popup | `top` \| `topLeft` \| `topRight` \| `bottom` \| `bottomLeft` \| `bottomRight` | `bottomLeft` | |
+| panelRender | Custom Render Panel | `(panel: VueNode, extra: { components: { Picker: FC; Presets: FC } }) => VueNode` | - | - |
+| showText | Show color text | boolean \| `(color: Color) => VueNode` | - | - |
+| size | Setting the trigger size | `large` \| `middle` \| `small` | `middle` | - |
+| trigger | ColorPicker trigger mode | `hover` \| `click` | `click` | |
+| value | Value of color | string \| `Color` | - | |
+| onChange | Callback when `value` is changed | `(value: Color, hex: string) => void` | - | |
+| onChangeComplete | Called when color pick ends | `(value: Color) => void` | - | - |
+| onFormatChange | Callback when `format` is changed | `(format: 'hex' \| 'rgb' \| 'hsb') => void` | - | |
+| onOpenChange | Callback when `open` is changed | `(open: boolean) => void` | - | |
+| onClear | Called when clear | `() => void` | - | - |
### Color
| Property | Description | Type | Default |
| :-- | :-- | :-- | :-- |
-| toHex | Convert to `hex` format characters | `() => string` | - |
-| toHexString | Convert to `hex` format color string | `() => string` | - |
+| toHex | Convert to `hex` format characters, the return type like: `1677ff` | `() => string` | - |
+| toHexString | Convert to `hex` format color string, the return type like: `#1677ff` | `() => string` | - |
| toHsb | Convert to `hsb` object | `() => ({ h: number, s: number, b: number, a number })` | - |
-| toHsbString | Convert to `hsb` format color string | `() => string` | - |
+| toHsbString | Convert to `hsb` format color string, the return type like: `hsb(215, 91%, 100%)` | `() => string` | - |
| toRgb | Convert to `rgb` object | `() => ({ r: number, g: number, b: number, a number })` | - |
-| toRgbString | Convert to `rgb` format color string | `() => string` | - |
+| toRgbString | Convert to `rgb` format color string, the return type like: `rgb(22, 119, 255)` | `() => string` | - |
## FAQ
diff --git a/components/color-picker/index.zh-CN.md b/components/color-picker/index.zh-CN.md
index f2b6badbfc..7d8973fea8 100644
--- a/components/color-picker/index.zh-CN.md
+++ b/components/color-picker/index.zh-CN.md
@@ -6,7 +6,7 @@ cover: https://mdn.alipayobjects.com/huamei_7uahnr/afts/img/A*PpY4RYNM8UcAAAAAAA
coverDark: https://mdn.alipayobjects.com/huamei_7uahnr/afts/img/A*EHL-QYJofZsAAAAAAAAAAAAADrJ8AQ/original
---
-提供颜色选取的组件,自 `4.0.0` 版本开始提供该组件。
+提供颜色选取的组件,自 `-` 版本开始提供该组件。
## 何时使用
@@ -14,37 +14,47 @@ coverDark: https://mdn.alipayobjects.com/huamei_7uahnr/afts/img/A*EHL-QYJofZsAAA
## API
-> 自 `antdv@4.0.0` 版本开始提供该组件。
+> 自 `antdv@-` 版本开始提供该组件。
+
+## API
+
+> 自 `antdv@-` 版本开始提供该组件。
-| 参数 | 说明 | 类型 | 默认值 |
-| :-- | :-- | :-- | :-- |
-| format | 颜色格式 | `rgb` \| `hex` \| `hsb` | `hex` |
-| onFormatChange | 颜色格式变化的回调 | `(format: 'hex' \| 'rgb' \| 'hsb') => void` | - |
-| value | 颜色的值 | string \| `Color` | - |
-| defaultValue | 颜色默认的值 | string \| `Color` | - |
-| onChange | 颜色变化的回调 | `(value: Color, hex: string) => void` | - |
-| allowClear | 允许清除选择的颜色 | boolean | false |
-| presets | 预设的颜色 | `{ label: VueNode, colors: Array }[]` | - |
-| children | 颜色选择器的触发器 | VueNode | - |
-| trigger | 颜色选择器的触发模式 | `hover` \| `click` | `click` |
-| open | 是否显示弹出窗口 | boolean | - |
-| onOpenChange | 当 `open` 被改变时的回调 | `(open: boolean) => void` | - |
-| disabled | 禁用颜色选择器 | boolean | - |
-| placement | 弹出窗口的位置 | `top` \| `topLeft` \| `topRight` \| `bottom` \| `bottomLeft` \| `bottomRight` | `bottomLeft` |
-| arrow | 配置弹出的箭头 | `boolean \| { pointAtCenter: boolean }` | `true` | - |
+| 参数 | 说明 | 类型 | 默认值 | 版本 |
+| :-- | :-- | :-- | :-- | :-- |
+| allowClear | 允许清除选择的颜色 | boolean | false | |
+| arrow | 配置弹出的箭头 | `boolean \| { pointAtCenter: boolean }` | true | |
+| children | 颜色选择器的触发器 | VueNode | - | |
+| defaultValue | 颜色默认的值 | string \| `Color` | - | |
+| disabled | 禁用颜色选择器 | boolean | - | |
+| destroyTooltipOnHide | 关闭后是否销毁弹窗 | `boolean` | false | - |
+| format | 颜色格式 | `rgb` \| `hex` \| `hsb` | `hex` | |
+| open | 是否显示弹出窗口 | boolean | - | |
+| presets | 预设的颜色 | `{ label: ReactNode, colors: Array }[]` | - | |
+| placement | 弹出窗口的位置 | `top` \| `topLeft` \| `topRight` \| `bottom` \| `bottomLeft` \| `bottomRight` | `bottomLeft` | |
+| panelRender | 自定义渲染面板 | `(panel: VueNode, extra: { components: { Picker: FC; Presets: FC } }) => VueNode` | - | - |
+| showText | 显示颜色文本 | boolean \| `(color: Color) => VueNode` | - | - |
+| size | 设置触发器大小 | `large` \| `middle` \| `small` | `middle` | - |
+| trigger | 颜色选择器的触发模式 | `hover` \| `click` | `click` | |
+| value | 颜色的值 | string \| `Color` | - | |
+| onChange | 颜色变化的回调 | `(value: Color, hex: string) => void` | - | |
+| onChangeComplete | 颜色选择完成的回调 | `(value: Color) => void` | - | - |
+| onFormatChange | 颜色格式变化的回调 | `(format: 'hex' \| 'rgb' \| 'hsb') => void` | - | |
+| onOpenChange | 当 `open` 被改变时的回调 | `(open: boolean) => void` | - | |
+| onClear | 清除的回调 | `() => void` | - | - |
### Color
| 参数 | 说明 | 类型 | 默认值 |
| :-- | :-- | :-- | :-- |
-| toHex | 转换成 `hex` 格式字符 | `() => string` | - |
-| toHexString | 转换成 `hex` 格式颜色字符串 | `() => string` | - |
+| toHex | 转换成 `hex` 格式字符,返回格式如:`1677ff` | `() => string` | - |
+| toHexString | 转换成 `hex` 格式颜色字符串,返回格式如:`#1677ff` | `() => string` | - |
| toHsb | 转换成 `hsb` 对象 | `() => ({ h: number, s: number, b: number, a number })` | - |
-| toHsbString | 转换成 `hsb` 格式颜色字符串 | `() => string` | - |
+| toHsbString | 转换成 `hsb` 格式颜色字符串,返回格式如:`hsb(215, 91%, 100%)` | `() => string` | - |
| toRgb | 转换成 `rgb` 对象 | `() => ({ r: number, g: number, b: number, a number })` | - |
-| toRgbString | 转换成 `rgb` 格式颜色字符串 | `() => string` | - |
+| toRgbString | 转换成 `rgb` 格式颜色字符串,返回格式如:`rgb(22, 119, 255)` | `() => string` | - |
## FAQ
From 797e50b7f72ac984dd615adec70a70727a391914 Mon Sep 17 00:00:00 2001
From: CCherry07 <2405693142@qq.com>
Date: Thu, 13 Jul 2023 22:47:35 +0800
Subject: [PATCH 19/23] docs(colorpicker): update docs
---
components/color-picker/index.zh-CN.md | 8 ++------
1 file changed, 2 insertions(+), 6 deletions(-)
diff --git a/components/color-picker/index.zh-CN.md b/components/color-picker/index.zh-CN.md
index 7d8973fea8..65d57be380 100644
--- a/components/color-picker/index.zh-CN.md
+++ b/components/color-picker/index.zh-CN.md
@@ -6,7 +6,7 @@ cover: https://mdn.alipayobjects.com/huamei_7uahnr/afts/img/A*PpY4RYNM8UcAAAAAAA
coverDark: https://mdn.alipayobjects.com/huamei_7uahnr/afts/img/A*EHL-QYJofZsAAAAAAAAAAAAADrJ8AQ/original
---
-提供颜色选取的组件,自 `-` 版本开始提供该组件。
+提供颜色选取的组件,自 `4.0.0` 版本开始提供该组件。
## 何时使用
@@ -14,11 +14,7 @@ coverDark: https://mdn.alipayobjects.com/huamei_7uahnr/afts/img/A*EHL-QYJofZsAAA
## API
-> 自 `antdv@-` 版本开始提供该组件。
-
-## API
-
-> 自 `antdv@-` 版本开始提供该组件。
+> 自 `antdv@4.0.0` 版本开始提供该组件。
| 参数 | 说明 | 类型 | 默认值 | 版本 |
From e22e09fd34a49cbfce680e57d7eedf6cf33f4661 Mon Sep 17 00:00:00 2001
From: CCherry07 <2405693142@qq.com>
Date: Wed, 19 Jul 2023 00:17:54 +0800
Subject: [PATCH 20/23] fix: disabledDrag and direction
---
.../vc-color-picker/components/Picker.tsx | 5 +++--
.../vc-color-picker/components/Slider.tsx | 6 ++++--
.../vc-color-picker/hooks/useColorDrag.ts | 19 ++++++++++---------
3 files changed, 17 insertions(+), 13 deletions(-)
diff --git a/components/vc-color-picker/components/Picker.tsx b/components/vc-color-picker/components/Picker.tsx
index f149e81d45..cf9a359068 100644
--- a/components/vc-color-picker/components/Picker.tsx
+++ b/components/vc-color-picker/components/Picker.tsx
@@ -1,5 +1,5 @@
import type { BaseColorPickerProps } from '../interface';
-import { defineComponent, ref, shallowRef, watchEffect } from 'vue';
+import { computed, defineComponent, ref, shallowRef, watchEffect } from 'vue';
import useColorDrag from '../hooks/useColorDrag';
import { calculateColor, calculateOffset } from '../util';
@@ -17,6 +17,7 @@ const Picker = defineComponent({
const pickerRef = shallowRef();
const transformRef = shallowRef();
const colorRef = ref(props.color);
+ const disabledDrag = computed(() => props.disabled);
watchEffect(() => {
colorRef.value = props.color;
});
@@ -36,7 +37,7 @@ const Picker = defineComponent({
props?.onChange(calcColor);
},
onDragChangeComplete: () => props?.onChangeComplete?.(colorRef.value),
- disabledDrag: props.disabled,
+ disabledDrag,
});
return () => (
props.type || 'hue');
+ const direction = computed
(() => props.direction || 'x');
+ const disabledDrag = computed(() => props.disabled);
watchEffect(() => {
colorRef.value = props.color;
});
@@ -58,8 +60,8 @@ const Slider = defineComponent({
onDragChangeComplete() {
props.onChangeComplete?.(colorRef.value, type.value);
},
- direction: 'x',
- disabledDrag: props.disabled,
+ direction,
+ disabledDrag,
});
return () => (
diff --git a/components/vc-color-picker/hooks/useColorDrag.ts b/components/vc-color-picker/hooks/useColorDrag.ts
index fc99189720..d08fb6bde7 100644
--- a/components/vc-color-picker/hooks/useColorDrag.ts
+++ b/components/vc-color-picker/hooks/useColorDrag.ts
@@ -1,7 +1,8 @@
import type { Color } from '../color';
import type { TransformOffset } from '../interface';
-import { ref, shallowRef, type Ref, watch, onUnmounted, onMounted } from 'vue';
+import { ref, shallowRef, watch, onUnmounted, onMounted, computed } from 'vue';
+import type { ComputedRef, Ref } from 'vue';
type EventType = MouseEvent | TouchEvent;
@@ -12,12 +13,12 @@ interface useColorDragProps {
offset?: TransformOffset;
containerRef: Ref;
targetRef: Ref;
- direction?: 'x' | 'y';
+ direction?: ComputedRef<'x' | 'y'>;
onDragChange?: (offset: TransformOffset) => void;
onDragChangeComplete?: () => void;
calculate?: (containerRef: Ref) => TransformOffset;
/** Disabled drag */
- disabledDrag?: boolean;
+ disabledDrag?: ComputedRef;
}
function getPosition(e: EventType) {
@@ -100,17 +101,17 @@ function useColorDrag(props: useColorDragProps): [Ref, EventHan
const offsetX = Math.max(0, Math.min(pageX - rectX, width)) - centerOffsetX;
const offsetY = Math.max(0, Math.min(pageY - rectY, height)) - centerOffsetY;
- const calcOffset = {
+ const calcOffset = computed(() => ({
x: offsetX,
- y: direction === 'x' ? offsetValue.value.y : offsetY,
- };
+ y: direction?.value === 'x' ? offsetValue.value.y : offsetY,
+ }));
// Exclusion of boundary cases
if ((targetWidth === 0 && targetHeight === 0) || targetWidth !== targetHeight) {
return false;
}
- offsetValue.value = calcOffset;
- onDragChange?.(calcOffset);
+ offsetValue.value = calcOffset.value;
+ onDragChange?.(calcOffset.value);
};
const onDragMove: EventHandle = e => {
@@ -131,7 +132,7 @@ function useColorDrag(props: useColorDragProps): [Ref, EventHan
};
const onDragStart: EventHandle = e => {
- if (disabledDrag) {
+ if (disabledDrag.value) {
return;
}
updateOffset(e);
From 531ea079b6e6b40afb03a43a1ad7da8cd6e8decc Mon Sep 17 00:00:00 2001
From: CCherry07 <2405693142@qq.com>
Date: Wed, 19 Jul 2023 00:22:44 +0800
Subject: [PATCH 21/23] fix: should work after closing the browser menu
---
components/vc-color-picker/hooks/useColorDrag.ts | 2 ++
1 file changed, 2 insertions(+)
diff --git a/components/vc-color-picker/hooks/useColorDrag.ts b/components/vc-color-picker/hooks/useColorDrag.ts
index d08fb6bde7..671e7a7715 100644
--- a/components/vc-color-picker/hooks/useColorDrag.ts
+++ b/components/vc-color-picker/hooks/useColorDrag.ts
@@ -132,6 +132,8 @@ function useColorDrag(props: useColorDragProps): [Ref, EventHan
};
const onDragStart: EventHandle = e => {
+ document.removeEventListener('mousemove', mouseMoveRef.value);
+ document.removeEventListener('mouseup', mouseUpRef.value);
if (disabledDrag.value) {
return;
}
From cdf17c09ab05113001c051760bc1ec229aa92866 Mon Sep 17 00:00:00 2001
From: CCherry07 <2405693142@qq.com>
Date: Tue, 12 Sep 2023 00:55:15 +0800
Subject: [PATCH 22/23] feat: update some code
---
.../color-picker/components/ColorTrigger.tsx | 2 +-
components/vc-color-picker/ColorPicker.tsx | 1 +
.../vc-color-picker/components/Picker.tsx | 4 +--
.../vc-color-picker/components/Slider.tsx | 3 +-
.../vc-color-picker/components/Transform.tsx | 8 ++---
.../vc-color-picker/hooks/useColorDrag.ts | 30 +++++++------------
components/vc-color-picker/util.ts | 24 +++++++--------
7 files changed, 28 insertions(+), 44 deletions(-)
diff --git a/components/color-picker/components/ColorTrigger.tsx b/components/color-picker/components/ColorTrigger.tsx
index 1f21fbfbe3..5297736944 100644
--- a/components/color-picker/components/ColorTrigger.tsx
+++ b/components/color-picker/components/ColorTrigger.tsx
@@ -56,7 +56,7 @@ const ColorTrigger = defineComponent({
return null;
});
expose({
- getRef: () => colorTriggerRef.value,
+ colorTriggerRef,
});
return () => (
diff --git a/components/vc-color-picker/ColorPicker.tsx b/components/vc-color-picker/ColorPicker.tsx
index 73d13e0600..f3d317340b 100644
--- a/components/vc-color-picker/ColorPicker.tsx
+++ b/components/vc-color-picker/ColorPicker.tsx
@@ -109,6 +109,7 @@ const ColorPicker = defineComponent({
>
));
+
expose({
colorPickerRef,
});
diff --git a/components/vc-color-picker/components/Picker.tsx b/components/vc-color-picker/components/Picker.tsx
index cf9a359068..d233695e8f 100644
--- a/components/vc-color-picker/components/Picker.tsx
+++ b/components/vc-color-picker/components/Picker.tsx
@@ -15,7 +15,7 @@ const Picker = defineComponent({
props: ['color', 'prefixCls', 'onChange', 'onChangeComplete', 'disabled'],
setup(props: PickerProps) {
const pickerRef = shallowRef();
- const transformRef = shallowRef();
+ const transformRef = shallowRef<{ transformDomRef: HTMLDivElement }>();
const colorRef = ref(props.color);
const disabledDrag = computed(() => props.disabled);
watchEffect(() => {
@@ -25,7 +25,7 @@ const Picker = defineComponent({
colorRef,
containerRef: pickerRef,
targetRef: transformRef,
- calculate: containerRef => calculateOffset(containerRef, transformRef, colorRef.value),
+ calculate: containerRef => calculateOffset(containerRef, transformRef, colorRef),
onDragChange: offsetValue => {
const calcColor = calculateColor({
offset: offsetValue,
diff --git a/components/vc-color-picker/components/Slider.tsx b/components/vc-color-picker/components/Slider.tsx
index 1e1900d334..af23ffac12 100644
--- a/components/vc-color-picker/components/Slider.tsx
+++ b/components/vc-color-picker/components/Slider.tsx
@@ -44,8 +44,7 @@ const Slider = defineComponent({
colorRef,
targetRef: transformRef,
containerRef: sliderRef,
- calculate: containerRef =>
- calculateOffset(containerRef, transformRef, props.color, type.value),
+ calculate: containerRef => calculateOffset(containerRef, transformRef, colorRef, type.value),
onDragChange: offsetValue => {
const calcColor = calculateColor({
offset: offsetValue,
diff --git a/components/vc-color-picker/components/Transform.tsx b/components/vc-color-picker/components/Transform.tsx
index 05e4790d61..5b6d9d1528 100644
--- a/components/vc-color-picker/components/Transform.tsx
+++ b/components/vc-color-picker/components/Transform.tsx
@@ -10,15 +10,13 @@ const Transform = defineComponent({
},
{ slots, expose },
) {
- const transformRef = shallowRef();
+ const transformDomRef = shallowRef();
expose({
- getRef: () => {
- return transformRef.value;
- },
+ transformDomRef,
});
return () => (
;
offset?: TransformOffset;
containerRef: Ref
;
- targetRef: Ref;
+ targetRef: Ref<{ transformDomRef: HTMLDivElement }>;
direction?: ComputedRef<'x' | 'y'>;
onDragChange?: (offset: TransformOffset) => void;
onDragChangeComplete?: () => void;
@@ -45,25 +45,15 @@ function useColorDrag(props: useColorDragProps): [Ref, EventHan
const offsetValue = ref(offset || { x: 0, y: 0 });
const mouseMoveRef = shallowRef<(event: MouseEvent) => void>(null);
const mouseUpRef = shallowRef<(event: MouseEvent) => void>(null);
- const dragRef = shallowRef({
- flag: false,
- });
- const initOffset = () => {
- if (offsetValue.value.x !== 0 || offsetValue.value.y !== 0) return;
- if (
- Object.values(containerRef.value.getBoundingClientRect().toJSON()).some(item => item === 0)
- ) {
- requestAnimationFrame(initOffset);
- return;
- }
+ const dragRef = shallowRef({ flag: false });
+
+ setTimeout(() => {
const calcOffset = calculate?.(containerRef);
if (calcOffset) {
offsetValue.value = calcOffset;
}
- };
- onMounted(() => {
- initOffset();
});
+
watch(
() => [colorRef, containerRef],
() => {
@@ -76,8 +66,10 @@ function useColorDrag(props: useColorDragProps): [Ref, EventHan
},
{
deep: true,
+ flush: 'post',
},
);
+
onUnmounted(() => {
document.removeEventListener('mousemove', mouseMoveRef.value);
document.removeEventListener('mouseup', mouseUpRef.value);
@@ -90,10 +82,8 @@ function useColorDrag(props: useColorDragProps): [Ref, EventHan
const updateOffset: EventHandle = e => {
const { pageX, pageY } = getPosition(e);
const { x: rectX, y: rectY, width, height } = containerRef.value.getBoundingClientRect();
- const { width: targetWidth, height: targetHeight } = targetRef.value
- // @ts-ignore
- .getRef()
- .getBoundingClientRect();
+ const { width: targetWidth, height: targetHeight } =
+ targetRef.value?.transformDomRef.getBoundingClientRect();
const centerOffsetX = targetWidth / 2;
const centerOffsetY = targetHeight / 2;
diff --git a/components/vc-color-picker/util.ts b/components/vc-color-picker/util.ts
index 4d666d49b9..2fc664a3d4 100644
--- a/components/vc-color-picker/util.ts
+++ b/components/vc-color-picker/util.ts
@@ -17,16 +17,15 @@ export const defaultColor = generateColor('#1677ff');
export const calculateColor = (props: {
offset: TransformOffset;
containerRef: Ref;
- targetRef: Ref;
+ targetRef: Ref<{ transformDomRef: HTMLDivElement }>;
color?: Color;
type?: HsbaColorType;
}): Color => {
const { offset, targetRef, containerRef, color, type } = props;
- const { width, height } = containerRef.value.getBoundingClientRect();
- const { width: targetWidth, height: targetHeight } = targetRef.value
- // @ts-ignore
- .getRef()
- .getBoundingClientRect();
+ const height = containerRef.value.offsetHeight;
+ const width = containerRef.value.offsetWidth;
+ const { width: targetWidth, height: targetHeight } =
+ targetRef.value?.transformDomRef.getBoundingClientRect();
const centerOffsetX = targetWidth / 2;
const centerOffsetY = targetHeight / 2;
@@ -61,19 +60,16 @@ export const calculateColor = (props: {
export const calculateOffset = (
containerRef: Ref,
- targetRef: Ref,
- color?: Color,
+ targetRef: Ref<{ transformDomRef: HTMLDivElement }>,
+ color?: Ref,
type?: HsbaColorType,
): TransformOffset => {
const { width, height } = containerRef.value.getBoundingClientRect();
- const { width: targetWidth, height: targetHeight } = targetRef.value
- // @ts-ignore
- .getRef()
- .getBoundingClientRect();
+ const { width: targetWidth, height: targetHeight } =
+ targetRef.value.transformDomRef?.getBoundingClientRect();
const centerOffsetX = targetWidth / 2;
const centerOffsetY = targetHeight / 2;
- const hsb = color.toHsb();
-
+ const hsb = color.value.toHsb();
// Exclusion of boundary cases
if ((targetWidth === 0 && targetHeight === 0) || targetWidth !== targetHeight) {
return;
From 8986643c9a390bdc0f22d4fbddbb82aeac4616c3 Mon Sep 17 00:00:00 2001
From: CCherry07 <2405693142@qq.com>
Date: Wed, 13 Sep 2023 00:29:53 +0800
Subject: [PATCH 23/23] test (ColorPicker): add test
---
.../color-picker/__tests__/index.test.js | 0
.../color-picker/__tests__/index.test.tsx | 84 +++++++++++++++++++
2 files changed, 84 insertions(+)
delete mode 100644 components/color-picker/__tests__/index.test.js
create mode 100644 components/color-picker/__tests__/index.test.tsx
diff --git a/components/color-picker/__tests__/index.test.js b/components/color-picker/__tests__/index.test.js
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/components/color-picker/__tests__/index.test.tsx b/components/color-picker/__tests__/index.test.tsx
new file mode 100644
index 0000000000..57a9c2ae09
--- /dev/null
+++ b/components/color-picker/__tests__/index.test.tsx
@@ -0,0 +1,84 @@
+import { mount } from '@vue/test-utils';
+import ColorPicker from '..';
+import type { ColorPickerProps } from '..';
+import { sleep } from '../../../tests/utils';
+
+describe('base ColorPickr', () => {
+ const wrapper = mount(ColorPicker);
+ beforeEach(() => {
+ document.body.innerHTML = '';
+ });
+ it('default dom', () => {
+ expect(wrapper.html()).toMatchInlineSnapshot(`
+
+ `);
+ });
+ it('default color', () => {
+ expect(wrapper.find('.ant-color-picker-color-block-inner').attributes()).toEqual({
+ class: 'ant-color-picker-color-block-inner',
+ style: 'background: rgb(22, 119, 255);',
+ });
+ });
+
+ it('Should component disabled work', () => {
+ const props: ColorPickerProps = {
+ disabled: true,
+ };
+ const wrapper = mount(ColorPicker, {
+ props,
+ });
+
+ expect(
+ wrapper.find('.ant-color-picker-trigger').classes('ant-color-picker-trigger-disabled'),
+ ).toBe(true);
+ });
+
+ it('Should component defaultValue work', () => {
+ const props: ColorPickerProps = {
+ defaultValue: '#000',
+ };
+ const wrapper = mount(ColorPicker, {
+ props,
+ });
+ expect(wrapper.find('.ant-color-picker-color-block-inner').attributes('style')).toEqual(
+ 'background: rgb(0, 0, 0);',
+ );
+ });
+
+ it('fire trigger to show panel', async () => {
+ const wrapper = mount(ColorPicker, {
+ sync: false,
+ props: {
+ value: '#1677FF',
+ },
+ });
+ await wrapper.find('.ant-color-picker-trigger').trigger('click');
+ expect(
+ wrapper.find('.ant-color-picker-trigger').classes('ant-color-picker-trigger-active'),
+ ).toBe(true);
+ await sleep();
+ const hexInput = document.querySelector(
+ '.ant-color-picker-hex-input input',
+ ) as HTMLInputElement;
+ expect(hexInput?.value).toBe('1677FF');
+ const handler = document.querySelector('.ant-color-picker-handler');
+ expect(handler?.getAttribute('style')).toBe('background-color: rgb(22, 119, 255);');
+ });
+
+ it('Should Encoding formats, support HEX, HSB, RGB.', async () => {
+ const wrapper = mount(ColorPicker, {
+ props: {
+ format: 'hsb',
+ value: 'hsb(215, 91%, 100%)',
+ },
+ });
+ await wrapper.find('.ant-color-picker-trigger').trigger('click');
+ await sleep();
+ expect(document.querySelector('.ant-select-selection-item')?.textContent).toBe('HSB');
+ });
+});