-
-
Notifications
You must be signed in to change notification settings - Fork 3.8k
/
Copy pathColorPickerPanel.tsx
72 lines (67 loc) · 2.26 KB
/
ColorPickerPanel.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import type { HsbaColorType } from '../vc-color-picker';
import type { ColorPickerBaseProps } from './interface';
import type { Color } from './color';
import { computed, defineComponent, provide } from 'vue';
import { PanelPickerContext, PanelPresetsContext } from './context';
import Divider from '../divider';
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?: PanelRender;
}
const ColorPickerPanel = defineComponent({
name: 'ColorPickerPanel',
inheritAttrs: false,
props: ['prefixCls', 'presets', 'onChange', 'onClear', 'color', 'panelRender'],
setup(props: ColorPickerPanelProps, { attrs }) {
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(() => (
<>
<PanelPicker />
{Array.isArray(props.presets) && (
<Divider class={`${colorPickerPanelPrefixCls.value}-divider`} />
)}
<PanelPresets />
</>
));
return () => (
<div class={colorPickerPanelPrefixCls.value}>
{typeof props.panelRender === 'function'
? props.panelRender(innerPanel.value, {
components: { Picker: PanelPicker, Presets: PanelPresets } as any,
})
: innerPanel.value}
</div>
);
},
});
export default ColorPickerPanel;