diff --git a/frontend/src/components/landing/About.tsx b/frontend/src/components/landing/About.tsx new file mode 100644 index 0000000..2d896ce --- /dev/null +++ b/frontend/src/components/landing/About.tsx @@ -0,0 +1,42 @@ +import { motion } from 'framer-motion'; + +export function About() { + return ( +
+
+ + About The Project + + + + An Open Source AI Coding Workspace + + + +

+ Bolty is a community-driven clone inspired by bolt.new. + It empowers developers to build, run, and deploy full-stack applications without leaving the browser. + By leveraging advanced AI models, Bolty turns natural language prompts into production-ready code, + making rapid prototyping and development accessible to everyone. +

+
+
+
+ ); +} diff --git a/frontend/src/components/landing/Features.tsx b/frontend/src/components/landing/Features.tsx new file mode 100644 index 0000000..3f860e5 --- /dev/null +++ b/frontend/src/components/landing/Features.tsx @@ -0,0 +1,80 @@ +import { motion } from 'framer-motion'; + +// Shadcn-like minimal card with Hover Effect +function FeatureCard({ title, description, className = "" }: any) { + return ( +
+ + {/* Hover Gradient Border/Glow */} +
+
+
+
+
+
+ +

{title}

+

+ {description} +

+
+ ); +} + +const features = [ + { + title: "AI Architect", + description: "Intelligent code generation that understands project context and dependencies." + }, + { + title: "Full Stack", + description: "Generate React frontends and Node.js backends in a single unified workflow." + }, + { + title: "Instant Preview", + description: "Zero-latency live preview. See your changes update in real-time as you code." + }, + { + title: "WebContainers", + description: "Browser-native Node.js environment. secure, fast, and sandboxed execution." + }, + { + title: "Enterprise Security", + description: "Built-in security best practices. Your code runs locally in the browser." + }, + { + title: "Smart Optimize", + description: "AI automatically refactors and optimizes your code for production performance." + } +]; + +export function Features() { + return ( +
+
+
+

+ Built for modern development +

+

+ The speed of AI with the control of a traditional IDE. +

+
+ +
+ {features.map((feature, i) => ( + + + + ))} +
+
+
+ ); +} diff --git a/frontend/src/components/landing/Footer.tsx b/frontend/src/components/landing/Footer.tsx new file mode 100644 index 0000000..b0fb0ac --- /dev/null +++ b/frontend/src/components/landing/Footer.tsx @@ -0,0 +1,26 @@ +// Footer component with simple links + +export function Footer() { + return ( +
+
+
+ {/* Logo placeholder - using text for now if logo component isnt available in scope easily, + but we can use the same svg from Home if we want or just text */} + Boltly + v1.0.0 +
+ + + +
+ © {new Date().getFullYear()} Boltly. Open Source. +
+
+
+ ); +} diff --git a/frontend/src/components/landing/Hero.tsx b/frontend/src/components/landing/Hero.tsx new file mode 100644 index 0000000..29a1867 --- /dev/null +++ b/frontend/src/components/landing/Hero.tsx @@ -0,0 +1,108 @@ +import { useNavigate } from 'react-router-dom'; +import { motion } from 'framer-motion'; +import { ArrowRight, Terminal } from 'lucide-react'; + +export function Hero() { + const navigate = useNavigate(); + + return ( +
+ + {/* Mesh Gradient Background */} +
+
+
+ +
+ + {/* Badge */} + + + v1.0 Now Public + + + {/* Headline */} + + Build apps at the
+ speed of thought. +
+ + {/* Subheadline */} + + The open-source AI web builder. Prompt, generate, and deploy full-stack React & Node.js apps directly from your browser. + + + {/* CTAs */} + + + + + Documentation + + + + {/* Floating Code Preview (Subtle) */} + +
+
+
+
+
+
+
+
terminal — boltly-cli
+
+
+
+ $ + boltly create + "a personal portfolio with a blog" +
+
+ Analyzing requirements... Done
+ Generating database schema... Done
+ Scaffolding Next.js project... Done
+ Application ready at http://localhost:3000 🚀 +
+
+
+
+
+
+ ); +} diff --git a/frontend/src/components/landing/HowItWorks.tsx b/frontend/src/components/landing/HowItWorks.tsx new file mode 100644 index 0000000..3b9d879 --- /dev/null +++ b/frontend/src/components/landing/HowItWorks.tsx @@ -0,0 +1,69 @@ +import { motion } from 'framer-motion'; +import { MessageSquare, Zap, PenTool, Play } from 'lucide-react'; + +const steps = [ + { + icon: , + title: "1. Prompt", + description: "Describe your application idea in natural language." + }, + { + icon: , + title: "2. Generate", + description: "AI architects the structure and writes the initial code." + }, + { + icon: , + title: "3. Edit", + description: "Refine definitions or edit code manually in the browser." + }, + { + icon: , + title: "4. Run", + description: "Instantly deploy a live preview of your full-stack app." + } +]; + +export function HowItWorks() { + return ( +
+ {/* Background Decor */} +
+ +
+
+

+ From idea to deployment
+ in four simple steps. +

+
+ +
+ {/* Connecting Line (Desktop) */} +
+ + {steps.map((step, i) => ( + +
+
+ {step.icon} +
+
+

{step.title}

+

+ {step.description} +

+
+ ))} +
+
+
+ ); +} diff --git a/frontend/src/components/landing/Navbar.tsx b/frontend/src/components/landing/Navbar.tsx new file mode 100644 index 0000000..6a3eb4b --- /dev/null +++ b/frontend/src/components/landing/Navbar.tsx @@ -0,0 +1,40 @@ +import { Github, Zap } from 'lucide-react'; +import { motion } from 'framer-motion'; +import { useNavigate } from 'react-router-dom'; + +export function Navbar() { + const navigate = useNavigate(); + + return ( + + ); +} diff --git a/frontend/src/components/landing/OpenSource.tsx b/frontend/src/components/landing/OpenSource.tsx new file mode 100644 index 0000000..db33629 --- /dev/null +++ b/frontend/src/components/landing/OpenSource.tsx @@ -0,0 +1,52 @@ +import { motion } from 'framer-motion'; +import { Github, Star, GitFork } from 'lucide-react'; + +export function OpenSource() { + return ( +
+ {/* Background Gradient */} +
+ +
+ + +

+ Proudly Open Source +

+

+ Bolty is free and open for everyone. Join our community of developers + building the future of AI-assisted coding. +

+ +
+ + + Star on GitHub + + +
+
+ + Star us +
+
+ + Fork us +
+
+
+
+
+
+ ); +} diff --git a/frontend/src/components/landing/WhyBoltly.tsx b/frontend/src/components/landing/WhyBoltly.tsx new file mode 100644 index 0000000..db9bfac --- /dev/null +++ b/frontend/src/components/landing/WhyBoltly.tsx @@ -0,0 +1,68 @@ +import { motion } from 'framer-motion'; +import { Timer, Trophy, Users } from 'lucide-react'; + +export function WhyBoltly() { + return ( +
+
+
+

+ Why developers choose Boltly +

+
+ +
+ +
+ +
+

Faster Prototyping

+

+ Skip the boilerplate. Get straight to the logic. + Boltly handles the mundane setup so you can focus on the unique features of your app. +

+
+ + +
+ +
+

Hackathon Ready

+

+ Perfect for hackathons where every minute counts. + Generate a working MVP in minutes and spend the rest of your time polishing. +

+
+ + +
+ +
+

Community Driven

+

+ Built by developers, for developers. + Boltly is fully open source, transparent, and constantly evolving with community contributions. +

+
+
+
+
+ ); +} diff --git a/frontend/src/index.css b/frontend/src/index.css index 5bef098..3880ae0 100644 --- a/frontend/src/index.css +++ b/frontend/src/index.css @@ -1,250 +1,77 @@ @import "tailwindcss"; -/* CSS Custom Properties for Glassmorphic Design */ -:root { - /* Glass effect values */ - --glass-bg: rgba(24, 24, 27, 0.7); - --glass-bg-light: rgba(39, 39, 42, 0.6); - --glass-border: rgba(255, 255, 255, 0.1); - --glass-border-strong: rgba(255, 255, 255, 0.15); - - /* Shadows */ - --shadow-glass: 0 8px 32px 0 rgba(0, 0, 0, 0.37); - --shadow-glass-lg: 0 12px 48px 0 rgba(0, 0, 0, 0.5); - --shadow-glass-sm: 0 4px 16px 0 rgba(0, 0, 0, 0.25); - - /* Primary accent */ - --primary: #f17013; - --primary-light: #f48d32; - --primary-dark: #e25809; +@font-face { + font-family: 'Geist Mono'; + src: url('https://assets.vercel.com/font/geist-mono.woff2') format('woff2'); + font-weight: 100 900; + font-display: swap; + font-style: normal; } -/* Base styles */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; +/* CSS Custom Properties for Boltly Design */ +:root { + --electric-primary: #3b82f6; + --neon-accent: #22c55e; } +/* Base styles */ body { - font-family: 'Inter', sans-serif; - background: #18181b; + font-family: 'Inter', system-ui, -apple-system, sans-serif; + background: #09090b; + /* Zinc 950 base */ color: #fafafa; overflow-x: hidden; + -webkit-font-smoothing: antialiased; +} + +code, +pre, +.font-mono { + font-family: 'Geist Mono', 'Fira Code', monospace; } -/* Custom Scrollbar Styles - Slim and Blended */ +/* Custom Scrollbar Styles - Slim and Dark */ ::-webkit-scrollbar { - width: 8px; - height: 8px; + width: 6px; + height: 6px; } ::-webkit-scrollbar-track { - background: rgba(39, 39, 42, 0.3); - border-radius: 4px; + background: #09090b; } ::-webkit-scrollbar-thumb { - background: rgba(115, 115, 115, 0.5); - border-radius: 4px; - transition: background 0.2s ease; + background: #27272a; + border-radius: 3px; } ::-webkit-scrollbar-thumb:hover { - background: rgba(163, 163, 163, 0.7); -} - -/* Firefox scrollbar */ -* { - scrollbar-width: thin; - scrollbar-color: rgba(115, 115, 115, 0.5) rgba(39, 39, 42, 0.3); -} - -/* Glass Container Utility Classes */ -.glass-container { - background: var(--glass-bg); - backdrop-filter: blur(12px); - -webkit-backdrop-filter: blur(12px); - border: 1px solid var(--glass-border); - box-shadow: var(--shadow-glass); - border-radius: 1rem; -} - -.glass-container-light { - background: var(--glass-bg-light); - backdrop-filter: blur(8px); - -webkit-backdrop-filter: blur(8px); - border: 1px solid var(--glass-border); - box-shadow: var(--shadow-glass-sm); - border-radius: 0.75rem; + background: #3f3f46; } -/* Glass Button Base */ -.glass-button { - background: var(--glass-bg-light); - backdrop-filter: blur(8px); - -webkit-backdrop-filter: blur(8px); - border: 1px solid var(--glass-border-strong); - transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); -} - -.glass-button:hover { - background: rgba(39, 39, 42, 0.8); - border-color: rgba(255, 255, 255, 0.25); - box-shadow: 0 0 20px rgba(241, 112, 19, 0.2); -} - -/* Glass Input */ -.glass-input { - background: rgba(24, 24, 27, 0.5); - backdrop-filter: blur(6px); - -webkit-backdrop-filter: blur(6px); - border: 1px solid var(--glass-border); - border-bottom: 2px solid var(--glass-border-strong); - transition: all 0.2s ease; -} - -.glass-input:focus { - outline: none; - border-color: var(--primary); - box-shadow: 0 0 15px rgba(241, 112, 19, 0.15); - background: rgba(24, 24, 27, 0.7); -} - -/* Textarea placeholder - ensure visibility */ -textarea::placeholder { - color: rgb(113, 113, 122); - opacity: 1; -} - -/* Text Selection */ +/* Selection */ ::selection { - background: rgba(241, 112, 19, 0.3); - color: #fafafa; + background: rgba(59, 130, 246, 0.3); + /* Electric Blue */ + color: #fff; } -/* Smooth Transitions */ -.transition-glass { - transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); +/* Utilities */ +.glass-panel { + background: rgba(24, 24, 27, 0.6); + backdrop-filter: blur(12px); + border: 1px solid rgba(255, 255, 255, 0.08); } -/* Subtle background texture/noise */ -.bg-noise { - background-image: - radial-gradient(at 40% 20%, rgba(241, 112, 19, 0.05) 0px, transparent 50%), - radial-gradient(at 80% 0%, rgba(39, 39, 42, 0.8) 0px, transparent 50%); +.aurora-gradient { + background-image: repeating-linear-gradient(100deg, #3b82f6 0%, #4338ca 50%, #22c55e 100%); + background-size: 350% 350%; + filter: blur(10px); } -/* Italic Gradient Text - Boltly Orange Brand */ -.text-gradient-italic { - font-style: italic; - background: linear-gradient(135deg, #fb923c 0%, #f97316 50%, #ea580c 100%); +.text-gradient { + background: linear-gradient(to right, #60a5fa, #4ade80); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; -} - -/* Clean Input Container - Bolt.new style */ -.input-container-clean { - background: rgba(39, 39, 42, 0.8); - border: 1px solid rgba(255, 255, 255, 0.08); - border-radius: 1rem; - transition: all 0.2s ease; -} - -.input-container-clean:hover, -.input-container-clean:focus-within { - border-color: rgba(255, 255, 255, 0.15); - box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.05); -} - -/* Ghost Button - Like Bolt.new "Plan" */ -.btn-ghost { - background: transparent; - border: 1px solid rgba(255, 255, 255, 0.15); - color: #a1a1aa; - padding: 0.5rem 1rem; - border-radius: 0.5rem; - font-size: 0.875rem; - display: inline-flex; - align-items: center; - gap: 0.375rem; - transition: all 0.2s ease; - cursor: pointer; -} - -.btn-ghost:hover { - background: rgba(255, 255, 255, 0.05); - color: #e4e4e7; - border-color: rgba(255, 255, 255, 0.2); -} - -/* Primary Action Button - Bolt.new style */ -.btn-primary-action { - background: linear-gradient(135deg, #3b82f6 0%, #2563eb 100%); - color: white; - padding: 0.5rem 1.25rem; - border-radius: 0.5rem; - font-size: 0.875rem; - font-weight: 500; - display: inline-flex; - align-items: center; - gap: 0.375rem; - border: none; - cursor: pointer; - transition: all 0.2s ease; -} - -.btn-primary-action:hover { - background: linear-gradient(135deg, #2563eb 0%, #1d4ed8 100%); - box-shadow: 0 0 20px rgba(59, 130, 246, 0.4); -} - -.btn-primary-action:disabled { - opacity: 0.5; - cursor: not-allowed; -} - -/* Import link style */ -.import-link { - color: #71717a; - font-size: 0.875rem; - display: inline-flex; - align-items: center; - gap: 0.375rem; - transition: color 0.2s ease; -} - -.import-link:hover { - color: #a1a1aa; -} - -/* Animations */ -@keyframes fadeInUp { - from { - opacity: 0; - transform: translateY(20px); - } - - to { - opacity: 1; - transform: translateY(0); - } -} - -.animate-fade-in-up { - animation: fadeInUp 0.8s cubic-bezier(0.16, 1, 0.3, 1) forwards; -} - -.animate-slide-up-fade { - opacity: 0; - animation: fadeInUp 0.8s cubic-bezier(0.16, 1, 0.3, 1) forwards; -} - -.delay-100 { - animation-delay: 100ms; -} - -.delay-200 { - animation-delay: 200ms; } \ No newline at end of file diff --git a/frontend/src/pages/Home.tsx b/frontend/src/pages/Home.tsx index ec13fa7..5a5a566 100644 --- a/frontend/src/pages/Home.tsx +++ b/frontend/src/pages/Home.tsx @@ -1,285 +1,24 @@ -import { useState } from 'react'; -import { useNavigate } from 'react-router-dom'; -import { Plus, ArrowRight, Lightbulb, Sun, Moon } from 'lucide-react'; - -// Minimal geometric lightning bolt logo -function BoltLogo({ fill = 'black' }: { fill?: string }) { - return ( - - - - ); -} +import { Navbar } from '../components/landing/Navbar'; +import { Hero } from '../components/landing/Hero'; +import { About } from '../components/landing/About'; +import { Features } from '../components/landing/Features'; +import { HowItWorks } from '../components/landing/HowItWorks'; +import { WhyBoltly } from '../components/landing/WhyBoltly'; +import { OpenSource } from '../components/landing/OpenSource'; +import { Footer } from '../components/landing/Footer'; export function Home() { - const [prompt, setPrompt] = useState(''); - const [isFocused, setIsFocused] = useState(false); - const [isDarkMode, setIsDarkMode] = useState(true); - const navigate = useNavigate(); - - const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - if (prompt.trim()) { - navigate('/builder', { state: { prompt } }); - } - }; - - const suggestions = [ - 'Modern portfolio', - 'SaaS landing page', - 'Admin dashboard', - 'E-commerce store', - ]; - return ( -
- {/* Grid Background */} -
- -
- - {/* ========== NAVIGATION ========== */} -
- {/* Logo - Left */} -
-
- -
- Boltly -
- - {/* Theme Toggle - Right */} - -
- - {/* ========== MAIN CONTENT ========== */} -
-
- - {/* ===== HERO TEXT ===== */} -
-

- What will you build today? -

-

- Describe your idea and watch it come to life. -

-
- - {/* ===== INPUT BOX - ALL INLINE STYLES ===== */} -
-
- {/* TEXT AREA WRAPPER */} -
-