@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.
@@ -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"]}