langgraph-ui-components 0.0.17 → 0.0.18

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 (316) hide show
  1. package/dist/index.es100.js +20 -354
  2. package/dist/index.es100.js.map +1 -1
  3. package/dist/index.es101.js +172 -127
  4. package/dist/index.es101.js.map +1 -1
  5. package/dist/index.es102.js +231 -60
  6. package/dist/index.es102.js.map +1 -1
  7. package/dist/index.es103.js +352 -34
  8. package/dist/index.es103.js.map +1 -1
  9. package/dist/index.es104.js +134 -34
  10. package/dist/index.es104.js.map +1 -1
  11. package/dist/index.es105.js +65 -161
  12. package/dist/index.es105.js.map +1 -1
  13. package/dist/index.es106.js +30 -196
  14. package/dist/index.es106.js.map +1 -1
  15. package/dist/index.es107.js +36 -13
  16. package/dist/index.es107.js.map +1 -1
  17. package/dist/index.es108.js +162 -26
  18. package/dist/index.es108.js.map +1 -1
  19. package/dist/index.es109.js +196 -27
  20. package/dist/index.es109.js.map +1 -1
  21. package/dist/index.es110.js +13 -3156
  22. package/dist/index.es110.js.map +1 -1
  23. package/dist/index.es111.js +27 -34
  24. package/dist/index.es111.js.map +1 -1
  25. package/dist/index.es112.js +34 -5
  26. package/dist/index.es112.js.map +1 -1
  27. package/dist/index.es113.js +3145 -61
  28. package/dist/index.es113.js.map +1 -1
  29. package/dist/index.es114.js +33 -33
  30. package/dist/index.es114.js.map +1 -1
  31. package/dist/index.es115.js +5 -21
  32. package/dist/index.es115.js.map +1 -1
  33. package/dist/index.es116.js +69 -64
  34. package/dist/index.es116.js.map +1 -1
  35. package/dist/index.es117.js +37 -3
  36. package/dist/index.es117.js.map +1 -1
  37. package/dist/index.es12.js +1 -1
  38. package/dist/index.es121.js +9 -9
  39. package/dist/index.es122.js +1 -1
  40. package/dist/index.es126.js +1 -1
  41. package/dist/index.es128.js +2 -2
  42. package/dist/index.es13.js +9 -3
  43. package/dist/index.es13.js.map +1 -1
  44. package/dist/index.es136.js +1 -1
  45. package/dist/index.es137.js +6 -6
  46. package/dist/index.es139.js +1 -1
  47. package/dist/index.es14.js +6 -6
  48. package/dist/index.es140.js +1 -1
  49. package/dist/index.es143.js +1 -1
  50. package/dist/index.es144.js +1 -1
  51. package/dist/index.es145.js +1 -1
  52. package/dist/index.es146.js +1 -1
  53. package/dist/index.es147.js +1 -1
  54. package/dist/index.es148.js +1 -1
  55. package/dist/index.es149.js +1 -1
  56. package/dist/index.es150.js +1 -1
  57. package/dist/index.es151.js +1 -1
  58. package/dist/index.es152.js +1 -1
  59. package/dist/index.es153.js +1 -1
  60. package/dist/index.es154.js +1 -1
  61. package/dist/index.es155.js +1 -1
  62. package/dist/index.es156.js +1 -1
  63. package/dist/index.es157.js +1 -1
  64. package/dist/index.es158.js +1 -1
  65. package/dist/index.es159.js +1 -1
  66. package/dist/index.es16.js +10 -5
  67. package/dist/index.es16.js.map +1 -1
  68. package/dist/index.es160.js +1 -1
  69. package/dist/index.es161.js +1 -1
  70. package/dist/index.es162.js +1 -1
  71. package/dist/index.es163.js +1 -1
  72. package/dist/index.es164.js +1 -1
  73. package/dist/index.es165.js +1 -1
  74. package/dist/index.es166.js +1 -1
  75. package/dist/index.es167.js +1 -1
  76. package/dist/index.es168.js +1 -1
  77. package/dist/index.es169.js +1 -1
  78. package/dist/index.es170.js +1 -1
  79. package/dist/index.es171.js +1 -1
  80. package/dist/index.es172.js +1 -1
  81. package/dist/index.es173.js +1 -1
  82. package/dist/index.es174.js +1 -1
  83. package/dist/index.es175.js +1 -1
  84. package/dist/index.es176.js +1 -1
  85. package/dist/index.es177.js +1 -1
  86. package/dist/index.es178.js +1 -1
  87. package/dist/index.es179.js +1 -1
  88. package/dist/index.es18.js +7 -7
  89. package/dist/index.es180.js +1 -1
  90. package/dist/index.es181.js +1 -1
  91. package/dist/index.es182.js +1 -1
  92. package/dist/index.es183.js +1 -1
  93. package/dist/index.es184.js +1 -1
  94. package/dist/index.es185.js +1 -1
  95. package/dist/index.es186.js +1 -1
  96. package/dist/index.es187.js +1 -1
  97. package/dist/index.es191.js +2 -56
  98. package/dist/index.es191.js.map +1 -1
  99. package/dist/index.es192.js +2 -100
  100. package/dist/index.es192.js.map +1 -1
  101. package/dist/index.es193.js +2 -191
  102. package/dist/index.es193.js.map +1 -1
  103. package/dist/index.es194.js +2 -110
  104. package/dist/index.es194.js.map +1 -1
  105. package/dist/index.es195.js +2 -35
  106. package/dist/index.es195.js.map +1 -1
  107. package/dist/index.es196.js +2 -10
  108. package/dist/index.es196.js.map +1 -1
  109. package/dist/index.es197.js +2 -11
  110. package/dist/index.es197.js.map +1 -1
  111. package/dist/index.es198.js +2 -12
  112. package/dist/index.es198.js.map +1 -1
  113. package/dist/index.es199.js +2 -91
  114. package/dist/index.es199.js.map +1 -1
  115. package/dist/index.es2.js +96 -11
  116. package/dist/index.es2.js.map +1 -1
  117. package/dist/index.es20.js +2 -2
  118. package/dist/index.es200.js +2 -275
  119. package/dist/index.es200.js.map +1 -1
  120. package/dist/index.es201.js +2 -2
  121. package/dist/index.es202.js +2 -164
  122. package/dist/index.es202.js.map +1 -1
  123. package/dist/index.es203.js +2 -51
  124. package/dist/index.es203.js.map +1 -1
  125. package/dist/index.es204.js +2 -40
  126. package/dist/index.es204.js.map +1 -1
  127. package/dist/index.es205.js +2 -35
  128. package/dist/index.es205.js.map +1 -1
  129. package/dist/index.es206.js +2 -40
  130. package/dist/index.es206.js.map +1 -1
  131. package/dist/index.es207.js +2 -24
  132. package/dist/index.es207.js.map +1 -1
  133. package/dist/index.es208.js +2 -591
  134. package/dist/index.es208.js.map +1 -1
  135. package/dist/index.es209.js +2 -125
  136. package/dist/index.es209.js.map +1 -1
  137. package/dist/index.es210.js +2 -164
  138. package/dist/index.es210.js.map +1 -1
  139. package/dist/index.es211.js +2 -2
  140. package/dist/index.es212.js +2 -2
  141. package/dist/index.es213.js +2 -2
  142. package/dist/index.es214.js +2 -2
  143. package/dist/index.es215.js +2 -2
  144. package/dist/index.es216.js +2 -2
  145. package/dist/index.es217.js +2 -2
  146. package/dist/index.es218.js +2 -2
  147. package/dist/index.es219.js +2 -2
  148. package/dist/index.es22.js +35 -119
  149. package/dist/index.es22.js.map +1 -1
  150. package/dist/index.es220.js +2 -2
  151. package/dist/index.es221.js +2 -2
  152. package/dist/index.es222.js +2 -2
  153. package/dist/index.es223.js +2 -2
  154. package/dist/index.es224.js +2 -2
  155. package/dist/index.es225.js +2 -2
  156. package/dist/index.es226.js +2 -2
  157. package/dist/index.es227.js +2 -2
  158. package/dist/index.es228.js +2 -2
  159. package/dist/index.es229.js +2 -2
  160. package/dist/index.es23.js +66 -36
  161. package/dist/index.es23.js.map +1 -1
  162. package/dist/index.es230.js +2 -2
  163. package/dist/index.es231.js +2 -2
  164. package/dist/index.es232.js +2 -2
  165. package/dist/index.es233.js +2 -2
  166. package/dist/index.es234.js +2 -2
  167. package/dist/index.es235.js +2 -2
  168. package/dist/index.es236.js +56 -2
  169. package/dist/index.es236.js.map +1 -1
  170. package/dist/index.es237.js +100 -2
  171. package/dist/index.es237.js.map +1 -1
  172. package/dist/index.es238.js +191 -2
  173. package/dist/index.es238.js.map +1 -1
  174. package/dist/index.es239.js +110 -2
  175. package/dist/index.es239.js.map +1 -1
  176. package/dist/index.es24.js +30 -64
  177. package/dist/index.es24.js.map +1 -1
  178. package/dist/index.es240.js +35 -2
  179. package/dist/index.es240.js.map +1 -1
  180. package/dist/index.es241.js +10 -2
  181. package/dist/index.es241.js.map +1 -1
  182. package/dist/index.es242.js +11 -2
  183. package/dist/index.es242.js.map +1 -1
  184. package/dist/index.es243.js +12 -2
  185. package/dist/index.es243.js.map +1 -1
  186. package/dist/index.es244.js +91 -2
  187. package/dist/index.es244.js.map +1 -1
  188. package/dist/index.es245.js +275 -2
  189. package/dist/index.es245.js.map +1 -1
  190. package/dist/index.es246.js +2 -2
  191. package/dist/index.es247.js +164 -2
  192. package/dist/index.es247.js.map +1 -1
  193. package/dist/index.es248.js +51 -2
  194. package/dist/index.es248.js.map +1 -1
  195. package/dist/index.es249.js +40 -2
  196. package/dist/index.es249.js.map +1 -1
  197. package/dist/index.es25.js +120 -29
  198. package/dist/index.es25.js.map +1 -1
  199. package/dist/index.es250.js +35 -2
  200. package/dist/index.es250.js.map +1 -1
  201. package/dist/index.es251.js +40 -2
  202. package/dist/index.es251.js.map +1 -1
  203. package/dist/index.es252.js +24 -2
  204. package/dist/index.es252.js.map +1 -1
  205. package/dist/index.es253.js +591 -2
  206. package/dist/index.es253.js.map +1 -1
  207. package/dist/index.es254.js +125 -2
  208. package/dist/index.es254.js.map +1 -1
  209. package/dist/index.es255.js +164 -2
  210. package/dist/index.es255.js.map +1 -1
  211. package/dist/index.es256.js +2 -2
  212. package/dist/index.es26.js +102 -123
  213. package/dist/index.es26.js.map +1 -1
  214. package/dist/index.es267.js +1 -1
  215. package/dist/index.es27.js +66 -101
  216. package/dist/index.es27.js.map +1 -1
  217. package/dist/index.es28.js +139 -66
  218. package/dist/index.es28.js.map +1 -1
  219. package/dist/index.es29.js +295 -131
  220. package/dist/index.es29.js.map +1 -1
  221. package/dist/index.es30.js +114 -298
  222. package/dist/index.es30.js.map +1 -1
  223. package/dist/index.es305.js +1 -1
  224. package/dist/index.es307.js +1 -1
  225. package/dist/index.es319.js +1 -1
  226. package/dist/index.es32.js +7 -7
  227. package/dist/index.es33.js +1 -1
  228. package/dist/index.es339.js +2 -2
  229. package/dist/index.es36.js +4 -4
  230. package/dist/index.es37.js +289 -114
  231. package/dist/index.es37.js.map +1 -1
  232. package/dist/index.es38.js +44 -70
  233. package/dist/index.es38.js.map +1 -1
  234. package/dist/index.es39.js +145 -19
  235. package/dist/index.es39.js.map +1 -1
  236. package/dist/index.es40.js +5 -261
  237. package/dist/index.es40.js.map +1 -1
  238. package/dist/index.es41.js +247 -38
  239. package/dist/index.es41.js.map +1 -1
  240. package/dist/index.es42.js +110 -207
  241. package/dist/index.es42.js.map +1 -1
  242. package/dist/index.es43.js +68 -64
  243. package/dist/index.es43.js.map +1 -1
  244. package/dist/index.es44.js +17 -141
  245. package/dist/index.es44.js.map +1 -1
  246. package/dist/index.es45.js +251 -14
  247. package/dist/index.es45.js.map +1 -1
  248. package/dist/index.es46.js +36 -223
  249. package/dist/index.es46.js.map +1 -1
  250. package/dist/index.es47.js +213 -7
  251. package/dist/index.es47.js.map +1 -1
  252. package/dist/index.es48.js +55 -1180
  253. package/dist/index.es48.js.map +1 -1
  254. package/dist/index.es49.js +141 -6
  255. package/dist/index.es49.js.map +1 -1
  256. package/dist/index.es50.js +21 -144
  257. package/dist/index.es50.js.map +1 -1
  258. package/dist/index.es51.js +230 -5
  259. package/dist/index.es51.js.map +1 -1
  260. package/dist/index.es52.js +8 -292
  261. package/dist/index.es52.js.map +1 -1
  262. package/dist/index.es53.js +1190 -43
  263. package/dist/index.es53.js.map +1 -1
  264. package/dist/index.es54.js +7 -144
  265. package/dist/index.es54.js.map +1 -1
  266. package/dist/index.es55.js +136 -241
  267. package/dist/index.es55.js.map +1 -1
  268. package/dist/index.es59.js +1 -1
  269. package/dist/index.es6.js +21 -8
  270. package/dist/index.es6.js.map +1 -1
  271. package/dist/index.es60.js +1 -1
  272. package/dist/index.es61.js +1 -1
  273. package/dist/index.es62.js +7 -7
  274. package/dist/index.es67.js +3 -3
  275. package/dist/index.es69.js +2 -2
  276. package/dist/index.es70.js +1 -1
  277. package/dist/index.es71.js +1 -1
  278. package/dist/index.es72.js +1 -1
  279. package/dist/index.es77.js +7 -7
  280. package/dist/index.es78.js +17 -17
  281. package/dist/index.es82.js +1 -1
  282. package/dist/index.es83.js +4 -4
  283. package/dist/index.es84.js +20 -11
  284. package/dist/index.es84.js.map +1 -1
  285. package/dist/index.es85.js +66 -38
  286. package/dist/index.es85.js.map +1 -1
  287. package/dist/index.es86.js +3 -34
  288. package/dist/index.es86.js.map +1 -1
  289. package/dist/index.es87.js +10 -230
  290. package/dist/index.es87.js.map +1 -1
  291. package/dist/index.es88.js +39 -29
  292. package/dist/index.es88.js.map +1 -1
  293. package/dist/index.es89.js +32 -73
  294. package/dist/index.es89.js.map +1 -1
  295. package/dist/index.es90.js +200 -44
  296. package/dist/index.es90.js.map +1 -1
  297. package/dist/index.es91.js +15 -37
  298. package/dist/index.es91.js.map +1 -1
  299. package/dist/index.es92.js +71 -26
  300. package/dist/index.es92.js.map +1 -1
  301. package/dist/index.es93.js +72 -39
  302. package/dist/index.es93.js.map +1 -1
  303. package/dist/index.es94.js +48 -53
  304. package/dist/index.es94.js.map +1 -1
  305. package/dist/index.es95.js +30 -13
  306. package/dist/index.es95.js.map +1 -1
  307. package/dist/index.es96.js +40 -134
  308. package/dist/index.es96.js.map +1 -1
  309. package/dist/index.es97.js +56 -20
  310. package/dist/index.es97.js.map +1 -1
  311. package/dist/index.es98.js +11 -180
  312. package/dist/index.es98.js.map +1 -1
  313. package/dist/index.es99.js +129 -233
  314. package/dist/index.es99.js.map +1 -1
  315. package/dist/styles.css +1 -1
  316. package/package.json +1 -1
@@ -1,145 +1,309 @@
1
- import { useState, useRef, useCallback } from "react";
2
- import { webmFixDuration } from "./index.es55.js";
3
- import { useChatRuntime } from "./index.es5.js";
4
- function getMimeType() {
5
- const types = [
6
- "audio/webm",
7
- "audio/mp4",
8
- "audio/ogg",
9
- "audio/wav",
10
- "audio/aac"
11
- ];
12
- for (let i = 0; i < types.length; i++) {
13
- if (MediaRecorder.isTypeSupported(types[i])) {
14
- return types[i];
1
+ import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import { Slot } from "@radix-ui/react-slot";
4
+ import { cva } from "class-variance-authority";
5
+ import { cn } from "./index.es40.js";
6
+ const buttonVariants = cva(
7
+ "inline-flex items-center cursor-pointer justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
8
+ {
9
+ variants: {
10
+ variant: {
11
+ default: "bg-primary text-primary-foreground hover:bg-primary/90",
12
+ destructive: "bg-destructive text-primary-foreground hover:bg-destructive/90",
13
+ cool: "dark:inset-shadow-2xs dark:inset-shadow-white/10 bg-linear-to-t border border-b-2 border-zinc-950/40 from-primary to-primary/85 shadow-md shadow-primary/20 ring-1 ring-inset ring-white/25 transition-[filter] duration-200 hover:brightness-110 active:brightness-90 dark:border-x-0 text-primary-foreground dark:text-primary-foreground dark:border-t-0 dark:border-primary/50 dark:ring-white/5",
14
+ outline: "border border-input bg-background hover:bg-accent hover:text-accent-foreground",
15
+ secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
16
+ ghost: "hover:bg-accent hover:text-accent-foreground",
17
+ link: "text-primary underline-offset-4 hover:underline"
18
+ },
19
+ size: {
20
+ default: "h-9 px-4 py-2",
21
+ sm: "h-8 rounded-md px-3 text-xs",
22
+ lg: "h-10 rounded-md px-8",
23
+ icon: "h-9 w-9"
24
+ }
25
+ },
26
+ defaultVariants: {
27
+ variant: "default",
28
+ size: "default"
15
29
  }
16
30
  }
17
- return void 0;
18
- }
19
- function useAudioRecorder() {
20
- const { identity } = useChatRuntime();
21
- const [isRecording, setIsRecording] = useState(false);
22
- const [recordingTime, setRecordingTime] = useState(0);
23
- const [isTranscribing, setIsTranscribing] = useState(false);
24
- const streamRef = useRef(null);
25
- const mediaRecorderRef = useRef(null);
26
- const chunksRef = useRef([]);
27
- const timerRef = useRef(null);
28
- const startTimeRef = useRef(0);
29
- const startRecording = useCallback(async () => {
30
- try {
31
- if (!streamRef.current) {
32
- streamRef.current = await navigator.mediaDevices.getUserMedia({
33
- audio: true
34
- });
31
+ );
32
+ const Button = React.forwardRef(
33
+ ({ className, variant, size, asChild = false, ...props }, ref) => {
34
+ const Comp = asChild ? Slot : "button";
35
+ return /* @__PURE__ */ jsx(
36
+ Comp,
37
+ {
38
+ className: cn(buttonVariants({ variant, size, className })),
39
+ ref,
40
+ ...props
41
+ }
42
+ );
43
+ }
44
+ );
45
+ Button.displayName = "Button";
46
+ const liquidbuttonVariants = cva(
47
+ "inline-flex items-center transition-colors justify-center cursor-pointer gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-[color,box-shadow] disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
48
+ {
49
+ variants: {
50
+ variant: {
51
+ default: "bg-transparent hover:scale-105 duration-300 transition text-primary",
52
+ destructive: "bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40",
53
+ outline: "border border-input bg-background hover:bg-accent hover:text-accent-foreground",
54
+ secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
55
+ ghost: "hover:bg-accent hover:text-accent-foreground",
56
+ link: "text-primary underline-offset-4 hover:underline"
57
+ },
58
+ size: {
59
+ default: "h-9 px-4 py-2 has-[>svg]:px-3",
60
+ sm: "h-8 text-xs gap-1.5 px-4 has-[>svg]:px-4",
61
+ lg: "h-10 rounded-md px-6 has-[>svg]:px-4",
62
+ xl: "h-12 rounded-md px-8 has-[>svg]:px-6",
63
+ xxl: "h-14 rounded-md px-10 has-[>svg]:px-8",
64
+ icon: "size-9"
35
65
  }
36
- const mimeType = getMimeType();
37
- const mediaRecorder = new MediaRecorder(streamRef.current, {
38
- mimeType
39
- });
40
- mediaRecorderRef.current = mediaRecorder;
41
- chunksRef.current = [];
42
- startTimeRef.current = Date.now();
43
- mediaRecorder.addEventListener("dataavailable", (event) => {
44
- if (event.data.size > 0) {
45
- chunksRef.current.push(event.data);
46
- }
47
- });
48
- mediaRecorder.start();
49
- setIsRecording(true);
50
- timerRef.current = window.setInterval(() => {
51
- setRecordingTime(Math.floor((Date.now() - startTimeRef.current) / 1e3));
52
- }, 1e3);
53
- } catch (error) {
54
- console.error("Error accessing microphone:", error);
55
- alert("Unable to access microphone. Please check your permissions.");
66
+ },
67
+ defaultVariants: {
68
+ variant: "default",
69
+ size: "xxl"
56
70
  }
57
- }, []);
58
- const stopRecording = useCallback(() => {
59
- return new Promise((resolve) => {
60
- if (mediaRecorderRef.current && mediaRecorderRef.current.state === "recording") {
61
- const mimeType = mediaRecorderRef.current.mimeType;
62
- const duration = Date.now() - startTimeRef.current;
63
- mediaRecorderRef.current.addEventListener("stop", async () => {
64
- let blob = new Blob(chunksRef.current, { type: mimeType });
65
- if (mimeType === "audio/webm") {
66
- blob = await webmFixDuration(blob, duration, blob.type);
71
+ }
72
+ );
73
+ function LiquidButton({
74
+ className,
75
+ variant,
76
+ size,
77
+ asChild = false,
78
+ children,
79
+ ...props
80
+ }) {
81
+ const Comp = asChild ? Slot : "button";
82
+ return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsxs(
83
+ Comp,
84
+ {
85
+ "data-slot": "button",
86
+ className: cn(
87
+ "relative",
88
+ liquidbuttonVariants({ variant, size, className })
89
+ ),
90
+ ...props,
91
+ children: [
92
+ /* @__PURE__ */ jsx("div", { className: "absolute top-0 left-0 z-0 h-full w-full rounded-full \n shadow-[0_0_6px_rgba(0,0,0,0.03),0_2px_6px_rgba(0,0,0,0.08),inset_3px_3px_0.5px_-3px_rgba(0,0,0,0.9),inset_-3px_-3px_0.5px_-3px_rgba(0,0,0,0.85),inset_1px_1px_1px_-0.5px_rgba(0,0,0,0.6),inset_-1px_-1px_1px_-0.5px_rgba(0,0,0,0.6),inset_0_0_6px_6px_rgba(0,0,0,0.12),inset_0_0_2px_2px_rgba(0,0,0,0.06),0_0_12px_rgba(255,255,255,0.15)] \n transition-all \n dark:shadow-[0_0_8px_rgba(0,0,0,0.03),0_2px_6px_rgba(0,0,0,0.08),inset_3px_3px_0.5px_-3.5px_rgba(255,255,255,0.09),inset_-3px_-3px_0.5px_-3.5px_rgba(255,255,255,0.85),inset_1px_1px_1px_-0.5px_rgba(255,255,255,0.6),inset_-1px_-1px_1px_-0.5px_rgba(255,255,255,0.6),inset_0_0_6px_6px_rgba(255,255,255,0.12),inset_0_0_2px_2px_rgba(255,255,255,0.06),0_0_12px_rgba(0,0,0,0.15)]" }),
93
+ /* @__PURE__ */ jsx(
94
+ "div",
95
+ {
96
+ className: "absolute top-0 left-0 w-full h-full overflow-hidden rounded-md isolate -z-10",
97
+ style: { backdropFilter: 'url("#container-glass")' }
67
98
  }
68
- resolve(blob);
69
- });
70
- mediaRecorderRef.current.stop();
71
- setIsRecording(false);
72
- setRecordingTime(0);
73
- if (timerRef.current) {
74
- window.clearInterval(timerRef.current);
75
- timerRef.current = null;
76
- }
77
- if (streamRef.current) {
78
- streamRef.current.getTracks().forEach((track) => track.stop());
79
- streamRef.current = null;
80
- }
81
- } else {
82
- resolve(null);
83
- }
84
- });
85
- }, []);
86
- const transcribeAudio = useCallback(async (audioBlob) => {
87
- setIsTranscribing(true);
88
- try {
89
- const apiUrl = identity?.textToSpeechVoice?.apiUrl || "";
90
- const apiKey = identity?.textToSpeechVoice?.apiKey;
91
- const formData = new FormData();
92
- formData.append("file", audioBlob, "audio.webm");
93
- formData.append("model", identity?.textToSpeechVoice?.model || "Systran/faster-whisper-large-v3");
94
- formData.append("response_format", "json");
95
- const headers = {};
96
- if (apiKey) {
97
- headers["Authorization"] = `Bearer ${apiKey}`;
98
- }
99
- const response = await fetch(apiUrl, {
100
- method: "POST",
101
- headers,
102
- body: formData
103
- });
104
- if (!response.ok) {
105
- throw new Error(`Transcription failed: ${response.statusText}`);
106
- }
107
- const data = await response.json();
108
- return data.text || "";
109
- } catch (error) {
110
- console.error("Transcription error:", error);
111
- throw error;
112
- } finally {
113
- setIsTranscribing(false);
99
+ ),
100
+ /* @__PURE__ */ jsx("div", { className: "z-10 pointer-events-none ", children }),
101
+ /* @__PURE__ */ jsx(GlassFilter, {})
102
+ ]
114
103
  }
115
- }, [identity]);
116
- const cancelRecording = useCallback(() => {
117
- if (mediaRecorderRef.current) {
118
- mediaRecorderRef.current.stop();
104
+ ) });
105
+ }
106
+ function GlassFilter() {
107
+ return /* @__PURE__ */ jsx("svg", { className: "hidden", children: /* @__PURE__ */ jsx("defs", { children: /* @__PURE__ */ jsxs(
108
+ "filter",
109
+ {
110
+ id: "container-glass",
111
+ x: "0%",
112
+ y: "0%",
113
+ width: "100%",
114
+ height: "100%",
115
+ colorInterpolationFilters: "sRGB",
116
+ children: [
117
+ /* @__PURE__ */ jsx(
118
+ "feTurbulence",
119
+ {
120
+ type: "fractalNoise",
121
+ baseFrequency: "0.05 0.05",
122
+ numOctaves: "1",
123
+ seed: "1",
124
+ result: "turbulence"
125
+ }
126
+ ),
127
+ /* @__PURE__ */ jsx("feGaussianBlur", { in: "turbulence", stdDeviation: "2", result: "blurredNoise" }),
128
+ /* @__PURE__ */ jsx(
129
+ "feDisplacementMap",
130
+ {
131
+ in: "SourceGraphic",
132
+ in2: "blurredNoise",
133
+ scale: "70",
134
+ xChannelSelector: "R",
135
+ yChannelSelector: "B",
136
+ result: "displaced"
137
+ }
138
+ ),
139
+ /* @__PURE__ */ jsx("feGaussianBlur", { in: "displaced", stdDeviation: "4", result: "finalBlur" }),
140
+ /* @__PURE__ */ jsx("feComposite", { in: "finalBlur", in2: "finalBlur", operator: "over" })
141
+ ]
119
142
  }
120
- if (streamRef.current) {
121
- streamRef.current.getTracks().forEach((track) => track.stop());
122
- streamRef.current = null;
143
+ ) }) });
144
+ }
145
+ const colorVariants = {
146
+ default: {
147
+ outer: "bg-gradient-to-b from-[#000] to-[#A0A0A0]",
148
+ inner: "bg-gradient-to-b from-[#FAFAFA] via-[#3E3E3E] to-[#E5E5E5]",
149
+ button: "bg-gradient-to-b from-[#B9B9B9] to-[#969696]",
150
+ textColor: "text-white",
151
+ textShadow: "[text-shadow:0-1px_0_rgb(80_80_80_/_100%)]"
152
+ },
153
+ primary: {
154
+ outer: "bg-gradient-to-b from-[#000] to-[#A0A0A0]",
155
+ inner: "bg-gradient-to-b from-primary via-secondary to-muted",
156
+ button: "bg-gradient-to-b from-primary to-primary/40",
157
+ textColor: "text-white",
158
+ textShadow: "[text-shadow:0-1px_0_rgb(30_58_138_/_100%)]"
159
+ },
160
+ success: {
161
+ outer: "bg-gradient-to-b from-[#005A43] to-[#7CCB9B]",
162
+ inner: "bg-gradient-to-b from-[#E5F8F0] via-[#00352F] to-[#D1F0E6]",
163
+ button: "bg-gradient-to-b from-[#9ADBC8] to-[#3E8F7C]",
164
+ textColor: "text-[#FFF7F0]",
165
+ textShadow: "[text-shadow:0-1px_0_rgb(6_78_59_/_100%)]"
166
+ },
167
+ error: {
168
+ outer: "bg-gradient-to-b from-[#5A0000] to-[#FFAEB0]",
169
+ inner: "bg-gradient-to-b from-[#FFDEDE] via-[#680002] to-[#FFE9E9]",
170
+ button: "bg-gradient-to-b from-[#F08D8F] to-[#A45253]",
171
+ textColor: "text-[#FFF7F0]",
172
+ textShadow: "[text-shadow:0-1px_0_rgb(146_64_14_/_100%)]"
173
+ },
174
+ gold: {
175
+ outer: "bg-gradient-to-b from-[#917100] to-[#EAD98F]",
176
+ inner: "bg-gradient-to-b from-[#FFFDDD] via-[#856807] to-[#FFF1B3]",
177
+ button: "bg-gradient-to-b from-[#FFEBA1] to-[#9B873F]",
178
+ textColor: "text-[#FFFDE5]",
179
+ textShadow: "[text-shadow:0-1px_0_rgb(178_140_2_/_100%)]"
180
+ },
181
+ bronze: {
182
+ outer: "bg-gradient-to-b from-[#864813] to-[#E9B486]",
183
+ inner: "bg-gradient-to-b from-[#EDC5A1] via-[#5F2D01] to-[#FFDEC1]",
184
+ button: "bg-gradient-to-b from-[#FFE3C9] to-[#A36F3D]",
185
+ textColor: "text-[#FFF7F0]",
186
+ textShadow: "[text-shadow:0-1px_0_rgb(124_45_18_/_100%)]"
187
+ }
188
+ };
189
+ const metalButtonVariants = (variant = "default", isPressed, isHovered, isTouchDevice) => {
190
+ const colors = colorVariants[variant];
191
+ const transitionStyle = "all 250ms cubic-bezier(0.1, 0.4, 0.2, 1)";
192
+ return {
193
+ wrapper: cn(
194
+ "relative inline-flex transform-gpu rounded-md p-[1.25px] will-change-transform",
195
+ colors.outer
196
+ ),
197
+ wrapperStyle: {
198
+ transform: isPressed ? "translateY(2.5px) scale(0.99)" : "translateY(0) scale(1)",
199
+ boxShadow: isPressed ? "0 1px 2px rgba(0, 0, 0, 0.15)" : isHovered && !isTouchDevice ? "0 4px 12px rgba(0, 0, 0, 0.12)" : "0 3px 8px rgba(0, 0, 0, 0.08)",
200
+ transition: transitionStyle,
201
+ transformOrigin: "center center"
202
+ },
203
+ inner: cn(
204
+ "absolute inset-[1px] transform-gpu rounded-lg will-change-transform",
205
+ colors.inner
206
+ ),
207
+ innerStyle: {
208
+ transition: transitionStyle,
209
+ transformOrigin: "center center",
210
+ filter: isHovered && !isPressed && !isTouchDevice ? "brightness(1.05)" : "none"
211
+ },
212
+ button: cn(
213
+ "relative z-10 m-[1px] rounded-md inline-flex h-11 transform-gpu cursor-pointer items-center justify-center overflow-hidden rounded-md px-6 py-2 text-sm leading-none font-semibold will-change-transform outline-none",
214
+ colors.button,
215
+ colors.textColor,
216
+ colors.textShadow
217
+ ),
218
+ buttonStyle: {
219
+ transform: isPressed ? "scale(0.97)" : "scale(1)",
220
+ transition: transitionStyle,
221
+ transformOrigin: "center center",
222
+ filter: isHovered && !isPressed && !isTouchDevice ? "brightness(1.02)" : "none"
123
223
  }
124
- if (timerRef.current) {
125
- window.clearInterval(timerRef.current);
126
- timerRef.current = null;
224
+ };
225
+ };
226
+ const ShineEffect = ({ isPressed }) => {
227
+ return /* @__PURE__ */ jsx(
228
+ "div",
229
+ {
230
+ className: cn(
231
+ "pointer-events-none absolute inset-0 z-20 overflow-hidden transition-opacity duration-300",
232
+ isPressed ? "opacity-20" : "opacity-0"
233
+ ),
234
+ children: /* @__PURE__ */ jsx("div", { className: "absolute inset-0 rounded-md bg-gradient-to-r from-transparent via-neutral-100 to-transparent" })
127
235
  }
128
- chunksRef.current = [];
129
- setIsRecording(false);
130
- setRecordingTime(0);
236
+ );
237
+ };
238
+ const MetalButton = React.forwardRef(({ children, className, variant = "default", ...props }, ref) => {
239
+ const [isPressed, setIsPressed] = React.useState(false);
240
+ const [isHovered, setIsHovered] = React.useState(false);
241
+ const [isTouchDevice, setIsTouchDevice] = React.useState(false);
242
+ React.useEffect(() => {
243
+ setIsTouchDevice("ontouchstart" in window || navigator.maxTouchPoints > 0);
131
244
  }, []);
132
- return {
133
- isRecording,
134
- recordingTime,
135
- isTranscribing,
136
- startRecording,
137
- stopRecording,
138
- transcribeAudio,
139
- cancelRecording
245
+ const buttonText = children || "Button";
246
+ const variants = metalButtonVariants(
247
+ variant,
248
+ isPressed,
249
+ isHovered,
250
+ isTouchDevice
251
+ );
252
+ const handleInternalMouseDown = () => {
253
+ setIsPressed(true);
140
254
  };
141
- }
255
+ const handleInternalMouseUp = () => {
256
+ setIsPressed(false);
257
+ };
258
+ const handleInternalMouseLeave = () => {
259
+ setIsPressed(false);
260
+ setIsHovered(false);
261
+ };
262
+ const handleInternalMouseEnter = () => {
263
+ if (!isTouchDevice) {
264
+ setIsHovered(true);
265
+ }
266
+ };
267
+ const handleInternalTouchStart = () => {
268
+ setIsPressed(true);
269
+ };
270
+ const handleInternalTouchEnd = () => {
271
+ setIsPressed(false);
272
+ };
273
+ const handleInternalTouchCancel = () => {
274
+ setIsPressed(false);
275
+ };
276
+ return /* @__PURE__ */ jsxs("div", { className: variants.wrapper, style: variants.wrapperStyle, children: [
277
+ /* @__PURE__ */ jsx("div", { className: variants.inner, style: variants.innerStyle }),
278
+ /* @__PURE__ */ jsxs(
279
+ "button",
280
+ {
281
+ ref,
282
+ className: cn(variants.button, className),
283
+ style: variants.buttonStyle,
284
+ ...props,
285
+ onMouseDown: handleInternalMouseDown,
286
+ onMouseUp: handleInternalMouseUp,
287
+ onMouseLeave: handleInternalMouseLeave,
288
+ onMouseEnter: handleInternalMouseEnter,
289
+ onTouchStart: handleInternalTouchStart,
290
+ onTouchEnd: handleInternalTouchEnd,
291
+ onTouchCancel: handleInternalTouchCancel,
292
+ children: [
293
+ /* @__PURE__ */ jsx(ShineEffect, { isPressed }),
294
+ buttonText,
295
+ isHovered && !isPressed && !isTouchDevice && /* @__PURE__ */ jsx("div", { className: "absolute inset-0 rounded-lg pointer-events-none bg-gradient-to-t from-transparent to-white/5" })
296
+ ]
297
+ }
298
+ )
299
+ ] });
300
+ });
301
+ MetalButton.displayName = "MetalButton";
142
302
  export {
143
- useAudioRecorder
303
+ Button,
304
+ LiquidButton,
305
+ MetalButton,
306
+ buttonVariants,
307
+ liquidbuttonVariants
144
308
  };
145
309
  //# sourceMappingURL=index.es29.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.es29.js","sources":["../src/hooks/useAudioRecorder.ts"],"sourcesContent":["import { useState, useRef, useCallback } from \"react\";\nimport { webmFixDuration } from \"../utils/BlobFix\";\nimport { useChatRuntime } from \"@/providers/ChatRuntime\";\n\nfunction getMimeType() {\n const types = [\n \"audio/webm\",\n \"audio/mp4\",\n \"audio/ogg\",\n \"audio/wav\",\n \"audio/aac\",\n ];\n for (let i = 0; i < types.length; i++) {\n if (MediaRecorder.isTypeSupported(types[i])) {\n return types[i];\n }\n }\n return undefined;\n}\n\nexport function useAudioRecorder() {\n const { identity } = useChatRuntime();\n const [isRecording, setIsRecording] = useState(false);\n const [recordingTime, setRecordingTime] = useState(0);\n const [isTranscribing, setIsTranscribing] = useState(false);\n \n const streamRef = useRef<MediaStream | null>(null);\n const mediaRecorderRef = useRef<MediaRecorder | null>(null);\n const chunksRef = useRef<Blob[]>([]);\n const timerRef = useRef<number | null>(null);\n const startTimeRef = useRef<number>(0);\n\n const startRecording = useCallback(async () => {\n try {\n if (!streamRef.current) {\n streamRef.current = await navigator.mediaDevices.getUserMedia({\n audio: true,\n });\n }\n\n const mimeType = getMimeType();\n const mediaRecorder = new MediaRecorder(streamRef.current, {\n mimeType,\n });\n\n mediaRecorderRef.current = mediaRecorder;\n chunksRef.current = [];\n startTimeRef.current = Date.now();\n\n mediaRecorder.addEventListener(\"dataavailable\", (event) => {\n if (event.data.size > 0) {\n chunksRef.current.push(event.data);\n }\n });\n\n mediaRecorder.start();\n setIsRecording(true);\n\n // Start timer\n timerRef.current = window.setInterval(() => {\n setRecordingTime(Math.floor((Date.now() - startTimeRef.current) / 1000));\n }, 1000);\n } catch (error) {\n console.error(\"Error accessing microphone:\", error);\n alert(\"Unable to access microphone. Please check your permissions.\");\n }\n }, []);\n\n const stopRecording = useCallback((): Promise<Blob | null> => {\n return new Promise((resolve) => {\n if (\n mediaRecorderRef.current &&\n mediaRecorderRef.current.state === \"recording\"\n ) {\n const mimeType = mediaRecorderRef.current.mimeType;\n const duration = Date.now() - startTimeRef.current;\n\n mediaRecorderRef.current.addEventListener(\"stop\", async () => {\n let blob = new Blob(chunksRef.current, { type: mimeType });\n\n if (mimeType === \"audio/webm\") {\n blob = await webmFixDuration(blob, duration, blob.type);\n }\n\n resolve(blob);\n });\n\n mediaRecorderRef.current.stop();\n setIsRecording(false);\n setRecordingTime(0);\n\n if (timerRef.current) {\n window.clearInterval(timerRef.current);\n timerRef.current = null;\n }\n\n // Stop all tracks\n if (streamRef.current) {\n streamRef.current.getTracks().forEach((track) => track.stop());\n streamRef.current = null;\n }\n } else {\n resolve(null);\n }\n });\n }, []);\n\n const transcribeAudio = useCallback(async (audioBlob: Blob): Promise<string> => {\n setIsTranscribing(true);\n try {\n const apiUrl = identity?.textToSpeechVoice?.apiUrl || \"\";\n const apiKey = identity?.textToSpeechVoice?.apiKey;\n\n const formData = new FormData();\n formData.append(\"file\", audioBlob, \"audio.webm\");\n formData.append(\"model\", identity?.textToSpeechVoice?.model || \"Systran/faster-whisper-large-v3\");\n formData.append(\"response_format\", \"json\");\n\n const headers: HeadersInit = {};\n if (apiKey) {\n headers[\"Authorization\"] = `Bearer ${apiKey}`;\n }\n\n const response = await fetch(apiUrl, {\n method: \"POST\",\n headers,\n body: formData,\n });\n\n if (!response.ok) {\n throw new Error(`Transcription failed: ${response.statusText}`);\n }\n\n const data = await response.json();\n return data.text || \"\";\n } catch (error) {\n console.error(\"Transcription error:\", error);\n throw error;\n } finally {\n setIsTranscribing(false);\n }\n }, [identity]);\n\n const cancelRecording = useCallback(() => {\n if (mediaRecorderRef.current) {\n mediaRecorderRef.current.stop();\n }\n\n if (streamRef.current) {\n streamRef.current.getTracks().forEach((track) => track.stop());\n streamRef.current = null;\n }\n\n if (timerRef.current) {\n window.clearInterval(timerRef.current);\n timerRef.current = null;\n }\n\n chunksRef.current = [];\n setIsRecording(false);\n setRecordingTime(0);\n }, []);\n\n return {\n isRecording,\n recordingTime,\n isTranscribing,\n startRecording,\n stopRecording,\n transcribeAudio,\n cancelRecording,\n };\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.es29.js","sources":["../src/components/ui/button.tsx"],"sourcesContent":["import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/utils/tailwindUtil\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center cursor-pointer justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-primary-foreground hover:bg-destructive/90\",\n cool: \"dark:inset-shadow-2xs dark:inset-shadow-white/10 bg-linear-to-t border border-b-2 border-zinc-950/40 from-primary to-primary/85 shadow-md shadow-primary/20 ring-1 ring-inset ring-white/25 transition-[filter] duration-200 hover:brightness-110 active:brightness-90 dark:border-x-0 text-primary-foreground dark:text-primary-foreground dark:border-t-0 dark:border-primary/50 dark:ring-white/5\",\n outline:\n \"border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2\",\n sm: \"h-8 rounded-md px-3 text-xs\",\n lg: \"h-10 rounded-md px-8\",\n icon: \"h-9 w-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\"\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n )\n }\n)\nButton.displayName = \"Button\"\n\nconst liquidbuttonVariants = cva(\n \"inline-flex items-center transition-colors justify-center cursor-pointer gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-[color,box-shadow] disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n {\n variants: {\n variant: {\n default: \"bg-transparent hover:scale-105 duration-300 transition text-primary\",\n destructive:\n \"bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40\",\n outline:\n \"border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2 has-[>svg]:px-3\",\n sm: \"h-8 text-xs gap-1.5 px-4 has-[>svg]:px-4\",\n lg: \"h-10 rounded-md px-6 has-[>svg]:px-4\",\n xl: \"h-12 rounded-md px-8 has-[>svg]:px-6\",\n xxl: \"h-14 rounded-md px-10 has-[>svg]:px-8\",\n icon: \"size-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"xxl\",\n },\n }\n)\n\nfunction LiquidButton({\n className,\n variant,\n size,\n asChild = false,\n children,\n ...props\n}: React.ComponentProps<\"button\"> &\n VariantProps<typeof liquidbuttonVariants> & {\n asChild?: boolean\n }) {\n const Comp = asChild ? Slot : \"button\"\n\n return (\n <>\n <Comp\n data-slot=\"button\"\n className={cn(\n \"relative\",\n liquidbuttonVariants({ variant, size, className })\n )}\n {...props}\n >\n <div className=\"absolute top-0 left-0 z-0 h-full w-full rounded-full \n shadow-[0_0_6px_rgba(0,0,0,0.03),0_2px_6px_rgba(0,0,0,0.08),inset_3px_3px_0.5px_-3px_rgba(0,0,0,0.9),inset_-3px_-3px_0.5px_-3px_rgba(0,0,0,0.85),inset_1px_1px_1px_-0.5px_rgba(0,0,0,0.6),inset_-1px_-1px_1px_-0.5px_rgba(0,0,0,0.6),inset_0_0_6px_6px_rgba(0,0,0,0.12),inset_0_0_2px_2px_rgba(0,0,0,0.06),0_0_12px_rgba(255,255,255,0.15)] \n transition-all \n dark:shadow-[0_0_8px_rgba(0,0,0,0.03),0_2px_6px_rgba(0,0,0,0.08),inset_3px_3px_0.5px_-3.5px_rgba(255,255,255,0.09),inset_-3px_-3px_0.5px_-3.5px_rgba(255,255,255,0.85),inset_1px_1px_1px_-0.5px_rgba(255,255,255,0.6),inset_-1px_-1px_1px_-0.5px_rgba(255,255,255,0.6),inset_0_0_6px_6px_rgba(255,255,255,0.12),inset_0_0_2px_2px_rgba(255,255,255,0.06),0_0_12px_rgba(0,0,0,0.15)]\" />\n <div\n className=\"absolute top-0 left-0 w-full h-full overflow-hidden rounded-md isolate -z-10\"\n style={{ backdropFilter: 'url(\"#container-glass\")' }}\n />\n\n <div className=\"z-10 pointer-events-none \">\n {children}\n </div>\n <GlassFilter />\n </Comp>\n </>\n )\n}\n\n\nfunction GlassFilter() {\n return (\n <svg className=\"hidden\">\n <defs>\n <filter\n id=\"container-glass\"\n x=\"0%\"\n y=\"0%\"\n width=\"100%\"\n height=\"100%\"\n colorInterpolationFilters=\"sRGB\"\n >\n {/* Generate turbulent noise for distortion */}\n <feTurbulence\n type=\"fractalNoise\"\n baseFrequency=\"0.05 0.05\"\n numOctaves=\"1\"\n seed=\"1\"\n result=\"turbulence\"\n />\n\n {/* Blur the turbulence pattern slightly */}\n <feGaussianBlur in=\"turbulence\" stdDeviation=\"2\" result=\"blurredNoise\" />\n\n {/* Displace the source graphic with the noise */}\n <feDisplacementMap\n in=\"SourceGraphic\"\n in2=\"blurredNoise\"\n scale=\"70\"\n xChannelSelector=\"R\"\n yChannelSelector=\"B\"\n result=\"displaced\"\n />\n\n {/* Apply overall blur on the final result */}\n <feGaussianBlur in=\"displaced\" stdDeviation=\"4\" result=\"finalBlur\" />\n\n {/* Output the result */}\n <feComposite in=\"finalBlur\" in2=\"finalBlur\" operator=\"over\" />\n </filter>\n </defs>\n </svg>\n );\n}\n\ntype ColorVariant =\n | \"default\"\n | \"primary\"\n | \"success\"\n | \"error\"\n | \"gold\"\n | \"bronze\";\n \ninterface MetalButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: ColorVariant;\n}\n \nconst colorVariants: Record<\n ColorVariant,\n {\n outer: string;\n inner: string;\n button: string;\n textColor: string;\n textShadow: string;\n }\n> = {\n default: {\n outer: \"bg-gradient-to-b from-[#000] to-[#A0A0A0]\",\n inner: \"bg-gradient-to-b from-[#FAFAFA] via-[#3E3E3E] to-[#E5E5E5]\",\n button: \"bg-gradient-to-b from-[#B9B9B9] to-[#969696]\",\n textColor: \"text-white\",\n textShadow: \"[text-shadow:0-1px_0_rgb(80_80_80_/_100%)]\",\n },\n primary: {\n outer: \"bg-gradient-to-b from-[#000] to-[#A0A0A0]\",\n inner: \"bg-gradient-to-b from-primary via-secondary to-muted\",\n button: \"bg-gradient-to-b from-primary to-primary/40\",\n textColor: \"text-white\",\n textShadow: \"[text-shadow:0-1px_0_rgb(30_58_138_/_100%)]\",\n },\n success: {\n outer: \"bg-gradient-to-b from-[#005A43] to-[#7CCB9B]\",\n inner: \"bg-gradient-to-b from-[#E5F8F0] via-[#00352F] to-[#D1F0E6]\",\n button: \"bg-gradient-to-b from-[#9ADBC8] to-[#3E8F7C]\",\n textColor: \"text-[#FFF7F0]\",\n textShadow: \"[text-shadow:0-1px_0_rgb(6_78_59_/_100%)]\",\n },\n error: {\n outer: \"bg-gradient-to-b from-[#5A0000] to-[#FFAEB0]\",\n inner: \"bg-gradient-to-b from-[#FFDEDE] via-[#680002] to-[#FFE9E9]\",\n button: \"bg-gradient-to-b from-[#F08D8F] to-[#A45253]\",\n textColor: \"text-[#FFF7F0]\",\n textShadow: \"[text-shadow:0-1px_0_rgb(146_64_14_/_100%)]\",\n },\n gold: {\n outer: \"bg-gradient-to-b from-[#917100] to-[#EAD98F]\",\n inner: \"bg-gradient-to-b from-[#FFFDDD] via-[#856807] to-[#FFF1B3]\",\n button: \"bg-gradient-to-b from-[#FFEBA1] to-[#9B873F]\",\n textColor: \"text-[#FFFDE5]\",\n textShadow: \"[text-shadow:0-1px_0_rgb(178_140_2_/_100%)]\",\n },\n bronze: {\n outer: \"bg-gradient-to-b from-[#864813] to-[#E9B486]\",\n inner: \"bg-gradient-to-b from-[#EDC5A1] via-[#5F2D01] to-[#FFDEC1]\",\n button: \"bg-gradient-to-b from-[#FFE3C9] to-[#A36F3D]\",\n textColor: \"text-[#FFF7F0]\",\n textShadow: \"[text-shadow:0-1px_0_rgb(124_45_18_/_100%)]\",\n },\n};\n \nconst metalButtonVariants = (\n variant: ColorVariant = \"default\",\n isPressed: boolean,\n isHovered: boolean,\n isTouchDevice: boolean,\n) => {\n const colors = colorVariants[variant];\n const transitionStyle = \"all 250ms cubic-bezier(0.1, 0.4, 0.2, 1)\";\n \n return {\n wrapper: cn(\n \"relative inline-flex transform-gpu rounded-md p-[1.25px] will-change-transform\",\n colors.outer,\n ),\n wrapperStyle: {\n transform: isPressed\n ? \"translateY(2.5px) scale(0.99)\"\n : \"translateY(0) scale(1)\",\n boxShadow: isPressed\n ? \"0 1px 2px rgba(0, 0, 0, 0.15)\"\n : isHovered && !isTouchDevice\n ? \"0 4px 12px rgba(0, 0, 0, 0.12)\"\n : \"0 3px 8px rgba(0, 0, 0, 0.08)\",\n transition: transitionStyle,\n transformOrigin: \"center center\",\n },\n inner: cn(\n \"absolute inset-[1px] transform-gpu rounded-lg will-change-transform\",\n colors.inner,\n ),\n innerStyle: {\n transition: transitionStyle,\n transformOrigin: \"center center\",\n filter:\n isHovered && !isPressed && !isTouchDevice ? \"brightness(1.05)\" : \"none\",\n },\n button: cn(\n \"relative z-10 m-[1px] rounded-md inline-flex h-11 transform-gpu cursor-pointer items-center justify-center overflow-hidden rounded-md px-6 py-2 text-sm leading-none font-semibold will-change-transform outline-none\",\n colors.button,\n colors.textColor,\n colors.textShadow,\n ),\n buttonStyle: {\n transform: isPressed ? \"scale(0.97)\" : \"scale(1)\",\n transition: transitionStyle,\n transformOrigin: \"center center\",\n filter:\n isHovered && !isPressed && !isTouchDevice ? \"brightness(1.02)\" : \"none\",\n },\n };\n};\n \nconst ShineEffect = ({ isPressed }: { isPressed: boolean }) => {\n return (\n <div\n className={cn(\n \"pointer-events-none absolute inset-0 z-20 overflow-hidden transition-opacity duration-300\",\n isPressed ? \"opacity-20\" : \"opacity-0\",\n )}\n >\n <div className=\"absolute inset-0 rounded-md bg-gradient-to-r from-transparent via-neutral-100 to-transparent\" />\n </div>\n );\n};\n \nexport const MetalButton = React.forwardRef<\n HTMLButtonElement,\n MetalButtonProps\n>(({ children, className, variant = \"default\", ...props }, ref) => {\n const [isPressed, setIsPressed] = React.useState(false);\n const [isHovered, setIsHovered] = React.useState(false);\n const [isTouchDevice, setIsTouchDevice] = React.useState(false);\n \n React.useEffect(() => {\n setIsTouchDevice(\"ontouchstart\" in window || navigator.maxTouchPoints > 0);\n }, []);\n \n const buttonText = children || \"Button\";\n const variants = metalButtonVariants(\n variant,\n isPressed,\n isHovered,\n isTouchDevice,\n );\n \n const handleInternalMouseDown = () => {\n setIsPressed(true);\n };\n const handleInternalMouseUp = () => {\n setIsPressed(false);\n };\n const handleInternalMouseLeave = () => {\n setIsPressed(false);\n setIsHovered(false);\n };\n const handleInternalMouseEnter = () => {\n if (!isTouchDevice) {\n setIsHovered(true);\n }\n };\n const handleInternalTouchStart = () => {\n setIsPressed(true);\n };\n const handleInternalTouchEnd = () => {\n setIsPressed(false);\n };\n const handleInternalTouchCancel = () => {\n setIsPressed(false);\n };\n \n return (\n <div className={variants.wrapper} style={variants.wrapperStyle}>\n <div className={variants.inner} style={variants.innerStyle}></div>\n <button\n ref={ref}\n className={cn(variants.button, className)}\n style={variants.buttonStyle}\n {...props}\n onMouseDown={handleInternalMouseDown}\n onMouseUp={handleInternalMouseUp}\n onMouseLeave={handleInternalMouseLeave}\n onMouseEnter={handleInternalMouseEnter}\n onTouchStart={handleInternalTouchStart}\n onTouchEnd={handleInternalTouchEnd}\n onTouchCancel={handleInternalTouchCancel}\n >\n <ShineEffect isPressed={isPressed} />\n {buttonText}\n {isHovered && !isPressed && !isTouchDevice && (\n <div className=\"absolute inset-0 rounded-lg pointer-events-none bg-gradient-to-t from-transparent to-white/5\" />\n )}\n </button>\n </div>\n );\n});\n \nMetalButton.displayName = \"MetalButton\";\n\nexport { Button, buttonVariants, liquidbuttonVariants, LiquidButton }\n"],"names":[],"mappings":"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"}