{"version":3,"file":"MobileBottomSheet-DqhKd4Jr.mjs","names":[],"sources":["../../../platform/ui-components/src/components/sheet-haptics-context.tsx","../../react/src/shell/use-mobile.ts","../../../platform/ui-components/src/components/MobileBottomSheet.tsx"],"sourcesContent":["import { createContext, use } from \"react\";\n\n/**\n * The sheet's snap positions. Owned here (rather than imported from\n * `MobileBottomSheet`) so this context has no import cycle with the sheet, which\n * imports the handler below.\n */\nexport type MobileBottomSheetSnapPoint = \"compact\" | \"expanded\";\n\n/**\n * Lets the app make *every* {@link MobileBottomSheet} fire native feedback on a\n * snap-point change without each call site wiring it.\n *\n * `ui-components` stays device-agnostic: the sheet only invokes whatever handler\n * the app installs (a no-op when none is present), while the app — the portal —\n * maps that event to real haptics through its native bridge. This keeps the\n * platform→app layering intact (no portal/native imports here) while making snap\n * haptics systemic instead of sprinkled across handlers.\n */\nexport type SheetSnapHapticHandler = (\n  snapPoint: MobileBottomSheetSnapPoint,\n) => void;\n\nconst SheetSnapHapticContext = createContext<SheetSnapHapticHandler | null>(\n  null,\n);\n\nexport const SheetSnapHapticProvider = SheetSnapHapticContext.Provider;\n\n/** The installed snap-haptic handler, or null when the app hasn't provided one. */\nexport function useSheetSnapHaptic(): SheetSnapHapticHandler | null {\n  return use(SheetSnapHapticContext);\n}\n","import { useState, useEffect } from \"react\";\n\nconst MOBILE_BREAKPOINT = 768;\nconst TABLET_BREAKPOINT = 1024;\n\nexport function useIsMobile(): boolean {\n  const [isMobile, setIsMobile] = useState<boolean>(false);\n\n  useEffect(() => {\n    const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`);\n    const onChange = () => {\n      setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);\n    };\n    mql.addEventListener(\"change\", onChange);\n    setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);\n    return () => mql.removeEventListener(\"change\", onChange);\n  }, []);\n\n  return isMobile;\n}\n\nexport function useIsTablet(): boolean {\n  const [isTablet, setIsTablet] = useState<boolean>(false);\n\n  useEffect(() => {\n    const mql = window.matchMedia(\n      `(min-width: ${MOBILE_BREAKPOINT}px) and (max-width: ${TABLET_BREAKPOINT - 1}px)`,\n    );\n    const onChange = () => {\n      setIsTablet(\n        window.innerWidth >= MOBILE_BREAKPOINT &&\n          window.innerWidth < TABLET_BREAKPOINT,\n      );\n    };\n    mql.addEventListener(\"change\", onChange);\n    setIsTablet(\n      window.innerWidth >= MOBILE_BREAKPOINT &&\n        window.innerWidth < TABLET_BREAKPOINT,\n    );\n    return () => mql.removeEventListener(\"change\", onChange);\n  }, []);\n\n  return isTablet;\n}\n\nexport function useIsMobileOrTablet(): boolean {\n  const [isMobileOrTablet, setIsMobileOrTablet] = useState<boolean>(false);\n\n  useEffect(() => {\n    const mql = window.matchMedia(`(max-width: ${TABLET_BREAKPOINT - 1}px)`);\n    const onChange = () => {\n      setIsMobileOrTablet(window.innerWidth < TABLET_BREAKPOINT);\n    };\n    mql.addEventListener(\"change\", onChange);\n    setIsMobileOrTablet(window.innerWidth < TABLET_BREAKPOINT);\n    return () => mql.removeEventListener(\"change\", onChange);\n  }, []);\n\n  return isMobileOrTablet;\n}\n","import type React from \"react\";\nimport {\n  useCallback,\n  useEffect,\n  useLayoutEffect,\n  useRef,\n  useState,\n} from \"react\";\nimport {\n  Sheet,\n  SheetContent,\n  SheetDescription,\n  SheetTitle,\n  cn,\n  PortalContainerProvider,\n} from \"@fluid-app/ui-primitives\";\nimport {\n  useSheetSnapHaptic,\n  type MobileBottomSheetSnapPoint,\n} from \"./sheet-haptics-context\";\n\nconst CLOSE_DISTANCE_RATIO = 0.25;\nconst SNAP_DISTANCE_RATIO = 0.35;\nconst CLOSE_VELOCITY_PX_PER_MS = 0.4;\nconst SNAP_VELOCITY_PX_PER_MS = 0.35;\nconst MIN_FLING_DISTANCE_PX = 20;\nconst VELOCITY_MAX_AGE_MS = 100;\nconst SNAP_PROJECTION_MS = 180;\nconst TOUCH_SWIPE_THRESHOLD_PX = 8;\nconst POINTER_SWIPE_THRESHOLD_PX = 2;\nconst MIN_SETTLE_DURATION_MS = 180;\nconst MAX_SETTLE_DURATION_MS = 420;\nconst DEFAULT_SETTLE_DURATION_MS = 360;\nconst NATIVE_EASING = \"cubic-bezier(0.32, 0.72, 0, 1)\";\nconst MIN_SCROLL_MOMENTUM_VELOCITY_PX_PER_MS = 0.08;\nconst SCROLL_MOMENTUM_DECAY_PER_FRAME = 0.95;\nconst COMPACT_HEIGHT_RATIO = 0.56;\nconst CONTENT_FIT_HEIGHT_RATIO = 0.72;\nconst MIN_COMPACT_HEIGHT_PX = 320;\nconst VIEWPORT_TOP_GAP_PX = 12;\nconst FLOATING_GUTTER_PX = 8;\nconst COMPACT_CORNER_RADIUS_PX = 28;\nconst EXPANDED_CORNER_RADIUS_PX = 18;\n\ntype MobileBottomSheetSurface = \"background\" | \"sidebar\";\ntype SheetSnapPoint = MobileBottomSheetSnapPoint;\n\ntype MobileBottomSheetProps = {\n  open: boolean;\n  onOpenChange: (open: boolean) => void;\n  title: React.ReactNode;\n  description?: React.ReactNode;\n  children: React.ReactNode;\n  role?: \"dialog\" | \"alertdialog\";\n  surface?: MobileBottomSheetSurface;\n  // Overflow of the sheet's content box. Defaults to \"hidden\", which keeps\n  // content inside the sheet's rounded shape as it drags/animates. That same\n  // clip crops a popover/calendar a child opens (the box's drag transform makes\n  // it the containing block for a fixed-positioned child). Set \"visible\" when a\n  // sheet hosts such a floating layer.\n  contentOverflow?: \"hidden\" | \"visible\";\n};\n\ntype SheetLayout = {\n  compactHeight: number;\n  expandedHeight: number;\n  expandable: boolean;\n  layoutViewportHeight: number;\n  viewportBottom: number;\n};\n\ntype PendingGeometry = {\n  height: number;\n  offset: number;\n  layout: SheetLayout;\n};\n\ntype DragState = {\n  pointerId: number;\n  pointerType: string;\n  startX: number;\n  startY: number;\n  lastY: number;\n  lastTime: number;\n  velocityY: number;\n  sheetHeight: number;\n  sheetOffset: number;\n  startSnapPoint: SheetSnapPoint;\n  started: boolean;\n  contentMoved: boolean;\n  sheetMoved: boolean;\n  scrollElements: HTMLElement[];\n};\n\ntype DragGeometry = {\n  height: number;\n  offset: number;\n};\n\nconst surfaceClasses: Record<MobileBottomSheetSurface, string> = {\n  background: \"bg-background\",\n  sidebar: \"bg-sidebar\",\n};\n\nexport type { MobileBottomSheetProps, MobileBottomSheetSurface };\n\nfunction clamp(value: number, minimum: number, maximum: number): number {\n  return Math.min(Math.max(value, minimum), maximum);\n}\n\nfunction getExpansionProgress(height: number, layout: SheetLayout): number {\n  const travel = layout.expandedHeight - layout.compactHeight;\n  if (travel <= 0) return height >= layout.expandedHeight ? 1 : 0;\n  return clamp((height - layout.compactHeight) / travel, 0, 1);\n}\n\nfunction applySheetGeometry(\n  content: HTMLDivElement,\n  height: number,\n  offset: number,\n  layout: SheetLayout,\n  overlay?: HTMLElement | null,\n): void {\n  const progress = getExpansionProgress(height, layout);\n  const gutter = FLOATING_GUTTER_PX * (1 - progress);\n  const radius =\n    COMPACT_CORNER_RADIUS_PX -\n    (COMPACT_CORNER_RADIUS_PX - EXPANDED_CORNER_RADIUS_PX) * progress;\n  const occludedBottomHeight = Math.max(\n    layout.layoutViewportHeight - layout.viewportBottom,\n    0,\n  );\n\n  content.style.bottom = \"auto\";\n  content.style.top = `${Math.max(layout.viewportBottom - height, 0)}px`;\n  // Keep a solid sheet surface behind the software keyboard. The inner\n  // surface remains constrained to the visible viewport, while this outer\n  // element extends to the layout viewport bottom so transient iOS viewport\n  // movement can never expose the dimmed overlay below the form.\n  content.style.height = `${height + occludedBottomHeight}px`;\n  content.style.setProperty(\n    \"--mobile-bottom-sheet-visible-height\",\n    `${height}px`,\n  );\n  content.style.left = `${gutter}px`;\n  content.style.right = `${gutter}px`;\n  content.style.borderTopLeftRadius = `${radius}px`;\n  content.style.borderTopRightRadius = `${radius}px`;\n  content.style.transform = `translate3d(0, ${offset}px, 0)`;\n\n  if (overlay) {\n    const draggedRatio = Math.min(offset / layout.compactHeight, 1);\n    overlay.style.opacity = String(1 - draggedRatio);\n  }\n}\n\nfunction findScrollElements(\n  target: EventTarget | null,\n  boundary: HTMLElement,\n  fallback: HTMLElement,\n): HTMLElement[] {\n  const scrollElements: HTMLElement[] = [];\n  let element = target instanceof HTMLElement ? target : null;\n\n  while (element && element !== boundary) {\n    if (element.scrollHeight > element.clientHeight) {\n      scrollElements.push(element);\n    }\n    element = element.parentElement;\n  }\n\n  if (!scrollElements.includes(fallback)) scrollElements.push(fallback);\n  return scrollElements;\n}\n\nfunction keepFocusedElementVisible(scrollArea: HTMLDivElement): void {\n  const activeElement = scrollArea.ownerDocument.activeElement;\n  if (!(activeElement instanceof HTMLElement)) return;\n  if (!scrollArea.contains(activeElement)) return;\n\n  const scrollAreaRect = scrollArea.getBoundingClientRect();\n  const activeElementRect = activeElement.getBoundingClientRect();\n  const focusMargin = 12;\n  const visibleTop = scrollAreaRect.top + focusMargin;\n  const visibleBottom = scrollAreaRect.bottom - focusMargin;\n\n  if (activeElementRect.bottom > visibleBottom) {\n    scrollArea.scrollTop += activeElementRect.bottom - visibleBottom;\n  } else if (activeElementRect.top < visibleTop) {\n    scrollArea.scrollTop -= visibleTop - activeElementRect.top;\n  }\n}\n\nfunction getSettleDuration(distance: number, velocity: number): number {\n  if (prefersReducedMotion()) return 0;\n  if (distance <= 1) return 0;\n\n  const speed = Math.max(Math.abs(velocity), 0.5);\n  return clamp(\n    distance / speed,\n    MIN_SETTLE_DURATION_MS,\n    MAX_SETTLE_DURATION_MS,\n  );\n}\n\nfunction prefersReducedMotion(): boolean {\n  return (\n    typeof window !== \"undefined\" &&\n    typeof window.matchMedia === \"function\" &&\n    window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches\n  );\n}\n\nfunction cancelActiveAnimations(element: HTMLElement | null): void {\n  if (!element || typeof element.getAnimations !== \"function\") return;\n  for (const animation of element.getAnimations()) animation.cancel();\n}\n\nexport function MobileBottomSheet({\n  open,\n  onOpenChange,\n  title,\n  description,\n  children,\n  role = \"dialog\",\n  surface = \"background\",\n  contentOverflow = \"hidden\",\n}: MobileBottomSheetProps): React.JSX.Element {\n  // App-installed snap-haptic handler (portal wires this to native haptics), so\n  // every sheet gets snap feedback without per-call-site wiring. No-op when the\n  // app hasn't provided one. The context value is stable, so the settle callback\n  // depends on it directly rather than mirroring it into a ref.\n  const sheetSnapHaptic = useSheetSnapHaptic();\n  const dragStateRef = useRef<DragState | null>(null);\n  const contentRef = useRef<HTMLDivElement | null>(null);\n  const visibleSurfaceRef = useRef<HTMLDivElement | null>(null);\n  const headerRef = useRef<HTMLDivElement | null>(null);\n  const scrollAreaRef = useRef<HTMLDivElement | null>(null);\n  const contentMeasureRef = useRef<HTMLDivElement | null>(null);\n  const layoutRef = useRef<SheetLayout | null>(null);\n  const activeSnapPointRef = useRef<SheetSnapPoint>(\"compact\");\n  const settleTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n  const geometryFrameRef = useRef<number | null>(null);\n  const scrollMomentumFrameRef = useRef<number | null>(null);\n  const pendingGeometryRef = useRef<PendingGeometry | null>(null);\n  const visualGeometryRef = useRef<DragGeometry | null>(null);\n  const suppressClickRef = useRef(false);\n  const [isDragging, setIsDragging] = useState(false);\n  const [activeSnapPoint, setActiveSnapPoint] =\n    useState<SheetSnapPoint>(\"compact\");\n  // Portal Radix overlays opened inside the sheet (Select, Combobox popover, …)\n  // into the sheet content itself. The sheet is a modal dialog, so its scroll\n  // lock blocks touch-scrolling on anything portalled outside it; rendering\n  // them within the content keeps their own lists scrollable.\n  const [portalContainer, setPortalContainer] = useState<HTMLDivElement | null>(\n    null,\n  );\n\n  const updateActiveSnapPoint = useCallback(\n    (snapPoint: SheetSnapPoint): void => {\n      activeSnapPointRef.current = snapPoint;\n      setActiveSnapPoint(snapPoint);\n    },\n    [],\n  );\n\n  const setContentRef = useCallback((node: HTMLDivElement | null): void => {\n    contentRef.current = node;\n    setPortalContainer(node);\n\n    if (!node) return;\n    const overlay = node.previousElementSibling;\n    if (!(overlay instanceof HTMLElement)) return;\n\n    const duration = prefersReducedMotion()\n      ? \"1ms\"\n      : `${DEFAULT_SETTLE_DURATION_MS}ms`;\n    overlay.style.animationDuration = duration;\n    overlay.style.animationTimingFunction = NATIVE_EASING;\n  }, []);\n\n  const clearSettleTimer = useCallback((): void => {\n    if (settleTimerRef.current) {\n      clearTimeout(settleTimerRef.current);\n      settleTimerRef.current = null;\n    }\n  }, []);\n\n  const cancelGeometryFrame = useCallback((): void => {\n    if (geometryFrameRef.current !== null) {\n      window.cancelAnimationFrame(geometryFrameRef.current);\n      geometryFrameRef.current = null;\n    }\n    pendingGeometryRef.current = null;\n  }, []);\n\n  const cancelScrollMomentum = useCallback((): void => {\n    if (scrollMomentumFrameRef.current === null) return;\n    window.cancelAnimationFrame(scrollMomentumFrameRef.current);\n    scrollMomentumFrameRef.current = null;\n  }, []);\n\n  const scheduleSheetGeometry = useCallback(\n    (height: number, offset: number, nextLayout: SheetLayout): void => {\n      visualGeometryRef.current = { height, offset };\n      pendingGeometryRef.current = { height, offset, layout: nextLayout };\n      if (geometryFrameRef.current !== null) return;\n\n      if (typeof window.requestAnimationFrame !== \"function\") {\n        const content = contentRef.current;\n        if (content) {\n          const overlay = content.previousElementSibling;\n          applySheetGeometry(\n            content,\n            height,\n            offset,\n            nextLayout,\n            overlay instanceof HTMLElement ? overlay : null,\n          );\n        }\n        pendingGeometryRef.current = null;\n        return;\n      }\n\n      geometryFrameRef.current = window.requestAnimationFrame(() => {\n        geometryFrameRef.current = null;\n        const pendingGeometry = pendingGeometryRef.current;\n        pendingGeometryRef.current = null;\n        const content = contentRef.current;\n        if (content && pendingGeometry) {\n          const overlay = content.previousElementSibling;\n          applySheetGeometry(\n            content,\n            pendingGeometry.height,\n            pendingGeometry.offset,\n            pendingGeometry.layout,\n            overlay instanceof HTMLElement ? overlay : null,\n          );\n        }\n      });\n    },\n    [],\n  );\n\n  const getOverlay = useCallback((): HTMLElement | null => {\n    const overlay = contentRef.current?.previousElementSibling;\n    return overlay instanceof HTMLElement ? overlay : null;\n  }, []);\n\n  const clearGestureStyles = useCallback((): void => {\n    const content = contentRef.current;\n    const overlay = getOverlay();\n\n    if (content) {\n      content.style.removeProperty(\"transform\");\n      content.style.removeProperty(\"transition\");\n      content.style.removeProperty(\"will-change\");\n    }\n    if (overlay) {\n      overlay.style.removeProperty(\"opacity\");\n      overlay.style.removeProperty(\"transition\");\n      overlay.style.removeProperty(\"will-change\");\n    }\n  }, [getOverlay]);\n\n  useLayoutEffect(() => {\n    const content = contentRef.current;\n    const visibleSurface = visibleSurfaceRef.current;\n    const header = headerRef.current;\n    const scrollArea = scrollAreaRef.current;\n    const contentMeasure = contentMeasureRef.current;\n    if (\n      !open ||\n      !content ||\n      !visibleSurface ||\n      !header ||\n      !scrollArea ||\n      !contentMeasure\n    ) {\n      return;\n    }\n\n    const measure = (): void => {\n      if (dragStateRef.current?.started) return;\n\n      const visualViewport = window.visualViewport;\n      const layoutViewportHeight =\n        content.ownerDocument.documentElement.clientHeight ||\n        window.innerHeight;\n      const viewportHeight = Math.min(\n        visualViewport?.height ?? layoutViewportHeight,\n        layoutViewportHeight,\n      );\n      const viewportBottom = Math.min(\n        (visualViewport?.offsetTop ?? 0) + viewportHeight,\n        layoutViewportHeight,\n      );\n      const computedStyle = window.getComputedStyle(content);\n      const computedMaxHeight = Number.parseFloat(computedStyle.maxHeight);\n      const viewportAvailableHeight = Math.max(\n        viewportHeight - VIEWPORT_TOP_GAP_PX,\n        1,\n      );\n      const expandedHeight =\n        Number.isFinite(computedMaxHeight) && computedMaxHeight > 0\n          ? Math.min(viewportAvailableHeight, computedMaxHeight)\n          : viewportAvailableHeight;\n      const visibleSurfaceStyle = window.getComputedStyle(visibleSurface);\n      const safeAreaPadding = Number.parseFloat(\n        visibleSurfaceStyle.paddingBottom,\n      );\n      const scrollAreaStyle = window.getComputedStyle(scrollArea);\n      const scrollAreaPaddingTop = Number.parseFloat(\n        scrollAreaStyle.paddingTop,\n      );\n      const scrollAreaPaddingBottom = Number.parseFloat(\n        scrollAreaStyle.paddingBottom,\n      );\n      const naturalHeight = Math.ceil(\n        header.scrollHeight +\n          contentMeasure.scrollHeight +\n          (Number.isFinite(scrollAreaPaddingTop) ? scrollAreaPaddingTop : 0) +\n          (Number.isFinite(scrollAreaPaddingBottom)\n            ? scrollAreaPaddingBottom\n            : 0) +\n          (Number.isFinite(safeAreaPadding) ? safeAreaPadding : 0),\n      );\n      const contentFitsAtNaturalHeight =\n        naturalHeight <= expandedHeight * CONTENT_FIT_HEIGHT_RATIO;\n      const compactHeight = contentFitsAtNaturalHeight\n        ? Math.min(naturalHeight, expandedHeight)\n        : Math.min(\n            expandedHeight,\n            Math.max(\n              expandedHeight * COMPACT_HEIGHT_RATIO,\n              MIN_COMPACT_HEIGHT_PX,\n            ),\n          );\n      const expandable = expandedHeight - compactHeight > 1;\n      const nextLayout = {\n        compactHeight,\n        expandedHeight,\n        expandable,\n        layoutViewportHeight,\n        viewportBottom,\n      } satisfies SheetLayout;\n\n      layoutRef.current = nextLayout;\n\n      if (!expandable && activeSnapPointRef.current === \"expanded\") {\n        updateActiveSnapPoint(\"compact\");\n      }\n      const snapPoint = expandable ? activeSnapPointRef.current : \"compact\";\n      const height = snapPoint === \"expanded\" ? expandedHeight : compactHeight;\n      visualGeometryRef.current = { height, offset: 0 };\n      applySheetGeometry(content, height, 0, nextLayout, getOverlay());\n      keepFocusedElementVisible(scrollArea);\n    };\n\n    measure();\n    let measureFrame: number | null = null;\n    const scheduleMeasure = (): void => {\n      if (measureFrame !== null) return;\n      if (typeof window.requestAnimationFrame !== \"function\") {\n        measure();\n        return;\n      }\n      measureFrame = window.requestAnimationFrame(() => {\n        measureFrame = null;\n        measure();\n      });\n    };\n    const scheduleViewportMeasure = (): void => {\n      clearSettleTimer();\n      clearGestureStyles();\n      scheduleMeasure();\n    };\n    const resizeObserver =\n      typeof ResizeObserver === \"undefined\"\n        ? null\n        : new ResizeObserver(scheduleMeasure);\n    resizeObserver?.observe(header);\n    resizeObserver?.observe(contentMeasure);\n    window.addEventListener(\"resize\", scheduleViewportMeasure);\n    window.visualViewport?.addEventListener(\"resize\", scheduleViewportMeasure);\n    window.visualViewport?.addEventListener(\"scroll\", scheduleViewportMeasure);\n\n    return () => {\n      if (measureFrame !== null) window.cancelAnimationFrame(measureFrame);\n      resizeObserver?.disconnect();\n      window.removeEventListener(\"resize\", scheduleViewportMeasure);\n      window.visualViewport?.removeEventListener(\n        \"resize\",\n        scheduleViewportMeasure,\n      );\n      window.visualViewport?.removeEventListener(\n        \"scroll\",\n        scheduleViewportMeasure,\n      );\n    };\n  }, [\n    clearGestureStyles,\n    clearSettleTimer,\n    open,\n    portalContainer,\n    getOverlay,\n    updateActiveSnapPoint,\n  ]);\n\n  useEffect(() => {\n    if (!open) {\n      dragStateRef.current = null;\n      layoutRef.current = null;\n      visualGeometryRef.current = null;\n      suppressClickRef.current = false;\n      setIsDragging(false);\n      updateActiveSnapPoint(\"compact\");\n      clearSettleTimer();\n      cancelGeometryFrame();\n      cancelScrollMomentum();\n      clearGestureStyles();\n    }\n  }, [\n    cancelGeometryFrame,\n    cancelScrollMomentum,\n    clearGestureStyles,\n    clearSettleTimer,\n    open,\n    updateActiveSnapPoint,\n  ]);\n\n  useEffect(\n    () => () => {\n      clearSettleTimer();\n      cancelGeometryFrame();\n      cancelScrollMomentum();\n    },\n    [cancelGeometryFrame, cancelScrollMomentum, clearSettleTimer],\n  );\n\n  const settleToSnapPoint = useCallback(\n    (snapPoint: SheetSnapPoint, releaseVelocity = 0, notify = true): void => {\n      const content = contentRef.current;\n      const overlay = getOverlay();\n      const currentLayout = layoutRef.current;\n      const currentGeometry = visualGeometryRef.current;\n      const targetHeight =\n        snapPoint === \"expanded\"\n          ? currentLayout?.expandedHeight\n          : currentLayout?.compactHeight;\n      const distance =\n        currentGeometry && targetHeight !== undefined\n          ? Math.abs(targetHeight - currentGeometry.height) +\n            currentGeometry.offset\n          : 0;\n      const duration = getSettleDuration(distance, releaseVelocity);\n      const transition =\n        duration === 0\n          ? \"none\"\n          : [\n              `transform ${duration}ms ${NATIVE_EASING}`,\n              `top ${duration}ms ${NATIVE_EASING}`,\n              `height ${duration}ms ${NATIVE_EASING}`,\n              `left ${duration}ms ${NATIVE_EASING}`,\n              `right ${duration}ms ${NATIVE_EASING}`,\n              `border-radius ${duration}ms ${NATIVE_EASING}`,\n            ].join(\", \");\n      const overlayTransition =\n        duration === 0 ? \"none\" : `opacity ${duration}ms ${NATIVE_EASING}`;\n\n      cancelGeometryFrame();\n      dragStateRef.current = null;\n      setIsDragging(false);\n      // Fire native snap feedback only for a gesture-driven change to a new snap\n      // point. `notify` is false for the system-driven restore after a controlled\n      // consumer rejects a close (see handlePointerUp), where the sheet snaps\n      // back on its own and the user never chose this position.\n      if (notify && snapPoint !== activeSnapPointRef.current) {\n        sheetSnapHaptic?.(snapPoint);\n      }\n      updateActiveSnapPoint(snapPoint);\n      if (content && currentLayout) {\n        content.style.transition = transition;\n        const height =\n          snapPoint === \"expanded\"\n            ? currentLayout.expandedHeight\n            : currentLayout.compactHeight;\n        visualGeometryRef.current = { height, offset: 0 };\n        applySheetGeometry(content, height, 0, currentLayout);\n      }\n      if (overlay) {\n        overlay.style.transition = overlayTransition;\n        overlay.style.opacity = \"1\";\n      }\n\n      clearSettleTimer();\n      settleTimerRef.current = setTimeout(clearGestureStyles, duration);\n    },\n    [\n      cancelGeometryFrame,\n      clearGestureStyles,\n      clearSettleTimer,\n      getOverlay,\n      sheetSnapHaptic,\n      updateActiveSnapPoint,\n    ],\n  );\n\n  const beginDrag = (\n    event: React.PointerEvent<HTMLDivElement>,\n    dragState: DragState,\n  ): void => {\n    const content = contentRef.current;\n    const overlay = getOverlay();\n    if (!content) return;\n\n    clearSettleTimer();\n    cancelScrollMomentum();\n    // Let a new gesture take ownership immediately, even if the opening or a\n    // previous snap animation is still running.\n    cancelActiveAnimations(content);\n    cancelActiveAnimations(overlay);\n    dragState.started = true;\n    suppressClickRef.current = true;\n    setIsDragging(true);\n    content.style.transition = \"none\";\n    content.style.willChange =\n      \"transform, top, height, left, right, border-radius\";\n    if (overlay) {\n      overlay.style.transition = \"none\";\n      overlay.style.willChange = \"opacity\";\n    }\n\n    if (typeof content.setPointerCapture === \"function\") {\n      content.setPointerCapture(event.pointerId);\n    }\n  };\n\n  const handlePointerDown = (\n    event: React.PointerEvent<HTMLDivElement>,\n  ): void => {\n    if (event.button !== 0) return;\n\n    const content = contentRef.current;\n    const scrollArea = scrollAreaRef.current;\n    const currentLayout = layoutRef.current;\n    if (!content || !scrollArea || !currentLayout) return;\n\n    const startedFromHandle =\n      event.target instanceof Element &&\n      event.target.closest(\"[data-mobile-bottom-sheet-drag-handle]\") !== null;\n    if (event.pointerType === \"mouse\" && !startedFromHandle) return;\n\n    cancelScrollMomentum();\n    suppressClickRef.current = false;\n    const now = performance.now();\n    const fallbackGeometry = visualGeometryRef.current ?? {\n      height:\n        activeSnapPointRef.current === \"expanded\"\n          ? currentLayout.expandedHeight\n          : currentLayout.compactHeight,\n      offset: 0,\n    };\n    const contentRect = content.getBoundingClientRect();\n    const occludedBottomHeight = Math.max(\n      currentLayout.layoutViewportHeight - currentLayout.viewportBottom,\n      0,\n    );\n    const renderedHeight = Math.max(\n      contentRect.height - occludedBottomHeight,\n      0,\n    );\n    const currentGeometry =\n      renderedHeight > 0\n        ? {\n            height: clamp(\n              renderedHeight,\n              currentLayout.compactHeight,\n              currentLayout.expandedHeight,\n            ),\n            offset: Math.max(\n              contentRect.top - (currentLayout.viewportBottom - renderedHeight),\n              0,\n            ),\n          }\n        : fallbackGeometry;\n    visualGeometryRef.current = currentGeometry;\n    const dragState: DragState = {\n      pointerId: event.pointerId,\n      pointerType: event.pointerType,\n      startX: event.clientX,\n      startY: event.clientY,\n      lastY: event.clientY,\n      lastTime: now,\n      velocityY: 0,\n      sheetHeight: currentGeometry.height,\n      sheetOffset: currentGeometry.offset,\n      startSnapPoint: activeSnapPointRef.current,\n      started: false,\n      contentMoved: false,\n      sheetMoved: false,\n      scrollElements: findScrollElements(\n        event.target,\n        event.currentTarget,\n        scrollArea,\n      ),\n    };\n    dragStateRef.current = dragState;\n\n    if (startedFromHandle) event.preventDefault();\n  };\n\n  const handlePointerMove = (\n    event: React.PointerEvent<HTMLDivElement>,\n  ): void => {\n    const dragState = dragStateRef.current;\n    const currentLayout = layoutRef.current;\n    if (\n      !dragState ||\n      !currentLayout ||\n      dragState.pointerId !== event.pointerId\n    ) {\n      return;\n    }\n\n    const deltaX = event.clientX - dragState.startX;\n    const deltaY = event.clientY - dragState.startY;\n\n    if (!dragState.started) {\n      const threshold =\n        dragState.pointerType === \"touch\"\n          ? TOUCH_SWIPE_THRESHOLD_PX\n          : POINTER_SWIPE_THRESHOLD_PX;\n      if (Math.max(Math.abs(deltaX), Math.abs(deltaY)) < threshold) return;\n\n      const isVerticalGesture = Math.abs(deltaY) > Math.abs(deltaX);\n      if (!isVerticalGesture) {\n        dragStateRef.current = null;\n        return;\n      }\n\n      beginDrag(event, dragState);\n    }\n\n    const content = contentRef.current;\n    if (!content) return;\n\n    const now = performance.now();\n    const sampleDuration = now - dragState.lastTime;\n    const movementY = event.clientY - dragState.lastY;\n    if (sampleDuration > 0) {\n      const sampleVelocity = movementY / sampleDuration;\n      dragState.velocityY = dragState.velocityY * 0.25 + sampleVelocity * 0.75;\n    }\n    dragState.lastY = event.clientY;\n    dragState.lastTime = now;\n\n    let remainingMovement = movementY;\n    const scrollElements = dragState.scrollElements;\n\n    if (remainingMovement > 0) {\n      for (const scrollElement of scrollElements) {\n        const scrollDistance = Math.min(\n          Math.max(scrollElement.scrollTop, 0),\n          remainingMovement,\n        );\n        if (scrollDistance > 0) {\n          scrollElement.scrollTop -= scrollDistance;\n          remainingMovement -= scrollDistance;\n          dragState.contentMoved = true;\n        }\n        if (remainingMovement <= 0) break;\n      }\n\n      const collapseDistance = Math.min(\n        Math.max(dragState.sheetHeight - currentLayout.compactHeight, 0),\n        remainingMovement,\n      );\n      if (collapseDistance > 0) {\n        dragState.sheetHeight -= collapseDistance;\n        remainingMovement -= collapseDistance;\n        dragState.sheetMoved = true;\n      }\n\n      if (remainingMovement > 0) {\n        dragState.sheetOffset += remainingMovement;\n        dragState.sheetMoved = true;\n      }\n    } else if (remainingMovement < 0) {\n      let upwardDistance = -remainingMovement;\n      const offsetRecovery = Math.min(dragState.sheetOffset, upwardDistance);\n      if (offsetRecovery > 0) {\n        dragState.sheetOffset -= offsetRecovery;\n        upwardDistance -= offsetRecovery;\n        dragState.sheetMoved = true;\n      }\n\n      const expansionDistance = Math.min(\n        Math.max(currentLayout.expandedHeight - dragState.sheetHeight, 0),\n        upwardDistance,\n      );\n      if (expansionDistance > 0) {\n        dragState.sheetHeight += expansionDistance;\n        upwardDistance -= expansionDistance;\n        dragState.sheetMoved = true;\n      }\n\n      if (upwardDistance > 0) {\n        for (const scrollElement of scrollElements) {\n          const maximumScrollTop = Math.max(\n            scrollElement.scrollHeight - scrollElement.clientHeight,\n            0,\n          );\n          const availableScrollDistance = Math.max(\n            maximumScrollTop - scrollElement.scrollTop,\n            0,\n          );\n          const scrollDistance = Math.min(\n            availableScrollDistance,\n            upwardDistance,\n          );\n          if (scrollDistance > 0) {\n            scrollElement.scrollTop += scrollDistance;\n            upwardDistance -= scrollDistance;\n            dragState.contentMoved = true;\n          }\n          if (upwardDistance <= 0) break;\n        }\n      }\n    }\n\n    scheduleSheetGeometry(\n      dragState.sheetHeight,\n      dragState.sheetOffset,\n      currentLayout,\n    );\n    event.preventDefault();\n  };\n\n  const startScrollMomentum = (\n    scrollElements: HTMLElement[],\n    fingerVelocity: number,\n  ): void => {\n    if (\n      typeof window.requestAnimationFrame !== \"function\" ||\n      Math.abs(fingerVelocity) < MIN_SCROLL_MOMENTUM_VELOCITY_PX_PER_MS\n    ) {\n      return;\n    }\n\n    cancelScrollMomentum();\n    let scrollVelocity = -fingerVelocity;\n    let previousTime = performance.now();\n\n    const step = (time: number): void => {\n      const elapsed = Math.min(Math.max(time - previousTime, 0), 32);\n      previousTime = time;\n      let remainingDistance = Math.abs(scrollVelocity * elapsed);\n      const movingDown = scrollVelocity > 0;\n      let moved = false;\n\n      for (const scrollElement of scrollElements) {\n        const maximumScrollTop = Math.max(\n          scrollElement.scrollHeight - scrollElement.clientHeight,\n          0,\n        );\n        const availableDistance = movingDown\n          ? Math.max(maximumScrollTop - scrollElement.scrollTop, 0)\n          : Math.max(scrollElement.scrollTop, 0);\n        const scrollDistance = Math.min(availableDistance, remainingDistance);\n        if (scrollDistance > 0) {\n          scrollElement.scrollTop += movingDown\n            ? scrollDistance\n            : -scrollDistance;\n          remainingDistance -= scrollDistance;\n          moved = true;\n        }\n        if (remainingDistance <= 0) break;\n      }\n\n      scrollVelocity *= Math.pow(\n        SCROLL_MOMENTUM_DECAY_PER_FRAME,\n        elapsed / (1000 / 60),\n      );\n\n      if (\n        !moved ||\n        Math.abs(scrollVelocity) < MIN_SCROLL_MOMENTUM_VELOCITY_PX_PER_MS\n      ) {\n        scrollMomentumFrameRef.current = null;\n        return;\n      }\n\n      scrollMomentumFrameRef.current = window.requestAnimationFrame(step);\n    };\n\n    scrollMomentumFrameRef.current = window.requestAnimationFrame(step);\n  };\n\n  const handlePointerUp = (event: React.PointerEvent<HTMLDivElement>): void => {\n    const dragState = dragStateRef.current;\n    const currentLayout = layoutRef.current;\n    if (\n      !dragState ||\n      !currentLayout ||\n      dragState.pointerId !== event.pointerId\n    ) {\n      return;\n    }\n\n    if (!dragState.started) {\n      dragStateRef.current = null;\n      return;\n    }\n\n    window.setTimeout(() => {\n      suppressClickRef.current = false;\n    }, 0);\n\n    const now = performance.now();\n    const velocity =\n      now - dragState.lastTime <= VELOCITY_MAX_AGE_MS ? dragState.velocityY : 0;\n    const content = contentRef.current;\n\n    if (\n      content &&\n      typeof content.hasPointerCapture === \"function\" &&\n      content.hasPointerCapture(event.pointerId)\n    ) {\n      content.releasePointerCapture(event.pointerId);\n    }\n\n    const shouldClose =\n      dragState.sheetOffset >=\n        currentLayout.compactHeight * CLOSE_DISTANCE_RATIO ||\n      (dragState.sheetOffset >= MIN_FLING_DISTANCE_PX &&\n        velocity >= CLOSE_VELOCITY_PX_PER_MS);\n\n    if (dragState.sheetOffset > 0 && shouldClose) {\n      cancelGeometryFrame();\n      dragStateRef.current = null;\n      setIsDragging(false);\n      onOpenChange(false);\n      // Controlled consumers can reject a close (for example during payment\n      // verification). If they do, restore the still-open sheet smoothly.\n      clearSettleTimer();\n      settleTimerRef.current = setTimeout(() => {\n        if (contentRef.current?.dataset.state === \"open\") {\n          settleToSnapPoint(\"compact\", 0, false);\n        }\n      }, 50);\n      return;\n    }\n\n    const travel = currentLayout.expandedHeight - currentLayout.compactHeight;\n    const projectedHeight = clamp(\n      dragState.sheetHeight -\n        (dragState.sheetMoved && Math.abs(velocity) >= SNAP_VELOCITY_PX_PER_MS\n          ? velocity * SNAP_PROJECTION_MS\n          : 0),\n      currentLayout.compactHeight,\n      currentLayout.expandedHeight,\n    );\n    const projectedProgress =\n      travel > 0 ? (projectedHeight - currentLayout.compactHeight) / travel : 0;\n    const snapPoint =\n      projectedProgress >= SNAP_DISTANCE_RATIO ? \"expanded\" : \"compact\";\n    settleToSnapPoint(snapPoint, velocity);\n\n    if (\n      snapPoint === \"expanded\" &&\n      dragState.contentMoved &&\n      Math.abs(velocity) >= MIN_SCROLL_MOMENTUM_VELOCITY_PX_PER_MS\n    ) {\n      startScrollMomentum(dragState.scrollElements, velocity);\n    }\n  };\n\n  const handlePointerCancel = (\n    event: React.PointerEvent<HTMLDivElement>,\n  ): void => {\n    const dragState = dragStateRef.current;\n    if (!dragState || dragState.pointerId !== event.pointerId) return;\n    suppressClickRef.current = false;\n    if (dragState.started) settleToSnapPoint(dragState.startSnapPoint);\n    else dragStateRef.current = null;\n  };\n\n  return (\n    <Sheet open={open} onOpenChange={onOpenChange}>\n      <SheetContent\n        ref={setContentRef}\n        side=\"bottom\"\n        role={role}\n        {...(description ? {} : { \"aria-describedby\": undefined })}\n        data-mobile-bottom-sheet=\"\"\n        data-mobile-bottom-sheet-snap-point={activeSnapPoint}\n        className={cn(\n          surfaceClasses[surface],\n          \"max-h-[calc(100dvh-env(safe-area-inset-top)-0.75rem)] touch-pan-x gap-0 overflow-hidden border-0 px-0 pt-0 pb-0 shadow-2xl duration-500 ease-[cubic-bezier(0.32,0.72,0,1)] outline-none [animation-duration:360ms] [animation-timing-function:cubic-bezier(0.32,0.72,0,1)] focus:outline-none focus-visible:ring-0 focus-visible:outline-none data-[state=closed]:[animation-duration:300ms] motion-reduce:transition-none motion-reduce:[animation-duration:1ms]\",\n          isDragging ? \"transition-none\" : \"transition-transform\",\n          contentOverflow === \"visible\" && \"overflow-visible\",\n        )}\n        onPointerDown={handlePointerDown}\n        onPointerMove={handlePointerMove}\n        onPointerUp={handlePointerUp}\n        onPointerCancel={handlePointerCancel}\n        onClickCapture={(event) => {\n          if (!suppressClickRef.current) return;\n          suppressClickRef.current = false;\n          event.preventDefault();\n          event.stopPropagation();\n        }}\n        onOpenAutoFocus={(event) => {\n          event.preventDefault();\n          contentRef.current?.focus({ preventScroll: true });\n        }}\n      >\n        <PortalContainerProvider container={portalContainer}>\n          <div\n            ref={visibleSurfaceRef}\n            className=\"flex h-[var(--mobile-bottom-sheet-visible-height)] min-h-0 flex-col overflow-hidden pb-[env(safe-area-inset-bottom)]\"\n          >\n            <div\n              ref={headerRef}\n              data-mobile-bottom-sheet-drag-handle\n              className=\"shrink-0 cursor-grab touch-none select-none active:cursor-grabbing\"\n            >\n              <div\n                aria-hidden=\"true\"\n                className=\"flex h-9 items-center justify-center\"\n              >\n                <div className=\"bg-muted-foreground/40 h-[5px] w-9 rounded-full\" />\n              </div>\n              <div className=\"pt-0.5 pr-[max(3rem,calc(env(safe-area-inset-right)+3rem))] pb-3 pl-[max(1rem,env(safe-area-inset-left))]\">\n                <SheetTitle className=\"text-foreground text-base leading-6 font-semibold\">\n                  {title}\n                </SheetTitle>\n                {description ? (\n                  <SheetDescription className=\"text-muted-foreground mt-1 text-sm\">\n                    {description}\n                  </SheetDescription>\n                ) : null}\n              </div>\n            </div>\n            <div\n              ref={scrollAreaRef}\n              data-mobile-bottom-sheet-scroll-area\n              className=\"min-h-0 flex-1 overflow-y-auto overscroll-y-contain pr-[max(0.5rem,env(safe-area-inset-right))] pb-4 pl-[max(0.5rem,env(safe-area-inset-left))]\"\n            >\n              <div\n                ref={contentMeasureRef}\n                data-mobile-bottom-sheet-content\n                className=\"min-w-0\"\n              >\n                {children}\n              </div>\n            </div>\n          </div>\n        </PortalContainerProvider>\n      </SheetContent>\n    </Sheet>\n  );\n}\n"],"mappings":"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"}