Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
29 pages PRIO3 enrichies via inject-d60-direct.py:
registries: wtp-orphans-registry agents-unified-registry ia-sovereign-registry
hubs: wevia-hub vsm-hub wevads-hub weval-data-hub wevia-unified-hub tools-hub toolhub
dashboards: office-365-dashboard-live crm-pipeline-live orphans-dashboard
medreach-dashboard wevia-director-dashboard security-dashboard
wevia-memory-dashboard
monitors: sso-monitor monitoring
centers: mega-command-center trust-center
studios: bpmn-studio-live admin-saas
others: ethica-hcp-manager ops-screens-live vsm-pipelines lean-6sigma
office-admins weval-live-ops
Cumul session Opus:
- 121 pages UX doctrine 60 (92 + 29)
- 31 tags Opus (avec phase45)
- 28 doctrines vault (146-183)
Handler inject-d60-direct.py prouve robuste sur 65+ pages consecutives.
ZERO regression. ZERO ecrasement. NR 153/153 invariant.
274 lines
15 KiB
HTML
274 lines
15 KiB
HTML
<!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}}
|
|
|
|
/* Thumbnails premium */
|
|
.pc{padding:0;overflow:hidden}
|
|
.pc-thumb{width:100%;height:130px;object-fit:cover;object-position:top left;border-bottom:1px solid var(--line);display:block;background:var(--ink3);transition:transform .3s}
|
|
.pc:hover .pc-thumb{transform:scale(1.03)}
|
|
.pc-no-thumb{width:100%;height:130px;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,var(--ink3),var(--ink2));border-bottom:1px solid var(--line);font-family:var(--serif);font-style:italic;color:var(--fog);font-size:11px}
|
|
.pc-body{padding:10px 12px}
|
|
.pc a{color:var(--paper);font-family:var(--sans);font-size:12.5px;font-weight:500;text-decoration:none}
|
|
.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}
|
|
.grid-cat{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:14px}
|
|
|
|
</style>
|
|
<!-- DOCTRINE-60-UX-ENRICH direct-inject-20260424-142452 -->
|
|
<style id="doctrine60-ux-direct">
|
|
|
|
/* DOCTRINE-60-UX-ENRICH injected-direct */
|
|
body::before {
|
|
content: '';
|
|
position: fixed;
|
|
top: 0; left: 0; width: 100vw; height: 100vh;
|
|
background: radial-gradient(circle at 50% 50%, rgba(100,180,255,0.08), transparent 60%);
|
|
pointer-events: none;
|
|
z-index: -1;
|
|
}
|
|
.card, .kpi, .panel, .btn {
|
|
transition: all 0.3s cubic-bezier(0.2,0,0.1,1);
|
|
}
|
|
.card:hover, .kpi:hover, .panel:hover {
|
|
box-shadow: 0 4px 20px rgba(100,180,255,0.2);
|
|
border-color: rgba(100,180,255,0.5);
|
|
}
|
|
@keyframes pulseD60 {
|
|
0%,100% { opacity: 1; transform: scale(1); }
|
|
50% { opacity: 0.7; transform: scale(1.05); }
|
|
}
|
|
.pulse, .live-indicator, .active, .online {
|
|
animation: pulseD60 3s ease-in-out infinite;
|
|
}
|
|
.modal, .chat, .speech, .overlay {
|
|
backdrop-filter: blur(12px);
|
|
-webkit-backdrop-filter: blur(12px);
|
|
}
|
|
.enter-stagger {
|
|
animation: enterStagD60 0.5s cubic-bezier(0.2,0,0.1,1) forwards;
|
|
}
|
|
@keyframes enterStagD60 {
|
|
from { opacity: 0; transform: translateY(20px); }
|
|
to { opacity: 1; transform: translateY(0); }
|
|
}
|
|
|
|
</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 em"><div class="lbl">Thumbs</div><div class="v">${d.thumbs_available||0}</div><div class="d">${d.thumbs_coverage_pct||0}% coverage</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);
|
|
const thumbHTML = item.thumb
|
|
? `<img class="pc-thumb" loading="lazy" src="${item.thumb}" alt="${item.name}" onerror="this.outerHTML='<div class=pc-no-thumb>no preview</div>'">`
|
|
: `<div class="pc-no-thumb">no preview</div>`;
|
|
html += `<div class="${pcClass}"><a href="/${item.name}" target="_blank">${thumbHTML}<div class="pc-body">${item.name}<div class="m"><span>${sizeKB} KB</span><span>${item.mtime_h || '?'}</span></div></div></a></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>
|
|
<!-- DOCTRINE-60-UX-JS --><script id="doctrine60-ux-js-direct">
|
|
|
|
// DOCTRINE-60-UX-JS staggered entrance
|
|
(function(){
|
|
if (!('IntersectionObserver' in window)) return;
|
|
const obs = new IntersectionObserver((entries) => {
|
|
entries.forEach((e, i) => {
|
|
if (e.isIntersecting) {
|
|
setTimeout(() => e.target.classList.add('enter-stagger'), i * 80);
|
|
obs.unobserve(e.target);
|
|
}
|
|
});
|
|
});
|
|
document.querySelectorAll('.card, .kpi, .panel').forEach(el => obs.observe(el));
|
|
})();
|
|
|
|
</script>
|
|
</body>
|
|
</html>
|