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.
Uploaded CSVs previously lived only in memory; reloading the app reset the
order list to the embedded SEED_ORDERS_CSV. Now every upload is written to a
new IndexedDB store so inspectors keep their order list after closing/reopening
the PWA.
- db.js: bump DB_VERSION to 4, add object store `ordersCsv` (keyPath 'id'),
saveOrdersCsv(csvText) and loadOrdersCsv().
- csvLoader.js: loadOrdersFromUpload returns { text, orders } so the handler
can persist the raw text alongside the parsed result.
- main.js: init() prefers the stored CSV, falls back to SEED_ORDERS_CSV. The
upload handler persists the CSV before re-rendering.