Files
clawtap/playground-claw-logo.html
kuannnn 42861ea7fa feat: ClawTap v0.1.0 — initial release
Multi-adapter mobile UI for AI coding assistants.
Supports Claude Code, Codex CLI, and Gemini CLI through one interface.

Features:
- Real-time bidirectional sync via tmux + WebSocket
- Cross-AI review (send one AI's output to another for review)
- Multi-review tabs with minimize/expand
- Push notifications (PWA) with smart session-aware filtering
- Three-channel event system (hooks, file watcher, pane monitor)
- Voice input, image paste, draft persistence
- Terminal-native design (JetBrains Mono, dark theme, pixel art claw)
- CLI with --adapter flag on every command
- Zero-overhead fire-and-forget hooks
2026-03-26 10:40:26 +08:00

288 lines
13 KiB
HTML
Raw Permalink 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="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ClawTap — Simple Claw Loading</title>
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600;700&display=swap" rel="stylesheet">
<style>
* { box-sizing: border-box; margin: 0; padding: 0; }
body {
font-family: 'JetBrains Mono', monospace;
background: #09090b;
color: #fafafa;
display: flex;
flex-direction: column;
align-items: center;
padding: 40px 20px;
gap: 40px;
}
h2 { color: #71717a; font-size: 11px; text-transform: uppercase; letter-spacing: 3px; margin-bottom: 8px; }
.section { text-align: center; width: 100%; max-width: 400px; }
.divider { width: 100%; height: 1px; background: #27272a; }
.tag { display: inline-block; background: #18181b; color: #22c55e; font-size: 10px; padding: 2px 8px; border-radius: 4px; margin-bottom: 8px; }
.svg-c { image-rendering: pixelated; filter: drop-shadow(0 0 4px rgba(34, 197, 94, 0.3)); overflow: visible; }
.track { display: flex; align-items: center; justify-content: center; height: 48px; overflow: hidden; }
.walk { animation: walk 2.2s linear infinite; display: flex; align-items: center; }
@keyframes walk { 0% { transform: translateX(-24px); } 100% { transform: translateX(8px); } }
.dots { display: flex; gap: 8px; margin-left: 4px; align-items: center; }
.d {
width: 4px; height: 4px; background: rgba(34, 197, 94, 0.35);
border-radius: 50%; animation: eat 2.2s ease-in-out infinite;
}
.d:nth-child(1) { animation-delay: 0s; }
.d:nth-child(2) { animation-delay: 0.35s; }
.d:nth-child(3) { animation-delay: 0.7s; }
.d:nth-child(4) { animation-delay: 1.05s; }
.d:nth-child(5) { animation-delay: 1.4s; }
@keyframes eat {
0%, 50% { opacity: 0.5; transform: scale(1); }
65% { opacity: 0; transform: scale(0); }
80%, 100% { opacity: 0.5; transform: scale(1); }
}
.lbl { font-size: 11px; color: #71717a; animation: pulse 2s ease-in-out infinite; margin-top: 4px; }
@keyframes pulse { 0%, 100% { opacity: 0.5; } 50% { opacity: 1; } }
/* Pivot animations */
@keyframes p12t { 0%, 100% { transform: rotate(-12deg); } 50% { transform: rotate(0deg); } }
@keyframes p12b { 0%, 100% { transform: rotate(12deg); } 50% { transform: rotate(0deg); } }
@keyframes p18t { 0%, 100% { transform: rotate(-18deg); } 50% { transform: rotate(0deg); } }
@keyframes p18b { 0%, 100% { transform: rotate(18deg); } 50% { transform: rotate(0deg); } }
@keyframes p25t { 0%, 100% { transform: rotate(-25deg); } 50% { transform: rotate(0deg); } }
@keyframes p25b { 0%, 100% { transform: rotate(25deg); } 50% { transform: rotate(0deg); } }
.ascii { color: #22c55e; font-size: 14px; line-height: 1.2; white-space: pre; text-shadow: 0 0 8px rgba(34, 197, 94, 0.2); font-weight: 700; }
.brand { font-size: 22px; font-weight: 700; letter-spacing: 4px; color: #fafafa; text-shadow: 0 0 12px rgba(34, 197, 94, 0.15); margin-top: 8px; }
.sub { font-size: 11px; color: #71717a; margin-top: 3px; }
</style>
</head>
<body>
<!-- Logo -->
<div class="section">
<h2>Logo</h2>
<pre class="ascii">
▐▌ ▐▌
▐█ █▌
▐██▄▄██▌
▀████▀
██
</pre>
<div class="brand">ClawTap</div>
<div class="sub">remote terminal</div>
</div>
<div class="divider"></div>
<!-- ====== 1: Original 8×6, no eye, 12° ====== -->
<div class="section">
<h2>1 — Original (8×6, 12°)</h2>
<span class="tag">clean, no eye</span>
<div class="track">
<div class="walk">
<svg width="48" height="36" viewBox="0 0 8 6" class="svg-c">
<g style="transform-origin: 3px 2px; animation: p12t 0.4s ease-in-out infinite;">
<rect x="4" y="0" width="4" height="1" fill="#22c55e"/>
<rect x="3" y="1" width="2" height="1" fill="#22c55e"/>
</g>
<rect x="0" y="2" width="4" height="2" fill="#22c55e"/>
<rect x="4" y="2" width="1" height="2" fill="#4ade80" opacity="0.5"/>
<g style="transform-origin: 3px 4px; animation: p12b 0.4s ease-in-out infinite;">
<rect x="3" y="4" width="2" height="1" fill="#22c55e"/>
<rect x="4" y="5" width="4" height="1" fill="#22c55e"/>
</g>
</svg>
</div>
<div class="dots"><div class="d"></div><div class="d"></div><div class="d"></div><div class="d"></div><div class="d"></div></div>
</div>
<div class="lbl">Connecting...</div>
</div>
<div class="divider"></div>
<!-- ====== 2: With eye, 12° ====== -->
<div class="section">
<h2>2 — With Eye (8×6, 12°)</h2>
<span class="tag">+ eye pixel</span>
<div class="track">
<div class="walk">
<svg width="48" height="36" viewBox="0 0 8 6" class="svg-c">
<g style="transform-origin: 3px 2px; animation: p12t 0.4s ease-in-out infinite;">
<rect x="4" y="0" width="4" height="1" fill="#22c55e"/>
<rect x="3" y="1" width="2" height="1" fill="#22c55e"/>
</g>
<rect x="0" y="2" width="4" height="2" fill="#22c55e"/>
<rect x="4" y="2" width="1" height="2" fill="#4ade80" opacity="0.5"/>
<rect x="1" y="2" width="1" height="1" fill="#09090b"/>
<g style="transform-origin: 3px 4px; animation: p12b 0.4s ease-in-out infinite;">
<rect x="3" y="4" width="2" height="1" fill="#22c55e"/>
<rect x="4" y="5" width="4" height="1" fill="#22c55e"/>
</g>
</svg>
</div>
<div class="dots"><div class="d"></div><div class="d"></div><div class="d"></div><div class="d"></div><div class="d"></div></div>
</div>
<div class="lbl">Connecting...</div>
</div>
<div class="divider"></div>
<!-- ====== 3: With eye, 18° wider ====== -->
<div class="section">
<h2>3 — With Eye (8×6, 18°)</h2>
<span class="tag">wider open</span>
<div class="track">
<div class="walk">
<svg width="48" height="36" viewBox="0 0 8 6" class="svg-c">
<g style="transform-origin: 3px 2px; animation: p18t 0.4s ease-in-out infinite;">
<rect x="4" y="0" width="4" height="1" fill="#22c55e"/>
<rect x="3" y="1" width="2" height="1" fill="#22c55e"/>
</g>
<rect x="0" y="2" width="4" height="2" fill="#22c55e"/>
<rect x="4" y="2" width="1" height="2" fill="#4ade80" opacity="0.5"/>
<rect x="1" y="2" width="1" height="1" fill="#09090b"/>
<g style="transform-origin: 3px 4px; animation: p18b 0.4s ease-in-out infinite;">
<rect x="3" y="4" width="2" height="1" fill="#22c55e"/>
<rect x="4" y="5" width="4" height="1" fill="#22c55e"/>
</g>
</svg>
</div>
<div class="dots"><div class="d"></div><div class="d"></div><div class="d"></div><div class="d"></div><div class="d"></div></div>
</div>
<div class="lbl">Connecting...</div>
</div>
<div class="divider"></div>
<!-- ====== 4: With eye, 25° dramatic ====== -->
<div class="section">
<h2>4 — With Eye (8×6, 25°)</h2>
<span class="tag">big chomp</span>
<div class="track">
<div class="walk">
<svg width="48" height="40" viewBox="0 0 8 6" class="svg-c">
<g style="transform-origin: 3px 2px; animation: p25t 0.4s ease-in-out infinite;">
<rect x="4" y="0" width="4" height="1" fill="#22c55e"/>
<rect x="3" y="1" width="2" height="1" fill="#22c55e"/>
</g>
<rect x="0" y="2" width="4" height="2" fill="#22c55e"/>
<rect x="4" y="2" width="1" height="2" fill="#4ade80" opacity="0.5"/>
<rect x="1" y="2" width="1" height="1" fill="#09090b"/>
<g style="transform-origin: 3px 4px; animation: p25b 0.4s ease-in-out infinite;">
<rect x="3" y="4" width="2" height="1" fill="#22c55e"/>
<rect x="4" y="5" width="4" height="1" fill="#22c55e"/>
</g>
</svg>
</div>
<div class="dots"><div class="d"></div><div class="d"></div><div class="d"></div><div class="d"></div><div class="d"></div></div>
</div>
<div class="lbl">Connecting...</div>
</div>
<div class="divider"></div>
<!-- ====== 5: Longer pincers 9×6, 18° ====== -->
<div class="section">
<h2>5 — Long Pincers (9×6, 18°)</h2>
<span class="tag">+ 1px reach</span>
<div class="track">
<div class="walk">
<svg width="54" height="36" viewBox="0 0 9 6" class="svg-c">
<g style="transform-origin: 4px 2px; animation: p18t 0.4s ease-in-out infinite;">
<rect x="5" y="0" width="4" height="1" fill="#22c55e"/>
<rect x="4" y="1" width="3" height="1" fill="#22c55e"/>
</g>
<rect x="0" y="2" width="5" height="2" fill="#22c55e"/>
<rect x="5" y="2" width="1" height="2" fill="#4ade80" opacity="0.5"/>
<rect x="1" y="2" width="1" height="1" fill="#09090b"/>
<g style="transform-origin: 4px 4px; animation: p18b 0.4s ease-in-out infinite;">
<rect x="4" y="4" width="3" height="1" fill="#22c55e"/>
<rect x="5" y="5" width="4" height="1" fill="#22c55e"/>
</g>
</svg>
</div>
<div class="dots"><div class="d"></div><div class="d"></div><div class="d"></div><div class="d"></div><div class="d"></div></div>
</div>
<div class="lbl">Connecting...</div>
</div>
<div class="divider"></div>
<!-- ====== 6: Curved pincers 8×7, 18° ====== -->
<div class="section">
<h2>6 — Curved Pincers (8×7, 18°)</h2>
<span class="tag">organic shape</span>
<div class="track">
<div class="walk">
<svg width="48" height="42" viewBox="0 0 8 7" class="svg-c">
<g style="transform-origin: 3px 2.5px; animation: p18t 0.4s ease-in-out infinite;">
<rect x="5" y="0" width="3" height="1" fill="#22c55e"/>
<rect x="4" y="1" width="2" height="1" fill="#22c55e"/>
<rect x="3" y="2" width="2" height="1" fill="#22c55e"/>
</g>
<rect x="0" y="3" width="4" height="1" fill="#22c55e"/>
<rect x="4" y="3" width="1" height="1" fill="#4ade80" opacity="0.5"/>
<rect x="1" y="3" width="1" height="1" fill="#09090b"/>
<g style="transform-origin: 3px 4px; animation: p18b 0.4s ease-in-out infinite;">
<rect x="3" y="4" width="2" height="1" fill="#22c55e"/>
<rect x="4" y="5" width="2" height="1" fill="#22c55e"/>
<rect x="5" y="6" width="3" height="1" fill="#22c55e"/>
</g>
</svg>
</div>
<div class="dots"><div class="d"></div><div class="d"></div><div class="d"></div><div class="d"></div><div class="d"></div></div>
</div>
<div class="lbl">Connecting...</div>
</div>
<div class="divider"></div>
<!-- ====== STATIC COMPARISON ====== -->
<div class="section">
<h2>Static Comparison</h2>
<div style="display: flex; gap: 20px; justify-content: center; flex-wrap: wrap;">
<div style="text-align: center;">
<svg width="36" height="27" viewBox="0 0 8 6" class="svg-c">
<rect x="4" y="0" width="4" height="1" fill="#22c55e"/><rect x="3" y="1" width="2" height="1" fill="#22c55e"/>
<rect x="0" y="2" width="4" height="2" fill="#22c55e"/><rect x="4" y="2" width="1" height="2" fill="#4ade80" opacity="0.5"/>
<rect x="3" y="4" width="2" height="1" fill="#22c55e"/><rect x="4" y="5" width="4" height="1" fill="#22c55e"/>
</svg>
<div style="color: #52525b; font-size: 9px; margin-top: 4px;">1</div>
</div>
<div style="text-align: center;">
<svg width="36" height="27" viewBox="0 0 8 6" class="svg-c">
<rect x="4" y="0" width="4" height="1" fill="#22c55e"/><rect x="3" y="1" width="2" height="1" fill="#22c55e"/>
<rect x="0" y="2" width="4" height="2" fill="#22c55e"/><rect x="4" y="2" width="1" height="2" fill="#4ade80" opacity="0.5"/>
<rect x="1" y="2" width="1" height="1" fill="#09090b"/>
<rect x="3" y="4" width="2" height="1" fill="#22c55e"/><rect x="4" y="5" width="4" height="1" fill="#22c55e"/>
</svg>
<div style="color: #52525b; font-size: 9px; margin-top: 4px;">2-4</div>
</div>
<div style="text-align: center;">
<svg width="40" height="27" viewBox="0 0 9 6" class="svg-c">
<rect x="5" y="0" width="4" height="1" fill="#22c55e"/><rect x="4" y="1" width="3" height="1" fill="#22c55e"/>
<rect x="0" y="2" width="5" height="2" fill="#22c55e"/><rect x="5" y="2" width="1" height="2" fill="#4ade80" opacity="0.5"/>
<rect x="1" y="2" width="1" height="1" fill="#09090b"/>
<rect x="4" y="4" width="3" height="1" fill="#22c55e"/><rect x="5" y="5" width="4" height="1" fill="#22c55e"/>
</svg>
<div style="color: #52525b; font-size: 9px; margin-top: 4px;">5</div>
</div>
<div style="text-align: center;">
<svg width="36" height="32" viewBox="0 0 8 7" class="svg-c">
<rect x="5" y="0" width="3" height="1" fill="#22c55e"/><rect x="4" y="1" width="2" height="1" fill="#22c55e"/><rect x="3" y="2" width="2" height="1" fill="#22c55e"/>
<rect x="0" y="3" width="4" height="1" fill="#22c55e"/><rect x="4" y="3" width="1" height="1" fill="#4ade80" opacity="0.5"/>
<rect x="1" y="3" width="1" height="1" fill="#09090b"/>
<rect x="3" y="4" width="2" height="1" fill="#22c55e"/><rect x="4" y="5" width="2" height="1" fill="#22c55e"/><rect x="5" y="6" width="3" height="1" fill="#22c55e"/>
</svg>
<div style="color: #52525b; font-size: 9px; margin-top: 4px;">6</div>
</div>
</div>
</div>
</body>
</html>