App Install Prompt Patterns
Install Unavailable
A static install unavailable notice shows Field Notes, Missing install criteria reason, Use browser bookmark next step, and Install unavailable status.
Program
Unavailable states should explain why install is not offered and give a plain fallback.
install_unavailable_notice.html
Visuals: captured from real browser rendering
<section class="install-unavailable" aria-labelledby="install-unavailable-title"><h2 id="install-unavailable-title">Install unavailable notice</h2><div class="fallback-card" aria-label="Static install unavailable fallback">Use browser bookmark</div><dl>
<div><dt>App</dt><dd>Field Notes</dd></div>
<div><dt>Reason</dt><dd>Missing install criteria</dd></div><div><dt>Next step</dt><dd>Use browser bookmark</dd></div>
<div><dt>Status</dt><dd><span class="badge">Install unavailable</span></dd></div></dl>
<p class="check">Learner check: the fallback is visible without checking install criteria.</p>
<p class="note">Static install unavailable notice only; no beforeinstallprompt event, appinstalled event, service worker, manifest fetch, install criteria check, platform detection, browser UI, route, API, network, storage, cookie, script, event listener, form submit, input, textarea, contenteditable, analytics, timer, object URL, download, account/session behavior, app installation, bookmark creation, or live submission runs.</p></section>
<style>
.install-unavailable { display: grid; gap: 10px; max-width: 38rem; border: 1px solid #b45309; padding: 12px; background: #fffbeb; }
.fallback-card { justify-self: start; border: 1px solid #b45309; background: #ffffff; padding: 8px 12px; font-weight: 700; }
.install-unavailable dl { display: grid; gap: 8px; margin: 0; }
.install-unavailable dl div { display: grid; grid-template-columns: 8rem 1fr; gap: 8px; }
.install-unavailable dt { color: #475569; }
.install-unavailable dd, .check, .note { margin: 0; }
.badge { border-radius: 999px; background: #fde68a; padding: 2px 8px; }
.note { color: #475569; }
</style>
Label the install unavailable notice.

The section is labelled by its visible heading. Show app row.

The app name is exact pinned data. Show reason and next step rows.

The reason and next step are exact pinned data. Render install-unavailable status.

The status badge says install is unavailable. Check unavailable readback.

The check says the fallback is visible without checking install criteria. Check unavailable honesty.

App, reason, next step, status, and no live install.
step flow
step(1) labels the source, step(2) shows the app, step(3) shows reason and next step rows, step(4) shows install-unavailable status, step(5) checks the unavailable readback, and step(6) checks the honesty note.
install unavailable readback
The section heading names the install unavailable notice surface.
unavailable rows
App, Reason, Next step, and Status values are exact pinned data.
no criteria checks
The lesson should not imply beforeinstallprompt events, appinstalled events, service workers, manifest fetches, install criteria checks, platform detection, browser UI, routes, APIs, networks, storage, cookies, scripts, event listeners, form submits, inputs, textareas, contenteditable surfaces, analytics, timers, object URLs, downloads, account/session behavior, app installation, bookmark creation, or live submissions.