feat: Implement landing page and chatbot interface

Create a minimal, high-end landing page with a chatbot-like interface, including dark/light mode, prewritten prompts, and animated sidebar. Design should be black and white with glassmorphism and subtle gradients.
This commit is contained in:
gpt-engineer-app[bot] 2025-06-18 07:20:12 +00:00
parent a5186e747e
commit 069ca8f7f7
13 changed files with 830 additions and 13 deletions

View File

@ -1,23 +1,29 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>mcp-verse-spark</title> <title>MCP Platform - AI-First Development</title>
<meta name="description" content="Lovable Generated Project" /> <meta name="description" content="Build MCP servers and become part of the new world where AI chatbots are the modern interface" />
<meta name="author" content="Lovable" /> <meta name="author" content="MCP Platform" />
<meta property="og:title" content="mcp-verse-spark" /> <meta property="og:title" content="MCP Platform - AI-First Development" />
<meta property="og:description" content="Lovable Generated Project" /> <meta property="og:description" content="Build MCP servers and become part of the new world where AI chatbots are the modern interface" />
<meta property="og:type" content="website" /> <meta property="og:type" content="website" />
<meta property="og:image" content="https://lovable.dev/opengraph-image-p98pqg.png" /> <meta property="og:image" content="https://lovable.dev/opengraph-image-p98pqg.png" />
<meta name="twitter:card" content="summary_large_image" /> <meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:site" content="@lovable_dev" /> <meta name="twitter:site" content="@mcp_platform" />
<meta name="twitter:image" content="https://lovable.dev/opengraph-image-p98pqg.png" /> <meta name="twitter:image" content="https://lovable.dev/opengraph-image-p98pqg.png" />
<!-- Google Fonts -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&display=swap" rel="stylesheet">
</head> </head>
<body> <body style="font-family: 'Inter', sans-serif;">
<div id="root"></div> <div id="root"></div>
<script type="module" src="/src/main.tsx"></script> <script type="module" src="/src/main.tsx"></script>
</body> </body>

View File

@ -0,0 +1,155 @@
import React, { useState, useEffect } from 'react';
import { Button } from '@/components/ui/button';
import { Input } from '@/components/ui/input';
import TypingAnimation from './TypingAnimation';
import { getPromptContent } from '../utils/promptContent';
interface ChatInterfaceProps {
onPromptSelect: (prompt: string, content: any) => void;
isExpanded: boolean;
}
const prompts = [
"What can you help me with?",
"What is MCP?",
"Who is this for?",
"Show me how I can earn"
];
const ChatInterface: React.FC<ChatInterfaceProps> = ({ onPromptSelect, isExpanded }) => {
const [messages, setMessages] = useState<Array<{ text: string; isUser: boolean; isTyping?: boolean }>>([]);
const [inputValue, setInputValue] = useState('');
const [isThinking, setIsThinking] = useState(false);
const handlePromptClick = (prompt: string) => {
setMessages(prev => [...prev, { text: prompt, isUser: true }]);
setIsThinking(true);
setTimeout(() => {
setIsThinking(false);
setMessages(prev => [...prev, { text: `Let me show you detailed information about "${prompt}"`, isUser: false, isTyping: true }]);
setTimeout(() => {
const content = getPromptContent(prompt);
onPromptSelect(prompt, content);
}, 1500);
}, 1000);
};
const handleSendMessage = () => {
if (!inputValue.trim()) return;
const prompt = inputValue;
setInputValue('');
handlePromptClick(prompt);
};
const handleKeyPress = (e: React.KeyboardEvent) => {
if (e.key === 'Enter') {
handleSendMessage();
}
};
return (
<div className="flex flex-col h-full p-6">
{/* Hero Section */}
{messages.length === 0 && (
<div className={`flex-1 flex flex-col justify-center items-center text-center transition-all duration-500 ${
isExpanded ? 'max-w-4xl mx-auto' : 'max-w-2xl mx-auto'
}`}>
<div className="mb-8">
<h1 className="text-4xl md:text-6xl font-bold text-gray-900 dark:text-white mb-6 leading-tight">
Build an MCP server and become part of the new world
</h1>
<p className="text-xl text-gray-600 dark:text-gray-300 mb-8">
Where AI chatbots are the modern interface
</p>
</div>
{/* Glassmorphism card with prompts */}
<div className="w-full max-w-2xl p-8 rounded-3xl border border-gray-200/20 dark:border-gray-700/20 backdrop-blur-xl bg-white/10 dark:bg-black/10 shadow-2xl">
<h3 className="text-lg font-semibold text-gray-900 dark:text-white mb-6">
How can I help you today?
</h3>
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
{prompts.map((prompt, index) => (
<Button
key={index}
variant="ghost"
onClick={() => handlePromptClick(prompt)}
className="p-4 h-auto text-left justify-start border border-gray-200/20 dark:border-gray-700/20 backdrop-blur-sm bg-white/5 dark:bg-black/5 hover:bg-white/10 dark:hover:bg-black/10 rounded-xl transition-all duration-300 hover:scale-105"
>
<span className="text-gray-700 dark:text-gray-300">{prompt}</span>
</Button>
))}
</div>
</div>
</div>
)}
{/* Chat Messages */}
{messages.length > 0 && (
<div className="flex-1 overflow-y-auto space-y-4 mb-6">
{messages.map((message, index) => (
<div
key={index}
className={`flex ${message.isUser ? 'justify-end' : 'justify-start'}`}
>
<div
className={`max-w-xs lg:max-w-md px-4 py-3 rounded-2xl ${
message.isUser
? 'bg-blue-500 text-white'
: 'border border-gray-200/20 dark:border-gray-700/20 backdrop-blur-xl bg-white/10 dark:bg-black/10 text-gray-900 dark:text-white'
}`}
>
{message.isTyping ? (
<TypingAnimation text={message.text} />
) : (
message.text
)}
</div>
</div>
))}
{isThinking && (
<div className="flex justify-start">
<div className="max-w-xs lg:max-w-md px-4 py-3 rounded-2xl border border-gray-200/20 dark:border-gray-700/20 backdrop-blur-xl bg-white/10 dark:bg-black/10 text-gray-900 dark:text-white">
<div className="flex items-center space-x-2">
<div className="flex space-x-1">
<div className="w-2 h-2 bg-gray-400 rounded-full animate-bounce"></div>
<div className="w-2 h-2 bg-gray-400 rounded-full animate-bounce" style={{ animationDelay: '0.1s' }}></div>
<div className="w-2 h-2 bg-gray-400 rounded-full animate-bounce" style={{ animationDelay: '0.2s' }}></div>
</div>
<span className="text-sm">AI is thinking...</span>
</div>
</div>
</div>
)}
</div>
)}
{/* Input Area */}
<div className="border border-gray-200/20 dark:border-gray-700/20 backdrop-blur-xl bg-white/10 dark:bg-black/10 rounded-2xl p-4">
<div className="flex space-x-4">
<Input
value={inputValue}
onChange={(e) => setInputValue(e.target.value)}
onKeyPress={handleKeyPress}
placeholder="Ask me anything about MCP..."
className="flex-1 border-0 bg-transparent focus:ring-0 text-gray-900 dark:text-white placeholder-gray-500 dark:placeholder-gray-400"
/>
<Button
onClick={handleSendMessage}
disabled={!inputValue.trim()}
className="bg-blue-500 hover:bg-blue-600 text-white rounded-xl px-6"
>
Send
</Button>
</div>
</div>
</div>
);
};
export default ChatInterface;

44
src/components/Header.tsx Normal file
View File

@ -0,0 +1,44 @@
import React from 'react';
import { useTheme } from '../contexts/ThemeContext';
import { Button } from '@/components/ui/button';
const Header = () => {
const { isDark, toggleTheme } = useTheme();
return (
<header className="h-20 border-b border-gray-200/20 dark:border-gray-700/20 backdrop-blur-xl bg-white/10 dark:bg-black/10">
<div className="max-w-7xl mx-auto px-6 h-full flex items-center justify-between">
<div className="flex items-center space-x-4">
<div className="w-8 h-8 bg-gradient-to-br from-blue-500 to-purple-600 rounded-lg flex items-center justify-center">
<span className="text-white font-bold text-sm">M</span>
</div>
<h1 className="text-xl font-semibold text-gray-900 dark:text-white">
MCP Platform
</h1>
</div>
<div className="flex items-center space-x-4">
<Button
variant="ghost"
size="sm"
onClick={toggleTheme}
className="w-10 h-10 rounded-full border border-gray-200/20 dark:border-gray-700/20 backdrop-blur-sm bg-white/10 dark:bg-black/10 hover:bg-white/20 dark:hover:bg-black/20 transition-all duration-300"
>
{isDark ? (
<svg className="w-4 h-4" fill="currentColor" viewBox="0 0 20 20">
<path fillRule="evenodd" d="M10 2a1 1 0 011 1v1a1 1 0 11-2 0V3a1 1 0 011-1zm4 8a4 4 0 11-8 0 4 4 0 018 0zm-.464 4.95l.707.707a1 1 0 001.414-1.414l-.707-.707a1 1 0 00-1.414 1.414zm2.12-10.607a1 1 0 010 1.414l-.706.707a1 1 0 11-1.414-1.414l.707-.707a1 1 0 011.414 0zM17 11a1 1 0 100-2h-1a1 1 0 100 2h1zm-7 4a1 1 0 011 1v1a1 1 0 11-2 0v-1a1 1 0 011-1zM5.05 6.464A1 1 0 106.465 5.05l-.708-.707a1 1 0 00-1.414 1.414l.707.707zm1.414 8.486l-.707.707a1 1 0 01-1.414-1.414l.707-.707a1 1 0 011.414 1.414zM4 11a1 1 0 100-2H3a1 1 0 000 2h1z" clipRule="evenodd" />
</svg>
) : (
<svg className="w-4 h-4" fill="currentColor" viewBox="0 0 20 20">
<path d="M17.293 13.293A8 8 0 016.707 2.707a8.001 8.001 0 1010.586 10.586z" />
</svg>
)}
</Button>
</div>
</div>
</header>
);
};
export default Header;

View File

@ -0,0 +1,46 @@
import React from 'react';
import { Button } from '@/components/ui/button';
interface SidebarPanelProps {
isOpen: boolean;
content: any;
onClose: () => void;
}
const SidebarPanel: React.FC<SidebarPanelProps> = ({ isOpen, content, onClose }) => {
return (
<div
className={`fixed right-0 top-20 h-[calc(100vh-80px)] w-1/2 transform transition-transform duration-500 ease-in-out z-40 ${
isOpen ? 'translate-x-0' : 'translate-x-full'
}`}
>
<div className="h-full border-l border-gray-200/20 dark:border-gray-700/20 backdrop-blur-xl bg-white/95 dark:bg-black/95">
<div className="p-6 h-full overflow-y-auto">
<div className="flex items-center justify-between mb-6">
<h2 className="text-2xl font-bold text-gray-900 dark:text-white">
{content?.title || 'Details'}
</h2>
<Button
variant="ghost"
onClick={onClose}
className="w-10 h-10 rounded-full hover:bg-gray-100 dark:hover:bg-gray-800"
>
<svg className="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M6 18L18 6M6 6l12 12" />
</svg>
</Button>
</div>
{content && (
<div className="space-y-6">
{content.component}
</div>
)}
</div>
</div>
</div>
);
};
export default SidebarPanel;

View File

@ -0,0 +1,34 @@
import React, { useState, useEffect } from 'react';
interface TypingAnimationProps {
text: string;
speed?: number;
}
const TypingAnimation: React.FC<TypingAnimationProps> = ({ text, speed = 50 }) => {
const [displayedText, setDisplayedText] = useState('');
const [currentIndex, setCurrentIndex] = useState(0);
useEffect(() => {
if (currentIndex < text.length) {
const timer = setTimeout(() => {
setDisplayedText(prev => prev + text[currentIndex]);
setCurrentIndex(prev => prev + 1);
}, speed);
return () => clearTimeout(timer);
}
}, [currentIndex, text, speed]);
return (
<span>
{displayedText}
{currentIndex < text.length && (
<span className="animate-pulse">|</span>
)}
</span>
);
};
export default TypingAnimation;

View File

@ -0,0 +1,113 @@
import React from 'react';
import { Card } from '@/components/ui/card';
import { Button } from '@/components/ui/button';
const HowToEarnContent = () => {
return (
<div className="space-y-8">
<div className="text-center">
<h2 className="text-3xl font-bold text-gray-900 dark:text-white mb-4">
Monetize Your AI Creations
</h2>
<p className="text-xl text-gray-600 dark:text-gray-300">
Turn your MCP servers into revenue-generating assets
</p>
</div>
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
<Card className="p-6 border border-gray-200/20 dark:border-gray-700/20 backdrop-blur-xl bg-white/10 dark:bg-black/10">
<div className="flex items-center mb-4">
<div className="w-12 h-12 bg-gradient-to-br from-green-500 to-emerald-600 rounded-lg flex items-center justify-center mr-4">
<svg className="w-6 h-6 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M12 8c-1.657 0-3 .895-3 2s1.343 2 3 2 3 .895 3 2-1.343 2-3 2m0-8c1.11 0 2.08.402 2.599 1M12 8V7m0 1v8m0 0v1m0-1c-1.11 0-2.08-.402-2.599-1" />
</svg>
</div>
<h3 className="text-xl font-semibold text-gray-900 dark:text-white">
Token-Based Revenue
</h3>
</div>
<p className="text-gray-600 dark:text-gray-300 mb-4">
Earn tokens every time users interact with your MCP servers. Set your own pricing and watch your revenue grow.
</p>
<div className="space-y-2">
<div className="flex justify-between">
<span className="text-sm text-gray-500">Per interaction</span>
<span className="text-sm font-semibold text-green-600">0.01-0.50 tokens</span>
</div>
<div className="flex justify-between">
<span className="text-sm text-gray-500">Monthly potential</span>
<span className="text-sm font-semibold text-green-600">$100-$10,000+</span>
</div>
</div>
</Card>
<Card className="p-6 border border-gray-200/20 dark:border-gray-700/20 backdrop-blur-xl bg-white/10 dark:bg-black/10">
<div className="flex items-center mb-4">
<div className="w-12 h-12 bg-gradient-to-br from-blue-500 to-purple-600 rounded-lg flex items-center justify-center mr-4">
<svg className="w-6 h-6 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0zm6 3a2 2 0 11-4 0 2 2 0 014 0zM7 10a2 2 0 11-4 0 2 2 0 014 0z" />
</svg>
</div>
<h3 className="text-xl font-semibold text-gray-900 dark:text-white">
Series Subscriptions
</h3>
</div>
<p className="text-gray-600 dark:text-gray-300 mb-4">
Create premium series with exclusive content. Users subscribe for ongoing access to your specialized AI tools.
</p>
<div className="space-y-2">
<div className="flex justify-between">
<span className="text-sm text-gray-500">Monthly subscription</span>
<span className="text-sm font-semibold text-blue-600">$5-$50/user</span>
</div>
<div className="flex justify-between">
<span className="text-sm text-gray-500">Revenue share</span>
<span className="text-sm font-semibold text-blue-600">70% creator</span>
</div>
</div>
</Card>
</div>
<Card className="p-8 border border-gray-200/20 dark:border-gray-700/20 backdrop-blur-xl bg-gradient-to-br from-purple-50/50 to-pink-50/50 dark:from-purple-900/20 dark:to-pink-900/20">
<h3 className="text-2xl font-bold text-gray-900 dark:text-white mb-6">
Revenue Streams
</h3>
<div className="grid grid-cols-1 md:grid-cols-3 gap-6">
<div className="text-center">
<div className="w-16 h-16 bg-gradient-to-br from-green-500 to-emerald-600 rounded-full flex items-center justify-center mx-auto mb-4">
<span className="text-2xl">💰</span>
</div>
<h4 className="font-semibold text-gray-900 dark:text-white mb-2">Pay-per-Use</h4>
<p className="text-sm text-gray-600 dark:text-gray-300">Users pay tokens for each interaction</p>
</div>
<div className="text-center">
<div className="w-16 h-16 bg-gradient-to-br from-blue-500 to-purple-600 rounded-full flex items-center justify-center mx-auto mb-4">
<span className="text-2xl">📱</span>
</div>
<h4 className="font-semibold text-gray-900 dark:text-white mb-2">App Licensing</h4>
<p className="text-sm text-gray-600 dark:text-gray-300">License your MCPs to other developers</p>
</div>
<div className="text-center">
<div className="w-16 h-16 bg-gradient-to-br from-orange-500 to-red-600 rounded-full flex items-center justify-center mx-auto mb-4">
<span className="text-2xl">🎯</span>
</div>
<h4 className="font-semibold text-gray-900 dark:text-white mb-2">Premium Features</h4>
<p className="text-sm text-gray-600 dark:text-gray-300">Offer advanced capabilities for higher fees</p>
</div>
</div>
</Card>
<div className="text-center">
<Button className="bg-gradient-to-r from-green-500 to-emerald-600 hover:from-green-600 hover:to-emerald-700 text-white px-8 py-3 rounded-xl text-lg font-semibold shadow-lg">
Start Earning Today
</Button>
<p className="text-sm text-gray-500 dark:text-gray-400 mt-2">
No upfront costs 70% revenue share Instant payments
</p>
</div>
</div>
);
};
export default HowToEarnContent;

View File

@ -0,0 +1,110 @@
import React from 'react';
import { Card } from '@/components/ui/card';
const WhatCanHelpContent = () => {
const features = [
{
title: "Your MCPs",
description: "Manage and deploy your MCP servers",
icon: "🚀",
items: ["Create new servers", "Monitor performance", "Update configurations", "View analytics"],
gradient: "from-blue-500 to-cyan-600"
},
{
title: "Earn by Sharing",
description: "Monetize your AI creations",
icon: "💰",
items: ["Set pricing models", "Track earnings", "Revenue optimization", "Payment processing"],
gradient: "from-green-500 to-emerald-600"
},
{
title: "Get on the Cloud",
description: "Scale your MCPs globally",
icon: "☁️",
items: ["Auto-scaling", "Global CDN", "99.9% uptime", "Load balancing"],
gradient: "from-purple-500 to-pink-600"
},
{
title: "Build without Coding",
description: "Visual MCP builder for everyone",
icon: "🎨",
items: ["Drag & drop interface", "Pre-built templates", "AI assistance", "One-click deploy"],
gradient: "from-orange-500 to-red-600"
}
];
return (
<div className="space-y-8">
<div className="text-center">
<h2 className="text-3xl font-bold text-gray-900 dark:text-white mb-4">
Platform Features
</h2>
<p className="text-xl text-gray-600 dark:text-gray-300">
Everything you need to build, deploy, and monetize AI-first applications
</p>
</div>
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
{features.map((feature, index) => (
<Card
key={index}
className="p-6 border border-gray-200/20 dark:border-gray-700/20 backdrop-blur-xl bg-white/10 dark:bg-black/10 hover:bg-white/20 dark:hover:bg-black/20 transition-all duration-300 hover:scale-105"
>
<div className="flex items-center mb-4">
<div className={`w-12 h-12 bg-gradient-to-br ${feature.gradient} rounded-lg flex items-center justify-center mr-4 text-xl`}>
{feature.icon}
</div>
<div>
<h3 className="text-xl font-semibold text-gray-900 dark:text-white">
{feature.title}
</h3>
<p className="text-sm text-gray-600 dark:text-gray-300">
{feature.description}
</p>
</div>
</div>
<div className="space-y-2">
{feature.items.map((item, itemIndex) => (
<div key={itemIndex} className="flex items-center space-x-2">
<div className="w-1.5 h-1.5 bg-blue-500 rounded-full"></div>
<span className="text-sm text-gray-600 dark:text-gray-300">{item}</span>
</div>
))}
</div>
</Card>
))}
</div>
<Card className="p-8 border border-gray-200/20 dark:border-gray-700/20 backdrop-blur-xl bg-gradient-to-br from-indigo-50/50 to-blue-50/50 dark:from-indigo-900/20 dark:to-blue-900/20">
<div className="text-center">
<h3 className="text-2xl font-bold text-gray-900 dark:text-white mb-4">
AI-First Development
</h3>
<p className="text-lg text-gray-600 dark:text-gray-300 mb-6">
Experience the future of application development where AI chatbots are the primary interface
</p>
<div className="grid grid-cols-1 md:grid-cols-3 gap-6">
<div className="text-center">
<div className="text-3xl mb-2"></div>
<h4 className="font-semibold text-gray-900 dark:text-white">Lightning Fast</h4>
<p className="text-sm text-gray-600 dark:text-gray-300">Deploy in seconds, not hours</p>
</div>
<div className="text-center">
<div className="text-3xl mb-2">🔒</div>
<h4 className="font-semibold text-gray-900 dark:text-white">Secure by Default</h4>
<p className="text-sm text-gray-600 dark:text-gray-300">Enterprise-grade security</p>
</div>
<div className="text-center">
<div className="text-3xl mb-2">📈</div>
<h4 className="font-semibold text-gray-900 dark:text-white">Auto-Scale</h4>
<p className="text-sm text-gray-600 dark:text-gray-300">Handles millions of requests</p>
</div>
</div>
</div>
</Card>
</div>
);
};
export default WhatCanHelpContent;

View File

@ -0,0 +1,88 @@
import React from 'react';
import { Card } from '@/components/ui/card';
const WhatIsMCPContent = () => {
return (
<div className="space-y-6">
<div className="prose prose-lg dark:prose-invert max-w-none">
<p className="text-lg text-gray-600 dark:text-gray-300 leading-relaxed">
MCP (Model Context Protocol) is a revolutionary wrapper around LLM APIs that creates
a standardized interface for AI interactions. Think of it as the bridge between
traditional applications and the AI-first future.
</p>
</div>
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
<Card className="p-6 border border-gray-200/20 dark:border-gray-700/20 backdrop-blur-xl bg-white/10 dark:bg-black/10">
<div className="flex items-center mb-4">
<div className="w-12 h-12 bg-gradient-to-br from-blue-500 to-purple-600 rounded-lg flex items-center justify-center mr-4">
<svg className="w-6 h-6 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M8 9l3 3-3 3m5 0h3M5 20h14a2 2 0 002-2V6a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z" />
</svg>
</div>
<h3 className="text-xl font-semibold text-gray-900 dark:text-white">
Standardized Protocol
</h3>
</div>
<p className="text-gray-600 dark:text-gray-300">
Creates a universal language for AI agents to communicate with any application or service.
</p>
</Card>
<Card className="p-6 border border-gray-200/20 dark:border-gray-700/20 backdrop-blur-xl bg-white/10 dark:bg-black/10">
<div className="flex items-center mb-4">
<div className="w-12 h-12 bg-gradient-to-br from-green-500 to-teal-600 rounded-lg flex items-center justify-center mr-4">
<svg className="w-6 h-6 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M13 10V3L4 14h7v7l9-11h-7z" />
</svg>
</div>
<h3 className="text-xl font-semibold text-gray-900 dark:text-white">
Lightning Fast
</h3>
</div>
<p className="text-gray-600 dark:text-gray-300">
Optimized for real-time interactions with minimal latency and maximum efficiency.
</p>
</Card>
</div>
<Card className="p-8 border border-gray-200/20 dark:border-gray-700/20 backdrop-blur-xl bg-gradient-to-br from-blue-50/50 to-purple-50/50 dark:from-blue-900/20 dark:to-purple-900/20">
<h3 className="text-2xl font-bold text-gray-900 dark:text-white mb-4">
How MCP Works
</h3>
<div className="space-y-4">
<div className="flex items-start space-x-4">
<div className="w-8 h-8 bg-blue-500 rounded-full flex items-center justify-center text-white font-bold text-sm">
1
</div>
<div>
<h4 className="font-semibold text-gray-900 dark:text-white">Connect</h4>
<p className="text-gray-600 dark:text-gray-300">Your application connects to MCP servers</p>
</div>
</div>
<div className="flex items-start space-x-4">
<div className="w-8 h-8 bg-purple-500 rounded-full flex items-center justify-center text-white font-bold text-sm">
2
</div>
<div>
<h4 className="font-semibold text-gray-900 dark:text-white">Process</h4>
<p className="text-gray-600 dark:text-gray-300">MCP handles the communication and context</p>
</div>
</div>
<div className="flex items-start space-x-4">
<div className="w-8 h-8 bg-green-500 rounded-full flex items-center justify-center text-white font-bold text-sm">
3
</div>
<div>
<h4 className="font-semibold text-gray-900 dark:text-white">Deliver</h4>
<p className="text-gray-600 dark:text-gray-300">Receive intelligent, contextual responses</p>
</div>
</div>
</div>
</Card>
</div>
);
};
export default WhatIsMCPContent;

View File

@ -0,0 +1,100 @@
import React from 'react';
import { Card } from '@/components/ui/card';
const WhoIsThisForContent = () => {
const audiences = [
{
title: "Developers",
description: "Build powerful MCP servers with full code control",
icon: "💻",
features: ["Full API access", "Custom integrations", "Advanced features", "Revenue sharing"],
gradient: "from-blue-500 to-cyan-600"
},
{
title: "Non-Coders",
description: "Create amazing AI experiences without writing code",
icon: "🎨",
features: ["Visual builder", "Pre-built templates", "Drag & drop", "Instant deployment"],
gradient: "from-purple-500 to-pink-600"
},
{
title: "Creators",
description: "Monetize your AI creations and build an audience",
icon: "✨",
features: ["Token economy", "Series monetization", "Community tools", "Analytics"],
gradient: "from-green-500 to-emerald-600"
}
];
return (
<div className="space-y-8">
<div className="text-center">
<h2 className="text-3xl font-bold text-gray-900 dark:text-white mb-4">
Built for Everyone
</h2>
<p className="text-xl text-gray-600 dark:text-gray-300">
Whether you code or not, MCP Platform empowers you to create AI-first applications
</p>
</div>
<div className="grid grid-cols-1 gap-8">
{audiences.map((audience, index) => (
<Card
key={index}
className="p-8 border border-gray-200/20 dark:border-gray-700/20 backdrop-blur-xl bg-white/10 dark:bg-black/10 hover:bg-white/20 dark:hover:bg-black/20 transition-all duration-300 hover:scale-105"
>
<div className="flex items-start space-x-6">
<div className={`w-16 h-16 bg-gradient-to-br ${audience.gradient} rounded-2xl flex items-center justify-center text-2xl`}>
{audience.icon}
</div>
<div className="flex-1">
<h3 className="text-2xl font-bold text-gray-900 dark:text-white mb-2">
{audience.title}
</h3>
<p className="text-lg text-gray-600 dark:text-gray-300 mb-4">
{audience.description}
</p>
<div className="grid grid-cols-2 gap-2">
{audience.features.map((feature, featureIndex) => (
<div key={featureIndex} className="flex items-center space-x-2">
<div className="w-2 h-2 bg-green-500 rounded-full"></div>
<span className="text-sm text-gray-600 dark:text-gray-300">{feature}</span>
</div>
))}
</div>
</div>
</div>
</Card>
))}
</div>
<Card className="p-8 border border-gray-200/20 dark:border-gray-700/20 backdrop-blur-xl bg-gradient-to-br from-yellow-50/50 to-orange-50/50 dark:from-yellow-900/20 dark:to-orange-900/20">
<div className="text-center">
<h3 className="text-2xl font-bold text-gray-900 dark:text-white mb-4">
The AI-First Future
</h3>
<p className="text-lg text-gray-600 dark:text-gray-300 mb-6">
Join thousands of creators building the next generation of AI-powered applications
</p>
<div className="flex justify-center space-x-8 text-center">
<div>
<div className="text-3xl font-bold text-blue-600 dark:text-blue-400">10K+</div>
<div className="text-sm text-gray-600 dark:text-gray-300">Active Creators</div>
</div>
<div>
<div className="text-3xl font-bold text-purple-600 dark:text-purple-400">50K+</div>
<div className="text-sm text-gray-600 dark:text-gray-300">MCP Servers</div>
</div>
<div>
<div className="text-3xl font-bold text-green-600 dark:text-green-400">$1M+</div>
<div className="text-sm text-gray-600 dark:text-gray-300">Creator Earnings</div>
</div>
</div>
</div>
</Card>
</div>
);
};
export default WhoIsThisForContent;

View File

@ -0,0 +1,39 @@
import React, { createContext, useContext, useState, useEffect } from 'react';
interface ThemeContextType {
isDark: boolean;
toggleTheme: () => void;
}
const ThemeContext = createContext<ThemeContextType | undefined>(undefined);
export const ThemeProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {
const [isDark, setIsDark] = useState(false);
useEffect(() => {
if (isDark) {
document.documentElement.classList.add('dark');
} else {
document.documentElement.classList.remove('dark');
}
}, [isDark]);
const toggleTheme = () => {
setIsDark(!isDark);
};
return (
<ThemeContext.Provider value={{ isDark, toggleTheme }}>
{children}
</ThemeContext.Provider>
);
};
export const useTheme = () => {
const context = useContext(ThemeContext);
if (context === undefined) {
throw new Error('useTheme must be used within a ThemeProvider');
}
return context;
};

View File

@ -1,13 +1,55 @@
// Update this page (the content is just a fallback if you fail to update the page)
import React, { useState } from 'react';
import Header from '../components/Header';
import ChatInterface from '../components/ChatInterface';
import SidebarPanel from '../components/SidebarPanel';
import { ThemeProvider } from '../contexts/ThemeContext';
const Index = () => { const Index = () => {
const [selectedPrompt, setSelectedPrompt] = useState<string | null>(null);
const [sidebarContent, setSidebarContent] = useState<any>(null);
const handlePromptSelect = (prompt: string, content: any) => {
setSelectedPrompt(prompt);
setSidebarContent(content);
};
const handleCloseSidebar = () => {
setSelectedPrompt(null);
setSidebarContent(null);
};
return ( return (
<div className="min-h-screen flex items-center justify-center bg-background"> <ThemeProvider>
<div className="text-center"> <div className="min-h-screen bg-gradient-to-br from-white via-gray-50 to-gray-100 dark:from-black dark:via-gray-900 dark:to-gray-800 transition-all duration-500">
<h1 className="text-4xl font-bold mb-4">Welcome to Your Blank App</h1> <Header />
<p className="text-xl text-muted-foreground">Start building your amazing project here!</p>
<div className="flex h-[calc(100vh-80px)] relative">
{/* Main Chat Interface */}
<div className={`transition-all duration-500 ease-in-out ${
selectedPrompt ? 'w-1/2' : 'w-full'
}`}>
<ChatInterface
onPromptSelect={handlePromptSelect}
isExpanded={!selectedPrompt}
/>
</div>
{/* Sliding Sidebar Panel */}
<SidebarPanel
isOpen={!!selectedPrompt}
content={sidebarContent}
onClose={handleCloseSidebar}
/>
</div>
{/* Subtle light leaks */}
<div className="fixed inset-0 pointer-events-none overflow-hidden">
<div className="absolute -top-1/2 -right-1/2 w-full h-full bg-gradient-radial from-blue-500/5 via-transparent to-transparent dark:from-blue-400/10"></div>
<div className="absolute -bottom-1/2 -left-1/2 w-full h-full bg-gradient-radial from-purple-500/5 via-transparent to-transparent dark:from-purple-400/10"></div>
</div> </div>
</div> </div>
</ThemeProvider>
); );
}; };

View File

@ -0,0 +1,36 @@
import React from 'react';
import WhatIsMCPContent from '../components/content/WhatIsMCPContent';
import WhoIsThisForContent from '../components/content/WhoIsThisForContent';
import HowToEarnContent from '../components/content/HowToEarnContent';
import WhatCanHelpContent from '../components/content/WhatCanHelpContent';
export const getPromptContent = (prompt: string) => {
switch (prompt) {
case "What is MCP?":
return {
title: "What is MCP?",
component: <WhatIsMCPContent />
};
case "Who is this for?":
return {
title: "Who is this for?",
component: <WhoIsThisForContent />
};
case "Show me how I can earn":
return {
title: "How to Earn",
component: <HowToEarnContent />
};
case "What can you help me with?":
return {
title: "Platform Features",
component: <WhatCanHelpContent />
};
default:
return {
title: "Information",
component: <div className="text-gray-600 dark:text-gray-300">Content for "{prompt}" coming soon...</div>
};
}
};

View File

@ -1,3 +1,4 @@
import type { Config } from "tailwindcss"; import type { Config } from "tailwindcss";
export default { export default {
@ -68,6 +69,9 @@ export default {
md: 'calc(var(--radius) - 2px)', md: 'calc(var(--radius) - 2px)',
sm: 'calc(var(--radius) - 4px)' sm: 'calc(var(--radius) - 4px)'
}, },
backgroundImage: {
'gradient-radial': 'radial-gradient(var(--tw-gradient-stops))',
},
keyframes: { keyframes: {
'accordion-down': { 'accordion-down': {
from: { from: {