export type InstallOutcome = 'accepted' | 'dismissed' | 'unknown'; export type BeforeInstallPromptEvent = Event & { prompt: () => Promise; userChoice: Promise<{ outcome: InstallOutcome; platform: string }>; }; export function isIosDevice(userAgent: string): boolean { return /iphone|ipad|ipod/i.test(userAgent); } export function resolveStandaloneDisplayMode(matchMediaStandalone: boolean, navigatorStandalone?: boolean): boolean { return matchMediaStandalone || navigatorStandalone === true; } export function getStandaloneStatus(): boolean { if (typeof window === 'undefined') { return false; } const matchMediaStandalone = window.matchMedia?.('(display-mode: standalone)')?.matches ?? false; const navigatorStandalone = typeof navigator !== 'undefined' ? (navigator as Navigator & { standalone?: boolean }).standalone : undefined; return resolveStandaloneDisplayMode(matchMediaStandalone, navigatorStandalone); }