Files
tergent-android/docs/tergent-ui-screens.html
T
2026-05-23 03:23:20 +00:00

651 lines
22 KiB
HTML

<!doctype html>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Tergent — 终端风格界面参考</title>
<style>
:root {
--bg: #0d1117;
--surface: #161b22;
--border: #30363d;
--fg: #e6edf3;
--muted: #8b949e;
--accent: #58a6ff;
--green: #3fb950;
--orange: #d29922;
--red: #f85149;
--purple: #bc8cff;
--cyan: #39d2c0;
--term-bg: #0d1117;
--prompt: #3fb950;
}
* { box-sizing: border-box; margin: 0; padding: 0; }
body {
background: var(--bg);
color: var(--fg);
font: 13px/1.5 'JetBrains Mono', 'Cascadia Code', 'Fira Code', 'Consolas', monospace;
}
h1 {
text-align: center;
padding: 32px 0 4px;
font-size: 18px;
font-weight: 400;
color: var(--accent);
letter-spacing: 2px;
}
h1::before { content: '# '; color: var(--muted); }
.sub {
text-align: center;
color: var(--muted);
font-size: 11px;
margin-bottom: 24px;
}
.sub::before { content: '// '; }
.grid {
max-width: 1100px;
margin: 0 auto;
padding: 0 16px 48px;
display: grid;
grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
gap: 20px;
}
.card {
border: 1px solid var(--border);
border-radius: 6px;
overflow: hidden;
background: var(--surface);
}
.card-header {
padding: 8px 12px;
font-size: 11px;
font-weight: 600;
border-bottom: 1px solid var(--border);
display: flex;
align-items: center;
gap: 8px;
color: var(--muted);
background: #010409;
}
.tag {
display: inline-block;
font-size: 9px;
font-weight: 700;
padding: 2px 6px;
border-radius: 3px;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.tag-p0 { background: var(--green); color: #0d1117; }
.tag-p1 { background: var(--orange); color: #0d1117; }
.tag-p2 { background: var(--muted); color: #0d1117; }
.phone {
position: relative;
width: 100%;
aspect-ratio: 9 / 19;
max-height: 520px;
background: var(--term-bg);
margin: 0;
overflow: hidden;
color: var(--fg);
display: flex;
flex-direction: column;
}
/* terminal-style status bar */
.status-bar {
display: flex;
justify-content: space-between;
align-items: center;
padding: 4px 10px;
font-size: 10px;
background: #010409;
border-bottom: 1px solid var(--border);
color: var(--muted);
font-family: monospace;
}
.status-bar .time { color: var(--fg); }
.status-bar .indicators span { margin-left: 4px; }
/* terminal prompt line */
.prompt-line {
padding: 6px 10px;
font-size: 11px;
color: var(--muted);
background: #010409;
border-bottom: 1px solid var(--border);
display: flex;
align-items: center;
gap: 6px;
}
.prompt-line .prompt {
color: var(--prompt);
font-weight: 600;
}
.prompt-line .cmd {
color: var(--fg);
}
/* content area */
.screen-content {
padding: 6px 10px;
display: flex;
flex-direction: column;
gap: 4px;
flex: 1;
font-size: 11px;
overflow: hidden;
}
/* terminal-like output lines */
.line { line-height: 1.6; }
.line-green { color: var(--green); }
.line-red { color: var(--red); }
.line-accent { color: var(--accent); }
.line-muted { color: var(--muted); }
.line-orange { color: var(--orange); }
.line-purple { color: var(--purple); }
.line-cyan { color: var(--cyan); }
.line-indent { padding-left: 12px; }
/* chat bubbles - terminal style */
.chat-bubble {
max-width: 85%;
padding: 6px 10px;
margin: 2px 0;
line-height: 1.4;
}
.chat-bubble.user {
align-self: flex-end;
border: 1px solid var(--accent);
border-radius: 6px;
color: var(--accent);
}
.chat-bubble.agent {
align-self: flex-start;
border: 1px solid var(--border);
border-radius: 6px;
color: var(--fg);
}
.chat-bubble .label {
font-size: 9px;
color: var(--muted);
margin-bottom: 2px;
}
/* input line - terminal style */
.input-line {
display: flex;
align-items: center;
gap: 6px;
padding: 6px 10px;
border-top: 1px solid var(--border);
margin-top: auto;
background: #010409;
}
.input-line .dollar { color: var(--prompt); font-weight: 600; }
.input-line .cursor {
flex: 1;
height: 18px;
border: none;
background: transparent;
color: var(--fg);
font-family: inherit;
font-size: 11px;
outline: none;
}
.input-line .cursor:focus { outline: none; }
/* tab bar */
.tab-bar {
display: flex;
border-top: 1px solid var(--border);
background: #010409;
margin-top: auto;
}
.tab-item {
flex: 1;
text-align: center;
padding: 6px 0;
font-size: 9px;
color: var(--muted);
font-family: monospace;
letter-spacing: 0.3px;
}
.tab-item.active {
color: var(--accent);
border-top: 2px solid var(--accent);
background: rgba(88,166,255,0.05);
}
/* settings rows */
.setting-row {
display: flex;
justify-content: space-between;
align-items: center;
padding: 6px 0;
border-bottom: 1px solid rgba(48,54,61,0.5);
font-size: 11px;
}
.setting-row .switch {
width: 32px; height: 16px;
border-radius: 8px;
border: 1px solid var(--border);
position: relative;
}
.setting-row .switch.on {
background: var(--green);
border-color: var(--green);
}
.setting-row .switch.on::after {
content: '';
position: absolute;
right: 2px; top: 2px;
width: 10px; height: 10px;
border-radius: 50%;
background: #0d1117;
}
.setting-row .switch.off::after {
content: '';
position: absolute;
left: 2px; top: 2px;
width: 10px; height: 10px;
border-radius: 50%;
background: var(--muted);
}
.setting-row .arrow { color: var(--muted); }
/* status badge */
.status-badge {
display: inline-flex;
align-items: center;
gap: 4px;
padding: 2px 8px;
border-radius: 3px;
font-size: 10px;
border: 1px solid var(--border);
}
.status-badge .dot { width: 6px; height: 6px; border-radius: 50%; }
.status-badge .dot.green { background: var(--green); }
.status-badge .dot.yellow { background: var(--orange); }
/* button */
.term-btn {
padding: 6px 14px;
border: 1px solid var(--border);
border-radius: 4px;
background: transparent;
color: var(--fg);
font-family: inherit;
font-size: 10px;
cursor: default;
}
.term-btn.primary {
background: var(--accent);
color: #0d1117;
border-color: var(--accent);
font-weight: 600;
}
/* qr placeholder */
.qr-box {
width: 88px; height: 88px;
border: 1px dashed var(--border);
border-radius: 4px;
display: flex;
align-items: center;
justify-content: center;
font-size: 10px;
color: var(--muted);
}
/* voice orb */
.vorb {
width: 64px; height: 64px;
border: 2px solid var(--accent);
border-radius: 50%;
margin: 0 auto;
display: flex;
align-items: center;
justify-content: center;
font-size: 10px;
color: var(--accent);
}
.vorb.active {
border-color: var(--green);
color: var(--green);
animation: pulse 1.5s ease-in-out infinite;
}
@keyframes pulse {
0%, 100% { box-shadow: 0 0 0 0 rgba(63,185,80,0.4); }
50% { box-shadow: 0 0 0 12px rgba(63,185,80,0); }
}
/* canvas */
.canvas-area {
flex: 1;
border: 1px solid var(--border);
border-radius: 4px;
display: flex;
align-items: center;
justify-content: center;
font-size: 10px;
color: var(--muted);
background: rgba(1,4,9,0.5);
min-height: 120px;
}
/* log lines */
.log-line {
font-size: 10px;
line-height: 1.5;
color: var(--muted);
white-space: pre;
}
/* device item */
.dev-item {
display: flex;
align-items: center;
gap: 8px;
padding: 6px 0;
border-bottom: 1px solid rgba(48,54,61,0.3);
font-size: 11px;
}
.dev-item .dot { width: 6px; height: 6px; border-radius: 50%; }
.dev-item .online { background: var(--green); }
.dev-item .offline { background: var(--muted); }
.dev-item .name { flex: 1; }
.dev-item .info { color: var(--muted); font-size: 10px; }
.screen-content.center {
align-items: center;
justify-content: center;
text-align: center;
gap: 12px;
}
</style>
<h1>Tergent — 终端风格界面参考</h1>
<p class="sub">基于 Linux 终端设计语言 · 深色主题 · 9 个主要页面</p>
<div class="grid">
<!-- 1. Onboarding -->
<div class="card">
<div class="card-header"><span class="tag tag-p0">P0</span> 1. Onboarding</div>
<div class="phone">
<div class="status-bar"><span class="time">14:30</span><span class="indicators">🔒 wifi <span class="line-green"></span> 95%</span></div>
<div class="screen-content center" style="flex:1">
<div style="font-size:24px;color:var(--accent);letter-spacing:4px">TERGENT</div>
<div style="font-size:10px;color:var(--muted)">v0.1.0 — Android companion node</div>
<div class="qr-box">[ SCAN QR ]</div>
<div class="line-muted" style="font-size:10px">$ setup-code or manual</div>
<div style="display:flex;gap:6px;margin-top:4px">
<span class="term-btn primary">[ Connect ]</span>
<span class="term-btn">[ Manual ]</span>
</div>
<div class="line-muted" style="font-size:9px;margin-top:8px">_ 首次使用请扫码配对</div>
</div>
</div>
</div>
<!-- 2. Connect -->
<div class="card">
<div class="card-header"><span class="tag tag-p0">P0</span> 2. Connect</div>
<div class="phone">
<div class="status-bar"><span class="time">14:30</span><span class="indicators">🔒 wifi <span class="line-green"></span> 95%</span></div>
<div class="prompt-line"><span class="prompt"></span> <span class="line-green">tergent</span><span class="line-muted">@</span><span class="line-accent">node</span> ~ $ <span class="cmd">gateway status</span></div>
<div class="screen-content" style="gap:4px">
<div class="line"><span class="status-badge"><span class="dot green"></span> CONNECTED</span></div>
<div class="line line-muted">├─ host: hdtime.space:443 (wss)</div>
<div class="line line-muted">├─ session: operator + node</div>
<div class="line line-muted">└─ peer: <span class="line-green">茂之钳</span> · main</div>
<div style="border:1px solid var(--border);border-radius:4px;padding:8px;margin-top:4px">
<div class="line line-muted">$ cat /etc/gateway.conf</div>
<div class="line line-indent">host: hdtime.space</div>
<div class="line line-indent">port: 443</div>
<div class="line line-indent">tls: true</div>
<div class="line line-indent">status: <span class="line-green">online</span></div>
</div>
<div style="display:flex;gap:6px;margin-top:4px">
<span class="term-btn">switch</span>
<span class="term-btn">re-pair</span>
<span class="term-btn primary">refresh</span>
</div>
</div>
<div class="tab-bar">
<div class="tab-item active">[ conn ]</div>
<div class="tab-item">chat</div>
<div class="tab-item">voice</div>
<div class="tab-item">screen</div>
<div class="tab-item">sys</div>
</div>
</div>
</div>
<!-- 3. Chat -->
<div class="card">
<div class="card-header"><span class="tag tag-p0">P0</span> 3. Chat</div>
<div class="phone">
<div class="status-bar"><span class="time">14:30</span><span class="indicators">🔒 wifi <span class="line-green"></span> 95%</span></div>
<div class="prompt-line"><span class="prompt"></span> <span class="line-green">tergent</span><span class="line-muted">@</span><span class="line-accent">node</span> ~ $ <span class="cmd">session attach main</span></div>
<div class="screen-content" style="gap:3px;justify-content:flex-end">
<div class="chat-bubble agent">
<div class="label">agent@main:~$</div>
你好!有什么需要帮忙的?
</div>
<div class="chat-bubble user">
<div class="label" style="color:var(--accent)">you@phone:~$</div>
查一下今天的股票热点
</div>
<div class="chat-bubble agent">
<div class="label">agent@main:~$</div>
<span class="line-muted">fetching market data...</span>
<div style="margin-top:2px">A股三大指数震荡,电力板块领涨,长鑫科技上市在即。</div>
</div>
<div class="chat-bubble user">
<div class="label" style="color:var(--accent)">you@phone:~$</div>
好的,谢谢
</div>
<div class="line line-muted" style="text-align:center;font-size:9px">
<span style="animation:pulse 1.5s infinite">_</span> tergent is processing
</div>
</div>
<div class="input-line">
<span class="dollar">$</span>
<span class="cursor">输入消息...</span>
<span style="color:var(--muted);font-size:10px">⏎ send</span>
</div>
<div class="tab-bar">
<div class="tab-item">conn</div>
<div class="tab-item active">[ chat ]</div>
<div class="tab-item">voice</div>
<div class="tab-item">screen</div>
<div class="tab-item">sys</div>
</div>
</div>
</div>
<!-- 4. Settings -->
<div class="card">
<div class="card-header"><span class="tag tag-p0">P0</span> 4. System Settings</div>
<div class="phone">
<div class="status-bar"><span class="time">14:30</span><span class="indicators">🔒 wifi <span class="line-green"></span> 95%</span></div>
<div class="prompt-line"><span class="prompt"></span> <span class="line-green">tergent</span><span class="line-muted">@</span><span class="line-accent">node</span> ~ $ <span class="cmd">systemctl config</span></div>
<div class="screen-content" style="gap:2px">
<div class="setting-row"><span>notification-forward</span><span class="switch on"></span></div>
<div class="setting-row"><span>camera-permit</span><span class="switch on"></span></div>
<div class="setting-row"><span>location-permit</span><span class="switch on"></span></div>
<div class="setting-row"><span>voice-wake</span><span class="switch off"></span></div>
<div class="setting-row"><span>dark-mode</span><span class="switch on"></span></div>
<div class="setting-row" style="border:none">
<span>connection</span>
<span class="arrow"></span>
</div>
<div class="setting-row" style="border:none">
<span>about</span>
<span class="line-muted">v0.1.0</span>
</div>
<div style="border-top:1px solid var(--border);padding:6px 0;margin-top:4px">
<div class="line line-muted"># uname -a</div>
<div class="line" style="font-size:10px">Tergent v0.1.0 Android 15 (API 36)</div>
</div>
</div>
<div class="tab-bar">
<div class="tab-item">conn</div>
<div class="tab-item">chat</div>
<div class="tab-item">voice</div>
<div class="tab-item">screen</div>
<div class="tab-item active">[ sys ]</div>
</div>
</div>
</div>
<!-- 5. Voice -->
<div class="card">
<div class="card-header"><span class="tag tag-p1">P1</span> 5. Voice</div>
<div class="phone">
<div class="status-bar"><span class="time">14:30</span><span class="indicators">🎤 <span class="line-green"></span> 95%</span></div>
<div class="prompt-line"><span class="prompt"></span> <span class="cmd">talk --mode listen</span></div>
<div class="screen-content center" style="flex:1;gap:10px">
<div class="line-muted" style="font-size:10px">$ say something...</div>
<div class="vorb active"></div>
<div class="line" style="font-size:10px;letter-spacing:2px">▁▃▅▇██▇▅▃▁</div>
<div class="line-accent" style="font-size:11px;background:rgba(88,166,255,0.08);padding:4px 8px;border-radius:4px;width:100%">
"帮我查一下今天的日程"
</div>
<div class="line" style="font-size:10px;border:1px solid var(--border);padding:6px 8px;border-radius:4px;width:100%">
<span class="line-muted">tergent:</span> 你有2个会议,下午3点设计评审
</div>
</div>
<div class="tab-bar">
<div class="tab-item">conn</div>
<div class="tab-item">chat</div>
<div class="tab-item active">[ voice ]</div>
<div class="tab-item">screen</div>
<div class="tab-item">sys</div>
</div>
</div>
</div>
<!-- 6. Canvas -->
<div class="card">
<div class="card-header"><span class="tag tag-p1">P1</span> 6. Screen (Canvas)</div>
<div class="phone">
<div class="status-bar"><span class="time">14:30</span><span class="indicators">🔒 wifi <span class="line-green"></span> 95%</span></div>
<div class="prompt-line"><span class="prompt"></span> <span class="cmd">canvas open</span></div>
<div style="flex:1;padding:6px 10px;display:flex;flex-direction:column;gap:4px">
<div style="display:flex;gap:4px;font-size:9px">
<span class="term-btn">▣ capture</span>
<span class="term-btn">⊞ zoom</span>
<span class="term-btn">↻ reload</span>
<span class="term-btn">⌂ home</span>
</div>
<div class="canvas-area">
<span class="line-muted">[ WebView: agent canvas ]</span>
</div>
<div class="line line-muted" style="font-size:9px">url: http://host:18789/__openclaw__/canvas/</div>
</div>
<div class="tab-bar">
<div class="tab-item">conn</div>
<div class="tab-item">chat</div>
<div class="tab-item">voice</div>
<div class="tab-item active">[ screen ]</div>
<div class="tab-item">sys</div>
</div>
</div>
</div>
<!-- 7. Devices -->
<div class="card">
<div class="card-header"><span class="tag tag-p1">P1</span> 7. Nodes</div>
<div class="phone">
<div class="status-bar"><span class="time">14:30</span><span class="indicators">🔒 wifi <span class="line-green"></span> 95%</span></div>
<div class="prompt-line"><span class="prompt"></span> <span class="cmd">nodes list</span></div>
<div class="screen-content" style="gap:2px">
<div class="line"><span class="line-green">● ONLINE</span> <span class="line-muted">1 active</span></div>
<div class="dev-item">
<span class="dot online"></span>
<span class="name line-green">hdtime.space</span>
<span class="info">main · op+node</span>
<span class="info">18789</span>
</div>
<div class="dev-item">
<span class="dot offline"></span>
<span class="name" style="color:var(--muted)">local-gw</span>
<span class="info">192.168.1.100</span>
<span class="info"></span>
</div>
<div style="margin-top:6px">
<span class="term-btn">+ add gateway</span>
</div>
<div style="margin-top:6px">
<div class="line line-muted">$ nmap --scan</div>
<div class="line line-indent line-muted">scanning _tergent-gw._tcp...</div>
<div class="line line-indent line-muted">1 gateway found</div>
</div>
</div>
<div class="tab-bar">
<div class="tab-item">conn</div>
<div class="tab-item">chat</div>
<div class="tab-item">voice</div>
<div class="tab-item">screen</div>
<div class="tab-item active">[ sys ]</div>
</div>
</div>
</div>
<!-- 8. Notifications -->
<div class="card">
<div class="card-header"><span class="tag tag-p2">P2</span> 8. Notifications</div>
<div class="phone">
<div class="status-bar"><span class="time">14:30</span><span class="indicators">🔔 <span class="line-green"></span> 95%</span></div>
<div class="prompt-line"><span class="prompt"></span> <span class="cmd">journalctl -f</span></div>
<div class="screen-content" style="gap:1px;padding:4px 10px">
<div class="log-line"><span class="line-green">[14:30]</span> 📩 <span class="line-accent">weixin</span> 收到一条消息</div>
<div class="log-line"><span class="line-green">[14:28]</span> 📩 <span class="line-accent">slack</span> #general: 新消息</div>
<div class="log-line"><span class="line-orange">[14:25]</span><span>system</span> 电池电量低 (15%)</div>
<div class="log-line"><span class="line-green">[14:20]</span> 📩 <span class="line-accent">email</span> 设计评审会议提醒</div>
<div class="log-line"><span class="line-muted">[14:15]</span> 🔔 <span class="line-muted">system</span> WiFi 重连</div>
<div class="log-line" style="margin-top:6px"><span class="line-muted">_ waiting for events ...</span></div>
<div class="setting-row" style="margin-top:4px">
<span>forwarding</span>
<span class="switch on"></span>
</div>
</div>
</div>
</div>
<!-- 9. Diagnostics -->
<div class="card">
<div class="card-header"><span class="tag tag-p2">P2</span> 9. Diagnostics</div>
<div class="phone">
<div class="status-bar"><span class="time">14:30</span><span class="indicators">🔒 wifi ⚠ 82%</span></div>
<div class="prompt-line"><span class="prompt"></span> <span class="cmd">diag run</span></div>
<div class="screen-content" style="gap:2px">
<div class="status-badge" style="border-color:var(--orange);color:var(--orange)">
<span class="dot yellow"></span> WARNING — latency high
</div>
<div class="log-line" style="margin-top:4px">
<span class="line-muted">$ ping gateway</span>
</div>
<div class="log-line line-indent">64 bytes: <span class="line-orange">342ms</span></div>
<div class="log-line line-indent">64 bytes: <span class="line-orange">328ms</span></div>
<div class="log-line line-indent">64 bytes: <span class="line-orange">356ms</span></div>
<div class="log-line"><span class="line-muted">$ tls check</span></div>
<div class="log-line line-indent line-green">OK (TOFU fingerprint match)</div>
<div class="log-line"><span class="line-muted">$ ws upgrade</span></div>
<div class="log-line line-indent line-green">OK</div>
<div class="log-line" style="margin-top:4px">
<div style="display:flex;gap:4px">
<span class="term-btn primary">run all</span>
<span class="term-btn">export log</span>
</div>
</div>
</div>
</div>
</div>
</div>