From 7640ab8285676589ae205e817d3c41ef14327159 Mon Sep 17 00:00:00 2001 From: Vivek Date: Thu, 30 Jul 2026 13:49:18 +0530 Subject: [PATCH] fix: replace the wordmark's SVG mask with plain filled paths Reported live: on mobile Safari the header logo's 'W' rendered as a solid near-white rectangle in dark theme, while 'bJs' (plain filled paths, no mask) rendered fine. Confirmed the committed source, the Railway origin, and the Cloudflare-served asset are byte-identical, so this is not the separate Cloudflare staleness issue, it is a genuine rendering bug in the asset technique. All four affected files (both lockup variants, both mark variants) built the 'W' via an SVG : a stroked zigzag painted white inside a black rect, with a further black rect punching a horizontal slice through the middle. An that starts display:none (exactly what hidden dark:block produces for the two theme variants) and later becomes visible is a known WebKit failure mode for masks: the browser can skip reapplying the mask on first paint and show the raw unmasked base rect instead, which for the dark variant is #f7f5f2, matching the reported white box exactly. Replace the mask in all four files with two plain filled elements (the miter-stroke outline of the same zigzag, clipped against the same horizontal band via Sutherland-Hodgman), the same technique 'bJs' already uses and which never exhibits this bug. Verified pixel-identical to the mask rendering for all four files: 0 differing pixels at 3% fuzz (antialiasing only) against a neutral background. webjs-monogram.svg and webjs-monogram-on-light.svg are unaffected: they cut the slice by painting a rect in the tile's own solid background color, which needs no mask since that tile's background is known and solid, unlike the wordmark/mark files sitting on arbitrary page content. Rebuilt webjs-brand-assets.zip so the download bundle matches. Closes #1184 --- website/public/brand/webjs-brand-assets.zip | Bin 5758 -> 5613 bytes website/public/brand/webjs-lockup-on-dark.svg | 12 ++---------- .../public/brand/webjs-lockup-on-light.svg | 12 ++---------- website/public/brand/webjs-mark-on-dark.svg | 12 ++---------- website/public/brand/webjs-mark-on-light.svg | 12 ++---------- 5 files changed, 8 insertions(+), 40 deletions(-) diff --git a/website/public/brand/webjs-brand-assets.zip b/website/public/brand/webjs-brand-assets.zip index b1773d4995a412f73deb97b37bae3c25c4a86671..4fda98356b775c0afc1d696ebb281cffe6dcec0e 100644 GIT binary patch delta 3547 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 delta 3702 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 Z*#Q87e?ot!TJe)RK(g$w4(3e2{{baE#Ww%| diff --git a/website/public/brand/webjs-lockup-on-dark.svg b/website/public/brand/webjs-lockup-on-dark.svg index 589aefec3..ab567ec77 100644 --- a/website/public/brand/webjs-lockup-on-dark.svg +++ b/website/public/brand/webjs-lockup-on-dark.svg @@ -1,14 +1,6 @@ - - - - - - - - - - + + diff --git a/website/public/brand/webjs-lockup-on-light.svg b/website/public/brand/webjs-lockup-on-light.svg index 07dcb9dc1..f1a796362 100644 --- a/website/public/brand/webjs-lockup-on-light.svg +++ b/website/public/brand/webjs-lockup-on-light.svg @@ -1,14 +1,6 @@ - - - - - - - - - - + + diff --git a/website/public/brand/webjs-mark-on-dark.svg b/website/public/brand/webjs-mark-on-dark.svg index 668ffade2..d9e29237b 100644 --- a/website/public/brand/webjs-mark-on-dark.svg +++ b/website/public/brand/webjs-mark-on-dark.svg @@ -1,12 +1,4 @@ - - - - - - - - - - + + diff --git a/website/public/brand/webjs-mark-on-light.svg b/website/public/brand/webjs-mark-on-light.svg index 86d14d479..230cb5411 100644 --- a/website/public/brand/webjs-mark-on-light.svg +++ b/website/public/brand/webjs-mark-on-light.svg @@ -1,12 +1,4 @@ - - - - - - - - - - + +