From efa48f6f6b2f82ec706c88c5342575dc7e53eeb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Ckirukib=E2=80=9D?= <“kirubeljkl679@gmail.com”> Date: Thu, 21 May 2026 14:29:39 +0300 Subject: [PATCH] Refine topography to hero and footer, improve readability and hero motion. Limit mainwhite pattern to the landing hero and a bottom footer band; remove it from sections and page headers. Add vertical water-flow animation and stronger hero particles with hover boost. Fix green text on white sections and card descriptions in green bands, including the two-days program cards. Co-authored-by: Cursor --- app/exhibit/page.tsx | 12 +- app/globals.css | 335 ++++++++++++++++-- app/partners/page.tsx | 4 +- app/speakers/page.tsx | 8 +- components/brand/FooterTopoPattern.tsx | 38 ++ components/brand/TopoCurvyExtend.tsx | 80 ++++- components/exhibit/BoothPackages.tsx | 6 +- components/home/AttendSummitSection.tsx | 12 +- components/home/BoothAcquisitionBand.tsx | 4 +- components/home/ExperienceCards.tsx | 14 +- components/home/Faq.tsx | 2 +- components/home/Hero.tsx | 34 +- components/home/HeroRiftParticles.tsx | 58 +-- components/home/HeroTopographyBackground.tsx | 52 ++- components/home/PartnerMarquee.tsx | 4 +- components/home/PurposeBand.tsx | 4 +- components/home/Speakers.tsx | 6 +- components/home/SponsorTiers.tsx | 28 +- components/home/StatsGrid.tsx | 12 +- components/home/TopicMarquee.tsx | 14 +- components/home/Venue.tsx | 2 +- components/layout/PageRiftHeader.tsx | 7 +- components/layout/Section.tsx | 23 +- components/layout/SiteFooter.tsx | 8 +- components/partners/PartnerCard.tsx | 13 +- components/partners/PartnerSectionBlock.tsx | 6 +- .../partners/PartnershipInquiryForm.tsx | 2 +- components/speakers/SpeakerCard.tsx | 8 +- .../tickets/TicketInclusionsPopover.tsx | 2 +- 29 files changed, 643 insertions(+), 155 deletions(-) create mode 100644 components/brand/FooterTopoPattern.tsx diff --git a/app/exhibit/page.tsx b/app/exhibit/page.tsx index 9e71ffc..446f139 100644 --- a/app/exhibit/page.tsx +++ b/app/exhibit/page.tsx @@ -37,11 +37,13 @@ export default function ExhibitPage() {
-

Booth packages

-

- Choose a footprint that fits how you want to present your brand and products. Final - placement and pricing are confirmed by our exhibitions team. -

+
+

Booth packages

+

+ Choose a footprint that fits how you want to present your brand and products. Final + placement and pricing are confirmed by our exhibitions team. +

+
diff --git a/app/globals.css b/app/globals.css index f69325a..0d9ba3d 100644 --- a/app/globals.css +++ b/app/globals.css @@ -389,29 +389,233 @@ font-family: var(--font-hero-serif), Georgia, "Times New Roman", serif; } - /* ─── mainwhite.svg on white sections only ─── */ + /* ─── mainwhite.svg: hero (green tint) · footer (white on green) ─── */ .topo-tone-light .topo-pattern-asset { mix-blend-mode: multiply; filter: sepia(0.35) saturate(2.6) hue-rotate(92deg) brightness(0.92) contrast(1.2); } + /* Hero — water flowing through contour channels (vertical, not side shake) */ + .rift-hero-topo .topo-hero-pattern-img { + opacity: 0.48; + mix-blend-mode: multiply; + filter: sepia(0.35) saturate(2.6) hue-rotate(92deg) brightness(0.92) contrast(1.2); + transform: scale(1.08); + animation: topo-hero-base-flow 20s linear infinite; + } + + .rift-hero-topo .topo-hero-water-flow-img { + opacity: 0.34; + mix-blend-mode: multiply; + filter: sepia(0.35) saturate(3) hue-rotate(92deg) brightness(1.12) contrast(1.18); + transform: scale(1.12); + animation: topo-hero-water-stream 11s linear infinite; + } + + .topo-hero-water-shimmer { + background: linear-gradient( + to top, + transparent 0%, + rgba(26, 92, 56, 0.05) 12%, + rgba(45, 122, 82, 0.18) 28%, + rgba(140, 220, 175, 0.38) 42%, + rgba(80, 160, 120, 0.32) 52%, + rgba(45, 122, 82, 0.22) 62%, + rgba(26, 92, 56, 0.08) 78%, + transparent 100% + ); + background-size: 120% 320%; + mix-blend-mode: soft-light; + opacity: 0.65; + animation: topo-hero-shimmer-rise 8s ease-in-out infinite; + } + + .topo-hero-channel-glow { + background: radial-gradient( + ellipse 28% 18% at 50% var(--flow-y, 60%), + rgba(120, 200, 160, 0.45) 0%, + rgba(45, 122, 82, 0.2) 35%, + transparent 70% + ); + mix-blend-mode: soft-light; + opacity: 0.7; + animation: topo-hero-channel-glow 8s ease-in-out infinite; + } + + .topo-hero-water-spotlight { + background: radial-gradient( + circle at var(--topo-hover-x, 50%) var(--topo-hover-y, 50%), + rgba(120, 200, 160, 0.28) 0%, + rgba(45, 122, 82, 0.12) 22%, + transparent 52% + ); + mix-blend-mode: soft-light; + opacity: 0; + transition: opacity 0.45s ease; + } + + .rift-hero-topo--hover .topo-hero-water-flow-img { + opacity: 0.52; + animation-duration: 5.5s; + } + + .rift-hero-topo--hover .topo-hero-water-shimmer { + opacity: 1; + animation-duration: 4s; + } + + .rift-hero-topo--hover .topo-hero-channel-glow { + opacity: 1; + animation-duration: 4.5s; + } + + .rift-hero-topo--hover .topo-hero-water-spotlight { + opacity: 1; + } + + .rift-hero-topo--hover .topo-hero-pattern-img { + opacity: 0.56; + animation-duration: 12s; + } + + @keyframes topo-hero-base-flow { + 0% { + object-position: 50% 100%; + } + 100% { + object-position: 50% 0%; + } + } + + @keyframes topo-hero-water-stream { + 0% { + object-position: 46% 100%; + opacity: 0.22; + } + 40% { + opacity: 0.42; + } + 100% { + object-position: 54% 0%; + opacity: 0.26; + } + } + + @keyframes topo-hero-shimmer-rise { + 0% { + background-position: 40% 110%; + } + 100% { + background-position: 60% -15%; + } + } + + @keyframes topo-hero-channel-glow { + 0% { + --flow-y: 95%; + opacity: 0.35; + } + 50% { + --flow-y: 35%; + opacity: 0.85; + } + 100% { + --flow-y: -5%; + opacity: 0.4; + } + } + + /* Footer — white pattern at bottom only */ + .topo-footer-pattern .topo-footer-pattern-asset { + opacity: 0.34; + filter: brightness(0) invert(1); + mix-blend-mode: soft-light; + } + .topo-content-layer { position: relative; z-index: 10; } - /* Plain readable copy on white — no glow, shadow, or blur */ + /* Readable brand-green copy on all white sections */ + .section-white { + color: #0d3d26; + } + + .section-white .topo-content-layer, .section-white .topo-content-readable, - .section-white .topo-content-readable :is(h1, h2, h3, h4, p, li, label, summary), + .section-white .topo-content-layer :is(h1, h2, h3, h4, h5, h6, p, li, label, summary), + .section-white .topo-content-readable :is(h1, h2, h3, h4, h5, h6, p, li, label, summary), + .section-white .topo-content-layer a:not([data-slot="button"]), .section-white .topo-content-readable a:not([data-slot="button"]) { color: #0d3d26; text-shadow: none; } + .section-white .topo-content-layer .text-foreground, + .section-white .topo-content-readable .text-foreground { + color: #1a5c38; + } + + .section-white .topo-content-layer .text-muted-foreground, .section-white .topo-content-readable .text-muted-foreground { color: #3d5248; } + .section-white .topo-prose-surface-light :is(h1, h2, h3, h4, p, li, span) { + color: #0d3d26; + } + + .section-white .topo-prose-surface-light .text-muted-foreground { + color: #3d5248; + } + + .section-white .topo-card-surface, + .section-white .topo-card-surface :is(h1, h2, h3, h4, p, span, li, label, a), + .section-white .bg-white.topo-card-surface :is(h1, h2, h3, h4, p, span), + .section-white [data-slot="card"], + .section-white [data-slot="card"] :is(h1, h2, h3, h4, p, span, li, label) { + color: #1a5c38; + } + + .section-white .topo-card-surface .text-muted-foreground, + .section-white [data-slot="card"] .text-muted-foreground, + .section-white .bg-white .text-muted-foreground { + color: #3d5248; + } + + .section-white [data-slot="accordion-trigger"] { + color: #0d3d26; + } + + .section-white [data-slot="button"][data-variant="outline"], + .section-white [data-slot="button"][data-variant="ghost"], + .section-white [data-slot="button"][data-variant="link"] { + color: #1a5c38; + } + + .section-white [data-slot="button"][data-variant="outline"] { + border-color: rgba(26, 92, 56, 0.35); + } + + .section-white [data-slot="button"][data-variant="ghost"]:hover, + .section-white [data-slot="button"][data-variant="link"]:hover { + color: #0d3d26; + background-color: rgba(26, 92, 56, 0.06); + } + + header.section-white { + color: #0d3d26; + } + + header.section-white .text-muted-foreground { + color: #3d5248; + } + + .section-white:has(.topo-curvy-extend) { + overflow: visible; + } + .topo-curvy-extend { overflow: visible; } @@ -449,43 +653,127 @@ isolation: isolate; } - .section-green .topo-content-layer, - .section-green .topo-content-layer :is(h1, h2, h3, h4, p, li, a, label, span) { + /* Copy sitting directly on green */ + .section-green .topo-on-green-bg, + .section-green .topo-on-green-bg :is(h1, h2, h3, h4, p, li, label) { color: #ffffff; text-shadow: none; } - .section-green .text-muted-foreground { + .section-green .topo-on-green-bg .text-muted-foreground { color: rgba(255, 255, 255, 0.88); } - .section-green [data-slot="button"][data-variant="outline"] { + /* Muted copy on green (outside white cards) → white, not grey */ + .section-green + .topo-content-layer + :not([data-slot="card"]):not([data-slot="card"] *) + .text-muted-foreground { + color: rgba(255, 255, 255, 0.88); + } + + /* White cards / surfaces inside green sections → brand green text */ + .section-green .topo-card-surface, + .section-green .topo-card-surface :is(h1, h2, h3, h4, p, span, li, label, a), + .section-green .bg-white, + .section-green .bg-white :is(h1, h2, h3, h4, p, span, li, label), + .section-green [data-slot="card"], + .section-green [data-slot="card"] :is(h1, h2, h3, h4, p, span, li, label, a) { + color: #1a5c38; + text-shadow: none; + } + + .section-green .topo-card-surface .text-muted-foreground, + .section-green .bg-white .text-muted-foreground, + .section-green [data-slot="card"] .text-muted-foreground, + .section-green [data-slot="card"] [data-slot="card-description"], + .section-green .topo-card-surface [data-slot="card-description"] { + color: #3d5248; + } + + .topo-card-link, + .topo-card-link svg { + color: #1a5c38; + } + .topo-card-link:hover, + .topo-card-link:hover svg { + color: #0d3d26; + } + + .section-green .topo-on-green-bg [data-slot="button"][data-variant="outline"] { border-color: rgba(255, 255, 255, 0.75); background-color: transparent; color: #ffffff; box-shadow: none; } - .section-green [data-slot="button"][data-variant="outline"]:hover { + .section-green .topo-on-green-bg [data-slot="button"][data-variant="outline"]:hover { background-color: rgba(255, 255, 255, 0.14); color: #ffffff; } - .section-green [data-slot="button"][data-variant="ghost"] { + /* Ghost/link buttons on the green band (outside white cards) */ + .section-green .topo-on-green-bg [data-slot="button"][data-variant="ghost"], + .section-green .topo-on-green-bg [data-slot="button"][data-variant="link"], + .section-green > .topo-content-layer > div:not(:has([data-slot="card"])) [data-slot="button"][data-variant="outline"] { color: #ffffff; } - .section-green [data-slot="button"][data-variant="ghost"]:hover { + .section-green .topo-on-green-bg [data-slot="button"][data-variant="ghost"]:hover { background-color: rgba(255, 255, 255, 0.12); color: #ffffff; } - .section-green [data-slot="button"][data-variant="default"]:not([class*="bg-[#ffb300]"]) { + /* Ghost/link/outline actions inside white cards on green sections */ + .section-green .topo-card-surface .topo-card-link, + .section-green [data-slot="card"] .topo-card-link, + .section-green .topo-card-surface .text-foreground, + .section-green [data-slot="card"] .text-foreground, + .section-green [data-slot="card"] [data-slot="button"], + .section-green [data-slot="card"] [data-slot="button"][data-variant="ghost"], + .section-green [data-slot="card"] [data-slot="button"][data-variant="link"], + .section-green .topo-card-surface [data-slot="button"], + .section-green .topo-card-surface [data-slot="button"][data-variant="ghost"], + .section-green .topo-card-surface [data-slot="button"][data-variant="link"], + .section-green .bg-white [data-slot="button"][data-variant="ghost"], + .section-green .bg-white [data-slot="button"][data-variant="link"] { + color: #1a5c38; + } + + .section-green [data-slot="card"] [data-slot="button"][data-variant="ghost"]:hover, + .section-green [data-slot="card"] [data-slot="button"][data-variant="link"]:hover, + .section-green .topo-card-surface [data-slot="button"][data-variant="ghost"]:hover, + .section-green .topo-card-surface [data-slot="button"][data-variant="link"]:hover { + color: #0d3d26; + background-color: rgba(26, 92, 56, 0.06); + } + + .section-green [data-slot="card"] [data-slot="button"][data-variant="outline"], + .section-green .topo-card-surface [data-slot="button"][data-variant="outline"], + .section-green .bg-white [data-slot="button"][data-variant="outline"] { + border-color: rgba(26, 92, 56, 0.4); + color: #1a5c38; + background-color: transparent; + } + + .section-green [data-slot="card"] [data-slot="button"][data-variant="outline"]:hover, + .section-green .topo-card-surface [data-slot="button"][data-variant="outline"]:hover { + border-color: rgba(26, 92, 56, 0.55); + color: #0d3d26; + background-color: rgba(26, 92, 56, 0.06); + } + + .section-green [data-slot="card"] [data-slot="button"] svg, + .section-green .topo-card-surface [data-slot="button"] svg { + color: currentColor; + } + + .section-green .topo-on-green-bg [data-slot="button"][data-variant="default"]:not([class*="bg-[#ffb300]"]) { background-color: #ffb300; color: #0f0404; } - .section-green [data-slot="button"][data-variant="default"]:not([class*="bg-[#ffb300]"]):hover { + .section-green .topo-on-green-bg [data-slot="button"][data-variant="default"]:not([class*="bg-[#ffb300]"]):hover { background-color: #e6a200; color: #0f0404; } @@ -529,17 +817,6 @@ } - .rift-hero-settled .rift-hero-pattern-site .rift-contour-path, - .rift-hero-settled .rift-hero-pattern-water .rift-contour-path { - animation: rift-contour-pulse 8s ease-in-out infinite; - stroke-dashoffset: 0; - } - - .rift-hero-settled .rift-channel-inner { - animation: rift-river-shimmer 6s ease-in-out infinite; - stroke-dashoffset: 0; - } - .rift-crack-line { background: linear-gradient( 90deg, @@ -778,8 +1055,18 @@ .rift-hero-settled .rift-contour-path, .rift-hero-settled .rift-channel-inner, .rift-ambient-pulse .rift-contour-path, - .rift-pulse-animate { + .rift-pulse-animate, + .rift-hero-topo .topo-hero-pattern-img, + .rift-hero-topo .topo-hero-water-flow-img, + .rift-hero-topo .topo-hero-water-shimmer, + .rift-hero-topo .topo-hero-channel-glow { animation: none !important; } + + .rift-hero-topo .topo-hero-water-shimmer, + .rift-hero-topo .topo-hero-water-spotlight, + .rift-hero-topo .topo-hero-channel-glow { + opacity: 0 !important; + } } } diff --git a/app/partners/page.tsx b/app/partners/page.tsx index 0d8d867..e4492d7 100644 --- a/app/partners/page.tsx +++ b/app/partners/page.tsx @@ -35,7 +35,7 @@ export default function PartnersPage() { -
+
{sponsorSections.map((section, index) => (
-
+
{supporterSections.map((section) => ( diff --git a/app/speakers/page.tsx b/app/speakers/page.tsx index cfbcc03..c35d450 100644 --- a/app/speakers/page.tsx +++ b/app/speakers/page.tsx @@ -37,7 +37,7 @@ export default function SpeakersPage() { } description={ -

+

{site.dates.label} · {site.venue.name}

} @@ -48,10 +48,10 @@ export default function SpeakersPage() { {(Object.entries(grouped) as [SpeakerGroup, typeof speakers][]).map( ([group, list]) => (
-
-
+
+

{speakerGroupLabels[group]}

-

{site.dates.label}

+

{site.dates.label}

diff --git a/components/brand/FooterTopoPattern.tsx b/components/brand/FooterTopoPattern.tsx new file mode 100644 index 0000000..955e02c --- /dev/null +++ b/components/brand/FooterTopoPattern.tsx @@ -0,0 +1,38 @@ +import { MAIN_WHITE_PATTERN_SRC } from "@/content/topo-patterns"; +import { cn } from "@/lib/utils"; + +type Props = { + className?: string; +}; + +/** White topography pattern anchored to the bottom of the green footer only. */ +export function FooterTopoPattern({ className }: Props) { + return ( +
+
+ {/* eslint-disable-next-line @next/next/no-img-element */} + +
+
+
+ ); +} diff --git a/components/brand/TopoCurvyExtend.tsx b/components/brand/TopoCurvyExtend.tsx index 32193c9..c2f8c3a 100644 --- a/components/brand/TopoCurvyExtend.tsx +++ b/components/brand/TopoCurvyExtend.tsx @@ -5,53 +5,113 @@ type Props = { }; /** - * Curvy contour lines extending from white pattern sections into the green band below. + * Curvy contours from the white section edge, extending downward into the green section. */ export function TopoCurvyExtend({ className }: Props) { return (
+ {/* Upper curves — sit on the white/green boundary */} + {/* Mid curves — dip into green */} + + {/* Lower curves — deep in green */} + + {/* Vertical strokes — continue downward into green */} + + + + + diff --git a/components/exhibit/BoothPackages.tsx b/components/exhibit/BoothPackages.tsx index c33c8c5..8fb8c3e 100644 --- a/components/exhibit/BoothPackages.tsx +++ b/components/exhibit/BoothPackages.tsx @@ -5,13 +5,13 @@ export function BoothPackages() { return (
{boothPackages.map((pkg) => ( - + {pkg.name} - {pkg.size} + {pkg.size} -

{pkg.description}

+

{pkg.description}

    {pkg.highlights.map((h) => (
  • diff --git a/components/home/AttendSummitSection.tsx b/components/home/AttendSummitSection.tsx index d4f9b8d..b0f4694 100644 --- a/components/home/AttendSummitSection.tsx +++ b/components/home/AttendSummitSection.tsx @@ -10,7 +10,7 @@ import { cn } from "@/lib/utils"; export function AttendSummitSection() { return (
    -
    +

    {attendCopy.eyebrow}

    @@ -33,25 +33,25 @@ export function AttendSummitSection() { delay={i * 75} as="article" className={cn( - "group flex flex-col rounded-2xl border border-border bg-white p-6 shadow-sm", + "topo-card-surface group flex flex-col rounded-2xl border border-border bg-white p-6 text-[#1a5c38] shadow-sm", "transition-shadow duration-200 hover:border-[#1a5c38]/25 hover:shadow-md" )} > -

    {path.title}

    -

    +

    {path.title}

    +

    {path.description}

    diff --git a/components/home/BoothAcquisitionBand.tsx b/components/home/BoothAcquisitionBand.tsx index 698bd27..ef05ea2 100644 --- a/components/home/BoothAcquisitionBand.tsx +++ b/components/home/BoothAcquisitionBand.tsx @@ -21,12 +21,12 @@ export function BoothAcquisitionBand() { {exhibitCopy.eyebrow}

    {exhibitCopy.headline}

    -

    {exhibitCopy.subheadline}

    +

    {exhibitCopy.subheadline}

    -
    diff --git a/components/home/ExperienceCards.tsx b/components/home/ExperienceCards.tsx index db40f52..5c25423 100644 --- a/components/home/ExperienceCards.tsx +++ b/components/home/ExperienceCards.tsx @@ -11,7 +11,7 @@ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/com export function ExperienceCards() { return (
    - +

    Two days to go deep into what Ethiopia's innovators need

    @@ -22,7 +22,7 @@ export function ExperienceCards() {
    {experiences.map((exp, i) => ( - +
    -

    +

    Day {i + 1}

    {exp.title} - {exp.description} + {exp.description}
    -