The card markup wrapped the entire .post-hero / .post-row in an outer
<a> while ALSO containing inner <a> tags for tag links. HTML5 forbids
nested <a>, so the browser auto-closed the outer link when it hit each
tag link, restructuring the DOM and breaking the grid layout — body
content rendered outside its column, overlapping the image.
Fix:
- Drop the card-wide <a>; image cell is plain div, body cell is plain
div, only title <a class="card-link"> and tag <a> remain
- Apply "stretched link" pattern: title link's ::after uses position:
absolute inset: 0 to overlay the entire card (clickable everywhere)
- Tag links get position: relative + z-index: 2 so they remain
independently clickable above the title overlay
- Grid container moved from removed .post-hero-link to .post-hero
itself (and .post-row-link → .post-row)
- Add min-width: 0 to grid items so the image's intrinsic width can't
blow out the 1.1fr track and crowd the body cell
- Replace post-hero-img aspect-ratio with min-height: 360px (more
predictable in grid contexts)
- Switch numerals in the brand wordmark from Fraunces to Inter — the
extra-bold display digits at 42px were rendering with mangled
glyphs that read as broken text instead of "404"
- Drop scanline overlay (mix-blend-mode: screen interacted poorly
with text glows)
- Soften phosphor glow on .cursor (12px @ 35% opacity instead of
22px @ 55%)
- Replace nav.nav [bracket] mono links with clean uppercase Inter
sans + phosphor underline-on-hover
- Rebalance hero ratio at desktop, fix mobile media query selectors
(.post-hero-link / .post-row-link no longer exist)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Alignment fixes:
- hero-row uses align-items: flex-end so nav baseline aligns with
tagline instead of floating in the middle of the brand block
- post-row image switched to position: absolute inset: 0 inside a
position: relative cell, so the image always exactly fills its
grid cell regardless of body height (no more min-height: 160 forcing
uneven row heights)
- .cursor reverted to Fraunces (same as "hype" wordmark) so baseline
aligns; identity comes from color + chromatic CRT text-shadow
(lime + offset magenta + offset cyan)
Multi-color retro character (CRT phosphor + magenta + amber + cyan):
- VT323 mono accent font added for: post-hero-flag (with "// " lime
prefix + magenta glow), post-hero-meta date (amber), post-hero-tag
(cyan with magenta # prefix), post-row time (amber), post-row-tag
(cyan with magenta # prefix), nav.nav links (with [ ] magenta brackets)
- body bg picks up a third radial-gradient corner in amber (50% 100%)
- Very faint scanline overlay (1.8% opacity, mix-blend-mode: screen)
for ambient CRT texture without affecting readability
- Drop cap scaled up + chromatic aberration (lime + magenta + cyan)
- Headlines + body text remain Fraunces + Inter for clean reading
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Replaces the earlier light editorial pass with a darker premium retro
aesthetic for hype404 specifically:
- Warm near-black bg (#0d0c0a) with subtle radial-gradient phosphor
tint, cream ink (#ebe2cd)
- Phosphor lime accent (#b8e25a) for brand mark, drop cap, code, tag
hover (CRT/terminal nod, restrained — not the harsh #00ff66)
- Hot magenta secondary (#f43f8c) for "Top story" flag, blockquote
rule, drop cap (Y2K Wired-magazine vibe)
- Cyan-leaning links (#7cd1ff)
- Same Fraunces serif headlines + Inter body + JetBrains Mono code
- No scanlines, no glitch, no marquee, no [LOG] tags
Listing pages now use a magazine-style hero card (top story, 1.1:1
image+text grid, 36px headline) + image-row cards for the rest.
Each row has a 220px cover thumb on the left, body on the right.
Posts without images render text-only (CSS :has() fallback). Cover
extracted via raw-markdown regex (no full render needed).
Subtle scroll-reveal animation: cards fade+lift into view via
IntersectionObserver, gracefully skips when unsupported.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Replaces the 90s CRT/terminal aesthetic (green-on-black, scanlines,
marquee, VT323/Press Start 2P, glitch animation, [LOG] tags) with a
clean editorial magazine layout:
- Warm off-white background (#fbfaf6) with rich near-black ink
- Fraunces serif for display/headlines + Inter for body + JetBrains Mono
for code (variable-axis Fraunces with optical-size adjustments)
- Terracotta accent (#e85d3c) — single brand color, used for the "404"
in the wordmark, drop caps, hover states, blockquote rule
- Generous whitespace, 720px reading column, 1100px container
- Card-style post listing with subtle hover lift
- Drop cap on the first paragraph of each article
- Pill-shaped tags + pagination buttons
- Class names preserved (.post, .post-title, .post-content, .tag, etc.)
so PostList and post pages cascade through unchanged
The "hype404" wordmark still leads the brand identity but is now bold
serif rather than pixel-art ASCII. Existing posts' AI-generated CRT
cover images remain — the magazine layout treats them as deliberate
cover-art rather than chrome, which still reads coherently.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Tag pages emitted <link rel="canonical" href="...tag/Foo Bar/">
with literal spaces. Wrap with encodeURIComponent so the canonical
matches the encoded URL in the sitemap.