From 614a8c09e0a552532364eee2bfbf56c9560c1258 Mon Sep 17 00:00:00 2001 From: jwinterm Date: Fri, 5 Jun 2026 23:42:51 -0400 Subject: [PATCH] Splash: icon-only corner buttons on mobile, click-to-enter wave - Mobile: corner nav buttons become icon-only (Portfolio/Apps/Services/About) with aria-labels; subheader hidden on mobile so nothing overlaps the logo. - More ambient motion: logo float plus a second counter-rotating glow ring. - Clicking the logo (or Explore) triggers a Cherenkov wave (wash + expanding rings) before entering; reduced-motion enters instantly. - Beveled glass buttons. --- .../src/components/landing/hero-splash.tsx | 122 +++++++++++++----- 1 file changed, 89 insertions(+), 33 deletions(-) diff --git a/apps/web/src/components/landing/hero-splash.tsx b/apps/web/src/components/landing/hero-splash.tsx index f85f90e..0b61e63 100644 --- a/apps/web/src/components/landing/hero-splash.tsx +++ b/apps/web/src/components/landing/hero-splash.tsx @@ -2,13 +2,14 @@ import Link from "next/link"; import { motion, useReducedMotion } from "framer-motion"; -import { ChevronDown } from "lucide-react"; +import { ChevronDown, LayoutGrid, Smartphone, Wrench, Info } from "lucide-react"; +import { useState } from "react"; const navButtons = [ - { label: "Portfolio", href: "/products", corner: "left-4 top-16 sm:left-6 sm:top-24 lg:left-8 lg:top-32" }, - { label: "Apps", href: "/apps", corner: "right-4 top-16 sm:right-6 sm:top-24 lg:right-8 lg:top-32" }, - { label: "Services", href: "/services", corner: "left-4 bottom-24 sm:left-6 lg:left-8 lg:bottom-32" }, - { label: "About", href: "/about", corner: "right-4 bottom-24 sm:right-6 lg:right-8 lg:bottom-32" }, + { label: "Portfolio", href: "/products", Icon: LayoutGrid, corner: "left-4 top-6 sm:left-6 sm:top-24 lg:left-8 lg:top-32" }, + { label: "Apps", href: "/apps", Icon: Smartphone, corner: "right-4 top-6 sm:right-6 sm:top-24 lg:right-8 lg:top-32" }, + { label: "Services", href: "/services", Icon: Wrench, corner: "left-4 bottom-6 sm:left-6 sm:bottom-24 lg:left-8 lg:bottom-32" }, + { label: "About", href: "/about", Icon: Info, corner: "right-4 bottom-6 sm:right-6 sm:bottom-24 lg:right-8 lg:bottom-32" }, ]; /** The "SUCH" glyph mark (2x2 letter grid) with a Cherenkov-blue treatment. */ @@ -18,7 +19,7 @@ function SuchMark({ animate }: { animate: boolean }) { viewBox="0 0 200 200" role="img" aria-label="Such Software" - className="h-auto w-[min(74vw,44vh)] drop-shadow-[0_0_40px_rgba(34,211,238,0.25)]" + className="h-auto w-[min(72vw,42vh)] drop-shadow-[0_0_40px_rgba(34,211,238,0.25)]" > @@ -30,20 +31,27 @@ function SuchMark({ animate }: { animate: boolean }) { {/* steady bounding box, Cherenkov cyan */} - - {/* a Cherenkov glow segment slowly circling the ring */} + + {/* two Cherenkov glow segments circling the ring in opposite directions */} {animate && ( - + <> + + + )} {/* letters with a gentle breath */} void; sectionRef?: any }) { const prefersReduced = useReducedMotion(); const animate = !prefersReduced; + const [entering, setEntering] = useState(false); + + const handleEnter = () => { + if (entering) return; + if (prefersReduced) { + onEnter(); + return; + } + setEntering(true); // the wave plays, then onEnter fires on completion + }; return (
- {/* Logo + pulsing Cherenkov glow */} -
+ {/* Click-to-enter Cherenkov wave: a full-screen wash + expanding rings */} + {entering && ( + <> +