@ambientcss/components 1.0.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.
- package/README.md +27 -0
- package/dist/index.cjs +470 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +69 -0
- package/dist/index.d.ts +69 -0
- package/dist/index.js +437 -0
- package/dist/index.js.map +1 -0
- package/dist/styles.css +273 -0
- package/package.json +59 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { PropsWithChildren, CSSProperties, HTMLAttributes, ButtonHTMLAttributes } from 'react';
|
|
3
|
+
|
|
4
|
+
type AmbientTheme = {
|
|
5
|
+
lightX?: number;
|
|
6
|
+
lightY?: number;
|
|
7
|
+
keyLight?: number;
|
|
8
|
+
fillLight?: number;
|
|
9
|
+
lightHue?: number;
|
|
10
|
+
lightSaturation?: number;
|
|
11
|
+
highlightColor?: string;
|
|
12
|
+
lumeHue?: number;
|
|
13
|
+
};
|
|
14
|
+
type AmbientProviderProps = PropsWithChildren<{
|
|
15
|
+
className?: string;
|
|
16
|
+
style?: CSSProperties;
|
|
17
|
+
theme?: AmbientTheme;
|
|
18
|
+
}>;
|
|
19
|
+
declare function AmbientProvider({ children, className, style, theme }: AmbientProviderProps): react_jsx_runtime.JSX.Element;
|
|
20
|
+
|
|
21
|
+
type AmbientPanelProps = HTMLAttributes<HTMLDivElement>;
|
|
22
|
+
declare function AmbientPanel({ className, ...props }: AmbientPanelProps): react_jsx_runtime.JSX.Element;
|
|
23
|
+
|
|
24
|
+
type AmbientButtonProps = ButtonHTMLAttributes<HTMLButtonElement>;
|
|
25
|
+
declare function AmbientButton({ className, children, ...props }: AmbientButtonProps): react_jsx_runtime.JSX.Element;
|
|
26
|
+
|
|
27
|
+
type AmbientSwitchSize = "sm" | "md" | "lg";
|
|
28
|
+
type AmbientSwitchProps = Omit<ButtonHTMLAttributes<HTMLButtonElement>, "onChange"> & {
|
|
29
|
+
checked?: boolean;
|
|
30
|
+
defaultChecked?: boolean;
|
|
31
|
+
onCheckedChange?: (checked: boolean) => void;
|
|
32
|
+
size?: AmbientSwitchSize;
|
|
33
|
+
label?: string;
|
|
34
|
+
/** Show a small LED indicator that lights up when the switch is on. Pass `true` for default green or a CSS color string. */
|
|
35
|
+
led?: boolean | string;
|
|
36
|
+
};
|
|
37
|
+
declare function AmbientSwitch({ className, checked, defaultChecked, onCheckedChange, onClick, size, label, led, children, ...props }: AmbientSwitchProps): react_jsx_runtime.JSX.Element;
|
|
38
|
+
|
|
39
|
+
type AmbientKnobProps = Omit<HTMLAttributes<HTMLDivElement>, "onChange"> & {
|
|
40
|
+
value: number;
|
|
41
|
+
min?: number;
|
|
42
|
+
max?: number;
|
|
43
|
+
step?: number;
|
|
44
|
+
label?: string;
|
|
45
|
+
onChange?: (nextValue: number) => void;
|
|
46
|
+
};
|
|
47
|
+
declare function AmbientKnob({ value, min, max, step, label, onChange, className, ...props }: AmbientKnobProps): react_jsx_runtime.JSX.Element;
|
|
48
|
+
|
|
49
|
+
type AmbientFaderProps = Omit<HTMLAttributes<HTMLDivElement>, "onChange"> & {
|
|
50
|
+
value: number;
|
|
51
|
+
min?: number;
|
|
52
|
+
max?: number;
|
|
53
|
+
step?: number;
|
|
54
|
+
label?: string;
|
|
55
|
+
onChange?: (nextValue: number) => void;
|
|
56
|
+
};
|
|
57
|
+
declare function AmbientFader({ value, min, max, step, label, onChange, className, ...props }: AmbientFaderProps): react_jsx_runtime.JSX.Element;
|
|
58
|
+
|
|
59
|
+
type AmbientSliderProps = Omit<HTMLAttributes<HTMLDivElement>, "onChange"> & {
|
|
60
|
+
value: number;
|
|
61
|
+
min?: number;
|
|
62
|
+
max?: number;
|
|
63
|
+
step?: number;
|
|
64
|
+
label?: string;
|
|
65
|
+
onChange?: (nextValue: number) => void;
|
|
66
|
+
};
|
|
67
|
+
declare function AmbientSlider({ value, min, max, step, label, onChange, className, ...props }: AmbientSliderProps): react_jsx_runtime.JSX.Element;
|
|
68
|
+
|
|
69
|
+
export { AmbientButton, type AmbientButtonProps, AmbientFader, type AmbientFaderProps, AmbientKnob, type AmbientKnobProps, AmbientPanel, type AmbientPanelProps, AmbientProvider, type AmbientProviderProps, AmbientSlider, type AmbientSliderProps, AmbientSwitch, type AmbientSwitchProps, type AmbientSwitchSize, type AmbientTheme };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,437 @@
|
|
|
1
|
+
// src/components/AmbientProvider.tsx
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
var VAR_MAP = {
|
|
4
|
+
"--amb-light-x": "lightX",
|
|
5
|
+
"--amb-light-y": "lightY",
|
|
6
|
+
"--amb-key-light-intensity": "keyLight",
|
|
7
|
+
"--amb-fill-light-intensity": "fillLight",
|
|
8
|
+
"--amb-light-hue": "lightHue",
|
|
9
|
+
"--amb-light-saturation": "lightSaturation",
|
|
10
|
+
"--amb-highlight-color": "highlightColor",
|
|
11
|
+
"--amb-lume-hue": "lumeHue"
|
|
12
|
+
};
|
|
13
|
+
function AmbientProvider({ children, className, style, theme }) {
|
|
14
|
+
const themeVars = {};
|
|
15
|
+
for (const [varName, key] of Object.entries(VAR_MAP)) {
|
|
16
|
+
const value = theme?.[key];
|
|
17
|
+
if (value !== void 0) {
|
|
18
|
+
themeVars[varName] = key === "lightSaturation" ? `${value}%` : String(value);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
const mergedStyle = { ...themeVars, ...style };
|
|
22
|
+
return /* @__PURE__ */ jsx("div", { className, style: mergedStyle, children });
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// src/lib/cn.ts
|
|
26
|
+
function cn(...values) {
|
|
27
|
+
return values.filter(Boolean).join(" ");
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// src/components/AmbientPanel.tsx
|
|
31
|
+
import { jsx as jsx2 } from "react/jsx-runtime";
|
|
32
|
+
function AmbientPanel({ className, ...props }) {
|
|
33
|
+
return /* @__PURE__ */ jsx2("div", { className: cn("ambient amb-surface amb-chamfer amb-elevation-2 ambx-panel", className), ...props });
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// src/components/AmbientButton.tsx
|
|
37
|
+
import { jsx as jsx3 } from "react/jsx-runtime";
|
|
38
|
+
function AmbientButton({ className, children, ...props }) {
|
|
39
|
+
return /* @__PURE__ */ jsx3(
|
|
40
|
+
"button",
|
|
41
|
+
{
|
|
42
|
+
type: "button",
|
|
43
|
+
className: cn("ambient amb-button amb-chamfer amb-elevation-1 ambx-button amb-heading-3", className),
|
|
44
|
+
...props,
|
|
45
|
+
children
|
|
46
|
+
}
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// src/components/AmbientSwitch.tsx
|
|
51
|
+
import { useId, useState } from "react";
|
|
52
|
+
import { jsx as jsx4, jsxs } from "react/jsx-runtime";
|
|
53
|
+
function AmbientSwitch({
|
|
54
|
+
className,
|
|
55
|
+
checked,
|
|
56
|
+
defaultChecked,
|
|
57
|
+
onCheckedChange,
|
|
58
|
+
onClick,
|
|
59
|
+
size = "md",
|
|
60
|
+
label,
|
|
61
|
+
led,
|
|
62
|
+
children,
|
|
63
|
+
...props
|
|
64
|
+
}) {
|
|
65
|
+
const labelId = useId();
|
|
66
|
+
const isControlled = checked !== void 0;
|
|
67
|
+
const [internalChecked, setInternalChecked] = useState(defaultChecked ?? false);
|
|
68
|
+
const active = isControlled ? checked ?? false : internalChecked;
|
|
69
|
+
const button = /* @__PURE__ */ jsxs(
|
|
70
|
+
"button",
|
|
71
|
+
{
|
|
72
|
+
type: "button",
|
|
73
|
+
role: "switch",
|
|
74
|
+
"aria-checked": active,
|
|
75
|
+
"aria-labelledby": label ? labelId : props["aria-labelledby"],
|
|
76
|
+
className: cn(
|
|
77
|
+
"ambient amb-switch amb-chamfer amb-elevation-1 amb-heading-3",
|
|
78
|
+
active ? "amb-surface-convex amb-switch-on" : "amb-surface-concave",
|
|
79
|
+
"ambx-switch",
|
|
80
|
+
`ambx-switch-${size}`,
|
|
81
|
+
className
|
|
82
|
+
),
|
|
83
|
+
onClick: (event) => {
|
|
84
|
+
const next = !active;
|
|
85
|
+
if (!isControlled) setInternalChecked(next);
|
|
86
|
+
onCheckedChange?.(next);
|
|
87
|
+
onClick?.(event);
|
|
88
|
+
},
|
|
89
|
+
...props,
|
|
90
|
+
children: [
|
|
91
|
+
led ? /* @__PURE__ */ jsx4(
|
|
92
|
+
"span",
|
|
93
|
+
{
|
|
94
|
+
className: cn("amb-led", !active && "amb-led-off"),
|
|
95
|
+
style: typeof led === "string" ? { "--amb-led-color": led } : void 0
|
|
96
|
+
}
|
|
97
|
+
) : null,
|
|
98
|
+
children
|
|
99
|
+
]
|
|
100
|
+
}
|
|
101
|
+
);
|
|
102
|
+
if (!label) return button;
|
|
103
|
+
return /* @__PURE__ */ jsxs("div", { className: "ambx-stack", children: [
|
|
104
|
+
button,
|
|
105
|
+
/* @__PURE__ */ jsx4("span", { id: labelId, className: "ambx-label", children: label })
|
|
106
|
+
] });
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// src/components/AmbientKnob.tsx
|
|
110
|
+
import { useId as useId2, useRef } from "react";
|
|
111
|
+
import { jsx as jsx5, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
112
|
+
function clamp(value, min, max) {
|
|
113
|
+
return Math.min(max, Math.max(min, value));
|
|
114
|
+
}
|
|
115
|
+
function AmbientKnob({
|
|
116
|
+
value,
|
|
117
|
+
min = 0,
|
|
118
|
+
max = 100,
|
|
119
|
+
step = 1,
|
|
120
|
+
label,
|
|
121
|
+
onChange,
|
|
122
|
+
className,
|
|
123
|
+
...props
|
|
124
|
+
}) {
|
|
125
|
+
const id = useId2();
|
|
126
|
+
const dragStateRef = useRef(null);
|
|
127
|
+
const safeStep = step > 0 ? step : 1;
|
|
128
|
+
const percent = (value - min) / (max - min || 1);
|
|
129
|
+
const rotation = percent * 270 - 135;
|
|
130
|
+
const updateFromPointer = (event) => {
|
|
131
|
+
const drag = dragStateRef.current;
|
|
132
|
+
if (!drag) return;
|
|
133
|
+
const delta = drag.startY - event.clientY;
|
|
134
|
+
const range = max - min;
|
|
135
|
+
const sensitivity = range / 180;
|
|
136
|
+
const raw = drag.startValue + delta * sensitivity;
|
|
137
|
+
const snapped = Math.round(raw / safeStep) * safeStep;
|
|
138
|
+
onChange?.(clamp(snapped, min, max));
|
|
139
|
+
};
|
|
140
|
+
const setValue = (nextValue) => {
|
|
141
|
+
const snapped = Math.round(nextValue / safeStep) * safeStep;
|
|
142
|
+
onChange?.(clamp(snapped, min, max));
|
|
143
|
+
};
|
|
144
|
+
const onKeyDown = (event) => {
|
|
145
|
+
const pageStep = safeStep * 10;
|
|
146
|
+
switch (event.key) {
|
|
147
|
+
case "ArrowUp":
|
|
148
|
+
case "ArrowRight":
|
|
149
|
+
event.preventDefault();
|
|
150
|
+
setValue(value + safeStep);
|
|
151
|
+
break;
|
|
152
|
+
case "ArrowDown":
|
|
153
|
+
case "ArrowLeft":
|
|
154
|
+
event.preventDefault();
|
|
155
|
+
setValue(value - safeStep);
|
|
156
|
+
break;
|
|
157
|
+
case "PageUp":
|
|
158
|
+
event.preventDefault();
|
|
159
|
+
setValue(value + pageStep);
|
|
160
|
+
break;
|
|
161
|
+
case "PageDown":
|
|
162
|
+
event.preventDefault();
|
|
163
|
+
setValue(value - pageStep);
|
|
164
|
+
break;
|
|
165
|
+
case "Home":
|
|
166
|
+
event.preventDefault();
|
|
167
|
+
setValue(min);
|
|
168
|
+
break;
|
|
169
|
+
case "End":
|
|
170
|
+
event.preventDefault();
|
|
171
|
+
setValue(max);
|
|
172
|
+
break;
|
|
173
|
+
default:
|
|
174
|
+
break;
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
return /* @__PURE__ */ jsxs2("div", { className: cn("ambx-stack", className), ...props, children: [
|
|
178
|
+
/* @__PURE__ */ jsx5(
|
|
179
|
+
"div",
|
|
180
|
+
{
|
|
181
|
+
className: "ambient amb-knob amb-chamfer amb-elevation-2 amb-surface ambx-knob",
|
|
182
|
+
role: "slider",
|
|
183
|
+
"aria-label": label,
|
|
184
|
+
"aria-valuemin": min,
|
|
185
|
+
"aria-valuemax": max,
|
|
186
|
+
"aria-valuenow": value,
|
|
187
|
+
"aria-labelledby": label ? id : void 0,
|
|
188
|
+
"aria-orientation": "vertical",
|
|
189
|
+
tabIndex: 0,
|
|
190
|
+
onPointerDown: (event) => {
|
|
191
|
+
event.currentTarget.setPointerCapture(event.pointerId);
|
|
192
|
+
dragStateRef.current = { startY: event.clientY, startValue: value };
|
|
193
|
+
},
|
|
194
|
+
onPointerMove: updateFromPointer,
|
|
195
|
+
onPointerUp: () => {
|
|
196
|
+
dragStateRef.current = null;
|
|
197
|
+
},
|
|
198
|
+
onPointerCancel: () => {
|
|
199
|
+
dragStateRef.current = null;
|
|
200
|
+
},
|
|
201
|
+
onKeyDown,
|
|
202
|
+
children: /* @__PURE__ */ jsx5("div", { className: "ambx-knob-rotation", style: { transform: `rotate(${rotation}deg)` }, children: /* @__PURE__ */ jsx5("div", { className: "amb-knob-indicator", children: /* @__PURE__ */ jsxs2("div", { className: "amb-knob-grip", children: [
|
|
203
|
+
/* @__PURE__ */ jsx5("span", { className: "amb-fader-dot" }),
|
|
204
|
+
/* @__PURE__ */ jsx5("span", { className: "amb-fader-dot" }),
|
|
205
|
+
/* @__PURE__ */ jsx5("span", { className: "amb-fader-dot" })
|
|
206
|
+
] }) }) })
|
|
207
|
+
}
|
|
208
|
+
),
|
|
209
|
+
label ? /* @__PURE__ */ jsx5("span", { id, className: "ambx-label", children: label }) : null
|
|
210
|
+
] });
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// src/components/AmbientFader.tsx
|
|
214
|
+
import { useId as useId3, useRef as useRef2 } from "react";
|
|
215
|
+
import { jsx as jsx6, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
216
|
+
function clamp2(value, min, max) {
|
|
217
|
+
return Math.min(max, Math.max(min, value));
|
|
218
|
+
}
|
|
219
|
+
function AmbientFader({
|
|
220
|
+
value,
|
|
221
|
+
min = 0,
|
|
222
|
+
max = 100,
|
|
223
|
+
step = 1,
|
|
224
|
+
label,
|
|
225
|
+
onChange,
|
|
226
|
+
className,
|
|
227
|
+
...props
|
|
228
|
+
}) {
|
|
229
|
+
const id = useId3();
|
|
230
|
+
const trackRef = useRef2(null);
|
|
231
|
+
const safeStep = step > 0 ? step : 1;
|
|
232
|
+
const percent = (value - min) / (max - min || 1) * 100;
|
|
233
|
+
const updateFromClientY = (clientY) => {
|
|
234
|
+
const track = trackRef.current;
|
|
235
|
+
if (!track) return;
|
|
236
|
+
const rect = track.getBoundingClientRect();
|
|
237
|
+
const ratio = 1 - (clientY - rect.top) / rect.height;
|
|
238
|
+
const nextValue = min + clamp2(ratio, 0, 1) * (max - min);
|
|
239
|
+
const snapped = Math.round(nextValue / safeStep) * safeStep;
|
|
240
|
+
onChange?.(clamp2(snapped, min, max));
|
|
241
|
+
};
|
|
242
|
+
const setValue = (nextValue) => {
|
|
243
|
+
const snapped = Math.round(nextValue / safeStep) * safeStep;
|
|
244
|
+
onChange?.(clamp2(snapped, min, max));
|
|
245
|
+
};
|
|
246
|
+
const onKeyDown = (event) => {
|
|
247
|
+
const pageStep = safeStep * 10;
|
|
248
|
+
switch (event.key) {
|
|
249
|
+
case "ArrowUp":
|
|
250
|
+
case "ArrowRight":
|
|
251
|
+
event.preventDefault();
|
|
252
|
+
setValue(value + safeStep);
|
|
253
|
+
break;
|
|
254
|
+
case "ArrowDown":
|
|
255
|
+
case "ArrowLeft":
|
|
256
|
+
event.preventDefault();
|
|
257
|
+
setValue(value - safeStep);
|
|
258
|
+
break;
|
|
259
|
+
case "PageUp":
|
|
260
|
+
event.preventDefault();
|
|
261
|
+
setValue(value + pageStep);
|
|
262
|
+
break;
|
|
263
|
+
case "PageDown":
|
|
264
|
+
event.preventDefault();
|
|
265
|
+
setValue(value - pageStep);
|
|
266
|
+
break;
|
|
267
|
+
case "Home":
|
|
268
|
+
event.preventDefault();
|
|
269
|
+
setValue(min);
|
|
270
|
+
break;
|
|
271
|
+
case "End":
|
|
272
|
+
event.preventDefault();
|
|
273
|
+
setValue(max);
|
|
274
|
+
break;
|
|
275
|
+
default:
|
|
276
|
+
break;
|
|
277
|
+
}
|
|
278
|
+
};
|
|
279
|
+
const onPointerMove = (event) => {
|
|
280
|
+
if (event.buttons !== 1) return;
|
|
281
|
+
updateFromClientY(event.clientY);
|
|
282
|
+
};
|
|
283
|
+
return /* @__PURE__ */ jsxs3("div", { className: cn("ambx-stack", className), ...props, children: [
|
|
284
|
+
/* @__PURE__ */ jsx6(
|
|
285
|
+
"div",
|
|
286
|
+
{
|
|
287
|
+
className: "amb-fader ambx-fader",
|
|
288
|
+
ref: trackRef,
|
|
289
|
+
role: "slider",
|
|
290
|
+
"aria-label": label,
|
|
291
|
+
"aria-labelledby": label ? id : void 0,
|
|
292
|
+
"aria-valuemin": min,
|
|
293
|
+
"aria-valuemax": max,
|
|
294
|
+
"aria-valuenow": value,
|
|
295
|
+
"aria-orientation": "vertical",
|
|
296
|
+
tabIndex: 0,
|
|
297
|
+
onPointerDown: (event) => {
|
|
298
|
+
event.currentTarget.setPointerCapture(event.pointerId);
|
|
299
|
+
updateFromClientY(event.clientY);
|
|
300
|
+
},
|
|
301
|
+
onPointerMove,
|
|
302
|
+
onKeyDown,
|
|
303
|
+
children: /* @__PURE__ */ jsx6(
|
|
304
|
+
"div",
|
|
305
|
+
{
|
|
306
|
+
className: "amb-fader-thumb ambient amb-fillet amb-elevation-1 amb-surface-concave ambx-fader-thumb",
|
|
307
|
+
style: { top: `${100 - percent}%` },
|
|
308
|
+
children: /* @__PURE__ */ jsxs3("div", { className: "amb-fader-grip", children: [
|
|
309
|
+
/* @__PURE__ */ jsx6("span", { className: "amb-fader-dot" }),
|
|
310
|
+
/* @__PURE__ */ jsx6("span", { className: "amb-fader-dot" }),
|
|
311
|
+
/* @__PURE__ */ jsx6("span", { className: "amb-fader-dot" })
|
|
312
|
+
] })
|
|
313
|
+
}
|
|
314
|
+
)
|
|
315
|
+
}
|
|
316
|
+
),
|
|
317
|
+
label ? /* @__PURE__ */ jsx6("span", { id, className: "ambx-label", children: label }) : null
|
|
318
|
+
] });
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
// src/components/AmbientSlider.tsx
|
|
322
|
+
import { useId as useId4, useRef as useRef3 } from "react";
|
|
323
|
+
import { jsx as jsx7, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
324
|
+
function clamp3(value, min, max) {
|
|
325
|
+
return Math.min(max, Math.max(min, value));
|
|
326
|
+
}
|
|
327
|
+
function AmbientSlider({
|
|
328
|
+
value,
|
|
329
|
+
min = 0,
|
|
330
|
+
max = 100,
|
|
331
|
+
step = 1,
|
|
332
|
+
label,
|
|
333
|
+
onChange,
|
|
334
|
+
className,
|
|
335
|
+
...props
|
|
336
|
+
}) {
|
|
337
|
+
const id = useId4();
|
|
338
|
+
const trackRef = useRef3(null);
|
|
339
|
+
const safeStep = step > 0 ? step : 1;
|
|
340
|
+
const percent = (value - min) / (max - min || 1) * 100;
|
|
341
|
+
const updateFromClientX = (clientX) => {
|
|
342
|
+
const track = trackRef.current;
|
|
343
|
+
if (!track) return;
|
|
344
|
+
const rect = track.getBoundingClientRect();
|
|
345
|
+
const ratio = (clientX - rect.left) / rect.width;
|
|
346
|
+
const nextValue = min + clamp3(ratio, 0, 1) * (max - min);
|
|
347
|
+
const snapped = Math.round(nextValue / safeStep) * safeStep;
|
|
348
|
+
onChange?.(clamp3(snapped, min, max));
|
|
349
|
+
};
|
|
350
|
+
const setValue = (nextValue) => {
|
|
351
|
+
const snapped = Math.round(nextValue / safeStep) * safeStep;
|
|
352
|
+
onChange?.(clamp3(snapped, min, max));
|
|
353
|
+
};
|
|
354
|
+
const onKeyDown = (event) => {
|
|
355
|
+
const pageStep = safeStep * 10;
|
|
356
|
+
switch (event.key) {
|
|
357
|
+
case "ArrowRight":
|
|
358
|
+
case "ArrowUp":
|
|
359
|
+
event.preventDefault();
|
|
360
|
+
setValue(value + safeStep);
|
|
361
|
+
break;
|
|
362
|
+
case "ArrowLeft":
|
|
363
|
+
case "ArrowDown":
|
|
364
|
+
event.preventDefault();
|
|
365
|
+
setValue(value - safeStep);
|
|
366
|
+
break;
|
|
367
|
+
case "PageUp":
|
|
368
|
+
event.preventDefault();
|
|
369
|
+
setValue(value + pageStep);
|
|
370
|
+
break;
|
|
371
|
+
case "PageDown":
|
|
372
|
+
event.preventDefault();
|
|
373
|
+
setValue(value - pageStep);
|
|
374
|
+
break;
|
|
375
|
+
case "Home":
|
|
376
|
+
event.preventDefault();
|
|
377
|
+
setValue(min);
|
|
378
|
+
break;
|
|
379
|
+
case "End":
|
|
380
|
+
event.preventDefault();
|
|
381
|
+
setValue(max);
|
|
382
|
+
break;
|
|
383
|
+
default:
|
|
384
|
+
break;
|
|
385
|
+
}
|
|
386
|
+
};
|
|
387
|
+
const onPointerMove = (event) => {
|
|
388
|
+
if (event.buttons !== 1) return;
|
|
389
|
+
updateFromClientX(event.clientX);
|
|
390
|
+
};
|
|
391
|
+
return /* @__PURE__ */ jsxs4("div", { className: cn("ambx-stack", className), ...props, children: [
|
|
392
|
+
/* @__PURE__ */ jsx7(
|
|
393
|
+
"div",
|
|
394
|
+
{
|
|
395
|
+
className: "amb-slider ambx-slider",
|
|
396
|
+
ref: trackRef,
|
|
397
|
+
role: "slider",
|
|
398
|
+
"aria-label": label,
|
|
399
|
+
"aria-labelledby": label ? id : void 0,
|
|
400
|
+
"aria-valuemin": min,
|
|
401
|
+
"aria-valuemax": max,
|
|
402
|
+
"aria-valuenow": value,
|
|
403
|
+
"aria-orientation": "horizontal",
|
|
404
|
+
tabIndex: 0,
|
|
405
|
+
onPointerDown: (event) => {
|
|
406
|
+
event.currentTarget.setPointerCapture(event.pointerId);
|
|
407
|
+
updateFromClientX(event.clientX);
|
|
408
|
+
},
|
|
409
|
+
onPointerMove,
|
|
410
|
+
onKeyDown,
|
|
411
|
+
children: /* @__PURE__ */ jsx7(
|
|
412
|
+
"div",
|
|
413
|
+
{
|
|
414
|
+
className: "amb-slider-thumb ambient amb-fillet amb-elevation-1 amb-surface-concave-h ambx-slider-thumb",
|
|
415
|
+
style: { left: `${percent}%` },
|
|
416
|
+
children: /* @__PURE__ */ jsxs4("div", { className: "amb-slider-grip", children: [
|
|
417
|
+
/* @__PURE__ */ jsx7("span", { className: "amb-fader-dot" }),
|
|
418
|
+
/* @__PURE__ */ jsx7("span", { className: "amb-fader-dot" }),
|
|
419
|
+
/* @__PURE__ */ jsx7("span", { className: "amb-fader-dot" })
|
|
420
|
+
] })
|
|
421
|
+
}
|
|
422
|
+
)
|
|
423
|
+
}
|
|
424
|
+
),
|
|
425
|
+
label ? /* @__PURE__ */ jsx7("span", { id, className: "ambx-label", children: label }) : null
|
|
426
|
+
] });
|
|
427
|
+
}
|
|
428
|
+
export {
|
|
429
|
+
AmbientButton,
|
|
430
|
+
AmbientFader,
|
|
431
|
+
AmbientKnob,
|
|
432
|
+
AmbientPanel,
|
|
433
|
+
AmbientProvider,
|
|
434
|
+
AmbientSlider,
|
|
435
|
+
AmbientSwitch
|
|
436
|
+
};
|
|
437
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/AmbientProvider.tsx","../src/lib/cn.ts","../src/components/AmbientPanel.tsx","../src/components/AmbientButton.tsx","../src/components/AmbientSwitch.tsx","../src/components/AmbientKnob.tsx","../src/components/AmbientFader.tsx","../src/components/AmbientSlider.tsx"],"sourcesContent":["import type { CSSProperties, PropsWithChildren } from \"react\";\n\nexport type AmbientTheme = {\n lightX?: number;\n lightY?: number;\n keyLight?: number;\n fillLight?: number;\n lightHue?: number;\n lightSaturation?: number;\n highlightColor?: string;\n lumeHue?: number;\n};\n\nexport type AmbientProviderProps = PropsWithChildren<{\n className?: string;\n style?: CSSProperties;\n theme?: AmbientTheme;\n}>;\n\nconst VAR_MAP: Record<string, keyof AmbientTheme> = {\n \"--amb-light-x\": \"lightX\",\n \"--amb-light-y\": \"lightY\",\n \"--amb-key-light-intensity\": \"keyLight\",\n \"--amb-fill-light-intensity\": \"fillLight\",\n \"--amb-light-hue\": \"lightHue\",\n \"--amb-light-saturation\": \"lightSaturation\",\n \"--amb-highlight-color\": \"highlightColor\",\n \"--amb-lume-hue\": \"lumeHue\",\n};\n\nexport function AmbientProvider({ children, className, style, theme }: AmbientProviderProps) {\n const themeVars: Record<string, string> = {};\n for (const [varName, key] of Object.entries(VAR_MAP)) {\n const value = theme?.[key];\n if (value !== undefined) {\n themeVars[varName] = key === \"lightSaturation\" ? `${value}%` : String(value);\n }\n }\n const mergedStyle = { ...themeVars, ...style } as CSSProperties;\n\n return (\n <div className={className} style={mergedStyle}>\n {children}\n </div>\n );\n}\n","export function cn(...values: Array<string | false | null | undefined>): string {\n return values.filter(Boolean).join(\" \");\n}\n","import type { HTMLAttributes } from \"react\";\nimport { cn } from \"../lib/cn\";\n\nexport type AmbientPanelProps = HTMLAttributes<HTMLDivElement>;\n\nexport function AmbientPanel({ className, ...props }: AmbientPanelProps) {\n return <div className={cn(\"ambient amb-surface amb-chamfer amb-elevation-2 ambx-panel\", className)} {...props} />;\n}\n","import type { ButtonHTMLAttributes } from \"react\";\nimport { cn } from \"../lib/cn\";\n\nexport type AmbientButtonProps = ButtonHTMLAttributes<HTMLButtonElement>;\n\nexport function AmbientButton({ className, children, ...props }: AmbientButtonProps) {\n return (\n <button\n type=\"button\"\n className={cn(\"ambient amb-button amb-chamfer amb-elevation-1 ambx-button amb-heading-3\", className)}\n {...props}\n >\n {children}\n </button>\n );\n}\n","import { useId, useState } from \"react\";\nimport type { ButtonHTMLAttributes } from \"react\";\nimport { cn } from \"../lib/cn\";\n\nexport type AmbientSwitchSize = \"sm\" | \"md\" | \"lg\";\n\nexport type AmbientSwitchProps = Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"onChange\"> & {\n checked?: boolean;\n defaultChecked?: boolean;\n onCheckedChange?: (checked: boolean) => void;\n size?: AmbientSwitchSize;\n label?: string;\n /** Show a small LED indicator that lights up when the switch is on. Pass `true` for default green or a CSS color string. */\n led?: boolean | string;\n};\n\nexport function AmbientSwitch({\n className,\n checked,\n defaultChecked,\n onCheckedChange,\n onClick,\n size = \"md\",\n label,\n led,\n children,\n ...props\n}: AmbientSwitchProps) {\n const labelId = useId();\n const isControlled = checked !== undefined;\n const [internalChecked, setInternalChecked] = useState(defaultChecked ?? false);\n const active = isControlled ? (checked ?? false) : internalChecked;\n\n const button = (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={active}\n aria-labelledby={label ? labelId : props[\"aria-labelledby\"]}\n className={cn(\n \"ambient amb-switch amb-chamfer amb-elevation-1 amb-heading-3\",\n active ? \"amb-surface-convex amb-switch-on\" : \"amb-surface-concave\",\n \"ambx-switch\",\n `ambx-switch-${size}`,\n className\n )}\n onClick={(event) => {\n const next = !active;\n if (!isControlled) setInternalChecked(next);\n onCheckedChange?.(next);\n onClick?.(event);\n }}\n {...props}\n >\n {led ? (\n <span\n className={cn(\"amb-led\", !active && \"amb-led-off\")}\n style={typeof led === \"string\" ? { \"--amb-led-color\": led } as React.CSSProperties : undefined}\n />\n ) : null}\n {children}\n </button>\n );\n\n if (!label) return button;\n\n return (\n <div className=\"ambx-stack\">\n {button}\n <span id={labelId} className=\"ambx-label\">\n {label}\n </span>\n </div>\n );\n}\n","import { useId, useRef } from \"react\";\nimport type { HTMLAttributes, KeyboardEvent, PointerEvent } from \"react\";\nimport { cn } from \"../lib/cn\";\n\nexport type AmbientKnobProps = Omit<HTMLAttributes<HTMLDivElement>, \"onChange\"> & {\n value: number;\n min?: number;\n max?: number;\n step?: number;\n label?: string;\n onChange?: (nextValue: number) => void;\n};\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value));\n}\n\nexport function AmbientKnob({\n value,\n min = 0,\n max = 100,\n step = 1,\n label,\n onChange,\n className,\n ...props\n}: AmbientKnobProps) {\n const id = useId();\n const dragStateRef = useRef<{ startY: number; startValue: number } | null>(null);\n const safeStep = step > 0 ? step : 1;\n\n const percent = (value - min) / (max - min || 1);\n const rotation = percent * 270 - 135;\n\n const updateFromPointer = (event: PointerEvent<HTMLDivElement>) => {\n const drag = dragStateRef.current;\n if (!drag) return;\n\n const delta = drag.startY - event.clientY;\n const range = max - min;\n const sensitivity = range / 180;\n const raw = drag.startValue + delta * sensitivity;\n const snapped = Math.round(raw / safeStep) * safeStep;\n onChange?.(clamp(snapped, min, max));\n };\n\n const setValue = (nextValue: number) => {\n const snapped = Math.round(nextValue / safeStep) * safeStep;\n onChange?.(clamp(snapped, min, max));\n };\n\n const onKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n const pageStep = safeStep * 10;\n switch (event.key) {\n case \"ArrowUp\":\n case \"ArrowRight\":\n event.preventDefault();\n setValue(value + safeStep);\n break;\n case \"ArrowDown\":\n case \"ArrowLeft\":\n event.preventDefault();\n setValue(value - safeStep);\n break;\n case \"PageUp\":\n event.preventDefault();\n setValue(value + pageStep);\n break;\n case \"PageDown\":\n event.preventDefault();\n setValue(value - pageStep);\n break;\n case \"Home\":\n event.preventDefault();\n setValue(min);\n break;\n case \"End\":\n event.preventDefault();\n setValue(max);\n break;\n default:\n break;\n }\n };\n\n return (\n <div className={cn(\"ambx-stack\", className)} {...props}>\n <div\n className=\"ambient amb-knob amb-chamfer amb-elevation-2 amb-surface ambx-knob\"\n role=\"slider\"\n aria-label={label}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={value}\n aria-labelledby={label ? id : undefined}\n aria-orientation=\"vertical\"\n tabIndex={0}\n onPointerDown={(event) => {\n event.currentTarget.setPointerCapture(event.pointerId);\n dragStateRef.current = { startY: event.clientY, startValue: value };\n }}\n onPointerMove={updateFromPointer}\n onPointerUp={() => {\n dragStateRef.current = null;\n }}\n onPointerCancel={() => {\n dragStateRef.current = null;\n }}\n onKeyDown={onKeyDown}\n >\n <div className=\"ambx-knob-rotation\" style={{ transform: `rotate(${rotation}deg)` }}>\n <div className=\"amb-knob-indicator\">\n <div className=\"amb-knob-grip\">\n <span className=\"amb-fader-dot\" />\n <span className=\"amb-fader-dot\" />\n <span className=\"amb-fader-dot\" />\n </div>\n </div>\n </div>\n </div>\n {label ? (\n <span id={id} className=\"ambx-label\">\n {label}\n </span>\n ) : null}\n </div>\n );\n}\n","import { useId, useRef } from \"react\";\nimport type { HTMLAttributes, KeyboardEvent, PointerEvent } from \"react\";\nimport { cn } from \"../lib/cn\";\n\nexport type AmbientFaderProps = Omit<HTMLAttributes<HTMLDivElement>, \"onChange\"> & {\n value: number;\n min?: number;\n max?: number;\n step?: number;\n label?: string;\n onChange?: (nextValue: number) => void;\n};\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value));\n}\n\nexport function AmbientFader({\n value,\n min = 0,\n max = 100,\n step = 1,\n label,\n onChange,\n className,\n ...props\n}: AmbientFaderProps) {\n const id = useId();\n const trackRef = useRef<HTMLDivElement | null>(null);\n const safeStep = step > 0 ? step : 1;\n\n const percent = ((value - min) / (max - min || 1)) * 100;\n\n const updateFromClientY = (clientY: number) => {\n const track = trackRef.current;\n if (!track) return;\n\n const rect = track.getBoundingClientRect();\n const ratio = 1 - (clientY - rect.top) / rect.height;\n const nextValue = min + clamp(ratio, 0, 1) * (max - min);\n const snapped = Math.round(nextValue / safeStep) * safeStep;\n onChange?.(clamp(snapped, min, max));\n };\n\n const setValue = (nextValue: number) => {\n const snapped = Math.round(nextValue / safeStep) * safeStep;\n onChange?.(clamp(snapped, min, max));\n };\n\n const onKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n const pageStep = safeStep * 10;\n switch (event.key) {\n case \"ArrowUp\":\n case \"ArrowRight\":\n event.preventDefault();\n setValue(value + safeStep);\n break;\n case \"ArrowDown\":\n case \"ArrowLeft\":\n event.preventDefault();\n setValue(value - safeStep);\n break;\n case \"PageUp\":\n event.preventDefault();\n setValue(value + pageStep);\n break;\n case \"PageDown\":\n event.preventDefault();\n setValue(value - pageStep);\n break;\n case \"Home\":\n event.preventDefault();\n setValue(min);\n break;\n case \"End\":\n event.preventDefault();\n setValue(max);\n break;\n default:\n break;\n }\n };\n\n const onPointerMove = (event: PointerEvent<HTMLDivElement>) => {\n if (event.buttons !== 1) return;\n updateFromClientY(event.clientY);\n };\n\n return (\n <div className={cn(\"ambx-stack\", className)} {...props}>\n <div\n className=\"amb-fader ambx-fader\"\n ref={trackRef}\n role=\"slider\"\n aria-label={label}\n aria-labelledby={label ? id : undefined}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={value}\n aria-orientation=\"vertical\"\n tabIndex={0}\n onPointerDown={(event) => {\n event.currentTarget.setPointerCapture(event.pointerId);\n updateFromClientY(event.clientY);\n }}\n onPointerMove={onPointerMove}\n onKeyDown={onKeyDown}\n >\n <div\n className=\"amb-fader-thumb ambient amb-fillet amb-elevation-1 amb-surface-concave ambx-fader-thumb\"\n style={{ top: `${100 - percent}%` }}\n >\n <div className=\"amb-fader-grip\">\n <span className=\"amb-fader-dot\" />\n <span className=\"amb-fader-dot\" />\n <span className=\"amb-fader-dot\" />\n </div>\n </div>\n </div>\n {label ? (\n <span id={id} className=\"ambx-label\">\n {label}\n </span>\n ) : null}\n </div>\n );\n}\n","import { useId, useRef } from \"react\";\nimport type { HTMLAttributes, KeyboardEvent, PointerEvent } from \"react\";\nimport { cn } from \"../lib/cn\";\n\nexport type AmbientSliderProps = Omit<HTMLAttributes<HTMLDivElement>, \"onChange\"> & {\n value: number;\n min?: number;\n max?: number;\n step?: number;\n label?: string;\n onChange?: (nextValue: number) => void;\n};\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value));\n}\n\nexport function AmbientSlider({\n value,\n min = 0,\n max = 100,\n step = 1,\n label,\n onChange,\n className,\n ...props\n}: AmbientSliderProps) {\n const id = useId();\n const trackRef = useRef<HTMLDivElement | null>(null);\n const safeStep = step > 0 ? step : 1;\n\n const percent = ((value - min) / (max - min || 1)) * 100;\n\n const updateFromClientX = (clientX: number) => {\n const track = trackRef.current;\n if (!track) return;\n\n const rect = track.getBoundingClientRect();\n const ratio = (clientX - rect.left) / rect.width;\n const nextValue = min + clamp(ratio, 0, 1) * (max - min);\n const snapped = Math.round(nextValue / safeStep) * safeStep;\n onChange?.(clamp(snapped, min, max));\n };\n\n const setValue = (nextValue: number) => {\n const snapped = Math.round(nextValue / safeStep) * safeStep;\n onChange?.(clamp(snapped, min, max));\n };\n\n const onKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n const pageStep = safeStep * 10;\n switch (event.key) {\n case \"ArrowRight\":\n case \"ArrowUp\":\n event.preventDefault();\n setValue(value + safeStep);\n break;\n case \"ArrowLeft\":\n case \"ArrowDown\":\n event.preventDefault();\n setValue(value - safeStep);\n break;\n case \"PageUp\":\n event.preventDefault();\n setValue(value + pageStep);\n break;\n case \"PageDown\":\n event.preventDefault();\n setValue(value - pageStep);\n break;\n case \"Home\":\n event.preventDefault();\n setValue(min);\n break;\n case \"End\":\n event.preventDefault();\n setValue(max);\n break;\n default:\n break;\n }\n };\n\n const onPointerMove = (event: PointerEvent<HTMLDivElement>) => {\n if (event.buttons !== 1) return;\n updateFromClientX(event.clientX);\n };\n\n return (\n <div className={cn(\"ambx-stack\", className)} {...props}>\n <div\n className=\"amb-slider ambx-slider\"\n ref={trackRef}\n role=\"slider\"\n aria-label={label}\n aria-labelledby={label ? id : undefined}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={value}\n aria-orientation=\"horizontal\"\n tabIndex={0}\n onPointerDown={(event) => {\n event.currentTarget.setPointerCapture(event.pointerId);\n updateFromClientX(event.clientX);\n }}\n onPointerMove={onPointerMove}\n onKeyDown={onKeyDown}\n >\n <div\n className=\"amb-slider-thumb ambient amb-fillet amb-elevation-1 amb-surface-concave-h ambx-slider-thumb\"\n style={{ left: `${percent}%` }}\n >\n <div className=\"amb-slider-grip\">\n <span className=\"amb-fader-dot\" />\n <span className=\"amb-fader-dot\" />\n <span className=\"amb-fader-dot\" />\n </div>\n </div>\n </div>\n {label ? (\n <span id={id} className=\"ambx-label\">\n {label}\n </span>\n ) : null}\n </div>\n );\n}\n"],"mappings":"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","names":["jsx","jsx","jsx","useId","jsx","jsxs","useId","useId","useRef","jsx","jsxs","clamp","useId","useRef","useId","useRef","jsx","jsxs","clamp","useId","useRef"]}
|