@avenue-ticketing/ui 0.1.0 → 0.2.0
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/react/button.d.ts +41 -0
- package/dist/react/button.js +69 -0
- package/dist/react/button.js.map +1 -0
- package/dist/react/dialog.d.ts +13 -13
- package/dist/react/dialog.js +2 -1
- package/dist/react/dialog.js.map +1 -1
- package/dist/react/input.d.ts +20 -0
- package/dist/react/input.js +42 -0
- package/dist/react/input.js.map +1 -0
- package/dist/react/scroll-header.d.ts +10 -0
- package/dist/react/scroll-header.js +80 -0
- package/dist/react/scroll-header.js.map +1 -0
- package/dist/react/sheet.d.ts +17 -17
- package/dist/react/sheet.js +2 -1
- package/dist/react/sheet.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
|
|
3
|
+
declare const sizeClass: {
|
|
4
|
+
readonly xs: "h-8 min-h-8 gap-2 px-4 text-xs has-[>svg]:px-3 [&_svg:not([class*='size-'])]:size-3";
|
|
5
|
+
readonly default: "h-10 min-h-10 gap-2 px-5 text-sm has-[>svg]:px-4 [&_svg:not([class*='size-'])]:size-4";
|
|
6
|
+
readonly lg: "h-11 min-h-11 gap-2 px-6 text-base has-[>svg]:px-5 [&_svg:not([class*='size-'])]:size-5";
|
|
7
|
+
};
|
|
8
|
+
declare const roundedClass: {
|
|
9
|
+
readonly full: "rounded-full";
|
|
10
|
+
readonly lg: "rounded-lg";
|
|
11
|
+
readonly md: "rounded-md";
|
|
12
|
+
};
|
|
13
|
+
declare const variantClass: {
|
|
14
|
+
readonly primary: "bg-primary text-background border border-transparent hover:bg-primary/90 active:bg-primary/85";
|
|
15
|
+
readonly secondary: "bg-background text-primary border border-primary/10 hover:bg-primary/5";
|
|
16
|
+
readonly destructive: "bg-background text-red-500 border border-red-500/25 hover:bg-red-500/5";
|
|
17
|
+
readonly success: "bg-background text-green-500 border border-green-500/25 hover:bg-green-500/5";
|
|
18
|
+
};
|
|
19
|
+
type ButtonProps = React.ComponentProps<"button"> & {
|
|
20
|
+
/**
|
|
21
|
+
* Visual style: neutral (`secondary`, `primary`), or outline (`destructive`,
|
|
22
|
+
* `success`) using Tailwind `red-500` / `green-500` text and matching borders on
|
|
23
|
+
* `bg-background` (no solid fill).
|
|
24
|
+
*/
|
|
25
|
+
variant?: keyof typeof variantClass;
|
|
26
|
+
/**
|
|
27
|
+
* Corner radius. Labeled buttons default to `full` (pill). `iconOnly` buttons
|
|
28
|
+
* default to `md` (square corners) unless you pass `rounded` explicitly.
|
|
29
|
+
*/
|
|
30
|
+
rounded?: keyof typeof roundedClass;
|
|
31
|
+
/** Height and horizontal padding: `default` or `lg` only. */
|
|
32
|
+
size?: keyof typeof sizeClass;
|
|
33
|
+
/**
|
|
34
|
+
* Square icon-only control; same `size` presets (`default` | `lg`). Pair with
|
|
35
|
+
* `aria-label` (or `title`) when there is no visible text.
|
|
36
|
+
*/
|
|
37
|
+
iconOnly?: boolean;
|
|
38
|
+
};
|
|
39
|
+
declare const Button: React.ForwardRefExoticComponent<Omit<ButtonProps, "ref"> & React.RefAttributes<HTMLButtonElement>>;
|
|
40
|
+
|
|
41
|
+
export { Button, type ButtonProps };
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { clsx } from 'clsx';
|
|
3
|
+
import { twMerge } from 'tailwind-merge';
|
|
4
|
+
import { jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
// src/react/button.tsx
|
|
7
|
+
function cn(...inputs) {
|
|
8
|
+
return twMerge(clsx(inputs));
|
|
9
|
+
}
|
|
10
|
+
var sizeClass = {
|
|
11
|
+
xs: "h-8 min-h-8 gap-2 px-4 text-xs has-[>svg]:px-3 [&_svg:not([class*='size-'])]:size-3",
|
|
12
|
+
default: "h-10 min-h-10 gap-2 px-5 text-sm has-[>svg]:px-4 [&_svg:not([class*='size-'])]:size-4",
|
|
13
|
+
lg: "h-11 min-h-11 gap-2 px-6 text-base has-[>svg]:px-5 [&_svg:not([class*='size-'])]:size-5"
|
|
14
|
+
};
|
|
15
|
+
var iconOnlySizeClass = {
|
|
16
|
+
xs: "size-8 min-h-8 min-w-8 gap-0 p-0 [&_svg:not([class*='size-'])]:size-3",
|
|
17
|
+
default: "size-10 min-h-10 min-w-10 gap-0 p-0 [&_svg:not([class*='size-'])]:size-4",
|
|
18
|
+
lg: "size-11 min-h-11 min-w-11 gap-0 p-0 [&_svg:not([class*='size-'])]:size-5"
|
|
19
|
+
};
|
|
20
|
+
var roundedClass = {
|
|
21
|
+
full: "rounded-full",
|
|
22
|
+
lg: "rounded-lg",
|
|
23
|
+
md: "rounded-md"
|
|
24
|
+
};
|
|
25
|
+
var variantClass = {
|
|
26
|
+
primary: "bg-primary text-background border border-transparent hover:bg-primary/90 active:bg-primary/85",
|
|
27
|
+
secondary: "bg-background text-primary border border-primary/10 hover:bg-primary/5",
|
|
28
|
+
destructive: "bg-background text-red-500 border border-red-500/25 hover:bg-red-500/5",
|
|
29
|
+
success: "bg-background text-green-500 border border-green-500/25 hover:bg-green-500/5"
|
|
30
|
+
};
|
|
31
|
+
var Button = React.forwardRef(
|
|
32
|
+
({
|
|
33
|
+
className,
|
|
34
|
+
type = "button",
|
|
35
|
+
variant = "secondary",
|
|
36
|
+
rounded: roundedProp,
|
|
37
|
+
size = "default",
|
|
38
|
+
iconOnly = false,
|
|
39
|
+
disabled,
|
|
40
|
+
...props
|
|
41
|
+
}, ref) => {
|
|
42
|
+
const rounded = roundedProp ?? (iconOnly ? "md" : "full");
|
|
43
|
+
return /* @__PURE__ */ jsx(
|
|
44
|
+
"button",
|
|
45
|
+
{
|
|
46
|
+
type,
|
|
47
|
+
disabled,
|
|
48
|
+
"data-slot": "button",
|
|
49
|
+
"data-icon-only": iconOnly ? "" : void 0,
|
|
50
|
+
className: cn(
|
|
51
|
+
"inline-flex shrink-0 cursor-pointer items-center justify-center whitespace-nowrap outline-none transition-[color,background-color,box-shadow,transform] duration-150 ease-out active:scale-[0.98] [&_svg]:pointer-events-none [&_svg]:shrink-0",
|
|
52
|
+
"disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50",
|
|
53
|
+
"focus-visible:border-ring font-bold tracking-wide focus-visible:ring-ring/50 focus-visible:ring-[3px]",
|
|
54
|
+
iconOnly ? iconOnlySizeClass[size] : sizeClass[size],
|
|
55
|
+
roundedClass[rounded],
|
|
56
|
+
variantClass[variant],
|
|
57
|
+
className
|
|
58
|
+
),
|
|
59
|
+
ref,
|
|
60
|
+
...props
|
|
61
|
+
}
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
);
|
|
65
|
+
Button.displayName = "Button";
|
|
66
|
+
|
|
67
|
+
export { Button };
|
|
68
|
+
//# sourceMappingURL=button.js.map
|
|
69
|
+
//# sourceMappingURL=button.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/utils.ts","../../src/react/button.tsx"],"names":[],"mappings":";;;;;;AAGO,SAAS,MAAM,MAAA,EAAsB;AAC1C,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;ACDA,IAAM,SAAA,GAAY;AAAA,EAChB,EAAA,EAAI,qFAAA;AAAA,EACJ,OAAA,EACE,uFAAA;AAAA,EACF,EAAA,EAAI;AACN,CAAA;AAGA,IAAM,iBAAA,GAAoB;AAAA,EACxB,EAAA,EAAI,uEAAA;AAAA,EACJ,OAAA,EACE,0EAAA;AAAA,EACF,EAAA,EAAI;AACN,CAAA;AAEA,IAAM,YAAA,GAAe;AAAA,EACnB,IAAA,EAAM,cAAA;AAAA,EACN,EAAA,EAAI,YAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAEA,IAAM,YAAA,GAAe;AAAA,EACnB,OAAA,EACE,+FAAA;AAAA,EACF,SAAA,EACE,wEAAA;AAAA,EACF,WAAA,EACE,wEAAA;AAAA,EACF,OAAA,EACE;AACJ,CAAA;AAuBA,IAAM,MAAA,GAAe,KAAA,CAAA,UAAA;AAAA,EACnB,CACE;AAAA,IACE,SAAA;AAAA,IACA,IAAA,GAAO,QAAA;AAAA,IACP,OAAA,GAAU,WAAA;AAAA,IACV,OAAA,EAAS,WAAA;AAAA,IACT,IAAA,GAAO,SAAA;AAAA,IACP,QAAA,GAAW,KAAA;AAAA,IACX,QAAA;AAAA,IACA,GAAG;AAAA,KAEL,GAAA,KACG;AACH,IAAA,MAAM,OAAA,GAAU,WAAA,KAAgB,QAAA,GAAW,IAAA,GAAO,MAAA,CAAA;AAElD,IAAA,uBACE,GAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA;AAAA,QACA,QAAA;AAAA,QACA,WAAA,EAAU,QAAA;AAAA,QACV,gBAAA,EAAgB,WAAW,EAAA,GAAK,MAAA;AAAA,QAChC,SAAA,EAAW,EAAA;AAAA,UACT,gPAAA;AAAA,UACA,8EAAA;AAAA,UACA,uGAAA;AAAA,UACA,QAAA,GAAW,iBAAA,CAAkB,IAAI,CAAA,GAAI,UAAU,IAAI,CAAA;AAAA,UACnD,aAAa,OAAO,CAAA;AAAA,UACpB,aAAa,OAAO,CAAA;AAAA,UACpB;AAAA,SACF;AAAA,QACA,GAAA;AAAA,QACC,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACF;AACA,MAAA,CAAO,WAAA,GAAc,QAAA","file":"button.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\nconst sizeClass = {\n xs: \"h-8 min-h-8 gap-2 px-4 text-xs has-[>svg]:px-3 [&_svg:not([class*='size-'])]:size-3\",\n default:\n \"h-10 min-h-10 gap-2 px-5 text-sm has-[>svg]:px-4 [&_svg:not([class*='size-'])]:size-4\",\n lg: \"h-11 min-h-11 gap-2 px-6 text-base has-[>svg]:px-5 [&_svg:not([class*='size-'])]:size-5\",\n} as const;\n\n/** Square hit targets for `iconOnly` — same keys as `sizeClass` (`default` | `lg`). */\nconst iconOnlySizeClass = {\n xs: \"size-8 min-h-8 min-w-8 gap-0 p-0 [&_svg:not([class*='size-'])]:size-3\",\n default:\n \"size-10 min-h-10 min-w-10 gap-0 p-0 [&_svg:not([class*='size-'])]:size-4\",\n lg: \"size-11 min-h-11 min-w-11 gap-0 p-0 [&_svg:not([class*='size-'])]:size-5\",\n} as const;\n\nconst roundedClass = {\n full: \"rounded-full\",\n lg: \"rounded-lg\",\n md: \"rounded-md\",\n} as const;\n\nconst variantClass = {\n primary:\n \"bg-primary text-background border border-transparent hover:bg-primary/90 active:bg-primary/85\",\n secondary:\n \"bg-background text-primary border border-primary/10 hover:bg-primary/5\",\n destructive:\n \"bg-background text-red-500 border border-red-500/25 hover:bg-red-500/5\",\n success:\n \"bg-background text-green-500 border border-green-500/25 hover:bg-green-500/5\",\n} as const;\n\nexport type ButtonProps = React.ComponentProps<\"button\"> & {\n /**\n * Visual style: neutral (`secondary`, `primary`), or outline (`destructive`,\n * `success`) using Tailwind `red-500` / `green-500` text and matching borders on\n * `bg-background` (no solid fill).\n */\n variant?: keyof typeof variantClass;\n /**\n * Corner radius. Labeled buttons default to `full` (pill). `iconOnly` buttons\n * default to `md` (square corners) unless you pass `rounded` explicitly.\n */\n rounded?: keyof typeof roundedClass;\n /** Height and horizontal padding: `default` or `lg` only. */\n size?: keyof typeof sizeClass;\n /**\n * Square icon-only control; same `size` presets (`default` | `lg`). Pair with\n * `aria-label` (or `title`) when there is no visible text.\n */\n iconOnly?: boolean;\n};\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n className,\n type = \"button\",\n variant = \"secondary\",\n rounded: roundedProp,\n size = \"default\",\n iconOnly = false,\n disabled,\n ...props\n },\n ref,\n ) => {\n const rounded = roundedProp ?? (iconOnly ? \"md\" : \"full\");\n\n return (\n <button\n type={type}\n disabled={disabled}\n data-slot=\"button\"\n data-icon-only={iconOnly ? \"\" : undefined}\n className={cn(\n \"inline-flex shrink-0 cursor-pointer items-center justify-center whitespace-nowrap outline-none transition-[color,background-color,box-shadow,transform] duration-150 ease-out active:scale-[0.98] [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n \"disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50\",\n \"focus-visible:border-ring font-bold tracking-wide focus-visible:ring-ring/50 focus-visible:ring-[3px]\",\n iconOnly ? iconOnlySizeClass[size] : sizeClass[size],\n roundedClass[rounded],\n variantClass[variant],\n className,\n )}\n ref={ref}\n {...props}\n />\n );\n },\n);\nButton.displayName = \"Button\";\n\nexport { Button };\n"]}
|
package/dist/react/dialog.d.ts
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
import
|
|
1
|
+
import React__default from 'react';
|
|
2
2
|
|
|
3
3
|
interface DialogProps {
|
|
4
|
-
children:
|
|
4
|
+
children: React__default.ReactNode;
|
|
5
5
|
open?: boolean;
|
|
6
6
|
onOpenChange?: (open: boolean) => void;
|
|
7
7
|
}
|
|
8
|
-
declare const Dialog:
|
|
9
|
-
declare const DialogTrigger:
|
|
10
|
-
children:
|
|
8
|
+
declare const Dialog: React__default.FC<DialogProps>;
|
|
9
|
+
declare const DialogTrigger: React__default.FC<{
|
|
10
|
+
children: React__default.ReactNode;
|
|
11
11
|
asChild?: boolean;
|
|
12
12
|
}>;
|
|
13
|
-
declare const DialogClose:
|
|
14
|
-
children:
|
|
13
|
+
declare const DialogClose: React__default.FC<{
|
|
14
|
+
children: React__default.ReactNode;
|
|
15
15
|
asChild?: boolean;
|
|
16
16
|
}>;
|
|
17
|
-
interface DialogContentProps extends
|
|
17
|
+
interface DialogContentProps extends React__default.HTMLAttributes<HTMLDivElement> {
|
|
18
18
|
size?: "sm" | "md" | "lg" | "xl" | "full";
|
|
19
19
|
duration?: number;
|
|
20
20
|
closeOnOverlayClick?: boolean;
|
|
@@ -27,14 +27,14 @@ interface DialogContentProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
|
27
27
|
/** Override slide distance (px); default follows `size` via `SLIDE_ENTRANCE_OFFSET_PX`. */
|
|
28
28
|
slideEntranceOffsetPx?: number;
|
|
29
29
|
}
|
|
30
|
-
declare const DialogContent:
|
|
31
|
-
declare const DialogHeader:
|
|
30
|
+
declare const DialogContent: React__default.FC<DialogContentProps>;
|
|
31
|
+
declare const DialogHeader: React__default.FC<React__default.HTMLAttributes<HTMLDivElement> & {
|
|
32
32
|
fixed?: boolean;
|
|
33
33
|
}>;
|
|
34
|
-
declare const DialogFooter:
|
|
34
|
+
declare const DialogFooter: React__default.FC<React__default.HTMLAttributes<HTMLDivElement> & {
|
|
35
35
|
fixed?: boolean;
|
|
36
36
|
}>;
|
|
37
|
-
declare const DialogTitle:
|
|
38
|
-
declare const DialogDescription:
|
|
37
|
+
declare const DialogTitle: React__default.FC<React__default.HTMLAttributes<HTMLHeadingElement>>;
|
|
38
|
+
declare const DialogDescription: React__default.FC<React__default.HTMLAttributes<HTMLParagraphElement>>;
|
|
39
39
|
|
|
40
40
|
export { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger };
|
package/dist/react/dialog.js
CHANGED
|
@@ -202,7 +202,8 @@ var DialogContent = ({
|
|
|
202
202
|
type: "button",
|
|
203
203
|
onClick: closeDialog,
|
|
204
204
|
className: cn(
|
|
205
|
-
|
|
205
|
+
// Above in-panel sticky layers (e.g. ScrollHeaderSticky z-40)
|
|
206
|
+
"absolute top-4 right-4 z-100 flex size-12 cursor-pointer items-center justify-center rounded-full bg-background transition-all hover:bg-secondary-background active:scale-[0.96] md:top-4 md:right-4"
|
|
206
207
|
),
|
|
207
208
|
children: [
|
|
208
209
|
/* @__PURE__ */ jsx(X, { className: "size-5.5" }),
|
package/dist/react/dialog.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/lib/utils.ts","../../src/react/dialog.tsx"],"names":[],"mappings":";;;;;;;AAGO,SAAS,MAAM,MAAA,EAAsB;AAC1C,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;ACEA,IAAM,gBAAA,GAAmB,GAAA;AACzB,IAAM,0BAAA,GAA6B,gCAAA;AACnC,IAAM,yBAAA,GAA4B,gCAAA;AAQlC,IAAM,wBAAA,GAAuD;AAAA,EAC3D,EAAA,EAAI,EAAA;AAAA,EACJ,EAAA,EAAI,EAAA;AAAA,EACJ,EAAA,EAAI,EAAA;AAAA,EACJ,EAAA,EAAI,EAAA;AAAA,EACJ,IAAA,EAAM;AACR,CAAA;AAGA,SAAS,wBAAA,CAAyB,MAAe,YAAA,EAAsB;AACrE,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,SAAS,IAAI,CAAA;AACrD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAS,KAAK,CAAA;AAEpD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,eAAA,CAAgB,IAAI,CAAA;AAAA,IACtB,CAAA,MAAO;AACL,MAAA,cAAA,CAAe,KAAK,CAAA;AACpB,MAAA,MAAM,QAAQ,UAAA,CAAW,MAAM,eAAA,CAAgB,KAAK,GAAG,YAAY,CAAA;AACnE,MAAA,OAAO,MAAM,aAAa,KAAK,CAAA;AAAA,IACjC;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,EAAM,YAAY,CAAC,CAAA;AAEvB,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,YAAA,IAAgB,CAAC,IAAA,EAAM;AAE5B,IAAA,IAAI,IAAA,GAAO,CAAA;AACX,IAAA,MAAM,IAAA,GAAO,sBAAsB,MAAM;AACvC,MAAA,IAAA,GAAO,qBAAA,CAAsB,MAAM,cAAA,CAAe,IAAI,CAAC,CAAA;AAAA,IACzD,CAAC,CAAA;AACD,IAAA,OAAO,MAAM;AACX,MAAA,oBAAA,CAAqB,IAAI,CAAA;AACzB,MAAA,IAAI,IAAA,uBAA2B,IAAI,CAAA;AAAA,IACrC,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,YAAA,EAAc,IAAI,CAAC,CAAA;AAEvB,EAAA,OAAO,EAAE,cAAc,WAAA,EAAY;AACrC;AAIA,IAAM,aAAA,GAAgB,KAAA,CAAM,aAAA,CAM1B,MAAS,CAAA;AAEX,SAAS,SAAA,GAAY;AACnB,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,UAAA,CAAW,aAAa,CAAA;AAC9C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,oDAAoD,CAAA;AAAA,EACtE;AACA,EAAA,OAAO,OAAA;AACT;AAUO,IAAM,SAAgC,CAAC;AAAA,EAC5C,QAAA;AAAA,EACA,IAAA,EAAM,cAAA;AAAA,EACN;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,SAAS,KAAK,CAAA;AACtD,EAAA,MAAM,eAAe,cAAA,KAAmB,MAAA;AACxC,EAAA,MAAM,IAAA,GAAO,eAAe,cAAA,GAAiB,YAAA;AAE7C,EAAA,MAAM,UAAU,KAAA,CAAM,WAAA;AAAA,IACpB,CAAC,KAAA,KAAmB;AAClB,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,MACvB;AACA,MAAA,YAAA,GAAe,KAAK,CAAA;AAAA,IACtB,CAAA;AAAA,IACA,CAAC,cAAc,YAAY;AAAA,GAC7B;AAEA,EAAA,uBACE,GAAA,CAAC,cAAc,QAAA,EAAd,EAAuB,OAAO,EAAE,IAAA,EAAM,OAAA,EAAQ,EAC5C,QAAA,EACH,CAAA;AAEJ;AAEO,IAAM,aAAA,GAGR,CAAC,EAAE,QAAA,EAAU,SAAQ,KAAM;AAC9B,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,SAAA,EAAU;AAE9B,EAAA,MAAM,WAAA,GAAc,MAAM,OAAA,CAAQ,IAAI,CAAA;AAEtC,EAAA,IAAI,OAAA,IAAW,KAAA,CAAM,cAAA,CAAe,QAAQ,CAAA,EAAG;AAC7C,IAAA,MAAM,KAAA,GAAQ,QAAA;AAGd,IAAA,OAAO,KAAA,CAAM,aAAa,KAAA,EAAO;AAAA,MAC/B,OAAA,EAAS,CAAC,CAAA,KAAwB;AAChC,QAAA,KAAA,CAAM,KAAA,CAAM,UAAU,CAAC,CAAA;AACvB,QAAA,WAAA,EAAY;AAAA,MACd;AAAA,KACD,CAAA;AAAA,EACH;AAEA,EAAA,2BACG,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,OAAA,EAAS,aAC5B,QAAA,EACH,CAAA;AAEJ;AAEO,IAAM,WAAA,GAGR,CAAC,EAAE,QAAA,EAAU,SAAQ,KAAM;AAC9B,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,SAAA,EAAU;AAE9B,EAAA,MAAM,WAAA,GAAc,MAAM,OAAA,CAAQ,KAAK,CAAA;AAEvC,EAAA,IAAI,OAAA,IAAW,KAAA,CAAM,cAAA,CAAe,QAAQ,CAAA,EAAG;AAC7C,IAAA,MAAM,KAAA,GAAQ,QAAA;AAGd,IAAA,OAAO,KAAA,CAAM,aAAa,KAAA,EAAO;AAAA,MAC/B,OAAA,EAAS,CAAC,CAAA,KAAwB;AAChC,QAAA,KAAA,CAAM,KAAA,CAAM,UAAU,CAAC,CAAA;AACvB,QAAA,WAAA,EAAY;AAAA,MACd;AAAA,KACD,CAAA;AAAA,EACH;AAEA,EAAA,2BACG,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,OAAA,EAAS,aAC5B,QAAA,EACH,CAAA;AAEJ;AAkBO,IAAM,gBAA8C,CAAC;AAAA,EAC1D,QAAA;AAAA,EACA,IAAA,GAAO,IAAA;AAAA,EACP,SAAA;AAAA,EACA,QAAA,GAAW,GAAA;AAAA,EACX,mBAAA,GAAsB,IAAA;AAAA,EACtB,SAAA,GAAY,IAAA;AAAA,EACZ,aAAA,GAAgB,KAAA;AAAA,EAChB,qBAAA,EAAuB,yBAAA;AAAA,EACvB,GAAG;AACL,CAAA,KAAM;AACJ,EAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,SAAA,EAAU;AACpC,EAAA,MAAM,WAAA,GAAc,YAAY,MAAM,OAAA,CAAQ,KAAK,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAE/D,EAAA,MAAM,aAAA,GACJ,yBAAA,IAA6B,wBAAA,CAAyB,IAAI,CAAA;AAE5D,EAAA,MAAM,YAAA,GAAe,gBAAgB,gBAAA,GAAmB,QAAA;AACxD,EAAA,MAAM,EAAE,YAAA,EAAc,WAAA,EAAY,GAAI,wBAAA;AAAA,IACpC,IAAA;AAAA,IACA;AAAA,GACF;AAGA,EAAA,MAAM,iBAAA,GAAoB,OACtB,0BAAA,GACA,yBAAA;AAEJ,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,SAAA,GAAY,CAAC,CAAA,KAAqB;AACtC,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,QAAA,EAAU,OAAA,CAAQ,KAAK,CAAA;AAAA,IACvC,CAAA;AACA,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACnC,QAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,SAAS,CAAA;AAC5C,QAAA,QAAA,CAAS,IAAA,CAAK,MAAM,QAAA,GAAW,QAAA;AAAA,MACjC;AAAA,IACF;AACA,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACnC,QAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,SAAS,CAAA;AAC/C,QAAA,QAAA,CAAS,IAAA,CAAK,MAAM,QAAA,GAAW,EAAA;AAAA,MACjC;AAAA,IACF,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,EAAM,OAAO,CAAC,CAAA;AAElB,EAAA,IAAI,CAAC,cAAc,OAAO,IAAA;AAE1B,EAAA,MAAM,WAAA,GAAyD;AAAA,IAC7D,EAAA,EAAI,aAAA;AAAA,IACJ,EAAA,EAAI,aAAA;AAAA,IACJ,EAAA,EAAI,aAAA;AAAA,IACJ,EAAA,EAAI;AAAA,GACN;AAEA,EAAA,OAAO,YAAA;AAAA,oBACL,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,EAAA;AAAA,UACT,yBAAA;AAAA,UACA,IAAA,KAAS,SACL,2BAAA,GACA;AAAA,SACN;AAAA,QAGA,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,EAAA;AAAA,gBACT,4CAAA;AAAA,gBACA,CAAC,aAAA,IAAiB,gCAAA;AAAA,gBAClB,cAAc,aAAA,GAAgB;AAAA,eAChC;AAAA,cACA,KAAA,EAAO;AAAA,gBACL,kBAAA,EAAoB,GAAG,YAAY,CAAA,EAAA,CAAA;AAAA,gBACnC,GAAI,aAAA,GACA;AAAA,kBACE,kBAAA,EAAoB,SAAA;AAAA,kBACpB,wBAAA,EAA0B;AAAA,oBAE5B;AAAC,eACP;AAAA,cACA,OAAA,EAAS,MAAM,mBAAA,IAAuB,OAAA,CAAQ,KAAK;AAAA;AAAA,WACrD;AAAA,0BAGA,IAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACE,GAAG,KAAA;AAAA,cACJ,SAAA,EAAW,EAAA;AAAA,gBACT,+DAAA;AAAA,gBACA,SAAS,MAAA,GACL,sDAAA,GACA,GAAG,sCAAA,EAAwC,WAAA,CAAY,IAAI,CAAC,CAAA;AAAA,gBAChE,CAAC,aAAA,IACC,EAAA;AAAA,kBACE,4BAAA;AAAA,kBACA,cAAc,uBAAA,GAA0B;AAAA,iBAC1C;AAAA,gBACF;AAAA,eACF;AAAA,cACA,KAAA,EAAO;AAAA,gBACL,GAAG,KAAA,CAAM,KAAA;AAAA,gBACT,GAAI,aAAA,GACA;AAAA,kBACE,SAAA,EAAW,WAAA,GACP,eAAA,GACA,CAAA,WAAA,EAAc,aAAa,CAAA,GAAA,CAAA;AAAA,kBAC/B,OAAA,EAAS,cAAc,CAAA,GAAI,CAAA;AAAA,kBAC3B,kBAAA,EAAoB,oBAAA;AAAA,kBACpB,kBAAA,EAAoB,GAAG,gBAAgB,CAAA,EAAA,CAAA;AAAA,kBACvC,wBAAA,EAA0B;AAAA,iBAC5B,GACA;AAAA,kBACE,kBAAA,EAAoB,GAAG,QAAQ,CAAA,EAAA;AAAA;AACjC,eACN;AAAA,cAEC,QAAA,EAAA;AAAA,gBAAA,QAAA;AAAA,gBAEA,SAAA,oBACC,IAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,QAAA;AAAA,oBACL,OAAA,EAAS,WAAA;AAAA,oBACT,SAAA,EAAW,EAAA;AAAA,sBACT;AAAA,qBACF;AAAA,oBAEA,QAAA,EAAA;AAAA,sCAAA,GAAA,CAAC,CAAA,EAAA,EAAE,WAAU,UAAA,EAAW,CAAA;AAAA,sCACxB,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,QAAA,EAAA,OAAA,EAAK;AAAA;AAAA;AAAA;AACjC;AAAA;AAAA;AAEJ;AAAA;AAAA,KACF;AAAA,IACA,QAAA,CAAS;AAAA,GACX;AACF;AAEO,IAAM,eAET,CAAC,EAAE,WAAW,KAAA,EAAO,GAAG,OAAM,KAAM;AACtC,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,wDAAA;AAAA,QACA,KAAA,IAAS,4DAAA;AAAA,QACT;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;AAEO,IAAM,eAET,CAAC,EAAE,WAAW,KAAA,EAAO,GAAG,OAAM,KAAM;AACtC,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,mEAAA;AAAA,QACA,KAAA,IACE,+DAAA;AAAA,QACF;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;AAEO,IAAM,cAET,CAAC,EAAE,SAAA,EAAW,GAAG,OAAM,KAAM;AAC/B,EAAA,uBACE,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,iDAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;AAEO,IAAM,oBAET,CAAC,EAAE,SAAA,EAAW,GAAG,OAAM,KAAM;AAC/B,EAAA,uBACE,GAAA,CAAC,OAAE,SAAA,EAAW,EAAA,CAAG,iCAAiC,SAAS,CAAA,EAAI,GAAG,KAAA,EAAO,CAAA;AAE7E","file":"dialog.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","\"use client\";\nimport React, { useCallback, useEffect, useState } from \"react\";\nimport { cn } from \"@/lib/utils\";\nimport { createPortal } from \"react-dom\";\nimport { X } from \"lucide-react\";\n\n/** Used when `slideEntrance` is set — duration + entry/exit easing (see `slideMotionEasing`). */\nconst DIALOG_MOTION_MS = 200;\nconst DIALOG_ENTRY_MOTION_EASING = \"cubic-bezier(0.85, 0, 0.15, 1)\";\nconst DIALOG_EXIT_MOTION_EASING = \"cubic-bezier(0.85, 0, 1, 0.15)\";\n\ntype DialogSize = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\";\n\n/**\n * Slide distance for `slideEntrance`, scaled to `size` (full keeps 120px like a\n * mobile sheet; smaller presets use shorter travel so the motion matches width).\n */\nconst SLIDE_ENTRANCE_OFFSET_PX: Record<DialogSize, number> = {\n sm: 16,\n md: 16,\n lg: 16,\n xl: 16,\n full: 120,\n};\n\n/** Same pattern as `useSheetRenderLifecycle` in sheet.tsx (portal + enter/exit timing). */\nfunction useDialogRenderLifecycle(open: boolean, panelCloseMs: number) {\n const [shouldRender, setShouldRender] = useState(open);\n const [isAnimating, setIsAnimating] = useState(false);\n\n useEffect(() => {\n if (open) {\n setShouldRender(true);\n } else {\n setIsAnimating(false);\n const timer = setTimeout(() => setShouldRender(false), panelCloseMs);\n return () => clearTimeout(timer);\n }\n }, [open, panelCloseMs]);\n\n useEffect(() => {\n if (!shouldRender || !open) return;\n\n let raf2 = 0;\n const raf1 = requestAnimationFrame(() => {\n raf2 = requestAnimationFrame(() => setIsAnimating(true));\n });\n return () => {\n cancelAnimationFrame(raf1);\n if (raf2) cancelAnimationFrame(raf2);\n };\n }, [shouldRender, open]);\n\n return { shouldRender, isAnimating };\n}\n\n//////////////////////////////////////////////// Context\n\nconst DialogContext = React.createContext<\n | {\n open: boolean;\n setOpen: (open: boolean) => void;\n }\n | undefined\n>(undefined);\n\nfunction useDialog() {\n const context = React.useContext(DialogContext);\n if (!context) {\n throw new Error(\"Dialog components must be used within a <Dialog />\");\n }\n return context;\n}\n\n//////////////////////////////////////////////// Main\n\ninterface DialogProps {\n children: React.ReactNode;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\nexport const Dialog: React.FC<DialogProps> = ({\n children,\n open: controlledOpen,\n onOpenChange,\n}) => {\n const [internalOpen, setInternalOpen] = useState(false);\n const isControlled = controlledOpen !== undefined;\n const open = isControlled ? controlledOpen : internalOpen;\n\n const setOpen = React.useCallback(\n (value: boolean) => {\n if (!isControlled) {\n setInternalOpen(value);\n }\n onOpenChange?.(value);\n },\n [isControlled, onOpenChange],\n );\n\n return (\n <DialogContext.Provider value={{ open, setOpen }}>\n {children}\n </DialogContext.Provider>\n );\n};\n\nexport const DialogTrigger: React.FC<{\n children: React.ReactNode;\n asChild?: boolean;\n}> = ({ children, asChild }) => {\n const { setOpen } = useDialog();\n\n const handleClick = () => setOpen(true);\n\n if (asChild && React.isValidElement(children)) {\n const child = children as React.ReactElement<{\n onClick?: React.MouseEventHandler;\n }>;\n return React.cloneElement(child, {\n onClick: (e: React.MouseEvent) => {\n child.props.onClick?.(e);\n handleClick();\n },\n });\n }\n\n return (\n <button type=\"button\" onClick={handleClick}>\n {children}\n </button>\n );\n};\n\nexport const DialogClose: React.FC<{\n children: React.ReactNode;\n asChild?: boolean;\n}> = ({ children, asChild }) => {\n const { setOpen } = useDialog();\n\n const handleClick = () => setOpen(false);\n\n if (asChild && React.isValidElement(children)) {\n const child = children as React.ReactElement<{\n onClick?: React.MouseEventHandler;\n }>;\n return React.cloneElement(child, {\n onClick: (e: React.MouseEvent) => {\n child.props.onClick?.(e);\n handleClick();\n },\n });\n }\n\n return (\n <button type=\"button\" onClick={handleClick}>\n {children}\n </button>\n );\n};\n\n//////////////////////////////////////////////// Content\n\ninterface DialogContentProps extends React.HTMLAttributes<HTMLDivElement> {\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\";\n duration?: number;\n closeOnOverlayClick?: boolean;\n showClose?: boolean;\n /**\n * When `true`, panel uses translateY + opacity with fixed timing and separate\n * entry/exit curves (works with any `size`). Default `false` uses scale + fade.\n */\n slideEntrance?: boolean;\n /** Override slide distance (px); default follows `size` via `SLIDE_ENTRANCE_OFFSET_PX`. */\n slideEntranceOffsetPx?: number;\n}\n\nexport const DialogContent: React.FC<DialogContentProps> = ({\n children,\n size = \"md\",\n className,\n duration = 200,\n closeOnOverlayClick = true,\n showClose = true,\n slideEntrance = false,\n slideEntranceOffsetPx: slideEntranceOffsetPxProp,\n ...props\n}) => {\n const { open, setOpen } = useDialog();\n const closeDialog = useCallback(() => setOpen(false), [setOpen]);\n\n const slideOffsetPx =\n slideEntranceOffsetPxProp ?? SLIDE_ENTRANCE_OFFSET_PX[size];\n\n const panelCloseMs = slideEntrance ? DIALOG_MOTION_MS : duration;\n const { shouldRender, isAnimating } = useDialogRenderLifecycle(\n open,\n panelCloseMs,\n );\n\n /** Slide entrance: entry easing while opening, exit easing while closing. */\n const slideMotionEasing = open\n ? DIALOG_ENTRY_MOTION_EASING\n : DIALOG_EXIT_MOTION_EASING;\n\n useEffect(() => {\n const handleEsc = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") setOpen(false);\n };\n if (open) {\n if (typeof document !== \"undefined\") {\n window.addEventListener(\"keydown\", handleEsc);\n document.body.style.overflow = \"hidden\";\n }\n }\n return () => {\n if (typeof document !== \"undefined\") {\n window.removeEventListener(\"keydown\", handleEsc);\n document.body.style.overflow = \"\";\n }\n };\n }, [open, setOpen]);\n\n if (!shouldRender) return null;\n\n const sizeClasses: Record<\"sm\" | \"md\" | \"lg\" | \"xl\", string> = {\n sm: \"sm:max-w-sm\",\n md: \"sm:max-w-md\",\n lg: \"sm:max-w-lg\",\n xl: \"sm:max-w-xl\",\n };\n\n return createPortal(\n <div\n className={cn(\n \"fixed inset-0 z-50 flex\",\n size === \"full\"\n ? \"h-dvh w-full flex-col p-0\"\n : \"items-center justify-center p-4\",\n )}\n >\n {/* Overlay */}\n <div\n className={cn(\n \"fixed inset-0 bg-black/40 dark:bg-black/60\",\n !slideEntrance && \"transition-opacity ease-in-out\",\n isAnimating ? \"opacity-100\" : \"opacity-0\",\n )}\n style={{\n transitionDuration: `${panelCloseMs}ms`,\n ...(slideEntrance\n ? {\n transitionProperty: \"opacity\",\n transitionTimingFunction: slideMotionEasing,\n }\n : {}),\n }}\n onClick={() => closeOnOverlayClick && setOpen(false)}\n />\n\n {/* Panel */}\n <div\n {...props}\n className={cn(\n \"bg-background relative z-50 w-full overflow-hidden shadow-2xl\",\n size === \"full\"\n ? \"flex min-h-0 flex-1 flex-col max-w-none rounded-none\"\n : cn(\"border-primary/10 rounded-2xl border\", sizeClasses[size]),\n !slideEntrance &&\n cn(\n \"transition-all ease-in-out\",\n isAnimating ? \"scale-100 opacity-100\" : \"scale-95 opacity-0\",\n ),\n className,\n )}\n style={{\n ...props.style,\n ...(slideEntrance\n ? {\n transform: isAnimating\n ? \"translateY(0)\"\n : `translateY(${slideOffsetPx}px)`,\n opacity: isAnimating ? 1 : 0,\n transitionProperty: \"transform, opacity\",\n transitionDuration: `${DIALOG_MOTION_MS}ms`,\n transitionTimingFunction: slideMotionEasing,\n }\n : {\n transitionDuration: `${duration}ms`,\n }),\n }}\n >\n {children}\n\n {showClose && (\n <button\n type=\"button\"\n onClick={closeDialog}\n className={cn(\n \"absolute flex size-12 cursor-pointer items-center justify-center rounded-full bg-background transition-all hover:bg-secondary-background active:scale-[0.96] top-4 right-4 md:top-5 md:right-5\",\n )}\n >\n <X className=\"size-5.5\" />\n <span className=\"sr-only\">Close</span>\n </button>\n )}\n </div>\n </div>,\n document.body,\n );\n};\n\nexport const DialogHeader: React.FC<\n React.HTMLAttributes<HTMLDivElement> & { fixed?: boolean }\n> = ({ className, fixed, ...props }) => {\n return (\n <div\n className={cn(\n \"flex flex-col space-y-1.5 p-6 text-center sm:text-left\",\n fixed && \"bg-background border-primary/10 sticky top-0 z-10 border-b\",\n className,\n )}\n {...props}\n />\n );\n};\n\nexport const DialogFooter: React.FC<\n React.HTMLAttributes<HTMLDivElement> & { fixed?: boolean }\n> = ({ className, fixed, ...props }) => {\n return (\n <div\n className={cn(\n \"flex flex-col-reverse p-6 sm:flex-row sm:justify-end sm:space-x-2\",\n fixed &&\n \"bg-background border-primary/10 sticky bottom-0 z-10 border-t\",\n className,\n )}\n {...props}\n />\n );\n};\n\nexport const DialogTitle: React.FC<\n React.HTMLAttributes<HTMLHeadingElement>\n> = ({ className, ...props }) => {\n return (\n <h3\n className={cn(\n \"text-primary text-xl leading-none font-semibold\",\n className,\n )}\n {...props}\n />\n );\n};\n\nexport const DialogDescription: React.FC<\n React.HTMLAttributes<HTMLParagraphElement>\n> = ({ className, ...props }) => {\n return (\n <p className={cn(\"text-muted-foreground text-sm\", className)} {...props} />\n );\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/lib/utils.ts","../../src/react/dialog.tsx"],"names":[],"mappings":"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","file":"dialog.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","\"use client\";\nimport React, { useCallback, useEffect, useState } from \"react\";\nimport { cn } from \"@/lib/utils\";\nimport { createPortal } from \"react-dom\";\nimport { X } from \"lucide-react\";\n\n/** Used when `slideEntrance` is set — duration + entry/exit easing (see `slideMotionEasing`). */\nconst DIALOG_MOTION_MS = 200;\nconst DIALOG_ENTRY_MOTION_EASING = \"cubic-bezier(0.85, 0, 0.15, 1)\";\nconst DIALOG_EXIT_MOTION_EASING = \"cubic-bezier(0.85, 0, 1, 0.15)\";\n\ntype DialogSize = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\";\n\n/**\n * Slide distance for `slideEntrance`, scaled to `size` (full keeps 120px like a\n * mobile sheet; smaller presets use shorter travel so the motion matches width).\n */\nconst SLIDE_ENTRANCE_OFFSET_PX: Record<DialogSize, number> = {\n sm: 16,\n md: 16,\n lg: 16,\n xl: 16,\n full: 120,\n};\n\n/** Same pattern as `useSheetRenderLifecycle` in sheet.tsx (portal + enter/exit timing). */\nfunction useDialogRenderLifecycle(open: boolean, panelCloseMs: number) {\n const [shouldRender, setShouldRender] = useState(open);\n const [isAnimating, setIsAnimating] = useState(false);\n\n useEffect(() => {\n if (open) {\n setShouldRender(true);\n } else {\n setIsAnimating(false);\n const timer = setTimeout(() => setShouldRender(false), panelCloseMs);\n return () => clearTimeout(timer);\n }\n }, [open, panelCloseMs]);\n\n useEffect(() => {\n if (!shouldRender || !open) return;\n\n let raf2 = 0;\n const raf1 = requestAnimationFrame(() => {\n raf2 = requestAnimationFrame(() => setIsAnimating(true));\n });\n return () => {\n cancelAnimationFrame(raf1);\n if (raf2) cancelAnimationFrame(raf2);\n };\n }, [shouldRender, open]);\n\n return { shouldRender, isAnimating };\n}\n\n//////////////////////////////////////////////// Context\n\nconst DialogContext = React.createContext<\n | {\n open: boolean;\n setOpen: (open: boolean) => void;\n }\n | undefined\n>(undefined);\n\nfunction useDialog() {\n const context = React.useContext(DialogContext);\n if (!context) {\n throw new Error(\"Dialog components must be used within a <Dialog />\");\n }\n return context;\n}\n\n//////////////////////////////////////////////// Main\n\ninterface DialogProps {\n children: React.ReactNode;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\nexport const Dialog: React.FC<DialogProps> = ({\n children,\n open: controlledOpen,\n onOpenChange,\n}) => {\n const [internalOpen, setInternalOpen] = useState(false);\n const isControlled = controlledOpen !== undefined;\n const open = isControlled ? controlledOpen : internalOpen;\n\n const setOpen = React.useCallback(\n (value: boolean) => {\n if (!isControlled) {\n setInternalOpen(value);\n }\n onOpenChange?.(value);\n },\n [isControlled, onOpenChange],\n );\n\n return (\n <DialogContext.Provider value={{ open, setOpen }}>\n {children}\n </DialogContext.Provider>\n );\n};\n\nexport const DialogTrigger: React.FC<{\n children: React.ReactNode;\n asChild?: boolean;\n}> = ({ children, asChild }) => {\n const { setOpen } = useDialog();\n\n const handleClick = () => setOpen(true);\n\n if (asChild && React.isValidElement(children)) {\n const child = children as React.ReactElement<{\n onClick?: React.MouseEventHandler;\n }>;\n return React.cloneElement(child, {\n onClick: (e: React.MouseEvent) => {\n child.props.onClick?.(e);\n handleClick();\n },\n });\n }\n\n return (\n <button type=\"button\" onClick={handleClick}>\n {children}\n </button>\n );\n};\n\nexport const DialogClose: React.FC<{\n children: React.ReactNode;\n asChild?: boolean;\n}> = ({ children, asChild }) => {\n const { setOpen } = useDialog();\n\n const handleClick = () => setOpen(false);\n\n if (asChild && React.isValidElement(children)) {\n const child = children as React.ReactElement<{\n onClick?: React.MouseEventHandler;\n }>;\n return React.cloneElement(child, {\n onClick: (e: React.MouseEvent) => {\n child.props.onClick?.(e);\n handleClick();\n },\n });\n }\n\n return (\n <button type=\"button\" onClick={handleClick}>\n {children}\n </button>\n );\n};\n\n//////////////////////////////////////////////// Content\n\ninterface DialogContentProps extends React.HTMLAttributes<HTMLDivElement> {\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\";\n duration?: number;\n closeOnOverlayClick?: boolean;\n showClose?: boolean;\n /**\n * When `true`, panel uses translateY + opacity with fixed timing and separate\n * entry/exit curves (works with any `size`). Default `false` uses scale + fade.\n */\n slideEntrance?: boolean;\n /** Override slide distance (px); default follows `size` via `SLIDE_ENTRANCE_OFFSET_PX`. */\n slideEntranceOffsetPx?: number;\n}\n\nexport const DialogContent: React.FC<DialogContentProps> = ({\n children,\n size = \"md\",\n className,\n duration = 200,\n closeOnOverlayClick = true,\n showClose = true,\n slideEntrance = false,\n slideEntranceOffsetPx: slideEntranceOffsetPxProp,\n ...props\n}) => {\n const { open, setOpen } = useDialog();\n const closeDialog = useCallback(() => setOpen(false), [setOpen]);\n\n const slideOffsetPx =\n slideEntranceOffsetPxProp ?? SLIDE_ENTRANCE_OFFSET_PX[size];\n\n const panelCloseMs = slideEntrance ? DIALOG_MOTION_MS : duration;\n const { shouldRender, isAnimating } = useDialogRenderLifecycle(\n open,\n panelCloseMs,\n );\n\n /** Slide entrance: entry easing while opening, exit easing while closing. */\n const slideMotionEasing = open\n ? DIALOG_ENTRY_MOTION_EASING\n : DIALOG_EXIT_MOTION_EASING;\n\n useEffect(() => {\n const handleEsc = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") setOpen(false);\n };\n if (open) {\n if (typeof document !== \"undefined\") {\n window.addEventListener(\"keydown\", handleEsc);\n document.body.style.overflow = \"hidden\";\n }\n }\n return () => {\n if (typeof document !== \"undefined\") {\n window.removeEventListener(\"keydown\", handleEsc);\n document.body.style.overflow = \"\";\n }\n };\n }, [open, setOpen]);\n\n if (!shouldRender) return null;\n\n const sizeClasses: Record<\"sm\" | \"md\" | \"lg\" | \"xl\", string> = {\n sm: \"sm:max-w-sm\",\n md: \"sm:max-w-md\",\n lg: \"sm:max-w-lg\",\n xl: \"sm:max-w-xl\",\n };\n\n return createPortal(\n <div\n className={cn(\n \"fixed inset-0 z-50 flex\",\n size === \"full\"\n ? \"h-dvh w-full flex-col p-0\"\n : \"items-center justify-center p-4\",\n )}\n >\n {/* Overlay */}\n <div\n className={cn(\n \"fixed inset-0 bg-black/40 dark:bg-black/60\",\n !slideEntrance && \"transition-opacity ease-in-out\",\n isAnimating ? \"opacity-100\" : \"opacity-0\",\n )}\n style={{\n transitionDuration: `${panelCloseMs}ms`,\n ...(slideEntrance\n ? {\n transitionProperty: \"opacity\",\n transitionTimingFunction: slideMotionEasing,\n }\n : {}),\n }}\n onClick={() => closeOnOverlayClick && setOpen(false)}\n />\n\n {/* Panel */}\n <div\n {...props}\n className={cn(\n \"bg-background relative z-50 w-full overflow-hidden shadow-2xl\",\n size === \"full\"\n ? \"flex min-h-0 flex-1 flex-col max-w-none rounded-none\"\n : cn(\"border-primary/10 rounded-2xl border\", sizeClasses[size]),\n !slideEntrance &&\n cn(\n \"transition-all ease-in-out\",\n isAnimating ? \"scale-100 opacity-100\" : \"scale-95 opacity-0\",\n ),\n className,\n )}\n style={{\n ...props.style,\n ...(slideEntrance\n ? {\n transform: isAnimating\n ? \"translateY(0)\"\n : `translateY(${slideOffsetPx}px)`,\n opacity: isAnimating ? 1 : 0,\n transitionProperty: \"transform, opacity\",\n transitionDuration: `${DIALOG_MOTION_MS}ms`,\n transitionTimingFunction: slideMotionEasing,\n }\n : {\n transitionDuration: `${duration}ms`,\n }),\n }}\n >\n {children}\n\n {showClose && (\n <button\n type=\"button\"\n onClick={closeDialog}\n className={cn(\n // Above in-panel sticky layers (e.g. ScrollHeaderSticky z-40)\n \"absolute top-4 right-4 z-100 flex size-12 cursor-pointer items-center justify-center rounded-full bg-background transition-all hover:bg-secondary-background active:scale-[0.96] md:top-4 md:right-4\",\n )}\n >\n <X className=\"size-5.5\" />\n <span className=\"sr-only\">Close</span>\n </button>\n )}\n </div>\n </div>,\n document.body,\n );\n};\n\nexport const DialogHeader: React.FC<\n React.HTMLAttributes<HTMLDivElement> & { fixed?: boolean }\n> = ({ className, fixed, ...props }) => {\n return (\n <div\n className={cn(\n \"flex flex-col space-y-1.5 p-6 text-center sm:text-left\",\n fixed && \"bg-background border-primary/10 sticky top-0 z-10 border-b\",\n className,\n )}\n {...props}\n />\n );\n};\n\nexport const DialogFooter: React.FC<\n React.HTMLAttributes<HTMLDivElement> & { fixed?: boolean }\n> = ({ className, fixed, ...props }) => {\n return (\n <div\n className={cn(\n \"flex flex-col-reverse p-6 sm:flex-row sm:justify-end sm:space-x-2\",\n fixed &&\n \"bg-background border-primary/10 sticky bottom-0 z-10 border-t\",\n className,\n )}\n {...props}\n />\n );\n};\n\nexport const DialogTitle: React.FC<\n React.HTMLAttributes<HTMLHeadingElement>\n> = ({ className, ...props }) => {\n return (\n <h3\n className={cn(\n \"text-primary text-xl leading-none font-semibold\",\n className,\n )}\n {...props}\n />\n );\n};\n\nexport const DialogDescription: React.FC<\n React.HTMLAttributes<HTMLParagraphElement>\n> = ({ className, ...props }) => {\n return (\n <p className={cn(\"text-muted-foreground text-sm\", className)} {...props} />\n );\n};\n"]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
|
|
3
|
+
declare const sizeClass: {
|
|
4
|
+
readonly sm: "h-9 min-h-9 px-3 text-sm";
|
|
5
|
+
readonly default: "h-10 min-h-10 px-3.5 text-sm";
|
|
6
|
+
readonly lg: "h-11 min-h-11 px-4 text-base file:h-8 file:text-base";
|
|
7
|
+
};
|
|
8
|
+
type InputProps = Omit<React.ComponentProps<"input">, "size"> & {
|
|
9
|
+
/**
|
|
10
|
+
* Visual height and padding. This replaces the native HTML `size` attribute
|
|
11
|
+
* (character width); that numeric attribute is not supported on this
|
|
12
|
+
* component.
|
|
13
|
+
*
|
|
14
|
+
* Defaults to `"lg"` (large). Use `"default"` for a denser medium height.
|
|
15
|
+
*/
|
|
16
|
+
size?: keyof typeof sizeClass;
|
|
17
|
+
};
|
|
18
|
+
declare const Input: React.ForwardRefExoticComponent<Omit<InputProps, "ref"> & React.RefAttributes<HTMLInputElement>>;
|
|
19
|
+
|
|
20
|
+
export { Input, type InputProps };
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { clsx } from 'clsx';
|
|
3
|
+
import { twMerge } from 'tailwind-merge';
|
|
4
|
+
import { jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
// src/react/input.tsx
|
|
7
|
+
function cn(...inputs) {
|
|
8
|
+
return twMerge(clsx(inputs));
|
|
9
|
+
}
|
|
10
|
+
var sizeClass = {
|
|
11
|
+
sm: "h-9 min-h-9 px-3 text-sm",
|
|
12
|
+
default: "h-10 min-h-10 px-3.5 text-sm",
|
|
13
|
+
lg: "h-11 min-h-11 px-4 text-base file:h-8 file:text-base"
|
|
14
|
+
};
|
|
15
|
+
var Input = React.forwardRef(
|
|
16
|
+
({ className, type = "text", size = "lg", disabled, ...props }, ref) => {
|
|
17
|
+
return /* @__PURE__ */ jsx(
|
|
18
|
+
"input",
|
|
19
|
+
{
|
|
20
|
+
type,
|
|
21
|
+
disabled,
|
|
22
|
+
"data-slot": "input",
|
|
23
|
+
className: cn(
|
|
24
|
+
"border-input bg-background text-foreground placeholder:text-primary/30 selection:bg-primary selection:text-primary-foreground flex w-full min-w-0 rounded-md border outline-none transition-[color,box-shadow]",
|
|
25
|
+
"disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50",
|
|
26
|
+
"focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]",
|
|
27
|
+
"aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40",
|
|
28
|
+
"file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground",
|
|
29
|
+
sizeClass[size],
|
|
30
|
+
className
|
|
31
|
+
),
|
|
32
|
+
ref,
|
|
33
|
+
...props
|
|
34
|
+
}
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
);
|
|
38
|
+
Input.displayName = "Input";
|
|
39
|
+
|
|
40
|
+
export { Input };
|
|
41
|
+
//# sourceMappingURL=input.js.map
|
|
42
|
+
//# sourceMappingURL=input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/utils.ts","../../src/react/input.tsx"],"names":[],"mappings":";;;;;;AAGO,SAAS,MAAM,MAAA,EAAsB;AAC1C,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;ACDA,IAAM,SAAA,GAAY;AAAA,EAChB,EAAA,EAAI,0BAAA;AAAA,EACJ,OAAA,EAAS,8BAAA;AAAA,EACT,EAAA,EAAI;AACN,CAAA;AAaA,IAAM,KAAA,GAAc,KAAA,CAAA,UAAA;AAAA,EAClB,CAAC,EAAE,SAAA,EAAW,IAAA,GAAO,MAAA,EAAQ,IAAA,GAAO,IAAA,EAAM,QAAA,EAAU,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AACtE,IAAA,uBACE,GAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,IAAA;AAAA,QACA,QAAA;AAAA,QACA,WAAA,EAAU,OAAA;AAAA,QACV,SAAA,EAAW,EAAA;AAAA,UACT,gNAAA;AAAA,UACA,8EAAA;AAAA,UACA,+EAAA;AAAA,UACA,wGAAA;AAAA,UACA,gHAAA;AAAA,UACA,UAAU,IAAI,CAAA;AAAA,UACd;AAAA,SACF;AAAA,QACA,GAAA;AAAA,QACC,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACF;AACA,KAAA,CAAM,WAAA,GAAc,OAAA","file":"input.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\nconst sizeClass = {\n sm: \"h-9 min-h-9 px-3 text-sm\",\n default: \"h-10 min-h-10 px-3.5 text-sm\",\n lg: \"h-11 min-h-11 px-4 text-base file:h-8 file:text-base\",\n} as const;\n\nexport type InputProps = Omit<React.ComponentProps<\"input\">, \"size\"> & {\n /**\n * Visual height and padding. This replaces the native HTML `size` attribute\n * (character width); that numeric attribute is not supported on this\n * component.\n *\n * Defaults to `\"lg\"` (large). Use `\"default\"` for a denser medium height.\n */\n size?: keyof typeof sizeClass;\n};\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type = \"text\", size = \"lg\", disabled, ...props }, ref) => {\n return (\n <input\n type={type}\n disabled={disabled}\n data-slot=\"input\"\n className={cn(\n \"border-input bg-background text-foreground placeholder:text-primary/30 selection:bg-primary selection:text-primary-foreground flex w-full min-w-0 rounded-md border outline-none transition-[color,box-shadow]\",\n \"disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50\",\n \"focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]\",\n \"aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40\",\n \"file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground\",\n sizeClass[size],\n className,\n )}\n ref={ref}\n {...props}\n />\n );\n },\n);\nInput.displayName = \"Input\";\n\nexport { Input };\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
|
|
3
|
+
interface ScrollHeaderProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
4
|
+
children: ReactNode;
|
|
5
|
+
}
|
|
6
|
+
declare const ScrollHeader: React.FC<ScrollHeaderProps>;
|
|
7
|
+
declare const ScrollHeaderTop: React.FC<React.HTMLAttributes<HTMLDivElement>>;
|
|
8
|
+
declare const ScrollHeaderSticky: React.FC<React.HTMLAttributes<HTMLDivElement>>;
|
|
9
|
+
|
|
10
|
+
export { ScrollHeader, ScrollHeaderSticky, ScrollHeaderTop };
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { clsx } from 'clsx';
|
|
2
|
+
import { twMerge } from 'tailwind-merge';
|
|
3
|
+
import { useRef, useEffect } from 'react';
|
|
4
|
+
import { jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
function cn(...inputs) {
|
|
7
|
+
return twMerge(clsx(inputs));
|
|
8
|
+
}
|
|
9
|
+
var DATA_ATTR = "data-scrolled";
|
|
10
|
+
var ScrollHeader = ({
|
|
11
|
+
children,
|
|
12
|
+
className,
|
|
13
|
+
...props
|
|
14
|
+
}) => {
|
|
15
|
+
const ref = useRef(null);
|
|
16
|
+
return /* @__PURE__ */ jsx(
|
|
17
|
+
"div",
|
|
18
|
+
{
|
|
19
|
+
ref,
|
|
20
|
+
"data-scrolled": "false",
|
|
21
|
+
className: cn(
|
|
22
|
+
"scroll-header bg-background flex h-full flex-col overflow-y-auto",
|
|
23
|
+
className
|
|
24
|
+
),
|
|
25
|
+
...props,
|
|
26
|
+
children
|
|
27
|
+
}
|
|
28
|
+
);
|
|
29
|
+
};
|
|
30
|
+
var ScrollHeaderTop = ({
|
|
31
|
+
children,
|
|
32
|
+
className,
|
|
33
|
+
...props
|
|
34
|
+
}) => {
|
|
35
|
+
const ref = useRef(null);
|
|
36
|
+
useEffect(() => {
|
|
37
|
+
const el = ref.current;
|
|
38
|
+
if (!el) return;
|
|
39
|
+
const container = el.closest("[data-scrolled]");
|
|
40
|
+
if (!container) return;
|
|
41
|
+
const observer = new IntersectionObserver(
|
|
42
|
+
([entry]) => {
|
|
43
|
+
if (!entry) return;
|
|
44
|
+
container.setAttribute(
|
|
45
|
+
DATA_ATTR,
|
|
46
|
+
entry.isIntersecting ? "false" : "true"
|
|
47
|
+
);
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
root: container,
|
|
51
|
+
threshold: 0
|
|
52
|
+
}
|
|
53
|
+
);
|
|
54
|
+
observer.observe(el);
|
|
55
|
+
return () => observer.disconnect();
|
|
56
|
+
}, []);
|
|
57
|
+
return /* @__PURE__ */ jsx("div", { ref, className: cn("shrink-0", className), ...props, children });
|
|
58
|
+
};
|
|
59
|
+
var ScrollHeaderSticky = ({
|
|
60
|
+
children,
|
|
61
|
+
className,
|
|
62
|
+
...props
|
|
63
|
+
}) => /* @__PURE__ */ jsx("div", { className: "sticky top-0 z-40 h-0 overflow-visible", children: /* @__PURE__ */ jsx(
|
|
64
|
+
"div",
|
|
65
|
+
{
|
|
66
|
+
className: cn(
|
|
67
|
+
"border-border/20 bg-background supports-backdrop-filter:bg-background border-b",
|
|
68
|
+
"transition-[opacity,transform] duration-300 ease-[cubic-bezier(0.22,1,0.36,1)] motion-reduce:duration-0 motion-reduce:transition-none",
|
|
69
|
+
'[.scroll-header:not([data-scrolled="true"])_&]:pointer-events-none [.scroll-header:not([data-scrolled="true"])_&]:-translate-y-2 [.scroll-header:not([data-scrolled="true"])_&]:opacity-0',
|
|
70
|
+
'[.scroll-header[data-scrolled="true"]_&]:translate-y-0 [.scroll-header[data-scrolled="true"]_&]:opacity-100',
|
|
71
|
+
className
|
|
72
|
+
),
|
|
73
|
+
...props,
|
|
74
|
+
children
|
|
75
|
+
}
|
|
76
|
+
) });
|
|
77
|
+
|
|
78
|
+
export { ScrollHeader, ScrollHeaderSticky, ScrollHeaderTop };
|
|
79
|
+
//# sourceMappingURL=scroll-header.js.map
|
|
80
|
+
//# sourceMappingURL=scroll-header.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/utils.ts","../../src/react/scroll-header.tsx"],"names":[],"mappings":";;;;;AAGO,SAAS,MAAM,MAAA,EAAsB;AAC1C,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;ACAA,IAAM,SAAA,GAAY,eAAA;AAMlB,IAAM,eAA4C,CAAC;AAAA,EACjD,QAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAA,KAAM;AACJ,EAAA,MAAM,GAAA,GAAM,OAAuB,IAAI,CAAA;AAEvC,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,eAAA,EAAc,OAAA;AAAA,MACd,SAAA,EAAW,EAAA;AAAA,QACT,kEAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG,KAAA;AAAA,MAEH;AAAA;AAAA,GACH;AAEJ;AAEA,IAAM,kBAAkE,CAAC;AAAA,EACvE,QAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAA,KAAM;AACJ,EAAA,MAAM,GAAA,GAAM,OAAuB,IAAI,CAAA;AAEvC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,KAAK,GAAA,CAAI,OAAA;AACf,IAAA,IAAI,CAAC,EAAA,EAAI;AAET,IAAA,MAAM,SAAA,GAAY,EAAA,CAAG,OAAA,CAAqB,iBAAiB,CAAA;AAC3D,IAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,IAAA,MAAM,WAAW,IAAI,oBAAA;AAAA,MACnB,CAAC,CAAC,KAAK,CAAA,KAAM;AACX,QAAA,IAAI,CAAC,KAAA,EAAO;AACZ,QAAA,SAAA,CAAU,YAAA;AAAA,UACR,SAAA;AAAA,UACA,KAAA,CAAM,iBAAiB,OAAA,GAAU;AAAA,SACnC;AAAA,MACF,CAAA;AAAA,MACA;AAAA,QACE,IAAA,EAAM,SAAA;AAAA,QACN,SAAA,EAAW;AAAA;AACb,KACF;AAEA,IAAA,QAAA,CAAS,QAAQ,EAAE,CAAA;AACnB,IAAA,OAAO,MAAM,SAAS,UAAA,EAAW;AAAA,EACnC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAU,SAAA,EAAW,EAAA,CAAG,YAAY,SAAS,CAAA,EAAI,GAAG,KAAA,EACtD,QAAA,EACH,CAAA;AAEJ;AAEA,IAAM,qBAAqE,CAAC;AAAA,EAC1E,QAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAA,qBACE,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACb,QAAA,kBAAA,GAAA;AAAA,EAAC,KAAA;AAAA,EAAA;AAAA,IACC,SAAA,EAAW,EAAA;AAAA,MACT,gFAAA;AAAA,MACA,uIAAA;AAAA,MACA,2LAAA;AAAA,MACA,6GAAA;AAAA,MACA;AAAA,KACF;AAAA,IACC,GAAG,KAAA;AAAA,IAEH;AAAA;AACH,CAAA,EACF","file":"scroll-header.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","\"use client\";\n\nimport { cn } from \"@/lib/utils\";\nimport { ReactNode, useEffect, useRef } from \"react\";\n\nconst DATA_ATTR = \"data-scrolled\";\n\ninterface ScrollHeaderProps extends React.HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n}\n\nconst ScrollHeader: React.FC<ScrollHeaderProps> = ({\n children,\n className,\n ...props\n}) => {\n const ref = useRef<HTMLDivElement>(null);\n\n return (\n <div\n ref={ref}\n data-scrolled=\"false\"\n className={cn(\n \"scroll-header bg-background flex h-full flex-col overflow-y-auto\",\n className,\n )}\n {...props}\n >\n {children}\n </div>\n );\n};\n\nconst ScrollHeaderTop: React.FC<React.HTMLAttributes<HTMLDivElement>> = ({\n children,\n className,\n ...props\n}) => {\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n\n const container = el.closest<HTMLElement>(\"[data-scrolled]\");\n if (!container) return;\n\n const observer = new IntersectionObserver(\n ([entry]) => {\n if (!entry) return;\n container.setAttribute(\n DATA_ATTR,\n entry.isIntersecting ? \"false\" : \"true\",\n );\n },\n {\n root: container,\n threshold: 0,\n },\n );\n\n observer.observe(el);\n return () => observer.disconnect();\n }, []);\n\n return (\n <div ref={ref} className={cn(\"shrink-0\", className)} {...props}>\n {children}\n </div>\n );\n};\n\nconst ScrollHeaderSticky: React.FC<React.HTMLAttributes<HTMLDivElement>> = ({\n children,\n className,\n ...props\n}) => (\n <div className=\"sticky top-0 z-40 h-0 overflow-visible\">\n <div\n className={cn(\n \"border-border/20 bg-background supports-backdrop-filter:bg-background border-b\",\n \"transition-[opacity,transform] duration-300 ease-[cubic-bezier(0.22,1,0.36,1)] motion-reduce:duration-0 motion-reduce:transition-none\",\n '[.scroll-header:not([data-scrolled=\"true\"])_&]:pointer-events-none [.scroll-header:not([data-scrolled=\"true\"])_&]:-translate-y-2 [.scroll-header:not([data-scrolled=\"true\"])_&]:opacity-0',\n '[.scroll-header[data-scrolled=\"true\"]_&]:translate-y-0 [.scroll-header[data-scrolled=\"true\"]_&]:opacity-100',\n className,\n )}\n {...props}\n >\n {children}\n </div>\n </div>\n);\n\nexport { ScrollHeader, ScrollHeaderSticky, ScrollHeaderTop };\n"]}
|
package/dist/react/sheet.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import
|
|
1
|
+
import React__default from 'react';
|
|
2
2
|
|
|
3
|
-
declare const SheetBoundary:
|
|
4
|
-
children:
|
|
3
|
+
declare const SheetBoundary: React__default.FC<React__default.HTMLAttributes<HTMLDivElement> & {
|
|
4
|
+
children: React__default.ReactNode;
|
|
5
5
|
}>;
|
|
6
|
-
declare const Sheet:
|
|
7
|
-
children:
|
|
6
|
+
declare const Sheet: React__default.FC<{
|
|
7
|
+
children: React__default.ReactNode;
|
|
8
8
|
open?: boolean;
|
|
9
9
|
onOpenChange?: (open: boolean) => void;
|
|
10
10
|
/**
|
|
@@ -13,16 +13,16 @@ declare const Sheet: React.FC<{
|
|
|
13
13
|
*/
|
|
14
14
|
showBackdrop?: boolean;
|
|
15
15
|
}>;
|
|
16
|
-
declare const SheetTrigger:
|
|
17
|
-
children:
|
|
16
|
+
declare const SheetTrigger: React__default.FC<{
|
|
17
|
+
children: React__default.ReactNode;
|
|
18
18
|
asChild?: boolean;
|
|
19
19
|
}>;
|
|
20
|
-
declare const SheetClose:
|
|
21
|
-
children:
|
|
20
|
+
declare const SheetClose: React__default.FC<{
|
|
21
|
+
children: React__default.ReactNode;
|
|
22
22
|
asChild?: boolean;
|
|
23
23
|
afterClose?: () => void;
|
|
24
24
|
}>;
|
|
25
|
-
interface SheetContentProps extends
|
|
25
|
+
interface SheetContentProps extends React__default.HTMLAttributes<HTMLDivElement> {
|
|
26
26
|
side?: "top" | "right" | "bottom" | "left";
|
|
27
27
|
size?: "sm" | "md" | "lg" | "xl" | "full";
|
|
28
28
|
closeThreshold?: number;
|
|
@@ -31,15 +31,15 @@ interface SheetContentProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
|
31
31
|
showClose?: boolean;
|
|
32
32
|
duration?: number;
|
|
33
33
|
}
|
|
34
|
-
declare const SheetContent:
|
|
35
|
-
declare const SheetHeader:
|
|
34
|
+
declare const SheetContent: React__default.FC<SheetContentProps>;
|
|
35
|
+
declare const SheetHeader: React__default.FC<React__default.HTMLAttributes<HTMLDivElement> & {
|
|
36
36
|
fixed?: boolean;
|
|
37
37
|
}>;
|
|
38
|
-
declare const SheetFooter:
|
|
38
|
+
declare const SheetFooter: React__default.FC<React__default.HTMLAttributes<HTMLDivElement> & {
|
|
39
39
|
fixed?: boolean;
|
|
40
40
|
}>;
|
|
41
|
-
declare const SheetTitle:
|
|
42
|
-
declare const SheetDescription:
|
|
41
|
+
declare const SheetTitle: React__default.FC<React__default.HTMLAttributes<HTMLHeadingElement>>;
|
|
42
|
+
declare const SheetDescription: React__default.FC<React__default.HTMLAttributes<HTMLParagraphElement>>;
|
|
43
43
|
/**
|
|
44
44
|
* Circular back control for nested sheets (arrow, same footprint as the default
|
|
45
45
|
* sheet close icon). Wraps `SheetClose` with `asChild`.
|
|
@@ -49,8 +49,8 @@ declare const SheetDescription: React.FC<React.HTMLAttributes<HTMLParagraphEleme
|
|
|
49
49
|
* over a delayed `onClick` when opening another sheet so the exit uses the
|
|
50
50
|
* handoff timing built into `Sheet`.
|
|
51
51
|
*/
|
|
52
|
-
declare const SheetNestedClose:
|
|
53
|
-
children?:
|
|
52
|
+
declare const SheetNestedClose: React__default.FC<React__default.ComponentPropsWithoutRef<"button"> & {
|
|
53
|
+
children?: React__default.ReactNode;
|
|
54
54
|
/**
|
|
55
55
|
* Runs after the close animation when chaining another sheet. Uses a shorter
|
|
56
56
|
* exit (see `SheetSetOpenOptions.afterClose`).
|
package/dist/react/sheet.js
CHANGED
|
@@ -605,7 +605,8 @@ var SheetContent = ({
|
|
|
605
605
|
type: "button",
|
|
606
606
|
onClick: closeSheet,
|
|
607
607
|
className: cn(
|
|
608
|
-
|
|
608
|
+
// Above in-panel sticky layers (e.g. ScrollHeaderSticky z-40)
|
|
609
|
+
"absolute z-100 flex size-12 cursor-pointer items-center justify-center rounded-full bg-background md:border md:border-primary/10 md:shadow-xl transition-all hover:bg-secondary-background hover:border-primary/20 active:scale-[0.96]",
|
|
609
610
|
"top-4 right-4",
|
|
610
611
|
side === "right" && "md:top-5 md:right-auto md:-left-16",
|
|
611
612
|
side === "left" && "md:top-5 md:-right-16 md:left-auto",
|
package/dist/react/sheet.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/lib/utils.ts","../../src/react/sheet.tsx"],"names":[],"mappings":"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","file":"sheet.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","\"use client\";\n\nimport React, {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { ArrowLeft, X } from \"lucide-react\";\n\nimport { cn } from \"@/lib/utils\";\n\n// -----------------------------------------------------------------------------\n// Constants\n// -----------------------------------------------------------------------------\n\nconst CLOSE_THRESHOLD = 200;\nconst VELOCITY_THRESHOLD = 1;\nconst SHEET_MOBILE_MAX_WIDTH_PX = 1024;\n\nconst PANEL_OPEN_MS = 280;\nconst PANEL_OPEN_EASING = \"cubic-bezier(0,0.55,0.45,1)\";\nconst PANEL_CLOSE_EASING = \"cubic-bezier(0.55,0,1,0.45)\";\nconst PANEL_SWIPE_CLOSE_EASING = \"cubic-bezier(2,0,1,0.45)\";\nconst PANEL_CLOSE_MS_DESKTOP = 200;\nconst PANEL_CLOSE_MS_MOBILE = 220;\n\n/**\n * Handoff slide-out duration; matches embed `sheetReplace` phase 1\n * (`transform 150ms cubic-bezier(0.55,0,1,0.45)`).\n */\nconst PANEL_CLOSE_MS_HANDOFF = 150;\n\n/** Delay before `afterClose` runs; matches embed `sheetReplace` `setTimeout(..., 80)`. */\nconst HANDOFF_AFTER_CLOSE_DELAY_MS = 80;\n\nconst BACKDROP_OPEN_MS = 500;\nconst BACKDROP_OPEN_EASING = \"cubic-bezier(0.85,0,0.15,1)\";\nconst BACKDROP_CLOSE_MS = 150;\nconst BACKDROP_CLOSE_EASING = \"cubic-bezier(0.55,0,1,0.45)\";\n\n/** Bounded `role=\"dialog\"` on mobile — slide + opacity; entry/exit curves below. */\nconst DIALOG_MOTION_MS = 200;\nconst DIALOG_ENTRY_MOTION_EASING = \"cubic-bezier(0.85, 0, 0.15, 1)\";\nconst DIALOG_EXIT_MOTION_EASING = \"cubic-bezier(0.85, 0, 1, 0.15)\";\nconst DIALOG_MOTION_OFFSET_PX = 120;\n\n/** Off-screen distance: horizontal slides match desktop embed (112%), vertical 100%. */\nconst PANEL_OFF_X = \"112%\";\nconst PANEL_OFF_Y = \"100%\";\n\nconst SIDE_LAYOUT: Record<\"top\" | \"right\" | \"bottom\" | \"left\", string> = {\n top: \"top-0 left-0 right-0 border-b border-primary/10\",\n bottom: \"bottom-0 left-0 right-0 border-t border-primary/10\",\n left: \"left-0 top-0 bottom-0 border-r border-primary/10\",\n right: \"right-0 top-0 bottom-0 md:border-l border-primary/10\",\n};\n\nfunction sizeClassFor(\n side: \"top\" | \"right\" | \"bottom\" | \"left\",\n size: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\",\n): string {\n const horizontal = side === \"left\" || side === \"right\";\n if (size === \"full\") return \"w-full h-full\";\n if (horizontal) {\n const max = {\n sm: \"sm:max-w-sm\",\n md: \"sm:max-w-md\",\n lg: \"sm:max-w-lg\",\n xl: \"sm:max-w-xl\",\n }[size];\n return `w-full ${max} h-full`;\n }\n const maxH = {\n sm: \"max-h-sm\",\n md: \"max-h-md\",\n lg: \"max-h-lg\",\n xl: \"max-h-xl\",\n }[size];\n return `h-auto w-full ${maxH}`;\n}\n\n/**\n * Tailwind v4 `translate-*` uses the CSS `translate` property, not `transform`.\n * We animate `transform` inline so open/close transitions run.\n */\nfunction panelSlideTransform(\n side: \"top\" | \"right\" | \"bottom\" | \"left\",\n isAnimating: boolean,\n bounded: boolean,\n): string {\n if (isAnimating) return \"none\";\n\n if (bounded) {\n if (side === \"right\") return \"translateX(100%)\";\n if (side === \"left\") return \"translateX(-100%)\";\n }\n\n switch (side) {\n case \"right\":\n return `translateX(${PANEL_OFF_X})`;\n case \"left\":\n return `translateX(-${PANEL_OFF_X})`;\n case \"bottom\":\n return `translateY(${PANEL_OFF_Y})`;\n case \"top\":\n return `translateY(-${PANEL_OFF_Y})`;\n default:\n return \"none\";\n }\n}\n\n// -----------------------------------------------------------------------------\n// Context: one provider per `<Sheet>` (open state + tree depth for z-index / Esc)\n// -----------------------------------------------------------------------------\n\ntype SheetSetOpenOptions = {\n /**\n * Fires 80ms after the handoff close starts (same overlap as the embed event details `sheetReplace`). Exit animation is 150ms.\n */\n afterClose?: () => void;\n};\n\nconst SheetContext = React.createContext<\n | {\n open: boolean;\n setOpen: (open: boolean, options?: SheetSetOpenOptions) => void;\n /** 1-based: outermost viewport sheet = 1 */\n nestDepth: number;\n /**\n * When `true`, shows a dimmed scrim; when `false`, an invisible full-area\n * layer still captures outside clicks. Default `false`.\n */\n showBackdrop: boolean;\n /** True while closing with `afterClose` — SheetContent uses faster exit motion. */\n closeHandoffActive: boolean;\n clearCloseHandoff: () => void;\n handoffAfterCloseRef: React.MutableRefObject<(() => void) | null>;\n }\n | undefined\n>(undefined);\n\nfunction useSheetContext() {\n const ctx = React.useContext(SheetContext);\n if (!ctx) {\n throw new Error(\"Sheet components must be used within a <Sheet />\");\n }\n return ctx;\n}\n\n/** Portal host + nesting depth for z-stacking inside nested boundaries. */\nconst SheetBoundaryContext = React.createContext<{\n host: HTMLElement | null;\n depth: number;\n} | null>(null);\n\nexport const SheetBoundary: React.FC<\n React.HTMLAttributes<HTMLDivElement> & { children: React.ReactNode }\n> = ({ className, children, ...props }) => {\n const [host, setHost] = useState<HTMLDivElement | null>(null);\n const parent = React.useContext(SheetBoundaryContext);\n const depth = (parent?.depth ?? 0) + 1;\n const setRef = useCallback((node: HTMLDivElement | null) => {\n setHost(node);\n }, []);\n\n const boundaryValue = useMemo(() => ({ host, depth }), [host, depth]);\n\n return (\n <SheetBoundaryContext.Provider value={boundaryValue}>\n <div\n ref={setRef}\n className={cn(\"relative min-h-0 min-w-0\", className)}\n {...props}\n >\n {children}\n </div>\n </SheetBoundaryContext.Provider>\n );\n};\n\nexport const Sheet: React.FC<{\n children: React.ReactNode;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n /**\n * Dimmed scrim behind the panel. Outside-click layer is always present; when\n * `false` the layer is invisible. Default `false`.\n */\n showBackdrop?: boolean;\n}> = ({\n children,\n open: controlledOpen,\n onOpenChange,\n showBackdrop = false,\n}) => {\n const [internalOpen, setInternalOpen] = useState(false);\n const isControlled = controlledOpen !== undefined;\n const open = isControlled ? controlledOpen : internalOpen;\n\n const handoffAfterCloseRef = React.useRef<(() => void) | null>(null);\n const [closeHandoffActive, setCloseHandoffActive] = useState(false);\n\n const clearCloseHandoff = useCallback(() => {\n handoffAfterCloseRef.current = null;\n setCloseHandoffActive(false);\n }, []);\n\n const parentSheet = React.useContext(SheetContext);\n const parentNestDepth = parentSheet?.nestDepth ?? 0;\n const nestDepth = parentNestDepth + 1;\n\n const setOpen = useCallback(\n (value: boolean, options?: SheetSetOpenOptions) => {\n if (value) {\n clearCloseHandoff();\n } else if (options?.afterClose) {\n handoffAfterCloseRef.current = options.afterClose;\n setCloseHandoffActive(true);\n } else {\n clearCloseHandoff();\n }\n if (!isControlled) setInternalOpen(value);\n onOpenChange?.(value);\n },\n [isControlled, onOpenChange, clearCloseHandoff],\n );\n\n const prevOpenRef = React.useRef<boolean | undefined>(undefined);\n useEffect(() => {\n const prev = prevOpenRef.current;\n prevOpenRef.current = open;\n if (open && prev === false) {\n clearCloseHandoff();\n }\n }, [open, clearCloseHandoff]);\n\n const sheetContextValue = useMemo(\n () => ({\n open,\n setOpen,\n nestDepth,\n showBackdrop,\n closeHandoffActive,\n clearCloseHandoff,\n handoffAfterCloseRef,\n }),\n [\n open,\n setOpen,\n nestDepth,\n showBackdrop,\n closeHandoffActive,\n clearCloseHandoff,\n ],\n );\n\n return (\n <SheetContext.Provider value={sheetContextValue}>\n {children}\n </SheetContext.Provider>\n );\n};\n\nfunction mergeChildClick(\n children: React.ReactNode,\n asChild: boolean | undefined,\n action: () => void,\n) {\n if (asChild && React.isValidElement(children)) {\n const child = children as React.ReactElement<{\n onClick?: React.MouseEventHandler;\n }>;\n return React.cloneElement(child, {\n onClick: (e: React.MouseEvent) => {\n child.props.onClick?.(e);\n action();\n },\n });\n }\n return (\n <button type=\"button\" onClick={action}>\n {children}\n </button>\n );\n}\n\nexport const SheetTrigger: React.FC<{\n children: React.ReactNode;\n asChild?: boolean;\n}> = ({ children, asChild }) => {\n const { setOpen } = useSheetContext();\n const openSheet = useCallback(() => setOpen(true), [setOpen]);\n return mergeChildClick(children, asChild, openSheet);\n};\n\nexport const SheetClose: React.FC<{\n children: React.ReactNode;\n asChild?: boolean;\n afterClose?: () => void;\n}> = ({ children, asChild, afterClose }) => {\n const { setOpen } = useSheetContext();\n const closeSheet = useCallback(\n () => setOpen(false, afterClose ? { afterClose } : undefined),\n [setOpen, afterClose],\n );\n return mergeChildClick(children, asChild, closeSheet);\n};\n\n// -----------------------------------------------------------------------------\n// SheetContent internals\n// -----------------------------------------------------------------------------\n\nfunction useSheetMobileViewport() {\n const [isMobileViewport, setIsMobileViewport] = useState(false);\n\n useEffect(() => {\n const mqMobile = window.matchMedia(\n `(max-width: ${SHEET_MOBILE_MAX_WIDTH_PX}px)`,\n );\n const sync = () => setIsMobileViewport(mqMobile.matches);\n sync();\n mqMobile.addEventListener(\"change\", sync);\n return () => mqMobile.removeEventListener(\"change\", sync);\n }, []);\n\n return isMobileViewport;\n}\n\nfunction useSheetRenderLifecycle(\n open: boolean,\n panelCloseMs: number,\n showBackdrop: boolean,\n) {\n const unmountAfterCloseMs = showBackdrop\n ? Math.max(BACKDROP_CLOSE_MS, panelCloseMs)\n : panelCloseMs;\n\n const [shouldRender, setShouldRender] = useState(open);\n const [isAnimating, setIsAnimating] = useState(false);\n\n useEffect(() => {\n if (open) {\n setShouldRender(true);\n } else {\n setIsAnimating(false);\n const timer = setTimeout(\n () => setShouldRender(false),\n unmountAfterCloseMs,\n );\n return () => clearTimeout(timer);\n }\n }, [open, unmountAfterCloseMs]);\n\n useEffect(() => {\n if (!shouldRender || !open) return;\n\n let raf2 = 0;\n const raf1 = requestAnimationFrame(() => {\n raf2 = requestAnimationFrame(() => setIsAnimating(true));\n });\n return () => {\n cancelAnimationFrame(raf1);\n if (raf2) cancelAnimationFrame(raf2);\n };\n }, [shouldRender, open]);\n\n return { shouldRender, isAnimating };\n}\n\nfunction useSheetScrollLock(\n open: boolean,\n setOpen: (v: boolean) => void,\n bounded: boolean,\n nestDepth: number,\n) {\n useEffect(() => {\n if (!open) return;\n\n const handleEscRoot = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") setOpen(false);\n };\n const handleEscNested = (e: KeyboardEvent) => {\n if (e.key !== \"Escape\") return;\n e.stopImmediatePropagation();\n setOpen(false);\n };\n\n if (typeof document === \"undefined\") return;\n\n const rootViewportSheet = !bounded && nestDepth === 1;\n\n if (rootViewportSheet) {\n document.body.style.overflow = \"hidden\";\n window.addEventListener(\"keydown\", handleEscRoot);\n return () => {\n window.removeEventListener(\"keydown\", handleEscRoot);\n document.body.style.overflow = \"\";\n };\n }\n\n window.addEventListener(\"keydown\", handleEscNested, true);\n return () => window.removeEventListener(\"keydown\", handleEscNested, true);\n }, [open, setOpen, bounded, nestDepth]);\n}\n\ninterface SheetContentProps extends React.HTMLAttributes<HTMLDivElement> {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\";\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\";\n closeThreshold?: number;\n velocityThreshold?: number;\n swipeEnabled?: boolean;\n showClose?: boolean;\n duration?: number;\n}\n\nexport const SheetContent: React.FC<SheetContentProps> = ({\n children,\n side = \"right\",\n size = \"md\",\n className,\n closeThreshold = CLOSE_THRESHOLD,\n velocityThreshold = VELOCITY_THRESHOLD,\n swipeEnabled = true,\n showClose = true,\n duration = PANEL_OPEN_MS,\n role,\n ...props\n}) => {\n const {\n open,\n setOpen,\n nestDepth,\n showBackdrop,\n closeHandoffActive,\n clearCloseHandoff,\n handoffAfterCloseRef,\n } = useSheetContext();\n const boundaryCtx = React.useContext(SheetBoundaryContext);\n const inBoundaryTree = useMemo(() => boundaryCtx != null, [boundaryCtx]);\n const boundaryHost = useMemo(() => boundaryCtx?.host ?? null, [boundaryCtx]);\n const bounded = useMemo(\n () => inBoundaryTree && boundaryHost != null,\n [inBoundaryTree, boundaryHost],\n );\n\n const isMobileViewport = useSheetMobileViewport();\n\n const dialogMotion = useMemo(\n () => bounded && role === \"dialog\" && isMobileViewport,\n [bounded, role, isMobileViewport],\n );\n\n const swipeActive = useMemo(\n () => swipeEnabled && !dialogMotion,\n [swipeEnabled, dialogMotion],\n );\n\n const basePanelCloseMs = useMemo(\n () =>\n dialogMotion\n ? DIALOG_MOTION_MS\n : isMobileViewport\n ? PANEL_CLOSE_MS_MOBILE\n : PANEL_CLOSE_MS_DESKTOP,\n [dialogMotion, isMobileViewport],\n );\n\n const [handoffExitMsLatch, setHandoffExitMsLatch] = useState<number | null>(\n null,\n );\n\n useLayoutEffect(() => {\n if (open) {\n setHandoffExitMsLatch(null);\n return;\n }\n if (closeHandoffActive) {\n setHandoffExitMsLatch(PANEL_CLOSE_MS_HANDOFF);\n }\n }, [open, closeHandoffActive]);\n\n const panelCloseMs = useMemo(() => {\n return !open && closeHandoffActive\n ? PANEL_CLOSE_MS_HANDOFF\n : !open && handoffExitMsLatch != null\n ? handoffExitMsLatch\n : basePanelCloseMs;\n }, [open, closeHandoffActive, handoffExitMsLatch, basePanelCloseMs]);\n\n const { shouldRender, isAnimating } = useSheetRenderLifecycle(\n open,\n panelCloseMs,\n showBackdrop,\n );\n\n useEffect(() => {\n if (open || !closeHandoffActive) return;\n const cb = handoffAfterCloseRef.current;\n if (!cb) return;\n const id = window.setTimeout(() => {\n cb();\n clearCloseHandoff();\n }, HANDOFF_AFTER_CLOSE_DELAY_MS);\n return () => clearTimeout(id);\n }, [open, closeHandoffActive, clearCloseHandoff, handoffAfterCloseRef]);\n\n useSheetScrollLock(open, setOpen, bounded, nestDepth);\n\n const panelOpenMs = useMemo(() => {\n return duration;\n }, [duration]);\n\n const closeSheet = useCallback(() => setOpen(false), [setOpen]);\n\n const touchRef = React.useRef({\n startX: 0,\n startY: 0,\n currentX: 0,\n currentY: 0,\n startTime: 0,\n isDragging: false,\n direction: null as \"x\" | \"y\" | null,\n });\n const panelRef = React.useRef<HTMLDivElement>(null);\n const rafId = React.useRef<number | null>(null);\n const swipeReboundCleanupRef = React.useRef<(() => void) | null>(null);\n /** So `panelSurfaceStyle` can match swipe-dismiss easing after `setOpen(false)` overwrites inline styles. */\n const panelCloseEasingViaSwipeRef = React.useRef(false);\n\n useLayoutEffect(() => {\n if (open) panelCloseEasingViaSwipeRef.current = false;\n }, [open]);\n\n const cancelSwipeRebound = useCallback(() => {\n swipeReboundCleanupRef.current?.();\n swipeReboundCleanupRef.current = null;\n }, []);\n\n const updateTransform = useCallback(() => {\n if (!panelRef.current || !touchRef.current.isDragging || !swipeActive)\n return;\n\n const { startX, startY, currentX, currentY, direction } = touchRef.current;\n const deltaX = currentX - startX;\n const deltaY = currentY - startY;\n\n let transform = \"\";\n if (side === \"right\" && direction === \"x\" && deltaX > 0)\n transform = `translateX(${deltaX}px)`;\n else if (side === \"left\" && direction === \"x\" && deltaX < 0)\n transform = `translateX(${deltaX}px)`;\n else if (side === \"bottom\" && direction === \"y\" && deltaY > 0)\n transform = `translateY(${deltaY}px)`;\n else if (side === \"top\" && direction === \"y\" && deltaY < 0)\n transform = `translateY(${deltaY}px)`;\n\n if (transform) {\n panelRef.current.style.transform = transform;\n panelRef.current.style.transition = \"none\";\n }\n\n rafId.current = requestAnimationFrame(updateTransform);\n }, [swipeActive, side]);\n\n const handleTouchStart = useCallback(\n (e: React.TouchEvent) => {\n if (!swipeActive || !e.touches[0]) return;\n cancelSwipeRebound();\n touchRef.current = {\n startX: e.touches[0].clientX,\n startY: e.touches[0].clientY,\n currentX: e.touches[0].clientX,\n currentY: e.touches[0].clientY,\n startTime: Date.now(),\n isDragging: true,\n direction: null,\n };\n if (rafId.current) cancelAnimationFrame(rafId.current);\n rafId.current = requestAnimationFrame(updateTransform);\n },\n [swipeActive, updateTransform, cancelSwipeRebound],\n );\n\n const handleTouchMove = useCallback(\n (e: React.TouchEvent) => {\n if (!touchRef.current.isDragging || !swipeActive || !e.touches[0]) return;\n\n touchRef.current.currentX = e.touches[0].clientX;\n touchRef.current.currentY = e.touches[0].clientY;\n\n const deltaX = Math.abs(\n touchRef.current.currentX - touchRef.current.startX,\n );\n const deltaY = Math.abs(\n touchRef.current.currentY - touchRef.current.startY,\n );\n\n if (!touchRef.current.direction && (deltaX > 5 || deltaY > 5)) {\n touchRef.current.direction = deltaX > deltaY ? \"x\" : \"y\";\n }\n },\n [swipeActive],\n );\n\n const handleTouchEnd = useCallback(\n (e: React.TouchEvent) => {\n if (!touchRef.current.isDragging || !swipeActive || !e.changedTouches[0])\n return;\n touchRef.current.isDragging = false;\n if (rafId.current) cancelAnimationFrame(rafId.current);\n\n const endX = e.changedTouches[0].clientX;\n const endY = e.changedTouches[0].clientY;\n const deltaX = endX - touchRef.current.startX;\n const deltaY = endY - touchRef.current.startY;\n const deltaTime = Date.now() - touchRef.current.startTime;\n\n const velocityX = Math.abs(deltaX / deltaTime);\n const velocityY = Math.abs(deltaY / deltaTime);\n\n const flickPx = 80;\n let shouldCloseGesture = false;\n\n if (side === \"right\") {\n shouldCloseGesture =\n deltaX > closeThreshold ||\n (deltaX > flickPx && velocityX > velocityThreshold);\n } else if (side === \"left\") {\n shouldCloseGesture =\n deltaX < -closeThreshold ||\n (deltaX < -flickPx && velocityX > velocityThreshold);\n } else if (side === \"bottom\") {\n shouldCloseGesture =\n deltaY > closeThreshold ||\n (deltaY > flickPx && velocityY > velocityThreshold);\n } else if (side === \"top\") {\n shouldCloseGesture =\n deltaY < -closeThreshold ||\n (deltaY < -flickPx && velocityY > velocityThreshold);\n }\n\n if (panelRef.current) {\n if (shouldCloseGesture) {\n cancelSwipeRebound();\n panelCloseEasingViaSwipeRef.current = true;\n const el = panelRef.current;\n el.style.transition = \"\";\n const swipeCloseMs = isMobileViewport\n ? PANEL_CLOSE_MS_MOBILE\n : PANEL_CLOSE_MS_DESKTOP;\n el.style.transition =\n swipeCloseMs > 0\n ? `transform ${swipeCloseMs}ms ${PANEL_SWIPE_CLOSE_EASING}`\n : \"none\";\n\n if (bounded && (side === \"left\" || side === \"right\")) {\n el.style.transform =\n side === \"right\" ? \"translateX(100%)\" : \"translateX(-100%)\";\n } else {\n const axis = side === \"left\" || side === \"right\" ? \"X\" : \"Y\";\n const dir = side === \"right\" || side === \"bottom\" ? \"\" : \"-\";\n const off =\n axis === \"X\" ? `${dir}${PANEL_OFF_X}` : `${dir}${PANEL_OFF_Y}`;\n el.style.transform = `translate${axis}(${off})`;\n }\n setOpen(false);\n } else {\n cancelSwipeRebound();\n const el = panelRef.current;\n if (panelOpenMs > 0) {\n el.style.transition = `transform ${panelOpenMs}ms ${PANEL_OPEN_EASING}`;\n el.style.transform = \"none\";\n let finished = false;\n let fallbackId: number | undefined;\n const finishRebound = () => {\n if (finished) return;\n finished = true;\n el.removeEventListener(\"transitionend\", onTransitionEnd);\n if (fallbackId !== undefined) window.clearTimeout(fallbackId);\n swipeReboundCleanupRef.current = null;\n if (panelRef.current) {\n panelRef.current.style.transition = \"\";\n panelRef.current.style.transform = \"\";\n }\n };\n const onTransitionEnd = (ev: TransitionEvent) => {\n if (ev.target !== el || ev.propertyName !== \"transform\") return;\n finishRebound();\n };\n fallbackId = window.setTimeout(finishRebound, panelOpenMs + 80);\n swipeReboundCleanupRef.current = finishRebound;\n el.addEventListener(\"transitionend\", onTransitionEnd);\n } else {\n el.style.transition = \"\";\n el.style.transform = \"\";\n }\n }\n }\n },\n [\n swipeActive,\n closeThreshold,\n velocityThreshold,\n side,\n isMobileViewport,\n bounded,\n setOpen,\n cancelSwipeRebound,\n panelOpenMs,\n ],\n );\n\n const panelTransform = useMemo(\n () =>\n dialogMotion\n ? isAnimating\n ? \"translateY(0)\"\n : `translateY(${DIALOG_MOTION_OFFSET_PX}px)`\n : panelSlideTransform(side, isAnimating, bounded),\n [dialogMotion, isAnimating, side, bounded],\n );\n\n const boundaryDepth = boundaryCtx?.depth ?? 0;\n const zIndex = bounded\n ? 10 + boundaryDepth * 10 + (nestDepth - 1) * 2\n : 50 + (nestDepth - 1) * 10;\n const layerPosition = bounded ? \"absolute\" : \"fixed\";\n\n const backdropStyle = useMemo(() => {\n if (!showBackdrop) return { transition: \"none\" } as const;\n if (dialogMotion) {\n return {\n transitionProperty: \"opacity\",\n transitionDuration: `${open ? DIALOG_MOTION_MS : panelCloseMs}ms`,\n transitionTimingFunction: open\n ? DIALOG_ENTRY_MOTION_EASING\n : DIALOG_EXIT_MOTION_EASING,\n };\n }\n return {\n transitionProperty: \"opacity\",\n transitionDuration: open\n ? `${BACKDROP_OPEN_MS}ms`\n : `${BACKDROP_CLOSE_MS}ms`,\n transitionTimingFunction: open\n ? BACKDROP_OPEN_EASING\n : BACKDROP_CLOSE_EASING,\n };\n }, [open, showBackdrop, dialogMotion, panelCloseMs]);\n\n const rootLayerStyle = useMemo(() => ({ zIndex }), [zIndex]);\n\n const panelSurfaceStyle = useMemo(() => {\n const touchAction = !swipeActive\n ? undefined\n : side === \"left\" || side === \"right\"\n ? \"pan-y\"\n : \"pan-x\";\n\n if (dialogMotion) {\n return {\n ...props.style,\n transform: panelTransform,\n opacity: isAnimating ? 1 : 0,\n transitionProperty: \"transform, opacity\",\n transitionDuration: `${open ? DIALOG_MOTION_MS : panelCloseMs}ms`,\n transitionTimingFunction: open\n ? DIALOG_ENTRY_MOTION_EASING\n : DIALOG_EXIT_MOTION_EASING,\n touchAction,\n } satisfies React.CSSProperties;\n }\n\n return {\n ...props.style,\n transform: panelTransform,\n transitionProperty: \"transform\",\n transitionDuration: open ? `${panelOpenMs}ms` : `${panelCloseMs}ms`,\n transitionTimingFunction: open\n ? PANEL_OPEN_EASING\n : panelCloseEasingViaSwipeRef.current\n ? PANEL_SWIPE_CLOSE_EASING\n : PANEL_CLOSE_EASING,\n touchAction,\n } satisfies React.CSSProperties;\n }, [\n dialogMotion,\n props.style,\n panelTransform,\n isAnimating,\n open,\n panelOpenMs,\n panelCloseMs,\n side,\n swipeActive,\n ]);\n\n if (!shouldRender) return null;\n\n if (inBoundaryTree && boundaryHost == null) {\n return null;\n }\n\n const sheetTree = (\n <div\n className={cn(\n layerPosition,\n \"inset-0\",\n !bounded && \"flex items-center justify-center\",\n bounded && \"pointer-events-none\",\n )}\n style={rootLayerStyle}\n >\n <div\n className={cn(\n layerPosition,\n \"inset-0\",\n showBackdrop && \"bg-black/20 transition-opacity dark:bg-black/50\",\n showBackdrop && (isAnimating ? \"opacity-100\" : \"opacity-0\"),\n !showBackdrop && \"bg-transparent\",\n bounded && \"pointer-events-auto\",\n )}\n style={backdropStyle}\n onClick={closeSheet}\n />\n\n <div\n {...props}\n ref={panelRef}\n role={role}\n className={cn(\n \"bg-background flex flex-col p-6 shadow-xl\",\n layerPosition,\n bounded\n ? cn(\n \"inset-0 z-10 h-full w-full max-w-none overflow-hidden pointer-events-auto\",\n )\n : cn(\"z-50\", SIDE_LAYOUT[side], sizeClassFor(side, size)),\n className,\n )}\n style={panelSurfaceStyle}\n onTouchStart={swipeActive ? handleTouchStart : undefined}\n onTouchMove={swipeActive ? handleTouchMove : undefined}\n onTouchEnd={swipeActive ? handleTouchEnd : undefined}\n >\n {children}\n\n {showClose && (\n <button\n type=\"button\"\n onClick={closeSheet}\n className={cn(\n \"absolute flex size-12 cursor-pointer items-center justify-center rounded-full md:border md:border-primary/10 bg-background md:shadow-xl transition-all hover:bg-secondary-background hover:border-primary/20 active:scale-[0.96]\",\n \"top-4 right-4\",\n side === \"right\" && \"md:top-5 md:right-auto md:-left-16\",\n side === \"left\" && \"md:top-5 md:-right-16 md:left-auto\",\n side === \"top\" &&\n \"md:top-auto md:right-auto md:-bottom-15 md:left-1/2 md:-translate-x-1/2\",\n side === \"bottom\" &&\n \"md:-top-15 md:right-auto md:bottom-auto md:left-1/2 md:-translate-x-1/2\",\n )}\n >\n <X className=\"size-5.5\" />\n <span className=\"sr-only\">Close</span>\n </button>\n )}\n </div>\n </div>\n );\n\n return createPortal(\n sheetTree,\n bounded && boundaryHost ? boundaryHost : document.body,\n );\n};\n\n// -----------------------------------------------------------------------------\n// Chrome\n// -----------------------------------------------------------------------------\n\nexport const SheetHeader: React.FC<\n React.HTMLAttributes<HTMLDivElement> & { fixed?: boolean }\n> = ({ className, fixed, ...props }) => (\n <div\n className={cn(\n \"flex flex-col text-left\",\n fixed && \"bg-background border-primary/10 sticky top-0 z-10 border-b p-4\",\n className,\n )}\n {...props}\n />\n);\n\nexport const SheetFooter: React.FC<\n React.HTMLAttributes<HTMLDivElement> & { fixed?: boolean }\n> = ({ className, fixed, ...props }) => (\n <div\n className={cn(\n \"flex flex-row\",\n fixed &&\n \"bg-background border-primary/10 sticky bottom-0 z-10 border-t p-4\",\n className,\n )}\n {...props}\n />\n);\n\nexport const SheetTitle: React.FC<React.HTMLAttributes<HTMLHeadingElement>> = ({\n className,\n ...props\n}) => (\n <h3\n className={cn(\"text-primary text-lg font-semibold\", className)}\n {...props}\n />\n);\n\nexport const SheetDescription: React.FC<\n React.HTMLAttributes<HTMLParagraphElement>\n> = ({ className, ...props }) => (\n <p className={cn(\"text-muted-foreground text-sm\", className)} {...props} />\n);\n/**\n * Circular back control for nested sheets (arrow, same footprint as the default\n * sheet close icon). Wraps `SheetClose` with `asChild`.\n *\n * `onClick` (and any other button props) run in the same activation handler as\n * close: your handler runs first, then the sheet closes. Prefer `afterClose`\n * over a delayed `onClick` when opening another sheet so the exit uses the\n * handoff timing built into `Sheet`.\n */\nexport const SheetNestedClose: React.FC<\n React.ComponentPropsWithoutRef<\"button\"> & {\n children?: React.ReactNode;\n /**\n * Runs after the close animation when chaining another sheet. Uses a shorter\n * exit (see `SheetSetOpenOptions.afterClose`).\n */\n afterClose?: () => void;\n }\n> = ({ className, children, onClick, afterClose, ...props }) => (\n <SheetClose asChild afterClose={afterClose}>\n <button\n type=\"button\"\n className={cn(\n \"-ml-3.5 inline-flex size-12 shrink-0 cursor-pointer items-center justify-center rounded-full bg-background transition-all hover:bg-primary/5 active:scale-[0.96]\",\n className,\n )}\n onClick={onClick}\n {...props}\n >\n {children ?? (\n <>\n <ArrowLeft className=\"size-5.5\" aria-hidden />\n <span className=\"sr-only\">Back</span>\n </>\n )}\n </button>\n </SheetClose>\n);\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/lib/utils.ts","../../src/react/sheet.tsx"],"names":[],"mappings":"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","file":"sheet.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","\"use client\";\n\nimport React, {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { ArrowLeft, X } from \"lucide-react\";\n\nimport { cn } from \"@/lib/utils\";\n\n// -----------------------------------------------------------------------------\n// Constants\n// -----------------------------------------------------------------------------\n\nconst CLOSE_THRESHOLD = 200;\nconst VELOCITY_THRESHOLD = 1;\nconst SHEET_MOBILE_MAX_WIDTH_PX = 1024;\n\nconst PANEL_OPEN_MS = 280;\nconst PANEL_OPEN_EASING = \"cubic-bezier(0,0.55,0.45,1)\";\nconst PANEL_CLOSE_EASING = \"cubic-bezier(0.55,0,1,0.45)\";\nconst PANEL_SWIPE_CLOSE_EASING = \"cubic-bezier(2,0,1,0.45)\";\nconst PANEL_CLOSE_MS_DESKTOP = 200;\nconst PANEL_CLOSE_MS_MOBILE = 220;\n\n/**\n * Handoff slide-out duration; matches embed `sheetReplace` phase 1\n * (`transform 150ms cubic-bezier(0.55,0,1,0.45)`).\n */\nconst PANEL_CLOSE_MS_HANDOFF = 150;\n\n/** Delay before `afterClose` runs; matches embed `sheetReplace` `setTimeout(..., 80)`. */\nconst HANDOFF_AFTER_CLOSE_DELAY_MS = 80;\n\nconst BACKDROP_OPEN_MS = 500;\nconst BACKDROP_OPEN_EASING = \"cubic-bezier(0.85,0,0.15,1)\";\nconst BACKDROP_CLOSE_MS = 150;\nconst BACKDROP_CLOSE_EASING = \"cubic-bezier(0.55,0,1,0.45)\";\n\n/** Bounded `role=\"dialog\"` on mobile — slide + opacity; entry/exit curves below. */\nconst DIALOG_MOTION_MS = 200;\nconst DIALOG_ENTRY_MOTION_EASING = \"cubic-bezier(0.85, 0, 0.15, 1)\";\nconst DIALOG_EXIT_MOTION_EASING = \"cubic-bezier(0.85, 0, 1, 0.15)\";\nconst DIALOG_MOTION_OFFSET_PX = 120;\n\n/** Off-screen distance: horizontal slides match desktop embed (112%), vertical 100%. */\nconst PANEL_OFF_X = \"112%\";\nconst PANEL_OFF_Y = \"100%\";\n\nconst SIDE_LAYOUT: Record<\"top\" | \"right\" | \"bottom\" | \"left\", string> = {\n top: \"top-0 left-0 right-0 border-b border-primary/10\",\n bottom: \"bottom-0 left-0 right-0 border-t border-primary/10\",\n left: \"left-0 top-0 bottom-0 border-r border-primary/10\",\n right: \"right-0 top-0 bottom-0 md:border-l border-primary/10\",\n};\n\nfunction sizeClassFor(\n side: \"top\" | \"right\" | \"bottom\" | \"left\",\n size: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\",\n): string {\n const horizontal = side === \"left\" || side === \"right\";\n if (size === \"full\") return \"w-full h-full\";\n if (horizontal) {\n const max = {\n sm: \"sm:max-w-sm\",\n md: \"sm:max-w-md\",\n lg: \"sm:max-w-lg\",\n xl: \"sm:max-w-xl\",\n }[size];\n return `w-full ${max} h-full`;\n }\n const maxH = {\n sm: \"max-h-sm\",\n md: \"max-h-md\",\n lg: \"max-h-lg\",\n xl: \"max-h-xl\",\n }[size];\n return `h-auto w-full ${maxH}`;\n}\n\n/**\n * Tailwind v4 `translate-*` uses the CSS `translate` property, not `transform`.\n * We animate `transform` inline so open/close transitions run.\n */\nfunction panelSlideTransform(\n side: \"top\" | \"right\" | \"bottom\" | \"left\",\n isAnimating: boolean,\n bounded: boolean,\n): string {\n if (isAnimating) return \"none\";\n\n if (bounded) {\n if (side === \"right\") return \"translateX(100%)\";\n if (side === \"left\") return \"translateX(-100%)\";\n }\n\n switch (side) {\n case \"right\":\n return `translateX(${PANEL_OFF_X})`;\n case \"left\":\n return `translateX(-${PANEL_OFF_X})`;\n case \"bottom\":\n return `translateY(${PANEL_OFF_Y})`;\n case \"top\":\n return `translateY(-${PANEL_OFF_Y})`;\n default:\n return \"none\";\n }\n}\n\n// -----------------------------------------------------------------------------\n// Context: one provider per `<Sheet>` (open state + tree depth for z-index / Esc)\n// -----------------------------------------------------------------------------\n\ntype SheetSetOpenOptions = {\n /**\n * Fires 80ms after the handoff close starts (same overlap as the embed event details `sheetReplace`). Exit animation is 150ms.\n */\n afterClose?: () => void;\n};\n\nconst SheetContext = React.createContext<\n | {\n open: boolean;\n setOpen: (open: boolean, options?: SheetSetOpenOptions) => void;\n /** 1-based: outermost viewport sheet = 1 */\n nestDepth: number;\n /**\n * When `true`, shows a dimmed scrim; when `false`, an invisible full-area\n * layer still captures outside clicks. Default `false`.\n */\n showBackdrop: boolean;\n /** True while closing with `afterClose` — SheetContent uses faster exit motion. */\n closeHandoffActive: boolean;\n clearCloseHandoff: () => void;\n handoffAfterCloseRef: React.MutableRefObject<(() => void) | null>;\n }\n | undefined\n>(undefined);\n\nfunction useSheetContext() {\n const ctx = React.useContext(SheetContext);\n if (!ctx) {\n throw new Error(\"Sheet components must be used within a <Sheet />\");\n }\n return ctx;\n}\n\n/** Portal host + nesting depth for z-stacking inside nested boundaries. */\nconst SheetBoundaryContext = React.createContext<{\n host: HTMLElement | null;\n depth: number;\n} | null>(null);\n\nexport const SheetBoundary: React.FC<\n React.HTMLAttributes<HTMLDivElement> & { children: React.ReactNode }\n> = ({ className, children, ...props }) => {\n const [host, setHost] = useState<HTMLDivElement | null>(null);\n const parent = React.useContext(SheetBoundaryContext);\n const depth = (parent?.depth ?? 0) + 1;\n const setRef = useCallback((node: HTMLDivElement | null) => {\n setHost(node);\n }, []);\n\n const boundaryValue = useMemo(() => ({ host, depth }), [host, depth]);\n\n return (\n <SheetBoundaryContext.Provider value={boundaryValue}>\n <div\n ref={setRef}\n className={cn(\"relative min-h-0 min-w-0\", className)}\n {...props}\n >\n {children}\n </div>\n </SheetBoundaryContext.Provider>\n );\n};\n\nexport const Sheet: React.FC<{\n children: React.ReactNode;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n /**\n * Dimmed scrim behind the panel. Outside-click layer is always present; when\n * `false` the layer is invisible. Default `false`.\n */\n showBackdrop?: boolean;\n}> = ({\n children,\n open: controlledOpen,\n onOpenChange,\n showBackdrop = false,\n}) => {\n const [internalOpen, setInternalOpen] = useState(false);\n const isControlled = controlledOpen !== undefined;\n const open = isControlled ? controlledOpen : internalOpen;\n\n const handoffAfterCloseRef = React.useRef<(() => void) | null>(null);\n const [closeHandoffActive, setCloseHandoffActive] = useState(false);\n\n const clearCloseHandoff = useCallback(() => {\n handoffAfterCloseRef.current = null;\n setCloseHandoffActive(false);\n }, []);\n\n const parentSheet = React.useContext(SheetContext);\n const parentNestDepth = parentSheet?.nestDepth ?? 0;\n const nestDepth = parentNestDepth + 1;\n\n const setOpen = useCallback(\n (value: boolean, options?: SheetSetOpenOptions) => {\n if (value) {\n clearCloseHandoff();\n } else if (options?.afterClose) {\n handoffAfterCloseRef.current = options.afterClose;\n setCloseHandoffActive(true);\n } else {\n clearCloseHandoff();\n }\n if (!isControlled) setInternalOpen(value);\n onOpenChange?.(value);\n },\n [isControlled, onOpenChange, clearCloseHandoff],\n );\n\n const prevOpenRef = React.useRef<boolean | undefined>(undefined);\n useEffect(() => {\n const prev = prevOpenRef.current;\n prevOpenRef.current = open;\n if (open && prev === false) {\n clearCloseHandoff();\n }\n }, [open, clearCloseHandoff]);\n\n const sheetContextValue = useMemo(\n () => ({\n open,\n setOpen,\n nestDepth,\n showBackdrop,\n closeHandoffActive,\n clearCloseHandoff,\n handoffAfterCloseRef,\n }),\n [\n open,\n setOpen,\n nestDepth,\n showBackdrop,\n closeHandoffActive,\n clearCloseHandoff,\n ],\n );\n\n return (\n <SheetContext.Provider value={sheetContextValue}>\n {children}\n </SheetContext.Provider>\n );\n};\n\nfunction mergeChildClick(\n children: React.ReactNode,\n asChild: boolean | undefined,\n action: () => void,\n) {\n if (asChild && React.isValidElement(children)) {\n const child = children as React.ReactElement<{\n onClick?: React.MouseEventHandler;\n }>;\n return React.cloneElement(child, {\n onClick: (e: React.MouseEvent) => {\n child.props.onClick?.(e);\n action();\n },\n });\n }\n return (\n <button type=\"button\" onClick={action}>\n {children}\n </button>\n );\n}\n\nexport const SheetTrigger: React.FC<{\n children: React.ReactNode;\n asChild?: boolean;\n}> = ({ children, asChild }) => {\n const { setOpen } = useSheetContext();\n const openSheet = useCallback(() => setOpen(true), [setOpen]);\n return mergeChildClick(children, asChild, openSheet);\n};\n\nexport const SheetClose: React.FC<{\n children: React.ReactNode;\n asChild?: boolean;\n afterClose?: () => void;\n}> = ({ children, asChild, afterClose }) => {\n const { setOpen } = useSheetContext();\n const closeSheet = useCallback(\n () => setOpen(false, afterClose ? { afterClose } : undefined),\n [setOpen, afterClose],\n );\n return mergeChildClick(children, asChild, closeSheet);\n};\n\n// -----------------------------------------------------------------------------\n// SheetContent internals\n// -----------------------------------------------------------------------------\n\nfunction useSheetMobileViewport() {\n const [isMobileViewport, setIsMobileViewport] = useState(false);\n\n useEffect(() => {\n const mqMobile = window.matchMedia(\n `(max-width: ${SHEET_MOBILE_MAX_WIDTH_PX}px)`,\n );\n const sync = () => setIsMobileViewport(mqMobile.matches);\n sync();\n mqMobile.addEventListener(\"change\", sync);\n return () => mqMobile.removeEventListener(\"change\", sync);\n }, []);\n\n return isMobileViewport;\n}\n\nfunction useSheetRenderLifecycle(\n open: boolean,\n panelCloseMs: number,\n showBackdrop: boolean,\n) {\n const unmountAfterCloseMs = showBackdrop\n ? Math.max(BACKDROP_CLOSE_MS, panelCloseMs)\n : panelCloseMs;\n\n const [shouldRender, setShouldRender] = useState(open);\n const [isAnimating, setIsAnimating] = useState(false);\n\n useEffect(() => {\n if (open) {\n setShouldRender(true);\n } else {\n setIsAnimating(false);\n const timer = setTimeout(\n () => setShouldRender(false),\n unmountAfterCloseMs,\n );\n return () => clearTimeout(timer);\n }\n }, [open, unmountAfterCloseMs]);\n\n useEffect(() => {\n if (!shouldRender || !open) return;\n\n let raf2 = 0;\n const raf1 = requestAnimationFrame(() => {\n raf2 = requestAnimationFrame(() => setIsAnimating(true));\n });\n return () => {\n cancelAnimationFrame(raf1);\n if (raf2) cancelAnimationFrame(raf2);\n };\n }, [shouldRender, open]);\n\n return { shouldRender, isAnimating };\n}\n\nfunction useSheetScrollLock(\n open: boolean,\n setOpen: (v: boolean) => void,\n bounded: boolean,\n nestDepth: number,\n) {\n useEffect(() => {\n if (!open) return;\n\n const handleEscRoot = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") setOpen(false);\n };\n const handleEscNested = (e: KeyboardEvent) => {\n if (e.key !== \"Escape\") return;\n e.stopImmediatePropagation();\n setOpen(false);\n };\n\n if (typeof document === \"undefined\") return;\n\n const rootViewportSheet = !bounded && nestDepth === 1;\n\n if (rootViewportSheet) {\n document.body.style.overflow = \"hidden\";\n window.addEventListener(\"keydown\", handleEscRoot);\n return () => {\n window.removeEventListener(\"keydown\", handleEscRoot);\n document.body.style.overflow = \"\";\n };\n }\n\n window.addEventListener(\"keydown\", handleEscNested, true);\n return () => window.removeEventListener(\"keydown\", handleEscNested, true);\n }, [open, setOpen, bounded, nestDepth]);\n}\n\ninterface SheetContentProps extends React.HTMLAttributes<HTMLDivElement> {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\";\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\";\n closeThreshold?: number;\n velocityThreshold?: number;\n swipeEnabled?: boolean;\n showClose?: boolean;\n duration?: number;\n}\n\nexport const SheetContent: React.FC<SheetContentProps> = ({\n children,\n side = \"right\",\n size = \"md\",\n className,\n closeThreshold = CLOSE_THRESHOLD,\n velocityThreshold = VELOCITY_THRESHOLD,\n swipeEnabled = true,\n showClose = true,\n duration = PANEL_OPEN_MS,\n role,\n ...props\n}) => {\n const {\n open,\n setOpen,\n nestDepth,\n showBackdrop,\n closeHandoffActive,\n clearCloseHandoff,\n handoffAfterCloseRef,\n } = useSheetContext();\n const boundaryCtx = React.useContext(SheetBoundaryContext);\n const inBoundaryTree = useMemo(() => boundaryCtx != null, [boundaryCtx]);\n const boundaryHost = useMemo(() => boundaryCtx?.host ?? null, [boundaryCtx]);\n const bounded = useMemo(\n () => inBoundaryTree && boundaryHost != null,\n [inBoundaryTree, boundaryHost],\n );\n\n const isMobileViewport = useSheetMobileViewport();\n\n const dialogMotion = useMemo(\n () => bounded && role === \"dialog\" && isMobileViewport,\n [bounded, role, isMobileViewport],\n );\n\n const swipeActive = useMemo(\n () => swipeEnabled && !dialogMotion,\n [swipeEnabled, dialogMotion],\n );\n\n const basePanelCloseMs = useMemo(\n () =>\n dialogMotion\n ? DIALOG_MOTION_MS\n : isMobileViewport\n ? PANEL_CLOSE_MS_MOBILE\n : PANEL_CLOSE_MS_DESKTOP,\n [dialogMotion, isMobileViewport],\n );\n\n const [handoffExitMsLatch, setHandoffExitMsLatch] = useState<number | null>(\n null,\n );\n\n useLayoutEffect(() => {\n if (open) {\n setHandoffExitMsLatch(null);\n return;\n }\n if (closeHandoffActive) {\n setHandoffExitMsLatch(PANEL_CLOSE_MS_HANDOFF);\n }\n }, [open, closeHandoffActive]);\n\n const panelCloseMs = useMemo(() => {\n return !open && closeHandoffActive\n ? PANEL_CLOSE_MS_HANDOFF\n : !open && handoffExitMsLatch != null\n ? handoffExitMsLatch\n : basePanelCloseMs;\n }, [open, closeHandoffActive, handoffExitMsLatch, basePanelCloseMs]);\n\n const { shouldRender, isAnimating } = useSheetRenderLifecycle(\n open,\n panelCloseMs,\n showBackdrop,\n );\n\n useEffect(() => {\n if (open || !closeHandoffActive) return;\n const cb = handoffAfterCloseRef.current;\n if (!cb) return;\n const id = window.setTimeout(() => {\n cb();\n clearCloseHandoff();\n }, HANDOFF_AFTER_CLOSE_DELAY_MS);\n return () => clearTimeout(id);\n }, [open, closeHandoffActive, clearCloseHandoff, handoffAfterCloseRef]);\n\n useSheetScrollLock(open, setOpen, bounded, nestDepth);\n\n const panelOpenMs = useMemo(() => {\n return duration;\n }, [duration]);\n\n const closeSheet = useCallback(() => setOpen(false), [setOpen]);\n\n const touchRef = React.useRef({\n startX: 0,\n startY: 0,\n currentX: 0,\n currentY: 0,\n startTime: 0,\n isDragging: false,\n direction: null as \"x\" | \"y\" | null,\n });\n const panelRef = React.useRef<HTMLDivElement>(null);\n const rafId = React.useRef<number | null>(null);\n const swipeReboundCleanupRef = React.useRef<(() => void) | null>(null);\n /** So `panelSurfaceStyle` can match swipe-dismiss easing after `setOpen(false)` overwrites inline styles. */\n const panelCloseEasingViaSwipeRef = React.useRef(false);\n\n useLayoutEffect(() => {\n if (open) panelCloseEasingViaSwipeRef.current = false;\n }, [open]);\n\n const cancelSwipeRebound = useCallback(() => {\n swipeReboundCleanupRef.current?.();\n swipeReboundCleanupRef.current = null;\n }, []);\n\n const updateTransform = useCallback(() => {\n if (!panelRef.current || !touchRef.current.isDragging || !swipeActive)\n return;\n\n const { startX, startY, currentX, currentY, direction } = touchRef.current;\n const deltaX = currentX - startX;\n const deltaY = currentY - startY;\n\n let transform = \"\";\n if (side === \"right\" && direction === \"x\" && deltaX > 0)\n transform = `translateX(${deltaX}px)`;\n else if (side === \"left\" && direction === \"x\" && deltaX < 0)\n transform = `translateX(${deltaX}px)`;\n else if (side === \"bottom\" && direction === \"y\" && deltaY > 0)\n transform = `translateY(${deltaY}px)`;\n else if (side === \"top\" && direction === \"y\" && deltaY < 0)\n transform = `translateY(${deltaY}px)`;\n\n if (transform) {\n panelRef.current.style.transform = transform;\n panelRef.current.style.transition = \"none\";\n }\n\n rafId.current = requestAnimationFrame(updateTransform);\n }, [swipeActive, side]);\n\n const handleTouchStart = useCallback(\n (e: React.TouchEvent) => {\n if (!swipeActive || !e.touches[0]) return;\n cancelSwipeRebound();\n touchRef.current = {\n startX: e.touches[0].clientX,\n startY: e.touches[0].clientY,\n currentX: e.touches[0].clientX,\n currentY: e.touches[0].clientY,\n startTime: Date.now(),\n isDragging: true,\n direction: null,\n };\n if (rafId.current) cancelAnimationFrame(rafId.current);\n rafId.current = requestAnimationFrame(updateTransform);\n },\n [swipeActive, updateTransform, cancelSwipeRebound],\n );\n\n const handleTouchMove = useCallback(\n (e: React.TouchEvent) => {\n if (!touchRef.current.isDragging || !swipeActive || !e.touches[0]) return;\n\n touchRef.current.currentX = e.touches[0].clientX;\n touchRef.current.currentY = e.touches[0].clientY;\n\n const deltaX = Math.abs(\n touchRef.current.currentX - touchRef.current.startX,\n );\n const deltaY = Math.abs(\n touchRef.current.currentY - touchRef.current.startY,\n );\n\n if (!touchRef.current.direction && (deltaX > 5 || deltaY > 5)) {\n touchRef.current.direction = deltaX > deltaY ? \"x\" : \"y\";\n }\n },\n [swipeActive],\n );\n\n const handleTouchEnd = useCallback(\n (e: React.TouchEvent) => {\n if (!touchRef.current.isDragging || !swipeActive || !e.changedTouches[0])\n return;\n touchRef.current.isDragging = false;\n if (rafId.current) cancelAnimationFrame(rafId.current);\n\n const endX = e.changedTouches[0].clientX;\n const endY = e.changedTouches[0].clientY;\n const deltaX = endX - touchRef.current.startX;\n const deltaY = endY - touchRef.current.startY;\n const deltaTime = Date.now() - touchRef.current.startTime;\n\n const velocityX = Math.abs(deltaX / deltaTime);\n const velocityY = Math.abs(deltaY / deltaTime);\n\n const flickPx = 80;\n let shouldCloseGesture = false;\n\n if (side === \"right\") {\n shouldCloseGesture =\n deltaX > closeThreshold ||\n (deltaX > flickPx && velocityX > velocityThreshold);\n } else if (side === \"left\") {\n shouldCloseGesture =\n deltaX < -closeThreshold ||\n (deltaX < -flickPx && velocityX > velocityThreshold);\n } else if (side === \"bottom\") {\n shouldCloseGesture =\n deltaY > closeThreshold ||\n (deltaY > flickPx && velocityY > velocityThreshold);\n } else if (side === \"top\") {\n shouldCloseGesture =\n deltaY < -closeThreshold ||\n (deltaY < -flickPx && velocityY > velocityThreshold);\n }\n\n if (panelRef.current) {\n if (shouldCloseGesture) {\n cancelSwipeRebound();\n panelCloseEasingViaSwipeRef.current = true;\n const el = panelRef.current;\n el.style.transition = \"\";\n const swipeCloseMs = isMobileViewport\n ? PANEL_CLOSE_MS_MOBILE\n : PANEL_CLOSE_MS_DESKTOP;\n el.style.transition =\n swipeCloseMs > 0\n ? `transform ${swipeCloseMs}ms ${PANEL_SWIPE_CLOSE_EASING}`\n : \"none\";\n\n if (bounded && (side === \"left\" || side === \"right\")) {\n el.style.transform =\n side === \"right\" ? \"translateX(100%)\" : \"translateX(-100%)\";\n } else {\n const axis = side === \"left\" || side === \"right\" ? \"X\" : \"Y\";\n const dir = side === \"right\" || side === \"bottom\" ? \"\" : \"-\";\n const off =\n axis === \"X\" ? `${dir}${PANEL_OFF_X}` : `${dir}${PANEL_OFF_Y}`;\n el.style.transform = `translate${axis}(${off})`;\n }\n setOpen(false);\n } else {\n cancelSwipeRebound();\n const el = panelRef.current;\n if (panelOpenMs > 0) {\n el.style.transition = `transform ${panelOpenMs}ms ${PANEL_OPEN_EASING}`;\n el.style.transform = \"none\";\n let finished = false;\n let fallbackId: number | undefined;\n const finishRebound = () => {\n if (finished) return;\n finished = true;\n el.removeEventListener(\"transitionend\", onTransitionEnd);\n if (fallbackId !== undefined) window.clearTimeout(fallbackId);\n swipeReboundCleanupRef.current = null;\n if (panelRef.current) {\n panelRef.current.style.transition = \"\";\n panelRef.current.style.transform = \"\";\n }\n };\n const onTransitionEnd = (ev: TransitionEvent) => {\n if (ev.target !== el || ev.propertyName !== \"transform\") return;\n finishRebound();\n };\n fallbackId = window.setTimeout(finishRebound, panelOpenMs + 80);\n swipeReboundCleanupRef.current = finishRebound;\n el.addEventListener(\"transitionend\", onTransitionEnd);\n } else {\n el.style.transition = \"\";\n el.style.transform = \"\";\n }\n }\n }\n },\n [\n swipeActive,\n closeThreshold,\n velocityThreshold,\n side,\n isMobileViewport,\n bounded,\n setOpen,\n cancelSwipeRebound,\n panelOpenMs,\n ],\n );\n\n const panelTransform = useMemo(\n () =>\n dialogMotion\n ? isAnimating\n ? \"translateY(0)\"\n : `translateY(${DIALOG_MOTION_OFFSET_PX}px)`\n : panelSlideTransform(side, isAnimating, bounded),\n [dialogMotion, isAnimating, side, bounded],\n );\n\n const boundaryDepth = boundaryCtx?.depth ?? 0;\n const zIndex = bounded\n ? 10 + boundaryDepth * 10 + (nestDepth - 1) * 2\n : 50 + (nestDepth - 1) * 10;\n const layerPosition = bounded ? \"absolute\" : \"fixed\";\n\n const backdropStyle = useMemo(() => {\n if (!showBackdrop) return { transition: \"none\" } as const;\n if (dialogMotion) {\n return {\n transitionProperty: \"opacity\",\n transitionDuration: `${open ? DIALOG_MOTION_MS : panelCloseMs}ms`,\n transitionTimingFunction: open\n ? DIALOG_ENTRY_MOTION_EASING\n : DIALOG_EXIT_MOTION_EASING,\n };\n }\n return {\n transitionProperty: \"opacity\",\n transitionDuration: open\n ? `${BACKDROP_OPEN_MS}ms`\n : `${BACKDROP_CLOSE_MS}ms`,\n transitionTimingFunction: open\n ? BACKDROP_OPEN_EASING\n : BACKDROP_CLOSE_EASING,\n };\n }, [open, showBackdrop, dialogMotion, panelCloseMs]);\n\n const rootLayerStyle = useMemo(() => ({ zIndex }), [zIndex]);\n\n const panelSurfaceStyle = useMemo(() => {\n const touchAction = !swipeActive\n ? undefined\n : side === \"left\" || side === \"right\"\n ? \"pan-y\"\n : \"pan-x\";\n\n if (dialogMotion) {\n return {\n ...props.style,\n transform: panelTransform,\n opacity: isAnimating ? 1 : 0,\n transitionProperty: \"transform, opacity\",\n transitionDuration: `${open ? DIALOG_MOTION_MS : panelCloseMs}ms`,\n transitionTimingFunction: open\n ? DIALOG_ENTRY_MOTION_EASING\n : DIALOG_EXIT_MOTION_EASING,\n touchAction,\n } satisfies React.CSSProperties;\n }\n\n return {\n ...props.style,\n transform: panelTransform,\n transitionProperty: \"transform\",\n transitionDuration: open ? `${panelOpenMs}ms` : `${panelCloseMs}ms`,\n transitionTimingFunction: open\n ? PANEL_OPEN_EASING\n : panelCloseEasingViaSwipeRef.current\n ? PANEL_SWIPE_CLOSE_EASING\n : PANEL_CLOSE_EASING,\n touchAction,\n } satisfies React.CSSProperties;\n }, [\n dialogMotion,\n props.style,\n panelTransform,\n isAnimating,\n open,\n panelOpenMs,\n panelCloseMs,\n side,\n swipeActive,\n ]);\n\n if (!shouldRender) return null;\n\n if (inBoundaryTree && boundaryHost == null) {\n return null;\n }\n\n const sheetTree = (\n <div\n className={cn(\n layerPosition,\n \"inset-0\",\n !bounded && \"flex items-center justify-center\",\n bounded && \"pointer-events-none\",\n )}\n style={rootLayerStyle}\n >\n <div\n className={cn(\n layerPosition,\n \"inset-0\",\n showBackdrop && \"bg-black/20 transition-opacity dark:bg-black/50\",\n showBackdrop && (isAnimating ? \"opacity-100\" : \"opacity-0\"),\n !showBackdrop && \"bg-transparent\",\n bounded && \"pointer-events-auto\",\n )}\n style={backdropStyle}\n onClick={closeSheet}\n />\n\n <div\n {...props}\n ref={panelRef}\n role={role}\n className={cn(\n \"bg-background flex flex-col p-6 shadow-xl\",\n layerPosition,\n bounded\n ? cn(\n \"inset-0 z-10 h-full w-full max-w-none overflow-hidden pointer-events-auto\",\n )\n : cn(\"z-50\", SIDE_LAYOUT[side], sizeClassFor(side, size)),\n className,\n )}\n style={panelSurfaceStyle}\n onTouchStart={swipeActive ? handleTouchStart : undefined}\n onTouchMove={swipeActive ? handleTouchMove : undefined}\n onTouchEnd={swipeActive ? handleTouchEnd : undefined}\n >\n {children}\n\n {showClose && (\n <button\n type=\"button\"\n onClick={closeSheet}\n className={cn(\n // Above in-panel sticky layers (e.g. ScrollHeaderSticky z-40)\n \"absolute z-100 flex size-12 cursor-pointer items-center justify-center rounded-full bg-background md:border md:border-primary/10 md:shadow-xl transition-all hover:bg-secondary-background hover:border-primary/20 active:scale-[0.96]\",\n \"top-4 right-4\",\n side === \"right\" && \"md:top-5 md:right-auto md:-left-16\",\n side === \"left\" && \"md:top-5 md:-right-16 md:left-auto\",\n side === \"top\" &&\n \"md:top-auto md:right-auto md:-bottom-15 md:left-1/2 md:-translate-x-1/2\",\n side === \"bottom\" &&\n \"md:-top-15 md:right-auto md:bottom-auto md:left-1/2 md:-translate-x-1/2\",\n )}\n >\n <X className=\"size-5.5\" />\n <span className=\"sr-only\">Close</span>\n </button>\n )}\n </div>\n </div>\n );\n\n return createPortal(\n sheetTree,\n bounded && boundaryHost ? boundaryHost : document.body,\n );\n};\n\n// -----------------------------------------------------------------------------\n// Chrome\n// -----------------------------------------------------------------------------\n\nexport const SheetHeader: React.FC<\n React.HTMLAttributes<HTMLDivElement> & { fixed?: boolean }\n> = ({ className, fixed, ...props }) => (\n <div\n className={cn(\n \"flex flex-col text-left\",\n fixed && \"bg-background border-primary/10 sticky top-0 z-10 border-b p-4\",\n className,\n )}\n {...props}\n />\n);\n\nexport const SheetFooter: React.FC<\n React.HTMLAttributes<HTMLDivElement> & { fixed?: boolean }\n> = ({ className, fixed, ...props }) => (\n <div\n className={cn(\n \"flex flex-row\",\n fixed &&\n \"bg-background border-primary/10 sticky bottom-0 z-10 border-t p-4\",\n className,\n )}\n {...props}\n />\n);\n\nexport const SheetTitle: React.FC<React.HTMLAttributes<HTMLHeadingElement>> = ({\n className,\n ...props\n}) => (\n <h3\n className={cn(\"text-primary text-lg font-semibold\", className)}\n {...props}\n />\n);\n\nexport const SheetDescription: React.FC<\n React.HTMLAttributes<HTMLParagraphElement>\n> = ({ className, ...props }) => (\n <p className={cn(\"text-muted-foreground text-sm\", className)} {...props} />\n);\n/**\n * Circular back control for nested sheets (arrow, same footprint as the default\n * sheet close icon). Wraps `SheetClose` with `asChild`.\n *\n * `onClick` (and any other button props) run in the same activation handler as\n * close: your handler runs first, then the sheet closes. Prefer `afterClose`\n * over a delayed `onClick` when opening another sheet so the exit uses the\n * handoff timing built into `Sheet`.\n */\nexport const SheetNestedClose: React.FC<\n React.ComponentPropsWithoutRef<\"button\"> & {\n children?: React.ReactNode;\n /**\n * Runs after the close animation when chaining another sheet. Uses a shorter\n * exit (see `SheetSetOpenOptions.afterClose`).\n */\n afterClose?: () => void;\n }\n> = ({ className, children, onClick, afterClose, ...props }) => (\n <SheetClose asChild afterClose={afterClose}>\n <button\n type=\"button\"\n className={cn(\n \"-ml-3.5 inline-flex size-12 shrink-0 cursor-pointer items-center justify-center rounded-full bg-background transition-all hover:bg-primary/5 active:scale-[0.96]\",\n className,\n )}\n onClick={onClick}\n {...props}\n >\n {children ?? (\n <>\n <ArrowLeft className=\"size-5.5\" aria-hidden />\n <span className=\"sr-only\">Back</span>\n </>\n )}\n </button>\n </SheetClose>\n);\n"]}
|