@dynamic-labs-sdk/droplet 1.13.0 → 1.16.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/components/ui/accordion/accordion.stories.d.ts +19 -0
- package/dist/components/ui/accordion/accordion.stories.d.ts.map +1 -0
- package/dist/components/ui/alert/alert.d.ts +41 -0
- package/dist/components/ui/alert/alert.d.ts.map +1 -0
- package/dist/components/ui/alert/alert.stories.d.ts +26 -0
- package/dist/components/ui/alert/alert.stories.d.ts.map +1 -0
- package/dist/components/ui/alert/index.d.ts +3 -0
- package/dist/components/ui/alert/index.d.ts.map +1 -0
- package/dist/components/ui/alert-dialog/alert-dialog.d.ts +4 -1
- package/dist/components/ui/alert-dialog/alert-dialog.d.ts.map +1 -1
- package/dist/components/ui/badge/badge.d.ts +11 -1
- package/dist/components/ui/badge/badge.d.ts.map +1 -1
- package/dist/components/ui/badge/badge.stories.d.ts +3 -3
- package/dist/components/ui/badge/badge.stories.d.ts.map +1 -1
- package/dist/components/ui/breadcrumb/breadcrumb.d.ts +73 -0
- package/dist/components/ui/breadcrumb/breadcrumb.d.ts.map +1 -0
- package/dist/components/ui/breadcrumb/breadcrumb.stories.d.ts +19 -0
- package/dist/components/ui/breadcrumb/breadcrumb.stories.d.ts.map +1 -0
- package/dist/components/ui/breadcrumb/index.d.ts +3 -0
- package/dist/components/ui/breadcrumb/index.d.ts.map +1 -0
- package/dist/components/ui/button/button.d.ts +7 -3
- package/dist/components/ui/button/button.d.ts.map +1 -1
- package/dist/components/ui/button/button.stories.d.ts +6 -3
- package/dist/components/ui/button/button.stories.d.ts.map +1 -1
- package/dist/components/ui/card/card.d.ts +14 -3
- package/dist/components/ui/card/card.d.ts.map +1 -1
- package/dist/components/ui/card/card.stories.d.ts +8 -2
- package/dist/components/ui/card/card.stories.d.ts.map +1 -1
- package/dist/components/ui/check-icon/check-icon.stories.d.ts +26 -0
- package/dist/components/ui/check-icon/check-icon.stories.d.ts.map +1 -0
- package/dist/components/ui/checkbox/checkbox.stories.d.ts.map +1 -1
- package/dist/components/ui/collapsible/collapsible.d.ts +1 -1
- package/dist/components/ui/collapsible/collapsible.d.ts.map +1 -1
- package/dist/components/ui/collapsible/collapsible.stories.d.ts +1 -0
- package/dist/components/ui/collapsible/collapsible.stories.d.ts.map +1 -1
- package/dist/components/ui/combobox/combobox.d.ts +49 -0
- package/dist/components/ui/combobox/combobox.d.ts.map +1 -0
- package/dist/components/ui/combobox/combobox.stories.d.ts +24 -0
- package/dist/components/ui/combobox/combobox.stories.d.ts.map +1 -0
- package/dist/components/ui/combobox/index.d.ts +3 -0
- package/dist/components/ui/combobox/index.d.ts.map +1 -0
- package/dist/components/ui/command/command.d.ts.map +1 -1
- package/dist/components/ui/command/command.stories.d.ts +31 -0
- package/dist/components/ui/command/command.stories.d.ts.map +1 -0
- package/dist/components/ui/dialog/dialog.d.ts +5 -1
- package/dist/components/ui/dialog/dialog.d.ts.map +1 -1
- package/dist/components/ui/dialog/dialog.stories.d.ts.map +1 -1
- package/dist/components/ui/dropdown-menu/dropdown-menu.d.ts.map +1 -1
- package/dist/components/ui/field/field.d.ts +60 -0
- package/dist/components/ui/field/field.d.ts.map +1 -0
- package/dist/components/ui/field/field.stories.d.ts +40 -0
- package/dist/components/ui/field/field.stories.d.ts.map +1 -0
- package/dist/components/ui/field/index.d.ts +3 -0
- package/dist/components/ui/field/index.d.ts.map +1 -0
- package/dist/components/ui/flush-card-detach/flush-card-detach.stories.d.ts.map +1 -1
- package/dist/components/ui/flush-card-stack/flush-card-stack.d.ts +57 -0
- package/dist/components/ui/flush-card-stack/flush-card-stack.d.ts.map +1 -0
- package/dist/components/ui/flush-card-stack/flush-card-stack.stories.d.ts +24 -0
- package/dist/components/ui/flush-card-stack/flush-card-stack.stories.d.ts.map +1 -0
- package/dist/components/ui/icon/icon.stories.d.ts +510 -0
- package/dist/components/ui/icon/icon.stories.d.ts.map +1 -0
- package/dist/components/ui/input/input.d.ts.map +1 -1
- package/dist/components/ui/kbd/kbd.d.ts +1 -1
- package/dist/components/ui/kbd/kbd.stories.d.ts +15 -0
- package/dist/components/ui/kbd/kbd.stories.d.ts.map +1 -0
- package/dist/components/ui/pagination/index.d.ts +3 -0
- package/dist/components/ui/pagination/index.d.ts.map +1 -0
- package/dist/components/ui/pagination/pagination.d.ts +82 -0
- package/dist/components/ui/pagination/pagination.d.ts.map +1 -0
- package/dist/components/ui/pagination/pagination.stories.d.ts +16 -0
- package/dist/components/ui/pagination/pagination.stories.d.ts.map +1 -0
- package/dist/components/ui/popover/popover.d.ts +1 -1
- package/dist/components/ui/popover/popover.d.ts.map +1 -1
- package/dist/components/ui/progress/progress.d.ts +7 -4
- package/dist/components/ui/progress/progress.d.ts.map +1 -1
- package/dist/components/ui/progress/progress.stories.d.ts +4 -1
- package/dist/components/ui/progress/progress.stories.d.ts.map +1 -1
- package/dist/components/ui/radio-group/index.d.ts +1 -1
- package/dist/components/ui/radio-group/index.d.ts.map +1 -1
- package/dist/components/ui/radio-group/radio-group.d.ts +45 -2
- package/dist/components/ui/radio-group/radio-group.d.ts.map +1 -1
- package/dist/components/ui/radio-group/radio-group.stories.d.ts +19 -0
- package/dist/components/ui/radio-group/radio-group.stories.d.ts.map +1 -1
- package/dist/components/ui/scroll-area/scroll-area.stories.d.ts +15 -0
- package/dist/components/ui/scroll-area/scroll-area.stories.d.ts.map +1 -0
- package/dist/components/ui/search-input/search-input.stories.d.ts +27 -0
- package/dist/components/ui/search-input/search-input.stories.d.ts.map +1 -0
- package/dist/components/ui/select/select.d.ts.map +1 -1
- package/dist/components/ui/skeleton/skeleton.d.ts +1 -1
- package/dist/components/ui/skeleton/skeleton.d.ts.map +1 -1
- package/dist/components/ui/skeleton/skeleton.stories.d.ts +1 -1
- package/dist/components/ui/slider/index.d.ts +3 -0
- package/dist/components/ui/slider/index.d.ts.map +1 -0
- package/dist/components/ui/slider/slider.d.ts +28 -0
- package/dist/components/ui/slider/slider.d.ts.map +1 -0
- package/dist/components/ui/slider/slider.stories.d.ts +40 -0
- package/dist/components/ui/slider/slider.stories.d.ts.map +1 -0
- package/dist/components/ui/sonner/sonner.stories.d.ts +10 -0
- package/dist/components/ui/sonner/sonner.stories.d.ts.map +1 -0
- package/dist/components/ui/spinner/spinner.d.ts +13 -2
- package/dist/components/ui/spinner/spinner.d.ts.map +1 -1
- package/dist/components/ui/spinner/spinner.stories.d.ts +1 -3
- package/dist/components/ui/spinner/spinner.stories.d.ts.map +1 -1
- package/dist/components/ui/stepper/index.d.ts +3 -0
- package/dist/components/ui/stepper/index.d.ts.map +1 -0
- package/dist/components/ui/stepper/stepper.d.ts +36 -0
- package/dist/components/ui/stepper/stepper.d.ts.map +1 -0
- package/dist/components/ui/stepper/stepper.stories.d.ts +21 -0
- package/dist/components/ui/stepper/stepper.stories.d.ts.map +1 -0
- package/dist/components/ui/switch/switch.d.ts.map +1 -1
- package/dist/components/ui/table/table.d.ts +1 -1
- package/dist/components/ui/table/table.d.ts.map +1 -1
- package/dist/components/ui/toggle-group/index.d.ts +3 -0
- package/dist/components/ui/toggle-group/index.d.ts.map +1 -0
- package/dist/components/ui/toggle-group/toggle-group.d.ts +62 -0
- package/dist/components/ui/toggle-group/toggle-group.d.ts.map +1 -0
- package/dist/components/ui/toggle-group/toggle-group.stories.d.ts +20 -0
- package/dist/components/ui/toggle-group/toggle-group.stories.d.ts.map +1 -0
- package/dist/components/ui/tray/renderTrayLayout.d.ts +37 -0
- package/dist/components/ui/tray/renderTrayLayout.d.ts.map +1 -0
- package/dist/components/ui/tray/resolveTrayLayout.d.ts +35 -0
- package/dist/components/ui/tray/resolveTrayLayout.d.ts.map +1 -0
- package/dist/components/ui/well/well-reveal.stories.d.ts +27 -0
- package/dist/components/ui/well/well-reveal.stories.d.ts.map +1 -0
- package/dist/components/ui/well/well.d.ts +2 -2
- package/dist/components/ui/well/well.d.ts.map +1 -1
- package/dist/components/ui/well/well.stories.d.ts +2 -2
- package/dist/index.cjs +1320 -306
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +18 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.esm.js +1292 -312
- package/dist/index.esm.js.map +1 -1
- package/dist/migration.cjs +1 -1
- package/dist/migration.esm.js +1 -1
- package/dist/{toggle-row-B7XCm0Z-.cjs → toggle-row-BafR1dY7.cjs} +93 -12
- package/dist/toggle-row-BafR1dY7.cjs.map +1 -0
- package/dist/{toggle-row-C-B8HtY0.esm.js → toggle-row-h0h1m_hc.esm.js} +88 -13
- package/dist/toggle-row-h0h1m_hc.esm.js.map +1 -0
- package/package.json +1 -1
- package/src/styles/globals.css +68 -23
- package/dist/toggle-row-B7XCm0Z-.cjs.map +0 -1
- package/dist/toggle-row-C-B8HtY0.esm.js.map +0 -1
package/dist/migration.cjs
CHANGED
package/dist/migration.esm.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { c as cn, i as Input, r as Label, t as ToggleRow } from "./toggle-row-h0h1m_hc.esm.js";
|
|
2
2
|
import { useId, useState } from "react";
|
|
3
3
|
import { HugeiconsIcon } from "@hugeicons/react";
|
|
4
4
|
import { AiMagicIcon, Alert01Icon, Cancel01Icon, CheckmarkCircle02Icon, InformationCircleIcon } from "@hugeicons/core-free-icons";
|
|
@@ -15,9 +15,72 @@ let _radix_ui_react_switch = require("@radix-ui/react-switch");
|
|
|
15
15
|
//#region src/lib/utils.ts
|
|
16
16
|
const cn = (...inputs) => (0, tailwind_merge.twMerge)((0, clsx.clsx)(inputs));
|
|
17
17
|
|
|
18
|
+
//#endregion
|
|
19
|
+
//#region src/components/ui/spinner/spinner.tsx
|
|
20
|
+
/** Maps the `size` prop to Tailwind size utilities. */
|
|
21
|
+
const sizeMap = {
|
|
22
|
+
lg: "size-6",
|
|
23
|
+
md: "size-4",
|
|
24
|
+
sm: "size-3"
|
|
25
|
+
};
|
|
26
|
+
const Spinner = ({ className, size = "md" }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("output", {
|
|
27
|
+
"aria-label": "Loading",
|
|
28
|
+
className: "inline-flex",
|
|
29
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
|
|
30
|
+
viewBox: "0 0 24 24",
|
|
31
|
+
fill: "none",
|
|
32
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
33
|
+
className: cn("animate-spin motion-reduce:animate-none", sizeMap[size], className),
|
|
34
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("circle", {
|
|
35
|
+
className: "opacity-25",
|
|
36
|
+
cx: "12",
|
|
37
|
+
cy: "12",
|
|
38
|
+
r: "10",
|
|
39
|
+
stroke: "currentColor",
|
|
40
|
+
strokeWidth: "4"
|
|
41
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
|
|
42
|
+
className: "opacity-75",
|
|
43
|
+
fill: "currentColor",
|
|
44
|
+
d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"
|
|
45
|
+
})]
|
|
46
|
+
})
|
|
47
|
+
});
|
|
48
|
+
|
|
18
49
|
//#endregion
|
|
19
50
|
//#region src/components/ui/button/button.tsx
|
|
20
|
-
const buttonVariants = (0, class_variance_authority.cva)("relative isolate inline-flex items-center justify-center gap-1.5 whitespace-nowrap select-none text-[13px] font-medium leading-[calc(18/13)] touch-manipulation transition-[background-color,color,opacity,box-shadow,transform,filter,scale] duration-150 ease active:scale-[0.96] cursor-pointer border-0 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40", {
|
|
51
|
+
const buttonVariants = (0, class_variance_authority.cva)("relative isolate inline-flex items-center justify-center gap-1.5 whitespace-nowrap select-none text-[13px] font-medium leading-[calc(18/13)] touch-manipulation transition-[background-color,color,opacity,box-shadow,transform,filter,scale] duration-150 ease-out active:scale-[0.96] motion-reduce:transition-none cursor-pointer border-0 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40", {
|
|
52
|
+
compoundVariants: [
|
|
53
|
+
{
|
|
54
|
+
class: "min-w-16",
|
|
55
|
+
size: "sm",
|
|
56
|
+
variant: [
|
|
57
|
+
"default",
|
|
58
|
+
"destructive",
|
|
59
|
+
"outline",
|
|
60
|
+
"secondary"
|
|
61
|
+
]
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
class: "min-w-20",
|
|
65
|
+
size: "default",
|
|
66
|
+
variant: [
|
|
67
|
+
"default",
|
|
68
|
+
"destructive",
|
|
69
|
+
"outline",
|
|
70
|
+
"secondary"
|
|
71
|
+
]
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
class: "min-w-24",
|
|
75
|
+
size: "lg",
|
|
76
|
+
variant: [
|
|
77
|
+
"default",
|
|
78
|
+
"destructive",
|
|
79
|
+
"outline",
|
|
80
|
+
"secondary"
|
|
81
|
+
]
|
|
82
|
+
}
|
|
83
|
+
],
|
|
21
84
|
defaultVariants: {
|
|
22
85
|
size: "default",
|
|
23
86
|
variant: "default"
|
|
@@ -48,8 +111,10 @@ const buttonVariants = (0, class_variance_authority.cva)("relative isolate inlin
|
|
|
48
111
|
* Variants: `default` | `destructive` | `outline` | `secondary` | `ghost` | `link`.
|
|
49
112
|
* Sizes: `default` | `sm` | `xs` | `lg` | `icon` | `icon-sm` | `icon-xs`.
|
|
50
113
|
* Set `asChild` to render the button styles onto a child element (e.g. an anchor) instead of a `<button>`.
|
|
114
|
+
* Set `loading` to show an inline spinner before the label and disable interaction while an async action is pending.
|
|
115
|
+
* When `asChild` is true, `loading` is ignored — the Slot host cannot render an additional spinner child.
|
|
51
116
|
*/
|
|
52
|
-
const Button = ({ className, variant = "default", size = "default", asChild = false, ...props }) => {
|
|
117
|
+
const Button = ({ className, variant = "default", size = "default", asChild = false, loading = false, disabled, children, style, ...props }) => {
|
|
53
118
|
if (asChild) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_radix_ui_react_slot.Slot, {
|
|
54
119
|
"data-slot": "button",
|
|
55
120
|
"data-size": size,
|
|
@@ -59,18 +124,27 @@ const Button = ({ className, variant = "default", size = "default", asChild = fa
|
|
|
59
124
|
size,
|
|
60
125
|
variant
|
|
61
126
|
})),
|
|
62
|
-
...props
|
|
127
|
+
...props,
|
|
128
|
+
disabled,
|
|
129
|
+
style,
|
|
130
|
+
children
|
|
63
131
|
});
|
|
64
|
-
return /* @__PURE__ */ (0, react_jsx_runtime.
|
|
132
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
65
133
|
"data-slot": "button",
|
|
66
134
|
"data-size": size,
|
|
67
135
|
"data-variant": variant,
|
|
68
136
|
className: cn(buttonVariants({
|
|
69
|
-
className,
|
|
70
137
|
size,
|
|
71
138
|
variant
|
|
72
|
-
})),
|
|
73
|
-
|
|
139
|
+
}), loading && "cursor-wait", className),
|
|
140
|
+
disabled: disabled || loading,
|
|
141
|
+
"aria-busy": loading || void 0,
|
|
142
|
+
style: loading ? {
|
|
143
|
+
opacity: 1,
|
|
144
|
+
...style
|
|
145
|
+
} : style,
|
|
146
|
+
...props,
|
|
147
|
+
children: [loading && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Spinner, { className: "size-3.5" }), children]
|
|
74
148
|
});
|
|
75
149
|
};
|
|
76
150
|
|
|
@@ -103,7 +177,7 @@ const spring = {
|
|
|
103
177
|
};
|
|
104
178
|
const Input = (0, react.forwardRef)(({ className, type, shaderBorder, style, ...props }, ref) => {
|
|
105
179
|
const prefersReducedMotion = (0, motion_react.useReducedMotion)();
|
|
106
|
-
const inputClassName = cn("file:text-foreground placeholder:text-muted-foreground/60 selection:bg-primary selection:text-primary-foreground dark:bg-input/30 h-8 w-full min-w-0 touch-manipulation rounded-md border-0 bg-background px-3 py-1 text-base shadow-[var(--shadow-input)] transition-[color,box-shadow] duration-100 ease-out outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm", "hover:shadow-[var(--shadow-input-hover)]", "focus-visible:shadow-[0_0_0_1px_var(--ring),
|
|
180
|
+
const inputClassName = cn("file:text-foreground placeholder:text-muted-foreground/60 selection:bg-primary selection:text-primary-foreground dark:bg-input/30 h-8 w-full min-w-0 touch-manipulation rounded-md border-0 bg-background px-3 py-1 text-base shadow-[var(--shadow-input)] transition-[color,box-shadow] duration-100 ease-out outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm", "hover:shadow-[var(--shadow-input-hover)]", "focus-visible:shadow-[0_0_0_1px_var(--ring),0_0_0_4px_var(--ring-halo,#0072EF26)]", "aria-invalid:shadow-[0_0_0_1px_var(--destructive),0_0_1px_0_var(--destructive)] dark:aria-invalid:shadow-[0_0_0_1px_var(--destructive)]", className);
|
|
107
181
|
const isActive = !!shaderBorder;
|
|
108
182
|
const config = typeof shaderBorder === "object" ? {
|
|
109
183
|
...shaderDefaults,
|
|
@@ -152,7 +226,7 @@ const Input = (0, react.forwardRef)(({ className, type, shaderBorder, style, ...
|
|
|
152
226
|
ref,
|
|
153
227
|
type,
|
|
154
228
|
"data-slot": "input",
|
|
155
|
-
className: cn(inputClassName, isActive && "animate-shimmer motion-reduce:animate-none"),
|
|
229
|
+
className: cn(inputClassName, isActive && "animate-shimmer motion-reduce:animate-none", isActive && "focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-[var(--ring)]"),
|
|
156
230
|
style: isActive ? {
|
|
157
231
|
backgroundClip: "text",
|
|
158
232
|
backgroundImage: `linear-gradient(to right, color-mix(in srgb, ${config.colors[0]} 70%, #000), color-mix(in srgb, ${config.colors[1] || config.colors[0]} 70%, #000), color-mix(in srgb, ${config.colors[2] || config.colors[0]} 70%, #000), color-mix(in srgb, ${config.colors[0]} 70%, #000))`,
|
|
@@ -192,11 +266,12 @@ const Switch = (0, react.forwardRef)(({ className, size = "default", ...props },
|
|
|
192
266
|
ref,
|
|
193
267
|
"data-slot": "switch",
|
|
194
268
|
"data-size": size,
|
|
195
|
-
className: cn("peer data-[state=checked]:bg-(--action) data-[state=unchecked]:bg-input hover:data-[state=unchecked]:bg-[rgba(31,41,55,0.
|
|
269
|
+
className: cn("peer data-[state=checked]:bg-(--action) data-[state=unchecked]:bg-input hover:data-[state=unchecked]:bg-[rgba(31,41,55,0.16)] group-hover/toggle:data-[state=unchecked]:bg-[rgba(31,41,55,0.16)] focus-visible:ring-ring/50 dark:data-[state=unchecked]:bg-input/80 dark:hover:data-[state=unchecked]:bg-[rgba(255,255,255,0.12)] dark:group-hover/toggle:data-[state=unchecked]:bg-[rgba(255,255,255,0.12)] relative group/switch inline-flex shrink-0 touch-manipulation items-center rounded-full border-0 shadow-[var(--shadow-control)] dark:shadow-[var(--shadow-control)] data-[state=checked]:shadow-[var(--shadow-control-checked)] dark:data-[state=checked]:shadow-[var(--shadow-control-checked)] transition-[color,background-color,box-shadow] duration-200 ease-out motion-reduce:transition-none outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 cursor-pointer data-[size=default]:h-[18px] data-[size=default]:w-[30px] data-[size=sm]:h-3.5 data-[size=sm]:w-[22px] before:absolute before:-inset-[15px] before:content-['']", className),
|
|
196
270
|
...props,
|
|
197
271
|
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_radix_ui_react_switch.Thumb, {
|
|
198
272
|
"data-slot": "switch-thumb",
|
|
199
|
-
className: cn("
|
|
273
|
+
className: cn("pointer-events-none relative block ring-0", "transition-transform duration-200 ease-out motion-reduce:transition-none", "group-data-[size=default]/switch:size-3.5 group-data-[size=sm]/switch:size-2.5", "data-[state=unchecked]:translate-x-0.5 group-data-[size=default]/switch:data-[state=checked]:translate-x-[14px] group-data-[size=sm]/switch:data-[state=checked]:translate-x-[10px]"),
|
|
274
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: cn("absolute top-0 h-full rounded-full", "bg-background dark:group-data-[state=checked]/switch:bg-white dark:group-data-[state=unchecked]/switch:bg-[oklch(0.500_0.013_253)]", "shadow-[var(--shadow-control-thumb)] dark:shadow-[var(--shadow-control-thumb)]", "group-data-[size=default]/switch:w-3.5 group-data-[size=sm]/switch:w-2.5", "group-data-[state=checked]/switch:right-0 group-data-[state=unchecked]/switch:left-0", "group-[&[data-size=default]:active]/switch:w-[17px] group-[&[data-size=sm]:active]/switch:w-3", "transition-[width,background-color] duration-[120ms] ease-out motion-reduce:transition-none") })
|
|
200
275
|
})
|
|
201
276
|
}));
|
|
202
277
|
Switch.displayName = "Switch";
|
|
@@ -300,6 +375,12 @@ Object.defineProperty(exports, 'Label', {
|
|
|
300
375
|
return Label;
|
|
301
376
|
}
|
|
302
377
|
});
|
|
378
|
+
Object.defineProperty(exports, 'Spinner', {
|
|
379
|
+
enumerable: true,
|
|
380
|
+
get: function () {
|
|
381
|
+
return Spinner;
|
|
382
|
+
}
|
|
383
|
+
});
|
|
303
384
|
Object.defineProperty(exports, 'Switch', {
|
|
304
385
|
enumerable: true,
|
|
305
386
|
get: function () {
|
|
@@ -324,4 +405,4 @@ Object.defineProperty(exports, 'cn', {
|
|
|
324
405
|
return cn;
|
|
325
406
|
}
|
|
326
407
|
});
|
|
327
|
-
//# sourceMappingURL=toggle-row-
|
|
408
|
+
//# sourceMappingURL=toggle-row-BafR1dY7.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toggle-row-BafR1dY7.cjs","names":["Slot","shaderDefaults: Required<ShaderBorderConfig>","AnimatePresence","motion","PulsingBorder","Root","Root","Thumb","HugeiconsIcon","Setting07Icon"],"sources":["../src/lib/utils.ts","../src/components/ui/spinner/spinner.tsx","../src/components/ui/button/button.tsx","../src/components/ui/input/input.tsx","../src/components/ui/label/label.tsx","../src/components/ui/switch/switch.tsx","../src/components/toggle-row/toggle-row.tsx"],"sourcesContent":["import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport const cn = (...inputs: ClassValue[]) => twMerge(clsx(inputs));\n","import { cn } from '../../../lib/utils';\n\n/** Maps the `size` prop to Tailwind size utilities. */\nconst sizeMap = {\n lg: 'size-6',\n md: 'size-4',\n sm: 'size-3',\n} as const;\n\ntype SpinnerSize = keyof typeof sizeMap;\n\ntype SpinnerProps = {\n className?: string;\n /** Controls the spinner diameter. Defaults to `md` (size-4). `className` wins over `size`. */\n size?: SpinnerSize;\n};\n\nconst Spinner = ({ className, size = 'md' }: SpinnerProps) => (\n <output aria-label='Loading' className='inline-flex'>\n <svg\n viewBox='0 0 24 24'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n className={cn('animate-spin motion-reduce:animate-none', sizeMap[size], className)}\n >\n <circle\n className='opacity-25'\n cx='12'\n cy='12'\n r='10'\n stroke='currentColor'\n strokeWidth='4'\n />\n <path\n className='opacity-75'\n fill='currentColor'\n d='M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z'\n />\n </svg>\n </output>\n);\n\nexport { Spinner };\nexport type { SpinnerProps, SpinnerSize };\n","import { type ComponentProps } from 'react';\nimport { type VariantProps, cva } from 'class-variance-authority';\nimport { Slot } from '@radix-ui/react-slot';\n\nimport { cn } from '../../../lib/utils';\nimport { Spinner } from '../spinner';\n\nconst buttonVariants = cva(\n \"relative isolate inline-flex items-center justify-center gap-1.5 whitespace-nowrap select-none text-[13px] font-medium leading-[calc(18/13)] touch-manipulation transition-[background-color,color,opacity,box-shadow,transform,filter,scale] duration-150 ease-out active:scale-[0.96] motion-reduce:transition-none cursor-pointer border-0 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40\",\n {\n // Min-width floors so short labels (Done/OK/Save) read as proper buttons and\n // paired footer actions balance — only for solid/outlined TEXT buttons.\n // Excluded by design: `ghost`/`link` (inline text, no button floor) and all\n // `icon*` sizes (square). `min-w-*` (not fixed width) so labels still grow,\n // and `w-full`/`flex-1` usages override it harmlessly.\n compoundVariants: [\n {\n class: 'min-w-16',\n size: 'sm',\n variant: ['default', 'destructive', 'outline', 'secondary'],\n },\n {\n class: 'min-w-20',\n size: 'default',\n variant: ['default', 'destructive', 'outline', 'secondary'],\n },\n {\n class: 'min-w-24',\n size: 'lg',\n variant: ['default', 'destructive', 'outline', 'secondary'],\n },\n ],\n defaultVariants: {\n size: 'default',\n variant: 'default',\n },\n variants: {\n size: {\n default: \"rounded-md px-3 py-1.5 h-8 has-[>svg]:px-2.5 [&_svg:not([class*='size-'])]:size-3.5\",\n \"icon\": 'size-9 rounded-md',\n \"icon-sm\": \"size-7 rounded-md [&_svg:not([class*='size-'])]:size-3.5 relative before:absolute before:-inset-[6px] before:content-['']\",\n \"icon-xs\": \"size-6 rounded-md [&_svg:not([class*='size-'])]:size-3 relative before:absolute before:-inset-[9px] before:content-['']\",\n lg: \"rounded-md px-5 py-2.5 h-10 has-[>svg]:px-4 [&_svg:not([class*='size-'])]:size-4\",\n sm: \"rounded-md px-2.5 py-1 h-7 has-[>svg]:px-2 [&_svg:not([class*='size-'])]:size-3 before:absolute before:-inset-y-[6px] before:inset-x-0 before:content-['']\",\n xs: \"rounded-md px-3 py-1 h-7 [&_svg:not([class*='size-'])]:size-3\",\n },\n variant: {\n default:\n 'bg-(--action) text-white shadow-[0_0_0_1px_var(--action),var(--shadow-button)] hover:brightness-105 [text-shadow:0_1px_1px_rgba(0,0,0,0.16)]',\n destructive:\n 'bg-destructive text-white shadow-[0_0_0_1px_var(--destructive),var(--shadow-button)] hover:brightness-105 [text-shadow:0_1px_1px_rgba(0,0,0,0.16)] focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40',\n ghost:\n 'text-muted-foreground hover:bg-[#f8f8f9] hover:text-foreground dark:hover:bg-white/[0.06]',\n link: 'text-(--action) underline-offset-4 hover:underline',\n outline:\n 'bg-white shadow-[var(--shadow-input)] hover:bg-[#f8f8f9] hover:shadow-[var(--shadow-input-hover)] dark:bg-input/30 dark:hover:bg-white/[0.06]',\n secondary:\n 'bg-white shadow-[var(--shadow-secondary)] hover:bg-[#f8f8f9] hover:shadow-[var(--shadow-secondary-hover)] dark:bg-input/30 dark:hover:bg-white/[0.06]',\n },\n },\n },\n);\n\n/**\n * Primary clickable action button.\n *\n * Variants: `default` | `destructive` | `outline` | `secondary` | `ghost` | `link`.\n * Sizes: `default` | `sm` | `xs` | `lg` | `icon` | `icon-sm` | `icon-xs`.\n * Set `asChild` to render the button styles onto a child element (e.g. an anchor) instead of a `<button>`.\n * Set `loading` to show an inline spinner before the label and disable interaction while an async action is pending.\n * When `asChild` is true, `loading` is ignored — the Slot host cannot render an additional spinner child.\n */\nconst Button = ({\n className,\n variant = 'default',\n size = 'default',\n asChild = false,\n loading = false,\n disabled,\n children,\n style,\n ...props\n}: ComponentProps<'button'> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean;\n /** When true, renders an inline spinner before the label and disables interaction. */\n loading?: boolean;\n }) => {\n if (asChild) {\n return (\n <Slot\n data-slot='button'\n data-size={size}\n data-variant={variant}\n className={cn(buttonVariants({ className, size, variant }))}\n {...{ ...props, disabled, style }}\n >\n {children}\n </Slot>\n );\n }\n\n return (\n <button\n data-slot='button'\n data-size={size}\n data-variant={variant}\n className={cn(\n buttonVariants({ size, variant }),\n // Loading stays full-strength (not the 50% disabled wash) so it reads as\n // \"working\", not \"disabled\" — interaction is still blocked via `disabled`.\n loading && 'cursor-wait',\n className,\n )}\n disabled={disabled || loading}\n aria-busy={loading || undefined}\n // Inline opacity wins over the class-level `disabled:opacity-50` so the\n // loading button keeps its color while remaining truly disabled.\n style={loading ? { opacity: 1, ...style } : style}\n {...props}\n >\n {loading && (\n // Size matches the svg sizing the button already applies to icons at each size\n <Spinner className='size-3.5' />\n )}\n {children}\n </button>\n );\n};\n\nexport { Button, buttonVariants };\n","'use client';\n\nimport type { ComponentProps } from 'react';\nimport { forwardRef } from 'react';\nimport { AnimatePresence, motion, useReducedMotion } from 'motion/react';\nimport { PulsingBorder } from '@paper-design/shaders-react';\n\nimport { cn } from '../../../lib/utils';\n\ntype ShaderBorderConfig = {\n bloom?: number;\n colors?: string[];\n inset?: number;\n intensity?: number;\n pulse?: number;\n roundness?: number;\n scale?: number;\n smoke?: number;\n smokeSize?: number;\n softness?: number;\n speed?: number;\n spotSize?: number;\n spots?: number;\n thickness?: number;\n};\n\nconst shaderDefaults: Required<ShaderBorderConfig> = {\n bloom: 0,\n colors: ['#BDDCFF', '#57A7FF', '#DEEAFC'],\n inset: 1,\n intensity: 0,\n pulse: 0.3,\n roundness: 0.6,\n scale: 1,\n smoke: 0.75,\n smokeSize: 0.7,\n softness: 0.6,\n speed: 2.2,\n spots: 8,\n spotSize: 0.75,\n thickness: 0.04,\n};\n\nconst spring = { bounce: 0, duration: 0.35, type: 'spring' as const };\n\ntype InputProps = ComponentProps<'input'> & {\n shaderBorder?: boolean | ShaderBorderConfig;\n};\n\nconst Input = forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, shaderBorder, style, ...props }, ref) => {\n const prefersReducedMotion = useReducedMotion();\n const inputClassName = cn(\n 'file:text-foreground placeholder:text-muted-foreground/60 selection:bg-primary selection:text-primary-foreground dark:bg-input/30 h-8 w-full min-w-0 touch-manipulation rounded-md border-0 bg-background px-3 py-1 text-base shadow-[var(--shadow-input)] transition-[color,box-shadow] duration-100 ease-out outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm',\n 'hover:shadow-[var(--shadow-input-hover)]',\n 'focus-visible:shadow-[0_0_0_1px_var(--ring),0_0_0_4px_var(--ring-halo,#0072EF26)]',\n 'aria-invalid:shadow-[0_0_0_1px_var(--destructive),0_0_1px_0_var(--destructive)] dark:aria-invalid:shadow-[0_0_0_1px_var(--destructive)]',\n className,\n );\n\n const isActive = !!shaderBorder;\n const config =\n typeof shaderBorder === 'object'\n ? { ...shaderDefaults, ...shaderBorder }\n : shaderDefaults;\n const inset = config.inset;\n\n if (shaderBorder !== undefined) {\n return (\n <div className='relative'>\n <AnimatePresence initial={false}>\n {isActive && (\n <motion.div\n key='shader-border'\n initial={prefersReducedMotion ? false : { opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={prefersReducedMotion ? { duration: 0 } : spring}\n className='absolute pointer-events-none z-20'\n style={{\n borderRadius: `${8 + inset}px`,\n inset: `-${inset}px`,\n willChange: 'opacity',\n }}\n >\n <PulsingBorder\n colorBack='#00000000'\n colors={config.colors}\n speed={config.speed}\n scale={config.scale}\n roundness={config.roundness}\n thickness={config.thickness}\n softness={config.softness}\n intensity={config.intensity}\n bloom={config.bloom}\n spots={config.spots}\n spotSize={config.spotSize}\n pulse={config.pulse}\n smoke={config.smoke}\n smokeSize={config.smokeSize}\n webGlContextAttributes={{\n alpha: true,\n premultipliedAlpha: true,\n }}\n className='size-full'\n style={{ borderRadius: `${8 + inset}px` }}\n />\n </motion.div>\n )}\n </AnimatePresence>\n <input\n ref={ref}\n type={type}\n data-slot='input'\n className={cn(\n inputClassName,\n isActive && 'animate-shimmer motion-reduce:animate-none',\n isActive && 'focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-[var(--ring)]',\n )}\n style={\n isActive\n ? {\n backgroundClip: 'text',\n backgroundImage: `linear-gradient(to right, color-mix(in srgb, ${config.colors[0]} 70%, #000), color-mix(in srgb, ${config.colors[1] || config.colors[0]} 70%, #000), color-mix(in srgb, ${config.colors[2] || config.colors[0]} 70%, #000), color-mix(in srgb, ${config.colors[0]} 70%, #000))`,\n backgroundSize: '200% 100%',\n boxShadow: 'none',\n color: 'transparent',\n WebkitBackgroundClip: 'text',\n ...style,\n }\n : style\n }\n {...props}\n />\n </div>\n );\n }\n\n return (\n <input\n ref={ref}\n type={type}\n data-slot='input'\n className={inputClassName}\n style={style}\n {...props}\n />\n );\n },\n);\nInput.displayName = 'Input';\n\nexport { Input };\nexport type { ShaderBorderConfig };\n","'use client';\n\nimport type { ComponentPropsWithoutRef, ComponentRef} from 'react';\nimport { forwardRef } from 'react';\nimport { Root } from '@radix-ui/react-label';\nimport { type VariantProps, cva } from 'class-variance-authority';\n\nimport { cn } from '../../../lib/utils';\n\nconst labelVariants = cva(\n 'text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70',\n);\n\nconst Label = forwardRef<\n ComponentRef<typeof Root>,\n ComponentPropsWithoutRef<typeof Root> & VariantProps<typeof labelVariants>\n>(({ className, ...props }, ref) => (\n <Root ref={ref} className={cn(labelVariants(), className)} {...props} />\n));\nLabel.displayName = Root.displayName;\n\nexport { Label };\n","'use client';\n\nimport type { ComponentPropsWithoutRef, ComponentRef } from 'react';\nimport { forwardRef } from 'react';\nimport { Root, Thumb } from '@radix-ui/react-switch';\n\nimport { cn } from '../../../lib/utils';\n\nconst Switch = forwardRef<\n ComponentRef<typeof Root>,\n ComponentPropsWithoutRef<typeof Root> & {\n size?: 'sm' | 'default';\n }\n>(({ className, size = 'default', ...props }, ref) => (\n <Root\n ref={ref}\n data-slot='switch'\n data-size={size}\n className={cn(\n \"peer data-[state=checked]:bg-(--action) data-[state=unchecked]:bg-input hover:data-[state=unchecked]:bg-[rgba(31,41,55,0.16)] group-hover/toggle:data-[state=unchecked]:bg-[rgba(31,41,55,0.16)] focus-visible:ring-ring/50 dark:data-[state=unchecked]:bg-input/80 dark:hover:data-[state=unchecked]:bg-[rgba(255,255,255,0.12)] dark:group-hover/toggle:data-[state=unchecked]:bg-[rgba(255,255,255,0.12)] relative group/switch inline-flex shrink-0 touch-manipulation items-center rounded-full border-0 shadow-[var(--shadow-control)] dark:shadow-[var(--shadow-control)] data-[state=checked]:shadow-[var(--shadow-control-checked)] dark:data-[state=checked]:shadow-[var(--shadow-control-checked)] transition-[color,background-color,box-shadow] duration-200 ease-out motion-reduce:transition-none outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 cursor-pointer data-[size=default]:h-[18px] data-[size=default]:w-[30px] data-[size=sm]:h-3.5 data-[size=sm]:w-[22px] before:absolute before:-inset-[15px] before:content-['']\",\n className,\n )}\n {...props}\n >\n <Thumb\n data-slot='switch-thumb'\n className={cn(\n 'pointer-events-none relative block ring-0',\n // travel only — slides between off/on with ease-out (Emil's blueprint)\n 'transition-transform duration-200 ease-out motion-reduce:transition-none',\n 'group-data-[size=default]/switch:size-3.5 group-data-[size=sm]/switch:size-2.5',\n 'data-[state=unchecked]:translate-x-0.5 group-data-[size=default]/switch:data-[state=checked]:translate-x-[14px] group-data-[size=sm]/switch:data-[state=checked]:translate-x-[10px]',\n )}\n >\n {/* Inner pill carries the appearance + the press stretch. It animates WIDTH\n (not scaleX, which would oval the round caps) and is pinned to the edge\n nearest the track wall — right when checked, left when unchecked — so it\n only ever grows inward toward the track centre, never past the wall. */}\n <span\n className={cn(\n 'absolute top-0 h-full rounded-full',\n 'bg-background dark:group-data-[state=checked]/switch:bg-white dark:group-data-[state=unchecked]/switch:bg-[oklch(0.500_0.013_253)]',\n 'shadow-[var(--shadow-control-thumb)] dark:shadow-[var(--shadow-control-thumb)]',\n 'group-data-[size=default]/switch:w-3.5 group-data-[size=sm]/switch:w-2.5',\n 'group-data-[state=checked]/switch:right-0 group-data-[state=unchecked]/switch:left-0',\n // press stretch (1.2×) — ease-out, quick, direct-manipulation feedback\n 'group-[&[data-size=default]:active]/switch:w-[17px] group-[&[data-size=sm]:active]/switch:w-3',\n 'transition-[width,background-color] duration-[120ms] ease-out motion-reduce:transition-none',\n )}\n />\n </Thumb>\n </Root>\n));\nSwitch.displayName = 'Switch';\n\nexport { Switch };\n","'use client'\n\nimport { type ReactNode, useId } from 'react'\nimport { HugeiconsIcon } from '@hugeicons/react'\nimport { Setting07Icon } from '@hugeicons/core-free-icons'\n\nimport { Switch } from '../ui/switch'\nimport { Button } from '../ui/button'\nimport { cn } from '../../lib/utils'\n\nexport interface ToggleRowProps {\n badge?: ReactNode,\n checked: boolean,\n children?: ReactNode,\n className?: string,\n description?: string,\n disabled?: boolean,\n icon?: ReactNode\n label: string,\n onCheckedChange: (checked: boolean) => void,\n onSettings?: () => void,\n switchPosition?: 'left' | 'right'\n}\n\nexport const ToggleRow = ({\n label,\n description,\n checked,\n onCheckedChange,\n disabled = false,\n switchPosition = 'left',\n icon,\n badge,\n onSettings,\n children,\n className,\n}: ToggleRowProps) => {\n const switchId = useId()\n const descId = useId()\n\n const cursorClass = disabled ? 'cursor-not-allowed' : 'cursor-pointer'\n\n if (switchPosition === 'left') {\n return (\n <div className={className}>\n <div className={cn('flex items-start gap-2.5 touch-manipulation group/toggle')}>\n <Switch\n id={switchId}\n aria-describedby={description ? descId : undefined}\n checked={checked}\n onCheckedChange={onCheckedChange}\n disabled={disabled}\n className='mt-0.5'\n />\n {icon && (\n <label\n htmlFor={switchId}\n className={cn('text-muted-foreground shrink-0 self-start', cursorClass)}\n >\n {icon}\n </label>\n )}\n <div className='flex-1 min-w-0'>\n <div className='flex items-center gap-2'>\n <label\n htmlFor={switchId}\n className={cn(\n 'font-medium select-none',\n disabled && 'text-muted-foreground',\n cursorClass\n )}\n >\n {label}\n </label>\n {badge}\n </div>\n {description && (\n <label\n htmlFor={switchId}\n id={descId}\n className={cn(\n 'block text-sm font-normal text-muted-foreground mt-1 text-pretty select-none',\n cursorClass\n )}\n >\n {description}\n </label>\n )}\n </div>\n </div>\n {children}\n </div>\n )\n }\n\n // switchPosition === \"right\"\n return (\n <div className={cn('space-y-3', className)}>\n <div>\n <div className='flex items-center justify-between gap-4'>\n <label\n htmlFor={switchId}\n className={cn('text-sm font-medium select-none', cursorClass)}\n >\n {label}\n </label>\n <div className='flex items-center gap-2 shrink-0'>\n {onSettings && checked && (\n <Button\n variant='ghost'\n size='icon-xs'\n onClick={onSettings}\n className='text-muted-foreground hover:text-foreground'\n aria-label='Configure'\n >\n <HugeiconsIcon icon={Setting07Icon} size={14} />\n </Button>\n )}\n <Switch\n id={switchId}\n aria-describedby={description ? descId : undefined}\n checked={checked}\n onCheckedChange={onCheckedChange}\n disabled={disabled}\n />\n </div>\n </div>\n {description && (\n <label\n htmlFor={switchId}\n id={descId}\n className={cn(\n 'block text-sm font-normal text-muted-foreground mt-0.5 text-pretty select-none',\n cursorClass\n )}\n >\n {description}\n </label>\n )}\n </div>\n {checked && children && children}\n </div>\n )\n}\n"],"mappings":"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"}
|
|
@@ -14,9 +14,72 @@ import { Root as Root$1, Thumb } from "@radix-ui/react-switch";
|
|
|
14
14
|
//#region src/lib/utils.ts
|
|
15
15
|
const cn = (...inputs) => twMerge(clsx(inputs));
|
|
16
16
|
|
|
17
|
+
//#endregion
|
|
18
|
+
//#region src/components/ui/spinner/spinner.tsx
|
|
19
|
+
/** Maps the `size` prop to Tailwind size utilities. */
|
|
20
|
+
const sizeMap = {
|
|
21
|
+
lg: "size-6",
|
|
22
|
+
md: "size-4",
|
|
23
|
+
sm: "size-3"
|
|
24
|
+
};
|
|
25
|
+
const Spinner = ({ className, size = "md" }) => /* @__PURE__ */ jsx("output", {
|
|
26
|
+
"aria-label": "Loading",
|
|
27
|
+
className: "inline-flex",
|
|
28
|
+
children: /* @__PURE__ */ jsxs("svg", {
|
|
29
|
+
viewBox: "0 0 24 24",
|
|
30
|
+
fill: "none",
|
|
31
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
32
|
+
className: cn("animate-spin motion-reduce:animate-none", sizeMap[size], className),
|
|
33
|
+
children: [/* @__PURE__ */ jsx("circle", {
|
|
34
|
+
className: "opacity-25",
|
|
35
|
+
cx: "12",
|
|
36
|
+
cy: "12",
|
|
37
|
+
r: "10",
|
|
38
|
+
stroke: "currentColor",
|
|
39
|
+
strokeWidth: "4"
|
|
40
|
+
}), /* @__PURE__ */ jsx("path", {
|
|
41
|
+
className: "opacity-75",
|
|
42
|
+
fill: "currentColor",
|
|
43
|
+
d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"
|
|
44
|
+
})]
|
|
45
|
+
})
|
|
46
|
+
});
|
|
47
|
+
|
|
17
48
|
//#endregion
|
|
18
49
|
//#region src/components/ui/button/button.tsx
|
|
19
|
-
const buttonVariants = cva("relative isolate inline-flex items-center justify-center gap-1.5 whitespace-nowrap select-none text-[13px] font-medium leading-[calc(18/13)] touch-manipulation transition-[background-color,color,opacity,box-shadow,transform,filter,scale] duration-150 ease active:scale-[0.96] cursor-pointer border-0 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40", {
|
|
50
|
+
const buttonVariants = cva("relative isolate inline-flex items-center justify-center gap-1.5 whitespace-nowrap select-none text-[13px] font-medium leading-[calc(18/13)] touch-manipulation transition-[background-color,color,opacity,box-shadow,transform,filter,scale] duration-150 ease-out active:scale-[0.96] motion-reduce:transition-none cursor-pointer border-0 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40", {
|
|
51
|
+
compoundVariants: [
|
|
52
|
+
{
|
|
53
|
+
class: "min-w-16",
|
|
54
|
+
size: "sm",
|
|
55
|
+
variant: [
|
|
56
|
+
"default",
|
|
57
|
+
"destructive",
|
|
58
|
+
"outline",
|
|
59
|
+
"secondary"
|
|
60
|
+
]
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
class: "min-w-20",
|
|
64
|
+
size: "default",
|
|
65
|
+
variant: [
|
|
66
|
+
"default",
|
|
67
|
+
"destructive",
|
|
68
|
+
"outline",
|
|
69
|
+
"secondary"
|
|
70
|
+
]
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
class: "min-w-24",
|
|
74
|
+
size: "lg",
|
|
75
|
+
variant: [
|
|
76
|
+
"default",
|
|
77
|
+
"destructive",
|
|
78
|
+
"outline",
|
|
79
|
+
"secondary"
|
|
80
|
+
]
|
|
81
|
+
}
|
|
82
|
+
],
|
|
20
83
|
defaultVariants: {
|
|
21
84
|
size: "default",
|
|
22
85
|
variant: "default"
|
|
@@ -47,8 +110,10 @@ const buttonVariants = cva("relative isolate inline-flex items-center justify-ce
|
|
|
47
110
|
* Variants: `default` | `destructive` | `outline` | `secondary` | `ghost` | `link`.
|
|
48
111
|
* Sizes: `default` | `sm` | `xs` | `lg` | `icon` | `icon-sm` | `icon-xs`.
|
|
49
112
|
* Set `asChild` to render the button styles onto a child element (e.g. an anchor) instead of a `<button>`.
|
|
113
|
+
* Set `loading` to show an inline spinner before the label and disable interaction while an async action is pending.
|
|
114
|
+
* When `asChild` is true, `loading` is ignored — the Slot host cannot render an additional spinner child.
|
|
50
115
|
*/
|
|
51
|
-
const Button = ({ className, variant = "default", size = "default", asChild = false, ...props }) => {
|
|
116
|
+
const Button = ({ className, variant = "default", size = "default", asChild = false, loading = false, disabled, children, style, ...props }) => {
|
|
52
117
|
if (asChild) return /* @__PURE__ */ jsx(Slot, {
|
|
53
118
|
"data-slot": "button",
|
|
54
119
|
"data-size": size,
|
|
@@ -58,18 +123,27 @@ const Button = ({ className, variant = "default", size = "default", asChild = fa
|
|
|
58
123
|
size,
|
|
59
124
|
variant
|
|
60
125
|
})),
|
|
61
|
-
...props
|
|
126
|
+
...props,
|
|
127
|
+
disabled,
|
|
128
|
+
style,
|
|
129
|
+
children
|
|
62
130
|
});
|
|
63
|
-
return /* @__PURE__ */
|
|
131
|
+
return /* @__PURE__ */ jsxs("button", {
|
|
64
132
|
"data-slot": "button",
|
|
65
133
|
"data-size": size,
|
|
66
134
|
"data-variant": variant,
|
|
67
135
|
className: cn(buttonVariants({
|
|
68
|
-
className,
|
|
69
136
|
size,
|
|
70
137
|
variant
|
|
71
|
-
})),
|
|
72
|
-
|
|
138
|
+
}), loading && "cursor-wait", className),
|
|
139
|
+
disabled: disabled || loading,
|
|
140
|
+
"aria-busy": loading || void 0,
|
|
141
|
+
style: loading ? {
|
|
142
|
+
opacity: 1,
|
|
143
|
+
...style
|
|
144
|
+
} : style,
|
|
145
|
+
...props,
|
|
146
|
+
children: [loading && /* @__PURE__ */ jsx(Spinner, { className: "size-3.5" }), children]
|
|
73
147
|
});
|
|
74
148
|
};
|
|
75
149
|
|
|
@@ -102,7 +176,7 @@ const spring = {
|
|
|
102
176
|
};
|
|
103
177
|
const Input = forwardRef(({ className, type, shaderBorder, style, ...props }, ref) => {
|
|
104
178
|
const prefersReducedMotion = useReducedMotion();
|
|
105
|
-
const inputClassName = cn("file:text-foreground placeholder:text-muted-foreground/60 selection:bg-primary selection:text-primary-foreground dark:bg-input/30 h-8 w-full min-w-0 touch-manipulation rounded-md border-0 bg-background px-3 py-1 text-base shadow-[var(--shadow-input)] transition-[color,box-shadow] duration-100 ease-out outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm", "hover:shadow-[var(--shadow-input-hover)]", "focus-visible:shadow-[0_0_0_1px_var(--ring),
|
|
179
|
+
const inputClassName = cn("file:text-foreground placeholder:text-muted-foreground/60 selection:bg-primary selection:text-primary-foreground dark:bg-input/30 h-8 w-full min-w-0 touch-manipulation rounded-md border-0 bg-background px-3 py-1 text-base shadow-[var(--shadow-input)] transition-[color,box-shadow] duration-100 ease-out outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm", "hover:shadow-[var(--shadow-input-hover)]", "focus-visible:shadow-[0_0_0_1px_var(--ring),0_0_0_4px_var(--ring-halo,#0072EF26)]", "aria-invalid:shadow-[0_0_0_1px_var(--destructive),0_0_1px_0_var(--destructive)] dark:aria-invalid:shadow-[0_0_0_1px_var(--destructive)]", className);
|
|
106
180
|
const isActive = !!shaderBorder;
|
|
107
181
|
const config = typeof shaderBorder === "object" ? {
|
|
108
182
|
...shaderDefaults,
|
|
@@ -151,7 +225,7 @@ const Input = forwardRef(({ className, type, shaderBorder, style, ...props }, re
|
|
|
151
225
|
ref,
|
|
152
226
|
type,
|
|
153
227
|
"data-slot": "input",
|
|
154
|
-
className: cn(inputClassName, isActive && "animate-shimmer motion-reduce:animate-none"),
|
|
228
|
+
className: cn(inputClassName, isActive && "animate-shimmer motion-reduce:animate-none", isActive && "focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-[var(--ring)]"),
|
|
155
229
|
style: isActive ? {
|
|
156
230
|
backgroundClip: "text",
|
|
157
231
|
backgroundImage: `linear-gradient(to right, color-mix(in srgb, ${config.colors[0]} 70%, #000), color-mix(in srgb, ${config.colors[1] || config.colors[0]} 70%, #000), color-mix(in srgb, ${config.colors[2] || config.colors[0]} 70%, #000), color-mix(in srgb, ${config.colors[0]} 70%, #000))`,
|
|
@@ -191,11 +265,12 @@ const Switch = forwardRef(({ className, size = "default", ...props }, ref) => /*
|
|
|
191
265
|
ref,
|
|
192
266
|
"data-slot": "switch",
|
|
193
267
|
"data-size": size,
|
|
194
|
-
className: cn("peer data-[state=checked]:bg-(--action) data-[state=unchecked]:bg-input hover:data-[state=unchecked]:bg-[rgba(31,41,55,0.
|
|
268
|
+
className: cn("peer data-[state=checked]:bg-(--action) data-[state=unchecked]:bg-input hover:data-[state=unchecked]:bg-[rgba(31,41,55,0.16)] group-hover/toggle:data-[state=unchecked]:bg-[rgba(31,41,55,0.16)] focus-visible:ring-ring/50 dark:data-[state=unchecked]:bg-input/80 dark:hover:data-[state=unchecked]:bg-[rgba(255,255,255,0.12)] dark:group-hover/toggle:data-[state=unchecked]:bg-[rgba(255,255,255,0.12)] relative group/switch inline-flex shrink-0 touch-manipulation items-center rounded-full border-0 shadow-[var(--shadow-control)] dark:shadow-[var(--shadow-control)] data-[state=checked]:shadow-[var(--shadow-control-checked)] dark:data-[state=checked]:shadow-[var(--shadow-control-checked)] transition-[color,background-color,box-shadow] duration-200 ease-out motion-reduce:transition-none outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 cursor-pointer data-[size=default]:h-[18px] data-[size=default]:w-[30px] data-[size=sm]:h-3.5 data-[size=sm]:w-[22px] before:absolute before:-inset-[15px] before:content-['']", className),
|
|
195
269
|
...props,
|
|
196
270
|
children: /* @__PURE__ */ jsx(Thumb, {
|
|
197
271
|
"data-slot": "switch-thumb",
|
|
198
|
-
className: cn("
|
|
272
|
+
className: cn("pointer-events-none relative block ring-0", "transition-transform duration-200 ease-out motion-reduce:transition-none", "group-data-[size=default]/switch:size-3.5 group-data-[size=sm]/switch:size-2.5", "data-[state=unchecked]:translate-x-0.5 group-data-[size=default]/switch:data-[state=checked]:translate-x-[14px] group-data-[size=sm]/switch:data-[state=checked]:translate-x-[10px]"),
|
|
273
|
+
children: /* @__PURE__ */ jsx("span", { className: cn("absolute top-0 h-full rounded-full", "bg-background dark:group-data-[state=checked]/switch:bg-white dark:group-data-[state=unchecked]/switch:bg-[oklch(0.500_0.013_253)]", "shadow-[var(--shadow-control-thumb)] dark:shadow-[var(--shadow-control-thumb)]", "group-data-[size=default]/switch:w-3.5 group-data-[size=sm]/switch:w-2.5", "group-data-[state=checked]/switch:right-0 group-data-[state=unchecked]/switch:left-0", "group-[&[data-size=default]:active]/switch:w-[17px] group-[&[data-size=sm]:active]/switch:w-3", "transition-[width,background-color] duration-[120ms] ease-out motion-reduce:transition-none") })
|
|
199
274
|
})
|
|
200
275
|
}));
|
|
201
276
|
Switch.displayName = "Switch";
|
|
@@ -281,5 +356,5 @@ const ToggleRow = ({ label, description, checked, onCheckedChange, disabled = fa
|
|
|
281
356
|
};
|
|
282
357
|
|
|
283
358
|
//#endregion
|
|
284
|
-
export { Button as a, Input as i, Switch as n, buttonVariants as o, Label as r,
|
|
285
|
-
//# sourceMappingURL=toggle-row-
|
|
359
|
+
export { Button as a, cn as c, Input as i, Switch as n, buttonVariants as o, Label as r, Spinner as s, ToggleRow as t };
|
|
360
|
+
//# sourceMappingURL=toggle-row-h0h1m_hc.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toggle-row-h0h1m_hc.esm.js","names":["shaderDefaults: Required<ShaderBorderConfig>","Root"],"sources":["../src/lib/utils.ts","../src/components/ui/spinner/spinner.tsx","../src/components/ui/button/button.tsx","../src/components/ui/input/input.tsx","../src/components/ui/label/label.tsx","../src/components/ui/switch/switch.tsx","../src/components/toggle-row/toggle-row.tsx"],"sourcesContent":["import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport const cn = (...inputs: ClassValue[]) => twMerge(clsx(inputs));\n","import { cn } from '../../../lib/utils';\n\n/** Maps the `size` prop to Tailwind size utilities. */\nconst sizeMap = {\n lg: 'size-6',\n md: 'size-4',\n sm: 'size-3',\n} as const;\n\ntype SpinnerSize = keyof typeof sizeMap;\n\ntype SpinnerProps = {\n className?: string;\n /** Controls the spinner diameter. Defaults to `md` (size-4). `className` wins over `size`. */\n size?: SpinnerSize;\n};\n\nconst Spinner = ({ className, size = 'md' }: SpinnerProps) => (\n <output aria-label='Loading' className='inline-flex'>\n <svg\n viewBox='0 0 24 24'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n className={cn('animate-spin motion-reduce:animate-none', sizeMap[size], className)}\n >\n <circle\n className='opacity-25'\n cx='12'\n cy='12'\n r='10'\n stroke='currentColor'\n strokeWidth='4'\n />\n <path\n className='opacity-75'\n fill='currentColor'\n d='M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z'\n />\n </svg>\n </output>\n);\n\nexport { Spinner };\nexport type { SpinnerProps, SpinnerSize };\n","import { type ComponentProps } from 'react';\nimport { type VariantProps, cva } from 'class-variance-authority';\nimport { Slot } from '@radix-ui/react-slot';\n\nimport { cn } from '../../../lib/utils';\nimport { Spinner } from '../spinner';\n\nconst buttonVariants = cva(\n \"relative isolate inline-flex items-center justify-center gap-1.5 whitespace-nowrap select-none text-[13px] font-medium leading-[calc(18/13)] touch-manipulation transition-[background-color,color,opacity,box-shadow,transform,filter,scale] duration-150 ease-out active:scale-[0.96] motion-reduce:transition-none cursor-pointer border-0 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40\",\n {\n // Min-width floors so short labels (Done/OK/Save) read as proper buttons and\n // paired footer actions balance — only for solid/outlined TEXT buttons.\n // Excluded by design: `ghost`/`link` (inline text, no button floor) and all\n // `icon*` sizes (square). `min-w-*` (not fixed width) so labels still grow,\n // and `w-full`/`flex-1` usages override it harmlessly.\n compoundVariants: [\n {\n class: 'min-w-16',\n size: 'sm',\n variant: ['default', 'destructive', 'outline', 'secondary'],\n },\n {\n class: 'min-w-20',\n size: 'default',\n variant: ['default', 'destructive', 'outline', 'secondary'],\n },\n {\n class: 'min-w-24',\n size: 'lg',\n variant: ['default', 'destructive', 'outline', 'secondary'],\n },\n ],\n defaultVariants: {\n size: 'default',\n variant: 'default',\n },\n variants: {\n size: {\n default: \"rounded-md px-3 py-1.5 h-8 has-[>svg]:px-2.5 [&_svg:not([class*='size-'])]:size-3.5\",\n \"icon\": 'size-9 rounded-md',\n \"icon-sm\": \"size-7 rounded-md [&_svg:not([class*='size-'])]:size-3.5 relative before:absolute before:-inset-[6px] before:content-['']\",\n \"icon-xs\": \"size-6 rounded-md [&_svg:not([class*='size-'])]:size-3 relative before:absolute before:-inset-[9px] before:content-['']\",\n lg: \"rounded-md px-5 py-2.5 h-10 has-[>svg]:px-4 [&_svg:not([class*='size-'])]:size-4\",\n sm: \"rounded-md px-2.5 py-1 h-7 has-[>svg]:px-2 [&_svg:not([class*='size-'])]:size-3 before:absolute before:-inset-y-[6px] before:inset-x-0 before:content-['']\",\n xs: \"rounded-md px-3 py-1 h-7 [&_svg:not([class*='size-'])]:size-3\",\n },\n variant: {\n default:\n 'bg-(--action) text-white shadow-[0_0_0_1px_var(--action),var(--shadow-button)] hover:brightness-105 [text-shadow:0_1px_1px_rgba(0,0,0,0.16)]',\n destructive:\n 'bg-destructive text-white shadow-[0_0_0_1px_var(--destructive),var(--shadow-button)] hover:brightness-105 [text-shadow:0_1px_1px_rgba(0,0,0,0.16)] focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40',\n ghost:\n 'text-muted-foreground hover:bg-[#f8f8f9] hover:text-foreground dark:hover:bg-white/[0.06]',\n link: 'text-(--action) underline-offset-4 hover:underline',\n outline:\n 'bg-white shadow-[var(--shadow-input)] hover:bg-[#f8f8f9] hover:shadow-[var(--shadow-input-hover)] dark:bg-input/30 dark:hover:bg-white/[0.06]',\n secondary:\n 'bg-white shadow-[var(--shadow-secondary)] hover:bg-[#f8f8f9] hover:shadow-[var(--shadow-secondary-hover)] dark:bg-input/30 dark:hover:bg-white/[0.06]',\n },\n },\n },\n);\n\n/**\n * Primary clickable action button.\n *\n * Variants: `default` | `destructive` | `outline` | `secondary` | `ghost` | `link`.\n * Sizes: `default` | `sm` | `xs` | `lg` | `icon` | `icon-sm` | `icon-xs`.\n * Set `asChild` to render the button styles onto a child element (e.g. an anchor) instead of a `<button>`.\n * Set `loading` to show an inline spinner before the label and disable interaction while an async action is pending.\n * When `asChild` is true, `loading` is ignored — the Slot host cannot render an additional spinner child.\n */\nconst Button = ({\n className,\n variant = 'default',\n size = 'default',\n asChild = false,\n loading = false,\n disabled,\n children,\n style,\n ...props\n}: ComponentProps<'button'> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean;\n /** When true, renders an inline spinner before the label and disables interaction. */\n loading?: boolean;\n }) => {\n if (asChild) {\n return (\n <Slot\n data-slot='button'\n data-size={size}\n data-variant={variant}\n className={cn(buttonVariants({ className, size, variant }))}\n {...{ ...props, disabled, style }}\n >\n {children}\n </Slot>\n );\n }\n\n return (\n <button\n data-slot='button'\n data-size={size}\n data-variant={variant}\n className={cn(\n buttonVariants({ size, variant }),\n // Loading stays full-strength (not the 50% disabled wash) so it reads as\n // \"working\", not \"disabled\" — interaction is still blocked via `disabled`.\n loading && 'cursor-wait',\n className,\n )}\n disabled={disabled || loading}\n aria-busy={loading || undefined}\n // Inline opacity wins over the class-level `disabled:opacity-50` so the\n // loading button keeps its color while remaining truly disabled.\n style={loading ? { opacity: 1, ...style } : style}\n {...props}\n >\n {loading && (\n // Size matches the svg sizing the button already applies to icons at each size\n <Spinner className='size-3.5' />\n )}\n {children}\n </button>\n );\n};\n\nexport { Button, buttonVariants };\n","'use client';\n\nimport type { ComponentProps } from 'react';\nimport { forwardRef } from 'react';\nimport { AnimatePresence, motion, useReducedMotion } from 'motion/react';\nimport { PulsingBorder } from '@paper-design/shaders-react';\n\nimport { cn } from '../../../lib/utils';\n\ntype ShaderBorderConfig = {\n bloom?: number;\n colors?: string[];\n inset?: number;\n intensity?: number;\n pulse?: number;\n roundness?: number;\n scale?: number;\n smoke?: number;\n smokeSize?: number;\n softness?: number;\n speed?: number;\n spotSize?: number;\n spots?: number;\n thickness?: number;\n};\n\nconst shaderDefaults: Required<ShaderBorderConfig> = {\n bloom: 0,\n colors: ['#BDDCFF', '#57A7FF', '#DEEAFC'],\n inset: 1,\n intensity: 0,\n pulse: 0.3,\n roundness: 0.6,\n scale: 1,\n smoke: 0.75,\n smokeSize: 0.7,\n softness: 0.6,\n speed: 2.2,\n spots: 8,\n spotSize: 0.75,\n thickness: 0.04,\n};\n\nconst spring = { bounce: 0, duration: 0.35, type: 'spring' as const };\n\ntype InputProps = ComponentProps<'input'> & {\n shaderBorder?: boolean | ShaderBorderConfig;\n};\n\nconst Input = forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, shaderBorder, style, ...props }, ref) => {\n const prefersReducedMotion = useReducedMotion();\n const inputClassName = cn(\n 'file:text-foreground placeholder:text-muted-foreground/60 selection:bg-primary selection:text-primary-foreground dark:bg-input/30 h-8 w-full min-w-0 touch-manipulation rounded-md border-0 bg-background px-3 py-1 text-base shadow-[var(--shadow-input)] transition-[color,box-shadow] duration-100 ease-out outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm',\n 'hover:shadow-[var(--shadow-input-hover)]',\n 'focus-visible:shadow-[0_0_0_1px_var(--ring),0_0_0_4px_var(--ring-halo,#0072EF26)]',\n 'aria-invalid:shadow-[0_0_0_1px_var(--destructive),0_0_1px_0_var(--destructive)] dark:aria-invalid:shadow-[0_0_0_1px_var(--destructive)]',\n className,\n );\n\n const isActive = !!shaderBorder;\n const config =\n typeof shaderBorder === 'object'\n ? { ...shaderDefaults, ...shaderBorder }\n : shaderDefaults;\n const inset = config.inset;\n\n if (shaderBorder !== undefined) {\n return (\n <div className='relative'>\n <AnimatePresence initial={false}>\n {isActive && (\n <motion.div\n key='shader-border'\n initial={prefersReducedMotion ? false : { opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={prefersReducedMotion ? { duration: 0 } : spring}\n className='absolute pointer-events-none z-20'\n style={{\n borderRadius: `${8 + inset}px`,\n inset: `-${inset}px`,\n willChange: 'opacity',\n }}\n >\n <PulsingBorder\n colorBack='#00000000'\n colors={config.colors}\n speed={config.speed}\n scale={config.scale}\n roundness={config.roundness}\n thickness={config.thickness}\n softness={config.softness}\n intensity={config.intensity}\n bloom={config.bloom}\n spots={config.spots}\n spotSize={config.spotSize}\n pulse={config.pulse}\n smoke={config.smoke}\n smokeSize={config.smokeSize}\n webGlContextAttributes={{\n alpha: true,\n premultipliedAlpha: true,\n }}\n className='size-full'\n style={{ borderRadius: `${8 + inset}px` }}\n />\n </motion.div>\n )}\n </AnimatePresence>\n <input\n ref={ref}\n type={type}\n data-slot='input'\n className={cn(\n inputClassName,\n isActive && 'animate-shimmer motion-reduce:animate-none',\n isActive && 'focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-[var(--ring)]',\n )}\n style={\n isActive\n ? {\n backgroundClip: 'text',\n backgroundImage: `linear-gradient(to right, color-mix(in srgb, ${config.colors[0]} 70%, #000), color-mix(in srgb, ${config.colors[1] || config.colors[0]} 70%, #000), color-mix(in srgb, ${config.colors[2] || config.colors[0]} 70%, #000), color-mix(in srgb, ${config.colors[0]} 70%, #000))`,\n backgroundSize: '200% 100%',\n boxShadow: 'none',\n color: 'transparent',\n WebkitBackgroundClip: 'text',\n ...style,\n }\n : style\n }\n {...props}\n />\n </div>\n );\n }\n\n return (\n <input\n ref={ref}\n type={type}\n data-slot='input'\n className={inputClassName}\n style={style}\n {...props}\n />\n );\n },\n);\nInput.displayName = 'Input';\n\nexport { Input };\nexport type { ShaderBorderConfig };\n","'use client';\n\nimport type { ComponentPropsWithoutRef, ComponentRef} from 'react';\nimport { forwardRef } from 'react';\nimport { Root } from '@radix-ui/react-label';\nimport { type VariantProps, cva } from 'class-variance-authority';\n\nimport { cn } from '../../../lib/utils';\n\nconst labelVariants = cva(\n 'text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70',\n);\n\nconst Label = forwardRef<\n ComponentRef<typeof Root>,\n ComponentPropsWithoutRef<typeof Root> & VariantProps<typeof labelVariants>\n>(({ className, ...props }, ref) => (\n <Root ref={ref} className={cn(labelVariants(), className)} {...props} />\n));\nLabel.displayName = Root.displayName;\n\nexport { Label };\n","'use client';\n\nimport type { ComponentPropsWithoutRef, ComponentRef } from 'react';\nimport { forwardRef } from 'react';\nimport { Root, Thumb } from '@radix-ui/react-switch';\n\nimport { cn } from '../../../lib/utils';\n\nconst Switch = forwardRef<\n ComponentRef<typeof Root>,\n ComponentPropsWithoutRef<typeof Root> & {\n size?: 'sm' | 'default';\n }\n>(({ className, size = 'default', ...props }, ref) => (\n <Root\n ref={ref}\n data-slot='switch'\n data-size={size}\n className={cn(\n \"peer data-[state=checked]:bg-(--action) data-[state=unchecked]:bg-input hover:data-[state=unchecked]:bg-[rgba(31,41,55,0.16)] group-hover/toggle:data-[state=unchecked]:bg-[rgba(31,41,55,0.16)] focus-visible:ring-ring/50 dark:data-[state=unchecked]:bg-input/80 dark:hover:data-[state=unchecked]:bg-[rgba(255,255,255,0.12)] dark:group-hover/toggle:data-[state=unchecked]:bg-[rgba(255,255,255,0.12)] relative group/switch inline-flex shrink-0 touch-manipulation items-center rounded-full border-0 shadow-[var(--shadow-control)] dark:shadow-[var(--shadow-control)] data-[state=checked]:shadow-[var(--shadow-control-checked)] dark:data-[state=checked]:shadow-[var(--shadow-control-checked)] transition-[color,background-color,box-shadow] duration-200 ease-out motion-reduce:transition-none outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 cursor-pointer data-[size=default]:h-[18px] data-[size=default]:w-[30px] data-[size=sm]:h-3.5 data-[size=sm]:w-[22px] before:absolute before:-inset-[15px] before:content-['']\",\n className,\n )}\n {...props}\n >\n <Thumb\n data-slot='switch-thumb'\n className={cn(\n 'pointer-events-none relative block ring-0',\n // travel only — slides between off/on with ease-out (Emil's blueprint)\n 'transition-transform duration-200 ease-out motion-reduce:transition-none',\n 'group-data-[size=default]/switch:size-3.5 group-data-[size=sm]/switch:size-2.5',\n 'data-[state=unchecked]:translate-x-0.5 group-data-[size=default]/switch:data-[state=checked]:translate-x-[14px] group-data-[size=sm]/switch:data-[state=checked]:translate-x-[10px]',\n )}\n >\n {/* Inner pill carries the appearance + the press stretch. It animates WIDTH\n (not scaleX, which would oval the round caps) and is pinned to the edge\n nearest the track wall — right when checked, left when unchecked — so it\n only ever grows inward toward the track centre, never past the wall. */}\n <span\n className={cn(\n 'absolute top-0 h-full rounded-full',\n 'bg-background dark:group-data-[state=checked]/switch:bg-white dark:group-data-[state=unchecked]/switch:bg-[oklch(0.500_0.013_253)]',\n 'shadow-[var(--shadow-control-thumb)] dark:shadow-[var(--shadow-control-thumb)]',\n 'group-data-[size=default]/switch:w-3.5 group-data-[size=sm]/switch:w-2.5',\n 'group-data-[state=checked]/switch:right-0 group-data-[state=unchecked]/switch:left-0',\n // press stretch (1.2×) — ease-out, quick, direct-manipulation feedback\n 'group-[&[data-size=default]:active]/switch:w-[17px] group-[&[data-size=sm]:active]/switch:w-3',\n 'transition-[width,background-color] duration-[120ms] ease-out motion-reduce:transition-none',\n )}\n />\n </Thumb>\n </Root>\n));\nSwitch.displayName = 'Switch';\n\nexport { Switch };\n","'use client'\n\nimport { type ReactNode, useId } from 'react'\nimport { HugeiconsIcon } from '@hugeicons/react'\nimport { Setting07Icon } from '@hugeicons/core-free-icons'\n\nimport { Switch } from '../ui/switch'\nimport { Button } from '../ui/button'\nimport { cn } from '../../lib/utils'\n\nexport interface ToggleRowProps {\n badge?: ReactNode,\n checked: boolean,\n children?: ReactNode,\n className?: string,\n description?: string,\n disabled?: boolean,\n icon?: ReactNode\n label: string,\n onCheckedChange: (checked: boolean) => void,\n onSettings?: () => void,\n switchPosition?: 'left' | 'right'\n}\n\nexport const ToggleRow = ({\n label,\n description,\n checked,\n onCheckedChange,\n disabled = false,\n switchPosition = 'left',\n icon,\n badge,\n onSettings,\n children,\n className,\n}: ToggleRowProps) => {\n const switchId = useId()\n const descId = useId()\n\n const cursorClass = disabled ? 'cursor-not-allowed' : 'cursor-pointer'\n\n if (switchPosition === 'left') {\n return (\n <div className={className}>\n <div className={cn('flex items-start gap-2.5 touch-manipulation group/toggle')}>\n <Switch\n id={switchId}\n aria-describedby={description ? descId : undefined}\n checked={checked}\n onCheckedChange={onCheckedChange}\n disabled={disabled}\n className='mt-0.5'\n />\n {icon && (\n <label\n htmlFor={switchId}\n className={cn('text-muted-foreground shrink-0 self-start', cursorClass)}\n >\n {icon}\n </label>\n )}\n <div className='flex-1 min-w-0'>\n <div className='flex items-center gap-2'>\n <label\n htmlFor={switchId}\n className={cn(\n 'font-medium select-none',\n disabled && 'text-muted-foreground',\n cursorClass\n )}\n >\n {label}\n </label>\n {badge}\n </div>\n {description && (\n <label\n htmlFor={switchId}\n id={descId}\n className={cn(\n 'block text-sm font-normal text-muted-foreground mt-1 text-pretty select-none',\n cursorClass\n )}\n >\n {description}\n </label>\n )}\n </div>\n </div>\n {children}\n </div>\n )\n }\n\n // switchPosition === \"right\"\n return (\n <div className={cn('space-y-3', className)}>\n <div>\n <div className='flex items-center justify-between gap-4'>\n <label\n htmlFor={switchId}\n className={cn('text-sm font-medium select-none', cursorClass)}\n >\n {label}\n </label>\n <div className='flex items-center gap-2 shrink-0'>\n {onSettings && checked && (\n <Button\n variant='ghost'\n size='icon-xs'\n onClick={onSettings}\n className='text-muted-foreground hover:text-foreground'\n aria-label='Configure'\n >\n <HugeiconsIcon icon={Setting07Icon} size={14} />\n </Button>\n )}\n <Switch\n id={switchId}\n aria-describedby={description ? descId : undefined}\n checked={checked}\n onCheckedChange={onCheckedChange}\n disabled={disabled}\n />\n </div>\n </div>\n {description && (\n <label\n htmlFor={switchId}\n id={descId}\n className={cn(\n 'block text-sm font-normal text-muted-foreground mt-0.5 text-pretty select-none',\n cursorClass\n )}\n >\n {description}\n </label>\n )}\n </div>\n {checked && children && children}\n </div>\n )\n}\n"],"mappings":"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"}
|