- Shipped
- September 10, 2026 at 3:48 AM UTC
- Author
- Kamo
- Commit
- 13fe84a
kamo-sign was the one white-labelled surface still painting a flat grey. It now plays the inviting organization's background photography the way kamo-login, kamo-register, the console and KamoMeet already do — **************** `backgroundImageCount` → `<themeBase>/img/bg/{n}.webp`, `backgroundOrder` honoured, an 8 s dwell with a 1.2 s crossfade that stops under prefers-reduced-motion, 404s dropped, and the org's primary over it at 6%. `OrgBackground` lives in @kamo/theme, beside the rest of the themed-asset convention, so the signer has one copy rather than the fifth hand-rolled one. It resolves the slug on EVERY pass and re-probes on KAMO_THEME_REAPPLY: the layout mounts before any token has been validated, so the sender is unknown at first paint and known only once the session lands. **It renders nothing at all when the org has no wallpapers**, and everything that answers to it is gated on that same fact via `useOrgWallpaper()`. White copy over `--background` — which on a themed tenant is #ffffff — would be invisible, so this must never be an unconditional colour. Mounted at four roots, never inside a screen: the phases are wrapped in a `motion.div` that animates `y`, and a transformed ancestor is a containing block, so a `position: fixed` layer inside one slides with the transition instead of standing still behind it. - **A 6% tint is a tint, not a scrim.** White body copy over `crm`'s wallpaper — a sunlit jungle — measures 1.6:1 with the wash alone, and kamo-login's page-wide `rgba(2,0,36,0.2)→0.05` only reaches ~2:1; it gets away with that because every word it shows sits inside a frosted card. The completion screen has no card, so the darkening is a centred radial under the linear gradient, tuned by sampling rendered pixels. Measured against both real tenants, every line now clears AA: 8.5:1 for the heading, 5.5:1 for the footer, worst case 5.5:1. - **The completion screen goes white** — the heading and the download hint with the three lines reported, since they share one surface and half a fix reads as a bug. - **A logo is whatever colour the tenant chose.** `crm`'s is near-black green, invisible on a photograph under a scrim. ThemeLogo takes an `overlayColor` and masks the artwork to a silhouette, the same mechanism kamo-login and KamoMeet use for the org's own logo-overlay setting; the signer passes #ffffff exactly when a wallpaper is up. - **The welcome screen's "message from" card was a 4% wash over `transparent`** — on the flat background the intended near-white tint, over a photograph 96% photograph, with a dark quote in it. It mixes into #fff on a wallpaper instead. - **The public quote page** gets it too, tinted from its own `--quote-primary` and hidden in `@media print` — what the customer files stays white paper. Its org alias is read out of the `/public/<alias>/` segment of the letterhead URL that `QuoteMapper.themeAsset` already builds, rather than adding a field to `PublicBranding` and redeploying two Java services for a stylesheet. The print rule repeats the `html[data-kamo-wallpaper]` selector at full specificity: a media query adds none of its own, so a bare `.quote-page` there would lose to the screen rule and print a transparent page. Verified in a browser against `crm` and `sign-pink` out of the live theme bucket — welcome, consent, document workspace and completion — with contrast measured from rendered pixels rather than eyeballed.