@zag-js/color-picker 1.43.0 → 2.0.0-next.1
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.
- package/dist/color-picker.anatomy.d.mts +2 -2
- package/dist/color-picker.anatomy.d.ts +2 -2
- package/dist/color-picker.anatomy.js +1 -0
- package/dist/color-picker.anatomy.mjs +1 -0
- package/dist/color-picker.connect.d.mts +1 -0
- package/dist/color-picker.connect.d.ts +1 -0
- package/dist/color-picker.connect.js +130 -58
- package/dist/color-picker.connect.mjs +139 -60
- package/dist/color-picker.dom.js +23 -22
- package/dist/color-picker.dom.mjs +23 -22
- package/dist/color-picker.machine.d.mts +1 -0
- package/dist/color-picker.machine.d.ts +1 -0
- package/dist/color-picker.machine.js +43 -16
- package/dist/color-picker.machine.mjs +43 -16
- package/dist/color-picker.props.d.mts +1 -0
- package/dist/color-picker.props.d.ts +1 -0
- package/dist/color-picker.types.d.mts +115 -3
- package/dist/color-picker.types.d.ts +115 -3
- package/dist/index.d.mts +2 -1
- package/dist/index.d.ts +2 -1
- package/dist/utils/get-area-format.d.mts +6 -0
- package/dist/utils/get-area-format.d.ts +6 -0
- package/dist/utils/get-area-format.js +37 -0
- package/dist/utils/get-area-format.mjs +12 -0
- package/dist/utils/get-channel-display-color.d.mts +2 -1
- package/dist/utils/get-channel-display-color.d.ts +2 -1
- package/dist/utils/get-channel-display-color.js +7 -0
- package/dist/utils/get-channel-display-color.mjs +7 -0
- package/dist/utils/get-channel-input-value.d.mts +1 -0
- package/dist/utils/get-channel-input-value.d.ts +1 -0
- package/dist/utils/get-channel-input-value.js +39 -8
- package/dist/utils/get-channel-input-value.mjs +39 -8
- package/dist/utils/get-gamut-overlay-path.d.mts +33 -0
- package/dist/utils/get-gamut-overlay-path.d.ts +33 -0
- package/dist/utils/get-gamut-overlay-path.js +81 -0
- package/dist/utils/get-gamut-overlay-path.mjs +55 -0
- package/dist/utils/get-gamut-overlay-path.test.d.mts +2 -0
- package/dist/utils/get-gamut-overlay-path.test.d.ts +2 -0
- package/dist/utils/get-gamut-overlay-path.test.js +35 -0
- package/dist/utils/get-gamut-overlay-path.test.mjs +33 -0
- package/dist/utils/get-slider-background.d.mts +1 -0
- package/dist/utils/get-slider-background.d.ts +1 -0
- package/dist/utils/get-slider-background.js +16 -1
- package/dist/utils/get-slider-background.mjs +16 -1
- package/dist/utils/is-srgb-gamut.d.mts +6 -0
- package/dist/utils/is-srgb-gamut.d.ts +6 -0
- package/dist/utils/is-srgb-gamut.js +33 -0
- package/dist/utils/is-srgb-gamut.mjs +8 -0
- package/package.json +9 -9
|
@@ -1,18 +1,34 @@
|
|
|
1
1
|
// src/color-picker.connect.ts
|
|
2
|
-
import { getColorAreaGradient, normalizeColor } from "@zag-js/color-utils";
|
|
3
|
-
import {
|
|
2
|
+
import { getColorAreaGradient, isInSrgbGamut, normalizeColor } from "@zag-js/color-utils";
|
|
3
|
+
import { getDismissableLayerAttrs, getDismissableLayerStyle } from "@zag-js/dismissable";
|
|
4
|
+
import {
|
|
5
|
+
getEventKey,
|
|
6
|
+
getEventPoint,
|
|
7
|
+
getEventStep,
|
|
8
|
+
isComposingEvent,
|
|
9
|
+
isLeftClick,
|
|
10
|
+
isModifierKey
|
|
11
|
+
} from "@zag-js/dom-query";
|
|
4
12
|
import { dataAttr, query, visuallyHiddenStyle } from "@zag-js/dom-query";
|
|
5
13
|
import { getPlacementSide, getPlacementStyles } from "@zag-js/popper";
|
|
6
14
|
import { parts } from "./color-picker.anatomy.mjs";
|
|
7
15
|
import * as dom from "./color-picker.dom.mjs";
|
|
8
16
|
import { getChannelDisplayColor } from "./utils/get-channel-display-color.mjs";
|
|
9
17
|
import { getChannelRange, getChannelValue } from "./utils/get-channel-input-value.mjs";
|
|
18
|
+
import { getGamutOverlayData } from "./utils/get-gamut-overlay-path.mjs";
|
|
10
19
|
import { getSliderBackground } from "./utils/get-slider-background.mjs";
|
|
20
|
+
function getDefaultDevicePixelRatio() {
|
|
21
|
+
if (typeof globalThis === "undefined") return 1;
|
|
22
|
+
const dpr = globalThis.devicePixelRatio;
|
|
23
|
+
return typeof dpr === "number" && Number.isFinite(dpr) ? dpr : 1;
|
|
24
|
+
}
|
|
11
25
|
function connect(service, normalize) {
|
|
12
26
|
const { context, send, prop, computed, state, scope } = service;
|
|
27
|
+
const layer = context.get("layer");
|
|
13
28
|
const value = context.get("value");
|
|
14
29
|
const format = context.get("format");
|
|
15
30
|
const areaValue = computed("areaValue");
|
|
31
|
+
const stableAreaValue = context.get("areaBaseColor") ?? areaValue;
|
|
16
32
|
const valueAsString = computed("valueAsString");
|
|
17
33
|
const disabled = computed("disabled");
|
|
18
34
|
const readOnly = !!prop("readOnly");
|
|
@@ -29,6 +45,10 @@ function connect(service, normalize) {
|
|
|
29
45
|
yChannel: props.yChannel ?? channels[2]
|
|
30
46
|
};
|
|
31
47
|
};
|
|
48
|
+
function resolveGamutOverlay(props = {}) {
|
|
49
|
+
const pixelRatio = props.pixelRatio ?? getDefaultDevicePixelRatio();
|
|
50
|
+
return getGamutOverlayData(stableAreaValue, getAreaChannels(props), format, { pixelRatio });
|
|
51
|
+
}
|
|
32
52
|
const currentPlacement = context.get("currentPlacement");
|
|
33
53
|
const currentPlacementSide = currentPlacement ? getPlacementSide(currentPlacement) : void 0;
|
|
34
54
|
const popperStyles = getPlacementStyles({
|
|
@@ -44,11 +64,38 @@ function connect(service, normalize) {
|
|
|
44
64
|
disabled: props.disabled || !interactive
|
|
45
65
|
};
|
|
46
66
|
}
|
|
67
|
+
function getRootState() {
|
|
68
|
+
return { disabled, readOnly, invalid };
|
|
69
|
+
}
|
|
70
|
+
function getTriggerState() {
|
|
71
|
+
return {
|
|
72
|
+
open,
|
|
73
|
+
focused,
|
|
74
|
+
disabled,
|
|
75
|
+
invalid,
|
|
76
|
+
readOnly,
|
|
77
|
+
placement: currentPlacement,
|
|
78
|
+
side: currentPlacementSide
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
function getContentState() {
|
|
82
|
+
return {
|
|
83
|
+
open,
|
|
84
|
+
nested: !!layer?.nested,
|
|
85
|
+
hasNested: !!layer?.hasNested,
|
|
86
|
+
placement: currentPlacement,
|
|
87
|
+
side: currentPlacementSide
|
|
88
|
+
};
|
|
89
|
+
}
|
|
47
90
|
return {
|
|
48
91
|
dragging,
|
|
49
92
|
open,
|
|
50
93
|
valueAsString,
|
|
51
94
|
value,
|
|
95
|
+
isInSrgbGamut: isInSrgbGamut(value),
|
|
96
|
+
getGamutOverlay(props = {}) {
|
|
97
|
+
return resolveGamutOverlay(props);
|
|
98
|
+
},
|
|
52
99
|
inline: !!prop("inline"),
|
|
53
100
|
setOpen(nextOpen) {
|
|
54
101
|
if (prop("inline")) return;
|
|
@@ -70,23 +117,23 @@ function connect(service, normalize) {
|
|
|
70
117
|
send({ type: "VALUE.SET", value: color, src: "set-channel" });
|
|
71
118
|
},
|
|
72
119
|
format: context.get("format"),
|
|
73
|
-
setFormat(
|
|
74
|
-
|
|
75
|
-
send({ type: "VALUE.SET", value: formatValue, src: "set-format" });
|
|
120
|
+
setFormat(nextFormat) {
|
|
121
|
+
send({ type: "FORMAT.SET", format: nextFormat, src: "set-format" });
|
|
76
122
|
},
|
|
77
123
|
alpha: value.getChannelValue("alpha"),
|
|
78
124
|
setAlpha(alphaValue) {
|
|
79
125
|
const color = value.withChannelValue("alpha", alphaValue);
|
|
80
126
|
send({ type: "VALUE.SET", value: color, src: "set-alpha" });
|
|
81
127
|
},
|
|
128
|
+
getRootState,
|
|
82
129
|
getRootProps() {
|
|
130
|
+
const rootState = getRootState();
|
|
83
131
|
return normalize.element({
|
|
84
|
-
...parts.root.attrs,
|
|
132
|
+
...parts.root.attrs(scope.id),
|
|
85
133
|
dir: prop("dir"),
|
|
86
|
-
|
|
87
|
-
"data-
|
|
88
|
-
"data-
|
|
89
|
-
"data-invalid": dataAttr(invalid),
|
|
134
|
+
"data-disabled": dataAttr(rootState.disabled),
|
|
135
|
+
"data-readonly": dataAttr(rootState.readOnly),
|
|
136
|
+
"data-invalid": dataAttr(rootState.invalid),
|
|
90
137
|
style: {
|
|
91
138
|
"--value": value.toString("css")
|
|
92
139
|
}
|
|
@@ -94,7 +141,7 @@ function connect(service, normalize) {
|
|
|
94
141
|
},
|
|
95
142
|
getLabelProps() {
|
|
96
143
|
return normalize.element({
|
|
97
|
-
...parts.label.attrs,
|
|
144
|
+
...parts.label.attrs(scope.id),
|
|
98
145
|
dir: prop("dir"),
|
|
99
146
|
id: dom.getLabelId(scope),
|
|
100
147
|
htmlFor: dom.getHiddenInputId(scope),
|
|
@@ -112,8 +159,7 @@ function connect(service, normalize) {
|
|
|
112
159
|
},
|
|
113
160
|
getControlProps() {
|
|
114
161
|
return normalize.element({
|
|
115
|
-
...parts.control.attrs,
|
|
116
|
-
id: dom.getControlId(scope),
|
|
162
|
+
...parts.control.attrs(scope.id),
|
|
117
163
|
dir: prop("dir"),
|
|
118
164
|
"data-disabled": dataAttr(disabled),
|
|
119
165
|
"data-readonly": dataAttr(readOnly),
|
|
@@ -122,24 +168,26 @@ function connect(service, normalize) {
|
|
|
122
168
|
"data-focus": dataAttr(focused)
|
|
123
169
|
});
|
|
124
170
|
},
|
|
171
|
+
getTriggerState,
|
|
125
172
|
getTriggerProps() {
|
|
173
|
+
const triggerState = getTriggerState();
|
|
126
174
|
return normalize.button({
|
|
127
|
-
...parts.trigger.attrs,
|
|
175
|
+
...parts.trigger.attrs(scope.id),
|
|
128
176
|
id: dom.getTriggerId(scope),
|
|
129
177
|
dir: prop("dir"),
|
|
130
|
-
disabled,
|
|
178
|
+
disabled: triggerState.disabled,
|
|
131
179
|
"aria-label": `select color. current color is ${valueAsString}`,
|
|
132
180
|
"aria-controls": dom.getContentId(scope),
|
|
133
181
|
"aria-labelledby": dom.getLabelId(scope),
|
|
134
182
|
"aria-haspopup": prop("inline") ? void 0 : "dialog",
|
|
135
|
-
"data-disabled": dataAttr(disabled),
|
|
136
|
-
"data-readonly": dataAttr(readOnly),
|
|
137
|
-
"data-invalid": dataAttr(invalid),
|
|
138
|
-
"data-placement":
|
|
139
|
-
"data-side":
|
|
140
|
-
"aria-expanded": open,
|
|
141
|
-
"data-state": open ? "open" : "closed",
|
|
142
|
-
"data-focus": dataAttr(focused),
|
|
183
|
+
"data-disabled": dataAttr(triggerState.disabled),
|
|
184
|
+
"data-readonly": dataAttr(triggerState.readOnly),
|
|
185
|
+
"data-invalid": dataAttr(triggerState.invalid),
|
|
186
|
+
"data-placement": triggerState.placement,
|
|
187
|
+
"data-side": triggerState.side,
|
|
188
|
+
"aria-expanded": triggerState.open,
|
|
189
|
+
"data-state": triggerState.open ? "open" : "closed",
|
|
190
|
+
"data-focus": dataAttr(triggerState.focused),
|
|
143
191
|
type: "button",
|
|
144
192
|
onClick() {
|
|
145
193
|
if (!interactive) return;
|
|
@@ -156,28 +204,35 @@ function connect(service, normalize) {
|
|
|
156
204
|
},
|
|
157
205
|
getPositionerProps() {
|
|
158
206
|
return normalize.element({
|
|
159
|
-
...parts.positioner.attrs,
|
|
160
|
-
id: dom.getPositionerId(scope),
|
|
207
|
+
...parts.positioner.attrs(scope.id),
|
|
161
208
|
dir: prop("dir"),
|
|
162
|
-
|
|
209
|
+
...getDismissableLayerAttrs(layer),
|
|
210
|
+
style: {
|
|
211
|
+
...popperStyles.floating,
|
|
212
|
+
...getDismissableLayerStyle(layer, { zIndex: true })
|
|
213
|
+
}
|
|
163
214
|
});
|
|
164
215
|
},
|
|
216
|
+
getContentState,
|
|
165
217
|
getContentProps() {
|
|
218
|
+
const contentState = getContentState();
|
|
166
219
|
return normalize.element({
|
|
167
|
-
...parts.content.attrs,
|
|
220
|
+
...parts.content.attrs(scope.id),
|
|
168
221
|
id: dom.getContentId(scope),
|
|
169
222
|
dir: prop("dir"),
|
|
170
223
|
role: prop("inline") ? void 0 : "dialog",
|
|
171
224
|
tabIndex: -1,
|
|
172
|
-
"data-placement":
|
|
173
|
-
"data-side":
|
|
174
|
-
"data-state": open ? "open" : "closed",
|
|
175
|
-
hidden: !open
|
|
225
|
+
"data-placement": contentState.placement,
|
|
226
|
+
"data-side": contentState.side,
|
|
227
|
+
"data-state": contentState.open ? "open" : "closed",
|
|
228
|
+
hidden: !contentState.open,
|
|
229
|
+
...getDismissableLayerAttrs(layer),
|
|
230
|
+
style: getDismissableLayerStyle(layer, { pointerEvents: true })
|
|
176
231
|
});
|
|
177
232
|
},
|
|
178
233
|
getValueTextProps() {
|
|
179
234
|
return normalize.element({
|
|
180
|
-
...parts.valueText.attrs,
|
|
235
|
+
...parts.valueText.attrs(scope.id),
|
|
181
236
|
dir: prop("dir"),
|
|
182
237
|
"data-disabled": dataAttr(disabled),
|
|
183
238
|
"data-focus": dataAttr(focused)
|
|
@@ -185,14 +240,13 @@ function connect(service, normalize) {
|
|
|
185
240
|
},
|
|
186
241
|
getAreaProps(props = {}) {
|
|
187
242
|
const { xChannel, yChannel } = getAreaChannels(props);
|
|
188
|
-
const { areaStyles } = getColorAreaGradient(
|
|
243
|
+
const { areaStyles } = getColorAreaGradient(stableAreaValue, {
|
|
189
244
|
xChannel,
|
|
190
245
|
yChannel,
|
|
191
246
|
dir: prop("dir")
|
|
192
247
|
});
|
|
193
248
|
return normalize.element({
|
|
194
|
-
...parts.area.attrs,
|
|
195
|
-
id: dom.getAreaId(scope),
|
|
249
|
+
...parts.area.attrs(scope.id),
|
|
196
250
|
role: "group",
|
|
197
251
|
"data-invalid": dataAttr(invalid),
|
|
198
252
|
"data-disabled": dataAttr(disabled),
|
|
@@ -216,14 +270,13 @@ function connect(service, normalize) {
|
|
|
216
270
|
},
|
|
217
271
|
getAreaBackgroundProps(props = {}) {
|
|
218
272
|
const { xChannel, yChannel } = getAreaChannels(props);
|
|
219
|
-
const { areaGradientStyles } = getColorAreaGradient(
|
|
273
|
+
const { areaGradientStyles } = getColorAreaGradient(stableAreaValue, {
|
|
220
274
|
xChannel,
|
|
221
275
|
yChannel,
|
|
222
276
|
dir: prop("dir")
|
|
223
277
|
});
|
|
224
278
|
return normalize.element({
|
|
225
|
-
...parts.areaBackground.attrs,
|
|
226
|
-
id: dom.getAreaGradientId(scope),
|
|
279
|
+
...parts.areaBackground.attrs(scope.id),
|
|
227
280
|
"data-invalid": dataAttr(invalid),
|
|
228
281
|
"data-disabled": dataAttr(disabled),
|
|
229
282
|
"data-readonly": dataAttr(readOnly),
|
|
@@ -235,18 +288,45 @@ function connect(service, normalize) {
|
|
|
235
288
|
}
|
|
236
289
|
});
|
|
237
290
|
},
|
|
291
|
+
getGamutOverlayProps(props = {}) {
|
|
292
|
+
const data = resolveGamutOverlay(props);
|
|
293
|
+
return normalize.element({
|
|
294
|
+
...parts.gamutOverlay.attrs(scope.id),
|
|
295
|
+
viewBox: "0 0 100 100",
|
|
296
|
+
preserveAspectRatio: "none",
|
|
297
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
298
|
+
"aria-hidden": true,
|
|
299
|
+
"data-state": data ? "visible" : "hidden",
|
|
300
|
+
style: {
|
|
301
|
+
position: "absolute",
|
|
302
|
+
inset: "0",
|
|
303
|
+
width: "100%",
|
|
304
|
+
height: "100%",
|
|
305
|
+
overflow: "hidden",
|
|
306
|
+
pointerEvents: "none"
|
|
307
|
+
}
|
|
308
|
+
});
|
|
309
|
+
},
|
|
238
310
|
getAreaThumbProps(props = {}) {
|
|
239
311
|
const { xChannel, yChannel } = getAreaChannels(props);
|
|
240
312
|
const channel = { xChannel, yChannel };
|
|
241
|
-
const
|
|
242
|
-
const yPercent = 1 - areaValue.getChannelValuePercent(yChannel);
|
|
313
|
+
const dragPos = context.get("areaDragPosition");
|
|
243
314
|
const isRtl = prop("dir") === "rtl";
|
|
315
|
+
let xPercent;
|
|
316
|
+
let yPercent;
|
|
317
|
+
if (dragPos) {
|
|
318
|
+
xPercent = dragPos.x;
|
|
319
|
+
yPercent = dragPos.y;
|
|
320
|
+
} else {
|
|
321
|
+
xPercent = areaValue.getChannelValuePercent(xChannel);
|
|
322
|
+
yPercent = 1 - areaValue.getChannelValuePercent(yChannel);
|
|
323
|
+
}
|
|
244
324
|
const finalXPercent = isRtl ? 1 - xPercent : xPercent;
|
|
245
325
|
const xValue = areaValue.getChannelValue(xChannel);
|
|
246
326
|
const yValue = areaValue.getChannelValue(yChannel);
|
|
247
327
|
const color = areaValue.withChannelValue("alpha", 1).toString("css");
|
|
248
328
|
return normalize.element({
|
|
249
|
-
...parts.areaThumb.attrs,
|
|
329
|
+
...parts.areaThumb.attrs(scope.id),
|
|
250
330
|
id: dom.getAreaThumbId(scope),
|
|
251
331
|
dir: prop("dir"),
|
|
252
332
|
tabIndex: disabled ? void 0 : 0,
|
|
@@ -314,7 +394,7 @@ function connect(service, normalize) {
|
|
|
314
394
|
getTransparencyGridProps(props = {}) {
|
|
315
395
|
const { size = "12px" } = props;
|
|
316
396
|
return normalize.element({
|
|
317
|
-
...parts.transparencyGrid.attrs,
|
|
397
|
+
...parts.transparencyGrid.attrs(scope.id),
|
|
318
398
|
style: {
|
|
319
399
|
"--size": size,
|
|
320
400
|
width: "100%",
|
|
@@ -332,7 +412,7 @@ function connect(service, normalize) {
|
|
|
332
412
|
getChannelSliderProps(props) {
|
|
333
413
|
const { orientation = "horizontal", channel, format: format2 } = props;
|
|
334
414
|
return normalize.element({
|
|
335
|
-
...parts.channelSlider.attrs,
|
|
415
|
+
...parts.channelSlider.attrs(scope.id),
|
|
336
416
|
"data-channel": channel,
|
|
337
417
|
"data-orientation": orientation,
|
|
338
418
|
role: "presentation",
|
|
@@ -352,10 +432,9 @@ function connect(service, normalize) {
|
|
|
352
432
|
},
|
|
353
433
|
getChannelSliderTrackProps(props) {
|
|
354
434
|
const { orientation = "horizontal", channel, format: format2 } = props;
|
|
355
|
-
const normalizedValue = format2 ? value.toFormat(format2) :
|
|
435
|
+
const normalizedValue = format2 ? value.toFormat(format2) : stableAreaValue;
|
|
356
436
|
return normalize.element({
|
|
357
|
-
...parts.channelSliderTrack.attrs,
|
|
358
|
-
id: dom.getChannelSliderTrackId(scope, channel),
|
|
437
|
+
...parts.channelSliderTrack.attrs(scope.id),
|
|
359
438
|
role: "group",
|
|
360
439
|
"data-channel": channel,
|
|
361
440
|
"data-orientation": orientation,
|
|
@@ -374,7 +453,7 @@ function connect(service, normalize) {
|
|
|
374
453
|
getChannelSliderLabelProps(props) {
|
|
375
454
|
const { channel } = props;
|
|
376
455
|
return normalize.element({
|
|
377
|
-
...parts.channelSliderLabel.attrs,
|
|
456
|
+
...parts.channelSliderLabel.attrs(scope.id),
|
|
378
457
|
"data-channel": channel,
|
|
379
458
|
onClick(event) {
|
|
380
459
|
if (!interactive) return;
|
|
@@ -390,13 +469,13 @@ function connect(service, normalize) {
|
|
|
390
469
|
},
|
|
391
470
|
getChannelSliderValueTextProps(props) {
|
|
392
471
|
return normalize.element({
|
|
393
|
-
...parts.channelSliderValueText.attrs,
|
|
472
|
+
...parts.channelSliderValueText.attrs(scope.id),
|
|
394
473
|
"data-channel": props.channel
|
|
395
474
|
});
|
|
396
475
|
},
|
|
397
476
|
getChannelSliderThumbProps(props) {
|
|
398
477
|
const { orientation = "horizontal", channel, format: format2 } = props;
|
|
399
|
-
const normalizedValue = format2 ? value.toFormat(format2) :
|
|
478
|
+
const normalizedValue = format2 ? value.toFormat(format2) : stableAreaValue;
|
|
400
479
|
const channelRange = normalizedValue.getChannelRange(channel);
|
|
401
480
|
const channelValue = normalizedValue.getChannelValue(channel);
|
|
402
481
|
const offset = (channelValue - channelRange.minValue) / (channelRange.maxValue - channelRange.minValue);
|
|
@@ -404,7 +483,7 @@ function connect(service, normalize) {
|
|
|
404
483
|
const finalOffset = orientation === "horizontal" && isRtl ? 1 - offset : offset;
|
|
405
484
|
const placementStyles = orientation === "horizontal" ? { left: `${finalOffset * 100}%`, top: "50%" } : { top: `${offset * 100}%`, left: "50%" };
|
|
406
485
|
return normalize.element({
|
|
407
|
-
...parts.channelSliderThumb.attrs,
|
|
486
|
+
...parts.channelSliderThumb.attrs(scope.id),
|
|
408
487
|
id: dom.getChannelSliderThumbId(scope, channel),
|
|
409
488
|
role: "slider",
|
|
410
489
|
"aria-label": channel,
|
|
@@ -421,7 +500,7 @@ function connect(service, normalize) {
|
|
|
421
500
|
style: {
|
|
422
501
|
forcedColorAdjust: "none",
|
|
423
502
|
position: "absolute",
|
|
424
|
-
background: getChannelDisplayColor(
|
|
503
|
+
background: getChannelDisplayColor(stableAreaValue, channel).toString("css"),
|
|
425
504
|
...placementStyles
|
|
426
505
|
},
|
|
427
506
|
onFocus() {
|
|
@@ -476,7 +555,7 @@ function connect(service, normalize) {
|
|
|
476
555
|
const isTextField = channel === "hex" || channel === "css";
|
|
477
556
|
const channelRange = getChannelRange(value, channel);
|
|
478
557
|
return normalize.input({
|
|
479
|
-
...parts.channelInput.attrs,
|
|
558
|
+
...parts.channelInput.attrs(scope.id),
|
|
480
559
|
dir: prop("dir"),
|
|
481
560
|
type: isTextField ? "text" : "number",
|
|
482
561
|
"data-channel": channel,
|
|
@@ -541,7 +620,7 @@ function connect(service, normalize) {
|
|
|
541
620
|
},
|
|
542
621
|
getEyeDropperTriggerProps() {
|
|
543
622
|
return normalize.button({
|
|
544
|
-
...parts.eyeDropperTrigger.attrs,
|
|
623
|
+
...parts.eyeDropperTrigger.attrs(scope.id),
|
|
545
624
|
type: "button",
|
|
546
625
|
dir: prop("dir"),
|
|
547
626
|
disabled,
|
|
@@ -557,7 +636,7 @@ function connect(service, normalize) {
|
|
|
557
636
|
},
|
|
558
637
|
getSwatchGroupProps() {
|
|
559
638
|
return normalize.element({
|
|
560
|
-
...parts.swatchGroup.attrs,
|
|
639
|
+
...parts.swatchGroup.attrs(scope.id),
|
|
561
640
|
role: "group"
|
|
562
641
|
});
|
|
563
642
|
},
|
|
@@ -565,7 +644,7 @@ function connect(service, normalize) {
|
|
|
565
644
|
getSwatchTriggerProps(props) {
|
|
566
645
|
const swatchState = getSwatchTriggerState(props);
|
|
567
646
|
return normalize.button({
|
|
568
|
-
...parts.swatchTrigger.attrs,
|
|
647
|
+
...parts.swatchTrigger.attrs(scope.id),
|
|
569
648
|
disabled: swatchState.disabled,
|
|
570
649
|
dir: prop("dir"),
|
|
571
650
|
type: "button",
|
|
@@ -586,7 +665,7 @@ function connect(service, normalize) {
|
|
|
586
665
|
getSwatchIndicatorProps(props) {
|
|
587
666
|
const swatchState = getSwatchTriggerState(props);
|
|
588
667
|
return normalize.element({
|
|
589
|
-
...parts.swatchIndicator.attrs,
|
|
668
|
+
...parts.swatchIndicator.attrs(scope.id),
|
|
590
669
|
dir: prop("dir"),
|
|
591
670
|
hidden: !swatchState.checked
|
|
592
671
|
});
|
|
@@ -596,7 +675,7 @@ function connect(service, normalize) {
|
|
|
596
675
|
const swatchState = getSwatchTriggerState(props);
|
|
597
676
|
const color = swatchState.value.toString(respectAlpha ? "css" : "hex");
|
|
598
677
|
return normalize.element({
|
|
599
|
-
...parts.swatch.attrs,
|
|
678
|
+
...parts.swatch.attrs(scope.id),
|
|
600
679
|
dir: prop("dir"),
|
|
601
680
|
"data-state": swatchState.checked ? "checked" : "unchecked",
|
|
602
681
|
"data-value": swatchState.valueAsString,
|
|
@@ -609,7 +688,7 @@ function connect(service, normalize) {
|
|
|
609
688
|
},
|
|
610
689
|
getFormatTriggerProps() {
|
|
611
690
|
return normalize.button({
|
|
612
|
-
...parts.formatTrigger.attrs,
|
|
691
|
+
...parts.formatTrigger.attrs(scope.id),
|
|
613
692
|
dir: prop("dir"),
|
|
614
693
|
type: "button",
|
|
615
694
|
"aria-label": `change color format to ${getNextFormat(format)}`,
|
|
@@ -622,7 +701,7 @@ function connect(service, normalize) {
|
|
|
622
701
|
},
|
|
623
702
|
getFormatSelectProps() {
|
|
624
703
|
return normalize.select({
|
|
625
|
-
...parts.formatSelect.attrs,
|
|
704
|
+
...parts.formatSelect.attrs(scope.id),
|
|
626
705
|
"aria-label": "change color format",
|
|
627
706
|
dir: prop("dir"),
|
|
628
707
|
defaultValue: prop("format"),
|
|
@@ -635,7 +714,7 @@ function connect(service, normalize) {
|
|
|
635
714
|
}
|
|
636
715
|
};
|
|
637
716
|
}
|
|
638
|
-
var formats = ["hsba", "hsla", "rgba"];
|
|
717
|
+
var formats = ["hsba", "hsla", "rgba", "oklab", "oklch"];
|
|
639
718
|
var formatRegex = new RegExp(`^(${formats.join("|")})$`);
|
|
640
719
|
function getNextFormat(format) {
|
|
641
720
|
const index = formats.indexOf(format);
|
package/dist/color-picker.dom.js
CHANGED
|
@@ -50,22 +50,23 @@ __export(color_picker_dom_exports, {
|
|
|
50
50
|
});
|
|
51
51
|
module.exports = __toCommonJS(color_picker_dom_exports);
|
|
52
52
|
var import_dom_query = require("@zag-js/dom-query");
|
|
53
|
-
var
|
|
54
|
-
var
|
|
55
|
-
var
|
|
56
|
-
var
|
|
57
|
-
var
|
|
58
|
-
var
|
|
59
|
-
var
|
|
60
|
-
var
|
|
61
|
-
var
|
|
62
|
-
var
|
|
63
|
-
var
|
|
64
|
-
var
|
|
65
|
-
var
|
|
66
|
-
var
|
|
67
|
-
var
|
|
68
|
-
var
|
|
53
|
+
var import_color_picker = require("./color-picker.anatomy.js");
|
|
54
|
+
var getRootId = (ctx) => ctx.ids?.root ?? `${ctx.id}`;
|
|
55
|
+
var getLabelId = (ctx) => ctx.ids?.label ?? `${ctx.id}:label`;
|
|
56
|
+
var getHiddenInputId = (ctx) => ctx.ids?.hiddenInput ?? `${ctx.id}:hidden-input`;
|
|
57
|
+
var getControlId = (ctx) => ctx.ids?.control ?? `${ctx.id}:control`;
|
|
58
|
+
var getTriggerId = (ctx) => ctx.ids?.trigger ?? `${ctx.id}:trigger`;
|
|
59
|
+
var getContentId = (ctx) => ctx.ids?.content ?? `${ctx.id}:content`;
|
|
60
|
+
var getPositionerId = (ctx) => ctx.ids?.positioner ?? `${ctx.id}:positioner`;
|
|
61
|
+
var getFormatSelectId = (ctx) => ctx.ids?.formatSelect ?? `${ctx.id}:format-select`;
|
|
62
|
+
var getAreaId = (ctx) => ctx.ids?.area ?? `${ctx.id}:area`;
|
|
63
|
+
var getAreaGradientId = (ctx) => ctx.ids?.areaGradient ?? `${ctx.id}:area-gradient`;
|
|
64
|
+
var getAreaThumbId = (ctx) => ctx.ids?.areaThumb ?? `${ctx.id}:area-thumb`;
|
|
65
|
+
var getChannelSliderTrackId = (ctx, channel) => ctx.ids?.channelSliderTrack?.(channel) ?? `${ctx.id}:slider-track:${channel}`;
|
|
66
|
+
var getChannelSliderThumbId = (ctx, channel) => ctx.ids?.channelSliderThumb?.(channel) ?? `${ctx.id}:slider-thumb:${channel}`;
|
|
67
|
+
var getContentEl = (ctx) => ctx.query(ctx.selector(import_color_picker.parts.content));
|
|
68
|
+
var getAreaThumbEl = (ctx) => ctx.query(ctx.selector(import_color_picker.parts.areaThumb));
|
|
69
|
+
var getChannelSliderThumbEl = (ctx, channel) => ctx.query(`${ctx.selector(import_color_picker.parts.channelSliderThumb)}[data-channel="${channel}"]`);
|
|
69
70
|
var getChannelInputEl = (ctx, channel) => {
|
|
70
71
|
const selector = `input[data-channel="${channel}"]`;
|
|
71
72
|
return [
|
|
@@ -73,9 +74,9 @@ var getChannelInputEl = (ctx, channel) => {
|
|
|
73
74
|
...(0, import_dom_query.queryAll)(getControlEl(ctx), selector)
|
|
74
75
|
];
|
|
75
76
|
};
|
|
76
|
-
var getFormatSelectEl = (ctx) => ctx.
|
|
77
|
+
var getFormatSelectEl = (ctx) => ctx.query(ctx.selector(import_color_picker.parts.formatSelect));
|
|
77
78
|
var getHiddenInputEl = (ctx) => ctx.getById(getHiddenInputId(ctx));
|
|
78
|
-
var getAreaEl = (ctx) => ctx.
|
|
79
|
+
var getAreaEl = (ctx) => ctx.query(ctx.selector(import_color_picker.parts.area));
|
|
79
80
|
var getAreaValueFromPoint = (ctx, point, dir) => {
|
|
80
81
|
const areaEl = getAreaEl(ctx);
|
|
81
82
|
if (!areaEl) return;
|
|
@@ -85,10 +86,10 @@ var getAreaValueFromPoint = (ctx, point, dir) => {
|
|
|
85
86
|
y: getPercentValue({ orientation: "vertical" })
|
|
86
87
|
};
|
|
87
88
|
};
|
|
88
|
-
var getControlEl = (ctx) => ctx.
|
|
89
|
-
var getTriggerEl = (ctx) => ctx.
|
|
90
|
-
var getPositionerEl = (ctx) => ctx.
|
|
91
|
-
var getChannelSliderTrackEl = (ctx, channel) => ctx.
|
|
89
|
+
var getControlEl = (ctx) => ctx.query(ctx.selector(import_color_picker.parts.control));
|
|
90
|
+
var getTriggerEl = (ctx) => ctx.query(ctx.selector(import_color_picker.parts.trigger));
|
|
91
|
+
var getPositionerEl = (ctx) => ctx.query(ctx.selector(import_color_picker.parts.positioner));
|
|
92
|
+
var getChannelSliderTrackEl = (ctx, channel) => ctx.query(`${ctx.selector(import_color_picker.parts.channelSliderTrack)}[data-channel="${channel}"]`);
|
|
92
93
|
var getChannelSliderValueFromPoint = (ctx, point, channel, dir) => {
|
|
93
94
|
const trackEl = getChannelSliderTrackEl(ctx, channel);
|
|
94
95
|
if (!trackEl) return;
|
|
@@ -1,21 +1,22 @@
|
|
|
1
1
|
// src/color-picker.dom.ts
|
|
2
2
|
import { getRelativePoint, queryAll } from "@zag-js/dom-query";
|
|
3
|
-
|
|
4
|
-
var
|
|
5
|
-
var
|
|
6
|
-
var
|
|
7
|
-
var
|
|
8
|
-
var
|
|
9
|
-
var
|
|
10
|
-
var
|
|
11
|
-
var
|
|
12
|
-
var
|
|
13
|
-
var
|
|
14
|
-
var
|
|
15
|
-
var
|
|
16
|
-
var
|
|
17
|
-
var
|
|
18
|
-
var
|
|
3
|
+
import { parts } from "./color-picker.anatomy.mjs";
|
|
4
|
+
var getRootId = (ctx) => ctx.ids?.root ?? `${ctx.id}`;
|
|
5
|
+
var getLabelId = (ctx) => ctx.ids?.label ?? `${ctx.id}:label`;
|
|
6
|
+
var getHiddenInputId = (ctx) => ctx.ids?.hiddenInput ?? `${ctx.id}:hidden-input`;
|
|
7
|
+
var getControlId = (ctx) => ctx.ids?.control ?? `${ctx.id}:control`;
|
|
8
|
+
var getTriggerId = (ctx) => ctx.ids?.trigger ?? `${ctx.id}:trigger`;
|
|
9
|
+
var getContentId = (ctx) => ctx.ids?.content ?? `${ctx.id}:content`;
|
|
10
|
+
var getPositionerId = (ctx) => ctx.ids?.positioner ?? `${ctx.id}:positioner`;
|
|
11
|
+
var getFormatSelectId = (ctx) => ctx.ids?.formatSelect ?? `${ctx.id}:format-select`;
|
|
12
|
+
var getAreaId = (ctx) => ctx.ids?.area ?? `${ctx.id}:area`;
|
|
13
|
+
var getAreaGradientId = (ctx) => ctx.ids?.areaGradient ?? `${ctx.id}:area-gradient`;
|
|
14
|
+
var getAreaThumbId = (ctx) => ctx.ids?.areaThumb ?? `${ctx.id}:area-thumb`;
|
|
15
|
+
var getChannelSliderTrackId = (ctx, channel) => ctx.ids?.channelSliderTrack?.(channel) ?? `${ctx.id}:slider-track:${channel}`;
|
|
16
|
+
var getChannelSliderThumbId = (ctx, channel) => ctx.ids?.channelSliderThumb?.(channel) ?? `${ctx.id}:slider-thumb:${channel}`;
|
|
17
|
+
var getContentEl = (ctx) => ctx.query(ctx.selector(parts.content));
|
|
18
|
+
var getAreaThumbEl = (ctx) => ctx.query(ctx.selector(parts.areaThumb));
|
|
19
|
+
var getChannelSliderThumbEl = (ctx, channel) => ctx.query(`${ctx.selector(parts.channelSliderThumb)}[data-channel="${channel}"]`);
|
|
19
20
|
var getChannelInputEl = (ctx, channel) => {
|
|
20
21
|
const selector = `input[data-channel="${channel}"]`;
|
|
21
22
|
return [
|
|
@@ -23,9 +24,9 @@ var getChannelInputEl = (ctx, channel) => {
|
|
|
23
24
|
...queryAll(getControlEl(ctx), selector)
|
|
24
25
|
];
|
|
25
26
|
};
|
|
26
|
-
var getFormatSelectEl = (ctx) => ctx.
|
|
27
|
+
var getFormatSelectEl = (ctx) => ctx.query(ctx.selector(parts.formatSelect));
|
|
27
28
|
var getHiddenInputEl = (ctx) => ctx.getById(getHiddenInputId(ctx));
|
|
28
|
-
var getAreaEl = (ctx) => ctx.
|
|
29
|
+
var getAreaEl = (ctx) => ctx.query(ctx.selector(parts.area));
|
|
29
30
|
var getAreaValueFromPoint = (ctx, point, dir) => {
|
|
30
31
|
const areaEl = getAreaEl(ctx);
|
|
31
32
|
if (!areaEl) return;
|
|
@@ -35,10 +36,10 @@ var getAreaValueFromPoint = (ctx, point, dir) => {
|
|
|
35
36
|
y: getPercentValue({ orientation: "vertical" })
|
|
36
37
|
};
|
|
37
38
|
};
|
|
38
|
-
var getControlEl = (ctx) => ctx.
|
|
39
|
-
var getTriggerEl = (ctx) => ctx.
|
|
40
|
-
var getPositionerEl = (ctx) => ctx.
|
|
41
|
-
var getChannelSliderTrackEl = (ctx, channel) => ctx.
|
|
39
|
+
var getControlEl = (ctx) => ctx.query(ctx.selector(parts.control));
|
|
40
|
+
var getTriggerEl = (ctx) => ctx.query(ctx.selector(parts.trigger));
|
|
41
|
+
var getPositionerEl = (ctx) => ctx.query(ctx.selector(parts.positioner));
|
|
42
|
+
var getChannelSliderTrackEl = (ctx, channel) => ctx.query(`${ctx.selector(parts.channelSliderTrack)}[data-channel="${channel}"]`);
|
|
42
43
|
var getChannelSliderValueFromPoint = (ctx, point, channel, dir) => {
|
|
43
44
|
const trackEl = getChannelSliderTrackEl(ctx, channel);
|
|
44
45
|
if (!trackEl) return;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import * as _zag_js_core from '@zag-js/core';
|
|
2
2
|
import { ColorPickerSchema } from './color-picker.types.mjs';
|
|
3
3
|
import '@zag-js/color-utils';
|
|
4
|
+
import './utils/get-gamut-overlay-path.mjs';
|
|
4
5
|
import '@zag-js/dismissable';
|
|
5
6
|
import '@zag-js/popper';
|
|
6
7
|
import '@zag-js/types';
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import * as _zag_js_core from '@zag-js/core';
|
|
2
2
|
import { ColorPickerSchema } from './color-picker.types.js';
|
|
3
3
|
import '@zag-js/color-utils';
|
|
4
|
+
import './utils/get-gamut-overlay-path.js';
|
|
4
5
|
import '@zag-js/dismissable';
|
|
5
6
|
import '@zag-js/popper';
|
|
6
7
|
import '@zag-js/types';
|