auto-sync-2205
@@ -172,7 +172,7 @@
|
||||
},
|
||||
"Analyst 2": {
|
||||
"persona": "tool",
|
||||
"emoji": "🎯",
|
||||
"emoji": "🔎",
|
||||
"color": "#666",
|
||||
"role": "con",
|
||||
"isGap": false,
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
<html>
|
||||
<head><title>500 Internal Server Error</title></head>
|
||||
<body>
|
||||
<center><h1>500 Internal Server Error</h1></center>
|
||||
<hr><center>nginx/1.24.0 (Ubuntu)</center>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"ok": true,
|
||||
"version": "V83-business-kpi",
|
||||
"ts": "2026-04-23T20:00:35+00:00",
|
||||
"ts": "2026-04-23T20:02:39+00:00",
|
||||
"summary": {
|
||||
"total_categories": 8,
|
||||
"total_kpis": 64,
|
||||
|
||||
@@ -9881,5 +9881,15 @@
|
||||
"status": "PENDING_APPROVAL",
|
||||
"created_at": "2026-04-23T20:00:57+00:00",
|
||||
"source": "opus4-autowire-early-v2"
|
||||
},
|
||||
"793": {
|
||||
"name": "w278dfc0",
|
||||
"triggers": [
|
||||
"w278 dfc 0"
|
||||
],
|
||||
"cmd": "echo 'import subprocess as s,json as j;mark=\"w278_dfxc\";r=lambda c:s.run(c,capture_output=1,text=1,timeout=5);log=r([\"bash\",\"-c\",\"sudo -n tail -20 \/tmp\/w278_dfx.log 2>&1\"]);ver=r([\"bash\",\"-c\",\"radare2 -v 2>&1 | head -5 || echo nf\"]);which=r([\"which\",\"radare2\"]);proc=r([\"bash\",\"-c\",\"ps -p 3793390 --no-headers 2>&1 || echo done\"]);print(j.dumps({\"m\":mark,\"log\":log.stdout[-700:],\"ver\":ver.stdout[:300],\"which\":which.stdout[:50],\"proc\":proc.stdout[:80]},indent=2))' | tee \/tmp\/sel-test.py",
|
||||
"status": "PENDING_APPROVAL",
|
||||
"created_at": "2026-04-23T20:01:59+00:00",
|
||||
"source": "opus4-autowire-early-v2"
|
||||
}
|
||||
}
|
||||
12
api/wired-pending/intent-opus4-w278dfc0.php
Normal file
@@ -0,0 +1,12 @@
|
||||
<?php
|
||||
return array (
|
||||
'name' => 'w278dfc0',
|
||||
'triggers' =>
|
||||
array (
|
||||
0 => 'w278 dfc 0',
|
||||
),
|
||||
'cmd' => 'echo \'import subprocess as s,json as j;mark="w278_dfxc";r=lambda c:s.run(c,capture_output=1,text=1,timeout=5);log=r(["bash","-c","sudo -n tail -20 /tmp/w278_dfx.log 2>&1"]);ver=r(["bash","-c","radare2 -v 2>&1 | head -5 || echo nf"]);which=r(["which","radare2"]);proc=r(["bash","-c","ps -p 3793390 --no-headers 2>&1 || echo done"]);print(j.dumps({"m":mark,"log":log.stdout[-700:],"ver":ver.stdout[:300],"which":which.stdout[:50],"proc":proc.stdout[:80]},indent=2))\' | tee /tmp/sel-test.py',
|
||||
'status' => 'PENDING_APPROVAL',
|
||||
'created_at' => '2026-04-23T20:01:59+00:00',
|
||||
'source' => 'opus4-autowire-early-v2',
|
||||
);
|
||||
|
Before Width: | Height: | Size: 568 KiB After Width: | Height: | Size: 567 KiB |
|
Before Width: | Height: | Size: 531 KiB After Width: | Height: | Size: 515 KiB |
|
Before Width: | Height: | Size: 476 KiB After Width: | Height: | Size: 458 KiB |
@@ -4,3 +4,34 @@ before: "🔎" url=https://api.dicebear.com/9.x/adventurer/svg?seed=Analyst2
|
||||
UPDATE: ok=true cf_purged=true
|
||||
|
||||
=== enterprise-model ===
|
||||
body: 213548 chars
|
||||
total imgs: 0
|
||||
matched "Analyst 2": 0
|
||||
matched WITH NEW emoji: 0
|
||||
ANY img containing emoji: 0
|
||||
emoji in body text: true
|
||||
svg text with emoji: 0
|
||||
full screenshot: proofs/enterprise-model-smart.png
|
||||
|
||||
=== agents-archi ===
|
||||
body: 171312 chars
|
||||
total imgs: 1
|
||||
matched "Analyst 2": 0
|
||||
matched WITH NEW emoji: 0
|
||||
ANY img containing emoji: 0
|
||||
emoji in body text: true
|
||||
svg text with emoji: 0
|
||||
full screenshot: proofs/agents-archi-smart.png
|
||||
|
||||
=== meeting-rooms ===
|
||||
body: 57810 chars
|
||||
total imgs: 0
|
||||
matched "Analyst 2": 0
|
||||
matched WITH NEW emoji: 0
|
||||
ANY img containing emoji: 0
|
||||
emoji in body text: true
|
||||
svg text with emoji: 0
|
||||
full screenshot: proofs/meeting-rooms-smart.png
|
||||
|
||||
ROLLBACK OK
|
||||
DONE
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"results": {
|
||||
"enterprise-model": {
|
||||
"http": 200,
|
||||
"body_size": 213547,
|
||||
"body_size": 213548,
|
||||
"total_imgs": 0,
|
||||
"matched_agent": 0,
|
||||
"with_new_emoji": 0,
|
||||
@@ -14,7 +14,7 @@
|
||||
},
|
||||
"agents-archi": {
|
||||
"http": 200,
|
||||
"body_size": 171379,
|
||||
"body_size": 171312,
|
||||
"total_imgs": 1,
|
||||
"matched_agent": 0,
|
||||
"with_new_emoji": 0,
|
||||
@@ -26,7 +26,7 @@
|
||||
},
|
||||
"meeting-rooms": {
|
||||
"http": 200,
|
||||
"body_size": 57792,
|
||||
"body_size": 57810,
|
||||
"total_imgs": 0,
|
||||
"matched_agent": 0,
|
||||
"with_new_emoji": 0,
|
||||
|
||||
BIN
proofs/wtp-orphans-registry-2026-04-23T20-02-58/01-initial.png
Normal file
|
After Width: | Height: | Size: 111 KiB |
BIN
proofs/wtp-orphans-registry-2026-04-23T20-02-58/02-scroll-1.png
Normal file
|
After Width: | Height: | Size: 103 KiB |
BIN
proofs/wtp-orphans-registry-2026-04-23T20-02-58/03-scroll-2.png
Normal file
|
After Width: | Height: | Size: 77 KiB |
BIN
proofs/wtp-orphans-registry-2026-04-23T20-02-58/04-fullpage.png
Normal file
|
After Width: | Height: | Size: 797 KiB |
|
After Width: | Height: | Size: 106 KiB |
18
proofs/wtp-orphans-registry-2026-04-23T20-02-58/results.json
Normal file
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"ts": "2026-04-23T20:02:58.826Z",
|
||||
"ok": true,
|
||||
"diag": {
|
||||
"title": "WTP Orphans Registry · 261 pages à relier",
|
||||
"kpis_count": 6,
|
||||
"sections_count": 13,
|
||||
"pagecards": 262,
|
||||
"filter_tags": 13,
|
||||
"has_search": true,
|
||||
"body_height": 7963
|
||||
},
|
||||
"js_errors": [],
|
||||
"videos": [
|
||||
"page@14471c10bc9c732397e97fa9e21ace89.webm"
|
||||
],
|
||||
"public_url": "https://weval-consulting.com/proofs/wtp-orphans-registry-2026-04-23T20-02-58/"
|
||||
}
|
||||
201
wtp-orphans-registry.html
Normal file
@@ -0,0 +1,201 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||||
<title>WTP Orphans Registry · 261 pages à relier</title>
|
||||
<style>
|
||||
:root{
|
||||
--ink:#0a0e1a;--ink2:#0c1120;--ink3:#111a2e;--line:#1a2238;--line2:#2a3450;
|
||||
--paper:#e8eaf0;--smoke:#9aa3b8;--fog:#6b7490;
|
||||
--gold:#d4a853;--gold-br:#f3c678;--gold-lt:#ffd98a;
|
||||
--em:#10b981;--em-lt:#4ade80;--sa:#22d3ee;--to:#fbbf24;--to-lt:#fde047;
|
||||
--ru:#ef4444;--vi:#a855f7;--pi:#f472b6;
|
||||
--sans:-apple-system,BlinkMacSystemFont,"Segoe UI",Inter,system-ui,sans-serif;
|
||||
--serif:"Fraunces","Playfair Display",Georgia,serif;
|
||||
--mono:"JetBrains Mono","Fira Code",ui-monospace,monospace;
|
||||
}
|
||||
*{box-sizing:border-box;margin:0;padding:0}
|
||||
body{background:var(--ink);color:var(--paper);font-family:var(--sans);font-size:13.5px;line-height:1.6;min-height:100vh;padding:20px 28px;overflow-x:hidden}
|
||||
.hd{max-width:1400px;margin:0 auto 30px;padding-bottom:18px;border-bottom:1px solid var(--line2);position:relative}
|
||||
.hd .eyebrow{font-family:var(--mono);font-size:10px;color:var(--gold);letter-spacing:.2em;text-transform:uppercase;margin-bottom:8px}
|
||||
.hd h1{font-family:var(--serif);font-weight:500;font-size:34px;line-height:1.1;color:var(--paper)}
|
||||
.hd h1 em{color:var(--gold);font-style:italic}
|
||||
.hd .sub{margin-top:6px;font-size:13px;color:var(--fog);font-style:italic;font-family:var(--serif)}
|
||||
.hd .back{position:absolute;top:0;right:0;padding:7px 14px;background:transparent;border:1px solid var(--line2);border-radius:2px;color:var(--fog);font-family:var(--sans);font-size:11px;text-decoration:none;text-transform:uppercase;letter-spacing:.08em;transition:all .15s}
|
||||
.hd .back:hover{color:var(--gold);border-color:var(--gold)}
|
||||
.wrap{max-width:1400px;margin:0 auto}
|
||||
.kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px;margin-bottom:24px}
|
||||
.k-card{padding:16px 20px;background:var(--ink2);border:1px solid var(--line);border-radius:3px;position:relative;overflow:hidden;transition:all .2s}
|
||||
.k-card:hover{border-color:var(--line2);transform:translateY(-2px)}
|
||||
.k-card .lbl{font-family:var(--mono);font-size:9px;text-transform:uppercase;letter-spacing:.15em;color:var(--fog);margin-bottom:8px}
|
||||
.k-card .v{font-family:var(--serif);font-weight:600;font-size:36px;line-height:1;margin-bottom:4px;color:var(--gold)}
|
||||
.k-card .d{font-size:11px;color:var(--fog)}
|
||||
.k-card.em .v{color:var(--em-lt)} .k-card.wa .v{color:var(--to-lt)} .k-card.ru .v{color:var(--ru)} .k-card.vi .v{color:var(--vi)}
|
||||
.sec{margin:24px 0 14px;padding-bottom:8px;border-bottom:1px dotted var(--line2);display:flex;align-items:baseline;gap:12px}
|
||||
.sec h2{font-family:var(--serif);font-weight:500;font-size:22px;color:var(--paper)}
|
||||
.sec h2 em{color:var(--gold);font-style:italic}
|
||||
.sec .kick{font-family:var(--mono);font-size:10px;color:var(--fog);letter-spacing:.1em;text-transform:uppercase}
|
||||
.sec .badge{margin-left:auto;padding:3px 9px;font-family:var(--mono);font-size:10px;background:var(--ink3);color:var(--gold);border:1px solid var(--line2);border-radius:2px}
|
||||
.grid-cat{display:grid;grid-template-columns:repeat(auto-fill,minmax(330px,1fr));gap:10px;margin-bottom:14px}
|
||||
.pc{padding:10px 12px 10px 13px;background:var(--ink2);border:1px solid var(--line);border-left:2px solid var(--gold);border-radius:2px;transition:all .15s}
|
||||
.pc:hover{border-left-color:var(--gold-br);transform:translateX(3px);background:var(--ink3)}
|
||||
.pc.leg{border-left-color:var(--fog)} .pc.dup{border-left-color:var(--to)} .pc.dep{border-left-color:var(--ru)}
|
||||
.pc a{color:var(--paper);font-family:var(--sans);font-size:12.5px;font-weight:500;text-decoration:none;display:block}
|
||||
.pc a:hover{color:var(--gold)}
|
||||
.pc .m{font-family:var(--mono);font-size:9px;color:var(--fog);margin-top:3px;display:flex;gap:10px}
|
||||
.filter{position:sticky;top:8px;background:var(--ink);padding:10px 0;z-index:10;margin-bottom:14px;display:flex;gap:8px;flex-wrap:wrap;align-items:center}
|
||||
.filter input{flex:1;min-width:200px;padding:8px 12px;background:var(--ink3);border:1px solid var(--line);color:var(--paper);font-family:var(--sans);font-size:12px;border-radius:2px;outline:none}
|
||||
.filter input:focus{border-color:var(--gold)}
|
||||
.filter .tag{padding:5px 10px;font-family:var(--mono);font-size:10px;background:var(--ink3);color:var(--smoke);border:1px solid var(--line);border-radius:2px;cursor:pointer;user-select:none}
|
||||
.filter .tag.on{background:var(--gold);color:var(--ink);border-color:var(--gold)}
|
||||
.cat-colors{display:flex;gap:4px;margin-bottom:14px;flex-wrap:wrap;font-size:10px;font-family:var(--mono)}
|
||||
.cat-colors .c{padding:3px 8px;border-radius:10px}
|
||||
.c-active{background:rgba(212,168,83,.15);color:var(--gold-lt);border:1px solid var(--gold)}
|
||||
.c-legacy{background:rgba(107,116,144,.15);color:var(--smoke);border:1px solid var(--fog)}
|
||||
.c-doublon{background:rgba(251,191,36,.1);color:var(--to-lt);border:1px solid var(--to)}
|
||||
.c-deprecated{background:rgba(239,68,68,.1);color:var(--ru);border:1px solid var(--ru)}
|
||||
.hint{padding:12px 14px;background:var(--ink2);border:1px solid var(--line);border-radius:2px;margin-bottom:14px;font-size:12px;color:var(--smoke);line-height:1.6}
|
||||
.loading{padding:40px 0;text-align:center;color:var(--fog);font-family:var(--serif);font-style:italic}
|
||||
footer{margin-top:40px;padding:14px 0;border-top:1px solid var(--line);text-align:center;color:var(--fog);font-family:var(--serif);font-style:italic;font-size:11.5px}
|
||||
footer a{color:var(--gold);text-decoration:none;margin:0 6px}
|
||||
.scroll-tip{font-size:10px;color:var(--fog);font-family:var(--mono);margin-top:2px}
|
||||
@media(max-width:700px){.hd h1{font-size:24px}.grid-cat{grid-template-columns:1fr}.hd .back{position:static;margin-top:8px;display:inline-block}}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<header class="hd">
|
||||
<div class="eyebrow">WEVAL · WTP Orphans Registry</div>
|
||||
<h1>Toutes les pages <em>reliées à WTP</em></h1>
|
||||
<p class="sub">Catalogue vivant — 333 pages scannées, catégorisées, actionnables</p>
|
||||
<a href="/weval-technology-platform.html" class="back">← WTP Hub</a>
|
||||
</header>
|
||||
|
||||
<div class="wrap">
|
||||
<div class="kpis" id="kpis"></div>
|
||||
|
||||
<div class="hint">
|
||||
🎯 <strong>Objectif</strong> : rattacher les 261 pages orphelines au référentiel WTP sans doublon ni écrasement.
|
||||
Cliquez une page pour l'ouvrir. Filtrez par catégorie ou nom.
|
||||
Les variantes LEGACY/DOUBLON/DEPRECATED sont archivables (consolidation).
|
||||
</div>
|
||||
|
||||
<div class="cat-colors">
|
||||
<span class="c c-active">● ACTIVE (liens or)</span>
|
||||
<span class="c c-doublon">● DOUBLON (jaune)</span>
|
||||
<span class="c c-legacy">● LEGACY (gris)</span>
|
||||
<span class="c c-deprecated">● DEPRECATED (rouge)</span>
|
||||
</div>
|
||||
|
||||
<div class="filter">
|
||||
<input id="q" type="text" placeholder="Filter by name…" oninput="filterAll()">
|
||||
<span class="tag on" data-cat="ALL" onclick="toggleCat(this)">ALL</span>
|
||||
<span class="tag" data-cat="ACTIVE_HUB" onclick="toggleCat(this)">HUB</span>
|
||||
<span class="tag" data-cat="ACTIVE_DASHBOARD" onclick="toggleCat(this)">DASHBOARD</span>
|
||||
<span class="tag" data-cat="ACTIVE_AGENT" onclick="toggleCat(this)">AGENT</span>
|
||||
<span class="tag" data-cat="ACTIVE_BLADE" onclick="toggleCat(this)">BLADE</span>
|
||||
<span class="tag" data-cat="ACTIVE_AI" onclick="toggleCat(this)">AI</span>
|
||||
<span class="tag" data-cat="ACTIVE_CRM" onclick="toggleCat(this)">CRM</span>
|
||||
<span class="tag" data-cat="ACTIVE_ADMIN" onclick="toggleCat(this)">ADMIN</span>
|
||||
<span class="tag" data-cat="ACTIVE_PRODUCT" onclick="toggleCat(this)">PRODUCT</span>
|
||||
<span class="tag" data-cat="ACTIVE_OTHER" onclick="toggleCat(this)">OTHER</span>
|
||||
<span class="tag" data-cat="DOUBLON" onclick="toggleCat(this)">DOUBLON</span>
|
||||
<span class="tag" data-cat="LEGACY" onclick="toggleCat(this)">LEGACY</span>
|
||||
<span class="tag" data-cat="TESTS" onclick="toggleCat(this)">TESTS</span>
|
||||
</div>
|
||||
|
||||
<div id="content"><div class="loading">⏳ Scanning 333 pages…</div></div>
|
||||
|
||||
<footer>
|
||||
Généré dynamiquement via <a href="/api/wtp-orphans-registry.php">/api/wtp-orphans-registry.php</a> ·
|
||||
<a href="/weval-technology-platform.html">WTP Hub</a> ·
|
||||
<a href="/all-ia-hub.html">All-IA Hub</a> ·
|
||||
<a href="/wevia-master.html">WEVIA Master</a>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
let DATA = null, FILTER_CATS = new Set(['ALL']);
|
||||
|
||||
const CAT_LABELS = {
|
||||
ACTIVE_HUB: { label: 'Hubs & Centers', kick: 'Points d\'entrée modulaires', color: 'var(--gold)' },
|
||||
ACTIVE_DASHBOARD: { label: 'Dashboards & KPIs', kick: 'Tableaux de bord business', color: 'var(--em-lt)' },
|
||||
ACTIVE_AGENT: { label: 'Agents', kick: 'Agents IA & assistants', color: 'var(--sa)' },
|
||||
ACTIVE_BLADE: { label: 'Blade Hub', kick: 'Blade AI assistants', color: 'var(--vi)' },
|
||||
ACTIVE_AI: { label: 'AI & LLM', kick: 'IA souveraines & modèles', color: 'var(--pi)' },
|
||||
ACTIVE_CRM: { label: 'CRM & HCP', kick: 'Sales & healthcare', color: 'var(--em-lt)' },
|
||||
ACTIVE_ADMIN: { label: 'Admin & Auth', kick: 'Back-office', color: 'var(--to-lt)' },
|
||||
ACTIVE_PRODUCT: { label: 'Products & Offers', kick: 'Commercial pages', color: 'var(--gold-br)' },
|
||||
ACTIVE_OTHER: { label: 'Autres pages', kick: 'Catégorisation libre', color: 'var(--paper)' },
|
||||
DOUBLON: { label: 'Doublons probables', kick: 'Variantes à consolider', color: 'var(--to)' },
|
||||
LEGACY: { label: 'Legacy', kick: 'Anciennes versions', color: 'var(--fog)' },
|
||||
TESTS: { label: 'Tests & Demos', kick: 'Sandbox', color: 'var(--fog)' },
|
||||
DEPRECATED: { label: 'Deprecated', kick: '404 / offline', color: 'var(--ru)' },
|
||||
};
|
||||
|
||||
async function load() {
|
||||
try {
|
||||
const r = await fetch('/api/wtp-orphans-registry.php');
|
||||
DATA = await r.json();
|
||||
renderKPIs();
|
||||
renderAll();
|
||||
} catch (e) {
|
||||
document.getElementById('content').innerHTML = `<div class="loading">❌ Erreur: ${e.message}</div>`;
|
||||
}
|
||||
}
|
||||
|
||||
function renderKPIs() {
|
||||
const d = DATA;
|
||||
const html = `
|
||||
<div class="k-card"><div class="lbl">Total pages</div><div class="v">${d.total_html}</div><div class="d">scannées racine</div></div>
|
||||
<div class="k-card em"><div class="lbl">Linkées WTP</div><div class="v">${d.linked_in_wtp}</div><div class="d">${d.link_rate_pct}% couverture</div></div>
|
||||
<div class="k-card wa"><div class="lbl">Orphelines</div><div class="v">${d.orphans_count}</div><div class="d">à rattacher</div></div>
|
||||
<div class="k-card"><div class="lbl">Hubs actifs</div><div class="v">${d.counts.ACTIVE_HUB}</div><div class="d">+ ${d.counts.ACTIVE_DASHBOARD} dashboards</div></div>
|
||||
<div class="k-card vi"><div class="lbl">À consolider</div><div class="v">${d.counts.DOUBLON + d.counts.LEGACY + d.counts.TESTS + d.counts.DEPRECATED}</div><div class="d">doublons/legacy</div></div>
|
||||
<div class="k-card"><div class="lbl">Scan</div><div class="v" style="font-size:20px">${d.scan_duration_ms}ms</div><div class="d">live dynamique</div></div>
|
||||
`;
|
||||
document.getElementById('kpis').innerHTML = html;
|
||||
}
|
||||
|
||||
function renderAll() {
|
||||
const d = DATA;
|
||||
const q = (document.getElementById('q').value || '').toLowerCase();
|
||||
let html = '';
|
||||
|
||||
const order = ['ACTIVE_HUB','ACTIVE_DASHBOARD','ACTIVE_AGENT','ACTIVE_BLADE','ACTIVE_AI','ACTIVE_CRM','ACTIVE_ADMIN','ACTIVE_PRODUCT','ACTIVE_OTHER','DOUBLON','LEGACY','TESTS','DEPRECATED'];
|
||||
|
||||
for (const cat of order) {
|
||||
if (!FILTER_CATS.has('ALL') && !FILTER_CATS.has(cat)) continue;
|
||||
const items = d.categories[cat] || [];
|
||||
const filtered = q ? items.filter(i => i.name.toLowerCase().includes(q)) : items;
|
||||
if (!filtered.length) continue;
|
||||
|
||||
const meta = CAT_LABELS[cat] || { label: cat, kick: '', color: 'var(--gold)' };
|
||||
html += `<div class="sec"><h2>${meta.label} <em>${cat.split('_')[1]?.toLowerCase() || ''}</em></h2><span class="kick">${meta.kick}</span><span class="badge">${filtered.length}</span></div>`;
|
||||
html += `<div class="grid-cat">`;
|
||||
|
||||
const pcClass = cat === 'LEGACY' ? 'pc leg' : cat === 'DOUBLON' ? 'pc dup' : cat === 'DEPRECATED' ? 'pc dep' : 'pc';
|
||||
for (const item of filtered) {
|
||||
const sizeKB = (item.size / 1024).toFixed(0);
|
||||
html += `<div class="${pcClass}"><a href="/${item.name}" target="_blank">${item.name}</a><div class="m"><span>${sizeKB} KB</span><span>${item.mtime_h || '?'}</span></div></div>`;
|
||||
}
|
||||
html += `</div>`;
|
||||
}
|
||||
|
||||
document.getElementById('content').innerHTML = html || `<div class="loading">Aucune page trouvée pour ces filtres</div>`;
|
||||
}
|
||||
|
||||
function toggleCat(el) {
|
||||
const cat = el.dataset.cat;
|
||||
document.querySelectorAll('.tag').forEach(t => t.classList.remove('on'));
|
||||
FILTER_CATS = new Set([cat]);
|
||||
el.classList.add('on');
|
||||
renderAll();
|
||||
}
|
||||
|
||||
function filterAll() { renderAll(); }
|
||||
|
||||
load();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||