IndexedDB data can be evicted under storage pressure, especially on iOS
Safari. navigator.storage.persist() asks the browser to keep our data. On
Chromium+Firefox it succeeds silently when conditions allow (installed PWA,
engagement heuristics); on Safari it typically grants only for installed
PWAs.
- persistentStorage.js: isPersisted() and requestPersistence() with graceful
fallback when the Storage API is unavailable.
- persistence.js: request persistence once, after the first successful save —
a heuristic that works across Firefox (user gesture context) and
Chromium/Safari (data-stored context).
- sw.js: bump cache version, precache new file.
- index.html: load new script.