depot-apt/app/index.html

550 lines
16 KiB
HTML

<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>GN dépôt</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;700&family=Sora:wght@300;400;600;700&display=swap" rel="stylesheet">
<style>
:root {
--bg: #0d1117;
--surface: #161b22;
--surface2: #21262d;
--border: #30363d;
--accent: #58a6ff;
--accent2: #3fb950;
--accent3: #f78166;
--text: #e6edf3;
--text-muted: #8b949e;
--radius: 12px;
}
* { box-sizing: border-box; margin: 0; padding: 0; }
body {
font-family: 'Sora', sans-serif;
background-color: var(--bg);
color: var(--text);
line-height: 1.7;
min-height: 100vh;
}
body::before {
content: '';
position: fixed;
inset: 0;
background-image:
linear-gradient(rgba(88,166,255,0.03) 1px, transparent 1px),
linear-gradient(90deg, rgba(88,166,255,0.03) 1px, transparent 1px);
background-size: 40px 40px;
pointer-events: none;
z-index: 0;
}
.wrapper {
position: relative;
z-index: 1;
max-width: 860px;
margin: 0 auto;
padding: 3em 1.5em 4em;
}
header {
text-align: center;
margin-bottom: 3em;
animation: fadeDown 0.6s ease both;
}
header img.logo {
max-width: 160px;
margin-bottom: 1.5em;
filter: drop-shadow(0 0 20px rgba(88,166,255,0.25));
}
header h1 {
font-size: 1.9em;
font-weight: 700;
color: var(--text);
letter-spacing: -0.02em;
}
header h1 span { color: var(--accent); }
header p {
color: var(--text-muted);
margin-top: 0.6em;
font-size: 1em;
font-weight: 300;
}
section {
margin-bottom: 2.5em;
animation: fadeUp 0.5s ease both;
}
section:nth-child(2) { animation-delay: 0.1s; }
section:nth-child(3) { animation-delay: 0.2s; }
section:nth-child(4) { animation-delay: 0.3s; }
.section-title {
font-size: 0.75em;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.12em;
color: var(--accent);
margin-bottom: 1em;
display: flex;
align-items: center;
gap: 0.6em;
}
.section-title::after {
content: '';
flex: 1;
height: 1px;
background: var(--border);
}
/* --- Bloc installation principale --- */
.install-card {
background: var(--surface);
border: 1px solid var(--border);
border-radius: var(--radius);
overflow: hidden;
}
.install-card-header {
padding: 1.2em 1.5em;
border-bottom: 1px solid var(--border);
}
.install-card-header p {
color: var(--text-muted);
font-size: 0.92em;
margin-bottom: 0.4em;
}
.install-card-header p:last-child { margin-bottom: 0; }
.badge-list {
display: flex;
flex-wrap: wrap;
gap: 0.5em;
margin-top: 0.8em;
}
.badge {
font-size: 0.75em;
font-family: 'JetBrains Mono', monospace;
background: var(--surface2);
border: 1px solid var(--border);
border-radius: 20px;
padding: 0.2em 0.7em;
color: var(--text-muted);
display: flex;
align-items: center;
gap: 0.4em;
}
.badge .dot {
width: 6px;
height: 6px;
border-radius: 50%;
background: var(--accent2);
}
/* Code blocks */
.code-block {
position: relative;
background: #0d1117;
}
pre {
font-family: 'JetBrains Mono', monospace;
font-size: 0.85em;
padding: 1.2em 1.4em;
padding-right: 5em;
overflow-x: auto;
color: #e6edf3;
line-height: 1.6;
}
.copy-btn {
position: absolute;
top: 0.7em;
right: 0.7em;
background: var(--surface2);
border: 1px solid var(--border);
color: var(--text-muted);
border-radius: 6px;
padding: 0.3em 0.75em;
font-size: 0.75em;
font-family: 'Sora', sans-serif;
cursor: pointer;
transition: all 0.2s;
white-space: nowrap;
}
.copy-btn:hover { background: var(--accent); color: var(--bg); border-color: var(--accent); }
.copy-btn.copied { background: var(--accent2); color: var(--bg); border-color: var(--accent2); }
/* Détails manuels (accordéon) */
.manual-toggle {
width: 100%;
background: var(--surface2);
border: none;
border-top: 1px solid var(--border);
color: var(--text-muted);
font-family: 'Sora', sans-serif;
font-size: 0.82em;
padding: 0.8em 1.4em;
text-align: left;
cursor: pointer;
display: flex;
align-items: center;
gap: 0.5em;
transition: color 0.2s;
}
.manual-toggle:hover { color: var(--text); }
.manual-toggle .arrow {
margin-left: auto;
transition: transform 0.25s;
}
.manual-toggle.open .arrow { transform: rotate(180deg); }
.manual-steps {
display: none;
border-top: 1px solid var(--border);
}
.manual-steps.open { display: block; }
.step {
border-bottom: 1px solid var(--border);
}
.step:last-child { border-bottom: none; }
.step-header {
display: flex;
align-items: center;
gap: 0.8em;
padding: 0.7em 1.2em;
background: var(--surface2);
border-bottom: 1px solid var(--border);
}
.step-num {
width: 20px;
height: 20px;
border-radius: 50%;
background: var(--accent);
color: var(--bg);
font-size: 0.72em;
font-weight: 700;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
}
.step-label {
font-size: 0.83em;
font-weight: 600;
color: var(--text-muted);
}
/* Inline code */
code {
font-family: 'JetBrains Mono', monospace;
background: var(--surface2);
padding: 0.15em 0.45em;
border-radius: 5px;
font-size: 0.87em;
color: var(--accent);
border: 1px solid var(--border);
}
pre code {
background: none;
padding: 0;
border: none;
font-size: inherit;
color: inherit;
}
/* Syntax */
.kw { color: #ff7b72; }
.str { color: #a5d6ff; }
.cmt { color: #8b949e; font-style: italic; }
.cmd { color: #3fb950; }
.url { color: #79c0ff; }
/* Packages */
.packages {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
gap: 1em;
}
.package {
background: var(--surface);
border: 1px solid var(--border);
border-radius: var(--radius);
padding: 1.3em;
transition: transform 0.2s, border-color 0.2s, box-shadow 0.2s;
display: flex;
flex-direction: column;
gap: 0.4em;
}
.package:hover {
transform: translateY(-3px);
border-color: var(--accent);
box-shadow: 0 8px 24px rgba(88,166,255,0.1);
}
.package-icon { font-size: 2em; }
.package h3 { font-size: 1em; font-weight: 600; color: var(--text); }
.package p { font-size: 0.88em; color: var(--text-muted); flex: 1; }
.package-install {
font-family: 'JetBrains Mono', monospace;
font-size: 0.8em;
background: var(--surface2);
border: 1px solid var(--border);
border-radius: 6px;
padding: 0.4em 0.7em;
color: var(--accent2);
display: block;
margin-top: 0.4em;
}
.package a {
font-size: 0.82em;
color: var(--accent);
text-decoration: none;
margin-top: 0.3em;
display: inline-block;
}
.package a:hover { text-decoration: underline; }
/* Resources */
.resource-list {
background: var(--surface);
border: 1px solid var(--border);
border-radius: var(--radius);
overflow: hidden;
}
.resource-item {
display: flex;
align-items: center;
gap: 1em;
padding: 0.9em 1.3em;
border-bottom: 1px solid var(--border);
text-decoration: none;
color: var(--text);
transition: background 0.15s;
font-size: 0.9em;
}
.resource-item:last-child { border-bottom: none; }
.resource-item:hover { background: var(--surface2); }
.resource-item .ri-icon { font-size: 1.1em; width: 1.5em; text-align: center; }
.resource-item .ri-name { font-weight: 600; color: var(--accent); font-family: 'JetBrains Mono', monospace; font-size: 0.9em; }
.resource-item .ri-desc { color: var(--text-muted); font-size: 0.85em; margin-left: auto; }
@keyframes fadeDown {
from { opacity: 0; transform: translateY(-18px); }
to { opacity: 1; transform: translateY(0); }
}
@keyframes fadeUp {
from { opacity: 0; transform: translateY(14px); }
to { opacity: 1; transform: translateY(0); }
}
footer {
text-align: center;
color: var(--text-muted);
font-size: 0.8em;
margin-top: 3em;
padding-top: 1.5em;
border-top: 1px solid var(--border);
}
</style>
</head>
<body>
<div class="wrapper">
<header>
<img src="logo.png" alt="Le Garage Numérique" class="logo" />
<h1>Dépôt APT <span>Le Garage Numérique</span></h1>
<p>Paquets maintenus par Le Garage Numérique pour les distributions basées sur Debian</p>
</header>
<!-- Installation -->
<section>
<div class="section-title">Installation du dépôt</div>
<div class="install-card">
<!-- Description -->
<div class="install-card-header">
<p>Une seule commande suffit pour configurer le dépôt, importer la clé GPG et définir la priorité automatiquement.</p>
<div class="badge-list">
<div class="badge"><span class="dot"></span>Clé GPG importée</div>
<div class="badge"><span class="dot"></span>sources.list configuré</div>
<div class="badge"><span class="dot"></span>Priorité 500 appliquée</div>
<div class="badge"><span class="dot"></span>apt update exécuté</div>
</div>
</div>
<!-- Commande principale -->
<div class="code-block">
<pre id="cmd-main"><button class="copy-btn" onclick="copyCode('cmd-main', this)">Copier</button><span class="cmd">curl</span> -fsSL <span class="url">https://deb.legaragenumerique.fr/install-repo.sh</span> | <span class="cmd">sudo</span> bash</pre>
</div>
<!-- Accordéon installation manuelle -->
<button class="manual-toggle" id="toggle-manual" onclick="toggleManual()">
⚙️ Installation manuelle étape par étape
<span class="arrow"></span>
</button>
<div class="manual-steps" id="manual-steps">
<div class="step">
<div class="step-header">
<div class="step-num">1</div>
<div class="step-label">Ajouter la clé publique GPG</div>
</div>
<div class="code-block">
<pre id="cmd1"><button class="copy-btn" onclick="copyCode('cmd1', this)">Copier</button><span class="cmd">sudo</span> wget -qO /etc/apt/trusted.gpg.d/gn-depot.asc \
<span class="url">https://deb.legaragenumerique.fr/pgp-key.public</span></pre>
</div>
</div>
<div class="step">
<div class="step-header">
<div class="step-num">2</div>
<div class="step-label">Ajouter le dépôt à sources.list</div>
</div>
<div class="code-block">
<pre id="cmd2"><button class="copy-btn" onclick="copyCode('cmd2', this)">Copier</button><span class="kw">echo</span> <span class="str">'deb [arch=amd64 signed-by=/etc/apt/trusted.gpg.d/gn-depot.asc] https://deb.legaragenumerique.fr stable main'</span> \
| <span class="cmd">sudo</span> tee /etc/apt/sources.list.d/gn-depot.list</pre>
</div>
</div>
<div class="step">
<div class="step-header">
<div class="step-num">3</div>
<div class="step-label">Définir la priorité du dépôt</div>
</div>
<div class="code-block">
<pre id="cmd3"><button class="copy-btn" onclick="copyCode('cmd3', this)">Copier</button><span class="cmd">sudo</span> wget -qO /etc/apt/preferences.d/gn-depot.pref \
<span class="url">https://deb.legaragenumerique.fr/gn-depot.pref</span></pre>
</div>
</div>
<div class="step">
<div class="step-header">
<div class="step-num">4</div>
<div class="step-label">Mettre à jour et installer</div>
</div>
<div class="code-block">
<pre id="cmd4"><button class="copy-btn" onclick="copyCode('cmd4', this)">Copier</button><span class="cmd">sudo</span> apt update
<span class="cmd">sudo</span> apt install &lt;nom-du-paquet&gt;</pre>
</div>
</div>
</div>
</div>
</section>
<!-- Packages -->
<section>
<div class="section-title">Paquets disponibles</div>
<div class="packages">
<div class="package">
<div class="package-icon">🌍</div>
<h3>Geographical Adventures</h3>
<p>Petit jeu de géographie interactif.</p>
<code class="package-install">sudo apt install geo</code>
<a href="https://sebastian.itch.io/geographical-adventures" target="_blank" rel="noopener">↗ Site web</a>
</div>
<div class="package">
<div class="package-icon">🔫</div>
<h3>World of Padman</h3>
<p>FPS open source léger et fun.</p>
<code class="package-install">sudo apt install wop</code>
<a href="https://worldofpadman.net" target="_blank" rel="noopener">↗ Site web</a>
</div>
<div class="package">
<div class="package-icon">✒️</div>
<h3>Scribus 1.7.3 SVN</h3>
<p>Logiciel de PAO — version de développement récente.</p>
<code class="package-install">sudo apt install scribus</code>
<a href="https://www.scribus.net" target="_blank" rel="noopener">↗ Site web</a>
</div>
<div class="package">
<div class="package-icon">🖨️</div>
<h3>Cura </h3>
<p>Logiciel de slicing pour imprimante 3D.</p>
<code class="package-install">sudo apt install cura</code>
<a href="https://ultimaker.com/software/ultimaker-cura/" target="_blank" rel="noopener">↗ Site web</a>
</div>
<div class="package">
<div class="package-icon">📐</div>
<h3>FreeCAD </h3>
<p>Logiciel de modeling pour imprimante 3D.</p>
<code class="package-install">sudo apt install freecad-gn</code>
<a href="https://www.freecad.org/index.php?lang=fr" target="_blank" rel="noopener">↗ Site web</a>
</div>
</div>
</section>
<footer>
© Le Garage Numérique · Dépôt APT · <a href="https://deb.legaragenumerique.fr" style="color:var(--accent);text-decoration:none;">deb.legaragenumerique.fr</a>
</footer>
</div>
<script>
function copyCode(id, btn) {
const pre = document.getElementById(id);
const clone = pre.cloneNode(true);
// Supprimer le bouton du clone avant d'extraire le texte
clone.querySelector('.copy-btn')?.remove();
const text = clone.innerText.trim();
navigator.clipboard.writeText(text).then(() => {
btn.textContent = '✓ Copié';
btn.classList.add('copied');
setTimeout(() => {
btn.textContent = 'Copier';
btn.classList.remove('copied');
}, 2000);
});
}
function toggleManual() {
const btn = document.getElementById('toggle-manual');
const steps = document.getElementById('manual-steps');
btn.classList.toggle('open');
steps.classList.toggle('open');
}
</script>
</body>
</html>