/** * SlotPicker — day layer + time-chip grid for the meeting scheduler. * * Day layer is the design system's own `DatePickerCalendar`, in its `bare` * variant — the SAME component behind `DatePicker`'s popover and * `DateFilterMenu`, not a second day grid styled to look like it; `bare` only * drops the card surface and inset it would otherwise draw inside this panel. `fromDate`/`toDate` pin * navigation to [current month, current + MAX_MONTH_OFFSET] so the past is * unreachable, and `disabledDays` greys out days with no bookable slot — * bounds and availability are different questions, so they arrive separately. * Month navigation drives the host-proxy `monthOffset`, which is why the month * is CONTROLLED here rather than owned by the calendar. Time chips are plain * `Button`s whose variant flips on selection — no bespoke pill. * * LOADING (no blink, ever): the two columns know different amounts, so they * load differently. A CALENDAR is fully derivable from the date — which month, * which weekday each cell falls on — and only WHICH DAYS ARE BOOKABLE needs * the network. So it never unmounts: while a month loads it renders for real * with nothing yet selectable, which is exactly true, and lights up in place. * Only the times column, which genuinely has no answer until the response * lands, shows a placeholder. * * Swapping the calendar for a skeleton was the old behaviour and it is what * made paging months flash: the whole grid vanished and rebuilt to say * something it already knew. * * Each column carries its OWN heading — "Select Date & Time" over the * calendar, the chosen day over the chips. The headings live HERE rather than * above the whole picker so each sits with the thing it labels, and so the * skeletons reproduce them without the parent rendering a heading it cannot * keep in step. * * All slot instants are epoch-ms; every label is rendered in `timezone` * (resolved by the parent AFTER mount — this component never reads Intl * itself, keeping SSR output deterministic). */ export interface SlotPickerProps { /** Bookable slot start times (epoch ms) for the selected duration. */ slots: number[]; /** IANA zone every label renders in (parent resolves post-mount). */ timezone: string; monthOffset: number; onMonthOffsetChange: (offset: number) => void; selectedSlot: number | null; onSelectSlot: (startMs: number) => void; selectedDay: string | null; onSelectDay: (dayKey: string) => void; /** Availability refetch in flight (month change) → per-region skeletons. */ isLoading?: boolean; } /** Stable per-zone day key for an instant, e.g. "2026-08-14" (exported — the * parent uses it to auto-select the first available day). */ export declare function dayKeyInZone(ms: number, timeZone: string): string; /** Static label over the calendar. Exported so a host rendering its own * chrome around the picker can stay in step with it. */ export declare const SLOT_PICKER_HEADING = "Select Date & Time"; /** Deterministic month caption for a given offset (fixed en-US locale so * the SSR and client first-paint markup agree byte-for-byte). */ export declare function monthLabelFor(offset: number): string; /** * The slot area before the first response — the pre-mount window while the * display timezone resolves, and the first availability request. * * The calendar half is REAL, not a placeholder: see the module docblock. Only * the times column is a skeleton, and it is the same one the loaded picker * shows while a month loads, so there is no swap between the two. */ export declare function SlotPickerSkeleton({ monthOffset }: { monthOffset?: number; }): import("react").JSX.Element; /** Same-footprint skeleton for the time-chip column. */ export declare function TimeChipsSkeleton(): import("react").JSX.Element; export declare function SlotPicker({ slots, timezone, monthOffset, onMonthOffsetChange, selectedSlot, onSelectSlot, selectedDay, onSelectDay, isLoading, }: SlotPickerProps): import("react").JSX.Element; //# sourceMappingURL=slot-picker.d.ts.map