{"version":3,"file":"index.modern.mjs","sources":["../src/hooks/useLayoutEffect.tsx","../src/utils.ts","../src/hooks/useSnapPoints.tsx","../src/machines/overlay.ts","../src/BottomSheet.tsx","../src/hooks/useReady.tsx","../src/hooks/useSpring.tsx","../src/hooks/useReducedMotion.tsx","../src/hooks/useScrollLock.tsx","../src/hooks/useAriaHider.tsx","../src/hooks/useFocusTrap.tsx","../src/hooks/useSpringInterpolations.tsx","../src/index.tsx"],"sourcesContent":["import { useEffect, useLayoutEffect as useLayoutEffectSafely } from 'react'\n\n// Ensure the name used in components is useLayoutEffect so the eslint react hooks plugin works\nexport const useLayoutEffect =\n  typeof window !== 'undefined' ? useLayoutEffectSafely : useEffect\n","/* eslint-disable no-self-compare */\n\n// stolen from lodash\nexport function clamp(number: number, lower: number, upper: number) {\n  number = +number\n  lower = +lower\n  upper = +upper\n  lower = lower === lower ? lower : 0\n  upper = upper === upper ? upper : 0\n  if (number === number) {\n    number = number <= upper ? number : upper\n    number = number >= lower ? number : lower\n  }\n  return number\n}\n\n// Mwahaha easiest way to filter out NaN I ever saw! >:3\nexport function deleteNaN(arr) {\n  const set = new Set(arr)\n  set.delete(NaN)\n  return [...set]\n}\n\nexport function roundAndCheckForNaN(unrounded) {\n  const rounded = Math.round(unrounded)\n  if (Number.isNaN(unrounded)) {\n    throw new TypeError(\n      'Found a NaN! Check your snapPoints / defaultSnap / snapTo '\n    )\n  }\n\n  return rounded\n}\n\n// Validate, sanitize, round and dedupe snap points, as well as extracting the minSnap and maxSnap points\nexport function processSnapPoints(unsafeSnaps: number | number[], maxHeight) {\n  const safeSnaps = [].concat(unsafeSnaps).map(roundAndCheckForNaN)\n\n  const snapPointsDedupedSet = safeSnaps.reduce((acc, snapPoint) => {\n    acc.add(clamp(snapPoint, 0, maxHeight))\n    return acc\n  }, new Set<number>())\n\n  const snapPoints = Array.from(snapPointsDedupedSet)\n\n  const minSnap = Math.min(...snapPoints)\n  if (Number.isNaN(minSnap)) {\n    throw new TypeError('minSnap is NaN')\n  }\n  const maxSnap = Math.max(...snapPoints)\n  if (Number.isNaN(maxSnap)) {\n    throw new TypeError('maxSnap is NaN')\n  }\n\n  return {\n    snapPoints,\n    minSnap,\n    maxSnap,\n  }\n}\n\nexport const debugging =\n  process.env.NODE_ENV === 'development' && typeof window !== 'undefined'\n    ? window.location.search === '?debug'\n    : false\n","import React, {\n  useCallback,\n  useDebugValue,\n  useEffect,\n  useMemo,\n  useRef,\n  useState,\n} from 'react'\nimport { ResizeObserver, ResizeObserverEntry } from '@juggle/resize-observer'\nimport type { defaultSnapProps, ResizeSource, snapPoints } from '../types'\nimport { processSnapPoints, roundAndCheckForNaN } from '../utils'\nimport { useReady } from './useReady'\nimport { ResizeObserverOptions } from '@juggle/resize-observer/lib/ResizeObserverOptions'\nimport { useLayoutEffect } from './useLayoutEffect'\n\nexport function useSnapPoints({\n  contentRef,\n  controlledMaxHeight,\n  footerEnabled,\n  footerRef,\n  getSnapPoints,\n  headerEnabled,\n  headerRef,\n  heightRef,\n  lastSnapRef,\n  ready,\n  registerReady,\n  resizeSourceRef,\n}: {\n  contentRef: React.RefObject<Element>\n  controlledMaxHeight?: number\n  footerEnabled: boolean\n  footerRef: React.RefObject<Element>\n  getSnapPoints: snapPoints\n  headerEnabled: boolean\n  headerRef: React.RefObject<Element>\n  heightRef: React.RefObject<number>\n  lastSnapRef: React.RefObject<number>\n  ready: boolean\n  registerReady: ReturnType<typeof useReady>['registerReady']\n  resizeSourceRef: React.MutableRefObject<ResizeSource>\n}) {\n  const { maxHeight, minHeight, headerHeight, footerHeight } = useDimensions({\n    contentRef: contentRef,\n    controlledMaxHeight,\n    footerEnabled,\n    footerRef,\n    headerEnabled,\n    headerRef,\n    registerReady,\n    resizeSourceRef,\n  })\n\n  const { snapPoints, minSnap, maxSnap } = processSnapPoints(\n    ready\n      ? getSnapPoints({\n          height: heightRef.current,\n          footerHeight,\n          headerHeight,\n          minHeight,\n          maxHeight,\n        })\n      : [0],\n    maxHeight\n  )\n  //console.log({ snapPoints, minSnap, maxSnap })\n\n  // @TODO investigate the gains from memoizing this\n  function findSnap(\n    numberOrCallback: number | ((state: defaultSnapProps) => number)\n  ) {\n    let unsafeSearch: number\n    if (typeof numberOrCallback === 'function') {\n      unsafeSearch = numberOrCallback({\n        footerHeight,\n        headerHeight,\n        height: heightRef.current,\n        minHeight,\n        maxHeight,\n        snapPoints,\n        lastSnap: lastSnapRef.current,\n      })\n    } else {\n      unsafeSearch = numberOrCallback\n    }\n    const querySnap = roundAndCheckForNaN(unsafeSearch)\n    return snapPoints.reduce(\n      (prev, curr) =>\n        Math.abs(curr - querySnap) < Math.abs(prev - querySnap) ? curr : prev,\n      minSnap\n    )\n  }\n\n  useDebugValue(`minSnap: ${minSnap}, maxSnap:${maxSnap}`)\n\n  return { minSnap, maxSnap, findSnap, maxHeight }\n}\n\nfunction useDimensions({\n  contentRef,\n  controlledMaxHeight,\n  footerEnabled,\n  footerRef,\n  headerEnabled,\n  headerRef,\n  registerReady,\n  resizeSourceRef,\n}: {\n  contentRef: React.RefObject<Element>\n  controlledMaxHeight?: number\n  footerEnabled: boolean\n  footerRef: React.RefObject<Element>\n  headerEnabled: boolean\n  headerRef: React.RefObject<Element>\n  registerReady: ReturnType<typeof useReady>['registerReady']\n  resizeSourceRef: React.MutableRefObject<ResizeSource>\n}) {\n  const setReady = useMemo(() => registerReady('contentHeight'), [\n    registerReady,\n  ])\n  const maxHeight = useMaxHeight(\n    controlledMaxHeight,\n    registerReady,\n    resizeSourceRef\n  )\n\n  // @TODO probably better to forward props instead of checking refs to decide if it's enabled\n  const headerHeight = useElementSizeObserver(headerRef, {\n    label: 'headerHeight',\n    enabled: headerEnabled,\n    resizeSourceRef,\n  })\n  const contentHeight = useElementSizeObserver(contentRef, {\n    label: 'contentHeight',\n    enabled: true,\n    resizeSourceRef,\n  })\n  const footerHeight = useElementSizeObserver(footerRef, {\n    label: 'footerHeight',\n    enabled: footerEnabled,\n    resizeSourceRef,\n  })\n  const minHeight =\n    Math.min(maxHeight - headerHeight - footerHeight, contentHeight) +\n    headerHeight +\n    footerHeight\n\n  useDebugValue(`minHeight: ${minHeight}`)\n\n  const ready = contentHeight > 0\n  useEffect(() => {\n    if (ready) {\n      setReady()\n    }\n  }, [ready, setReady])\n\n  return {\n    maxHeight,\n    minHeight,\n    headerHeight,\n    footerHeight,\n  }\n}\n\nconst observerOptions: ResizeObserverOptions = {\n  // Respond to changes to padding, happens often on iOS when using env(safe-area-inset-bottom)\n  // And the user hides or shows the Safari browser toolbar\n  box: 'border-box',\n}\n/**\n * Hook for determining the size of an element using the Resize Observer API.\n *\n * @param ref - A React ref to an element\n */\nfunction useElementSizeObserver(\n  ref: React.RefObject<Element>,\n  {\n    label,\n    enabled,\n    resizeSourceRef,\n  }: {\n    label: string\n    enabled: boolean\n    resizeSourceRef: React.MutableRefObject<ResizeSource>\n  }\n): number {\n  let [size, setSize] = useState(0)\n\n  useDebugValue(`${label}: ${size}`)\n\n  const handleResize = useCallback(\n    (entries: ResizeObserverEntry[]) => {\n      // we only observe one element, so accessing the first entry here is fine\n      setSize(entries[0].borderBoxSize[0].blockSize)\n      resizeSourceRef.current = 'element'\n    },\n    [resizeSourceRef]\n  )\n\n  useLayoutEffect(() => {\n    if (!ref.current || !enabled) {\n      return\n    }\n\n    const resizeObserver = new ResizeObserver(handleResize)\n    resizeObserver.observe(ref.current, observerOptions)\n\n    return () => {\n      resizeObserver.disconnect()\n    }\n  }, [ref, handleResize, enabled])\n\n  return enabled ? size : 0\n}\n\n// Blazingly keep track of the current viewport height without blocking the thread, keeping that sweet 60fps on smartphones\nfunction useMaxHeight(\n  controlledMaxHeight,\n  registerReady: ReturnType<typeof useReady>['registerReady'],\n  resizeSourceRef: React.MutableRefObject<ResizeSource>\n) {\n  const setReady = useMemo(() => registerReady('maxHeight'), [registerReady])\n  const [maxHeight, setMaxHeight] = useState(() =>\n    roundAndCheckForNaN(controlledMaxHeight) || typeof window !== 'undefined'\n      ? window.innerHeight\n      : 0\n  )\n  const ready = maxHeight > 0\n  const raf = useRef(0)\n\n  useDebugValue(controlledMaxHeight ? 'controlled' : 'auto')\n\n  useEffect(() => {\n    if (ready) {\n      setReady()\n    }\n  }, [ready, setReady])\n\n  useLayoutEffect(() => {\n    // Bail if the max height is a controlled prop\n    if (controlledMaxHeight) {\n      setMaxHeight(roundAndCheckForNaN(controlledMaxHeight))\n      resizeSourceRef.current = 'maxheightprop'\n\n      return\n    }\n\n    const handleResize = () => {\n      if (raf.current) {\n        // bail to throttle the amount of resize changes\n        return\n      }\n\n      // throttle state changes using rAF\n      raf.current = requestAnimationFrame(() => {\n        setMaxHeight(window.innerHeight)\n        resizeSourceRef.current = 'window'\n\n        raf.current = 0\n      })\n    }\n    window.addEventListener('resize', handleResize)\n    setMaxHeight(window.innerHeight)\n    resizeSourceRef.current = 'window'\n    setReady()\n\n    return () => {\n      window.removeEventListener('resize', handleResize)\n      cancelAnimationFrame(raf.current)\n    }\n  }, [controlledMaxHeight, setReady, resizeSourceRef])\n\n  return maxHeight\n}\n","import { Machine, assign } from 'xstate'\n\n// This is the root machine, composing all the other machines and is the brain of the bottom sheet\n\ninterface OverlayStateSchema {\n  states: {\n    // the overlay usually starts in the closed position\n    closed: {}\n    opening: {\n      states: {\n        // Used to fire off the springStart event\n        start: {}\n        // Decide how to transition to the open state based on what the initialState is\n        transition: {}\n        // Fast enter animation, sheet is open by default\n        immediately: {\n          states: {\n            open: {}\n            activating: {}\n          }\n        }\n        smoothly: {\n          states: {\n            // This state only happens when the overlay should start in an open state, instead of animating from the bottom\n            // openImmediately: {}\n            // visuallyHidden will render the overlay in the open state, but with opacity 0\n            // doing this solves two problems:\n            // on Android focusing an input element will trigger the softkeyboard to show up, which will change the viewport height\n            // on iOS the focus event will break the view by triggering a scrollIntoView event if focus happens while the overlay is below the viewport and body got overflow:hidden\n            // by rendering things with opacity 0 we ensure keyboards and scrollIntoView all happen in a way that match up with what the sheet will look like.\n            // we can then move it to the opening position below the viewport, and animate it into view without worrying about height changes or scrolling overflow:hidden events\n            visuallyHidden: {}\n            // In this state we're activating focus traps, scroll locks and more, this will sometimes trigger soft keyboards and scrollIntoView\n            // @TODO we might want to add a delay here before proceeding to open, to give android and iOS enough time to adjust the viewport when focusing an interactive element\n            activating: {}\n            // Animates from the bottom\n            open: {}\n          }\n        }\n        // Used to fire off the springEnd event\n        end: {}\n        // And finally we're ready to transition to open\n        done: {}\n      }\n    }\n    open: {}\n    // dragging responds to user gestures, which may interrupt the opening state, closing state or snapping\n    // when interrupting an opening event, it fires onSpringEnd(OPEN) before onSpringStart(DRAG)\n    // when interrupting a closing event, it fires onSpringCancel(CLOSE) before onSpringStart(DRAG)\n    // when interrupting a dragging event, it fires onSpringCancel(SNAP) before onSpringStart(DRAG)\n    dragging: {}\n    // snapping happens whenever transitioning to a new snap point, often after dragging\n    snapping: {\n      states: {\n        start: {}\n        snappingSmoothly: {}\n        end: {}\n        done: {}\n      }\n    }\n    resizing: {\n      states: {\n        start: {}\n        resizingSmoothly: {}\n        end: {}\n        done: {}\n      }\n    }\n    closing: {\n      states: {\n        start: {}\n        deactivating: {}\n        closingSmoothly: {}\n        end: {}\n        done: {}\n      }\n    }\n  }\n}\n\ntype OverlayEvent =\n  | { type: 'OPEN' }\n  | {\n      type: 'SNAP'\n      payload: {\n        y: number\n        velocity: number\n        source: 'dragging' | 'custom' | string\n      }\n    }\n  | { type: 'CLOSE' }\n  | { type: 'DRAG' }\n  | { type: 'RESIZE' }\n\n// The context (extended state) of the machine\ninterface OverlayContext {\n  initialState: 'OPEN' | 'CLOSED'\n  snapSource?: 'string'\n}\nfunction sleep(ms = 1000) {\n  return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nconst cancelOpen = {\n  CLOSE: { target: '#overlay.closing', actions: 'onOpenCancel' },\n}\nconst openToDrag = {\n  DRAG: { target: '#overlay.dragging', actions: 'onOpenEnd' },\n}\nconst openToResize = {\n  RESIZE: { target: '#overlay.resizing', actions: 'onOpenEnd' },\n}\n\nconst initiallyOpen = ({ initialState }) => initialState === 'OPEN'\nconst initiallyClosed = ({ initialState }) => initialState === 'CLOSED'\n\n// Copy paste the machine into https://xstate.js.org/viz/ to make sense of what's going on in here ;)\n\nexport const overlayMachine = Machine<\n  OverlayContext,\n  OverlayStateSchema,\n  OverlayEvent\n>(\n  {\n    id: 'overlay',\n    initial: 'closed',\n    context: { initialState: 'CLOSED' },\n    states: {\n      closed: { on: { OPEN: 'opening', CLOSE: undefined } },\n      opening: {\n        initial: 'start',\n        states: {\n          start: {\n            invoke: {\n              src: 'onOpenStart',\n              onDone: 'transition',\n            },\n          },\n          transition: {\n            always: [\n              { target: 'immediately', cond: 'initiallyOpen' },\n              { target: 'smoothly', cond: 'initiallyClosed' },\n            ],\n          },\n          immediately: {\n            initial: 'open',\n            states: {\n              open: {\n                invoke: { src: 'openImmediately', onDone: 'activating' },\n              },\n              activating: {\n                invoke: { src: 'activate', onDone: '#overlay.opening.end' },\n                on: { ...openToDrag, ...openToResize },\n              },\n            },\n          },\n          smoothly: {\n            initial: 'visuallyHidden',\n            states: {\n              visuallyHidden: {\n                invoke: { src: 'renderVisuallyHidden', onDone: 'activating' },\n              },\n              activating: {\n                invoke: { src: 'activate', onDone: 'open' },\n              },\n              open: {\n                invoke: { src: 'openSmoothly', onDone: '#overlay.opening.end' },\n                on: { ...openToDrag, ...openToResize },\n              },\n            },\n          },\n          end: {\n            invoke: { src: 'onOpenEnd', onDone: 'done' },\n            on: { CLOSE: '#overlay.closing', DRAG: '#overlay.dragging' },\n          },\n          done: {\n            type: 'final',\n          },\n        },\n        on: { ...cancelOpen },\n        onDone: 'open',\n      },\n      open: {\n        on: { DRAG: '#overlay.dragging', SNAP: 'snapping', RESIZE: 'resizing' },\n      },\n      dragging: {\n        on: { SNAP: 'snapping' },\n      },\n      snapping: {\n        initial: 'start',\n        states: {\n          start: {\n            invoke: {\n              src: 'onSnapStart',\n              onDone: 'snappingSmoothly',\n            },\n            entry: [\n              assign({\n                // @ts-expect-error\n                y: (_, { payload: { y } }) => y,\n                // @ts-expect-error\n                velocity: (_, { payload: { velocity } }) => velocity,\n                // @ts-expect-error\n                snapSource: (_, { payload: { source = 'custom' } }) => source,\n              }),\n            ],\n          },\n          snappingSmoothly: {\n            invoke: { src: 'snapSmoothly', onDone: 'end' },\n          },\n          end: {\n            invoke: { src: 'onSnapEnd', onDone: 'done' },\n            on: {\n              RESIZE: '#overlay.resizing',\n              SNAP: '#overlay.snapping',\n              CLOSE: '#overlay.closing',\n              DRAG: '#overlay.dragging',\n            },\n          },\n          done: { type: 'final' },\n        },\n        on: {\n          SNAP: { target: 'snapping', actions: 'onSnapEnd' },\n          RESIZE: { target: '#overlay.resizing', actions: 'onSnapCancel' },\n          DRAG: { target: '#overlay.dragging', actions: 'onSnapCancel' },\n          CLOSE: { target: '#overlay.closing', actions: 'onSnapCancel' },\n        },\n        onDone: 'open',\n      },\n      resizing: {\n        initial: 'start',\n        states: {\n          start: {\n            invoke: {\n              src: 'onResizeStart',\n              onDone: 'resizingSmoothly',\n            },\n          },\n          resizingSmoothly: {\n            invoke: { src: 'resizeSmoothly', onDone: 'end' },\n          },\n          end: {\n            invoke: { src: 'onResizeEnd', onDone: 'done' },\n            on: {\n              SNAP: '#overlay.snapping',\n              CLOSE: '#overlay.closing',\n              DRAG: '#overlay.dragging',\n            },\n          },\n          done: { type: 'final' },\n        },\n        on: {\n          RESIZE: { target: 'resizing', actions: 'onResizeEnd' },\n          SNAP: { target: 'snapping', actions: 'onResizeCancel' },\n          DRAG: { target: '#overlay.dragging', actions: 'onResizeCancel' },\n          CLOSE: { target: '#overlay.closing', actions: 'onResizeCancel' },\n        },\n        onDone: 'open',\n      },\n      closing: {\n        initial: 'start',\n        states: {\n          start: {\n            invoke: {\n              src: 'onCloseStart',\n              onDone: 'deactivating',\n            },\n            on: { OPEN: { target: '#overlay.open', actions: 'onCloseCancel' } },\n          },\n          deactivating: {\n            invoke: { src: 'deactivate', onDone: 'closingSmoothly' },\n          },\n          closingSmoothly: {\n            invoke: { src: 'closeSmoothly', onDone: 'end' },\n          },\n          end: {\n            invoke: { src: 'onCloseEnd', onDone: 'done' },\n            on: {\n              OPEN: { target: '#overlay.opening', actions: 'onCloseCancel' },\n            },\n          },\n          done: { type: 'final' },\n        },\n        on: {\n          CLOSE: undefined,\n          OPEN: { target: '#overlay.opening', actions: 'onCloseCancel' },\n        },\n        onDone: 'closed',\n      },\n    },\n    on: {\n      CLOSE: 'closing',\n    },\n  },\n  {\n    actions: {\n      onOpenCancel: (context, event) => {\n        console.log('onOpenCancel', { context, event })\n      },\n      onSnapCancel: (context, event) => {\n        console.log('onSnapCancel', { context, event })\n      },\n      onResizeCancel: (context, event) => {\n        console.log('onResizeCancel', { context, event })\n      },\n      onCloseCancel: (context, event) => {\n        console.log('onCloseCancel', { context, event })\n      },\n      onOpenEnd: (context, event) => {\n        console.log('onOpenCancel', { context, event })\n      },\n      onSnapEnd: (context, event) => {\n        console.log('onSnapEnd', { context, event })\n      },\n      onResizeEnd: (context, event) => {\n        console.log('onResizeEnd', { context, event })\n      },\n    },\n    services: {\n      onSnapStart: async () => {\n        await sleep()\n      },\n      onOpenStart: async () => {\n        await sleep()\n      },\n      onCloseStart: async () => {\n        await sleep()\n      },\n      onResizeStart: async () => {\n        await sleep()\n      },\n      onSnapEnd: async () => {\n        await sleep()\n      },\n      onOpenEnd: async () => {\n        await sleep()\n      },\n      onCloseEnd: async () => {\n        await sleep()\n      },\n      onResizeEnd: async () => {\n        await sleep()\n      },\n      renderVisuallyHidden: async (context, event) => {\n        console.group('renderVisuallyHidden')\n        console.log({ context, event })\n        await sleep()\n        console.groupEnd()\n      },\n      activate: async (context, event) => {\n        console.group('activate')\n        console.log({ context, event })\n        await sleep()\n        console.groupEnd()\n      },\n      deactivate: async (context, event) => {\n        console.group('deactivate')\n        console.log({ context, event })\n        await sleep()\n        console.groupEnd()\n      },\n      openSmoothly: async (context, event) => {\n        console.group('openSmoothly')\n        console.log({ context, event })\n        await sleep()\n        console.groupEnd()\n      },\n      openImmediately: async (context, event) => {\n        console.group('openImmediately')\n        console.log({ context, event })\n        await sleep()\n        console.groupEnd()\n      },\n      snapSmoothly: async (context, event) => {\n        console.group('snapSmoothly')\n        console.log({ context, event })\n        await sleep()\n        console.groupEnd()\n      },\n      resizeSmoothly: async (context, event) => {\n        console.group('resizeSmoothly')\n        console.log({ context, event })\n        await sleep()\n        console.groupEnd()\n      },\n      closeSmoothly: async (context, event) => {\n        console.group('closeSmoothly')\n        console.log({ context, event })\n        await sleep()\n        console.groupEnd()\n      },\n    },\n    guards: { initiallyClosed, initiallyOpen },\n  }\n)\n","//\n// In order to greatly reduce complexity this component is designed to always transition to open on mount, and then\n// transition to a closed state later. This ensures that all memory used to keep track of animation and gesture state\n// can be reclaimed after the sheet is closed and then unmounted.\n// It also ensures that when transitioning to open on mount the state is always clean, not affected by previous states that could\n// cause race conditions.\n\nimport { useMachine } from '@xstate/react'\nimport React, {\n  useCallback,\n  useEffect,\n  useImperativeHandle,\n  useRef,\n} from 'react'\nimport { animated, config } from 'react-spring'\nimport { rubberbandIfOutOfBounds, useDrag } from 'react-use-gesture'\nimport {\n  useAriaHider,\n  useFocusTrap,\n  useLayoutEffect,\n  useReady,\n  useReducedMotion,\n  useScrollLock,\n  useSnapPoints,\n  useSpring,\n  useSpringInterpolations,\n} from './hooks'\nimport { overlayMachine } from './machines/overlay'\nimport type {\n  defaultSnapProps,\n  Props,\n  RefHandles,\n  ResizeSource,\n  SnapPointProps,\n} from './types'\nimport { debugging } from './utils'\n\nconst { tension, friction } = config.default\n\n// @TODO implement AbortController to deal with race conditions\n\n// @TODO rename to SpringBottomSheet and allow userland to import it directly, for those who want maximum control and minimal bundlesize\nexport const BottomSheet = React.forwardRef<\n  RefHandles,\n  {\n    initialState: 'OPEN' | 'CLOSED'\n    lastSnapRef: React.MutableRefObject<number | null>\n  } & Props\n>(function BottomSheetInternal(\n  {\n    children,\n    sibling,\n    className,\n    footer,\n    header,\n    open: _open,\n    initialState,\n    lastSnapRef,\n    initialFocusRef,\n    onDismiss,\n    maxHeight: controlledMaxHeight,\n    defaultSnap: getDefaultSnap = _defaultSnap,\n    snapPoints: getSnapPoints = _snapPoints,\n    blocking = true,\n    scrollLocking = true,\n    style,\n    onSpringStart,\n    onSpringCancel,\n    onSpringEnd,\n    reserveScrollBarGap = blocking,\n    expandOnContentDrag = false,\n    disableExpandList = [],\n    preventPullUp = false,\n    ...props\n  },\n  forwardRef\n) {\n  // Before any animations can start we need to measure a few things, like the viewport and the dimensions of content, and header + footer if they exist\n  // @TODO make ready its own state perhaps, before open or closed\n  const { ready, registerReady } = useReady()\n\n  // Controls the drag handler, used by spring operations that happen outside the render loop in React\n  const canDragRef = useRef(false)\n\n  // This way apps don't have to remember to wrap their callbacks in useCallback to avoid breaking the sheet\n  const onSpringStartRef = useRef(onSpringStart)\n  const onSpringCancelRef = useRef(onSpringCancel)\n  const onSpringEndRef = useRef(onSpringEnd)\n  useEffect(() => {\n    onSpringStartRef.current = onSpringStart\n    onSpringCancelRef.current = onSpringCancel\n    onSpringEndRef.current = onSpringEnd\n  }, [onSpringCancel, onSpringStart, onSpringEnd])\n\n  // Behold, the engine of it all!\n  const [spring, set] = useSpring()\n\n  const containerRef = useRef<HTMLDivElement>(null)\n  const scrollRef = useRef<HTMLDivElement>(null)\n  const contentRef = useRef<HTMLDivElement>(null)\n  const headerRef = useRef<HTMLDivElement>(null)\n  const footerRef = useRef<HTMLDivElement>(null)\n  const overlayRef = useRef<HTMLDivElement | null>(null)\n\n  // Keeps track of the current height, or the height transitioning to\n  const heightRef = useRef(0)\n  const resizeSourceRef = useRef<ResizeSource>()\n  const preventScrollingRef = useRef(false)\n\n  const prefersReducedMotion = useReducedMotion()\n\n  // \"Plugins\" huhuhu\n  const scrollLockRef = useScrollLock({\n    targetRef: scrollRef,\n    enabled: ready && scrollLocking,\n    reserveScrollBarGap,\n  })\n  const ariaHiderRef = useAriaHider({\n    targetRef: containerRef,\n    enabled: ready && blocking,\n  })\n  const focusTrapRef = useFocusTrap({\n    targetRef: containerRef,\n    fallbackRef: overlayRef,\n    initialFocusRef: initialFocusRef || undefined,\n    enabled: ready && blocking && initialFocusRef !== false,\n  })\n\n  const { minSnap, maxSnap, maxHeight, findSnap } = useSnapPoints({\n    contentRef,\n    controlledMaxHeight,\n    footerEnabled: !!footer,\n    footerRef,\n    getSnapPoints,\n    headerEnabled: header !== false,\n    headerRef,\n    heightRef,\n    lastSnapRef,\n    ready,\n    registerReady,\n    resizeSourceRef,\n  })\n\n  // Setup refs that are used in cases where full control is needed over when a side effect is executed\n  const maxHeightRef = useRef(maxHeight)\n  const minSnapRef = useRef(minSnap)\n  const maxSnapRef = useRef(maxSnap)\n  const findSnapRef = useRef(findSnap)\n  const defaultSnapRef = useRef(0)\n  // Sync the refs with current state, giving the spring full control over when to respond to changes\n  useLayoutEffect(() => {\n    maxHeightRef.current = maxHeight\n    maxSnapRef.current = maxSnap\n    minSnapRef.current = minSnap\n    findSnapRef.current = findSnap\n    defaultSnapRef.current = findSnap(getDefaultSnap)\n  }, [findSnap, getDefaultSnap, maxHeight, maxSnap, minSnap])\n\n  // New utility for using events safely\n  const asyncSet = useCallback<typeof set>(\n    // @ts-ignore\n    ({ onRest, config: { velocity = 1, ...config } = {}, ...opts }) =>\n      // @ts-expect-error\n      new Promise((resolve) =>\n        set({\n          ...opts,\n          config: {\n            velocity,\n            ...config,\n            // @see https://springs.pomb.us\n            mass: 1,\n            // \"stiffness\"\n            tension,\n            // \"damping\"\n            friction: Math.max(\n              friction,\n              friction + (friction - friction * velocity)\n            ),\n          },\n          onRest: (...args) => {\n            // @ts-expect-error\n            resolve(...args)\n            onRest?.(...args)\n          },\n        })\n      ),\n    [set]\n  )\n  const [current, send] = useMachine(overlayMachine, {\n    devTools: debugging,\n    actions: {\n      onOpenCancel: useCallback(\n        () => onSpringCancelRef.current?.({ type: 'OPEN' }),\n        []\n      ),\n      onSnapCancel: useCallback(\n        (context) =>\n          onSpringCancelRef.current?.({\n            type: 'SNAP',\n            source: context.snapSource,\n          }),\n        []\n      ),\n      onCloseCancel: useCallback(\n        () => onSpringCancelRef.current?.({ type: 'CLOSE' }),\n        []\n      ),\n      onResizeCancel: useCallback(\n        () =>\n          onSpringCancelRef.current?.({\n            type: 'RESIZE',\n            source: resizeSourceRef.current,\n          }),\n        []\n      ),\n      onOpenEnd: useCallback(\n        () => onSpringEndRef.current?.({ type: 'OPEN' }),\n        []\n      ),\n      onSnapEnd: useCallback(\n        (context, event) =>\n          onSpringEndRef.current?.({\n            type: 'SNAP',\n            source: context.snapSource,\n          }),\n        []\n      ),\n      onResizeEnd: useCallback(\n        () =>\n          onSpringEndRef.current?.({\n            type: 'RESIZE',\n            source: resizeSourceRef.current,\n          }),\n        []\n      ),\n    },\n    context: { initialState },\n    services: {\n      onSnapStart: useCallback(\n        async (context, event) =>\n          onSpringStartRef.current?.({\n            type: 'SNAP',\n            source: event.payload.source || 'custom',\n          }),\n        []\n      ),\n      onOpenStart: useCallback(\n        async () => onSpringStartRef.current?.({ type: 'OPEN' }),\n        []\n      ),\n      onCloseStart: useCallback(\n        async () => onSpringStartRef.current?.({ type: 'CLOSE' }),\n        []\n      ),\n      onResizeStart: useCallback(\n        async () =>\n          onSpringStartRef.current?.({\n            type: 'RESIZE',\n            source: resizeSourceRef.current,\n          }),\n        []\n      ),\n      onSnapEnd: useCallback(\n        async (context, event) =>\n          onSpringEndRef.current?.({\n            type: 'SNAP',\n            source: context.snapSource,\n          }),\n        []\n      ),\n      onOpenEnd: useCallback(\n        async () => onSpringEndRef.current?.({ type: 'OPEN' }),\n        []\n      ),\n      onCloseEnd: useCallback(\n        async () => onSpringEndRef.current?.({ type: 'CLOSE' }),\n        []\n      ),\n      onResizeEnd: useCallback(\n        async () =>\n          onSpringEndRef.current?.({\n            type: 'RESIZE',\n            source: resizeSourceRef.current,\n          }),\n        []\n      ),\n      renderVisuallyHidden: useCallback(\n        async (context, event) => {\n          await asyncSet({\n            y: defaultSnapRef.current,\n            ready: 0,\n            maxHeight: maxHeightRef.current,\n            maxSnap: maxSnapRef.current,\n            // Using defaultSnapRef instead of minSnapRef to avoid animating `height` on open\n            minSnap: defaultSnapRef.current,\n            immediate: true,\n          })\n        },\n        [asyncSet]\n      ),\n      activate: useCallback(\n        async (context, event) => {\n          canDragRef.current = true\n          await Promise.all([\n            scrollLockRef.current.activate(),\n            focusTrapRef.current.activate(),\n            ariaHiderRef.current.activate(),\n          ])\n        },\n        [ariaHiderRef, focusTrapRef, scrollLockRef]\n      ),\n      deactivate: useCallback(async () => {\n        scrollLockRef.current.deactivate()\n        focusTrapRef.current.deactivate()\n        ariaHiderRef.current.deactivate()\n        canDragRef.current = false\n      }, [ariaHiderRef, focusTrapRef, scrollLockRef]),\n      openImmediately: useCallback(async () => {\n        heightRef.current = defaultSnapRef.current\n        await asyncSet({\n          y: defaultSnapRef.current,\n          ready: 1,\n          maxHeight: maxHeightRef.current,\n          maxSnap: maxSnapRef.current,\n          // Using defaultSnapRef instead of minSnapRef to avoid animating `height` on open\n          minSnap: defaultSnapRef.current,\n          immediate: true,\n        })\n      }, [asyncSet]),\n      openSmoothly: useCallback(async () => {\n        await asyncSet({\n          y: 0,\n          ready: 1,\n          maxHeight: maxHeightRef.current,\n          maxSnap: maxSnapRef.current,\n          // Using defaultSnapRef instead of minSnapRef to avoid animating `height` on open\n          minSnap: defaultSnapRef.current,\n          immediate: true,\n        })\n\n        heightRef.current = defaultSnapRef.current\n\n        await asyncSet({\n          y: defaultSnapRef.current,\n          ready: 1,\n          maxHeight: maxHeightRef.current,\n          maxSnap: maxSnapRef.current,\n          // Using defaultSnapRef instead of minSnapRef to avoid animating `height` on open\n          minSnap: defaultSnapRef.current,\n          immediate: prefersReducedMotion.current,\n        })\n      }, [asyncSet, prefersReducedMotion]),\n      snapSmoothly: useCallback(\n        async (context, event) => {\n          const snap = findSnapRef.current(context.y)\n          heightRef.current = snap\n          lastSnapRef.current = snap\n          await asyncSet({\n            y: snap,\n            ready: 1,\n            maxHeight: maxHeightRef.current,\n            maxSnap: maxSnapRef.current,\n            minSnap: minSnapRef.current,\n            immediate: prefersReducedMotion.current,\n            config: { velocity: context.velocity },\n          })\n        },\n        [asyncSet, lastSnapRef, prefersReducedMotion]\n      ),\n      resizeSmoothly: useCallback(async () => {\n        const snap = findSnapRef.current(heightRef.current)\n        heightRef.current = snap\n        lastSnapRef.current = snap\n        await asyncSet({\n          y: snap,\n          ready: 1,\n          maxHeight: maxHeightRef.current,\n          maxSnap: maxSnapRef.current,\n          minSnap: minSnapRef.current,\n          immediate:\n            resizeSourceRef.current === 'element'\n              ? prefersReducedMotion.current\n              : true,\n        })\n      }, [asyncSet, lastSnapRef, prefersReducedMotion]),\n      closeSmoothly: useCallback(\n        async (context, event) => {\n          // Avoid animating the height property on close and stay within FLIP bounds by upping the minSnap\n          asyncSet({\n            minSnap: heightRef.current,\n            immediate: true,\n          })\n\n          heightRef.current = 0\n\n          await asyncSet({\n            y: 0,\n            maxHeight: maxHeightRef.current,\n            maxSnap: maxSnapRef.current,\n            immediate: prefersReducedMotion.current,\n          })\n\n          await asyncSet({ ready: 0, immediate: true })\n        },\n        [asyncSet, prefersReducedMotion]\n      ),\n    },\n  })\n\n  useEffect(() => {\n    if (!ready) return\n\n    if (_open) {\n      send('OPEN')\n    } else {\n      send('CLOSE')\n    }\n  }, [_open, send, ready])\n  useLayoutEffect(() => {\n    // Adjust the height whenever the snap points are changed due to resize events\n    if (maxHeight || maxSnap || minSnap) {\n      send('RESIZE')\n    }\n  }, [maxHeight, maxSnap, minSnap, send])\n  useEffect(\n    () => () => {\n      // Ensure effects are cleaned up on unmount, in case they're not cleaned up otherwise\n      scrollLockRef.current.deactivate()\n      focusTrapRef.current.deactivate()\n      ariaHiderRef.current.deactivate()\n    },\n    [ariaHiderRef, focusTrapRef, scrollLockRef]\n  )\n\n  useImperativeHandle(\n    forwardRef,\n    () => ({\n      snapTo: (numberOrCallback, { velocity = 1, source = 'custom' } = {}) => {\n        send('SNAP', {\n          payload: {\n            y: findSnapRef.current(numberOrCallback),\n            velocity,\n            source,\n          },\n        })\n      },\n      get height() {\n        return heightRef.current\n      },\n    }),\n    [send]\n  )\n\n  useEffect(() => {\n    const elem = scrollRef.current\n\n    const preventScrolling = e => {\n      const disableExpandListNodes = disableExpandList.map(selector => containerRef.current.querySelector(selector)).filter(Boolean);\n      if (disableExpandListNodes.length && disableExpandListNodes.some(disableNode => disableNode.contains(e.target))) {\n        return true\n      } else if (preventScrollingRef.current && elem.scrollTop <= 0) {\n        e.preventDefault()\n      }\n    }\n\n    let prevValue = 0;\n    const preventSafariOverscrollOnStart = e => {\n      if (elem.scrollTop < 0) {\n        prevValue = elem.scrollTop;\n      }\n    }\n  \n    const preventSafariOverscrollOnMove = (e) => {\n      if (elem.scrollTop < 0 && elem.scrollTop < prevValue) {\n        e.preventDefault();\n      }\n    };\n\n    if (expandOnContentDrag) {\n      elem.addEventListener('scroll', preventScrolling)\n      elem.addEventListener('touchmove', preventScrolling)\n      elem.addEventListener('touchmove', preventSafariOverscrollOnMove);\n      elem.addEventListener('touchstart', preventSafariOverscrollOnStart, {\n        passive: true\n      });\n    }\n    return () => {\n      elem.removeEventListener('scroll', preventScrolling)\n      elem.removeEventListener('touchmove', preventScrolling)\n      elem.removeEventListener('touchmove', preventSafariOverscrollOnMove);\n      elem.removeEventListener('touchstart', preventSafariOverscrollOnStart);\n    }\n  }, [expandOnContentDrag, scrollRef, disableExpandList])\n\n  const handleDrag = ({\n    args: [{ closeOnTap = false, isContentDragging = false } = {}] = [],\n    cancel,\n    direction: [, direction],\n    down,\n    first,\n    last,\n    memo = spring.y.get(),\n    movement: [, _my],\n    tap,\n    velocity,\n    event,\n  }) => {\n    const my = _my * -1\n    const hasScroll = scrollRef.current.scrollHeight > scrollRef.current.clientHeight;\n    if (containerRef.current && disableExpandList.length) {\n      const disableExpandListNodes = disableExpandList.map(selector => containerRef.current.querySelector(selector)).filter(Boolean);\n      if (disableExpandListNodes.length && disableExpandListNodes.some(disableNode => disableNode.contains(event.target))) {\n        cancel()\n        return memo\n      }\n    }\n    \n    // Cancel the drag operation if the canDrag state changed\n    if (!canDragRef.current) {\n      console.log('handleDrag cancelled dragging because canDragRef is false')\n      cancel()\n      return memo\n    }\n\n    if (onDismiss && closeOnTap && tap) {\n      cancel()\n      // Runs onDismiss in a timeout to avoid tap events on the backdrop from triggering click events on elements underneath\n      setTimeout(() => onDismiss(), 10)\n      return memo\n    }\n\n    // Filter out taps\n    if (tap) {\n      return memo\n    }\n\n    const rawY = memo + my\n    const predictedDistance = my * velocity\n    const predictedY = Math.max(\n      minSnapRef.current,\n      Math.min(maxSnapRef.current, rawY + predictedDistance * 2)\n    )\n\n    if (\n      !down &&\n      onDismiss &&\n      direction > 0 &&\n      rawY + predictedDistance < minSnapRef.current / 2\n      && (!hasScroll || scrollRef.current.scrollTop <= 0)\n    ) {\n      cancel()\n      onDismiss()\n      return memo\n    }\n\n    let newY = down\n      ? // @TODO figure out a better way to deal with rubberband overshooting if min and max have the same value\n        !onDismiss && minSnapRef.current === maxSnapRef.current\n        ? rawY < minSnapRef.current\n          ? rubberbandIfOutOfBounds(\n              rawY,\n              minSnapRef.current,\n              maxSnapRef.current * 2,\n              0.55\n            )\n          : rubberbandIfOutOfBounds(\n              rawY,\n              minSnapRef.current / 2,\n              maxSnapRef.current,\n              0.55\n            )\n        : rubberbandIfOutOfBounds(\n            rawY,\n            onDismiss ? 0 : minSnapRef.current,\n            maxSnapRef.current,\n            0.55\n          )\n      : predictedY\n    \n    if (preventPullUp) {\n      if (direction === 0) {\n        return memo\n      }\n      if ((direction < 0 && newY > maxSnap && _my <= 0) || (direction > 0 && newY > maxSnap && _my <= 0)) {\n        // realize feature: all pop-ups shouldn't be pulled up by certain if it is fully open\n        // if direction up, and newY coordinate >= maxSnap, and distance Y from start point to current point (_my) <= 0 don't change height modal\n        // or if direction down, and newY coordinate >= maxSnap, and distance Y from start point to current point (_my) <= 0 don't change height modal\n        return memo;\n      }\n    }\n\n    if (expandOnContentDrag && isContentDragging) {\n      if (newY >= maxSnapRef.current) {\n        newY = maxSnapRef.current\n      }\n\n      if (memo === maxSnapRef.current && scrollRef.current.scrollTop > 0) {\n        newY = maxSnapRef.current\n      }\n\n      preventScrollingRef.current = newY < maxSnapRef.current;\n    } else {\n      preventScrollingRef.current = false\n    }\n\n    if (first) {\n      send('DRAG')\n    }\n\n    if (last) {\n      send('SNAP', {\n        payload: {\n          y: newY,\n          velocity: velocity > 0.05 ? velocity : 1,\n          source: 'dragging',\n        },\n      })\n\n      return memo\n    }\n\n    // @TODO too many rerenders\n    //send('DRAG', { y: newY, velocity })\n    //*\n    set({\n      y: newY,\n      ready: 1,\n      maxHeight: maxHeightRef.current,\n      maxSnap: maxSnapRef.current,\n      minSnap: minSnapRef.current,\n      immediate: true,\n      config: { velocity },\n    })\n    // */\n\n    return memo\n  }\n\n  const bind = useDrag(handleDrag, {\n    filterTaps: true,\n  })\n\n  if (Number.isNaN(maxSnapRef.current)) {\n    throw new TypeError('maxSnapRef is NaN!!')\n  }\n  if (Number.isNaN(minSnapRef.current)) {\n    throw new TypeError('minSnapRef is NaN!!')\n  }\n\n  const interpolations = useSpringInterpolations({ spring })\n\n  return (\n    <animated.div\n      {...props}\n      data-rsbs-root\n      data-rsbs-state={publicStates.find(current.matches)}\n      data-rsbs-is-blocking={blocking}\n      data-rsbs-is-dismissable={!!onDismiss}\n      data-rsbs-has-header={!!header}\n      data-rsbs-has-footer={!!footer}\n      className={className}\n      ref={containerRef}\n      style={{\n        // spread in the interpolations yeees\n        ...interpolations,\n        // but allow overriding them/disabling them\n        ...style,\n        // Not overridable as the \"focus lock with opacity 0\" trick rely on it\n        // @TODO the line below only fails on TS <4\n        // @ts-ignore\n        opacity: spring.ready,\n      }}\n    >\n      {sibling}\n      {blocking && (\n        <div\n          // This component needs to be placed outside bottom-sheet, as bottom-sheet uses transform and thus creates a new context\n          // that clips this element to the container, not allowing it to cover the full page.\n          key=\"backdrop\"\n          data-rsbs-backdrop\n          {...bind({ closeOnTap: true })}\n        />\n      )}\n      <div\n        key=\"overlay\"\n        aria-modal=\"true\"\n        role=\"dialog\"\n        data-rsbs-overlay\n        tabIndex={-1}\n        ref={overlayRef}\n        onKeyDown={(event) => {\n          if (event.key === 'Escape') {\n            // Always stop propagation, to avoid weirdness for bottom sheets inside other bottom sheets\n            event.stopPropagation()\n            if (onDismiss) onDismiss()\n          }\n        }}\n      >\n        {header !== false && (\n          <div key=\"header\" data-rsbs-header ref={headerRef} {...bind()}>\n            {header}\n          </div>\n        )}\n        <div key=\"scroll\" data-rsbs-scroll ref={scrollRef} {...(expandOnContentDrag ? bind({ isContentDragging: true }) : {})}>\n          <div data-rsbs-content ref={contentRef}>\n            {children}\n          </div>\n        </div>\n        {footer && (\n          <div key=\"footer\" ref={footerRef} data-rsbs-footer {...bind()}>\n            {footer}\n          </div>\n        )}\n      </div>\n    </animated.div>\n  )\n})\n\n// Used for the data attribute, list over states available to CSS selectors\nconst publicStates = [\n  'closed',\n  'opening',\n  'open',\n  'closing',\n  'dragging',\n  'snapping',\n  'resizing',\n]\n\n// Default prop values that are callbacks, and it's nice to save some memory and reuse their instances since they're pure\nfunction _defaultSnap({ snapPoints, lastSnap }: defaultSnapProps) {\n  return lastSnap ?? Math.min(...snapPoints)\n}\nfunction _snapPoints({ minHeight }: SnapPointProps) {\n  return minHeight\n}\n","// Keeps track of wether everything is good to go or not, in the most efficient way possible\n\nimport { useCallback, useEffect, useState } from 'react'\n\nexport function useReady() {\n  const [ready, setReady] = useState(false)\n  const [readyMap, updateReadyMap] = useState<{ [key: string]: boolean }>({})\n\n  const registerReady = useCallback((key: string) => {\n    console.count(`registerReady:${key}`)\n    // Register the check we're gonna wait for until it's ready\n    updateReadyMap((ready) => ({ ...ready, [key]: false }))\n\n    return () => {\n      console.count(`setReady:${key}`)\n      // Set it to ready\n      updateReadyMap((ready) => ({ ...ready, [key]: true }))\n    }\n  }, [])\n\n  useEffect(() => {\n    const states = Object.values(readyMap)\n\n    if (states.length === 0) {\n      console.log('nope nothing registered yet')\n      return\n    }\n\n    const isReady = states.every(Boolean)\n    console.log('check if we are rready', readyMap, isReady)\n    if (isReady) {\n      console.warn('ready!')\n      setReady(true)\n    }\n  }, [readyMap])\n\n  return { ready, registerReady }\n}\n","import { useSpring as useReactSpring } from 'react-spring'\n\n// Behold, the engine of it all!\n// Put in this file befause it makes it easier to type and I'm lazy! :D\n\nexport function useSpring() {\n  return useReactSpring(() => ({\n    y: 0,\n    ready: 0,\n    maxHeight: 0,\n    minSnap: 0,\n    maxSnap: 0,\n  }))\n}\n\nexport type Spring = ReturnType<typeof useSpring>[0]\nexport type SpringSet = ReturnType<typeof useSpring>[1]\n","import { useDebugValue, useEffect, useMemo, useRef } from 'react'\n\n// @TODO refactor to addEventListener\nexport function useReducedMotion() {\n  const mql = useMemo(\n    () =>\n      typeof window !== 'undefined'\n        ? window.matchMedia('(prefers-reduced-motion: reduce)')\n        : null,\n    []\n  )\n  const ref = useRef(mql?.matches)\n\n  useDebugValue(ref.current ? 'reduce' : 'no-preference')\n\n  useEffect(() => {\n    const handler = (event) => {\n      ref.current = event.matches\n    }\n    mql?.addListener(handler)\n\n    return () => mql?.removeListener(handler)\n  }, [mql])\n\n  return ref\n}\n","import { disableBodyScroll, enableBodyScroll } from 'body-scroll-lock'\nimport { useDebugValue, useEffect, useRef } from 'react'\n\n/**\n * Handle scroll locking to ensure a good dragging experience on Android and iOS.\n *\n * On iOS the following may happen if scroll isn't locked:\n * - When dragging the sheet the background gets dragged at the same time.\n * - When dragging the page scroll is also affected, causing the drag to feel buggy and \"slow\".\n *\n * On Android it causes the chrome toolbar to pop down as you drag down, and hide as you drag up.\n * When it's in between two toolbar states it causes the framerate to drop way below 60fps on\n * the bottom sheet drag interaction.\n */\nexport function useScrollLock({\n  targetRef,\n  enabled,\n  reserveScrollBarGap,\n}: {\n  targetRef: React.RefObject<Element>\n  enabled: boolean\n  reserveScrollBarGap: boolean\n}) {\n  const ref = useRef<{ activate: () => void; deactivate: () => void }>({\n    activate: () => {\n      throw new TypeError('Tried to activate scroll lock too early')\n    },\n    deactivate: () => {},\n  })\n\n  useDebugValue(enabled ? 'Enabled' : 'Disabled')\n\n  useEffect(() => {\n    if (!enabled) {\n      ref.current.deactivate()\n      ref.current = { activate: () => {}, deactivate: () => {} }\n      return\n    }\n\n    const target = targetRef.current\n    let active = false\n\n    ref.current = {\n      activate: () => {\n        if (active) return\n        active = true\n        disableBodyScroll(target, {\n          allowTouchMove: (el) => el.closest('[data-body-scroll-lock-ignore]'),\n          reserveScrollBarGap,\n        })\n      },\n      deactivate: () => {\n        if (!active) return\n        active = false\n        enableBodyScroll(target)\n      },\n    }\n  }, [enabled, targetRef, reserveScrollBarGap])\n\n  return ref\n}\n","import React, { useDebugValue, useEffect, useRef } from 'react'\n\n// Handle hiding and restoring aria-hidden attributes\nexport function useAriaHider({\n  targetRef,\n  enabled,\n}: {\n  targetRef: React.RefObject<Element>\n  enabled: boolean\n}) {\n  const ref = useRef<{ activate: () => void; deactivate: () => void }>({\n    activate: () => {\n      throw new TypeError('Tried to activate aria hider too early')\n    },\n    deactivate: () => {},\n  })\n\n  useDebugValue(enabled ? 'Enabled' : 'Disabled')\n\n  useEffect(() => {\n    if (!enabled) {\n      ref.current.deactivate()\n      ref.current = { activate: () => {}, deactivate: () => {} }\n      return\n    }\n\n    const target = targetRef.current\n    let active = false\n    let originalValues: (null | string)[] = []\n    let rootNodes: Element[] = []\n\n    ref.current = {\n      activate: () => {\n        if (active) return\n        active = true\n\n        const parentNode = target.parentNode\n\n        document.querySelectorAll('body > *').forEach((node) => {\n          if (node === parentNode) {\n            return\n          }\n          let attr = node.getAttribute('aria-hidden')\n          let alreadyHidden = attr !== null && attr !== 'false'\n          if (alreadyHidden) {\n            return\n          }\n          originalValues.push(attr)\n          rootNodes.push(node)\n          node.setAttribute('aria-hidden', 'true')\n        })\n      },\n      deactivate: () => {\n        if (!active) return\n        active = false\n\n        rootNodes.forEach((node, index) => {\n          let originalValue = originalValues[index]\n          if (originalValue === null) {\n            node.removeAttribute('aria-hidden')\n          } else {\n            node.setAttribute('aria-hidden', originalValue)\n          }\n        })\n        originalValues = []\n        rootNodes = []\n      },\n    }\n  }, [targetRef, enabled])\n\n  return ref\n}\n","import { createFocusTrap } from 'focus-trap'\nimport { useDebugValue, useEffect, useRef } from 'react'\n\nexport function useFocusTrap({\n  targetRef,\n  fallbackRef,\n  initialFocusRef,\n  enabled,\n}: {\n  targetRef: React.RefObject<HTMLElement>\n  fallbackRef: React.RefObject<HTMLElement>\n  initialFocusRef?: React.RefObject<HTMLElement>\n  enabled: boolean\n}) {\n  const ref = useRef<{ activate: () => void; deactivate: () => void }>({\n    activate: () => {\n      throw new TypeError('Tried to activate focus trap too early')\n    },\n    deactivate: () => {},\n  })\n\n  useDebugValue(enabled ? 'Enabled' : 'Disabled')\n\n  useEffect(() => {\n    if (!enabled) {\n      ref.current.deactivate()\n      ref.current = { activate: () => {}, deactivate: () => {} }\n      return\n    }\n\n    const fallback = fallbackRef.current\n    const trap = createFocusTrap(targetRef.current, {\n      onActivate:\n        process.env.NODE_ENV !== 'production'\n          ? () => {\n              console.log('focus activate')\n            }\n          : undefined,\n      // If initialFocusRef is manually specified we don't want the first tabbable element to receive focus if initialFocusRef can't be found\n      initialFocus: initialFocusRef\n        ? () => initialFocusRef?.current || fallback\n        : undefined,\n      fallbackFocus: fallback,\n      escapeDeactivates: false,\n      clickOutsideDeactivates: false,\n    })\n    let active = false\n\n    ref.current = {\n      activate: async () => {\n        if (active) return\n        active = true\n\n        await trap.activate()\n        // it's difficult to know exactly when focus is udpated https://github.com/focus-trap/focus-trap/blob/036a72ec48b85414dda00ec0c40d631c8f0ae5ce/index.js#L369-L371\n        // This timeout is attempting to compromise between a reasonable guess, as well as not delaying the open transition more than necessary\n        await new Promise((resolve) => setTimeout(() => resolve(void 1), 0))\n      },\n      deactivate: () => {\n        if (!active) return\n        active = false\n\n        trap.deactivate()\n      },\n    }\n  }, [enabled, fallbackRef, initialFocusRef, targetRef])\n\n  return ref\n}\n","import { to } from 'react-spring'\nimport type { Spring } from './useSpring'\nimport { clamp } from '../utils'\n\n// It's a bit easier to ensure interpolations don't accidentally use the wrong variables by\n// putting them here, in their own closure with explicitly defined variables used\n\n// Note that the callbacks in the interpolation functions close over their scope every time react renders\n// so it's important that if anything can change outside of render that needs to be available\n// in the interpolation then a ref must be used\n\nexport function useSpringInterpolations({\n  spring,\n}: {\n  spring: Spring\n}): React.CSSProperties {\n  // This effect is for removing rounded corners on phones when the sheet touches the top of the browser chrome\n  // as it's really ugly with the gaps border radius creates. This ensures it looks sleek.\n  // @TODO the ts-ignore comments are because the `extrapolate` param isn't in the TS defs for some reason\n  const interpolateBorderRadius = to(\n    [spring.y, spring.maxHeight],\n    (y, maxHeight) => {\n      return `${Math.round(clamp(maxHeight - y, 0, 16))}px`\n    }\n  )\n\n  /*\n   * Only animate the height when absolute necessary\n   * @TODO currently it's only able to opt out of changing the height if there's just a single snapshot\n   *       but it should be possible to do it in other scenarios too, like on window resize,\n   *       or maybe even while dragging, but probably requires a more restrictive CSS.\n   *       As in now the sticky footer isn't overlapping the content, allowing `backdrop-filter: blur(8px)` effects.\n   *       A FLIP resize flow for content height would likely require the sticky elements to overlap the content area.\n   *       Could be done as a separat mode though, or a separate example CSS for max performance.\n   */\n  const interpolateHeight = to(\n    [spring.y, spring.minSnap, spring.maxSnap],\n    (y, minSnap, maxSnap) => `${clamp(y, minSnap, maxSnap)}px`\n  )\n\n  const interpolateY = to(\n    [spring.y, spring.minSnap, spring.maxSnap],\n    (y, minSnap, maxSnap) => {\n      if (y < minSnap) {\n        return `${minSnap - y}px`\n      }\n      if (y > maxSnap) {\n        return `${maxSnap - y}px`\n      }\n      return '0px'\n    }\n  )\n\n  const interpolateFiller = to(\n    [spring.y, spring.maxSnap],\n    (y, maxSnap) => {\n      if (y >= maxSnap) {\n        return Math.ceil(y - maxSnap)\n      }\n      return 0\n    }\n  )\n\n  const interpolateContentOpacity = to(\n    [spring.y, spring.minSnap],\n    (y, minSnap) => {\n      if (!minSnap) {\n        return 0\n      }\n      const minX = Math.max(minSnap / 2 - 45, 0)\n      const maxX = Math.min(minSnap / 2 + 45, minSnap)\n      const minY = 0\n      const maxY = 1\n\n      const slope = (maxY - minY) / (maxX - minX)\n      const res = (y - minX) * (slope + minY)\n      return clamp(res, 0, 1)\n    }\n  )\n\n  const interpolateBackdrop = to(\n    [spring.y, spring.minSnap],\n    (y, minSnap) => (minSnap ? clamp(y / minSnap, 0, 1) : 0)\n  )\n\n  return {\n    // Fancy content fade-in effect\n    ['--rsbs-content-opacity' as any]: interpolateContentOpacity,\n    // Fading in the backdrop\n    ['--rsbs-backdrop-opacity' as any]: interpolateBackdrop,\n    // Scaling the antigap in the bottom\n    ['--rsbs-antigap-scale-y' as any]: interpolateFiller,\n    // Shifts the position of the bottom sheet, used on open and close primarily as snap point changes usually only interpolate the height\n    ['--rsbs-overlay-translate-y' as any]: interpolateY,\n    // Remove rounded borders when full height, it looks much better this way\n    ['--rsbs-overlay-rounded' as any]: interpolateBorderRadius,\n    // Animates the height state, not the most performant way but it's the safest with regards to mobile browser and focus/scrolling that could happen while animating\n    ['--rsbs-overlay-h' as any]: interpolateHeight,\n  }\n}\n","/* eslint-disable react/jsx-pascal-case */\nimport * as Portal from '@radix-ui/react-portal';\nimport React, { forwardRef, useRef, useState, useCallback } from 'react'\nimport { BottomSheet as _BottomSheet } from './BottomSheet'\nimport type { Props, RefHandles, SpringEvent } from './types'\nimport { useLayoutEffect } from './hooks'\n\nexport type {\n  RefHandles as BottomSheetRef,\n  Props as BottomSheetProps,\n} from './types'\n\n// Because SSR is annoying to deal with, and all the million complaints about window, navigator and dom elenents!\nexport const BottomSheet = forwardRef<RefHandles, Props>(function BottomSheet(\n  { onSpringStart, onSpringEnd, skipInitialTransition, ...props },\n  ref\n) {\n  // Mounted state, helps SSR but also ensures you can't tab into the sheet while it's closed, or nav there in a screen reader\n  const [mounted, setMounted] = useState(false)\n  const timerRef = useRef<ReturnType<typeof requestAnimationFrame>>()\n  // The last point that the user snapped to, useful for open/closed toggling and the user defined height is remembered\n  const lastSnapRef = useRef(null)\n  // @TODO refactor to an initialState: OPEN | CLOSED property as it's much easier to understand\n  // And informs what we should animate from. If the sheet is mounted with open = true, then initialState = OPEN.\n  // When initialState = CLOSED, then internal sheet must first render with open={false} before setting open={props.open}\n  // It's only when initialState and props.open is mismatching that a intial transition should happen\n  // If they match then transitions will only happen when a user interaction or resize event happen.\n  const initialStateRef = useRef<'OPEN' | 'CLOSED'>(\n    skipInitialTransition && props.open ? 'OPEN' : 'CLOSED'\n  )\n\n  // Using layout effect to support cases where the bottom sheet have to appear already open, no transition\n  useLayoutEffect(() => {\n    if (props.open) {\n      cancelAnimationFrame(timerRef.current)\n      setMounted(true)\n\n      // Cleanup defaultOpen state on close\n      return () => {\n        initialStateRef.current = 'CLOSED'\n      }\n    }\n  }, [props.open])\n\n  const handleSpringStart = useCallback(\n    async function handleSpringStart(event: SpringEvent) {\n      // Forward the event\n      await onSpringStart?.(event)\n\n      if (event.type === 'OPEN') {\n        // Ensures that when it's opening we abort any pending unmount action\n        cancelAnimationFrame(timerRef.current)\n      }\n    },\n    [onSpringStart]\n  )\n\n  const handleSpringEnd = useCallback(\n    async function handleSpringEnd(event: SpringEvent) {\n      // Forward the event\n      await onSpringEnd?.(event)\n\n      if (event.type === 'CLOSE') {\n        // Unmount from the dom to avoid contents being tabbable or visible to screen readers while closed\n        timerRef.current = requestAnimationFrame(() => setMounted(false))\n      }\n    },\n    [onSpringEnd]\n  )\n\n  // This isn't just a performance optimization, it's also to avoid issues when running a non-browser env like SSR\n  if (!mounted) {\n    return null\n  }\n\n  return (\n    <Portal.Root data-rsbs-portal>\n      <_BottomSheet\n        {...props}\n        lastSnapRef={lastSnapRef}\n        ref={ref}\n        initialState={initialStateRef.current}\n        onSpringStart={handleSpringStart}\n        onSpringEnd={handleSpringEnd}\n      />\n    </Portal.Root>\n  )\n})\n"],"names":["useLayoutEffect","window","useLayoutEffectSafely","useEffect","clamp","number","lower","upper","roundAndCheckForNaN","unrounded","rounded","Math","round","Number","isNaN","TypeError","observerOptions","box","useElementSizeObserver","ref","label","enabled","resizeSourceRef","size","setSize","useState","useDebugValue","handleResize","useCallback","entries","borderBoxSize","blockSize","current","resizeObserver","ResizeObserver","observe","disconnect","sleep","ms","Promise","resolve","setTimeout","openToDrag","DRAG","target","actions","openToResize","RESIZE","overlayMachine","Machine","id","initial","context","initialState","states","closed","on","OPEN","CLOSE","undefined","opening","start","invoke","src","onDone","transition","always","cond","immediately","open","activating","_extends","smoothly","visuallyHidden","end","done","type","SNAP","dragging","snapping","entry","assign","y","_","payload","velocity","snapSource","source","snappingSmoothly","resizing","resizingSmoothly","closing","deactivating","closingSmoothly","onOpenCancel","event","onSnapCancel","onResizeCancel","onCloseCancel","onOpenEnd","onSnapEnd","onResizeEnd","services","onSnapStart","async","onOpenStart","onCloseStart","onResizeStart","onCloseEnd","renderVisuallyHidden","activate","deactivate","openSmoothly","openImmediately","snapSmoothly","resizeSmoothly","closeSmoothly","guards","initiallyClosed","initiallyOpen","tension","friction","config","default","BottomSheet","React","forwardRef","_ref","children","sibling","className","footer","header","_open","lastSnapRef","initialFocusRef","onDismiss","maxHeight","controlledMaxHeight","defaultSnap","getDefaultSnap","_defaultSnap","snapPoints","getSnapPoints","_snapPoints","blocking","scrollLocking","style","onSpringStart","onSpringCancel","onSpringEnd","reserveScrollBarGap","expandOnContentDrag","disableExpandList","preventPullUp","props","_objectWithoutPropertiesLoose","_excluded","ready","registerReady","setReady","readyMap","updateReadyMap","key","Object","values","length","every","Boolean","useReady","canDragRef","useRef","onSpringStartRef","onSpringCancelRef","onSpringEndRef","spring","set","useReactSpring","minSnap","maxSnap","containerRef","scrollRef","contentRef","headerRef","footerRef","overlayRef","heightRef","preventScrollingRef","prefersReducedMotion","mql","useMemo","matchMedia","matches","handler","addListener","removeListener","useReducedMotion","scrollLockRef","targetRef","active","disableBodyScroll","allowTouchMove","el","closest","enableBodyScroll","useScrollLock","ariaHiderRef","originalValues","rootNodes","parentNode","document","querySelectorAll","forEach","node","attr","getAttribute","push","setAttribute","index","originalValue","removeAttribute","useAriaHider","focusTrapRef","fallbackRef","fallback","trap","createFocusTrap","onActivate","initialFocus","fallbackFocus","escapeDeactivates","clickOutsideDeactivates","useFocusTrap","findSnap","footerEnabled","headerEnabled","minHeight","headerHeight","footerHeight","setMaxHeight","innerHeight","raf","requestAnimationFrame","addEventListener","removeEventListener","cancelAnimationFrame","useMaxHeight","contentHeight","min","useDimensions","unsafeSnaps","snapPointsDedupedSet","concat","map","reduce","acc","snapPoint","add","Set","Array","from","max","processSnapPoints","height","numberOrCallback","unsafeSearch","lastSnap","querySnap","prev","curr","abs","useSnapPoints","maxHeightRef","minSnapRef","maxSnapRef","findSnapRef","defaultSnapRef","asyncSet","_ref2","onRest","_excluded2","opts","_excluded3","mass","args","send","useMachine","devTools","immediate","all","snap","useImperativeHandle","snapTo","elem","preventScrolling","e","disableExpandListNodes","selector","querySelector","filter","some","disableNode","contains","scrollTop","preventDefault","prevValue","preventSafariOverscrollOnStart","preventSafariOverscrollOnMove","passive","bind","useDrag","handleDrag","closeOnTap","isContentDragging","cancel","direction","down","first","last","memo","get","movement","_my","tap","my","hasScroll","scrollHeight","clientHeight","rawY","predictedDistance","predictedY","newY","rubberbandIfOutOfBounds","filterTaps","interpolations","interpolateBorderRadius","to","interpolateHeight","interpolateY","interpolateFiller","ceil","minX","useSpringInterpolations","createElement","animated","div","publicStates","find","opacity","role","tabIndex","onKeyDown","stopPropagation","skipInitialTransition","mounted","setMounted","timerRef","initialStateRef","handleSpringStart","handleSpringEnd","Portal","Root","_BottomSheet"],"mappings":"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"}