@definable/ui 0.1.10 → 0.1.12
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/components/card.esm.js +13 -13
- package/dist/components/card.esm.js.map +1 -1
- package/dist/components/card.js +1 -1
- package/dist/components/card.js.map +1 -1
- package/dist/components/modal.esm.js +50 -43
- package/dist/components/modal.esm.js.map +1 -1
- package/dist/components/modal.js +1 -1
- package/dist/components/modal.js.map +1 -1
- package/dist/components/sheet.esm.js +22 -22
- package/dist/components/sheet.esm.js.map +1 -1
- package/dist/components/sheet.js +1 -1
- package/dist/components/sheet.js.map +1 -1
- package/dist/components/tooltip.esm.js +25 -49
- package/dist/components/tooltip.esm.js.map +1 -1
- package/dist/components/tooltip.js +1 -1
- package/dist/components/tooltip.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +1 -1
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
import { j as
|
|
2
|
-
import * as
|
|
1
|
+
import { j as d } from "../jsx-runtime-DGlMoOmv.js";
|
|
2
|
+
import * as s from "react";
|
|
3
3
|
import { c as t } from "../utils-qaFjX9_3.js";
|
|
4
|
-
const o =
|
|
4
|
+
const o = s.forwardRef(({ className: a, ...e }, r) => /* @__PURE__ */ d.jsx(
|
|
5
5
|
"div",
|
|
6
6
|
{
|
|
7
7
|
ref: r,
|
|
8
8
|
className: t(
|
|
9
|
-
"rounded-lg border bg-card text-card-foreground
|
|
9
|
+
"rounded-lg border-border/50 bg-card text-card-foreground ",
|
|
10
10
|
a
|
|
11
11
|
),
|
|
12
12
|
...e
|
|
13
13
|
}
|
|
14
14
|
));
|
|
15
15
|
o.displayName = "Card";
|
|
16
|
-
const i =
|
|
16
|
+
const i = s.forwardRef(({ className: a, ...e }, r) => /* @__PURE__ */ d.jsx(
|
|
17
17
|
"div",
|
|
18
18
|
{
|
|
19
19
|
ref: r,
|
|
@@ -22,7 +22,7 @@ const i = d.forwardRef(({ className: a, ...e }, r) => /* @__PURE__ */ s.jsx(
|
|
|
22
22
|
}
|
|
23
23
|
));
|
|
24
24
|
i.displayName = "CardHeader";
|
|
25
|
-
const
|
|
25
|
+
const c = s.forwardRef(({ className: a, ...e }, r) => /* @__PURE__ */ d.jsx(
|
|
26
26
|
"h3",
|
|
27
27
|
{
|
|
28
28
|
ref: r,
|
|
@@ -30,8 +30,8 @@ const m = d.forwardRef(({ className: a, ...e }, r) => /* @__PURE__ */ s.jsx(
|
|
|
30
30
|
...e
|
|
31
31
|
}
|
|
32
32
|
));
|
|
33
|
-
|
|
34
|
-
const
|
|
33
|
+
c.displayName = "CardTitle";
|
|
34
|
+
const m = s.forwardRef(({ className: a, ...e }, r) => /* @__PURE__ */ d.jsx(
|
|
35
35
|
"p",
|
|
36
36
|
{
|
|
37
37
|
ref: r,
|
|
@@ -39,10 +39,10 @@ const c = d.forwardRef(({ className: a, ...e }, r) => /* @__PURE__ */ s.jsx(
|
|
|
39
39
|
...e
|
|
40
40
|
}
|
|
41
41
|
));
|
|
42
|
-
|
|
43
|
-
const n =
|
|
42
|
+
m.displayName = "CardDescription";
|
|
43
|
+
const n = s.forwardRef(({ className: a, ...e }, r) => /* @__PURE__ */ d.jsx("div", { ref: r, className: t("p-6 pt-0", a), ...e }));
|
|
44
44
|
n.displayName = "CardContent";
|
|
45
|
-
const l =
|
|
45
|
+
const l = s.forwardRef(({ className: a, ...e }, r) => /* @__PURE__ */ d.jsx(
|
|
46
46
|
"div",
|
|
47
47
|
{
|
|
48
48
|
ref: r,
|
|
@@ -54,9 +54,9 @@ l.displayName = "CardFooter";
|
|
|
54
54
|
export {
|
|
55
55
|
o as Card,
|
|
56
56
|
n as CardContent,
|
|
57
|
-
|
|
57
|
+
m as CardDescription,
|
|
58
58
|
l as CardFooter,
|
|
59
59
|
i as CardHeader,
|
|
60
|
-
|
|
60
|
+
c as CardTitle
|
|
61
61
|
};
|
|
62
62
|
//# sourceMappingURL=card.esm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"card.esm.js","sources":["../../src/components/card.tsx"],"sourcesContent":["import * as React from \"react\"\nimport { cn } from \"@/lib/utils\"\n\nconst Card = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"rounded-lg border bg-card text-card-foreground
|
|
1
|
+
{"version":3,"file":"card.esm.js","sources":["../../src/components/card.tsx"],"sourcesContent":["import * as React from \"react\"\nimport { cn } from \"@/lib/utils\"\n\nconst Card = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"rounded-lg border-border/50 bg-card text-card-foreground \",\n className\n )}\n {...props}\n />\n))\nCard.displayName = \"Card\"\n\nconst CardHeader = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex flex-col space-y-1.5 p-6\", className)}\n {...props}\n />\n))\nCardHeader.displayName = \"CardHeader\"\n\nconst CardTitle = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <h3\n ref={ref}\n className={cn(\"text-lg font-semibold leading-none tracking-tight\", className)}\n {...props}\n />\n))\nCardTitle.displayName = \"CardTitle\"\n\nconst CardDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n))\nCardDescription.displayName = \"CardDescription\"\n\nconst CardContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div ref={ref} className={cn(\"p-6 pt-0\", className)} {...props} />\n))\nCardContent.displayName = \"CardContent\"\n\nconst CardFooter = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex items-center p-6 pt-0\", className)}\n {...props}\n />\n))\nCardFooter.displayName = \"CardFooter\"\n\nexport { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent } "],"names":["Card","React","className","props","ref","jsx","cn","CardHeader","CardTitle","CardDescription","CardContent","CardFooter"],"mappings":";;;AAGA,MAAMA,IAAOC,EAAM,WAGjB,CAAC,EAAE,WAAAC,GAAW,GAAGC,EAAA,GAASC,MAC1BC,gBAAAA,EAAAA;AAAAA,EAAC;AAAA,EAAA;AAAA,IACC,KAAAD;AAAA,IACA,WAAWE;AAAA,MACT;AAAA,MACAJ;AAAA,IAAA;AAAA,IAED,GAAGC;AAAA,EAAA;AACN,CACD;AACDH,EAAK,cAAc;AAEnB,MAAMO,IAAaN,EAAM,WAGvB,CAAC,EAAE,WAAAC,GAAW,GAAGC,EAAA,GAASC,MAC1BC,gBAAAA,EAAAA;AAAAA,EAAC;AAAA,EAAA;AAAA,IACC,KAAAD;AAAA,IACA,WAAWE,EAAG,iCAAiCJ,CAAS;AAAA,IACvD,GAAGC;AAAA,EAAA;AACN,CACD;AACDI,EAAW,cAAc;AAEzB,MAAMC,IAAYP,EAAM,WAGtB,CAAC,EAAE,WAAAC,GAAW,GAAGC,EAAA,GAASC,MAC1BC,gBAAAA,EAAAA;AAAAA,EAAC;AAAA,EAAA;AAAA,IACC,KAAAD;AAAA,IACA,WAAWE,EAAG,qDAAqDJ,CAAS;AAAA,IAC3E,GAAGC;AAAA,EAAA;AACN,CACD;AACDK,EAAU,cAAc;AAExB,MAAMC,IAAkBR,EAAM,WAG5B,CAAC,EAAE,WAAAC,GAAW,GAAGC,EAAA,GAASC,MAC1BC,gBAAAA,EAAAA;AAAAA,EAAC;AAAA,EAAA;AAAA,IACC,KAAAD;AAAA,IACA,WAAWE,EAAG,iCAAiCJ,CAAS;AAAA,IACvD,GAAGC;AAAA,EAAA;AACN,CACD;AACDM,EAAgB,cAAc;AAE9B,MAAMC,IAAcT,EAAM,WAGxB,CAAC,EAAE,WAAAC,GAAW,GAAGC,KAASC,4BACzB,OAAA,EAAI,KAAAA,GAAU,WAAWE,EAAG,YAAYJ,CAAS,GAAI,GAAGC,GAAO,CACjE;AACDO,EAAY,cAAc;AAE1B,MAAMC,IAAaV,EAAM,WAGvB,CAAC,EAAE,WAAAC,GAAW,GAAGC,EAAA,GAASC,MAC1BC,gBAAAA,EAAAA;AAAAA,EAAC;AAAA,EAAA;AAAA,IACC,KAAAD;AAAA,IACA,WAAWE,EAAG,8BAA8BJ,CAAS;AAAA,IACpD,GAAGC;AAAA,EAAA;AACN,CACD;AACDQ,EAAW,cAAc;"}
|
package/dist/components/card.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("../jsx-runtime-BYECrxsp.cjs"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("../jsx-runtime-BYECrxsp.cjs"),m=require("react"),s=require("../utils-DSKoFOjv.cjs");function u(e){const r=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const t in e)if(t!=="default"){const n=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,n.get?n:{enumerable:!0,get:()=>e[t]})}}return r.default=e,Object.freeze(r)}const o=u(m),d=o.forwardRef(({className:e,...r},t)=>a.jsxRuntimeExports.jsx("div",{ref:t,className:s.cn("rounded-lg border-border/50 bg-card text-card-foreground ",e),...r}));d.displayName="Card";const c=o.forwardRef(({className:e,...r},t)=>a.jsxRuntimeExports.jsx("div",{ref:t,className:s.cn("flex flex-col space-y-1.5 p-6",e),...r}));c.displayName="CardHeader";const i=o.forwardRef(({className:e,...r},t)=>a.jsxRuntimeExports.jsx("h3",{ref:t,className:s.cn("text-lg font-semibold leading-none tracking-tight",e),...r}));i.displayName="CardTitle";const l=o.forwardRef(({className:e,...r},t)=>a.jsxRuntimeExports.jsx("p",{ref:t,className:s.cn("text-sm text-muted-foreground",e),...r}));l.displayName="CardDescription";const p=o.forwardRef(({className:e,...r},t)=>a.jsxRuntimeExports.jsx("div",{ref:t,className:s.cn("p-6 pt-0",e),...r}));p.displayName="CardContent";const f=o.forwardRef(({className:e,...r},t)=>a.jsxRuntimeExports.jsx("div",{ref:t,className:s.cn("flex items-center p-6 pt-0",e),...r}));f.displayName="CardFooter";exports.Card=d;exports.CardContent=p;exports.CardDescription=l;exports.CardFooter=f;exports.CardHeader=c;exports.CardTitle=i;
|
|
2
2
|
//# sourceMappingURL=card.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"card.js","sources":["../../src/components/card.tsx"],"sourcesContent":["import * as React from \"react\"\nimport { cn } from \"@/lib/utils\"\n\nconst Card = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"rounded-lg border bg-card text-card-foreground
|
|
1
|
+
{"version":3,"file":"card.js","sources":["../../src/components/card.tsx"],"sourcesContent":["import * as React from \"react\"\nimport { cn } from \"@/lib/utils\"\n\nconst Card = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"rounded-lg border-border/50 bg-card text-card-foreground \",\n className\n )}\n {...props}\n />\n))\nCard.displayName = \"Card\"\n\nconst CardHeader = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex flex-col space-y-1.5 p-6\", className)}\n {...props}\n />\n))\nCardHeader.displayName = \"CardHeader\"\n\nconst CardTitle = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <h3\n ref={ref}\n className={cn(\"text-lg font-semibold leading-none tracking-tight\", className)}\n {...props}\n />\n))\nCardTitle.displayName = \"CardTitle\"\n\nconst CardDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n))\nCardDescription.displayName = \"CardDescription\"\n\nconst CardContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div ref={ref} className={cn(\"p-6 pt-0\", className)} {...props} />\n))\nCardContent.displayName = \"CardContent\"\n\nconst CardFooter = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex items-center p-6 pt-0\", className)}\n {...props}\n />\n))\nCardFooter.displayName = \"CardFooter\"\n\nexport { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent } "],"names":["Card","React","className","props","ref","jsx","cn","CardHeader","CardTitle","CardDescription","CardContent","CardFooter"],"mappings":"+cAGMA,EAAOC,EAAM,WAGjB,CAAC,CAAE,UAAAC,EAAW,GAAGC,CAAA,EAASC,IAC1BC,EAAAA,kBAAAA,IAAC,MAAA,CACC,IAAAD,EACA,UAAWE,EAAAA,GACT,4DACAJ,CAAA,EAED,GAAGC,CAAA,CACN,CACD,EACDH,EAAK,YAAc,OAEnB,MAAMO,EAAaN,EAAM,WAGvB,CAAC,CAAE,UAAAC,EAAW,GAAGC,CAAA,EAASC,IAC1BC,EAAAA,kBAAAA,IAAC,MAAA,CACC,IAAAD,EACA,UAAWE,EAAAA,GAAG,gCAAiCJ,CAAS,EACvD,GAAGC,CAAA,CACN,CACD,EACDI,EAAW,YAAc,aAEzB,MAAMC,EAAYP,EAAM,WAGtB,CAAC,CAAE,UAAAC,EAAW,GAAGC,CAAA,EAASC,IAC1BC,EAAAA,kBAAAA,IAAC,KAAA,CACC,IAAAD,EACA,UAAWE,EAAAA,GAAG,oDAAqDJ,CAAS,EAC3E,GAAGC,CAAA,CACN,CACD,EACDK,EAAU,YAAc,YAExB,MAAMC,EAAkBR,EAAM,WAG5B,CAAC,CAAE,UAAAC,EAAW,GAAGC,CAAA,EAASC,IAC1BC,EAAAA,kBAAAA,IAAC,IAAA,CACC,IAAAD,EACA,UAAWE,EAAAA,GAAG,gCAAiCJ,CAAS,EACvD,GAAGC,CAAA,CACN,CACD,EACDM,EAAgB,YAAc,kBAE9B,MAAMC,EAAcT,EAAM,WAGxB,CAAC,CAAE,UAAAC,EAAW,GAAGC,GAASC,4BACzB,MAAA,CAAI,IAAAA,EAAU,UAAWE,EAAAA,GAAG,WAAYJ,CAAS,EAAI,GAAGC,EAAO,CACjE,EACDO,EAAY,YAAc,cAE1B,MAAMC,EAAaV,EAAM,WAGvB,CAAC,CAAE,UAAAC,EAAW,GAAGC,CAAA,EAASC,IAC1BC,EAAAA,kBAAAA,IAAC,MAAA,CACC,IAAAD,EACA,UAAWE,EAAAA,GAAG,6BAA8BJ,CAAS,EACpD,GAAGC,CAAA,CACN,CACD,EACDQ,EAAW,YAAc"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { j as e } from "../jsx-runtime-DGlMoOmv.js";
|
|
2
2
|
import { createPortal as w } from "react-dom";
|
|
3
|
-
import { AnimatePresence as
|
|
4
|
-
import { X as
|
|
5
|
-
import { c as
|
|
6
|
-
import { useCallback as
|
|
7
|
-
const
|
|
3
|
+
import { AnimatePresence as N, motion as o } from "framer-motion";
|
|
4
|
+
import { X as k } from "lucide-react";
|
|
5
|
+
import { c as i } from "../utils-qaFjX9_3.js";
|
|
6
|
+
import { useCallback as W, useEffect as E } from "react";
|
|
7
|
+
const z = (t) => {
|
|
8
8
|
switch (t) {
|
|
9
9
|
case "sm":
|
|
10
10
|
return { width: "100%", maxWidth: "384px" };
|
|
@@ -24,73 +24,80 @@ const E = (t) => {
|
|
|
24
24
|
return { width: "100%", maxWidth: "448px" };
|
|
25
25
|
}
|
|
26
26
|
};
|
|
27
|
-
function
|
|
27
|
+
function H({
|
|
28
28
|
isOpen: t,
|
|
29
|
-
onClose:
|
|
30
|
-
title:
|
|
31
|
-
description:
|
|
32
|
-
icon:
|
|
33
|
-
children:
|
|
34
|
-
footer:
|
|
35
|
-
size:
|
|
36
|
-
showClose:
|
|
37
|
-
className:
|
|
38
|
-
isContentScrollable:
|
|
39
|
-
mainClassName:
|
|
40
|
-
contentClassName:
|
|
41
|
-
header:
|
|
42
|
-
zIndexClassName:
|
|
29
|
+
onClose: d,
|
|
30
|
+
title: a,
|
|
31
|
+
description: n,
|
|
32
|
+
icon: c,
|
|
33
|
+
children: x,
|
|
34
|
+
footer: r,
|
|
35
|
+
size: u = "md",
|
|
36
|
+
showClose: h = !0,
|
|
37
|
+
className: f,
|
|
38
|
+
isContentScrollable: p = !0,
|
|
39
|
+
mainClassName: b,
|
|
40
|
+
contentClassName: j,
|
|
41
|
+
header: l,
|
|
42
|
+
zIndexClassName: g = "z-[50]"
|
|
43
43
|
}) {
|
|
44
|
-
const
|
|
45
|
-
v.key === "Escape" && t &&
|
|
46
|
-
}, [t,
|
|
47
|
-
|
|
48
|
-
const y = /* @__PURE__ */ e.jsx(
|
|
44
|
+
const m = W((v) => {
|
|
45
|
+
v.key === "Escape" && t && d();
|
|
46
|
+
}, [t, d]);
|
|
47
|
+
E(() => (document.addEventListener("keydown", m), () => document.removeEventListener("keydown", m)), [m]);
|
|
48
|
+
const s = a || n || c || l, y = /* @__PURE__ */ e.jsx(N, { children: t && /* @__PURE__ */ e.jsx("div", { className: i("fixed inset-0 z-50 overflow-hidden", g), children: /* @__PURE__ */ e.jsxs("div", { className: i("min-h-full flex items-center justify-center p-4", b), children: [
|
|
49
49
|
/* @__PURE__ */ e.jsx(
|
|
50
|
-
|
|
50
|
+
o.div,
|
|
51
51
|
{
|
|
52
52
|
initial: { opacity: 0 },
|
|
53
53
|
animate: { opacity: 1 },
|
|
54
54
|
exit: { opacity: 0 },
|
|
55
55
|
className: "fixed inset-0 bg-background/80 backdrop-blur-sm",
|
|
56
|
-
onClick:
|
|
56
|
+
onClick: d
|
|
57
57
|
}
|
|
58
58
|
),
|
|
59
59
|
/* @__PURE__ */ e.jsxs(
|
|
60
|
-
|
|
60
|
+
o.div,
|
|
61
61
|
{
|
|
62
62
|
initial: { opacity: 0, scale: 0.95 },
|
|
63
63
|
animate: { opacity: 1, scale: 1 },
|
|
64
64
|
exit: { opacity: 0, scale: 0.95 },
|
|
65
65
|
transition: { duration: 0.1, ease: "easeOut" },
|
|
66
|
-
className:
|
|
67
|
-
"relative transform rounded-lg bg-background shadow-xl border border-border flex flex-col max-h-[85vh]",
|
|
68
|
-
|
|
66
|
+
className: i(
|
|
67
|
+
"relative transform rounded-lg bg-background shadow-xl border border-border/50 flex flex-col max-h-[85vh] overflow-hidden",
|
|
68
|
+
f
|
|
69
69
|
),
|
|
70
|
-
style:
|
|
70
|
+
style: z(u),
|
|
71
71
|
children: [
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
72
|
+
s && /* @__PURE__ */ e.jsxs("div", { className: "flex-shrink-0 rounded-t-lg bg-card flex items-center justify-between p-2 border-b border-border/50", children: [
|
|
73
|
+
l || /* @__PURE__ */ e.jsxs("div", { className: "flex items-center gap-3", children: [
|
|
74
|
+
c && /* @__PURE__ */ e.jsx("div", { className: "h-8 w-8 rounded-lg flex items-center justify-center", children: c }),
|
|
75
75
|
/* @__PURE__ */ e.jsxs("div", { children: [
|
|
76
|
-
|
|
77
|
-
|
|
76
|
+
a && /* @__PURE__ */ e.jsx("h2", { className: "text-sm font-small", children: a }),
|
|
77
|
+
n && /* @__PURE__ */ e.jsx("p", { className: "text-sm text-muted-foreground", children: n })
|
|
78
78
|
] })
|
|
79
79
|
] }),
|
|
80
|
-
|
|
80
|
+
h && /* @__PURE__ */ e.jsx(
|
|
81
81
|
"button",
|
|
82
82
|
{
|
|
83
|
-
onClick:
|
|
83
|
+
onClick: d,
|
|
84
84
|
className: "p-1.5 rounded-md hover:bg-muted text-muted-foreground",
|
|
85
85
|
children: /* @__PURE__ */ e.jsxs("div", { className: "flex justify-center items-center", children: [
|
|
86
|
-
/* @__PURE__ */ e.jsx(
|
|
86
|
+
/* @__PURE__ */ e.jsx(k, { className: "h-4 w-4" }),
|
|
87
87
|
/* @__PURE__ */ e.jsx("kbd", { className: "ml-2 text-[10px] text-muted-foreground bg-muted px-1.5 py-0.5 rounded", children: "ESC" })
|
|
88
88
|
] })
|
|
89
89
|
}
|
|
90
90
|
)
|
|
91
91
|
] }),
|
|
92
|
-
/* @__PURE__ */ e.jsx("div", { className:
|
|
93
|
-
|
|
92
|
+
/* @__PURE__ */ e.jsx("div", { className: i(
|
|
93
|
+
"flex-1 min-h-0",
|
|
94
|
+
p ? "overflow-y-auto" : "",
|
|
95
|
+
!r && !s ? "rounded-lg" : "",
|
|
96
|
+
!r && s ? "rounded-b-lg" : "",
|
|
97
|
+
r && !s ? "rounded-t-lg" : "",
|
|
98
|
+
j
|
|
99
|
+
), children: x }),
|
|
100
|
+
r && /* @__PURE__ */ e.jsx("div", { className: "flex-shrink-0 flex items-center justify-end gap-2 px-4 py-3 border-t border-border/50 bg-card rounded-b-lg", children: r })
|
|
94
101
|
]
|
|
95
102
|
}
|
|
96
103
|
)
|
|
@@ -98,6 +105,6 @@ function D({
|
|
|
98
105
|
return w(y, document.body);
|
|
99
106
|
}
|
|
100
107
|
export {
|
|
101
|
-
|
|
108
|
+
H as Modal
|
|
102
109
|
};
|
|
103
110
|
//# sourceMappingURL=modal.esm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modal.esm.js","sources":["../../src/components/modal.tsx"],"sourcesContent":["import { createPortal } from 'react-dom';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport { X } from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { useEffect, useCallback } from 'react';\n\nexport interface ModalProps {\n isOpen: boolean;\n onClose: () => void;\n title?: string;\n description?: string | React.ReactNode;\n icon?: React.ReactNode;\n children: React.ReactNode;\n footer?: React.ReactNode;\n size?: 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 'full' | '3xl';\n showClose?: boolean;\n className?: string;\n mainClassName?: string;\n isContentScrollable?: boolean;\n header?: React.ReactNode;\n headerClassName?: string;\n contentClassName?: string;\n zIndexClassName?: string;\n}\n\nconst getSizeStyles = (size: 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 'full' | '3xl') => {\n switch (size) {\n case 'sm':\n return { width: '100%', maxWidth: '384px' }; // max-w-sm equivalent\n case 'md':\n return { width: '100%', maxWidth: '448px' }; // max-w-md equivalent\n case 'lg':\n return { width: '100%', maxWidth: '512px' }; // max-w-lg equivalent\n case 'xl':\n return { width: '100%', maxWidth: '70%' };\n case '2xl':\n return { width: '80%', maxWidth: '1200px' };\n case '3xl':\n return { width: '90%', maxWidth: '1600px' };\n case 'full':\n return { width: '100%' };\n default:\n return { width: '100%', maxWidth: '448px' };\n }\n};\n\nexport function Modal({\n isOpen,\n onClose,\n title,\n description,\n icon,\n children,\n footer,\n size = 'md',\n showClose = true,\n className,\n isContentScrollable = true,\n mainClassName,\n contentClassName,\n header,\n zIndexClassName = 'z-[50]'\n}: ModalProps) {\n const handleKeyDown = useCallback((e: KeyboardEvent) => {\n if (e.key === 'Escape' && isOpen) {\n onClose();\n }\n }, [isOpen, onClose]);\n\n useEffect(() => {\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [handleKeyDown]);\n\n const content = (\n <AnimatePresence>\n {isOpen && (\n <div className={cn(\"fixed inset-0 z-50 overflow-hidden\", zIndexClassName)}>\n <div className={cn(\"min-h-full flex items-center justify-center p-4\", mainClassName)}>\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n className=\"fixed inset-0 bg-background/80 backdrop-blur-sm\"\n onClick={onClose}\n />\n \n <motion.div\n initial={{ opacity: 0, scale: 0.95 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.95 }}\n transition={{ duration: 0.1, ease: \"easeOut\" }}\n className={cn(\n \"relative transform rounded-lg bg-background shadow-xl border border-border flex flex-col max-h-[85vh]\",\n className\n )}\n style={getSizeStyles(size)}\n >\n {/* Header - Fixed */}\n {
|
|
1
|
+
{"version":3,"file":"modal.esm.js","sources":["../../src/components/modal.tsx"],"sourcesContent":["import { createPortal } from 'react-dom';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport { X } from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { useEffect, useCallback } from 'react';\n\nexport interface ModalProps {\n isOpen: boolean;\n onClose: () => void;\n title?: string;\n description?: string | React.ReactNode;\n icon?: React.ReactNode;\n children: React.ReactNode;\n footer?: React.ReactNode;\n size?: 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 'full' | '3xl';\n showClose?: boolean;\n className?: string;\n mainClassName?: string;\n isContentScrollable?: boolean;\n header?: React.ReactNode;\n headerClassName?: string;\n contentClassName?: string;\n zIndexClassName?: string;\n}\n\nconst getSizeStyles = (size: 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 'full' | '3xl') => {\n switch (size) {\n case 'sm':\n return { width: '100%', maxWidth: '384px' }; // max-w-sm equivalent\n case 'md':\n return { width: '100%', maxWidth: '448px' }; // max-w-md equivalent\n case 'lg':\n return { width: '100%', maxWidth: '512px' }; // max-w-lg equivalent\n case 'xl':\n return { width: '100%', maxWidth: '70%' };\n case '2xl':\n return { width: '80%', maxWidth: '1200px' };\n case '3xl':\n return { width: '90%', maxWidth: '1600px' };\n case 'full':\n return { width: '100%' };\n default:\n return { width: '100%', maxWidth: '448px' };\n }\n};\n\nexport function Modal({\n isOpen,\n onClose,\n title,\n description,\n icon,\n children,\n footer,\n size = 'md',\n showClose = true,\n className,\n isContentScrollable = true,\n mainClassName,\n contentClassName,\n header,\n zIndexClassName = 'z-[50]'\n}: ModalProps) {\n const handleKeyDown = useCallback((e: KeyboardEvent) => {\n if (e.key === 'Escape' && isOpen) {\n onClose();\n }\n }, [isOpen, onClose]);\n\n useEffect(() => {\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [handleKeyDown]);\n \n const isHeader = title || description || icon || header;\n const content = (\n <AnimatePresence>\n {isOpen && (\n <div className={cn(\"fixed inset-0 z-50 overflow-hidden\", zIndexClassName)}>\n <div className={cn(\"min-h-full flex items-center justify-center p-4\", mainClassName)}>\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n className=\"fixed inset-0 bg-background/80 backdrop-blur-sm\"\n onClick={onClose}\n />\n \n <motion.div\n initial={{ opacity: 0, scale: 0.95 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.95 }}\n transition={{ duration: 0.1, ease: \"easeOut\" }}\n className={cn(\n \"relative transform rounded-lg bg-background shadow-xl border border-border/50 flex flex-col max-h-[85vh] overflow-hidden\",\n className\n )}\n style={getSizeStyles(size)}\n >\n {/* Header - Fixed */}\n {isHeader && (\n <div className=\"flex-shrink-0 rounded-t-lg bg-card flex items-center justify-between p-2 border-b border-border/50\">\n \n {header ? header: (\n <div className=\"flex items-center gap-3\">\n {icon && (\n <div className=\"h-8 w-8 rounded-lg flex items-center justify-center\">\n {icon}\n </div>\n )}\n <div>\n {title && <h2 className=\"text-sm font-small\">{title}</h2>}\n {description && <p className=\"text-sm text-muted-foreground\">{description}</p>}\n </div>\n </div>\n )}\n {showClose && (\n <button\n onClick={onClose}\n className=\"p-1.5 rounded-md hover:bg-muted text-muted-foreground\"\n >\n <div className=\"flex justify-center items-center\">\n <X className=\"h-4 w-4\" />\n <kbd className=\"ml-2 text-[10px] text-muted-foreground bg-muted px-1.5 py-0.5 rounded\">\n ESC\n </kbd>\n </div>\n </button>\n )}\n </div>\n )}\n\n {/* Content - Scrollable */}\n <div className={cn(\n \"flex-1 min-h-0\", \n isContentScrollable ? 'overflow-y-auto' : '', \n !footer && !isHeader ? 'rounded-lg' : '',\n !footer && isHeader ? 'rounded-b-lg' : '', \n footer && !isHeader ? 'rounded-t-lg' : '',\n contentClassName \n )}>\n {children}\n </div>\n\n {/* Footer - Fixed */}\n {footer && (\n <div className=\"flex-shrink-0 flex items-center justify-end gap-2 px-4 py-3 border-t border-border/50 bg-card rounded-b-lg\">\n {footer}\n </div>\n )}\n </motion.div>\n </div>\n </div>\n )}\n </AnimatePresence>\n );\n\n return createPortal(content, document.body);\n}"],"names":["getSizeStyles","size","Modal","isOpen","onClose","title","description","icon","children","footer","showClose","className","isContentScrollable","mainClassName","contentClassName","header","zIndexClassName","handleKeyDown","useCallback","e","useEffect","isHeader","content","jsx","AnimatePresence","cn","jsxs","motion","X","createPortal"],"mappings":"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"}
|
package/dist/components/modal.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../jsx-runtime-BYECrxsp.cjs"),R=require("react-dom"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../jsx-runtime-BYECrxsp.cjs"),R=require("react-dom"),l=require("framer-motion"),w=require("lucide-react"),n=require("../utils-DSKoFOjv.cjs"),u=require("react"),N=t=>{switch(t){case"sm":return{width:"100%",maxWidth:"384px"};case"md":return{width:"100%",maxWidth:"448px"};case"lg":return{width:"100%",maxWidth:"512px"};case"xl":return{width:"100%",maxWidth:"70%"};case"2xl":return{width:"80%",maxWidth:"1200px"};case"3xl":return{width:"90%",maxWidth:"1600px"};case"full":return{width:"100%"};default:return{width:"100%",maxWidth:"448px"}}};function k({isOpen:t,onClose:r,title:d,description:x,icon:a,children:m,footer:s,size:h="md",showClose:j=!0,className:p,isContentScrollable:f=!0,mainClassName:b,contentClassName:g,header:c,zIndexClassName:y="z-[50]"}){const o=u.useCallback(v=>{v.key==="Escape"&&t&&r()},[t,r]);u.useEffect(()=>(document.addEventListener("keydown",o),()=>document.removeEventListener("keydown",o)),[o]);const i=d||x||a||c,E=e.jsxRuntimeExports.jsx(l.AnimatePresence,{children:t&&e.jsxRuntimeExports.jsx("div",{className:n.cn("fixed inset-0 z-50 overflow-hidden",y),children:e.jsxRuntimeExports.jsxs("div",{className:n.cn("min-h-full flex items-center justify-center p-4",b),children:[e.jsxRuntimeExports.jsx(l.motion.div,{initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},className:"fixed inset-0 bg-background/80 backdrop-blur-sm",onClick:r}),e.jsxRuntimeExports.jsxs(l.motion.div,{initial:{opacity:0,scale:.95},animate:{opacity:1,scale:1},exit:{opacity:0,scale:.95},transition:{duration:.1,ease:"easeOut"},className:n.cn("relative transform rounded-lg bg-background shadow-xl border border-border/50 flex flex-col max-h-[85vh] overflow-hidden",p),style:N(h),children:[i&&e.jsxRuntimeExports.jsxs("div",{className:"flex-shrink-0 rounded-t-lg bg-card flex items-center justify-between p-2 border-b border-border/50",children:[c||e.jsxRuntimeExports.jsxs("div",{className:"flex items-center gap-3",children:[a&&e.jsxRuntimeExports.jsx("div",{className:"h-8 w-8 rounded-lg flex items-center justify-center",children:a}),e.jsxRuntimeExports.jsxs("div",{children:[d&&e.jsxRuntimeExports.jsx("h2",{className:"text-sm font-small",children:d}),x&&e.jsxRuntimeExports.jsx("p",{className:"text-sm text-muted-foreground",children:x})]})]}),j&&e.jsxRuntimeExports.jsx("button",{onClick:r,className:"p-1.5 rounded-md hover:bg-muted text-muted-foreground",children:e.jsxRuntimeExports.jsxs("div",{className:"flex justify-center items-center",children:[e.jsxRuntimeExports.jsx(w.X,{className:"h-4 w-4"}),e.jsxRuntimeExports.jsx("kbd",{className:"ml-2 text-[10px] text-muted-foreground bg-muted px-1.5 py-0.5 rounded",children:"ESC"})]})})]}),e.jsxRuntimeExports.jsx("div",{className:n.cn("flex-1 min-h-0",f?"overflow-y-auto":"",!s&&!i?"rounded-lg":"",!s&&i?"rounded-b-lg":"",s&&!i?"rounded-t-lg":"",g),children:m}),s&&e.jsxRuntimeExports.jsx("div",{className:"flex-shrink-0 flex items-center justify-end gap-2 px-4 py-3 border-t border-border/50 bg-card rounded-b-lg",children:s})]})]})})});return R.createPortal(E,document.body)}exports.Modal=k;
|
|
2
2
|
//# sourceMappingURL=modal.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modal.js","sources":["../../src/components/modal.tsx"],"sourcesContent":["import { createPortal } from 'react-dom';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport { X } from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { useEffect, useCallback } from 'react';\n\nexport interface ModalProps {\n isOpen: boolean;\n onClose: () => void;\n title?: string;\n description?: string | React.ReactNode;\n icon?: React.ReactNode;\n children: React.ReactNode;\n footer?: React.ReactNode;\n size?: 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 'full' | '3xl';\n showClose?: boolean;\n className?: string;\n mainClassName?: string;\n isContentScrollable?: boolean;\n header?: React.ReactNode;\n headerClassName?: string;\n contentClassName?: string;\n zIndexClassName?: string;\n}\n\nconst getSizeStyles = (size: 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 'full' | '3xl') => {\n switch (size) {\n case 'sm':\n return { width: '100%', maxWidth: '384px' }; // max-w-sm equivalent\n case 'md':\n return { width: '100%', maxWidth: '448px' }; // max-w-md equivalent\n case 'lg':\n return { width: '100%', maxWidth: '512px' }; // max-w-lg equivalent\n case 'xl':\n return { width: '100%', maxWidth: '70%' };\n case '2xl':\n return { width: '80%', maxWidth: '1200px' };\n case '3xl':\n return { width: '90%', maxWidth: '1600px' };\n case 'full':\n return { width: '100%' };\n default:\n return { width: '100%', maxWidth: '448px' };\n }\n};\n\nexport function Modal({\n isOpen,\n onClose,\n title,\n description,\n icon,\n children,\n footer,\n size = 'md',\n showClose = true,\n className,\n isContentScrollable = true,\n mainClassName,\n contentClassName,\n header,\n zIndexClassName = 'z-[50]'\n}: ModalProps) {\n const handleKeyDown = useCallback((e: KeyboardEvent) => {\n if (e.key === 'Escape' && isOpen) {\n onClose();\n }\n }, [isOpen, onClose]);\n\n useEffect(() => {\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [handleKeyDown]);\n\n const content = (\n <AnimatePresence>\n {isOpen && (\n <div className={cn(\"fixed inset-0 z-50 overflow-hidden\", zIndexClassName)}>\n <div className={cn(\"min-h-full flex items-center justify-center p-4\", mainClassName)}>\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n className=\"fixed inset-0 bg-background/80 backdrop-blur-sm\"\n onClick={onClose}\n />\n \n <motion.div\n initial={{ opacity: 0, scale: 0.95 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.95 }}\n transition={{ duration: 0.1, ease: \"easeOut\" }}\n className={cn(\n \"relative transform rounded-lg bg-background shadow-xl border border-border flex flex-col max-h-[85vh]\",\n className\n )}\n style={getSizeStyles(size)}\n >\n {/* Header - Fixed */}\n {
|
|
1
|
+
{"version":3,"file":"modal.js","sources":["../../src/components/modal.tsx"],"sourcesContent":["import { createPortal } from 'react-dom';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport { X } from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { useEffect, useCallback } from 'react';\n\nexport interface ModalProps {\n isOpen: boolean;\n onClose: () => void;\n title?: string;\n description?: string | React.ReactNode;\n icon?: React.ReactNode;\n children: React.ReactNode;\n footer?: React.ReactNode;\n size?: 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 'full' | '3xl';\n showClose?: boolean;\n className?: string;\n mainClassName?: string;\n isContentScrollable?: boolean;\n header?: React.ReactNode;\n headerClassName?: string;\n contentClassName?: string;\n zIndexClassName?: string;\n}\n\nconst getSizeStyles = (size: 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 'full' | '3xl') => {\n switch (size) {\n case 'sm':\n return { width: '100%', maxWidth: '384px' }; // max-w-sm equivalent\n case 'md':\n return { width: '100%', maxWidth: '448px' }; // max-w-md equivalent\n case 'lg':\n return { width: '100%', maxWidth: '512px' }; // max-w-lg equivalent\n case 'xl':\n return { width: '100%', maxWidth: '70%' };\n case '2xl':\n return { width: '80%', maxWidth: '1200px' };\n case '3xl':\n return { width: '90%', maxWidth: '1600px' };\n case 'full':\n return { width: '100%' };\n default:\n return { width: '100%', maxWidth: '448px' };\n }\n};\n\nexport function Modal({\n isOpen,\n onClose,\n title,\n description,\n icon,\n children,\n footer,\n size = 'md',\n showClose = true,\n className,\n isContentScrollable = true,\n mainClassName,\n contentClassName,\n header,\n zIndexClassName = 'z-[50]'\n}: ModalProps) {\n const handleKeyDown = useCallback((e: KeyboardEvent) => {\n if (e.key === 'Escape' && isOpen) {\n onClose();\n }\n }, [isOpen, onClose]);\n\n useEffect(() => {\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [handleKeyDown]);\n \n const isHeader = title || description || icon || header;\n const content = (\n <AnimatePresence>\n {isOpen && (\n <div className={cn(\"fixed inset-0 z-50 overflow-hidden\", zIndexClassName)}>\n <div className={cn(\"min-h-full flex items-center justify-center p-4\", mainClassName)}>\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n className=\"fixed inset-0 bg-background/80 backdrop-blur-sm\"\n onClick={onClose}\n />\n \n <motion.div\n initial={{ opacity: 0, scale: 0.95 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.95 }}\n transition={{ duration: 0.1, ease: \"easeOut\" }}\n className={cn(\n \"relative transform rounded-lg bg-background shadow-xl border border-border/50 flex flex-col max-h-[85vh] overflow-hidden\",\n className\n )}\n style={getSizeStyles(size)}\n >\n {/* Header - Fixed */}\n {isHeader && (\n <div className=\"flex-shrink-0 rounded-t-lg bg-card flex items-center justify-between p-2 border-b border-border/50\">\n \n {header ? header: (\n <div className=\"flex items-center gap-3\">\n {icon && (\n <div className=\"h-8 w-8 rounded-lg flex items-center justify-center\">\n {icon}\n </div>\n )}\n <div>\n {title && <h2 className=\"text-sm font-small\">{title}</h2>}\n {description && <p className=\"text-sm text-muted-foreground\">{description}</p>}\n </div>\n </div>\n )}\n {showClose && (\n <button\n onClick={onClose}\n className=\"p-1.5 rounded-md hover:bg-muted text-muted-foreground\"\n >\n <div className=\"flex justify-center items-center\">\n <X className=\"h-4 w-4\" />\n <kbd className=\"ml-2 text-[10px] text-muted-foreground bg-muted px-1.5 py-0.5 rounded\">\n ESC\n </kbd>\n </div>\n </button>\n )}\n </div>\n )}\n\n {/* Content - Scrollable */}\n <div className={cn(\n \"flex-1 min-h-0\", \n isContentScrollable ? 'overflow-y-auto' : '', \n !footer && !isHeader ? 'rounded-lg' : '',\n !footer && isHeader ? 'rounded-b-lg' : '', \n footer && !isHeader ? 'rounded-t-lg' : '',\n contentClassName \n )}>\n {children}\n </div>\n\n {/* Footer - Fixed */}\n {footer && (\n <div className=\"flex-shrink-0 flex items-center justify-end gap-2 px-4 py-3 border-t border-border/50 bg-card rounded-b-lg\">\n {footer}\n </div>\n )}\n </motion.div>\n </div>\n </div>\n )}\n </AnimatePresence>\n );\n\n return createPortal(content, document.body);\n}"],"names":["getSizeStyles","size","Modal","isOpen","onClose","title","description","icon","children","footer","showClose","className","isContentScrollable","mainClassName","contentClassName","header","zIndexClassName","handleKeyDown","useCallback","e","useEffect","isHeader","content","jsx","AnimatePresence","cn","jsxs","motion","X","createPortal"],"mappings":"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"}
|
|
@@ -10,30 +10,30 @@ function T({
|
|
|
10
10
|
isOpen: i,
|
|
11
11
|
onClose: n,
|
|
12
12
|
children: y,
|
|
13
|
-
header:
|
|
13
|
+
header: b,
|
|
14
14
|
footer: u,
|
|
15
|
-
className:
|
|
16
|
-
enableFullscreen:
|
|
15
|
+
className: g,
|
|
16
|
+
enableFullscreen: j = !0,
|
|
17
17
|
position: c = "right",
|
|
18
18
|
headerClassName: v = ""
|
|
19
19
|
}) {
|
|
20
|
-
const [
|
|
20
|
+
const [r, N] = B(!1), a = I(null);
|
|
21
21
|
if (d(() => (i ? s.push(a) : s = s.filter((t) => t !== a), () => {
|
|
22
22
|
s = s.filter((t) => t !== a);
|
|
23
23
|
}), [i]), d(() => {
|
|
24
|
-
const t = (
|
|
24
|
+
const t = (o) => {
|
|
25
25
|
var x;
|
|
26
26
|
const L = s.some(
|
|
27
|
-
(f) => f.current && f.current.contains(
|
|
28
|
-
), R = (x =
|
|
29
|
-
!L && !R && a.current && !a.current.contains(
|
|
27
|
+
(f) => f.current && f.current.contains(o.target)
|
|
28
|
+
), R = (x = o.target) == null ? void 0 : x.closest("[data-sheet-close]");
|
|
29
|
+
!L && !R && a.current && !a.current.contains(o.target) && n();
|
|
30
30
|
};
|
|
31
|
-
return i && !
|
|
31
|
+
return i && !r && document.addEventListener("mousedown", t), () => {
|
|
32
32
|
document.removeEventListener("mousedown", t);
|
|
33
33
|
};
|
|
34
|
-
}, [i,
|
|
35
|
-
const t = (
|
|
36
|
-
|
|
34
|
+
}, [i, r, n]), d(() => {
|
|
35
|
+
const t = (o) => {
|
|
36
|
+
o.key === "Escape" && i && s[s.length - 1] === a && n();
|
|
37
37
|
};
|
|
38
38
|
return document.addEventListener("keydown", t), () => document.removeEventListener("keydown", t);
|
|
39
39
|
}, [i, n]), !i) return null;
|
|
@@ -41,21 +41,21 @@ function T({
|
|
|
41
41
|
t.stopPropagation(), n();
|
|
42
42
|
}, w = /* @__PURE__ */ e.jsxs("div", { className: "flex flex-col h-full", children: [
|
|
43
43
|
/* @__PURE__ */ e.jsxs("div", { className: m(
|
|
44
|
-
"flex items-center justify-between py-4 px-4 h-header border-b",
|
|
44
|
+
"flex items-center justify-between py-4 px-4 h-header border-b border-border/50",
|
|
45
45
|
v
|
|
46
46
|
), children: [
|
|
47
|
-
/* @__PURE__ */ e.jsx("div", { className: "text-sm font-medium", children:
|
|
47
|
+
/* @__PURE__ */ e.jsx("div", { className: "text-sm font-medium", children: b }),
|
|
48
48
|
/* @__PURE__ */ e.jsxs("div", { className: "flex items-center gap-1 ml-auto", children: [
|
|
49
|
-
|
|
49
|
+
j && /* @__PURE__ */ e.jsx(
|
|
50
50
|
h,
|
|
51
51
|
{
|
|
52
52
|
variant: "ghost",
|
|
53
53
|
size: "icon",
|
|
54
54
|
className: "h-7 w-7",
|
|
55
55
|
onClick: (t) => {
|
|
56
|
-
t.stopPropagation(), N(!
|
|
56
|
+
t.stopPropagation(), N(!r);
|
|
57
57
|
},
|
|
58
|
-
children:
|
|
58
|
+
children: r ? /* @__PURE__ */ e.jsx(S, { className: "h-3.5 w-3.5" }) : /* @__PURE__ */ e.jsx(A, { className: "h-3.5 w-3.5" })
|
|
59
59
|
}
|
|
60
60
|
),
|
|
61
61
|
/* @__PURE__ */ e.jsx(
|
|
@@ -72,7 +72,7 @@ function T({
|
|
|
72
72
|
] })
|
|
73
73
|
] }),
|
|
74
74
|
/* @__PURE__ */ e.jsx("div", { className: "flex-1 overflow-auto", children: y }),
|
|
75
|
-
u && /* @__PURE__ */ e.jsx("div", { className: "border-t py-2 px-3", children: /* @__PURE__ */ e.jsx("div", { className: "text-sm", children: u }) })
|
|
75
|
+
u && /* @__PURE__ */ e.jsx("div", { className: "border-t border-border/50 py-2 px-3", children: /* @__PURE__ */ e.jsx("div", { className: "text-sm", children: u }) })
|
|
76
76
|
] }), E = () => c === "left" ? {
|
|
77
77
|
initial: { x: -100, opacity: 0 },
|
|
78
78
|
animate: { x: 0, opacity: 1 },
|
|
@@ -85,7 +85,7 @@ function T({
|
|
|
85
85
|
initial: { x: 100, opacity: 0 },
|
|
86
86
|
animate: { x: 0, opacity: 1 },
|
|
87
87
|
exit: { x: 100, opacity: 0 }
|
|
88
|
-
}, P = () =>
|
|
88
|
+
}, P = () => r ? "inset-4 rounded-lg" : c === "left" ? "inset-y-0 left-0 border-r" : c === "bottom" ? "inset-x-0 bottom-0 border-t" : "inset-y-0 right-0 border-l", l = E(), z = P(), C = /* @__PURE__ */ e.jsx(M, { children: i && /* @__PURE__ */ e.jsxs(e.Fragment, { children: [
|
|
89
89
|
/* @__PURE__ */ e.jsx(
|
|
90
90
|
p.div,
|
|
91
91
|
{
|
|
@@ -97,7 +97,7 @@ function T({
|
|
|
97
97
|
},
|
|
98
98
|
className: m(
|
|
99
99
|
"fixed inset-0 z-[100] bg-background/80 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
|
|
100
|
-
|
|
100
|
+
r ? "block" : "hidden"
|
|
101
101
|
)
|
|
102
102
|
}
|
|
103
103
|
),
|
|
@@ -113,9 +113,9 @@ function T({
|
|
|
113
113
|
ease: [0.32, 0.72, 0, 1]
|
|
114
114
|
},
|
|
115
115
|
className: m(
|
|
116
|
-
"fixed z-[100] bg-background shadow-lg flex flex-col",
|
|
116
|
+
"fixed z-[100] bg-background shadow-lg flex flex-col border-border/50",
|
|
117
117
|
z,
|
|
118
|
-
|
|
118
|
+
g
|
|
119
119
|
),
|
|
120
120
|
children: w
|
|
121
121
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sheet.esm.js","sources":["../../src/components/sheet.tsx"],"sourcesContent":["import { X, Maximize2, Minimize2 } from \"lucide-react\"\nimport { Button } from \"./button\"\nimport { useState, useRef, useEffect } from \"react\"\nimport { cn } from \"@/lib/utils\"\nimport { motion, AnimatePresence } from \"framer-motion\"\nimport { createPortal } from \"react-dom\"\n\ninterface SheetProps {\n isOpen: boolean\n onClose: () => void\n children: React.ReactNode\n header?: React.ReactNode\n footer?: React.ReactNode\n className?: string\n enableFullscreen?: boolean\n position?: 'left' | 'right' | 'bottom'\n headerClassName?: string\n}\n\n// Create a global registry of open sheets to prevent closing multiple sheets\nlet openSheetRefs: React.RefObject<HTMLDivElement>[] = [];\n\nexport function Sheet({ \n isOpen, \n onClose, \n children, \n header, \n footer, \n className, \n enableFullscreen = true,\n position = 'right',\n headerClassName = ''\n}: SheetProps) {\n const [isFullscreen, setIsFullscreen] = useState(false)\n const sheetRef = useRef<HTMLDivElement>(null)\n\n // When the sheet opens, add its ref to the registry\n useEffect(() => {\n if (isOpen) {\n openSheetRefs.push(sheetRef);\n } else {\n // Remove the ref when sheet closes\n openSheetRefs = openSheetRefs.filter(ref => ref !== sheetRef);\n }\n \n return () => {\n // Cleanup when component unmounts\n openSheetRefs = openSheetRefs.filter(ref => ref !== sheetRef);\n };\n }, [isOpen]);\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n // If we clicked inside any open sheet, don't close any sheets\n const clickedInsideAnySheet = openSheetRefs.some(ref => \n ref.current && ref.current.contains(event.target as Node)\n );\n\n // Check if clicked on the close button\n const isCloseButton = (event.target as Element)?.closest('[data-sheet-close]');\n \n // Only close if not clicked inside any sheet and not clicking a close button\n if (!clickedInsideAnySheet && !isCloseButton && sheetRef.current && !sheetRef.current.contains(event.target as Node)) {\n onClose();\n }\n }\n\n if (isOpen && !isFullscreen) {\n document.addEventListener('mousedown', handleClickOutside)\n }\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [isOpen, isFullscreen, onClose])\n\n useEffect(() => {\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && isOpen) {\n // Only close the topmost sheet (last one in the registry)\n if (openSheetRefs[openSheetRefs.length - 1] === sheetRef) {\n onClose();\n }\n }\n }\n\n document.addEventListener('keydown', handleEscape)\n return () => document.removeEventListener('keydown', handleEscape)\n }, [isOpen, onClose])\n\n if (!isOpen) return null\n\n const handleCloseClick = (e: React.MouseEvent) => {\n e.stopPropagation(); // Prevent event from bubbling to parent sheets\n onClose();\n };\n\n const content = (\n <div className=\"flex flex-col h-full\">\n <div className={cn(\n \"flex items-center justify-between py-4 px-4 h-header border-b\",\n headerClassName\n )}>\n <div className=\"text-sm font-medium\">{header}</div>\n <div className=\"flex items-center gap-1 ml-auto\">\n {enableFullscreen && (\n <Button \n variant=\"ghost\" \n size=\"icon\" \n className=\"h-7 w-7\"\n onClick={(e) => {\n e.stopPropagation();\n setIsFullscreen(!isFullscreen);\n }}\n >\n {isFullscreen ? (\n <Minimize2 className=\"h-3.5 w-3.5\" />\n ) : (\n <Maximize2 className=\"h-3.5 w-3.5\" />\n )}\n </Button>\n )}\n <Button \n variant=\"ghost\" \n size=\"icon\" \n className=\"h-7 w-7\"\n onClick={handleCloseClick}\n data-sheet-close=\"true\"\n >\n <X className=\"h-3.5 w-3.5\" />\n </Button>\n </div>\n </div>\n\n <div className=\"flex-1 overflow-auto\">\n {children}\n </div>\n\n {footer && (\n <div className=\"border-t py-2 px-3\">\n <div className=\"text-sm\">{footer}</div>\n </div>\n )}\n </div>\n )\n\n // Determine animation properties based on position\n const getAnimationProps = () => {\n if (position === 'left') {\n return {\n initial: { x: -100, opacity: 0 },\n animate: { x: 0, opacity: 1 },\n exit: { x: -100, opacity: 0 },\n }\n } else if (position === 'bottom') {\n return {\n initial: { y: 100, opacity: 0 },\n animate: { y: 0, opacity: 1 },\n exit: { y: 100, opacity: 0 },\n }\n } else { // right (default)\n return {\n initial: { x: 100, opacity: 0 },\n animate: { x: 0, opacity: 1 },\n exit: { x: 100, opacity: 0 },\n }\n }\n }\n\n // Determine position classes based on position\n const getPositionClasses = () => {\n if (isFullscreen) {\n return \"inset-4 rounded-lg\"\n } else if (position === 'left') {\n return \"inset-y-0 left-0 border-r\"\n } else if (position === 'bottom') {\n return \"inset-x-0 bottom-0 border-t\"\n } else { // right (default)\n return \"inset-y-0 right-0 border-l\"\n }\n }\n\n const animationProps = getAnimationProps()\n const positionClasses = getPositionClasses()\n\n const sheetContent = (\n <AnimatePresence>\n {isOpen && (\n <>\n {/* Backdrop */}\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n onClick={(e) => {\n e.stopPropagation();\n onClose();\n }}\n className={cn(\n \"fixed inset-0 z-[100] bg-background/80 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n isFullscreen ? \"block\" : \"hidden\"\n )}\n />\n\n {/* Sheet/Modal */}\n <motion.div\n ref={sheetRef}\n initial={animationProps.initial}\n animate={animationProps.animate}\n exit={animationProps.exit}\n transition={{ \n duration: 0.3,\n ease: [0.32, 0.72, 0, 1]\n }}\n className={cn(\n \"fixed z-[100] bg-background shadow-lg flex flex-col\",\n positionClasses,\n className\n )}\n >\n {content}\n </motion.div>\n </>\n )}\n </AnimatePresence>\n )\n\n return createPortal(sheetContent, document.body)\n} "],"names":["openSheetRefs","Sheet","isOpen","onClose","children","header","footer","className","enableFullscreen","position","headerClassName","isFullscreen","setIsFullscreen","useState","sheetRef","useRef","useEffect","ref","handleClickOutside","event","clickedInsideAnySheet","isCloseButton","_a","handleEscape","handleCloseClick","e","content","jsxs","cn","jsx","Button","Minimize2","Maximize2","X","getAnimationProps","getPositionClasses","animationProps","positionClasses","sheetContent","AnimatePresence","Fragment","motion","createPortal"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sheet.esm.js","sources":["../../src/components/sheet.tsx"],"sourcesContent":["import { X, Maximize2, Minimize2 } from \"lucide-react\"\nimport { Button } from \"./button\"\nimport { useState, useRef, useEffect } from \"react\"\nimport { cn } from \"@/lib/utils\"\nimport { motion, AnimatePresence } from \"framer-motion\"\nimport { createPortal } from \"react-dom\"\n\ninterface SheetProps {\n isOpen: boolean\n onClose: () => void\n children: React.ReactNode\n header?: React.ReactNode\n footer?: React.ReactNode\n className?: string\n enableFullscreen?: boolean\n position?: 'left' | 'right' | 'bottom'\n headerClassName?: string\n}\n\n// Create a global registry of open sheets to prevent closing multiple sheets\nlet openSheetRefs: React.RefObject<HTMLDivElement>[] = [];\n\nexport function Sheet({ \n isOpen, \n onClose, \n children, \n header, \n footer, \n className, \n enableFullscreen = true,\n position = 'right',\n headerClassName = ''\n}: SheetProps) {\n const [isFullscreen, setIsFullscreen] = useState(false)\n const sheetRef = useRef<HTMLDivElement>(null)\n\n // When the sheet opens, add its ref to the registry\n useEffect(() => {\n if (isOpen) {\n openSheetRefs.push(sheetRef);\n } else {\n // Remove the ref when sheet closes\n openSheetRefs = openSheetRefs.filter(ref => ref !== sheetRef);\n }\n \n return () => {\n // Cleanup when component unmounts\n openSheetRefs = openSheetRefs.filter(ref => ref !== sheetRef);\n };\n }, [isOpen]);\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n // If we clicked inside any open sheet, don't close any sheets\n const clickedInsideAnySheet = openSheetRefs.some(ref => \n ref.current && ref.current.contains(event.target as Node)\n );\n\n // Check if clicked on the close button\n const isCloseButton = (event.target as Element)?.closest('[data-sheet-close]');\n \n // Only close if not clicked inside any sheet and not clicking a close button\n if (!clickedInsideAnySheet && !isCloseButton && sheetRef.current && !sheetRef.current.contains(event.target as Node)) {\n onClose();\n }\n }\n\n if (isOpen && !isFullscreen) {\n document.addEventListener('mousedown', handleClickOutside)\n }\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [isOpen, isFullscreen, onClose])\n\n useEffect(() => {\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && isOpen) {\n // Only close the topmost sheet (last one in the registry)\n if (openSheetRefs[openSheetRefs.length - 1] === sheetRef) {\n onClose();\n }\n }\n }\n\n document.addEventListener('keydown', handleEscape)\n return () => document.removeEventListener('keydown', handleEscape)\n }, [isOpen, onClose])\n\n if (!isOpen) return null\n\n const handleCloseClick = (e: React.MouseEvent) => {\n e.stopPropagation(); // Prevent event from bubbling to parent sheets\n onClose();\n };\n\n const content = (\n <div className=\"flex flex-col h-full\">\n <div className={cn(\n \"flex items-center justify-between py-4 px-4 h-header border-b border-border/50\",\n headerClassName\n )}>\n <div className=\"text-sm font-medium\">{header}</div>\n <div className=\"flex items-center gap-1 ml-auto\">\n {enableFullscreen && (\n <Button \n variant=\"ghost\" \n size=\"icon\" \n className=\"h-7 w-7\"\n onClick={(e) => {\n e.stopPropagation();\n setIsFullscreen(!isFullscreen);\n }}\n >\n {isFullscreen ? (\n <Minimize2 className=\"h-3.5 w-3.5\" />\n ) : (\n <Maximize2 className=\"h-3.5 w-3.5\" />\n )}\n </Button>\n )}\n <Button \n variant=\"ghost\" \n size=\"icon\" \n className=\"h-7 w-7\"\n onClick={handleCloseClick}\n data-sheet-close=\"true\"\n >\n <X className=\"h-3.5 w-3.5\" />\n </Button>\n </div>\n </div>\n\n <div className=\"flex-1 overflow-auto\">\n {children}\n </div>\n\n {footer && (\n <div className=\"border-t border-border/50 py-2 px-3\">\n <div className=\"text-sm\">{footer}</div>\n </div>\n )}\n </div>\n )\n\n // Determine animation properties based on position\n const getAnimationProps = () => {\n if (position === 'left') {\n return {\n initial: { x: -100, opacity: 0 },\n animate: { x: 0, opacity: 1 },\n exit: { x: -100, opacity: 0 },\n }\n } else if (position === 'bottom') {\n return {\n initial: { y: 100, opacity: 0 },\n animate: { y: 0, opacity: 1 },\n exit: { y: 100, opacity: 0 },\n }\n } else { // right (default)\n return {\n initial: { x: 100, opacity: 0 },\n animate: { x: 0, opacity: 1 },\n exit: { x: 100, opacity: 0 },\n }\n }\n }\n\n // Determine position classes based on position\n const getPositionClasses = () => {\n if (isFullscreen) {\n return \"inset-4 rounded-lg\"\n } else if (position === 'left') {\n return \"inset-y-0 left-0 border-r\"\n } else if (position === 'bottom') {\n return \"inset-x-0 bottom-0 border-t\"\n } else { // right (default)\n return \"inset-y-0 right-0 border-l\"\n }\n }\n\n const animationProps = getAnimationProps()\n const positionClasses = getPositionClasses()\n\n const sheetContent = (\n <AnimatePresence>\n {isOpen && (\n <>\n {/* Backdrop */}\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n onClick={(e) => {\n e.stopPropagation();\n onClose();\n }}\n className={cn(\n \"fixed inset-0 z-[100] bg-background/80 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n isFullscreen ? \"block\" : \"hidden\"\n )}\n />\n\n {/* Sheet/Modal */}\n <motion.div\n ref={sheetRef}\n initial={animationProps.initial}\n animate={animationProps.animate}\n exit={animationProps.exit}\n transition={{ \n duration: 0.3,\n ease: [0.32, 0.72, 0, 1]\n }}\n className={cn(\n \"fixed z-[100] bg-background shadow-lg flex flex-col border-border/50\",\n positionClasses,\n className\n )}\n >\n {content}\n </motion.div>\n </>\n )}\n </AnimatePresence>\n )\n\n return createPortal(sheetContent, document.body)\n} "],"names":["openSheetRefs","Sheet","isOpen","onClose","children","header","footer","className","enableFullscreen","position","headerClassName","isFullscreen","setIsFullscreen","useState","sheetRef","useRef","useEffect","ref","handleClickOutside","event","clickedInsideAnySheet","isCloseButton","_a","handleEscape","handleCloseClick","e","content","jsxs","cn","jsx","Button","Minimize2","Maximize2","X","getAnimationProps","getPositionClasses","animationProps","positionClasses","sheetContent","AnimatePresence","Fragment","motion","createPortal"],"mappings":"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"}
|
package/dist/components/sheet.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../jsx-runtime-BYECrxsp.cjs"),x=require("lucide-react"),j=require("./button.js"),c=require("react"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../jsx-runtime-BYECrxsp.cjs"),x=require("lucide-react"),j=require("./button.js"),c=require("react"),d=require("../utils-DSKoFOjv.cjs"),m=require("framer-motion"),L=require("react-dom");let i=[];function M({isOpen:s,onClose:r,children:b,header:y,footer:f,className:E,enableFullscreen:g=!0,position:l="right",headerClassName:R=""}){const[o,v]=c.useState(!1),n=c.useRef(null);if(c.useEffect(()=>(s?i.push(n):i=i.filter(t=>t!==n),()=>{i=i.filter(t=>t!==n)}),[s]),c.useEffect(()=>{const t=a=>{var p;const z=i.some(h=>h.current&&h.current.contains(a.target)),C=(p=a.target)==null?void 0:p.closest("[data-sheet-close]");!z&&!C&&n.current&&!n.current.contains(a.target)&&r()};return s&&!o&&document.addEventListener("mousedown",t),()=>{document.removeEventListener("mousedown",t)}},[s,o,r]),c.useEffect(()=>{const t=a=>{a.key==="Escape"&&s&&i[i.length-1]===n&&r()};return document.addEventListener("keydown",t),()=>document.removeEventListener("keydown",t)},[s,r]),!s)return null;const N=t=>{t.stopPropagation(),r()},k=e.jsxRuntimeExports.jsxs("div",{className:"flex flex-col h-full",children:[e.jsxRuntimeExports.jsxs("div",{className:d.cn("flex items-center justify-between py-4 px-4 h-header border-b border-border/50",R),children:[e.jsxRuntimeExports.jsx("div",{className:"text-sm font-medium",children:y}),e.jsxRuntimeExports.jsxs("div",{className:"flex items-center gap-1 ml-auto",children:[g&&e.jsxRuntimeExports.jsx(j.Button,{variant:"ghost",size:"icon",className:"h-7 w-7",onClick:t=>{t.stopPropagation(),v(!o)},children:o?e.jsxRuntimeExports.jsx(x.Minimize2,{className:"h-3.5 w-3.5"}):e.jsxRuntimeExports.jsx(x.Maximize2,{className:"h-3.5 w-3.5"})}),e.jsxRuntimeExports.jsx(j.Button,{variant:"ghost",size:"icon",className:"h-7 w-7",onClick:N,"data-sheet-close":"true",children:e.jsxRuntimeExports.jsx(x.X,{className:"h-3.5 w-3.5"})})]})]}),e.jsxRuntimeExports.jsx("div",{className:"flex-1 overflow-auto",children:b}),f&&e.jsxRuntimeExports.jsx("div",{className:"border-t border-border/50 py-2 px-3",children:e.jsxRuntimeExports.jsx("div",{className:"text-sm",children:f})})]}),w=()=>l==="left"?{initial:{x:-100,opacity:0},animate:{x:0,opacity:1},exit:{x:-100,opacity:0}}:l==="bottom"?{initial:{y:100,opacity:0},animate:{y:0,opacity:1},exit:{y:100,opacity:0}}:{initial:{x:100,opacity:0},animate:{x:0,opacity:1},exit:{x:100,opacity:0}},P=()=>o?"inset-4 rounded-lg":l==="left"?"inset-y-0 left-0 border-r":l==="bottom"?"inset-x-0 bottom-0 border-t":"inset-y-0 right-0 border-l",u=w(),q=P(),S=e.jsxRuntimeExports.jsx(m.AnimatePresence,{children:s&&e.jsxRuntimeExports.jsxs(e.jsxRuntimeExports.Fragment,{children:[e.jsxRuntimeExports.jsx(m.motion.div,{initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},onClick:t=>{t.stopPropagation(),r()},className:d.cn("fixed inset-0 z-[100] bg-background/80 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",o?"block":"hidden")}),e.jsxRuntimeExports.jsx(m.motion.div,{ref:n,initial:u.initial,animate:u.animate,exit:u.exit,transition:{duration:.3,ease:[.32,.72,0,1]},className:d.cn("fixed z-[100] bg-background shadow-lg flex flex-col border-border/50",q,E),children:k})]})});return L.createPortal(S,document.body)}exports.Sheet=M;
|
|
2
2
|
//# sourceMappingURL=sheet.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sheet.js","sources":["../../src/components/sheet.tsx"],"sourcesContent":["import { X, Maximize2, Minimize2 } from \"lucide-react\"\nimport { Button } from \"./button\"\nimport { useState, useRef, useEffect } from \"react\"\nimport { cn } from \"@/lib/utils\"\nimport { motion, AnimatePresence } from \"framer-motion\"\nimport { createPortal } from \"react-dom\"\n\ninterface SheetProps {\n isOpen: boolean\n onClose: () => void\n children: React.ReactNode\n header?: React.ReactNode\n footer?: React.ReactNode\n className?: string\n enableFullscreen?: boolean\n position?: 'left' | 'right' | 'bottom'\n headerClassName?: string\n}\n\n// Create a global registry of open sheets to prevent closing multiple sheets\nlet openSheetRefs: React.RefObject<HTMLDivElement>[] = [];\n\nexport function Sheet({ \n isOpen, \n onClose, \n children, \n header, \n footer, \n className, \n enableFullscreen = true,\n position = 'right',\n headerClassName = ''\n}: SheetProps) {\n const [isFullscreen, setIsFullscreen] = useState(false)\n const sheetRef = useRef<HTMLDivElement>(null)\n\n // When the sheet opens, add its ref to the registry\n useEffect(() => {\n if (isOpen) {\n openSheetRefs.push(sheetRef);\n } else {\n // Remove the ref when sheet closes\n openSheetRefs = openSheetRefs.filter(ref => ref !== sheetRef);\n }\n \n return () => {\n // Cleanup when component unmounts\n openSheetRefs = openSheetRefs.filter(ref => ref !== sheetRef);\n };\n }, [isOpen]);\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n // If we clicked inside any open sheet, don't close any sheets\n const clickedInsideAnySheet = openSheetRefs.some(ref => \n ref.current && ref.current.contains(event.target as Node)\n );\n\n // Check if clicked on the close button\n const isCloseButton = (event.target as Element)?.closest('[data-sheet-close]');\n \n // Only close if not clicked inside any sheet and not clicking a close button\n if (!clickedInsideAnySheet && !isCloseButton && sheetRef.current && !sheetRef.current.contains(event.target as Node)) {\n onClose();\n }\n }\n\n if (isOpen && !isFullscreen) {\n document.addEventListener('mousedown', handleClickOutside)\n }\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [isOpen, isFullscreen, onClose])\n\n useEffect(() => {\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && isOpen) {\n // Only close the topmost sheet (last one in the registry)\n if (openSheetRefs[openSheetRefs.length - 1] === sheetRef) {\n onClose();\n }\n }\n }\n\n document.addEventListener('keydown', handleEscape)\n return () => document.removeEventListener('keydown', handleEscape)\n }, [isOpen, onClose])\n\n if (!isOpen) return null\n\n const handleCloseClick = (e: React.MouseEvent) => {\n e.stopPropagation(); // Prevent event from bubbling to parent sheets\n onClose();\n };\n\n const content = (\n <div className=\"flex flex-col h-full\">\n <div className={cn(\n \"flex items-center justify-between py-4 px-4 h-header border-b\",\n headerClassName\n )}>\n <div className=\"text-sm font-medium\">{header}</div>\n <div className=\"flex items-center gap-1 ml-auto\">\n {enableFullscreen && (\n <Button \n variant=\"ghost\" \n size=\"icon\" \n className=\"h-7 w-7\"\n onClick={(e) => {\n e.stopPropagation();\n setIsFullscreen(!isFullscreen);\n }}\n >\n {isFullscreen ? (\n <Minimize2 className=\"h-3.5 w-3.5\" />\n ) : (\n <Maximize2 className=\"h-3.5 w-3.5\" />\n )}\n </Button>\n )}\n <Button \n variant=\"ghost\" \n size=\"icon\" \n className=\"h-7 w-7\"\n onClick={handleCloseClick}\n data-sheet-close=\"true\"\n >\n <X className=\"h-3.5 w-3.5\" />\n </Button>\n </div>\n </div>\n\n <div className=\"flex-1 overflow-auto\">\n {children}\n </div>\n\n {footer && (\n <div className=\"border-t py-2 px-3\">\n <div className=\"text-sm\">{footer}</div>\n </div>\n )}\n </div>\n )\n\n // Determine animation properties based on position\n const getAnimationProps = () => {\n if (position === 'left') {\n return {\n initial: { x: -100, opacity: 0 },\n animate: { x: 0, opacity: 1 },\n exit: { x: -100, opacity: 0 },\n }\n } else if (position === 'bottom') {\n return {\n initial: { y: 100, opacity: 0 },\n animate: { y: 0, opacity: 1 },\n exit: { y: 100, opacity: 0 },\n }\n } else { // right (default)\n return {\n initial: { x: 100, opacity: 0 },\n animate: { x: 0, opacity: 1 },\n exit: { x: 100, opacity: 0 },\n }\n }\n }\n\n // Determine position classes based on position\n const getPositionClasses = () => {\n if (isFullscreen) {\n return \"inset-4 rounded-lg\"\n } else if (position === 'left') {\n return \"inset-y-0 left-0 border-r\"\n } else if (position === 'bottom') {\n return \"inset-x-0 bottom-0 border-t\"\n } else { // right (default)\n return \"inset-y-0 right-0 border-l\"\n }\n }\n\n const animationProps = getAnimationProps()\n const positionClasses = getPositionClasses()\n\n const sheetContent = (\n <AnimatePresence>\n {isOpen && (\n <>\n {/* Backdrop */}\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n onClick={(e) => {\n e.stopPropagation();\n onClose();\n }}\n className={cn(\n \"fixed inset-0 z-[100] bg-background/80 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n isFullscreen ? \"block\" : \"hidden\"\n )}\n />\n\n {/* Sheet/Modal */}\n <motion.div\n ref={sheetRef}\n initial={animationProps.initial}\n animate={animationProps.animate}\n exit={animationProps.exit}\n transition={{ \n duration: 0.3,\n ease: [0.32, 0.72, 0, 1]\n }}\n className={cn(\n \"fixed z-[100] bg-background shadow-lg flex flex-col\",\n positionClasses,\n className\n )}\n >\n {content}\n </motion.div>\n </>\n )}\n </AnimatePresence>\n )\n\n return createPortal(sheetContent, document.body)\n} "],"names":["openSheetRefs","Sheet","isOpen","onClose","children","header","footer","className","enableFullscreen","position","headerClassName","isFullscreen","setIsFullscreen","useState","sheetRef","useRef","useEffect","ref","handleClickOutside","event","clickedInsideAnySheet","isCloseButton","_a","handleEscape","handleCloseClick","e","content","jsxs","cn","jsx","Button","Minimize2","Maximize2","X","getAnimationProps","getPositionClasses","animationProps","positionClasses","sheetContent","AnimatePresence","Fragment","motion","createPortal"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sheet.js","sources":["../../src/components/sheet.tsx"],"sourcesContent":["import { X, Maximize2, Minimize2 } from \"lucide-react\"\nimport { Button } from \"./button\"\nimport { useState, useRef, useEffect } from \"react\"\nimport { cn } from \"@/lib/utils\"\nimport { motion, AnimatePresence } from \"framer-motion\"\nimport { createPortal } from \"react-dom\"\n\ninterface SheetProps {\n isOpen: boolean\n onClose: () => void\n children: React.ReactNode\n header?: React.ReactNode\n footer?: React.ReactNode\n className?: string\n enableFullscreen?: boolean\n position?: 'left' | 'right' | 'bottom'\n headerClassName?: string\n}\n\n// Create a global registry of open sheets to prevent closing multiple sheets\nlet openSheetRefs: React.RefObject<HTMLDivElement>[] = [];\n\nexport function Sheet({ \n isOpen, \n onClose, \n children, \n header, \n footer, \n className, \n enableFullscreen = true,\n position = 'right',\n headerClassName = ''\n}: SheetProps) {\n const [isFullscreen, setIsFullscreen] = useState(false)\n const sheetRef = useRef<HTMLDivElement>(null)\n\n // When the sheet opens, add its ref to the registry\n useEffect(() => {\n if (isOpen) {\n openSheetRefs.push(sheetRef);\n } else {\n // Remove the ref when sheet closes\n openSheetRefs = openSheetRefs.filter(ref => ref !== sheetRef);\n }\n \n return () => {\n // Cleanup when component unmounts\n openSheetRefs = openSheetRefs.filter(ref => ref !== sheetRef);\n };\n }, [isOpen]);\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n // If we clicked inside any open sheet, don't close any sheets\n const clickedInsideAnySheet = openSheetRefs.some(ref => \n ref.current && ref.current.contains(event.target as Node)\n );\n\n // Check if clicked on the close button\n const isCloseButton = (event.target as Element)?.closest('[data-sheet-close]');\n \n // Only close if not clicked inside any sheet and not clicking a close button\n if (!clickedInsideAnySheet && !isCloseButton && sheetRef.current && !sheetRef.current.contains(event.target as Node)) {\n onClose();\n }\n }\n\n if (isOpen && !isFullscreen) {\n document.addEventListener('mousedown', handleClickOutside)\n }\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [isOpen, isFullscreen, onClose])\n\n useEffect(() => {\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && isOpen) {\n // Only close the topmost sheet (last one in the registry)\n if (openSheetRefs[openSheetRefs.length - 1] === sheetRef) {\n onClose();\n }\n }\n }\n\n document.addEventListener('keydown', handleEscape)\n return () => document.removeEventListener('keydown', handleEscape)\n }, [isOpen, onClose])\n\n if (!isOpen) return null\n\n const handleCloseClick = (e: React.MouseEvent) => {\n e.stopPropagation(); // Prevent event from bubbling to parent sheets\n onClose();\n };\n\n const content = (\n <div className=\"flex flex-col h-full\">\n <div className={cn(\n \"flex items-center justify-between py-4 px-4 h-header border-b border-border/50\",\n headerClassName\n )}>\n <div className=\"text-sm font-medium\">{header}</div>\n <div className=\"flex items-center gap-1 ml-auto\">\n {enableFullscreen && (\n <Button \n variant=\"ghost\" \n size=\"icon\" \n className=\"h-7 w-7\"\n onClick={(e) => {\n e.stopPropagation();\n setIsFullscreen(!isFullscreen);\n }}\n >\n {isFullscreen ? (\n <Minimize2 className=\"h-3.5 w-3.5\" />\n ) : (\n <Maximize2 className=\"h-3.5 w-3.5\" />\n )}\n </Button>\n )}\n <Button \n variant=\"ghost\" \n size=\"icon\" \n className=\"h-7 w-7\"\n onClick={handleCloseClick}\n data-sheet-close=\"true\"\n >\n <X className=\"h-3.5 w-3.5\" />\n </Button>\n </div>\n </div>\n\n <div className=\"flex-1 overflow-auto\">\n {children}\n </div>\n\n {footer && (\n <div className=\"border-t border-border/50 py-2 px-3\">\n <div className=\"text-sm\">{footer}</div>\n </div>\n )}\n </div>\n )\n\n // Determine animation properties based on position\n const getAnimationProps = () => {\n if (position === 'left') {\n return {\n initial: { x: -100, opacity: 0 },\n animate: { x: 0, opacity: 1 },\n exit: { x: -100, opacity: 0 },\n }\n } else if (position === 'bottom') {\n return {\n initial: { y: 100, opacity: 0 },\n animate: { y: 0, opacity: 1 },\n exit: { y: 100, opacity: 0 },\n }\n } else { // right (default)\n return {\n initial: { x: 100, opacity: 0 },\n animate: { x: 0, opacity: 1 },\n exit: { x: 100, opacity: 0 },\n }\n }\n }\n\n // Determine position classes based on position\n const getPositionClasses = () => {\n if (isFullscreen) {\n return \"inset-4 rounded-lg\"\n } else if (position === 'left') {\n return \"inset-y-0 left-0 border-r\"\n } else if (position === 'bottom') {\n return \"inset-x-0 bottom-0 border-t\"\n } else { // right (default)\n return \"inset-y-0 right-0 border-l\"\n }\n }\n\n const animationProps = getAnimationProps()\n const positionClasses = getPositionClasses()\n\n const sheetContent = (\n <AnimatePresence>\n {isOpen && (\n <>\n {/* Backdrop */}\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n onClick={(e) => {\n e.stopPropagation();\n onClose();\n }}\n className={cn(\n \"fixed inset-0 z-[100] bg-background/80 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n isFullscreen ? \"block\" : \"hidden\"\n )}\n />\n\n {/* Sheet/Modal */}\n <motion.div\n ref={sheetRef}\n initial={animationProps.initial}\n animate={animationProps.animate}\n exit={animationProps.exit}\n transition={{ \n duration: 0.3,\n ease: [0.32, 0.72, 0, 1]\n }}\n className={cn(\n \"fixed z-[100] bg-background shadow-lg flex flex-col border-border/50\",\n positionClasses,\n className\n )}\n >\n {content}\n </motion.div>\n </>\n )}\n </AnimatePresence>\n )\n\n return createPortal(sheetContent, document.body)\n} "],"names":["openSheetRefs","Sheet","isOpen","onClose","children","header","footer","className","enableFullscreen","position","headerClassName","isFullscreen","setIsFullscreen","useState","sheetRef","useRef","useEffect","ref","handleClickOutside","event","clickedInsideAnySheet","isCloseButton","_a","handleEscape","handleCloseClick","e","content","jsxs","cn","jsx","Button","Minimize2","Maximize2","X","getAnimationProps","getPositionClasses","animationProps","positionClasses","sheetContent","AnimatePresence","Fragment","motion","createPortal"],"mappings":"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"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { j as
|
|
2
|
-
import { AnimatePresence as
|
|
3
|
-
import { c as
|
|
4
|
-
function
|
|
5
|
-
return /* @__PURE__ */
|
|
6
|
-
|
|
1
|
+
import { j as r } from "../jsx-runtime-DGlMoOmv.js";
|
|
2
|
+
import { AnimatePresence as n, motion as c } from "framer-motion";
|
|
3
|
+
import { c as i } from "../utils-qaFjX9_3.js";
|
|
4
|
+
function b({ content: t, side: o = "right", align: e = "center", isVisible: s }) {
|
|
5
|
+
return /* @__PURE__ */ r.jsx(n, { children: s && /* @__PURE__ */ r.jsx(
|
|
6
|
+
c.div,
|
|
7
7
|
{
|
|
8
8
|
initial: {
|
|
9
9
|
opacity: 0,
|
|
10
|
-
...
|
|
10
|
+
...a(o)
|
|
11
11
|
},
|
|
12
12
|
animate: {
|
|
13
13
|
opacity: 1,
|
|
@@ -16,30 +16,19 @@ function h({ content: t, side: e = "right", align: r = "center", isVisible: l })
|
|
|
16
16
|
},
|
|
17
17
|
exit: {
|
|
18
18
|
opacity: 0,
|
|
19
|
-
...
|
|
19
|
+
...a(o)
|
|
20
20
|
},
|
|
21
21
|
transition: { duration: 0.15, ease: "easeOut" },
|
|
22
|
-
className:
|
|
22
|
+
className: i(
|
|
23
23
|
"absolute z-[100] px-2.5 py-1.5 rounded-md text-xs font-medium whitespace-nowrap",
|
|
24
|
-
"bg-background border border-border shadow-lg",
|
|
25
|
-
|
|
24
|
+
"bg-background border border-border/50 shadow-lg",
|
|
25
|
+
p(o, e)
|
|
26
26
|
),
|
|
27
|
-
children:
|
|
28
|
-
t,
|
|
29
|
-
/* @__PURE__ */ o.jsx(
|
|
30
|
-
a.div,
|
|
31
|
-
{
|
|
32
|
-
className: s(
|
|
33
|
-
"absolute w-1.5 h-1.5 rotate-45 bg-background border border-border",
|
|
34
|
-
p(e)
|
|
35
|
-
)
|
|
36
|
-
}
|
|
37
|
-
)
|
|
38
|
-
]
|
|
27
|
+
children: t
|
|
39
28
|
}
|
|
40
29
|
) });
|
|
41
30
|
}
|
|
42
|
-
const
|
|
31
|
+
const a = (t) => {
|
|
43
32
|
switch (t) {
|
|
44
33
|
case "right":
|
|
45
34
|
return { x: -5 };
|
|
@@ -52,49 +41,36 @@ const n = (t) => {
|
|
|
52
41
|
default:
|
|
53
42
|
return { x: 0, y: 0 };
|
|
54
43
|
}
|
|
55
|
-
},
|
|
56
|
-
const
|
|
44
|
+
}, p = (t, o) => {
|
|
45
|
+
const e = [];
|
|
57
46
|
switch (t) {
|
|
58
47
|
case "right":
|
|
59
|
-
|
|
48
|
+
e.push("left-full ml-2");
|
|
60
49
|
break;
|
|
61
50
|
case "left":
|
|
62
|
-
|
|
51
|
+
e.push("right-full mr-2");
|
|
63
52
|
break;
|
|
64
53
|
case "top":
|
|
65
|
-
|
|
54
|
+
e.push("bottom-full mb-2");
|
|
66
55
|
break;
|
|
67
56
|
case "bottom":
|
|
68
|
-
|
|
57
|
+
e.push("top-full mt-2");
|
|
69
58
|
break;
|
|
70
59
|
}
|
|
71
|
-
switch (
|
|
60
|
+
switch (o) {
|
|
72
61
|
case "start":
|
|
73
|
-
|
|
62
|
+
e.push(t === "top" || t === "bottom" ? "left-0" : "top-0");
|
|
74
63
|
break;
|
|
75
64
|
case "center":
|
|
76
|
-
|
|
65
|
+
e.push(t === "top" || t === "bottom" ? "left-1/2 -translate-x-1/2" : "top-1/2 -translate-y-1/2");
|
|
77
66
|
break;
|
|
78
67
|
case "end":
|
|
79
|
-
|
|
68
|
+
e.push(t === "top" || t === "bottom" ? "right-0" : "bottom-0");
|
|
80
69
|
break;
|
|
81
70
|
}
|
|
82
|
-
return
|
|
83
|
-
}, p = (t) => {
|
|
84
|
-
switch (t) {
|
|
85
|
-
case "right":
|
|
86
|
-
return "-left-[4px] top-1/2 -translate-y-1/2 border-r-0 border-t-0";
|
|
87
|
-
case "left":
|
|
88
|
-
return "-right-[4px] top-1/2 -translate-y-1/2 border-l-0 border-b-0";
|
|
89
|
-
case "top":
|
|
90
|
-
return "-bottom-[4px] left-1/2 -translate-x-1/2 border-l-0 border-t-0";
|
|
91
|
-
case "bottom":
|
|
92
|
-
return "-top-[4px] left-1/2 -translate-x-1/2 border-r-0 border-b-0";
|
|
93
|
-
default:
|
|
94
|
-
return "";
|
|
95
|
-
}
|
|
71
|
+
return e.join(" ");
|
|
96
72
|
};
|
|
97
73
|
export {
|
|
98
|
-
|
|
74
|
+
b as Tooltip
|
|
99
75
|
};
|
|
100
76
|
//# sourceMappingURL=tooltip.esm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tooltip.esm.js","sources":["../../src/components/tooltip.tsx"],"sourcesContent":["import { motion, AnimatePresence } from 'framer-motion';\nimport { cn } from '@/lib/utils';\n\ninterface TooltipProps {\n content: string | React.ReactNode;\n side?: 'left' | 'right' | 'top' | 'bottom';\n align?: 'start' | 'center' | 'end';\n isVisible: boolean;\n}\n\nexport function Tooltip({ content, side = 'right', align = 'center', isVisible }: TooltipProps) {\n return (\n <AnimatePresence>\n {isVisible && (\n <motion.div\n initial={{ \n opacity: 0, \n ...getInitialPosition(side)\n }}\n animate={{ \n opacity: 1, \n x: 0,\n y: 0 \n }}\n exit={{ \n opacity: 0, \n ...getInitialPosition(side)\n }}\n transition={{ duration: 0.15, ease: 'easeOut' }}\n className={cn(\n 'absolute z-[100] px-2.5 py-1.5 rounded-md text-xs font-medium whitespace-nowrap',\n 'bg-background border border-border shadow-lg',\n getPositionClasses(side, align)\n )}\n >\n {content}\n
|
|
1
|
+
{"version":3,"file":"tooltip.esm.js","sources":["../../src/components/tooltip.tsx"],"sourcesContent":["import { motion, AnimatePresence } from 'framer-motion';\nimport { cn } from '@/lib/utils';\n\ninterface TooltipProps {\n content: string | React.ReactNode;\n side?: 'left' | 'right' | 'top' | 'bottom';\n align?: 'start' | 'center' | 'end';\n isVisible: boolean;\n}\n\nexport function Tooltip({ content, side = 'right', align = 'center', isVisible }: TooltipProps) {\n return (\n <AnimatePresence>\n {isVisible && (\n <motion.div\n initial={{ \n opacity: 0, \n ...getInitialPosition(side)\n }}\n animate={{ \n opacity: 1, \n x: 0,\n y: 0 \n }}\n exit={{ \n opacity: 0, \n ...getInitialPosition(side)\n }}\n transition={{ duration: 0.15, ease: 'easeOut' }}\n className={cn(\n 'absolute z-[100] px-2.5 py-1.5 rounded-md text-xs font-medium whitespace-nowrap',\n 'bg-background border border-border/50 shadow-lg',\n getPositionClasses(side, align)\n )}\n >\n {content}\n </motion.div>\n )}\n </AnimatePresence>\n );\n}\n\nconst getInitialPosition = (side: string) => {\n switch (side) {\n case 'right':\n return { x: -5 };\n case 'left':\n return { x: 5 };\n case 'top':\n return { y: 5 };\n case 'bottom':\n return { y: -5 };\n default:\n return { x: 0, y: 0 };\n }\n};\n\nconst getPositionClasses = (side: string, align: string) => {\n const baseClasses = [];\n\n switch (side) {\n case 'right':\n baseClasses.push('left-full ml-2');\n break;\n case 'left':\n baseClasses.push('right-full mr-2');\n break;\n case 'top':\n baseClasses.push('bottom-full mb-2');\n break;\n case 'bottom':\n baseClasses.push('top-full mt-2');\n break;\n }\n\n switch (align) {\n case 'start':\n baseClasses.push((side === 'top' || side === 'bottom') ? 'left-0' : 'top-0');\n break;\n case 'center':\n baseClasses.push((side === 'top' || side === 'bottom') ? 'left-1/2 -translate-x-1/2' : 'top-1/2 -translate-y-1/2');\n break;\n case 'end':\n baseClasses.push((side === 'top' || side === 'bottom') ? 'right-0' : 'bottom-0');\n break;\n }\n\n return baseClasses.join(' ');\n};\n"],"names":["Tooltip","content","side","align","isVisible","jsx","AnimatePresence","motion","getInitialPosition","cn","getPositionClasses","baseClasses"],"mappings":";;;AAUO,SAASA,EAAQ,EAAE,SAAAC,GAAS,MAAAC,IAAO,SAAS,OAAAC,IAAQ,UAAU,WAAAC,KAA2B;AAC9F,SACEC,gBAAAA,EAAAA,IAACC,KACE,UAAAF,KACCC,gBAAAA,EAAAA;AAAAA,IAACE,EAAO;AAAA,IAAP;AAAA,MACC,SAAS;AAAA,QACP,SAAS;AAAA,QACT,GAAGC,EAAmBN,CAAI;AAAA,MAAA;AAAA,MAE5B,SAAS;AAAA,QACP,SAAS;AAAA,QACT,GAAG;AAAA,QACH,GAAG;AAAA,MAAA;AAAA,MAEL,MAAM;AAAA,QACJ,SAAS;AAAA,QACT,GAAGM,EAAmBN,CAAI;AAAA,MAAA;AAAA,MAE5B,YAAY,EAAE,UAAU,MAAM,MAAM,UAAA;AAAA,MACpC,WAAWO;AAAA,QACT;AAAA,QACA;AAAA,QACAC,EAAmBR,GAAMC,CAAK;AAAA,MAAA;AAAA,MAG/B,UAAAF;AAAA,IAAA;AAAA,EAAA,GAGP;AAEJ;AAEA,MAAMO,IAAqB,CAACN,MAAiB;AAC3C,UAAQA,GAAA;AAAA,IACN,KAAK;AACH,aAAO,EAAE,GAAG,GAAA;AAAA,IACd,KAAK;AACH,aAAO,EAAE,GAAG,EAAA;AAAA,IACd,KAAK;AACH,aAAO,EAAE,GAAG,EAAA;AAAA,IACd,KAAK;AACH,aAAO,EAAE,GAAG,GAAA;AAAA,IACd;AACE,aAAO,EAAE,GAAG,GAAG,GAAG,EAAA;AAAA,EAAE;AAE1B,GAEMQ,IAAqB,CAACR,GAAcC,MAAkB;AAC1D,QAAMQ,IAAc,CAAA;AAEpB,UAAQT,GAAA;AAAA,IACN,KAAK;AACH,MAAAS,EAAY,KAAK,gBAAgB;AACjC;AAAA,IACF,KAAK;AACH,MAAAA,EAAY,KAAK,iBAAiB;AAClC;AAAA,IACF,KAAK;AACH,MAAAA,EAAY,KAAK,kBAAkB;AACnC;AAAA,IACF,KAAK;AACH,MAAAA,EAAY,KAAK,eAAe;AAChC;AAAA,EAAA;AAGJ,UAAQR,GAAA;AAAA,IACN,KAAK;AACH,MAAAQ,EAAY,KAAMT,MAAS,SAASA,MAAS,WAAY,WAAW,OAAO;AAC3E;AAAA,IACF,KAAK;AACH,MAAAS,EAAY,KAAMT,MAAS,SAASA,MAAS,WAAY,8BAA8B,0BAA0B;AACjH;AAAA,IACF,KAAK;AACH,MAAAS,EAAY,KAAMT,MAAS,SAASA,MAAS,WAAY,YAAY,UAAU;AAC/E;AAAA,EAAA;AAGJ,SAAOS,EAAY,KAAK,GAAG;AAC7B;"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("../jsx-runtime-BYECrxsp.cjs"),s=require("framer-motion"),i=require("../utils-DSKoFOjv.cjs");function u({content:t,side:o="right",align:e="center",isVisible:n}){return r.jsxRuntimeExports.jsx(s.AnimatePresence,{children:n&&r.jsxRuntimeExports.jsx(s.motion.div,{initial:{opacity:0,...a(o)},animate:{opacity:1,x:0,y:0},exit:{opacity:0,...a(o)},transition:{duration:.15,ease:"easeOut"},className:i.cn("absolute z-[100] px-2.5 py-1.5 rounded-md text-xs font-medium whitespace-nowrap","bg-background border border-border/50 shadow-lg",c(o,e)),children:t})})}const a=t=>{switch(t){case"right":return{x:-5};case"left":return{x:5};case"top":return{y:5};case"bottom":return{y:-5};default:return{x:0,y:0}}},c=(t,o)=>{const e=[];switch(t){case"right":e.push("left-full ml-2");break;case"left":e.push("right-full mr-2");break;case"top":e.push("bottom-full mb-2");break;case"bottom":e.push("top-full mt-2");break}switch(o){case"start":e.push(t==="top"||t==="bottom"?"left-0":"top-0");break;case"center":e.push(t==="top"||t==="bottom"?"left-1/2 -translate-x-1/2":"top-1/2 -translate-y-1/2");break;case"end":e.push(t==="top"||t==="bottom"?"right-0":"bottom-0");break}return e.join(" ")};exports.Tooltip=u;
|
|
2
2
|
//# sourceMappingURL=tooltip.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tooltip.js","sources":["../../src/components/tooltip.tsx"],"sourcesContent":["import { motion, AnimatePresence } from 'framer-motion';\nimport { cn } from '@/lib/utils';\n\ninterface TooltipProps {\n content: string | React.ReactNode;\n side?: 'left' | 'right' | 'top' | 'bottom';\n align?: 'start' | 'center' | 'end';\n isVisible: boolean;\n}\n\nexport function Tooltip({ content, side = 'right', align = 'center', isVisible }: TooltipProps) {\n return (\n <AnimatePresence>\n {isVisible && (\n <motion.div\n initial={{ \n opacity: 0, \n ...getInitialPosition(side)\n }}\n animate={{ \n opacity: 1, \n x: 0,\n y: 0 \n }}\n exit={{ \n opacity: 0, \n ...getInitialPosition(side)\n }}\n transition={{ duration: 0.15, ease: 'easeOut' }}\n className={cn(\n 'absolute z-[100] px-2.5 py-1.5 rounded-md text-xs font-medium whitespace-nowrap',\n 'bg-background border border-border shadow-lg',\n getPositionClasses(side, align)\n )}\n >\n {content}\n
|
|
1
|
+
{"version":3,"file":"tooltip.js","sources":["../../src/components/tooltip.tsx"],"sourcesContent":["import { motion, AnimatePresence } from 'framer-motion';\nimport { cn } from '@/lib/utils';\n\ninterface TooltipProps {\n content: string | React.ReactNode;\n side?: 'left' | 'right' | 'top' | 'bottom';\n align?: 'start' | 'center' | 'end';\n isVisible: boolean;\n}\n\nexport function Tooltip({ content, side = 'right', align = 'center', isVisible }: TooltipProps) {\n return (\n <AnimatePresence>\n {isVisible && (\n <motion.div\n initial={{ \n opacity: 0, \n ...getInitialPosition(side)\n }}\n animate={{ \n opacity: 1, \n x: 0,\n y: 0 \n }}\n exit={{ \n opacity: 0, \n ...getInitialPosition(side)\n }}\n transition={{ duration: 0.15, ease: 'easeOut' }}\n className={cn(\n 'absolute z-[100] px-2.5 py-1.5 rounded-md text-xs font-medium whitespace-nowrap',\n 'bg-background border border-border/50 shadow-lg',\n getPositionClasses(side, align)\n )}\n >\n {content}\n </motion.div>\n )}\n </AnimatePresence>\n );\n}\n\nconst getInitialPosition = (side: string) => {\n switch (side) {\n case 'right':\n return { x: -5 };\n case 'left':\n return { x: 5 };\n case 'top':\n return { y: 5 };\n case 'bottom':\n return { y: -5 };\n default:\n return { x: 0, y: 0 };\n }\n};\n\nconst getPositionClasses = (side: string, align: string) => {\n const baseClasses = [];\n\n switch (side) {\n case 'right':\n baseClasses.push('left-full ml-2');\n break;\n case 'left':\n baseClasses.push('right-full mr-2');\n break;\n case 'top':\n baseClasses.push('bottom-full mb-2');\n break;\n case 'bottom':\n baseClasses.push('top-full mt-2');\n break;\n }\n\n switch (align) {\n case 'start':\n baseClasses.push((side === 'top' || side === 'bottom') ? 'left-0' : 'top-0');\n break;\n case 'center':\n baseClasses.push((side === 'top' || side === 'bottom') ? 'left-1/2 -translate-x-1/2' : 'top-1/2 -translate-y-1/2');\n break;\n case 'end':\n baseClasses.push((side === 'top' || side === 'bottom') ? 'right-0' : 'bottom-0');\n break;\n }\n\n return baseClasses.join(' ');\n};\n"],"names":["Tooltip","content","side","align","isVisible","jsx","AnimatePresence","motion","getInitialPosition","cn","getPositionClasses","baseClasses"],"mappings":"6LAUO,SAASA,EAAQ,CAAE,QAAAC,EAAS,KAAAC,EAAO,QAAS,MAAAC,EAAQ,SAAU,UAAAC,GAA2B,CAC9F,OACEC,EAAAA,kBAAAA,IAACC,EAAAA,iBACE,SAAAF,GACCC,EAAAA,kBAAAA,IAACE,EAAAA,OAAO,IAAP,CACC,QAAS,CACP,QAAS,EACT,GAAGC,EAAmBN,CAAI,CAAA,EAE5B,QAAS,CACP,QAAS,EACT,EAAG,EACH,EAAG,CAAA,EAEL,KAAM,CACJ,QAAS,EACT,GAAGM,EAAmBN,CAAI,CAAA,EAE5B,WAAY,CAAE,SAAU,IAAM,KAAM,SAAA,EACpC,UAAWO,EAAAA,GACT,kFACA,kDACAC,EAAmBR,EAAMC,CAAK,CAAA,EAG/B,SAAAF,CAAA,CAAA,EAGP,CAEJ,CAEA,MAAMO,EAAsBN,GAAiB,CAC3C,OAAQA,EAAA,CACN,IAAK,QACH,MAAO,CAAE,EAAG,EAAA,EACd,IAAK,OACH,MAAO,CAAE,EAAG,CAAA,EACd,IAAK,MACH,MAAO,CAAE,EAAG,CAAA,EACd,IAAK,SACH,MAAO,CAAE,EAAG,EAAA,EACd,QACE,MAAO,CAAE,EAAG,EAAG,EAAG,CAAA,CAAE,CAE1B,EAEMQ,EAAqB,CAACR,EAAcC,IAAkB,CAC1D,MAAMQ,EAAc,CAAA,EAEpB,OAAQT,EAAA,CACN,IAAK,QACHS,EAAY,KAAK,gBAAgB,EACjC,MACF,IAAK,OACHA,EAAY,KAAK,iBAAiB,EAClC,MACF,IAAK,MACHA,EAAY,KAAK,kBAAkB,EACnC,MACF,IAAK,SACHA,EAAY,KAAK,eAAe,EAChC,KAAA,CAGJ,OAAQR,EAAA,CACN,IAAK,QACHQ,EAAY,KAAMT,IAAS,OAASA,IAAS,SAAY,SAAW,OAAO,EAC3E,MACF,IAAK,SACHS,EAAY,KAAMT,IAAS,OAASA,IAAS,SAAY,4BAA8B,0BAA0B,EACjH,MACF,IAAK,MACHS,EAAY,KAAMT,IAAS,OAASA,IAAS,SAAY,UAAY,UAAU,EAC/E,KAAA,CAGJ,OAAOS,EAAY,KAAK,GAAG,CAC7B"}
|
package/dist/styles.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root{--background: 0 0% 100%;--foreground: 0 0% 0%;--card: 0 0% 100%;--card-foreground: 0 0% 0%;--popover: 0 0% 100%;--popover-foreground: 0 0% 0%;--primary: 0 0% 0%;--primary-foreground: 0 0% 100%;--secondary: 0 0% 95%;--secondary-foreground: 0 0% 0%;--muted: 0 0% 95%;--muted-foreground: 0 0% 35%;--accent: 0 0% 92%;--accent-foreground: 0 0% 0%;--destructive: 0 84% 60%;--destructive-foreground: 0 0% 100%;--border: 0 0% 85%;--input: 0 0% 90%;--ring: 0 0% 0%;--radius: .5rem}.dark{--background: 0 0% 10%;--foreground: 0 0% 98%;--card: 0 0% 10%;--card-foreground: 0 0% 98%;--popover: 0 0% 10%;--popover-foreground: 0 0% 98%;--primary: 270 64% 50%;--primary-foreground: 0 0% 100%;--secondary: 270 40% 15%;--secondary-foreground: 0 0% 98%;--muted: 0 0% 15%;--muted-foreground: 0 0% 65%;--accent: 270 40% 20%;--accent-foreground: 270 64% 80%;--destructive: 0 62% 30%;--destructive-foreground: 0 0% 98%;--border: 0 0% 15%;--input: 0 0% 15%;--ring: 270 64% 50%}*{border-color:hsl(var(--border))}body{background-color:hsl(var(--background));color:hsl(var(--foreground));font-family:Inter,sans-serif;font-feature-settings:"rlig" 1,"calt" 1;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.container{width:100%}@media (min-width: 640px){.container{max-width:640px}}@media (min-width: 768px){.container{max-width:768px}}@media (min-width: 1024px){.container{max-width:1024px}}@media (min-width: 1280px){.container{max-width:1280px}}@media (min-width: 1536px){.container{max-width:1536px}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-4{top:1rem;right:1rem;bottom:1rem;left:1rem}.inset-x-0{left:0;right:0}.inset-y-0{top:0;bottom:0}.-bottom-2\.5{bottom:-.625rem}.-bottom-\[4px\]{bottom:-4px}.-left-2\.5{left:-.625rem}.-left-\[4px\]{left:-4px}.-right-1{right:-.25rem}.-right-2\.5{right:-.625rem}.-right-\[4px\]{right:-4px}.-top-1{top:-.25rem}.-top-2\.5{top:-.625rem}.-top-\[26px\]{top:-26px}.-top-\[4px\]{top:-4px}.bottom-0{bottom:0}.bottom-2{bottom:.5rem}.bottom-20{bottom:5rem}.bottom-4{bottom:1rem}.bottom-8{bottom:2rem}.bottom-full{bottom:100%}.left-0{left:0}.left-1\/2{left:50%}.left-2{left:.5rem}.left-2\.5{left:.625rem}.left-8{left:2rem}.left-\[15px\]{left:15px}.left-\[50\%\]{left:50%}.left-full{left:100%}.right-0{right:0}.right-2{right:.5rem}.right-2\.5{right:.625rem}.right-4{right:1rem}.right-full{right:100%}.top-0{top:0}.top-1\/2{top:50%}.top-2\.5{top:.625rem}.top-4{top:1rem}.top-\[50\%\]{top:50%}.top-full{top:100%}.z-10{z-index:10}.z-50{z-index:50}.z-\[1000\]{z-index:1000}.z-\[100\]{z-index:100}.z-\[50\]{z-index:50}.z-\[60\]{z-index:60}.z-\[9999\]{z-index:9999}.col-span-2{grid-column:span 2 / span 2}.col-span-3{grid-column:span 3 / span 3}.-mx-1{margin-left:-.25rem;margin-right:-.25rem}.-mx-4{margin-left:-1rem;margin-right:-1rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-auto{margin-left:auto;margin-right:auto}.my-1{margin-top:.25rem;margin-bottom:.25rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.my-3{margin-top:.75rem;margin-bottom:.75rem}.my-4{margin-top:1rem;margin-bottom:1rem}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-3{margin-left:.75rem}.ml-auto{margin-left:auto}.mr-1{margin-right:.25rem}.mr-1\.5{margin-right:.375rem}.mr-2{margin-right:.5rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-8{margin-top:2rem}.block{display:block}.inline-block{display:inline-block}.\!inline{display:inline!important}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.contents{display:contents}.hidden{display:none}.aspect-square{aspect-ratio:1 / 1}.h-0\.5{height:.125rem}.h-1{height:.25rem}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-16{height:4rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-24{height:6rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-32{height:8rem}.h-4{height:1rem}.h-40{height:10rem}.h-48{height:12rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-64{height:16rem}.h-7{height:1.75rem}.h-72{height:18rem}.h-8{height:2rem}.h-80{height:20rem}.h-9{height:2.25rem}.h-96{height:24rem}.h-\[150px\]{height:150px}.h-\[1px\]{height:1px}.h-\[200px\]{height:200px}.h-\[24px\]{height:24px}.h-\[30px\]{height:30px}.h-\[400px\]{height:400px}.h-\[500px\]{height:500px}.h-\[80vh\]{height:80vh}.h-\[calc\(100vh-\$\{tableHeight\}\)\]{height:calc(100vh - ${tableHeight})}.h-\[calc\(100vh-12rem\)\]{height:calc(100vh - 12rem)}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.h-full{height:100%}.h-px{height:1px}.h-scroll-xl{height:calc(100vh - 15rem)}.max-h-96{max-height:24rem}.max-h-\[300px\]{max-height:300px}.max-h-\[85vh\]{max-height:85vh}.max-h-\[calc\(100vh-10rem\)\]{max-height:calc(100vh - 10rem)}.min-h-0{min-height:0px}.min-h-\[100px\]{min-height:100px}.min-h-\[120px\]{min-height:120px}.min-h-\[200px\]{min-height:200px}.min-h-\[80px\]{min-height:80px}.min-h-full{min-height:100%}.w-1{width:.25rem}.w-1\.5{width:.375rem}.w-1\/2{width:50%}.w-1\/3{width:33.333333%}.w-1\/4{width:25%}.w-10{width:2.5rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-2\/3{width:66.666667%}.w-2\/5{width:40%}.w-20{width:5rem}.w-24{width:6rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-3\/4{width:75%}.w-3\/5{width:60%}.w-32{width:8rem}.w-4{width:1rem}.w-4\/5{width:80%}.w-40{width:10rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-56{width:14rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-7{width:1.75rem}.w-72{width:18rem}.w-8{width:2rem}.w-80{width:20rem}.w-9{width:2.25rem}.w-96{width:24rem}.w-\[180px\]{width:180px}.w-\[1px\]{width:1px}.w-\[200px\]{width:200px}.w-\[220px\]{width:220px}.w-\[2px\]{width:2px}.w-\[300px\]{width:300px}.w-\[30px\]{width:30px}.w-\[350px\]{width:350px}.w-\[380px\]{width:380px}.w-\[400px\]{width:400px}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.w-max{width:-moz-max-content;width:max-content}.w-px{width:1px}.min-w-0{min-width:0px}.min-w-\[120px\]{min-width:120px}.min-w-\[220px\]{min-width:220px}.min-w-\[80px\]{min-width:80px}.min-w-\[8rem\]{min-width:8rem}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.max-w-2xl{max-width:42rem}.max-w-4xl{max-width:56rem}.max-w-\[200px\]{max-width:200px}.max-w-\[220px\]{max-width:220px}.max-w-\[250px\]{max-width:250px}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-sm{max-width:24rem}.flex-1{flex:1 1 0%}.flex-none{flex:none}.flex-shrink-0,.shrink-0{flex-shrink:0}.grow{flex-grow:1}.border-collapse{border-collapse:collapse}.origin-top{transform-origin:top}.-translate-x-1\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-\[-50\%\]{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-1{--tw-translate-y: .25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-\[-50\%\]{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-45{--tw-rotate: 45deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-default{cursor:default}.cursor-move{cursor:move}.cursor-ne-resize{cursor:ne-resize}.cursor-not-allowed{cursor:not-allowed}.cursor-nw-resize{cursor:nw-resize}.cursor-pointer{cursor:pointer}.cursor-se-resize{cursor:se-resize}.cursor-sw-resize{cursor:sw-resize}.touch-none{touch-action:none}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize-none{resize:none}.resize{resize:both}.list-inside{list-style-position:inside}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.grid-cols-\[25px_1fr\]{grid-template-columns:25px 1fr}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.25rem * var(--tw-space-x-reverse));margin-left:calc(.25rem * calc(1 - var(--tw-space-x-reverse)))}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.75rem * var(--tw-space-x-reverse));margin-left:calc(.75rem * calc(1 - var(--tw-space-x-reverse)))}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(1rem * var(--tw-space-x-reverse));margin-left:calc(1rem * calc(1 - var(--tw-space-x-reverse)))}.space-x-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(1.5rem * var(--tw-space-x-reverse));margin-left:calc(1.5rem * calc(1 - var(--tw-space-x-reverse)))}.space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(0px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px * var(--tw-space-y-reverse))}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-12>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(3rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(3rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(2rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-border\/30>:not([hidden])~:not([hidden]){border-color:hsl(var(--border) / .3)}.self-start{align-self:flex-start}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.rounded{border-radius:.25rem}.rounded-\[inherit\]{border-radius:inherit}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.rounded-xl{border-radius:.75rem}.rounded-r-md{border-top-right-radius:calc(var(--radius) - 2px);border-bottom-right-radius:calc(var(--radius) - 2px)}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-b-0{border-bottom-width:0px}.border-l{border-left-width:1px}.border-l-0{border-left-width:0px}.border-l-4{border-left-width:4px}.border-r{border-right-width:1px}.border-r-0{border-right-width:0px}.border-t{border-top-width:1px}.border-t-0{border-top-width:0px}.border-dashed{border-style:dashed}.border-amber-200{--tw-border-opacity: 1;border-color:rgb(253 230 138 / var(--tw-border-opacity, 1))}.border-blue-200{--tw-border-opacity: 1;border-color:rgb(191 219 254 / var(--tw-border-opacity, 1))}.border-border{border-color:hsl(var(--border))}.border-border\/30{border-color:hsl(var(--border) / .3)}.border-border\/40{border-color:hsl(var(--border) / .4)}.border-border\/50{border-color:hsl(var(--border) / .5)}.border-current{border-color:currentColor}.border-destructive{border-color:hsl(var(--destructive))}.border-destructive\/50{border-color:hsl(var(--destructive) / .5)}.border-green-200{--tw-border-opacity: 1;border-color:rgb(187 247 208 / var(--tw-border-opacity, 1))}.border-input{border-color:hsl(var(--input))}.border-muted{border-color:hsl(var(--muted))}.border-muted-foreground\/25{border-color:hsl(var(--muted-foreground) / .25)}.border-muted-foreground\/30{border-color:hsl(var(--muted-foreground) / .3)}.border-primary{border-color:hsl(var(--primary))}.border-primary\/20{border-color:hsl(var(--primary) / .2)}.border-primary\/30{border-color:hsl(var(--primary) / .3)}.border-primary\/50{border-color:hsl(var(--primary) / .5)}.border-purple-200{--tw-border-opacity: 1;border-color:rgb(233 213 255 / var(--tw-border-opacity, 1))}.border-red-200{--tw-border-opacity: 1;border-color:rgb(254 202 202 / var(--tw-border-opacity, 1))}.border-slate-200{--tw-border-opacity: 1;border-color:rgb(226 232 240 / var(--tw-border-opacity, 1))}.border-slate-700{--tw-border-opacity: 1;border-color:rgb(51 65 85 / var(--tw-border-opacity, 1))}.border-transparent{border-color:transparent}.border-white{--tw-border-opacity: 1;border-color:rgb(255 255 255 / var(--tw-border-opacity, 1))}.border-yellow-200{--tw-border-opacity: 1;border-color:rgb(254 240 138 / var(--tw-border-opacity, 1))}.border-l-transparent{border-left-color:transparent}.border-t-transparent{border-top-color:transparent}.bg-accent{background-color:hsl(var(--accent))}.bg-accent\/30{background-color:hsl(var(--accent) / .3)}.bg-amber-50{--tw-bg-opacity: 1;background-color:rgb(255 251 235 / var(--tw-bg-opacity, 1))}.bg-background{background-color:hsl(var(--background))}.bg-background\/80{background-color:hsl(var(--background) / .8)}.bg-background\/90{background-color:hsl(var(--background) / .9)}.bg-black{--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity, 1))}.bg-black\/50{background-color:#00000080}.bg-blue-50{--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1))}.bg-blue-50\/50{background-color:#eff6ff80}.bg-border{background-color:hsl(var(--border))}.bg-border\/40{background-color:hsl(var(--border) / .4)}.bg-card{background-color:hsl(var(--card))}.bg-card\/30{background-color:hsl(var(--card) / .3)}.bg-destructive{background-color:hsl(var(--destructive))}.bg-foreground{background-color:hsl(var(--foreground))}.bg-foreground\/30{background-color:hsl(var(--foreground) / .3)}.bg-gray-100{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.bg-gray-900{--tw-bg-opacity: 1;background-color:rgb(17 24 39 / var(--tw-bg-opacity, 1))}.bg-green-100{--tw-bg-opacity: 1;background-color:rgb(220 252 231 / var(--tw-bg-opacity, 1))}.bg-green-50{--tw-bg-opacity: 1;background-color:rgb(240 253 244 / var(--tw-bg-opacity, 1))}.bg-green-600{--tw-bg-opacity: 1;background-color:rgb(22 163 74 / var(--tw-bg-opacity, 1))}.bg-muted{background-color:hsl(var(--muted))}.bg-muted\/20{background-color:hsl(var(--muted) / .2)}.bg-muted\/30{background-color:hsl(var(--muted) / .3)}.bg-muted\/40{background-color:hsl(var(--muted) / .4)}.bg-muted\/5{background-color:hsl(var(--muted) / .05)}.bg-muted\/50{background-color:hsl(var(--muted) / .5)}.bg-muted\/60{background-color:hsl(var(--muted) / .6)}.bg-muted\/70{background-color:hsl(var(--muted) / .7)}.bg-popover{background-color:hsl(var(--popover))}.bg-primary{background-color:hsl(var(--primary))}.bg-primary\/10{background-color:hsl(var(--primary) / .1)}.bg-primary\/20{background-color:hsl(var(--primary) / .2)}.bg-primary\/5{background-color:hsl(var(--primary) / .05)}.bg-primary\/60{background-color:hsl(var(--primary) / .6)}.bg-primary\/80{background-color:hsl(var(--primary) / .8)}.bg-red-100{--tw-bg-opacity: 1;background-color:rgb(254 226 226 / var(--tw-bg-opacity, 1))}.bg-red-50{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.bg-red-500{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.bg-secondary{background-color:hsl(var(--secondary))}.bg-sky-500{--tw-bg-opacity: 1;background-color:rgb(14 165 233 / var(--tw-bg-opacity, 1))}.bg-slate-100{--tw-bg-opacity: 1;background-color:rgb(241 245 249 / var(--tw-bg-opacity, 1))}.bg-slate-800{--tw-bg-opacity: 1;background-color:rgb(30 41 59 / var(--tw-bg-opacity, 1))}.bg-slate-900{--tw-bg-opacity: 1;background-color:rgb(15 23 42 / var(--tw-bg-opacity, 1))}.bg-slate-950{--tw-bg-opacity: 1;background-color:rgb(2 6 23 / var(--tw-bg-opacity, 1))}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-yellow-50{--tw-bg-opacity: 1;background-color:rgb(254 252 232 / var(--tw-bg-opacity, 1))}.bg-yellow-600{--tw-bg-opacity: 1;background-color:rgb(202 138 4 / var(--tw-bg-opacity, 1))}.bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--tw-gradient-stops))}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.from-muted\/30{--tw-gradient-from: hsl(var(--muted) / .3) var(--tw-gradient-from-position);--tw-gradient-to: hsl(var(--muted) / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-primary\/20{--tw-gradient-from: hsl(var(--primary) / .2) var(--tw-gradient-from-position);--tw-gradient-to: hsl(var(--primary) / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-purple-50{--tw-gradient-from: #faf5ff var(--tw-gradient-from-position);--tw-gradient-to: rgb(250 245 255 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.to-muted\/60{--tw-gradient-to: hsl(var(--muted) / .6) var(--tw-gradient-to-position)}.to-pink-50{--tw-gradient-to: #fdf2f8 var(--tw-gradient-to-position)}.fill-current{fill:currentColor}.fill-yellow-400{fill:#facc15}.object-cover{-o-object-fit:cover;object-fit:cover}.p-0{padding:0}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.p-\[1px\]{padding:1px}.px-0{padding-left:0;padding-right:0}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-0{padding-bottom:0}.pb-2{padding-bottom:.5rem}.pb-4{padding-bottom:1rem}.pl-3{padding-left:.75rem}.pl-4{padding-left:1rem}.pl-5{padding-left:1.25rem}.pl-7{padding-left:1.75rem}.pl-8{padding-left:2rem}.pr-2{padding-right:.5rem}.pt-0{padding-top:0}.pt-0\.5{padding-top:.125rem}.pt-2{padding-top:.5rem}.pt-4{padding-top:1rem}.pt-6{padding-top:1.5rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.italic{font-style:italic}.leading-6{line-height:1.5rem}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.tracking-tight{letter-spacing:-.025em}.tracking-wide{letter-spacing:.025em}.text-accent-foreground{color:hsl(var(--accent-foreground))}.text-amber-500{--tw-text-opacity: 1;color:rgb(245 158 11 / var(--tw-text-opacity, 1))}.text-amber-700{--tw-text-opacity: 1;color:rgb(180 83 9 / var(--tw-text-opacity, 1))}.text-amber-800{--tw-text-opacity: 1;color:rgb(146 64 14 / var(--tw-text-opacity, 1))}.text-blue-500{--tw-text-opacity: 1;color:rgb(59 130 246 / var(--tw-text-opacity, 1))}.text-blue-700{--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity, 1))}.text-blue-800{--tw-text-opacity: 1;color:rgb(30 64 175 / var(--tw-text-opacity, 1))}.text-card-foreground{color:hsl(var(--card-foreground))}.text-current{color:currentColor}.text-destructive{color:hsl(var(--destructive))}.text-destructive-foreground{color:hsl(var(--destructive-foreground))}.text-foreground{color:hsl(var(--foreground))}.text-foreground\/90{color:hsl(var(--foreground) / .9)}.text-gray-300{--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}.text-gray-500{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.text-gray-900{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.text-green-400{--tw-text-opacity: 1;color:rgb(74 222 128 / var(--tw-text-opacity, 1))}.text-green-500{--tw-text-opacity: 1;color:rgb(34 197 94 / var(--tw-text-opacity, 1))}.text-green-800{--tw-text-opacity: 1;color:rgb(22 101 52 / var(--tw-text-opacity, 1))}.text-muted-foreground{color:hsl(var(--muted-foreground))}.text-muted-foreground\/50{color:hsl(var(--muted-foreground) / .5)}.text-muted-foreground\/80{color:hsl(var(--muted-foreground) / .8)}.text-muted-foreground\/90{color:hsl(var(--muted-foreground) / .9)}.text-popover-foreground{color:hsl(var(--popover-foreground))}.text-primary{color:hsl(var(--primary))}.text-primary-foreground{color:hsl(var(--primary-foreground))}.text-primary\/70{color:hsl(var(--primary) / .7)}.text-purple-800{--tw-text-opacity: 1;color:rgb(107 33 168 / var(--tw-text-opacity, 1))}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.text-red-800{--tw-text-opacity: 1;color:rgb(153 27 27 / var(--tw-text-opacity, 1))}.text-secondary-foreground{color:hsl(var(--secondary-foreground))}.text-slate-200{--tw-text-opacity: 1;color:rgb(226 232 240 / var(--tw-text-opacity, 1))}.text-slate-50{--tw-text-opacity: 1;color:rgb(248 250 252 / var(--tw-text-opacity, 1))}.text-slate-800{--tw-text-opacity: 1;color:rgb(30 41 59 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-yellow-400{--tw-text-opacity: 1;color:rgb(250 204 21 / var(--tw-text-opacity, 1))}.text-yellow-500{--tw-text-opacity: 1;color:rgb(234 179 8 / var(--tw-text-opacity, 1))}.text-yellow-600{--tw-text-opacity: 1;color:rgb(202 138 4 / var(--tw-text-opacity, 1))}.text-yellow-800{--tw-text-opacity: 1;color:rgb(133 77 14 / var(--tw-text-opacity, 1))}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-70{opacity:.7}.opacity-80{opacity:.8}.shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-primary\/20{--tw-shadow-color: hsl(var(--primary) / .2);--tw-shadow: var(--tw-shadow-colored)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.ring-0{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-offset-background{--tw-ring-offset-color: hsl(var(--background))}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-150{transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.prose{color:hsl(var(--foreground));max-width:none}.prose pre{background-color:hsl(var(--muted))}.prose code{background-color:hsl(var(--muted));color:hsl(var(--foreground))}.prose img{border-radius:var(--radius);margin:0!important}.prose a{color:hsl(var(--primary));text-decoration-line:none}.prose a:hover{color:hsl(var(--primary) / .9)}.prose strong{font-weight:600;color:hsl(var(--foreground))}.prose blockquote{margin-top:1rem;margin-bottom:1rem;border-left-width:4px;border-color:hsl(var(--border));background-color:hsl(var(--muted) / .5);padding:.25rem 1rem}.prose ul{margin-top:1rem;margin-bottom:1rem;list-style-position:inside;list-style-type:disc}.prose ul>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.prose ul *::marker{color:hsl(var(--muted-foreground))}.prose ul::marker{color:hsl(var(--muted-foreground))}.prose ol{margin-top:1rem;margin-bottom:1rem;list-style-position:inside;list-style-type:decimal}.prose ol>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.prose ol *::marker{color:hsl(var(--muted-foreground))}.prose ol::marker{color:hsl(var(--muted-foreground))}.prose table{margin-top:1rem;margin-bottom:1rem;width:100%;border-collapse:collapse}.prose th{border-width:1px;border-color:hsl(var(--border));background-color:hsl(var(--muted));padding:.5rem 1rem;text-align:left;font-weight:500}.prose td{border-width:1px;border-color:hsl(var(--border));padding:.5rem 1rem}.prose hr{margin-top:2rem;margin-bottom:2rem;border-color:hsl(var(--border))}.prose h1,.prose h2,.prose h3,.prose h4{margin-top:2rem;margin-bottom:1rem;font-weight:600;color:hsl(var(--foreground))}.prose h1{font-size:1.5rem;line-height:2rem}.prose h2{font-size:1.25rem;line-height:1.75rem}.prose h3{font-size:1.125rem;line-height:1.75rem}.prose h4{font-size:1rem;line-height:1.5rem}.prose>:first-child{margin-top:0!important}.prose>:last-child{margin-bottom:0!important}.file\:border-0::file-selector-button{border-width:0px}.file\:bg-transparent::file-selector-button{background-color:transparent}.file\:text-sm::file-selector-button{font-size:.875rem;line-height:1.25rem}.file\:font-medium::file-selector-button{font-weight:500}.placeholder\:text-muted-foreground::-moz-placeholder{color:hsl(var(--muted-foreground))}.placeholder\:text-muted-foreground::placeholder{color:hsl(var(--muted-foreground))}.before\:absolute:before{content:var(--tw-content);position:absolute}.before\:inset-0:before{content:var(--tw-content);top:0;right:0;bottom:0;left:0}.before\:-translate-x-full:before{content:var(--tw-content);--tw-translate-x: -100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes shimmer{to{content:var(--tw-content);transform:translate(100%)}}.before\:animate-\[shimmer_2s_infinite\]:before{content:var(--tw-content);animation:shimmer 2s infinite}.before\:bg-gradient-to-r:before{content:var(--tw-content);background-image:linear-gradient(to right,var(--tw-gradient-stops))}.before\:from-transparent:before{content:var(--tw-content);--tw-gradient-from: transparent var(--tw-gradient-from-position);--tw-gradient-to: rgb(0 0 0 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.before\:via-white\/10:before{content:var(--tw-content);--tw-gradient-to: rgb(255 255 255 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), rgb(255 255 255 / .1) var(--tw-gradient-via-position), var(--tw-gradient-to)}.before\:to-transparent:before{content:var(--tw-content);--tw-gradient-to: transparent var(--tw-gradient-to-position)}.last\:mb-0:last-child{margin-bottom:0}.last\:border-b-0:last-child{border-bottom-width:0px}.last\:pb-0:last-child{padding-bottom:0}.hover\:h-2:hover{height:.5rem}.hover\:w-2:hover{width:.5rem}.hover\:scale-110:hover{--tw-scale-x: 1.1;--tw-scale-y: 1.1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:border-muted-foreground\/50:hover{border-color:hsl(var(--muted-foreground) / .5)}.hover\:border-primary\/20:hover{border-color:hsl(var(--primary) / .2)}.hover\:border-primary\/30:hover{border-color:hsl(var(--primary) / .3)}.hover\:border-primary\/50:hover{border-color:hsl(var(--primary) / .5)}.hover\:border-white:hover{--tw-border-opacity: 1;border-color:rgb(255 255 255 / var(--tw-border-opacity, 1))}.hover\:bg-accent:hover{background-color:hsl(var(--accent))}.hover\:bg-background:hover{background-color:hsl(var(--background))}.hover\:bg-border\/70:hover{background-color:hsl(var(--border) / .7)}.hover\:bg-card\/50:hover{background-color:hsl(var(--card) / .5)}.hover\:bg-destructive\/80:hover{background-color:hsl(var(--destructive) / .8)}.hover\:bg-destructive\/90:hover{background-color:hsl(var(--destructive) / .9)}.hover\:bg-foreground\/50:hover{background-color:hsl(var(--foreground) / .5)}.hover\:bg-green-700:hover{--tw-bg-opacity: 1;background-color:rgb(21 128 61 / var(--tw-bg-opacity, 1))}.hover\:bg-muted:hover{background-color:hsl(var(--muted))}.hover\:bg-muted\/30:hover{background-color:hsl(var(--muted) / .3)}.hover\:bg-primary:hover{background-color:hsl(var(--primary))}.hover\:bg-primary\/80:hover{background-color:hsl(var(--primary) / .8)}.hover\:bg-primary\/90:hover{background-color:hsl(var(--primary) / .9)}.hover\:bg-red-100:hover{--tw-bg-opacity: 1;background-color:rgb(254 226 226 / var(--tw-bg-opacity, 1))}.hover\:bg-secondary\/80:hover{background-color:hsl(var(--secondary) / .8)}.hover\:bg-white:hover{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.hover\:bg-yellow-700:hover{--tw-bg-opacity: 1;background-color:rgb(161 98 7 / var(--tw-bg-opacity, 1))}.hover\:text-accent-foreground:hover{color:hsl(var(--accent-foreground))}.hover\:text-foreground:hover{color:hsl(var(--foreground))}.hover\:text-red-600:hover{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}.hover\:shadow-md:hover{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.focus\:bg-accent:focus{background-color:hsl(var(--accent))}.focus\:text-accent-foreground:focus{color:hsl(var(--accent-foreground))}.focus\:text-destructive:focus{color:hsl(var(--destructive))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-destructive:focus{--tw-ring-color: hsl(var(--destructive))}.focus\:ring-ring:focus{--tw-ring-color: hsl(var(--ring))}.focus\:ring-offset-2:focus{--tw-ring-offset-width: 2px}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\:ring-1:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-ring:focus-visible{--tw-ring-color: hsl(var(--ring))}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width: 2px}.focus-visible\:ring-offset-background:focus-visible{--tw-ring-offset-color: hsl(var(--background))}.active\:scale-90:active{--tw-scale-x: .9;--tw-scale-y: .9;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:bg-primary\/15{background-color:hsl(var(--primary) / .15)}.group:hover .group-hover\:text-foreground{color:hsl(var(--foreground))}.group:hover .group-hover\:opacity-100{opacity:1}.peer:disabled~.peer-disabled\:cursor-not-allowed{cursor:not-allowed}.peer:disabled~.peer-disabled\:opacity-70{opacity:.7}.aria-selected\:bg-accent[aria-selected=true]{background-color:hsl(var(--accent))}.aria-selected\:text-accent-foreground[aria-selected=true]{color:hsl(var(--accent-foreground))}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y: .25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x: -.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x: .25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y: -.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[state\=active\]\:bg-background[data-state=active]{background-color:hsl(var(--background))}.data-\[state\=checked\]\:bg-primary[data-state=checked]{background-color:hsl(var(--primary))}.data-\[state\=dragging\]\:bg-border\/70[data-state=dragging]{background-color:hsl(var(--border) / .7)}.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:hsl(var(--accent))}.data-\[state\=unchecked\]\:bg-input[data-state=unchecked]{background-color:hsl(var(--input))}.data-\[state\=active\]\:text-foreground[data-state=active]{color:hsl(var(--foreground))}.data-\[state\=checked\]\:text-primary-foreground[data-state=checked]{color:hsl(var(--primary-foreground))}.data-\[state\=open\]\:text-accent-foreground[data-state=open]{color:hsl(var(--accent-foreground))}.data-\[state\=open\]\:text-muted-foreground[data-state=open]{color:hsl(var(--muted-foreground))}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[state\=active\]\:shadow[data-state=active]{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}@media (min-width: 640px){.sm\:mt-0{margin-top:0}.sm\:max-w-\[425px\]{max-width:425px}.sm\:flex-row{flex-direction:row}.sm\:justify-end{justify-content:flex-end}.sm\:space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.sm\:text-left{text-align:left}}@media (min-width: 768px){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media (min-width: 1024px){.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media (prefers-color-scheme: dark){.dark\:border-blue-800{--tw-border-opacity: 1;border-color:rgb(30 64 175 / var(--tw-border-opacity, 1))}.dark\:border-destructive{border-color:hsl(var(--destructive))}.dark\:border-green-800{--tw-border-opacity: 1;border-color:rgb(22 101 52 / var(--tw-border-opacity, 1))}.dark\:border-yellow-800{--tw-border-opacity: 1;border-color:rgb(133 77 14 / var(--tw-border-opacity, 1))}.dark\:bg-blue-900\/10{background-color:#1e3a8a1a}.dark\:bg-blue-900\/20{background-color:#1e3a8a33}.dark\:bg-blue-950{--tw-bg-opacity: 1;background-color:rgb(23 37 84 / var(--tw-bg-opacity, 1))}.dark\:bg-green-950{--tw-bg-opacity: 1;background-color:rgb(5 46 22 / var(--tw-bg-opacity, 1))}.dark\:bg-yellow-950{--tw-bg-opacity: 1;background-color:rgb(66 32 6 / var(--tw-bg-opacity, 1))}.dark\:from-purple-950{--tw-gradient-from: #3b0764 var(--tw-gradient-from-position);--tw-gradient-to: rgb(59 7 100 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.dark\:to-pink-950{--tw-gradient-to: #500724 var(--tw-gradient-to-position)}.dark\:text-amber-300{--tw-text-opacity: 1;color:rgb(252 211 77 / var(--tw-text-opacity, 1))}.dark\:text-blue-200{--tw-text-opacity: 1;color:rgb(191 219 254 / var(--tw-text-opacity, 1))}.dark\:text-blue-300{--tw-text-opacity: 1;color:rgb(147 197 253 / var(--tw-text-opacity, 1))}.dark\:text-blue-400{--tw-text-opacity: 1;color:rgb(96 165 250 / var(--tw-text-opacity, 1))}.dark\:text-green-400{--tw-text-opacity: 1;color:rgb(74 222 128 / var(--tw-text-opacity, 1))}.dark\:text-purple-400{--tw-text-opacity: 1;color:rgb(192 132 252 / var(--tw-text-opacity, 1))}.dark\:text-yellow-400{--tw-text-opacity: 1;color:rgb(250 204 21 / var(--tw-text-opacity, 1))}}.\[\&\>\.bg-primary\]\:bg-green-500>.bg-primary{--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.\[\&\>\.bg-primary\]\:bg-red-500>.bg-primary{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.\[\&\>\.bg-primary\]\:bg-yellow-500>.bg-primary{--tw-bg-opacity: 1;background-color:rgb(234 179 8 / var(--tw-bg-opacity, 1))}.\[\&\>\.rounded-full\]\:border-green-500>.rounded-full{--tw-border-opacity: 1;border-color:rgb(34 197 94 / var(--tw-border-opacity, 1))}.\[\&\>\.rounded-full\]\:border-red-500>.rounded-full{--tw-border-opacity: 1;border-color:rgb(239 68 68 / var(--tw-border-opacity, 1))}.\[\&\>\.rounded-full\]\:border-yellow-500>.rounded-full{--tw-border-opacity: 1;border-color:rgb(234 179 8 / var(--tw-border-opacity, 1))}.\[\&\>div\]\:bg-blue-500>div{--tw-bg-opacity: 1;background-color:rgb(59 130 246 / var(--tw-bg-opacity, 1))}.\[\&\>div\]\:bg-green-500>div{--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.\[\&\>div\]\:bg-orange-500>div{--tw-bg-opacity: 1;background-color:rgb(249 115 22 / var(--tw-bg-opacity, 1))}.\[\&\>div\]\:bg-primary\/50>div{background-color:hsl(var(--primary) / .5)}.\[\&\>div\]\:bg-red-500>div{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.hover\:\[\&\>div\]\:bg-primary\/70>div:hover{background-color:hsl(var(--primary) / .7)}.\[\&_\[cmdk-group-heading\]\]\:px-2 [cmdk-group-heading]{padding-left:.5rem;padding-right:.5rem}.\[\&_\[cmdk-group-heading\]\]\:py-1\.5 [cmdk-group-heading]{padding-top:.375rem;padding-bottom:.375rem}.\[\&_\[cmdk-group-heading\]\]\:text-xs [cmdk-group-heading]{font-size:.75rem;line-height:1rem}.\[\&_\[cmdk-group-heading\]\]\:font-medium [cmdk-group-heading]{font-weight:500}.\[\&_\[cmdk-group-heading\]\]\:text-muted-foreground [cmdk-group-heading]{color:hsl(var(--muted-foreground))}.\[\&_p\]\:leading-relaxed p{line-height:1.625}
|
|
1
|
+
*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root{--background: 0 0% 100%;--foreground: 0 0% 0%;--card: 0 0% 100%;--card-foreground: 0 0% 0%;--popover: 0 0% 100%;--popover-foreground: 0 0% 0%;--primary: 0 0% 0%;--primary-foreground: 0 0% 100%;--secondary: 0 0% 95%;--secondary-foreground: 0 0% 0%;--muted: 0 0% 95%;--muted-foreground: 0 0% 35%;--accent: 0 0% 92%;--accent-foreground: 0 0% 0%;--destructive: 0 84% 60%;--destructive-foreground: 0 0% 100%;--border: 0 0% 85%;--input: 0 0% 90%;--ring: 0 0% 0%;--radius: .5rem}.dark{--background: 0 0% 10%;--foreground: 0 0% 98%;--card: 0 0% 10%;--card-foreground: 0 0% 98%;--popover: 0 0% 10%;--popover-foreground: 0 0% 98%;--primary: 270 64% 50%;--primary-foreground: 0 0% 100%;--secondary: 270 40% 15%;--secondary-foreground: 0 0% 98%;--muted: 0 0% 15%;--muted-foreground: 0 0% 65%;--accent: 270 40% 20%;--accent-foreground: 270 64% 80%;--destructive: 0 62% 30%;--destructive-foreground: 0 0% 98%;--border: 0 0% 15%;--input: 0 0% 15%;--ring: 270 64% 50%}*{border-color:hsl(var(--border))}body{background-color:hsl(var(--background));color:hsl(var(--foreground));font-family:Inter,sans-serif;font-feature-settings:"rlig" 1,"calt" 1;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.container{width:100%}@media (min-width: 640px){.container{max-width:640px}}@media (min-width: 768px){.container{max-width:768px}}@media (min-width: 1024px){.container{max-width:1024px}}@media (min-width: 1280px){.container{max-width:1280px}}@media (min-width: 1536px){.container{max-width:1536px}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-4{top:1rem;right:1rem;bottom:1rem;left:1rem}.inset-x-0{left:0;right:0}.inset-y-0{top:0;bottom:0}.-bottom-2\.5{bottom:-.625rem}.-left-2\.5{left:-.625rem}.-right-1{right:-.25rem}.-right-2\.5{right:-.625rem}.-top-1{top:-.25rem}.-top-2\.5{top:-.625rem}.-top-\[26px\]{top:-26px}.bottom-0{bottom:0}.bottom-2{bottom:.5rem}.bottom-20{bottom:5rem}.bottom-4{bottom:1rem}.bottom-8{bottom:2rem}.bottom-full{bottom:100%}.left-0{left:0}.left-1\/2{left:50%}.left-2{left:.5rem}.left-2\.5{left:.625rem}.left-8{left:2rem}.left-\[15px\]{left:15px}.left-\[50\%\]{left:50%}.left-full{left:100%}.right-0{right:0}.right-2{right:.5rem}.right-2\.5{right:.625rem}.right-4{right:1rem}.right-full{right:100%}.top-0{top:0}.top-1\/2{top:50%}.top-2\.5{top:.625rem}.top-4{top:1rem}.top-\[50\%\]{top:50%}.top-full{top:100%}.z-10{z-index:10}.z-50{z-index:50}.z-\[1000\]{z-index:1000}.z-\[100\]{z-index:100}.z-\[50\]{z-index:50}.z-\[60\]{z-index:60}.z-\[9999\]{z-index:9999}.col-span-2{grid-column:span 2 / span 2}.col-span-3{grid-column:span 3 / span 3}.-mx-1{margin-left:-.25rem;margin-right:-.25rem}.-mx-4{margin-left:-1rem;margin-right:-1rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-auto{margin-left:auto;margin-right:auto}.my-1{margin-top:.25rem;margin-bottom:.25rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.my-3{margin-top:.75rem;margin-bottom:.75rem}.my-4{margin-top:1rem;margin-bottom:1rem}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-3{margin-left:.75rem}.ml-auto{margin-left:auto}.mr-1{margin-right:.25rem}.mr-1\.5{margin-right:.375rem}.mr-2{margin-right:.5rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-8{margin-top:2rem}.block{display:block}.inline-block{display:inline-block}.\!inline{display:inline!important}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.contents{display:contents}.hidden{display:none}.aspect-square{aspect-ratio:1 / 1}.h-0\.5{height:.125rem}.h-1{height:.25rem}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-16{height:4rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-24{height:6rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-32{height:8rem}.h-4{height:1rem}.h-40{height:10rem}.h-48{height:12rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-64{height:16rem}.h-7{height:1.75rem}.h-72{height:18rem}.h-8{height:2rem}.h-80{height:20rem}.h-9{height:2.25rem}.h-96{height:24rem}.h-\[150px\]{height:150px}.h-\[1px\]{height:1px}.h-\[200px\]{height:200px}.h-\[24px\]{height:24px}.h-\[30px\]{height:30px}.h-\[400px\]{height:400px}.h-\[500px\]{height:500px}.h-\[80vh\]{height:80vh}.h-\[calc\(100vh-\$\{tableHeight\}\)\]{height:calc(100vh - ${tableHeight})}.h-\[calc\(100vh-12rem\)\]{height:calc(100vh - 12rem)}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.h-full{height:100%}.h-px{height:1px}.h-scroll-xl{height:calc(100vh - 15rem)}.max-h-96{max-height:24rem}.max-h-\[300px\]{max-height:300px}.max-h-\[85vh\]{max-height:85vh}.max-h-\[calc\(100vh-10rem\)\]{max-height:calc(100vh - 10rem)}.min-h-0{min-height:0px}.min-h-\[100px\]{min-height:100px}.min-h-\[120px\]{min-height:120px}.min-h-\[200px\]{min-height:200px}.min-h-\[80px\]{min-height:80px}.min-h-full{min-height:100%}.w-1{width:.25rem}.w-1\.5{width:.375rem}.w-1\/2{width:50%}.w-1\/3{width:33.333333%}.w-1\/4{width:25%}.w-10{width:2.5rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-2\/3{width:66.666667%}.w-2\/5{width:40%}.w-20{width:5rem}.w-24{width:6rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-3\/4{width:75%}.w-3\/5{width:60%}.w-32{width:8rem}.w-4{width:1rem}.w-4\/5{width:80%}.w-40{width:10rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-56{width:14rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-7{width:1.75rem}.w-72{width:18rem}.w-8{width:2rem}.w-80{width:20rem}.w-9{width:2.25rem}.w-96{width:24rem}.w-\[180px\]{width:180px}.w-\[1px\]{width:1px}.w-\[200px\]{width:200px}.w-\[220px\]{width:220px}.w-\[2px\]{width:2px}.w-\[300px\]{width:300px}.w-\[30px\]{width:30px}.w-\[350px\]{width:350px}.w-\[380px\]{width:380px}.w-\[400px\]{width:400px}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.w-max{width:-moz-max-content;width:max-content}.w-px{width:1px}.min-w-0{min-width:0px}.min-w-\[120px\]{min-width:120px}.min-w-\[220px\]{min-width:220px}.min-w-\[80px\]{min-width:80px}.min-w-\[8rem\]{min-width:8rem}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.max-w-2xl{max-width:42rem}.max-w-4xl{max-width:56rem}.max-w-\[200px\]{max-width:200px}.max-w-\[220px\]{max-width:220px}.max-w-\[250px\]{max-width:250px}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-sm{max-width:24rem}.flex-1{flex:1 1 0%}.flex-none{flex:none}.flex-shrink-0,.shrink-0{flex-shrink:0}.grow{flex-grow:1}.border-collapse{border-collapse:collapse}.origin-top{transform-origin:top}.-translate-x-1\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-\[-50\%\]{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-1{--tw-translate-y: .25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-\[-50\%\]{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-default{cursor:default}.cursor-move{cursor:move}.cursor-ne-resize{cursor:ne-resize}.cursor-not-allowed{cursor:not-allowed}.cursor-nw-resize{cursor:nw-resize}.cursor-pointer{cursor:pointer}.cursor-se-resize{cursor:se-resize}.cursor-sw-resize{cursor:sw-resize}.touch-none{touch-action:none}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize-none{resize:none}.resize{resize:both}.list-inside{list-style-position:inside}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.grid-cols-\[25px_1fr\]{grid-template-columns:25px 1fr}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.25rem * var(--tw-space-x-reverse));margin-left:calc(.25rem * calc(1 - var(--tw-space-x-reverse)))}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.75rem * var(--tw-space-x-reverse));margin-left:calc(.75rem * calc(1 - var(--tw-space-x-reverse)))}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(1rem * var(--tw-space-x-reverse));margin-left:calc(1rem * calc(1 - var(--tw-space-x-reverse)))}.space-x-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(1.5rem * var(--tw-space-x-reverse));margin-left:calc(1.5rem * calc(1 - var(--tw-space-x-reverse)))}.space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(0px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px * var(--tw-space-y-reverse))}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-12>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(3rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(3rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(2rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-border\/30>:not([hidden])~:not([hidden]){border-color:hsl(var(--border) / .3)}.self-start{align-self:flex-start}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.rounded{border-radius:.25rem}.rounded-\[inherit\]{border-radius:inherit}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.rounded-xl{border-radius:.75rem}.rounded-b-lg{border-bottom-right-radius:var(--radius);border-bottom-left-radius:var(--radius)}.rounded-r-md{border-top-right-radius:calc(var(--radius) - 2px);border-bottom-right-radius:calc(var(--radius) - 2px)}.rounded-t-lg{border-top-left-radius:var(--radius);border-top-right-radius:var(--radius)}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.border-l-4{border-left-width:4px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-amber-200{--tw-border-opacity: 1;border-color:rgb(253 230 138 / var(--tw-border-opacity, 1))}.border-blue-200{--tw-border-opacity: 1;border-color:rgb(191 219 254 / var(--tw-border-opacity, 1))}.border-border{border-color:hsl(var(--border))}.border-border\/30{border-color:hsl(var(--border) / .3)}.border-border\/40{border-color:hsl(var(--border) / .4)}.border-border\/50{border-color:hsl(var(--border) / .5)}.border-current{border-color:currentColor}.border-destructive{border-color:hsl(var(--destructive))}.border-destructive\/50{border-color:hsl(var(--destructive) / .5)}.border-green-200{--tw-border-opacity: 1;border-color:rgb(187 247 208 / var(--tw-border-opacity, 1))}.border-input{border-color:hsl(var(--input))}.border-muted{border-color:hsl(var(--muted))}.border-muted-foreground\/25{border-color:hsl(var(--muted-foreground) / .25)}.border-muted-foreground\/30{border-color:hsl(var(--muted-foreground) / .3)}.border-primary{border-color:hsl(var(--primary))}.border-primary\/20{border-color:hsl(var(--primary) / .2)}.border-primary\/30{border-color:hsl(var(--primary) / .3)}.border-primary\/50{border-color:hsl(var(--primary) / .5)}.border-purple-200{--tw-border-opacity: 1;border-color:rgb(233 213 255 / var(--tw-border-opacity, 1))}.border-red-200{--tw-border-opacity: 1;border-color:rgb(254 202 202 / var(--tw-border-opacity, 1))}.border-slate-200{--tw-border-opacity: 1;border-color:rgb(226 232 240 / var(--tw-border-opacity, 1))}.border-slate-700{--tw-border-opacity: 1;border-color:rgb(51 65 85 / var(--tw-border-opacity, 1))}.border-transparent{border-color:transparent}.border-white{--tw-border-opacity: 1;border-color:rgb(255 255 255 / var(--tw-border-opacity, 1))}.border-yellow-200{--tw-border-opacity: 1;border-color:rgb(254 240 138 / var(--tw-border-opacity, 1))}.border-l-transparent{border-left-color:transparent}.border-t-transparent{border-top-color:transparent}.bg-accent{background-color:hsl(var(--accent))}.bg-accent\/30{background-color:hsl(var(--accent) / .3)}.bg-amber-50{--tw-bg-opacity: 1;background-color:rgb(255 251 235 / var(--tw-bg-opacity, 1))}.bg-background{background-color:hsl(var(--background))}.bg-background\/80{background-color:hsl(var(--background) / .8)}.bg-background\/90{background-color:hsl(var(--background) / .9)}.bg-black{--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity, 1))}.bg-black\/50{background-color:#00000080}.bg-blue-50{--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1))}.bg-blue-50\/50{background-color:#eff6ff80}.bg-border{background-color:hsl(var(--border))}.bg-border\/40{background-color:hsl(var(--border) / .4)}.bg-card{background-color:hsl(var(--card))}.bg-card\/30{background-color:hsl(var(--card) / .3)}.bg-destructive{background-color:hsl(var(--destructive))}.bg-foreground{background-color:hsl(var(--foreground))}.bg-foreground\/30{background-color:hsl(var(--foreground) / .3)}.bg-gray-100{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.bg-gray-900{--tw-bg-opacity: 1;background-color:rgb(17 24 39 / var(--tw-bg-opacity, 1))}.bg-green-100{--tw-bg-opacity: 1;background-color:rgb(220 252 231 / var(--tw-bg-opacity, 1))}.bg-green-50{--tw-bg-opacity: 1;background-color:rgb(240 253 244 / var(--tw-bg-opacity, 1))}.bg-green-600{--tw-bg-opacity: 1;background-color:rgb(22 163 74 / var(--tw-bg-opacity, 1))}.bg-muted{background-color:hsl(var(--muted))}.bg-muted\/20{background-color:hsl(var(--muted) / .2)}.bg-muted\/30{background-color:hsl(var(--muted) / .3)}.bg-muted\/40{background-color:hsl(var(--muted) / .4)}.bg-muted\/5{background-color:hsl(var(--muted) / .05)}.bg-muted\/50{background-color:hsl(var(--muted) / .5)}.bg-muted\/60{background-color:hsl(var(--muted) / .6)}.bg-muted\/70{background-color:hsl(var(--muted) / .7)}.bg-popover{background-color:hsl(var(--popover))}.bg-primary{background-color:hsl(var(--primary))}.bg-primary\/10{background-color:hsl(var(--primary) / .1)}.bg-primary\/20{background-color:hsl(var(--primary) / .2)}.bg-primary\/5{background-color:hsl(var(--primary) / .05)}.bg-primary\/60{background-color:hsl(var(--primary) / .6)}.bg-primary\/80{background-color:hsl(var(--primary) / .8)}.bg-red-100{--tw-bg-opacity: 1;background-color:rgb(254 226 226 / var(--tw-bg-opacity, 1))}.bg-red-50{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.bg-red-500{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.bg-secondary{background-color:hsl(var(--secondary))}.bg-sky-500{--tw-bg-opacity: 1;background-color:rgb(14 165 233 / var(--tw-bg-opacity, 1))}.bg-slate-100{--tw-bg-opacity: 1;background-color:rgb(241 245 249 / var(--tw-bg-opacity, 1))}.bg-slate-800{--tw-bg-opacity: 1;background-color:rgb(30 41 59 / var(--tw-bg-opacity, 1))}.bg-slate-900{--tw-bg-opacity: 1;background-color:rgb(15 23 42 / var(--tw-bg-opacity, 1))}.bg-slate-950{--tw-bg-opacity: 1;background-color:rgb(2 6 23 / var(--tw-bg-opacity, 1))}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-yellow-50{--tw-bg-opacity: 1;background-color:rgb(254 252 232 / var(--tw-bg-opacity, 1))}.bg-yellow-600{--tw-bg-opacity: 1;background-color:rgb(202 138 4 / var(--tw-bg-opacity, 1))}.bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--tw-gradient-stops))}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.from-muted\/30{--tw-gradient-from: hsl(var(--muted) / .3) var(--tw-gradient-from-position);--tw-gradient-to: hsl(var(--muted) / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-primary\/20{--tw-gradient-from: hsl(var(--primary) / .2) var(--tw-gradient-from-position);--tw-gradient-to: hsl(var(--primary) / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-purple-50{--tw-gradient-from: #faf5ff var(--tw-gradient-from-position);--tw-gradient-to: rgb(250 245 255 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.to-muted\/60{--tw-gradient-to: hsl(var(--muted) / .6) var(--tw-gradient-to-position)}.to-pink-50{--tw-gradient-to: #fdf2f8 var(--tw-gradient-to-position)}.fill-current{fill:currentColor}.fill-yellow-400{fill:#facc15}.object-cover{-o-object-fit:cover;object-fit:cover}.p-0{padding:0}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.p-\[1px\]{padding:1px}.px-0{padding-left:0;padding-right:0}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-0{padding-bottom:0}.pb-2{padding-bottom:.5rem}.pb-4{padding-bottom:1rem}.pl-3{padding-left:.75rem}.pl-4{padding-left:1rem}.pl-5{padding-left:1.25rem}.pl-7{padding-left:1.75rem}.pl-8{padding-left:2rem}.pr-2{padding-right:.5rem}.pt-0{padding-top:0}.pt-0\.5{padding-top:.125rem}.pt-2{padding-top:.5rem}.pt-4{padding-top:1rem}.pt-6{padding-top:1.5rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.italic{font-style:italic}.leading-6{line-height:1.5rem}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.tracking-tight{letter-spacing:-.025em}.tracking-wide{letter-spacing:.025em}.text-accent-foreground{color:hsl(var(--accent-foreground))}.text-amber-500{--tw-text-opacity: 1;color:rgb(245 158 11 / var(--tw-text-opacity, 1))}.text-amber-700{--tw-text-opacity: 1;color:rgb(180 83 9 / var(--tw-text-opacity, 1))}.text-amber-800{--tw-text-opacity: 1;color:rgb(146 64 14 / var(--tw-text-opacity, 1))}.text-blue-500{--tw-text-opacity: 1;color:rgb(59 130 246 / var(--tw-text-opacity, 1))}.text-blue-700{--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity, 1))}.text-blue-800{--tw-text-opacity: 1;color:rgb(30 64 175 / var(--tw-text-opacity, 1))}.text-card-foreground{color:hsl(var(--card-foreground))}.text-current{color:currentColor}.text-destructive{color:hsl(var(--destructive))}.text-destructive-foreground{color:hsl(var(--destructive-foreground))}.text-foreground{color:hsl(var(--foreground))}.text-foreground\/90{color:hsl(var(--foreground) / .9)}.text-gray-300{--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}.text-gray-500{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.text-gray-900{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.text-green-400{--tw-text-opacity: 1;color:rgb(74 222 128 / var(--tw-text-opacity, 1))}.text-green-500{--tw-text-opacity: 1;color:rgb(34 197 94 / var(--tw-text-opacity, 1))}.text-green-800{--tw-text-opacity: 1;color:rgb(22 101 52 / var(--tw-text-opacity, 1))}.text-muted-foreground{color:hsl(var(--muted-foreground))}.text-muted-foreground\/50{color:hsl(var(--muted-foreground) / .5)}.text-muted-foreground\/80{color:hsl(var(--muted-foreground) / .8)}.text-muted-foreground\/90{color:hsl(var(--muted-foreground) / .9)}.text-popover-foreground{color:hsl(var(--popover-foreground))}.text-primary{color:hsl(var(--primary))}.text-primary-foreground{color:hsl(var(--primary-foreground))}.text-primary\/70{color:hsl(var(--primary) / .7)}.text-purple-800{--tw-text-opacity: 1;color:rgb(107 33 168 / var(--tw-text-opacity, 1))}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.text-red-800{--tw-text-opacity: 1;color:rgb(153 27 27 / var(--tw-text-opacity, 1))}.text-secondary-foreground{color:hsl(var(--secondary-foreground))}.text-slate-200{--tw-text-opacity: 1;color:rgb(226 232 240 / var(--tw-text-opacity, 1))}.text-slate-50{--tw-text-opacity: 1;color:rgb(248 250 252 / var(--tw-text-opacity, 1))}.text-slate-800{--tw-text-opacity: 1;color:rgb(30 41 59 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-yellow-400{--tw-text-opacity: 1;color:rgb(250 204 21 / var(--tw-text-opacity, 1))}.text-yellow-500{--tw-text-opacity: 1;color:rgb(234 179 8 / var(--tw-text-opacity, 1))}.text-yellow-600{--tw-text-opacity: 1;color:rgb(202 138 4 / var(--tw-text-opacity, 1))}.text-yellow-800{--tw-text-opacity: 1;color:rgb(133 77 14 / var(--tw-text-opacity, 1))}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-70{opacity:.7}.opacity-80{opacity:.8}.shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-primary\/20{--tw-shadow-color: hsl(var(--primary) / .2);--tw-shadow: var(--tw-shadow-colored)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.ring-0{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-offset-background{--tw-ring-offset-color: hsl(var(--background))}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-150{transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.prose{color:hsl(var(--foreground));max-width:none}.prose pre{background-color:hsl(var(--muted))}.prose code{background-color:hsl(var(--muted));color:hsl(var(--foreground))}.prose img{border-radius:var(--radius);margin:0!important}.prose a{color:hsl(var(--primary));text-decoration-line:none}.prose a:hover{color:hsl(var(--primary) / .9)}.prose strong{font-weight:600;color:hsl(var(--foreground))}.prose blockquote{margin-top:1rem;margin-bottom:1rem;border-left-width:4px;border-color:hsl(var(--border));background-color:hsl(var(--muted) / .5);padding:.25rem 1rem}.prose ul{margin-top:1rem;margin-bottom:1rem;list-style-position:inside;list-style-type:disc}.prose ul>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.prose ul *::marker{color:hsl(var(--muted-foreground))}.prose ul::marker{color:hsl(var(--muted-foreground))}.prose ol{margin-top:1rem;margin-bottom:1rem;list-style-position:inside;list-style-type:decimal}.prose ol>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.prose ol *::marker{color:hsl(var(--muted-foreground))}.prose ol::marker{color:hsl(var(--muted-foreground))}.prose table{margin-top:1rem;margin-bottom:1rem;width:100%;border-collapse:collapse}.prose th{border-width:1px;border-color:hsl(var(--border));background-color:hsl(var(--muted));padding:.5rem 1rem;text-align:left;font-weight:500}.prose td{border-width:1px;border-color:hsl(var(--border));padding:.5rem 1rem}.prose hr{margin-top:2rem;margin-bottom:2rem;border-color:hsl(var(--border))}.prose h1,.prose h2,.prose h3,.prose h4{margin-top:2rem;margin-bottom:1rem;font-weight:600;color:hsl(var(--foreground))}.prose h1{font-size:1.5rem;line-height:2rem}.prose h2{font-size:1.25rem;line-height:1.75rem}.prose h3{font-size:1.125rem;line-height:1.75rem}.prose h4{font-size:1rem;line-height:1.5rem}.prose>:first-child{margin-top:0!important}.prose>:last-child{margin-bottom:0!important}.file\:border-0::file-selector-button{border-width:0px}.file\:bg-transparent::file-selector-button{background-color:transparent}.file\:text-sm::file-selector-button{font-size:.875rem;line-height:1.25rem}.file\:font-medium::file-selector-button{font-weight:500}.placeholder\:text-muted-foreground::-moz-placeholder{color:hsl(var(--muted-foreground))}.placeholder\:text-muted-foreground::placeholder{color:hsl(var(--muted-foreground))}.before\:absolute:before{content:var(--tw-content);position:absolute}.before\:inset-0:before{content:var(--tw-content);top:0;right:0;bottom:0;left:0}.before\:-translate-x-full:before{content:var(--tw-content);--tw-translate-x: -100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes shimmer{to{content:var(--tw-content);transform:translate(100%)}}.before\:animate-\[shimmer_2s_infinite\]:before{content:var(--tw-content);animation:shimmer 2s infinite}.before\:bg-gradient-to-r:before{content:var(--tw-content);background-image:linear-gradient(to right,var(--tw-gradient-stops))}.before\:from-transparent:before{content:var(--tw-content);--tw-gradient-from: transparent var(--tw-gradient-from-position);--tw-gradient-to: rgb(0 0 0 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.before\:via-white\/10:before{content:var(--tw-content);--tw-gradient-to: rgb(255 255 255 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), rgb(255 255 255 / .1) var(--tw-gradient-via-position), var(--tw-gradient-to)}.before\:to-transparent:before{content:var(--tw-content);--tw-gradient-to: transparent var(--tw-gradient-to-position)}.last\:mb-0:last-child{margin-bottom:0}.last\:border-b-0:last-child{border-bottom-width:0px}.last\:pb-0:last-child{padding-bottom:0}.hover\:h-2:hover{height:.5rem}.hover\:w-2:hover{width:.5rem}.hover\:scale-110:hover{--tw-scale-x: 1.1;--tw-scale-y: 1.1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:border-muted-foreground\/50:hover{border-color:hsl(var(--muted-foreground) / .5)}.hover\:border-primary\/20:hover{border-color:hsl(var(--primary) / .2)}.hover\:border-primary\/30:hover{border-color:hsl(var(--primary) / .3)}.hover\:border-primary\/50:hover{border-color:hsl(var(--primary) / .5)}.hover\:border-white:hover{--tw-border-opacity: 1;border-color:rgb(255 255 255 / var(--tw-border-opacity, 1))}.hover\:bg-accent:hover{background-color:hsl(var(--accent))}.hover\:bg-background:hover{background-color:hsl(var(--background))}.hover\:bg-border\/70:hover{background-color:hsl(var(--border) / .7)}.hover\:bg-card\/50:hover{background-color:hsl(var(--card) / .5)}.hover\:bg-destructive\/80:hover{background-color:hsl(var(--destructive) / .8)}.hover\:bg-destructive\/90:hover{background-color:hsl(var(--destructive) / .9)}.hover\:bg-foreground\/50:hover{background-color:hsl(var(--foreground) / .5)}.hover\:bg-green-700:hover{--tw-bg-opacity: 1;background-color:rgb(21 128 61 / var(--tw-bg-opacity, 1))}.hover\:bg-muted:hover{background-color:hsl(var(--muted))}.hover\:bg-muted\/30:hover{background-color:hsl(var(--muted) / .3)}.hover\:bg-primary:hover{background-color:hsl(var(--primary))}.hover\:bg-primary\/80:hover{background-color:hsl(var(--primary) / .8)}.hover\:bg-primary\/90:hover{background-color:hsl(var(--primary) / .9)}.hover\:bg-red-100:hover{--tw-bg-opacity: 1;background-color:rgb(254 226 226 / var(--tw-bg-opacity, 1))}.hover\:bg-secondary\/80:hover{background-color:hsl(var(--secondary) / .8)}.hover\:bg-white:hover{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.hover\:bg-yellow-700:hover{--tw-bg-opacity: 1;background-color:rgb(161 98 7 / var(--tw-bg-opacity, 1))}.hover\:text-accent-foreground:hover{color:hsl(var(--accent-foreground))}.hover\:text-foreground:hover{color:hsl(var(--foreground))}.hover\:text-red-600:hover{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}.hover\:shadow-md:hover{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.focus\:bg-accent:focus{background-color:hsl(var(--accent))}.focus\:text-accent-foreground:focus{color:hsl(var(--accent-foreground))}.focus\:text-destructive:focus{color:hsl(var(--destructive))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-destructive:focus{--tw-ring-color: hsl(var(--destructive))}.focus\:ring-ring:focus{--tw-ring-color: hsl(var(--ring))}.focus\:ring-offset-2:focus{--tw-ring-offset-width: 2px}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\:ring-1:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-ring:focus-visible{--tw-ring-color: hsl(var(--ring))}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width: 2px}.focus-visible\:ring-offset-background:focus-visible{--tw-ring-offset-color: hsl(var(--background))}.active\:scale-90:active{--tw-scale-x: .9;--tw-scale-y: .9;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:bg-primary\/15{background-color:hsl(var(--primary) / .15)}.group:hover .group-hover\:text-foreground{color:hsl(var(--foreground))}.group:hover .group-hover\:opacity-100{opacity:1}.peer:disabled~.peer-disabled\:cursor-not-allowed{cursor:not-allowed}.peer:disabled~.peer-disabled\:opacity-70{opacity:.7}.aria-selected\:bg-accent[aria-selected=true]{background-color:hsl(var(--accent))}.aria-selected\:text-accent-foreground[aria-selected=true]{color:hsl(var(--accent-foreground))}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y: .25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x: -.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x: .25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y: -.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[state\=active\]\:bg-background[data-state=active]{background-color:hsl(var(--background))}.data-\[state\=checked\]\:bg-primary[data-state=checked]{background-color:hsl(var(--primary))}.data-\[state\=dragging\]\:bg-border\/70[data-state=dragging]{background-color:hsl(var(--border) / .7)}.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:hsl(var(--accent))}.data-\[state\=unchecked\]\:bg-input[data-state=unchecked]{background-color:hsl(var(--input))}.data-\[state\=active\]\:text-foreground[data-state=active]{color:hsl(var(--foreground))}.data-\[state\=checked\]\:text-primary-foreground[data-state=checked]{color:hsl(var(--primary-foreground))}.data-\[state\=open\]\:text-accent-foreground[data-state=open]{color:hsl(var(--accent-foreground))}.data-\[state\=open\]\:text-muted-foreground[data-state=open]{color:hsl(var(--muted-foreground))}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[state\=active\]\:shadow[data-state=active]{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}@media (min-width: 640px){.sm\:mt-0{margin-top:0}.sm\:max-w-\[425px\]{max-width:425px}.sm\:flex-row{flex-direction:row}.sm\:justify-end{justify-content:flex-end}.sm\:space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.sm\:text-left{text-align:left}}@media (min-width: 768px){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media (min-width: 1024px){.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media (prefers-color-scheme: dark){.dark\:border-blue-800{--tw-border-opacity: 1;border-color:rgb(30 64 175 / var(--tw-border-opacity, 1))}.dark\:border-destructive{border-color:hsl(var(--destructive))}.dark\:border-green-800{--tw-border-opacity: 1;border-color:rgb(22 101 52 / var(--tw-border-opacity, 1))}.dark\:border-yellow-800{--tw-border-opacity: 1;border-color:rgb(133 77 14 / var(--tw-border-opacity, 1))}.dark\:bg-blue-900\/10{background-color:#1e3a8a1a}.dark\:bg-blue-900\/20{background-color:#1e3a8a33}.dark\:bg-blue-950{--tw-bg-opacity: 1;background-color:rgb(23 37 84 / var(--tw-bg-opacity, 1))}.dark\:bg-green-950{--tw-bg-opacity: 1;background-color:rgb(5 46 22 / var(--tw-bg-opacity, 1))}.dark\:bg-yellow-950{--tw-bg-opacity: 1;background-color:rgb(66 32 6 / var(--tw-bg-opacity, 1))}.dark\:from-purple-950{--tw-gradient-from: #3b0764 var(--tw-gradient-from-position);--tw-gradient-to: rgb(59 7 100 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.dark\:to-pink-950{--tw-gradient-to: #500724 var(--tw-gradient-to-position)}.dark\:text-amber-300{--tw-text-opacity: 1;color:rgb(252 211 77 / var(--tw-text-opacity, 1))}.dark\:text-blue-200{--tw-text-opacity: 1;color:rgb(191 219 254 / var(--tw-text-opacity, 1))}.dark\:text-blue-300{--tw-text-opacity: 1;color:rgb(147 197 253 / var(--tw-text-opacity, 1))}.dark\:text-blue-400{--tw-text-opacity: 1;color:rgb(96 165 250 / var(--tw-text-opacity, 1))}.dark\:text-green-400{--tw-text-opacity: 1;color:rgb(74 222 128 / var(--tw-text-opacity, 1))}.dark\:text-purple-400{--tw-text-opacity: 1;color:rgb(192 132 252 / var(--tw-text-opacity, 1))}.dark\:text-yellow-400{--tw-text-opacity: 1;color:rgb(250 204 21 / var(--tw-text-opacity, 1))}}.\[\&\>\.bg-primary\]\:bg-green-500>.bg-primary{--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.\[\&\>\.bg-primary\]\:bg-red-500>.bg-primary{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.\[\&\>\.bg-primary\]\:bg-yellow-500>.bg-primary{--tw-bg-opacity: 1;background-color:rgb(234 179 8 / var(--tw-bg-opacity, 1))}.\[\&\>\.rounded-full\]\:border-green-500>.rounded-full{--tw-border-opacity: 1;border-color:rgb(34 197 94 / var(--tw-border-opacity, 1))}.\[\&\>\.rounded-full\]\:border-red-500>.rounded-full{--tw-border-opacity: 1;border-color:rgb(239 68 68 / var(--tw-border-opacity, 1))}.\[\&\>\.rounded-full\]\:border-yellow-500>.rounded-full{--tw-border-opacity: 1;border-color:rgb(234 179 8 / var(--tw-border-opacity, 1))}.\[\&\>div\]\:bg-blue-500>div{--tw-bg-opacity: 1;background-color:rgb(59 130 246 / var(--tw-bg-opacity, 1))}.\[\&\>div\]\:bg-green-500>div{--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.\[\&\>div\]\:bg-orange-500>div{--tw-bg-opacity: 1;background-color:rgb(249 115 22 / var(--tw-bg-opacity, 1))}.\[\&\>div\]\:bg-primary\/50>div{background-color:hsl(var(--primary) / .5)}.\[\&\>div\]\:bg-red-500>div{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.hover\:\[\&\>div\]\:bg-primary\/70>div:hover{background-color:hsl(var(--primary) / .7)}.\[\&_\[cmdk-group-heading\]\]\:px-2 [cmdk-group-heading]{padding-left:.5rem;padding-right:.5rem}.\[\&_\[cmdk-group-heading\]\]\:py-1\.5 [cmdk-group-heading]{padding-top:.375rem;padding-bottom:.375rem}.\[\&_\[cmdk-group-heading\]\]\:text-xs [cmdk-group-heading]{font-size:.75rem;line-height:1rem}.\[\&_\[cmdk-group-heading\]\]\:font-medium [cmdk-group-heading]{font-weight:500}.\[\&_\[cmdk-group-heading\]\]\:text-muted-foreground [cmdk-group-heading]{color:hsl(var(--muted-foreground))}.\[\&_p\]\:leading-relaxed p{line-height:1.625}
|