- Fix applyConfig self-recursion (const _origApply captured the hoisted
wrapper itself): site.json config — theme, portfolio, socials, bio —
was never applied; site silently fell back to hardcoded brown defaults
- Strengthen theme test to assert the configured primary color exactly
- Portfolio covers: styled placeholder on missing image (like locations),
restore img when Immich carousel kicks in; overlay always visible on touch
- Optional hero photo via site.heroImage with soft scrim (activates only
when the image loads); site.json points at /images/hero.jpg
- Option cards: equal height, centered content
- /#book deep link also works via hashchange
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>