@7onic-ui/react 0.3.9 → 0.3.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/chart.mjs +3 -9
- package/dist/chart.mjs.map +1 -1
- package/dist/chunk-234NAXGV.mjs +252 -0
- package/dist/chunk-234NAXGV.mjs.map +1 -0
- package/dist/chunk-53MIUPSY.mjs +13 -0
- package/dist/chunk-53MIUPSY.mjs.map +1 -0
- package/dist/chunk-BN5BEA3V.mjs +195 -0
- package/dist/chunk-BN5BEA3V.mjs.map +1 -0
- package/dist/chunk-COW3B62M.mjs +214 -0
- package/dist/chunk-COW3B62M.mjs.map +1 -0
- package/dist/chunk-CTH6SN5Y.mjs +114 -0
- package/dist/chunk-CTH6SN5Y.mjs.map +1 -0
- package/dist/chunk-D3NTQNDW.mjs +440 -0
- package/dist/chunk-D3NTQNDW.mjs.map +1 -0
- package/dist/chunk-DDRYEJBJ.mjs +164 -0
- package/dist/chunk-DDRYEJBJ.mjs.map +1 -0
- package/dist/chunk-DJAEXCRU.mjs +190 -0
- package/dist/chunk-DJAEXCRU.mjs.map +1 -0
- package/dist/chunk-DRVHHEAY.mjs +145 -0
- package/dist/chunk-DRVHHEAY.mjs.map +1 -0
- package/dist/chunk-DTLNWOTR.mjs +482 -0
- package/dist/chunk-DTLNWOTR.mjs.map +1 -0
- package/dist/chunk-DYYQOHQR.mjs +214 -0
- package/dist/chunk-DYYQOHQR.mjs.map +1 -0
- package/dist/chunk-FHUAH6AJ.mjs +93 -0
- package/dist/chunk-FHUAH6AJ.mjs.map +1 -0
- package/dist/chunk-GD4YE5AE.mjs +209 -0
- package/dist/chunk-GD4YE5AE.mjs.map +1 -0
- package/dist/chunk-GRCJ35DX.mjs +144 -0
- package/dist/chunk-GRCJ35DX.mjs.map +1 -0
- package/dist/chunk-HHX4GABH.mjs +129 -0
- package/dist/chunk-HHX4GABH.mjs.map +1 -0
- package/dist/chunk-IPCIC2BI.mjs +148 -0
- package/dist/chunk-IPCIC2BI.mjs.map +1 -0
- package/dist/chunk-IY3R2VGB.mjs +272 -0
- package/dist/chunk-IY3R2VGB.mjs.map +1 -0
- package/dist/chunk-JCJEVXER.mjs +170 -0
- package/dist/chunk-JCJEVXER.mjs.map +1 -0
- package/dist/chunk-KBPYAMGS.mjs +157 -0
- package/dist/chunk-KBPYAMGS.mjs.map +1 -0
- package/dist/chunk-LJJ6K4IU.mjs +318 -0
- package/dist/chunk-LJJ6K4IU.mjs.map +1 -0
- package/dist/chunk-MRUVGHGP.mjs +375 -0
- package/dist/chunk-MRUVGHGP.mjs.map +1 -0
- package/dist/chunk-N4K2BDGM.mjs +153 -0
- package/dist/chunk-N4K2BDGM.mjs.map +1 -0
- package/dist/chunk-NWFMJWGX.mjs +165 -0
- package/dist/chunk-NWFMJWGX.mjs.map +1 -0
- package/dist/chunk-PTAPPOKU.mjs +117 -0
- package/dist/chunk-PTAPPOKU.mjs.map +1 -0
- package/dist/chunk-PVTBM7V7.mjs +316 -0
- package/dist/chunk-PVTBM7V7.mjs.map +1 -0
- package/dist/chunk-Q5WVLK2L.mjs +77 -0
- package/dist/chunk-Q5WVLK2L.mjs.map +1 -0
- package/dist/chunk-RKSB2N5L.mjs +206 -0
- package/dist/chunk-RKSB2N5L.mjs.map +1 -0
- package/dist/chunk-S4DGVKBK.mjs +151 -0
- package/dist/chunk-S4DGVKBK.mjs.map +1 -0
- package/dist/chunk-S4T4PU7F.mjs +114 -0
- package/dist/chunk-S4T4PU7F.mjs.map +1 -0
- package/dist/chunk-SZPZOGPC.mjs +394 -0
- package/dist/chunk-SZPZOGPC.mjs.map +1 -0
- package/dist/chunk-T546XBQG.mjs +443 -0
- package/dist/chunk-T546XBQG.mjs.map +1 -0
- package/dist/chunk-UWTT5AE6.mjs +145 -0
- package/dist/chunk-UWTT5AE6.mjs.map +1 -0
- package/dist/chunk-V5UFWYFI.mjs +255 -0
- package/dist/chunk-V5UFWYFI.mjs.map +1 -0
- package/dist/chunk-VUPGBB5X.mjs +150 -0
- package/dist/chunk-VUPGBB5X.mjs.map +1 -0
- package/dist/chunk-W6YNEU53.mjs +175 -0
- package/dist/chunk-W6YNEU53.mjs.map +1 -0
- package/dist/chunk-WWSN5YME.mjs +222 -0
- package/dist/chunk-WWSN5YME.mjs.map +1 -0
- package/dist/chunk-XK52LYR4.mjs +182 -0
- package/dist/chunk-XK52LYR4.mjs.map +1 -0
- package/dist/chunk-YIAH6KHV.mjs +164 -0
- package/dist/chunk-YIAH6KHV.mjs.map +1 -0
- package/dist/chunk-Z6JWWCNL.mjs +108 -0
- package/dist/chunk-Z6JWWCNL.mjs.map +1 -0
- package/dist/chunk-ZDRUTJ4T.mjs +119 -0
- package/dist/chunk-ZDRUTJ4T.mjs.map +1 -0
- package/dist/components/accordion.mjs +19 -0
- package/dist/components/accordion.mjs.map +1 -0
- package/dist/components/alert.mjs +15 -0
- package/dist/components/alert.mjs.map +1 -0
- package/dist/components/avatar.mjs +23 -0
- package/dist/components/avatar.mjs.map +1 -0
- package/dist/components/badge.mjs +11 -0
- package/dist/components/badge.mjs.map +1 -0
- package/dist/components/breadcrumb.mjs +23 -0
- package/dist/components/breadcrumb.mjs.map +1 -0
- package/dist/components/button-group.mjs +11 -0
- package/dist/components/button-group.mjs.map +1 -0
- package/dist/components/button.mjs +12 -0
- package/dist/components/button.mjs.map +1 -0
- package/dist/components/card.mjs +25 -0
- package/dist/components/card.mjs.map +1 -0
- package/dist/components/chat-input.mjs +15 -0
- package/dist/components/chat-input.mjs.map +1 -0
- package/dist/components/chat-message.mjs +17 -0
- package/dist/components/chat-message.mjs.map +1 -0
- package/dist/components/checkbox.mjs +12 -0
- package/dist/components/checkbox.mjs.map +1 -0
- package/dist/components/divider.mjs +11 -0
- package/dist/components/divider.mjs.map +1 -0
- package/dist/components/drawer.mjs +33 -0
- package/dist/components/drawer.mjs.map +1 -0
- package/dist/components/dropdown.mjs +35 -0
- package/dist/components/dropdown.mjs.map +1 -0
- package/dist/components/field.mjs +17 -0
- package/dist/components/field.mjs.map +1 -0
- package/dist/components/icon-button.mjs +12 -0
- package/dist/components/icon-button.mjs.map +1 -0
- package/dist/components/input.mjs +12 -0
- package/dist/components/input.mjs.map +1 -0
- package/dist/components/metric-card.mjs +23 -0
- package/dist/components/metric-card.mjs.map +1 -0
- package/dist/components/modal.mjs +57 -0
- package/dist/components/modal.mjs.map +1 -0
- package/dist/components/navigation-menu.mjs +27 -0
- package/dist/components/navigation-menu.mjs.map +1 -0
- package/dist/components/pagination.mjs +33 -0
- package/dist/components/pagination.mjs.map +1 -0
- package/dist/components/popover.mjs +23 -0
- package/dist/components/popover.mjs.map +1 -0
- package/dist/components/progress.mjs +11 -0
- package/dist/components/progress.mjs.map +1 -0
- package/dist/components/quick-reply.mjs +15 -0
- package/dist/components/quick-reply.mjs.map +1 -0
- package/dist/components/radio-group.mjs +16 -0
- package/dist/components/radio-group.mjs.map +1 -0
- package/dist/components/segmented.mjs +15 -0
- package/dist/components/segmented.mjs.map +1 -0
- package/dist/components/select.mjs +23 -0
- package/dist/components/select.mjs.map +1 -0
- package/dist/components/skeleton.mjs +11 -0
- package/dist/components/skeleton.mjs.map +1 -0
- package/dist/components/slider.mjs +11 -0
- package/dist/components/slider.mjs.map +1 -0
- package/dist/components/spinner.mjs +11 -0
- package/dist/components/spinner.mjs.map +1 -0
- package/dist/components/switch.mjs +12 -0
- package/dist/components/switch.mjs.map +1 -0
- package/dist/components/table.mjs +23 -0
- package/dist/components/table.mjs.map +1 -0
- package/dist/components/tabs.mjs +19 -0
- package/dist/components/tabs.mjs.map +1 -0
- package/dist/components/textarea.mjs +12 -0
- package/dist/components/textarea.mjs.map +1 -0
- package/dist/components/toast.mjs +13 -0
- package/dist/components/toast.mjs.map +1 -0
- package/dist/components/toggle-group.mjs +15 -0
- package/dist/components/toggle-group.mjs.map +1 -0
- package/dist/components/toggle.mjs +11 -0
- package/dist/components/toggle.mjs.map +1 -0
- package/dist/components/tooltip.mjs +21 -0
- package/dist/components/tooltip.mjs.map +1 -0
- package/dist/components/typing-indicator.mjs +11 -0
- package/dist/components/typing-indicator.mjs.map +1 -0
- package/dist/index.mjs +296 -7536
- package/dist/index.mjs.map +1 -1
- package/llms.txt +23 -23
- package/package.json +4 -3
- package/dist/chart.d.mts +0 -147
- package/dist/index.d.mts +0 -1535
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {
|
|
3
|
+
cn
|
|
4
|
+
} from "./chunk-53MIUPSY.mjs";
|
|
5
|
+
|
|
6
|
+
// src/components/ui/alert.tsx
|
|
7
|
+
import * as React from "react";
|
|
8
|
+
import { cva } from "class-variance-authority";
|
|
9
|
+
var InfoIcon = ({ className }) => /* @__PURE__ */ React.createElement("svg", { className, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true" }, /* @__PURE__ */ React.createElement("circle", { cx: "12", cy: "12", r: "10" }), /* @__PURE__ */ React.createElement("path", { d: "M12 16v-4" }), /* @__PURE__ */ React.createElement("path", { d: "M12 8h.01" }));
|
|
10
|
+
var SuccessIcon = ({ className }) => /* @__PURE__ */ React.createElement("svg", { className, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true" }, /* @__PURE__ */ React.createElement("circle", { cx: "12", cy: "12", r: "10" }), /* @__PURE__ */ React.createElement("path", { d: "m9 12 2 2 4-4" }));
|
|
11
|
+
var WarningIcon = ({ className }) => /* @__PURE__ */ React.createElement("svg", { className, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true" }, /* @__PURE__ */ React.createElement("path", { d: "m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3" }), /* @__PURE__ */ React.createElement("path", { d: "M12 9v4" }), /* @__PURE__ */ React.createElement("path", { d: "M12 17h.01" }));
|
|
12
|
+
var ErrorIcon = ({ className }) => /* @__PURE__ */ React.createElement("svg", { className, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true" }, /* @__PURE__ */ React.createElement("circle", { cx: "12", cy: "12", r: "10" }), /* @__PURE__ */ React.createElement("path", { d: "M12 8v5" }), /* @__PURE__ */ React.createElement("path", { d: "M12 16h.01" }));
|
|
13
|
+
var DefaultCloseIcon = ({ className }) => /* @__PURE__ */ React.createElement("svg", { className, fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, "aria-hidden": "true" }, /* @__PURE__ */ React.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M6 18L18 6M6 6l12 12" }));
|
|
14
|
+
var STATUS_ICONS = {
|
|
15
|
+
info: InfoIcon,
|
|
16
|
+
success: SuccessIcon,
|
|
17
|
+
warning: WarningIcon,
|
|
18
|
+
error: ErrorIcon
|
|
19
|
+
};
|
|
20
|
+
var colorMap = {
|
|
21
|
+
info: {
|
|
22
|
+
default: "bg-info-tint text-text-info border-info/20",
|
|
23
|
+
outline: "bg-transparent text-text-info border-info",
|
|
24
|
+
filled: "bg-info text-info-foreground border-transparent"
|
|
25
|
+
},
|
|
26
|
+
success: {
|
|
27
|
+
default: "bg-success-tint text-text-success border-success/20",
|
|
28
|
+
outline: "bg-transparent text-text-success border-success",
|
|
29
|
+
filled: "bg-success text-success-foreground border-transparent"
|
|
30
|
+
},
|
|
31
|
+
warning: {
|
|
32
|
+
default: "bg-warning-tint text-text-warning border-warning/20",
|
|
33
|
+
outline: "bg-transparent text-text-warning border-warning",
|
|
34
|
+
filled: "bg-warning text-warning-foreground border-transparent"
|
|
35
|
+
},
|
|
36
|
+
error: {
|
|
37
|
+
default: "bg-error-tint text-text-error border-error/20",
|
|
38
|
+
outline: "bg-transparent text-text-error border-error",
|
|
39
|
+
filled: "bg-error text-error-foreground border-transparent"
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
var alertVariants = cva(
|
|
43
|
+
"group relative flex items-center border w-full [&:has([data-alert-description])]:items-start",
|
|
44
|
+
{
|
|
45
|
+
variants: {
|
|
46
|
+
size: {
|
|
47
|
+
sm: "gap-2 p-2.5 text-sm",
|
|
48
|
+
default: "gap-2.5 p-3.5 text-md",
|
|
49
|
+
lg: "gap-3 p-4 text-md"
|
|
50
|
+
},
|
|
51
|
+
radius: {
|
|
52
|
+
none: "rounded-none",
|
|
53
|
+
sm: "rounded-sm",
|
|
54
|
+
base: "rounded",
|
|
55
|
+
md: "rounded-md",
|
|
56
|
+
lg: "rounded-lg",
|
|
57
|
+
xl: "rounded-xl",
|
|
58
|
+
"2xl": "rounded-2xl",
|
|
59
|
+
"3xl": "rounded-3xl",
|
|
60
|
+
full: "rounded-full"
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
defaultVariants: {
|
|
64
|
+
size: "default",
|
|
65
|
+
radius: "lg"
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
);
|
|
69
|
+
var ICON_SIZE_MAP = {
|
|
70
|
+
sm: "icon-sm",
|
|
71
|
+
// 16px
|
|
72
|
+
default: "w-[18px] h-[18px]",
|
|
73
|
+
// 18px — TOKEN-EXCEPTION: no 18px icon token
|
|
74
|
+
lg: "icon-md"
|
|
75
|
+
// 20px
|
|
76
|
+
};
|
|
77
|
+
var ICON_LINE_MAP = {
|
|
78
|
+
sm: "text-sm",
|
|
79
|
+
default: "text-md",
|
|
80
|
+
lg: "text-base"
|
|
81
|
+
};
|
|
82
|
+
var TITLE_SIZE_MAP = {
|
|
83
|
+
sm: "text-sm font-semibold tracking-tight",
|
|
84
|
+
default: "text-md font-semibold tracking-tight",
|
|
85
|
+
lg: "text-base font-semibold tracking-tight"
|
|
86
|
+
};
|
|
87
|
+
var DESC_SIZE_MAP = {
|
|
88
|
+
sm: "text-xs mt-0.5",
|
|
89
|
+
default: "text-sm mt-0.5",
|
|
90
|
+
lg: "text-md mt-0.5"
|
|
91
|
+
};
|
|
92
|
+
var AlertContext = React.createContext({
|
|
93
|
+
variant: "default",
|
|
94
|
+
color: "info",
|
|
95
|
+
size: "default"
|
|
96
|
+
});
|
|
97
|
+
function useAlertContext() {
|
|
98
|
+
return React.useContext(AlertContext);
|
|
99
|
+
}
|
|
100
|
+
var Alert = React.forwardRef(
|
|
101
|
+
({
|
|
102
|
+
className,
|
|
103
|
+
variant = "default",
|
|
104
|
+
color = "info",
|
|
105
|
+
size = "default",
|
|
106
|
+
radius,
|
|
107
|
+
closable = false,
|
|
108
|
+
onClose,
|
|
109
|
+
closeIcon,
|
|
110
|
+
icon,
|
|
111
|
+
hideIcon = false,
|
|
112
|
+
children,
|
|
113
|
+
...props
|
|
114
|
+
}, ref) => {
|
|
115
|
+
const role = color === "error" ? "alert" : "status";
|
|
116
|
+
const colorClasses = colorMap[color][variant];
|
|
117
|
+
const StatusIcon = STATUS_ICONS[color];
|
|
118
|
+
return /* @__PURE__ */ React.createElement(AlertContext.Provider, { value: { variant, color, size } }, /* @__PURE__ */ React.createElement(
|
|
119
|
+
"div",
|
|
120
|
+
{
|
|
121
|
+
ref,
|
|
122
|
+
role,
|
|
123
|
+
className: cn(
|
|
124
|
+
alertVariants({ size, radius }),
|
|
125
|
+
colorClasses,
|
|
126
|
+
className
|
|
127
|
+
),
|
|
128
|
+
...props
|
|
129
|
+
},
|
|
130
|
+
!hideIcon && /* @__PURE__ */ React.createElement("span", { className: cn("shrink-0 flex items-center min-h-[1lh]", ICON_LINE_MAP[size]) }, icon || /* @__PURE__ */ React.createElement(StatusIcon, { className: ICON_SIZE_MAP[size] })),
|
|
131
|
+
/* @__PURE__ */ React.createElement("div", { className: "flex-1 min-w-0" }, children),
|
|
132
|
+
closable && /* @__PURE__ */ React.createElement(
|
|
133
|
+
"button",
|
|
134
|
+
{
|
|
135
|
+
type: "button",
|
|
136
|
+
className: cn(
|
|
137
|
+
"shrink-0 rounded-md p-1 opacity-70 hover:opacity-100 transition-opacity focus-visible:focus-ring",
|
|
138
|
+
"group-has-[[data-alert-description]]:absolute",
|
|
139
|
+
size === "sm" ? "group-has-[[data-alert-description]]:top-2 group-has-[[data-alert-description]]:right-2" : "group-has-[[data-alert-description]]:top-3 group-has-[[data-alert-description]]:right-3"
|
|
140
|
+
),
|
|
141
|
+
onClick: onClose,
|
|
142
|
+
"aria-label": "Close"
|
|
143
|
+
},
|
|
144
|
+
closeIcon || /* @__PURE__ */ React.createElement(DefaultCloseIcon, { className: "icon-sm" })
|
|
145
|
+
)
|
|
146
|
+
));
|
|
147
|
+
}
|
|
148
|
+
);
|
|
149
|
+
Alert.displayName = "Alert";
|
|
150
|
+
var AlertTitle = React.forwardRef(
|
|
151
|
+
({ className, ...props }, ref) => {
|
|
152
|
+
const { size } = useAlertContext();
|
|
153
|
+
return /* @__PURE__ */ React.createElement(
|
|
154
|
+
"h5",
|
|
155
|
+
{
|
|
156
|
+
ref,
|
|
157
|
+
className: cn(TITLE_SIZE_MAP[size], className),
|
|
158
|
+
...props
|
|
159
|
+
}
|
|
160
|
+
);
|
|
161
|
+
}
|
|
162
|
+
);
|
|
163
|
+
AlertTitle.displayName = "AlertTitle";
|
|
164
|
+
var AlertDescription = React.forwardRef(
|
|
165
|
+
({ className, ...props }, ref) => {
|
|
166
|
+
const { variant, size } = useAlertContext();
|
|
167
|
+
return /* @__PURE__ */ React.createElement(
|
|
168
|
+
"p",
|
|
169
|
+
{
|
|
170
|
+
ref,
|
|
171
|
+
"data-alert-description": "",
|
|
172
|
+
className: cn(
|
|
173
|
+
DESC_SIZE_MAP[size],
|
|
174
|
+
variant === "filled" ? "opacity-90" : "opacity-80",
|
|
175
|
+
className
|
|
176
|
+
),
|
|
177
|
+
...props
|
|
178
|
+
}
|
|
179
|
+
);
|
|
180
|
+
}
|
|
181
|
+
);
|
|
182
|
+
AlertDescription.displayName = "AlertDescription";
|
|
183
|
+
|
|
184
|
+
export {
|
|
185
|
+
alertVariants,
|
|
186
|
+
Alert,
|
|
187
|
+
AlertTitle,
|
|
188
|
+
AlertDescription
|
|
189
|
+
};
|
|
190
|
+
//# sourceMappingURL=chunk-DJAEXCRU.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/ui/alert.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '@/lib/utils'\n\n// ─── Built-in status icons (no external dependency) ──────────────\n// All icons: Lucide-compatible 24×24 viewBox, strokeWidth=2, rounded caps/joins\n// Info = circle + \"i\" | Success = circle + check | Warning = triangle + \"!\" | Error = circle + small ×\nconst InfoIcon = ({ className }: { className?: string }) => (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 16v-4\" />\n <path d=\"M12 8h.01\" />\n </svg>\n)\n\nconst SuccessIcon = ({ className }: { className?: string }) => (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"m9 12 2 2 4-4\" />\n </svg>\n)\n\nconst WarningIcon = ({ className }: { className?: string }) => (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\" />\n <path d=\"M12 9v4\" />\n <path d=\"M12 17h.01\" />\n </svg>\n)\n\nconst ErrorIcon = ({ className }: { className?: string }) => (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 8v5\" />\n <path d=\"M12 16h.01\" />\n </svg>\n)\n\nconst DefaultCloseIcon = ({ className }: { className?: string }) => (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2} aria-hidden=\"true\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n)\n\n// ─── Status icon mapping ─────────────────────────────────────────\nconst STATUS_ICONS: Record<AlertColor, React.FC<{ className?: string }>> = {\n info: InfoIcon,\n success: SuccessIcon,\n warning: WarningIcon,\n error: ErrorIcon,\n}\n\n// ─── Color × Variant class mapping ──────────────────────────────\n// Uses semantic tokens (*.tint, text-text-*) — same pattern as Badge\nconst colorMap = {\n info: {\n default: 'bg-info-tint text-text-info border-info/20',\n outline: 'bg-transparent text-text-info border-info',\n filled: 'bg-info text-info-foreground border-transparent',\n },\n success: {\n default: 'bg-success-tint text-text-success border-success/20',\n outline: 'bg-transparent text-text-success border-success',\n filled: 'bg-success text-success-foreground border-transparent',\n },\n warning: {\n default: 'bg-warning-tint text-text-warning border-warning/20',\n outline: 'bg-transparent text-text-warning border-warning',\n filled: 'bg-warning text-warning-foreground border-transparent',\n },\n error: {\n default: 'bg-error-tint text-text-error border-error/20',\n outline: 'bg-transparent text-text-error border-error',\n filled: 'bg-error text-error-foreground border-transparent',\n },\n} as const\n\n// ─── Alert variants ──────────────────────────────────────────────\nconst alertVariants = cva(\n 'group relative flex items-center border w-full [&:has([data-alert-description])]:items-start',\n {\n variants: {\n size: {\n sm: 'gap-2 p-2.5 text-sm',\n default: 'gap-2.5 p-3.5 text-md',\n lg: 'gap-3 p-4 text-md',\n },\n radius: {\n none: 'rounded-none',\n sm: 'rounded-sm',\n base: 'rounded',\n md: 'rounded-md',\n lg: 'rounded-lg',\n xl: 'rounded-xl',\n '2xl': 'rounded-2xl',\n '3xl': 'rounded-3xl',\n full: 'rounded-full',\n },\n },\n defaultVariants: {\n size: 'default',\n radius: 'lg',\n },\n }\n)\n\n// ─── Size-dependent class maps ──────────────────────────────────\nconst ICON_SIZE_MAP = {\n sm: 'icon-sm', // 16px\n default: 'w-[18px] h-[18px]', // 18px — TOKEN-EXCEPTION: no 18px icon token\n lg: 'icon-md', // 20px\n} as const\n\n/** Icon wrapper text class — matches title line-height for vertical alignment */\nconst ICON_LINE_MAP = {\n sm: 'text-sm',\n default: 'text-md',\n lg: 'text-base',\n} as const\n\nconst TITLE_SIZE_MAP = {\n sm: 'text-sm font-semibold tracking-tight',\n default: 'text-md font-semibold tracking-tight',\n lg: 'text-base font-semibold tracking-tight',\n} as const\n\nconst DESC_SIZE_MAP = {\n sm: 'text-xs mt-0.5',\n default: 'text-sm mt-0.5',\n lg: 'text-md mt-0.5',\n} as const\n\n// ─── Types ───────────────────────────────────────────────────────\nexport type AlertVariant = 'default' | 'outline' | 'filled'\nexport type AlertColor = 'info' | 'success' | 'warning' | 'error'\nexport type AlertSize = 'sm' | 'default' | 'lg'\n\n// ─── Context ─────────────────────────────────────────────────────\ninterface AlertContextValue {\n variant: AlertVariant\n color: AlertColor\n size: AlertSize\n}\n\nconst AlertContext = React.createContext<AlertContextValue>({\n variant: 'default',\n color: 'info',\n size: 'default',\n})\n\nfunction useAlertContext() {\n return React.useContext(AlertContext)\n}\n\n// ═══════════════════════════════════════════════════════════════════\n// Alert\n// ═══════════════════════════════════════════════════════════════════\n\n// ─── Alert ───────────────────────────────────────────────────────\nexport interface AlertRootProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof alertVariants> {\n /** Visual style */\n variant?: AlertVariant\n /** Semantic color (determines icon, colors, and ARIA role) */\n color?: AlertColor\n /** Size */\n size?: AlertSize\n /** Closable — shows close button */\n closable?: boolean\n /** Close callback */\n onClose?: () => void\n /** Custom close icon */\n closeIcon?: React.ReactNode\n /** Custom status icon (overrides default) */\n icon?: React.ReactNode\n /** Hide the status icon entirely */\n hideIcon?: boolean\n}\n\nconst Alert = React.forwardRef<HTMLDivElement, AlertRootProps>(\n ({\n className,\n variant = 'default',\n color = 'info',\n size = 'default',\n radius,\n closable = false,\n onClose,\n closeIcon,\n icon,\n hideIcon = false,\n children,\n ...props\n }, ref) => {\n // error → role=\"alert\" (assertive), others → role=\"status\" (polite)\n const role = color === 'error' ? 'alert' : 'status'\n const colorClasses = colorMap[color][variant]\n const StatusIcon = STATUS_ICONS[color]\n\n return (\n <AlertContext.Provider value={{ variant, color, size }}>\n <div\n ref={ref}\n role={role}\n className={cn(\n alertVariants({ size, radius }),\n colorClasses,\n className,\n )}\n {...props}\n >\n {/* Icon */}\n {!hideIcon && (\n <span className={cn('shrink-0 flex items-center min-h-[1lh]', ICON_LINE_MAP[size])}>\n {icon || <StatusIcon className={ICON_SIZE_MAP[size]} />}\n </span>\n )}\n\n {/* Content area */}\n <div className=\"flex-1 min-w-0\">\n {children}\n </div>\n\n {/* Close button */}\n {closable && (\n <button\n type=\"button\"\n className={cn(\n 'shrink-0 rounded-md p-1 opacity-70 hover:opacity-100 transition-opacity focus-visible:focus-ring',\n 'group-has-[[data-alert-description]]:absolute',\n size === 'sm'\n ? 'group-has-[[data-alert-description]]:top-2 group-has-[[data-alert-description]]:right-2'\n : 'group-has-[[data-alert-description]]:top-3 group-has-[[data-alert-description]]:right-3',\n )}\n onClick={onClose}\n aria-label=\"Close\"\n >\n {closeIcon || <DefaultCloseIcon className=\"icon-sm\" />}\n </button>\n )}\n </div>\n </AlertContext.Provider>\n )\n }\n)\nAlert.displayName = 'Alert'\n\n// ─── AlertTitle ──────────────────────────────────────────────────\nexport interface AlertTitleProps extends React.HTMLAttributes<HTMLHeadingElement> {}\n\nconst AlertTitle = React.forwardRef<HTMLHeadingElement, AlertTitleProps>(\n ({ className, ...props }, ref) => {\n const { size } = useAlertContext()\n return (\n <h5\n ref={ref}\n className={cn(TITLE_SIZE_MAP[size], className)}\n {...props}\n />\n )\n }\n)\nAlertTitle.displayName = 'AlertTitle'\n\n// ─── AlertDescription ────────────────────────────────────────────\nexport interface AlertDescriptionProps extends React.HTMLAttributes<HTMLParagraphElement> {}\n\nconst AlertDescription = React.forwardRef<HTMLParagraphElement, AlertDescriptionProps>(\n ({ className, ...props }, ref) => {\n const { variant, size } = useAlertContext()\n return (\n <p\n ref={ref}\n data-alert-description=\"\"\n className={cn(\n DESC_SIZE_MAP[size],\n variant === 'filled' ? 'opacity-90' : 'opacity-80',\n className,\n )}\n {...props}\n />\n )\n }\n)\nAlertDescription.displayName = 'AlertDescription'\n\n// ─── Exports ─────────────────────────────────────────────────────\nexport {\n Alert,\n AlertTitle,\n AlertDescription,\n alertVariants,\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {
|
|
3
|
+
useFieldContext
|
|
4
|
+
} from "./chunk-Z6JWWCNL.mjs";
|
|
5
|
+
import {
|
|
6
|
+
cn
|
|
7
|
+
} from "./chunk-53MIUPSY.mjs";
|
|
8
|
+
|
|
9
|
+
// src/components/ui/switch.tsx
|
|
10
|
+
import * as React from "react";
|
|
11
|
+
import * as SwitchPrimitive from "@radix-ui/react-switch";
|
|
12
|
+
import { cva } from "class-variance-authority";
|
|
13
|
+
var switchVariants = cva(
|
|
14
|
+
[
|
|
15
|
+
"group peer inline-flex shrink-0 cursor-pointer items-center rounded-full",
|
|
16
|
+
"border border-transparent transition-all duration-normal ease-out",
|
|
17
|
+
"focus-visible:focus-ring",
|
|
18
|
+
"disabled:cursor-not-allowed disabled:opacity-50",
|
|
19
|
+
"data-[state=unchecked]:bg-border"
|
|
20
|
+
].join(" "),
|
|
21
|
+
{
|
|
22
|
+
variants: {
|
|
23
|
+
size: {
|
|
24
|
+
sm: "w-[var(--component-switch-track-sm-width)] h-[var(--component-switch-track-sm-height)]",
|
|
25
|
+
default: "w-[var(--component-switch-track-default-width)] h-[var(--component-switch-track-default-height)]",
|
|
26
|
+
lg: "w-[var(--component-switch-track-lg-width)] h-[var(--component-switch-track-lg-height)]"
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
defaultVariants: {
|
|
30
|
+
size: "default"
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
);
|
|
34
|
+
var thumbSizes = {
|
|
35
|
+
sm: "w-[var(--component-switch-thumb-sm)] h-[var(--component-switch-thumb-sm)]",
|
|
36
|
+
default: "w-[var(--component-switch-thumb-default)] h-[var(--component-switch-thumb-default)]",
|
|
37
|
+
lg: "w-[var(--component-switch-thumb-lg)] h-[var(--component-switch-thumb-lg)]"
|
|
38
|
+
};
|
|
39
|
+
var thumbTranslate = {
|
|
40
|
+
sm: "data-[state=checked]:translate-x-[calc(var(--component-switch-track-sm-width)_-_var(--component-switch-thumb-sm)_-_2px)]",
|
|
41
|
+
default: "data-[state=checked]:translate-x-[calc(var(--component-switch-track-default-width)_-_var(--component-switch-thumb-default)_-_2px)]",
|
|
42
|
+
lg: "data-[state=checked]:translate-x-[calc(var(--component-switch-track-lg-width)_-_var(--component-switch-thumb-lg)_-_2px)]"
|
|
43
|
+
};
|
|
44
|
+
var gapSizes = {
|
|
45
|
+
sm: "gap-2",
|
|
46
|
+
// 8px
|
|
47
|
+
default: "gap-2.5",
|
|
48
|
+
// 10px
|
|
49
|
+
lg: "gap-3"
|
|
50
|
+
// 12px
|
|
51
|
+
};
|
|
52
|
+
var labelSizes = {
|
|
53
|
+
sm: "text-xs",
|
|
54
|
+
// 12px
|
|
55
|
+
default: "text-md",
|
|
56
|
+
// 14px
|
|
57
|
+
lg: "text-base"
|
|
58
|
+
// 16px
|
|
59
|
+
};
|
|
60
|
+
var checkedTrackColors = {
|
|
61
|
+
default: "data-[state=checked]:bg-foreground",
|
|
62
|
+
primary: "data-[state=checked]:bg-primary",
|
|
63
|
+
success: "data-[state=checked]:bg-success",
|
|
64
|
+
warning: "data-[state=checked]:bg-warning",
|
|
65
|
+
error: "data-[state=checked]:bg-error"
|
|
66
|
+
};
|
|
67
|
+
var checkedIconColors = {
|
|
68
|
+
default: "text-foreground",
|
|
69
|
+
primary: "text-primary",
|
|
70
|
+
success: "text-success",
|
|
71
|
+
warning: "text-warning",
|
|
72
|
+
error: "text-error"
|
|
73
|
+
};
|
|
74
|
+
var iconSizes = {
|
|
75
|
+
sm: "hidden",
|
|
76
|
+
// 12px thumb — too small for icons
|
|
77
|
+
default: "w-2.5 h-2.5",
|
|
78
|
+
// 10px icon in 16px thumb
|
|
79
|
+
lg: "w-3.5 h-3.5"
|
|
80
|
+
// 14px icon in 20px thumb
|
|
81
|
+
};
|
|
82
|
+
var Switch = React.forwardRef(({ className, size, label, labelPosition = "end", startLabel, endLabel, checkedIcon, uncheckedIcon, color = "default", disabled, id, ...props }, ref) => {
|
|
83
|
+
const fieldContext = useFieldContext();
|
|
84
|
+
const resolvedSize = size || "default";
|
|
85
|
+
const resolvedDisabled = disabled ?? fieldContext?.disabled;
|
|
86
|
+
const generatedId = React.useId();
|
|
87
|
+
const switchId = id ?? fieldContext?.id ?? generatedId;
|
|
88
|
+
const switchEl = /* @__PURE__ */ React.createElement(
|
|
89
|
+
SwitchPrimitive.Root,
|
|
90
|
+
{
|
|
91
|
+
ref,
|
|
92
|
+
id: switchId,
|
|
93
|
+
disabled: resolvedDisabled,
|
|
94
|
+
className: cn(switchVariants({ size }), checkedTrackColors[color], className),
|
|
95
|
+
...props
|
|
96
|
+
},
|
|
97
|
+
/* @__PURE__ */ React.createElement(
|
|
98
|
+
SwitchPrimitive.Thumb,
|
|
99
|
+
{
|
|
100
|
+
className: cn(
|
|
101
|
+
"group/thumb pointer-events-none flex items-center justify-center rounded-full shadow-sm ring-0",
|
|
102
|
+
color === "default" ? "bg-background" : "bg-primary-foreground",
|
|
103
|
+
"transition-transform duration-normal ease-out",
|
|
104
|
+
"data-[state=unchecked]:translate-x-0",
|
|
105
|
+
thumbSizes[resolvedSize],
|
|
106
|
+
thumbTranslate[resolvedSize]
|
|
107
|
+
)
|
|
108
|
+
},
|
|
109
|
+
(checkedIcon || uncheckedIcon) && resolvedSize !== "sm" && /* @__PURE__ */ React.createElement(React.Fragment, null, checkedIcon && /* @__PURE__ */ React.createElement("span", { className: cn(
|
|
110
|
+
iconSizes[resolvedSize],
|
|
111
|
+
checkedIconColors[color],
|
|
112
|
+
"hidden group-data-[state=checked]/thumb:block"
|
|
113
|
+
) }, checkedIcon), uncheckedIcon && /* @__PURE__ */ React.createElement("span", { className: cn(
|
|
114
|
+
iconSizes[resolvedSize],
|
|
115
|
+
"text-text-muted",
|
|
116
|
+
"hidden group-data-[state=unchecked]/thumb:block"
|
|
117
|
+
) }, uncheckedIcon))
|
|
118
|
+
)
|
|
119
|
+
);
|
|
120
|
+
const labelClassName = cn(
|
|
121
|
+
labelSizes[resolvedSize],
|
|
122
|
+
"text-text-muted cursor-pointer select-none transition-colors duration-micro",
|
|
123
|
+
"group-hover/switch:text-foreground",
|
|
124
|
+
resolvedDisabled && "opacity-50 cursor-not-allowed"
|
|
125
|
+
);
|
|
126
|
+
if (startLabel || endLabel) {
|
|
127
|
+
return /* @__PURE__ */ React.createElement("div", { className: cn("group/switch flex items-center", gapSizes[resolvedSize]) }, startLabel && /* @__PURE__ */ React.createElement("label", { htmlFor: switchId, className: labelClassName }, startLabel), /* @__PURE__ */ React.createElement("div", { className: "flex items-center" }, switchEl), endLabel && /* @__PURE__ */ React.createElement("label", { htmlFor: switchId, className: labelClassName }, endLabel));
|
|
128
|
+
}
|
|
129
|
+
if (!label) return switchEl;
|
|
130
|
+
const isVertical = labelPosition === "top" || labelPosition === "bottom";
|
|
131
|
+
const isReversed = labelPosition === "start" || labelPosition === "top";
|
|
132
|
+
return /* @__PURE__ */ React.createElement("div", { className: cn(
|
|
133
|
+
"group/switch flex",
|
|
134
|
+
isVertical ? "flex-col items-start gap-1.5" : "items-center",
|
|
135
|
+
isReversed && (isVertical ? "flex-col-reverse" : "flex-row-reverse"),
|
|
136
|
+
!isVertical && gapSizes[resolvedSize]
|
|
137
|
+
) }, /* @__PURE__ */ React.createElement("div", { className: "flex items-center" }, switchEl), /* @__PURE__ */ React.createElement("label", { htmlFor: switchId, className: labelClassName }, label));
|
|
138
|
+
});
|
|
139
|
+
Switch.displayName = "Switch";
|
|
140
|
+
|
|
141
|
+
export {
|
|
142
|
+
switchVariants,
|
|
143
|
+
Switch
|
|
144
|
+
};
|
|
145
|
+
//# sourceMappingURL=chunk-DRVHHEAY.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/ui/switch.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as SwitchPrimitive from '@radix-ui/react-switch'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '@/lib/utils'\nimport { useFieldContext } from './field'\n\n// Switch track variants\nconst switchVariants = cva(\n [\n 'group peer inline-flex shrink-0 cursor-pointer items-center rounded-full',\n 'border border-transparent transition-all duration-normal ease-out',\n 'focus-visible:focus-ring',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n 'data-[state=unchecked]:bg-border',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'w-[var(--component-switch-track-sm-width)] h-[var(--component-switch-track-sm-height)]',\n default: 'w-[var(--component-switch-track-default-width)] h-[var(--component-switch-track-default-height)]',\n lg: 'w-[var(--component-switch-track-lg-width)] h-[var(--component-switch-track-lg-height)]',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n }\n)\n\n// Thumb sizes\nconst thumbSizes = {\n sm: 'w-[var(--component-switch-thumb-sm)] h-[var(--component-switch-thumb-sm)]',\n default: 'w-[var(--component-switch-thumb-default)] h-[var(--component-switch-thumb-default)]',\n lg: 'w-[var(--component-switch-thumb-lg)] h-[var(--component-switch-thumb-lg)]',\n}\n\n// Thumb translate when checked: track_width - thumb_size - 2px (border 1px × 2)\nconst thumbTranslate = {\n sm: 'data-[state=checked]:translate-x-[calc(var(--component-switch-track-sm-width)_-_var(--component-switch-thumb-sm)_-_2px)]',\n default: 'data-[state=checked]:translate-x-[calc(var(--component-switch-track-default-width)_-_var(--component-switch-thumb-default)_-_2px)]',\n lg: 'data-[state=checked]:translate-x-[calc(var(--component-switch-track-lg-width)_-_var(--component-switch-thumb-lg)_-_2px)]',\n}\n\n// Gap between switch and label\nconst gapSizes = {\n sm: 'gap-2', // 8px\n default: 'gap-2.5', // 10px\n lg: 'gap-3', // 12px\n}\n\n// Label font sizes\nconst labelSizes = {\n sm: 'text-xs', // 12px\n default: 'text-md', // 14px\n lg: 'text-base', // 16px\n}\n\nexport type SwitchLabelPosition = 'start' | 'end' | 'top' | 'bottom'\nexport type SwitchColor = 'default' | 'primary' | 'success' | 'warning' | 'error'\n\n// Checked track color per color variant\nconst checkedTrackColors: Record<SwitchColor, string> = {\n default: 'data-[state=checked]:bg-foreground',\n primary: 'data-[state=checked]:bg-primary',\n success: 'data-[state=checked]:bg-success',\n warning: 'data-[state=checked]:bg-warning',\n error: 'data-[state=checked]:bg-error',\n}\n\n// Checked icon color per color variant\nconst checkedIconColors: Record<SwitchColor, string> = {\n default: 'text-foreground',\n primary: 'text-primary',\n success: 'text-success',\n warning: 'text-warning',\n error: 'text-error',\n}\n\n// Icon sizes per thumb size\nconst iconSizes = {\n sm: 'hidden', // 12px thumb — too small for icons\n default: 'w-2.5 h-2.5', // 10px icon in 16px thumb\n lg: 'w-3.5 h-3.5', // 14px icon in 20px thumb\n}\n\nexport interface SwitchProps\n extends React.ComponentPropsWithoutRef<typeof SwitchPrimitive.Root>,\n VariantProps<typeof switchVariants> {\n label?: string\n labelPosition?: SwitchLabelPosition\n startLabel?: string\n endLabel?: string\n checkedIcon?: React.ReactNode\n uncheckedIcon?: React.ReactNode\n color?: SwitchColor\n}\n\nconst Switch = React.forwardRef<\n React.ElementRef<typeof SwitchPrimitive.Root>,\n SwitchProps\n>(({ className, size, label, labelPosition = 'end', startLabel, endLabel, checkedIcon, uncheckedIcon, color = 'default', disabled, id, ...props }, ref) => {\n const fieldContext = useFieldContext()\n const resolvedSize = size || 'default'\n const resolvedDisabled = disabled ?? fieldContext?.disabled\n const generatedId = React.useId()\n const switchId = id ?? fieldContext?.id ?? generatedId\n\n const switchEl = (\n <SwitchPrimitive.Root\n ref={ref}\n id={switchId}\n disabled={resolvedDisabled}\n className={cn(switchVariants({ size }), checkedTrackColors[color], className)}\n {...props}\n >\n <SwitchPrimitive.Thumb\n className={cn(\n 'group/thumb pointer-events-none flex items-center justify-center rounded-full shadow-sm ring-0',\n color === 'default' ? 'bg-background' : 'bg-primary-foreground',\n 'transition-transform duration-normal ease-out',\n 'data-[state=unchecked]:translate-x-0',\n thumbSizes[resolvedSize],\n thumbTranslate[resolvedSize]\n )}\n >\n {(checkedIcon || uncheckedIcon) && resolvedSize !== 'sm' && (\n <>\n {checkedIcon && (\n <span className={cn(\n iconSizes[resolvedSize],\n checkedIconColors[color],\n 'hidden group-data-[state=checked]/thumb:block',\n )}>\n {checkedIcon}\n </span>\n )}\n {uncheckedIcon && (\n <span className={cn(\n iconSizes[resolvedSize],\n 'text-text-muted',\n 'hidden group-data-[state=unchecked]/thumb:block',\n )}>\n {uncheckedIcon}\n </span>\n )}\n </>\n )}\n </SwitchPrimitive.Thumb>\n </SwitchPrimitive.Root>\n )\n\n const labelClassName = cn(\n labelSizes[resolvedSize],\n 'text-text-muted cursor-pointer select-none transition-colors duration-micro',\n 'group-hover/switch:text-foreground',\n resolvedDisabled && 'opacity-50 cursor-not-allowed'\n )\n\n // Sides mode: startLabel / endLabel\n if (startLabel || endLabel) {\n return (\n <div className={cn('group/switch flex items-center', gapSizes[resolvedSize])}>\n {startLabel && (\n <label htmlFor={switchId} className={labelClassName}>\n {startLabel}\n </label>\n )}\n <div className=\"flex items-center\">\n {switchEl}\n </div>\n {endLabel && (\n <label htmlFor={switchId} className={labelClassName}>\n {endLabel}\n </label>\n )}\n </div>\n )\n }\n\n if (!label) return switchEl\n\n const isVertical = labelPosition === 'top' || labelPosition === 'bottom'\n const isReversed = labelPosition === 'start' || labelPosition === 'top'\n\n return (\n <div className={cn(\n 'group/switch flex',\n isVertical ? 'flex-col items-start gap-1.5' : 'items-center',\n isReversed && (isVertical ? 'flex-col-reverse' : 'flex-row-reverse'),\n !isVertical && gapSizes[resolvedSize],\n )}>\n <div className=\"flex items-center\">\n {switchEl}\n </div>\n <label htmlFor={switchId} className={labelClassName}>\n {label}\n </label>\n </div>\n )\n})\nSwitch.displayName = 'Switch'\n\nexport { Switch, switchVariants }\n"],"mappings":"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","names":[]}
|