★ THE BLOCKER ON MIGRATING THE 100-LIST WAS NEVER ONLY A MISSING CAPABILITY. It was
a Driver-rejected UX baked into the shared component, and migrating as planned would
have shipped it.
my-upg-100-list/poster-wall.vue:280 records the ruling verbatim (2026-09-23): "three
print buttons, each opening an in-browser print dialog, no silent file download as
the default action. A raw 'Download' button and a 'Prayer List: coming soon'
placeholder were exactly the two buttons he objected to." exportPoster(),
downloadPacket() and download() were REMOVED from that wall for that reason.
PosterWall still had both: exportPoster() downloads a .webp unconditionally, at two
call sites, and downloadPacket() renders the "coming soon" placeholder whenever
there is no records provider. Consuming it would have reintroduced the exact two
buttons the Driver named.
Two props close that, both defaulting to today's behaviour so country-posters and
key-cities are untouched:
posterAction: 'download' | 'print' — 'print' opens the OS print dialog on the
poster. BOTH delivery paths (the shipped .webp and the browser-rasterised
fallback) now route through ONE deliverPoster(), so the modes cannot drift or be
applied to only one of them. Printed blob urls are held until unmount rather than
revoked at print time: the preview <img> is still reading from them, and revoking
early prints a blank sheet.
hidePrayerListWhenSoon — suppress the Prayer List button rather than show it as a
placeholder. The placeholder stays honest where the feature is genuinely unbuilt;
it is only wrong on a wall that DOES print the list.
VERIFIED AT THE RENDERED LAYER, both modes, by counting the two outcomes that
actually distinguish them:
poster-action="print" -> 1 print frame opened, 0 downloads
default (prop absent) -> 0 print frames, 1 download
Counted at appendChild, where openPrintFrame attaches the iframe, rather than by
polling for iframes — the frame SELF-REMOVES on afterprint, so polling finds none
and reads as a failure.
⚠ Two probe mistakes worth recording, because both looked like product bugs: a HUD
selector that matched <script>/<style> text and returned the page's whole token
ladder, and a first click that landed on INDIA — which country-posters marks
`unsupported` (855 groups do not fit a sheet), so it short-circuited with zero
poster requests. Skipping cards showing .ph.is-soon fixed it; the next click fetched
country-chn.webp and completed.