{"version":3,"sources":["../src/context.tsx","../src/constants.ts","../src/hooks/use-isomorphic-layout-effect.ts","../src/hooks/use-dimensions.ts","../src/utils.ts","../src/hooks/use-stable-callback.ts","../src/hooks/use-virtual-keyboard.ts","../src/hooks/use-keyboard-avoidance.ts","../src/hooks/use-safe-area-insets.ts","../src/hooks/use-modal-effect.ts","../src/hooks/use-prevent-scroll.ts","../src/hooks/use-sheet-state.ts","../src/snap.ts","../src/styles.ts","../src/sheet.tsx","../src/sheet-backdrop.tsx","../src/sheet-container.tsx","../src/hooks/use-drag-constraints.ts","../src/hooks/use-scroll-position.ts","../src/sheet-content.tsx","../src/sheet-drag-indicator.tsx","../src/sheet-header.tsx","../src/index.tsx"],"names":["styles","useState","useRef","useEffect","nextSnap","forwardRef","motion","React","useCallback","useMemo","element","isScrollable","useTransform","Sheet"],"mappings":"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","file":"index.mjs","sourcesContent":["import { createContext, useContext } from 'react';\nimport type { ExposedContextType, InternalContextType } from './types';\n\nexport const InternalSheetContext = createContext<\n  InternalContextType | undefined\n>(undefined);\n\nexport const ExposedSheetContext = createContext<\n  ExposedContextType | undefined\n>(undefined);\n\nexport function useInternalContext() {\n  const context = useContext(InternalSheetContext);\n  if (!context) throw new Error('Sheet context error');\n  return context;\n}\n\nexport function useExposedContext() {\n  const context = useContext(ExposedSheetContext);\n  if (!context) throw new Error('Sheet context error');\n  return context;\n}\n","import type { SheetTweenConfig } from './types';\n\nexport const DEFAULT_HEIGHT = 'calc(100% - env(safe-area-inset-top) - 34px)';\n\nexport const IS_SSR = typeof window === 'undefined';\n\nexport const DEFAULT_TWEEN_CONFIG: SheetTweenConfig = {\n  ease: 'easeOut',\n  duration: 0.2,\n};\n\nexport const REDUCED_MOTION_TWEEN_CONFIG: SheetTweenConfig = {\n  ease: 'linear',\n  duration: 0.01,\n};\n\nexport const DEFAULT_DRAG_CLOSE_THRESHOLD = 0.6;\n\nexport const DEFAULT_DRAG_VELOCITY_THRESHOLD = 1200;\n","import { useEffect, useLayoutEffect } from 'react';\n\nimport { IS_SSR } from '../constants';\n\nexport const useIsomorphicLayoutEffect = IS_SSR ? useEffect : useLayoutEffect;\n","import { useState } from 'react';\n\nimport { IS_SSR } from '../constants';\nimport { useIsomorphicLayoutEffect } from './use-isomorphic-layout-effect';\n\nexport function useDimensions() {\n  const [dimensions, setDimensions] = useState(() => ({\n    windowHeight: !IS_SSR ? window.innerHeight : 0,\n    windowWidth: !IS_SSR ? window.innerWidth : 0,\n  }));\n\n  useIsomorphicLayoutEffect(() => {\n    function handler() {\n      setDimensions({\n        windowHeight: window.innerHeight,\n        windowWidth: window.innerWidth,\n      });\n    }\n\n    handler();\n\n    window.addEventListener('resize', handler);\n\n    return () => {\n      window.removeEventListener('resize', handler);\n    };\n  }, []);\n\n  return dimensions;\n}\n","import { type CSSProperties, type ForwardedRef, type RefCallback } from 'react';\nimport { IS_SSR } from './constants';\n\nexport function applyStyles(\n  styles: { base: CSSProperties; decorative: CSSProperties },\n  unstyled: boolean\n) {\n  return unstyled ? styles.base : { ...styles.base, ...styles.decorative };\n}\n\nexport function isAscendingOrder(arr: number[]) {\n  for (let i = 0; i < arr.length; i++) {\n    if (arr[i + 1] < arr[i]) return false;\n  }\n  return true;\n}\n\nexport function mergeRefs<T = any>(refs: ForwardedRef<T>[]): RefCallback<T> {\n  return (value: any) => {\n    refs.forEach((ref: any) => {\n      if (typeof ref === 'function') {\n        ref(value);\n      } else if (ref) {\n        ref.current = value;\n      }\n    });\n  };\n}\n\nexport function isTouchDevice() {\n  if (IS_SSR) return false;\n  return 'ontouchstart' in window || navigator.maxTouchPoints > 0;\n}\n\nfunction testPlatform(re: RegExp) {\n  return typeof window !== 'undefined' && window.navigator != null\n    ? re.test(\n        // @ts-expect-error\n        window.navigator.userAgentData?.platform || window.navigator.platform\n      )\n    : false;\n}\n\nfunction cached(fn: () => boolean) {\n  let res: boolean | null = null;\n  return () => {\n    if (res == null) {\n      res = fn();\n    }\n    return res;\n  };\n}\n\nconst isMac = cached(function () {\n  return testPlatform(/^Mac/i);\n});\n\nconst isIPhone = cached(function () {\n  return testPlatform(/^iPhone/i);\n});\n\nconst isIPad = cached(function () {\n  // iPadOS 13 lies and says it's a Mac, but we can distinguish by detecting touch support.\n  return testPlatform(/^iPad/i) || (isMac() && navigator.maxTouchPoints > 1);\n});\n\nexport const isIOS = cached(function () {\n  return isIPhone() || isIPad();\n});\n\n/** Wait for an element to be rendered and visible */\nexport function waitForElement(\n  className: string,\n  interval = 50,\n  maxAttempts = 20\n) {\n  return new Promise<HTMLElement | null>((resolve) => {\n    let attempts = 0;\n    const timer = setInterval(() => {\n      const element = document.getElementsByClassName(\n        className\n      )[0] as HTMLElement;\n      attempts++;\n      if (element || attempts >= maxAttempts) {\n        clearInterval(timer);\n        resolve(element);\n      }\n    }, interval);\n  });\n}\n\n// HTML input types that do not cause the software keyboard to appear.\nconst nonTextInputTypes = new Set([\n  'checkbox',\n  'radio',\n  'range',\n  'color',\n  'file',\n  'image',\n  'button',\n  'submit',\n  'reset',\n]);\n\nexport function willOpenKeyboard(target: Element) {\n  return (\n    (target instanceof HTMLInputElement &&\n      !nonTextInputTypes.has(target.type)) ||\n    target instanceof HTMLTextAreaElement ||\n    (target instanceof HTMLElement && target.isContentEditable)\n  );\n}\n\nexport function isHTTPS() {\n  return typeof window !== 'undefined' && window.isSecureContext;\n}\n\nexport function clamp(value: number, min: number, max: number) {\n  return Math.min(Math.max(value, min), max);\n}\n","import { useCallback, useRef } from 'react';\n\nimport { useIsomorphicLayoutEffect } from './use-isomorphic-layout-effect';\n\nexport function useStableCallback<T extends (...args: any[]) => any>(\n  handler: T\n) {\n  const handlerRef = useRef<T>(undefined);\n\n  useIsomorphicLayoutEffect(() => {\n    handlerRef.current = handler;\n  });\n\n  return useCallback((...args: any[]) => {\n    const fn = handlerRef.current;\n    return fn?.(...args);\n  }, []) as T;\n}\n","import { type RefObject, useEffect, useRef, useState } from 'react';\nimport { isHTTPS, willOpenKeyboard } from '../utils';\n\ntype VirtualKeyboardApi = {\n  overlaysContent: boolean;\n  boundingRect: {\n    x: number;\n    y: number;\n    height: number;\n    width: number;\n  };\n  addEventListener: (\n    type: 'geometrychange',\n    listener: EventListenerOrEventListenerObject\n  ) => void;\n  removeEventListener: (\n    type: 'geometrychange',\n    listener: EventListenerOrEventListenerObject\n  ) => void;\n};\n\ntype VirtualKeyboardState = {\n  isVisible: boolean;\n  height: number;\n};\n\n/**\n * Keep track of how many components are using the virtual keyboard API\n * to avoid conflicts when toggling `overlaysContent` which is a global setting.\n */\nlet virtualKeyboardOverlayUsers = 0;\nlet initialVirtualKeyboardOverlaysContent: boolean | null = null;\n\ntype UseVirtualKeyboardOptions = {\n  /**\n   * Ref to the container element to apply `keyboard-inset-height` CSS variable updates.\n   * @default document.documentElement\n   */\n  containerRef?: RefObject<HTMLElement | null>;\n  /**\n   * Enable or disable the hook entirely.\n   * @default true\n   */\n  isEnabled?: boolean;\n  /**\n   * Minimum pixel height difference to consider the keyboard visible.\n   * @default 100\n   */\n  visualViewportThreshold?: number;\n  /**\n   * Delay in ms for debouncing viewport changes.\n   * @default 100\n   */\n  debounceDelay?: number;\n};\n\n/**\n * A hook that detects virtual keyboard visibility and height.\n * It listens to focus events and visual viewport changes to determine\n * if a text input is focused and the keyboard is likely visible.\n *\n * It also sets the `--keyboard-inset-height` CSS variable on the specified container\n * (or `:root` by default) to allow for easy styling adjustments when the keyboard is open.\n *\n * @param options Configuration options for the hook.\n * @returns An object containing `isKeyboardOpen` and `keyboardHeight`.\n *\n * @example\n * ```tsx\n * import { useVirtualKeyboard } from 'react-modal-sheet';\n *\n * function MyComponent() {\n *   const { isKeyboardOpen, keyboardHeight } = useVirtualKeyboard();\n *\n *   return (\n *     <div>\n *       <p>Keyboard is {isKeyboardOpen ? 'open' : 'closed'}</p>\n *       <p>Keyboard height: {keyboardHeight}px</p>\n *    </div>\n *  );\n * }\n * ```\n */\nexport function useVirtualKeyboard(options: UseVirtualKeyboardOptions = {}) {\n  const {\n    containerRef,\n    isEnabled = true,\n    debounceDelay = 100,\n    visualViewportThreshold = 100,\n  } = options;\n\n  const [state, setState] = useState<VirtualKeyboardState>({\n    isVisible: false,\n    height: 0,\n  });\n\n  const focusedElementRef = useRef<HTMLElement | null>(null);\n  const debounceTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n  useEffect(() => {\n    const vv = window.visualViewport;\n    const vk = getVirtualKeyboardApi();\n\n    function setKeyboardInsetHeightEnv(height: number) {\n      const element = containerRef?.current || document.documentElement;\n\n      if (vk) {\n        element.style.setProperty(\n          '--keyboard-inset-height',\n          `env(keyboard-inset-height, ${height}px)`\n        );\n      } else {\n        element.style.setProperty('--keyboard-inset-height', `${height}px`);\n      }\n    }\n\n    function setKeyboardState(nextState: VirtualKeyboardState) {\n      setState((prevState) =>\n        prevState.isVisible === nextState.isVisible &&\n        prevState.height === nextState.height\n          ? prevState\n          : nextState\n      );\n    }\n\n    function resetKeyboardState() {\n      focusedElementRef.current = null;\n      setKeyboardInsetHeightEnv(0);\n      setKeyboardState({ isVisible: false, height: 0 });\n    }\n\n    if (!isEnabled) {\n      resetKeyboardState();\n      return;\n    }\n\n    function updateKeyboardState() {\n      if (debounceTimer.current) {\n        clearTimeout(debounceTimer.current);\n      }\n\n      debounceTimer.current = setTimeout(() => {\n        const active = getActiveElement() ?? focusedElementRef.current;\n        const inputIsFocused = active ? willOpenKeyboard(active) : false;\n\n        if (!inputIsFocused) {\n          resetKeyboardState();\n          return;\n        }\n\n        focusedElementRef.current = active as HTMLElement;\n\n        if (vk?.overlaysContent) {\n          const keyboardHeight = vk.boundingRect.height;\n          setKeyboardInsetHeightEnv(keyboardHeight);\n          setKeyboardState({ isVisible: true, height: keyboardHeight });\n          return;\n        }\n\n        if (vv) {\n          const heightDiff = window.innerHeight - vv.height;\n\n          if (heightDiff > visualViewportThreshold) {\n            setKeyboardInsetHeightEnv(heightDiff);\n            setKeyboardState({ isVisible: true, height: heightDiff });\n            return;\n          }\n        }\n\n        resetKeyboardState();\n      }, debounceDelay);\n    }\n\n    function handleFocusIn(e: FocusEvent) {\n      if (e.target instanceof HTMLElement && willOpenKeyboard(e.target)) {\n        focusedElementRef.current = e.target;\n        updateKeyboardState();\n      }\n    }\n\n    function handleFocusOut() {\n      requestAnimationFrame(() => {\n        focusedElementRef.current = getActiveElement();\n        updateKeyboardState();\n      });\n    }\n\n    document.addEventListener('focusin', handleFocusIn);\n    document.addEventListener('focusout', handleFocusOut);\n\n    if (vv) {\n      vv.addEventListener('resize', updateKeyboardState);\n      vv.addEventListener('scroll', updateKeyboardState);\n    }\n\n    if (vk) {\n      if (virtualKeyboardOverlayUsers === 0) {\n        initialVirtualKeyboardOverlaysContent = vk.overlaysContent;\n        vk.overlaysContent = true;\n      }\n\n      virtualKeyboardOverlayUsers++;\n      vk.addEventListener('geometrychange', updateKeyboardState);\n    }\n\n    focusedElementRef.current = getActiveElement();\n    updateKeyboardState();\n\n    return () => {\n      document.removeEventListener('focusin', handleFocusIn);\n      document.removeEventListener('focusout', handleFocusOut);\n\n      if (vv) {\n        vv.removeEventListener('resize', updateKeyboardState);\n        vv.removeEventListener('scroll', updateKeyboardState);\n      }\n\n      if (vk) {\n        vk.removeEventListener('geometrychange', updateKeyboardState);\n\n        virtualKeyboardOverlayUsers = Math.max(\n          0,\n          virtualKeyboardOverlayUsers - 1\n        );\n\n        if (virtualKeyboardOverlayUsers === 0) {\n          vk.overlaysContent = initialVirtualKeyboardOverlaysContent ?? false;\n          initialVirtualKeyboardOverlaysContent = null;\n        }\n      }\n\n      if (debounceTimer.current) {\n        clearTimeout(debounceTimer.current);\n      }\n\n      resetKeyboardState();\n    };\n  }, [debounceDelay, isEnabled, visualViewportThreshold]);\n\n  return {\n    keyboardHeight: state.height,\n    isKeyboardOpen: state.isVisible,\n  };\n}\n\n/**\n * Virtual Keyboard API is only available in secure contexts (HTTPS)\n * and may not be supported in all browsers.\n */\nfunction getVirtualKeyboardApi() {\n  return isHTTPS() && 'virtualKeyboard' in navigator\n    ? (navigator.virtualKeyboard as VirtualKeyboardApi)\n    : null;\n}\n\nfunction getActiveElement() {\n  let activeElement: Element | null = document.activeElement;\n\n  while (\n    activeElement instanceof HTMLElement &&\n    activeElement.shadowRoot?.activeElement\n  ) {\n    activeElement = activeElement.shadowRoot.activeElement;\n  }\n\n  return activeElement && willOpenKeyboard(activeElement)\n    ? (activeElement as HTMLElement)\n    : null;\n}\n","import { type RefObject, useEffect, useState } from 'react';\n\nimport { willOpenKeyboard } from '../utils';\nimport { useStableCallback } from './use-stable-callback';\nimport { useVirtualKeyboard } from './use-virtual-keyboard';\n\nexport function useKeyboardAvoidance({\n  isEnabled,\n  containerRef,\n  onWillOpenKeyboard,\n  onDidOpenKeyboard,\n}: {\n  isEnabled: boolean;\n  containerRef: RefObject<HTMLDivElement | null>;\n  onWillOpenKeyboard?: (event: FocusEvent) => Promise<void>;\n  onDidOpenKeyboard?: (focusedElement: HTMLElement) => void;\n}) {\n  const [focusedElement, setFocusedElement] = useState<HTMLElement | null>(\n    null\n  );\n\n  const keyboard = useVirtualKeyboard({\n    isEnabled,\n    containerRef,\n  });\n\n  const handleFocusIn = useStableCallback(async (event: FocusEvent) => {\n    const element = event.target as HTMLElement;\n\n    if (willOpenKeyboard(element) && containerRef.current?.contains(element)) {\n      await onWillOpenKeyboard?.(event);\n      setFocusedElement(element);\n    }\n  });\n\n  const handleFocusOut = useStableCallback((event: FocusEvent) => {\n    const element = event.target as HTMLElement;\n\n    if (focusedElement === element) {\n      setFocusedElement(null);\n    }\n  });\n\n  // Keep track of the currently focused input within the container\n  useEffect(() => {\n    if (!isEnabled) return;\n\n    document.addEventListener('focusin', handleFocusIn);\n    document.addEventListener('focusout', handleFocusOut);\n\n    return () => {\n      document.removeEventListener('focusin', handleFocusIn);\n      document.removeEventListener('focusout', handleFocusOut);\n    };\n  }, [isEnabled]);\n\n  useEffect(() => {\n    const containerElement = containerRef.current;\n\n    if (\n      !isEnabled ||\n      !focusedElement ||\n      !containerElement ||\n      !keyboard.isKeyboardOpen\n    ) {\n      return;\n    }\n\n    requestAnimationFrame(() => {\n      onDidOpenKeyboard?.(focusedElement);\n    });\n  }, [isEnabled, keyboard.isKeyboardOpen, focusedElement]);\n\n  return keyboard;\n}\n","import { useState } from 'react';\n\nimport { IS_SSR } from '../constants';\n\nexport function useSafeAreaInsets() {\n  const [insets] = useState(() => {\n    const fallback = { top: 0, left: 0, right: 0, bottom: 0 };\n\n    if (IS_SSR) return fallback;\n\n    const root = document.querySelector<HTMLElement>(':root');\n\n    if (!root) return fallback;\n\n    root.style.setProperty('--rms-sat', 'env(safe-area-inset-top)');\n    root.style.setProperty('--rms-sal', 'env(safe-area-inset-left)');\n    root.style.setProperty('--rms-sar', 'env(safe-area-inset-right)');\n    root.style.setProperty('--rms-sab', 'env(safe-area-inset-bottom)');\n\n    const computedStyle = getComputedStyle(root);\n    const sat = getComputedValue(computedStyle, '--rms-sat');\n    const sal = getComputedValue(computedStyle, '--rms-sal');\n    const sar = getComputedValue(computedStyle, '--rms-sar');\n    const sab = getComputedValue(computedStyle, '--rms-sab');\n\n    root.style.removeProperty('--rms-sat');\n    root.style.removeProperty('--rms-sal');\n    root.style.removeProperty('--rms-sar');\n    root.style.removeProperty('--rms-sab');\n\n    return { top: sat, left: sal, right: sar, bottom: sab };\n  });\n\n  return insets;\n}\n\nfunction getComputedValue(computed: CSSStyleDeclaration, property: string) {\n  const strValue = computed.getPropertyValue(property).replace('px', '').trim();\n  return parseInt(strValue, 10) || 0;\n}\n","import { type MotionValue, transform } from 'motion';\nimport { useEffect } from 'react';\n\nimport type { SheetDetent, SheetSnapPoint } from '../types';\nimport { useSafeAreaInsets } from './use-safe-area-insets';\nimport { useStableCallback } from './use-stable-callback';\n\nexport function useModalEffect({\n  y,\n  detent,\n  rootId: _rootId,\n  sheetHeight,\n  snapPoints,\n  startThreshold,\n}: {\n  y: MotionValue<number>;\n  detent: SheetDetent;\n  rootId?: string;\n  sheetHeight: number;\n  snapPoints: SheetSnapPoint[];\n  startThreshold?: number;\n}) {\n  const insetTop = useSafeAreaInsets().top;\n\n  let rootId: string | undefined = _rootId;\n\n  if (rootId && detent === 'full') {\n    console.warn('Using \"full\" detent with modal effect is not supported.');\n    rootId = undefined;\n  }\n\n  const handleYChange = useStableCallback((yValue: number) => {\n    if (!rootId) return;\n\n    let progress = Math.max(0, 1 - yValue / sheetHeight);\n\n    /**\n     * Start the effect only if we have dragged over the second snap point\n     * to make the effect more natural as the sheet will reach it's final\n     * position when the user drags it over the second snap point.\n     */\n    const snapThresholdPoint =\n      snapPoints.length > 1 ? snapPoints[snapPoints.length - 2] : undefined;\n\n    /**\n     * If we have snap points, we need to calculate the progress percentage\n     * based on the snap point threshold. Note that the maximum value is also\n     * different in this case as the range between the start of the effect\n     * and its end is different.\n     */\n    if (snapThresholdPoint !== undefined) {\n      const snapThresholdValue = snapThresholdPoint.snapValueY;\n\n      if (yValue <= snapThresholdValue) {\n        progress = (snapThresholdValue - yValue) / snapThresholdValue;\n      } else {\n        progress = 0;\n      }\n    }\n\n    /**\n     * If we have a start threshold, we need to calculate the progress\n     * percentage based on the start threshold (0 to 1). For example,\n     * if the start threshold is 0.5, the progress will be 0 until the sheet\n     * is dragged over 50% of the complete drag distance.\n     */\n    if (startThreshold !== undefined) {\n      const startThresholdValue =\n        sheetHeight -\n        Math.min(Math.floor(startThreshold * sheetHeight), sheetHeight);\n\n      if (yValue <= startThresholdValue) {\n        progress = (startThresholdValue - yValue) / startThresholdValue;\n      } else {\n        progress = 0;\n      }\n    }\n\n    // Make sure progress is between 0 and 1\n    progress = Math.max(0, Math.min(1, progress));\n\n    const pageWidth = window.innerWidth;\n\n    updateModalEffect(rootId, {\n      scale: transform(progress, [0, 1], [1, (pageWidth - 16) / pageWidth]),\n      translateY: transform(progress, [0, 1], [0, 24 + insetTop]),\n      borderRadius: transform(progress, [0, 1], [0, 10]),\n    });\n  });\n\n  const handleYComplete = useStableCallback(() => {\n    if (!rootId) return;\n\n    // +5 just to take into account some inprecision to ensure the cleanup is done\n    if (y.get() + 5 >= sheetHeight) {\n      cleanupModalEffect(rootId);\n    }\n  });\n\n  useEffect(() => {\n    if (!rootId) return;\n\n    const removeStartListener = y.on('animationStart', () => {\n      if (rootId) setupModalEffect(rootId);\n    });\n\n    const removeChangeListener = y.on('change', (yValue) => {\n      handleYChange(yValue);\n    });\n\n    const removeCompleteListener = y.on('animationComplete', handleYComplete);\n    const removeCancelListener = y.on('animationCancel', handleYComplete);\n\n    return () => {\n      if (rootId) cleanupModalEffect(rootId);\n      removeStartListener();\n      removeChangeListener();\n      removeCompleteListener();\n      removeCancelListener();\n    };\n  }, [rootId]);\n}\n\nfunction setupModalEffect(rootId: string) {\n  const root = document.querySelector(`#${rootId}`) as HTMLDivElement;\n  if (!root) return;\n\n  const body = document.querySelector('body') as HTMLBodyElement;\n\n  body.style.backgroundColor = '#000000';\n  root.style.overflow = 'hidden';\n  root.style.transitionTimingFunction = 'cubic-bezier(0.32, 0.72, 0, 1)';\n  root.style.transitionProperty = 'transform, border-radius';\n  root.style.transitionDuration = '0.5s';\n  root.style.transformOrigin = 'center top';\n}\n\nfunction updateModalEffect(\n  rootId: string,\n  opts: { scale: number; translateY: number; borderRadius: number }\n) {\n  const root = document.querySelector(`#${rootId}`) as HTMLDivElement;\n  if (!root) return;\n\n  const { scale, translateY, borderRadius } = opts;\n  root.style.transform = `scale(${scale}) translate3d(0, ${translateY}px, 0)`;\n  root.style.borderTopRightRadius = `${borderRadius}px`;\n  root.style.borderTopLeftRadius = `${borderRadius}px`;\n}\n\nfunction cleanupModalEffect(rootId: string) {\n  const root = document.querySelector(`#${rootId}`) as HTMLDivElement;\n  if (!root) return;\n\n  const body = document.querySelector('body') as HTMLBodyElement;\n\n  body.style.removeProperty('background-color');\n  root.style.removeProperty('overflow');\n  root.style.removeProperty('transition-timing-function');\n  root.style.removeProperty('transition-property');\n  root.style.removeProperty('transition-duration');\n  root.style.removeProperty('transform-origin');\n  root.style.removeProperty('transform');\n  root.style.removeProperty('border-top-right-radius');\n  root.style.removeProperty('border-top-left-radius');\n}\n","// This code originates from https://github.com/adobe/react-spectrum/blob/main/packages/%40react-aria/overlays/src/usePreventScroll.ts\n\nimport { isIOS, willOpenKeyboard } from '../utils';\nimport { useIsomorphicLayoutEffect } from './use-isomorphic-layout-effect';\n\nconst KEYBOARD_BUFFER = 24;\n\ninterface PreventScrollOptions {\n  /** Whether the scroll lock is disabled. */\n  isDisabled?: boolean;\n}\n\nfunction chain(...callbacks: any[]): (...args: any[]) => void {\n  return (...args: any[]) => {\n    for (const callback of callbacks) {\n      if (typeof callback === 'function') {\n        callback(...args);\n      }\n    }\n  };\n}\n\nconst visualViewport = typeof document !== 'undefined' && window.visualViewport;\n\nexport function isScrollable(\n  node: Element | null,\n  checkForOverflow?: boolean\n): boolean {\n  if (!node) {\n    return false;\n  }\n\n  const style = window.getComputedStyle(node);\n\n  let scrollable = /(auto|scroll)/.test(\n    style.overflow + style.overflowX + style.overflowY\n  );\n\n  if (scrollable && checkForOverflow) {\n    scrollable =\n      node.scrollHeight !== node.clientHeight ||\n      node.scrollWidth !== node.clientWidth;\n  }\n\n  return scrollable;\n}\n\nexport function getScrollParent(\n  node: Element,\n  checkForOverflow?: boolean\n): Element {\n  let scrollableNode: Element | null = node;\n\n  if (isScrollable(scrollableNode, checkForOverflow)) {\n    scrollableNode = scrollableNode.parentElement;\n  }\n\n  while (scrollableNode && !isScrollable(scrollableNode, checkForOverflow)) {\n    scrollableNode = scrollableNode.parentElement;\n  }\n\n  return (\n    scrollableNode || document.scrollingElement || document.documentElement\n  );\n}\n\n// The number of active usePreventScroll calls. Used to determine whether to revert back to the original page style/scroll position\nlet preventScrollCount = 0;\nlet restore: () => void;\n\n/**\n * Prevents scrolling on the document body on mount, and\n * restores it on unmount. Also ensures that content does not\n * shift due to the scrollbars disappearing.\n */\nexport function usePreventScroll(options: PreventScrollOptions = {}) {\n  const { isDisabled } = options;\n\n  useIsomorphicLayoutEffect(() => {\n    if (isDisabled) {\n      return;\n    }\n\n    preventScrollCount++;\n    if (preventScrollCount === 1) {\n      if (isIOS()) {\n        restore = preventScrollMobileSafari();\n      } else {\n        restore = preventScrollStandard();\n      }\n    }\n\n    return () => {\n      preventScrollCount--;\n      if (preventScrollCount === 0) {\n        restore?.();\n      }\n    };\n  }, [isDisabled]);\n}\n\n// For most browsers, all we need to do is set `overflow: hidden` on the root element, and\n// add some padding to prevent the page from shifting when the scrollbar is hidden.\nfunction preventScrollStandard() {\n  return chain(\n    setStyle(\n      document.documentElement,\n      'paddingRight',\n      `${window.innerWidth - document.documentElement.clientWidth}px`\n    ),\n    setStyle(document.documentElement, 'overflow', 'hidden')\n  );\n}\n\n// Mobile Safari is a whole different beast. Even with overflow: hidden,\n// it still scrolls the page in many situations:\n//\n// 1. When the bottom toolbar and address bar are collapsed, page scrolling is always allowed.\n// 2. When the keyboard is visible, the viewport does not resize. Instead, the keyboard covers part of\n//    it, so it becomes scrollable.\n// 3. When tapping on an input, the page always scrolls so that the input is centered in the visual viewport.\n//    This may cause even fixed position elements to scroll off the screen.\n// 4. When using the next/previous buttons in the keyboard to navigate between inputs, the whole page always\n//    scrolls, even if the input is inside a nested scrollable element that could be scrolled instead.\n//\n// In order to work around these cases, and prevent scrolling without jankiness, we do a few things:\n//\n// 1. Prevent default on `touchmove` events that are not in a scrollable element. This prevents touch scrolling\n//    on the window.\n// 2. Prevent default on `touchmove` events inside a scrollable element when the scroll position is at the\n//    top or bottom. This avoids the whole page scrolling instead, but does prevent overscrolling.\n// 3. Prevent default on `touchend` events on input elements and handle focusing the element ourselves.\n// 4. When focusing an input, apply a transform to trick Safari into thinking the input is at the top\n//    of the page, which prevents it from scrolling the page. After the input is focused, scroll the element\n//    into view ourselves, without scrolling the whole page.\n// 5. Offset the body by the scroll position using a negative margin and scroll to the top. This should appear the\n//    same visually, but makes the actual scroll position always zero. This is required to make all of the\n//    above work or Safari will still try to scroll the page when focusing an input.\n// 6. As a last resort, handle window scroll events, and scroll back to the top. This can happen when attempting\n//    to navigate to an input with the next/previous buttons that's outside a modal.\nfunction preventScrollMobileSafari() {\n  let scrollable: Element | undefined;\n  let lastY = 0;\n\n  const onTouchStart = (e: TouchEvent) => {\n    // Use `composedPath` to support shadow DOM.\n    const target = e.composedPath()?.[0] as HTMLElement;\n\n    // Store the nearest scrollable parent element from the element that the user touched.\n    scrollable = getScrollParent(target, true);\n\n    if (\n      scrollable === document.documentElement &&\n      scrollable === document.body\n    ) {\n      return;\n    }\n\n    lastY = e.changedTouches[0].pageY;\n  };\n\n  const onTouchMove = (e: TouchEvent) => {\n    // In special situations, `onTouchStart` may be called without `onTouchStart` being called.\n    // (e.g. when the user places a finger on the screen before the <Sheet> is mounted and then moves the finger after it is mounted).\n    // If `onTouchStart` is not called, `scrollable` is `undefined`. Therefore, such cases are ignored.\n    if (scrollable === undefined) {\n      return;\n    }\n\n    // Prevent scrolling the window.\n    if (\n      !scrollable ||\n      scrollable === document.documentElement ||\n      scrollable === document.body\n    ) {\n      e.preventDefault();\n      return;\n    }\n\n    // Prevent scrolling up when at the top and scrolling down when at the bottom\n    // of a nested scrollable area, otherwise mobile Safari will start scrolling\n    // the window instead. Unfortunately, this disables bounce scrolling when at\n    // the top but it's the best we can do.\n    const y = e.changedTouches[0].pageY;\n    const scrollTop = scrollable.scrollTop;\n    const bottom = scrollable.scrollHeight - scrollable.clientHeight;\n\n    if (bottom === 0) {\n      return;\n    }\n\n    if ((scrollTop <= 0 && y > lastY) || (scrollTop >= bottom && y < lastY)) {\n      e.preventDefault();\n    }\n\n    lastY = y;\n  };\n\n  const onTouchEnd = (e: TouchEvent) => {\n    // Use `composedPath` to support shadow DOM.\n    const target = e.composedPath()?.[0] as HTMLElement;\n\n    // Apply this change if we're not already focused on the target element\n    if (willOpenKeyboard(target) && target !== document.activeElement) {\n      e.preventDefault();\n\n      // Apply a transform to trick Safari into thinking the input is at the top of the page\n      // so it doesn't try to scroll it into view. When tapping on an input, this needs to\n      // be done before the \"focus\" event, so we have to focus the element ourselves.\n      target.style.transform = 'translateY(-2000px)';\n      target.focus();\n      requestAnimationFrame(() => {\n        target.style.transform = '';\n      });\n    }\n  };\n\n  const onFocus = (e: FocusEvent) => {\n    // Use `composedPath` to support shadow DOM.\n    const target = e.composedPath()?.[0] as HTMLElement;\n\n    if (willOpenKeyboard(target)) {\n      // Transform also needs to be applied in the focus event in cases where focus moves\n      // other than tapping on an input directly, e.g. the next/previous buttons in the\n      // software keyboard. In these cases, it seems applying the transform in the focus event\n      // is good enough, whereas when tapping an input, it must be done before the focus event. 🤷‍♂️\n      target.style.transform = 'translateY(-2000px)';\n      requestAnimationFrame(() => {\n        target.style.transform = '';\n\n        // This will have prevented the browser from scrolling the focused element into view,\n        // so we need to do this ourselves in a way that doesn't cause the whole page to scroll.\n        if (visualViewport) {\n          if (visualViewport.height < window.innerHeight) {\n            // If the keyboard is already visible, do this after one additional frame\n            // to wait for the transform to be removed.\n            requestAnimationFrame(() => {\n              scrollIntoView(target);\n            });\n          } else {\n            // Otherwise, wait for the visual viewport to resize before scrolling so we can\n            // measure the correct position to scroll to.\n            visualViewport.addEventListener(\n              'resize',\n              () => scrollIntoView(target),\n              { once: true }\n            );\n          }\n        }\n      });\n    }\n  };\n\n  const onWindowScroll = () => {\n    // Last resort. If the window scrolled, scroll it back to the top.\n    // It should always be at the top because the body will have a negative margin (see below).\n    window.scrollTo(0, 0);\n  };\n\n  // Record the original scroll position so we can restore it.\n  // Then apply a negative margin to the body to offset it by the scroll position. This will\n  // enable us to scroll the window to the top, which is required for the rest of this to work.\n  const scrollX = window.pageXOffset;\n  const scrollY = window.pageYOffset;\n\n  const restoreStyles = chain(\n    setStyle(\n      document.documentElement,\n      'paddingRight',\n      `${window.innerWidth - document.documentElement.clientWidth}px`\n    ),\n    setStyle(document.documentElement, 'overflow', 'hidden'),\n    setStyle(document.body, 'marginTop', `-${scrollY}px`)\n  );\n\n  // Scroll to the top. The negative margin on the body will make this appear the same.\n  window.scrollTo(0, 0);\n\n  const removeEvents = chain(\n    addEvent(document, 'touchstart', onTouchStart, {\n      passive: false,\n      capture: true,\n    }),\n    addEvent(document, 'touchmove', onTouchMove, {\n      passive: false,\n      capture: true,\n    }),\n    addEvent(document, 'touchend', onTouchEnd, {\n      passive: false,\n      capture: true,\n    }),\n    addEvent(document, 'focus', onFocus, true),\n    addEvent(window, 'scroll', onWindowScroll)\n  );\n\n  return () => {\n    // Restore styles and scroll the page back to where it was.\n    restoreStyles();\n    removeEvents();\n    window.scrollTo(scrollX, scrollY);\n  };\n}\n\n// Sets a CSS property on an element, and returns a function to revert it to the previous value.\nfunction setStyle(element: any, style: string, value: string) {\n  // https://github.com/microsoft/TypeScript/issues/17827#issuecomment-391663310\n  const cur = element.style[style];\n  element.style[style] = value;\n\n  return () => {\n    element.style[style] = cur;\n  };\n}\n\n// Adds an event listener to an element, and returns a function to remove it.\nfunction addEvent<K extends keyof GlobalEventHandlersEventMap>(\n  target: EventTarget,\n  event: K,\n  handler: (this: Document, ev: GlobalEventHandlersEventMap[K]) => any,\n  options?: boolean | AddEventListenerOptions\n) {\n  // @ts-expect-error\n  target.addEventListener(event, handler, options);\n\n  return () => {\n    // @ts-expect-error\n    target.removeEventListener(event, handler, options);\n  };\n}\n\nfunction scrollIntoView(target: Element) {\n  const root = document.scrollingElement || document.documentElement;\n  while (target && target !== root) {\n    // Find the parent scrollable element and adjust the scroll position if the target is not already in view.\n    const scrollable = getScrollParent(target);\n    if (\n      scrollable !== document.documentElement &&\n      scrollable !== document.body &&\n      scrollable !== target\n    ) {\n      const scrollableTop = scrollable.getBoundingClientRect().top;\n      const targetTop = target.getBoundingClientRect().top;\n      const targetBottom = target.getBoundingClientRect().bottom;\n      // Buffer is needed for some edge cases\n      const keyboardHeight =\n        scrollable.getBoundingClientRect().bottom + KEYBOARD_BUFFER;\n\n      if (targetBottom > keyboardHeight) {\n        scrollable.scrollTop += targetTop - scrollableTop;\n      }\n    }\n\n    // @ts-expect-error\n    target = scrollable.parentElement;\n  }\n}\n","import { useEffect, useState } from 'react';\nimport { useStableCallback } from './use-stable-callback';\n\ntype SheetState = 'closed' | 'opening' | 'open' | 'closing';\n\ntype UseSheetStatesProps = {\n  isOpen: boolean;\n  onClosed?: () => Promise<void> | void;\n  onOpening?: () => Promise<void> | void;\n  onOpen?: () => Promise<void> | void;\n  onClosing?: () => Promise<void> | void;\n};\n\nexport function useSheetState({\n  isOpen,\n  onClosed: _onClosed,\n  onOpening: _onOpening,\n  onOpen: _onOpen,\n  onClosing: _onClosing,\n}: UseSheetStatesProps) {\n  const [state, setState] = useState<SheetState>(isOpen ? 'opening' : 'closed');\n  const onClosed = useStableCallback(() => _onClosed?.());\n  const onOpening = useStableCallback(() => _onOpening?.());\n  const onOpen = useStableCallback(() => _onOpen?.());\n  const onClosing = useStableCallback(() => _onClosing?.());\n\n  useEffect(() => {\n    if (isOpen && state === 'closed') {\n      setState('opening');\n    } else if (!isOpen && (state === 'open' || state === 'opening')) {\n      setState('closing');\n    }\n  }, [isOpen, state]);\n\n  useEffect(() => {\n    async function handle() {\n      switch (state) {\n        case 'closed':\n          await onClosed?.();\n          break;\n\n        case 'opening':\n          await onOpening?.();\n          setState('open');\n          break;\n\n        case 'open':\n          await onOpen?.();\n          break;\n\n        case 'closing':\n          await onClosing?.();\n          setState('closed');\n          break;\n      }\n    }\n    handle().catch((error) => {\n      console.error('Internal sheet state error:', error);\n    });\n  }, [state]);\n\n  return state;\n}\n","import type { PanInfo } from 'motion';\nimport type { SheetSnapPoint } from './types';\nimport { clamp, isAscendingOrder } from './utils';\n\n/**\n * Convert negative / percentage snap points to absolute values\n *\n * Example output:\n *\n * ```json\n * [\n *     {\n *         \"snapIndex\": 0, // <-- bottom snap point\n *         \"snapValue\": 0,\n *         \"snapValueY\": 810\n *     },\n *     {\n *         \"snapIndex\": 1,\n *         \"snapValue\": 170,\n *         \"snapValueY\": 640\n *     },\n *     {\n *         \"snapIndex\": 2,\n *         \"snapValue\": 405,\n *         \"snapValueY\": 405\n *     },\n *     {\n *         \"snapIndex\": 3,\n *         \"snapValue\": 760,\n *         \"snapValueY\": 50\n *     },\n *     {\n *         \"snapIndex\": 4, // <-- top snap point\n *         \"snapValue\": 810,\n *         \"snapValueY\": 0\n *     }\n * ]\n * ```\n */\nexport function computeSnapPoints({\n  snapPointsProp,\n  sheetHeight,\n}: {\n  snapPointsProp: number[];\n  sheetHeight: number;\n}): SheetSnapPoint[] {\n  if (snapPointsProp[0] !== 0) {\n    console.error(\n      'First snap point should be 0 to ensure the sheet can be fully closed. ' +\n        `Got: [${snapPointsProp.join(', ')}]`\n    );\n    snapPointsProp.unshift(0);\n  }\n\n  if (snapPointsProp[snapPointsProp.length - 1] !== 1) {\n    console.error(\n      'Last snap point should be 1 to ensure the sheet can be fully opened. ' +\n        `Got: [${snapPointsProp.join(', ')}]`\n    );\n    snapPointsProp.push(1);\n  }\n\n  if (sheetHeight <= 0) {\n    console.error(\n      `Sheet height is ${sheetHeight}, cannot compute snap points. ` +\n        'Make sure the sheet is mounted and has a valid height.'\n    );\n    return [];\n  }\n\n  const snapPointValues = snapPointsProp.map((point) => {\n    // Percentage values e.g. between 0.0 and 1.0\n    if (point > 0 && point <= 1) {\n      return Math.round(point * sheetHeight);\n    }\n\n    return point < 0 ? sheetHeight + point : point; // negative values\n  });\n\n  console.assert(\n    isAscendingOrder(snapPointValues),\n    `Snap points need to be in ascending order got: [${snapPointsProp.join(', ')}]`\n  );\n\n  // Make sure all snap points are within the sheet height\n  snapPointValues.forEach((snap) => {\n    if (snap < 0 || snap > sheetHeight) {\n      console.warn(\n        `Snap point ${snap} is outside of the sheet height ${sheetHeight}. ` +\n          'This can cause unexpected behavior. Consider adjusting your snap points.'\n      );\n    }\n  });\n\n  if (!snapPointValues.includes(sheetHeight)) {\n    console.warn(\n      'Snap points do not include the sheet height.' +\n        'Please include `1` as the last snap point or it will be included automatically.' +\n        'This is to ensure the sheet can be fully opened.'\n    );\n    snapPointValues.push(sheetHeight);\n  }\n\n  return snapPointValues.map((snap, index) => ({\n    snapIndex: index,\n    snapValue: snap, // Absolute value from the bottom of the sheet\n    snapValueY: sheetHeight - snap, // Y value is inverted as `y = 0` means sheet is at the top\n  }));\n}\n\nfunction sign(value: number) {\n  if (value > 0) return 1;\n  if (value < 0) return -1;\n  return 0;\n}\n\nfunction toAscendingYSnaps(snapPoints: SheetSnapPoint[]) {\n  return snapPoints.slice().sort((a, b) => a.snapValueY - b.snapValueY);\n}\n\nfunction findNearestSnapByY(snapPoints: SheetSnapPoint[], y: number) {\n  return snapPoints.reduce((closest, snap) =>\n    Math.abs(snap.snapValueY - y) < Math.abs(closest.snapValueY - y)\n      ? snap\n      : closest\n  );\n}\n\nfunction findNearestSnapAboveY(snapPoints: SheetSnapPoint[], y: number) {\n  const snaps = toAscendingYSnaps(snapPoints);\n\n  for (let i = snaps.length - 1; i >= 0; i--) {\n    if (snaps[i].snapValueY < y) {\n      return snaps[i];\n    }\n  }\n\n  return null;\n}\n\nfunction findNearestSnapBelowY(snapPoints: SheetSnapPoint[], y: number) {\n  const snaps = toAscendingYSnaps(snapPoints);\n\n  for (let i = 0; i < snaps.length; i++) {\n    if (snaps[i].snapValueY > y) {\n      return snaps[i];\n    }\n  }\n\n  return null;\n}\n\nfunction resolveDirection({\n  offsetY,\n  velocityY,\n  deltaY,\n}: {\n  offsetY: number;\n  velocityY: number;\n  deltaY: number;\n}) {\n  if (Math.abs(velocityY) > 50) return sign(velocityY);\n\n  const offsetDirection = sign(offsetY);\n  if (offsetDirection !== 0) return offsetDirection;\n\n  return sign(deltaY);\n}\n\n/**\n * Classifies the final sheet position when a drag gesture ends.\n *\n * Decision flow (high level):\n * 1) Predict momentum endpoint from current position and velocity.\n * 2) Resolve drag direction (prefer velocity, fallback to offset/delta).\n * 3) Detect flick tiers:\n *    - strong flick -> jump fully open/closed\n *    - flick -> move to next snap in flick direction\n * 4) For slower drags:\n *    - tiny drag or near-snap stickiness -> snap back to nearest snap\n *    - otherwise, use progress between surrounding snaps and commit threshold\n * 5) Apply velocity-assisted bias to nearest predicted snap for natural feel.\n * 6) Fallback to nearest snap.\n *\n * Special case with no snap points:\n * - flick: open/close by direction\n * - otherwise: open/close by predicted position vs close threshold midpoint\n */\nexport function classifyDragEnd({\n  y,\n  info,\n  sheetHeight,\n  snapPoints,\n  dragVelocityThreshold,\n  dragCloseThreshold,\n}: {\n  y: number;\n  info: PanInfo;\n  sheetHeight: number;\n  snapPoints: SheetSnapPoint[];\n  dragVelocityThreshold: number;\n  dragCloseThreshold: number;\n}) {\n  /**\n   * Thresholds and configuration for drag classification.\n   * Tweak these to adjust the feel of the sheet.\n   */\n  // Velocity above this is considered a flick gesture.\n  const flickVelocity = dragVelocityThreshold;\n  // Velocity above this is treated as a strong flick and jumps to full open/closed.\n  const strongFlickVelocity = Math.max(2000, flickVelocity);\n  // In slow drags, crossing this portion of the current snap region commits to the next snap.\n  const distanceCommitRatio = 0.35;\n  // Time horizon (in seconds) used to estimate momentum-based end position.\n  const predictionTime = 0.2;\n  // Very small drags below this distance snap back instead of changing snap state.\n  const minDragDistance = 20;\n  // If drag ends within this many pixels from a snap, stick to that snap to reduce jitter.\n  const snapStickiness = 24;\n\n  const minY = 0;\n  const maxY = sheetHeight;\n  const offsetY = info.offset.y;\n  const deltaY = info.delta.y;\n  const velocityY = info.velocity.y;\n\n  // Step 1 — Compute predicted end position from momentum.\n  const predictedY = clamp(y + velocityY * predictionTime, minY, maxY);\n  const absVelocity = Math.abs(velocityY);\n\n  // Step 2 + 3 — Flick detection and gesture direction resolution.\n  const direction = resolveDirection({ offsetY, velocityY, deltaY });\n\n  const isStrongFlick = absVelocity > strongFlickVelocity;\n  const isFlick = absVelocity > flickVelocity;\n\n  // Step 4 — No snap points: decide between open/close only.\n  if (snapPoints.length === 0) {\n    if (isFlick) {\n      return {\n        yTo: direction < 0 ? minY : maxY,\n        snapIndex: undefined,\n      };\n    }\n\n    const midpoint = minY + (maxY - minY) * dragCloseThreshold;\n\n    return {\n      yTo: predictedY < midpoint ? minY : maxY,\n      snapIndex: undefined,\n    };\n  }\n\n  const nearestSnap = findNearestSnapByY(snapPoints, y);\n\n  // Slow-drag guard — tiny movement: snap back to nearest.\n  if (!isFlick && Math.abs(offsetY) < minDragDistance) {\n    return {\n      yTo: nearestSnap.snapValueY,\n      snapIndex: nearestSnap.snapIndex,\n    };\n  }\n\n  // Hysteresis (stickiness) — avoid jitter if already close to a snap.\n  if (!isFlick && Math.abs(y - nearestSnap.snapValueY) < snapStickiness) {\n    return {\n      yTo: nearestSnap.snapValueY,\n      snapIndex: nearestSnap.snapIndex,\n    };\n  }\n\n  // Step 5 — Strong flick overrides everything and goes fully open/closed.\n  if (isStrongFlick) {\n    const target = direction < 0 ? minY : maxY;\n    const targetSnap = findNearestSnapByY(snapPoints, target);\n\n    return {\n      yTo: target,\n      snapIndex: targetSnap.snapIndex,\n    };\n  }\n\n  // Step 5 — Medium flick moves to the next snap in flick direction.\n  if (isFlick) {\n    const nextSnap =\n      direction < 0\n        ? findNearestSnapAboveY(snapPoints, y)\n        : findNearestSnapBelowY(snapPoints, y);\n\n    const fallbackY = direction < 0 ? minY : maxY;\n    const fallbackSnap = findNearestSnapByY(snapPoints, fallbackY);\n    const targetSnap = nextSnap ?? fallbackSnap;\n\n    return {\n      yTo: targetSnap.snapValueY,\n      snapIndex: targetSnap.snapIndex,\n    };\n  }\n\n  const firstSnap = toAscendingYSnaps(snapPoints)[0];\n  const lastSnap = toAscendingYSnaps(snapPoints)[snapPoints.length - 1];\n  const prevSnap = findNearestSnapAboveY(snapPoints, y) ?? firstSnap;\n  const nextSnap = findNearestSnapBelowY(snapPoints, y) ?? lastSnap;\n\n  if (prevSnap.snapIndex === nextSnap.snapIndex) {\n    return {\n      yTo: prevSnap.snapValueY,\n      snapIndex: prevSnap.snapIndex,\n    };\n  }\n\n  const range = nextSnap.snapValueY - prevSnap.snapValueY;\n  const progress = range > 0 ? (y - prevSnap.snapValueY) / range : 0;\n\n  // Step 6 — Slow drag commit based on progress within the current snap region.\n  let selectedSnap = nearestSnap;\n\n  if (direction > 0) {\n    selectedSnap = progress > distanceCommitRatio ? nextSnap : prevSnap;\n  } else if (direction < 0) {\n    selectedSnap = progress < 1 - distanceCommitRatio ? prevSnap : nextSnap;\n  }\n\n  // Step 7 — Velocity-assisted bias toward predicted-position snap.\n  if (absVelocity > 200) {\n    const predictedSnap = findNearestSnapByY(snapPoints, predictedY);\n\n    if (\n      Math.abs(predictedSnap.snapValueY - y) <\n      Math.abs(selectedSnap.snapValueY - y)\n    ) {\n      selectedSnap = predictedSnap;\n    }\n  }\n\n  // Step 8 — Final fallback.\n  return {\n    yTo: selectedSnap.snapValueY,\n    snapIndex: selectedSnap.snapIndex,\n  };\n}\n","import type { CSSProperties } from 'react';\n\nexport const styles = {\n  root: {\n    base: {\n      position: 'fixed',\n      top: 0,\n      bottom: 0,\n      left: 0,\n      right: 0,\n      overflow: 'hidden',\n      pointerEvents: 'none',\n    },\n    decorative: {},\n  },\n  backdrop: {\n    base: {\n      zIndex: 1,\n      position: 'fixed',\n      top: 0,\n      left: 0,\n      width: '100%',\n      height: '100%',\n      touchAction: 'none',\n      userSelect: 'none',\n    },\n    decorative: {\n      backgroundColor: 'rgba(0, 0, 0, 0.2)',\n      border: 'none',\n      WebkitTapHighlightColor: 'transparent',\n    },\n  },\n  container: {\n    base: {\n      zIndex: 2,\n      position: 'absolute',\n      left: 0,\n      bottom: 0,\n      width: '100%',\n      pointerEvents: 'auto',\n      display: 'flex',\n      flexDirection: 'column',\n    },\n    decorative: {\n      backgroundColor: '#fff',\n      borderTopRightRadius: '8px',\n      borderTopLeftRadius: '8px',\n      boxShadow: '0px -2px 16px rgba(0, 0, 0, 0.3)',\n    },\n  },\n  headerWrapper: {\n    base: {\n      width: '100%',\n    },\n    decorative: {},\n  },\n  header: {\n    base: {\n      width: '100%',\n      position: 'relative',\n    },\n    decorative: {\n      height: '40px',\n      display: 'flex',\n      alignItems: 'center',\n      justifyContent: 'center',\n    },\n  },\n  indicatorWrapper: {\n    base: {\n      display: 'flex',\n    },\n    decorative: {},\n  },\n  indicator: {\n    base: {\n      display: 'inline-block',\n    },\n    decorative: {\n      width: '18px',\n      height: '4px',\n      borderRadius: '99px',\n      backgroundColor: '#ddd',\n    },\n  },\n  content: {\n    base: {\n      minHeight: '0px',\n      position: 'relative',\n      flexGrow: 1,\n      display: 'flex',\n      flexDirection: 'column',\n    },\n    decorative: {},\n  },\n  scroller: {\n    base: {\n      height: '100%',\n      overflowY: 'auto',\n      overscrollBehaviorY: 'none',\n    },\n    decorative: {},\n  },\n} satisfies Record<\n  string,\n  {\n    base: CSSProperties;\n    decorative: CSSProperties;\n  }\n>;\n","import {\n  animate,\n  type DragHandler,\n  motion,\n  type Transition,\n  useMotionValue,\n  useReducedMotion,\n  useTransform,\n} from 'motion/react';\nimport React, {\n  forwardRef,\n  useImperativeHandle,\n  useMemo,\n  useRef,\n  useState,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport useMeasure from 'react-use-measure';\n\nimport {\n  DEFAULT_DRAG_CLOSE_THRESHOLD,\n  DEFAULT_DRAG_VELOCITY_THRESHOLD,\n  DEFAULT_TWEEN_CONFIG,\n  IS_SSR,\n  REDUCED_MOTION_TWEEN_CONFIG,\n} from './constants';\nimport { ExposedSheetContext, InternalSheetContext } from './context';\nimport { useDimensions } from './hooks/use-dimensions';\nimport { useKeyboardAvoidance } from './hooks/use-keyboard-avoidance';\nimport { useModalEffect } from './hooks/use-modal-effect';\nimport { usePreventScroll } from './hooks/use-prevent-scroll';\nimport { useSheetState } from './hooks/use-sheet-state';\nimport { useStableCallback } from './hooks/use-stable-callback';\nimport { classifyDragEnd, computeSnapPoints } from './snap';\nimport { styles } from './styles';\nimport type {\n  ExposedContextType,\n  InternalContextType,\n  SheetProps,\n} from './types';\nimport { applyStyles, clamp, waitForElement, willOpenKeyboard } from './utils';\n\nexport const Sheet = forwardRef<any, SheetProps>(\n  (\n    {\n      avoidKeyboard = true,\n      children,\n      className = '',\n      detent = 'default',\n      disableDismiss = false,\n      disableDrag: disableDragProp = false,\n      disableScrollLocking = false,\n      dragCloseThreshold = DEFAULT_DRAG_CLOSE_THRESHOLD,\n      dragVelocityThreshold = DEFAULT_DRAG_VELOCITY_THRESHOLD,\n      initialSnap,\n      isOpen,\n      modalEffectRootId,\n      modalEffectThreshold,\n      mountPoint,\n      prefersReducedMotion = false,\n      snapPoints: snapPointsProp,\n      style,\n      tweenConfig = DEFAULT_TWEEN_CONFIG,\n      unstyled = false,\n      onOpenStart,\n      onOpenEnd,\n      onClose,\n      onCloseStart,\n      onCloseEnd,\n      onSnap,\n      onDrag: onDragProp,\n      onDragStart: onDragStartProp,\n      onDragEnd: onDragEndProp,\n      ...rest\n    },\n    ref\n  ) => {\n    const [sheetBoundsRef, sheetBounds] = useMeasure();\n    const sheetRef = useRef<HTMLDivElement>(null);\n    const sheetHeight = Math.round(sheetBounds.height);\n    const [currentSnap, setCurrentSnap] = useState(initialSnap);\n    const { windowHeight } = useDimensions();\n    const closedY = sheetHeight > 0 ? sheetHeight : windowHeight;\n    const y = useMotionValue(closedY);\n    const yInverted = useTransform(y, (val) => Math.max(sheetHeight - val, 0));\n    const yProgress = useTransform(y, (val) => clamp(1 - val / closedY, 0, 1));\n    const indicatorRotation = useMotionValue(0);\n    const shouldReduceMotion = useReducedMotion();\n    const reduceMotion = Boolean(prefersReducedMotion || shouldReduceMotion);\n    const animationOptions: Transition = {\n      type: 'tween',\n      ...(reduceMotion ? REDUCED_MOTION_TWEEN_CONFIG : tweenConfig),\n    };\n\n    // +2 for tolerance in case the animated value is slightly off\n    const zIndex = useTransform(y, (val) =>\n      val + 2 >= closedY ? -1 : (style?.zIndex ?? 9999)\n    );\n    const visibility = useTransform(y, (val) =>\n      val + 2 >= closedY ? 'hidden' : 'visible'\n    );\n\n    // Memo snap points as we expose them in context so we want them to be stable\n    const snapPoints = useMemo(() => {\n      return snapPointsProp && sheetHeight > 0\n        ? computeSnapPoints({ sheetHeight, snapPointsProp })\n        : [];\n    }, [sheetHeight, snapPointsProp?.join('')]);\n\n    const updateSnap = useStableCallback((snapIndex: number) => {\n      setCurrentSnap(snapIndex);\n      onSnap?.(snapIndex);\n    });\n\n    const getSnapPoint = useStableCallback((snapIndex: number) => {\n      if (snapPointsProp && snapPoints) {\n        if (snapIndex < 0 || snapIndex >= snapPoints.length) {\n          console.warn(\n            `Invalid snap index ${snapIndex}. Snap points are: [${snapPointsProp.join(', ')}] and their computed values are: [${snapPoints\n              .map((point) => point.snapValue)\n              .join(', ')}]`\n          );\n          return null;\n        }\n        return snapPoints[snapIndex];\n      }\n      return null;\n    });\n\n    const snapTo = useStableCallback(async (snapIndex: number) => {\n      if (!snapPointsProp) {\n        console.warn('Snapping is not possible without `snapPoints` prop.');\n        return;\n      }\n\n      const snapPoint = getSnapPoint(snapIndex);\n\n      if (snapPoint === null) {\n        console.warn(`Invalid snap index ${snapIndex}.`);\n        return;\n      }\n\n      if (snapIndex === 0) {\n        onClose();\n        return;\n      }\n\n      await animate(y, snapPoint.snapValueY, {\n        ...animationOptions,\n        onComplete: () => updateSnap(snapIndex),\n      });\n    });\n\n    const keyboard = useKeyboardAvoidance({\n      isEnabled: isOpen && avoidKeyboard,\n      containerRef: sheetRef,\n      onWillOpenKeyboard: async () => {\n        const lastSnapPoint = snapPoints[snapPoints.length - 1];\n\n        /**\n         * If there are snap points and the sheet is not already at the last snap point,\n         * move it there to make sure the focused input is not covered by the keyboard\n         */\n        if (lastSnapPoint && lastSnapPoint.snapIndex !== currentSnap) {\n          await animate(y, lastSnapPoint.snapValueY, animationOptions);\n          updateSnap(lastSnapPoint.snapIndex);\n        }\n      },\n      onDidOpenKeyboard: (focusedElement) => {\n        const sheetElement = sheetRef.current;\n        if (!sheetElement) return;\n\n        const inputRect = focusedElement.getBoundingClientRect();\n        const containerRect = sheetElement.getBoundingClientRect();\n        const scroller = sheetElement.querySelector(\n          '.react-modal-sheet-content-scroller'\n        ) as HTMLElement;\n\n        const scrollTarget = Math.max(\n          inputRect.top -\n            containerRect.top +\n            scroller.scrollTop -\n            inputRect.height,\n          0\n        );\n\n        requestAnimationFrame(() => {\n          scroller.scrollTo({ top: scrollTarget, behavior: 'smooth' });\n        });\n      },\n    });\n\n    // Disable drag if the keyboard is open to avoid weird behavior\n    const disableDrag = keyboard.isKeyboardOpen || disableDragProp;\n\n    const blurActiveInput = useStableCallback(() => {\n      /**\n       * Find focused input inside the sheet and blur it when dragging starts\n       * to prevent a weird ghost caret \"bug\" on mobile\n       */\n      const focusedElement = document.activeElement as HTMLElement | null;\n\n      // Only blur the focused element if it's inside the sheet\n      if (\n        focusedElement &&\n        willOpenKeyboard(focusedElement) &&\n        sheetRef.current?.contains(focusedElement)\n      ) {\n        focusedElement.blur();\n      }\n    });\n\n    const onDragStart = useStableCallback<DragHandler>((event, info) => {\n      blurActiveInput();\n      onDragStartProp?.(event, info);\n    });\n\n    const onDrag = useStableCallback<DragHandler>((event, info) => {\n      onDragProp?.(event, info);\n\n      const currentY = y.get();\n\n      // Update drag indicator rotation based on drag velocity\n      const velocity = y.getVelocity();\n      if (velocity > 0) indicatorRotation.set(10);\n      if (velocity < 0) indicatorRotation.set(-10);\n\n      // Make sure user cannot drag beyond the top of the sheet\n      y.set(Math.max(currentY + info.delta.y, 0));\n    });\n\n    const onDragEnd = useStableCallback<DragHandler>((event, info) => {\n      blurActiveInput();\n      onDragEndProp?.(event, info);\n\n      const currentY = y.get();\n\n      const result = classifyDragEnd({\n        y: currentY,\n        info,\n        sheetHeight,\n        dragCloseThreshold,\n        snapPoints,\n        dragVelocityThreshold,\n      });\n\n      let yTo = result.yTo;\n\n      // If disableDismiss is true, prevent closing via gesture\n      if (disableDismiss && yTo + 1 >= sheetHeight) {\n        // Use the bottom-most open snap point\n        const bottomSnapPoint = snapPoints.find((s) => s.snapValue > 0);\n\n        if (bottomSnapPoint) {\n          yTo = bottomSnapPoint.snapValueY;\n          updateSnap(bottomSnapPoint.snapIndex);\n        } else {\n          // If no open snap points available, stay at current position\n          yTo = currentY;\n        }\n      } else if (result.snapIndex !== undefined) {\n        updateSnap(result.snapIndex);\n      }\n\n      // Update the spring value so that the sheet is animated to the snap point\n      animate(y, yTo, animationOptions);\n\n      // +1px for imprecision tolerance\n      // Only call onClose if disableDismiss is false or if we're actually closing\n      if (yTo + 1 >= sheetHeight && !disableDismiss) {\n        onClose();\n      }\n\n      // Reset indicator rotation after dragging\n      indicatorRotation.set(0);\n    });\n\n    useModalEffect({\n      y,\n      detent,\n      sheetHeight,\n      snapPoints,\n      rootId: modalEffectRootId,\n      startThreshold: modalEffectThreshold,\n    });\n\n    /**\n     * Motion should handle body scroll locking but it's not working properly on iOS.\n     * Scroll locking from React Aria seems to work much better 🤷‍♂️\n     */\n    usePreventScroll({\n      isDisabled: disableScrollLocking || !isOpen,\n    });\n\n    const state = useSheetState({\n      isOpen,\n      onOpen: async () => {\n        onOpenStart?.();\n\n        /**\n         * This is not very React-y but we need to wait for the sheet\n         * but we need to wait for the sheet to be rendered and visible\n         * before we can measure it and animate it to the initial snap point.\n         */\n        await waitForElement('react-modal-sheet-container');\n\n        const initialSnapPoint =\n          initialSnap !== undefined ? getSnapPoint(initialSnap) : null;\n\n        const yTo = initialSnapPoint?.snapValueY ?? 0;\n\n        await animate(y, yTo, animationOptions);\n        if (initialSnap !== undefined) updateSnap(initialSnap);\n        onOpenEnd?.();\n      },\n      onClosing: async () => {\n        onCloseStart?.();\n        await animate(y, closedY, animationOptions);\n        onCloseEnd?.();\n      },\n    });\n\n    const dragProps: InternalContextType['dragProps'] = {\n      drag: 'y',\n      dragElastic: 0,\n      dragMomentum: false,\n      dragPropagation: false,\n      onDrag,\n      onDragStart,\n      onDragEnd,\n    };\n\n    const internalContext: InternalContextType = {\n      currentSnap,\n      detent,\n      disableDrag,\n      dragProps,\n      indicatorRotation,\n      avoidKeyboard,\n      prefersReducedMotion,\n      sheetBoundsRef,\n      sheetRef,\n      unstyled,\n      yProgress,\n      y,\n    };\n\n    const exposedContext: ExposedContextType = {\n      height: sheetHeight,\n      currentSnap,\n      snapPoints,\n      snapTo,\n      y,\n      yInverted,\n      yProgress,\n    };\n\n    useImperativeHandle(ref, () => exposedContext);\n\n    const sheet = (\n      <InternalSheetContext.Provider value={internalContext}>\n        <motion.div\n          {...rest}\n          ref={ref}\n          data-sheet-state={state}\n          className={`react-modal-sheet-root ${className}`}\n          style={{\n            ...applyStyles(styles.root, unstyled),\n            zIndex,\n            visibility,\n            ...style,\n          }}\n        >\n          <ExposedSheetContext.Provider value={exposedContext}>\n            {state !== 'closed' ? children : null}\n          </ExposedSheetContext.Provider>\n        </motion.div>\n      </InternalSheetContext.Provider>\n    );\n\n    if (IS_SSR) return sheet;\n\n    return createPortal(sheet, mountPoint ?? document.body);\n  }\n);\n\nSheet.displayName = 'Sheet';\n","import { type MotionStyle, motion } from 'motion/react';\nimport React, { forwardRef } from 'react';\n\nimport { useInternalContext } from './context';\nimport { styles } from './styles';\nimport { type SheetBackdropProps } from './types';\nimport { applyStyles } from './utils';\n\nconst isClickable = (props: any) => !!props.onClick || !!props.onTap;\n\nexport const SheetBackdrop = forwardRef<any, SheetBackdropProps>(\n  ({ style, className = '', unstyled, ...rest }, ref) => {\n    const sheetContext = useInternalContext();\n    const clickable = isClickable(rest);\n    const Comp = clickable ? motion.button : motion.div;\n    const pointerEvents = clickable ? 'auto' : 'none';\n    const isUnstyled = unstyled ?? sheetContext.unstyled;\n\n    const backdropStyle: MotionStyle = {\n      opacity: sheetContext.yProgress,\n      ...applyStyles(styles.backdrop, isUnstyled),\n      ...style,\n      pointerEvents,\n    };\n\n    return (\n      <Comp\n        {...(rest as any)}\n        ref={ref}\n        className={`react-modal-sheet-backdrop ${className}`}\n        style={backdropStyle}\n      />\n    );\n  }\n);\n\nSheetBackdrop.displayName = 'SheetBackdrop';\n","import { type MotionStyle, motion } from 'motion/react';\nimport React, { forwardRef } from 'react';\n\nimport { DEFAULT_HEIGHT } from './constants';\nimport { useInternalContext } from './context';\nimport { styles } from './styles';\nimport { type SheetContainerProps } from './types';\nimport { applyStyles, mergeRefs } from './utils';\n\nexport const SheetContainer = forwardRef<any, SheetContainerProps>(\n  ({ children, style, className = '', unstyled, ...rest }, ref) => {\n    const sheetContext = useInternalContext();\n\n    const isUnstyled = unstyled ?? sheetContext.unstyled;\n\n    const containerStyle: MotionStyle = {\n      ...applyStyles(styles.container, isUnstyled),\n      ...style,\n      y: sheetContext.y,\n    };\n\n    if (sheetContext.detent === 'default') {\n      containerStyle.height = DEFAULT_HEIGHT;\n    }\n\n    if (sheetContext.detent === 'full') {\n      containerStyle.height = '100%';\n      containerStyle.maxHeight = '100%';\n    }\n\n    if (sheetContext.detent === 'content') {\n      containerStyle.height = 'auto';\n      containerStyle.maxHeight = DEFAULT_HEIGHT;\n    }\n\n    return (\n      <motion.div\n        {...rest}\n        ref={mergeRefs([\n          ref,\n          sheetContext.sheetRef,\n          sheetContext.sheetBoundsRef,\n        ])}\n        className={`react-modal-sheet-container ${className}`}\n        style={containerStyle}\n      >\n        {children}\n      </motion.div>\n    );\n  }\n);\n\nSheetContainer.displayName = 'SheetContainer';\n","import { useCallback, useRef } from 'react';\n\nimport { type BoundingBox } from 'motion/react';\n\n// This is a hacky way to fix a bug in motion/react where the drag\n// constraints are not updated when window is resized.\n// https://github.com/framer/motion/issues/1659\nconst constraints: BoundingBox = { bottom: 0, top: 0, left: 0, right: 0 };\n\nexport function useDragConstraints() {\n  const ref = useRef<any>(null);\n  const onMeasure = useCallback(() => constraints, []);\n  return { ref, onMeasure };\n}\n","import { useEffect, useMemo, useRef, useState } from 'react';\nimport { useStableCallback } from './use-stable-callback';\n\ntype UseScrollPositionOptions = {\n  /**\n   * Debounce delay in ms for scroll event handling.\n   * @default 32\n   */\n  debounceDelay?: number;\n  /**\n   * Enable or disable the hook entirely.\n   * @default true\n   */\n  isEnabled?: boolean;\n};\n\n/**\n * Hook to track the scroll position of an element.\n *\n * The scroll position can be 'top', 'bottom', 'middle', or undefined if the content is not scrollable.\n * The hook provides a `scrollRef` callback to assign to the scrollable element.\n *\n * Note that the scroll position is only updated when the user stops scrolling\n * for a short moment (debounced). You can set `debounceDelay` to `0` to disable debouncing entirely.\n *\n * @param options Configuration options for the hook.\n * @returns An object containing the `scrollRef` callback and the current `scrollPosition`.\n *\n * @example\n * ```tsx\n * import { useScrollPosition } from 'react-modal-sheet';\n *\n * function MyComponent() {\n *   const { scrollRef, scrollPosition } = useScrollPosition();\n *\n *   return (\n *     <div>\n *       <p>Scroll position: {scrollPosition}</p>\n *       <div ref={scrollRef} style={{ overflowY: 'auto', maxHeight: '300px' }}>\n *         ...long content...\n *       </div>\n *     </div>\n *   );\n * }\n * ```\n */\nexport function useScrollPosition(options: UseScrollPositionOptions = {}) {\n  const { debounceDelay = 32, isEnabled = true } = options;\n\n  const scrollTimeoutRef = useRef<number | null>(null);\n  const [element, setElement] = useState<HTMLElement | null>(null);\n  const [scrollPosition, setScrollPosition] = useState<\n    'top' | 'bottom' | 'middle' | undefined\n  >(undefined);\n\n  const scrollRef = useMemo(\n    () => (element: HTMLElement | null) => {\n      setElement(element);\n    },\n    []\n  );\n\n  const determineScrollPosition = useStableCallback((element: HTMLElement) => {\n    const { scrollTop, scrollHeight, clientHeight } = element;\n    const isScrollable = scrollHeight > clientHeight;\n\n    if (!isScrollable) {\n      // Reset scroll position if the content is not scrollable anymore\n      if (scrollPosition) setScrollPosition(undefined);\n      return;\n    }\n\n    const isAtTop = scrollTop <= 0;\n    const isAtBottom =\n      Math.ceil(scrollHeight) - Math.ceil(scrollTop) ===\n      Math.ceil(clientHeight);\n\n    let position: 'top' | 'bottom' | 'middle';\n\n    if (isAtTop) {\n      position = 'top';\n    } else if (isAtBottom) {\n      position = 'bottom';\n    } else {\n      position = 'middle';\n    }\n\n    // Let browser only handle downward pan gestures (scrolling content up)\n    element.style.touchAction = isAtTop ? 'pan-down' : '';\n\n    if (position === scrollPosition) return;\n    setScrollPosition(position);\n  });\n\n  const onScroll = useStableCallback((event: Event) => {\n    if (event.currentTarget instanceof HTMLElement) {\n      const el = event.currentTarget;\n\n      if (scrollTimeoutRef.current) clearTimeout(scrollTimeoutRef.current);\n\n      if (debounceDelay === 0) {\n        determineScrollPosition(el);\n      } else {\n        // Debounce the scroll handler\n        scrollTimeoutRef.current = setTimeout(\n          () => determineScrollPosition(el),\n          debounceDelay\n        );\n      }\n    }\n  });\n\n  const onTouchStart = useStableCallback((event: Event) => {\n    if (event.currentTarget instanceof HTMLElement) {\n      const element = event.currentTarget;\n      requestAnimationFrame(() => {\n        determineScrollPosition(element);\n      });\n    }\n  });\n\n  useEffect(() => {\n    if (!element || !isEnabled) return;\n\n    // Determine initial scroll position\n    determineScrollPosition(element);\n\n    element.addEventListener('scroll', onScroll);\n    element.addEventListener('touchstart', onTouchStart);\n\n    return () => {\n      if (scrollTimeoutRef.current) clearTimeout(scrollTimeoutRef.current);\n      element.removeEventListener('scroll', onScroll);\n      element.removeEventListener('touchstart', onTouchStart);\n    };\n  }, [element, isEnabled]);\n\n  return {\n    scrollRef,\n    scrollPosition,\n  };\n}\n","import { type MotionStyle, motion } from 'motion/react';\nimport React, { forwardRef } from 'react';\n\nimport { useInternalContext } from './context';\nimport { useDragConstraints } from './hooks/use-drag-constraints';\nimport { useScrollPosition } from './hooks/use-scroll-position';\nimport { styles } from './styles';\nimport { type SheetContentProps } from './types';\nimport { applyStyles, isHTTPS, mergeRefs } from './utils';\n\nexport const SheetContent = forwardRef<any, SheetContentProps>(\n  (\n    {\n      disableScroll: disableScrollProp,\n      disableDrag: disableDragProp,\n      children,\n      style: styleProp,\n      className = '',\n      scrollClassName = '',\n      scrollStyle: scrollStyleProp,\n      scrollRef: scrollRefProp = null,\n      unstyled,\n      ...rest\n    },\n    ref\n  ) => {\n    const sheetContext = useInternalContext();\n    const dragConstraints = useDragConstraints();\n\n    const scroll = useScrollPosition({\n      isEnabled:\n        typeof disableScrollProp === 'function' ? true : !disableScrollProp,\n    });\n\n    const disableScroll =\n      typeof disableScrollProp === 'function'\n        ? disableScrollProp({\n            scrollPosition: scroll.scrollPosition,\n            currentSnap: sheetContext.currentSnap,\n          })\n        : Boolean(disableScrollProp);\n\n    const disableDragDueToScroll =\n      !disableScroll &&\n      scroll.scrollPosition &&\n      scroll.scrollPosition !== 'top';\n\n    const disableDragDueToProp =\n      typeof disableDragProp === 'function'\n        ? disableDragProp({\n            scrollPosition: scroll.scrollPosition,\n            currentSnap: sheetContext.currentSnap,\n          })\n        : Boolean(disableDragProp);\n\n    const disableDrag =\n      disableDragDueToProp ||\n      disableDragDueToScroll ||\n      sheetContext.disableDrag;\n\n    const dragProps =\n      disableDrag || sheetContext.disableDrag\n        ? undefined\n        : sheetContext.dragProps;\n\n    const isUnstyled = unstyled ?? sheetContext.unstyled;\n\n    const contentStyle: MotionStyle = {\n      ...applyStyles(styles.content, isUnstyled),\n      ...styleProp,\n    };\n\n    const scrollStyle: MotionStyle = applyStyles(styles.scroller, isUnstyled);\n\n    if (sheetContext.avoidKeyboard) {\n      /**\n       * Virtual Keyboard API is only available in secure context (https)\n       * and it will have 0px height in insecure context,\n       * which causes issues when developing and testing on localhost (http).\n       */\n      scrollStyle.paddingBottom = isHTTPS()\n        ? 'env(keyboard-inset-height, var(--keyboard-inset-height, 0px))'\n        : 'var(--keyboard-inset-height, 0px)';\n    }\n\n    if (disableScroll) {\n      /**\n       * NOTE: use `clip` to avoid glitchy behavior where using `hidden`\n       * would actually allow scrolling but just not show the scroll content.\n       * Using `hidden` seems to work fine on iOS but on Android it causes\n       * the up drag gesture to cancel occasionally causing bad UX.\n       */\n      scrollStyle.overflowY = 'clip';\n    }\n\n    if (dragProps !== undefined) {\n      // Let browser only handle downward pan gestures (scrolling content up)\n      scrollStyle.touchAction = 'pan-down';\n    }\n\n    return (\n      <motion.div\n        {...rest}\n        ref={mergeRefs([ref, dragConstraints.ref])}\n        className={`react-modal-sheet-content ${className}`}\n        style={contentStyle}\n        {...dragProps}\n        dragConstraints={dragConstraints.ref}\n        onMeasureDragConstraints={dragConstraints.onMeasure}\n      >\n        <motion.div\n          ref={mergeRefs([scroll.scrollRef, scrollRefProp])}\n          style={{ ...scrollStyle, ...scrollStyleProp }}\n          className={`react-modal-sheet-content-scroller ${scrollClassName}`}\n        >\n          {children}\n        </motion.div>\n      </motion.div>\n    );\n  }\n);\n\nSheetContent.displayName = 'SheetContent';\n","import { motion, useTransform } from 'motion/react';\nimport React from 'react';\n\nimport { useInternalContext } from './context';\nimport { styles } from './styles';\nimport type { SheetDragIndicatorProps } from './types';\nimport { applyStyles } from './utils';\n\nexport function SheetDragIndicator({\n  style,\n  className = '',\n  unstyled,\n  ...rest\n}: SheetDragIndicatorProps) {\n  const sheetContext = useInternalContext();\n\n  const indicator1Transform = useTransform(\n    sheetContext.indicatorRotation,\n    (r) => `translateX(2px) rotate(${r}deg)`\n  );\n\n  const indicator2Transform = useTransform(\n    sheetContext.indicatorRotation,\n    (r) => `translateX(-2px) rotate(${-1 * r}deg)`\n  );\n\n  const isUnstyled = unstyled ?? sheetContext.unstyled;\n\n  const indicatorWrapperStyle = {\n    ...applyStyles(styles.indicatorWrapper, isUnstyled),\n    ...style,\n  };\n\n  const indicatorStyle = applyStyles(styles.indicator, isUnstyled);\n\n  return (\n    <div\n      className={`react-modal-sheet-drag-indicator-container ${className}`}\n      style={indicatorWrapperStyle}\n      {...rest}\n    >\n      <motion.span\n        className=\"react-modal-sheet-drag-indicator\"\n        style={{ ...indicatorStyle, transform: indicator1Transform }}\n      />\n      <motion.span\n        className=\"react-modal-sheet-drag-indicator\"\n        style={{ ...indicatorStyle, transform: indicator2Transform }}\n      />\n    </div>\n  );\n}\n","import { motion } from 'motion/react';\nimport React, { forwardRef } from 'react';\n\nimport { useInternalContext } from './context';\nimport { useDragConstraints } from './hooks/use-drag-constraints';\nimport { SheetDragIndicator } from './sheet-drag-indicator';\nimport { styles } from './styles';\nimport { type SheetHeaderProps } from './types';\nimport { applyStyles, mergeRefs } from './utils';\n\nexport const SheetHeader = forwardRef<any, SheetHeaderProps>(\n  (\n    { children, style, disableDrag, unstyled, className = '', ...rest },\n    ref\n  ) => {\n    const sheetContext = useInternalContext();\n    const dragConstraints = useDragConstraints();\n    const dragProps =\n      disableDrag || sheetContext.disableDrag\n        ? undefined\n        : sheetContext.dragProps;\n\n    const isUnstyled = unstyled ?? sheetContext.unstyled;\n\n    const headerWrapperStyle = {\n      ...applyStyles(styles.headerWrapper, isUnstyled),\n      ...style,\n    };\n\n    const headerStyle = applyStyles(styles.header, isUnstyled);\n\n    return (\n      <motion.div\n        {...rest}\n        ref={mergeRefs([ref, dragConstraints.ref])}\n        style={headerWrapperStyle}\n        className={`react-modal-sheet-header-container ${className}`}\n        {...dragProps}\n        dragConstraints={dragConstraints.ref}\n        onMeasureDragConstraints={dragConstraints.onMeasure}\n      >\n        {children || (\n          <div className=\"react-modal-sheet-header\" style={headerStyle}>\n            <SheetDragIndicator />\n          </div>\n        )}\n      </motion.div>\n    );\n  }\n);\n\nSheetHeader.displayName = 'SheetHeader';\n","import { useExposedContext } from './context';\nimport { Sheet as SheetBase } from './sheet';\nimport { SheetBackdrop } from './sheet-backdrop';\nimport { SheetContainer } from './sheet-container';\nimport { SheetContent } from './sheet-content';\nimport { SheetDragIndicator } from './sheet-drag-indicator';\nimport { SheetHeader } from './sheet-header';\nimport type { ExposedContextType, SheetCompound } from './types';\n\nexport const Sheet: SheetCompound = Object.assign(SheetBase, {\n  Container: SheetContainer,\n  Header: SheetHeader,\n  DragIndicator: SheetDragIndicator,\n  Content: SheetContent,\n  Backdrop: SheetBackdrop,\n  useContext: useExposedContext,\n});\n\nexport { useScrollPosition } from './hooks/use-scroll-position';\nexport { useVirtualKeyboard } from './hooks/use-virtual-keyboard';\n\nexport interface SheetContext extends ExposedContextType {}\nexport interface SheetRef extends ExposedContextType {}\n\nexport type {\n  SheetBackdropProps,\n  SheetContainerProps,\n  SheetContentProps,\n  SheetDetent,\n  SheetDragIndicatorProps,\n  SheetHeaderProps,\n  SheetProps,\n  SheetSnapPoint,\n  SheetStateInfo,\n  SheetTweenConfig,\n} from './types';\n"]}