export function waitForIdleOrFirstIntent(): Promise { return new Promise((resolve) => { const settle = onFirstIntent(resolve); whenIdle(settle); }); } export function waitForFirstIntent(): Promise { return new Promise((resolve) => { onFirstIntent(resolve); }); } export function waitForIdle(): Promise { return new Promise((resolve) => whenIdle(resolve)); } function onFirstIntent(callback: () => void): () => void { const settle = () => { window.removeEventListener('pointerdown', settle); window.removeEventListener('keydown', settle); callback(); }; window.addEventListener('pointerdown', settle, { once: true }); window.addEventListener('keydown', settle, { once: true }); return settle; } function whenIdle(callback: () => void): void { const requestIdle = () => { if ('requestIdleCallback' in window) { window.requestIdleCallback(callback, { timeout: 5000 }); } else { setTimeout(callback, 5000); } }; if (document.readyState === 'complete') { requestIdle(); } else { window.addEventListener('load', requestIdle, { once: true }); } }