Two prod bugs from the 2026-07-09 owner test:
- post-form.js: complete upload gate on create submit. The form plugin's
guard only blocks PROCESSING/QUEUED, so a failed upload (processing-error)
or a just-picked file (loading) submitted silently and the entry saved
without its photo. Submit is now blocked unless every FilePond item is
processing-complete, with a visible status message for the failed vs
still-uploading cases. (Bundle rebuilt via make build-assets.)
- entry-journal partial: PhotoSwipe slides now link to a 2000px fit-within
derivative and measure THAT file for data-pswp-width/height. The old
img.width/height came from raw getimagesize() of the original, which
ignores EXIF orientation, so stored-rotated portrait JPEGs got landscape
slide boxes and rendered squeezed. Derivatives are re-encoded (EXIF
stripped, orientation baked in server-side), so declared dims always match
rendering. Also fixes the wrapper aspect-ratio pick for portrait-first
entries. Note: Medium 'path' must be called as path() in Twig — the
ArrayAccess 'path' item (page folder) shadows the method.
Covered by tests/ui/post/upload-gate.spec.js and lightbox-dims.spec.js in
the dev repo.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0195b3cDdMeize2Mm1FgC2aU
Render on each journal card, gated by owner_can_edit (R1/R3/R5/R6, KTD8):
- Draft badge (amber) when the entry is unpublished.
- Edit link -> /post?edit=<route>&return=<feed-url> (D5: a save from the home
feed returns to home, not always the trip page); feed_return_url threaded from
trip.html.twig/home.html.twig (page.url).
- Delete control with inline Cancel/Confirm button-swap (no browser dialog),
data-entry-route carried for U6's delete JS, plus an aria-live status slot.
- 44x44px min tap targets (D8); titlerow wraps on narrow phones.
Verified on the container: anon sees no controls/badge; owner sees Edit+Delete on
all 13 cards with a Draft badge on the unpublished one; a non-owner authenticated
session (testrunner vs owner mischa) sees none and no drafts (V5). Browser
screenshot verification unavailable (no local Playwright); did a code-level
layout review instead.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01H1FrCYNq6RXdGYbn5PFrhM
- Lowercase all weather_icons map keys to match stored entry values
('sunny', 'partly cloudy', etc.); add |lower filter as safety net
- Remove vertical-align hack from location pin SVG
- Add display:inline-flex + align-items:center to .journal-post-location
and .journal-post-weather so icons and text share a true center axis
Creates partials/entry-journal.html.twig and partials/entry-story.html.twig
so trip, dailies, and home all use the same up-to-date markup. Home page
gains PhotoSwipe, blurred fill, adaptive aspect ratio, and hash-based
marker scroll. Future changes only need to happen in one place.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Vgmzx8VTTTmCskSpQtsLTr