diff --git a/app/globals.css b/app/globals.css
index 649f99f..9ff5a70 100644
--- a/app/globals.css
+++ b/app/globals.css
@@ -422,6 +422,95 @@ html[lang="ar"] .eyebrow {
}
}
+ /* ---- Hero entrance (pure CSS so it never flashes blank before hydration) ---- */
+ .hero-rise {
+ opacity: 0;
+ animation: hero-rise-in 0.62s cubic-bezier(0.22, 1, 0.36, 1) both;
+ }
+
+ .hero-content > *:nth-child(1) {
+ animation-delay: 0.06s;
+ }
+ .hero-content > *:nth-child(2) {
+ animation-delay: 0.14s;
+ }
+ .hero-content > *:nth-child(3) {
+ animation-delay: 0.22s;
+ }
+ .hero-content > *:nth-child(4) {
+ animation-delay: 0.3s;
+ }
+ .hero-content > *:nth-child(5) {
+ animation-delay: 0.38s;
+ }
+ .hero-content > *:nth-child(6) {
+ animation-delay: 0.46s;
+ }
+
+ @keyframes hero-rise-in {
+ from {
+ opacity: 0;
+ transform: translateY(18px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+ }
+
+ /* Focused glow directly behind the hero title */
+ .hero-title {
+ position: relative;
+ isolation: isolate;
+ }
+
+ .hero-title::before {
+ content: "";
+ position: absolute;
+ left: 50%;
+ top: 46%;
+ z-index: -1;
+ width: 84%;
+ height: 74%;
+ transform: translate(-50%, -50%);
+ background: radial-gradient(closest-side, hsl(var(--brand-primary) / 0.2), transparent 78%);
+ filter: blur(48px);
+ pointer-events: none;
+ }
+
+ .dark .hero-title::before {
+ background: radial-gradient(closest-side, hsl(var(--brand-primary) / 0.3), transparent 78%);
+ }
+
+ /* Scroll cue pinned to the bottom of the home hero */
+ .hero-scroll-anchor {
+ position: absolute;
+ bottom: 1.5rem;
+ left: 50%;
+ z-index: 10;
+ transform: translateX(-50%);
+ opacity: 0;
+ animation: hero-fade-in 0.6s ease 0.7s forwards;
+ }
+
+ .hero-scroll-anchor:hover {
+ transform: translateX(-50%) translateY(2px);
+ }
+
+ @keyframes hero-fade-in {
+ to {
+ opacity: 1;
+ }
+ }
+
+ @media (prefers-reduced-motion: reduce) {
+ .hero-rise,
+ .hero-scroll-anchor {
+ animation: none;
+ opacity: 1;
+ }
+ }
+
.hero-title-line {
display: inline-block;
padding-inline: 0.02em;
diff --git a/components/layout/site-hero.tsx b/components/layout/site-hero.tsx
index 29669c7..3ccba6d 100644
--- a/components/layout/site-hero.tsx
+++ b/components/layout/site-hero.tsx
@@ -1,30 +1,11 @@
-"use client";
-
import type { ReactNode } from "react";
import { ArrowDown } from "lucide-react";
-import { motion } from "framer-motion";
import { Container } from "@/components/layout/container";
import { HeroMotionBackdrop } from "@/components/layout/hero-motion-backdrop";
import { cn } from "@/lib/utils";
-const heroItemVariants = {
- hidden: { opacity: 0, y: 16 },
- visible: {
- opacity: 1,
- y: 0,
- transition: { duration: 0.54, ease: [0.22, 1, 0.36, 1] as [number, number, number, number] },
- },
-};
-
-const heroContainerVariants = {
- hidden: {},
- visible: {
- transition: { staggerChildren: 0.13, delayChildren: 0.08 },
- },
-};
-
type HeroTone = "default" | "accent" | "soft";
type HeroLineAlign = "start" | "center" | "end";
@@ -128,6 +109,14 @@ export function HeroShell({
{children}
+
+ {variant === "home" ? (
+