@sdata/web-vue 1.7.0 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/dist/sd.css +105 -1
  2. package/dist/sd.min.css +1 -1
  3. package/es/_hooks/use-allow-clear.d.ts +4 -0
  4. package/es/_hooks/use-allow-clear.js +20 -0
  5. package/es/_hooks/use-component-ref.d.ts +1 -1
  6. package/es/_hooks/use-teleport-container.d.ts +2 -2
  7. package/es/_hooks/use-teleport-container.js +7 -4
  8. package/es/_utils/color.js +1 -18
  9. package/es/auto-complete/auto-complete.js +4 -2
  10. package/es/cascader/cascader.js +1 -1
  11. package/es/cascader/cascader.vue.d.ts +1 -0
  12. package/es/cascader/cascader.vue_vue_type_script_lang.js +4 -1
  13. package/es/cascader/index.d.ts +3 -0
  14. package/es/color-picker/color-picker.d.ts +115 -40
  15. package/es/color-picker/color-picker.js +146 -102
  16. package/es/color-picker/index.d.ts +217 -69
  17. package/es/color-picker/interface.d.ts +41 -0
  18. package/es/color-picker/palette.js +1 -1
  19. package/es/color-picker/panel.d.ts +73 -34
  20. package/es/color-picker/panel.js +423 -89
  21. package/es/color-picker/style/index.css +92 -1
  22. package/es/color-picker/style/index.scss +107 -1
  23. package/es/color-picker/utils.d.ts +89 -0
  24. package/es/color-picker/utils.js +456 -0
  25. package/es/config-provider/config-provider.vue.d.ts +9 -0
  26. package/es/config-provider/config-provider.vue_vue_type_script_lang.js +6 -1
  27. package/es/config-provider/context.d.ts +3 -1
  28. package/es/config-provider/context.js +2 -1
  29. package/es/config-provider/index.d.ts +15 -0
  30. package/es/config-provider/style/css.js +1 -0
  31. package/es/config-provider/style/index.css +29 -0
  32. package/es/config-provider/style/index.d.ts +1 -1
  33. package/es/config-provider/style/index.js +1 -0
  34. package/es/config-provider/style/index.scss +17 -0
  35. package/es/config-provider/theme-provider.js +1 -3
  36. package/es/config-provider/theme-provider.vue_vue_type_script_setup_true_lang.js +44 -4
  37. package/es/date-picker/index.d.ts +1 -0
  38. package/es/date-picker/picker.js +1 -1
  39. package/es/date-picker/picker.vue.d.ts +1 -0
  40. package/es/date-picker/picker.vue_vue_type_script_lang.js +4 -1
  41. package/es/date-picker/range-picker.js +1 -1
  42. package/es/date-picker/range-picker.vue.d.ts +1 -0
  43. package/es/date-picker/range-picker.vue_vue_type_script_lang.js +4 -1
  44. package/es/drawer/drawer.vue.d.ts +1 -1
  45. package/es/drawer/index.d.ts +3 -3
  46. package/es/index.css +105 -1
  47. package/es/index.scss +1 -0
  48. package/es/input/input.js +4 -2
  49. package/es/input-number/input-number.js +4 -2
  50. package/es/input-tag/input-tag.js +4 -2
  51. package/es/mention/mention.js +4 -2
  52. package/es/modal/index.d.ts +3 -3
  53. package/es/modal/modal.vue.d.ts +1 -1
  54. package/es/rate/rate.js +4 -2
  55. package/es/select/select-dropdown.vue.d.ts +1 -1
  56. package/es/select/select.js +4 -2
  57. package/es/textarea/index.d.ts +3 -3
  58. package/es/textarea/textarea.vue.d.ts +1 -1
  59. package/es/textarea/textarea.vue_vue_type_script_lang.js +6 -2
  60. package/es/time-picker/index.d.ts +3 -0
  61. package/es/time-picker/time-picker.js +1 -1
  62. package/es/time-picker/time-picker.vue.d.ts +1 -0
  63. package/es/time-picker/time-picker.vue_vue_type_script_lang.js +4 -1
  64. package/es/tree-select/index.d.ts +3 -0
  65. package/es/tree-select/tree-select.js +1 -1
  66. package/es/tree-select/tree-select.vue.d.ts +1 -0
  67. package/es/tree-select/tree-select.vue_vue_type_script_lang.js +4 -1
  68. package/es/trigger/trigger.js +8 -4
  69. package/json/vetur-attributes.json +46 -20
  70. package/json/vetur-tags.json +14 -6
  71. package/json/web-types.json +86 -22
  72. package/package.json +3 -1
  73. package/es/color-picker/input-alpha.js +0 -32
  74. package/es/color-picker/input-hex.js +0 -73
  75. package/es/color-picker/input-rgb.js +0 -55
  76. package/es/web-vue.css +0 -5
@@ -1,133 +1,467 @@
1
+ import { _objectSpread2 } from "../_virtual/_@oxc-project_runtime@0.124.0/helpers/objectSpread2.js";
1
2
  import { getPrefixCls } from "../_utils/global-config.js";
2
- import useState from "../_hooks/use-state.js";
3
- import { useI18n } from "../locale/index.js";
3
+ import input_group_default from "../input/input-group.js";
4
+ import Input from "../input/index.js";
5
+ import Radio from "../radio/index.js";
4
6
  import Select from "../select/index.js";
5
- import { hexToRgb, rgbToHsv } from "../_utils/color.js";
7
+ import { colors } from "./colors.js";
8
+ import InputNumber from "../input-number/index.js";
6
9
  import control_bar_default from "./control-bar.js";
7
- import input_hex_default from "./input-hex.js";
8
- import input_rgb_default from "./input-rgb.js";
9
10
  import palette_default from "./palette.js";
10
- import { computed, createVNode, defineComponent } from "vue";
11
+ import { addGradientColor, formatColor, formatColorState, getActiveGradientPoint, getColorBackground, getColorObject, getDefaultColorState, getDefaultGradientState, getFormatInputs, getGradientThumbBackground, getLinearGradientString, normalizeFormat, parseColorState, parseFormatInputValues, removeGradientColor, round, setActiveColorHsva, setGradientColors, setGradientDegree, setGradientSelectedPoint } from "./utils.js";
12
+ import { computed, createTextVNode, createVNode, defineComponent, isVNode, ref, watch } from "vue";
13
+ import { useDraggable } from "@vueuse/core";
11
14
  //#region components/color-picker/panel.tsx
12
- var panel_default = /* @__PURE__ */ defineComponent({
13
- name: "Panel",
15
+ function _isSlot(s) {
16
+ return typeof s === "function" || Object.prototype.toString.call(s) === "[object Object]" && !isVNode(s);
17
+ }
18
+ var MODE_OPTIONS = [{
19
+ value: "monochrome",
20
+ label: "单色"
21
+ }, {
22
+ value: "linear-gradient",
23
+ label: "渐变"
24
+ }];
25
+ var clampPercent = (value) => Math.min(100, Math.max(0, value));
26
+ var getGradientPointComparableColor = (point) => formatColor(point.hsva, "CSS", true);
27
+ var matchGradientPoint = (previousPoints, nextPoint, usedIds) => {
28
+ const availablePoints = previousPoints.filter((point) => !usedIds.has(point.id));
29
+ if (!availablePoints.length) return;
30
+ const nextColor = getGradientPointComparableColor(nextPoint);
31
+ const sameColorPoints = availablePoints.filter((point) => getGradientPointComparableColor(point) === nextColor);
32
+ return (sameColorPoints.length ? sameColorPoints : availablePoints).reduce((closestPoint, point) => {
33
+ if (!closestPoint) return point;
34
+ return Math.abs(point.left - nextPoint.left) < Math.abs(closestPoint.left - nextPoint.left) ? point : closestPoint;
35
+ }, void 0);
36
+ };
37
+ var reconcileGradientState = (previousState, nextState) => {
38
+ if (previousState.mode !== "linear-gradient" || nextState.mode !== "linear-gradient") return nextState;
39
+ const usedIds = /* @__PURE__ */ new Set();
40
+ const nextColors = nextState.gradientColors.map((point) => {
41
+ const matchedPoint = matchGradientPoint(previousState.gradientColors, point, usedIds);
42
+ if (!matchedPoint) return point;
43
+ usedIds.add(matchedPoint.id);
44
+ return _objectSpread2(_objectSpread2({}, point), {}, { id: matchedPoint.id });
45
+ });
46
+ const selectedPoint = nextColors.find((point) => point.id === previousState.gradientSelectedId) || nextColors[0];
47
+ return _objectSpread2(_objectSpread2({}, nextState), {}, {
48
+ gradientColors: nextColors,
49
+ gradientSelectedId: (selectedPoint === null || selectedPoint === void 0 ? void 0 : selectedPoint.id) || "",
50
+ hsva: (selectedPoint === null || selectedPoint === void 0 ? void 0 : selectedPoint.hsva) || nextState.hsva
51
+ });
52
+ };
53
+ var GradientThumb = /* @__PURE__ */ defineComponent({
54
+ name: "GradientThumb",
14
55
  props: {
15
- color: {
56
+ point: {
16
57
  type: Object,
17
58
  required: true
18
59
  },
19
- alpha: {
20
- type: Number,
60
+ prefixCls: {
61
+ type: String,
21
62
  required: true
22
63
  },
23
- colorString: String,
64
+ active: Boolean,
65
+ disabled: Boolean,
66
+ onSelect: Function,
67
+ onMove: Function,
68
+ onRemove: Function
69
+ },
70
+ setup(props) {
71
+ const thumbRef = ref();
72
+ const shouldIgnoreClick = ref(false);
73
+ useDraggable(thumbRef, {
74
+ axis: "x",
75
+ buttons: [0, -1],
76
+ disabled: computed(() => props.disabled),
77
+ preventDefault: true,
78
+ stopPropagation: true,
79
+ onStart: () => {
80
+ var _props$onSelect;
81
+ (_props$onSelect = props.onSelect) === null || _props$onSelect === void 0 || _props$onSelect.call(props);
82
+ shouldIgnoreClick.value = false;
83
+ },
84
+ onMove: (_, event) => {
85
+ var _props$onMove;
86
+ shouldIgnoreClick.value = true;
87
+ (_props$onMove = props.onMove) === null || _props$onMove === void 0 || _props$onMove.call(props, event.clientX);
88
+ },
89
+ onEnd: () => {
90
+ window.setTimeout(() => {
91
+ shouldIgnoreClick.value = false;
92
+ }, 0);
93
+ }
94
+ });
95
+ const handleClick = (event) => {
96
+ var _props$onSelect2;
97
+ event.stopPropagation();
98
+ if (shouldIgnoreClick.value) return;
99
+ (_props$onSelect2 = props.onSelect) === null || _props$onSelect2 === void 0 || _props$onSelect2.call(props);
100
+ };
101
+ const handleKeyDown = (event) => {
102
+ if (event.key === "Delete" || event.key === "Backspace") {
103
+ var _props$onRemove;
104
+ (_props$onRemove = props.onRemove) === null || _props$onRemove === void 0 || _props$onRemove.call(props);
105
+ }
106
+ };
107
+ return () => createVNode("button", {
108
+ "ref": thumbRef,
109
+ "type": "button",
110
+ "class": {
111
+ [`${props.prefixCls}-gradient-thumb`]: true,
112
+ [`${props.prefixCls}-gradient-thumb-active`]: props.active
113
+ },
114
+ "style": { left: `${props.point.left}%` },
115
+ "onClick": handleClick,
116
+ "onKeydown": handleKeyDown
117
+ }, [createVNode("span", {
118
+ "class": `${props.prefixCls}-gradient-thumb-inner`,
119
+ "style": { backgroundColor: formatColor(props.point.hsva, "CSS", true) }
120
+ }, null)]);
121
+ }
122
+ });
123
+ var panel_default = /* @__PURE__ */ defineComponent({
124
+ name: "Panel",
125
+ props: {
126
+ value: {
127
+ type: String,
128
+ default: ""
129
+ },
130
+ colorModes: {
131
+ type: Array,
132
+ default: () => ["monochrome"]
133
+ },
134
+ enableMultipleGradient: {
135
+ type: Boolean,
136
+ default: true
137
+ },
24
138
  disabled: Boolean,
25
- disabledAlpha: Boolean,
26
- showHistory: Boolean,
27
- showPreset: Boolean,
28
- format: String,
29
- historyColors: Array,
30
- presetColors: Array,
31
- onAlphaChange: Function,
32
- onHsvChange: Function
139
+ enableAlpha: Boolean,
140
+ showPrimaryColorPreview: {
141
+ type: Boolean,
142
+ default: true
143
+ },
144
+ format: {
145
+ type: String,
146
+ default: "RGB"
147
+ },
148
+ recentColors: {
149
+ type: [Array, Boolean],
150
+ default: () => []
151
+ },
152
+ swatchColors: {
153
+ type: Array,
154
+ default: () => colors
155
+ },
156
+ onChange: Function,
157
+ onRecentColorsChange: Function,
158
+ onPaletteBarChange: Function
33
159
  },
34
160
  setup(props) {
35
- const { t } = useI18n();
36
161
  const prefixCls = getPrefixCls("color-picker");
37
- const hsv = computed(() => props.color.hsv);
38
- const [format, setFormat] = useState(props.format || "hex");
39
- const onChange = (value) => {
40
- setFormat(value);
41
- };
42
- const onHexInputChange = (value) => {
43
- var _props$onHsvChange;
44
- const _rgb = hexToRgb(value) || {
45
- r: 255,
46
- g: 0,
47
- b: 0
48
- };
49
- const _hsv = rgbToHsv(_rgb.r, _rgb.g, _rgb.b);
50
- (_props$onHsvChange = props.onHsvChange) === null || _props$onHsvChange === void 0 || _props$onHsvChange.call(props, _hsv);
51
- };
52
- const renderInput = () => {
53
- const commonProps = {
54
- color: props.color,
55
- alpha: props.alpha,
56
- disabled: props.disabled,
57
- disabledAlpha: props.disabledAlpha,
58
- onHsvChange: props.onHsvChange,
59
- onAlphaChange: props.onAlphaChange
162
+ const sliderRef = ref();
163
+ const gradientShellRef = ref();
164
+ const colorState = ref(parseColorState(props.value, props.colorModes));
165
+ const selectedFormat = ref(normalizeFormat(props.format, props.enableAlpha));
166
+ const formatDrafts = ref([]);
167
+ const activeHsva = computed(() => {
168
+ var _getActiveGradientPoi;
169
+ return ((_getActiveGradientPoi = getActiveGradientPoint(colorState.value)) === null || _getActiveGradientPoi === void 0 ? void 0 : _getActiveGradientPoi.hsva) || colorState.value.hsva;
170
+ });
171
+ const syncDrafts = () => {
172
+ formatDrafts.value = getFormatInputs(activeHsva.value, selectedFormat.value, props.enableAlpha);
173
+ };
174
+ watch(() => [props.value, props.colorModes], () => {
175
+ colorState.value = reconcileGradientState(colorState.value, parseColorState(props.value, props.colorModes));
176
+ syncDrafts();
177
+ }, { deep: true });
178
+ watch(() => [props.format, props.enableAlpha], () => {
179
+ selectedFormat.value = normalizeFormat(props.format, props.enableAlpha);
180
+ syncDrafts();
181
+ });
182
+ syncDrafts();
183
+ const formatOptions = computed(() => {
184
+ const base = [
185
+ {
186
+ value: "HEX",
187
+ label: "HEX"
188
+ },
189
+ {
190
+ value: "RGB",
191
+ label: "RGB"
192
+ },
193
+ {
194
+ value: "HSL",
195
+ label: "HSL"
196
+ },
197
+ {
198
+ value: "HSV",
199
+ label: "HSV"
200
+ },
201
+ {
202
+ value: "CMYK",
203
+ label: "CMYK"
204
+ },
205
+ {
206
+ value: "CSS",
207
+ label: "CSS"
208
+ }
209
+ ];
210
+ if (!props.enableAlpha) return base;
211
+ return [
212
+ {
213
+ value: "HEX8",
214
+ label: "HEX8"
215
+ },
216
+ {
217
+ value: "RGBA",
218
+ label: "RGBA"
219
+ },
220
+ {
221
+ value: "HSLA",
222
+ label: "HSLA"
223
+ },
224
+ {
225
+ value: "HSVA",
226
+ label: "HSVA"
227
+ },
228
+ ...base
229
+ ];
230
+ });
231
+ const previewColor = computed(() => getColorBackground(colorState.value));
232
+ const colorModel = computed(() => {
233
+ const colorObject = getColorObject(colorState.value);
234
+ return {
235
+ hsv: {
236
+ h: activeHsva.value.h,
237
+ s: activeHsva.value.s,
238
+ v: activeHsva.value.v
239
+ },
240
+ rgb: {
241
+ r: colorObject.red,
242
+ g: colorObject.green,
243
+ b: colorObject.blue
244
+ },
245
+ hex: colorObject.hex.replace("#", "")
60
246
  };
61
- if (format.value === "rgb") return createVNode(input_rgb_default, commonProps, null);
62
- return createVNode(input_hex_default, commonProps, null);
247
+ });
248
+ const recentColorList = computed(() => {
249
+ if (!Array.isArray(props.recentColors)) return void 0;
250
+ return props.colorModes.length === 1 && props.colorModes[0] === "linear-gradient" ? props.recentColors.filter((item) => item.startsWith("linear-gradient(")) : props.recentColors;
251
+ });
252
+ const swatchColorList = computed(() => {
253
+ if (!Array.isArray(props.swatchColors)) return void 0;
254
+ return props.colorModes.length === 1 && props.colorModes[0] === "linear-gradient" ? props.swatchColors.filter((item) => item.startsWith("linear-gradient(")) : props.swatchColors;
255
+ });
256
+ const emitStateChange = (nextState, trigger, notifyPaletteBar) => {
257
+ var _props$onChange;
258
+ colorState.value = nextState;
259
+ syncDrafts();
260
+ (_props$onChange = props.onChange) === null || _props$onChange === void 0 || _props$onChange.call(props, formatColorState(nextState, selectedFormat.value, props.enableAlpha), trigger);
261
+ if (notifyPaletteBar) {
262
+ var _props$onPaletteBarCh;
263
+ (_props$onPaletteBarCh = props.onPaletteBarChange) === null || _props$onPaletteBarCh === void 0 || _props$onPaletteBarCh.call(props, { color: getColorObject(nextState) });
264
+ }
265
+ };
266
+ const handleHsvaChange = (nextHsva, trigger, notifyPaletteBar) => {
267
+ emitStateChange(setActiveColorHsva(colorState.value, nextHsva), trigger, notifyPaletteBar);
268
+ };
269
+ const handleModeChange = (mode) => {
270
+ if (props.disabled || typeof mode !== "string" || mode === colorState.value.mode) return;
271
+ if (mode === "linear-gradient") {
272
+ emitStateChange(getDefaultGradientState(formatColor(activeHsva.value, "CSS", true)), "input");
273
+ return;
274
+ }
275
+ emitStateChange(_objectSpread2(_objectSpread2({}, getDefaultColorState()), {}, {
276
+ mode: "monochrome",
277
+ hsva: activeHsva.value
278
+ }), "input");
279
+ };
280
+ const updateDraft = (index, value) => {
281
+ const nextDrafts = [...formatDrafts.value];
282
+ nextDrafts[index] = value;
283
+ formatDrafts.value = nextDrafts;
284
+ };
285
+ const commitDrafts = () => {
286
+ handleHsvaChange(parseFormatInputValues(formatDrafts.value, selectedFormat.value, props.enableAlpha), "input");
287
+ };
288
+ const getThumbTrackRect = () => {
289
+ const slider = sliderRef.value || gradientShellRef.value;
290
+ return slider === null || slider === void 0 ? void 0 : slider.getBoundingClientRect();
291
+ };
292
+ const updateThumbLeft = (pointId, clientX) => {
293
+ const rect = getThumbTrackRect();
294
+ if (!rect) return;
295
+ const nextLeft = clampPercent((clientX - rect.left) / rect.width * 100);
296
+ const gradientColors = colorState.value.gradientColors.map((point) => point.id === pointId ? _objectSpread2(_objectSpread2({}, point), {}, { left: round(nextLeft, 2) }) : point);
297
+ emitStateChange(setGradientColors(colorState.value, gradientColors), "input");
298
+ };
299
+ const handleGradientBarClick = (event) => {
300
+ if (props.disabled || !props.enableMultipleGradient || colorState.value.mode !== "linear-gradient") return;
301
+ if (event.target !== sliderRef.value && event.target !== gradientShellRef.value) return;
302
+ const slider = sliderRef.value || gradientShellRef.value;
303
+ if (!slider) return;
304
+ const rect = slider.getBoundingClientRect();
305
+ const left = clampPercent((event.clientX - rect.left) / rect.width * 100);
306
+ emitStateChange(addGradientColor(colorState.value, left), "input");
63
307
  };
64
- const renderColorBlock = (color) => {
65
- return createVNode("div", {
66
- "key": color,
308
+ const handleGradientBarKeyDown = (event) => {
309
+ if ((event.key === "Enter" || event.key === " ") && !props.disabled && props.enableMultipleGradient) {
310
+ event.preventDefault();
311
+ emitStateChange(addGradientColor(colorState.value, 50), "input");
312
+ }
313
+ };
314
+ const handleThumbRemove = (pointId) => {
315
+ if (colorState.value.gradientColors.length <= 2) return;
316
+ emitStateChange(removeGradientColor(colorState.value, pointId), "input");
317
+ };
318
+ const addRecentColor = () => {
319
+ var _props$onRecentColors;
320
+ if (props.recentColors === null || props.recentColors === false) return;
321
+ const currentValue = formatColorState(colorState.value, selectedFormat.value, props.enableAlpha);
322
+ const next = [...recentColorList.value || []];
323
+ const index = next.indexOf(currentValue);
324
+ if (index !== -1) next.splice(index, 1);
325
+ next.unshift(currentValue);
326
+ if (next.length > 8) next.length = 8;
327
+ (_props$onRecentColors = props.onRecentColorsChange) === null || _props$onRecentColors === void 0 || _props$onRecentColors.call(props, next);
328
+ };
329
+ const renderColorBlock = (value, trigger) => {
330
+ const style = value.startsWith("linear-gradient(") ? { backgroundImage: value } : { backgroundColor: value };
331
+ return createVNode("button", {
332
+ "key": value,
333
+ "type": "button",
67
334
  "class": `${prefixCls}-color-block`,
68
- "style": { backgroundColor: color },
69
- "onClick": () => onHexInputChange(color)
335
+ "aria-label": `选择颜色 ${value}`,
336
+ "onClick": () => emitStateChange(parseColorState(value, props.colorModes), trigger)
70
337
  }, [createVNode("div", {
71
338
  "class": `${prefixCls}-block`,
72
- "style": { backgroundColor: color }
339
+ "style": style
73
340
  }, null)]);
74
341
  };
75
- const renderColorSection = (text, colors) => createVNode("div", { "class": `${prefixCls}-colors-section` }, [createVNode("div", { "class": `${prefixCls}-colors-text` }, [text]), createVNode("div", { "class": `${prefixCls}-colors-wrapper` }, [(colors === null || colors === void 0 ? void 0 : colors.length) ? createVNode("div", { "class": `${prefixCls}-colors-list` }, [colors.map(renderColorBlock)]) : createVNode("span", { "class": `${prefixCls}-colors-empty` }, [t("colorPicker.empty")])])]);
342
+ const renderColorSection = (text, values, trigger) => createVNode("div", { "class": `${prefixCls}-colors-section` }, [createVNode("div", { "class": `${prefixCls}-colors-header` }, [createVNode("div", { "class": `${prefixCls}-colors-text` }, [text]), trigger === "recent" && values && createVNode("button", {
343
+ "type": "button",
344
+ "class": `${prefixCls}-colors-action`,
345
+ "onClick": addRecentColor
346
+ }, [createTextVNode("添加当前颜色")])]), createVNode("div", { "class": `${prefixCls}-colors-wrapper` }, [(values === null || values === void 0 ? void 0 : values.length) ? createVNode("div", { "class": `${prefixCls}-colors-list` }, [values.map((value) => renderColorBlock(value, trigger))]) : createVNode("span", { "class": `${prefixCls}-colors-empty` }, [createTextVNode("暂无颜色")])])]);
76
347
  const renderColorSec = () => {
77
- if (props.showHistory || props.showPreset) return createVNode("div", { "class": `${prefixCls}-panel-colors` }, [props.showHistory && renderColorSection(t("colorPicker.history"), props.historyColors), props.showPreset && renderColorSection(t("colorPicker.preset"), props.presetColors)]);
348
+ var _swatchColorList$valu;
349
+ const showRecent = Boolean(recentColorList.value);
350
+ const showSwatches = Boolean((_swatchColorList$valu = swatchColorList.value) === null || _swatchColorList$valu === void 0 ? void 0 : _swatchColorList$valu.length);
351
+ if (showRecent || showSwatches) return createVNode("div", { "class": `${prefixCls}-panel-colors` }, [showRecent && renderColorSection("最近使用", recentColorList.value, "recent"), showSwatches && renderColorSection("系统色板", swatchColorList.value, "preset")]);
78
352
  return null;
79
353
  };
354
+ const renderGradientPanel = () => {
355
+ if (colorState.value.mode !== "linear-gradient") return null;
356
+ return createVNode("div", { "class": `${prefixCls}-gradient-panel` }, [
357
+ createVNode("div", {
358
+ "ref": gradientShellRef,
359
+ "class": `${prefixCls}-gradient-bar-shell`
360
+ }, [createVNode("button", {
361
+ "ref": sliderRef,
362
+ "type": "button",
363
+ "class": `${prefixCls}-gradient-bar`,
364
+ "disabled": props.disabled,
365
+ "style": { backgroundImage: getGradientThumbBackground(colorState.value.gradientColors) },
366
+ "onClick": handleGradientBarClick,
367
+ "onKeydown": handleGradientBarKeyDown
368
+ }, null), colorState.value.gradientColors.map((point) => createVNode(GradientThumb, {
369
+ "key": point.id,
370
+ "point": point,
371
+ "prefixCls": prefixCls,
372
+ "active": point.id === colorState.value.gradientSelectedId,
373
+ "disabled": props.disabled,
374
+ "onSelect": () => {
375
+ if (colorState.value.gradientSelectedId === point.id) return;
376
+ emitStateChange(setGradientSelectedPoint(colorState.value, point.id), "input");
377
+ },
378
+ "onMove": (clientX) => updateThumbLeft(point.id, clientX),
379
+ "onRemove": () => handleThumbRemove(point.id)
380
+ }, null))]),
381
+ createVNode("div", { "class": `${prefixCls}-gradient-meta` }, [createVNode("span", { "class": `${prefixCls}-gradient-label` }, [createTextVNode("角度")]), createVNode(InputNumber, {
382
+ "class": `${prefixCls}-gradient-degree`,
383
+ "size": "mini",
384
+ "min": 0,
385
+ "max": 360,
386
+ "hideButton": true,
387
+ "disabled": props.disabled,
388
+ "modelValue": colorState.value.gradientDegree,
389
+ "onChange": (value = 0) => emitStateChange(setGradientDegree(colorState.value, value), "input")
390
+ }, null)]),
391
+ createVNode("div", {
392
+ "class": `${prefixCls}-gradient-preview`,
393
+ "style": { backgroundImage: getLinearGradientString(colorState.value) }
394
+ }, null)
395
+ ]);
396
+ };
397
+ const renderFormatInputs = () => {
398
+ let _slot;
399
+ return createVNode(input_group_default, { "class": `${prefixCls}-input-group` }, _isSlot(_slot = formatDrafts.value.map((draft, index) => createVNode(Input, {
400
+ "key": `${selectedFormat.value}-${index}`,
401
+ "class": `${prefixCls}-format-input`,
402
+ "size": "mini",
403
+ "disabled": props.disabled,
404
+ "modelValue": draft,
405
+ "onInput": (value) => updateDraft(index, value),
406
+ "onChange": commitDrafts,
407
+ "onPressEnter": commitDrafts
408
+ }, null))) ? _slot : { default: () => [_slot] });
409
+ };
80
410
  return () => createVNode("div", { "class": {
81
411
  [`${prefixCls}-panel`]: true,
82
412
  [`${prefixCls}-panel-disabled`]: props.disabled
83
413
  } }, [
414
+ props.colorModes.length > 1 && createVNode("div", { "class": `${prefixCls}-panel-head` }, [createVNode(Radio.Group, {
415
+ "type": "button",
416
+ "size": "small",
417
+ "modelValue": colorState.value.mode,
418
+ "options": MODE_OPTIONS.map((item) => ({
419
+ label: item.label,
420
+ value: item.value
421
+ })),
422
+ "disabled": props.disabled,
423
+ "onChange": handleModeChange
424
+ }, null)]),
425
+ renderGradientPanel(),
84
426
  createVNode(palette_default, {
85
- "color": props.color,
86
- "onChange": (s, v) => {
87
- var _props$onHsvChange2;
88
- return (_props$onHsvChange2 = props.onHsvChange) === null || _props$onHsvChange2 === void 0 ? void 0 : _props$onHsvChange2.call(props, {
89
- h: hsv.value.h,
90
- s,
91
- v
92
- });
93
- }
427
+ "color": colorModel.value,
428
+ "onChange": (s, v) => handleHsvaChange(_objectSpread2(_objectSpread2({}, activeHsva.value), {}, {
429
+ s,
430
+ v
431
+ }), "palette-saturation-brightness")
94
432
  }, null),
95
433
  createVNode("div", { "class": `${prefixCls}-panel-control` }, [createVNode("div", { "class": `${prefixCls}-control-wrapper` }, [createVNode("div", null, [createVNode(control_bar_default, {
96
434
  "type": "hue",
97
- "x": hsv.value.h,
98
- "color": props.color,
99
- "colorString": props.colorString,
435
+ "x": activeHsva.value.h,
436
+ "color": colorModel.value,
437
+ "colorString": formatColor(activeHsva.value, "CSS", true),
100
438
  "onChange": (h) => {
101
- var _props$onHsvChange3;
102
- return (_props$onHsvChange3 = props.onHsvChange) === null || _props$onHsvChange3 === void 0 ? void 0 : _props$onHsvChange3.call(props, {
103
- h,
104
- s: hsv.value.s,
105
- v: hsv.value.v
106
- });
439
+ handleHsvaChange(_objectSpread2(_objectSpread2({}, activeHsva.value), {}, { h }), "palette-hue-bar", true);
107
440
  }
108
- }, null), !props.disabledAlpha && createVNode(control_bar_default, {
441
+ }, null), props.enableAlpha && createVNode(control_bar_default, {
109
442
  "type": "alpha",
110
- "x": props.alpha,
111
- "color": props.color,
112
- "colorString": props.colorString,
113
- "onChange": props.onAlphaChange
114
- }, null)]), createVNode("div", {
443
+ "x": activeHsva.value.a,
444
+ "color": colorModel.value,
445
+ "colorString": formatColor(activeHsva.value, "CSS", true),
446
+ "onChange": (alpha) => {
447
+ handleHsvaChange(_objectSpread2(_objectSpread2({}, activeHsva.value), {}, { a: alpha }), "palette-alpha-bar", true);
448
+ }
449
+ }, null)]), props.showPrimaryColorPreview && createVNode("div", {
115
450
  "class": `${prefixCls}-preview`,
116
- "style": { backgroundColor: props.colorString }
451
+ "style": colorState.value.mode === "linear-gradient" ? { backgroundImage: previewColor.value } : { backgroundColor: previewColor.value }
117
452
  }, null)]), createVNode("div", { "class": `${prefixCls}-input-wrapper` }, [createVNode(Select, {
118
453
  "class": `${prefixCls}-select`,
119
454
  "size": "mini",
120
455
  "trigger-props": { class: `${prefixCls}-select-popup` },
121
- "options": [{
122
- value: "hex",
123
- label: "Hex"
124
- }, {
125
- value: "rgb",
126
- label: "RGB"
127
- }],
128
- "modelValue": format.value,
129
- "onChange": onChange
130
- }, null), createVNode("div", { "class": `${prefixCls}-group-wrapper` }, [renderInput()])])]),
456
+ "options": formatOptions.value,
457
+ "modelValue": selectedFormat.value,
458
+ "disabled": props.disabled,
459
+ "onChange": (value) => {
460
+ if (typeof value !== "string") return;
461
+ selectedFormat.value = value;
462
+ syncDrafts();
463
+ }
464
+ }, null), createVNode("div", { "class": `${prefixCls}-group-wrapper` }, [renderFormatInputs()])])]),
131
465
  renderColorSec()
132
466
  ]);
133
467
  }
@@ -101,6 +101,75 @@
101
101
  border-radius: 2px;
102
102
  box-shadow: 0 8px 20px 0 rgba(0, 0, 0, 0.1);
103
103
  }
104
+ .sd-color-picker-panel .sd-color-picker-panel-head {
105
+ display: flex;
106
+ justify-content: center;
107
+ padding: 8px 8px 0;
108
+ }
109
+ .sd-color-picker-panel .sd-color-picker-gradient-panel {
110
+ padding: 8px 8px 0;
111
+ }
112
+ .sd-color-picker-panel .sd-color-picker-gradient-bar-shell {
113
+ position: relative;
114
+ display: flex;
115
+ align-items: center;
116
+ height: 28px;
117
+ user-select: none;
118
+ margin-inline: 8px;
119
+ }
120
+ .sd-color-picker-panel .sd-color-picker-gradient-bar {
121
+ display: block;
122
+ width: 100%;
123
+ height: 8px;
124
+ padding: 0;
125
+ background-color: transparent;
126
+ border: 1px solid var(--color-border-2);
127
+ border-radius: 4px;
128
+ cursor: pointer;
129
+ }
130
+ .sd-color-picker-panel .sd-color-picker-gradient-thumb {
131
+ position: absolute;
132
+ z-index: 1;
133
+ width: 18px;
134
+ height: 18px;
135
+ padding: 2px;
136
+ background: var(--color-bg-white);
137
+ border: 1px solid var(--color-border-2);
138
+ border-radius: 50%;
139
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.14);
140
+ transform: translateX(-50%);
141
+ cursor: pointer;
142
+ touch-action: none;
143
+ }
144
+ .sd-color-picker-panel .sd-color-picker-gradient-thumb-active {
145
+ border-color: var(--color-primary-6);
146
+ box-shadow: 0 0 0 2px rgba(22, 93, 255, 0.16);
147
+ }
148
+ .sd-color-picker-panel .sd-color-picker-gradient-thumb-inner {
149
+ display: block;
150
+ width: 100%;
151
+ height: 100%;
152
+ border-radius: 50%;
153
+ }
154
+ .sd-color-picker-panel .sd-color-picker-gradient-meta {
155
+ display: flex;
156
+ gap: 6px;
157
+ align-items: center;
158
+ margin-top: 8px;
159
+ }
160
+ .sd-color-picker-panel .sd-color-picker-gradient-label {
161
+ color: var(--color-text-2);
162
+ font-size: 12px;
163
+ }
164
+ .sd-color-picker-panel .sd-color-picker-gradient-degree {
165
+ width: 72px;
166
+ }
167
+ .sd-color-picker-panel .sd-color-picker-gradient-preview {
168
+ height: 32px;
169
+ margin-top: 8px;
170
+ border: 1px solid var(--color-border-2);
171
+ border-radius: 4px;
172
+ }
104
173
  .sd-color-picker-panel .sd-color-picker-palette {
105
174
  position: relative;
106
175
  box-sizing: border-box;
@@ -173,11 +242,25 @@
173
242
  .sd-color-picker-panel .sd-color-picker-panel-colors .sd-color-picker-colors-section:not(:first-child) {
174
243
  margin-top: 12px;
175
244
  }
245
+ .sd-color-picker-panel .sd-color-picker-panel-colors .sd-color-picker-colors-header {
246
+ display: flex;
247
+ gap: 6px;
248
+ align-items: center;
249
+ justify-content: space-between;
250
+ }
176
251
  .sd-color-picker-panel .sd-color-picker-panel-colors .sd-color-picker-colors-text {
177
252
  color: var(--color-text-1);
178
253
  font-weight: 400;
179
254
  font-size: 12px;
180
255
  }
256
+ .sd-color-picker-panel .sd-color-picker-panel-colors .sd-color-picker-colors-action {
257
+ padding: 0;
258
+ color: var(--color-primary-6);
259
+ font-size: 12px;
260
+ background: transparent;
261
+ border: 0;
262
+ cursor: pointer;
263
+ }
181
264
  .sd-color-picker-panel .sd-color-picker-panel-colors .sd-color-picker-colors-empty {
182
265
  margin: 12px 0;
183
266
  color: var(--color-text-3);
@@ -263,13 +346,21 @@
263
346
  flex: 0 0 auto;
264
347
  width: 52px;
265
348
  }
349
+ .sd-color-picker-panel .sd-color-picker-input-group {
350
+ width: 100%;
351
+ }
352
+ .sd-color-picker-panel .sd-color-picker-format-input {
353
+ min-width: 0;
354
+ }
266
355
  .sd-color-picker-panel .sd-color-picker-input-hex .sd-input {
267
356
  padding-left: 4px;
268
357
  }
269
358
  .sd-color-picker-panel.sd-color-picker-panel-disabled .sd-color-picker-palette,
270
359
  .sd-color-picker-panel.sd-color-picker-panel-disabled .sd-color-picker-control-bar,
271
360
  .sd-color-picker-panel.sd-color-picker-panel-disabled .sd-color-picker-color-block,
272
- .sd-color-picker-panel.sd-color-picker-panel-disabled .sd-color-picker-preview {
361
+ .sd-color-picker-panel.sd-color-picker-panel-disabled .sd-color-picker-preview,
362
+ .sd-color-picker-panel.sd-color-picker-panel-disabled .sd-color-picker-gradient-bar,
363
+ .sd-color-picker-panel.sd-color-picker-panel-disabled .sd-color-picker-gradient-thumb {
273
364
  cursor: not-allowed;
274
365
  opacity: 0.8;
275
366
  }