feat(engine-select): Monolith 对角线全屏选择屏

替换原卡片网格为「左上 OpenClaw(石墨黑)vs 右下 Hermes(象牙白)」对角线全屏设计。
启动屏 / 引擎切换时给用户一个有冲击力的「选择时刻」。

## 核心设计
- position: fixed 跳出 #content 范围,覆盖整个 viewport(含 sidebar)
- 双三角形 clip-path: polygon (0 0, 0 100%, 100% 0) / (100% 0, 100% 100%, 0 100%)
- 内容用 absolute 定位到三角形质心(左上 11%/6.5% / 右下 11%/6.5%),永不重叠
- 微妙的 60px 网格纹 + 角落极光(紫蓝 / 橙金)+ 极细中线分割
- clamp(80px, 13vw, 200px) 巨字标题 + 序号 + Logo + tagline + 特性列表 + CTA

## 交互
- hover 联动:用 [data-hover] attribute 替代 :has(),兼容旧 WebKit
  - 鼠标悬停一侧 → 该侧亮起 + 内容平移 + CTA 反白;另一侧变暗 + 内容模糊缩小
- 点击三角形 → 三角形 clip-path 扩满(0.8s)→ 中心圆扩散(0.9s)→ 进入主页
- reveal 节点 attach 到 body,跨路由切换存活,新页面渲染后再淡出

## Both / Later 处理
- 两个次级选项保留,做成底部居中的玻璃 pill 链接(不抢戏)
- 不走对角线扩散动画,点击后直接 applyEngineSelection + navigate

## 兼容性
- prefers-reduced-motion: reduce → 关闭所有动画
- 移动端响应式:< 760px 调整字号 / 边距 / 角标
- 用 Vite define 注入的 __APP_VERSION__ 显示版本号(与 main.js / sidebar.js 一致)

## i18n
- engine.choiceTopBanner / choiceCtaEnter
- choiceOpenclaw{Tagline,Feat1,Feat2,Feat3,Category}
- choiceHermes{Tagline,Feat1,Feat2,Feat3,Category}
- choiceSecondary{Both,Later}
- 三语完整(zh-CN / en / zh-TW)

## 抽卡 prototype
保留 docs/engine-select-mockups/ 下的 V2 4 张设计 + 索引页(v2-monolith.html
即本次接入的最终版本)。
This commit is contained in:
晴天
2026-05-14 06:22:32 +08:00
parent cc19a07999
commit 6a0d87479c
12 changed files with 3330 additions and 223 deletions

View File

@@ -0,0 +1,150 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Engine Select Mockups · 三种风格抽卡</title>
<style>
* { margin: 0; padding: 0; box-sizing: border-box }
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;
background: #0a0a0a;
color: #fff;
min-height: 100vh;
padding: 40px 24px;
}
.container { max-width: 1100px; margin: 0 auto }
h1 {
font-size: 28px;
font-weight: 200;
letter-spacing: -0.02em;
margin-bottom: 8px;
}
.lead { color: rgba(255, 255, 255, 0.6); font-size: 14px; margin-bottom: 32px }
.grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
gap: 20px;
}
.card {
background: rgba(255, 255, 255, 0.04);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 16px;
padding: 28px 24px;
transition: border-color 0.2s, transform 0.2s;
text-decoration: none;
color: inherit;
display: block;
}
.card:hover {
border-color: rgba(255, 255, 255, 0.25);
transform: translateY(-4px);
}
.tag {
display: inline-block;
font-size: 10px;
letter-spacing: 0.2em;
text-transform: uppercase;
padding: 3px 10px;
border-radius: 12px;
margin-bottom: 16px;
background: rgba(255, 255, 255, 0.1);
}
.tag-a { background: rgba(180, 180, 180, 0.18) }
.tag-b { background: rgba(180, 100, 255, 0.25) }
.tag-c { background: rgba(100, 180, 255, 0.2) }
.card h2 { font-size: 18px; margin-bottom: 8px; font-weight: 400 }
.card .desc { font-size: 13px; color: rgba(255, 255, 255, 0.65); line-height: 1.6; margin-bottom: 14px }
.pros { display: flex; flex-direction: column; gap: 6px }
.pro {
font-size: 12px;
color: rgba(255, 255, 255, 0.7);
padding-left: 18px;
position: relative;
}
.pro::before {
content: '✓';
position: absolute;
left: 0;
color: #5fffa3;
}
.preview {
aspect-ratio: 16 / 10;
border-radius: 8px;
margin-bottom: 16px;
position: relative;
overflow: hidden;
}
.preview-a { background: #0a0a0a }
.preview-a::before { content: ''; position: absolute; inset: 0; clip-path: polygon(100% 100%, 0 100%, 100% 0); background: #f5f5f5 }
.preview-a::after { content: ''; position: absolute; inset: 0; background: linear-gradient(45deg, transparent 49.7%, #888 49.9%, #888 50.1%, transparent 50.3%) }
.preview-b { background: linear-gradient(135deg, #2c1d6b, #4a2585) }
.preview-b::before { content: ''; position: absolute; inset: 0; clip-path: polygon(100% 100%, 0 100%, 100% 0); background: linear-gradient(315deg, #b85419, #ff8c3a) }
.preview-b::after { content: ''; position: absolute; inset: 0; background: linear-gradient(45deg, transparent 49.6%, rgba(255,255,255,0.9) 50%, transparent 50.4%) }
.preview-c {
background:
radial-gradient(circle at 20% 30%, rgba(140, 100, 255, 0.4), transparent 35%),
radial-gradient(circle at 80% 70%, rgba(255, 140, 60, 0.4), transparent 35%),
#0a0d1a;
}
.preview-c::before { content: ''; position: absolute; inset: 0; clip-path: polygon(100% 100%, 0 100%, 100% 0); background: rgba(255, 140, 80, 0.08); backdrop-filter: blur(20px) }
.preview-c::after { content: ''; position: absolute; inset: 0; background: linear-gradient(45deg, transparent 49.7%, rgba(255,255,255,0.6) 50%, transparent 50.3%) }
.footer { color: rgba(255, 255, 255, 0.5); font-size: 13px; margin-top: 32px; line-height: 1.7 }
.footer code { background: rgba(255, 255, 255, 0.08); padding: 2px 6px; border-radius: 4px; font-size: 12px }
</style>
</head>
<body>
<div class="container">
<h1>Engine Select · 三种风格抽卡</h1>
<div class="lead">点击下面任一张卡片预览完整动画。每个 mockup 都是独立 HTML可单独打开。</div>
<div class="grid">
<a class="card" href="mockup-a-minimal.html" target="_blank">
<div class="preview preview-a"></div>
<span class="tag tag-a">A · 极简</span>
<h2>极简对角线 · 黑白对比</h2>
<div class="desc">纯黑 vs 纯白,瑞士设计风格。强调内容本身,不引入任何装饰元素。</div>
<div class="pros">
<div class="pro">最快加载、最稳定(不依赖 backdrop-filter</div>
<div class="pro">永不过时,能搭配任何主题</div>
<div class="pro">高对比度,残障友好</div>
</div>
</a>
<a class="card" href="mockup-b-gradient.html" target="_blank">
<div class="preview preview-b"></div>
<span class="tag tag-b">B · 赛博</span>
<h2>渐变发光 · 赛博朋克</h2>
<div class="desc">紫蓝 vs 橙金渐变 + 发光中线 + logo 光圈脉动。每个引擎有强烈的「人格」色彩。</div>
<div class="pros">
<div class="pro">视觉冲击力最强,第一眼记得住</div>
<div class="pro">两个引擎气质对比鲜明(冷 vs 暖)</div>
<div class="pro">动效丰富但不影响性能</div>
</div>
</a>
<a class="card" href="mockup-c-glass.html" target="_blank">
<div class="preview preview-c"></div>
<span class="tag tag-c">C · 高级</span>
<h2>玻璃拟态 + 粒子 · 沉浸高级</h2>
<div class="desc">动态极光 + 玻璃质感 + 漂浮粒子 + 玻璃 logo 卡片。最接近 Apple Vision Pro 的高级感。</div>
<div class="pros">
<div class="pro">沉浸感最强,"未来感" 拉满</div>
<div class="pro">背景动态延伸到展开后的主页</div>
<div class="pro">细节层次丰富(极光、粒子、玻璃高光)</div>
</div>
</a>
</div>
<div class="footer">
<p><strong>预览说明</strong>:每个 HTML 都是独立可运行的,无任何外部依赖。</p>
<p>动画三阶段:<code>hover</code><code>三角形扩满</code><code>中心圆扩散进入主页</code></p>
<p>预览模式下点击三角形会展示完整动画,按 <code>R</code> 重置。</p>
<p style="margin-top: 16px">挑好风格后告诉我编号A / B / C我把它接进真实的 <code>/engine-select</code> 页面替换现有卡片网格。</p>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,303 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>V2 抽卡 · 4 张大间距对角线设计</title>
<style>
* { margin: 0; padding: 0; box-sizing: border-box }
body {
font-family: 'Inter', -apple-system, system-ui, sans-serif;
background: #050608;
color: #fff;
min-height: 100vh;
padding: 40px 24px 60px;
-webkit-font-smoothing: antialiased;
}
.container { max-width: 1280px; margin: 0 auto }
.header { margin-bottom: 36px }
h1 {
font-size: 32px;
font-weight: 200;
letter-spacing: -0.03em;
margin-bottom: 10px;
}
.lead {
color: rgba(255, 255, 255, 0.65);
font-size: 14px;
line-height: 1.7;
max-width: 720px;
}
.lead strong { color: #ffd56b; font-weight: 500 }
.grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 16px;
}
.card {
background: rgba(255, 255, 255, 0.04);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 14px;
padding: 0;
transition: border-color 0.25s, transform 0.25s;
text-decoration: none;
color: inherit;
display: block;
overflow: hidden;
}
.card:hover {
border-color: rgba(255, 255, 255, 0.3);
transform: translateY(-4px);
}
.preview {
aspect-ratio: 16 / 10;
position: relative;
overflow: hidden;
}
/* —— V2-A: Bold Split — 黑白 —— */
.preview-a { background: #fff }
.preview-a::before {
content: '';
position: absolute;
inset: 0;
clip-path: polygon(0 0, 0 100%, 100% 0);
background: #0a0a0a;
}
.preview-a::after {
content: '';
position: absolute;
inset: 0;
background: linear-gradient(45deg, transparent 49.7%, #d4d4d4 50%, transparent 50.3%);
}
.preview-a .label-tl, .preview-a .label-br {
position: absolute;
font-size: 8px;
letter-spacing: 0.2em;
}
.preview-a .label-tl { top: 12%; left: 8%; color: #fff }
.preview-a .label-br { bottom: 12%; right: 8%; color: #000 }
/* —— V2-B: Cinematic 紫橙 —— */
.preview-b {
background:
radial-gradient(circle at 75% 65%, rgba(255, 130, 50, 0.45), transparent 50%),
radial-gradient(circle at 95% 5%, rgba(120, 50, 20, 0.6), transparent 55%),
linear-gradient(315deg, #2a1208, #4a1f0a);
}
.preview-b::before {
content: '';
position: absolute;
inset: 0;
clip-path: polygon(0 0, 0 100%, 100% 0);
background:
radial-gradient(circle at 25% 35%, rgba(120, 90, 255, 0.5), transparent 50%),
radial-gradient(circle at 5% 95%, rgba(50, 30, 120, 0.6), transparent 55%),
linear-gradient(135deg, #1a1340, #0d0828);
}
.preview-b::after {
content: '';
position: absolute;
inset: 0;
background: linear-gradient(45deg, transparent 49.6%, rgba(255,255,255,0.95) 50%, transparent 50.4%);
filter: drop-shadow(0 0 6px rgba(255,255,255,0.6));
}
/* —— V2-C: Monolith 黑+米白 —— */
.preview-c { background: #f5f3ee }
.preview-c::before {
content: '';
position: absolute;
inset: 0;
clip-path: polygon(0 0, 0 100%, 100% 0);
background: #0c0d12;
}
.preview-c::after {
content: '';
position: absolute;
inset: 0;
background:
radial-gradient(circle at 5% 5%, rgba(110, 100, 255, 0.3), transparent 35%),
radial-gradient(circle at 95% 95%, rgba(220, 130, 60, 0.2), transparent 35%),
linear-gradient(45deg, transparent 49.7%, rgba(180,180,180,0.7) 50%, transparent 50.3%);
}
/* —— V2-D: Aurora 极光 —— */
.preview-d {
background:
radial-gradient(ellipse 50% 40% at 22% 28%, rgba(110, 110, 255, 0.55) 0%, transparent 70%),
radial-gradient(ellipse 45% 35% at 78% 72%, rgba(255, 130, 80, 0.55) 0%, transparent 70%),
#050608;
}
.preview-d::before {
content: '';
position: absolute;
inset: 0;
clip-path: polygon(0 0, 0 100%, 100% 0);
background: linear-gradient(135deg, rgba(20, 25, 60, 0.5), rgba(10, 12, 30, 0.85));
backdrop-filter: blur(20px);
}
.preview-d::after {
content: '';
position: absolute;
inset: 0;
background: linear-gradient(45deg, transparent 49.6%, rgba(255,255,255,0.95) 50%, transparent 50.4%);
filter: drop-shadow(0 0 8px rgba(255,255,255,0.5));
}
.body {
padding: 20px 22px 22px;
}
.tag {
display: inline-block;
font-size: 10px;
letter-spacing: 0.22em;
text-transform: uppercase;
padding: 3px 9px;
border-radius: 11px;
margin-bottom: 12px;
background: rgba(255, 255, 255, 0.1);
font-weight: 500;
}
.card h2 {
font-size: 17px;
margin-bottom: 6px;
font-weight: 500;
letter-spacing: -0.01em;
}
.card .desc {
font-size: 12.5px;
color: rgba(255, 255, 255, 0.6);
line-height: 1.6;
margin-bottom: 14px;
}
.pros { display: flex; flex-direction: column; gap: 5px }
.pro {
font-size: 11.5px;
color: rgba(255, 255, 255, 0.7);
padding-left: 18px;
position: relative;
line-height: 1.5;
}
.pro::before {
content: '✓';
position: absolute;
left: 0;
color: #5fffa3;
font-size: 10px;
top: 2px;
}
.footer {
margin-top: 40px;
padding-top: 28px;
border-top: 1px solid rgba(255, 255, 255, 0.08);
color: rgba(255, 255, 255, 0.55);
font-size: 13px;
line-height: 1.8;
}
.footer code {
background: rgba(255, 255, 255, 0.08);
padding: 2px 7px;
border-radius: 4px;
font-size: 11.5px;
}
.footer .keys {
margin-top: 16px;
padding: 14px 18px;
background: rgba(255, 215, 100, 0.06);
border-left: 2px solid rgba(255, 215, 100, 0.5);
border-radius: 4px;
}
</style>
</head>
<body>
<div class="container">
<div class="header">
<h1>V2 抽卡 — 大间距对角线设计</h1>
<div class="lead">
<strong>这次修了什么</strong>:上一版把内容用 flex center 堆在屏幕中央,导致 OpenClaw 和 Hermes 的字挤在分割线两侧重叠。
新版用 absolute 定位把内容明确放在各自三角形的「重心」——左上 11%/6%,右下 11%/6%,间距大幅拉开,分割线清晰。
</div>
</div>
<div class="grid">
<a class="card" href="v2-bold-split.html" target="_blank">
<div class="preview preview-a">
<span class="label-tl">OPENCLAW</span>
<span class="label-br">HERMES</span>
</div>
<div class="body">
<span class="tag">A · BOLD SPLIT</span>
<h2>黑白巨字</h2>
<div class="desc">瑞士设计风。两侧都是巨大产品名180px黑底 vs 白底强烈反差。hover 让另一侧变暗,专注感强。</div>
<div class="pros">
<div class="pro">最强反差,第一眼就抓住视线</div>
<div class="pro">极简、最稳、最快</div>
<div class="pro">永不过时(二十年后仍漂亮)</div>
</div>
</div>
</a>
<a class="card" href="v2-cinematic.html" target="_blank">
<div class="preview preview-b"></div>
<div class="body">
<span class="tag">B · CINEMATIC</span>
<h2>电影级双世界</h2>
<div class="desc">深紫蓝OpenClaw 冷vs 暖橙琥珀Hermes 暖)双世界。发光中线 + 玻璃 chips + 大图标 logo + 角标版本号。</div>
<div class="pros">
<div class="pro">视觉冲击最强,沉浸感最高</div>
<div class="pro">两个引擎气质对比鲜明(冷 vs 暖)</div>
<div class="pro">细节层次最丰富</div>
</div>
</div>
</a>
<a class="card" href="v2-monolith.html" target="_blank">
<div class="preview preview-c"></div>
<div class="body">
<span class="tag">C · MONOLITH</span>
<h2>巨碑感Linear / Vercel 风)</h2>
<div class="desc">石墨黑 vs 象牙白,每边都有微妙网格纹 + 角落 glow。左上 logo + 序号 + 巨字 + 特性列表 + 实心 CTA。</div>
<div class="pros">
<div class="pro">最专业、信息密度最高</div>
<div class="pro">B2B / SaaS 一线产品的常用风格</div>
<div class="pro">两侧都有完整 CTA 按钮(点击意图明确)</div>
</div>
</div>
</a>
<a class="card" href="v2-aurora.html" target="_blank">
<div class="preview preview-d"></div>
<div class="body">
<span class="tag">D · AURORA</span>
<h2>极光大字Stripe / Apple 风)</h2>
<div class="desc">底层动态极光 + 噪声纹理 + 玻璃覆盖层。两侧都是统一暗色调,但 hover 时该侧的玻璃会变亮、另一侧变暗。最高级感。</div>
<div class="pros">
<div class="pro">沉浸感最强,"未来感" 拉满</div>
<div class="pro">背景与展开后的主页可无缝衔接</div>
<div class="pro">动态背景延伸到整个产品的视觉体系</div>
</div>
</div>
</a>
</div>
<div class="footer">
<p><strong>核心修复</strong>:用 <code>absolute</code> 定位top/left & bottom/right替代 flex center让 OpenClaw 内容在左上 ~25% 重心Hermes 内容在右下 ~75% 重心,永不重叠。</p>
<p><strong>新增交互</strong>:用 CSS <code>:has()</code> 实现 hover 联动 — 鼠标在哪一边,那一边变亮 + 内容浮起;另一边自动变暗 + 模糊 + 内容缩小,专注感很强。</p>
<p><strong>动画三阶段(每个版本统一)</strong>hover 联动 → 三角形扩满 → 中心圆扩散 → 进入主页 mock。</p>
<div class="keys">
<strong>挑选指引</strong>
<br>· 想要 <strong>极简永恒</strong> → A · Bold Split
<br>· 想要 <strong>视觉冲击</strong> → B · Cinematic
<br>· 想要 <strong>专业 SaaS</strong> → C · Monolith
<br>· 想要 <strong>未来高级感</strong> → D · Aurora
</div>
<p style="margin-top: 18px">挑好告诉我编号A/B/C/D我把它接进真实的 <code>/engine-select</code> 替换现有卡片网格。</p>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,229 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Mockup A — 极简对角线(黑白对比)</title>
<style>
* { margin: 0; padding: 0; box-sizing: border-box }
html, body { height: 100%; overflow: hidden; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif }
/* 整体容器 */
.stage {
position: fixed;
inset: 0;
background: #000;
}
/* 三角形clip-path 切对角线(左下→右上)
左上半OpenClaw(0,0) (0,100%) (100%,0)
右下半Hermes (100%,100%) (0,100%) (100%,0) */
.panel {
position: absolute;
inset: 0;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
cursor: pointer;
transition: filter 0.4s ease;
color: #fff;
}
.panel-openclaw {
clip-path: polygon(0 0, 0 100%, 100% 0);
background: #0a0a0a;
color: #f5f5f5;
}
.panel-hermes {
clip-path: polygon(100% 100%, 0 100%, 100% 0);
background: #f5f5f5;
color: #0a0a0a;
}
/* 内容定位:每边贴近自己的「角」 */
.panel-inner {
display: flex;
flex-direction: column;
align-items: center;
gap: 24px;
text-align: center;
transition: transform 0.4s cubic-bezier(0.34, 1.56, 0.64, 1);
}
.panel-openclaw .panel-inner {
margin-top: -120px;
margin-left: -180px;
}
.panel-hermes .panel-inner {
margin-bottom: -120px;
margin-right: -180px;
}
/* hover 强化 */
.panel:hover { filter: brightness(1.08) }
.panel:hover .panel-inner { transform: scale(1.06) }
/* logo */
.logo {
width: 80px;
height: 80px;
display: grid;
place-items: center;
}
.logo svg { width: 100%; height: 100%; stroke: currentColor; fill: none; stroke-width: 1.5 }
.title {
font-size: 56px;
font-weight: 200;
letter-spacing: -0.04em;
line-height: 1;
}
.subtitle {
font-size: 14px;
opacity: 0.6;
max-width: 240px;
line-height: 1.6;
}
/* 中央分割线hover 时显示提示) */
.hint {
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%) rotate(-45deg);
color: rgba(128, 128, 128, 0.3);
font-size: 11px;
letter-spacing: 0.2em;
pointer-events: none;
text-transform: uppercase;
z-index: 10;
}
/* —— 选中态展开动画 —— */
/* 阶段 1: 该三角形扩大到全屏clip-path 占整个矩形) */
.panel-openclaw.expanding { clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%); z-index: 5 }
.panel-hermes.expanding { clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%); z-index: 5 }
.panel.expanding { transition: clip-path 0.6s cubic-bezier(0.7, 0, 0.3, 1) }
/* 阶段 2: 中心圆扩散,模拟「展开进入主页」 */
.reveal {
position: fixed;
top: 50%;
left: 50%;
width: 0;
height: 0;
border-radius: 50%;
background: #1a1a1a;
transform: translate(-50%, -50%);
z-index: 20;
pointer-events: none;
transition: width 0.7s ease, height 0.7s ease;
}
.reveal.active {
width: 250vmax;
height: 250vmax;
}
/* 完成时显示「已进入主页」 */
.home-mock {
position: fixed;
inset: 0;
z-index: 30;
display: flex;
align-items: center;
justify-content: center;
color: #fff;
font-size: 24px;
font-weight: 200;
letter-spacing: 0.1em;
background: #1a1a1a;
opacity: 0;
pointer-events: none;
transition: opacity 0.4s ease;
}
.home-mock.show { opacity: 1; pointer-events: auto }
.reset-hint {
position: fixed;
bottom: 20px;
left: 50%;
transform: translateX(-50%);
color: rgba(255, 255, 255, 0.4);
font-size: 12px;
z-index: 40;
}
</style>
</head>
<body>
<div class="stage" id="stage">
<!-- OpenClaw 左上三角 -->
<div class="panel panel-openclaw" data-engine="openclaw">
<div class="panel-inner">
<div class="logo">
<svg viewBox="0 0 24 24">
<path d="M12 2L2 7l10 5 10-5-10-5z"/>
<path d="M2 17l10 5 10-5"/>
<path d="M2 12l10 5 10-5"/>
</svg>
</div>
<div class="title">OpenClaw</div>
<div class="subtitle">通用 AI 助理 · 模型 / 渠道 / 记忆 / 智能体</div>
</div>
</div>
<!-- Hermes 右下三角 -->
<div class="panel panel-hermes" data-engine="hermes">
<div class="panel-inner">
<div class="logo">
<svg viewBox="0 0 24 24">
<path d="M13 2L3 14h9l-1 8 10-12h-9l1-8z"/>
</svg>
</div>
<div class="title">Hermes</div>
<div class="subtitle">Agent 工作流 · 工具调用 / Profile / Kanban / Skills</div>
</div>
</div>
<div class="hint">SELECT YOUR ENGINE</div>
</div>
<div class="reveal" id="reveal"></div>
<div class="home-mock" id="home">
✓ 已进入 <span id="home-name" style="margin-left: 6px"></span> 主页
</div>
<div class="reset-hint">点击任意三角形预览动画 · 按 R 重置</div>
<script>
const stage = document.getElementById('stage')
const reveal = document.getElementById('reveal')
const home = document.getElementById('home')
const homeName = document.getElementById('home-name')
document.querySelectorAll('.panel').forEach(panel => {
panel.addEventListener('click', () => {
const engine = panel.dataset.engine
const other = stage.querySelector(`.panel:not([data-engine="${engine}"])`)
// 阶段 1: 选中三角形展开占满
panel.classList.add('expanding')
other.style.opacity = '0'
other.style.transition = 'opacity 0.4s'
// 阶段 2: 中心圆扩散
setTimeout(() => {
reveal.style.background = engine === 'openclaw' ? '#1a1a1a' : '#fafafa'
home.style.background = engine === 'openclaw' ? '#1a1a1a' : '#fafafa'
home.style.color = engine === 'openclaw' ? '#fff' : '#000'
homeName.textContent = engine === 'openclaw' ? 'OpenClaw' : 'Hermes'
reveal.classList.add('active')
}, 500)
// 阶段 3: 显示主页 mock
setTimeout(() => home.classList.add('show'), 1100)
})
})
// R 键重置
document.addEventListener('keydown', (e) => {
if (e.key.toLowerCase() === 'r') location.reload()
})
</script>
</body>
</html>

View File

@@ -0,0 +1,269 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Mockup B — 渐变发光(赛博朋克)</title>
<style>
* { margin: 0; padding: 0; box-sizing: border-box }
html, body { height: 100%; overflow: hidden; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif; background: #060611 }
.stage { position: fixed; inset: 0; overflow: hidden }
/* 背景星点 */
.stars {
position: absolute;
inset: 0;
background-image:
radial-gradient(2px 2px at 12% 18%, rgba(120, 130, 255, 0.5), transparent),
radial-gradient(2px 2px at 88% 78%, rgba(255, 180, 100, 0.5), transparent),
radial-gradient(1.5px 1.5px at 30% 65%, rgba(160, 100, 255, 0.4), transparent),
radial-gradient(1.5px 1.5px at 70% 30%, rgba(255, 120, 80, 0.4), transparent),
radial-gradient(1px 1px at 50% 50%, rgba(255, 255, 255, 0.3), transparent);
background-size: 100% 100%;
}
/* 三角形 panel */
.panel {
position: absolute;
inset: 0;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
cursor: pointer;
transition: filter 0.4s ease, transform 0.4s ease;
}
.panel-openclaw {
clip-path: polygon(0 0, 0 100%, 100% 0);
background:
radial-gradient(ellipse at 25% 25%, rgba(110, 80, 220, 0.45), transparent 60%),
linear-gradient(135deg, #2c1d6b 0%, #4a2585 35%, #1a0d3d 100%);
}
.panel-hermes {
clip-path: polygon(100% 100%, 0 100%, 100% 0);
background:
radial-gradient(ellipse at 75% 75%, rgba(255, 130, 60, 0.45), transparent 60%),
linear-gradient(315deg, #5b1f0a 0%, #b85419 35%, #ff8c3a 70%, #d97a4e 100%);
}
/* 中线发光 */
.panel::before {
content: '';
position: absolute;
inset: 0;
background: linear-gradient(45deg, transparent 49.6%, rgba(255, 255, 255, 0.7) 49.8%, rgba(255, 255, 255, 1) 50%, rgba(255, 255, 255, 0.7) 50.2%, transparent 50.4%);
filter: blur(0.5px);
pointer-events: none;
}
/* 内容定位 */
.panel-inner {
display: flex;
flex-direction: column;
align-items: center;
gap: 28px;
text-align: center;
color: #fff;
transition: transform 0.5s cubic-bezier(0.34, 1.56, 0.64, 1);
z-index: 2;
}
.panel-openclaw .panel-inner { margin-top: -120px; margin-left: -180px }
.panel-hermes .panel-inner { margin-bottom: -120px; margin-right: -180px }
/* hover发光增强 + 浮起 */
.panel:hover { filter: brightness(1.18) saturate(1.2) }
.panel:hover .panel-inner { transform: scale(1.08) translateY(-8px) }
.panel:hover .logo { animation: pulse 1.2s ease infinite }
/* logo 装饰光圈 */
.logo {
width: 96px;
height: 96px;
display: grid;
place-items: center;
position: relative;
border-radius: 50%;
background: rgba(255, 255, 255, 0.12);
backdrop-filter: blur(10px);
border: 1.5px solid rgba(255, 255, 255, 0.3);
box-shadow: 0 0 30px currentColor, inset 0 0 30px rgba(255, 255, 255, 0.1);
}
.panel-openclaw .logo { color: rgba(170, 130, 255, 0.5) }
.panel-hermes .logo { color: rgba(255, 180, 100, 0.6) }
.logo svg { width: 50px; height: 50px; stroke: #fff; fill: none; stroke-width: 1.6 }
@keyframes pulse {
0%, 100% { box-shadow: 0 0 30px currentColor, inset 0 0 30px rgba(255, 255, 255, 0.1) }
50% { box-shadow: 0 0 60px currentColor, inset 0 0 40px rgba(255, 255, 255, 0.2) }
}
.title {
font-size: 64px;
font-weight: 300;
letter-spacing: -0.04em;
line-height: 1;
text-shadow: 0 2px 30px rgba(0, 0, 0, 0.4);
}
.subtitle {
font-size: 14px;
opacity: 0.85;
max-width: 280px;
line-height: 1.7;
font-weight: 300;
}
.badge {
font-size: 10px;
padding: 4px 12px;
border: 1px solid rgba(255, 255, 255, 0.4);
border-radius: 20px;
text-transform: uppercase;
letter-spacing: 0.15em;
margin-bottom: -10px;
}
/* 中央提示 */
.center-hint {
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%) rotate(-45deg);
color: rgba(255, 255, 255, 0.6);
font-size: 11px;
letter-spacing: 0.3em;
pointer-events: none;
z-index: 10;
font-weight: 300;
text-shadow: 0 0 10px rgba(0, 0, 0, 0.6);
}
/* —— 选中展开动画 —— */
.panel.expanding { clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%); z-index: 5 }
.panel.expanding::before { opacity: 0 }
.panel { transition: clip-path 0.7s cubic-bezier(0.7, 0, 0.3, 1), filter 0.4s ease }
.reveal {
position: fixed;
top: 50%;
left: 50%;
width: 0;
height: 0;
border-radius: 50%;
transform: translate(-50%, -50%);
z-index: 20;
pointer-events: none;
transition: width 0.8s cubic-bezier(0.65, 0, 0.35, 1), height 0.8s cubic-bezier(0.65, 0, 0.35, 1);
box-shadow: 0 0 100px currentColor;
}
.reveal.active { width: 250vmax; height: 250vmax }
.home-mock {
position: fixed;
inset: 0;
z-index: 30;
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
gap: 16px;
color: #fff;
opacity: 0;
pointer-events: none;
transition: opacity 0.5s ease;
}
.home-mock.show { opacity: 1; pointer-events: auto }
.home-title { font-size: 32px; font-weight: 200; letter-spacing: -0.02em }
.home-sub { font-size: 13px; opacity: 0.7; letter-spacing: 0.2em; text-transform: uppercase }
.reset-hint {
position: fixed;
bottom: 20px;
left: 50%;
transform: translateX(-50%);
color: rgba(255, 255, 255, 0.5);
font-size: 12px;
z-index: 40;
letter-spacing: 0.05em;
}
</style>
</head>
<body>
<div class="stage" id="stage">
<div class="stars"></div>
<div class="panel panel-openclaw" data-engine="openclaw">
<div class="panel-inner">
<div class="badge">通用助理</div>
<div class="logo">
<svg viewBox="0 0 24 24">
<path d="M12 2L2 7l10 5 10-5-10-5z"/>
<path d="M2 17l10 5 10-5"/>
<path d="M2 12l10 5 10-5"/>
</svg>
</div>
<div class="title">OpenClaw</div>
<div class="subtitle">模型管理 · 渠道集成 · 记忆系统 · 智能体编排</div>
</div>
</div>
<div class="panel panel-hermes" data-engine="hermes">
<div class="panel-inner">
<div class="badge">Agent 工作流</div>
<div class="logo">
<svg viewBox="0 0 24 24">
<path d="M13 2L3 14h9l-1 8 10-12h-9l1-8z"/>
</svg>
</div>
<div class="title">Hermes</div>
<div class="subtitle">工具调用 · Profile · Kanban · Skills · OAuth</div>
</div>
</div>
<div class="center-hint">— SELECT —</div>
</div>
<div class="reveal" id="reveal"></div>
<div class="home-mock" id="home">
<div class="home-title" id="home-name"></div>
<div class="home-sub">Loading workspace...</div>
</div>
<div class="reset-hint">点击预览 · 按 R 重置</div>
<script>
const stage = document.getElementById('stage')
const reveal = document.getElementById('reveal')
const home = document.getElementById('home')
const homeName = document.getElementById('home-name')
const colors = {
openclaw: { bg: 'linear-gradient(135deg, #2c1d6b, #4a2585)', glow: 'rgba(110, 80, 220, 0.6)' },
hermes: { bg: 'linear-gradient(315deg, #b85419, #ff8c3a)', glow: 'rgba(255, 130, 60, 0.6)' },
}
document.querySelectorAll('.panel').forEach(panel => {
panel.addEventListener('click', () => {
const engine = panel.dataset.engine
const other = stage.querySelector(`.panel:not([data-engine="${engine}"])`)
panel.classList.add('expanding')
other.style.opacity = '0'
other.style.transition = 'opacity 0.4s'
setTimeout(() => {
reveal.style.background = colors[engine].bg
reveal.style.color = colors[engine].glow
home.style.background = colors[engine].bg
homeName.textContent = engine === 'openclaw' ? 'OpenClaw' : 'Hermes'
reveal.classList.add('active')
}, 600)
setTimeout(() => home.classList.add('show'), 1300)
})
})
document.addEventListener('keydown', (e) => {
if (e.key.toLowerCase() === 'r') location.reload()
})
</script>
</body>
</html>

View File

@@ -0,0 +1,339 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Mockup C — 玻璃拟态 + 粒子(沉浸高级感)</title>
<style>
* { margin: 0; padding: 0; box-sizing: border-box }
html, body { height: 100%; overflow: hidden; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif }
body {
background: #0a0d1a;
}
.stage { position: fixed; inset: 0; overflow: hidden }
/* 动态背景层:色块缓慢移动 */
.bg-aurora {
position: absolute;
inset: -50%;
background:
radial-gradient(circle at 20% 30%, rgba(140, 100, 255, 0.4) 0%, transparent 30%),
radial-gradient(circle at 80% 70%, rgba(255, 140, 60, 0.4) 0%, transparent 30%),
radial-gradient(circle at 50% 50%, rgba(100, 180, 255, 0.2) 0%, transparent 50%);
filter: blur(80px);
animation: drift 20s ease-in-out infinite alternate;
}
@keyframes drift {
0% { transform: translate(0, 0) rotate(0deg) }
100% { transform: translate(-10%, 10%) rotate(8deg) }
}
/* 粒子层 */
.particles {
position: absolute;
inset: 0;
pointer-events: none;
}
.particle {
position: absolute;
width: 3px;
height: 3px;
border-radius: 50%;
background: #fff;
opacity: 0;
animation: float 6s ease-in-out infinite;
}
@keyframes float {
0%, 100% { opacity: 0; transform: translateY(0) scale(0.5) }
50% { opacity: 0.8; transform: translateY(-30px) scale(1) }
}
/* 三角形 panel — 玻璃拟态 */
.panel {
position: absolute;
inset: 0;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
cursor: pointer;
transition: backdrop-filter 0.5s ease;
}
.panel-openclaw {
clip-path: polygon(0 0, 0 100%, 100% 0);
background: rgba(120, 100, 200, 0.08);
backdrop-filter: blur(20px) saturate(1.4);
-webkit-backdrop-filter: blur(20px) saturate(1.4);
}
.panel-hermes {
clip-path: polygon(100% 100%, 0 100%, 100% 0);
background: rgba(255, 140, 80, 0.08);
backdrop-filter: blur(20px) saturate(1.4);
-webkit-backdrop-filter: blur(20px) saturate(1.4);
}
/* 玻璃边缘高光(细线) */
.panel::before {
content: '';
position: absolute;
inset: 0;
background: linear-gradient(45deg, transparent 49.7%, rgba(255, 255, 255, 0.5) 49.9%, rgba(255, 255, 255, 0.9) 50%, rgba(255, 255, 255, 0.5) 50.1%, transparent 50.3%);
pointer-events: none;
}
/* 内容定位 */
.panel-inner {
display: flex;
flex-direction: column;
align-items: center;
gap: 24px;
text-align: center;
color: #fff;
transition: transform 0.6s cubic-bezier(0.34, 1.56, 0.64, 1), letter-spacing 0.6s ease;
z-index: 2;
}
.panel-openclaw .panel-inner { margin-top: -100px; margin-left: -160px }
.panel-hermes .panel-inner { margin-bottom: -100px; margin-right: -160px }
/* hover内容浮起 + 字距张开 */
.panel:hover { backdrop-filter: blur(25px) saturate(1.8) brightness(1.1) }
.panel:hover .panel-inner { transform: scale(1.05) translateY(-4px) }
.panel:hover .title { letter-spacing: 0em }
.panel:hover .glass-card { box-shadow: 0 20px 60px rgba(0, 0, 0, 0.4), inset 0 0 0 1px rgba(255, 255, 255, 0.3) }
/* 玻璃卡片 — logo 容器 */
.glass-card {
width: 110px;
height: 110px;
display: grid;
place-items: center;
border-radius: 24px;
background: rgba(255, 255, 255, 0.1);
backdrop-filter: blur(20px);
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.3), inset 0 0 0 1px rgba(255, 255, 255, 0.18);
transition: box-shadow 0.5s ease, transform 0.5s ease;
}
.panel:hover .glass-card { transform: rotate(-4deg) scale(1.05) }
.glass-card svg { width: 56px; height: 56px; stroke: #fff; fill: none; stroke-width: 1.5 }
.label {
font-size: 11px;
text-transform: uppercase;
letter-spacing: 0.3em;
opacity: 0.7;
font-weight: 300;
}
.title {
font-size: 60px;
font-weight: 200;
letter-spacing: -0.02em;
line-height: 1;
background: linear-gradient(180deg, #fff 0%, rgba(255, 255, 255, 0.7) 100%);
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent;
transition: letter-spacing 0.6s ease;
}
.subtitle {
font-size: 13px;
opacity: 0.8;
max-width: 280px;
line-height: 1.7;
font-weight: 300;
}
.features {
display: flex;
gap: 14px;
margin-top: 4px;
}
.feature-pill {
font-size: 10px;
padding: 4px 10px;
border: 1px solid rgba(255, 255, 255, 0.2);
border-radius: 12px;
backdrop-filter: blur(10px);
background: rgba(255, 255, 255, 0.05);
letter-spacing: 0.05em;
}
/* 中央分割线提示 */
.divider-hint {
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%) rotate(-45deg);
color: rgba(255, 255, 255, 0.4);
font-size: 10px;
letter-spacing: 0.4em;
pointer-events: none;
z-index: 10;
text-transform: uppercase;
font-weight: 300;
}
/* —— 选中展开动画 —— */
.panel.expanding { clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%); z-index: 5 }
.panel.expanding::before { opacity: 0 }
.panel { transition: clip-path 0.8s cubic-bezier(0.7, 0, 0.3, 1), backdrop-filter 0.5s ease }
/* 反向 reveal: 中心圆向外扩散 */
.reveal {
position: fixed;
top: 50%;
left: 50%;
width: 0;
height: 0;
border-radius: 50%;
transform: translate(-50%, -50%);
z-index: 20;
pointer-events: none;
transition: width 0.9s cubic-bezier(0.65, 0, 0.35, 1), height 0.9s cubic-bezier(0.65, 0, 0.35, 1);
}
.reveal.active { width: 250vmax; height: 250vmax }
.home-mock {
position: fixed;
inset: 0;
z-index: 30;
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
gap: 20px;
opacity: 0;
pointer-events: none;
transition: opacity 0.6s ease;
}
.home-mock.show { opacity: 1; pointer-events: auto }
.home-card {
background: rgba(255, 255, 255, 0.08);
backdrop-filter: blur(30px);
border: 1px solid rgba(255, 255, 255, 0.15);
border-radius: 24px;
padding: 40px 60px;
color: #fff;
text-align: center;
box-shadow: 0 20px 80px rgba(0, 0, 0, 0.5);
}
.home-card .ht { font-size: 28px; font-weight: 200; margin-bottom: 8px }
.home-card .hs { font-size: 12px; opacity: 0.6; letter-spacing: 0.2em; text-transform: uppercase }
.reset-hint {
position: fixed;
bottom: 24px;
left: 50%;
transform: translateX(-50%);
color: rgba(255, 255, 255, 0.5);
font-size: 12px;
z-index: 40;
letter-spacing: 0.08em;
}
</style>
</head>
<body>
<div class="stage" id="stage">
<div class="bg-aurora"></div>
<div class="particles" id="particles"></div>
<div class="panel panel-openclaw" data-engine="openclaw">
<div class="panel-inner">
<div class="label">通用助理</div>
<div class="glass-card">
<svg viewBox="0 0 24 24">
<path d="M12 2L2 7l10 5 10-5-10-5z"/>
<path d="M2 17l10 5 10-5"/>
<path d="M2 12l10 5 10-5"/>
</svg>
</div>
<div class="title">OpenClaw</div>
<div class="subtitle">模型管理 · 渠道集成 · 记忆系统 · 智能体编排</div>
<div class="features">
<div class="feature-pill">Models</div>
<div class="feature-pill">Channels</div>
<div class="feature-pill">Memory</div>
</div>
</div>
</div>
<div class="panel panel-hermes" data-engine="hermes">
<div class="panel-inner">
<div class="label">Agent 工作流</div>
<div class="glass-card">
<svg viewBox="0 0 24 24">
<path d="M13 2L3 14h9l-1 8 10-12h-9l1-8z"/>
</svg>
</div>
<div class="title">Hermes</div>
<div class="subtitle">工具调用 · Kanban · Skills · OAuth · Multi Profile</div>
<div class="features">
<div class="feature-pill">Tools</div>
<div class="feature-pill">Skills</div>
<div class="feature-pill">Profiles</div>
</div>
</div>
</div>
<div class="divider-hint">CHOOSE YOUR PATH</div>
</div>
<div class="reveal" id="reveal"></div>
<div class="home-mock" id="home">
<div class="home-card">
<div class="ht" id="home-name"></div>
<div class="hs">Loading workspace…</div>
</div>
</div>
<div class="reset-hint">点击预览 · 按 R 重置</div>
<script>
// 生成粒子
const pc = document.getElementById('particles')
for (let i = 0; i < 40; i++) {
const p = document.createElement('div')
p.className = 'particle'
p.style.left = Math.random() * 100 + '%'
p.style.top = Math.random() * 100 + '%'
p.style.animationDelay = (Math.random() * 6) + 's'
p.style.animationDuration = (4 + Math.random() * 6) + 's'
pc.appendChild(p)
}
const stage = document.getElementById('stage')
const reveal = document.getElementById('reveal')
const home = document.getElementById('home')
const homeName = document.getElementById('home-name')
const colors = {
openclaw: 'radial-gradient(circle at center, rgba(140, 100, 255, 0.5), #1a1530)',
hermes: 'radial-gradient(circle at center, rgba(255, 140, 60, 0.5), #2a1a10)',
}
document.querySelectorAll('.panel').forEach(panel => {
panel.addEventListener('click', () => {
const engine = panel.dataset.engine
const other = stage.querySelector(`.panel:not([data-engine="${engine}"])`)
panel.classList.add('expanding')
other.style.opacity = '0'
other.style.transition = 'opacity 0.5s'
setTimeout(() => {
reveal.style.background = colors[engine]
home.style.background = colors[engine]
homeName.textContent = engine === 'openclaw' ? 'OpenClaw' : 'Hermes'
reveal.classList.add('active')
}, 700)
setTimeout(() => home.classList.add('show'), 1500)
})
})
document.addEventListener('keydown', (e) => {
if (e.key.toLowerCase() === 'r') location.reload()
})
</script>
</body>
</html>

View File

@@ -0,0 +1,395 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>V2-D · Aurora — 极光大字Stripe / Apple 风)</title>
<style>
* { margin: 0; padding: 0; box-sizing: border-box }
html, body { height: 100%; overflow: hidden; font-family: 'Inter', -apple-system, system-ui, sans-serif; background: #050608; -webkit-font-smoothing: antialiased }
.stage { position: fixed; inset: 0 }
/* 全屏极光背景(永远在最底) */
.aurora-bg {
position: absolute;
inset: -20%;
background:
radial-gradient(ellipse 50% 40% at 22% 28%, rgba(110, 110, 255, 0.55) 0%, transparent 70%),
radial-gradient(ellipse 45% 35% at 78% 72%, rgba(255, 130, 80, 0.55) 0%, transparent 70%),
radial-gradient(circle at 50% 50%, rgba(60, 80, 180, 0.3) 0%, transparent 50%);
filter: blur(50px);
animation: aurora-drift 18s ease-in-out infinite alternate;
}
@keyframes aurora-drift {
0% { transform: translate(0, 0) rotate(0deg) scale(1) }
50% { transform: translate(2%, -2%) rotate(2deg) scale(1.05) }
100% { transform: translate(-3%, 3%) rotate(-2deg) scale(1.02) }
}
/* 噪声纹理(增加质感) */
.noise {
position: absolute;
inset: 0;
opacity: 0.4;
pointer-events: none;
background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix values='0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0.18 0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
mix-blend-mode: overlay;
}
/* 三角形(玻璃覆盖层)— 不再用纯色,而是给玻璃质感 */
.panel-openclaw {
position: absolute;
inset: 0;
clip-path: polygon(0 0, 0 100%, 100% 0);
cursor: pointer;
background: linear-gradient(135deg, rgba(20, 25, 60, 0.5), rgba(10, 12, 30, 0.85));
backdrop-filter: blur(30px) saturate(1.4);
-webkit-backdrop-filter: blur(30px) saturate(1.4);
transition: backdrop-filter 0.6s ease, background 0.6s ease;
}
.panel-hermes {
position: absolute;
inset: 0;
clip-path: polygon(100% 0, 100% 100%, 0 100%);
cursor: pointer;
background: linear-gradient(315deg, rgba(60, 25, 15, 0.5), rgba(30, 12, 8, 0.85));
backdrop-filter: blur(30px) saturate(1.4);
-webkit-backdrop-filter: blur(30px) saturate(1.4);
transition: backdrop-filter 0.6s ease, background 0.6s ease;
}
/* 中线发光(更细致) */
.divider {
position: absolute;
inset: 0;
background: linear-gradient(45deg,
transparent 49.6%,
rgba(255, 255, 255, 0.15) 49.8%,
rgba(255, 255, 255, 0.85) 49.97%,
rgba(255, 255, 255, 1) 50%,
rgba(255, 255, 255, 0.85) 50.03%,
rgba(255, 255, 255, 0.15) 50.2%,
transparent 50.4%
);
pointer-events: none;
filter: drop-shadow(0 0 16px rgba(255, 255, 255, 0.5));
transition: opacity 0.6s;
}
/* 内容定位 */
.content {
position: absolute;
pointer-events: none;
color: #fff;
transition: transform 0.7s cubic-bezier(0.22, 1, 0.36, 1), opacity 0.5s, filter 0.5s;
z-index: 5;
}
.content-openclaw {
top: 11%;
left: 6%;
text-align: left;
max-width: 44vw;
}
.content-hermes {
bottom: 11%;
right: 6%;
text-align: right;
max-width: 44vw;
}
/* hover 联动 */
.stage:has(.panel-openclaw:hover) .panel-hermes,
.stage:has(.panel-hermes:hover) .panel-openclaw {
backdrop-filter: blur(50px) saturate(0.5) brightness(0.5);
}
.stage:has(.panel-openclaw:hover) .content-hermes,
.stage:has(.panel-hermes:hover) .content-openclaw {
opacity: 0.2;
filter: blur(3px);
transform: scale(0.98);
}
.stage:has(.panel-openclaw:hover) .panel-openclaw {
backdrop-filter: blur(20px) saturate(1.6) brightness(1.15);
}
.stage:has(.panel-hermes:hover) .panel-hermes {
backdrop-filter: blur(20px) saturate(1.6) brightness(1.15);
}
.stage:has(.panel-openclaw:hover) .content-openclaw,
.stage:has(.panel-hermes:hover) .content-hermes {
transform: scale(1.04);
}
/* 字母 */
.number-tag {
display: inline-flex;
align-items: center;
gap: 14px;
margin-bottom: 32px;
font-size: 12px;
font-weight: 500;
letter-spacing: 0.4em;
text-transform: uppercase;
color: rgba(255, 255, 255, 0.6);
}
.number-tag::before {
content: '';
width: 60px;
height: 1px;
background: rgba(255, 255, 255, 0.4);
}
.content-hermes .number-tag { flex-direction: row-reverse }
.content-hermes .number-tag::before { display: none }
.content-hermes .number-tag::after {
content: '';
width: 60px;
height: 1px;
background: rgba(255, 255, 255, 0.4);
}
/* 巨字 + 渐变 */
.title {
font-size: clamp(80px, 13vw, 200px);
font-weight: 100;
letter-spacing: -0.06em;
line-height: 0.88;
margin-bottom: 28px;
background: linear-gradient(180deg, #fff 25%, rgba(255, 255, 255, 0.45) 100%);
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent;
}
/* 副标题 */
.tagline {
font-size: clamp(20px, 1.7vw, 26px);
line-height: 1.5;
font-weight: 300;
max-width: 520px;
margin-bottom: 36px;
opacity: 0.82;
letter-spacing: -0.005em;
}
.content-hermes .tagline { margin-left: auto }
/* 玻璃 chips */
.chips {
display: flex;
gap: 10px;
margin-bottom: 48px;
flex-wrap: wrap;
}
.content-hermes .chips { justify-content: flex-end }
.chip {
padding: 10px 18px;
font-size: 13px;
font-weight: 400;
letter-spacing: 0.02em;
border: 1px solid rgba(255, 255, 255, 0.16);
border-radius: 100px;
backdrop-filter: blur(15px);
-webkit-backdrop-filter: blur(15px);
background: rgba(255, 255, 255, 0.06);
color: rgba(255, 255, 255, 0.9);
}
/* CTA */
.cta {
display: inline-flex;
align-items: center;
gap: 14px;
padding: 16px 28px;
border-radius: 100px;
font-size: 14px;
font-weight: 500;
letter-spacing: 0.05em;
background: rgba(255, 255, 255, 0.1);
border: 1px solid rgba(255, 255, 255, 0.25);
backdrop-filter: blur(15px);
color: #fff;
transition: all 0.4s ease;
}
.stage:has(.panel-openclaw:hover) .content-openclaw .cta,
.stage:has(.panel-hermes:hover) .content-hermes .cta {
background: rgba(255, 255, 255, 0.95);
color: #0a0a0a;
border-color: rgba(255, 255, 255, 1);
}
.content-hermes .cta { flex-direction: row-reverse }
.cta .arrow { font-size: 16px; transition: transform 0.3s }
.stage:has(.panel-openclaw:hover) .content-openclaw .cta .arrow { transform: translateX(4px) }
.stage:has(.panel-hermes:hover) .content-hermes .cta .arrow { transform: translateX(-4px) }
/* 顶部 banner + 角标 */
.top-banner {
position: fixed;
top: 32px;
left: 50%;
transform: translateX(-50%);
color: rgba(255, 255, 255, 0.55);
font-size: 11px;
letter-spacing: 0.45em;
text-transform: uppercase;
z-index: 5;
pointer-events: none;
font-weight: 500;
}
.corner-mark {
position: absolute;
font-size: 11px;
letter-spacing: 0.32em;
text-transform: uppercase;
color: rgba(255, 255, 255, 0.35);
pointer-events: none;
z-index: 5;
font-weight: 500;
}
.corner-tl { top: 32px; left: 36px }
.corner-br { bottom: 32px; right: 36px }
/* —— 选中展开动画 —— */
.panel.expanding { clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%); z-index: 6 }
.panel { transition: clip-path 0.8s cubic-bezier(0.7, 0, 0.3, 1), backdrop-filter 0.6s, background 0.6s }
.reveal {
position: fixed;
top: 50%;
left: 50%;
width: 0;
height: 0;
border-radius: 50%;
transform: translate(-50%, -50%);
z-index: 20;
pointer-events: none;
transition: width 0.9s cubic-bezier(0.65, 0, 0.35, 1), height 0.9s cubic-bezier(0.65, 0, 0.35, 1);
}
.reveal.active { width: 260vmax; height: 260vmax }
.home-mock {
position: fixed;
inset: 0;
z-index: 30;
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
gap: 14px;
color: #fff;
opacity: 0;
pointer-events: none;
transition: opacity 0.6s ease;
}
.home-mock.show { opacity: 1; pointer-events: auto }
.home-mock .ht {
font-size: 64px;
font-weight: 100;
letter-spacing: -0.04em;
background: linear-gradient(180deg, #fff, rgba(255, 255, 255, 0.55));
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent;
}
.home-mock .hs { font-size: 12px; letter-spacing: 0.45em; text-transform: uppercase; opacity: 0.5 }
.reset-hint {
position: fixed;
bottom: 24px;
left: 50%;
transform: translateX(-50%);
color: rgba(255, 255, 255, 0.4);
font-size: 11px;
letter-spacing: 0.2em;
text-transform: uppercase;
z-index: 40;
pointer-events: none;
}
</style>
</head>
<body>
<div class="stage" id="stage">
<div class="aurora-bg"></div>
<div class="noise"></div>
<div class="panel panel-openclaw" data-engine="openclaw"></div>
<div class="panel panel-hermes" data-engine="hermes"></div>
<div class="divider"></div>
<div class="top-banner">— Choose your engine —</div>
<div class="corner-mark corner-tl">CLAWPANEL</div>
<div class="corner-mark corner-br">v0.15.3</div>
<div class="content content-openclaw">
<div class="number-tag">01 · Universal Assistant</div>
<div class="title">OpenClaw</div>
<div class="tagline">从模型到智能体,一站式打造你的 AI 工作台。</div>
<div class="chips">
<div class="chip">Models</div>
<div class="chip">Channels</div>
<div class="chip">Memory</div>
<div class="chip">Agents</div>
</div>
<div class="cta">
Enter OpenClaw
<span class="arrow"></span>
</div>
</div>
<div class="content content-hermes">
<div class="number-tag">Agent Workflow · 02</div>
<div class="title">Hermes</div>
<div class="tagline">让 Agent 真正能干活。工具调用、Profile、Kanban 一应俱全。</div>
<div class="chips">
<div class="chip">Tools</div>
<div class="chip">Skills</div>
<div class="chip">Kanban</div>
<div class="chip">Profiles</div>
</div>
<div class="cta">
<span class="arrow"></span>
Enter Hermes
</div>
</div>
</div>
<div class="reveal" id="reveal"></div>
<div class="home-mock" id="home">
<div class="ht" id="home-name"></div>
<div class="hs">Initializing workspace</div>
</div>
<div class="reset-hint">Click a side · Press R to reset</div>
<script>
const stage = document.getElementById('stage')
const reveal = document.getElementById('reveal')
const home = document.getElementById('home')
const homeName = document.getElementById('home-name')
const colors = {
openclaw: 'radial-gradient(circle at center, rgba(110, 110, 255, 0.5) 0%, #0a0c20 70%)',
hermes: 'radial-gradient(circle at center, rgba(255, 130, 80, 0.5) 0%, #2a1208 70%)',
}
document.querySelectorAll('.panel').forEach(panel => {
panel.addEventListener('click', () => {
const engine = panel.dataset.engine
const other = stage.querySelector(`.panel:not([data-engine="${engine}"])`)
panel.classList.add('expanding')
other.style.opacity = '0'
stage.querySelectorAll('.content, .corner-mark, .top-banner').forEach(c => c.style.opacity = '0')
stage.querySelector('.divider').style.opacity = '0'
setTimeout(() => {
reveal.style.background = colors[engine]
home.style.background = colors[engine]
homeName.textContent = engine === 'openclaw' ? 'OpenClaw' : 'Hermes'
reveal.classList.add('active')
}, 700)
setTimeout(() => home.classList.add('show'), 1500)
})
})
document.addEventListener('keydown', (e) => {
if (e.key.toLowerCase() === 'r') location.reload()
})
</script>
</body>
</html>

View File

@@ -0,0 +1,284 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>V2-A · Bold Split — 黑白巨字</title>
<style>
* { margin: 0; padding: 0; box-sizing: border-box }
html, body { height: 100%; overflow: hidden; font-family: 'Inter', -apple-system, system-ui, sans-serif; -webkit-font-smoothing: antialiased }
.stage {
position: fixed;
inset: 0;
background: #fff;
}
/* 左上三角(黑) */
.panel-openclaw {
position: absolute;
inset: 0;
clip-path: polygon(0 0, 0 100%, 100% 0);
background: #0a0a0a;
cursor: pointer;
transition: filter 0.5s ease;
}
/* 右下三角(白)— 不需要单独 panelbody 是白底 */
.panel-hermes {
position: absolute;
inset: 0;
clip-path: polygon(100% 0, 100% 100%, 0 100%);
background: #fff;
cursor: pointer;
transition: filter 0.5s ease;
}
/* 中线(细灰线) */
.divider {
position: absolute;
inset: 0;
background: linear-gradient(45deg, transparent calc(50% - 1px), #e5e5e5 50%, transparent calc(50% + 1px));
pointer-events: none;
}
/* 内容容器absolute 定位,各自放在对角线的"远端"重心 */
.content {
position: absolute;
pointer-events: none;
transition: transform 0.6s cubic-bezier(0.34, 1.56, 0.64, 1), opacity 0.4s ease;
}
.content-openclaw {
top: 14%;
left: 8%;
color: #f5f5f5;
text-align: left;
}
.content-hermes {
bottom: 14%;
right: 8%;
color: #0a0a0a;
text-align: right;
}
/* hover 该三角形 → 内容浮起 + 字距拉开 + 另一侧变暗 */
.panel-openclaw:hover ~ .divider + .content-openclaw,
.panel-openclaw:hover + .content-openclaw {
transform: scale(1.04);
}
.panel-hermes:hover ~ .content-hermes {
transform: scale(1.04);
}
/* 悬停联动(用 :has 选择器,新浏览器都支持) */
.stage:has(.panel-openclaw:hover) .content-hermes { opacity: 0.35 }
.stage:has(.panel-hermes:hover) .content-openclaw { opacity: 0.35 }
.stage:has(.panel-openclaw:hover) .panel-openclaw { filter: brightness(1.15) }
.stage:has(.panel-hermes:hover) .panel-hermes { filter: brightness(0.97) }
/* —— 内容样式 —— */
.eyebrow {
font-size: 11px;
font-weight: 500;
letter-spacing: 0.32em;
text-transform: uppercase;
opacity: 0.55;
margin-bottom: 24px;
display: flex;
align-items: center;
gap: 12px;
}
.eyebrow::before {
content: '';
width: 32px;
height: 1px;
background: currentColor;
opacity: 0.4;
}
.content-hermes .eyebrow { flex-direction: row-reverse }
.content-hermes .eyebrow::before { display: none }
.content-hermes .eyebrow::after {
content: '';
width: 32px;
height: 1px;
background: currentColor;
opacity: 0.4;
}
.title {
font-size: clamp(80px, 12vw, 180px);
font-weight: 200;
letter-spacing: -0.06em;
line-height: 0.9;
margin-bottom: 24px;
transition: letter-spacing 0.5s ease;
}
.desc {
font-size: 16px;
line-height: 1.7;
max-width: 380px;
opacity: 0.7;
font-weight: 300;
margin-bottom: 32px;
}
.content-hermes .desc { margin-left: auto }
.meta {
display: flex;
gap: 24px;
font-size: 12px;
letter-spacing: 0.15em;
text-transform: uppercase;
opacity: 0.5;
}
.content-hermes .meta { justify-content: flex-end }
/* CTA 大箭头 */
.cta {
margin-top: 48px;
display: inline-flex;
align-items: center;
gap: 12px;
font-size: 14px;
letter-spacing: 0.1em;
text-transform: uppercase;
font-weight: 500;
opacity: 0.85;
transition: opacity 0.3s, gap 0.3s;
}
.stage:has(.panel-openclaw:hover) .content-openclaw .cta { opacity: 1; gap: 18px }
.stage:has(.panel-hermes:hover) .content-hermes .cta { opacity: 1; gap: 18px }
.cta-arrow {
width: 28px;
height: 28px;
border-radius: 50%;
border: 1.5px solid currentColor;
display: grid;
place-items: center;
font-size: 14px;
}
/* —— 选中展开动画 —— */
.panel.expanding { clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%); z-index: 5 }
.panel-openclaw.expanding, .panel-hermes.expanding { transition: clip-path 0.7s cubic-bezier(0.7, 0, 0.3, 1) }
.reveal {
position: fixed;
top: 50%;
left: 50%;
width: 0;
height: 0;
border-radius: 50%;
transform: translate(-50%, -50%);
z-index: 20;
pointer-events: none;
transition: width 0.8s cubic-bezier(0.65, 0, 0.35, 1), height 0.8s cubic-bezier(0.65, 0, 0.35, 1);
}
.reveal.active { width: 250vmax; height: 250vmax }
.home-mock {
position: fixed;
inset: 0;
z-index: 30;
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
gap: 8px;
opacity: 0;
pointer-events: none;
transition: opacity 0.5s ease;
}
.home-mock.show { opacity: 1; pointer-events: auto }
.home-mock .ht { font-size: 36px; font-weight: 200; letter-spacing: -0.02em }
.home-mock .hs { font-size: 12px; letter-spacing: 0.3em; text-transform: uppercase; opacity: 0.55 }
.reset-hint {
position: fixed;
bottom: 20px;
left: 50%;
transform: translateX(-50%);
color: rgba(128, 128, 128, 0.6);
font-size: 11px;
letter-spacing: 0.18em;
text-transform: uppercase;
z-index: 40;
pointer-events: none;
}
</style>
</head>
<body>
<div class="stage" id="stage">
<div class="panel panel-openclaw" data-engine="openclaw"></div>
<div class="panel panel-hermes" data-engine="hermes"></div>
<div class="divider"></div>
<div class="content content-openclaw">
<div class="eyebrow">01 · 通用助理</div>
<div class="title">OpenClaw</div>
<div class="desc">通用 AI 助理平台。模型、渠道、记忆、智能体,一个面板搞定全部。</div>
<div class="meta">
<span>Models</span>
<span>Channels</span>
<span>Agents</span>
</div>
<div class="cta">
Choose
<span class="cta-arrow"></span>
</div>
</div>
<div class="content content-hermes">
<div class="eyebrow">02 · Agent 工作流</div>
<div class="title">Hermes</div>
<div class="desc">Agent 工作流引擎。工具调用、Profile、Kanban、Skills让 Agent 真正能干活。</div>
<div class="meta">
<span>Tools</span>
<span>Skills</span>
<span>Profiles</span>
</div>
<div class="cta">
<span class="cta-arrow"></span>
Choose
</div>
</div>
</div>
<div class="reveal" id="reveal"></div>
<div class="home-mock" id="home">
<div class="ht" id="home-name"></div>
<div class="hs">Loading workspace…</div>
</div>
<div class="reset-hint">Click a side · Press R to reset</div>
<script>
const stage = document.getElementById('stage')
const reveal = document.getElementById('reveal')
const home = document.getElementById('home')
const homeName = document.getElementById('home-name')
document.querySelectorAll('.panel').forEach(panel => {
panel.addEventListener('click', () => {
const engine = panel.dataset.engine
const other = stage.querySelector(`.panel:not([data-engine="${engine}"])`)
panel.classList.add('expanding')
other.style.opacity = '0'
stage.querySelectorAll('.content').forEach(c => c.style.opacity = '0')
stage.querySelector('.divider').style.opacity = '0'
setTimeout(() => {
const isOpenclaw = engine === 'openclaw'
reveal.style.background = isOpenclaw ? '#0a0a0a' : '#fff'
home.style.background = isOpenclaw ? '#0a0a0a' : '#fff'
home.style.color = isOpenclaw ? '#fff' : '#000'
homeName.textContent = isOpenclaw ? 'OpenClaw' : 'Hermes'
reveal.classList.add('active')
}, 600)
setTimeout(() => home.classList.add('show'), 1300)
})
})
document.addEventListener('keydown', (e) => {
if (e.key.toLowerCase() === 'r') location.reload()
})
</script>
</body>
</html>

View File

@@ -0,0 +1,366 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>V2-B · Cinematic — 电影级双世界</title>
<style>
* { margin: 0; padding: 0; box-sizing: border-box }
html, body { height: 100%; overflow: hidden; font-family: 'Inter', -apple-system, system-ui, sans-serif; -webkit-font-smoothing: antialiased; background: #000 }
.stage { position: fixed; inset: 0 }
/* 左上三角:深蓝紫世界 */
.panel-openclaw {
position: absolute;
inset: 0;
clip-path: polygon(0 0, 0 100%, 100% 0);
cursor: pointer;
transition: filter 0.6s ease;
background:
radial-gradient(circle at 25% 35%, rgba(120, 90, 255, 0.5) 0%, transparent 45%),
radial-gradient(circle at 5% 95%, rgba(50, 30, 120, 0.6) 0%, transparent 50%),
linear-gradient(135deg, #1a1340 0%, #0d0828 100%);
}
/* 右下三角:暖橙琥珀世界 */
.panel-hermes {
position: absolute;
inset: 0;
clip-path: polygon(100% 0, 100% 100%, 0 100%);
cursor: pointer;
transition: filter 0.6s ease;
background:
radial-gradient(circle at 75% 65%, rgba(255, 130, 50, 0.45) 0%, transparent 45%),
radial-gradient(circle at 95% 5%, rgba(120, 50, 20, 0.6) 0%, transparent 50%),
linear-gradient(315deg, #2a1208 0%, #4a1f0a 100%);
}
/* 中线发光 */
.divider {
position: absolute;
inset: 0;
background: linear-gradient(45deg,
transparent 49.5%,
rgba(255, 255, 255, 0.3) 49.7%,
rgba(255, 255, 255, 0.85) 49.95%,
rgba(255, 255, 255, 1) 50%,
rgba(255, 255, 255, 0.85) 50.05%,
rgba(255, 255, 255, 0.3) 50.3%,
transparent 50.5%
);
pointer-events: none;
filter: drop-shadow(0 0 12px rgba(255, 255, 255, 0.4));
transition: opacity 0.6s ease;
}
/* 内容容器 — absolute 定位到三角形重心 */
.content {
position: absolute;
pointer-events: none;
color: #fff;
transition: transform 0.6s cubic-bezier(0.22, 1, 0.36, 1), opacity 0.5s ease, filter 0.5s ease;
z-index: 3;
}
.content-openclaw {
top: 12%;
left: 6%;
text-align: left;
max-width: 42vw;
}
.content-hermes {
bottom: 12%;
right: 6%;
text-align: right;
max-width: 42vw;
}
/* —— hover 联动效果 —— */
.stage:has(.panel-openclaw:hover) .content-hermes,
.stage:has(.panel-hermes:hover) .content-openclaw {
opacity: 0.3;
filter: blur(2px);
}
.stage:has(.panel-openclaw:hover) .panel-hermes,
.stage:has(.panel-hermes:hover) .panel-openclaw {
filter: brightness(0.5) saturate(0.6);
}
.stage:has(.panel-openclaw:hover) .content-openclaw,
.stage:has(.panel-hermes:hover) .content-hermes {
transform: scale(1.05);
}
/* 序号 */
.number {
font-size: 13px;
font-weight: 500;
letter-spacing: 0.4em;
opacity: 0.5;
margin-bottom: 32px;
display: inline-flex;
align-items: center;
gap: 14px;
}
.number::before {
content: '';
width: 60px;
height: 1px;
background: currentColor;
opacity: 0.5;
}
.content-hermes .number { flex-direction: row-reverse }
.content-hermes .number::before { display: none }
.content-hermes .number::after {
content: '';
width: 60px;
height: 1px;
background: currentColor;
opacity: 0.5;
}
/* 巨大产品名 */
.title {
font-size: clamp(72px, 11vw, 168px);
font-weight: 100;
letter-spacing: -0.05em;
line-height: 0.88;
margin-bottom: 28px;
background: linear-gradient(180deg, #fff 30%, rgba(255, 255, 255, 0.55) 100%);
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent;
color: transparent;
}
/* tagline 句子 */
.tagline {
font-size: clamp(18px, 1.6vw, 24px);
line-height: 1.55;
font-weight: 300;
max-width: 460px;
margin-bottom: 36px;
opacity: 0.85;
}
.content-hermes .tagline { margin-left: auto }
/* 特性 chips */
.chips {
display: flex;
gap: 10px;
margin-bottom: 48px;
flex-wrap: wrap;
}
.content-hermes .chips { justify-content: flex-end }
.chip {
padding: 8px 16px;
font-size: 12px;
font-weight: 400;
letter-spacing: 0.05em;
border: 1px solid rgba(255, 255, 255, 0.18);
border-radius: 100px;
backdrop-filter: blur(10px);
background: rgba(255, 255, 255, 0.04);
}
/* CTA */
.cta {
display: inline-flex;
align-items: center;
gap: 16px;
padding: 14px 32px 14px 24px;
border-radius: 100px;
border: 1.5px solid rgba(255, 255, 255, 0.4);
font-size: 13px;
font-weight: 500;
letter-spacing: 0.18em;
text-transform: uppercase;
backdrop-filter: blur(10px);
background: rgba(255, 255, 255, 0.05);
transition: all 0.4s ease;
pointer-events: none;
}
.stage:has(.panel-openclaw:hover) .content-openclaw .cta,
.stage:has(.panel-hermes:hover) .content-hermes .cta {
background: rgba(255, 255, 255, 0.95);
color: #0a0a0a;
border-color: rgba(255, 255, 255, 1);
transform: translateX(8px);
}
.content-hermes .cta { flex-direction: row-reverse; padding: 14px 24px 14px 32px }
.stage:has(.panel-hermes:hover) .content-hermes .cta { transform: translateX(-8px) }
.cta .arrow {
font-size: 16px;
transition: transform 0.3s;
}
/* 装饰:右上角的小品牌字母(每个三角形对角的另一边的角) */
.corner-mark {
position: absolute;
font-size: 11px;
letter-spacing: 0.4em;
color: rgba(255, 255, 255, 0.35);
text-transform: uppercase;
pointer-events: none;
z-index: 2;
}
.corner-tl { top: 32px; left: 36px }
.corner-br { bottom: 32px; right: 36px }
/* 主标题 */
.top-banner {
position: fixed;
top: 32px;
left: 50%;
transform: translateX(-50%);
color: rgba(255, 255, 255, 0.45);
font-size: 11px;
letter-spacing: 0.4em;
text-transform: uppercase;
z-index: 5;
pointer-events: none;
font-weight: 500;
}
/* —— 选中展开动画 —— */
.panel.expanding { clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%); z-index: 5 }
.panel { transition: clip-path 0.8s cubic-bezier(0.7, 0, 0.3, 1), filter 0.5s ease }
.reveal {
position: fixed;
top: 50%;
left: 50%;
width: 0;
height: 0;
border-radius: 50%;
transform: translate(-50%, -50%);
z-index: 20;
pointer-events: none;
transition: width 0.9s cubic-bezier(0.65, 0, 0.35, 1), height 0.9s cubic-bezier(0.65, 0, 0.35, 1);
}
.reveal.active { width: 260vmax; height: 260vmax }
.home-mock {
position: fixed;
inset: 0;
z-index: 30;
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
gap: 12px;
color: #fff;
opacity: 0;
pointer-events: none;
transition: opacity 0.6s ease;
}
.home-mock.show { opacity: 1; pointer-events: auto }
.home-mock .ht {
font-size: 56px;
font-weight: 100;
letter-spacing: -0.04em;
background: linear-gradient(180deg, #fff, rgba(255, 255, 255, 0.6));
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent;
}
.home-mock .hs { font-size: 12px; letter-spacing: 0.4em; text-transform: uppercase; opacity: 0.5 }
.reset-hint {
position: fixed;
bottom: 24px;
left: 50%;
transform: translateX(-50%);
color: rgba(255, 255, 255, 0.45);
font-size: 11px;
letter-spacing: 0.2em;
text-transform: uppercase;
z-index: 40;
pointer-events: none;
}
</style>
</head>
<body>
<div class="stage" id="stage">
<div class="panel panel-openclaw" data-engine="openclaw"></div>
<div class="panel panel-hermes" data-engine="hermes"></div>
<div class="divider"></div>
<div class="top-banner">— Choose your engine —</div>
<div class="corner-mark corner-tl">CLAWPANEL · 2026</div>
<div class="corner-mark corner-br">v0.15.3</div>
<div class="content content-openclaw">
<div class="number">01</div>
<div class="title">OpenClaw</div>
<div class="tagline">通用 AI 助理平台。模型、渠道、记忆、智能体——一个面板搞定全部。</div>
<div class="chips">
<div class="chip">Models</div>
<div class="chip">Channels</div>
<div class="chip">Memory</div>
<div class="chip">Agents</div>
</div>
<div class="cta">
Enter OpenClaw
<span class="arrow"></span>
</div>
</div>
<div class="content content-hermes">
<div class="number">02</div>
<div class="title">Hermes</div>
<div class="tagline">Agent 工作流引擎。工具调用、Profile、Kanban、Skills——让 AI 真正能干活。</div>
<div class="chips">
<div class="chip">Tools</div>
<div class="chip">Skills</div>
<div class="chip">Kanban</div>
<div class="chip">Profiles</div>
</div>
<div class="cta">
<span class="arrow"></span>
Enter Hermes
</div>
</div>
</div>
<div class="reveal" id="reveal"></div>
<div class="home-mock" id="home">
<div class="ht" id="home-name"></div>
<div class="hs">Initializing workspace…</div>
</div>
<div class="reset-hint">Click a side · Press R to reset</div>
<script>
const stage = document.getElementById('stage')
const reveal = document.getElementById('reveal')
const home = document.getElementById('home')
const homeName = document.getElementById('home-name')
const colors = {
openclaw: 'radial-gradient(circle at center, rgba(120, 90, 255, 0.4) 0%, #0d0828 70%)',
hermes: 'radial-gradient(circle at center, rgba(255, 130, 50, 0.4) 0%, #2a1208 70%)',
}
document.querySelectorAll('.panel').forEach(panel => {
panel.addEventListener('click', () => {
const engine = panel.dataset.engine
const other = stage.querySelector(`.panel:not([data-engine="${engine}"])`)
panel.classList.add('expanding')
other.style.opacity = '0'
stage.querySelectorAll('.content, .corner-mark, .top-banner').forEach(c => c.style.opacity = '0')
stage.querySelector('.divider').style.opacity = '0'
setTimeout(() => {
reveal.style.background = colors[engine]
home.style.background = colors[engine]
homeName.textContent = engine === 'openclaw' ? 'OpenClaw' : 'Hermes'
reveal.classList.add('active')
}, 700)
setTimeout(() => home.classList.add('show'), 1500)
})
})
document.addEventListener('keydown', (e) => {
if (e.key.toLowerCase() === 'r') location.reload()
})
</script>
</body>
</html>

View File

@@ -0,0 +1,423 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>V2-C · Monolith — 巨碑感Linear / Vercel 风)</title>
<style>
* { margin: 0; padding: 0; box-sizing: border-box }
html, body { height: 100%; overflow: hidden; font-family: 'Inter', -apple-system, system-ui, sans-serif; background: #000; -webkit-font-smoothing: antialiased }
.stage { position: fixed; inset: 0 }
/* 左上三角:石墨黑 + 紫蓝 accent */
.panel-openclaw {
position: absolute;
inset: 0;
clip-path: polygon(0 0, 0 100%, 100% 0);
cursor: pointer;
transition: filter 0.6s ease;
background: #0c0d12;
}
/* 微妙的网格纹 */
.panel-openclaw::after {
content: '';
position: absolute;
inset: 0;
background-image:
linear-gradient(rgba(255,255,255,0.025) 1px, transparent 1px),
linear-gradient(90deg, rgba(255,255,255,0.025) 1px, transparent 1px);
background-size: 60px 60px;
background-position: -1px -1px;
pointer-events: none;
}
/* 右下三角:象牙白 + 黑色 accent */
.panel-hermes {
position: absolute;
inset: 0;
clip-path: polygon(100% 0, 100% 100%, 0 100%);
cursor: pointer;
transition: filter 0.6s ease;
background: #f5f3ee;
}
.panel-hermes::after {
content: '';
position: absolute;
inset: 0;
background-image:
linear-gradient(rgba(0,0,0,0.04) 1px, transparent 1px),
linear-gradient(90deg, rgba(0,0,0,0.04) 1px, transparent 1px);
background-size: 60px 60px;
background-position: -1px -1px;
pointer-events: none;
}
/* 微妙发光(左上:紫蓝 / 右下:金棕) */
.glow-openclaw, .glow-hermes {
position: absolute;
pointer-events: none;
transition: opacity 0.5s ease;
}
.glow-openclaw {
top: -10%;
left: -10%;
width: 50%;
height: 50%;
background: radial-gradient(circle, rgba(110, 100, 255, 0.35) 0%, transparent 60%);
filter: blur(40px);
clip-path: polygon(0 0, 100% 0, 0 100%);
}
.glow-hermes {
bottom: -10%;
right: -10%;
width: 50%;
height: 50%;
background: radial-gradient(circle, rgba(220, 130, 60, 0.25) 0%, transparent 60%);
filter: blur(40px);
clip-path: polygon(100% 100%, 0 100%, 100% 0);
}
/* 中线(极细发光) */
.divider {
position: absolute;
inset: 0;
background: linear-gradient(45deg, transparent calc(50% - 0.5px), rgba(180, 180, 180, 0.6) 50%, transparent calc(50% + 0.5px));
pointer-events: none;
transition: opacity 0.6s;
}
/* 内容定位 */
.content {
position: absolute;
pointer-events: none;
transition: transform 0.7s cubic-bezier(0.22, 1, 0.36, 1), opacity 0.5s, filter 0.5s;
z-index: 3;
}
.content-openclaw {
top: 11%;
left: 6.5%;
color: #fafafa;
text-align: left;
max-width: 44vw;
}
.content-hermes {
bottom: 11%;
right: 6.5%;
color: #18171a;
text-align: right;
max-width: 44vw;
}
/* hover 联动 */
.stage:has(.panel-openclaw:hover) .panel-hermes { filter: brightness(0.94) saturate(0.85) }
.stage:has(.panel-hermes:hover) .panel-openclaw { filter: brightness(0.6) }
.stage:has(.panel-openclaw:hover) .content-hermes,
.stage:has(.panel-hermes:hover) .content-openclaw {
opacity: 0.25;
filter: blur(2px);
}
.stage:has(.panel-openclaw:hover) .content-openclaw,
.stage:has(.panel-hermes:hover) .content-hermes {
transform: translateX(8px);
}
.content-hermes:hover { /* placeholder */ }
.stage:has(.panel-hermes:hover) .content-hermes {
transform: translateX(-8px);
}
/* 顶部 logo + 数字 */
.product-row {
display: flex;
align-items: center;
gap: 16px;
margin-bottom: 28px;
}
.content-hermes .product-row { flex-direction: row-reverse }
.product-icon {
width: 44px;
height: 44px;
border-radius: 12px;
background: rgba(255, 255, 255, 0.08);
border: 1px solid rgba(255, 255, 255, 0.12);
display: grid;
place-items: center;
}
.content-hermes .product-icon {
background: rgba(0, 0, 0, 0.05);
border: 1px solid rgba(0, 0, 0, 0.12);
}
.product-icon svg { width: 22px; height: 22px; stroke: currentColor; fill: none; stroke-width: 1.6 }
.product-tag {
font-size: 12px;
font-weight: 500;
letter-spacing: 0.18em;
text-transform: uppercase;
opacity: 0.55;
}
/* 巨字标题 */
.title {
font-size: clamp(80px, 13vw, 200px);
font-weight: 200;
letter-spacing: -0.055em;
line-height: 0.92;
margin-bottom: 28px;
}
/* 副标题 */
.tagline {
font-size: clamp(20px, 1.8vw, 28px);
line-height: 1.4;
font-weight: 300;
max-width: 540px;
margin-bottom: 32px;
opacity: 0.78;
letter-spacing: -0.01em;
}
.content-hermes .tagline { margin-left: auto }
/* 特性列表(垂直线 + 文字) */
.feature-list {
display: flex;
flex-direction: column;
gap: 12px;
margin-bottom: 44px;
font-size: 14px;
font-weight: 400;
line-height: 1.6;
}
.content-hermes .feature-list { align-items: flex-end }
.feature-list li {
list-style: none;
display: flex;
align-items: center;
gap: 12px;
opacity: 0.7;
}
.content-hermes .feature-list li { flex-direction: row-reverse }
.feature-list li::before {
content: '';
width: 16px;
height: 1px;
background: currentColor;
opacity: 0.4;
}
/* CTA 按钮 */
.cta {
display: inline-flex;
align-items: center;
gap: 12px;
padding: 16px 28px;
border-radius: 8px;
font-size: 13px;
font-weight: 600;
letter-spacing: 0.04em;
transition: all 0.35s ease;
}
.content-openclaw .cta {
background: rgba(255, 255, 255, 0.08);
color: #fff;
border: 1px solid rgba(255, 255, 255, 0.18);
}
.content-hermes .cta {
background: rgba(0, 0, 0, 0.06);
color: #18171a;
border: 1px solid rgba(0, 0, 0, 0.18);
flex-direction: row-reverse;
}
.stage:has(.panel-openclaw:hover) .content-openclaw .cta {
background: #fff;
color: #0a0a0a;
border-color: #fff;
}
.stage:has(.panel-hermes:hover) .content-hermes .cta {
background: #0a0a0a;
color: #fff;
border-color: #0a0a0a;
}
.cta .arrow {
width: 18px;
height: 18px;
display: grid;
place-items: center;
transition: transform 0.3s;
}
.stage:has(.panel-openclaw:hover) .content-openclaw .cta .arrow { transform: translateX(4px) }
.stage:has(.panel-hermes:hover) .content-hermes .cta .arrow { transform: translateX(-4px) }
/* 角标 */
.corner-mark {
position: absolute;
font-size: 11px;
letter-spacing: 0.32em;
text-transform: uppercase;
pointer-events: none;
z-index: 4;
font-weight: 500;
}
.corner-tl { top: 32px; left: 36px; color: rgba(255, 255, 255, 0.45) }
.corner-br { bottom: 32px; right: 36px; color: rgba(0, 0, 0, 0.45) }
.top-center {
position: fixed;
top: 32px;
left: 50%;
transform: translateX(-50%);
color: rgba(180, 180, 180, 0.7);
font-size: 11px;
letter-spacing: 0.4em;
text-transform: uppercase;
z-index: 5;
pointer-events: none;
font-weight: 500;
}
/* —— 选中展开动画 —— */
.panel.expanding { clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%); z-index: 5 }
.panel { transition: clip-path 0.8s cubic-bezier(0.7, 0, 0.3, 1), filter 0.5s }
.reveal {
position: fixed;
top: 50%;
left: 50%;
width: 0;
height: 0;
border-radius: 50%;
transform: translate(-50%, -50%);
z-index: 20;
pointer-events: none;
transition: width 0.9s cubic-bezier(0.65, 0, 0.35, 1), height 0.9s cubic-bezier(0.65, 0, 0.35, 1);
}
.reveal.active { width: 260vmax; height: 260vmax }
.home-mock {
position: fixed;
inset: 0;
z-index: 30;
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
gap: 14px;
opacity: 0;
pointer-events: none;
transition: opacity 0.6s ease;
}
.home-mock.show { opacity: 1; pointer-events: auto }
.home-mock .ht { font-size: 64px; font-weight: 200; letter-spacing: -0.04em }
.home-mock .hs { font-size: 12px; letter-spacing: 0.45em; text-transform: uppercase; opacity: 0.5 }
.reset-hint {
position: fixed;
bottom: 24px;
left: 50%;
transform: translateX(-50%);
color: rgba(150, 150, 150, 0.6);
font-size: 11px;
letter-spacing: 0.2em;
text-transform: uppercase;
z-index: 40;
pointer-events: none;
}
</style>
</head>
<body>
<div class="stage" id="stage">
<div class="panel panel-openclaw" data-engine="openclaw">
<div class="glow-openclaw"></div>
</div>
<div class="panel panel-hermes" data-engine="hermes">
<div class="glow-hermes"></div>
</div>
<div class="divider"></div>
<div class="top-center">— Pick your path —</div>
<div class="corner-mark corner-tl">CLAWPANEL</div>
<div class="corner-mark corner-br">v0.15.3</div>
<div class="content content-openclaw">
<div class="product-row">
<div class="product-icon">
<svg viewBox="0 0 24 24"><path d="M12 2L2 7l10 5 10-5-10-5z"/><path d="M2 17l10 5 10-5"/><path d="M2 12l10 5 10-5"/></svg>
</div>
<div class="product-tag">01 · 通用助理</div>
</div>
<div class="title">OpenClaw</div>
<div class="tagline">从模型到智能体,一站式打造你的 AI 工作台。</div>
<ul class="feature-list">
<li>多模型 / 多渠道并行管理</li>
<li>持久化记忆 + 上下文工程</li>
<li>无代码搭建智能体</li>
</ul>
<div class="cta">
Enter OpenClaw
<span class="arrow"></span>
</div>
</div>
<div class="content content-hermes">
<div class="product-row">
<div class="product-icon">
<svg viewBox="0 0 24 24"><path d="M13 2L3 14h9l-1 8 10-12h-9l1-8z"/></svg>
</div>
<div class="product-tag">Agent 工作流 · 02</div>
</div>
<div class="title">Hermes</div>
<div class="tagline">让 Agent 真正能干活。工具调用、Profile、Kanban 一应俱全。</div>
<ul class="feature-list">
<li>原生工具调用 + Approval Flow</li>
<li>多 Profile 隔离 + 多 Gateway</li>
<li>内置 Kanban / Skills / OAuth</li>
</ul>
<div class="cta">
<span class="arrow"></span>
Enter Hermes
</div>
</div>
</div>
<div class="reveal" id="reveal"></div>
<div class="home-mock" id="home">
<div class="ht" id="home-name"></div>
<div class="hs">Initializing workspace</div>
</div>
<div class="reset-hint">Click a side · Press R to reset</div>
<script>
const stage = document.getElementById('stage')
const reveal = document.getElementById('reveal')
const home = document.getElementById('home')
const homeName = document.getElementById('home-name')
const colors = {
openclaw: { bg: '#0c0d12', text: '#fff' },
hermes: { bg: '#f5f3ee', text: '#18171a' },
}
document.querySelectorAll('.panel').forEach(panel => {
panel.addEventListener('click', () => {
const engine = panel.dataset.engine
const other = stage.querySelector(`.panel:not([data-engine="${engine}"])`)
panel.classList.add('expanding')
other.style.opacity = '0'
stage.querySelectorAll('.content, .corner-mark, .top-center, .glow-openclaw, .glow-hermes').forEach(c => c.style.opacity = '0')
stage.querySelector('.divider').style.opacity = '0'
setTimeout(() => {
reveal.style.background = colors[engine].bg
home.style.background = colors[engine].bg
home.style.color = colors[engine].text
homeName.textContent = engine === 'openclaw' ? 'OpenClaw' : 'Hermes'
reveal.classList.add('active')
}, 700)
setTimeout(() => home.classList.add('show'), 1500)
})
})
document.addEventListener('keydown', (e) => {
if (e.key.toLowerCase() === 'r') location.reload()
})
</script>
</body>
</html>