@avenue-ticketing/ui 0.2.0 → 0.4.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.
@@ -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 };
@@ -0,0 +1,267 @@
1
+ import * as React from 'react';
2
+ import { clsx } from 'clsx';
3
+ import { twMerge } from 'tailwind-merge';
4
+ import { jsx, jsxs } from 'react/jsx-runtime';
5
+
6
+ function cn(...inputs) {
7
+ return twMerge(clsx(inputs));
8
+ }
9
+ var TabsContext = React.createContext(null);
10
+ function useTabs() {
11
+ const context = React.useContext(TabsContext);
12
+ if (!context) {
13
+ throw new Error("Tabs components must be used within a <Tabs />");
14
+ }
15
+ return context;
16
+ }
17
+ var Tabs = ({
18
+ defaultValue,
19
+ value: controlledValue,
20
+ onValueChange,
21
+ children,
22
+ className,
23
+ variant = "pill",
24
+ ...props
25
+ }) => {
26
+ const [internalValue, setInternalValue] = React.useState(defaultValue);
27
+ const isControlled = controlledValue !== void 0;
28
+ const value = isControlled ? controlledValue : internalValue;
29
+ const handleValueChange = React.useCallback(
30
+ (newValue) => {
31
+ if (!isControlled) {
32
+ setInternalValue(newValue);
33
+ }
34
+ onValueChange?.(newValue);
35
+ },
36
+ [isControlled, onValueChange]
37
+ );
38
+ return /* @__PURE__ */ jsx(
39
+ TabsContext.Provider,
40
+ {
41
+ value: { value, onValueChange: handleValueChange, variant },
42
+ children: /* @__PURE__ */ jsx("div", { className: cn("flex flex-col gap-4", className), ...props, children })
43
+ }
44
+ );
45
+ };
46
+ var TabsList = ({
47
+ children,
48
+ className,
49
+ ...props
50
+ }) => {
51
+ const { value: activeValue, onValueChange, variant } = useTabs();
52
+ const rowRef = React.useRef(null);
53
+ const updateIndicatorClip = React.useCallback(() => {
54
+ const row = rowRef.current;
55
+ if (!row || variant !== "pill" && variant !== "underline") return;
56
+ const tab = row.querySelector(
57
+ '[role="tab"][aria-selected="true"]:not(:disabled)'
58
+ );
59
+ if (!tab) {
60
+ row.style.setProperty("--tab-indicator-start", "0px");
61
+ row.style.setProperty("--tab-indicator-end", "0px");
62
+ return;
63
+ }
64
+ const start = tab.offsetLeft;
65
+ const end = tab.offsetLeft + tab.offsetWidth;
66
+ row.style.setProperty("--tab-indicator-start", `${start}px`);
67
+ row.style.setProperty("--tab-indicator-end", `${end}px`);
68
+ }, [variant]);
69
+ React.useLayoutEffect(() => {
70
+ if (variant === "pill" || variant === "underline") updateIndicatorClip();
71
+ }, [activeValue, children, updateIndicatorClip, variant]);
72
+ React.useEffect(() => {
73
+ if (variant !== "pill" && variant !== "underline") return;
74
+ const onResize = () => updateIndicatorClip();
75
+ window.addEventListener("resize", onResize, { passive: true });
76
+ return () => window.removeEventListener("resize", onResize);
77
+ }, [updateIndicatorClip, activeValue, variant]);
78
+ React.useEffect(() => {
79
+ if (variant !== "pill" && variant !== "underline") return;
80
+ const el = rowRef.current;
81
+ if (!el || typeof ResizeObserver === "undefined") return;
82
+ const ro = new ResizeObserver(() => updateIndicatorClip());
83
+ ro.observe(el);
84
+ return () => ro.disconnect();
85
+ }, [updateIndicatorClip, variant]);
86
+ const handleKeyDown = React.useCallback(
87
+ (e) => {
88
+ const dir = e.key === "ArrowRight" ? 1 : e.key === "ArrowLeft" ? -1 : 0;
89
+ if (!dir) return;
90
+ const row = rowRef.current;
91
+ if (!row) return;
92
+ const tabs = Array.from(
93
+ row.querySelectorAll('[role="tab"][data-tab-value]')
94
+ ).filter((t) => !t.disabled);
95
+ if (tabs.length === 0) return;
96
+ const values = tabs.map((t) => t.dataset.tabValue);
97
+ let idx = activeValue ? values.indexOf(activeValue) : 0;
98
+ if (idx < 0) idx = 0;
99
+ const next = (idx + dir + values.length) % values.length;
100
+ const nextValue = values[next];
101
+ if (nextValue) {
102
+ e.preventDefault();
103
+ onValueChange(nextValue);
104
+ tabs[next]?.focus();
105
+ }
106
+ },
107
+ [activeValue, onValueChange]
108
+ );
109
+ return /* @__PURE__ */ jsx(
110
+ "div",
111
+ {
112
+ onKeyDown: handleKeyDown,
113
+ className: cn(
114
+ "max-w-full overflow-x-auto no-scrollbar",
115
+ variant === "pill" ? "pb-1" : "pb-0",
116
+ className
117
+ ),
118
+ ...props,
119
+ children: /* @__PURE__ */ jsxs(
120
+ "div",
121
+ {
122
+ ref: rowRef,
123
+ role: "tablist",
124
+ className: cn(
125
+ "inline-flex w-max min-w-full items-center",
126
+ (variant === "pill" || variant === "underline") && "relative",
127
+ variant === "pill" && "gap-1",
128
+ variant === "underline" && "gap-2 rounded-none border-b border-border bg-transparent py-0"
129
+ ),
130
+ children: [
131
+ variant === "pill" && /* @__PURE__ */ jsx(
132
+ "div",
133
+ {
134
+ "aria-hidden": "true",
135
+ "data-slot": "tabs-indicator",
136
+ style: {
137
+ clipPath: "inset(0 calc(100% - var(--tab-indicator-end, 0px)) 0 var(--tab-indicator-start, 0px) round 9999px)"
138
+ },
139
+ className: cn(
140
+ "pointer-events-none absolute inset-x-0 top-0 z-0 h-9 rounded-full bg-primary",
141
+ "motion-reduce:transition-none",
142
+ "motion-safe:transition-[clip-path] motion-safe:duration-300 motion-safe:ease-[cubic-bezier(0,0.55,0.45,1)]"
143
+ )
144
+ }
145
+ ),
146
+ variant === "underline" && /* @__PURE__ */ jsx(
147
+ "div",
148
+ {
149
+ "aria-hidden": "true",
150
+ "data-slot": "tabs-underline-indicator",
151
+ style: {
152
+ clipPath: "inset(0 calc(100% - var(--tab-indicator-end, 0px)) 0 var(--tab-indicator-start, 0px))"
153
+ },
154
+ className: cn(
155
+ "pointer-events-none absolute inset-x-0 bottom-0 z-0 h-0.5 bg-primary",
156
+ "motion-reduce:transition-none",
157
+ "motion-safe:transition-[clip-path] motion-safe:duration-300 motion-safe:ease-[cubic-bezier(0,0.55,0.45,1)]"
158
+ )
159
+ }
160
+ ),
161
+ children
162
+ ]
163
+ }
164
+ )
165
+ }
166
+ );
167
+ };
168
+ var TabsTrigger = ({
169
+ value,
170
+ children,
171
+ icon,
172
+ iconPosition = "left",
173
+ onClick,
174
+ className,
175
+ disabled,
176
+ ...props
177
+ }) => {
178
+ const { value: activeValue, onValueChange, variant } = useTabs();
179
+ const isActive = value ? activeValue === value : false;
180
+ const showSelected = isActive && !disabled;
181
+ return /* @__PURE__ */ jsxs(
182
+ "button",
183
+ {
184
+ type: "button",
185
+ role: "tab",
186
+ "aria-selected": isActive,
187
+ "aria-disabled": disabled || void 0,
188
+ tabIndex: value !== void 0 ? isActive && !disabled ? 0 : -1 : void 0,
189
+ disabled,
190
+ "data-tab-value": value,
191
+ onClick: (e) => {
192
+ if (disabled) return;
193
+ if (value) onValueChange(value);
194
+ onClick?.(e);
195
+ },
196
+ className: cn(
197
+ "relative z-1 inline-flex shrink-0 select-none items-center justify-center gap-2 whitespace-nowrap touch-manipulation [-webkit-tap-highlight-color:transparent]",
198
+ "cursor-pointer disabled:cursor-not-allowed",
199
+ variant === "pill" && [
200
+ "h-9 rounded-full px-4 font-semibold leading-5 text-[13px] md:text-[15px]",
201
+ "[transition:background-color_var(--duration-short-s,0.1s)_var(--ease-out,cubic-bezier(0,.55,.45,1)),border-color_var(--duration-short-s,0.1s)_var(--ease-out,cubic-bezier(0,.55,.45,1)),scale_var(--duration-short-s,0.1s)_var(--ease-out,cubic-bezier(0,.55,.45,1)),color_var(--duration-short-m,0.2s)_var(--ease-in-out,cubic-bezier(.85,0,.15,1))]",
202
+ "enabled:active:scale-[0.96] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
203
+ showSelected ? [
204
+ "text-background",
205
+ "**:data-[slot=badge]:border-none **:data-[slot=badge]:bg-background/20 **:data-[slot=badge]:text-background"
206
+ ] : "bg-primary/4 text-primary/50 enabled:[@media(hover:hover)_and_(pointer:fine)]:hover:bg-primary/10 enabled:active:bg-primary/10"
207
+ ],
208
+ variant === "underline" && [
209
+ "h-auto rounded-none border-0 bg-transparent px-2 py-2 text-sm font-medium shadow-none",
210
+ "transition-[color,transform] duration-200 ease-in-out",
211
+ "motion-reduce:transition-colors motion-reduce:enabled:active:scale-100",
212
+ "enabled:active:scale-[0.98]",
213
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
214
+ showSelected ? "text-primary" : "text-primary/50 enabled:[@media(hover:hover)_and_(pointer:fine)]:hover:text-primary/70"
215
+ ],
216
+ "disabled:opacity-50",
217
+ className
218
+ ),
219
+ ...props,
220
+ children: [
221
+ icon && iconPosition === "left" && /* @__PURE__ */ jsx(
222
+ "span",
223
+ {
224
+ className: "flex size-4 shrink-0 items-center justify-center",
225
+ "aria-hidden": true,
226
+ children: icon
227
+ }
228
+ ),
229
+ children,
230
+ icon && iconPosition === "right" && /* @__PURE__ */ jsx(
231
+ "span",
232
+ {
233
+ className: "flex size-4 shrink-0 items-center justify-center",
234
+ "aria-hidden": true,
235
+ children: icon
236
+ }
237
+ )
238
+ ]
239
+ }
240
+ );
241
+ };
242
+ var TabsContent = ({
243
+ value,
244
+ children,
245
+ className,
246
+ ...props
247
+ }) => {
248
+ const { value: activeValue } = useTabs();
249
+ if (activeValue !== value) return null;
250
+ return /* @__PURE__ */ jsx(
251
+ "div",
252
+ {
253
+ role: "tabpanel",
254
+ className: cn(
255
+ "animate-in fade-in-0 slide-in-from-top-1 duration-200",
256
+ "ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
257
+ className
258
+ ),
259
+ ...props,
260
+ children
261
+ }
262
+ );
263
+ };
264
+
265
+ export { Tabs, TabsContent, TabsList, TabsTrigger };
266
+ //# sourceMappingURL=tabs.js.map
267
+ //# sourceMappingURL=tabs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/utils.ts","../../src/react/tabs.tsx"],"names":[],"mappings":"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","file":"tabs.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 * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\n//////////////////////////////////////////////// CONTEXT\n\nexport type TabsVariant = \"pill\" | \"underline\";\n\ninterface TabsProps extends React.HTMLAttributes<HTMLDivElement> {\n defaultValue?: string;\n value?: string;\n onValueChange?: (value: string) => void;\n /** `pill` — segmented control with sliding primary fill (default). `underline` — bottom border row + clip-path sliding primary underline. */\n variant?: TabsVariant;\n children: React.ReactNode;\n}\n\nconst TabsContext = React.createContext<{\n value?: string;\n onValueChange: (value: string) => void;\n variant: TabsVariant;\n} | null>(null);\n\nfunction useTabs() {\n const context = React.useContext(TabsContext);\n if (!context) {\n throw new Error(\"Tabs components must be used within a <Tabs />\");\n }\n return context;\n}\n\nexport const Tabs: React.FC<TabsProps> = ({\n defaultValue,\n value: controlledValue,\n onValueChange,\n children,\n className,\n variant = \"pill\",\n ...props\n}) => {\n const [internalValue, setInternalValue] = React.useState(defaultValue);\n const isControlled = controlledValue !== undefined;\n const value = isControlled ? controlledValue : internalValue;\n\n const handleValueChange = React.useCallback(\n (newValue: string) => {\n if (!isControlled) {\n setInternalValue(newValue);\n }\n onValueChange?.(newValue);\n },\n [isControlled, onValueChange],\n );\n\n return (\n <TabsContext.Provider\n value={{ value, onValueChange: handleValueChange, variant }}\n >\n <div className={cn(\"flex flex-col gap-4\", className)} {...props}>\n {children}\n </div>\n </TabsContext.Provider>\n );\n};\n\ninterface TabsListProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nexport const TabsList: React.FC<TabsListProps> = ({\n children,\n className,\n ...props\n}) => {\n const { value: activeValue, onValueChange, variant } = useTabs();\n const rowRef = React.useRef<HTMLDivElement>(null);\n\n /** Drives horizontal `clip-path` via `--tab-indicator-start` / `--tab-indicator-end` (px from row left). */\n const updateIndicatorClip = React.useCallback(() => {\n const row = rowRef.current;\n if (!row || (variant !== \"pill\" && variant !== \"underline\")) return;\n\n const tab = row.querySelector<HTMLElement>(\n '[role=\"tab\"][aria-selected=\"true\"]:not(:disabled)',\n );\n if (!tab) {\n row.style.setProperty(\"--tab-indicator-start\", \"0px\");\n row.style.setProperty(\"--tab-indicator-end\", \"0px\");\n return;\n }\n\n const start = tab.offsetLeft;\n const end = tab.offsetLeft + tab.offsetWidth;\n row.style.setProperty(\"--tab-indicator-start\", `${start}px`);\n row.style.setProperty(\"--tab-indicator-end\", `${end}px`);\n }, [variant]);\n\n React.useLayoutEffect(() => {\n if (variant === \"pill\" || variant === \"underline\") updateIndicatorClip();\n }, [activeValue, children, updateIndicatorClip, variant]);\n\n React.useEffect(() => {\n if (variant !== \"pill\" && variant !== \"underline\") return;\n const onResize = () => updateIndicatorClip();\n window.addEventListener(\"resize\", onResize, { passive: true });\n return () => window.removeEventListener(\"resize\", onResize);\n }, [updateIndicatorClip, activeValue, variant]);\n\n React.useEffect(() => {\n if (variant !== \"pill\" && variant !== \"underline\") return;\n const el = rowRef.current;\n if (!el || typeof ResizeObserver === \"undefined\") return;\n const ro = new ResizeObserver(() => updateIndicatorClip());\n ro.observe(el);\n return () => ro.disconnect();\n }, [updateIndicatorClip, variant]);\n\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n const dir = e.key === \"ArrowRight\" ? 1 : e.key === \"ArrowLeft\" ? -1 : 0;\n if (!dir) return;\n const row = rowRef.current;\n if (!row) return;\n const tabs = Array.from(\n row.querySelectorAll<HTMLButtonElement>('[role=\"tab\"][data-tab-value]'),\n ).filter((t) => !t.disabled);\n if (tabs.length === 0) return;\n const values = tabs.map((t) => t.dataset.tabValue!);\n let idx = activeValue ? values.indexOf(activeValue) : 0;\n if (idx < 0) idx = 0;\n const next = (idx + dir + values.length) % values.length;\n const nextValue = values[next];\n if (nextValue) {\n e.preventDefault();\n onValueChange(nextValue);\n tabs[next]?.focus();\n }\n },\n [activeValue, onValueChange],\n );\n\n return (\n <div\n onKeyDown={handleKeyDown}\n className={cn(\n \"max-w-full overflow-x-auto no-scrollbar\",\n variant === \"pill\" ? \"pb-1\" : \"pb-0\",\n className,\n )}\n {...props}\n >\n <div\n ref={rowRef}\n role=\"tablist\"\n className={cn(\n \"inline-flex w-max min-w-full items-center\",\n (variant === \"pill\" || variant === \"underline\") && \"relative\",\n variant === \"pill\" && \"gap-1\",\n variant === \"underline\" &&\n \"gap-2 rounded-none border-b border-border bg-transparent py-0\",\n )}\n >\n {variant === \"pill\" && (\n <div\n aria-hidden=\"true\"\n data-slot=\"tabs-indicator\"\n style={{\n clipPath:\n \"inset(0 calc(100% - var(--tab-indicator-end, 0px)) 0 var(--tab-indicator-start, 0px) round 9999px)\",\n }}\n className={cn(\n \"pointer-events-none absolute inset-x-0 top-0 z-0 h-9 rounded-full bg-primary\",\n \"motion-reduce:transition-none\",\n \"motion-safe:transition-[clip-path] motion-safe:duration-300 motion-safe:ease-[cubic-bezier(0,0.55,0.45,1)]\",\n )}\n />\n )}\n {variant === \"underline\" && (\n <div\n aria-hidden=\"true\"\n data-slot=\"tabs-underline-indicator\"\n style={{\n clipPath:\n \"inset(0 calc(100% - var(--tab-indicator-end, 0px)) 0 var(--tab-indicator-start, 0px))\",\n }}\n className={cn(\n \"pointer-events-none absolute inset-x-0 bottom-0 z-0 h-0.5 bg-primary\",\n \"motion-reduce:transition-none\",\n \"motion-safe:transition-[clip-path] motion-safe:duration-300 motion-safe:ease-[cubic-bezier(0,0.55,0.45,1)]\",\n )}\n />\n )}\n {children}\n </div>\n </div>\n );\n};\n\ninterface TabsTriggerProps extends Omit<\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n \"onClick\"\n> {\n value?: string;\n icon?: React.ReactNode;\n iconPosition?: \"left\" | \"right\";\n onClick?: React.MouseEventHandler<HTMLButtonElement>;\n}\n\nexport const TabsTrigger: React.FC<TabsTriggerProps> = ({\n value,\n children,\n icon,\n iconPosition = \"left\",\n onClick,\n className,\n disabled,\n ...props\n}) => {\n const { value: activeValue, onValueChange, variant } = useTabs();\n const isActive = value ? activeValue === value : false;\n const showSelected = isActive && !disabled;\n\n return (\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={isActive}\n aria-disabled={disabled || undefined}\n tabIndex={\n value !== undefined ? (isActive && !disabled ? 0 : -1) : undefined\n }\n disabled={disabled}\n data-tab-value={value}\n onClick={(e) => {\n if (disabled) return;\n if (value) onValueChange(value);\n onClick?.(e);\n }}\n className={cn(\n \"relative z-1 inline-flex shrink-0 select-none items-center justify-center gap-2 whitespace-nowrap touch-manipulation [-webkit-tap-highlight-color:transparent]\",\n \"cursor-pointer disabled:cursor-not-allowed\",\n variant === \"pill\" && [\n \"h-9 rounded-full px-4 font-semibold leading-5 text-[13px] md:text-[15px]\",\n \"[transition:background-color_var(--duration-short-s,0.1s)_var(--ease-out,cubic-bezier(0,.55,.45,1)),border-color_var(--duration-short-s,0.1s)_var(--ease-out,cubic-bezier(0,.55,.45,1)),scale_var(--duration-short-s,0.1s)_var(--ease-out,cubic-bezier(0,.55,.45,1)),color_var(--duration-short-m,0.2s)_var(--ease-in-out,cubic-bezier(.85,0,.15,1))]\",\n \"enabled:active:scale-[0.96] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n showSelected\n ? [\n \"text-background\",\n \"**:data-[slot=badge]:border-none **:data-[slot=badge]:bg-background/20 **:data-[slot=badge]:text-background\",\n ]\n : \"bg-primary/4 text-primary/50 enabled:[@media(hover:hover)_and_(pointer:fine)]:hover:bg-primary/10 enabled:active:bg-primary/10\",\n ],\n variant === \"underline\" && [\n \"h-auto rounded-none border-0 bg-transparent px-2 py-2 text-sm font-medium shadow-none\",\n \"transition-[color,transform] duration-200 ease-in-out\",\n \"motion-reduce:transition-colors motion-reduce:enabled:active:scale-100\",\n \"enabled:active:scale-[0.98]\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n showSelected\n ? \"text-primary\"\n : \"text-primary/50 enabled:[@media(hover:hover)_and_(pointer:fine)]:hover:text-primary/70\",\n ],\n \"disabled:opacity-50\",\n className,\n )}\n {...props}\n >\n {icon && iconPosition === \"left\" && (\n <span\n className=\"flex size-4 shrink-0 items-center justify-center\"\n aria-hidden\n >\n {icon}\n </span>\n )}\n {children}\n {icon && iconPosition === \"right\" && (\n <span\n className=\"flex size-4 shrink-0 items-center justify-center\"\n aria-hidden\n >\n {icon}\n </span>\n )}\n </button>\n );\n};\n\ninterface TabsContentProps extends React.HTMLAttributes<HTMLDivElement> {\n value: string;\n}\n\nexport const TabsContent: React.FC<TabsContentProps> = ({\n value,\n children,\n className,\n ...props\n}) => {\n const { value: activeValue } = useTabs();\n\n if (activeValue !== value) return null;\n\n return (\n <div\n role=\"tabpanel\"\n className={cn(\n \"animate-in fade-in-0 slide-in-from-top-1 duration-200\",\n \"ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n className,\n )}\n {...props}\n >\n {children}\n </div>\n );\n};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@avenue-ticketing/ui",
3
- "version": "0.2.0",
3
+ "version": "0.4.0",
4
4
  "description": "Avenue UI components for React",
5
5
  "license": "MIT",
6
6
  "sideEffects": false,