@avenue-ticketing/ui 0.2.0 → 0.3.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/badge.d.ts +55 -0
- package/dist/react/badge.js +64 -0
- package/dist/react/badge.js.map +1 -0
- package/dist/react/dialog.d.ts +9 -1
- package/dist/react/dialog.js +36 -16
- package/dist/react/dialog.js.map +1 -1
- package/dist/react/scroll-header.d.ts +19 -1
- package/dist/react/scroll-header.js +129 -40
- package/dist/react/scroll-header.js.map +1 -1
- package/dist/react/sheet.d.ts +15 -1
- package/dist/react/sheet.js +44 -16
- package/dist/react/sheet.js.map +1 -1
- package/dist/react/tabs.d.ts +28 -0
- package/dist/react/tabs.js +263 -0
- package/dist/react/tabs.js.map +1 -0
- package/package.json +1 -1
package/dist/react/sheet.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import React, {
|
|
1
|
+
import React, { useCallback, useState, useMemo, useEffect, useLayoutEffect } from 'react';
|
|
2
2
|
import { createPortal } from 'react-dom';
|
|
3
3
|
import { X, ArrowLeft } from 'lucide-react';
|
|
4
4
|
import { clsx } from 'clsx';
|
|
5
5
|
import { twMerge } from 'tailwind-merge';
|
|
6
|
-
import {
|
|
6
|
+
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
7
7
|
|
|
8
8
|
function cn(...inputs) {
|
|
9
9
|
return twMerge(clsx(inputs));
|
|
@@ -29,6 +29,8 @@ var DIALOG_EXIT_MOTION_EASING = "cubic-bezier(0.85, 0, 1, 0.15)";
|
|
|
29
29
|
var DIALOG_MOTION_OFFSET_PX = 120;
|
|
30
30
|
var PANEL_OFF_X = "112%";
|
|
31
31
|
var PANEL_OFF_Y = "100%";
|
|
32
|
+
var SHEET_Z_PANEL_CLOSE = 100;
|
|
33
|
+
var SHEET_Z_PORTAL_STEP = 10;
|
|
32
34
|
var SIDE_LAYOUT = {
|
|
33
35
|
top: "top-0 left-0 right-0 border-b border-primary/10",
|
|
34
36
|
bottom: "bottom-0 left-0 right-0 border-t border-primary/10",
|
|
@@ -255,6 +257,39 @@ function useSheetScrollLock(open, setOpen, bounded, nestDepth) {
|
|
|
255
257
|
return () => window.removeEventListener("keydown", handleEscNested, true);
|
|
256
258
|
}, [open, setOpen, bounded, nestDepth]);
|
|
257
259
|
}
|
|
260
|
+
var SheetCloseButton = React.forwardRef(
|
|
261
|
+
({ className, side = "right", style, type = "button", onClick, ...props }, ref) => {
|
|
262
|
+
const { setOpen } = useSheetContext();
|
|
263
|
+
const handleClick = useCallback(
|
|
264
|
+
(e) => {
|
|
265
|
+
onClick?.(e);
|
|
266
|
+
if (onClick == null) {
|
|
267
|
+
setOpen(false);
|
|
268
|
+
}
|
|
269
|
+
},
|
|
270
|
+
[onClick, setOpen]
|
|
271
|
+
);
|
|
272
|
+
return /* @__PURE__ */ jsxs(
|
|
273
|
+
"button",
|
|
274
|
+
{
|
|
275
|
+
ref,
|
|
276
|
+
type,
|
|
277
|
+
style: { zIndex: SHEET_Z_PANEL_CLOSE, ...style },
|
|
278
|
+
className: cn(
|
|
279
|
+
"flex size-12 cursor-pointer items-center justify-center rounded-full md:bg-background transition-all hover:bg-secondary-background active:scale-[0.96] md:border md:border-primary/10 md:shadow-xl hover:border-primary/20",
|
|
280
|
+
className
|
|
281
|
+
),
|
|
282
|
+
onClick: handleClick,
|
|
283
|
+
...props,
|
|
284
|
+
children: [
|
|
285
|
+
/* @__PURE__ */ jsx(X, { className: "size-5.5" }),
|
|
286
|
+
/* @__PURE__ */ jsx("span", { className: "sr-only", children: "Close" })
|
|
287
|
+
]
|
|
288
|
+
}
|
|
289
|
+
);
|
|
290
|
+
}
|
|
291
|
+
);
|
|
292
|
+
SheetCloseButton.displayName = "SheetCloseButton";
|
|
258
293
|
var SheetContent = ({
|
|
259
294
|
children,
|
|
260
295
|
side = "right",
|
|
@@ -499,7 +534,7 @@ var SheetContent = ({
|
|
|
499
534
|
[dialogMotion, isAnimating, side, bounded]
|
|
500
535
|
);
|
|
501
536
|
const boundaryDepth = boundaryCtx?.depth ?? 0;
|
|
502
|
-
const zIndex = bounded ?
|
|
537
|
+
const zIndex = bounded ? SHEET_Z_PANEL_CLOSE + SHEET_Z_PORTAL_STEP + boundaryDepth * SHEET_Z_PORTAL_STEP + (nestDepth - 1) * 2 : SHEET_Z_PANEL_CLOSE - 5 * SHEET_Z_PORTAL_STEP + (nestDepth - 1) * SHEET_Z_PORTAL_STEP;
|
|
503
538
|
const layerPosition = bounded ? "absolute" : "fixed";
|
|
504
539
|
const backdropStyle = useMemo(() => {
|
|
505
540
|
if (!showBackdrop) return { transition: "none" };
|
|
@@ -599,24 +634,17 @@ var SheetContent = ({
|
|
|
599
634
|
onTouchEnd: swipeActive ? handleTouchEnd : void 0,
|
|
600
635
|
children: [
|
|
601
636
|
children,
|
|
602
|
-
showClose && /* @__PURE__ */
|
|
603
|
-
|
|
637
|
+
showClose && /* @__PURE__ */ jsx(
|
|
638
|
+
SheetCloseButton,
|
|
604
639
|
{
|
|
605
|
-
|
|
606
|
-
onClick: closeSheet,
|
|
640
|
+
side,
|
|
607
641
|
className: cn(
|
|
608
|
-
|
|
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]",
|
|
610
|
-
"top-4 right-4",
|
|
642
|
+
"absolute top-4 right-4",
|
|
611
643
|
side === "right" && "md:top-5 md:right-auto md:-left-16",
|
|
612
644
|
side === "left" && "md:top-5 md:-right-16 md:left-auto",
|
|
613
645
|
side === "top" && "md:top-auto md:right-auto md:-bottom-15 md:left-1/2 md:-translate-x-1/2",
|
|
614
646
|
side === "bottom" && "md:-top-15 md:right-auto md:bottom-auto md:left-1/2 md:-translate-x-1/2"
|
|
615
|
-
)
|
|
616
|
-
children: [
|
|
617
|
-
/* @__PURE__ */ jsx(X, { className: "size-5.5" }),
|
|
618
|
-
/* @__PURE__ */ jsx("span", { className: "sr-only", children: "Close" })
|
|
619
|
-
]
|
|
647
|
+
)
|
|
620
648
|
}
|
|
621
649
|
)
|
|
622
650
|
]
|
|
@@ -680,6 +708,6 @@ var SheetNestedClose = ({ className, children, onClick, afterClose, ...props })
|
|
|
680
708
|
}
|
|
681
709
|
) });
|
|
682
710
|
|
|
683
|
-
export { Sheet, SheetBoundary, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetNestedClose, SheetTitle, SheetTrigger };
|
|
711
|
+
export { Sheet, SheetBoundary, SheetClose, SheetCloseButton, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetNestedClose, SheetTitle, SheetTrigger };
|
|
684
712
|
//# sourceMappingURL=sheet.js.map
|
|
685
713
|
//# sourceMappingURL=sheet.js.map
|
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 // 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"]}
|
|
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\n/**\n * Z-order for `SheetContent`: default close uses `SHEET_Z_PANEL_CLOSE` (above\n * `ScrollHeaderSticky` z-40, same idea as `Dialog`). Portal roots use\n * `SHEET_Z_PORTAL_STEP` as the main tier size; viewport base is `close - 5*step` (50).\n * Bounded stacks start at `close + step` so they sit above an ancestor's close control;\n * nested bounded sheets add `(nestDepth - 1) * 2` within the same boundary tree.\n */\nconst SHEET_Z_PANEL_CLOSE = 100;\nconst SHEET_Z_PORTAL_STEP = 10;\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\nexport type SheetCloseButtonSide = \"top\" | \"right\" | \"bottom\" | \"left\";\n\nexport interface SheetCloseButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /**\n * Desktop offset matches {@link SheetContent} for the same `side`; default\n * `right` matches `SheetContent` default.\n */\n side?: SheetCloseButtonSide;\n}\n\n/**\n * Default dismiss control for {@link SheetContent}. Includes absolute placement\n * for the given `side`; pass `className` to adjust or replace positioning.\n * When `onClick` is omitted, uses sheet context to call `setOpen(false)`.\n */\nexport const SheetCloseButton = React.forwardRef<\n HTMLButtonElement,\n SheetCloseButtonProps\n>(\n (\n { className, side = \"right\", style, type = \"button\", onClick, ...props },\n ref,\n ) => {\n const { setOpen } = useSheetContext();\n const handleClick = useCallback(\n (e: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(e);\n if (onClick == null) {\n setOpen(false);\n }\n },\n [onClick, setOpen],\n );\n\n return (\n <button\n ref={ref}\n type={type}\n style={{ zIndex: SHEET_Z_PANEL_CLOSE, ...style }}\n className={cn(\n \"flex size-12 cursor-pointer items-center justify-center rounded-full md:bg-background transition-all hover:bg-secondary-background active:scale-[0.96] md:border md:border-primary/10 md:shadow-xl hover:border-primary/20\",\n className,\n )}\n onClick={handleClick}\n {...props}\n >\n <X className=\"size-5.5\" />\n <span className=\"sr-only\">Close</span>\n </button>\n );\n },\n);\nSheetCloseButton.displayName = \"SheetCloseButton\";\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 ? SHEET_Z_PANEL_CLOSE +\n SHEET_Z_PORTAL_STEP +\n boundaryDepth * SHEET_Z_PORTAL_STEP +\n (nestDepth - 1) * 2\n : SHEET_Z_PANEL_CLOSE -\n 5 * SHEET_Z_PORTAL_STEP +\n (nestDepth - 1) * SHEET_Z_PORTAL_STEP;\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 <SheetCloseButton\n side={side}\n className={cn(\n \"absolute 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 )}\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"]}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
|
|
3
|
+
type TabsVariant = "pill" | "underline";
|
|
4
|
+
interface TabsProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
5
|
+
defaultValue?: string;
|
|
6
|
+
value?: string;
|
|
7
|
+
onValueChange?: (value: string) => void;
|
|
8
|
+
/** `pill` — segmented control with sliding primary fill (default). `underline` — bottom border row + clip-path sliding primary underline. */
|
|
9
|
+
variant?: TabsVariant;
|
|
10
|
+
children: React.ReactNode;
|
|
11
|
+
}
|
|
12
|
+
declare const Tabs: React.FC<TabsProps>;
|
|
13
|
+
interface TabsListProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
14
|
+
}
|
|
15
|
+
declare const TabsList: React.FC<TabsListProps>;
|
|
16
|
+
interface TabsTriggerProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, "onClick"> {
|
|
17
|
+
value?: string;
|
|
18
|
+
icon?: React.ReactNode;
|
|
19
|
+
iconPosition?: "left" | "right";
|
|
20
|
+
onClick?: React.MouseEventHandler<HTMLButtonElement>;
|
|
21
|
+
}
|
|
22
|
+
declare const TabsTrigger: React.FC<TabsTriggerProps>;
|
|
23
|
+
interface TabsContentProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
24
|
+
value: string;
|
|
25
|
+
}
|
|
26
|
+
declare const TabsContent: React.FC<TabsContentProps>;
|
|
27
|
+
|
|
28
|
+
export { Tabs, TabsContent, TabsList, TabsTrigger, type TabsVariant };
|