Files

245 lines
19 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>⟁ euri-pkgs</title>
<script src="https://cdn.tailwindcss.com"></script>
<script>
tailwind.config = {
theme: {
extend: {
colors: {
abyss: '#06060f',
surface: '#0b0b1a',
card: '#0f0f24',
border: '#1a1a35',
muted: '#3a3a5a',
dim: '#5a5a7a',
base: '#c0c0d0',
bright: '#e0e0f0',
accent: '#4A9EFF',
'accent-glow': '#6aBEFF',
}
}
}
}
</script>
<style>
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap');
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
background: #06060f; color: #c0c0d0; min-height: 100vh;
}
.glow { box-shadow: 0 0 40px -12px rgba(74, 158, 255, 0.15); }
.glow:hover { box-shadow: 0 0 60px -8px rgba(74, 158, 255, 0.25); }
th { cursor: pointer; user-select: none; position: sticky; top: 0; z-index: 10; }
th:hover { color: #4A9EFF !important; }
th .arrow { opacity: 0; display: inline-block; transition: all 0.2s; }
th:hover .arrow, th.asc .arrow, th.desc .arrow { opacity: 1; }
th.asc .arrow { transform: rotate(0deg); }
th.desc .arrow { transform: rotate(180deg); }
tr.row { transition: background 0.15s, transform 0.15s; }
tr.row:hover { background: rgba(74, 158, 255, 0.04); }
tr.row td:first-child { border-radius: 8px 0 0 8px; }
tr.row td:last-child { border-radius: 0 8px 8px 0; }
.badge { transition: all 0.2s; }
.badge:hover { filter: brightness(1.2); transform: translateY(-1px); }
.fade-in { animation: fadeIn 0.5s ease-out both; }
@keyframes fadeIn { from { opacity: 0; transform: translateY(12px); } to { opacity: 1; transform: translateY(0); } }
.pulse-dot {
display: inline-block; width: 8px; height: 8px; border-radius: 50%;
background: #2ECC71; margin-right: 6px;
animation: pulse 2s ease-in-out infinite;
}
@keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.3; } }
input[type="text"]:focus { outline: none; border-color: #4A9EFF !important; box-shadow: 0 0 0 3px rgba(74, 158, 255, 0.1); }
::-webkit-scrollbar { width: 6px; height: 6px; }
::-webkit-scrollbar-track { background: #0b0b1a; }
::-webkit-scrollbar-thumb { background: #1a1a35; border-radius: 3px; }
::-webkit-scrollbar-thumb:hover { background: #3a3a5a; }
@media (max-width: 640px) { .hide-mobile { display: none; } }
</style>
</head>
<body>
<div class="max-w-6xl mx-auto px-4 sm:px-6 py-8">
<!-- Header -->
<div class="text-center mb-10 fade-in">
<h1 class="text-5xl sm:text-6xl font-light tracking-tight text-bright">
<span class="font-normal text-accent">euri</span><span class="text-dim font-light">-pkgs</span>
</h1>
<p class="text-dim text-sm mt-3 max-w-xl mx-auto leading-relaxed">
Custom package repository for Euri Linux ISO builds.
<br class="sm:hidden">Packages are built automatically via CI.
</p>
</div>
<!-- Stats bar -->
<div class="flex flex-wrap gap-4 justify-center mb-8 text-xs text-dim">
<span class="bg-surface border border-border rounded-full px-4 py-2 flex items-center gap-2">
<span class="pulse-dot"></span> 21 packages
</span>
<span class="bg-surface border border-border rounded-full px-4 py-2">50 MB total</span>
<span class="bg-surface border border-border rounded-full px-4 py-2">updated 2026-06-28 16:11 UTC</span>
</div>
<!-- Setup collapsible -->
<details class="bg-card border border-border rounded-xl mb-6 glow transition-all duration-300 group">
<summary class="px-5 py-4 text-accent cursor-pointer text-sm font-medium select-none
list-none flex items-center gap-2 hover:text-accent-glow transition-colors">
<svg class="w-4 h-4 transition-transform duration-200 group-open:rotate-90" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7" />
</svg>
Setup — add this repository to your <code class="text-bright bg-abyss px-1.5 py-0.5 rounded text-xs">pacman.conf</code>
</summary>
<div class="px-5 pb-5">
<pre class="bg-abyss border border-border rounded-lg p-4 text-sm overflow-x-auto font-['JetBrains_Mono'] text-dim leading-relaxed">
<span class="text-muted"># /etc/pacman.conf</span>
<span class="text-accent">[euri-pkgs]</span>
SigLevel = <span class="text-[#6aaf6a]">Optional TrustAll</span>
Server = <span class="text-[#6aaf6a]">https://euri-linux.github.io/euri-packages/</span><span class="text-[#e0e0f0]">$repo</span>/os/<span class="text-[#e0e0f0]">$arch</span></pre>
</div>
</details>
<!-- Controls -->
<div class="flex flex-wrap gap-3 items-center mb-5">
<div class="relative flex-1 min-w-[200px]">
<svg class="absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" />
</svg>
<input type="text" id="q" placeholder="Search packages..." autofocus
class="w-full bg-card border border-border rounded-lg pl-10 pr-4 py-2.5 text-sm text-base placeholder:text-muted transition-all" />
</div>
<select id="catFilter"
class="bg-card border border-border rounded-lg px-3 py-2.5 text-sm text-dim cursor-pointer hover:text-base transition-colors">
<option value="all">All categories</option>
<option value="installer">Installer</option>
<option value="branding">Branding</option>
<option value="core">Core</option>
<option value="desktop">Desktop</option>
<option value="tool">Tool</option>
<option value="other">Other</option>
</select>
<span class="text-xs text-dim" id="count">21 packages</span>
</div>
<!-- Table -->
<div class="bg-card border border-border rounded-xl overflow-hidden glow">
<div class="overflow-x-auto">
<table class="w-full text-sm">
<thead>
<tr class="bg-abyss/50 text-muted text-xs uppercase tracking-wider">
<th class="px-4 py-3.5 text-left font-semibold" data-col="name" onclick="sort('name')">
Package <span class="arrow"></span>
</th>
<th class="px-4 py-3.5 text-left font-semibold hide-mobile" data-col="version" onclick="sort('version')">
Version <span class="arrow"></span>
</th>
<th class="px-4 py-3.5 text-left font-semibold hide-mobile" data-col="arch" onclick="sort('arch')">
Arch <span class="arrow"></span>
</th>
<th class="px-4 py-3.5 text-left font-semibold" data-col="category" onclick="sort('category')">
Category <span class="arrow"></span>
</th>
<th class="px-4 py-3.5 text-right font-semibold hide-mobile" data-col="size" onclick="sort('size')">
Size <span class="arrow"></span>
</th>
<th class="px-4 py-3.5 text-right font-semibold hide-mobile" data-col="mtime" onclick="sort('mtime')">
Updated <span class="arrow"></span>
</th>
</tr>
</thead>
<tbody id="list"></tbody>
</table>
</div>
</div>
<!-- Footer -->
<div class="text-center mt-10 text-xs text-muted">
<a href="https://github.com/Euri-Linux/euri-packages" class="hover:text-accent transition-colors">GitHub</a>
<span class="mx-2">·</span>
<a href="https://euri-linux.github.io/euri-packages/" class="hover:text-accent transition-colors">euri-linux.github.io</a>
<span class="mx-2">·</span>
<a href="https://github.com/Euri-Linux/euri-iso" class="hover:text-accent transition-colors">ISO repo</a>
</div>
</div>
<script>
const pkgs = [{"file": "euri-live-2026.06-2-any.pkg.tar.zst", "name": "('euri-live-base", "version": "2026.06-2", "arch": "any", "size": 2341888, "mtime": "2026-06-28T16:11:37.154843+00:00", "mtime_display": "2026-06-28 16:11 UTC", "category": "other", "cat_color": "#7F8C8D", "description": "Euri live session", "url": "https://github.com/Euri-Linux/euri-live", "license": "('GPL')", "depends": []}, {"file": "euri-grub-theme-2026.06-1-any.pkg.tar.zst", "name": "euri-grub-theme", "version": "2026.06-1", "arch": "any", "size": 4827136, "mtime": "2026-06-28T16:11:37.146843+00:00", "mtime_display": "2026-06-28 16:11 UTC", "category": "desktop", "cat_color": "#F39C12", "description": "Euri GRUB theme", "url": "https://github.com/Euri-Linux/euri-branding", "license": "('GPL')", "depends": ["grub"]}, {"file": "euri-desktop-settings-1-1-any.pkg.tar.zst", "name": "euri-desktop-settings", "version": "1-1", "arch": "any", "size": 505856, "mtime": "2026-06-28T16:11:37.156843+00:00", "mtime_display": "2026-06-28 16:11 UTC", "category": "branding", "cat_color": "#9B59B6", "description": "Euri Linux desktop settings, theme, and color scheme", "url": "https://github.com/Euri-Linux/euri-pkgs", "license": "('GPL3')", "depends": ["breeze-icons", "breeze-gtk", "ttf-opensans", "noto-fonts"]}, {"file": "euri-keyring-1-1-any.pkg.tar.zst", "name": "euri-keyring", "version": "1-1", "arch": "any", "size": 5147648, "mtime": "2026-06-28T16:11:37.173843+00:00", "mtime_display": "2026-06-28 16:11 UTC", "category": "core", "cat_color": "#2ECC71", "description": "Euri Linux GPG keyring", "url": "https://github.com/Euri-Linux/euri-pkgs", "license": "('GPL3')", "depends": []}, {"file": "euri-memes-1.0-1-any.pkg.tar.zst", "name": "euri-memes", "version": "1.0-1", "arch": "any", "size": 265216, "mtime": "2026-06-28T16:11:37.174843+00:00", "mtime_display": "2026-06-28 16:11 UTC", "category": "desktop", "cat_color": "#F39C12", "description": "Euri Linux welcome audio", "url": "https://github.com/Euri-Linux", "license": "('custom:fairuse')", "depends": []}, {"file": "euri-mirrorlist-1-1-any.pkg.tar.zst", "name": "euri-mirrorlist", "version": "1-1", "arch": "any", "size": 4196352, "mtime": "2026-06-28T16:11:37.187843+00:00", "mtime_display": "2026-06-28 16:11 UTC", "category": "core", "cat_color": "#2ECC71", "description": "Euri Linux mirror list", "url": "https://github.com/Euri-Linux/euri-pkgs", "license": "('GPL3')", "depends": []}, {"file": "euri-release-2026.06-1-any.pkg.tar.zst", "name": "euri-release", "version": "2026.06-1", "arch": "any", "size": 3473408, "mtime": "2026-06-28T16:11:37.199843+00:00", "mtime_display": "2026-06-28 16:11 UTC", "category": "core", "cat_color": "#2ECC71", "description": "Euri Linux release file", "url": "https://github.com/Euri-Linux", "license": "('GPL3')", "depends": []}, {"file": "euri-wallpapers-0.7-4-any.pkg.tar.zst", "name": "euri-wallpapers", "version": "0.7-4", "arch": "any", "size": 2386944, "mtime": "2026-06-28T16:11:37.207843+00:00", "mtime_display": "2026-06-28 16:11 UTC", "category": "branding", "cat_color": "#9B59B6", "description": "Euri Linux wallpapers", "url": "https://github.com/Euri/wallpapers", "license": "('GPL3')", "depends": []}, {"file": "euri-welcome-0.1-3-any.pkg.tar.zst", "name": "euri-welcome", "version": "0.1-3", "arch": "any", "size": 3249152, "mtime": "2026-06-28T16:11:37.217843+00:00", "mtime_display": "2026-06-28 16:11 UTC", "category": "desktop", "cat_color": "#F39C12", "description": "Welcome screen and support tool for new Euri Linux users", "url": "https://github.com/Euri-Linux/euri-welcome", "license": "('GPL3')", "depends": ["gtk3", "python", "python-gobject", "python-cairo"]}, {"file": "bloatware-remover-0.1-1-any.pkg.tar.zst", "name": "bloatware-remover", "version": "0.1-1", "arch": "any", "size": 2554880, "mtime": "2026-06-28T16:11:37.226843+00:00", "mtime_display": "2026-06-28 16:11 UTC", "category": "other", "cat_color": "#7F8C8D", "description": "", "url": "", "license": "", "depends": []}, {"file": "calamares-3.4.2-6-x86_64.pkg.tar.zst", "name": "calamares-3.4.2", "version": "3.4.2-6", "arch": "x86_64", "size": 234496, "mtime": "2026-06-28T16:11:37.227843+00:00", "mtime_display": "2026-06-28 16:11 UTC", "category": "installer", "cat_color": "#4A9EFF", "description": "", "url": "", "license": "", "depends": []}, {"file": "calamares-branding-euri-1.0-16-any.pkg.tar.zst", "name": "calamares-branding-euri", "version": "1.0-16", "arch": "any", "size": 4476928, "mtime": "2026-06-28T16:11:37.241843+00:00", "mtime_display": "2026-06-28 16:11 UTC", "category": "installer", "cat_color": "#4A9EFF", "description": "Calamares branding for Euri Linux with offline/online installer support", "url": "https://github.com/Euri-Linux", "license": "('GPL3')", "depends": ["calamares' 'yad"]}, {"file": "configure-1.6-1-x86_64.pkg.tar.zst", "name": "configure-1.6", "version": "1.6-1", "arch": "x86_64", "size": 1199104, "mtime": "2026-06-28T16:11:37.246843+00:00", "mtime_display": "2026-06-28 16:11 UTC", "category": "other", "cat_color": "#7F8C8D", "description": "", "url": "", "license": "", "depends": []}, {"file": "gentoo-challenge-failed-3.0-1-any.pkg.tar.zst", "name": "gentoo-challenge-failed", "version": "3.0-1", "arch": "any", "size": 724992, "mtime": "2026-06-28T16:11:37.248843+00:00", "mtime_display": "2026-06-28 16:11 UTC", "category": "other", "cat_color": "#7F8C8D", "description": "", "url": "", "license": "", "depends": []}, {"file": "i-use-artix-btw-2.0-1-any.pkg.tar.zst", "name": "i-use-artix-btw", "version": "2.0-1", "arch": "any", "size": 4995072, "mtime": "2026-06-28T16:11:37.264843+00:00", "mtime_display": "2026-06-28 16:11 UTC", "category": "other", "cat_color": "#7F8C8D", "description": "", "url": "", "license": "", "depends": []}, {"file": "neofetch-but-rust-0.5-1-any.pkg.tar.zst", "name": "neofetch-but-rust", "version": "0.5-1", "arch": "any", "size": 2647040, "mtime": "2026-06-28T16:11:37.273843+00:00", "mtime_display": "2026-06-28 16:11 UTC", "category": "other", "cat_color": "#7F8C8D", "description": "", "url": "", "license": "", "depends": []}, {"file": "pacman-broke-my-system-9.9-1-any.pkg.tar.zst", "name": "pacman-broke-my-system", "version": "9.9-1", "arch": "any", "size": 2330624, "mtime": "2026-06-28T16:11:37.281843+00:00", "mtime_display": "2026-06-28 16:11 UTC", "category": "other", "cat_color": "#7F8C8D", "description": "", "url": "", "license": "", "depends": []}, {"file": "ptsd-from-sudo-1.0-1-any.pkg.tar.zst", "name": "ptsd-from-sudo", "version": "1.0-1", "arch": "any", "size": 4167680, "mtime": "2026-06-28T16:11:37.294843+00:00", "mtime_display": "2026-06-28 16:11 UTC", "category": "other", "cat_color": "#7F8C8D", "description": "", "url": "", "license": "", "depends": []}, {"file": "rms-approved-4.0-1-any.pkg.tar.zst", "name": "rms-approved", "version": "4.0-1", "arch": "any", "size": 361472, "mtime": "2026-06-28T16:11:37.296843+00:00", "mtime_display": "2026-06-28 16:11 UTC", "category": "other", "cat_color": "#7F8C8D", "description": "", "url": "", "license": "", "depends": []}, {"file": "steve-jobs-would-never-1.0-1-any.pkg.tar.zst", "name": "steve-jobs-would-never", "version": "1.0-1", "arch": "any", "size": 262144, "mtime": "2026-06-28T16:11:37.297843+00:00", "mtime_display": "2026-06-28 16:11 UTC", "category": "other", "cat_color": "#7F8C8D", "description": "", "url": "", "license": "", "depends": []}, {"file": "systemd-bad-1.0-1-any.pkg.tar.zst", "name": "systemd-bad", "version": "1.0-1", "arch": "any", "size": 1938432, "mtime": "2026-06-28T16:11:37.304843+00:00", "mtime_display": "2026-06-28 16:11 UTC", "category": "other", "cat_color": "#7F8C8D", "description": "", "url": "", "license": "", "depends": []}];
let sortCol = 'name';
let sortDir = 1;
let filtered = pkgs;
function formatSize(bytes) {
const mb = bytes / 1024 / 1024;
return mb >= 1 ? mb.toFixed(1) + ' MB' : (bytes / 1024).toFixed(0) + ' KB';
}
function escapeHtml(s) {
const d = document.createElement('div');
d.textContent = s;
return d.innerHTML;
}
function render() {
const q = document.getElementById('q').value.toLowerCase();
const cat = document.getElementById('catFilter').value;
filtered = pkgs.filter(p => {
const matchSearch = p.name.toLowerCase().includes(q) || p.description.toLowerCase().includes(q);
const matchCat = cat === 'all' || p.category === cat;
return matchSearch && matchCat;
});
// sort
filtered.sort((a, b) => {
let va = a[sortCol], vb = b[sortCol];
if (sortCol === 'size' || sortCol === 'mtime') { va = a[sortCol]; vb = b[sortCol]; return (va - vb) * sortDir; }
if (typeof va === 'string') va = va.toLowerCase();
if (typeof vb === 'string') vb = vb.toLowerCase();
if (va < vb) return -1 * sortDir;
if (va > vb) return 1 * sortDir;
return 0;
});
const tbody = document.getElementById('list');
tbody.innerHTML = filtered.map((p, i) => {
const catLabel = p.category.charAt(0).toUpperCase() + p.category.slice(1);
return `<tr class="row" style="animation-delay: ${i * 30}ms">
<td class="px-4 py-3">
<div class="flex items-center gap-2.5">
<a href="${escapeHtml(p.file)}" class="text-accent hover:text-accent-glow font-medium transition-colors truncate max-w-[200px] sm:max-w-none block">${escapeHtml(p.name)}</a>
</div>
<div class="text-dim text-xs mt-0.5 truncate max-w-[280px] sm:max-w-none">${escapeHtml(p.description)}</div>
</td>
<td class="px-4 py-3 text-dim hide-mobile font-mono text-xs">${escapeHtml(p.version)}</td>
<td class="px-4 py-3 hide-mobile"><span class="text-xs bg-abyss border border-border rounded px-1.5 py-0.5 text-dim">${escapeHtml(p.arch)}</span></td>
<td class="px-4 py-3">
<span class="badge inline-block text-xs font-medium rounded-full px-2.5 py-0.5" style="background: ${p.cat_color}18; color: ${p.cat_color}; border: 1px solid ${p.cat_color}33">${catLabel}</span>
</td>
<td class="px-4 py-3 text-dim text-right hide-mobile font-mono text-xs">${formatSize(p.size)}</td>
<td class="px-4 py-3 text-dim text-right hide-mobile text-xs">${p.mtime_display}</td>
</tr>`;
}).join('');
document.getElementById('count').textContent = filtered.length + ' / ' + pkgs.length + ' packages';
}
function sort(col) {
if (sortCol === col) { sortDir *= -1; } else { sortCol = col; sortDir = 1; }
document.querySelectorAll('th').forEach(th => th.classList.remove('asc', 'desc'));
const el = document.querySelector(`th[data-col="${col}"]`);
if (el) el.classList.add(sortDir === 1 ? 'asc' : 'desc');
render();
}
document.getElementById('q').addEventListener('input', render);
document.getElementById('catFilter').addEventListener('change', render);
// init: sort by name asc
document.querySelector('th[data-col="name"]').classList.add('asc');
render();
</script>
</body>
</html>