import { Mark, ThumbEdgeMode } from '../../../../types/src/range';

export type ThumbConstraints = {
    /**
     * Max thumb's maxLeft constraint (can't go outside right edge).
     * Only applies in 'inside' mode.
     */
    maxThumbMaxLeft: number;
    /**
     * Max thumb's minLeft constraint (can't go below min thumb).
     */
    maxThumbMinLeft: number;
    /**
     * Min thumb's maxLeft constraint (can't go past max thumb).
     */
    minThumbMaxLeft: number;
    /**
     * Min thumb's minLeft constraint (can't go outside left edge).
     * Only applies in 'inside' mode.
     */
    minThumbMinLeft: number;
};
/**
 * Calculates the constraint values for both thumbs when they are at the same position.
 *
 * @param options.maxOffset - The max thumb's offset as a percentage
 * @param options.minOffset - The min thumb's offset as a percentage
 * @param options.percentValue - The shared position as a percentage (0-100)
 * @param options.edgeMode - How thumbs should be positioned at edges:
 *   - 'center': Thumb center aligns with edge (default). Redistributes overflow/underflow.
 *   - 'inside': Thumbs stay fully within track bounds.
 *
 * @returns Object containing all four constraint values
 *
 * @example
 * // At 0% with center mode (default):
 * getMultiThumbConstraints({ percentValue: 0, minOffset: 5, maxOffset: 5 })
 * // minThumbMinLeft: 0, minThumbMaxLeft: 0, maxThumbMinLeft: 10, maxThumbMaxLeft: 100
 *
 * // At 0% with inside mode:
 * getMultiThumbConstraints({ percentValue: 0, minOffset: 5, maxOffset: 5, edgeMode: 'inside' })
 * // minThumbMinLeft: 5, minThumbMaxLeft: 5, maxThumbMinLeft: 15, maxThumbMaxLeft: 95
 */
export declare function getMultiThumbConstraints({ edgeMode, maxOffset, minOffset, percentValue, }: {
    edgeMode?: ThumbEdgeMode;
    maxOffset: number;
    minOffset: number;
    percentValue: number;
}): ThumbConstraints;
/**
 * Converts a value to a percentage based on min and max range.
 * @param value - The value to convert
 * @param min - Minimum value of the range
 * @param max - Maximum value of the range
 * @returns Percentage value (0-100)
 */
export declare function valueToPercentage(value: number, min: number, max: number): number;
/**
 * Filters out hidden marks from the marks array.
 * @param marks - Array of marks to filter
 * @returns Array of visible marks
 */
export declare function filterVisibleMarks(marks: Mark[]): Mark[];
/**
 * Calculates the maximum number of labels that can fit in the available width.
 * @param width - Container width in pixels
 * @param spacing - Minimum spacing between labels in pixels
 * @returns Maximum number of labels that can fit
 */
export declare function calculateMaxLabels(width: number, spacing: number): number;
/**
 * Calculates the step size for distributing labels evenly between first and last marks.
 * @param totalMarks - Total number of visible marks
 * @param remainingLabels - Number of labels to distribute (excluding first and last)
 * @returns Step size for label distribution
 */
export declare function calculateLabelStep(totalMarks: number, remainingLabels: number): number;
/**
 * Calculates the minimum spacing between labels as a percentage of container width.
 * @param spacing - Minimum spacing in pixels
 * @param width - Container width in pixels
 * @returns Minimum spacing as a percentage (0-100)
 */
export declare function calculateMinSpacingPercentage(spacing: number, width: number): number;
/**
 * Checks if a mark position is far enough from both first and last positions.
 * @param markPosition - Position of the mark as a percentage
 * @param firstPosition - Position of the first mark as a percentage
 * @param lastPosition - Position of the last mark as a percentage
 * @param minSpacingPercentage - Minimum spacing required as a percentage
 * @returns True if the mark is far enough from both boundaries
 */
export declare function isMarkFarEnoughFromBoundaries(markPosition: number, firstPosition: number, lastPosition: number, minSpacingPercentage: number): boolean;
/**
 * Calculates which marks should display labels based on available width.
 * Uses a minimum spacing between labels to prevent overcrowding.
 *
 * @param marks - Array of all marks
 * @param width - Container width in pixels
 * @param spacing - Minimum spacing between labels in pixels
 * @param min - Minimum value of the range
 * @param max - Maximum value of the range
 * @returns Set of mark values that should display labels
 */
export declare function calculateVisibleLabelValues(marks: Mark[], width: number, spacing: number, min: number, max: number): Set<number>;
