The org's wallpaper behind every page, and white copy on it

Featurekamo-signer-monorepo
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.

All changes

Like what you see shipping?

Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.

Start Free ForeverView Pricing