feat: terminal-noir redesign — widget system + design token overhaul

Replace cyan-green modern theme with terminal-noir aesthetic aligned to
style-guide.md. Hard edges, monospace-first, linear transitions, no gradients.

Introduce Widget component as the single repeatable section primitive:
title bar with horizontal rule, optional badge/meta — all pages and
sections now use this pattern (Glance-inspired data-driven layout).

Design system changes (globals.css):
- Palette: #0a0a0a bg, #111111 surface, #00cc44 status green, #cc2200 alert red
- Drop Montserrat; Source Code Pro primary, system sans for prose only
- Transitions: linear 120ms; no eased animations, no border-radius

Component changes:
- Nav: flat, border-bottom only, lowercase links
- Hero: 56px square photo, status dot, @ email glyph
- ProjectCard: flat bordered card, 2-col grid, no gradient tile
- Skills: key-value rows with dot-separated values
- Footer: minimal text links

Pages: all sections wrapped in Widget; homelab uses gap-px grid for
at-a-glance, services, and ADRs sections. Archive uses flat list layout.

Data: remove gradient field from Project type; add optional year field
This commit is contained in:
lerko96
2026-04-12 19:23:50 -04:00
parent 05a32492ac
commit 088a06a51c
12 changed files with 396 additions and 377 deletions

View File

@@ -3,59 +3,40 @@
@variant dark (&:where(.dark, .dark *));
@theme {
/* Colors */
--color-green: #2bf3c4;
--color-green-dark: #27bb98;
--color-green-darker: #238770;
--color-green-darkest: #1f4b40;
--color-bg: #272727;
--color-bg-deep: #1b1b1b;
--color-surface: #333333;
--color-grey-1: #4b4b4b;
--color-grey-2: #707171;
--color-grey-3: #999a9a;
--color-grey-4: #c5c6c6;
--color-text: #c5c6c6;
--color-text-muted: #999a9a;
--color-text-light: #f7f9fb;
/* Terminal-Noir palette */
--color-bg: #0a0a0a;
--color-surface: #111111;
--color-surface-raised: #1a1a1a;
--color-border: #2a2a2a;
--color-border-bright: #444444;
--color-text: #e8e8e8;
--color-text-label: #666666;
--color-text-dim: #444444;
--color-accent-green: #00cc44;
--color-accent-red: #cc2200;
/* Typography */
--font-mono: "Source Code Pro", ui-monospace, monospace;
--font-sans: "Montserrat", ui-sans-serif, system-ui, sans-serif;
--font-sans: ui-sans-serif, system-ui, sans-serif;
/* Breakpoints */
--breakpoint-xs: 576px;
/* Animations */
--animate-fade-in: fadeIn 0.6s ease forwards;
--animate-slide-up: slideUp 0.5s ease forwards;
--animate-app-scale: appScale 0.4s ease forwards;
--animate-fade-in: fadeIn 120ms linear forwards;
@keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
@keyframes slideUp {
from { opacity: 0; transform: translateY(20px); }
to { opacity: 1; transform: translateY(0); }
}
@keyframes appScale {
from { transform: scale(0.97); opacity: 0; }
to { transform: scale(1); opacity: 1; }
}
}
/* Base */
html {
scroll-behavior: smooth;
background-color: var(--color-bg-deep);
background-color: var(--color-bg);
color: var(--color-text);
font-family: var(--font-sans);
font-family: var(--font-mono);
}
* {
@@ -64,6 +45,13 @@ html {
padding: 0;
}
/* Default transitions — linear, fast */
a,
button {
transition: color 120ms linear, border-color 120ms linear,
background-color 120ms linear, opacity 120ms linear;
}
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after {
animation-duration: 0.01ms !important;