diff --git a/app/globals.css b/app/globals.css index 382ca14..d3e8d50 100644 --- a/app/globals.css +++ b/app/globals.css @@ -55,7 +55,7 @@ --card-foreground: oklch(0.145 0 0); --popover: oklch(1 0 0); --popover-foreground: oklch(0.145 0 0); - --primary: oklch(0.205 0 0); + --primary: oklch(0.52 0.24 25); --primary-foreground: oklch(0.985 0 0); --secondary: oklch(0.97 0 0); --secondary-foreground: oklch(0.205 0 0); @@ -66,7 +66,7 @@ --destructive: oklch(0.577 0.245 27.325); --border: oklch(0.922 0 0); --input: oklch(0.922 0 0); - --ring: oklch(0.708 0 0); + --ring: oklch(0.52 0.24 25); --chart-1: oklch(0.646 0.222 41.116); --chart-2: oklch(0.6 0.118 184.704); --chart-3: oklch(0.398 0.07 227.392); @@ -74,12 +74,12 @@ --chart-5: oklch(0.769 0.188 70.08); --sidebar: oklch(0.985 0 0); --sidebar-foreground: oklch(0.145 0 0); - --sidebar-primary: oklch(0.205 0 0); + --sidebar-primary: oklch(0.52 0.24 25); --sidebar-primary-foreground: oklch(0.985 0 0); --sidebar-accent: oklch(0.97 0 0); --sidebar-accent-foreground: oklch(0.205 0 0); --sidebar-border: oklch(0.922 0 0); - --sidebar-ring: oklch(0.708 0 0); + --sidebar-ring: oklch(0.52 0.24 25); } .dark { @@ -89,8 +89,8 @@ --card-foreground: oklch(0.985 0 0); --popover: oklch(0.205 0 0); --popover-foreground: oklch(0.985 0 0); - --primary: oklch(0.922 0 0); - --primary-foreground: oklch(0.205 0 0); + --primary: oklch(0.65 0.22 25); + --primary-foreground: oklch(0.12 0 0); --secondary: oklch(0.269 0 0); --secondary-foreground: oklch(0.985 0 0); --muted: oklch(0.269 0 0); @@ -100,7 +100,7 @@ --destructive: oklch(0.704 0.191 22.216); --border: oklch(1 0 0 / 10%); --input: oklch(1 0 0 / 15%); - --ring: oklch(0.556 0 0); + --ring: oklch(0.65 0.22 25); --chart-1: oklch(0.488 0.243 264.376); --chart-2: oklch(0.696 0.17 162.48); --chart-3: oklch(0.769 0.188 70.08); @@ -108,12 +108,12 @@ --chart-5: oklch(0.645 0.246 16.439); --sidebar: oklch(0.205 0 0); --sidebar-foreground: oklch(0.985 0 0); - --sidebar-primary: oklch(0.488 0.243 264.376); - --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-primary: oklch(0.65 0.22 25); + --sidebar-primary-foreground: oklch(0.12 0 0); --sidebar-accent: oklch(0.269 0 0); --sidebar-accent-foreground: oklch(0.985 0 0); --sidebar-border: oklch(1 0 0 / 10%); - --sidebar-ring: oklch(0.556 0 0); + --sidebar-ring: oklch(0.65 0.22 25); } @layer base { @@ -123,4 +123,86 @@ body { @apply bg-background text-foreground; } -} \ No newline at end of file +} + +@keyframes fade-in-up { + from { + opacity: 0; + transform: translateY(24px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +@keyframes float { + 0%, 100% { transform: translateY(0px); } + 50% { transform: translateY(-8px); } +} + +@keyframes scale-in { + from { + opacity: 0; + transform: scale(0.8); + } + to { + opacity: 1; + transform: scale(1); + } +} + +@keyframes glow-pulse { + 0%, 100% { + box-shadow: 0 0 0 0 oklch(0.65 0.22 25 / 0%); + } + 50% { + box-shadow: 0 0 24px 6px oklch(0.65 0.22 25 / 35%); + } +} + +@keyframes slide-in-right { + from { + opacity: 0; + transform: translateX(-16px); + } + to { + opacity: 1; + transform: translateX(0); + } +} + +@keyframes shimmer { + 0% { background-position: -200% center; } + 100% { background-position: 200% center; } +} + +.animate-fade-in-up { + animation: fade-in-up 0.6s cubic-bezier(0.16, 1, 0.3, 1) forwards; + opacity: 0; +} + +.animate-float { + animation: float 4s ease-in-out infinite; +} + +.animate-scale-in { + animation: scale-in 0.5s cubic-bezier(0.34, 1.56, 0.64, 1) forwards; + opacity: 0; +} + +.animate-glow-pulse { + animation: glow-pulse 2.5s ease-in-out infinite; +} + +.animate-slide-in-right { + animation: slide-in-right 0.5s cubic-bezier(0.16, 1, 0.3, 1) forwards; + opacity: 0; +} + +.animation-delay-100 { animation-delay: 100ms; } +.animation-delay-200 { animation-delay: 200ms; } +.animation-delay-300 { animation-delay: 300ms; } +.animation-delay-400 { animation-delay: 400ms; } +.animation-delay-500 { animation-delay: 500ms; } +.animation-delay-600 { animation-delay: 600ms; } \ No newline at end of file diff --git a/app/page.tsx b/app/page.tsx index f14580a..f6af61e 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -6,18 +6,20 @@ export default function Home() { <> {/* Hero */}
- {/* Subtle gradient background */} -
+ {/* Subtle red gradient background */} +
-

+

Is your site AI-search ready?

-

+

Citable analyzes how well your website ranks in AI-generated answers from ChatGPT, Perplexity, and Google AI Overviews.

- +
+ +
@@ -27,7 +29,7 @@ export default function Home() { className="border-t border-border/40 bg-muted/30 px-6 py-20" >
-

+

How it works

@@ -36,18 +38,21 @@ export default function Home() { step={1} title="Enter your URL" description="We'll scan up to 10 pages on your site" + delay="animation-delay-100" /> } step={2} title="Pick your scraper" description="Choose a free built-in browser or your own Firecrawl key" + delay="animation-delay-200" /> } step={3} title="Get your score" description="With a detailed breakdown" + delay="animation-delay-300" />
@@ -61,15 +66,17 @@ function Step({ step, title, description, + delay = "", }: { icon: React.ReactNode step: number title: string description: string + delay?: string }) { return ( -
-
+
+
{icon}
diff --git a/components/AppBackground.tsx b/components/AppBackground.tsx index d90994c..bc0f2d0 100644 --- a/components/AppBackground.tsx +++ b/components/AppBackground.tsx @@ -19,7 +19,7 @@ export function AppBackground() { > - {entries.map(([key, factor]) => { + {entries.map(([key, factor], index) => { const pct = Math.round((factor.score / factor.maxScore) * 100) const colors = getColor(pct) const rubric = SCORING_RUBRIC.find((r) => r.key === key) const isOpen = expanded === key const achieved = rubric ? getAchievedTier(rubric, factor.score) : null const next = rubric ? getNextTier(rubric, factor.score) : null + const delayClass = `animation-delay-${Math.min(index * 100, 600)}` return ( -
+
{/* Header row — always visible */}