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.
- package/dist/index.es100.js +20 -354
- package/dist/index.es100.js.map +1 -1
- package/dist/index.es101.js +172 -127
- package/dist/index.es101.js.map +1 -1
- package/dist/index.es102.js +231 -60
- package/dist/index.es102.js.map +1 -1
- package/dist/index.es103.js +352 -34
- package/dist/index.es103.js.map +1 -1
- package/dist/index.es104.js +134 -34
- package/dist/index.es104.js.map +1 -1
- package/dist/index.es105.js +65 -161
- package/dist/index.es105.js.map +1 -1
- package/dist/index.es106.js +30 -196
- package/dist/index.es106.js.map +1 -1
- package/dist/index.es107.js +36 -13
- package/dist/index.es107.js.map +1 -1
- package/dist/index.es108.js +162 -26
- package/dist/index.es108.js.map +1 -1
- package/dist/index.es109.js +196 -27
- package/dist/index.es109.js.map +1 -1
- package/dist/index.es110.js +13 -3156
- package/dist/index.es110.js.map +1 -1
- package/dist/index.es111.js +27 -34
- package/dist/index.es111.js.map +1 -1
- package/dist/index.es112.js +34 -5
- package/dist/index.es112.js.map +1 -1
- package/dist/index.es113.js +3145 -61
- package/dist/index.es113.js.map +1 -1
- package/dist/index.es114.js +33 -33
- package/dist/index.es114.js.map +1 -1
- package/dist/index.es115.js +5 -21
- package/dist/index.es115.js.map +1 -1
- package/dist/index.es116.js +69 -64
- package/dist/index.es116.js.map +1 -1
- package/dist/index.es117.js +37 -3
- package/dist/index.es117.js.map +1 -1
- package/dist/index.es12.js +1 -1
- package/dist/index.es121.js +9 -9
- package/dist/index.es122.js +1 -1
- package/dist/index.es126.js +1 -1
- package/dist/index.es128.js +2 -2
- package/dist/index.es13.js +9 -3
- package/dist/index.es13.js.map +1 -1
- package/dist/index.es136.js +1 -1
- package/dist/index.es137.js +6 -6
- package/dist/index.es139.js +1 -1
- package/dist/index.es14.js +6 -6
- package/dist/index.es140.js +1 -1
- package/dist/index.es143.js +1 -1
- package/dist/index.es144.js +1 -1
- package/dist/index.es145.js +1 -1
- package/dist/index.es146.js +1 -1
- package/dist/index.es147.js +1 -1
- package/dist/index.es148.js +1 -1
- package/dist/index.es149.js +1 -1
- package/dist/index.es150.js +1 -1
- package/dist/index.es151.js +1 -1
- package/dist/index.es152.js +1 -1
- package/dist/index.es153.js +1 -1
- package/dist/index.es154.js +1 -1
- package/dist/index.es155.js +1 -1
- package/dist/index.es156.js +1 -1
- package/dist/index.es157.js +1 -1
- package/dist/index.es158.js +1 -1
- package/dist/index.es159.js +1 -1
- package/dist/index.es16.js +10 -5
- package/dist/index.es16.js.map +1 -1
- package/dist/index.es160.js +1 -1
- package/dist/index.es161.js +1 -1
- package/dist/index.es162.js +1 -1
- package/dist/index.es163.js +1 -1
- package/dist/index.es164.js +1 -1
- package/dist/index.es165.js +1 -1
- package/dist/index.es166.js +1 -1
- package/dist/index.es167.js +1 -1
- package/dist/index.es168.js +1 -1
- package/dist/index.es169.js +1 -1
- package/dist/index.es170.js +1 -1
- package/dist/index.es171.js +1 -1
- package/dist/index.es172.js +1 -1
- package/dist/index.es173.js +1 -1
- package/dist/index.es174.js +1 -1
- package/dist/index.es175.js +1 -1
- package/dist/index.es176.js +1 -1
- package/dist/index.es177.js +1 -1
- package/dist/index.es178.js +1 -1
- package/dist/index.es179.js +1 -1
- package/dist/index.es18.js +7 -7
- package/dist/index.es180.js +1 -1
- package/dist/index.es181.js +1 -1
- package/dist/index.es182.js +1 -1
- package/dist/index.es183.js +1 -1
- package/dist/index.es184.js +1 -1
- package/dist/index.es185.js +1 -1
- package/dist/index.es186.js +1 -1
- package/dist/index.es187.js +1 -1
- package/dist/index.es191.js +2 -56
- package/dist/index.es191.js.map +1 -1
- package/dist/index.es192.js +2 -100
- package/dist/index.es192.js.map +1 -1
- package/dist/index.es193.js +2 -191
- package/dist/index.es193.js.map +1 -1
- package/dist/index.es194.js +2 -110
- package/dist/index.es194.js.map +1 -1
- package/dist/index.es195.js +2 -35
- package/dist/index.es195.js.map +1 -1
- package/dist/index.es196.js +2 -10
- package/dist/index.es196.js.map +1 -1
- package/dist/index.es197.js +2 -11
- package/dist/index.es197.js.map +1 -1
- package/dist/index.es198.js +2 -12
- package/dist/index.es198.js.map +1 -1
- package/dist/index.es199.js +2 -91
- package/dist/index.es199.js.map +1 -1
- package/dist/index.es2.js +96 -11
- package/dist/index.es2.js.map +1 -1
- package/dist/index.es20.js +2 -2
- package/dist/index.es200.js +2 -275
- package/dist/index.es200.js.map +1 -1
- package/dist/index.es201.js +2 -2
- package/dist/index.es202.js +2 -164
- package/dist/index.es202.js.map +1 -1
- package/dist/index.es203.js +2 -51
- package/dist/index.es203.js.map +1 -1
- package/dist/index.es204.js +2 -40
- package/dist/index.es204.js.map +1 -1
- package/dist/index.es205.js +2 -35
- package/dist/index.es205.js.map +1 -1
- package/dist/index.es206.js +2 -40
- package/dist/index.es206.js.map +1 -1
- package/dist/index.es207.js +2 -24
- package/dist/index.es207.js.map +1 -1
- package/dist/index.es208.js +2 -591
- package/dist/index.es208.js.map +1 -1
- package/dist/index.es209.js +2 -125
- package/dist/index.es209.js.map +1 -1
- package/dist/index.es210.js +2 -164
- package/dist/index.es210.js.map +1 -1
- package/dist/index.es211.js +2 -2
- package/dist/index.es212.js +2 -2
- package/dist/index.es213.js +2 -2
- package/dist/index.es214.js +2 -2
- package/dist/index.es215.js +2 -2
- package/dist/index.es216.js +2 -2
- package/dist/index.es217.js +2 -2
- package/dist/index.es218.js +2 -2
- package/dist/index.es219.js +2 -2
- package/dist/index.es22.js +35 -119
- package/dist/index.es22.js.map +1 -1
- package/dist/index.es220.js +2 -2
- package/dist/index.es221.js +2 -2
- package/dist/index.es222.js +2 -2
- package/dist/index.es223.js +2 -2
- package/dist/index.es224.js +2 -2
- package/dist/index.es225.js +2 -2
- package/dist/index.es226.js +2 -2
- package/dist/index.es227.js +2 -2
- package/dist/index.es228.js +2 -2
- package/dist/index.es229.js +2 -2
- package/dist/index.es23.js +66 -36
- package/dist/index.es23.js.map +1 -1
- package/dist/index.es230.js +2 -2
- package/dist/index.es231.js +2 -2
- package/dist/index.es232.js +2 -2
- package/dist/index.es233.js +2 -2
- package/dist/index.es234.js +2 -2
- package/dist/index.es235.js +2 -2
- package/dist/index.es236.js +56 -2
- package/dist/index.es236.js.map +1 -1
- package/dist/index.es237.js +100 -2
- package/dist/index.es237.js.map +1 -1
- package/dist/index.es238.js +191 -2
- package/dist/index.es238.js.map +1 -1
- package/dist/index.es239.js +110 -2
- package/dist/index.es239.js.map +1 -1
- package/dist/index.es24.js +30 -64
- package/dist/index.es24.js.map +1 -1
- package/dist/index.es240.js +35 -2
- package/dist/index.es240.js.map +1 -1
- package/dist/index.es241.js +10 -2
- package/dist/index.es241.js.map +1 -1
- package/dist/index.es242.js +11 -2
- package/dist/index.es242.js.map +1 -1
- package/dist/index.es243.js +12 -2
- package/dist/index.es243.js.map +1 -1
- package/dist/index.es244.js +91 -2
- package/dist/index.es244.js.map +1 -1
- package/dist/index.es245.js +275 -2
- package/dist/index.es245.js.map +1 -1
- package/dist/index.es246.js +2 -2
- package/dist/index.es247.js +164 -2
- package/dist/index.es247.js.map +1 -1
- package/dist/index.es248.js +51 -2
- package/dist/index.es248.js.map +1 -1
- package/dist/index.es249.js +40 -2
- package/dist/index.es249.js.map +1 -1
- package/dist/index.es25.js +120 -29
- package/dist/index.es25.js.map +1 -1
- package/dist/index.es250.js +35 -2
- package/dist/index.es250.js.map +1 -1
- package/dist/index.es251.js +40 -2
- package/dist/index.es251.js.map +1 -1
- package/dist/index.es252.js +24 -2
- package/dist/index.es252.js.map +1 -1
- package/dist/index.es253.js +591 -2
- package/dist/index.es253.js.map +1 -1
- package/dist/index.es254.js +125 -2
- package/dist/index.es254.js.map +1 -1
- package/dist/index.es255.js +164 -2
- package/dist/index.es255.js.map +1 -1
- package/dist/index.es256.js +2 -2
- package/dist/index.es26.js +102 -123
- package/dist/index.es26.js.map +1 -1
- package/dist/index.es267.js +1 -1
- package/dist/index.es27.js +66 -101
- package/dist/index.es27.js.map +1 -1
- package/dist/index.es28.js +139 -66
- package/dist/index.es28.js.map +1 -1
- package/dist/index.es29.js +295 -131
- package/dist/index.es29.js.map +1 -1
- package/dist/index.es30.js +114 -298
- package/dist/index.es30.js.map +1 -1
- package/dist/index.es305.js +1 -1
- package/dist/index.es307.js +1 -1
- package/dist/index.es319.js +1 -1
- package/dist/index.es32.js +7 -7
- package/dist/index.es33.js +1 -1
- package/dist/index.es339.js +2 -2
- package/dist/index.es36.js +4 -4
- package/dist/index.es37.js +289 -114
- package/dist/index.es37.js.map +1 -1
- package/dist/index.es38.js +44 -70
- package/dist/index.es38.js.map +1 -1
- package/dist/index.es39.js +145 -19
- package/dist/index.es39.js.map +1 -1
- package/dist/index.es40.js +5 -261
- package/dist/index.es40.js.map +1 -1
- package/dist/index.es41.js +247 -38
- package/dist/index.es41.js.map +1 -1
- package/dist/index.es42.js +110 -207
- package/dist/index.es42.js.map +1 -1
- package/dist/index.es43.js +68 -64
- package/dist/index.es43.js.map +1 -1
- package/dist/index.es44.js +17 -141
- package/dist/index.es44.js.map +1 -1
- package/dist/index.es45.js +251 -14
- package/dist/index.es45.js.map +1 -1
- package/dist/index.es46.js +36 -223
- package/dist/index.es46.js.map +1 -1
- package/dist/index.es47.js +213 -7
- package/dist/index.es47.js.map +1 -1
- package/dist/index.es48.js +55 -1180
- package/dist/index.es48.js.map +1 -1
- package/dist/index.es49.js +141 -6
- package/dist/index.es49.js.map +1 -1
- package/dist/index.es50.js +21 -144
- package/dist/index.es50.js.map +1 -1
- package/dist/index.es51.js +230 -5
- package/dist/index.es51.js.map +1 -1
- package/dist/index.es52.js +8 -292
- package/dist/index.es52.js.map +1 -1
- package/dist/index.es53.js +1190 -43
- package/dist/index.es53.js.map +1 -1
- package/dist/index.es54.js +7 -144
- package/dist/index.es54.js.map +1 -1
- package/dist/index.es55.js +136 -241
- package/dist/index.es55.js.map +1 -1
- package/dist/index.es59.js +1 -1
- package/dist/index.es6.js +21 -8
- package/dist/index.es6.js.map +1 -1
- package/dist/index.es60.js +1 -1
- package/dist/index.es61.js +1 -1
- package/dist/index.es62.js +7 -7
- package/dist/index.es67.js +3 -3
- package/dist/index.es69.js +2 -2
- package/dist/index.es70.js +1 -1
- package/dist/index.es71.js +1 -1
- package/dist/index.es72.js +1 -1
- package/dist/index.es77.js +7 -7
- package/dist/index.es78.js +17 -17
- package/dist/index.es82.js +1 -1
- package/dist/index.es83.js +4 -4
- package/dist/index.es84.js +20 -11
- package/dist/index.es84.js.map +1 -1
- package/dist/index.es85.js +66 -38
- package/dist/index.es85.js.map +1 -1
- package/dist/index.es86.js +3 -34
- package/dist/index.es86.js.map +1 -1
- package/dist/index.es87.js +10 -230
- package/dist/index.es87.js.map +1 -1
- package/dist/index.es88.js +39 -29
- package/dist/index.es88.js.map +1 -1
- package/dist/index.es89.js +32 -73
- package/dist/index.es89.js.map +1 -1
- package/dist/index.es90.js +200 -44
- package/dist/index.es90.js.map +1 -1
- package/dist/index.es91.js +15 -37
- package/dist/index.es91.js.map +1 -1
- package/dist/index.es92.js +71 -26
- package/dist/index.es92.js.map +1 -1
- package/dist/index.es93.js +72 -39
- package/dist/index.es93.js.map +1 -1
- package/dist/index.es94.js +48 -53
- package/dist/index.es94.js.map +1 -1
- package/dist/index.es95.js +30 -13
- package/dist/index.es95.js.map +1 -1
- package/dist/index.es96.js +40 -134
- package/dist/index.es96.js.map +1 -1
- package/dist/index.es97.js +56 -20
- package/dist/index.es97.js.map +1 -1
- package/dist/index.es98.js +11 -180
- package/dist/index.es98.js.map +1 -1
- package/dist/index.es99.js +129 -233
- package/dist/index.es99.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +1 -1
package/dist/index.es29.js
CHANGED
|
@@ -1,145 +1,309 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
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
|
-
|
|
69
|
-
})
|
|
70
|
-
|
|
71
|
-
|
|
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
|
-
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
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
|
-
|
|
121
|
-
|
|
122
|
-
|
|
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
|
-
|
|
125
|
-
|
|
126
|
-
|
|
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
|
-
|
|
129
|
-
|
|
130
|
-
|
|
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
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
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
|
-
|
|
303
|
+
Button,
|
|
304
|
+
LiquidButton,
|
|
305
|
+
MetalButton,
|
|
306
|
+
buttonVariants,
|
|
307
|
+
liquidbuttonVariants
|
|
144
308
|
};
|
|
145
309
|
//# sourceMappingURL=index.es29.js.map
|
package/dist/index.es29.js.map
CHANGED
|
@@ -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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"}
|