@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.
Files changed (167) hide show
  1. package/README.md +2 -2
  2. package/dist/chart.mjs +3 -9
  3. package/dist/chart.mjs.map +1 -1
  4. package/dist/chunk-234NAXGV.mjs +252 -0
  5. package/dist/chunk-234NAXGV.mjs.map +1 -0
  6. package/dist/chunk-53MIUPSY.mjs +13 -0
  7. package/dist/chunk-53MIUPSY.mjs.map +1 -0
  8. package/dist/chunk-BN5BEA3V.mjs +195 -0
  9. package/dist/chunk-BN5BEA3V.mjs.map +1 -0
  10. package/dist/chunk-COW3B62M.mjs +214 -0
  11. package/dist/chunk-COW3B62M.mjs.map +1 -0
  12. package/dist/chunk-CTH6SN5Y.mjs +114 -0
  13. package/dist/chunk-CTH6SN5Y.mjs.map +1 -0
  14. package/dist/chunk-D3NTQNDW.mjs +440 -0
  15. package/dist/chunk-D3NTQNDW.mjs.map +1 -0
  16. package/dist/chunk-DDRYEJBJ.mjs +164 -0
  17. package/dist/chunk-DDRYEJBJ.mjs.map +1 -0
  18. package/dist/chunk-DJAEXCRU.mjs +190 -0
  19. package/dist/chunk-DJAEXCRU.mjs.map +1 -0
  20. package/dist/chunk-DRVHHEAY.mjs +145 -0
  21. package/dist/chunk-DRVHHEAY.mjs.map +1 -0
  22. package/dist/chunk-DTLNWOTR.mjs +482 -0
  23. package/dist/chunk-DTLNWOTR.mjs.map +1 -0
  24. package/dist/chunk-DYYQOHQR.mjs +214 -0
  25. package/dist/chunk-DYYQOHQR.mjs.map +1 -0
  26. package/dist/chunk-FHUAH6AJ.mjs +93 -0
  27. package/dist/chunk-FHUAH6AJ.mjs.map +1 -0
  28. package/dist/chunk-GD4YE5AE.mjs +209 -0
  29. package/dist/chunk-GD4YE5AE.mjs.map +1 -0
  30. package/dist/chunk-GRCJ35DX.mjs +144 -0
  31. package/dist/chunk-GRCJ35DX.mjs.map +1 -0
  32. package/dist/chunk-HHX4GABH.mjs +129 -0
  33. package/dist/chunk-HHX4GABH.mjs.map +1 -0
  34. package/dist/chunk-IPCIC2BI.mjs +148 -0
  35. package/dist/chunk-IPCIC2BI.mjs.map +1 -0
  36. package/dist/chunk-IY3R2VGB.mjs +272 -0
  37. package/dist/chunk-IY3R2VGB.mjs.map +1 -0
  38. package/dist/chunk-JCJEVXER.mjs +170 -0
  39. package/dist/chunk-JCJEVXER.mjs.map +1 -0
  40. package/dist/chunk-KBPYAMGS.mjs +157 -0
  41. package/dist/chunk-KBPYAMGS.mjs.map +1 -0
  42. package/dist/chunk-LJJ6K4IU.mjs +318 -0
  43. package/dist/chunk-LJJ6K4IU.mjs.map +1 -0
  44. package/dist/chunk-MRUVGHGP.mjs +375 -0
  45. package/dist/chunk-MRUVGHGP.mjs.map +1 -0
  46. package/dist/chunk-N4K2BDGM.mjs +153 -0
  47. package/dist/chunk-N4K2BDGM.mjs.map +1 -0
  48. package/dist/chunk-NWFMJWGX.mjs +165 -0
  49. package/dist/chunk-NWFMJWGX.mjs.map +1 -0
  50. package/dist/chunk-PTAPPOKU.mjs +117 -0
  51. package/dist/chunk-PTAPPOKU.mjs.map +1 -0
  52. package/dist/chunk-PVTBM7V7.mjs +316 -0
  53. package/dist/chunk-PVTBM7V7.mjs.map +1 -0
  54. package/dist/chunk-Q5WVLK2L.mjs +77 -0
  55. package/dist/chunk-Q5WVLK2L.mjs.map +1 -0
  56. package/dist/chunk-RKSB2N5L.mjs +206 -0
  57. package/dist/chunk-RKSB2N5L.mjs.map +1 -0
  58. package/dist/chunk-S4DGVKBK.mjs +151 -0
  59. package/dist/chunk-S4DGVKBK.mjs.map +1 -0
  60. package/dist/chunk-S4T4PU7F.mjs +114 -0
  61. package/dist/chunk-S4T4PU7F.mjs.map +1 -0
  62. package/dist/chunk-SZPZOGPC.mjs +394 -0
  63. package/dist/chunk-SZPZOGPC.mjs.map +1 -0
  64. package/dist/chunk-T546XBQG.mjs +443 -0
  65. package/dist/chunk-T546XBQG.mjs.map +1 -0
  66. package/dist/chunk-UWTT5AE6.mjs +145 -0
  67. package/dist/chunk-UWTT5AE6.mjs.map +1 -0
  68. package/dist/chunk-V5UFWYFI.mjs +255 -0
  69. package/dist/chunk-V5UFWYFI.mjs.map +1 -0
  70. package/dist/chunk-VUPGBB5X.mjs +150 -0
  71. package/dist/chunk-VUPGBB5X.mjs.map +1 -0
  72. package/dist/chunk-W6YNEU53.mjs +175 -0
  73. package/dist/chunk-W6YNEU53.mjs.map +1 -0
  74. package/dist/chunk-WWSN5YME.mjs +222 -0
  75. package/dist/chunk-WWSN5YME.mjs.map +1 -0
  76. package/dist/chunk-XK52LYR4.mjs +182 -0
  77. package/dist/chunk-XK52LYR4.mjs.map +1 -0
  78. package/dist/chunk-YIAH6KHV.mjs +164 -0
  79. package/dist/chunk-YIAH6KHV.mjs.map +1 -0
  80. package/dist/chunk-Z6JWWCNL.mjs +108 -0
  81. package/dist/chunk-Z6JWWCNL.mjs.map +1 -0
  82. package/dist/chunk-ZDRUTJ4T.mjs +119 -0
  83. package/dist/chunk-ZDRUTJ4T.mjs.map +1 -0
  84. package/dist/components/accordion.mjs +19 -0
  85. package/dist/components/accordion.mjs.map +1 -0
  86. package/dist/components/alert.mjs +15 -0
  87. package/dist/components/alert.mjs.map +1 -0
  88. package/dist/components/avatar.mjs +23 -0
  89. package/dist/components/avatar.mjs.map +1 -0
  90. package/dist/components/badge.mjs +11 -0
  91. package/dist/components/badge.mjs.map +1 -0
  92. package/dist/components/breadcrumb.mjs +23 -0
  93. package/dist/components/breadcrumb.mjs.map +1 -0
  94. package/dist/components/button-group.mjs +11 -0
  95. package/dist/components/button-group.mjs.map +1 -0
  96. package/dist/components/button.mjs +12 -0
  97. package/dist/components/button.mjs.map +1 -0
  98. package/dist/components/card.mjs +25 -0
  99. package/dist/components/card.mjs.map +1 -0
  100. package/dist/components/chat-input.mjs +15 -0
  101. package/dist/components/chat-input.mjs.map +1 -0
  102. package/dist/components/chat-message.mjs +17 -0
  103. package/dist/components/chat-message.mjs.map +1 -0
  104. package/dist/components/checkbox.mjs +12 -0
  105. package/dist/components/checkbox.mjs.map +1 -0
  106. package/dist/components/divider.mjs +11 -0
  107. package/dist/components/divider.mjs.map +1 -0
  108. package/dist/components/drawer.mjs +33 -0
  109. package/dist/components/drawer.mjs.map +1 -0
  110. package/dist/components/dropdown.mjs +35 -0
  111. package/dist/components/dropdown.mjs.map +1 -0
  112. package/dist/components/field.mjs +17 -0
  113. package/dist/components/field.mjs.map +1 -0
  114. package/dist/components/icon-button.mjs +12 -0
  115. package/dist/components/icon-button.mjs.map +1 -0
  116. package/dist/components/input.mjs +12 -0
  117. package/dist/components/input.mjs.map +1 -0
  118. package/dist/components/metric-card.mjs +23 -0
  119. package/dist/components/metric-card.mjs.map +1 -0
  120. package/dist/components/modal.mjs +57 -0
  121. package/dist/components/modal.mjs.map +1 -0
  122. package/dist/components/navigation-menu.mjs +27 -0
  123. package/dist/components/navigation-menu.mjs.map +1 -0
  124. package/dist/components/pagination.mjs +33 -0
  125. package/dist/components/pagination.mjs.map +1 -0
  126. package/dist/components/popover.mjs +23 -0
  127. package/dist/components/popover.mjs.map +1 -0
  128. package/dist/components/progress.mjs +11 -0
  129. package/dist/components/progress.mjs.map +1 -0
  130. package/dist/components/quick-reply.mjs +15 -0
  131. package/dist/components/quick-reply.mjs.map +1 -0
  132. package/dist/components/radio-group.mjs +16 -0
  133. package/dist/components/radio-group.mjs.map +1 -0
  134. package/dist/components/segmented.mjs +15 -0
  135. package/dist/components/segmented.mjs.map +1 -0
  136. package/dist/components/select.mjs +23 -0
  137. package/dist/components/select.mjs.map +1 -0
  138. package/dist/components/skeleton.mjs +11 -0
  139. package/dist/components/skeleton.mjs.map +1 -0
  140. package/dist/components/slider.mjs +11 -0
  141. package/dist/components/slider.mjs.map +1 -0
  142. package/dist/components/spinner.mjs +11 -0
  143. package/dist/components/spinner.mjs.map +1 -0
  144. package/dist/components/switch.mjs +12 -0
  145. package/dist/components/switch.mjs.map +1 -0
  146. package/dist/components/table.mjs +23 -0
  147. package/dist/components/table.mjs.map +1 -0
  148. package/dist/components/tabs.mjs +19 -0
  149. package/dist/components/tabs.mjs.map +1 -0
  150. package/dist/components/textarea.mjs +12 -0
  151. package/dist/components/textarea.mjs.map +1 -0
  152. package/dist/components/toast.mjs +13 -0
  153. package/dist/components/toast.mjs.map +1 -0
  154. package/dist/components/toggle-group.mjs +15 -0
  155. package/dist/components/toggle-group.mjs.map +1 -0
  156. package/dist/components/toggle.mjs +11 -0
  157. package/dist/components/toggle.mjs.map +1 -0
  158. package/dist/components/tooltip.mjs +21 -0
  159. package/dist/components/tooltip.mjs.map +1 -0
  160. package/dist/components/typing-indicator.mjs +11 -0
  161. package/dist/components/typing-indicator.mjs.map +1 -0
  162. package/dist/index.mjs +296 -7536
  163. package/dist/index.mjs.map +1 -1
  164. package/llms.txt +23 -23
  165. package/package.json +4 -3
  166. package/dist/chart.d.mts +0 -147
  167. 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":"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","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":[]}