From 651be20100b0cb60f5613e71e922a2ea5f289d3f Mon Sep 17 00:00:00 2001 From: jwinterm Date: Sun, 12 Jul 2026 14:15:46 -0400 Subject: [PATCH] home: drop Selected Works card + juice hero; per-pillar OG cards; sitemap freshness Home: the big empty 'Selected Works' section-container card is gone in favour of a compact centered heading, pulling the bento up ~300px so the work leads directly under the hero. Hero juice (all LCP-safe + motion-safe): the H1 gets an animated gradient sheen (only the gradient POSITION animates, so the largest paint is never delayed; verified opacity stays 1), a soft breathing cyan aura sits behind it (aria-hidden), and the CTAs get a cyan glow + hover lift. Services: each pillar page (and the hub) now generates its own OG social card via the shared gameOgImage helper with a 'Services' badge and the pillar accent, so sharing a pillar shows a distinct card instead of the generic banner. Verified: distinct per-slug image URLs, valid 1200x630 PNGs. Sitemap: bump lastModified 2026-06-01 -> 2026-07-12 (we've meaningfully changed the site). --- apps/web/src/app/globals.css | 21 ++++++++++++- apps/web/src/app/page.tsx | 26 ++++++++-------- .../app/services/[pillar]/opengraph-image.tsx | 31 +++++++++++++++++++ apps/web/src/app/services/opengraph-image.tsx | 14 +++++++++ apps/web/src/app/sitemap.ts | 2 +- 5 files changed, 79 insertions(+), 15 deletions(-) create mode 100644 apps/web/src/app/services/[pillar]/opengraph-image.tsx create mode 100644 apps/web/src/app/services/opengraph-image.tsx diff --git a/apps/web/src/app/globals.css b/apps/web/src/app/globals.css index b49af97..ecfcd96 100644 --- a/apps/web/src/app/globals.css +++ b/apps/web/src/app/globals.css @@ -281,4 +281,23 @@ 100% { width: 0; } } @keyframes nebula-caret { 0%, 50% { border-color: currentColor; } 50.01%, 100% { border-color: transparent; } } -@keyframes nebula-term-out { to { opacity: 0; } } \ No newline at end of file +@keyframes nebula-term-out { to { opacity: 0; } } + +/* Hero title: an animated gradient sheen. LCP-safe — the text paints immediately with the + gradient; only the gradient POSITION animates, which never delays the largest paint. The + global reduced-motion rule freezes it to the base gradient. */ +.hero-title { + background-image: linear-gradient(110deg, #22d3ee 0%, #3b82f6 30%, #7dd3fc 50%, #3b82f6 70%, #22d3ee 100%); + background-size: 220% auto; + -webkit-background-clip: text; + background-clip: text; + color: transparent; + animation: hero-sheen 9s ease-in-out infinite; +} +@keyframes hero-sheen { + 0%, 100% { background-position: 0% center; } + 50% { background-position: 100% center; } +} +/* Soft aura behind the hero title (decorative). Gentle breathing scale/opacity. */ +@keyframes hero-aura { 0%, 100% { opacity: 0.55; transform: translateX(-50%) scale(1); } 50% { opacity: 0.8; transform: translateX(-50%) scale(1.08); } } +.hero-aura { animation: hero-aura 7s ease-in-out infinite; } \ No newline at end of file diff --git a/apps/web/src/app/page.tsx b/apps/web/src/app/page.tsx index 6401c01..bebe568 100644 --- a/apps/web/src/app/page.tsx +++ b/apps/web/src/app/page.tsx @@ -16,11 +16,16 @@ export default function Home() {
+ {/* Decorative aura behind the title (aria-hidden, LCP-safe, motion-safe). */} +