feat(branding): use Ulicraft goat logo in header, ServerCard, and server icon

- landing header + footer brand: swap the Creeper pixel-art for the
  ulicraft-logo-mini.svg goat mark.
- ServerCard fallback icon: same logo (real SLP favicon still overrides on
  a successful ping).
- minecraft: set ICON=/extras/server-icon.png + OVERRIDE_ICON so the
  in-game server-list entry and the SLP favicon use the goat logo. PNG
  ships in ./runtime (mounted /extras).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-11 09:59:07 +02:00
parent 14ef545bbb
commit 4855447b29
6 changed files with 63 additions and 7 deletions

View File

@@ -11,7 +11,6 @@
// Live labels are passed as data-* so copy stays translatable from the page
// (defaults are English). Heads use /headiso. Promo/placeholder players with
// the all-zero UUID are filtered out.
import Creeper from "./Creeper.astro";
import { site } from "../data/site";
interface Props {
@@ -47,9 +46,9 @@ const { status, avatarUrl, avatarMode } = site;
>
<div class="sc-top">
<div class="sc-icon">
<!-- Replaced by the real server favicon on success; Creeper otherwise. -->
<!-- Replaced by the real server favicon on success; Ulicraft logo otherwise. -->
<img class="sc-favicon" alt="" hidden />
<span class="sc-creeper"><Creeper /></span>
<span class="sc-creeper"><img src="/ulicraft-logo-mini.svg" alt="" width="56" height="56" /></span>
</div>
<div class="sc-meta">
@@ -102,7 +101,7 @@ const { status, avatarUrl, avatarMode } = site;
box-shadow: inset 2px 2px 0 var(--bevel-lo), inset -2px -2px 0 var(--bevel-hi);
}
.sc-favicon { width: 64px; height: 64px; image-rendering: pixelated; }
.sc-creeper :global(.creeper) { width: 48px; height: 48px; }
.sc-creeper img { width: 56px; height: 56px; }
.sc-meta { flex: 1; min-width: 0; }
.sc-row1 { display: flex; align-items: baseline; gap: 12px; }

View File

@@ -1,7 +1,6 @@
---
import { site, HEAD_FONTS } from "../data/site";
import { ui, LANGS, LANG_LABEL, LANG_PATH, LANG_REGISTER_PATH, LANG_ACCOUNT_PATH, type Lang } from "../i18n/ui";
import Creeper from "../components/Creeper.astro";
import PixelIcon from "../components/PixelIcon.astro";
import ServerCard from "../components/ServerCard.astro";
import PlayerRoster from "../components/PlayerRoster.astro";
@@ -66,7 +65,7 @@ const dustBits = Array.from({ length: 16 }, (_, i) => {
<header class="nav">
<div class="wrap nav-in">
<a class="brand" href="#top">
<Creeper />
<img class="brand-logo" src="/ulicraft-logo-mini.svg" alt="" width="34" height="34" />
<span class="name">ULICRAFT</span>
</a>
<nav class="nav-links">
@@ -252,7 +251,7 @@ const dustBits = Array.from({ length: 16 }, (_, i) => {
<footer class="footer">
<div class="wrap footer-in">
<a class="brand" href="#top">
<Creeper />
<img class="brand-logo" src="/ulicraft-logo-mini.svg" alt="" width="34" height="34" />
<span class="name">ULICRAFT</span>
</a>
<div class="footer-links">

View File

@@ -295,6 +295,7 @@ section { position: relative; z-index: 1; }
height: 68px;
}
.brand { display: flex; align-items: center; gap: 12px; text-decoration: none; color: var(--text); }
.brand-logo { width: 34px; height: 34px; flex-shrink: 0; }
.brand .name {
font-family: var(--font-head);
font-weight: 600;