import type { MeetingHost } from '../../schemas/meeting-booking-schema'; /** * ContextPanel — the "who / what / how long" side of the scheduler card * (Calendly-anatomy left panel; stacks on top on mobile). Everything here is * trust surface: host identity (avatar + name + title), the meeting's own * title/description, the duration (chips when the link offers several — the * duration choice lives HERE, not as a separate wizard step), and a * SEARCHABLE timezone picker (all IANA zones with live GMT offsets; * rendering-only — the wire is always epoch-ms). * * `onBack` (optional) puts the card's ONE back edge at the TOP of this panel — * the one spot that stays put while the action side swaps between calendar, * form and confirmation. What it means is the caller's call: the scheduler * points it at the previous STEP from the form, and at the host's own exit * from the calendar. One affordance, one place, so the visitor never has to * work out which of two "Back"s goes where. * * The picker renders only once the parent resolves the zone post-mount — SSR * output stays deterministic; a same-footprint skeleton holds the space. */ export interface SchedulerContextPanelProps { hosts: MeetingHost[]; title?: string; description?: string | null; durationsMs: number[]; selectedDurationMs: number | null; onSelectDuration: (ms: number) => void; /** Resolved IANA zone (null until the client resolves it). */ timezone: string | null; onTimezoneChange?: (tz: string) => void; /** Host-level exit (renders a `BackButton` at the top). Omitted → no back * affordance, which is what an embedder with its own page chrome wants. */ onBack?: () => void; /** Label for {@link onBack}. */ backLabel?: string; /** True once a slot is chosen (details/confirmed steps) — the duration * CHIPS give way to a static duration line, since the step summary already * states the length and a live selector beside a filled-in form invites a * change that would throw the form away. Going Back restores them. */ locked?: boolean; /** Whether the timezone picker renders. Default true: the zone governs every * time on screen, the form's summary line included, so it stays reachable * right up to the confirmation — where there is nothing left to re-read. */ showTimezone?: boolean; className?: string; } /** * Same-footprint skeleton — swaps with the loaded panel with zero shift. * STATIC labels ("Duration", "Timezone") render REAL; only data-driven * content (host identity, duration chips, the zone value) is skeleton. */ export declare function ContextPanelSkeleton({ className, onBack, backLabel, }: { className?: string; onBack?: () => void; backLabel?: string; }): import("react").JSX.Element; export declare function SchedulerContextPanel({ hosts, title, description, durationsMs, selectedDurationMs, onSelectDuration, timezone, onTimezoneChange, onBack, backLabel, locked, showTimezone, className, }: SchedulerContextPanelProps): import("react").JSX.Element; //# sourceMappingURL=context-panel.d.ts.map