From 36a233e08deddf38365313548bb3f9c322015544 Mon Sep 17 00:00:00 2001 From: Grisha Date: Mon, 27 Apr 2026 23:27:17 -0400 Subject: [PATCH] refactor(styles): split design tokens into base / semantic / component layers --- .../communities/CommunityCard.astro | 18 +- src/components/content/PostCard.astro | 16 +- src/components/events/EventCard.astro | 8 +- src/components/layout/Footer.astro | 8 +- src/components/layout/Header.astro | 28 +-- src/components/layout/Hero.astro | 14 +- src/pages/about.astro | 2 +- src/pages/communities.astro | 4 +- src/pages/community-content.astro | 6 +- src/pages/events.astro | 6 +- src/pages/index.astro | 6 +- src/styles/global.css | 183 ++++++++---------- src/styles/themes/horizon.css | 48 +++++ src/styles/tokens.base.css | 38 ++++ src/styles/tokens.components.css | 47 +++++ src/styles/tokens.semantic.css | 132 +++++++++++++ 16 files changed, 403 insertions(+), 161 deletions(-) create mode 100644 src/styles/themes/horizon.css create mode 100644 src/styles/tokens.base.css create mode 100644 src/styles/tokens.components.css create mode 100644 src/styles/tokens.semantic.css diff --git a/src/components/communities/CommunityCard.astro b/src/components/communities/CommunityCard.astro index 9ea7093..b6db392 100644 --- a/src/components/communities/CommunityCard.astro +++ b/src/components/communities/CommunityCard.astro @@ -43,8 +43,8 @@ const Tag = href ? "a" : "div"; display: inline-flex; align-items: center; gap: var(--space-sm); - background: var(--color-surface-card); - border: 1px solid var(--color-border); + background: var(--card); + border: 1px solid var(--card-border); border-radius: var(--radius-pill); padding: var(--space-xs) var(--space-md) var(--space-xs) var(--space-xs); color: inherit; @@ -53,12 +53,12 @@ const Tag = href ? "a" : "div"; } .community-pill--link:hover { - border-color: var(--color-primary); - background: var(--color-surface-card-hover, var(--color-surface-card)); + border-color: var(--primary); + background: var(--card); } .community-pill--link:focus-visible { - outline: 2px solid var(--color-primary); + outline: 2px solid var(--primary); outline-offset: 2px; } @@ -94,23 +94,23 @@ const Tag = href ? "a" : "div"; .community-pill__name { font-size: var(--text-xs); font-weight: 600; - color: var(--neutral-900); + color: var(--card-foreground); line-height: 1.2; white-space: nowrap; } .community-pill__location { font-size: 9px; - color: var(--color-text-muted); + color: var(--foreground-muted); line-height: 1.2; } .community-pill__icon { flex-shrink: 0; - color: var(--color-primary); + color: var(--primary); display: flex; } .community-pill--link:hover .community-pill__icon { - color: var(--color-primary-hover); + color: var(--primary-hover); } diff --git a/src/components/content/PostCard.astro b/src/components/content/PostCard.astro index d0b52c8..7de83e2 100644 --- a/src/components/content/PostCard.astro +++ b/src/components/content/PostCard.astro @@ -51,13 +51,13 @@ const community = `@${source}`; diff --git a/src/components/layout/Header.astro b/src/components/layout/Header.astro index 0666c27..38a95c7 100644 --- a/src/components/layout/Header.astro +++ b/src/components/layout/Header.astro @@ -50,8 +50,8 @@ const isActive = (href: string) => position: sticky; top: 0; z-index: 10; - background: var(--color-surface-card); - border-bottom: 1px solid var(--color-border); + background: var(--header-bg); + border-bottom: 1px solid var(--header-border); } .site-nav { @@ -66,7 +66,7 @@ const isActive = (href: string) => align-items: center; gap: var(--space-sm); text-decoration: none; - color: var(--color-primary); + color: var(--header-link); } .logo-cloud { @@ -74,7 +74,7 @@ const isActive = (href: string) => width: 22px; height: 12px; position: relative; - background: var(--blue-200); + background: var(--header-link-hover-bg); border-radius: 12px; } .logo-cloud::before { @@ -83,7 +83,7 @@ const isActive = (href: string) => width: 10px; height: 10px; border-radius: 50%; - background: var(--blue-200); + background: var(--header-link-hover-bg); top: -5px; left: 4px; } @@ -93,7 +93,7 @@ const isActive = (href: string) => width: 7px; height: 7px; border-radius: 50%; - background: var(--blue-200); + background: var(--header-link-hover-bg); top: -3px; left: 12px; } @@ -104,7 +104,7 @@ const isActive = (href: string) => font-size: var(--text-base); } .logo-at { - color: var(--blue-400); + color: var(--header-link-inactive); } .nav-links { @@ -117,15 +117,15 @@ const isActive = (href: string) => .nav-link { font-size: var(--text-sm); font-weight: 500; - color: var(--color-text-muted); + color: var(--header-fg-muted); text-decoration: none; padding-block: var(--space-xs); } .nav-link:hover { - color: var(--color-text); + color: var(--header-fg); } .nav-link--active { - color: var(--color-primary); + color: var(--header-link); } /* Mobile hamburger */ @@ -140,7 +140,7 @@ const isActive = (href: string) => display: block; width: 20px; height: 2px; - background: var(--color-text); + background: var(--header-fg); position: relative; } .hamburger::before, @@ -149,7 +149,7 @@ const isActive = (href: string) => position: absolute; width: 20px; height: 2px; - background: var(--color-text); + background: var(--header-fg); left: 0; } .hamburger::before { top: -6px; } @@ -171,8 +171,8 @@ const isActive = (href: string) => left: 0; right: 0; flex-direction: column; - background: var(--color-surface-card); - border-bottom: 1px solid var(--color-border); + background: var(--header-bg); + border-bottom: 1px solid var(--header-border); padding: var(--space-base) var(--space-lg); gap: var(--space-base); display: none; diff --git a/src/components/layout/Hero.astro b/src/components/layout/Hero.astro index 8e3d75e..aa3c612 100644 --- a/src/components/layout/Hero.astro +++ b/src/components/layout/Hero.astro @@ -47,7 +47,7 @@ const { subscriberCount = 1000, groupCount = 10 } = Astro.props; .hero { position: relative; overflow: hidden; - background: var(--color-primary); + background: var(--primary); padding-block: var(--space-3xl) var(--space-3xl); } @@ -141,7 +141,7 @@ const { subscriberCount = 1000, groupCount = 10 } = Astro.props; } .hero h1 { - color: var(--color-text-on-primary); + color: var(--primary-foreground); max-width: 28ch; } @@ -162,8 +162,8 @@ const { subscriberCount = 1000, groupCount = 10 } = Astro.props; } .btn--hero { - background: var(--color-text-on-primary); - color: var(--color-primary); + background: var(--primary-foreground); + color: var(--primary); padding: var(--space-md) var(--space-lg); border-radius: var(--radius-sm); font-family: var(--font-body); @@ -174,7 +174,7 @@ const { subscriberCount = 1000, groupCount = 10 } = Astro.props; } .btn--hero:hover { opacity: 0.9; - color: var(--color-primary); + color: var(--primary); } .hero-secondary { @@ -184,7 +184,7 @@ const { subscriberCount = 1000, groupCount = 10 } = Astro.props; text-decoration: none; } .hero-secondary:hover { - color: var(--color-text-on-primary); + color: var(--primary-foreground); } .hero-stats { @@ -200,7 +200,7 @@ const { subscriberCount = 1000, groupCount = 10 } = Astro.props; font-family: var(--font-body); font-weight: 700; font-size: var(--text-xl); - color: var(--color-text-on-primary); + color: var(--primary-foreground); } .hero-stat__label { diff --git a/src/pages/about.astro b/src/pages/about.astro index adf702f..9f36c4c 100644 --- a/src/pages/about.astro +++ b/src/pages/about.astro @@ -133,7 +133,7 @@ import Footer from "../components/layout/Footer.astro"; .prose code { font-size: 0.9em; - background: var(--neutral-100); + background: var(--muted); padding: 2px 6px; border-radius: var(--radius-sm); } diff --git a/src/pages/communities.astro b/src/pages/communities.astro index 35c574c..ecb91c4 100644 --- a/src/pages/communities.astro +++ b/src/pages/communities.astro @@ -60,7 +60,7 @@ const regions = [...grouped.keys()].sort( } .communities-sub { - color: var(--color-text-secondary); + color: var(--foreground-secondary); font-size: var(--text-sm); max-width: 55ch; line-height: var(--leading-relaxed); @@ -94,6 +94,6 @@ const regions = [...grouped.keys()].sort( .community-desc { font-size: var(--text-sm); - color: var(--color-text-secondary); + color: var(--foreground-secondary); } diff --git a/src/pages/community-content.astro b/src/pages/community-content.astro index 0c80732..e3fdc61 100644 --- a/src/pages/community-content.astro +++ b/src/pages/community-content.astro @@ -58,7 +58,7 @@ const mergedPosts = (feedResult.entries ?? []) } .content-sub { - color: var(--color-text-secondary); + color: var(--foreground-secondary); font-size: var(--text-sm); max-width: 55ch; line-height: var(--leading-relaxed); @@ -75,8 +75,8 @@ const mergedPosts = (feedResult.entries ?? []) margin-top: var(--space-xl); padding: var(--space-2xl); text-align: center; - color: var(--color-text-secondary); - background: var(--neutral-100); + color: var(--foreground-secondary); + background: var(--muted); border-radius: var(--radius-md); } diff --git a/src/pages/events.astro b/src/pages/events.astro index 0496403..41604b4 100644 --- a/src/pages/events.astro +++ b/src/pages/events.astro @@ -109,7 +109,7 @@ const rsvpMessage = Astro.url.searchParams.get('rsvp'); } .events-sub { - color: var(--color-text-secondary); + color: var(--foreground-secondary); font-size: var(--text-sm); max-width: 55ch; line-height: var(--leading-relaxed); @@ -142,8 +142,8 @@ const rsvpMessage = Astro.url.searchParams.get('rsvp'); margin-top: var(--space-xl); padding: var(--space-2xl); text-align: center; - color: var(--color-text-secondary); - background: var(--neutral-100); + color: var(--foreground-secondary); + background: var(--muted); border-radius: var(--radius-md); } diff --git a/src/pages/index.astro b/src/pages/index.astro index f7eb57f..fe7de47 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -102,7 +102,7 @@ const events = (eventsResult.entries ?? [])