🏗️ 项目重构:模块化清理完成

This commit is contained in:
llama-research
2025-09-01 12:29:27 +00:00
parent ef7657101a
commit f9856c31e5
349 changed files with 41438 additions and 254 deletions

283
website/index.html Normal file
View File

@@ -0,0 +1,283 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>AI Agent协作框架 - 真实的多Agent协作系统</title>
<link rel="stylesheet" href="styles.css">
<link href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism-tomorrow.min.css" rel="stylesheet">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap" rel="stylesheet">
</head>
<body>
<!-- Navigation -->
<nav class="navbar">
<div class="nav-container">
<div class="nav-logo">
<span class="logo-text">🤖 AI Agent协作</span>
</div>
<ul class="nav-menu">
<li><a href="#home">首页</a></li>
<li><a href="#features">特性</a></li>
<li><a href="#demo">演示</a></li>
<li><a href="#docs">文档</a></li>
<li><a href="#github" class="github-link">GitHub</a></li>
</ul>
<div class="hamburger">
<span></span>
<span></span>
<span></span>
</div>
</div>
</nav>
<!-- Hero Section -->
<section id="home" class="hero">
<div class="hero-container">
<div class="hero-content">
<h1 class="hero-title">
从模拟到真实<br>
<span class="gradient-text">让每个AI Agent都拥有独立Git身份</span>
</h1>
<p class="hero-subtitle">
不是让AI Agent假装协作而是让每个Agent都有真实的Git身份<br>
独立的SSH密钥、GPG签名、用户名和邮箱实现可追溯的团队协作历史
</p>
<div class="hero-buttons">
<button class="btn btn-primary" onclick="startDemo()">
🚀 立即体验
</button>
<button class="btn btn-secondary" onclick="scrollToSection('features')">
📖 了解更多
</button>
</div>
<div class="hero-stats">
<div class="stat">
<span class="stat-number">4</span>
<span class="stat-label">预定义Agent</span>
</div>
<div class="stat">
<span class="stat-number">100%</span>
<span class="stat-label">真实Git提交</span>
</div>
<div class="stat">
<span class="stat-number">一键</span>
<span class="stat-label">快速启动</span>
</div>
</div>
</div>
<div class="hero-visual">
<div class="terminal-window">
<div class="terminal-header">
<div class="terminal-buttons">
<span></span>
<span></span>
<span></span>
</div>
<div class="terminal-title">Agent协作演示</div>
</div>
<div class="terminal-content">
<div class="terminal-line">
<span class="prompt">$</span>
<span class="command">./agents/switch_agent.sh claude-ai</span>
</div>
<div class="terminal-line">
<span class="prompt">claude-ai@framework</span>
<span class="command">git commit -m "设计系统架构"</span>
</div>
<div class="terminal-line">
<span class="prompt">$</span>
<span class="command">./agents/switch_agent.sh gemini-dev</span>
</div>
<div class="terminal-line">
<span class="prompt">gemini-dev@framework</span>
<span class="command">git commit -m "实现核心功能"</span>
</div>
<div class="terminal-line success">
✅ 真实的协作历史已创建
</div>
</div>
</div>
</div>
</div>
</section>
<!-- Features Section -->
<section id="features" class="features">
<div class="container">
<h2 class="section-title">核心特性</h2>
<div class="features-grid">
<div class="feature-card">
<div class="feature-icon">🔐</div>
<h3>真实身份系统</h3>
<p>每个Agent拥有独立的SSH密钥、GPG签名和Git配置确保每次提交都可追溯到具体Agent</p>
<ul>
<li>独立SSH密钥对</li>
<li>GPG签名验证</li>
<li>独立Git配置</li>
<li>完整审计日志</li>
</ul>
</div>
<div class="feature-card">
<div class="feature-icon">🎭</div>
<h3>专业化角色</h3>
<p>预定义四种专业化Agent角色每个都有明确的责任边界和专长领域</p>
<div class="roles-list">
<div class="role-item">
<strong>claude-ai</strong> - 架构师
</div>
<div class="role-item">
<strong>gemini-dev</strong> - 开发者
</div>
<div class="role-item">
<strong>qwen-ops</strong> - 运维
</div>
<div class="role-item">
<strong>llama-research</strong> - 研究员
</div>
</div>
</div>
<div class="feature-card">
<div class="feature-icon">📊</div>
<h3>实时协作监控</h3>
<p>实时查看所有Agent的协作状态、提交统计和代码贡献分析</p>
<div class="stats-preview">
<div class="stat-bar">
<span>claude-ai</span>
<div class="bar"><div style="width: 25%"></div></div>
<span>5次提交</span>
</div>
<div class="stat-bar">
<span>gemini-dev</span>
<div class="bar"><div style="width: 40%"></div></div>
<span>8次提交</span>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- Demo Section -->
<section id="demo" class="demo">
<div class="container">
<h2 class="section-title">实时演示</h2>
<div class="demo-container">
<div class="demo-panel">
<h3>Agent状态监控</h3>
<div id="agent-status" class="agent-grid">
<!-- 动态加载Agent状态 -->
</div>
</div>
<div class="demo-panel">
<h3>最近活动</h3>
<div id="recent-activity" class="activity-feed">
<!-- 动态加载活动数据 -->
</div>
</div>
</div>
<div class="demo-actions">
<button class="btn btn-primary" onclick="runDemo()">
🎬 运行演示
</button>
<button class="btn btn-secondary" onclick="resetDemo()">
🔄 重置演示
</button>
</div>
</div>
</section>
<!-- Quick Start Section -->
<section class="quick-start">
<div class="container">
<h2 class="section-title">快速开始</h2>
<div class="install-options">
<div class="install-card">
<h3>🚀 一键安装</h3>
<div class="code-block">
<pre><code class="language-bash">curl -fsSL https://raw.githubusercontent.com/your-org/agent-collaboration-framework/main/install.sh | bash</code></pre>
</div>
</div>
<div class="install-card">
<h3>📦 手动安装</h3>
<div class="code-block">
<pre><code class="language-bash">git clone https://github.com/your-org/agent-collaboration-framework.git
cd agent-collaboration-framework
./install.sh</code></pre>
</div>
</div>
<div class="install-card">
<h3>🐳 Docker</h3>
<div class="code-block">
<pre><code class="language-bash">docker run -it -v $(pwd):/workspace agent-collaboration:latest</code></pre>
</div>
</div>
</div>
</div>
</section>
<!-- Documentation Section -->
<section id="docs" class="documentation">
<div class="container">
<h2 class="section-title">文档中心</h2>
<div class="docs-grid">
<div class="doc-card">
<h3>📚 快速入门</h3>
<p>从零开始了解AI Agent协作框架</p>
<a href="docs/quickstart.html" class="doc-link">开始阅读 →</a>
</div>
<div class="doc-card">
<h3>🏗️ 架构指南</h3>
<p>深入理解系统架构和设计原理</p>
<a href="docs/architecture.html" class="doc-link">查看详情 →</a>
</div>
<div class="doc-card">
<h3>🔧 API文档</h3>
<p>完整的API参考和开发指南</p>
<a href="docs/api.html" class="doc-link">浏览API →</a>
</div>
<div class="doc-card">
<h3>🎯 使用案例</h3>
<p>真实场景下的使用示例和最佳实践</p>
<a href="docs/examples.html" class="doc-link">查看案例 →</a>
</div>
</div>
</div>
</section>
<!-- Footer -->
<footer class="footer">
<div class="container">
<div class="footer-content">
<div class="footer-section">
<h4>AI Agent协作框架</h4>
<p>让AI Agent拥有真实的Git身份实现可追溯的团队协作</p>
</div>
<div class="footer-section">
<h4>快速链接</h4>
<ul>
<li><a href="#home">首页</a></li>
<li><a href="#features">特性</a></li>
<li><a href="#demo">演示</a></li>
<li><a href="#docs">文档</a></li>
</ul>
</div>
<div class="footer-section">
<h4>社区</h4>
<ul>
<li><a href="https://github.com/your-org/agent-collaboration-framework">GitHub</a></li>
<li><a href="https://github.com/your-org/agent-collaboration-framework/issues">问题反馈</a></li>
<li><a href="https://github.com/your-org/agent-collaboration-framework/discussions">讨论</a></li>
</ul>
</div>
</div>
<div class="footer-bottom">
<p>&copy; 2024 AI Agent协作框架. 开源项目,欢迎贡献</p>
</div>
</div>
</footer>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/prism.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-bash.min.js"></script>
<script src="script.js"></script>
</body>
</html>

345
website/script.js Normal file
View File

@@ -0,0 +1,345 @@
// 全局变量
let agents = [
{ id: 'code-reviewer', name: 'Code Reviewer', status: 'active', commits: 12, tasks: 3 },
{ id: 'test-runner', name: 'Test Runner', status: 'active', commits: 8, tasks: 5 },
{ id: 'deploy-bot', name: 'Deploy Bot', status: 'inactive', commits: 3, tasks: 0 },
{ id: 'doc-writer', name: 'Doc Writer', status: 'active', commits: 15, tasks: 2 }
];
let activities = [
{ type: 'commit', message: 'Code Reviewer pushed 3 new commits', time: '2 minutes ago' },
{ type: 'test', message: 'Test Runner completed 5 test cases', time: '5 minutes ago' },
{ type: 'deploy', message: 'Deploy Bot deployed to staging', time: '10 minutes ago' },
{ type: 'docs', message: 'Doc Writer updated API documentation', time: '15 minutes ago' }
];
// 初始化
document.addEventListener('DOMContentLoaded', function() {
initializeDemo();
initializeTerminal();
initializeStats();
setupScrollEffects();
});
// 演示区域初始化
function initializeDemo() {
updateAgentGrid();
updateActivityFeed();
// 每3秒更新一次演示数据
setInterval(updateDemoData, 3000);
}
// 更新代理网格
function updateAgentGrid() {
const grid = document.getElementById('agent-grid');
if (!grid) return;
grid.innerHTML = '';
agents.forEach(agent => {
const card = createAgentCard(agent);
grid.appendChild(card);
});
}
// 创建代理卡片
function createAgentCard(agent) {
const card = document.createElement('div');
card.className = `agent-card agent-status-${agent.status}`;
const statusIcon = agent.status === 'active' ? '🟢' : '🔴';
card.innerHTML = `
<div>
<strong>${agent.name}</strong>
<div style="font-size: 0.9rem; color: #666;">
${statusIcon} ${agent.status}
</div>
</div>
<div style="text-align: right; font-size: 0.9rem;">
<div>📊 ${agent.commits} commits</div>
<div>📝 ${agent.tasks} tasks</div>
</div>
`;
return card;
}
// 更新活动流
function updateActivityFeed() {
const feed = document.getElementById('activity-feed');
if (!feed) return;
feed.innerHTML = '';
activities.forEach(activity => {
const item = createActivityItem(activity);
feed.appendChild(item);
});
}
// 创建活动项
function createActivityItem(activity) {
const item = document.createElement('div');
item.className = 'activity-item';
const icon = getActivityIcon(activity.type);
item.innerHTML = `
<div style="display: flex; align-items: center; gap: 0.5rem;">
<span>${icon}</span>
<span>${activity.message}</span>
</div>
<div style="font-size: 0.8rem; color: #666; margin-top: 0.5rem;">
${activity.time}
</div>
`;
return item;
}
// 获取活动图标
function getActivityIcon(type) {
const icons = {
'commit': '💻',
'test': '🧪',
'deploy': '🚀',
'docs': '📚'
};
return icons[type] || '📝';
}
// 更新演示数据
function updateDemoData() {
// 随机更新代理状态
agents.forEach(agent => {
if (Math.random() > 0.7) {
agent.status = agent.status === 'active' ? 'inactive' : 'active';
}
if (Math.random() > 0.5) {
agent.commits += Math.floor(Math.random() * 3);
}
});
// 添加新活动
const newActivity = generateRandomActivity();
activities.unshift(newActivity);
if (activities.length > 5) {
activities.pop();
}
updateAgentGrid();
updateActivityFeed();
updateStats();
}
// 生成随机活动
function generateRandomActivity() {
const types = ['commit', 'test', 'deploy', 'docs'];
const messages = {
'commit': ['Code Reviewer pushed new features', 'Test Runner fixed bugs', 'Deploy Bot merged PR'],
'test': ['Test Runner passed all tests', 'Code Reviewer added unit tests', 'Doc Writer tested examples'],
'deploy': ['Deploy Bot deployed to production', 'Code Reviewer released v2.0', 'Test Runner deployed hotfix'],
'docs': ['Doc Writer updated README', 'Code Reviewer improved comments', 'Deploy Bot added changelog']
};
const type = types[Math.floor(Math.random() * types.length)];
const message = messages[type][Math.floor(Math.random() * messages[type].length)];
return {
type: type,
message: message,
time: 'just now'
};
}
// 终端模拟
function initializeTerminal() {
const terminal = document.getElementById('terminal-content');
if (!terminal) return;
const commands = [
{ prompt: 'user@spore-colony:~$', command: 'spore init', output: '✓ Initializing Spore Colony...\n✓ Creating agent identities...\n✓ Setting up Git repositories...\n✓ Spore Colony initialized successfully!' },
{ prompt: 'user@spore-colony:~$', command: 'spore agent list', output: '🟢 code-reviewer (Active)\n🟢 test-runner (Active)\n🔴 deploy-bot (Inactive)\n🟢 doc-writer (Active)' },
{ prompt: 'user@spore-colony:~$', command: 'spore task create "Add new feature"', output: '✓ Task created and assigned to code-reviewer\n📊 Progress: 0% → 25% → 50% → 75% → 100%\n✅ Task completed successfully!' }
];
let currentCommand = 0;
function typeCommand() {
if (currentCommand >= commands.length) return;
const cmd = commands[currentCommand];
const line = document.createElement('div');
line.className = 'terminal-line';
line.innerHTML = `<span class="prompt">${cmd.prompt}</span> <span class="command">${cmd.command}</span>`;
terminal.appendChild(line);
setTimeout(() => {
const outputLine = document.createElement('div');
outputLine.className = 'terminal-line';
outputLine.innerHTML = `<span class="success">${cmd.output}</span>`;
terminal.appendChild(outputLine);
currentCommand++;
if (currentCommand < commands.length) {
setTimeout(typeCommand, 2000);
}
}, 1500);
}
typeCommand();
}
// 统计信息
function initializeStats() {
updateStats();
}
function updateStats() {
const totalCommits = agents.reduce((sum, agent) => sum + agent.commits, 0);
const activeAgents = agents.filter(agent => agent.status === 'active').length;
const totalTasks = agents.reduce((sum, agent) => sum + agent.tasks, 0);
animateCounter('total-commits', totalCommits);
animateCounter('active-agents', activeAgents);
animateCounter('total-tasks', totalTasks);
updateProgressBars();
}
// 数字动画
function animateCounter(elementId, targetValue) {
const element = document.getElementById(elementId);
if (!element) return;
const startValue = parseInt(element.textContent) || 0;
const duration = 1000;
const startTime = performance.now();
function updateCounter(currentTime) {
const elapsed = currentTime - startTime;
const progress = Math.min(elapsed / duration, 1);
const currentValue = Math.floor(startValue + (targetValue - startValue) * progress);
element.textContent = currentValue;
if (progress < 1) {
requestAnimationFrame(updateCounter);
}
}
requestAnimationFrame(updateCounter);
}
// 进度条更新
function updateProgressBars() {
const progressBars = document.querySelectorAll('.bar div');
progressBars.forEach(bar => {
const width = Math.floor(Math.random() * 30) + 70; // 70-100%
bar.style.width = width + '%';
});
}
// 滚动效果
function setupScrollEffects() {
const observerOptions = {
threshold: 0.1,
rootMargin: '0px 0px -50px 0px'
};
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.classList.add('animate-in');
}
});
}, observerOptions);
// 观察所有需要动画的元素
document.querySelectorAll('.feature-card, .demo-panel, .install-card, .doc-card').forEach(el => {
observer.observe(el);
});
}
// 平滑滚动到锚点
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
anchor.addEventListener('click', function (e) {
e.preventDefault();
const target = document.querySelector(this.getAttribute('href'));
if (target) {
target.scrollIntoView({
behavior: 'smooth',
block: 'start'
});
}
});
});
// 响应式菜单
function toggleMobileMenu() {
const navMenu = document.querySelector('.nav-menu');
navMenu.classList.toggle('active');
}
// 复制代码功能
function copyToClipboard(elementId) {
const element = document.getElementById(elementId);
if (!element) return;
const text = element.textContent;
navigator.clipboard.writeText(text).then(() => {
// 显示复制成功提示
const toast = document.createElement('div');
toast.textContent = 'Copied to clipboard!';
toast.style.cssText = `
position: fixed;
top: 20px;
right: 20px;
background: #27ca3f;
color: white;
padding: 1rem;
border-radius: 0.5rem;
z-index: 1000;
animation: slideIn 0.3s ease;
`;
document.body.appendChild(toast);
setTimeout(() => {
toast.remove();
}, 2000);
});
}
// 添加CSS动画
const style = document.createElement('style');
style.textContent = `
@keyframes slideIn {
from {
transform: translateX(100%);
opacity: 0;
}
to {
transform: translateX(0);
opacity: 1;
}
}
.animate-in {
animation: fadeInUp 0.6s ease forwards;
}
@media (max-width: 768px) {
.nav-menu.active {
display: flex;
flex-direction: column;
position: absolute;
top: 100%;
left: 0;
width: 100%;
background: white;
padding: 1rem;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
}
}
`;
document.head.appendChild(style);

659
website/styles.css Normal file
View File

@@ -0,0 +1,659 @@
/* Reset and Base Styles */
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
line-height: 1.6;
color: #333;
background: #fafafa;
}
.container {
max-width: 1200px;
margin: 0 auto;
padding: 0 20px;
}
/* Navigation */
.navbar {
position: fixed;
top: 0;
width: 100%;
background: rgba(255, 255, 255, 0.95);
backdrop-filter: blur(10px);
border-bottom: 1px solid #e0e0e0;
z-index: 1000;
transition: all 0.3s ease;
}
.nav-container {
display: flex;
justify-content: space-between;
align-items: center;
padding: 1rem 2rem;
}
.logo-text {
font-size: 1.5rem;
font-weight: 700;
color: #2563eb;
}
.nav-menu {
display: flex;
list-style: none;
gap: 2rem;
}
.nav-menu a {
text-decoration: none;
color: #333;
font-weight: 500;
transition: color 0.3s ease;
}
.nav-menu a:hover {
color: #2563eb;
}
.github-link {
background: #2563eb;
color: white !important;
padding: 0.5rem 1rem;
border-radius: 0.5rem;
transition: background 0.3s ease;
}
.github-link:hover {
background: #1d4ed8;
}
.hamburger {
display: none;
flex-direction: column;
cursor: pointer;
}
.hamburger span {
width: 25px;
height: 3px;
background: #333;
margin: 3px 0;
transition: 0.3s;
}
/* Hero Section */
.hero {
min-height: 100vh;
display: flex;
align-items: center;
padding: 6rem 0 4rem;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
}
.hero-container {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 4rem;
align-items: center;
}
.hero-title {
font-size: 3.5rem;
font-weight: 700;
line-height: 1.2;
margin-bottom: 1.5rem;
}
.gradient-text {
background: linear-gradient(45deg, #ff6b6b, #4ecdc4);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.hero-subtitle {
font-size: 1.25rem;
margin-bottom: 2rem;
opacity: 0.9;
line-height: 1.6;
}
.hero-buttons {
display: flex;
gap: 1rem;
margin-bottom: 3rem;
}
.btn {
padding: 1rem 2rem;
border: none;
border-radius: 0.5rem;
font-size: 1rem;
font-weight: 600;
cursor: pointer;
transition: all 0.3s ease;
text-decoration: none;
display: inline-block;
}
.btn-primary {
background: #ff6b6b;
color: white;
}
.btn-primary:hover {
background: #ff5252;
transform: translateY(-2px);
}
.btn-secondary {
background: transparent;
color: white;
border: 2px solid white;
}
.btn-secondary:hover {
background: white;
color: #667eea;
}
.hero-stats {
display: flex;
gap: 2rem;
}
.stat {
text-align: center;
}
.stat-number {
display: block;
font-size: 2rem;
font-weight: 700;
color: #ff6b6b;
}
.stat-label {
font-size: 0.9rem;
opacity: 0.8;
}
/* Terminal Window */
.terminal-window {
background: #1a1a1a;
border-radius: 1rem;
overflow: hidden;
box-shadow: 0 20px 40px rgba(0, 0, 0, 0.3);
}
.terminal-header {
background: #2d2d2d;
padding: 1rem;
display: flex;
align-items: center;
gap: 0.5rem;
}
.terminal-buttons {
display: flex;
gap: 0.5rem;
}
.terminal-buttons span {
width: 12px;
height: 12px;
border-radius: 50%;
}
.terminal-buttons span:nth-child(1) { background: #ff5f56; }
.terminal-buttons span:nth-child(2) { background: #ffbd2e; }
.terminal-buttons span:nth-child(3) { background: #27ca3f; }
.terminal-title {
flex: 1;
text-align: center;
color: #888;
font-size: 0.9rem;
}
.terminal-content {
padding: 1.5rem;
font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
font-size: 0.9rem;
line-height: 1.6;
}
.terminal-line {
margin-bottom: 0.5rem;
display: flex;
align-items: center;
gap: 0.5rem;
}
.prompt {
color: #27ca3f;
}
.command {
color: #fff;
}
.success {
color: #27ca3f;
}
/* Features Section */
.features {
padding: 6rem 0;
background: white;
}
.section-title {
text-align: center;
font-size: 2.5rem;
font-weight: 700;
margin-bottom: 3rem;
color: #333;
}
.features-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));
gap: 3rem;
}
.feature-card {
background: white;
border-radius: 1rem;
padding: 2.5rem;
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
transition: transform 0.3s ease;
}
.feature-card:hover {
transform: translateY(-5px);
}
.feature-icon {
font-size: 3rem;
margin-bottom: 1rem;
}
.feature-card h3 {
font-size: 1.5rem;
font-weight: 600;
margin-bottom: 1rem;
color: #333;
}
.feature-card p {
color: #666;
margin-bottom: 1.5rem;
line-height: 1.6;
}
.feature-card ul {
list-style: none;
}
.feature-card li {
padding: 0.25rem 0;
color: #555;
}
.feature-card li:before {
content: "✓";
color: #27ca3f;
font-weight: bold;
margin-right: 0.5rem;
}
.roles-list {
display: flex;
flex-direction: column;
gap: 0.5rem;
}
.role-item {
padding: 0.5rem;
background: #f8f9fa;
border-radius: 0.5rem;
font-size: 0.9rem;
}
/* Demo Section */
.demo {
padding: 6rem 0;
background: #f8f9fa;
}
.demo-container {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 3rem;
}
.demo-panel {
background: white;
border-radius: 1rem;
padding: 2rem;
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
}
.demo-panel h3 {
font-size: 1.5rem;
font-weight: 600;
margin-bottom: 1.5rem;
color: #333;
}
.agent-grid {
display: grid;
gap: 1rem;
}
.agent-card {
padding: 1rem;
background: #f8f9fa;
border-radius: 0.5rem;
display: flex;
justify-content: space-between;
align-items: center;
}
.agent-status-active {
border-left: 4px solid #27ca3f;
}
.agent-status-inactive {
border-left: 4px solid #ff5f56;
}
.activity-feed {
display: flex;
flex-direction: column;
gap: 1rem;
}
.activity-item {
padding: 1rem;
background: #f8f9fa;
border-radius: 0.5rem;
border-left: 4px solid #667eea;
}
.demo-actions {
text-align: center;
margin-top: 2rem;
display: flex;
gap: 1rem;
justify-content: center;
}
/* Quick Start Section */
.quick-start {
padding: 6rem 0;
background: white;
}
.install-options {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 2rem;
}
.install-card {
background: white;
border-radius: 1rem;
padding: 2rem;
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
border: 1px solid #e0e0e0;
}
.install-card h3 {
font-size: 1.5rem;
font-weight: 600;
margin-bottom: 1rem;
color: #333;
}
.code-block {
background: #1a1a1a;
border-radius: 0.5rem;
padding: 1rem;
overflow-x: auto;
}
.code-block pre {
margin: 0;
color: #fff;
font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
font-size: 0.9rem;
}
/* Documentation Section */
.documentation {
padding: 6rem 0;
background: #f8f9fa;
}
.docs-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 2rem;
}
.doc-card {
background: white;
border-radius: 1rem;
padding: 2rem;
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
transition: transform 0.3s ease;
}
.doc-card:hover {
transform: translateY(-5px);
}
.doc-card h3 {
font-size: 1.25rem;
font-weight: 600;
margin-bottom: 1rem;
color: #333;
}
.doc-card p {
color: #666;
margin-bottom: 1rem;
}
.doc-link {
color: #2563eb;
text-decoration: none;
font-weight: 600;
}
.doc-link:hover {
text-decoration: underline;
}
/* Footer */
.footer {
background: #1a1a1a;
color: white;
padding: 3rem 0 1rem;
}
.footer-content {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 2rem;
margin-bottom: 2rem;
}
.footer-section h4 {
font-size: 1.25rem;
font-weight: 600;
margin-bottom: 1rem;
}
.footer-section ul {
list-style: none;
}
.footer-section ul li {
margin-bottom: 0.5rem;
}
.footer-section a {
color: #ccc;
text-decoration: none;
transition: color 0.3s ease;
}
.footer-section a:hover {
color: white;
}
.footer-bottom {
text-align: center;
padding-top: 2rem;
border-top: 1px solid #333;
color: #888;
}
/* Responsive Design */
@media (max-width: 768px) {
.hamburger {
display: flex;
}
.nav-menu {
display: none;
}
.hero-container {
grid-template-columns: 1fr;
text-align: center;
}
.hero-title {
font-size: 2.5rem;
}
.hero-buttons {
justify-content: center;
flex-direction: column;
align-items: center;
}
.features-grid {
grid-template-columns: 1fr;
}
.demo-container {
grid-template-columns: 1fr;
}
.install-options {
grid-template-columns: 1fr;
}
.docs-grid {
grid-template-columns: 1fr;
}
}
@media (max-width: 480px) {
.hero-title {
font-size: 2rem;
}
.hero-stats {
flex-direction: column;
gap: 1rem;
}
.container {
padding: 0 1rem;
}
}
/* Animations */
@keyframes fadeInUp {
from {
opacity: 0;
transform: translateY(30px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.feature-card {
animation: fadeInUp 0.6s ease forwards;
}
.feature-card:nth-child(2) {
animation-delay: 0.1s;
}
.feature-card:nth-child(3) {
animation-delay: 0.2s;
}
/* Stats Animation */
.stats-preview {
margin-top: 1rem;
}
.stat-bar {
display: flex;
align-items: center;
gap: 1rem;
margin-bottom: 0.5rem;
}
.stat-bar span {
font-size: 0.9rem;
min-width: 80px;
}
.bar {
flex: 1;
height: 8px;
background: #e0e0e0;
border-radius: 4px;
overflow: hidden;
}
.bar div {
height: 100%;
background: linear-gradient(90deg, #667eea, #764ba2);
transition: width 1s ease;
}
/* Scrollbar Styling */
::-webkit-scrollbar {
width: 8px;
}
::-webkit-scrollbar-track {
background: #f1f1f1;
}
::-webkit-scrollbar-thumb {
background: #888;
border-radius: 4px;
}
::-webkit-scrollbar-thumb:hover {
background: #555;
}