feat: scaffold Rabby Rust Tauri terminal
test / core (push) Successful in 1m55s

This commit is contained in:
Tom You
2026-07-06 10:44:47 +00:00
commit 04ef2fe57d
21 changed files with 9460 additions and 0 deletions
+15
View File
@@ -0,0 +1,15 @@
async function loadFeatures(){
const fallback = [
["Terminal", "VT-style surface, tabs, split panes, Unicode"],
["Connections", "Local shell, SSH, Telnet, Serial profile model"],
["UX", "Command palette, shortcuts, quake window, restored sessions"],
["Footprint", "Rust core + Tauri shell instead of Electron"]
];
let rows = fallback;
try {
const { invoke } = window.__TAURI__.core;
rows = (await invoke('workspace_summary')).map(x => [x.feature, x.detail]);
} catch (_) {}
document.getElementById('features').innerHTML = rows.map(([f,d]) => `<li><b>${f}</b>: ${d}</li>`).join('');
}
loadFeatures();
+41
View File
@@ -0,0 +1,41 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Rabby</title>
<link rel="stylesheet" href="styles.css" />
</head>
<body>
<aside class="sidebar">
<div class="brand"><span class="logo"></span><div><strong>Rabby</strong><small>Rust + Tauri terminal</small></div></div>
<button class="primary">+ New tab</button>
<nav>
<a class="active">⌘ Local Shell</a>
<a>🔐 SSH: production</a>
<a>☎ Telnet lab</a>
<a>🔌 Serial /dev/ttyUSB0</a>
</nav>
<section><h3>Features</h3><ul id="features"><li>Loading Rust backend…</li></ul></section>
</aside>
<main>
<header class="tabs">
<div class="tab active">Local Shell <span></span></div><div class="tab">Prod SSH</div><div class="spacer"></div><button>Command palette</button><button>Quake mode</button>
</header>
<section class="workspace">
<div class="pane large"><div class="chrome">bash — rabby-core tests</div><pre>$ cargo test -p rabby-core
running 6 tests
test slug_normalizes_profile_ids ... ok
test profile_validation_rejects_empty_command ... ok
test split_panes_count_nested_leaves ... ok
test split_ratio_has_sane_bounds ... ok
test workspace_adds_tabs_for_known_profiles ... ok
test feature_matrix_covers_tabby_readme_capabilities ... ok
Rabby keeps Tabby-style UX while moving the app shell to Rust/Tauri.</pre></div>
<div class="pane"><div class="chrome">profile inspector</div><div class="cards"><article><b>Session restore</b><p>Tabs and split tree are represented in Rust.</p></article><article><b>Small footprint target</b><p>No Electron runtime; static HTML/CSS plus Tauri backend.</p></article></div></div>
</section>
</main>
<script src="app.js"></script>
</body>
</html>
+1
View File
@@ -0,0 +1 @@
:root{font-family:Inter,ui-sans-serif,system-ui;color:#dce7ff;background:#090d18}*{box-sizing:border-box}body{margin:0;display:flex;min-height:100vh;background:radial-gradient(circle at 70% 10%,#203d7a55,transparent 38%),#090d18}.sidebar{width:290px;padding:22px;border-right:1px solid #263149;background:#0d1324cc;backdrop-filter:blur(14px)}.brand{display:flex;gap:12px;align-items:center;margin-bottom:24px}.logo{display:grid;place-items:center;width:42px;height:42px;border-radius:12px;background:linear-gradient(135deg,#7c5cff,#00d4ff);box-shadow:0 0 34px #3b82f6}.brand small{display:block;color:#8ea0c5}.primary,button{border:1px solid #34425f;background:#141d33;color:#e8f0ff;border-radius:10px;padding:10px 13px}button.primary{width:100%;background:linear-gradient(135deg,#5d5fef,#16c5d9);border:0;font-weight:700}nav{display:grid;gap:8px;margin:22px 0}nav a{padding:11px 12px;border-radius:10px;color:#aebfe4}.active,nav a:hover{background:#1d2a49;color:white}h3{font-size:12px;text-transform:uppercase;letter-spacing:.14em;color:#6f82aa}ul{padding-left:20px;color:#aebfe4;line-height:1.5}main{flex:1;display:flex;flex-direction:column}.tabs{height:62px;display:flex;gap:8px;align-items:center;padding:0 18px;border-bottom:1px solid #263149;background:#0b1020}.tab{padding:12px 16px;border-radius:12px 12px 0 0;background:#10182d;color:#aebfe4}.tab.active{background:#18233d;color:#fff}.tab span{color:#20e3b2}.spacer{flex:1}.workspace{flex:1;display:grid;grid-template-columns:1.35fr .65fr;gap:16px;padding:18px}.pane{border:1px solid #273753;border-radius:18px;background:#0c1222;overflow:hidden;box-shadow:0 24px 70px #0008}.chrome{height:42px;display:flex;align-items:center;padding:0 16px;background:#111a30;border-bottom:1px solid #273753;color:#8fa4d0;font-size:13px}pre{margin:0;padding:22px;color:#8df7c8;font:15px/1.6 'SFMono-Regular',Consolas,monospace}.cards{display:grid;gap:14px;padding:16px}article{padding:16px;border-radius:14px;background:#121d34;border:1px solid #283957}article p{color:#9fb0d4}