- Shipped
- August 29, 2026 at 1:59 AM UTC
- Author
- Kamo
- Commit
- 840ee93
The compact ("simple") logo slot is SVG-only — the backend writes whatever lands in it to a fixed <theme>/img/logo.svg key regardless of the file's real type, and the org's favicons are generated from that object. So the bytes that get uploaded have to be the bytes the member approved. They were not. The picker did the two halves separately: the input stored e.target.files[0] as the file to upload, then handed handleFileChange a preview setter. handleFileChange could only ever reach the preview — for a raster it opened the tracer and set the preview to the traced SVG, for an .eps/.ai/.pdf it converted server-side and set the preview to the result — while the file queued for upload stayed the original pick. A member who chose a PNG was shown a traced SVG, approved it, and saved the raw PNG under the logo.svg key: a broken image on every surface that reads the simple logo, and a favicon rasterised from something that matched nothing they had seen. Both compact slots (company and white-label) now go through one acceptCompactLogo(slot, file) that fills BOTH halves, using the same three intakes from app/lib/logoVectorize the create wizard's LogosStep already uses — already-svg passes through, a vector container converts server-side, a raster opens the tracer and handleSvgAccept turns the accepted Blob into the File that gets uploaded. That module's own docblock says it exists so this screen and the wizard cannot drift on which formats a member may own; this screen had never adopted it and carried an inline copy of the rules, so they had drifted — the wizard got this right and settings did not. The inline copy and its hardcoded /convert-vector call are gone, and the pickers now offer COMPACT_LOGO_ACCEPT, which includes the .eps/.ai/.pdf a browser would otherwise grey out. The white-label FULL slot was on the same preview-only path even though it keeps its uploaded extension; it now takes the picked file as-is, like the company full slot beside it, so its preview is also the bytes that will be uploaded. Both compact inputs clear their value after a pick so the same file can be chosen again after a cancelled trace.