import type { AppointmentPhoneNumber, AppointmentRecurrenceFrequency } from '../appointment-details-panel/appointment-details-panel.types'; /** A date-only value (a birthday, an all-day start) is already a local day; * anything else parses as the wall clock it carries. */ export declare function parseEventDate(value: string | Date): Date; /** "Wednesday, 24 June 2026" in the reader's locale; '' when unreadable. */ export declare function formatDay(locale: string, value: Date | string): string; /** "09:00–09:45" in the reader's locale, 24-hour; '' when unreadable. */ export declare function formatTimeRange(locale: string, start: Date | string, end?: Date | string): string; /** Absolute stamp for booked-at and history lines: day and time. */ export declare const DETAIL_STAMP_FORMAT: Intl.DateTimeFormatOptions; /** Completed years between a birth date and `on`, the practice's clock * rather than the real one, so the figure never drifts under a test. */ export declare function ageInYears(dobIso: string, on: Date | string): number; /** The host's zone-less wall clock as a local Date, or undefined when it is * not a real 'YYYY-MM-DDTHH:mm:ss' reading. Ranges are checked rather than * round-tripped, so a time inside a daylight-saving gap still parses. */ export declare function parseAppointmentStartIso(startIso: string | undefined): Date | undefined; /** A Timeline set to 'newest-first' is a plain column, so the DOM order * must already be newest first. Unreadable dates stay last, in input * order; equal instants keep theirs. The input is not changed. */ export declare function sortHistoryNewestFirst(entries: readonly T[]): T[]; /** The editor's label key for each frequency, under * `calendarWorkspace.editor.*`. A literal map, so key extractors see * every key. */ export declare const RECURRENCE_LABEL_KEY: Record; /** What a patient record needs for its phones. */ export interface PhonesSource { phone?: string; phones?: AppointmentPhoneNumber[]; } /** Every labelled phone number. The single `phone` is the mobile when the * record carries no list. A record with neither has no numbers, which is * not the same as one labelled blank: the list comes back empty and the * caller omits the rows. */ export declare function patientPhones(patient: PhonesSource): AppointmentPhoneNumber[]; /** What a patient record needs for its address. */ export interface AddressSource { address?: string; postalCode?: string; city?: string; } /** The address as one line, the map search's text. Empty when the host * sent no address at all: the caller then offers no search. */ export declare function patientAddressLine(patient: AddressSource): string; /** The map link's visible label: street and city, as the platform popover * prints them. The postcode belongs in the search, not in the label. */ export declare function patientAddressLabel(patient: AddressSource): string; /** Google Maps search for the patient's address: the popover's map link. */ export declare function patientMapsUrl(patient: AddressSource): string; //# sourceMappingURL=appointment-format.d.ts.map