The placeholder was a bare beamed-pair glyph in solid black on a
transparent ground — invisible against the dark Minstrel surface and
without any visual edge to anchor the card layout. Real album covers
have content that defines their boundary; the placeholder needs the
same affordance to keep the layout grid feeling intentional.
Wraps the user-supplied glyph in:
- iron-tone (#1E2228) fill matching the card surface so the placeholder
reads as a card without artwork rather than a hole in the page;
- pewter (#3F4651) border on the inside edge, consistent with how real
cards feel framed;
- ash-tone (#9C9A92) recolor + 0.7x downscale + recenter so the glyph
sits comfortably inside the border without clipping.
Hex hard-coded because static SVGs can't resolve CSS variables;
matches the FabledSword tokens exactly.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Replaces the hand-rolled inline-data-URL placeholder with a static SVG
asset at /placeholders/album-fallback.svg. SvelteKit's adapter-static
publishes everything in web/static/ at the URL root and the Go binary
embeds the build output, so this resolves identically in dev and prod.
Operator can swap the artwork by replacing the file — no code changes.
Test updated to use toContain rather than strict equality, since jsdom
resolves relative URLs against the test origin.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- SvelteKit 2.x + Svelte 5 + TypeScript + Vite 5
- adapter-static with fallback:'index.html' for SPA deep-link routing
- Tailwind configured with dark-only palette matching spec
- Placeholder landing page at /
- Committed web/build/index.html placeholder (via .gitignore negation) so
go:embed works before the SvelteKit build has been run