AuraMail
SaaSheropage_type: hero2026-05-07
Full Recreation Prompt — Aura Hero Section
Build a premium, Apple-inspired dark landing page hero for "Aura" — an AI email app — using React 18 + TypeScript + Vite + Tailwind CSS + motion/react (Framer Motion) + lucide-react.
1. Dependencies (package.json)
{
"dependencies": {
"@supabase/supabase-js": "^2.57.4",
"lucide-react": "^0.344.0",
"motion": "^12.38.0",
"react": "^18.3.1",
"react-dom": "^18.3.1"
}
}
2. Global CSS (src/index.css)
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800;900&display=swap');
@tailwind base;
@tailwind components;
@tailwind utilities;
html,
body {
font-family: 'Inter', system-ui, sans-serif;
-webkit-font-smoothing: antialiased;
}
@layer utilities {
.animate-shiny {
animation: shiny 6s linear infinite;
}
}
@keyframes shiny {
0% {
background-position: -200% center;
}
100% {
background-position: 200% center;
}
}
3. Tailwind config (tailwind.config.js)
/** @type {import('tailwindcss').Config} */
export default {
content: ['./index.html', './src/**/*.{js,ts,jsx,tsx}'],
theme: {
extend: {
colors: {
brand: '#3D81E3',
},
fontFamily: {
sans: ['Inter', 'system-ui', 'sans-serif'],
},
},
},
plugins: [],
};
4. Imports (top of App.tsx)
import { useState } from 'react';
import { motion, AnimatePresence } from 'motion/react';
import { Menu, X, ChevronRight, Search } from 'lucide-react';
5. SVG Assets — exact inline markup
Apple Logo component
function AppleLogo({ className = 'w-4 h-4' }: { className?: string }) {
return (
<svg
viewBox="0 0 384 512"
className={className}
fill="currentColor"
aria-hidden="true"
>
<path d="M318.7 268.7c-.2-36.7 16.4-64.4 50-84.8-18.8-26.9-47.2-41.7-84.7-44.6-35.5-2.8-74.3 20.7-88.5 20.7-15 0-49.4-19.7-76.4-19.7C63.3 141.2 4 184.8 4 273.5q0 39.3 14.4 81.2c12.8 36.7 59 126.7 107.2 125.2 25.2-.6 43-17.9 75.8-17.9 31.8 0 48.3 17.9 76.4 17.9 48.6-.7 90.4-82.5 102.6-119.3-65.2-30.7-61.7-90-61.7-91.9zm-56.6-164.2c27.3-32.4 24.8-61.9 24-72.5-24.1 1.4-52 16.4-67.9 34.9-17.5 19.8-27.8 44.3-25.6 71.9 26.1 2 49.9-11.4 69.5-34.3z" />
</svg>
);
}
Aura LogoMark (four-sparkle/concave-square mark)
function LogoMark({ className = 'w-8 h-8' }: { className?: string }) {
return (
<svg viewBox="0 0 256 256" className={className} fill="none" aria-hidden="true">
<path
d="M 0 128 C 70.692 128 128 185.308 128 256 L 64 256 C 64 220.654 35.346 192 0 192 Z M 256 192 C 220.654 192 192 220.654 192 256 L 128 256 C 128 185.308 185.308 128 256 128 Z M 128 0 C 128 70.692 70.692 128 0 128 L 0 64 C 35.346 64 64 35.346 64 0 Z M 192 0 C 192 35.346 220.654 64 256 64 L 256 128 C 185.308 128 128 70.692 128 0 Z"
fill="white"
/>
</svg>
);
}
6. Constants
const navLinks = ['Solutions', 'Pricing', 'Blog', 'Documentation', 'Careers'];
const menuItems = ['File', 'Edit', 'View', 'Go', 'Window', 'Help'];
const gradientStyle: React.CSSProperties = {
backgroundImage:
'linear-gradient(110deg, #3D81E3, 20%, #AE9AE6, 40%, #F8D8D5, 60%, #FEEFDB, 80%, #3D81E3)',
backgroundSize: '200% auto',
WebkitBackgroundClip: 'text',
backgroundClip: 'text',
color: 'transparent',
WebkitTextFillColor: 'transparent',
};
7. AppleButton component
function AppleButton({
label = 'Download Aura',
full = false,
}: {
label?: string;
full?: boolean;
}) {
return (
<button
className={`group inline-flex items-center justify-center gap-2 rounded-full bg-white text-black font-medium text-sm px-5 py-3 transition-all hover:bg-white/90 active:scale-[0.98] ${
full ? 'w-full' : ''
}`}
>
<AppleLogo className="w-4 h-4" />
<span>{label}</span>
<ChevronRight className="w-4 h-4 transition-transform duration-200 group-hover:translate-x-[1px]" />
</button>
);
}
8. Root Wrapper
<div className="relative min-h-screen overflow-x-hidden bg-[#0c0c0c] text-white selection:bg-brand/30">
9. Background Video (no overlay)
<div className="fixed inset-0 z-0 pointer-events-none">
<video
autoPlay
loop
muted
playsInline
className="w-full h-full object-cover pointer-events-none"
src="https://d8j0ntlcm91z4.cloudfront.net/user_38xzZboKViGWJOttwIXH07lWA1P/hf_20260506_124911_3ed2d5b7-1604-4a4d-acbf-a28fd6c79348.mp4"
/>
</div>
10. Vertical Guide Lines (desktop only)
<div className="hidden md:block pointer-events-none fixed inset-y-0 left-1/2 -translate-x-[calc(50%+36rem)] w-px bg-white/10 z-[5]" />
<div className="hidden md:block pointer-events-none fixed inset-y-0 left-1/2 translate-x-[calc(-50%+36rem)] w-px bg-white/10 z-[5]" />
11. Foreground Wrapper
<div className="relative z-10">
<div className="max-w-6xl mx-auto px-6">
12. Top Navigation
<motion.nav
initial={{ opacity: 0, y: -10 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.6, ease: 'easeOut' }}
className="flex items-center justify-between py-5"
>
<div className="flex items-center gap-2">
<LogoMark />
<span className="font-semibold tracking-tight text-white">Aura</span>
</div>
<ul className="hidden md:flex items-center gap-8">
{navLinks.map((link, i) => (
<motion.li
key={link}
initial={{ opacity: 0, y: -6 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.5, delay: 0.1 + i * 0.05, ease: 'easeOut' }}
>
<a
href="#"
className="text-white/70 text-sm font-medium hover:text-white transition-colors"
>
{link}
</a>
</motion.li>
))}
</ul>
<div className="hidden md:block">
<AppleButton />
</div>
<button
onClick={() => setMenuOpen(true)}
className="md:hidden w-10 h-10 inline-flex items-center justify-center rounded-full border border-white/10 bg-white/5"
aria-label="Open menu"
>
<Menu className="w-5 h-5" />
</button>
</motion.nav>
13. Hero Section
<section className="pt-16 md:pt-28 pb-20 text-center flex flex-col items-center">
<motion.h1
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.8, delay: 0.3, ease: [0.22, 1, 0.36, 1] }}
className="text-4xl md:text-7xl font-semibold tracking-tight leading-[0.9]"
>
<span className="block text-white">Your email.</span>
<span className="block animate-shiny" style={gradientStyle}>
Revitalized
</span>
</motion.h1>
<motion.p
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.8, delay: 0.5, ease: [0.22, 1, 0.36, 1] }}
className="mt-8 text-white/60 max-w-md text-base leading-[1.5]"
>
Aura is the premier inbox platform for the current era. It leverages powerful
AI to organize, prioritize, and refine your messages into total clarity.
</motion.p>
<motion.div
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.8, delay: 0.7, ease: [0.22, 1, 0.36, 1] }}
className="mt-10 flex flex-col items-center gap-3"
>
<AppleButton />
<p className="text-xs text-white/40">Download for Intel / Apple Silicon</p>
</motion.div>
</section>
14. Mac Menu Bar (below hero, full-bleed)
<motion.div
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.8, delay: 0.9, ease: [0.22, 1, 0.36, 1] }}
className="h-10 bg-black/40 backdrop-blur-md border-t border-b border-white/10"
>
<div className="max-w-6xl mx-auto px-6 h-full flex items-center justify-between text-xs">
<div className="flex items-center gap-5">
<AppleLogo className="w-3.5 h-3.5 text-white" />
<span className="font-bold text-white">Aura</span>
{menuItems.map((item, i) => (
<span
key={item}
className={`text-white/80 ${i > 2 ? 'hidden sm:inline' : ''} ${
i > 3 ? 'hidden md:inline' : ''
}`}
>
{item}
</span>
))}
</div>
<div className="flex items-center gap-3 text-white/80">
<Search className="w-3.5 h-3.5" />
<span>Wed May 6 1:09 PM</span>
</div>
</div>
</motion.div>
15. Mobile Drawer (AnimatePresence)
<AnimatePresence>
{menuOpen && (
<motion.div
initial={{ x: '100%' }}
animate={{ x: 0 }}
exit={{ x: '100%' }}
transition={{ type: 'tween', duration: 0.4, ease: [0.22, 1, 0.36, 1] }}
className="fixed inset-0 z-[100] bg-black flex flex-col"
>
<div className="flex items-center justify-between px-6 py-5">
<div className="flex items-center gap-2">
<LogoMark />
<span className="font-semibold">Aura</span>
</div>
<button
onClick={() => setMenuOpen(false)}
className="w-10 h-10 inline-flex items-center justify-center rounded-full border border-white/10 bg-white/5"
aria-label="Close menu"
>
<X className="w-5 h-5" />
</button>
</div>
<div className="flex-1 flex flex-col justify-center px-8 gap-6">
{navLinks.map((link, i) => (
<motion.a
key={link}
href="#"
initial={{ opacity: 0, y: 16 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.5, delay: 0.15 + i * 0.08 }}
className="text-3xl font-semibold tracking-tight text-white"
>
{link}
</motion.a>
))}
</div>
<div className="px-6 pb-10">
<AppleButton full />
</div>
</motion.div>
)}
</AnimatePresence>
16. Design rules
- No overlay on the video — text sits directly over it.
- Color palette: background
#0c0c0c, brand#3D81E3, white text with/60,/70,/40opacity variants. No purple/indigo anywhere except as a transient stop inside the "Revitalized" text gradient. - Typography: Inter only, weights 500/600/700 used. Headline is
font-semibold(600),tracking-tight,leading-[0.9]. - Motion easing for hero staggers:
[0.22, 1, 0.36, 1](cubic ease-out). Nav uses'easeOut'. Stagger delays: nav 0.1 + i*0.05; hero h1 0.3, p 0.5, CTA 0.7, menu bar 0.9 — allduration: 0.8except nav (0.6) and nav-link items (0.5). - Shiny gradient text: 110° linear gradient blue → lilac → blush → cream → blue,
background-size: 200% auto, animated via theshinykeyframe panning background-position from-200%to200%over 6s linear infinite, clipped to text. - Guide lines: 1px white
/10verticals at±36remfrom center on md+. - Menu bar: 40px tall, translucent black
/40, backdrop-blur-md, bordered top and bottom with white/10. - Responsive: hamburger on mobile, full drawer; menu items progressively hide past index 2 / 3 at smaller breakpoints.