Every grid cell downloaded the full detail sprite. Generate a smaller
/sprites-grid/v1/ set at build time and let the grid ask for those first,
falling back through the existing detail URLs when a thumbnail is missing so
detail resolution is unchanged. The new prefix is versioned, so it can be cached
forever, and the service worker recognises it alongside the other sprite roots.
The placeholder is now an empty box rather than a spinner: a thousand spinners
cost layout work and announced nothing useful.
Three defects that together meant `npm run test:build` could not pass in any of
its four variants:
- svelte.config.js constructed adapter-netlify inline and never used the
`adapter` export from adapter.mjs, so NODE_ADAPTER=true still produced a flat
build/ directory while the build test expects the node adapter's build/client
layout. adapter.mjs now returns netlify (the deployment target) or node, and
svelte.config.js consumes it.
- No route is prerendered, so workbox's glob found no HTML document and a
generateSW build precached nothing navigable: the app had no offline support
in that mode at all. Adds the root entry and a navigation fallback, matching
what prompt-sw.ts already did by hand for injectManifest builds.
- The build scripts used by the tests skipped the tailwind step that `build`
runs, so static/output.css was never generated on a clean checkout and the
app under test had no stylesheet.
The offline entry point assertion now also accepts the unquoted object key that
prompt-sw.ts's own precache call survives minification as.