fix(y2k): remediate home whitespace + mobile responsiveness

- discography: kill the ballooning empty-media box — compact fixed-height
  chrome tile placeholder instead of a full aspect-square gray void, and
  a real CSS media-query grid (.y2k-grid-records: 1/2/4 cols) so column
  count no longer depends on the host Tailwind having scanned this persona
  template (it stuck at 2 cols at 1440px, making each empty square huge).
- landing: header absolute top-0 -> sticky top-0 (matches every other
  page template) so the audio bar no longer collides with / underlaps
  the navbar.
- waveform_player: constrain to a centered max-w-4xl column with section
  padding (was edge-to-edge full-bleed) and stack on phones.
- headings: remove the wide primary text-shadow halo that read as a stray
  render artifact behind every heading; tone the chrome shimmer to a faint
  glint. All colours stay semantic hsl(var(--token)).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Alex Dunmow 2026-07-05 17:16:40 +08:00
parent 0d1e7164fe
commit b05ecf145d
4 changed files with 52 additions and 14 deletions

View File

@ -3,12 +3,18 @@
<div class="mx-auto max-w-6xl px-4">
{% if heading %}<h2 class="y2k-display glitch text-2xl font-semibold tracking-tight md:text-3xl" data-text="{{ heading }}">{{ heading }}</h2>{% endif %}
{% if releases %}
<div class="mt-8 grid grid-cols-2 gap-6 sm:grid-cols-3 lg:grid-cols-4">
<div class="mt-8 y2k-grid-records">
{% for release in releases %}
<article class="y2k-bevel y2k-card y2k-glow group overflow-hidden bg-card text-card-foreground">
{% if release.cover %}
<div class="aspect-square overflow-hidden bg-muted">
{% if release.link %}<a href="{{ release.link }}" class="block h-full w-full">{% if release.cover %}{% img release.cover alt=release.title class="h-full w-full object-cover transition-transform duration-300 group-hover:scale-105" %}{% else %}<span class="flex h-full w-full items-center justify-center text-muted-foreground"><svg class="h-10 w-10" aria-hidden="true"><use href="/icons/lucide.svg#disc"></use></svg></span>{% endif %}</a>{% elif release.cover %}{% img release.cover alt=release.title class="h-full w-full object-cover" %}{% else %}<span class="flex h-full w-full items-center justify-center text-muted-foreground"><svg class="h-10 w-10" aria-hidden="true"><use href="/icons/lucide.svg#disc"></use></svg></span>{% endif %}
{% if release.link %}<a href="{{ release.link }}" class="block h-full w-full">{% img release.cover alt=release.title class="h-full w-full object-cover transition-transform duration-300 group-hover:scale-105" %}</a>{% else %}{% img release.cover alt=release.title class="h-full w-full object-cover" %}{% endif %}
</div>
{% else %}
<div class="y2k-media-empty y2k-chrome-bg text-muted-foreground">
{% if release.link %}<a href="{{ release.link }}" class="flex h-full w-full items-center justify-center" aria-label="{{ release.title }}"><svg class="h-12 w-12" aria-hidden="true"><use href="/icons/lucide.svg#disc"></use></svg></a>{% else %}<svg class="h-12 w-12" aria-hidden="true"><use href="/icons/lucide.svg#disc"></use></svg>{% endif %}
</div>
{% endif %}
<div class="p-3">
{% if release.title %}<h3 class="y2k-heading truncate text-sm text-foreground">{% if release.link %}<a href="{{ release.link }}" class="hover:underline">{{ release.title }}</a>{% else %}{{ release.title }}{% endif %}</h3>{% endif %}
<p class="y2k-mono mt-1 flex items-center gap-2 text-xs uppercase tracking-wide text-muted-foreground">{% if release.year %}<span>{{ release.year }}</span>{% endif %}{% if release.format %}<span class="text-primary">{{ release.format }}</span>{% endif %}</p>

View File

@ -1,13 +1,17 @@
{% if audioUrl or trackTitle %}<figure class="y2k-bevel y2k-chrome-bg rounded-xl overflow-hidden flex items-stretch gap-4 p-3 my-4" data-block-key="y2k:waveform_player">
{% if audioUrl or trackTitle %}<section class="py-8 bg-background" data-block-key="y2k:waveform_player">
<div class="mx-auto max-w-4xl px-4">
<figure class="y2k-bevel y2k-chrome-bg rounded-xl overflow-hidden flex flex-col gap-4 p-4 sm:flex-row sm:items-stretch">
<div class="w-20 h-20 shrink-0 y2k-image-frame overflow-hidden bg-muted">
{% if coverImage %}{% img coverImage alt=trackTitle class="w-full h-full object-cover" %}{% else %}<span class="flex h-full w-full items-center justify-center text-muted-foreground"><svg class="h-8 w-8" aria-hidden="true"><use href="/icons/lucide.svg#music"></use></svg></span>{% endif %}
</div>
<div class="flex-1 min-w-0 flex flex-col justify-between gap-2">
<figcaption class="flex items-baseline justify-between gap-3 min-w-0">
<figcaption class="flex flex-wrap items-baseline justify-between gap-x-3 gap-y-1 min-w-0">
<span class="y2k-heading text-base truncate text-foreground">{{ trackTitle|default:"untitled track" }}</span>
{% if artist %}<span class="y2k-mono text-xs uppercase tracking-wider text-muted-foreground shrink-0">{{ artist }}</span>{% endif %}
</figcaption>
<div class="w-full h-12 y2k-waveform" aria-hidden="true"></div>
{% if audioUrl %}<audio controls preload="none" class="w-full" src="{{ audioUrl }}">Your browser does not support the audio element.</audio>{% else %}<p class="y2k-mono text-xs text-muted-foreground">No audio source set yet.</p>{% endif %}
</div>
</figure>{% endif %}
</figure>
</div>
</section>{% endif %}

View File

@ -193,20 +193,22 @@ css:
.glitch {
font-family: var(--font-heading, "Orbitron", "Michroma", system-ui, sans-serif);
letter-spacing: 0.03em;
/* Subtle chrome bevel only — the old wide primary halo read as a
stray rendering artifact behind every heading, so it is gone. */
text-shadow:
0 1px 0 hsl(var(--bevel-light) / 0.7),
0 2px 0 hsl(var(--bevel-dark) / 0.35),
0 6px 22px hsl(var(--primary) / 0.4);
0 1px 0 hsl(var(--bevel-light) / 0.55),
0 1px 1px hsl(var(--bevel-dark) / 0.22);
}
/* Chrome shimmer sweep across big headlines (motion, reduced-motion-safe). */
/* Chrome shimmer sweep across big headlines (motion, reduced-motion-safe).
Toned to a faint glint so it never smears the letters in a still frame. */
.glitch {
position: relative;
background-image: linear-gradient(
100deg,
transparent 20%,
hsl(var(--bevel-light) / 0.65) 45%,
hsl(var(--accent) / 0.55) 50%,
transparent 60%);
transparent 35%,
hsl(var(--bevel-light) / 0.3) 48%,
hsl(var(--accent) / 0.22) 50%,
transparent 62%);
background-size: 220% 100%;
background-repeat: no-repeat;
-webkit-background-clip: text;
@ -356,6 +358,32 @@ css:
0 4px 14px hsl(var(--bevel-dark) / 0.22);
}
/* --- Responsive persona grids ----------------------------- */
/* Explicit media queries so column counts do NOT depend on the host
Tailwind build having scanned these theme templates (persona blocks
use responsive class combos no builtin emits, so the JIT drops them
and the grid collapses to its base count). 1 col on phones. */
.y2k-grid-records {
display: grid;
gap: 1.5rem;
grid-template-columns: minmax(0, 1fr);
}
@media (min-width: 640px) {
.y2k-grid-records { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (min-width: 1024px) {
.y2k-grid-records { grid-template-columns: repeat(4, minmax(0, 1fr)); }
}
/* Compact chrome tile for absent album/track art — a fixed, modest
height so an empty media field never balloons into a blank box. */
.y2k-media-empty {
display: flex;
align-items: center;
justify-content: center;
height: 11rem;
}
/* --- Marquee ---------------------------------------------- */
.y2k-marquee {
overflow: hidden;

View File

@ -4,7 +4,7 @@
<body class="y2k-body min-h-screen flex flex-col antialiased" style="background-color: hsl(var(--background)); color: hsl(var(--foreground)); font-family: var(--font-body, &quot;Inter&quot;, system-ui, sans-serif);">
{{ admin_banner_html|safe }}
<div aria-hidden="true" class="scanlines pointer-events-none fixed inset-0 z-50" data-y2k-scanlines></div>
<header class="y2k-chrome w-full absolute top-0 left-0 right-0 z-40">{{ slots.header|safe }}</header>
<header class="y2k-chrome w-full sticky top-0 z-40">{{ slots.header|safe }}</header>
<main class="flex-grow w-full">{% if slots.main %}{{ slots.main|safe }}{% else %}<div class="py-20 text-center y2k-mono uppercase tracking-widest" style="color: hsl(var(--muted-foreground));"><p>Nothing on this page yet</p></div>{% endif %}</main>
<footer class="w-full mt-auto" style="border-top: 1px solid hsl(var(--border));">{{ slots.footer|safe }}</footer>
{{ body_end_html|safe }}