Files
clawpanel/docs/index.html

760 lines
55 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="zh-CN" class="dark">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ClawPanel - OpenClaw AI Agent 可视化管理面板</title>
<meta name="description" content="ClawPanel 是基于 Tauri v2 的跨平台桌面应用,为 OpenClaw AI Agent 框架提供可视化管理面板。仪表盘监控、模型配置、实时聊天、记忆管理、内网穿透,一站式管理。">
<meta name="keywords" content="ClawPanel, OpenClaw, AI Agent, Tauri, 管理面板, 桌面应用, 开源, LLM, 多模型">
<meta property="og:title" content="ClawPanel - OpenClaw AI Agent 可视化管理面板">
<meta property="og:description" content="基于 Tauri v2 的跨平台桌面应用,为 OpenClaw AI Agent 框架提供可视化管理界面。">
<meta property="og:type" content="website">
<meta property="og:url" content="https://qingchencloud.github.io/clawpanel/">
<link rel="icon" href="./logo.png" type="image/png">
<style>
/* ══════════════ Theme Variables ══════════════ */
:root {
--bg: #ffffff; --bg-s: #f9fafb; --bg-card: rgba(255,255,255,0.8); --bg-card-s: rgba(255,255,255,0.6);
--text: #111827; --text-s: #6b7280; --text-t: #9ca3af;
--border: rgba(0,0,0,0.08); --border-h: rgba(99,102,241,0.3);
--accent: #6366f1; --accent-h: #4f46e5; --accent-10: rgba(99,102,241,0.1); --accent-5: rgba(99,102,241,0.05);
--nav-bg: rgba(255,255,255,0.82); --card-shadow: 0 4px 24px -6px rgba(0,0,0,0.07);
}
html.dark {
--bg: #0a0a0f; --bg-s: #111118; --bg-card: rgba(255,255,255,0.025); --bg-card-s: rgba(255,255,255,0.03);
--text: #f3f4f6; --text-s: #9ca3af; --text-t: #6b7280;
--border: rgba(255,255,255,0.06); --border-h: rgba(129,140,248,0.4);
--accent: #818cf8; --accent-h: #6366f1; --accent-10: rgba(129,140,248,0.1); --accent-5: rgba(129,140,248,0.05);
--nav-bg: rgba(10,10,15,0.82); --card-shadow: 0 4px 24px -6px rgba(0,0,0,0.3);
}
/* ══════════════ Reset & Base ══════════════ */
*, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; }
html { scroll-behavior: smooth; }
body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, Roboto, sans-serif; background: var(--bg); color: var(--text); -webkit-font-smoothing: antialiased; overflow-x: hidden; line-height: 1.6; transition: background 0.3s, color 0.3s; }
a { color: inherit; text-decoration: none; } img { max-width: 100%; height: auto; display: block; }
button { font: inherit; cursor: pointer; border: none; background: none; } ul { list-style: none; }
.mono { font-family: 'SF Mono', 'Fira Code', Consolas, monospace; }
/* ══════════════ Layout ══════════════ */
.container { max-width: 1200px; margin: 0 auto; padding: 0 20px; }
.container-sm { max-width: 900px; margin: 0 auto; padding: 0 20px; }
.section { position: relative; padding: 96px 0; overflow: hidden; }
.section-header { text-align: center; margin-bottom: 64px; }
.section-title { font-size: 2rem; font-weight: 900; letter-spacing: -0.03em; margin-bottom: 12px; }
.section-desc { color: var(--text-s); max-width: 480px; margin: 0 auto; }
/* ══════════════ Nav ══════════════ */
.nav { position: fixed; top: 0; left: 0; right: 0; z-index: 50; background: var(--nav-bg); backdrop-filter: blur(24px); -webkit-backdrop-filter: blur(24px); border-bottom: 1px solid var(--border); }
.nav-inner { max-width: 1200px; margin: 0 auto; padding: 0 20px; height: 64px; display: flex; align-items: center; justify-content: space-between; }
.nav-logo { display: flex; align-items: center; gap: 10px; font-weight: 700; font-size: 18px; letter-spacing: -0.02em; }
.nav-logo img { width: 32px; height: 32px; border-radius: 8px; }
.nav-links { display: flex; align-items: center; gap: 28px; font-size: 14px; font-weight: 500; }
.nav-link { color: var(--text-s); transition: color 0.2s; } .nav-link:hover { color: var(--text); }
.nav-actions { display: none; align-items: center; gap: 4px; }
.theme-btn { padding: 8px; border-radius: 8px; color: var(--text-s); transition: background 0.2s; }
.theme-btn:hover { background: var(--accent-5); }
.theme-btn svg { width: 16px; height: 16px; display: block; }
html.dark .sun { display: block; } html.dark .moon { display: none; }
html:not(.dark) .sun { display: none; } html:not(.dark) .moon { display: block; }
.hamburger { padding: 8px; border-radius: 8px; color: var(--text-s); } .hamburger svg { width: 20px; height: 20px; display: block; }
.mobile-menu { display: block; position: absolute; top: 64px; left: 0; right: 0; background: var(--nav-bg); backdrop-filter: blur(24px); border-bottom: 1px solid var(--border); transform: translateY(-110%); opacity: 0; transition: transform 0.35s cubic-bezier(0.16,1,0.3,1), opacity 0.25s; pointer-events: none; }
.mobile-menu.open { transform: translateY(0); opacity: 1; pointer-events: auto; }
.mobile-menu-inner { padding: 16px 20px; display: flex; flex-direction: column; gap: 4px; }
.mobile-menu-link { padding: 10px 0; color: var(--text-s); font-size: 16px; font-weight: 500; display: block; }
/* ══════════════ Buttons ══════════════ */
.btn { display: inline-flex; align-items: center; justify-content: center; gap: 10px; padding: 14px 32px; border-radius: 12px; font-weight: 600; font-size: 15px; transition: all 0.25s; }
.btn-primary { background: var(--accent); color: #fff; position: relative; z-index: 0; }
.btn-primary:hover { background: var(--accent-h); transform: translateY(-2px); box-shadow: 0 8px 30px rgba(99,102,241,0.35); }
.btn-primary::before { content:''; position: absolute; inset: -2px; border-radius: inherit; background: conic-gradient(from var(--angle,0deg), #6366f1, #a855f7, #22d3ee, #6366f1); z-index: -2; animation: spin 3s linear infinite; }
.btn-primary::after { content:''; position: absolute; inset: 0; border-radius: inherit; background: var(--accent); z-index: -1; }
@property --angle { syntax: "<angle>"; initial-value: 0deg; inherits: false; }
@keyframes spin { to { --angle: 360deg; } }
.btn-outline { border: 1px solid var(--border); background: var(--bg-card); color: var(--text); }
.btn-outline:hover { border-color: var(--border-h); background: var(--bg-s); }
.btn svg { width: 18px; height: 18px; }
.btn-sm { padding: 10px 20px; font-size: 13px; border-radius: 10px; }
/* ══════════════ Gradient Text ══════════════ */
.gradient-text { background: linear-gradient(135deg, #6366f1, #a855f7, #22d3ee, #6366f1); background-size: 300% 300%; -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent; animation: gradShift 6s ease-in-out infinite; }
@keyframes gradShift { 0%,100% { background-position: 0% 50%; } 50% { background-position: 100% 50%; } }
/* ══════════════ Background Effects ══════════════ */
.grid-bg { position: absolute; inset: 0; background-image: linear-gradient(rgba(99,102,241,0.04) 1px, transparent 1px), linear-gradient(90deg, rgba(99,102,241,0.04) 1px, transparent 1px); background-size: 64px 64px; mask-image: linear-gradient(to bottom, transparent, black 20%, black 80%, transparent); -webkit-mask-image: linear-gradient(to bottom, transparent, black 20%, black 80%, transparent); }
html.dark .grid-bg { background-image: linear-gradient(rgba(99,102,241,0.06) 1px, transparent 1px), linear-gradient(90deg, rgba(99,102,241,0.06) 1px, transparent 1px); }
.orb { position: absolute; border-radius: 50%; filter: blur(100px); pointer-events: none; will-change: transform; }
.orb-1 { width: 600px; height: 600px; background: rgba(99,102,241,0.12); top: -200px; left: -100px; animation: oF1 20s ease-in-out infinite; }
.orb-2 { width: 500px; height: 500px; background: rgba(168,85,247,0.08); top: -100px; right: -150px; animation: oF2 25s ease-in-out infinite; }
.orb-3 { width: 400px; height: 400px; background: rgba(34,211,238,0.06); bottom: -100px; left: 30%; animation: oF3 18s ease-in-out infinite; }
@keyframes oF1 { 0%,100% { transform: translate(0,0); } 50% { transform: translate(40px,30px); } }
@keyframes oF2 { 0%,100% { transform: translate(0,0); } 50% { transform: translate(-30px,40px); } }
@keyframes oF3 { 0%,100% { transform: translate(0,0); } 50% { transform: translate(20px,-25px); } }
html:not(.dark) .orb-1 { background: rgba(99,102,241,0.06); }
html:not(.dark) .orb-2 { background: rgba(168,85,247,0.04); }
html:not(.dark) .orb-3 { background: rgba(34,211,238,0.03); }
/* ══════════════ Particles ══════════════ */
.particles { position: absolute; inset: 0; overflow: hidden; pointer-events: none; }
.particle { position: absolute; width: 2px; height: 2px; background: var(--accent); border-radius: 50%; opacity: 0; animation: pRise linear infinite; }
@keyframes pRise { 0% { opacity:0; transform: translateY(100vh) scale(0); } 10% { opacity:0.5; } 90% { opacity:0.15; } 100% { opacity:0; transform: translateY(-20vh) scale(1); } }
/* ══════════════ Hero ══════════════ */
.hero { min-height: 100vh; display: flex; align-items: center; justify-content: center; padding-top: 64px; position: relative; overflow: hidden; }
.hero-inner { position: relative; z-index: 10; max-width: 1200px; margin: 0 auto; padding: 48px 20px 96px; text-align: center; }
.hero-badge { display: inline-flex; align-items: center; gap: 8px; padding: 6px 16px; border-radius: 99px; border: 1px solid rgba(99,102,241,0.2); background: var(--accent-5); font-size: 14px; color: var(--accent); margin-bottom: 32px; }
.hero-badge .pulse { width: 6px; height: 6px; border-radius: 50%; background: #22c55e; animation: pulse 2s ease-in-out infinite; }
@keyframes pulse { 0%,100% { opacity:1; } 50% { opacity:0.3; } }
.hero-title { font-size: 3.75rem; font-weight: 900; letter-spacing: -0.04em; line-height: 1.08; margin-bottom: 24px; }
.hero-subtitle { font-size: 1.1rem; color: var(--text-s); max-width: 600px; margin: 0 auto 40px; line-height: 1.7; }
.hero-cta { display: flex; flex-wrap: wrap; gap: 16px; justify-content: center; }
.hero-image-wrap { perspective: 1200px; max-width: 1100px; margin: 64px auto 0; padding: 0 16px; position: relative; }
.hero-image-wrap img { transform: rotateX(4deg) scale(0.98); border-radius: 16px; box-shadow: 0 20px 60px -15px rgba(99,102,241,0.25), 0 0 0 1px rgba(99,102,241,0.08); transition: transform 0.6s cubic-bezier(0.16,1,0.3,1), box-shadow 0.6s; cursor: zoom-in; width: 100%; }
.hero-image-wrap:hover img { transform: rotateX(0deg) scale(1); box-shadow: 0 30px 80px -15px rgba(99,102,241,0.35), 0 0 0 1px rgba(99,102,241,0.15); }
.hero-glow { position: absolute; bottom: -60px; left: 50%; transform: translateX(-50%); width: 80%; height: 120px; background: radial-gradient(ellipse, rgba(99,102,241,0.15), transparent 70%); filter: blur(40px); pointer-events: none; }
html:not(.dark) .hero-glow { background: radial-gradient(ellipse, rgba(99,102,241,0.08), transparent 70%); }
/* ══════════════ Stats ══════════════ */
.stats-grid { display: grid; grid-template-columns: repeat(4,1fr); gap: 16px; }
.stat-card { border-radius: 16px; border: 1px solid var(--border); background: var(--bg-card-s); backdrop-filter: blur(8px); padding: 24px; text-align: center; }
.stat-value { font-size: 2rem; font-weight: 900; letter-spacing: -0.02em; }
.stat-label { font-size: 14px; color: var(--text-s); margin-top: 8px; }
.c-indigo { color: #6366f1; } .c-purple { color: #a855f7; } .c-cyan { color: #22d3ee; } .c-emerald { color: #10b981; }
.c-green { color: #22c55e; } .c-orange { color: #f97316; }
@keyframes float { 0%,100% { transform: translateY(0); } 50% { transform: translateY(-8px); } }
.float-a { animation: float 6s ease-in-out infinite; } .float-b { animation: float 6s ease-in-out 2s infinite; }
/* ══════════════ Showcase ══════════════ */
.showcase-row { display: grid; grid-template-columns: 1fr 1fr; gap: 48px; align-items: center; margin-bottom: 112px; }
.showcase-row:last-child { margin-bottom: 0; }
.showcase-tag { display: inline-flex; align-items: center; gap: 6px; padding: 4px 14px; border-radius: 99px; font-size: 12px; font-weight: 600; letter-spacing: 0.5px; margin-bottom: 16px; }
.showcase-title { font-size: 1.75rem; font-weight: 900; letter-spacing: -0.03em; margin-bottom: 16px; }
.showcase-desc { color: var(--text-s); line-height: 1.7; margin-bottom: 16px; }
.showcase-list { display: flex; flex-direction: column; gap: 8px; }
.showcase-list li { display: flex; align-items: center; gap: 8px; font-size: 14px; color: var(--text-s); }
.check { color: #22c55e; flex-shrink: 0; font-weight: 700; }
.screenshot-frame { border-radius: 12px; overflow: hidden; border: 1px solid var(--border); box-shadow: var(--card-shadow); transition: transform 0.5s cubic-bezier(0.16,1,0.3,1), box-shadow 0.5s; cursor: zoom-in; }
.screenshot-frame:hover { transform: translateY(-6px); box-shadow: 0 20px 60px -10px rgba(99,102,241,0.2); }
.screenshot-frame img { width: 100%; display: block; }
/* ══════════════ Gallery ══════════════ */
.gallery-grid { display: grid; grid-template-columns: repeat(4,1fr); gap: 16px; margin-bottom: 24px; }
.gallery-card { border-radius: 12px; overflow: hidden; border: 1px solid var(--border); box-shadow: var(--card-shadow); transition: transform 0.4s cubic-bezier(0.16,1,0.3,1), box-shadow 0.4s, border-color 0.4s; cursor: zoom-in; position: relative; }
.gallery-card:hover { transform: translateY(-4px) scale(1.02); box-shadow: 0 12px 40px -8px rgba(99,102,241,0.2); border-color: var(--border-h); }
.gallery-card img { width: 100%; display: block; }
.gallery-label { position: absolute; bottom: 0; left: 0; right: 0; padding: 8px 12px; background: linear-gradient(transparent, rgba(0,0,0,0.65)); color: #fff; font-size: 13px; font-weight: 600; opacity: 0; transition: opacity 0.3s; }
.gallery-card:hover .gallery-label { opacity: 1; }
.info-grid { display: grid; grid-template-columns: repeat(4,1fr); gap: 16px; }
.info-card { border-radius: 16px; border: 1px solid var(--border); background: var(--bg-card); backdrop-filter: blur(8px); padding: 20px; }
.info-card .ic { font-size: 18px; margin-bottom: 8px; }
.info-card h4 { font-size: 14px; font-weight: 700; margin-bottom: 4px; }
.info-card p { font-size: 12px; color: var(--text-s); line-height: 1.5; }
/* ══════════════ Tech ══════════════ */
.tech-grid { display: grid; grid-template-columns: repeat(2,1fr); gap: 16px; }
.tech-card { border-radius: 16px; border: 1px solid var(--border); background: var(--bg-card); backdrop-filter: blur(8px); padding: 24px; transition: transform 0.3s, box-shadow 0.3s; position: relative; overflow: hidden; }
.tech-card:hover { transform: translateY(-2px); box-shadow: 0 12px 40px -10px rgba(99,102,241,0.12); }
.tech-card::before { content:''; position: absolute; inset: 0; background: radial-gradient(300px circle at var(--mx,50%) var(--my,50%), rgba(99,102,241,0.06), transparent 60%); opacity: 0; transition: opacity 0.4s; pointer-events: none; }
.tech-card:hover::before { opacity: 1; }
.tech-header { display: flex; align-items: center; gap: 12px; margin-bottom: 12px; }
.tech-icon { width: 40px; height: 40px; border-radius: 12px; display: flex; align-items: center; justify-content: center; font-size: 18px; }
.tech-name { font-size: 14px; font-weight: 700; }
.tech-sub { font-size: 12px; color: var(--text-s); }
.tech-desc { font-size: 14px; color: var(--text-s); }
/* ══════════════ Marquee ══════════════ */
.marquee-wrap { overflow: hidden; border-top: 1px solid var(--border); border-bottom: 1px solid var(--border); padding: 16px 0; }
.marquee-track { display: flex; width: max-content; animation: mScroll 30s linear infinite; }
.marquee-track:hover { animation-play-state: paused; }
.marquee-item { padding: 0 28px; font-size: 14px; color: var(--text-t); white-space: nowrap; }
.marquee-dot { color: var(--accent); }
@keyframes mScroll { 0% { transform: translateX(0); } 100% { transform: translateX(-50%); } }
/* ══════════════ Terminal ══════════════ */
.terminal { border-radius: 16px; border: 1px solid var(--border); background: var(--bg-card); backdrop-filter: blur(8px); overflow: hidden; }
.terminal-bar { display: flex; align-items: center; gap: 8px; padding: 14px 20px; border-bottom: 1px solid var(--border); }
.td { width: 12px; height: 12px; border-radius: 50%; } .td-r { background: rgba(239,68,68,0.8); } .td-y { background: rgba(234,179,8,0.8); } .td-g { background: rgba(34,197,94,0.8); }
.terminal-title { margin-left: 12px; font-size: 12px; color: var(--text-t); }
.terminal-body { padding: 20px; font-size: 14px; line-height: 2.2; overflow-x: auto; }
.t-comment { color: var(--text-t); }
.t-cmd { color: var(--text-s); } .t-cmd::before { content: '$ '; color: var(--accent); }
/* ══════════════ Ecosystem ══════════════ */
.eco-list { display: flex; flex-direction: column; gap: 16px; }
.eco-card { display: flex; align-items: center; justify-content: space-between; border-radius: 16px; border: 1px solid var(--border); background: var(--bg-card); backdrop-filter: blur(8px); padding: 24px; transition: all 0.3s; }
.eco-card:hover { transform: translateY(-2px); border-color: var(--border-h); }
.eco-card h3 { font-size: 16px; font-weight: 700; margin-bottom: 4px; transition: color 0.2s; }
.eco-card:hover h3 { color: var(--accent); }
.eco-card p { font-size: 14px; color: var(--text-s); }
.eco-arrow { color: var(--text-t); transition: all 0.3s; font-size: 18px; }
.eco-card:hover .eco-arrow { color: var(--accent); transform: translateX(4px); }
/* ══════════════ Community ══════════════ */
.community-grid { display: grid; grid-template-columns: repeat(2,1fr); gap: 20px; margin-bottom: 32px; }
.community-card { border-radius: 20px; border: 1px solid var(--border); background: var(--bg-card); backdrop-filter: blur(8px); padding: 40px 32px; text-align: center; transition: all 0.35s cubic-bezier(0.16,1,0.3,1); }
.community-card:hover { transform: translateY(-6px); border-color: var(--border-h); box-shadow: 0 16px 48px -12px rgba(99,102,241,0.18); }
.community-emoji { font-size: 48px; margin-bottom: 16px; display: block; }
.community-qr { width: 160px; height: 160px; border-radius: 12px; margin: 0 auto 16px; border: 1px solid var(--border); }
.community-card h3 { font-size: 20px; font-weight: 800; margin-bottom: 8px; }
.community-card .desc { font-size: 14px; color: var(--text-s); margin-bottom: 20px; }
.community-extra { display: flex; flex-wrap: wrap; gap: 12px; justify-content: center; }
.community-link { display: inline-flex; align-items: center; gap: 8px; padding: 10px 20px; border-radius: 12px; font-size: 14px; font-weight: 600; border: 1px solid var(--border); background: var(--bg-card); color: var(--text); transition: all 0.25s; }
.community-link:hover { border-color: var(--border-h); color: var(--accent); background: var(--accent-5); transform: translateY(-2px); }
.community-link svg { width: 18px; height: 18px; }
/* ══════════════ CTA ══════════════ */
.cta-section { text-align: center; }
.cta-buttons { display: flex; flex-wrap: wrap; gap: 16px; justify-content: center; }
/* ══════════════ Footer ══════════════ */
.footer { border-top: 1px solid var(--border); padding: 40px 0; }
.footer-inner { max-width: 1200px; margin: 0 auto; padding: 0 20px; display: flex; align-items: center; justify-content: space-between; font-size: 14px; color: var(--text-t); }
.footer-logo { display: flex; align-items: center; gap: 8px; }
.footer-logo img { width: 20px; height: 20px; border-radius: 4px; opacity: 0.5; }
.footer-links { display: flex; gap: 24px; }
.footer-link { color: var(--text-t); transition: color 0.2s; } .footer-link:hover { color: var(--text-s); }
/* ══════════════ Lightbox ══════════════ */
.lightbox { position: fixed; inset: 0; z-index: 200; background: rgba(0,0,0,0.92); backdrop-filter: blur(8px); display: none; align-items: center; justify-content: center; cursor: zoom-out; padding: 24px; }
.lightbox.active { display: flex; }
.lightbox img { max-width: 100%; max-height: 100%; border-radius: 12px; box-shadow: 0 0 80px rgba(99,102,241,0.2); animation: lbIn 0.3s ease-out; }
@keyframes lbIn { from { opacity:0; transform: scale(0.95); } to { opacity:1; transform: scale(1); } }
.lb-close { position: absolute; top: 20px; right: 24px; width: 44px; height: 44px; border-radius: 50%; background: rgba(255,255,255,0.1); color: #fff; font-size: 22px; display: flex; align-items: center; justify-content: center; transition: background 0.2s; }
.lb-close:hover { background: rgba(255,255,255,0.2); }
/* ══════════════ Scroll Reveal ══════════════ */
.reveal { opacity: 0; transform: translateY(30px); transition: opacity 0.7s cubic-bezier(0.16,1,0.3,1), transform 0.7s cubic-bezier(0.16,1,0.3,1); }
.reveal.revealed { opacity: 1; transform: translateY(0); }
/* ══════════════ Responsive ══════════════ */
@media (max-width: 1024px) {
.showcase-row { grid-template-columns: 1fr; gap: 32px; }
.showcase-row .img-first { order: -1; }
.gallery-grid, .info-grid { grid-template-columns: repeat(2,1fr); }
.stats-grid { grid-template-columns: repeat(2,1fr); }
.tech-grid { grid-template-columns: 1fr; }
.nav-links { display: none; }
.nav-actions { display: flex; }
.mobile-menu { display: block; }
}
@media (max-width: 768px) {
.hero-title { font-size: 2.5rem; }
.section-title { font-size: 1.75rem; }
.showcase-title { font-size: 1.5rem; }
.community-grid { grid-template-columns: 1fr; }
.hero-cta { flex-direction: column; align-items: center; }
.btn { width: 100%; max-width: 320px; justify-content: center; }
.footer-inner { flex-direction: column; gap: 16px; text-align: center; }
.footer-links { flex-wrap: wrap; justify-content: center; }
}
@media (max-width: 640px) {
.hero-title { font-size: 2rem; }
.section { padding: 64px 0; }
.gallery-grid { grid-template-columns: 1fr 1fr; }
.info-grid { grid-template-columns: 1fr 1fr; }
.stats-grid { grid-template-columns: 1fr 1fr; }
.stat-value { font-size: 1.5rem; }
}
</style>
<script>
(function(){
var s = localStorage.getItem('clawpanel-theme');
if (s === 'light') document.documentElement.classList.remove('dark');
else if (s === 'dark') document.documentElement.classList.add('dark');
else if (!window.matchMedia('(prefers-color-scheme: dark)').matches) document.documentElement.classList.remove('dark');
})()
</script>
</head>
<body>
<!-- ══════════════ Nav ══════════════ -->
<nav class="nav">
<div class="nav-inner">
<a href="#" class="nav-logo"><img src="./logo.png" alt="Logo">ClawPanel</a>
<div class="nav-links">
<a href="#features" class="nav-link">功能预览</a>
<a href="#tech" class="nav-link">架构</a>
<a href="#quickstart" class="nav-link">开始</a>
<a href="#community" class="nav-link">社区</a>
<a href="https://github.com/qingchencloud/clawpanel" target="_blank" rel="noopener" class="nav-link">GitHub</a>
<button id="theme-toggle" class="theme-btn" aria-label="切换主题">
<svg class="sun" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="5"/><path d="M12 1v2M12 21v2M4.22 4.22l1.42 1.42M18.36 18.36l1.42 1.42M1 12h2M21 12h2M4.22 19.78l1.42-1.42M18.36 5.64l1.42-1.42"/></svg>
<svg class="moon" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path d="M21 12.79A9 9 0 1111.21 3 7 7 0 0021 12.79z"/></svg>
</button>
</div>
<div class="nav-actions">
<button id="theme-toggle-mobile" class="theme-btn" aria-label="切换主题">
<svg class="sun" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="5"/><path d="M12 1v2M12 21v2M4.22 4.22l1.42 1.42M18.36 18.36l1.42 1.42M1 12h2M21 12h2M4.22 19.78l1.42-1.42M18.36 5.64l1.42-1.42"/></svg>
<svg class="moon" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path d="M21 12.79A9 9 0 1111.21 3 7 7 0 0021 12.79z"/></svg>
</button>
<button id="hamburger" class="hamburger" aria-label="菜单">
<svg fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path d="M4 6h16M4 12h16M4 18h16"/></svg>
</button>
</div>
</div>
<div id="mobile-menu" class="mobile-menu">
<div class="mobile-menu-inner">
<a href="#features" class="mobile-menu-link mobile-link">功能预览</a>
<a href="#tech" class="mobile-menu-link mobile-link">架构</a>
<a href="#quickstart" class="mobile-menu-link mobile-link">开始</a>
<a href="#community" class="mobile-menu-link mobile-link">社区</a>
<a href="https://github.com/qingchencloud/clawpanel" target="_blank" rel="noopener" class="mobile-menu-link">GitHub ↗</a>
</div>
</div>
</nav>
<!-- ══════════════ Hero ══════════════ -->
<section class="hero">
<div class="grid-bg"></div>
<div class="orb orb-1"></div>
<div class="orb orb-2"></div>
<div class="particles" id="particles"></div>
<div class="hero-inner">
<div class="reveal hero-badge"><span class="pulse"></span> v0.2.1 已发布 — 支持聊天图片 &amp; 灯箱查看</div>
<h1 class="reveal hero-title">管理你的 <span class="gradient-text">AI Agent</span><br>从未如此直观</h1>
<p class="reveal hero-subtitle">ClawPanel 是 <strong>OpenClaw</strong> 的可视化管理面板,基于 Tauri v2 构建。<br>仪表盘、模型配置、实时聊天、记忆管理 — 一站式掌控。</p>
<div class="reveal hero-cta">
<a href="https://github.com/qingchencloud/clawpanel/releases/latest" target="_blank" rel="noopener" class="btn btn-primary">
<svg fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path d="M12 15V3m0 12l-4-4m4 4l4-4M2 17l.621 2.485A2 2 0 004.561 21h14.878a2 2 0 001.94-1.515L22 17"/></svg>
下载最新版
</a>
<a href="https://github.com/qingchencloud/clawpanel" target="_blank" rel="noopener" class="btn btn-outline">
<svg viewBox="0 0 24 24" fill="currentColor"><path d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0024 12c0-6.63-5.37-12-12-12z"/></svg>
源代码
</a>
</div>
<div class="reveal hero-image-wrap" data-delay="300">
<img src="./01.png" alt="ClawPanel 仪表盘" onclick="openLightbox(this.src)" loading="eager">
<div class="hero-glow"></div>
</div>
</div>
</section>
<!-- ══════════════ Stats ══════════════ -->
<section class="section" style="padding-top:48px;padding-bottom:48px">
<div class="grid-bg"></div>
<div class="container" style="position:relative;z-index:10">
<div class="stats-grid">
<div class="reveal stat-card float-a"><div class="stat-value c-indigo counter" data-target="10">0</div><div class="stat-label">功能模块</div></div>
<div class="reveal stat-card float-b"><div class="stat-value c-purple">Tauri v2</div><div class="stat-label">桌面框架</div></div>
<div class="reveal stat-card float-a"><div class="stat-value c-cyan">Vanilla JS</div><div class="stat-label">前端框架</div></div>
<div class="reveal stat-card float-b"><div class="stat-value c-emerald counter" data-target="100" data-suffix="%">0</div><div class="stat-label">开源免费</div></div>
</div>
</div>
</section>
<!-- ══════════════ Features Showcase ══════════════ -->
<section id="features" class="section">
<div class="orb orb-3"></div>
<div class="container" style="position:relative;z-index:10">
<div class="section-header">
<h2 class="reveal section-title">强大的 <span class="gradient-text">功能矩阵</span></h2>
<p class="reveal section-desc">一个面板,管理 OpenClaw 的方方面面</p>
</div>
<!-- 实时聊天 -->
<div class="showcase-row">
<div class="reveal screenshot-frame img-first" onclick="openLightbox('./02.png')"><img src="./02.png" alt="实时聊天" loading="lazy"></div>
<div>
<div class="reveal showcase-tag c-indigo" style="background:var(--accent-10)">💬 核心功能</div>
<h3 class="reveal showcase-title">实时 AI 对话</h3>
<p class="reveal showcase-desc">WebSocket 直连 Gateway流式响应实时显示。支持图片附件、多模态交互、Markdown 渲染、会话管理与快捷指令。</p>
<ul class="reveal showcase-list">
<li><span class="check"></span> 流式传输,逐字显示</li>
<li><span class="check"></span> 多会话管理与历史记录</li>
<li><span class="check"></span> 图片拖拽上传 &amp; 灯箱预览</li>
<li><span class="check"></span> / 快捷指令系统</li>
</ul>
</div>
</div>
<!-- 模型配置 -->
<div class="showcase-row">
<div>
<div class="reveal showcase-tag" style="color:#a855f7;background:rgba(168,85,247,0.1)">🧠 配置中心</div>
<h3 class="reveal showcase-title">多模型灵活调配</h3>
<p class="reveal showcase-desc">支持 OpenAI、DeepSeek、Kimi 等多家服务商。可视化管理模型列表,一键设为主模型,自动备选切换。</p>
<ul class="reveal showcase-list">
<li><span class="check"></span> 多 Provider 统一管理</li>
<li><span class="check"></span> 批量连通性测试</li>
<li><span class="check"></span> 主模型 + 备选自动切换</li>
<li><span class="check"></span> 拖拽排序 &amp; 实时保存</li>
</ul>
</div>
<div class="reveal screenshot-frame" onclick="openLightbox('./05.png')"><img src="./05.png" alt="模型配置" loading="lazy"></div>
</div>
<!-- 记忆文件 -->
<div class="showcase-row">
<div class="reveal screenshot-frame img-first" onclick="openLightbox('./08.png')"><img src="./08.png" alt="记忆文件" loading="lazy"></div>
<div>
<div class="reveal showcase-tag" style="color:#22d3ee;background:rgba(34,211,238,0.1)">🗂️ 数据管理</div>
<h3 class="reveal showcase-title">让 Agent 拥有记忆</h3>
<p class="reveal showcase-desc">在线编辑 Agent 核心配置文件AGENTS.md、SOUL.md 等),管理工作记忆和记忆归档。支持 ZIP 一键打包导出。</p>
<ul class="reveal showcase-list">
<li><span class="check"></span> 核心文件在线编辑</li>
<li><span class="check"></span> 工作记忆 &amp; 记忆归档</li>
<li><span class="check"></span> 多 Agent 记忆隔离</li>
<li><span class="check"></span> ZIP 打包下载</li>
</ul>
</div>
</div>
<!-- Gateway -->
<div class="showcase-row">
<div>
<div class="reveal showcase-tag" style="color:#10b981;background:rgba(16,185,129,0.1)">🌐 网关管控</div>
<h3 class="reveal showcase-title">安全访问,可视化配置</h3>
<p class="reveal showcase-desc">Gateway 端口、绑定范围、运行模式、Token / 密码认证方式,卡片式选项直观配置,即改即生效。</p>
<ul class="reveal showcase-list">
<li><span class="check"></span> 本地 / 局域网模式切换</li>
<li><span class="check"></span> Token &amp; 密码双认证模式</li>
<li><span class="check"></span> Tailscale Funnel 支持</li>
<li><span class="check"></span> 高级选项按需展开</li>
</ul>
</div>
<div class="reveal screenshot-frame" onclick="openLightbox('./07.png')"><img src="./07.png" alt="Gateway 配置" loading="lazy"></div>
</div>
<!-- Agent 管理 -->
<div class="showcase-row">
<div class="reveal screenshot-frame img-first" onclick="openLightbox('./06.png')"><img src="./06.png" alt="Agent 管理" loading="lazy"></div>
<div>
<div class="reveal showcase-tag" style="color:#f97316;background:rgba(249,115,22,0.1)">🤖 智能体</div>
<h3 class="reveal showcase-title">多 Agent 协作管理</h3>
<p class="reveal showcase-desc">创建和管理多个 AI Agent配置各自的身份、模型和独立工作区。支持备份、编辑与一键切换。</p>
<ul class="reveal showcase-list">
<li><span class="check"></span> 多 Agent 独立工作区</li>
<li><span class="check"></span> 身份与模型单独配置</li>
<li><span class="check"></span> Agent 配置备份</li>
<li><span class="check"></span> 默认 Agent 快速切换</li>
</ul>
</div>
</div>
</div>
</section>
<!-- ══════════════ More Features ══════════════ -->
<section class="section">
<div class="grid-bg"></div>
<div class="container" style="position:relative;z-index:10">
<div class="section-header">
<h2 class="reveal section-title">还有 <span class="gradient-text">更多</span></h2>
<p class="reveal section-desc">运维、监控、诊断,面面俱到</p>
</div>
<div class="gallery-grid">
<div class="reveal gallery-card" onclick="openLightbox('./03.png')"><img src="./03.png" alt="服务管理" loading="lazy"><div class="gallery-label">⚙️ 服务管理</div></div>
<div class="reveal gallery-card" onclick="openLightbox('./04.png')"><img src="./04.png" alt="日志查看" loading="lazy"><div class="gallery-label">📋 日志查看</div></div>
<div class="reveal gallery-card" onclick="openLightbox('./09.png')"><img src="./09.png" alt="扩展工具" loading="lazy"><div class="gallery-label">🔌 扩展工具</div></div>
<div class="reveal gallery-card" onclick="openLightbox('./10.png')"><img src="./10.png" alt="系统诊断" loading="lazy"><div class="gallery-label">🔍 系统诊断</div></div>
</div>
<div class="info-grid">
<div class="reveal info-card"><div class="ic">⚙️</div><h4>服务管理</h4><p>启停控制、版本检测、一键升级、配置备份与恢复</p></div>
<div class="reveal info-card"><div class="ic">📋</div><h4>日志查看</h4><p>多日志源实时查看、关键字搜索、自动滚动跟踪</p></div>
<div class="reveal info-card"><div class="ic">🔌</div><h4>扩展工具</h4><p>cftunnel 内网穿透、ClawApp 移动客户端管理</p></div>
<div class="reveal info-card"><div class="ic">🔍</div><h4>系统诊断</h4><p>全面健康检测、WebSocket 测试、一键修复配对</p></div>
</div>
</div>
</section>
<!-- ══════════════ Tech ══════════════ -->
<section id="tech" class="section">
<div class="grid-bg"></div>
<div class="container-sm" style="position:relative;z-index:10">
<div class="section-header">
<h2 class="reveal section-title"><span class="gradient-text">技术架构</span></h2>
<p class="reveal section-desc">精挑细选的技术栈,追求极致性能与开发体验</p>
</div>
<div class="tech-grid" id="tech-grid">
<div class="reveal tech-card">
<div class="tech-header"><div class="tech-icon" style="background:rgba(99,102,241,0.1)">🦀</div><div><div class="tech-name">Rust + Tauri v2</div><div class="tech-sub">后端运行时</div></div></div>
<div class="tech-desc">原生编译,内存安全,跨平台打包。通过 IPC 与前端高效通信Shell Plugin 执行本地命令。</div>
</div>
<div class="reveal tech-card">
<div class="tech-header"><div class="tech-icon" style="background:rgba(234,179,8,0.1)"></div><div><div class="tech-name">Vanilla JS + Vite</div><div class="tech-sub">前端架构</div></div></div>
<div class="tech-desc">零框架依赖SPA 路由组件化设计。Vite 极速 HMR支持浏览器 mock 模式独立调试。</div>
</div>
<div class="reveal tech-card">
<div class="tech-header"><div class="tech-icon" style="background:rgba(34,211,238,0.1)">🔌</div><div><div class="tech-name">WebSocket + RPC</div><div class="tech-sub">实时通信</div></div></div>
<div class="tech-desc">WsClient 管理 WebSocket 连接、心跳保活与自动重连。RPC 请求-响应 + 事件订阅双模式。</div>
</div>
<div class="reveal tech-card">
<div class="tech-header"><div class="tech-icon" style="background:rgba(168,85,247,0.1)">🎨</div><div><div class="tech-name">CSS Variables</div><div class="tech-sub">主题系统</div></div></div>
<div class="tech-desc">暗色 / 亮色主题无闪烁切换,玻璃拟态 UI 风格CSS 自定义属性实现全局样式管理。</div>
</div>
</div>
</div>
</section>
<!-- ══════════════ Marquee ══════════════ -->
<div class="marquee-wrap">
<div class="marquee-track">
<span class="marquee-item">Rust</span><span class="marquee-item marquee-dot">·</span>
<span class="marquee-item">Tauri v2</span><span class="marquee-item marquee-dot">·</span>
<span class="marquee-item">Vanilla JS</span><span class="marquee-item marquee-dot">·</span>
<span class="marquee-item">Vite</span><span class="marquee-item marquee-dot">·</span>
<span class="marquee-item">WebSocket</span><span class="marquee-item marquee-dot">·</span>
<span class="marquee-item">CSS Variables</span><span class="marquee-item marquee-dot">·</span>
<span class="marquee-item">IPC Bridge</span><span class="marquee-item marquee-dot">·</span>
<span class="marquee-item">Ed25519</span><span class="marquee-item marquee-dot">·</span>
<span class="marquee-item">Shell Plugin</span><span class="marquee-item marquee-dot">·</span>
<span class="marquee-item">SPA Router</span><span class="marquee-item marquee-dot">·</span>
<span class="marquee-item">Glassmorphism</span><span class="marquee-item marquee-dot">·</span>
<span class="marquee-item">Cross-Platform</span><span class="marquee-item marquee-dot">·</span>
<span class="marquee-item">Rust</span><span class="marquee-item marquee-dot">·</span>
<span class="marquee-item">Tauri v2</span><span class="marquee-item marquee-dot">·</span>
<span class="marquee-item">Vanilla JS</span><span class="marquee-item marquee-dot">·</span>
<span class="marquee-item">Vite</span><span class="marquee-item marquee-dot">·</span>
<span class="marquee-item">WebSocket</span><span class="marquee-item marquee-dot">·</span>
<span class="marquee-item">CSS Variables</span><span class="marquee-item marquee-dot">·</span>
<span class="marquee-item">IPC Bridge</span><span class="marquee-item marquee-dot">·</span>
<span class="marquee-item">Ed25519</span><span class="marquee-item marquee-dot">·</span>
<span class="marquee-item">Shell Plugin</span><span class="marquee-item marquee-dot">·</span>
<span class="marquee-item">SPA Router</span><span class="marquee-item marquee-dot">·</span>
<span class="marquee-item">Glassmorphism</span><span class="marquee-item marquee-dot">·</span>
<span class="marquee-item">Cross-Platform</span><span class="marquee-item marquee-dot">·</span>
</div>
</div>
<!-- ══════════════ Quickstart ══════════════ -->
<section id="quickstart" class="section">
<div class="container-sm" style="position:relative;z-index:10">
<div class="section-header">
<h2 class="reveal section-title"><span class="gradient-text">快速开始</span></h2>
<p class="reveal section-desc">几条命令,开箱即用</p>
</div>
<div class="reveal terminal">
<div class="terminal-bar">
<span class="td td-r"></span><span class="td td-y"></span><span class="td td-g"></span>
<span class="terminal-title mono">Terminal</span>
</div>
<div class="terminal-body mono">
<div class="t-comment"># 克隆仓库</div>
<div class="t-cmd">git clone https://github.com/qingchencloud/clawpanel.git</div>
<div class="t-cmd">cd clawpanel &amp;&amp; npm install</div>
<br>
<div class="t-comment"># macOS / Linux — 启动完整 Tauri 桌面应用</div>
<div class="t-cmd">./scripts/dev.sh</div>
<br>
<div class="t-comment"># Windows — 启动完整 Tauri 桌面应用</div>
<div class="t-cmd">npm run tauri dev</div>
<br>
<div class="t-comment"># 仅前端调试(浏览器 mock 模式)</div>
<div class="t-cmd">npm run dev</div>
</div>
</div>
</div>
</section>
<!-- ══════════════ Ecosystem ══════════════ -->
<section id="projects" class="section">
<div class="grid-bg"></div>
<div class="container-sm" style="position:relative;z-index:10">
<div class="section-header">
<h2 class="reveal section-title"><span class="gradient-text">生态项目</span></h2>
<p class="reveal section-desc">ClawPanel 是 OpenClaw 生态的一部分</p>
</div>
<div class="eco-list">
<a href="https://github.com/anthropics/openclaw" target="_blank" rel="noopener" class="reveal eco-card">
<div><h3>🧠 OpenClaw</h3><p>AI Agent 框架 — ClawPanel 的核心管理目标</p></div>
<span class="eco-arrow"></span>
</a>
<a href="https://github.com/qingchencloud/clawapp" target="_blank" rel="noopener" class="reveal eco-card">
<div><h3>📱 ClawApp</h3><p>跨平台移动聊天客户端,随时随地与 AI Agent 对话</p></div>
<span class="eco-arrow"></span>
</a>
<a href="https://github.com/qingchencloud/cftunnel" target="_blank" rel="noopener" class="reveal eco-card">
<div><h3>🔗 cftunnel</h3><p>Cloudflare Tunnel 内网穿透工具,一键暴露本地服务</p></div>
<span class="eco-arrow"></span>
</a>
</div>
</div>
</section>
<!-- ══════════════ Community ══════════════ -->
<section id="community" class="section">
<div class="orb orb-1" style="top:auto;bottom:-200px;left:auto;right:-100px"></div>
<div class="container" style="position:relative;z-index:10">
<div class="section-header">
<h2 class="reveal section-title"><span class="gradient-text">社区交流</span></h2>
<p class="reveal section-desc">加入社区,交流使用心得、反馈问题、获取最新动态</p>
</div>
<div class="community-grid">
<div class="reveal community-card">
<img class="community-qr" src="./qr-qq.png" alt="QQ 群二维码">
<h3>QQ 交流群</h3>
<p class="desc">扫码或点击链接加入 OpenClaw 用户群,与开发者和用户实时交流</p>
<a href="https://qt.cool/c/OpenClaw" target="_blank" rel="noopener" class="btn btn-sm btn-outline">加入 QQ 群</a>
</div>
<div class="reveal community-card">
<img class="community-qr" src="./qr-wechat.png" alt="微信群二维码">
<h3>微信交流群</h3>
<p class="desc">加入微信群,获取最新版本通知和使用技巧分享</p>
<a href="https://qt.cool/c/OpenClawWx" target="_blank" rel="noopener" class="btn btn-sm btn-outline">加入微信群</a>
</div>
</div>
<div class="community-extra">
<a href="https://discord.gg/U9AttmsNHh" target="_blank" rel="noopener" class="reveal community-link">
<svg viewBox="0 0 24 24" fill="currentColor"><path d="M20.317 4.37a19.791 19.791 0 00-4.885-1.515.074.074 0 00-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 00-5.487 0 12.64 12.64 0 00-.617-1.25.077.077 0 00-.079-.037A19.736 19.736 0 003.677 4.37a.07.07 0 00-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 00.031.057 19.9 19.9 0 005.993 3.03.078.078 0 00.084-.028c.462-.63.874-1.295 1.226-1.994a.076.076 0 00-.041-.106 13.107 13.107 0 01-1.872-.892.077.077 0 01-.008-.128 10.2 10.2 0 00.372-.292.074.074 0 01.077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 01.078.01c.12.098.246.198.373.292a.077.077 0 01-.006.127 12.299 12.299 0 01-1.873.892.077.077 0 00-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 00.084.028 19.839 19.839 0 006.002-3.03.077.077 0 00.032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 00-.031-.03z"/></svg>
Discord
</a>
<a href="https://yb.tencent.com/gp/i/LsvIw7mdR7Lb" target="_blank" rel="noopener" class="reveal community-link">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><path d="M8 12l2 2 4-4"/></svg>
元宝派
</a>
<a href="https://github.com/qingchencloud/clawpanel/discussions" target="_blank" rel="noopener" class="reveal community-link">
<svg viewBox="0 0 24 24" fill="currentColor"><path d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0024 12c0-6.63-5.37-12-12-12z"/></svg>
GitHub Discussions
</a>
<a href="https://github.com/qingchencloud/clawpanel/issues/new" target="_blank" rel="noopener" class="reveal community-link">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><path d="M12 8v4M12 16h.01"/></svg>
反馈 Issue
</a>
</div>
</div>
</section>
<!-- ══════════════ CTA ══════════════ -->
<section class="section cta-section">
<div class="orb orb-2" style="top:auto;bottom:-100px"></div>
<div class="container" style="position:relative;z-index:10">
<h2 class="reveal section-title" style="font-size:2.5rem">准备好了吗?</h2>
<p class="reveal section-desc" style="margin-bottom:40px">下载 ClawPanel开始管理你的 AI Agent</p>
<div class="reveal cta-buttons">
<a href="https://github.com/qingchencloud/clawpanel/releases/latest" target="_blank" rel="noopener" class="btn btn-primary">
<svg fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path d="M12 15V3m0 12l-4-4m4 4l4-4M2 17l.621 2.485A2 2 0 004.561 21h14.878a2 2 0 001.94-1.515L22 17"/></svg>
立即下载
</a>
<a href="https://github.com/qingchencloud/clawpanel" target="_blank" rel="noopener" class="btn btn-outline">
<svg viewBox="0 0 24 24" fill="currentColor" style="width:18px;height:18px"><path d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0024 12c0-6.63-5.37-12-12-12z"/></svg>
Star on GitHub
</a>
</div>
</div>
</section>
<!-- ══════════════ Footer ══════════════ -->
<footer class="footer">
<div class="footer-inner">
<div class="footer-logo">
<img src="./logo.png" alt="Logo">
<span>ClawPanel &copy; 2025</span>
</div>
<div class="footer-links">
<a href="https://github.com/qingchencloud/clawpanel" class="footer-link">GitHub</a>
<a href="https://github.com/qingchencloud/clawpanel/issues" class="footer-link">Issues</a>
<a href="https://qt.cool/c/OpenClaw" target="_blank" rel="noopener" class="footer-link">QQ 群</a>
<a href="https://discord.gg/U9AttmsNHh" target="_blank" rel="noopener" class="footer-link">Discord</a>
<a href="https://qt.cool" target="_blank" rel="noopener" class="footer-link">晴辰云</a>
</div>
</div>
</footer>
<!-- ══════════════ Lightbox ══════════════ -->
<div class="lightbox" id="lightbox" onclick="closeLightbox(event)">
<button class="lb-close" onclick="closeLightbox(event)">&times;</button>
<img id="lb-img" src="" alt="预览">
</div>
<!-- ══════════════ JavaScript ══════════════ -->
<script>
/* ── Lightbox ── */
function openLightbox(src) {
document.getElementById('lb-img').src = src;
document.getElementById('lightbox').classList.add('active');
document.body.style.overflow = 'hidden';
}
function closeLightbox(e) {
if (e && e.target.tagName === 'IMG') return;
document.getElementById('lightbox').classList.remove('active');
document.body.style.overflow = '';
}
document.addEventListener('keydown', function(e) { if (e.key === 'Escape') closeLightbox(); });
/* ── Theme ── */
function toggleTheme() {
var h = document.documentElement;
var isDark = h.classList.contains('dark');
h.classList.toggle('dark');
localStorage.setItem('clawpanel-theme', isDark ? 'light' : 'dark');
}
document.getElementById('theme-toggle').addEventListener('click', toggleTheme);
document.getElementById('theme-toggle-mobile').addEventListener('click', toggleTheme);
/* ── Mobile Menu ── */
var menu = document.getElementById('mobile-menu');
document.getElementById('hamburger').addEventListener('click', function() {
menu.classList.toggle('open');
});
document.querySelectorAll('.mobile-link').forEach(function(a) {
a.addEventListener('click', function() { menu.classList.remove('open'); });
});
/* ── Scroll Reveal ── */
var revealObs = new IntersectionObserver(function(entries) {
entries.forEach(function(e) {
if (e.isIntersecting) {
var delay = parseInt(e.target.dataset.delay) || 0;
setTimeout(function() { e.target.classList.add('revealed'); }, delay);
revealObs.unobserve(e.target);
}
});
}, { threshold: 0.08, rootMargin: '0px 0px -40px 0px' });
document.querySelectorAll('.reveal').forEach(function(el, i) {
if (!el.dataset.delay) {
var parent = el.closest('.showcase-row, .stats-grid, .gallery-grid, .info-grid, .community-grid, .community-extra, .eco-list');
if (parent) {
var siblings = parent.querySelectorAll('.reveal');
for (var j = 0; j < siblings.length; j++) {
if (siblings[j] === el) { el.dataset.delay = j * 80; break; }
}
}
}
revealObs.observe(el);
});
/* ── Counters ── */
var counterObs = new IntersectionObserver(function(entries) {
entries.forEach(function(e) {
if (!e.isIntersecting) return;
var el = e.target, target = parseInt(el.dataset.target), suffix = el.dataset.suffix || '';
var start = performance.now(), duration = 1500;
function tick(now) {
var p = Math.min((now - start) / duration, 1);
var ease = 1 - Math.pow(1 - p, 4);
el.textContent = Math.round(target * ease) + suffix;
if (p < 1) requestAnimationFrame(tick);
}
requestAnimationFrame(tick);
counterObs.unobserve(el);
});
}, { threshold: 0.5 });
document.querySelectorAll('.counter').forEach(function(el) { counterObs.observe(el); });
/* ── Tech Card Spotlight ── */
document.getElementById('tech-grid').addEventListener('mousemove', function(e) {
var cards = this.querySelectorAll('.tech-card');
cards.forEach(function(card) {
var r = card.getBoundingClientRect();
card.style.setProperty('--mx', (e.clientX - r.left) + 'px');
card.style.setProperty('--my', (e.clientY - r.top) + 'px');
});
});
/* ── Particles ── */
(function() {
var c = document.getElementById('particles');
for (var i = 0; i < 30; i++) {
var p = document.createElement('span');
p.className = 'particle';
p.style.left = Math.random() * 100 + '%';
p.style.animationDuration = (8 + Math.random() * 12) + 's';
p.style.animationDelay = (Math.random() * 10) + 's';
p.style.width = p.style.height = (1 + Math.random() * 2) + 'px';
c.appendChild(p);
}
})();
</script>
</body>
</html>