@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,222 @@
|
|
|
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/input.tsx
|
|
10
|
+
import * as React from "react";
|
|
11
|
+
import { cva } from "class-variance-authority";
|
|
12
|
+
var inputVariants = cva(
|
|
13
|
+
[
|
|
14
|
+
"flex w-full bg-background text-foreground placeholder:text-foreground/30",
|
|
15
|
+
"border transition-colors duration-micro outline-transparent",
|
|
16
|
+
"focus:[outline:2px_solid_transparent]",
|
|
17
|
+
"disabled:cursor-not-allowed disabled:opacity-50 disabled:bg-background-muted",
|
|
18
|
+
"file:border-0 file:bg-transparent file:text-sm file:font-semibold"
|
|
19
|
+
].join(" "),
|
|
20
|
+
{
|
|
21
|
+
variants: {
|
|
22
|
+
variant: {
|
|
23
|
+
default: "border-border hover:border-border-strong",
|
|
24
|
+
filled: "border-transparent bg-background-muted"
|
|
25
|
+
},
|
|
26
|
+
focusRing: {
|
|
27
|
+
true: "",
|
|
28
|
+
false: ""
|
|
29
|
+
},
|
|
30
|
+
size: {
|
|
31
|
+
xs: "h-9 px-3 text-sm",
|
|
32
|
+
// 36px / 12px padding / 13px font (3.0:1)
|
|
33
|
+
sm: "h-10 px-3 text-md",
|
|
34
|
+
// 40px / 12px padding / 14px font (3.3:1)
|
|
35
|
+
default: "h-11 px-4 text-base",
|
|
36
|
+
// 44px / 16px padding / 16px font (2.75:1)
|
|
37
|
+
lg: "h-12 px-4 text-base",
|
|
38
|
+
// 48px / 16px padding / 16px font (3.0:1)
|
|
39
|
+
xl: "h-14 px-4 text-base"
|
|
40
|
+
// 56px / 16px padding / 16px font (3.5:1)
|
|
41
|
+
},
|
|
42
|
+
radius: {
|
|
43
|
+
none: "rounded-none",
|
|
44
|
+
sm: "rounded-sm",
|
|
45
|
+
base: "rounded",
|
|
46
|
+
default: "rounded-md",
|
|
47
|
+
lg: "rounded-lg",
|
|
48
|
+
xl: "rounded-xl",
|
|
49
|
+
"2xl": "rounded-2xl",
|
|
50
|
+
"3xl": "rounded-3xl",
|
|
51
|
+
full: "rounded-full"
|
|
52
|
+
},
|
|
53
|
+
state: {
|
|
54
|
+
default: "",
|
|
55
|
+
error: "border-error hover:border-error focus:border-error shadow-[0_0_0_2px_var(--color-focus-ring-error)]"
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
compoundVariants: [
|
|
59
|
+
// focusRing: true → show custom focus ring
|
|
60
|
+
{ focusRing: true, className: "focus-visible:shadow-[0_0_0_2px_var(--color-focus-ring)]" },
|
|
61
|
+
// focusRing: false → keep same state as hover
|
|
62
|
+
{ variant: "default", focusRing: false, className: "focus:border-border-strong" },
|
|
63
|
+
// filled + error
|
|
64
|
+
{
|
|
65
|
+
variant: "filled",
|
|
66
|
+
state: "error",
|
|
67
|
+
className: "border-transparent hover:border-transparent focus:border-transparent bg-[var(--color-error-bg)] hover:bg-[var(--color-error-bg)] focus:bg-[var(--color-error-bg)] shadow-none"
|
|
68
|
+
}
|
|
69
|
+
],
|
|
70
|
+
defaultVariants: {
|
|
71
|
+
variant: "default",
|
|
72
|
+
size: "default",
|
|
73
|
+
radius: "default",
|
|
74
|
+
state: "default",
|
|
75
|
+
focusRing: false
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
);
|
|
79
|
+
var iconSizeClasses = {
|
|
80
|
+
xs: "icon-xs",
|
|
81
|
+
// 14px
|
|
82
|
+
sm: "icon-xs",
|
|
83
|
+
// 14px
|
|
84
|
+
default: "icon-sm",
|
|
85
|
+
// 16px
|
|
86
|
+
lg: "icon-sm",
|
|
87
|
+
// 16px
|
|
88
|
+
xl: "icon-sm"
|
|
89
|
+
// 16px
|
|
90
|
+
};
|
|
91
|
+
var iconPaddingClasses = {
|
|
92
|
+
xs: { left: "pl-8", right: "pr-8" },
|
|
93
|
+
// 12px + 14px icon + 6px gap = 32px
|
|
94
|
+
sm: { left: "pl-9", right: "pr-9" },
|
|
95
|
+
// 12px + 14px icon + 8px gap = 34px → 36px
|
|
96
|
+
default: { left: "pl-10", right: "pr-10" },
|
|
97
|
+
// 16px + 16px icon + 8px gap = 40px
|
|
98
|
+
lg: { left: "pl-10", right: "pr-10" },
|
|
99
|
+
// 16px + 16px icon + 8px gap = 40px
|
|
100
|
+
xl: { left: "pl-10", right: "pr-10" }
|
|
101
|
+
// 16px + 16px icon + 8px gap = 40px
|
|
102
|
+
};
|
|
103
|
+
var iconPositionClasses = {
|
|
104
|
+
xs: { left: "left-3", right: "right-3" },
|
|
105
|
+
// 12px
|
|
106
|
+
sm: { left: "left-3", right: "right-3" },
|
|
107
|
+
// 12px
|
|
108
|
+
default: { left: "left-4", right: "right-4" },
|
|
109
|
+
// 16px
|
|
110
|
+
lg: { left: "left-4", right: "right-4" },
|
|
111
|
+
// 16px
|
|
112
|
+
xl: { left: "left-4", right: "right-4" }
|
|
113
|
+
// 16px
|
|
114
|
+
};
|
|
115
|
+
var Input = React.forwardRef(
|
|
116
|
+
({ className, variant, size, radius, state, type, leftIcon, rightIcon, error, focusRing, id, onPointerDown, onFocus, onBlur, ...props }, ref) => {
|
|
117
|
+
const fieldContext = useFieldContext();
|
|
118
|
+
const resolvedSize = size || "default";
|
|
119
|
+
const resolvedError = error ?? fieldContext?.error;
|
|
120
|
+
const resolvedState = resolvedError ? "error" : state;
|
|
121
|
+
const inputId = id ?? fieldContext?.id;
|
|
122
|
+
const isDisabled = props.disabled ?? fieldContext?.disabled;
|
|
123
|
+
const pointerRef = React.useRef(false);
|
|
124
|
+
const windowBlurredRef = React.useRef(false);
|
|
125
|
+
const [keyboardFocus, setKeyboardFocus] = React.useState(false);
|
|
126
|
+
React.useEffect(() => {
|
|
127
|
+
const onBlur2 = () => {
|
|
128
|
+
windowBlurredRef.current = true;
|
|
129
|
+
};
|
|
130
|
+
const onFocus2 = () => {
|
|
131
|
+
requestAnimationFrame(() => {
|
|
132
|
+
windowBlurredRef.current = false;
|
|
133
|
+
});
|
|
134
|
+
};
|
|
135
|
+
window.addEventListener("blur", onBlur2);
|
|
136
|
+
window.addEventListener("focus", onFocus2);
|
|
137
|
+
return () => {
|
|
138
|
+
window.removeEventListener("blur", onBlur2);
|
|
139
|
+
window.removeEventListener("focus", onFocus2);
|
|
140
|
+
};
|
|
141
|
+
}, []);
|
|
142
|
+
const handlePointerDown = React.useCallback((e) => {
|
|
143
|
+
pointerRef.current = true;
|
|
144
|
+
onPointerDown?.(e);
|
|
145
|
+
}, [onPointerDown]);
|
|
146
|
+
const handleFocus = React.useCallback((e) => {
|
|
147
|
+
if (!pointerRef.current && !focusRing && !windowBlurredRef.current) {
|
|
148
|
+
setKeyboardFocus(true);
|
|
149
|
+
}
|
|
150
|
+
pointerRef.current = false;
|
|
151
|
+
onFocus?.(e);
|
|
152
|
+
}, [focusRing, onFocus]);
|
|
153
|
+
const handleBlur = React.useCallback((e) => {
|
|
154
|
+
setKeyboardFocus(false);
|
|
155
|
+
pointerRef.current = false;
|
|
156
|
+
onBlur?.(e);
|
|
157
|
+
}, [onBlur]);
|
|
158
|
+
const ariaDescribedBy = fieldContext ? [
|
|
159
|
+
resolvedError ? `${fieldContext.id}-error` : null
|
|
160
|
+
].filter(Boolean).join(" ") || void 0 : void 0;
|
|
161
|
+
const focusHandlers = {
|
|
162
|
+
onPointerDown: handlePointerDown,
|
|
163
|
+
onFocus: handleFocus,
|
|
164
|
+
onBlur: handleBlur
|
|
165
|
+
};
|
|
166
|
+
if (leftIcon || rightIcon) {
|
|
167
|
+
return /* @__PURE__ */ React.createElement("div", { className: "relative w-full" }, leftIcon && /* @__PURE__ */ React.createElement("div", { className: cn(
|
|
168
|
+
"absolute top-1/2 -translate-y-1/2 pointer-events-none text-text-muted z-10",
|
|
169
|
+
iconPositionClasses[resolvedSize].left,
|
|
170
|
+
`[&>svg]:${iconSizeClasses[resolvedSize]}`
|
|
171
|
+
) }, leftIcon), /* @__PURE__ */ React.createElement(
|
|
172
|
+
"input",
|
|
173
|
+
{
|
|
174
|
+
type,
|
|
175
|
+
id: inputId,
|
|
176
|
+
className: cn(
|
|
177
|
+
inputVariants({ variant, size, radius, state: resolvedState, focusRing }),
|
|
178
|
+
keyboardFocus && "shadow-[0_0_0_2px_var(--color-focus-ring)]",
|
|
179
|
+
leftIcon && iconPaddingClasses[resolvedSize].left,
|
|
180
|
+
rightIcon && iconPaddingClasses[resolvedSize].right,
|
|
181
|
+
className
|
|
182
|
+
),
|
|
183
|
+
"aria-invalid": resolvedError || void 0,
|
|
184
|
+
"aria-describedby": ariaDescribedBy,
|
|
185
|
+
disabled: isDisabled,
|
|
186
|
+
ref,
|
|
187
|
+
...focusHandlers,
|
|
188
|
+
...props
|
|
189
|
+
}
|
|
190
|
+
), rightIcon && /* @__PURE__ */ React.createElement("div", { className: cn(
|
|
191
|
+
"absolute top-1/2 -translate-y-1/2 pointer-events-none text-text-muted z-10",
|
|
192
|
+
iconPositionClasses[resolvedSize].right,
|
|
193
|
+
`[&>svg]:${iconSizeClasses[resolvedSize]}`
|
|
194
|
+
) }, rightIcon));
|
|
195
|
+
}
|
|
196
|
+
return /* @__PURE__ */ React.createElement(
|
|
197
|
+
"input",
|
|
198
|
+
{
|
|
199
|
+
type,
|
|
200
|
+
id: inputId,
|
|
201
|
+
className: cn(
|
|
202
|
+
inputVariants({ variant, size, radius, state: resolvedState, focusRing }),
|
|
203
|
+
keyboardFocus && "shadow-[0_0_0_2px_var(--color-focus-ring)]",
|
|
204
|
+
className
|
|
205
|
+
),
|
|
206
|
+
"aria-invalid": resolvedError || void 0,
|
|
207
|
+
"aria-describedby": ariaDescribedBy,
|
|
208
|
+
disabled: isDisabled,
|
|
209
|
+
ref,
|
|
210
|
+
...focusHandlers,
|
|
211
|
+
...props
|
|
212
|
+
}
|
|
213
|
+
);
|
|
214
|
+
}
|
|
215
|
+
);
|
|
216
|
+
Input.displayName = "Input";
|
|
217
|
+
|
|
218
|
+
export {
|
|
219
|
+
inputVariants,
|
|
220
|
+
Input
|
|
221
|
+
};
|
|
222
|
+
//# sourceMappingURL=chunk-WWSN5YME.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/ui/input.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '@/lib/utils'\nimport { useFieldContext } from './field'\n\nconst inputVariants = cva(\n [\n 'flex w-full bg-background text-foreground placeholder:text-foreground/30',\n 'border transition-colors duration-micro outline-transparent',\n 'focus:[outline:2px_solid_transparent]',\n 'disabled:cursor-not-allowed disabled:opacity-50 disabled:bg-background-muted',\n 'file:border-0 file:bg-transparent file:text-sm file:font-semibold',\n ].join(' '),\n {\n variants: {\n variant: {\n default: 'border-border hover:border-border-strong',\n filled: 'border-transparent bg-background-muted',\n },\n focusRing: {\n true: '',\n false: '',\n },\n size: {\n xs: 'h-9 px-3 text-sm', // 36px / 12px padding / 13px font (3.0:1)\n sm: 'h-10 px-3 text-md', // 40px / 12px padding / 14px font (3.3:1)\n default: 'h-11 px-4 text-base', // 44px / 16px padding / 16px font (2.75:1)\n lg: 'h-12 px-4 text-base', // 48px / 16px padding / 16px font (3.0:1)\n xl: 'h-14 px-4 text-base', // 56px / 16px padding / 16px font (3.5:1)\n },\n radius: {\n none: 'rounded-none',\n sm: 'rounded-sm',\n base: 'rounded',\n default: 'rounded-md',\n lg: 'rounded-lg',\n xl: 'rounded-xl',\n '2xl': 'rounded-2xl',\n '3xl': 'rounded-3xl',\n full: 'rounded-full',\n },\n state: {\n default: '',\n error: 'border-error hover:border-error focus:border-error shadow-[0_0_0_2px_var(--color-focus-ring-error)]',\n },\n },\n compoundVariants: [\n // focusRing: true → show custom focus ring\n { focusRing: true, className: 'focus-visible:shadow-[0_0_0_2px_var(--color-focus-ring)]' },\n // focusRing: false → keep same state as hover\n { variant: 'default', focusRing: false, className: 'focus:border-border-strong' },\n // filled + error\n {\n variant: 'filled',\n state: 'error',\n className: 'border-transparent hover:border-transparent focus:border-transparent bg-[var(--color-error-bg)] hover:bg-[var(--color-error-bg)] focus:bg-[var(--color-error-bg)] shadow-none',\n },\n ],\n defaultVariants: {\n variant: 'default',\n size: 'default',\n radius: 'default',\n state: 'default',\n focusRing: false,\n },\n }\n)\n\nexport interface InputProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'>,\n VariantProps<typeof inputVariants> {\n leftIcon?: React.ReactNode\n rightIcon?: React.ReactNode\n error?: boolean\n focusRing?: boolean\n}\n\n// Icon size for input (2-step scale)\n// xs~sm: 14px, default~xl: 16px\nconst iconSizeClasses = {\n xs: 'icon-xs', // 14px\n sm: 'icon-xs', // 14px\n default: 'icon-sm', // 16px\n lg: 'icon-sm', // 16px\n xl: 'icon-sm', // 16px\n}\n\n// Icon padding (padding + icon + gap)\nconst iconPaddingClasses = {\n xs: { left: 'pl-8', right: 'pr-8' }, // 12px + 14px icon + 6px gap = 32px\n sm: { left: 'pl-9', right: 'pr-9' }, // 12px + 14px icon + 8px gap = 34px → 36px\n default: { left: 'pl-10', right: 'pr-10' }, // 16px + 16px icon + 8px gap = 40px\n lg: { left: 'pl-10', right: 'pr-10' }, // 16px + 16px icon + 8px gap = 40px\n xl: { left: 'pl-10', right: 'pr-10' }, // 16px + 16px icon + 8px gap = 40px\n}\n\n// Icon position (matches horizontal padding)\nconst iconPositionClasses = {\n xs: { left: 'left-3', right: 'right-3' }, // 12px\n sm: { left: 'left-3', right: 'right-3' }, // 12px\n default: { left: 'left-4', right: 'right-4' }, // 16px\n lg: { left: 'left-4', right: 'right-4' }, // 16px\n xl: { left: 'left-4', right: 'right-4' }, // 16px\n}\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, variant, size, radius, state, type, leftIcon, rightIcon, error, focusRing, id, onPointerDown, onFocus, onBlur, ...props }, ref) => {\n const fieldContext = useFieldContext()\n const resolvedSize = size || 'default'\n const resolvedError = error ?? fieldContext?.error\n const resolvedState = resolvedError ? 'error' : state\n const inputId = id ?? fieldContext?.id\n const isDisabled = props.disabled ?? fieldContext?.disabled\n\n // Keyboard focus detection (when focusRing: false, auto-show ring on Tab navigation)\n const pointerRef = React.useRef(false)\n const windowBlurredRef = React.useRef(false)\n const [keyboardFocus, setKeyboardFocus] = React.useState(false)\n\n // Track window blur/focus to distinguish Tab navigation from window re-activation\n React.useEffect(() => {\n const onBlur = () => { windowBlurredRef.current = true }\n const onFocus = () => { requestAnimationFrame(() => { windowBlurredRef.current = false }) }\n window.addEventListener('blur', onBlur)\n window.addEventListener('focus', onFocus)\n return () => { window.removeEventListener('blur', onBlur); window.removeEventListener('focus', onFocus) }\n }, [])\n\n const handlePointerDown = React.useCallback((e: React.PointerEvent<HTMLInputElement>) => {\n pointerRef.current = true\n onPointerDown?.(e)\n }, [onPointerDown])\n\n const handleFocus = React.useCallback((e: React.FocusEvent<HTMLInputElement>) => {\n if (!pointerRef.current && !focusRing && !windowBlurredRef.current) {\n setKeyboardFocus(true)\n }\n pointerRef.current = false\n onFocus?.(e)\n }, [focusRing, onFocus])\n\n const handleBlur = React.useCallback((e: React.FocusEvent<HTMLInputElement>) => {\n setKeyboardFocus(false)\n pointerRef.current = false\n onBlur?.(e)\n }, [onBlur])\n\n // Build aria-describedby from context\n const ariaDescribedBy = fieldContext\n ? [\n resolvedError ? `${fieldContext.id}-error` : null,\n ]\n .filter(Boolean)\n .join(' ') || undefined\n : undefined\n\n const focusHandlers = {\n onPointerDown: handlePointerDown,\n onFocus: handleFocus,\n onBlur: handleBlur,\n }\n\n // If icons are present, wrap input in a container\n if (leftIcon || rightIcon) {\n return (\n <div className=\"relative w-full\">\n {leftIcon && (\n <div className={cn(\n 'absolute top-1/2 -translate-y-1/2 pointer-events-none text-text-muted z-10',\n iconPositionClasses[resolvedSize].left,\n `[&>svg]:${iconSizeClasses[resolvedSize]}`\n )}>\n {leftIcon}\n </div>\n )}\n <input\n type={type}\n id={inputId}\n className={cn(\n inputVariants({ variant, size, radius, state: resolvedState, focusRing }),\n keyboardFocus && 'shadow-[0_0_0_2px_var(--color-focus-ring)]',\n leftIcon && iconPaddingClasses[resolvedSize].left,\n rightIcon && iconPaddingClasses[resolvedSize].right,\n className\n )}\n aria-invalid={resolvedError || undefined}\n aria-describedby={ariaDescribedBy}\n disabled={isDisabled}\n ref={ref}\n {...focusHandlers}\n {...props}\n />\n {rightIcon && (\n <div className={cn(\n 'absolute top-1/2 -translate-y-1/2 pointer-events-none text-text-muted z-10',\n iconPositionClasses[resolvedSize].right,\n `[&>svg]:${iconSizeClasses[resolvedSize]}`\n )}>\n {rightIcon}\n </div>\n )}\n </div>\n )\n }\n\n return (\n <input\n type={type}\n id={inputId}\n className={cn(\n inputVariants({ variant, size, radius, state: resolvedState, focusRing }),\n keyboardFocus && 'shadow-[0_0_0_2px_var(--color-focus-ring)]',\n className\n )}\n aria-invalid={resolvedError || undefined}\n aria-describedby={ariaDescribedBy}\n disabled={isDisabled}\n ref={ref}\n {...focusHandlers}\n {...props}\n />\n )\n }\n)\nInput.displayName = 'Input'\n\nexport { Input, inputVariants }\n"],"mappings":";;;;;;;;;AAEA,YAAY,WAAW;AACvB,SAAS,WAA8B;AAIvC,IAAM,gBAAgB;AAAA,EACpB;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,GAAG;AAAA,EACV;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SAAS;AAAA,QACT,QAAQ;AAAA,MACV;AAAA,MACA,WAAW;AAAA,QACT,MAAM;AAAA,QACN,OAAO;AAAA,MACT;AAAA,MACA,MAAM;AAAA,QACJ,IAAI;AAAA;AAAA,QACJ,IAAI;AAAA;AAAA,QACJ,SAAS;AAAA;AAAA,QACT,IAAI;AAAA;AAAA,QACJ,IAAI;AAAA;AAAA,MACN;AAAA,MACA,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,OAAO;AAAA,QACP,MAAM;AAAA,MACR;AAAA,MACA,OAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,kBAAkB;AAAA;AAAA,MAEhB,EAAE,WAAW,MAAM,WAAW,2DAA2D;AAAA;AAAA,MAEzF,EAAE,SAAS,WAAW,WAAW,OAAO,WAAW,6BAA6B;AAAA;AAAA,MAEhF;AAAA,QACE,SAAS;AAAA,QACT,OAAO;AAAA,QACP,WAAW;AAAA,MACb;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,MACT,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,WAAW;AAAA,IACb;AAAA,EACF;AACF;AAaA,IAAM,kBAAkB;AAAA,EACtB,IAAI;AAAA;AAAA,EACJ,IAAI;AAAA;AAAA,EACJ,SAAS;AAAA;AAAA,EACT,IAAI;AAAA;AAAA,EACJ,IAAI;AAAA;AACN;AAGA,IAAM,qBAAqB;AAAA,EACzB,IAAI,EAAE,MAAM,QAAQ,OAAO,OAAO;AAAA;AAAA,EAClC,IAAI,EAAE,MAAM,QAAQ,OAAO,OAAO;AAAA;AAAA,EAClC,SAAS,EAAE,MAAM,SAAS,OAAO,QAAQ;AAAA;AAAA,EACzC,IAAI,EAAE,MAAM,SAAS,OAAO,QAAQ;AAAA;AAAA,EACpC,IAAI,EAAE,MAAM,SAAS,OAAO,QAAQ;AAAA;AACtC;AAGA,IAAM,sBAAsB;AAAA,EAC1B,IAAI,EAAE,MAAM,UAAU,OAAO,UAAU;AAAA;AAAA,EACvC,IAAI,EAAE,MAAM,UAAU,OAAO,UAAU;AAAA;AAAA,EACvC,SAAS,EAAE,MAAM,UAAU,OAAO,UAAU;AAAA;AAAA,EAC5C,IAAI,EAAE,MAAM,UAAU,OAAO,UAAU;AAAA;AAAA,EACvC,IAAI,EAAE,MAAM,UAAU,OAAO,UAAU;AAAA;AACzC;AAEA,IAAM,QAAc;AAAA,EAClB,CAAC,EAAE,WAAW,SAAS,MAAM,QAAQ,OAAO,MAAM,UAAU,WAAW,OAAO,WAAW,IAAI,eAAe,SAAS,QAAQ,GAAG,MAAM,GAAG,QAAQ;AAC/I,UAAM,eAAe,gBAAgB;AACrC,UAAM,eAAe,QAAQ;AAC7B,UAAM,gBAAgB,SAAS,cAAc;AAC7C,UAAM,gBAAgB,gBAAgB,UAAU;AAChD,UAAM,UAAU,MAAM,cAAc;AACpC,UAAM,aAAa,MAAM,YAAY,cAAc;AAGnD,UAAM,aAAmB,aAAO,KAAK;AACrC,UAAM,mBAAyB,aAAO,KAAK;AAC3C,UAAM,CAAC,eAAe,gBAAgB,IAAU,eAAS,KAAK;AAG9D,IAAM,gBAAU,MAAM;AACpB,YAAMA,UAAS,MAAM;AAAE,yBAAiB,UAAU;AAAA,MAAK;AACvD,YAAMC,WAAU,MAAM;AAAE,8BAAsB,MAAM;AAAE,2BAAiB,UAAU;AAAA,QAAM,CAAC;AAAA,MAAE;AAC1F,aAAO,iBAAiB,QAAQD,OAAM;AACtC,aAAO,iBAAiB,SAASC,QAAO;AACxC,aAAO,MAAM;AAAE,eAAO,oBAAoB,QAAQD,OAAM;AAAG,eAAO,oBAAoB,SAASC,QAAO;AAAA,MAAE;AAAA,IAC1G,GAAG,CAAC,CAAC;AAEL,UAAM,oBAA0B,kBAAY,CAAC,MAA4C;AACvF,iBAAW,UAAU;AACrB,sBAAgB,CAAC;AAAA,IACnB,GAAG,CAAC,aAAa,CAAC;AAElB,UAAM,cAAoB,kBAAY,CAAC,MAA0C;AAC/E,UAAI,CAAC,WAAW,WAAW,CAAC,aAAa,CAAC,iBAAiB,SAAS;AAClE,yBAAiB,IAAI;AAAA,MACvB;AACA,iBAAW,UAAU;AACrB,gBAAU,CAAC;AAAA,IACb,GAAG,CAAC,WAAW,OAAO,CAAC;AAEvB,UAAM,aAAmB,kBAAY,CAAC,MAA0C;AAC9E,uBAAiB,KAAK;AACtB,iBAAW,UAAU;AACrB,eAAS,CAAC;AAAA,IACZ,GAAG,CAAC,MAAM,CAAC;AAGX,UAAM,kBAAkB,eACpB;AAAA,MACE,gBAAgB,GAAG,aAAa,EAAE,WAAW;AAAA,IAC/C,EACG,OAAO,OAAO,EACd,KAAK,GAAG,KAAK,SAChB;AAEJ,UAAM,gBAAgB;AAAA,MACpB,eAAe;AAAA,MACf,SAAS;AAAA,MACT,QAAQ;AAAA,IACV;AAGA,QAAI,YAAY,WAAW;AACzB,aACE,oCAAC,SAAI,WAAU,qBACZ,YACC,oCAAC,SAAI,WAAW;AAAA,QACd;AAAA,QACA,oBAAoB,YAAY,EAAE;AAAA,QAClC,WAAW,gBAAgB,YAAY,CAAC;AAAA,MAC1C,KACG,QACH,GAEF;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,IAAI;AAAA,UACJ,WAAW;AAAA,YACT,cAAc,EAAE,SAAS,MAAM,QAAQ,OAAO,eAAe,UAAU,CAAC;AAAA,YACxE,iBAAiB;AAAA,YACjB,YAAY,mBAAmB,YAAY,EAAE;AAAA,YAC7C,aAAa,mBAAmB,YAAY,EAAE;AAAA,YAC9C;AAAA,UACF;AAAA,UACA,gBAAc,iBAAiB;AAAA,UAC/B,oBAAkB;AAAA,UAClB,UAAU;AAAA,UACV;AAAA,UACC,GAAG;AAAA,UACH,GAAG;AAAA;AAAA,MACN,GACC,aACC,oCAAC,SAAI,WAAW;AAAA,QACd;AAAA,QACA,oBAAoB,YAAY,EAAE;AAAA,QAClC,WAAW,gBAAgB,YAAY,CAAC;AAAA,MAC1C,KACG,SACH,CAEJ;AAAA,IAEJ;AAEA,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,IAAI;AAAA,QACJ,WAAW;AAAA,UACT,cAAc,EAAE,SAAS,MAAM,QAAQ,OAAO,eAAe,UAAU,CAAC;AAAA,UACxE,iBAAiB;AAAA,UACjB;AAAA,QACF;AAAA,QACA,gBAAc,iBAAiB;AAAA,QAC/B,oBAAkB;AAAA,QAClB,UAAU;AAAA,QACV;AAAA,QACC,GAAG;AAAA,QACH,GAAG;AAAA;AAAA,IACN;AAAA,EAEJ;AACF;AACA,MAAM,cAAc;","names":["onBlur","onFocus"]}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {
|
|
3
|
+
cn
|
|
4
|
+
} from "./chunk-53MIUPSY.mjs";
|
|
5
|
+
|
|
6
|
+
// src/components/ui/accordion.tsx
|
|
7
|
+
import * as React from "react";
|
|
8
|
+
import * as AccordionPrimitive from "@radix-ui/react-accordion";
|
|
9
|
+
import { cva } from "class-variance-authority";
|
|
10
|
+
var DefaultChevronIcon = ({ className }) => /* @__PURE__ */ React.createElement(
|
|
11
|
+
"svg",
|
|
12
|
+
{
|
|
13
|
+
className,
|
|
14
|
+
fill: "none",
|
|
15
|
+
viewBox: "0 0 24 24",
|
|
16
|
+
stroke: "currentColor",
|
|
17
|
+
strokeWidth: 2,
|
|
18
|
+
"aria-hidden": "true"
|
|
19
|
+
},
|
|
20
|
+
/* @__PURE__ */ React.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M19 9l-7 7-7-7" })
|
|
21
|
+
);
|
|
22
|
+
var AccordionStyleContext = React.createContext({});
|
|
23
|
+
var useAccordionStyleContext = () => React.useContext(AccordionStyleContext);
|
|
24
|
+
var accordionVariants = cva("w-full", {
|
|
25
|
+
variants: {
|
|
26
|
+
variant: {
|
|
27
|
+
default: "divide-y divide-border",
|
|
28
|
+
bordered: "divide-y divide-border border border-border rounded-xl",
|
|
29
|
+
splitted: "flex flex-col gap-3"
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
defaultVariants: {
|
|
33
|
+
variant: "default"
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
var Accordion = React.forwardRef(
|
|
37
|
+
({ className, variant = "default", size = "default", iconPosition = "right", type = "single", collapsible = true, defaultValue, value, onValueChange, disabled, ...props }, ref) => {
|
|
38
|
+
const restProps = props;
|
|
39
|
+
const sharedClassName = cn(accordionVariants({ variant }), className);
|
|
40
|
+
const radixProps = type === "multiple" ? {
|
|
41
|
+
type: "multiple",
|
|
42
|
+
defaultValue,
|
|
43
|
+
value,
|
|
44
|
+
onValueChange,
|
|
45
|
+
disabled
|
|
46
|
+
} : {
|
|
47
|
+
type: "single",
|
|
48
|
+
collapsible,
|
|
49
|
+
defaultValue,
|
|
50
|
+
value,
|
|
51
|
+
onValueChange,
|
|
52
|
+
disabled
|
|
53
|
+
};
|
|
54
|
+
return /* @__PURE__ */ React.createElement(AccordionStyleContext.Provider, { value: { variant, size, iconPosition } }, /* @__PURE__ */ React.createElement(
|
|
55
|
+
AccordionPrimitive.Root,
|
|
56
|
+
{
|
|
57
|
+
ref,
|
|
58
|
+
className: sharedClassName,
|
|
59
|
+
...radixProps,
|
|
60
|
+
...restProps
|
|
61
|
+
}
|
|
62
|
+
));
|
|
63
|
+
}
|
|
64
|
+
);
|
|
65
|
+
Accordion.displayName = "Accordion";
|
|
66
|
+
var accordionItemVariants = cva("", {
|
|
67
|
+
variants: {
|
|
68
|
+
variant: {
|
|
69
|
+
default: "",
|
|
70
|
+
bordered: "",
|
|
71
|
+
splitted: "border border-border rounded-xl"
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
defaultVariants: {
|
|
75
|
+
variant: "default"
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
var AccordionItem = React.forwardRef(({ className, ...props }, ref) => {
|
|
79
|
+
const { variant } = useAccordionStyleContext();
|
|
80
|
+
return /* @__PURE__ */ React.createElement(
|
|
81
|
+
AccordionPrimitive.Item,
|
|
82
|
+
{
|
|
83
|
+
ref,
|
|
84
|
+
className: cn(accordionItemVariants({ variant }), className),
|
|
85
|
+
...props
|
|
86
|
+
}
|
|
87
|
+
);
|
|
88
|
+
});
|
|
89
|
+
AccordionItem.displayName = "AccordionItem";
|
|
90
|
+
var accordionTriggerVariants = cva(
|
|
91
|
+
[
|
|
92
|
+
"flex flex-1 items-center gap-3 font-semibold text-foreground",
|
|
93
|
+
"transition-all duration-micro ease-out cursor-pointer",
|
|
94
|
+
"hover:bg-background-muted/50",
|
|
95
|
+
"focus-visible:focus-ring focus-visible:rounded-md",
|
|
96
|
+
"disabled:pointer-events-none disabled:text-text-subtle disabled:opacity-50",
|
|
97
|
+
"[&[data-state=open]>svg.accordion-chevron]:rotate-180"
|
|
98
|
+
].join(" "),
|
|
99
|
+
{
|
|
100
|
+
variants: {
|
|
101
|
+
size: {
|
|
102
|
+
sm: "py-3 px-4 text-sm",
|
|
103
|
+
// 13px
|
|
104
|
+
default: "py-4 px-4 text-md",
|
|
105
|
+
// 14px
|
|
106
|
+
lg: "py-5 px-6 text-base"
|
|
107
|
+
// 16px
|
|
108
|
+
},
|
|
109
|
+
iconPosition: {
|
|
110
|
+
left: "flex-row",
|
|
111
|
+
right: "flex-row-reverse justify-between"
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
defaultVariants: {
|
|
115
|
+
size: "default",
|
|
116
|
+
iconPosition: "right"
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
);
|
|
120
|
+
var triggerIconSizeClasses = {
|
|
121
|
+
sm: "icon-xs",
|
|
122
|
+
// 14px
|
|
123
|
+
default: "icon-sm",
|
|
124
|
+
// 16px
|
|
125
|
+
lg: "icon-sm"
|
|
126
|
+
// 16px
|
|
127
|
+
};
|
|
128
|
+
var AccordionTrigger = React.forwardRef(({ className, children, icon, ...props }, ref) => {
|
|
129
|
+
const { size, iconPosition } = useAccordionStyleContext();
|
|
130
|
+
const resolvedSize = size || "default";
|
|
131
|
+
return /* @__PURE__ */ React.createElement(AccordionPrimitive.Header, { className: "flex" }, /* @__PURE__ */ React.createElement(
|
|
132
|
+
AccordionPrimitive.Trigger,
|
|
133
|
+
{
|
|
134
|
+
ref,
|
|
135
|
+
className: cn(
|
|
136
|
+
"group",
|
|
137
|
+
accordionTriggerVariants({ size: resolvedSize, iconPosition }),
|
|
138
|
+
className
|
|
139
|
+
),
|
|
140
|
+
...props
|
|
141
|
+
},
|
|
142
|
+
icon || /* @__PURE__ */ React.createElement(DefaultChevronIcon, { className: cn(
|
|
143
|
+
"accordion-chevron shrink-0 text-text-muted transition-transform duration-normal",
|
|
144
|
+
triggerIconSizeClasses[resolvedSize]
|
|
145
|
+
) }),
|
|
146
|
+
/* @__PURE__ */ React.createElement("span", { className: "text-left" }, children)
|
|
147
|
+
));
|
|
148
|
+
});
|
|
149
|
+
AccordionTrigger.displayName = "AccordionTrigger";
|
|
150
|
+
var accordionContentSizeClasses = {
|
|
151
|
+
sm: "px-4 pb-3 text-sm",
|
|
152
|
+
default: "px-4 pb-4 text-md",
|
|
153
|
+
lg: "px-6 pb-5 text-base"
|
|
154
|
+
};
|
|
155
|
+
var AccordionContent = React.forwardRef(({ className, children, ...props }, ref) => {
|
|
156
|
+
const { size } = useAccordionStyleContext();
|
|
157
|
+
const resolvedSize = size || "default";
|
|
158
|
+
return /* @__PURE__ */ React.createElement(
|
|
159
|
+
AccordionPrimitive.Content,
|
|
160
|
+
{
|
|
161
|
+
ref,
|
|
162
|
+
className: "overflow-hidden data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down",
|
|
163
|
+
...props
|
|
164
|
+
},
|
|
165
|
+
/* @__PURE__ */ React.createElement("div", { className: cn(
|
|
166
|
+
"text-text-muted",
|
|
167
|
+
accordionContentSizeClasses[resolvedSize],
|
|
168
|
+
className
|
|
169
|
+
) }, children)
|
|
170
|
+
);
|
|
171
|
+
});
|
|
172
|
+
AccordionContent.displayName = "AccordionContent";
|
|
173
|
+
|
|
174
|
+
export {
|
|
175
|
+
accordionVariants,
|
|
176
|
+
Accordion,
|
|
177
|
+
AccordionItem,
|
|
178
|
+
accordionTriggerVariants,
|
|
179
|
+
AccordionTrigger,
|
|
180
|
+
AccordionContent
|
|
181
|
+
};
|
|
182
|
+
//# sourceMappingURL=chunk-XK52LYR4.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/ui/accordion.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as AccordionPrimitive from '@radix-ui/react-accordion'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '@/lib/utils'\n\n// Default chevron icon (built-in, no external dependency)\nconst DefaultChevronIcon = ({ className }: { className?: string }) => (\n <svg\n className={className}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n aria-hidden=\"true\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n)\n\n// Context to pass style props from Accordion root to children\ntype AccordionStyleContextValue = {\n variant?: 'default' | 'bordered' | 'splitted'\n size?: 'sm' | 'default' | 'lg'\n iconPosition?: 'left' | 'right'\n}\nconst AccordionStyleContext = React.createContext<AccordionStyleContextValue>({})\nconst useAccordionStyleContext = () => React.useContext(AccordionStyleContext)\n\n// ─── Accordion (Root) ────────────────────────────────────────\n\nconst accordionVariants = cva('w-full', {\n variants: {\n variant: {\n default: 'divide-y divide-border',\n bordered: 'divide-y divide-border border border-border rounded-xl',\n splitted: 'flex flex-col gap-3',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n})\n\nexport interface AccordionProps extends React.HTMLAttributes<HTMLDivElement> {\n type?: 'single' | 'multiple'\n variant?: 'default' | 'bordered' | 'splitted'\n size?: 'sm' | 'default' | 'lg'\n iconPosition?: 'left' | 'right'\n collapsible?: boolean\n defaultValue?: string | string[]\n value?: string | string[]\n onValueChange?: ((value: string) => void) | ((value: string[]) => void)\n disabled?: boolean\n}\n\nconst Accordion = React.forwardRef<HTMLDivElement, AccordionProps>(\n ({ className, variant = 'default', size = 'default', iconPosition = 'right', type = 'single', collapsible = true, defaultValue, value, onValueChange, disabled, ...props }, ref) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Radix single/multiple union type conflict\n const restProps = props as any\n const sharedClassName = cn(accordionVariants({ variant }), className)\n\n const radixProps = type === 'multiple'\n ? {\n type: 'multiple' as const,\n defaultValue: defaultValue as string[] | undefined,\n value: value as string[] | undefined,\n onValueChange: onValueChange as ((value: string[]) => void) | undefined,\n disabled,\n }\n : {\n type: 'single' as const,\n collapsible,\n defaultValue: defaultValue as string | undefined,\n value: value as string | undefined,\n onValueChange: onValueChange as ((value: string) => void) | undefined,\n disabled,\n }\n\n return (\n <AccordionStyleContext.Provider value={{ variant, size, iconPosition }}>\n <AccordionPrimitive.Root\n ref={ref}\n className={sharedClassName}\n {...radixProps}\n {...restProps}\n />\n </AccordionStyleContext.Provider>\n )\n }\n)\nAccordion.displayName = 'Accordion'\n\n// ─── AccordionItem ───────────────────────────────────────────\n\nconst accordionItemVariants = cva('', {\n variants: {\n variant: {\n default: '',\n bordered: '',\n splitted: 'border border-border rounded-xl',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n})\n\nexport interface AccordionItemProps\n extends React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Item>,\n Omit<VariantProps<typeof accordionItemVariants>, 'variant'> {}\n\nconst AccordionItem = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Item>,\n AccordionItemProps\n>(({ className, ...props }, ref) => {\n const { variant } = useAccordionStyleContext()\n return (\n <AccordionPrimitive.Item\n ref={ref}\n className={cn(accordionItemVariants({ variant }), className)}\n {...props}\n />\n )\n})\nAccordionItem.displayName = 'AccordionItem'\n\n// ─── AccordionTrigger ────────────────────────────────────────\n\nconst accordionTriggerVariants = cva(\n [\n 'flex flex-1 items-center gap-3 font-semibold text-foreground',\n 'transition-all duration-micro ease-out cursor-pointer',\n 'hover:bg-background-muted/50',\n 'focus-visible:focus-ring focus-visible:rounded-md',\n 'disabled:pointer-events-none disabled:text-text-subtle disabled:opacity-50',\n '[&[data-state=open]>svg.accordion-chevron]:rotate-180',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'py-3 px-4 text-sm', // 13px\n default: 'py-4 px-4 text-md', // 14px\n lg: 'py-5 px-6 text-base', // 16px\n },\n iconPosition: {\n left: 'flex-row',\n right: 'flex-row-reverse justify-between',\n },\n },\n defaultVariants: {\n size: 'default',\n iconPosition: 'right',\n },\n }\n)\n\n// Icon size per trigger size\nconst triggerIconSizeClasses = {\n sm: 'icon-xs', // 14px\n default: 'icon-sm', // 16px\n lg: 'icon-sm', // 16px\n} as const\n\nexport interface AccordionTriggerProps\n extends React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Trigger> {\n /** Custom indicator icon (replaces default chevron) */\n icon?: React.ReactNode\n}\n\nconst AccordionTrigger = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Trigger>,\n AccordionTriggerProps\n>(({ className, children, icon, ...props }, ref) => {\n const { size, iconPosition } = useAccordionStyleContext()\n const resolvedSize = size || 'default'\n\n return (\n <AccordionPrimitive.Header className=\"flex\">\n <AccordionPrimitive.Trigger\n ref={ref}\n className={cn(\n 'group',\n accordionTriggerVariants({ size: resolvedSize, iconPosition }),\n className\n )}\n {...props}\n >\n {icon || (\n <DefaultChevronIcon className={cn(\n 'accordion-chevron shrink-0 text-text-muted transition-transform duration-normal',\n triggerIconSizeClasses[resolvedSize]\n )} />\n )}\n <span className=\"text-left\">{children}</span>\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n )\n})\nAccordionTrigger.displayName = 'AccordionTrigger'\n\n// ─── AccordionContent ────────────────────────────────────────\n\nconst accordionContentSizeClasses = {\n sm: 'px-4 pb-3 text-sm',\n default: 'px-4 pb-4 text-md',\n lg: 'px-6 pb-5 text-base',\n} as const\n\nexport interface AccordionContentProps\n extends React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Content> {}\n\nconst AccordionContent = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Content>,\n AccordionContentProps\n>(({ className, children, ...props }, ref) => {\n const { size } = useAccordionStyleContext()\n const resolvedSize = size || 'default'\n\n return (\n <AccordionPrimitive.Content\n ref={ref}\n className=\"overflow-hidden data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down\"\n {...props}\n >\n <div className={cn(\n 'text-text-muted',\n accordionContentSizeClasses[resolvedSize],\n className\n )}>\n {children}\n </div>\n </AccordionPrimitive.Content>\n )\n})\nAccordionContent.displayName = 'AccordionContent'\n\n// ─── Exports ─────────────────────────────────────────────────\nexport {\n Accordion,\n AccordionItem,\n AccordionTrigger,\n AccordionContent,\n accordionVariants,\n accordionTriggerVariants,\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {
|
|
3
|
+
cn
|
|
4
|
+
} from "./chunk-53MIUPSY.mjs";
|
|
5
|
+
|
|
6
|
+
// src/components/ui/toggle.tsx
|
|
7
|
+
import * as React from "react";
|
|
8
|
+
import * as TogglePrimitive from "@radix-ui/react-toggle";
|
|
9
|
+
import { cva } from "class-variance-authority";
|
|
10
|
+
var toggleBaseStyles = "inline-flex items-center justify-center text-text-muted transition-all duration-micro focus-visible:focus-ring disabled:pointer-events-none disabled:opacity-50";
|
|
11
|
+
var toggleVariants = cva(
|
|
12
|
+
toggleBaseStyles,
|
|
13
|
+
{
|
|
14
|
+
variants: {
|
|
15
|
+
variant: {
|
|
16
|
+
default: "bg-transparent hover:bg-background-muted hover:text-foreground data-[state=on]:bg-background-muted data-[state=on]:text-foreground",
|
|
17
|
+
outline: "border border-border bg-transparent hover:bg-background-muted hover:text-foreground data-[state=on]:bg-background-muted data-[state=on]:text-foreground",
|
|
18
|
+
ghost: "bg-transparent hover:text-foreground data-[state=on]:bg-transparent data-[state=on]:text-foreground",
|
|
19
|
+
"outline-ghost": "border border-border bg-transparent hover:text-foreground data-[state=on]:bg-transparent data-[state=on]:text-foreground data-[state=on]:border-border"
|
|
20
|
+
},
|
|
21
|
+
fontWeight: {
|
|
22
|
+
normal: "font-normal",
|
|
23
|
+
semibold: "font-semibold"
|
|
24
|
+
},
|
|
25
|
+
size: {
|
|
26
|
+
xs: "h-7 px-2.5 text-xs gap-1",
|
|
27
|
+
// 28px height, 10px paddingX, 12px font
|
|
28
|
+
sm: "h-8 px-3 text-sm gap-2",
|
|
29
|
+
// 32px height, 12px paddingX, 13px font
|
|
30
|
+
md: "h-9 px-3.5 text-md gap-2",
|
|
31
|
+
// 36px height, 14px paddingX, 14px font
|
|
32
|
+
default: "h-10 px-4 text-md gap-2",
|
|
33
|
+
// 40px height, 16px paddingX, 14px font
|
|
34
|
+
lg: "h-12 px-6 text-base gap-2"
|
|
35
|
+
// 48px height, 24px paddingX, 16px font
|
|
36
|
+
},
|
|
37
|
+
radius: {
|
|
38
|
+
none: "rounded-none",
|
|
39
|
+
// 0px - primitive.borderRadius.none
|
|
40
|
+
sm: "rounded-sm",
|
|
41
|
+
// 2px - primitive.borderRadius.sm
|
|
42
|
+
base: "rounded",
|
|
43
|
+
// 4px - primitive.borderRadius.base
|
|
44
|
+
default: "rounded-md",
|
|
45
|
+
// 6px - primitive.borderRadius.md
|
|
46
|
+
lg: "rounded-lg",
|
|
47
|
+
// 8px - primitive.borderRadius.lg
|
|
48
|
+
xl: "rounded-xl",
|
|
49
|
+
// 12px - primitive.borderRadius.xl
|
|
50
|
+
"2xl": "rounded-2xl",
|
|
51
|
+
// 16px - primitive.borderRadius.2xl
|
|
52
|
+
"3xl": "rounded-3xl",
|
|
53
|
+
// 24px - primitive.borderRadius.3xl
|
|
54
|
+
full: "rounded-full"
|
|
55
|
+
// 9999px - primitive.borderRadius.full
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
defaultVariants: {
|
|
59
|
+
variant: "default",
|
|
60
|
+
size: "default",
|
|
61
|
+
radius: "default",
|
|
62
|
+
// 6px - primitive.borderRadius.md (Figma button default)
|
|
63
|
+
fontWeight: "normal"
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
);
|
|
67
|
+
var iconOnlySizes = {
|
|
68
|
+
xs: "h-7 w-7",
|
|
69
|
+
// 28px × 28px - spacing.7
|
|
70
|
+
sm: "h-8 w-8",
|
|
71
|
+
// 32px × 32px - spacing.8
|
|
72
|
+
md: "h-9 w-9",
|
|
73
|
+
// 36px × 36px - spacing.9
|
|
74
|
+
default: "h-10 w-10",
|
|
75
|
+
// 40px × 40px - spacing.10
|
|
76
|
+
lg: "h-12 w-12"
|
|
77
|
+
// 48px × 48px - spacing.12
|
|
78
|
+
};
|
|
79
|
+
var radiusClasses = {
|
|
80
|
+
none: "rounded-none",
|
|
81
|
+
sm: "rounded-sm",
|
|
82
|
+
base: "rounded",
|
|
83
|
+
default: "rounded-md",
|
|
84
|
+
lg: "rounded-lg",
|
|
85
|
+
xl: "rounded-xl",
|
|
86
|
+
"2xl": "rounded-2xl",
|
|
87
|
+
"3xl": "rounded-3xl",
|
|
88
|
+
full: "rounded-full"
|
|
89
|
+
};
|
|
90
|
+
var variantClasses = {
|
|
91
|
+
default: "bg-transparent hover:bg-background-muted hover:text-foreground data-[state=on]:bg-background-muted data-[state=on]:text-foreground",
|
|
92
|
+
outline: "border border-border bg-transparent hover:bg-background-muted hover:text-foreground data-[state=on]:bg-background-muted data-[state=on]:text-foreground",
|
|
93
|
+
ghost: "bg-transparent hover:text-foreground data-[state=on]:bg-transparent data-[state=on]:text-foreground",
|
|
94
|
+
"outline-ghost": "border border-border bg-transparent hover:text-foreground data-[state=on]:bg-transparent data-[state=on]:text-foreground data-[state=on]:border-border"
|
|
95
|
+
};
|
|
96
|
+
var iconSizeClasses = {
|
|
97
|
+
xs: "[&>svg]:icon-xs",
|
|
98
|
+
// 14px
|
|
99
|
+
sm: "[&>svg]:icon-xs",
|
|
100
|
+
// 14px
|
|
101
|
+
md: "[&>svg]:icon-sm",
|
|
102
|
+
// 16px
|
|
103
|
+
default: "[&>svg]:icon-sm",
|
|
104
|
+
// 16px
|
|
105
|
+
lg: "[&>svg]:icon-sm"
|
|
106
|
+
// 16px
|
|
107
|
+
};
|
|
108
|
+
var Toggle = React.forwardRef(({ className, variant, size, radius, fontWeight, iconOnly, pressEffect, ...props }, ref) => {
|
|
109
|
+
const sizeKey = size || "default";
|
|
110
|
+
const radiusKey = radius || "default";
|
|
111
|
+
const variantKey = variant || "default";
|
|
112
|
+
const fontWeightClass = fontWeight === "normal" ? "font-normal" : fontWeight === "semibold" ? "font-semibold" : "font-normal";
|
|
113
|
+
if (iconOnly) {
|
|
114
|
+
const iconOnlyIconSize = {
|
|
115
|
+
xs: "[&>svg]:icon-xs",
|
|
116
|
+
// 14px
|
|
117
|
+
sm: "[&>svg]:icon-sm",
|
|
118
|
+
// 16px
|
|
119
|
+
md: "[&>svg]:icon-sm",
|
|
120
|
+
// 16px
|
|
121
|
+
default: "[&>svg]:icon-md",
|
|
122
|
+
// 20px
|
|
123
|
+
lg: "[&>svg]:icon-lg"
|
|
124
|
+
// 24px
|
|
125
|
+
}[sizeKey];
|
|
126
|
+
return /* @__PURE__ */ React.createElement(
|
|
127
|
+
TogglePrimitive.Root,
|
|
128
|
+
{
|
|
129
|
+
ref,
|
|
130
|
+
className: cn(
|
|
131
|
+
toggleBaseStyles,
|
|
132
|
+
pressEffect !== false && "active:scale-pressed",
|
|
133
|
+
fontWeightClass,
|
|
134
|
+
variantClasses[variantKey],
|
|
135
|
+
iconOnlySizes[sizeKey],
|
|
136
|
+
radiusClasses[radiusKey],
|
|
137
|
+
iconOnlyIconSize,
|
|
138
|
+
className
|
|
139
|
+
),
|
|
140
|
+
...props
|
|
141
|
+
}
|
|
142
|
+
);
|
|
143
|
+
}
|
|
144
|
+
return /* @__PURE__ */ React.createElement(
|
|
145
|
+
TogglePrimitive.Root,
|
|
146
|
+
{
|
|
147
|
+
ref,
|
|
148
|
+
className: cn(
|
|
149
|
+
toggleVariants({ variant, size, radius, fontWeight }),
|
|
150
|
+
pressEffect !== false && "active:scale-pressed",
|
|
151
|
+
iconSizeClasses[sizeKey],
|
|
152
|
+
className
|
|
153
|
+
),
|
|
154
|
+
...props
|
|
155
|
+
}
|
|
156
|
+
);
|
|
157
|
+
});
|
|
158
|
+
Toggle.displayName = TogglePrimitive.Root.displayName;
|
|
159
|
+
|
|
160
|
+
export {
|
|
161
|
+
toggleVariants,
|
|
162
|
+
Toggle
|
|
163
|
+
};
|
|
164
|
+
//# sourceMappingURL=chunk-YIAH6KHV.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/ui/toggle.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as TogglePrimitive from '@radix-ui/react-toggle'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '@/lib/utils'\n\n// Base styles without size (for iconOnly mode)\nconst toggleBaseStyles = 'inline-flex items-center justify-center text-text-muted transition-all duration-micro focus-visible:focus-ring disabled:pointer-events-none disabled:opacity-50'\n\nconst toggleVariants = cva(\n toggleBaseStyles,\n {\n variants: {\n variant: {\n default: 'bg-transparent hover:bg-background-muted hover:text-foreground data-[state=on]:bg-background-muted data-[state=on]:text-foreground',\n outline: 'border border-border bg-transparent hover:bg-background-muted hover:text-foreground data-[state=on]:bg-background-muted data-[state=on]:text-foreground',\n ghost: 'bg-transparent hover:text-foreground data-[state=on]:bg-transparent data-[state=on]:text-foreground',\n 'outline-ghost': 'border border-border bg-transparent hover:text-foreground data-[state=on]:bg-transparent data-[state=on]:text-foreground data-[state=on]:border-border',\n },\n fontWeight: {\n normal: 'font-normal',\n semibold: 'font-semibold',\n },\n size: {\n xs: 'h-7 px-2.5 text-xs gap-1', // 28px height, 10px paddingX, 12px font\n sm: 'h-8 px-3 text-sm gap-2', // 32px height, 12px paddingX, 13px font\n md: 'h-9 px-3.5 text-md gap-2', // 36px height, 14px paddingX, 14px font\n default: 'h-10 px-4 text-md gap-2', // 40px height, 16px paddingX, 14px font\n lg: 'h-12 px-6 text-base gap-2', // 48px height, 24px paddingX, 16px font\n },\n radius: {\n none: 'rounded-none', // 0px - primitive.borderRadius.none\n sm: 'rounded-sm', // 2px - primitive.borderRadius.sm\n base: 'rounded', // 4px - primitive.borderRadius.base\n default: 'rounded-md', // 6px - primitive.borderRadius.md\n lg: 'rounded-lg', // 8px - primitive.borderRadius.lg\n xl: 'rounded-xl', // 12px - primitive.borderRadius.xl\n '2xl': 'rounded-2xl', // 16px - primitive.borderRadius.2xl\n '3xl': 'rounded-3xl', // 24px - primitive.borderRadius.3xl\n full: 'rounded-full', // 9999px - primitive.borderRadius.full\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n radius: 'default', // 6px - primitive.borderRadius.md (Figma button default)\n fontWeight: 'normal',\n },\n }\n)\n\n// iconOnly sizes - square like IconButton (same width and height, no padding)\nconst iconOnlySizes = {\n xs: 'h-7 w-7', // 28px × 28px - spacing.7\n sm: 'h-8 w-8', // 32px × 32px - spacing.8\n md: 'h-9 w-9', // 36px × 36px - spacing.9\n default: 'h-10 w-10', // 40px × 40px - spacing.10\n lg: 'h-12 w-12', // 48px × 48px - spacing.12\n}\n\n// Radius classes for iconOnly mode\nconst radiusClasses = {\n none: 'rounded-none',\n sm: 'rounded-sm',\n base: 'rounded',\n default: '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// Variant classes for iconOnly mode\nconst variantClasses = {\n default: 'bg-transparent hover:bg-background-muted hover:text-foreground data-[state=on]:bg-background-muted data-[state=on]:text-foreground',\n outline: 'border border-border bg-transparent hover:bg-background-muted hover:text-foreground data-[state=on]:bg-background-muted data-[state=on]:text-foreground',\n ghost: 'bg-transparent hover:text-foreground data-[state=on]:bg-transparent data-[state=on]:text-foreground',\n 'outline-ghost': 'border border-border bg-transparent hover:text-foreground data-[state=on]:bg-transparent data-[state=on]:text-foreground data-[state=on]:border-border',\n}\n\nexport interface ToggleProps\n extends React.ComponentPropsWithoutRef<typeof TogglePrimitive.Root>,\n Omit<VariantProps<typeof toggleVariants>, 'fontWeight'> {\n iconOnly?: boolean\n fontWeight?: 'normal' | 'semibold'\n pressEffect?: boolean\n}\n\n// Icon size for text+icon mode (5-step scale)\n// xs~sm: 14px, md~default~lg: 16px\nconst iconSizeClasses = {\n xs: '[&>svg]:icon-xs', // 14px\n sm: '[&>svg]:icon-xs', // 14px\n md: '[&>svg]:icon-sm', // 16px\n default: '[&>svg]:icon-sm', // 16px\n lg: '[&>svg]:icon-sm', // 16px\n}\n\nconst Toggle = React.forwardRef<\n React.ElementRef<typeof TogglePrimitive.Root>,\n ToggleProps\n>(({ className, variant, size, radius, fontWeight, iconOnly, pressEffect, ...props }, ref) => {\n const sizeKey = size || 'default'\n const radiusKey = radius || 'default'\n const variantKey = variant || 'default'\n const fontWeightClass = fontWeight === 'normal' ? 'font-normal' : fontWeight === 'semibold' ? 'font-semibold' : 'font-normal'\n\n // When iconOnly, build classes manually without padding\n if (iconOnly) {\n // Icon only uses larger icon sizes (like IconButton, 5-step scale)\n // XS: 14px, SM~MD: 16px, Default: 20px, LG: 24px\n const iconOnlyIconSize = {\n xs: '[&>svg]:icon-xs', // 14px\n sm: '[&>svg]:icon-sm', // 16px\n md: '[&>svg]:icon-sm', // 16px\n default: '[&>svg]:icon-md', // 20px\n lg: '[&>svg]:icon-lg', // 24px\n }[sizeKey]\n\n return (\n <TogglePrimitive.Root\n ref={ref}\n className={cn(\n toggleBaseStyles,\n pressEffect !== false && 'active:scale-pressed',\n fontWeightClass,\n variantClasses[variantKey],\n iconOnlySizes[sizeKey],\n radiusClasses[radiusKey],\n iconOnlyIconSize,\n className\n )}\n {...props}\n />\n )\n }\n\n // Normal mode with padding\n return (\n <TogglePrimitive.Root\n ref={ref}\n className={cn(\n toggleVariants({ variant, size, radius, fontWeight }),\n pressEffect !== false && 'active:scale-pressed',\n iconSizeClasses[sizeKey],\n className\n )}\n {...props}\n />\n )\n})\n\nToggle.displayName = TogglePrimitive.Root.displayName\n\nexport { Toggle, toggleVariants }\n"],"mappings":"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","names":[]}
|