{stat.title}
+{stat.body}
+HTTP 404 · No such file or directory
++ The link is broken, the page moved, or the URL picked up a typo + on the way here. Vocalinux can type what you say, but it can't + type a page that doesn't exist. +
+{stat.body}
++ Did you mean {suggestion}? +
+ ); +} diff --git a/web/src/styles/globals.css b/web/src/styles/globals.css index e816755..5d2c6c0 100644 --- a/web/src/styles/globals.css +++ b/web/src/styles/globals.css @@ -1741,6 +1741,103 @@ font-size: 0.95rem; } + /* 404 page */ + .nf { + display: grid; + gap: 3rem; + padding: 3.5rem 0 5.5rem; + } + + .nf-kicker { + margin: 0 0 1rem; + color: var(--brand-dark); + font-family: var(--font-mono); + font-size: 0.75rem; + letter-spacing: 0.08em; + text-transform: uppercase; + } + + .nf-hero h1 { + margin: 0; + font-size: clamp(2.6rem, 7vw, 5.2rem); + } + + .nf-lede { + margin: 1.2rem 0 0; + color: var(--muted-copy); + font-size: 1.1rem; + line-height: 1.65; + } + + .nf-suggest { + margin: 1rem 0 0; + font-size: 1.05rem; + } + + .nf-next > :first-child { + margin-top: 0; + } + + .nf-suggest a, + .nf-links a { + color: var(--brand); + font-weight: 600; + } + + .nf-actions { + display: flex; + flex-wrap: wrap; + gap: 0.75rem; + margin-top: 1.8rem; + } + + .nf-links { + display: flex; + flex-wrap: wrap; + gap: 0.4rem 1.2rem; + margin-top: 1.4rem; + font-size: 0.95rem; + } + + .nf-stats h2 { + margin: 0; + font-size: clamp(1.5rem, 3vw, 1.85rem); + } + + .nf-stat-grid { + display: grid; + gap: 1rem; + margin-top: 1.2rem; + } + + .nf-stat { + padding: 1.1rem 1.2rem 1.2rem; + background: var(--paper-bright); + border: 1px solid var(--line); + border-radius: var(--radius-sm); + } + + .nf-stat h3 { + margin: 0; + font-family: var(--font-mono); + font-size: 1rem; + font-weight: 600; + letter-spacing: 0; + overflow-wrap: anywhere; + } + + .nf-stat p { + margin: 0.5rem 0 0; + color: var(--muted-copy); + font-size: 0.95rem; + } + + @media (min-width: 760px) { + .nf-stat-grid { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } + } + @keyframes halo { 0% { opacity: 0.85; transform: scale(0.55); } 70%, 100% { opacity: 0; transform: scale(1.7); }