/** * Open a URL in the device's real browser. * * In a normal mobile/desktop browser this is just `window.open(_blank)`. Inside * the Android companion app the page runs in a WebView where `window.open` is * unreliable (noopener/noreferrer can suppress onCreateWindow), so the native * shell injects a `window.ArchipelagoNative.openExternal(url)` bridge that hands * the URL to an ACTION_VIEW intent. We prefer the bridge when present and fall * back to `window.open` otherwise — so the working mobile-browser path is * untouched. */ interface ArchipelagoNativeBridge { openExternal?: (url: string) => void } export function openExternalUrl(url: string): void { if (!url) return const native = (window as unknown as { ArchipelagoNative?: ArchipelagoNativeBridge }) .ArchipelagoNative if (native && typeof native.openExternal === 'function') { native.openExternal(url) return } window.open(url, '_blank', 'noopener,noreferrer') }