Files
zeekay 69044688fa the face is Zen, and it ships from @hanzo/font
One family. Font stacks name Zen and fall back to the native faces, tokens
name the role rather than a face, and the packages that used to supply a
face now point at @hanzo/font.

Self-hosted @font-face blocks are removed rather than renamed: rewriting the
family in one would leave a src pointing at a file this repo no longer ships.
@hanzo/font carries the binaries and declares the faces, so the local copies
go with the declaration that used them.

Comments naming a face we no longer use are deleted, not reworded.
2026-09-02 03:04:46 -07:00

190 lines
7.0 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Zoo AI - Open Source</title>
<meta name="description" content="Open source projects from Zoo AI">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="" rel="stylesheet">
<style>
:root {
--brand: #8b5cf6;
--bg-primary: #0a0a0a;
--bg-secondary: #141414;
--bg-card: rgba(23, 23, 23, 0.5);
--border: #262626;
--text-primary: #fafafa;
--text-secondary: #a3a3a3;
--text-muted: #737373;
}
* { box-sizing: border-box; margin: 0; padding: 0; }
body {
font-family: Zen, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
background: var(--bg-primary);
color: var(--text-primary);
line-height: 1.6;
min-height: 100vh;
}
.hero {
position: relative;
padding: 80px 24px 60px;
text-align: center;
overflow: hidden;
}
.hero::before {
content: '';
position: absolute;
top: 0; left: 50%;
transform: translateX(-50%);
width: 800px; height: 600px;
background: radial-gradient(ellipse at center, var(--brand) 0%, transparent 70%);
opacity: 0.08;
filter: blur(100px);
pointer-events: none;
}
.hero-content { position: relative; max-width: 800px; margin: 0 auto; }
.logo {
width: 80px; height: 80px;
margin: 0 auto 24px;
background: linear-gradient(135deg, var(--brand) 0%, color-mix(in srgb, var(--brand) 70%, white) 100%);
border-radius: 20px;
display: flex;
align-items: center;
justify-content: center;
font-size: 36px;
font-weight: 700;
color: white;
}
h1 { font-size: clamp(2.5rem, 5vw, 3.5rem); font-weight: 700; margin-bottom: 16px; }
h1 span { color: var(--text-secondary); }
.subtitle { font-size: 1.25rem; color: var(--text-secondary); margin-bottom: 32px; }
.stats {
display: flex;
gap: 32px;
justify-content: center;
padding: 24px 0;
border-top: 1px solid var(--border);
border-bottom: 1px solid var(--border);
margin: 32px 0;
}
.stat { text-align: center; }
.stat-value { font-size: 2rem; font-weight: 700; }
.stat-label { font-size: 14px; color: var(--text-muted); }
main { max-width: 1200px; margin: 0 auto; padding: 0 24px 80px; }
.section-title {
font-size: 1.5rem;
font-weight: 600;
margin-bottom: 24px;
display: flex;
align-items: center;
gap: 12px;
}
.section-title::after { content: ''; flex: 1; height: 1px; background: var(--border); }
.repos-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 12px;
}
.repo-card {
display: block;
padding: 16px;
background: var(--bg-card);
border: 1px solid var(--border);
border-radius: 8px;
text-decoration: none;
color: inherit;
transition: all 0.2s;
}
.repo-card:hover { border-color: var(--text-muted); }
.repo-name { font-size: 15px; font-weight: 500; color: var(--brand); margin-bottom: 4px; }
.repo-desc {
font-size: 13px;
color: var(--text-secondary);
margin-bottom: 8px;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
}
.repo-meta { display: flex; gap: 12px; font-size: 12px; color: var(--text-muted); }
.loading { text-align: center; padding: 48px; color: var(--text-muted); }
.spinner {
width: 32px; height: 32px;
border: 3px solid var(--border);
border-top-color: var(--brand);
border-radius: 50%;
animation: spin 1s linear infinite;
margin: 0 auto 16px;
}
@keyframes spin { to { transform: rotate(360deg); } }
footer {
text-align: center;
padding: 32px 24px;
color: var(--text-muted);
font-size: 14px;
border-top: 1px solid var(--border);
}
footer a { color: var(--text-secondary); text-decoration: none; }
footer a:hover { color: var(--brand); }
</style>
</head>
<body>
<header class="hero">
<div class="hero-content">
<div class="logo">Z</div>
<h1>Zoo AI <span>Open Source</span></h1>
<p class="subtitle">Decentralized AI Research Network</p>
<div class="stats">
<div class="stat"><div class="stat-value" id="repo-count">--</div><div class="stat-label">Repositories</div></div>
<div class="stat"><div class="stat-value" id="star-count">--</div><div class="stat-label">Stars</div></div>
<div class="stat"><div class="stat-value" id="fork-count">--</div><div class="stat-label">Forks</div></div>
</div>
</div>
</header>
<main>
<section>
<h2 class="section-title">All Repositories</h2>
<div class="repos-grid" id="repos-list">
<div class="loading"><div class="spinner"></div><p>Loading repositories...</p></div>
</div>
</section>
</main>
<footer>
<p><a href="https://github.com/zooai">GitHub</a></p>
</footer>
<script>
const ORG = 'zooai';
const API = `https://api.github.com/${ORG.includes('/') ? 'users' : 'orgs'}/${ORG}/repos?per_page=100&sort=updated`;
async function fetchRepos() {
try {
const response = await fetch(API);
const repos = await response.json();
if (!Array.isArray(repos)) throw new Error('Invalid');
const totalStars = repos.reduce((s, r) => s + (r.stargazers_count || 0), 0);
const totalForks = repos.reduce((s, r) => s + (r.forks_count || 0), 0);
document.getElementById('repo-count').textContent = repos.length;
document.getElementById('star-count').textContent = totalStars > 1000 ? (totalStars/1000).toFixed(1)+'k' : totalStars;
document.getElementById('fork-count').textContent = totalForks > 1000 ? (totalForks/1000).toFixed(1)+'k' : totalForks;
const publicRepos = repos.filter(r => !r.fork && !r.archived).sort((a,b) => (b.stargazers_count||0) - (a.stargazers_count||0));
document.getElementById('repos-list').innerHTML = publicRepos.map(repo => `
<a href="${repo.html_url}" class="repo-card" target="_blank">
<div class="repo-name">${repo.name}</div>
<p class="repo-desc">${repo.description || 'No description'}</p>
<div class="repo-meta">
${repo.language ? `<span>${repo.language}</span>` : ''}
<span>⭐ ${repo.stargazers_count || 0}</span>
<span>🍴 ${repo.forks_count || 0}</span>
</div>
</a>
`).join('');
} catch (e) {
document.getElementById('repos-list').innerHTML = '<p style="color:var(--text-muted);grid-column:1/-1;text-align:center;padding:24px;">Failed to load. <a href="https://github.com/zooai" style="color:var(--brand);">View on GitHub</a></p>';
}
}
fetchRepos();
</script>
</body>
</html>