import type { JSX } from "@solidjs/web"; /** * Context set by `` — carries the swipe state consumed * by `` (e.g. `swiping` flag, per-release strength scalar). * * 1:1 port of Base UI React's `DrawerViewportContext` with accessor-shaped * values for Solid's reactive graph. */ import { type Accessor, createContext, useContext } from "solid-js"; export interface DrawerViewportContextValue { /** Whether an active drag is in progress. */ swiping: Accessor; /** Computed drag transform styles to apply on the popup. */ getDragStyles: () => JSX.CSSProperties; /** Swipe-release transition strength scalar (0.1 - 1), or `null`. */ swipeStrength: Accessor; /** Imperative setter for the `data-swipe-dismiss` attribute. */ setSwipeDismissed: (dismissed: boolean) => void; } /** * Null-sentinel context. `` consults this * optionally — omitting the viewport disables swipe handling but the * popup still renders. */ export const DrawerViewportContext = createContext(null); export function useDrawerViewportContext(): DrawerViewportContextValue; export function useDrawerViewportContext( optional: true, ): DrawerViewportContextValue | null; export function useDrawerViewportContext( optional?: boolean, ): DrawerViewportContextValue | null { const context = useContext(DrawerViewportContext); if (context == null && !optional) { throw new Error( "Base UI: DrawerViewportContext is missing. Drawer parts must be placed within .", ); } return context; }