- Replace logo partial with faceted low-poly peony bloom (v7: blush→heat)
- Update static/logo.svg (app icon, no background)
- Regenerate OG default image with new logo and correct tagline
- Update favicons
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Lightbox lives outside #main-content so HTMX never destroys it
- Gallery dispatches window events to open/close lightbox
- Add hx-history-elt to #main-content so only that element is snapshotted
- Remove view-transition-name to avoid duplicate conflict on history restore
- Close lightbox on navigation via lightbox:close event
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
FFmpeg inside a find|while pipe was consuming the remaining filenames
from stdin as interactive commands, causing parse errors. Adding
< /dev/null isolates ffmpeg from the pipe so find can feed all paths
to the while loop uninterrupted.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Hugo has no video processing, so FFmpeg runs in the builder stage
before hugo builds, compressing every content/**/*.mp4 in-place.
scripts/compress-videos.sh:
- H.264 CRF 28 + preset slow (good web compression)
- faststart for progressive streaming
- AAC 64k audio
- Only replaces source if output is actually smaller, so
already-lean videos are skipped
Dockerfile:
- apk adds ffmpeg alongside hugo in the builder stage
- RUN compress-videos.sh runs after COPY . . before pnpm build
(compressed files land in public/ via Hugo's copy of page bundles)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Root cause: media container was position:absolute inset-0 but without
z-index, while buttons had no z-index either — in fill mode the image
painted over the buttons making close/fill-toggle unclickable.
Fixes:
- Media div is now absolute inset-0 (explicit), chrome bars are z-10
- Top bar is a single flex row (h-14): left spacer | counter | FILL+✕
so counter, fill toggle and close are vertically aligned at the same
height instead of scattered absolute elements
- Bottom bar is a flex row (h-14) centred over dots
- Both bars have a linear-gradient scrim so chrome stays legible over
fill-mode images without a solid background
- Prev/Next arrows get z-10 so they always sit above the media
- Media padding uses pt-14 pb-14 in fit mode to clear the chrome bars
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>