Files
clawpanel/docs/index.html

1010 lines
53 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">
<script src="https://cdn.tailwindcss.com"></script>
<script>
tailwind.config = {
darkMode: 'class',
theme: {
extend: {
fontFamily: {
sans: ['Inter', '-apple-system', 'BlinkMacSystemFont', '"Segoe UI"', 'system-ui', 'sans-serif'],
mono: ['"JetBrains Mono"', '"SF Mono"', '"Fira Code"', 'monospace'],
},
},
},
}
</script>
<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@400;500;600;700;800;900&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
<style>
/* ── 基础重置 ── */
*, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; }
html { scroll-behavior: smooth; }
body { -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; overflow-x: hidden; }
/* ── 光刻机网格背景 ── */
.grid-bg {
background-image:
linear-gradient(rgba(99,102,241,0.03) 1px, transparent 1px),
linear-gradient(90deg, rgba(99,102,241,0.03) 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);
}
.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: orbFloat1 20s ease-in-out infinite;
}
.orb-2 {
width: 500px; height: 500px;
background: rgba(168,85,247,0.08);
top: -100px; right: -150px;
animation: orbFloat2 25s ease-in-out infinite;
}
.orb-3 {
width: 400px; height: 400px;
background: rgba(34,211,238,0.06);
bottom: -100px; left: 30%;
animation: orbFloat3 18s ease-in-out infinite;
}
@keyframes orbFloat1 { 0%,100% { transform: translate(0,0) } 50% { transform: translate(40px,30px) } }
@keyframes orbFloat2 { 0%,100% { transform: translate(0,0) } 50% { transform: translate(-30px,40px) } }
@keyframes orbFloat3 { 0%,100% { transform: translate(0,0) } 50% { transform: translate(20px,-25px) } }
/* Light 模式能量球更淡 */
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); }
/* ── 流光渐变字 ── */
.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: gradientShift 6s ease-in-out infinite;
}
@keyframes gradientShift {
0%,100% { background-position: 0% 50% }
50% { background-position: 100% 50% }
}
/* ── 旋转流光边框 ── */
.glow-border {
position: relative;
z-index: 0;
}
.glow-border::before {
content: '';
position: absolute;
inset: -2px;
border-radius: inherit;
background: conic-gradient(from var(--glow-angle, 0deg), #6366f1, #a855f7, #22d3ee, #6366f1);
z-index: -2;
animation: glowSpin 3s linear infinite;
}
.glow-border::after {
content: '';
position: absolute;
inset: 0;
border-radius: inherit;
background-color: inherit;
z-index: -1;
}
@keyframes glowSpin {
to { --glow-angle: 360deg; }
}
@property --glow-angle {
syntax: "<angle>";
initial-value: 0deg;
inherits: false;
}
/* ── 磁性探照灯卡片 ── */
.spotlight-grid {
--mouse-x: 50%;
--mouse-y: 50%;
}
.spotlight-card {
position: relative;
overflow: hidden;
}
.spotlight-card::before {
content: '';
position: absolute;
inset: 0;
background: radial-gradient(
400px circle at var(--card-x, 50%) var(--card-y, 50%),
rgba(99,102,241,0.08),
transparent 60%
);
opacity: 0;
transition: opacity 0.4s;
pointer-events: none;
z-index: 1;
}
.spotlight-card:hover::before {
opacity: 1;
}
.spotlight-card::after {
content: '';
position: absolute;
inset: -1px;
border-radius: inherit;
background: radial-gradient(
300px circle at var(--card-x, 50%) var(--card-y, 50%),
rgba(99,102,241,0.25),
transparent 60%
);
opacity: 0;
transition: opacity 0.4s;
pointer-events: none;
mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
-webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
mask-composite: exclude;
-webkit-mask-composite: xor;
padding: 1px;
border-radius: inherit;
}
.spotlight-card:hover::after {
opacity: 1;
}
/* ── 滚动揭示动画 ── */
.reveal {
opacity: 0;
transform: translateY(30px) scale(0.97);
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) scale(1);
}
/* ── 跑马灯 ── */
.marquee-track {
display: flex;
width: max-content;
animation: marqueeScroll 30s linear infinite;
}
.marquee-track:hover { animation-play-state: paused; }
@keyframes marqueeScroll {
0% { transform: translateX(0); }
100% { transform: translateX(-50%); }
}
/* ── 汉堡菜单 ── */
.mobile-menu {
transform: translateY(-100%);
transition: transform 0.35s cubic-bezier(0.16, 1, 0.3, 1);
}
.mobile-menu.open {
transform: translateY(0);
}
/* ── 代码块 ── */
.code-line::before {
content: '$ ';
color: #6366f1;
}
.code-comment::before {
content: '';
}
/* ── 浮动卡片动画 ── */
@keyframes float {
0%,100% { transform: translateY(0px) }
50% { transform: translateY(-8px) }
}
.float-card { animation: float 6s ease-in-out infinite; }
.float-card-delay { animation: float 6s ease-in-out 2s infinite; }
/* ── 无闪烁主题切换 ── */
html { transition: background-color 0.3s, color 0.3s; }
/* ── Hero 大图透视 ── */
.hero-image-wrap {
perspective: 1200px;
max-width: 1100px;
margin: 0 auto;
}
.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;
}
.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%);
}
/* ── 功能展示截图 ── */
.screenshot-frame {
border-radius: 12px;
overflow: hidden;
border: 1px solid rgba(99,102,241,0.1);
box-shadow: 0 8px 40px -10px rgba(0,0,0,0.15);
transition: transform 0.5s cubic-bezier(0.16, 1, 0.3, 1), box-shadow 0.5s;
cursor: zoom-in;
}
.dark .screenshot-frame {
border-color: rgba(255,255,255,0.06);
box-shadow: 0 8px 40px -10px rgba(0,0,0,0.4);
}
.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-card {
border-radius: 12px;
overflow: hidden;
border: 1px solid rgba(99,102,241,0.08);
box-shadow: 0 4px 20px -5px rgba(0,0,0,0.1);
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;
}
.dark .gallery-card {
border-color: rgba(255,255,255,0.06);
box-shadow: 0 4px 20px -5px rgba(0,0,0,0.3);
}
.gallery-card:hover {
transform: translateY(-4px) scale(1.02);
box-shadow: 0 12px 40px -8px rgba(99,102,241,0.2);
border-color: rgba(99,102,241,0.3);
}
.gallery-card img {
width: 100%;
display: block;
}
.gallery-card .gallery-label {
position: absolute;
bottom: 0;
left: 0;
right: 0;
padding: 8px 12px;
background: linear-gradient(transparent, rgba(0,0,0,0.6));
color: #fff;
font-size: 13px;
font-weight: 600;
opacity: 0;
transition: opacity 0.3s;
}
.gallery-card:hover .gallery-label {
opacity: 1;
}
/* ── 灯箱 ── */
.lightbox-overlay {
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-overlay.active {
display: flex;
}
.lightbox-overlay img {
max-width: 100%;
max-height: 100%;
border-radius: 12px;
box-shadow: 0 0 80px rgba(99,102,241,0.2);
animation: lbFadeIn 0.3s ease-out;
}
@keyframes lbFadeIn {
from { opacity: 0; transform: scale(0.95); }
to { opacity: 1; transform: scale(1); }
}
.lightbox-close {
position: absolute;
top: 20px;
right: 24px;
width: 40px;
height: 40px;
border-radius: 50%;
background: rgba(255,255,255,0.1);
border: none;
color: #fff;
font-size: 20px;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: background 0.2s;
}
.lightbox-close:hover {
background: rgba(255,255,255,0.2);
}
/* ── 功能标签 ── */
.feature-tag {
display: inline-flex;
align-items: center;
gap: 6px;
padding: 4px 12px;
border-radius: 99px;
font-size: 12px;
font-weight: 600;
letter-spacing: 0.5px;
text-transform: uppercase;
}
</style>
<script>
/* 无闪烁主题初始化 */
(function(){
const saved = localStorage.getItem('clawpanel-theme')
if (saved === 'light') document.documentElement.classList.remove('dark')
else if (saved === 'dark') document.documentElement.classList.add('dark')
else if (!window.matchMedia('(prefers-color-scheme: dark)').matches) document.documentElement.classList.remove('dark')
})()
</script>
</head>
<body class="bg-white dark:bg-[#0a0a0f] text-gray-900 dark:text-gray-100 font-sans">
<!-- ══════════════ 导航 ══════════════ -->
<nav class="fixed top-0 inset-x-0 z-50 bg-white/80 dark:bg-[#0a0a0f]/80 backdrop-blur-2xl border-b border-gray-200 dark:border-white/[0.06]">
<div class="max-w-6xl mx-auto px-5 h-16 flex items-center justify-between">
<a href="#" class="flex items-center gap-2.5 font-bold text-lg tracking-tight no-underline text-gray-900 dark:text-white">
<img src="./logo.png" alt="Logo" class="w-8 h-8 rounded-lg">
ClawPanel
</a>
<!-- 桌面导航 -->
<div class="hidden md:flex items-center gap-7 text-sm font-medium">
<a href="#features" class="text-gray-500 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white transition no-underline">功能预览</a>
<a href="#tech" class="text-gray-500 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white transition no-underline">架构</a>
<a href="#quickstart" class="text-gray-500 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white transition no-underline">开始</a>
<a href="#projects" class="text-gray-500 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white transition no-underline">生态</a>
<a href="https://github.com/qingchencloud/clawpanel" target="_blank" rel="noopener" class="text-gray-500 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white transition no-underline">GitHub</a>
<!-- 主题切换 -->
<button id="theme-toggle" class="p-2 rounded-lg hover:bg-gray-100 dark:hover:bg-white/5 text-gray-500 dark:text-gray-400 transition" aria-label="切换主题">
<svg id="icon-sun" class="w-4 h-4 hidden dark:block" 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 id="icon-moon" class="w-4 h-4 block dark:hidden" 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="flex md:hidden items-center gap-2">
<button id="theme-toggle-mobile" class="p-2 rounded-lg hover:bg-gray-100 dark:hover:bg-white/5 text-gray-500 dark:text-gray-400 transition" aria-label="切换主题">
<svg class="w-4 h-4 hidden dark:block" 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="w-4 h-4 block dark:hidden" 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="p-2 rounded-lg hover:bg-gray-100 dark:hover:bg-white/5 text-gray-600 dark:text-gray-300" aria-label="菜单">
<svg class="w-5 h-5" 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 md:hidden absolute top-16 inset-x-0 bg-white/95 dark:bg-[#0a0a0f]/95 backdrop-blur-2xl border-b border-gray-200 dark:border-white/[0.06]">
<div class="px-5 py-4 flex flex-col gap-3 text-base font-medium">
<a href="#features" class="py-2 text-gray-600 dark:text-gray-300 no-underline mobile-link">功能预览</a>
<a href="#tech" class="py-2 text-gray-600 dark:text-gray-300 no-underline mobile-link">架构</a>
<a href="#quickstart" class="py-2 text-gray-600 dark:text-gray-300 no-underline mobile-link">开始</a>
<a href="#projects" class="py-2 text-gray-600 dark:text-gray-300 no-underline mobile-link">生态</a>
<a href="https://github.com/qingchencloud/clawpanel" target="_blank" rel="noopener" class="py-2 text-gray-600 dark:text-gray-300 no-underline">GitHub ↗</a>
</div>
</div>
</nav>
<!-- ══════════════ Hero ══════════════ -->
<section class="relative min-h-screen flex items-center justify-center overflow-hidden pt-16">
<!-- 背景层 -->
<div class="absolute inset-0 grid-bg"></div>
<div class="orb orb-1"></div>
<div class="orb orb-2"></div>
<div class="relative z-10 max-w-4xl mx-auto px-5 text-center py-24 md:py-32">
<!-- 标签 -->
<div class="reveal inline-flex items-center gap-2 px-4 py-1.5 rounded-full border border-indigo-500/20 bg-indigo-500/5 text-sm text-indigo-400 dark:text-indigo-300 mb-8">
<span class="w-1.5 h-1.5 rounded-full bg-green-400 animate-pulse"></span>
v0.2.1 已发布 &mdash; 支持聊天图片 &amp; 灯箱查看
</div>
<!-- 主标题 -->
<h1 class="reveal text-5xl sm:text-6xl md:text-7xl font-black tracking-tighter leading-[1.05] mb-6">
管理你的
<span class="gradient-text">AI Agent</span>
<br class="hidden sm:block">从未如此直观
</h1>
<!-- 副标题 -->
<p class="reveal text-lg md:text-xl text-gray-500 dark:text-gray-400 max-w-2xl mx-auto mb-10 leading-relaxed">
ClawPanel 是 <strong class="text-gray-700 dark:text-gray-200">OpenClaw</strong> 的可视化管理面板,基于 Tauri v2 构建。<br class="hidden md:block">
仪表盘、模型配置、实时聊天、记忆管理 — 一站式掌控。
</p>
<!-- CTA 按钮 -->
<div class="reveal flex flex-col sm:flex-row gap-4 justify-center items-center">
<a href="https://github.com/qingchencloud/clawpanel/releases" target="_blank" rel="noopener"
class="glow-border rounded-xl px-8 py-3.5 font-semibold text-white bg-indigo-500 hover:bg-indigo-600 transition-colors no-underline flex items-center gap-2.5 text-base">
<svg class="w-5 h-5" 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="rounded-xl px-8 py-3.5 font-semibold border border-gray-200 dark:border-white/10 bg-white dark:bg-white/5 hover:bg-gray-50 dark:hover:bg-white/10 transition-colors no-underline flex items-center gap-2.5 text-base text-gray-700 dark:text-gray-200">
<svg class="w-5 h-5" 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>
<!-- Hero 大图 -->
<div class="reveal hero-image-wrap relative mt-16 px-4" data-delay="300">
<img src="./01.png" alt="ClawPanel 仪表盘" class="w-full" onclick="openLightbox(this.src)" loading="eager">
<div class="hero-glow"></div>
</div>
</div>
</section>
<!-- ══════════════ 数据面板 ══════════════ -->
<section class="relative py-20 overflow-hidden">
<div class="absolute inset-0 grid-bg"></div>
<div class="relative z-10 max-w-5xl mx-auto px-5">
<div class="grid grid-cols-2 md:grid-cols-4 gap-4 md:gap-6">
<div class="reveal rounded-2xl border border-gray-200 dark:border-white/[0.06] bg-white/60 dark:bg-white/[0.02] backdrop-blur-sm p-6 text-center float-card">
<div class="text-3xl md:text-4xl font-black tracking-tight text-indigo-500 counter" data-target="10">0</div>
<div class="text-sm text-gray-500 dark:text-gray-400 mt-2">管理页面</div>
</div>
<div class="reveal rounded-2xl border border-gray-200 dark:border-white/[0.06] bg-white/60 dark:bg-white/[0.02] backdrop-blur-sm p-6 text-center float-card-delay">
<div class="text-3xl md:text-4xl font-black tracking-tight text-purple-500 counter" data-target="3">0</div>
<div class="text-sm text-gray-500 dark:text-gray-400 mt-2">平台支持</div>
</div>
<div class="reveal rounded-2xl border border-gray-200 dark:border-white/[0.06] bg-white/60 dark:bg-white/[0.02] backdrop-blur-sm p-6 text-center float-card">
<div class="text-3xl md:text-4xl font-black tracking-tight text-cyan-500 counter" data-target="0" data-suffix="依赖">0</div>
<div class="text-sm text-gray-500 dark:text-gray-400 mt-2">前端框架</div>
</div>
<div class="reveal rounded-2xl border border-gray-200 dark:border-white/[0.06] bg-white/60 dark:bg-white/[0.02] backdrop-blur-sm p-6 text-center float-card-delay">
<div class="text-3xl md:text-4xl font-black tracking-tight text-emerald-500 counter" data-target="100" data-suffix="%">0</div>
<div class="text-sm text-gray-500 dark:text-gray-400 mt-2">开源免费</div>
</div>
</div>
</div>
</section>
<!-- ══════════════ 功能展示 ══════════════ -->
<section id="features" class="relative py-24 overflow-hidden">
<div class="orb orb-3"></div>
<div class="relative z-10 max-w-6xl mx-auto px-5">
<div class="text-center mb-20">
<h2 class="reveal text-3xl md:text-4xl font-black tracking-tighter mb-4">
强大的 <span class="gradient-text">功能矩阵</span>
</h2>
<p class="reveal text-gray-500 dark:text-gray-400 max-w-lg mx-auto">一个面板,管理 OpenClaw 的方方面面</p>
</div>
<!-- ── 展示 1: 实时聊天 ── -->
<div class="grid grid-cols-1 lg:grid-cols-2 gap-10 lg:gap-16 items-center mb-28">
<div class="reveal screenshot-frame order-2 lg:order-1" onclick="openLightbox('./02.png')">
<img src="./02.png" alt="实时聊天" loading="lazy">
</div>
<div class="order-1 lg:order-2">
<div class="reveal feature-tag text-indigo-500 bg-indigo-500/10 mb-4">💬 核心功能</div>
<h3 class="reveal text-2xl md:text-3xl font-black tracking-tight mb-4">实时 AI 对话</h3>
<p class="reveal text-gray-500 dark:text-gray-400 leading-relaxed mb-4">
WebSocket 直连 Gateway流式响应实时显示。支持图片附件、多模态交互、Markdown 渲染、会话管理与快捷指令。
</p>
<ul class="reveal space-y-2 text-sm text-gray-500 dark:text-gray-400">
<li class="flex items-center gap-2"><span class="text-green-500"></span> 流式传输,逐字显示</li>
<li class="flex items-center gap-2"><span class="text-green-500"></span> 多会话管理与历史记录</li>
<li class="flex items-center gap-2"><span class="text-green-500"></span> 图片拖拽上传 &amp; 灯箱预览</li>
<li class="flex items-center gap-2"><span class="text-green-500"></span> / 快捷指令系统</li>
</ul>
</div>
</div>
<!-- ── 展示 2: 模型配置 ── -->
<div class="grid grid-cols-1 lg:grid-cols-2 gap-10 lg:gap-16 items-center mb-28">
<div class="order-1">
<div class="reveal feature-tag text-purple-500 bg-purple-500/10 mb-4">🧠 配置中心</div>
<h3 class="reveal text-2xl md:text-3xl font-black tracking-tight mb-4">多模型灵活调配</h3>
<p class="reveal text-gray-500 dark:text-gray-400 leading-relaxed mb-4">
支持 OpenAI、DeepSeek、Kimi 等多家服务商。可视化管理模型列表,一键设为主模型,自动备选切换。
</p>
<ul class="reveal space-y-2 text-sm text-gray-500 dark:text-gray-400">
<li class="flex items-center gap-2"><span class="text-green-500"></span> 多 Provider 统一管理</li>
<li class="flex items-center gap-2"><span class="text-green-500"></span> 批量连通性测试</li>
<li class="flex items-center gap-2"><span class="text-green-500"></span> 主模型 + 备选自动切换</li>
<li class="flex items-center gap-2"><span class="text-green-500"></span> 拖拽排序 &amp; 实时保存</li>
</ul>
</div>
<div class="reveal screenshot-frame order-2" onclick="openLightbox('./05.png')">
<img src="./05.png" alt="模型配置" loading="lazy">
</div>
</div>
<!-- ── 展示 3: 记忆文件 ── -->
<div class="grid grid-cols-1 lg:grid-cols-2 gap-10 lg:gap-16 items-center mb-28">
<div class="reveal screenshot-frame order-2 lg:order-1" onclick="openLightbox('./08.png')">
<img src="./08.png" alt="记忆文件" loading="lazy">
</div>
<div class="order-1 lg:order-2">
<div class="reveal feature-tag text-cyan-500 bg-cyan-500/10 mb-4">🗂️ 数据管理</div>
<h3 class="reveal text-2xl md:text-3xl font-black tracking-tight mb-4">让 Agent 拥有记忆</h3>
<p class="reveal text-gray-500 dark:text-gray-400 leading-relaxed mb-4">
在线编辑 Agent 核心配置文件AGENTS.md、SOUL.md 等),管理工作记忆和记忆归档。支持 ZIP 一键打包导出。
</p>
<ul class="reveal space-y-2 text-sm text-gray-500 dark:text-gray-400">
<li class="flex items-center gap-2"><span class="text-green-500"></span> 核心文件在线编辑</li>
<li class="flex items-center gap-2"><span class="text-green-500"></span> 工作记忆 &amp; 记忆归档</li>
<li class="flex items-center gap-2"><span class="text-green-500"></span> 多 Agent 记忆隔离</li>
<li class="flex items-center gap-2"><span class="text-green-500"></span> ZIP 打包下载</li>
</ul>
</div>
</div>
<!-- ── 展示 4: Gateway 配置 ── -->
<div class="grid grid-cols-1 lg:grid-cols-2 gap-10 lg:gap-16 items-center mb-28">
<div class="order-1">
<div class="reveal feature-tag text-emerald-500 bg-emerald-500/10 mb-4">🌐 网关管控</div>
<h3 class="reveal text-2xl md:text-3xl font-black tracking-tight mb-4">安全访问,可视化配置</h3>
<p class="reveal text-gray-500 dark:text-gray-400 leading-relaxed mb-4">
Gateway 端口、绑定范围、运行模式、Token / 密码认证方式,卡片式选项直观配置,即改即生效。
</p>
<ul class="reveal space-y-2 text-sm text-gray-500 dark:text-gray-400">
<li class="flex items-center gap-2"><span class="text-green-500"></span> 本地 / 局域网模式切换</li>
<li class="flex items-center gap-2"><span class="text-green-500"></span> Token &amp; 密码双认证模式</li>
<li class="flex items-center gap-2"><span class="text-green-500"></span> Tailscale Funnel 支持</li>
<li class="flex items-center gap-2"><span class="text-green-500"></span> 高级选项按需展开</li>
</ul>
</div>
<div class="reveal screenshot-frame order-2" onclick="openLightbox('./07.png')">
<img src="./07.png" alt="Gateway 配置" loading="lazy">
</div>
</div>
<!-- ── 展示 5: Agent 管理 ── -->
<div class="grid grid-cols-1 lg:grid-cols-2 gap-10 lg:gap-16 items-center mb-20">
<div class="reveal screenshot-frame order-2 lg:order-1" onclick="openLightbox('./06.png')">
<img src="./06.png" alt="Agent 管理" loading="lazy">
</div>
<div class="order-1 lg:order-2">
<div class="reveal feature-tag text-orange-500 bg-orange-500/10 mb-4">🤖 智能体</div>
<h3 class="reveal text-2xl md:text-3xl font-black tracking-tight mb-4">多 Agent 协作管理</h3>
<p class="reveal text-gray-500 dark:text-gray-400 leading-relaxed mb-4">
创建和管理多个 AI Agent配置各自的身份、模型和独立工作区。支持备份、编辑与一键切换。
</p>
<ul class="reveal space-y-2 text-sm text-gray-500 dark:text-gray-400">
<li class="flex items-center gap-2"><span class="text-green-500"></span> 多 Agent 独立工作区</li>
<li class="flex items-center gap-2"><span class="text-green-500"></span> 身份与模型单独配置</li>
<li class="flex items-center gap-2"><span class="text-green-500"></span> Agent 配置备份</li>
<li class="flex items-center gap-2"><span class="text-green-500"></span> 默认 Agent 快速切换</li>
</ul>
</div>
</div>
</div>
</section>
<!-- ══════════════ 更多功能 ══════════════ -->
<section class="relative py-24 overflow-hidden">
<div class="absolute inset-0 grid-bg"></div>
<div class="relative z-10 max-w-6xl mx-auto px-5">
<div class="text-center mb-16">
<h2 class="reveal text-3xl md:text-4xl font-black tracking-tighter mb-4">
还有 <span class="gradient-text">更多</span>
</h2>
<p class="reveal text-gray-500 dark:text-gray-400">运维、监控、诊断,面面俱到</p>
</div>
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4">
<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="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4 mt-6">
<div class="reveal rounded-2xl border border-gray-200 dark:border-white/[0.06] bg-white/80 dark:bg-white/[0.02] backdrop-blur-sm p-5">
<div class="text-lg mb-2">⚙️</div>
<h4 class="font-bold text-sm mb-1">服务管理</h4>
<p class="text-xs text-gray-500 dark:text-gray-400 leading-relaxed">启停控制、版本检测、一键升级、配置备份与恢复</p>
</div>
<div class="reveal rounded-2xl border border-gray-200 dark:border-white/[0.06] bg-white/80 dark:bg-white/[0.02] backdrop-blur-sm p-5">
<div class="text-lg mb-2"><EFBFBD></div>
<h4 class="font-bold text-sm mb-1">日志查看</h4>
<p class="text-xs text-gray-500 dark:text-gray-400 leading-relaxed">多日志源实时查看、关键字搜索、自动滚动跟踪</p>
</div>
<div class="reveal rounded-2xl border border-gray-200 dark:border-white/[0.06] bg-white/80 dark:bg-white/[0.02] backdrop-blur-sm p-5">
<div class="text-lg mb-2"><EFBFBD></div>
<h4 class="font-bold text-sm mb-1">扩展工具</h4>
<p class="text-xs text-gray-500 dark:text-gray-400 leading-relaxed">cftunnel 内网穿透、ClawApp 移动客户端管理</p>
</div>
<div class="reveal rounded-2xl border border-gray-200 dark:border-white/[0.06] bg-white/80 dark:bg-white/[0.02] backdrop-blur-sm p-5">
<div class="text-lg mb-2">🔍</div>
<h4 class="font-bold text-sm mb-1">系统诊断</h4>
<p class="text-xs text-gray-500 dark:text-gray-400 leading-relaxed">全面健康检测、WebSocket 测试、一键修复配对</p>
</div>
</div>
</div>
</section>
<!-- ══════════════ 技术架构 ══════════════ -->
<section id="tech" class="relative py-24 overflow-hidden">
<div class="absolute inset-0 grid-bg"></div>
<div class="relative z-10 max-w-4xl mx-auto px-5">
<div class="text-center mb-16">
<h2 class="reveal text-3xl md:text-4xl font-black tracking-tighter mb-4">
现代 <span class="gradient-text">技术栈</span>
</h2>
<p class="reveal text-gray-500 dark:text-gray-400">极致轻量,极致性能</p>
</div>
<div class="reveal grid grid-cols-1 md:grid-cols-2 gap-4">
<div class="rounded-2xl border border-gray-200 dark:border-white/[0.06] bg-white/80 dark:bg-white/[0.02] backdrop-blur-sm p-6">
<div class="flex items-center gap-3 mb-3">
<div class="w-10 h-10 rounded-xl bg-orange-500/10 flex items-center justify-center text-lg">🦀</div>
<div>
<div class="font-bold text-sm">Rust + Tauri v2</div>
<div class="text-xs text-gray-500 dark:text-gray-400">后端 &amp; 桌面框架</div>
</div>
</div>
<p class="text-sm text-gray-500 dark:text-gray-400">原生性能跨平台编译。Windows / macOS / Linux 三端统一。</p>
</div>
<div class="rounded-2xl border border-gray-200 dark:border-white/[0.06] bg-white/80 dark:bg-white/[0.02] backdrop-blur-sm p-6">
<div class="flex items-center gap-3 mb-3">
<div class="w-10 h-10 rounded-xl bg-yellow-500/10 flex items-center justify-center text-lg"></div>
<div>
<div class="font-bold text-sm">Vanilla JS + Vite</div>
<div class="text-xs text-gray-500 dark:text-gray-400">前端</div>
</div>
</div>
<p class="text-sm text-gray-500 dark:text-gray-400">零框架依赖,毫秒级 HMR构建产物极小。纯粹、快速、可控。</p>
</div>
<div class="rounded-2xl border border-gray-200 dark:border-white/[0.06] bg-white/80 dark:bg-white/[0.02] backdrop-blur-sm p-6">
<div class="flex items-center gap-3 mb-3">
<div class="w-10 h-10 rounded-xl bg-indigo-500/10 flex items-center justify-center text-lg">🔗</div>
<div>
<div class="font-bold text-sm">WebSocket + IPC</div>
<div class="text-xs text-gray-500 dark:text-gray-400">通信层</div>
</div>
</div>
<p class="text-sm text-gray-500 dark:text-gray-400">Tauri IPC 前后端桥接WebSocket 直连 Gateway实时双向通信。</p>
</div>
<div class="rounded-2xl border border-gray-200 dark:border-white/[0.06] bg-white/80 dark:bg-white/[0.02] backdrop-blur-sm p-6">
<div class="flex items-center gap-3 mb-3">
<div class="w-10 h-10 rounded-xl bg-cyan-500/10 flex items-center justify-center text-lg">🎭</div>
<div>
<div class="font-bold text-sm">CSS Variables + Glassmorphism</div>
<div class="text-xs text-gray-500 dark:text-gray-400">视觉体系</div>
</div>
</div>
<p class="text-sm text-gray-500 dark:text-gray-400">CSS 变量驱动主题切换,毛玻璃卡片、渐变色彩、暗色优先设计。</p>
</div>
</div>
</div>
</section>
<!-- ══════════════ 技术跑马灯 ══════════════ -->
<section class="py-12 border-y border-gray-200 dark:border-white/[0.06] overflow-hidden">
<div class="marquee-track text-sm font-mono text-gray-400 dark:text-gray-500">
<span class="px-8">Rust</span><span class="px-8 text-indigo-400"></span>
<span class="px-8">Tauri v2</span><span class="px-8 text-purple-400"></span>
<span class="px-8">Vanilla JS</span><span class="px-8 text-cyan-400"></span>
<span class="px-8">Vite</span><span class="px-8 text-indigo-400"></span>
<span class="px-8">WebSocket</span><span class="px-8 text-purple-400"></span>
<span class="px-8">Ed25519</span><span class="px-8 text-cyan-400"></span>
<span class="px-8">IPC</span><span class="px-8 text-indigo-400"></span>
<span class="px-8">Glassmorphism</span><span class="px-8 text-purple-400"></span>
<span class="px-8">CSS Variables</span><span class="px-8 text-cyan-400"></span>
<span class="px-8">OpenClaw</span><span class="px-8 text-indigo-400"></span>
<span class="px-8">MIT License</span><span class="px-8 text-purple-400"></span>
<span class="px-8">Cross-Platform</span><span class="px-8 text-cyan-400"></span>
<!-- 重复一份实现无缝滚动 -->
<span class="px-8">Rust</span><span class="px-8 text-indigo-400"></span>
<span class="px-8">Tauri v2</span><span class="px-8 text-purple-400"></span>
<span class="px-8">Vanilla JS</span><span class="px-8 text-cyan-400"></span>
<span class="px-8">Vite</span><span class="px-8 text-indigo-400"></span>
<span class="px-8">WebSocket</span><span class="px-8 text-purple-400"></span>
<span class="px-8">Ed25519</span><span class="px-8 text-cyan-400"></span>
<span class="px-8">IPC</span><span class="px-8 text-indigo-400"></span>
<span class="px-8">Glassmorphism</span><span class="px-8 text-purple-400"></span>
<span class="px-8">CSS Variables</span><span class="px-8 text-cyan-400"></span>
<span class="px-8">OpenClaw</span><span class="px-8 text-indigo-400"></span>
<span class="px-8">MIT License</span><span class="px-8 text-purple-400"></span>
<span class="px-8">Cross-Platform</span><span class="px-8 text-cyan-400"></span>
</div>
</section>
<!-- ══════════════ 快速开始 ══════════════ -->
<section id="quickstart" class="relative py-24 overflow-hidden">
<div class="orb" style="width:500px;height:500px;background:rgba(168,85,247,0.06);top:50%;right:-200px;filter:blur(120px);animation:orbFloat2 22s ease-in-out infinite"></div>
<div class="relative z-10 max-w-3xl mx-auto px-5">
<div class="text-center mb-16">
<h2 class="reveal text-3xl md:text-4xl font-black tracking-tighter mb-4">
<span class="gradient-text">三步</span> 开始开发
</h2>
<p class="reveal text-gray-500 dark:text-gray-400">Node.js 18+ &amp; Rust stable &amp; <a href="https://v2.tauri.app/start/prerequisites/" class="text-indigo-400 hover:text-indigo-300 no-underline" target="_blank" rel="noopener">Tauri v2 依赖</a></p>
</div>
<div class="reveal rounded-2xl border border-gray-200 dark:border-white/[0.06] bg-white/80 dark:bg-[#0d0d14]/80 backdrop-blur-sm overflow-hidden">
<div class="flex items-center gap-2 px-5 py-3 border-b border-gray-200 dark:border-white/[0.06]">
<div class="w-3 h-3 rounded-full bg-red-400/80"></div>
<div class="w-3 h-3 rounded-full bg-yellow-400/80"></div>
<div class="w-3 h-3 rounded-full bg-green-400/80"></div>
<span class="ml-3 text-xs text-gray-400 font-mono">terminal</span>
</div>
<div class="p-5 font-mono text-sm leading-8 text-gray-600 dark:text-gray-300 overflow-x-auto">
<div class="text-gray-400 dark:text-gray-500"># 克隆 &amp; 安装</div>
<div class="code-line">git clone https://github.com/qingchencloud/clawpanel.git</div>
<div class="code-line">cd clawpanel &amp;&amp; npm install</div>
<div class="mt-4 text-gray-400 dark:text-gray-500"># 启动开发(完整 Tauri 桌面应用)</div>
<div class="code-line">cargo tauri dev</div>
<div class="mt-4 text-gray-400 dark:text-gray-500"># 或仅启动前端(浏览器调试)</div>
<div class="code-line">npm run dev</div>
<div class="mt-4 text-gray-400 dark:text-gray-500"># 构建发布</div>
<div class="code-line">cargo tauri build</div>
</div>
</div>
</div>
</section>
<!-- ══════════════ 生态项目 ══════════════ -->
<section id="projects" class="relative py-24 overflow-hidden">
<div class="absolute inset-0 grid-bg"></div>
<div class="relative z-10 max-w-4xl mx-auto px-5">
<div class="text-center mb-16">
<h2 class="reveal text-3xl md:text-4xl font-black tracking-tighter mb-4">
<span class="gradient-text">OpenClaw</span> 生态
</h2>
<p class="reveal text-gray-500 dark:text-gray-400">一套完整的 AI Agent 基础设施</p>
</div>
<div class="space-y-4">
<a href="https://github.com/openclaw/openclaw" target="_blank" rel="noopener"
class="reveal block rounded-2xl border border-gray-200 dark:border-white/[0.06] bg-white/80 dark:bg-white/[0.02] backdrop-blur-sm p-6 no-underline text-inherit transition-all duration-300 hover:-translate-y-0.5 hover:border-indigo-500/30 group">
<div class="flex items-center justify-between">
<div>
<h3 class="font-bold text-base mb-1 group-hover:text-indigo-500 transition-colors">OpenClaw</h3>
<p class="text-sm text-gray-500 dark:text-gray-400">AI Agent 框架支持多模型协作、工具调用、记忆管理、MCP 协议</p>
</div>
<svg class="w-5 h-5 text-gray-300 dark:text-gray-600 group-hover:text-indigo-500 transition-all group-hover:translate-x-1" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path d="M9 5l7 7-7 7"/></svg>
</div>
</a>
<a href="https://github.com/qingchencloud/clawapp" target="_blank" rel="noopener"
class="reveal block rounded-2xl border border-gray-200 dark:border-white/[0.06] bg-white/80 dark:bg-white/[0.02] backdrop-blur-sm p-6 no-underline text-inherit transition-all duration-300 hover:-translate-y-0.5 hover:border-indigo-500/30 group">
<div class="flex items-center justify-between">
<div>
<h3 class="font-bold text-base mb-1 group-hover:text-indigo-500 transition-colors">ClawApp</h3>
<p class="text-sm text-gray-500 dark:text-gray-400">跨平台移动聊天客户端H5 + 代理服务器架构,支持离线和流式传输</p>
</div>
<svg class="w-5 h-5 text-gray-300 dark:text-gray-600 group-hover:text-indigo-500 transition-all group-hover:translate-x-1" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path d="M9 5l7 7-7 7"/></svg>
</div>
</a>
<a href="https://github.com/qingchencloud/cftunnel" target="_blank" rel="noopener"
class="reveal block rounded-2xl border border-gray-200 dark:border-white/[0.06] bg-white/80 dark:bg-white/[0.02] backdrop-blur-sm p-6 no-underline text-inherit transition-all duration-300 hover:-translate-y-0.5 hover:border-indigo-500/30 group">
<div class="flex items-center justify-between">
<div>
<h3 class="font-bold text-base mb-1 group-hover:text-indigo-500 transition-colors">cftunnel</h3>
<p class="text-sm text-gray-500 dark:text-gray-400">全协议内网穿透工具Cloud 模式免费 HTTP/WS + Relay 模式自建中继</p>
</div>
<svg class="w-5 h-5 text-gray-300 dark:text-gray-600 group-hover:text-indigo-500 transition-all group-hover:translate-x-1" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path d="M9 5l7 7-7 7"/></svg>
</div>
</a>
<a href="https://github.com/qingchencloud/clawpanel" target="_blank" rel="noopener"
class="reveal block rounded-2xl border border-gray-200 dark:border-white/[0.06] bg-white/80 dark:bg-white/[0.02] backdrop-blur-sm p-6 no-underline text-inherit transition-all duration-300 hover:-translate-y-0.5 hover:border-indigo-500/30 group">
<div class="flex items-center justify-between">
<div>
<h3 class="font-bold text-base mb-1 group-hover:text-indigo-500 transition-colors">ClawPanel</h3>
<p class="text-sm text-gray-500 dark:text-gray-400">OpenClaw 可视化管理面板Tauri v2 桌面应用(就是你正在看的这个)</p>
</div>
<svg class="w-5 h-5 text-gray-300 dark:text-gray-600 group-hover:text-indigo-500 transition-all group-hover:translate-x-1" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path d="M9 5l7 7-7 7"/></svg>
</div>
</a>
</div>
</div>
</section>
<!-- ══════════════ CTA ══════════════ -->
<section class="relative py-24 overflow-hidden">
<div class="orb" style="width:700px;height:700px;background:rgba(99,102,241,0.08);top:50%;left:50%;transform:translate(-50%,-50%);filter:blur(120px)"></div>
<div class="relative z-10 max-w-2xl mx-auto px-5 text-center">
<h2 class="reveal text-3xl md:text-4xl font-black tracking-tighter mb-4">
准备好了?
</h2>
<p class="reveal text-gray-500 dark:text-gray-400 mb-8">下载 ClawPanel开始管理你的 AI Agent</p>
<div class="reveal flex flex-col sm:flex-row gap-4 justify-center">
<a href="https://github.com/qingchencloud/clawpanel/releases" target="_blank" rel="noopener"
class="glow-border rounded-xl px-8 py-3.5 font-semibold text-white bg-indigo-500 hover:bg-indigo-600 transition-colors no-underline flex items-center justify-center gap-2.5">
<svg class="w-5 h-5" 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>
下载 ClawPanel
</a>
<a href="https://github.com/qingchencloud/clawpanel/issues/new" target="_blank" rel="noopener"
class="rounded-xl px-8 py-3.5 font-semibold border border-gray-200 dark:border-white/10 bg-white dark:bg-white/5 hover:bg-gray-50 dark:hover:bg-white/10 transition-colors no-underline flex items-center justify-center gap-2.5 text-gray-700 dark:text-gray-200">
反馈 Issue
</a>
</div>
</div>
</section>
<!-- ══════════════ 页脚 ══════════════ -->
<footer class="border-t border-gray-200 dark:border-white/[0.06] py-10">
<div class="max-w-5xl mx-auto px-5 flex flex-col md:flex-row items-center justify-between gap-4 text-sm text-gray-400 dark:text-gray-500">
<div class="flex items-center gap-2">
<img src="./logo.png" alt="Logo" class="w-5 h-5 rounded opacity-50">
<span>MIT License &copy; 2026 <a href="https://github.com/qingchencloud" class="hover:text-gray-600 dark:hover:text-gray-300 transition no-underline text-gray-400 dark:text-gray-500">qingchencloud</a></span>
</div>
<div class="flex gap-6">
<a href="https://github.com/qingchencloud/clawpanel" class="hover:text-gray-600 dark:hover:text-gray-300 transition no-underline text-gray-400 dark:text-gray-500">GitHub</a>
<a href="https://github.com/qingchencloud/clawpanel/issues" class="hover:text-gray-600 dark:hover:text-gray-300 transition no-underline text-gray-400 dark:text-gray-500">Issues</a>
<a href="https://github.com/qingchencloud/clawpanel/blob/main/CONTRIBUTING.md" class="hover:text-gray-600 dark:hover:text-gray-300 transition no-underline text-gray-400 dark:text-gray-500">贡献</a>
<a href="https://qt.cool/c/OpenClaw" target="_blank" rel="noopener" class="hover:text-gray-600 dark:hover:text-gray-300 transition no-underline text-gray-400 dark:text-gray-500">QQ 群</a>
</div>
</div>
</footer>
<!-- ══════════════ 灯箱 ══════════════ -->
<div class="lightbox-overlay" id="lightbox" onclick="closeLightbox(event)">
<button class="lightbox-close" onclick="closeLightbox(event)">&times;</button>
<img id="lightbox-img" src="" alt="预览">
</div>
<!-- ══════════════ JavaScript ══════════════ -->
<script>
/* ── 灯箱 ── */
function openLightbox(src) {
const lb = document.getElementById('lightbox')
document.getElementById('lightbox-img').src = src
lb.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', (e) => {
if (e.key === 'Escape') closeLightbox()
})
/* ── 主题切换 ── */
function toggleTheme() {
const html = document.documentElement
const isDark = html.classList.contains('dark')
html.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)
/* ── 汉堡菜单 ── */
const hamburger = document.getElementById('hamburger')
const mobileMenu = document.getElementById('mobile-menu')
hamburger.addEventListener('click', () => mobileMenu.classList.toggle('open'))
document.querySelectorAll('.mobile-link').forEach(link => {
link.addEventListener('click', () => mobileMenu.classList.remove('open'))
})
/* ── IntersectionObserver 滚动揭示 ── */
const revealObserver = new IntersectionObserver((entries) => {
entries.forEach((entry, i) => {
if (entry.isIntersecting) {
// 错开延迟
const delay = entry.target.dataset.delay || 0
const siblings = Array.from(entry.target.parentElement.children).filter(c => c.classList.contains('reveal'))
const idx = siblings.indexOf(entry.target)
const stagger = idx >= 0 ? idx * 80 : 0
setTimeout(() => entry.target.classList.add('revealed'), Number(delay) + stagger)
revealObserver.unobserve(entry.target)
}
})
}, { threshold: 0.1, rootMargin: '0px 0px -40px 0px' })
document.querySelectorAll('.reveal').forEach(el => revealObserver.observe(el))
/* ── 数字暴涨动画 ── */
const counterObserver = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (!entry.isIntersecting) return
const el = entry.target
const target = parseInt(el.dataset.target)
const suffix = el.dataset.suffix || ''
if (target === 0) { el.textContent = '0 ' + suffix; counterObserver.unobserve(el); return }
const duration = 1500
const start = performance.now()
function tick(now) {
const elapsed = now - start
const progress = Math.min(elapsed / duration, 1)
const eased = 1 - Math.pow(1 - progress, 4) // easeOutQuart
const current = Math.round(target * eased)
el.textContent = current + (suffix ? ' ' + suffix : '')
if (progress < 1) requestAnimationFrame(tick)
}
requestAnimationFrame(tick)
counterObserver.unobserve(el)
})
}, { threshold: 0.5 })
document.querySelectorAll('.counter').forEach(el => counterObserver.observe(el))
/* ── 磁性探照灯 ── */
const grid = document.getElementById('feature-grid')
if (grid) {
grid.addEventListener('mousemove', (e) => {
const cards = grid.querySelectorAll('.spotlight-card')
cards.forEach(card => {
const rect = card.getBoundingClientRect()
const x = e.clientX - rect.left
const y = e.clientY - rect.top
card.style.setProperty('--card-x', x + 'px')
card.style.setProperty('--card-y', y + 'px')
})
})
}
/* ── 导航滚动效果 ── */
const nav = document.querySelector('nav')
window.addEventListener('scroll', () => {
if (window.scrollY > 10) nav.classList.add('shadow-sm')
else nav.classList.remove('shadow-sm')
}, { passive: true })
</script>
</body>
</html>