Every text-[color:var(--ink)]/50, border-[color:var(--ink)]/10 and
bg-[color:var(--ink)]/5 in the templates compiled to nothing. Tailwind v3
cannot put an opacity on an arbitrary var() colour, so all 538 of them were
dropped from output.css without a word. Meta text rendered at full ink, card
borders fell back to Tailwind's default grey (bright white rings at night),
and the washes, backdrops and hover pills simply weren't there, on the news
site, the casino and the adventure pages alike.
The palette is now written once per phase and casino room as bare rgb
channels (--ink-rgb and friends), the plain vars are built from them, and
tailwind.config.js exposes ink, muted, accent, warn and card as real colours.
The classes are text-ink/80, border-ink/10, bg-accent/20 now, and they compile.
Restoring the intended opacities as-is would have traded flat for illegible:
ink at 50% measures 2.7 to 2.9:1 on the lit phases. So secondary text gets
its own colour, --muted, per phase and per casino room, taken as faint as it
can go while still clearing 4.5:1 on both the card and the page. Everything
that was ink at 35 to 70% is text-muted. The 20-30% ones are separators and
empty-cell dashes and stay faint.
The bg-theme-* chips carry white text everywhere they appear, and eight of
them measured 2.5 to 3.2:1. Same hues, taken just dark enough to pass (4.6 to
4.7:1). eu, lego and adventure already passed and are unchanged, and the
underline and border colours keep the old pastels since they carry no text.
Static files came out of the embedded FS with no Last-Modified, no ETag and
no Cache-Control, so every page view downloaded the stylesheet and every
script in full, and the service worker's "cheap 304" never happened. Each
file is hashed once now. Templates link through {{asset}}, which appends
?v=<hash>; a request naming the current hash is served immutable for a year,
and everything else gets the hash as its ETag and revalidates to a 304. The
service worker serves versioned URLs cache-first, drops older versions of the
same file as new ones land, and moves to cache v6.
108 lines
5.5 KiB
HTML
108 lines
5.5 KiB
HTML
{{define "title"}}The board — {{.SiteTitle}}{{end}}
|
|
|
|
{{define "main"}}
|
|
<article class="mt-2 mb-10 max-w-4xl mx-auto">
|
|
{{template "realmnav" .}}
|
|
|
|
<header class="rounded-3xl bg-theme-adventure text-white p-6 sm:p-10 shadow-pete relative overflow-hidden">
|
|
<div class="absolute -top-10 -right-6 text-[12rem] opacity-20 select-none" aria-hidden="true">🏆</div>
|
|
<div class="relative">
|
|
<p class="text-sm uppercase tracking-[0.2em] opacity-80">🏆 The board</p>
|
|
<h1 class="font-display text-3xl sm:text-4xl font-bold mt-2 leading-tight">Who's actually been getting on with it.</h1>
|
|
<p class="mt-3 opacity-90 max-w-2xl">
|
|
Ranked by how deep anyone has got, then by how much of the realm they've
|
|
put behind them. Lifetime totals — nothing here decays, and nothing here
|
|
moves while you're not playing.
|
|
</p>
|
|
{{if and .Standings.Known .Standings.Stale}}
|
|
<p class="mt-4 text-xs bg-black/25 rounded-xl px-3 py-2">
|
|
Last count came in {{.Standings.LastSeenAgo}}. Nothing on this board moves fast, but it isn't live either.
|
|
</p>
|
|
{{end}}
|
|
</div>
|
|
</header>
|
|
|
|
{{if .Standings.Rows}}
|
|
<div class="mt-6 rounded-3xl bg-card border-2 border-ink/10 shadow-pete overflow-hidden">
|
|
<div class="overflow-x-auto">
|
|
<table class="w-full text-sm">
|
|
<thead>
|
|
<tr class="text-[11px] uppercase tracking-wider text-muted border-b-2 border-ink/10">
|
|
<th class="text-left font-semibold px-4 py-3 w-10">#</th>
|
|
<th class="text-left font-semibold px-2 py-3">Adventurer</th>
|
|
<th class="text-right font-semibold px-2 py-3" title="The deepest tier they have actually beaten a boss in">Deepest</th>
|
|
<th class="text-right font-semibold px-2 py-3" title="Distinct zones cleared">Zones</th>
|
|
<th class="text-right font-semibold px-2 py-3" title="Total successful clears, repeats included">Clears</th>
|
|
<th class="text-right font-semibold px-2 py-3" title="Things nobody in the realm had ever done before">Firsts</th>
|
|
<th class="text-right font-semibold px-2 py-3" title="Total damage dealt to every Siege boss, all time">Siege</th>
|
|
<th class="text-right font-semibold px-4 py-3" title="Deaths I've reported">Deaths</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{{range .Standings.Rows}}
|
|
<tr class="border-b border-ink/5 last:border-0 hover:bg-ink/[0.03] transition">
|
|
<td class="px-4 py-3 tabular-nums text-muted font-semibold">{{.Rank}}</td>
|
|
<td class="px-2 py-3 min-w-0">
|
|
{{if .Token}}<a href="/adventure/who/{{.Token}}" class="font-semibold hover:text-theme-adventure transition">{{.Name}}</a>
|
|
{{else}}<span class="font-semibold">{{.Name}}</span>{{end}}
|
|
<span class="block text-xs text-muted">
|
|
lv {{.Level}}{{if .ClassRace}} · {{.ClassRace}}{{end}}
|
|
</span>
|
|
</td>
|
|
<td class="px-2 py-3 text-right tabular-nums">
|
|
{{if .DeepestTier}}<span class="standings-tier standings-tier-{{.DeepestTier}}">T{{.DeepestTier}}</span>
|
|
{{else}}<span class="text-ink/25">—</span>{{end}}
|
|
</td>
|
|
<td class="px-2 py-3 text-right tabular-nums{{if not .Zones}} text-ink/25{{end}}">{{if .Zones}}{{.Zones}}{{else}}—{{end}}</td>
|
|
<td class="px-2 py-3 text-right tabular-nums{{if not .Clears}} text-ink/25{{end}}">{{if .Clears}}{{.Clears}}{{else}}—{{end}}</td>
|
|
<td class="px-2 py-3 text-right tabular-nums">
|
|
{{if .Firsts}}<span class="standings-firsts">{{.Firsts}}</span>{{else}}<span class="text-ink/25">—</span>{{end}}
|
|
</td>
|
|
<td class="px-2 py-3 text-right tabular-nums{{if not .SiegeDamage}} text-ink/25{{end}}">
|
|
{{if .SiegeDamage}}{{.SiegeDamage}}{{else}}—{{end}}
|
|
</td>
|
|
<td class="px-4 py-3 text-right tabular-nums{{if not .Deaths}} text-ink/25{{end}}">{{if .Deaths}}{{.Deaths}}{{else}}—{{end}}</td>
|
|
</tr>
|
|
{{end}}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
|
|
<p class="mt-3 text-xs text-muted px-1">
|
|
Deepest is the hardest tier they've actually put a boss down in, not the hardest
|
|
one they've walked into. Deaths is my own count, off the dispatches I've filed.
|
|
</p>
|
|
|
|
{{else}}
|
|
<div class="mt-6 rounded-3xl bg-card border-2 border-ink/10 p-6 shadow-pete">
|
|
<p class="text-sm text-muted">
|
|
{{if .Standings.Known}}
|
|
Nobody on the board yet. Make a character and it fills up.
|
|
{{else}}
|
|
Haven't had the count through from the field yet.
|
|
{{end}}
|
|
</p>
|
|
</div>
|
|
{{end}}
|
|
|
|
{{/* Pete keeps score on himself. He can be hired onto an expedition and he
|
|
duels; a paper that ranks everybody else and quietly leaves itself off the
|
|
table is doing something slightly dishonest. */}}
|
|
<section class="mt-8 rounded-3xl bg-card border-2 border-theme-adventure/30 p-6 shadow-pete">
|
|
<h2 class="font-display text-xl font-bold">And my own record, since you asked</h2>
|
|
{{if .Standings.PeteFought}}
|
|
<p class="mt-2 text-sm text-muted">
|
|
<span class="font-semibold text-theme-adventure tabular-nums text-lg">{{.Standings.PeteWins}}</span> won,
|
|
<span class="font-semibold tabular-nums text-lg">{{.Standings.PeteLosses}}</span> lost.
|
|
I file those myself, which you're welcome to hold against me.
|
|
</p>
|
|
{{else}}
|
|
<p class="mt-2 text-sm text-muted">
|
|
No bouts yet. I'll report them when there are, wins and the other kind.
|
|
</p>
|
|
{{end}}
|
|
</section>
|
|
</article>
|
|
{{end}}
|