@sdata/web-vue 1.7.1 → 1.9.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 (155) hide show
  1. package/dist/sd.css +182 -1
  2. package/dist/sd.min.css +1 -1
  3. package/es/_components/input-label/input-label.js +30 -24
  4. package/es/_components/select-view/interface.d.ts +1 -0
  5. package/es/_components/select-view/select-view.d.ts +12 -3
  6. package/es/_components/select-view/select-view.js +38 -28
  7. package/es/_components/select-view/style/index.css +45 -0
  8. package/es/_hooks/use-allow-clear.d.ts +4 -0
  9. package/es/_hooks/use-allow-clear.js +20 -0
  10. package/es/_hooks/use-trigger.d.ts +4 -6
  11. package/es/_hooks/use-trigger.js +7 -5
  12. package/es/_utils/color.js +1 -18
  13. package/es/auto-complete/auto-complete.d.ts +1 -1
  14. package/es/auto-complete/auto-complete.js +4 -2
  15. package/es/auto-complete/index.d.ts +3 -3
  16. package/es/badge/badge.d.ts +1 -1
  17. package/es/badge/index.d.ts +3 -3
  18. package/es/carousel/carousel-arrow.vue.d.ts +1 -1
  19. package/es/carousel/carousel.d.ts +2 -2
  20. package/es/carousel/index.d.ts +6 -6
  21. package/es/cascader/cascader-panel.vue.d.ts +2 -2
  22. package/es/cascader/cascader.js +1 -1
  23. package/es/cascader/cascader.vue.d.ts +21 -11
  24. package/es/cascader/cascader.vue_vue_type_script_lang.js +4 -1
  25. package/es/cascader/index.d.ts +47 -26
  26. package/es/color-picker/color-picker.d.ts +115 -40
  27. package/es/color-picker/color-picker.js +146 -102
  28. package/es/color-picker/index.d.ts +217 -69
  29. package/es/color-picker/interface.d.ts +41 -0
  30. package/es/color-picker/palette.js +1 -1
  31. package/es/color-picker/panel.d.ts +73 -34
  32. package/es/color-picker/panel.js +423 -89
  33. package/es/color-picker/style/index.css +92 -1
  34. package/es/color-picker/style/index.scss +107 -1
  35. package/es/color-picker/utils.d.ts +89 -0
  36. package/es/color-picker/utils.js +456 -0
  37. package/es/config-provider/config-provider.vue.d.ts +10 -1
  38. package/es/config-provider/config-provider.vue_vue_type_script_lang.js +6 -1
  39. package/es/config-provider/context.d.ts +1 -0
  40. package/es/config-provider/index.d.ts +18 -3
  41. package/es/date-picker/index.d.ts +7 -6
  42. package/es/date-picker/picker.js +1 -1
  43. package/es/date-picker/picker.vue.d.ts +7 -6
  44. package/es/date-picker/picker.vue_vue_type_script_lang.js +4 -1
  45. package/es/date-picker/range-picker.js +1 -1
  46. package/es/date-picker/range-picker.vue.d.ts +7 -6
  47. package/es/date-picker/range-picker.vue_vue_type_script_lang.js +4 -1
  48. package/es/descriptions/descriptions.d.ts +2 -2
  49. package/es/descriptions/index.d.ts +6 -6
  50. package/es/drawer/drawer.vue_vue_type_script_lang.js +1 -1
  51. package/es/dropdown/dropdown-button.vue.d.ts +8 -8
  52. package/es/dropdown/dropdown-panel.vue.d.ts +2 -2
  53. package/es/dropdown/dropdown-submenu.vue.d.ts +8 -8
  54. package/es/dropdown/dropdown.vue.d.ts +8 -8
  55. package/es/dropdown/index.d.ts +32 -32
  56. package/es/ellipsis/ellipsis.vue.d.ts +13 -13
  57. package/es/ellipsis/ellipsis.vue_vue_type_script_lang.js +1 -1
  58. package/es/ellipsis/index.d.ts +56 -56
  59. package/es/ellipsis/performant-ellipsis.vue.d.ts +14 -14
  60. package/es/form/form-item-label.vue.d.ts +12 -12
  61. package/es/form/form-item.vue.d.ts +12 -12
  62. package/es/form/index.d.ts +12 -12
  63. package/es/grid/grid.vue.d.ts +1 -1
  64. package/es/grid/index.d.ts +3 -3
  65. package/es/image/image.vue.d.ts +12 -12
  66. package/es/image/preview-action.d.ts +12 -12
  67. package/es/image/preview-group.vue.d.ts +12 -12
  68. package/es/image/preview-toolbar.vue.d.ts +12 -12
  69. package/es/image/preview.vue.d.ts +12 -12
  70. package/es/index.css +182 -1
  71. package/es/index.js +2 -2
  72. package/es/input/input.js +4 -2
  73. package/es/input-number/input-number.js +4 -2
  74. package/es/input-tag/index.d.ts +6 -6
  75. package/es/input-tag/input-tag.d.ts +3 -3
  76. package/es/input-tag/input-tag.js +183 -32
  77. package/es/input-tag/style/index.css +45 -0
  78. package/es/input-tag/style/input-tag.scss +53 -0
  79. package/es/list/index.d.ts +3 -3
  80. package/es/list/list.d.ts +1 -1
  81. package/es/mention/mention.js +4 -2
  82. package/es/menu/sub-menu-pop.vue.d.ts +6 -6
  83. package/es/modal/modal.vue_vue_type_script_lang.js +1 -1
  84. package/es/overflow-list/index.d.ts +3 -3
  85. package/es/overflow-list/overflow-list.d.ts +1 -1
  86. package/es/pagination/page-options.vue.d.ts +188 -98
  87. package/es/popconfirm/index.d.ts +12 -12
  88. package/es/popconfirm/popconfirm.vue.d.ts +6 -6
  89. package/es/popover/index.d.ts +12 -12
  90. package/es/popover/popover.vue.d.ts +6 -6
  91. package/es/progress/index.d.ts +5 -5
  92. package/es/progress/line.vue.d.ts +1 -1
  93. package/es/progress/progress.vue.d.ts +2 -2
  94. package/es/rate/rate.js +4 -2
  95. package/es/scrollbar/index.d.ts +2 -2
  96. package/es/scrollbar/scrollbar.vue.d.ts +1 -1
  97. package/es/scrollbar/thumb.vue.d.ts +1 -1
  98. package/es/sd-vue.js +2 -2
  99. package/es/select/hooks/use-options.d.ts +9 -4
  100. package/es/select/hooks/use-options.js +2 -2
  101. package/es/select/hooks/use-select.d.ts +9 -4
  102. package/es/select/index.d.ts +188 -98
  103. package/es/select/interface.d.ts +57 -46
  104. package/es/select/select-dropdown.vue.d.ts +2 -2
  105. package/es/select/select.d.ts +107 -59
  106. package/es/select/select.js +182 -126
  107. package/es/select/utils.d.ts +1 -1
  108. package/es/select/utils.js +28 -10
  109. package/es/skeleton/index.d.ts +1 -1
  110. package/es/skeleton/line.vue.d.ts +1 -1
  111. package/es/slider/index.d.ts +27 -27
  112. package/es/slider/slider-button.vue.d.ts +12 -12
  113. package/es/slider/slider.vue.d.ts +13 -13
  114. package/es/space/index.d.ts +3 -3
  115. package/es/space/space.d.ts +1 -1
  116. package/es/statistic/index.d.ts +6 -6
  117. package/es/statistic/statistic.vue.d.ts +2 -2
  118. package/es/table/index.d.ts +6 -6
  119. package/es/table/table.d.ts +2 -2
  120. package/es/tabs/index.d.ts +9 -9
  121. package/es/tabs/tabs.d.ts +3 -3
  122. package/es/tag/index.d.ts +3 -3
  123. package/es/tag/tag.vue.d.ts +1 -1
  124. package/es/textarea/index.d.ts +3 -3
  125. package/es/textarea/textarea.vue.d.ts +1 -1
  126. package/es/textarea/textarea.vue_vue_type_script_lang.js +6 -2
  127. package/es/time-picker/index.d.ts +15 -12
  128. package/es/time-picker/time-picker.js +1 -1
  129. package/es/time-picker/time-picker.vue.d.ts +7 -6
  130. package/es/time-picker/time-picker.vue_vue_type_script_lang.js +4 -1
  131. package/es/tooltip/index.d.ts +12 -12
  132. package/es/tooltip/tooltip.vue.d.ts +6 -6
  133. package/es/transfer/index.d.ts +10 -10
  134. package/es/transfer/transfer-view.vue.d.ts +5 -5
  135. package/es/transfer/transfer.vue.d.ts +5 -5
  136. package/es/tree/index.d.ts +6 -6
  137. package/es/tree/tree.vue.d.ts +2 -2
  138. package/es/tree-select/hooks/use-selected-state.d.ts +2 -0
  139. package/es/tree-select/hooks/use-selected-state.js +26 -8
  140. package/es/tree-select/index.d.ts +268 -61
  141. package/es/tree-select/interface.d.ts +16 -3
  142. package/es/tree-select/panel.d.ts +6 -6
  143. package/es/tree-select/tree-select.js +29 -16
  144. package/es/tree-select/tree-select.vue.d.ts +144 -30
  145. package/es/tree-select/tree-select.vue_vue_type_script_lang.js +102 -22
  146. package/es/trigger/index.d.ts +6 -6
  147. package/es/trigger/trigger.d.ts +2 -2
  148. package/es/typography/operations.vue.d.ts +12 -12
  149. package/json/vetur-attributes.json +82 -178
  150. package/json/vetur-tags.json +24 -52
  151. package/json/web-types.json +164 -387
  152. package/package.json +9 -7
  153. package/es/color-picker/input-alpha.js +0 -32
  154. package/es/color-picker/input-hex.js +0 -73
  155. package/es/color-picker/input-rgb.js +0 -55
@@ -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
  }