/**
 * @file snapOffsets.ts
 * @input Pure geometry helpers — no React, no DOM.
 * @output Converts snap points to translateY offsets for the sheet surface.
 * @position Internal to BottomSheet; consumed by useSheetGestures, tested by
 *   snapOffsets.test.ts.
 *
 * The sheet is rendered at its full (fully-open) height and *translated down*
 * to express shorter detents — translate is GPU-composited, so this is cheaper
 * than animating layout height. A detent is therefore a translateY offset in
 * px from the fully-open position (0 = fully open, larger = more collapsed).
 * These helpers turn snap points into that offset list; they are pure so the
 * geometry can be unit-tested without a DOM.
 */
/**
 * Detents whose resting offsets land within this many px of each other are
 * treated as the same stop (the taller one wins). Stops the sheet from having
 * two near-identical rest positions — e.g. when a content-hugging height sits
 * a hair away from a fractional snap point.
 */
export declare const DETENT_DEDUP_PX = 48;
/** Resolve snap points given as viewport fractions (0, 1] to px heights. */
export declare function snapFractionsToHeights(fractions: readonly number[], viewportPx: number): number[];
/**
 * Given the sheet's full height (px, as rendered fully open) and a set of
 * candidate detent *visible heights* (px), return the resting translateY
 * offsets from fully-open, ascending and de-duplicated.
 *
 * - `0` (fully open) is always the first detent.
 * - Only heights strictly shorter than the sheet become collapsed detents; a
 *   height >= the sheet can't be shown by translating down, so it's dropped.
 * - Offsets closer than `dedupPx` collapse to the smaller (taller) offset, so
 *   near-identical detents — e.g. a hug height ≈ a snap point — become one stop.
 */
export declare function computeDetentOffsets(sheetHeight: number, detentHeights: readonly number[], dedupPx?: number): number[];
/** Nearest value in `offsets` to `value` (offsets must be non-empty). */
export declare function nearestOffset(value: number, offsets: readonly number[]): number;
/**
 * Minimum scrim opacity at the peek detent. The scrim thins to a glance state
 * but never fully vanishes, because a modal sheet keeps the background inert —
 * a fully clear backdrop would read as "interactive" when it isn't. (For a
 * genuinely interactive, undimmed peek, use a non-modal sheet, `hasScrim=false`.)
 */
export declare const MIN_PEEK_SCRIM_OPACITY = 0.3;
/**
 * Scrim opacity (1 = fully visible) for a drag/settle `offset`.
 * The scrim stays full while the sheet is at or above its second-shortest
 * detent, then fades as it collapses onto the shortest ("peek") detent — a
 * glance state that thins the backdrop to `MIN_PEEK_SCRIM_OPACITY` (not fully
 * gone, since the sheet is still modal) and holds there below it.
 * A single-detent sheet has no peek, so it instead fades all the way to 0
 * across the dismiss overshoot toward `dismissOffset` (the sheet is leaving).
 */
export declare function scrimOpacityForOffset(offset: number, offsets: readonly number[], dismissOffset: number): number;
/**
 * Settle target for a released drag. Restricts candidates to the drag
 * direction so a committed drag never snaps *back past* where it started
 * (a down-drag settles at/below the start, an up-drag at/above), then picks
 * the nearest remaining detent. `dir`: 1 = dragged down, -1 = up, 0 = neither.
 */
export declare function resolveSettleOffset(value: number, offsets: readonly number[], dir: number, baseOffset: number): number;
//# sourceMappingURL=snapOffsets.d.ts.map