import type { PlainDate } from '../utils/plainDate';
export interface DayCellState {
    effectivelyDisabled: boolean;
    isToday: boolean;
    isSelected: boolean;
    isInRange: boolean;
    isRangeStart: boolean;
    isRangeEnd: boolean;
    isInPreview: boolean;
    isPreviewStart: boolean;
    isPreviewEnd: boolean;
    isFirstColumn: boolean;
    isLastColumn: boolean;
}
export interface DayCellStateInput {
    date: PlainDate;
    dayIndex: number;
    mode: 'single' | 'range';
    selectedDate: PlainDate | null;
    rangeStart: PlainDate | null;
    rangeEnd: PlainDate | null;
    previewStart: PlainDate | null;
    previewEnd: PlainDate | null;
    today: PlainDate;
    isDisabled: boolean;
    isOutside: boolean;
}
/**
 * Derives all visual/interaction states for a single day cell.
 *
 * Outside (adjacent-month) days never receive selection, range, or preview
 * state: in the two-month layout the same date renders in both panes, and
 * highlighting the spillover copy would duplicate the selection onto the wrong
 * month's pane (#2715).
 */
export declare function computeDayCellState(input: DayCellStateInput): DayCellState;
/** Rounding for the committed range background. */
export declare function computeRangeRounding(state: DayCellState, neighbors?: {
    prevInRange?: boolean;
    nextInRange?: boolean;
}): {
    roundStart: boolean;
    roundEnd: boolean;
};
/** Rounding for the hover-preview background. */
export declare function computePreviewRounding(state: DayCellState, neighbors?: {
    prevInPreview?: boolean;
    nextInPreview?: boolean;
}): {
    roundStart: boolean;
    roundEnd: boolean;
};
/** Whether a day is a selection endpoint (selected, range start, or range end). */
export declare function isEndpoint(state: DayCellState): boolean;
/** Whether a day participates in the continuous committed-range highlight. */
export declare function isRangeHighlighted(input: {
    date: PlainDate;
    mode: 'single' | 'range';
    rangeStart: PlainDate | null;
    rangeEnd: PlainDate | null;
    isDisabled: boolean;
    isOutside: boolean;
}): boolean;
/** Whether a day participates in the continuous hover-preview highlight. */
export declare function isPreviewHighlighted(input: {
    date: PlainDate;
    previewStart: PlainDate | null;
    previewEnd: PlainDate | null;
    isDisabled: boolean;
    isOutside: boolean;
}): boolean;
/**
 * Continuity of the highlighted run through a day's immediate neighbours in the
 * same week row, for both the committed range and the hover preview. A day gets
 * an end cap on whichever side its neighbour does not continue the run (see
 * {@link computeRangeRounding} / {@link computePreviewRounding}).
 */
export interface DayNeighborContinuity {
    prevInRange: boolean;
    nextInRange: boolean;
    prevInPreview: boolean;
    nextInPreview: boolean;
}
/** Minimal shape needed from a week's day cells to derive neighbour continuity. */
export interface NeighborDay {
    date: PlainDate;
    isOutside: boolean;
}
/**
 * Derives whether the previous/next day in the same week row continues the
 * highlighted run, for both range and preview. Broken out from the render path
 * so the neighbour logic is unit-testable in isolation.
 */
export declare function computeDayNeighborContinuity(input: {
    week: ReadonlyArray<NeighborDay>;
    dayIndex: number;
    mode: 'single' | 'range';
    rangeStart: PlainDate | null;
    rangeEnd: PlainDate | null;
    previewStart: PlainDate | null;
    previewEnd: PlainDate | null;
    isDisabled: (date: PlainDate) => boolean;
}): DayNeighborContinuity;
//# sourceMappingURL=dayCellUtils.d.ts.map