export interface MenuRec { item: string; price: string; note?: string; } export interface Place { name: string; lat: number; lng: number; category: string; phone?: string; address?: string; hours?: string; website?: string; cost?: string; photo?: string; description?: string; details?: Record; tags?: string[]; action?: { label: string; href: string }; recommendations?: MenuRec[]; } export interface DayStop { name: string; arrival?: string; departure?: string; purpose?: string; } export interface Drive { from: string; to: string; distance?: string; duration?: string; route?: [number, number][]; costs?: { item: string; amount: string }[]; } export interface Day { date: string; label: string; summary: string; stops: DayStop[]; drives: Drive[]; } export interface HourlyWeather { time: string; location: string; temp: number; feelsLike?: number; conditions: string; wind?: string; note?: string; } export interface Weather { date: string; high: number; low: number; conditions: string; sunrise: string; sunset: string; hourly?: HourlyWeather[]; } export interface SafetyData { hospitals: Place[]; contacts: { name: string; phone: string; notes: string }[]; cellCoverage: { segment: string; status: "full" | "spotty" | "none" }[]; crashProtocol: string[]; checklist: string[]; } export interface Meal { id: string; label: string; sub?: string; day: number; budget?: number; preferences?: string; notes?: string; selected?: string[]; candidates: Place[]; } export interface TripMeta { title: string; subtitle: string; dates: string[]; travelers: string[]; type: string; origin: string; destination: string; notes?: string; } export interface TripSummary extends TripMeta { id: string; } export type ActualKind = "food" | "stop" | "note" | "departure" | "arrival"; export type WeatherCondition = "sunny" | "mostly-clear" | "partly-cloudy" | "cloudy" | "foggy" | "rain"; export interface EntryWeather { temp: number; conditions: WeatherCondition; wind?: { speed: number; dir: string }; humidity?: number; uv?: number; sunrise?: string; sunset?: string; note?: string; } export interface StructuredItem { id: string; name: string; duration?: string; free?: boolean; where?: string; note?: string; } export type CellularLevel = "good" | "spotty" | "none"; export interface ActualEntry { time: string; kind: ActualKind; title: string; body?: string; items?: (string | StructuredItem)[]; suggestedOrder?: string[]; rating?: number; lat?: number; lng?: number; placeName?: string; mood?: string; photo?: string; tags?: string[]; cellular?: CellularLevel; weather?: EntryWeather; } export interface ActualDay { label: string; entries: ActualEntry[]; } export interface WrapupTodo { task: string; done: boolean; } export interface WrapupExpense { item: string; amount: string; category?: string; } export interface WrapupData { todos: WrapupTodo[]; expenses: WrapupExpense[]; highlights: string[]; lessons: string[]; summary: string; } export interface Trip { id: string; meta: TripMeta; weather: Weather[]; pack: string[]; packState: Record; places: Place[]; meals: Meal[]; safety: SafetyData; days: Day[]; actuals: ActualDay[]; wrapup: WrapupData; } export interface MapSummary { id: string; title: string; subtitle?: string; count?: number; } export interface MapPlace { name: string; address?: string; lat: number; lng: number; phone?: string; website?: string; hours?: string; ebt?: string; city?: string; description?: string; } export interface StandaloneMap { id: string; title: string; subtitle?: string; places: MapPlace[]; }