Files
clawpanel/docs/engine-select-mockups/v2-aurora.html
晴天 6a0d87479c 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
即本次接入的最终版本)。
2026-05-14 06:22:32 +08:00

396 lines
12 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">
<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>