Launcher polish: monogram reveal-on-failure + app placeholder on every icon surface (v0.163.1)

(A) The launcher monogram bled through every transparent white logo — it rendered
unconditionally under the img. Now hidden by default (.launch-mono display:none),
revealed only when the img chain fails (onerror adds .launch-tile--noimg).

(B) The /static/app-placeholder.svg default reached only app_list_row. The four
other sanctioned app-logo onerror chains now match the canonical SVG->PNG->placeholder
grammar: backups_apps (aligned row), stacks (infra->infra-logo else placeholder),
app_info hero (screenshots still vanish), deploy (keeps .LogoURL/.LogoPNGURL).

Template/CSS only; no handler/funcmap change. 5 tests + 2 red-proofs.
This commit is contained in:
2026-07-24 10:14:25 +02:00
parent 7a53cb43ef
commit 2c80868c63
9 changed files with 199 additions and 10 deletions
@@ -1146,8 +1146,15 @@ a.stat-card:hover {
transform: translateY(-2px);
border-color: var(--blue);
}
/* The monogram is the logo-less fallback ONLY: hidden by default, revealed when the tile's <img>
chain fails (onerror adds .launch-tile--noimg). Otherwise a transparent white glyph would show
the letter bleeding through its gaps on every tile (v0.163.1 live finding). */
.launch-mono {
display: none;
position: absolute;
inset: 0;
align-items: center;
justify-content: center;
color: #fff;
font-family: var(--font-ui);
font-size: 2.4rem;
@@ -1155,6 +1162,7 @@ a.stat-card:hover {
line-height: 1;
user-select: none;
}
.launch-tile--noimg .launch-mono { display: flex; }
.launch-logo {
position: relative;
width: 58%;