Skip to content

Commit 33fb2cd

Browse files
committed
merge landing-page into main
2 parents 163c9b3 + b3f3a55 commit 33fb2cd

23 files changed

+7341
-0
lines changed

.github/workflows/deploy.yml

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
name: Deploy to GitHub Pages
2+
3+
on:
4+
push:
5+
branches: ["main"]
6+
workflow_dispatch:
7+
8+
permissions:
9+
contents: read
10+
pages: write
11+
id-token: write
12+
13+
concurrency:
14+
group: "pages"
15+
cancel-in-progress: false
16+
17+
jobs:
18+
build:
19+
runs-on: ubuntu-latest
20+
steps:
21+
- name: Checkout
22+
uses: actions/checkout@v4
23+
- name: Setup Node
24+
uses: actions/setup-node@v4
25+
with:
26+
node-version: "20"
27+
cache: "npm"
28+
- name: Setup Pages
29+
uses: actions/configure-pages@v5
30+
with:
31+
static_site_generator: next
32+
- name: Install dependencies
33+
run: npm ci
34+
- name: Build with Next.js
35+
run: npm run build
36+
- name: Upload artifact
37+
uses: actions/upload-pages-artifact@v3
38+
with:
39+
path: ./out
40+
41+
deploy:
42+
environment:
43+
name: github-pages
44+
url: ${{ steps.deployment.outputs.page_url }}
45+
runs-on: ubuntu-latest
46+
needs: build
47+
steps:
48+
- name: Deploy to GitHub Pages
49+
id: deployment
50+
uses: actions/deploy-pages@v4

app/globals.css

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
@tailwind base;
2+
@tailwind components;
3+
@tailwind utilities;
4+
5+
@layer base {
6+
:root {
7+
--background: 0 0% 100%;
8+
--foreground: 222.2 84% 4.9%;
9+
10+
--card: 0 0% 100%;
11+
--card-foreground: 222.2 84% 4.9%;
12+
13+
--popover: 0 0% 100%;
14+
--popover-foreground: 222.2 84% 4.9%;
15+
16+
--primary: 221.2 83.2% 53.3%;
17+
--primary-foreground: 210 40% 98%;
18+
19+
--secondary: 210 40% 96.1%;
20+
--secondary-foreground: 222.2 47.4% 11.2%;
21+
22+
--muted: 210 40% 96.1%;
23+
--muted-foreground: 215.4 16.3% 46.9%;
24+
25+
--accent: 210 40% 96.1%;
26+
--accent-foreground: 222.2 47.4% 11.2%;
27+
28+
--destructive: 0 84.2% 60.2%;
29+
--destructive-foreground: 210 40% 98%;
30+
31+
--border: 214.3 31.8% 91.4%;
32+
--input: 214.3 31.8% 91.4%;
33+
--ring: 221.2 83.2% 53.3%;
34+
35+
--radius: 0.5rem;
36+
}
37+
38+
.dark {
39+
--background: 222.2 84% 4.9%;
40+
--foreground: 210 40% 98%;
41+
42+
--card: 222.2 84% 4.9%;
43+
--card-foreground: 210 40% 98%;
44+
45+
--popover: 222.2 84% 4.9%;
46+
--popover-foreground: 210 40% 98%;
47+
48+
--primary: 210 40% 98%;
49+
--primary-foreground: 222.2 47.4% 11.2%;
50+
51+
--secondary: 217.2 32.6% 17.5%;
52+
--secondary-foreground: 210 40% 98%;
53+
54+
--muted: 217.2 32.6% 17.5%;
55+
--muted-foreground: 215 20.2% 65.1%;
56+
57+
--accent: 217.2 32.6% 17.5%;
58+
--accent-foreground: 210 40% 98%;
59+
60+
--destructive: 0 62.8% 30.6%;
61+
--destructive-foreground: 210 40% 98%;
62+
63+
--border: 217.2 32.6% 17.5%;
64+
--input: 217.2 32.6% 17.5%;
65+
--ring: 212.7 26.8% 83.9%;
66+
}
67+
}
68+
69+
@layer base {
70+
* {
71+
@apply border-border;
72+
}
73+
body {
74+
@apply bg-background text-foreground;
75+
}
76+
}

app/layout.tsx

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import type { Metadata } from "next";
2+
import { Inter } from "next/font/google";
3+
import "./globals.css";
4+
import { cn } from "@/lib/utils";
5+
6+
const inter = Inter({ subsets: ["latin"], variable: "--font-sans" });
7+
8+
export const metadata: Metadata = {
9+
title: "MoDora - Multimodal Document Analysis Assistant",
10+
description: "Organize text, tables, and figures into a structured tree for grounded retrieval and reasoning.",
11+
};
12+
13+
export default function RootLayout({
14+
children,
15+
}: Readonly<{
16+
children: React.ReactNode;
17+
}>) {
18+
return (
19+
<html lang="en">
20+
<body className={cn("min-h-screen bg-background font-sans antialiased", inter.variable)}>
21+
{children}
22+
</body>
23+
</html>
24+
);
25+
}

app/page.tsx

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { Header } from "@/components/layout/Header";
2+
import { HeroSection } from "@/components/sections/HeroSection";
3+
import { DemoSection } from "@/components/sections/DemoSection";
4+
import { FeaturesSection } from "@/components/sections/FeaturesSection";
5+
import { HowItWorksSection } from "@/components/sections/HowItWorksSection";
6+
import { ArchitectureSection } from "@/components/sections/ArchitectureSection";
7+
import { UseCasesSection } from "@/components/sections/UseCasesSection";
8+
import { OpenSourceSection } from "@/components/sections/OpenSourceSection";
9+
import { Footer } from "@/components/sections/Footer";
10+
11+
export default function Home() {
12+
return (
13+
<div className="flex min-h-screen flex-col">
14+
<Header />
15+
<main className="flex-1">
16+
<HeroSection />
17+
<DemoSection />
18+
<FeaturesSection />
19+
<HowItWorksSection />
20+
<ArchitectureSection />
21+
<UseCasesSection />
22+
<OpenSourceSection />
23+
</main>
24+
<Footer />
25+
</div>
26+
);
27+
}

components/layout/Container.tsx

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { cn } from "@/lib/utils";
2+
3+
interface ContainerProps extends React.HTMLAttributes<HTMLDivElement> {
4+
children: React.ReactNode;
5+
}
6+
7+
export function Container({ children, className, ...props }: ContainerProps) {
8+
return (
9+
<div
10+
className={cn("mx-auto w-full max-w-7xl px-4 md:px-6 lg:px-8", className)}
11+
{...props}
12+
>
13+
{children}
14+
</div>
15+
);
16+
}

components/layout/Header.tsx

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import Link from "next/link";
2+
import { Button } from "@/components/ui/button";
3+
import { Container } from "@/components/layout/Container";
4+
import { Github } from "lucide-react";
5+
6+
export function Header() {
7+
return (
8+
<header className="sticky top-0 z-50 w-full border-b bg-background/80 backdrop-blur-sm">
9+
<Container>
10+
<div className="flex h-16 items-center justify-between">
11+
<Link href="/" className="flex items-center space-x-2">
12+
<span className="text-xl font-bold tracking-tight">MoDora</span>
13+
</Link>
14+
15+
<nav className="hidden md:flex items-center gap-6 text-sm font-medium text-muted-foreground">
16+
<Link href="#features" className="hover:text-foreground transition-colors">
17+
Features
18+
</Link>
19+
<Link href="#how-it-works" className="hover:text-foreground transition-colors">
20+
How it Works
21+
</Link>
22+
<Link href="#architecture" className="hover:text-foreground transition-colors">
23+
Architecture
24+
</Link>
25+
<Link href="#use-cases" className="hover:text-foreground transition-colors">
26+
Use Cases
27+
</Link>
28+
</nav>
29+
30+
<div className="flex items-center gap-4">
31+
<Button variant="ghost" size="icon" asChild>
32+
<Link href="https://github.com/weAIDB/MoDora" target="_blank" rel="noopener noreferrer">
33+
<Github className="h-5 w-5" />
34+
<span className="sr-only">GitHub</span>
35+
</Link>
36+
</Button>
37+
<Button asChild>
38+
<Link href="#demo">View Demo</Link>
39+
</Button>
40+
</div>
41+
</div>
42+
</Container>
43+
</header>
44+
);
45+
}
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
"use client";
2+
3+
import { motion } from "framer-motion";
4+
import { Container } from "@/components/layout/Container";
5+
import { FileText, Image as ImageIcon, Table, ChevronDown } from "lucide-react";
6+
7+
export function ArchitectureSection() {
8+
return (
9+
<section id="architecture" className="py-20">
10+
<Container>
11+
<div className="grid grid-cols-1 lg:grid-cols-2 gap-12 items-center">
12+
<motion.div
13+
initial={{ opacity: 0, y: 24 }}
14+
whileInView={{ opacity: 1, y: 0 }}
15+
transition={{ duration: 0.6, ease: [0.22, 1, 0.36, 1] }}
16+
viewport={{ once: true, amount: 0.3 }}
17+
className="space-y-6"
18+
>
19+
<h2 className="text-3xl font-bold tracking-tight sm:text-4xl">
20+
Component-Correlation Tree
21+
</h2>
22+
<p className="text-lg text-muted-foreground">
23+
Unlike traditional RAG that chunks text blindly, MoDora parses documents into a structured tree.
24+
</p>
25+
<ul className="space-y-4">
26+
<li className="flex gap-3">
27+
<div className="h-6 w-6 rounded-full bg-primary/20 flex items-center justify-center text-primary shrink-0">
28+
1
29+
</div>
30+
<span className="text-muted-foreground">
31+
<strong className="text-foreground">Hierarchical Organization:</strong> Sections, subsections, and paragraphs are nodes in a tree.
32+
</span>
33+
</li>
34+
<li className="flex gap-3">
35+
<div className="h-6 w-6 rounded-full bg-primary/20 flex items-center justify-center text-primary shrink-0">
36+
2
37+
</div>
38+
<span className="text-muted-foreground">
39+
<strong className="text-foreground">Multimodal Nodes:</strong> Images and tables are treated as first-class citizens, linked to their context.
40+
</span>
41+
</li>
42+
<li className="flex gap-3">
43+
<div className="h-6 w-6 rounded-full bg-primary/20 flex items-center justify-center text-primary shrink-0">
44+
3
45+
</div>
46+
<span className="text-muted-foreground">
47+
<strong className="text-foreground">Contextual Retrieval:</strong> Retrieving a node can automatically pull in parent context or child details.
48+
</span>
49+
</li>
50+
</ul>
51+
</motion.div>
52+
53+
<motion.div
54+
initial={{ opacity: 0, y: 24 }}
55+
whileInView={{ opacity: 1, y: 0 }}
56+
transition={{ duration: 0.6, ease: [0.22, 1, 0.36, 1], delay: 0.05 }}
57+
viewport={{ once: true, amount: 0.3 }}
58+
className="relative bg-secondary/20 rounded-xl p-8 border border-secondary"
59+
>
60+
{/* Tree Visualization */}
61+
<div className="flex flex-col items-center space-y-4">
62+
{/* Root */}
63+
<div className="bg-background border shadow-sm px-4 py-2 rounded-md flex items-center gap-2 font-medium">
64+
<FileText className="h-4 w-4 text-primary" /> Document Root
65+
</div>
66+
<ChevronDown className="h-6 w-6 text-muted-foreground/50" />
67+
68+
{/* Level 1 */}
69+
<div className="flex gap-8">
70+
<div className="flex flex-col items-center">
71+
<div className="bg-background border shadow-sm px-4 py-2 rounded-md flex items-center gap-2 text-sm">
72+
Section 1: Intro
73+
</div>
74+
<ChevronDown className="h-6 w-6 text-muted-foreground/50" />
75+
<div className="mt-2 bg-background border shadow-sm px-3 py-1.5 rounded-md flex items-center gap-2 text-xs text-muted-foreground">
76+
Text Paragraphs
77+
</div>
78+
</div>
79+
80+
<div className="flex flex-col items-center">
81+
<div className="bg-background border shadow-sm px-4 py-2 rounded-md flex items-center gap-2 text-sm">
82+
Section 2: Results
83+
</div>
84+
<ChevronDown className="h-6 w-6 text-muted-foreground/50" />
85+
<div className="mt-2 flex gap-2">
86+
<div className="bg-blue-50 dark:bg-blue-900/20 border border-blue-100 dark:border-blue-900 px-3 py-1.5 rounded-md flex items-center gap-2 text-xs text-blue-700 dark:text-blue-300">
87+
<Table className="h-3 w-3" /> Table 1
88+
</div>
89+
<div className="bg-purple-50 dark:bg-purple-900/20 border border-purple-100 dark:border-purple-900 px-3 py-1.5 rounded-md flex items-center gap-2 text-xs text-purple-700 dark:text-purple-300">
90+
<ImageIcon className="h-3 w-3" /> Figure 2
91+
</div>
92+
</div>
93+
</div>
94+
</div>
95+
</div>
96+
</motion.div>
97+
</div>
98+
</Container>
99+
</section>
100+
);
101+
}

0 commit comments

Comments
 (0)