(function (root, factory) { if (typeof module === 'object' && module.exports) module.exports = factory; else root.createInstallApp = factory; })(typeof self !== 'undefined' ? self : this, function createInstallApp(options) { const dismissedKey = 'stackchain.install.dismissed.v1'; let deferredPrompt = options.initialPrompt || null; let installed = false; function hide() { options.card.hidden = true; } function showNativePrompt(event) { event.preventDefault(); deferredPrompt = event; options.guidance.hidden = true; options.installButton.hidden = false; options.card.hidden = false; } async function install() { if (!deferredPrompt) return; const prompt = deferredPrompt; deferredPrompt = null; options.installButton.disabled = true; await prompt.prompt(); const choice = await prompt.userChoice; if (choice.outcome === 'accepted') { installed = true; hide(); options.status.textContent = 'Stackchain was added to your device.'; } else { hide(); options.installButton.disabled = false; options.status.textContent = 'Installation was not completed.'; } } function dismiss() { options.storage.setItem(dismissedKey, '1'); hide(); } function start() { if (options.isStandalone() || options.storage.getItem(dismissedKey) === '1') { hide(); return; } if (deferredPrompt) showNativePrompt(deferredPrompt); if (options.isIosSafari()) { options.installButton.hidden = true; options.guidance.hidden = false; options.card.hidden = false; } options.window.addEventListener('beforeinstallprompt', showNativePrompt); options.window.addEventListener('appinstalled', () => { installed = true; deferredPrompt = null; hide(); }); options.installButton.addEventListener('click', install); options.dismissButton.addEventListener('click', dismiss); } function state() { if (installed || options.isStandalone()) { return {state:'complete', detail:'Stackchain is installed on this device.'}; } if (options.isIosSafari()) { return {state:'incomplete', detail:'On Safari, tap Share, then Add to Home Screen.'}; } if (deferredPrompt) { return {state:'incomplete', detail:'Stackchain is ready to install.'}; } return {state:'unavailable', detail:'Installation is available from a supported browser.'}; } return {start, install, state}; });