|
1 | 1 | "use client"; |
2 | 2 |
|
| 3 | +import { motion } from "framer-motion"; |
3 | 4 | import { Container } from "@/components/layout/Container"; |
4 | 5 |
|
5 | 6 | export function DemoSection() { |
6 | 7 | return ( |
7 | 8 | <section id="demo" className="py-20 bg-secondary/30"> |
8 | 9 | <Container> |
9 | 10 | <div className="flex flex-col items-center space-y-8"> |
10 | | - <div className="text-center space-y-4 max-w-3xl"> |
| 11 | + <motion.div |
| 12 | + initial={{ opacity: 0, y: 24 }} |
| 13 | + whileInView={{ opacity: 1, y: 0 }} |
| 14 | + transition={{ duration: 0.6, ease: [0.22, 1, 0.36, 1] }} |
| 15 | + viewport={{ once: true, amount: 0.3 }} |
| 16 | + className="text-center space-y-4 max-w-3xl" |
| 17 | + > |
11 | 18 | <h2 className="text-3xl font-bold tracking-tight sm:text-4xl"> |
12 | 19 | See MoDora in Action |
13 | 20 | </h2> |
14 | 21 | <p className="text-lg text-muted-foreground"> |
15 | 22 | From raw documents to grounded answers. MoDora parses, structures, and reasons over your data. |
16 | 23 | </p> |
17 | | - </div> |
| 24 | + </motion.div> |
18 | 25 |
|
19 | | - <div className="relative w-full aspect-video rounded-xl overflow-hidden shadow-2xl border bg-background"> |
| 26 | + <motion.div |
| 27 | + initial={{ opacity: 0, y: 24 }} |
| 28 | + whileInView={{ opacity: 1, y: 0 }} |
| 29 | + transition={{ duration: 0.6, ease: [0.22, 1, 0.36, 1], delay: 0.05 }} |
| 30 | + viewport={{ once: true, amount: 0.3 }} |
| 31 | + className="relative w-full aspect-video rounded-xl overflow-hidden shadow-2xl border bg-background" |
| 32 | + > |
20 | 33 | <iframe |
21 | 34 | src="https://player.vimeo.com/video/1168527529?badge=0&autopause=0&player_id=0&app_id=58479" |
22 | 35 | frameBorder="0" |
23 | 36 | allow="autoplay; fullscreen; picture-in-picture; clipboard-write; encrypted-media" |
24 | 37 | className="absolute inset-0 w-full h-full" |
25 | 38 | title="MoDora_Demo" |
26 | 39 | ></iframe> |
27 | | - </div> |
| 40 | + </motion.div> |
28 | 41 |
|
29 | | - <div className="grid grid-cols-2 md:grid-cols-5 gap-4 w-full max-w-4xl pt-8"> |
| 42 | + <motion.div |
| 43 | + initial={{ opacity: 0, y: 24 }} |
| 44 | + whileInView={{ opacity: 1, y: 0 }} |
| 45 | + transition={{ duration: 0.6, ease: [0.22, 1, 0.36, 1], delay: 0.1 }} |
| 46 | + viewport={{ once: true, amount: 0.3 }} |
| 47 | + className="grid grid-cols-2 md:grid-cols-5 gap-4 w-full max-w-4xl pt-8" |
| 48 | + > |
30 | 49 | {["Upload", "Parse", "Tree Build", "Retrieval", "Answer"].map((step, i) => ( |
31 | | - <div key={step} className="flex flex-col items-center space-y-2"> |
| 50 | + <motion.div |
| 51 | + key={step} |
| 52 | + initial={{ opacity: 0, y: 16 }} |
| 53 | + whileInView={{ opacity: 1, y: 0 }} |
| 54 | + transition={{ duration: 0.45, ease: [0.22, 1, 0.36, 1], delay: i * 0.05 }} |
| 55 | + viewport={{ once: true, amount: 0.2 }} |
| 56 | + className="flex flex-col items-center space-y-2" |
| 57 | + > |
32 | 58 | <div className="flex items-center justify-center w-8 h-8 rounded-full bg-primary/10 text-primary font-bold text-sm"> |
33 | 59 | {i + 1} |
34 | 60 | </div> |
35 | 61 | <span className="text-sm font-medium">{step}</span> |
36 | | - </div> |
| 62 | + </motion.div> |
37 | 63 | ))} |
38 | | - </div> |
| 64 | + </motion.div> |
39 | 65 | </div> |
40 | 66 | </Container> |
41 | 67 | </section> |
|
0 commit comments