type LogEntry = { id: number; message: string; kind: 'info' | 'warn' | 'error'; at: number; }; type AppState = { /** Which top-level screen is showing. */ view: 'status' | 'picker' | 'ready'; /** Shown while `view` is 'status'. */ message?: string; config?: import('web-gphoto2').Config; supportedOps?: import('web-gphoto2').SupportedOps; prefs: import('./settings.js').Prefs; seq: import('./intervalometer.js').SequenceState; log: LogEntry[]; settingsOpen: boolean; singleShotStatus: 'idle' | 'busy'; /** Whether the preview pane is currently filling the screen. */ fullscreen?: boolean; /** The theme actually in force, once 'system' has been resolved. */ theme?: 'light' | 'dark'; };