@nipe-solutions/react-spring-bottom-sheet
Version:
Accessible and composable bottom sheets for React
1 lines • 114 kB
Source Map (JSON)
{"version":3,"file":"index.cjs","names":[],"sources":["../src/composition/merge-refs.ts","../src/composition/Slot.tsx","../src/context/sheet-context.ts","../src/components/Backdrop.tsx","../src/components/Close.tsx","../src/accessibility/focus.ts","../src/accessibility/isolation.ts","../src/components/Content.tsx","../src/components/Description.tsx","../src/layout/reconcile-active-snap-point.ts","../src/controller/reducer.ts","../src/controller/invariants.ts","../src/controller/create-controller.ts","../src/hooks/use-reduced-motion.ts","../src/gestures/velocity.ts","../src/gestures/pointer-session.ts","../src/gestures/resistance.ts","../src/gestures/scroll-boundary.ts","../src/layout/select-settle-target.ts","../src/hooks/use-sheet-interactions.ts","../src/layout/observe-layout.ts","../src/layout/resolve-snap-points.ts","../src/hooks/use-sheet-layout.ts","../src/hooks/use-sheet-motion.ts","../node_modules/motion-utils/dist/es/clamp.mjs","../node_modules/motion-utils/dist/es/format-error-message.mjs","../node_modules/motion-utils/dist/es/errors.mjs","../node_modules/motion-utils/dist/es/time-conversion.mjs","../node_modules/motion-dom/dist/es/animation/waapi/utils/linear.mjs","../node_modules/motion-dom/dist/es/animation/generators/utils/calc-duration.mjs","../node_modules/motion-dom/dist/es/animation/generators/utils/create-generator-easing.mjs","../node_modules/motion-dom/dist/es/animation/generators/spring.mjs","../src/motion/motion-adapter.ts","../src/components/Root.tsx","../src/components/Title.tsx","../src/components/Trigger.tsx","../src/components/Viewport.tsx","../src/components/Handle.tsx","../src/components/Portal.tsx","../src/components/Sheet.ts","../src/components/BottomSheet.tsx"],"sourcesContent":["import type { Ref, RefCallback } from 'react'\n\ntype RefCleanup = () => void\n\nfunction assignRef<T>(\n ref: Ref<T> | undefined,\n value: T | null,\n): RefCleanup | undefined {\n if (typeof ref === 'function') {\n const cleanup = ref(value)\n if (value === null) return undefined\n return typeof cleanup === 'function' ? cleanup : () => ref(null)\n }\n if (ref) {\n ref.current = value\n if (value !== null) return () => (ref.current = null)\n }\n return undefined\n}\n\nexport function mergeRefs<T>(\n ...refs: Array<Ref<T> | undefined>\n): RefCallback<T> {\n return (value) => {\n const cleanups = refs\n .map((ref) => assignRef(ref, value))\n .filter((cleanup): cleanup is RefCleanup => cleanup !== undefined)\n if (value !== null && cleanups.length > 0)\n return () => {\n for (const cleanup of cleanups) cleanup()\n }\n }\n}\n","import { Children, cloneElement, forwardRef, isValidElement } from 'react'\nimport type {\n CSSProperties,\n HTMLAttributes,\n MouseEventHandler,\n PointerEventHandler,\n ReactElement,\n Ref,\n} from 'react'\nimport { mergeRefs } from './merge-refs.js'\n\ninterface SlotChildProps extends HTMLAttributes<HTMLElement> {\n ref?: Ref<HTMLElement>\n}\n\nexport interface SlotProps extends HTMLAttributes<HTMLElement> {\n children: ReactElement<SlotChildProps>\n}\n\nexport const Slot = forwardRef<HTMLElement, SlotProps>(function Slot(\n {\n children,\n className,\n onClick,\n onPointerCancel,\n onPointerDown,\n onPointerMove,\n onPointerUp,\n style,\n ...props\n },\n forwardedRef,\n) {\n const child = Children.only(children)\n if (!isValidElement<SlotChildProps>(child)) {\n throw new Error('asChild requires exactly one valid element')\n }\n\n const childClick = child.props.onClick as\n MouseEventHandler<HTMLElement> | undefined\n const mergedClick: MouseEventHandler<HTMLElement> = (event) => {\n childClick?.(event)\n if (!event.defaultPrevented) onClick?.(event)\n }\n const mergePointerHandler =\n (\n childHandler: PointerEventHandler<HTMLElement> | undefined,\n slotHandler: PointerEventHandler<HTMLElement> | undefined,\n ): PointerEventHandler<HTMLElement> =>\n (event) => {\n childHandler?.(event)\n if (!event.defaultPrevented) slotHandler?.(event)\n }\n const mergedStyle: CSSProperties = { ...style, ...child.props.style }\n\n return cloneElement(child, {\n ...props,\n ...child.props,\n className:\n [className, child.props.className].filter(Boolean).join(' ') || undefined,\n onClick: mergedClick,\n onPointerCancel: mergePointerHandler(\n child.props.onPointerCancel,\n onPointerCancel,\n ),\n onPointerDown: mergePointerHandler(\n child.props.onPointerDown,\n onPointerDown,\n ),\n onPointerMove: mergePointerHandler(\n child.props.onPointerMove,\n onPointerMove,\n ),\n onPointerUp: mergePointerHandler(child.props.onPointerUp, onPointerUp),\n ref: mergeRefs(forwardedRef, child.props.ref),\n style: mergedStyle,\n })\n})\n","import { createContext, useContext } from 'react'\nimport type { PointerEventHandler } from 'react'\nimport type { TransitionPhase } from '../controller/types.js'\nimport type { OpenChangeReason } from '../public-types.js'\n\nexport interface SheetContextValue {\n open: boolean\n present: boolean\n transitionPhase: TransitionPhase\n modal: boolean\n dismissible: boolean\n titleId: string | undefined\n descriptionId: string | undefined\n requestOpenChange(open: boolean, reason: OpenChangeReason): void\n registerTitle(id: string): () => void\n registerDescription(id: string): () => void\n registerViewport(element: HTMLElement | null): void\n registerContent(element: HTMLElement | null): void\n registerBackdrop(element: HTMLElement | null): void\n interactionHandlers: {\n onPointerDown: PointerEventHandler<HTMLElement>\n onPointerMove: PointerEventHandler<HTMLElement>\n onPointerUp: PointerEventHandler<HTMLElement>\n onPointerCancel: PointerEventHandler<HTMLElement>\n }\n position: number\n surfaceProgress: number\n dragging: boolean\n}\n\nexport const SheetContext = createContext<SheetContextValue | null>(null)\n\nexport function useSheetContext(component: string): SheetContextValue {\n const context = useContext(SheetContext)\n if (!context) throw new Error(`${component} must be used inside Sheet.Root`)\n return context\n}\n","import { forwardRef, useMemo } from 'react'\nimport type { HTMLAttributes, MouseEvent, Ref } from 'react'\nimport { Slot } from '../composition/Slot.js'\nimport type { SlotProps } from '../composition/Slot.js'\nimport { mergeRefs } from '../composition/merge-refs.js'\nimport { useSheetContext } from '../context/sheet-context.js'\n\nexport type SheetBackdropProps = HTMLAttributes<HTMLDivElement> & {\n asChild?: boolean\n}\n\nexport const Backdrop = forwardRef<HTMLDivElement, SheetBackdropProps>(\n function Backdrop(\n { asChild = false, children, className, onClick, ...props },\n ref,\n ) {\n const {\n dismissible,\n registerBackdrop,\n requestOpenChange,\n transitionPhase,\n } = useSheetContext('Sheet.Backdrop')\n const mergedRef = useMemo(\n () => mergeRefs(registerBackdrop, ref as Ref<HTMLElement>),\n [ref, registerBackdrop],\n )\n const shared = {\n ...props,\n className: ['rsbs-backdrop', className].filter(Boolean).join(' '),\n 'data-rsbs-backdrop': '',\n 'data-rsbs-state': transitionPhase,\n onClick: (event: MouseEvent<HTMLElement>) => {\n onClick?.(event as MouseEvent<HTMLDivElement>)\n if (\n dismissible &&\n event.target === event.currentTarget &&\n !event.defaultPrevented\n )\n requestOpenChange(false, 'backdrop')\n },\n }\n return asChild ? (\n <Slot {...shared} ref={mergedRef}>\n {children as SlotProps['children']}\n </Slot>\n ) : (\n <div {...shared} ref={mergedRef as Ref<HTMLDivElement>}>\n {children}\n </div>\n )\n },\n)\n","import { forwardRef } from 'react'\nimport type { ButtonHTMLAttributes, MouseEvent, Ref } from 'react'\nimport { Slot } from '../composition/Slot.js'\nimport type { SlotProps } from '../composition/Slot.js'\nimport { useSheetContext } from '../context/sheet-context.js'\n\nexport type SheetCloseProps = ButtonHTMLAttributes<HTMLButtonElement> & {\n asChild?: boolean\n}\n\nexport const Close = forwardRef<HTMLButtonElement, SheetCloseProps>(\n function Close(\n {\n asChild = false,\n children,\n className,\n onClick,\n type = 'button',\n ...props\n },\n ref,\n ) {\n const { requestOpenChange } = useSheetContext('Sheet.Close')\n const shared = {\n ...props,\n className: ['rsbs-close', className].filter(Boolean).join(' '),\n 'data-rsbs-close': '',\n onClick: (event: MouseEvent<HTMLElement>) => {\n onClick?.(event as MouseEvent<HTMLButtonElement>)\n if (!event.defaultPrevented) requestOpenChange(false, 'close')\n },\n }\n return asChild ? (\n <Slot {...shared} ref={ref as Ref<HTMLElement>}>\n {children as SlotProps['children']}\n </Slot>\n ) : (\n <button {...shared} ref={ref} type={type}>\n {children}\n </button>\n )\n },\n)\n","const FOCUSABLE = [\n 'a[href]',\n 'button:not([disabled])',\n 'input:not([disabled])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])',\n].join(',')\n\nfunction focusableElements(container: HTMLElement): HTMLElement[] {\n return [...container.querySelectorAll<HTMLElement>(FOCUSABLE)].filter(\n (element) =>\n !element.hidden && element.getAttribute('aria-hidden') !== 'true',\n )\n}\n\nexport function focusInitialElement(container: HTMLElement): void {\n const autofocus = container.querySelector<HTMLElement>('[autofocus]')\n const target = autofocus ?? focusableElements(container)[0] ?? container\n target.focus({ preventScroll: true })\n}\n\nexport function containTabFocus(\n event: KeyboardEvent,\n container: HTMLElement,\n): void {\n if (event.key !== 'Tab') return\n const focusable = focusableElements(container)\n if (focusable.length === 0) {\n event.preventDefault()\n container.focus({ preventScroll: true })\n return\n }\n\n const first = focusable[0]!\n const last = focusable[focusable.length - 1]!\n if (event.shiftKey && document.activeElement === first) {\n event.preventDefault()\n last.focus({ preventScroll: true })\n } else if (!event.shiftKey && document.activeElement === last) {\n event.preventDefault()\n first.focus({ preventScroll: true })\n }\n}\n","interface IsolatedElement {\n element: HTMLElement\n ariaHidden: string | null\n inert: boolean\n}\n\nexport function isolateBackground(content: HTMLElement): () => void {\n const isolated = new Map<HTMLElement, IsolatedElement>()\n let pathElement = content\n let parent = content.parentElement\n\n while (parent) {\n for (const element of parent.children) {\n if (!(element instanceof HTMLElement)) continue\n if (element === pathElement) continue\n if (\n element.hasAttribute('data-rsbs-backdrop') ||\n element.querySelector('[data-rsbs-backdrop]')\n ) {\n continue\n }\n if (isolated.has(element)) continue\n\n isolated.set(element, {\n element,\n ariaHidden: element.getAttribute('aria-hidden'),\n inert: element.inert,\n })\n element.setAttribute('aria-hidden', 'true')\n element.inert = true\n }\n\n if (parent === document.body) break\n pathElement = parent\n parent = parent.parentElement\n }\n\n return () => {\n for (const { element, ariaHidden, inert } of [\n ...isolated.values(),\n ].reverse()) {\n if (ariaHidden === null) element.removeAttribute('aria-hidden')\n else element.setAttribute('aria-hidden', ariaHidden)\n element.inert = inert\n }\n }\n}\n","import { forwardRef, useEffect, useRef } from 'react'\nimport type {\n CSSProperties,\n HTMLAttributes,\n PointerEventHandler,\n Ref,\n} from 'react'\nimport { containTabFocus, focusInitialElement } from '../accessibility/focus.js'\nimport { isolateBackground } from '../accessibility/isolation.js'\nimport { mergeRefs } from '../composition/merge-refs.js'\nimport { Slot } from '../composition/Slot.js'\nimport type { SlotProps } from '../composition/Slot.js'\nimport { useSheetContext } from '../context/sheet-context.js'\n\nexport type SheetContentProps = HTMLAttributes<HTMLDivElement> & {\n asChild?: boolean\n}\n\nexport const Content = forwardRef<HTMLDivElement, SheetContentProps>(\n function Content(\n {\n asChild = false,\n children,\n className,\n onPointerCancel,\n onPointerDown,\n onPointerMove,\n onPointerUp,\n style,\n ...props\n },\n ref,\n ) {\n const {\n descriptionId,\n dismissible,\n modal,\n open,\n requestOpenChange,\n registerContent,\n interactionHandlers,\n position,\n surfaceProgress,\n dragging,\n titleId,\n transitionPhase,\n } = useSheetContext('Sheet.Content')\n const internalRef = useRef<HTMLElement>(null)\n\n useEffect(() => {\n const content = internalRef.current\n if (!content || !open) return\n const previouslyFocused =\n modal && document.activeElement instanceof HTMLElement\n ? document.activeElement\n : null\n const restoreIsolation = modal ? isolateBackground(content) : undefined\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && dismissible) {\n event.preventDefault()\n requestOpenChange(false, 'escape')\n } else if (modal) {\n containTabFocus(event, content)\n }\n }\n const onFocusIn = (event: FocusEvent) => {\n if (\n modal &&\n event.target instanceof Node &&\n !content.contains(event.target)\n ) {\n focusInitialElement(content)\n }\n }\n\n document.addEventListener('keydown', onKeyDown)\n document.addEventListener('focusin', onFocusIn)\n if (modal) focusInitialElement(content)\n return () => {\n document.removeEventListener('keydown', onKeyDown)\n document.removeEventListener('focusin', onFocusIn)\n restoreIsolation?.()\n previouslyFocused?.focus({ preventScroll: true })\n }\n }, [dismissible, modal, open, requestOpenChange])\n\n useEffect(() => {\n const content = internalRef.current\n if (process.env.NODE_ENV === 'production' || !content || !open) return\n let active = true\n queueMicrotask(() => {\n if (\n active &&\n content.isConnected &&\n !content.hasAttribute('aria-label') &&\n !content.getAttribute('aria-labelledby')\n ) {\n console.warn('Sheet.Content requires Sheet.Title or an aria-label.')\n }\n })\n return () => {\n active = false\n }\n }, [open, titleId])\n\n const classes = ['rsbs-content', className].filter(Boolean).join(' ')\n const composePointerHandler =\n (\n consumer: PointerEventHandler<HTMLElement> | undefined,\n internal: PointerEventHandler<HTMLElement>,\n ): PointerEventHandler<HTMLElement> =>\n (event) => {\n consumer?.(event)\n if (!event.defaultPrevented) internal(event)\n }\n const positionStyle = {\n ...style,\n '--rsbs-position': `${position}px`,\n '--rsbs-surface-progress': surfaceProgress,\n } as CSSProperties\n const shared = {\n ...props,\n role: 'dialog',\n tabIndex: props.tabIndex ?? -1,\n inert: !open,\n 'aria-modal': modal || undefined,\n 'aria-hidden': !open || undefined,\n 'aria-labelledby': props['aria-label'] ? undefined : titleId,\n 'aria-describedby': descriptionId,\n className: classes,\n 'data-rsbs-content': '',\n 'data-rsbs-state': transitionPhase,\n 'data-rsbs-dragging': dragging || undefined,\n onPointerDown: composePointerHandler(\n onPointerDown,\n interactionHandlers.onPointerDown,\n ),\n onPointerMove: composePointerHandler(\n onPointerMove,\n interactionHandlers.onPointerMove,\n ),\n onPointerUp: composePointerHandler(\n onPointerUp,\n interactionHandlers.onPointerUp,\n ),\n onPointerCancel: composePointerHandler(\n onPointerCancel,\n interactionHandlers.onPointerCancel,\n ),\n style: positionStyle,\n }\n return asChild ? (\n <Slot\n {...shared}\n ref={mergeRefs(internalRef, registerContent, ref as Ref<HTMLElement>)}\n >\n {children as SlotProps['children']}\n </Slot>\n ) : (\n <div\n {...shared}\n ref={mergeRefs(ref, (value) => {\n internalRef.current = value\n registerContent(value)\n })}\n >\n {children}\n </div>\n )\n },\n)\n","import { forwardRef, useEffect, useId } from 'react'\nimport type { HTMLAttributes, Ref } from 'react'\nimport { Slot } from '../composition/Slot.js'\nimport type { SlotProps } from '../composition/Slot.js'\nimport { useSheetContext } from '../context/sheet-context.js'\n\nexport type SheetDescriptionProps = HTMLAttributes<HTMLParagraphElement> & {\n asChild?: boolean\n}\n\nexport const Description = forwardRef<\n HTMLParagraphElement,\n SheetDescriptionProps\n>(function Description(\n { asChild = false, children, className, id: providedId, ...props },\n ref,\n) {\n const generatedId = useId()\n const id = providedId ?? generatedId\n const { registerDescription } = useSheetContext('Sheet.Description')\n useEffect(() => registerDescription(id), [id, registerDescription])\n const shared = {\n ...props,\n id,\n className: ['rsbs-description', className].filter(Boolean).join(' '),\n 'data-rsbs-description': '',\n }\n return asChild ? (\n <Slot {...shared} ref={ref as Ref<HTMLElement>}>\n {children as SlotProps['children']}\n </Slot>\n ) : (\n <p {...shared} ref={ref}>\n {children}\n </p>\n )\n})\n","import type { ResolvedSnapPoint } from './types.js'\n\nexport function reconcileActiveSnapPoint(\n activeId: string | null,\n previousPosition: number,\n snapPoints: readonly ResolvedSnapPoint[],\n): ResolvedSnapPoint | null {\n if (snapPoints.length === 0) return null\n\n const active = snapPoints.find(({ id }) => id === activeId)\n if (active) return active\n\n let nearest = snapPoints[0]!\n let distance = Math.abs(previousPosition - nearest.position)\n\n for (let index = 1; index < snapPoints.length; index += 1) {\n const candidate = snapPoints[index]!\n const candidateDistance = Math.abs(previousPosition - candidate.position)\n if (candidateDistance < distance) {\n nearest = candidate\n distance = candidateDistance\n }\n }\n\n return nearest\n}\n","import type { SheetEvent, SheetState, TransitionResult } from './types.js'\nimport { reconcileActiveSnapPoint } from '../layout/reconcile-active-snap-point.js'\n\nexport function createInitialState(): SheetState {\n return {\n phase: 'closed',\n open: false,\n activeSnapPoint: null,\n position: 0,\n targetPosition: 0,\n velocity: 0,\n dismissReason: null,\n }\n}\n\nfunction invalid(state: SheetState, event: SheetEvent): TransitionResult {\n return {\n state,\n diagnostic: {\n code: 'invalid-transition',\n event: event.type,\n phase: state.phase,\n },\n }\n}\n\nexport function reduceSheetState(\n state: SheetState,\n event: SheetEvent,\n): TransitionResult {\n if (event.type === 'OPEN_REQUESTED') {\n return {\n state: {\n ...state,\n phase: 'opening',\n open: true,\n activeSnapPoint: event.snapPoint,\n targetPosition: event.targetPosition,\n velocity: 0,\n dismissReason: null,\n },\n diagnostic: null,\n }\n }\n\n if (event.type === 'CLOSE_REQUESTED' && state.phase !== 'closed') {\n return {\n state: {\n ...state,\n phase: 'closing',\n open: false,\n dismissReason: event.reason,\n velocity: event.velocity ?? 0,\n },\n diagnostic: null,\n }\n }\n\n if (\n event.type === 'DRAG_STARTED' &&\n ['open', 'opening', 'settling'].includes(state.phase)\n ) {\n return {\n state: {\n ...state,\n phase: 'dragging',\n position: event.position,\n velocity: 0,\n },\n diagnostic: null,\n }\n }\n\n if (event.type === 'DRAG_MOVED' && state.phase === 'dragging') {\n return {\n state: { ...state, position: event.position },\n diagnostic: null,\n }\n }\n\n if (event.type === 'DRAG_ENDED' && state.phase === 'dragging') {\n return {\n state: {\n ...state,\n phase: 'settling',\n position: event.position,\n targetPosition: event.targetPosition,\n velocity: event.velocity,\n activeSnapPoint: event.snapPoint,\n },\n diagnostic: null,\n }\n }\n\n if (event.type === 'LAYOUT_CHANGED') {\n if (state.phase === 'closed') {\n return {\n state: {\n ...state,\n position: event.layout.closedPosition,\n targetPosition: event.layout.closedPosition,\n },\n diagnostic: null,\n }\n }\n\n if (state.phase === 'closing') {\n return {\n state: {\n ...state,\n targetPosition: event.layout.closedPosition,\n },\n diagnostic: null,\n }\n }\n\n const snapPoint = reconcileActiveSnapPoint(\n state.activeSnapPoint,\n state.position,\n event.layout.snapPoints,\n )\n if (!snapPoint) return { state, diagnostic: null }\n\n return {\n state: {\n ...state,\n phase: state.phase === 'dragging' ? 'dragging' : 'settling',\n activeSnapPoint: snapPoint.id,\n targetPosition: snapPoint.position,\n velocity: state.phase === 'dragging' ? state.velocity : 0,\n },\n diagnostic: null,\n }\n }\n\n if (event.type === 'SETTLED' && state.phase === 'closing') {\n return {\n state: {\n ...createInitialState(),\n position: event.position,\n targetPosition: event.position,\n velocity: 0,\n },\n diagnostic: null,\n }\n }\n\n if (\n event.type === 'SETTLED' &&\n (state.phase === 'opening' || state.phase === 'settling')\n ) {\n return {\n state: {\n ...state,\n phase: 'open',\n position: event.position,\n targetPosition: event.position,\n velocity: 0,\n },\n diagnostic: null,\n }\n }\n\n return invalid(state, event)\n}\n","import type { SheetState } from './types.js'\n\nexport function assertSheetState(state: SheetState): void {\n if (state.phase === 'closed' && state.open) {\n throw new Error('closed phase requires open to be false')\n }\n\n if (\n (state.phase === 'opening' ||\n state.phase === 'open' ||\n state.phase === 'dragging' ||\n state.phase === 'settling') &&\n !state.activeSnapPoint\n ) {\n throw new Error(`${state.phase} phase requires an active snap point`)\n }\n\n if (\n !Number.isFinite(state.position) ||\n !Number.isFinite(state.targetPosition) ||\n !Number.isFinite(state.velocity)\n ) {\n throw new Error('sheet positions must be finite')\n }\n}\n","import { createInitialState, reduceSheetState } from './reducer.js'\nimport { assertSheetState } from './invariants.js'\nimport type {\n ControllerDiagnostic,\n SheetController,\n SheetEvent,\n SheetState,\n} from './types.js'\n\nexport interface CreateSheetControllerOptions {\n initialState?: SheetState\n onDiagnostic?: (diagnostic: ControllerDiagnostic) => void\n}\n\nexport function createSheetController(\n options: CreateSheetControllerOptions = {},\n): SheetController {\n let state = options.initialState ?? createInitialState()\n const listeners = new Set<(state: SheetState) => void>()\n\n return {\n getState() {\n return state\n },\n dispatch(event: SheetEvent) {\n const previousState = state\n const result = reduceSheetState(previousState, event)\n\n if (result.diagnostic) {\n options.onDiagnostic?.(result.diagnostic)\n return\n }\n\n state = result.state\n if (process.env.NODE_ENV !== 'production') assertSheetState(state)\n if (state !== previousState) {\n const notificationState = state\n for (const listener of [...listeners]) listener(notificationState)\n }\n },\n subscribe(listener) {\n listeners.add(listener)\n return () => {\n listeners.delete(listener)\n }\n },\n }\n}\n","import { useEffect, useState } from 'react'\n\nexport function useReducedMotion(): boolean {\n const [reducedMotion, setReducedMotion] = useState(() =>\n typeof window === 'undefined'\n ? false\n : window.matchMedia('(prefers-reduced-motion: reduce)').matches,\n )\n\n useEffect(() => {\n const query = window.matchMedia('(prefers-reduced-motion: reduce)')\n const update = () => setReducedMotion(query.matches)\n query.addEventListener('change', update)\n update()\n return () => query.removeEventListener('change', update)\n }, [])\n\n return reducedMotion\n}\n","export interface PositionSample {\n position: number\n time: number\n}\n\nexport function calculateVelocity(\n samples: readonly PositionSample[],\n windowMilliseconds = 100,\n): number {\n if (samples.length < 2) return 0\n const latest = samples[samples.length - 1]!\n const threshold = latest.time - windowMilliseconds\n const earliest = samples.find(({ time }) => time >= threshold) ?? samples[0]!\n const elapsed = latest.time - earliest.time\n return elapsed > 0 ? (latest.position - earliest.position) / elapsed : 0\n}\n","import { calculateVelocity } from './velocity.js'\nimport type { PositionSample } from './velocity.js'\n\nexport interface PointerSample {\n pointerId: number\n clientY: number\n timeStamp: number\n}\n\nexport interface PointerCaptureTarget {\n setPointerCapture?(pointerId: number): void\n releasePointerCapture?(pointerId: number): void\n hasPointerCapture?(pointerId: number): boolean\n}\n\nexport interface PointerMovement {\n deltaY: number\n deltaSinceLastY: number\n positionY: number\n velocityY: number\n}\n\nexport interface PointerCompletion extends PointerMovement {\n cancelled: boolean\n}\n\nexport interface PointerSessionOptions {\n onStart(positionY: number): void\n onMove(movement: PointerMovement): void\n onEnd(completion: PointerCompletion): void\n}\n\nexport interface PointerSession {\n readonly active: boolean\n start(pointer: PointerSample, target?: PointerCaptureTarget): boolean\n capture(target: PointerCaptureTarget): void\n move(pointer: PointerSample): void\n end(pointer: PointerSample): void\n cancel(): void\n dispose(): void\n}\n\nfunction capturePointer(target: PointerCaptureTarget, pointerId: number): void {\n try {\n target.setPointerCapture?.(pointerId)\n } catch {\n // The pointer may have ended before capture was requested.\n }\n}\n\nfunction releasePointer(target: PointerCaptureTarget, pointerId: number): void {\n try {\n if (!target.hasPointerCapture || target.hasPointerCapture(pointerId)) {\n target.releasePointerCapture?.(pointerId)\n }\n } catch {\n // Capture may already have been released by the browser.\n }\n}\n\nexport function createPointerSession(\n options: PointerSessionOptions,\n): PointerSession {\n let pointerId: number | null = null\n let startY = 0\n let currentY = 0\n let deltaSinceLastY = 0\n let captureTarget: PointerCaptureTarget | undefined\n let samples: PositionSample[] = []\n\n const movement = (): PointerMovement => ({\n deltaY: currentY - startY,\n deltaSinceLastY,\n positionY: currentY,\n velocityY: calculateVelocity(samples),\n })\n\n const cleanup = (cancelled: boolean) => {\n if (pointerId === null) return\n\n const completedPointerId = pointerId\n const completion = { ...movement(), cancelled }\n pointerId = null\n\n if (captureTarget) releasePointer(captureTarget, completedPointerId)\n\n captureTarget = undefined\n samples = []\n options.onEnd(completion)\n }\n\n return {\n get active() {\n return pointerId !== null\n },\n start(pointer, target) {\n if (pointerId !== null) return false\n pointerId = pointer.pointerId\n startY = pointer.clientY\n currentY = pointer.clientY\n deltaSinceLastY = 0\n captureTarget = target\n samples = [{ position: pointer.clientY, time: pointer.timeStamp }]\n if (target) capturePointer(target, pointer.pointerId)\n options.onStart(pointer.clientY)\n return true\n },\n capture(target) {\n if (pointerId === null || captureTarget) return\n captureTarget = target\n capturePointer(target, pointerId)\n },\n move(pointer) {\n if (pointer.pointerId !== pointerId) return\n deltaSinceLastY = pointer.clientY - currentY\n currentY = pointer.clientY\n samples.push({ position: pointer.clientY, time: pointer.timeStamp })\n options.onMove(movement())\n },\n end(pointer) {\n if (pointer.pointerId !== pointerId) return\n deltaSinceLastY = pointer.clientY - currentY\n currentY = pointer.clientY\n samples.push({ position: pointer.clientY, time: pointer.timeStamp })\n cleanup(false)\n },\n cancel() {\n cleanup(true)\n },\n dispose() {\n cleanup(true)\n },\n }\n}\n","const DEFAULT_RESISTANCE = 0.35\n\nexport interface DragRange {\n min: number\n max: number\n}\n\nexport function applyDragResistance(\n position: number,\n range: DragRange,\n resistance = DEFAULT_RESISTANCE,\n): number {\n if (range.min > range.max) {\n throw new Error('drag range minimum cannot exceed maximum')\n }\n if (position < range.min) {\n return range.min + (position - range.min) * resistance\n }\n if (position > range.max) {\n return range.max + (position - range.max) * resistance\n }\n return position\n}\n","export type GestureOwner = 'sheet' | 'content'\n\nexport interface ScrollBoundaryInput {\n deltaY: number\n scrollTop: number\n scrollHeight: number\n clientHeight: number\n startedOnHandle: boolean\n}\n\nexport function decideGestureOwner({\n deltaY,\n scrollTop,\n scrollHeight,\n clientHeight,\n startedOnHandle,\n}: ScrollBoundaryInput): GestureOwner {\n if (startedOnHandle) return 'sheet'\n\n const maximumScrollTop = Math.max(0, scrollHeight - clientHeight)\n\n if (maximumScrollTop <= 0) return 'sheet'\n if (deltaY < 0) {\n return scrollTop < maximumScrollTop ? 'content' : 'sheet'\n }\n if (deltaY > 0) {\n return scrollTop > 0 ? 'content' : 'sheet'\n }\n\n return 'content'\n}\n\nexport function findScrollableAncestor(\n target: EventTarget | null,\n boundary: HTMLElement,\n): HTMLElement | null {\n let element = target instanceof HTMLElement ? target : null\n\n while (element && element !== boundary) {\n const overflowY = getComputedStyle(element).overflowY\n if (\n element.scrollHeight > element.clientHeight &&\n ['auto', 'scroll', 'overlay'].includes(overflowY)\n )\n return element\n element = element.parentElement\n }\n\n return null\n}\n","import type { ResolvedSnapPoint } from './types.js'\n\nconst FLICK_VELOCITY = 0.45\n\nexport interface SelectSettleTargetOptions {\n position: number\n velocity: number\n snapPoints: readonly ResolvedSnapPoint[]\n closedPosition: number\n dismissible: boolean\n}\n\nexport type SettleTarget =\n | { type: 'snap'; snapPoint: ResolvedSnapPoint }\n | { type: 'dismiss'; position: number }\n | { type: 'none' }\n\nfunction nearestIndex(\n position: number,\n snapPoints: readonly ResolvedSnapPoint[],\n): number {\n let selected = 0\n let distance = Math.abs(position - snapPoints[0]!.position)\n\n for (let index = 1; index < snapPoints.length; index += 1) {\n const candidateDistance = Math.abs(position - snapPoints[index]!.position)\n if (candidateDistance < distance) {\n selected = index\n distance = candidateDistance\n }\n }\n return selected\n}\n\nexport function selectSettleTarget({\n position,\n velocity,\n snapPoints,\n closedPosition,\n dismissible,\n}: SelectSettleTargetOptions): SettleTarget {\n if (snapPoints.length === 0) return { type: 'none' }\n\n const lastIndex = snapPoints.length - 1\n const lastPoint = snapPoints[lastIndex]!\n const dismissalMidpoint = (lastPoint.position + closedPosition) / 2\n const nearest = nearestIndex(position, snapPoints)\n\n if (\n dismissible &&\n (position >= dismissalMidpoint ||\n (nearest === lastIndex && velocity >= FLICK_VELOCITY))\n ) {\n return { type: 'dismiss', position: closedPosition }\n }\n\n if (Math.abs(velocity) >= FLICK_VELOCITY) {\n const direction = velocity > 0 ? 1 : -1\n const directedIndex = Math.max(0, Math.min(lastIndex, nearest + direction))\n return { type: 'snap', snapPoint: snapPoints[directedIndex]! }\n }\n\n return { type: 'snap', snapPoint: snapPoints[nearest]! }\n}\n","import { useEffect, useMemo, useRef } from 'react'\nimport type { PointerEventHandler } from 'react'\nimport type { SheetController, SheetState } from '../controller/types.js'\nimport { createPointerSession } from '../gestures/pointer-session.js'\nimport { applyDragResistance } from '../gestures/resistance.js'\nimport {\n decideGestureOwner,\n findScrollableAncestor,\n} from '../gestures/scroll-boundary.js'\nimport { selectSettleTarget } from '../layout/select-settle-target.js'\nimport type { ResolvedLayout } from '../layout/types.js'\n\nexport interface UseSheetInteractionsOptions {\n content: HTMLElement | null\n controller: SheetController\n state: SheetState\n layout: ResolvedLayout | null\n dismissible: boolean\n onDismiss(): void\n onSnapPointChange(id: string): void\n onPositionChange(position: number): void\n}\n\nexport interface SheetInteractionHandlers {\n onPointerDown: PointerEventHandler<HTMLElement>\n onPointerMove: PointerEventHandler<HTMLElement>\n onPointerUp: PointerEventHandler<HTMLElement>\n onPointerCancel: PointerEventHandler<HTMLElement>\n}\n\nexport function useSheetInteractions({\n content,\n controller,\n state,\n layout,\n dismissible,\n onDismiss,\n onSnapPointChange,\n onPositionChange,\n}: UseSheetInteractionsOptions): SheetInteractionHandlers {\n const stateRef = useRef(state)\n const layoutRef = useRef(layout)\n const scrollElementRef = useRef<HTMLElement | null>(null)\n const startedOnHandleRef = useRef(false)\n const sheetOwnsGestureRef = useRef(false)\n const takeoverDeltaRef = useRef(0)\n const startPositionRef = useRef(0)\n const captureTargetRef = useRef<HTMLElement | null>(null)\n stateRef.current = state\n layoutRef.current = layout\n\n const session = useMemo(\n () =>\n createPointerSession({\n onStart() {\n startPositionRef.current = stateRef.current.position\n sheetOwnsGestureRef.current = startedOnHandleRef.current\n takeoverDeltaRef.current = 0\n if (\n sheetOwnsGestureRef.current &&\n ['open', 'opening', 'settling'].includes(stateRef.current.phase)\n ) {\n controller.dispatch({\n type: 'DRAG_STARTED',\n position: startPositionRef.current,\n })\n }\n },\n onMove(movement) {\n const activeLayout = layoutRef.current\n if (!activeLayout) return\n\n if (!sheetOwnsGestureRef.current) {\n const scrollElement = scrollElementRef.current\n const owner = decideGestureOwner({\n deltaY: movement.deltaSinceLastY,\n scrollTop: scrollElement?.scrollTop ?? 0,\n scrollHeight: scrollElement?.scrollHeight ?? 0,\n clientHeight: scrollElement?.clientHeight ?? 0,\n startedOnHandle: startedOnHandleRef.current,\n })\n if (owner === 'content') return\n if (\n !['open', 'opening', 'settling'].includes(stateRef.current.phase)\n )\n return\n sheetOwnsGestureRef.current = true\n if (captureTargetRef.current) {\n session.capture(captureTargetRef.current)\n }\n takeoverDeltaRef.current = movement.deltaY\n startPositionRef.current = stateRef.current.position\n controller.dispatch({\n type: 'DRAG_STARTED',\n position: startPositionRef.current,\n })\n }\n\n const minimum = activeLayout.snapPoints[0]?.position\n if (minimum === undefined) return\n const position = applyDragResistance(\n startPositionRef.current +\n movement.deltaY -\n takeoverDeltaRef.current,\n { min: minimum, max: activeLayout.closedPosition },\n )\n controller.dispatch({ type: 'DRAG_MOVED', position })\n onPositionChange(position)\n },\n onEnd(completion) {\n const activeLayout = layoutRef.current\n if (!sheetOwnsGestureRef.current || !activeLayout) return\n const current = stateRef.current\n const target = selectSettleTarget({\n position: current.position,\n velocity: completion.cancelled ? 0 : completion.velocityY,\n snapPoints: activeLayout.snapPoints,\n closedPosition: activeLayout.closedPosition,\n dismissible,\n })\n\n if (target.type === 'dismiss') {\n controller.dispatch({\n type: 'CLOSE_REQUESTED',\n reason: 'drag',\n velocity: completion.velocityY,\n })\n onDismiss()\n } else if (target.type === 'snap') {\n controller.dispatch({\n type: 'DRAG_ENDED',\n position: current.position,\n velocity: completion.velocityY,\n snapPoint: target.snapPoint.id,\n targetPosition: target.snapPoint.position,\n })\n onSnapPointChange(target.snapPoint.id)\n }\n },\n }),\n [controller, dismissible, onDismiss, onPositionChange, onSnapPointChange],\n )\n\n useEffect(() => {\n const cancel = () => session.cancel()\n window.addEventListener('blur', cancel)\n return () => {\n window.removeEventListener('blur', cancel)\n session.dispose()\n }\n }, [session])\n\n return {\n onPointerDown(event) {\n if (\n !content ||\n !layout ||\n !['open', 'opening', 'settling'].includes(state.phase)\n )\n return\n if (session.active) {\n session.cancel()\n return\n }\n const target = event.target instanceof HTMLElement ? event.target : null\n startedOnHandleRef.current = Boolean(\n target?.closest('[data-rsbs-handle]'),\n )\n scrollElementRef.current = startedOnHandleRef.current\n ? null\n : findScrollableAncestor(event.target, content)\n captureTargetRef.current = event.currentTarget\n session.start(\n event.nativeEvent,\n startedOnHandleRef.current ? event.currentTarget : undefined,\n )\n },\n onPointerMove(event) {\n session.move(event.nativeEvent)\n if (sheetOwnsGestureRef.current) event.preventDefault()\n },\n onPointerUp(event) {\n session.end(event.nativeEvent)\n },\n onPointerCancel() {\n session.cancel()\n },\n }\n}\n","import type { LayoutMeasurements } from './types.js'\n\ninterface ResizeObserverLike {\n observe(target: Element): void\n disconnect(): void\n}\n\ninterface VisualViewportLike {\n readonly height: number\n addEventListener(type: 'resize', listener: (event: Event) => void): void\n removeEventListener(type: 'resize', listener: (event: Event) => void): void\n}\n\nexport interface LayoutObservationOptions {\n viewport: HTMLElement\n content: HTMLElement\n onChange(measurements: LayoutMeasurements): void\n getSafeArea?: () => { top: number; bottom: number }\n visualViewport?: VisualViewportLike | null\n createResizeObserver?: (callback: () => void) => ResizeObserverLike | null\n}\n\nexport interface LayoutObservation {\n measure(): void\n dispose(): void\n}\n\nfunction readSafeArea(): { top: number; bottom: number } {\n if (typeof document === 'undefined') return { top: 0, bottom: 0 }\n\n const probe = document.createElement('div')\n probe.style.cssText =\n 'position:fixed;visibility:hidden;pointer-events:none;padding-top:env(safe-area-inset-top);padding-bottom:env(safe-area-inset-bottom)'\n document.body.append(probe)\n const style = getComputedStyle(probe)\n const result = {\n top: Number.parseFloat(style.paddingTop) || 0,\n bottom: Number.parseFloat(style.paddingBottom) || 0,\n }\n probe.remove()\n return result\n}\n\nexport function observeLayout({\n viewport,\n content,\n onChange,\n getSafeArea = readSafeArea,\n visualViewport = typeof window === 'undefined' ? null : window.visualViewport,\n createResizeObserver = (callback) =>\n typeof ResizeObserver === 'undefined' ? null : new ResizeObserver(callback),\n}: LayoutObservationOptions): LayoutObservation {\n let disposed = false\n const activeVisualViewport =\n typeof document !== 'undefined' && viewport.parentElement === document.body\n ? visualViewport\n : null\n\n const measure = () => {\n if (disposed) return\n const safeArea = getSafeArea()\n const contentBoxHeight = content.getBoundingClientRect().height\n onChange({\n viewportHeight: activeVisualViewport?.height ?? viewport.clientHeight,\n contentHeight: contentBoxHeight || content.scrollHeight,\n safeAreaTop: safeArea.top,\n safeAreaBottom: safeArea.bottom,\n })\n }\n\n const resizeObserver = createResizeObserver(measure)\n resizeObserver?.observe(viewport)\n resizeObserver?.observe(content)\n activeVisualViewport?.addEventListener('resize', measure)\n measure()\n\n return {\n measure,\n dispose() {\n if (disposed) return\n disposed = true\n resizeObserver?.disconnect()\n activeVisualViewport?.removeEventListener('resize', measure)\n },\n }\n}\n","import type { SnapPoint, SnapPointValue } from '../public-types.js'\nimport type {\n LayoutMeasurements,\n ResolvedSnapPoint,\n SnapPointDiagnostic,\n} from './types.js'\n\nexport interface ResolveSnapPointsResult {\n snapPoints: ResolvedSnapPoint[]\n diagnostics: SnapPointDiagnostic[]\n}\n\nfunction validMeasurements(measurements: LayoutMeasurements): boolean {\n const values = [\n measurements.viewportHeight,\n measurements.contentHeight,\n measurements.safeAreaTop,\n measurements.safeAreaBottom,\n ]\n\n return (\n values.every((value) => Number.isFinite(value) && value >= 0) &&\n measurements.viewportHeight >\n measurements.safeAreaTop + measurements.safeAreaBottom\n )\n}\n\nfunction resolveHeight(\n value: SnapPointValue,\n measurements: LayoutMeasurements,\n availableHeight: number,\n): number | null {\n if (value === 'content') return measurements.contentHeight\n if (typeof value === 'number') {\n return value > 0 && value <= 1 ? value * availableHeight : null\n }\n\n const match = /^(-?(?:\\d+\\.?\\d*|\\.\\d+))(px|%)$/.exec(value)\n if (!match) return null\n\n const amount = Number(match[1])\n if (!Number.isFinite(amount) || amount <= 0) return null\n return match[2] === '%' ? (amount / 100) * availableHeight : amount\n}\n\nexport function resolveSnapPoints(\n snapPoints: readonly SnapPoint[],\n measurements: LayoutMeasurements,\n): ResolveSnapPointsResult {\n if (!validMeasurements(measurements)) {\n return {\n snapPoints: [],\n diagnostics: [{ code: 'invalid-measurements' }],\n }\n }\n\n const availableHeight =\n measurements.viewportHeight -\n measurements.safeAreaTop -\n measurements.safeAreaBottom\n const seen = new Set<string>()\n const resolved: ResolvedSnapPoint[] = []\n const diagnostics: SnapPointDiagnostic[] = []\n\n for (const snapPoint of snapPoints) {\n if (seen.has(snapPoint.id)) {\n diagnostics.push({ code: 'duplicate-id', id: snapPoint.id })\n continue\n }\n seen.add(snapPoint.id)\n\n const height = resolveHeight(snapPoint.value, measurements, availableHeight)\n if (height === null) {\n diagnostics.push({\n code: 'invalid-value',\n id: snapPoint.id,\n value: snapPoint.value,\n })\n continue\n }\n\n const clampedHeight = Math.min(height, availableHeight)\n resolved.push({\n id: snapPoint.id,\n position:\n measurements.viewportHeight -\n measurements.safeAreaBottom -\n clampedHeight,\n })\n }\n\n resolved.sort((left, right) => left.position - right.position)\n return { snapPoints: resolved, diagnostics }\n}\n","import { useEffect } from 'react'\nimport type { SnapPoint } from '../public-types.js'\nimport { observeLayout } from '../layout/observe-layout.js'\nimport { resolveSnapPoints } from '../layout/resolve-snap-points.js'\nimport type { ResolvedLayout } from '../layout/types.js'\n\nexport interface UseSheetLayoutOptions {\n viewport: HTMLElement | null\n content: HTMLElement | null\n snapPoints: readonly SnapPoint[]\n onLayout(layout: ResolvedLayout): void\n}\n\nexport function useSheetLayout({\n viewport,\n content,\n snapPoints,\n onLayout,\n}: UseSheetLayoutOptions): void {\n useEffect(() => {\n if (!viewport || !content) return\n\n return observeLayout({\n viewport,\n content,\n onChange(measurements) {\n const resolved = resolveSnapPoints(snapPoints, measurements)\n if (resolved.snapPoints.length === 0) return\n onLayout({\n viewportHeight: measurements.viewportHeight,\n closedPosition:\n measurements.viewportHeight - measurements.safeAreaBottom,\n snapPoints: resolved.snapPoints,\n })\n },\n }).dispose\n }, [content, onLayout, snapPoints, viewport])\n}\n","import { useEffect } from 'react'\nimport type { SheetController, SheetState } from '../controller/types.js'\nimport type { MotionAdapter } from '../motion/types.js'\n\nexport interface UseSheetMotionOptions {\n controller: SheetController\n state: SheetState\n closedPosition: number\n reducedMotion: boolean\n adapter: MotionAdapter\n getPosition(): number\n onUpdate(position: number): void\n getBackdropProgress(): number\n onBackdropProgress(progress: number): void\n}\n\nfunction clamp(value: number): number {\n return Math.min(1, Math.max(0, value))\n}\n\nexport function resolveBackdropProgress(\n phase: SheetState['phase'],\n value: number,\n from: number,\n to: number,\n startProgress = phase === 'opening' ? 0 : 1,\n): number {\n if (from === to) return phase === 'closing' ? 0 : 1\n const segmentProgress = clamp((value - from) / (to - from))\n const targetProgress = phase === 'closing' ? 0 : 1\n return clamp(\n startProgress + (targetProgress - startProgress) * segmentProgress,\n )\n}\n\nexport function useSheetMotion({\n controller,\n state,\n closedPosition,\n reducedMotion,\n adapter,\n getPosition,\n onUpdate,\n getBackdropProgress,\n onBackdropProgress,\n}: UseSheetMotionOptions): void {\n useEffect(() => {\n if (!['opening', 'settling', 'closing'].includes(state.phase)) return\n const from = getPosition()\n const target =\n state.phase === 'closing' ? closedPosition : state.targetPosition\n const startBackdropProgress = getBackdropProgress()\n const handle = adapter.start({\n from,\n to: target,\n velocity: state.velocity,\n reducedMotion,\n onUpdate(value) {\n onUpdate(value)\n onBackdropProgress(\n resolveBackdropProgress(\n state.phase,\n value,\n from,\n target,\n startBackdropProgress,\n ),\n )\n },\n onComplete: () =>\n controller.dispatch({ type: 'SETTLED', position: target }),\n })\n return () => handle.stop()\n }, [\n adapter,\n closedPosition,\n controller,\n getPosition,\n getBackdropProgress,\n onBackdropProgress,\n onUpdate,\n reducedMotion,\n state,\n ])\n}\n","const clamp = (min, max, v) => {\n if (v > max)\n return max;\n if (v < min)\n return min;\n return v;\n};\n\nexport { clamp };\n//# sourceMappingURL=clamp.mjs.map\n","function formatErrorMessage(message, errorCode) {\n return errorCode\n ? `${message}. For more information and steps for solving, visit https://motion.dev/troubleshooting/${errorCode}`\n : message;\n}\n\nexport { formatErrorMessage };\n//# sourceMappingURL=format-error-message.mjs.map\n","import { formatErrorMessage } from './format-error-message.mjs';\n\nlet warning = () => { };\nlet invariant = () => { };\nif (typeof process !== \"undefined\" &&\n process.env?.NODE_ENV !== \"production\") {\n warning = (check, message, errorCode) => {\n if (!check && typeof console !== \"undefined\") {\n console.warn(formatErrorMessage(message, errorCode));\n }\n };\n invariant = (check, message, errorCode) => {\n if (!check) {\n throw new Error(formatErrorMessage(message, errorCode));\n }\n };\n}\n\nexport { invariant, warning };\n//# sourceMappingURL=errors.mjs.map\n","/**\n * Converts seconds to milliseconds\n *\n * @param seconds - Time in seconds.\n * @return milliseconds - Converted time in milliseconds.\n */\n/*#__NO_SIDE_EFFECTS__*/\nconst secondsToMilliseconds = (seconds) => seconds * 1000;\n/*#__NO_SIDE_EFFECTS__*/\nconst millisecondsToSeconds = (milliseconds) => milliseconds / 1000;\n\nexport { millisecondsToSeconds, secondsToMilliseconds };\n//# sourceMappingURL=time-conversion.mjs.map\n","const generateLinearEasing = (easing, duration, // as milliseconds\nresolution = 10 // as milliseconds\n) => {\n let points = \"\";\n const numPoints = Math.max(Math.round(duration / resolution), 2);\n for (let i = 0; i < numPoints; i++) {\n points += Math.round(easing(i / (numPoints - 1)) * 10000) / 10000 + \", \";\n }\n return `linear(${points.substring(0, points.length - 2)})`;\n};\n\nexport { generateLinearEasing };\n//# sourceMappingURL=linear.mjs.map\n","/**\n * Implement a practical max duration for keyframe generation\n * to prevent infinite loops\n */\nconst maxGeneratorDuration = 20000;\nfunction calcGeneratorDuration(generator, timeStep = 50, maxDuration = maxGeneratorDuration, keyframes) {\n let duration = 0;\n let state = generator.next(duration);\n keyframes?.push(state.value);\n while (!state.done && duration < maxDuration) {\n duration += timeStep;\n state = generator.next(duration);\n keyframes?.push(state.value);\n }\n return duration >= maxDuration ? Infinity : duration;\n}\n\nexport { calcGeneratorDuration, maxGeneratorDuration };\n//# sourceMappingURL=calc-duration.mjs.map\n","import { millisecondsToSeconds } from 'motion-utils';\nimport { calcGeneratorDuration, maxGeneratorDuration } from './calc-duration.mjs';\n\n/**\n * Create a progress => progress easing function from a generator.\n */\nfunction createGeneratorEasing(options, scale = 100, createGenerator) {\n const generator = createGenerator({ ...options, keyframes: [0, scale] });\n const duration = Math.min(calcGeneratorDuration(generator), maxGeneratorDuration);\n return {\n type: \"keyframes\",\n ease: (progress) => {\n return generator.next(duration * progress).value / scale;\n },\n duration: millisecondsToSeconds(duration),\n };\n}\n\nexport { createGeneratorEasing };\n//# sourceMappingURL=create-generator-easing.mjs.map\n","import { millisecondsToSeconds, clamp, secondsToMilliseconds, warning } from 'motion-utils';\nimport { generateLinearEasing } from '../waapi/utils/linear.mjs';\nimport { calcGeneratorDuration, maxGeneratorDuration } from './utils/calc-duration.mjs';\nimport { createGeneratorEasing } from './utils/create-generator-easing.mjs';\n\nconst springDefaults = {\n // Default spring physics\n stiffness: 100,\n damping: 10,\n mass: 1.0,\n velocity: 0.0,\n // Default duration/bounce-based options\n duration: 800, // in ms\n bounce: 0.3,\n visualDuration: 0.3, // in seconds\n // Rest thresholds\n restSpeed: {\n granular: 0.01,\n default: 2,\n },\n restDelta: {\n granular: 0.005,\n default: 0.5,\n },\n // Limits\n minDuration: 0.01, // in seconds\n maxDuration: 10.0, // in seconds\n minDamping: 0.05,\n maxDamping: 1,\n};\nfunction calcAngularFreq(undampedFreq, dampingRatio) {\n return undampedFreq * Math.sqrt(1 - dampingRatio * dampingRatio);\n}\nconst rootIterations = 12;\nfunction approximateRoot(envelope, derivative, initialGuess) {\n let result = initialGuess;\n for (let i = 1; i < rootIterations; i++) {\n result = result - envelope(result) / derivative(result);\n }\n return result;\n}\n/**\n * This is ported from the Framer implementation of duration-based spring resolution.\n */\nconst safeMin = 0.001;\nfunction findSpring({ duration = springDefaults.duration, bounce = springDefaults.bounce, velocity = springDefaults.velocity, mass = springDefaults.mass, }) {\n let envelope;\n let derivative;\n warning(duration <= secondsToMilliseconds(springDefaults.maxDuration), \"Spring duration must be 10 seconds or less\", \"spring-duration-limit\");\n let dampingRatio = 1 - bounce;\n /**\n * Restrict dampingRatio and duration to within acceptable ranges.\n */\n dampingRatio = clamp(springDefaults.minDamping, springDefaults.maxDamping, dampingRatio);\n duration = clamp(springDefaults.minDuration, springDefaults.maxDuration, millisecondsToSeconds(duration));\n if (dampingRatio < 1) {\n /**\n * Underdamped spring\n */\n envelope = (undampedFreq) => {\n const exponentialDecay = undampedFreq * dampingRatio;\n const delta = exponentialDecay * duration;\n const a = exponentialDecay - velocity;\n const b = calcAngularFreq(undampedFreq, dampingRatio);\n const c = Math.exp(-delta);\n return safeMin - (a / b) * c;\n };\n derivative = (undampedFreq) => {\n const exponentialDecay = undampedFreq * dampingRatio;\n const delta = exponentialDecay * duration;\n const d = delta * velocity + velocity;\n const e = dampingRatio *\n dampingRatio *\n undampedFreq *\n undampedFreq *\n duration;\n const f = Math.exp(-delta);\n const g = calcAngularFreq(undampedFreq * undampedFreq, dampingRatio);\n const factor = -envelope(undampedFreq) + safeMin > 0 ? -1 : 1;\n return (factor * ((d - e) * f)) / g;\n };\n }\n else {\n /**\n * Critically-damped spring\n */\n envelope = (undampedFreq) => {\n const a = Math.exp(-undampedFreq * duration);\n const b = (undampedFreq - velocity) * duration + 1;\n return -safeMin + a * b;\n };\n derivative = (undampedFreq) => {\n const a = Math.exp(-undampedFreq * duration);\n const b = (velocity - undampedFreq) * (duration * duration);\n return a * b;\n };\n }\n const initialGuess = 5 / duration;\n const undampedFreq = approximateRoot(envelope, derivative, initialGuess);\n duration = secondsToMilliseconds(duration);\n if (isNaN(undampedFreq)) {\n return {\n stiffness: springDefaults.stiffness,\n damping: springDefaults.damping,\n duration,\n };\n }\n else {\n const stiffness = undampedFreq * undampedFreq * mass;\n return {\n stiffness,\n damping: dampingRatio * 2 * Math.sqrt(mass * stiffness),\n duration,\n };\n }\n}\nconst durationKeys = [\"duration\", \"bounce\"];\nconst physicsKeys = [\"stiffness\", \"damping\", \"mass\"];\nfunction isSpringType(options, keys) {\n return keys.some((key) => options[key] !== undefined);\n}\nfunction getSpringOptions(options) {\n let springOptions = {\n velocity: springDefaults.velocity,\n stiffness: springDefaults.stiffness,\n damping: springDefaults.damping,\n mass: springDefaults.mass,\n isResolvedFromDuration: false,\n ...options,\n };\n // stiffness/damping/mass overrides duration/bounce\n if (!isSpringType(options, physicsKeys) &&\n isSpringType(options, durationKeys)) {\n // Time-defined springs should ignore inherited velocity.\n // Velocity from interrupted animations can cause findSpring()\n // to compute wildly different spring parameters, leading to\n // massive oscillation on small-range animations.\n springOptions.velocity = 0;\n if (options.visualDuration) {\n const visualDuration = options.visualDuration;\n const root = (2 * Math.PI) / (visualDuration * 1.2);\n const stiffness = root * root;\n const damping = 2 *\n clamp(0.05, 1, 1 - (options.bounce || 0)) *\n Math.sqrt(stiffness);\n springOptions = {\n ...springOptions,\n mass: springDefaults.mass,\n stiffness,\n damping,\n };\n }\n else {\n const derived = findSpring({ ...options, velocity: 0 });\n springOptions = {\n ...springOptions,\n ...derived,\n mass: springDefaults.mass,\n };\n springOptions.isResolvedFromDuration = true;\n }\n }\n return springOptions;\n}\nfunction spring(optionsOrVisualDuration = springDefaults.visualDuration, bounce = springDefaults.bounce) {\n const options = typeof optionsOrVisualDuration !== \"object\"\n ? {\n visualDuration: optionsOrVisualDuration,\n keyframes: [0, 1],\n bounce,\n }\n : optionsOrVisualDuration;\n let { restSpeed, restDelta } = options;\n const origin = options.keyframes[0];\n const target = options.keyframes[options.keyframes.length - 1];\n /**\n * This is the Iterator-spec return value. We ensure it's mutable rather than using a generator\n * to reduce GC during animation.\n */\n const state = { done: false, value: origin };\n const { stiffness, damping, mass, duration, velocity, isResolvedFromDuration, } = getSpringOptions({\n ...options,\n velocity: -millisecondsToSeconds(options.velocity || 0),\n });\n const initialVelocity = velocity || 0.0;\n const dampingRatio = damping / (2 * Math.sqrt(stiffness * mass));\n const initialDelta = target - origin;\n const undampedAngularFreq = millisecondsToSeconds(Math.sqrt(stiffness / mass));\n const decay = dampingRatio * undampedAngularFreq;\n /**\n * If we're working on a granular scale, use smaller defaults for determining\n * when the spring is finished.\n *\n * These defaults have been selected emprically based on what strikes a good\n * ratio between feeling good and finishing as soon as changes are imperceptible.\n */\n const isGranularScale = Math.abs(initialDelta) < 5;\n restSpeed || (restSpeed = isGranularScale\n ? springDefaults.restSpeed.granular\n : springDefaults.restSpeed.default);\n restDelta || (restDelta = isGranularScale\n ? springDefaults.restDelta.granular\n : springDefaults.restDelta.default);\n let resolveSpring;\n let resolveVelocity;\n if (dampingRatio < 1) {\n const angularFreq = calcAngularFreq(undampedAngularFreq, dampingRatio);\n const A = (initialVelocity + decay * initialDelta) / angularFreq;\n // Coefficients for the analytical derivative (px/ms)\n const sinCoeff = decay * A + initialDelta * angularFreq;\n const cosCoeff = decay * initialDelta - A * angularFreq;\n /**\n * The underdamped hot path needs both position and velocity every\n * frame and they share the same exp/sin/cos terms, so sample both\n * at once, memoized by t, to only calculate them once per frame.\n */\n let sampledT = -1;\n let position = 0;\n let velocityAtT = 0;\n const sample = (t) => {\n if (t !== sampledT) {\n sampledT = t;\n const envelope = Math.exp(-decay * t);\n const sin = Math.sin(angularFreq * t);\n const cos = Math.cos(angularFreq * t);\n position = target - envelope * (A * sin + initialDelta * cos);\n velocityAtT = envelope * (sinCoeff * sin + cosCoeff * cos);\n }\n };\n // Underdamped spring\n resolveSpring = (t) => {\n sample(t);\n return position;\n };\n resolveVelocity = (t) => {\n sample(t);\n return velocityAtT;\n };\n }\n else if (dampingRatio === 1) {\n // Critically damped spring\n resolveSpring = (t) => target -\n Math.exp(-undampedAngularFreq * t) *\n (initialDelta +\n (initialVelocity + undampedAngularFreq * initialDelta) * t);\n // Analytical derivative of critically damped spring (px/ms)\n const C = initialVelocity + undampedAngularFreq * initialDelta;\n resolveVelocity = (t) => Math.exp(-undampedAngularFreq * t) *\n (undampedAngularFreq * C * t - initialVelocity);\n }\n else {\n // Overdamped spring\n const dampedAngularFreq = undampedAngularFreq * Math.sqrt(dampingRatio * dampingRatio - 1);\n resolveSpring = (t) => {\n const envelope = Math.exp(-decay * t);\n // When performing sinh or cosh values can hit Infinity so we cap them here\n const freqForT = Math.min(dampedAngularFreq * t, 300);\n return (target -\n (envelope *\n ((initialVelocity + decay * initialDelta) *\n Math.sinh(freqForT) +\n dampedAngularFreq *\n initialDelta *\n Math.cosh(freqForT))) /\n dampedAngularFreq);\n };\n // Analytical derivative of overdamped spring (px/ms)\n const P = (initialVelocity + decay * initialDelta) / dampedAngularFreq;\n const sinhCoeff = decay * P - initialDelta * dampedAngularFreq;\n const coshCoeff = decay * initialDelta - P * dampedAngularFreq;\n resolveVelocity = (t) => {\n const envelope = Math.exp(-decay * t);\n const freqForT = Math.min(dampedAngularFreq * t, 300);\n return (envelope *\n (sinhCoeff * Math.sinh(freqForT) +\n coshCoeff * Math.cosh(freqForT)));\n };\n }\n const generator = {\n calculatedDuration: isResolvedFromDuration ? duration || null : null,\n velocity: (t) => secondsToMilliseconds(resolveVelocity(t)),\n next: (t) => {\n const current = resolveSpring(t);\n if (!isResolvedFromDuration) {\n const currentVelocity = secondsToMilliseconds(resolveVelocity(t));\n state.done =\n Math.abs(currentVelocity) <= restSpeed &&\n Math.abs(target - current) <= restDelta;\n }\n else {\n state.done = t >= duration;\n }\n state.value = state.done ? target : current;\n return state;\n },\n toString: () => {\n const calculatedDuration = Math.min(calcGeneratorDuration(generator), maxGeneratorDuration);\n const easing = generateLinearEasing((progress) => generator.next(calculatedDuration * progress).value, calculatedDuration, 30);\n return calculatedDuration + \"ms \" + easing;\n },\n toTransition: () => { },\n };\n return generator;\n}\nspring.applyToOptions = (options) => {\n const generatorOptions = createGeneratorEasing(options, 100, spring);\n options.ease = generatorOptions.ease;\n options.duration = secondsToMilliseconds(generatorOptions.duration);\n options.type = \"keyframes\";\n return options;\n};\n\nexport { spring };\n//# sourceMappingURL=spring.mjs.map\n","import { calcGeneratorDuration, spring } from 'motion'\nimport type { MotionAdapter } from './types.js'\n\ninterface AnimationOptions {\n type: 'spring'\n velocity: number\n stiffness: number\n damping: number\n onUpdate(value: number): void\n onComplete(): void\n}\n\ninterface AnimationControls {\n stop(): void\n}\n\ntype AnimationDriver = (\n from: number,\n to: number,\n options: AnimationOptions,\n) => AnimationControls\n\nconst motionDriver: AnimationDriver = (from, to, options) => {\n const generator = spring({\n keyframes: [from, to],\n velocity: options.velocity,\n stiffness: options.stiffness,\n damping: options.damping,\n })\n // Use the same duration sampling and millisecond rounding as Motion's\n // JSAnimation, so the existing spring trajectory and settling time survive.\n const duration = calcGeneratorDuration(generator)\n let startTime = performance.now()\n let stopped = false\n let frameId: number\n\n const update = (timestamp: number) => {\n if (stopped) return\n // A browser's frame timestamp can precede performance.now() at startup.\n startTime = Math.min(startTime, timestamp)\n const elapsed = Math.round(timestamp - startTime)\n const done = elapsed >= duration\n options.onUpdate(done ? to : generator.next(elapsed).value)\n if (stopped) return\n if (done) {\n // Motion's animate() reports completion through a promise. Preserve\n // that ordering, but suppress completion if effect cleanup intervenes.\n queueMicrotask(() => {\n if (stopped) return\n stopped = true\n options.onComplete()\n })\n } else {\n frameId = requestAnimationFrame(update)\n }\n }\n\n frameId = requestAnimationFrame(update)\n return {\n stop() {\n stopped = true\n cancelAnimationFrame(frameId)\n },\n }\n}\n\nexport function createMotionAdapter(\n driver: AnimationDriver = motionDriver,\n): MotionAdapter {\n return {\n start(request) {\n if (request.reducedMotion) {\n request.onUpdate(request.to)\n request.onComplete()\n return { stop() {} }\n }\n\n const controls = driver(request.from, request.to, {\n type: 'spring',\n velocity: request.velocity * 1000,\n stiffness: 380,\n damping: 38,\n onUpdate: request.onUpdate,\n onComplete: request.onComplete,\n })\n\n return { stop: () => controls.stop() }\n },\n }\n}\n\nexport const motionAdapter = createMotionAdapter()\n","import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n useSyncExternalStore,\n} from 'react'\nimport type { ReactNode } from 'react'\nimport { SheetContext } from '../context/sheet-context.js'\nimport { createSheetController } from '../controller/create-controller.js'\nimport { useReducedMotion } from '../hooks/use-reduced-motion.js'\nimport { useSheetInteractions } from '../hooks/use-sheet-interactions.js'\nimport { useSheetLayout } from '../hooks/use-sheet-layout.js'\nimport { useSheetMotion } from '../hooks/use-sheet-motion.js'\nimport type { ResolvedLayout } from '../layout/types.js'\nimport { motionAdapter } from '../motion/motion-adapter.js'\nimport type {\n OpenChangeDetails,\n OpenChangeReason,\n SnapPoint,\n} from '../public-types.js'\n\nexport interface SheetRootProps {\n children: ReactNode\n open?: boolean\n defaultOpen?: boolean\n onOpenChange?: (open: boolean, details: OpenChangeDetails) => void\n snapPoints?: readonly SnapPoint[]\n activeSnapPoint?: string\n defaultSnapPoint?: string\n onSnapPointChange?: (id: string) => void\n modal?: boolean\n dismissible?: boolean\n}\n\nconst DEFAULT_SNAP_POINTS: readonly SnapPoint[] = [\n { id: 'content', value: 'content' },\n]\n\nexport function Root({\n children,\n open: controlledOpen,\n defaultOpen,\n onOpenChange,\n snapPoints = DEFAULT_SNAP_POINTS,\n activeSnapPoint: controlledSnapPoint,\n defaultSnapPoint,\n onSnapPointChange,\n modal = true,\n dismissible = true,\n}: SheetRootProps) {\n const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen ?? false)\n const [titleId, setTitleId] = useState<string>()\n const [descriptionId, setDescriptionId] = useState<string>()\n const [viewport, setViewport] = useState<HTMLElement | null>(null)\n const [content, setContent] = useState<HTMLElement | null>(null)\n const [layout, setLayout] = useState<ResolvedLayout | null>(null)\n const [uncontrolledSnapPoint, setUncontrolledSnapPoint] = useState(\n defaultSnapPoint ?? snapPoints[0]?.id,\n )\n const controllerRef = useRef<ReturnType<typeof createSheetController>>(null)\n if (!controllerRef.current) controllerRef.current = createSheetController()\n const controller = controllerRef.current\n const controllerState = useSyncExternalStore(\n controller.subscribe,\n controller.getState,\n controller.getState,\n )\n const layoutRef = useRef(layout)\n const motionPositionRef = useRef(controllerState.position)\n const backdropRef = useRef<HTMLElement | null>(null)\n const backdropProgressRef = useRef(0)\n layoutRef.current = layout\n if (controllerState.phase === 'closed')\n motionPositionRef.current = controllerState.position\n const open = controlledOpen ?? uncontrolledOpen\n const present = open || controllerState.phase !== 'closed'\n const transitionPhase =\n open && controllerState.phase === 'closed' ? 'open' : controllerState.phase\n const controlled = controlledOpen !== undefined\n const activeSnapPoint = controlledSnapPoint ?? uncontrolledSnapPoint\n const reducedMotion = useReducedMotion()\n\n useEffect(() => {\n if (\n process.env.NODE_ENV !== 'production' &&\n controlledOpen !== undefined &&\n defaultOpen !== undefined\n ) {\n console.warn(\n 'Sheet.Root cannot use both open and defaultOpen; open takes precedence.',\n )\n }\n }, [controlledOpen, defaultOpen])\n\n const requestOpenChange = useCallback(\n (nextOpen: boolean, reason: OpenChangeReason) => {\n if (nextOpen === open) return\n if (!controlled) setUncontrolledOpen(nextOpen)\n onOpenChange?.(nextOpen, { reason })\n },\n [controlled, onOpenChange, open],\n )\n\n const registerTitle = useCallback((id: string) => {\n setTitleId(id)\n return () => setTitleId((current) => (current === id ? undefined : current))\n }, [])\n\n const registerDescription = useCallback((id: string) => {\n setDescriptionId(id)\n return () =>\n setDescriptionId((current) => (current === id ? undefined : current))\n }, [])\n\n const updatePosition = useCallback(\n (position: number) => {\n motionPositionRef.current = position\n content?.style.setProperty('--rsbs-position', `${position}px`)\n },\n [content],\n )\n\n const getPosition = useCallback(() => motionPositionRef.current, [])\n\n const updateBackdropProgress = useCallback(\n (progress: number) => {\n backdropProgressRef.current = progress\n backdropRef.current?.style.setProperty(\n '--rsbs-backdrop-progress',\n String(progress),\n )\n content?.style.setProperty('--rsbs-surface-progress', String(progress))\n },\n [content],\n )\n\n const getBackdropProgress = useCallback(() => backdropProgressRef.current, [])\n\n const registerBackdrop = useCallback((element: HTMLElement | null) => {\n backdropRef.current = element\n element?.style.setProperty(\n '--rsbs-backdrop-progress',\n String(backdropProgressRef.current),\n )\n }, [])\n\n const handleLayout = useCallback(\n (nextLayout: ResolvedLayout) => {\n layoutRef.current = nextLayout\n setLayout(nextLayout)\n controller.dispatch({ type: 'LAYOUT_CHANGED', layout: nextLayout })\n },\n [controller],\n )\n\n useSheetLayout({ viewport, content, snapPoints, onLayout: handleLayout })\n\n useEffect(() => {\n const current = controller.getState()\n const currentLayout = layoutRef.current\n if (open && currentLayout) {\n const point =\n currentLayout.snapPoints.find(({ id }) => id === activeSnapPoint) ??\n currentLayout.snapPoints[0]\n if (\n point &&\n (current.phase === 'closed' ||\n current.phase === 'closing' ||\n (current.phase === 'open' && current.activeSnapPoint !== point.id))\n ) {\n controller.dispatch({\n type: 'OPEN_REQUESTED',\n reason: 'imperative',\n snapPoint: point.id,\n targetPosition: point.position,\n })\n }\n } else if (!open && !['closed', 'closing'].includes(current.phase)) {\n controller.dispatch({ type: 'CLOSE_REQUESTED', reason: 'imperative' })\n }\n }, [activeSnapPoint, controller, layout, open])\n\n useSheetMotion({\n controller,\n state: controllerState,\n closedPosition: layout?.closedPosition ?? controllerState.position,\n reducedMotion,\n adapter: motionAdapter,\n getPosition,\n onUpdate: updatePosition,\n getBackdropProgress,\n onBackdropProgress: updateBackdropProgress,\n })\n\n const handleSnapPointChange = useCallback(\n (id: string) => {\n if (controlledSnapPoint === undefined) setUncontrolledSnapPoint(id)\n onSnapPointChange?.(id)\n },\n [controlledSnapPoint, onSnapPointChange],\n )\n\n const handleDragDismiss = useCallback(() => {\n requestOpenChange(false, 'drag')\n }, [requestOpenChange])\n\n const interactionHandlers = useSheetInteractions({\n content,\n controller,\n state: controllerState,\n layout,\n dismissible,\n onDismiss: handleDragDismiss,\n onSnapPointChange: handleSnapPointChange,\n onPositionChange: updatePosition,\n })\n\n const value = useMemo(\n () => ({\n open,\n present,\n transitionPhase,\n modal,\n dismissible,\n titleId,\n descriptionId,\n requestOpenChange,\n registerTitle,\n registerDescription,\n registerViewport: setViewport,\n registerContent: setContent,\n registerBackdrop,\n interactionHandlers,\n position: motionPositionRef.current,\n surfaceProgress: backdropProgressRef.current,\n dragging: controllerState.phase === 'dragging',\n }),\n [\n descriptionId,\n dismissible,\n modal,\n open,\n present,\n transitionPhase,\n controllerState.phase,\n controllerState.position,\n interactionHandlers,\n registerDescription,\n registerBackdrop,\n registerTitle,\n requestOpenChange,\n setContent,\n setViewport,\n titleId,\n ],\n )\n\n return <SheetContext.Provider value={value}>{children}</SheetContext.Provider>\n}\n","import { forwardRef, useEffect, useId } from 'react'\nimport type { HTMLAttributes, Ref } from 'react'\nimport { Slot } from '../composition/Slot.js'\nimport type { SlotProps } from '../composition/Slot.js'\nimport { useSheetContext } from '../context/sheet-context.js'\n\nexport type SheetTitleProps = HTMLAttributes<HTMLHeadingElement> & {\n asChild?: boolean\n}\n\nexport const Title = forwardRef<HTMLHeadingElement, SheetTitleProps>(\n function Title(\n { asChild = false, children, className, id: providedId, ...props },\n ref,\n ) {\n const generatedId = useId()\n const id = providedId ?? generatedId\n const { registerTitle } = useSheetContext('Sheet.Title')\n useEffect(() => registerTitle(id), [id, registerTitle])\n const shared = {\n ...props,\n id,\n className: ['rsbs-title', className].filter(Boolean).join(' '),\n 'data-rsbs-title': '',\n }\n return asChild ? (\n <Slot {...shared} ref={ref as Ref<HTMLElement>}>\n {children as SlotProps['children']}\n </Slot>\n ) : (\n <h2 {...shared} ref={ref}>\n {children}\n </h2>\n )\n },\n)\n","import { forwardRef } from 'react'\nimport type { ButtonHTMLAttributes, MouseEvent, Ref } from 'react'\nimport { useSheetContext } from '../context/sheet-context.js'\nimport { Slot } from '../composition/Slot.js'\nimport type { SlotProps } from '../composition/Slot.js'\n\nexport interface SheetTriggerProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n asChild?: boolean\n}\n\nexport const Trigger = forwardRef<HTMLButtonElement, SheetTriggerProps>(\n function Trigger(\n {\n asChild = false,\n children,\n className,\n onClick,\n type = 'button',\n ...props\n },\n ref,\n ) {\n const { open, requestOpenChange } = useSheetContext('Sheet.Trigger')\n const sharedProps = {\n ...props,\n className: ['rsbs-trigger', className].filter(Boolean).join(' '),\n 'aria-expanded': open,\n 'data-rsbs-trigger': '',\n onClick: (event: MouseEvent<HTMLElement>) => {\n onClick?.(event as MouseEvent<HTMLButtonElement>)\n if (!event.defaultPrevented) requestOpenChange(true, 'trigger')\n },\n }\n\n return asChild ? (\n <Slot {...sharedProps} ref={ref as Ref<HTMLElement>}>\n {children as SlotProps['children']}\n </Slot>\n ) : (\n <button {...sharedProps} ref={ref} type={type}>\n {children}\n </button>\n )\n },\n)\n","import { forwardRef } from 'react'\nimport type { HTMLAttributes, Ref } from 'react'\nimport { Slot } from '../composition/Slot.js'\nimport type { SlotProps } from '../composition/Slot.js'\nimport { mergeRefs } from '../composition/merge-refs.js'\nimport { useSheetContext } from '../context/sheet-context.js'\n\nexport type SheetViewportProps = HTMLAttributes<HTMLDivElement> & {\n asChild?: boolean\n}\n\nexport const Viewport = forwardRef<HTMLDivElement, SheetViewportProps>(\n function Viewport({ asChild = false, children, className, ...props }, ref) {\n const { registerViewport, transitionPhase } =\n useSheetContext('Sheet.Viewport')\n const shared = {\n ...props,\n className: ['rsbs-viewport', className].filter(Boolean).join(' '),\n 'data-rsbs-viewport': '',\n 'data-rsbs-state': transitionPhase,\n }\n return asChild ? (\n <Slot\n {...shared}\n ref={mergeRefs(registerViewport, ref as Ref<HTMLElement>)}\n >\n {children as SlotProps['children']}\n </Slot>\n ) : (\n <div {...shared} ref={mergeRefs(ref, (value) => registerViewport(value))}>\n {children}\n </div>\n )\n },\n)\n","import { forwardRef } from 'react'\nimport type { HTMLAttributes, Ref } from 'react'\nimport { Slot } from '../composition/Slot.js'\nimport type { SlotProps } from '../composition/Slot.js'\n\nexport type SheetHandleProps = HTMLAttributes<HTMLDivElement> & {\n asChild?: boolean\n}\n\nexport const Handle = forwardRef<HTMLDivElement, SheetHandleProps>(\n function Handle({ asChild = false, children, className, ...props }, ref) {\n const shared = {\n ...props,\n className: ['rsbs-handle', className].filter(Boolean).join(' '),\n 'data-rsbs-handle': '',\n }\n return asChild ? (\n <Slot {...shared} ref={ref as Ref<HTMLElement>}>\n {children as SlotProps['children']}\n </Slot>\n ) : (\n <div {...shared} ref={ref}>\n {children}\n </div>\n )\n },\n)\n","import { useEffect, useState } from 'react'\nimport type { ReactNode } from 'react'\nimport { createPortal } from 'react-dom'\nimport { useSheetContext } from '../context/sheet-context.js'\n\nexport interface SheetPortalProps {\n children: ReactNode\n container?: Element | DocumentFragment | null\n}\n\nexport function Portal({ children, container }: SheetPortalProps) {\n const { present } = useSheetContext('Sheet.Portal')\n const [mounted, setMounted] = useState(false)\n\n useEffect(() => {\n setMounted(true)\n return () => setMounted(false)\n }, [])\n\n if (!mounted || !present) return null\n return createPortal(children, container ?? document.body)\n}\n","import { Backdrop } from './Backdrop.js'\nimport { Close } from './Close.js'\nimport { Content } from './Content.js'\nimport { Description } from './Description.js'\nimport { Root } from './Root.js'\nimport { Title } from './Title.js'\nimport { Trigger } from './Trigger.js'\nimport { Viewport } from './Viewport.js'\n\nexport const Sheet = {\n Root,\n Trigger,\n Portal,\n Backdrop,\n Viewport,\n Content,\n Handle,\n Title,\n Description,\n Close,\n} as const\nimport { Handle } from './Handle.js'\nimport { Portal } from './Portal.js'\n","import type { ReactNode } from 'react'\nimport { Backdrop } from './Backdrop.js'\nimport type { SheetBackdropProps } from './Backdrop.js'\nimport { Content } from './Content.js'\nimport type { SheetContentProps } from './Content.js'\nimport { Description } from './Description.js'\nimport { Handle } from './Handle.js'\nimport { Portal } from './Portal.js'\nimport { Root } from './Root.js'\nimport type { SheetRootProps } from './Root.js'\nimport { Title } from './Title.js'\nimport { Viewport } from './Viewport.js'\nimport type { SheetViewportProps } from './Viewport.js'\n\nexport interface BottomSheetProps extends Omit<SheetRootProps, 'children'> {\n children: ReactNode\n title: ReactNode\n description?: ReactNode\n backdropProps?: SheetBackdropProps\n contentProps?: SheetContentProps\n viewportProps?: SheetViewportProps\n}\n\nexport function BottomSheet({\n backdropProps,\n children,\n contentProps,\n description,\n title,\n viewportProps,\n ...rootProps\n}: BottomSheetProps) {\n return (\n <Root {...rootProps}>\n <Portal>\n <Backdrop {...backdropProps} />\n <Viewport {...viewportProps}>\n <Content {...contentProps}>\n <Handle />\n <Title>{title}</Title>\n {description === undefined ? null : (\n <Description>{description}</Description>\n )}\n {children}\n </Content>\n </Viewport>\n </Portal>\n </Root>\n )\n}\n"],"x_google_ignoreList":[24,25,26,27,28,29,30,31],"mappings":"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"}