Files
html/wtp-orphans-registry.html
Opus c7994d48be
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
phase45 doctrine 183 inject 29 pages PRIO3 - 121 pages UX total
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.
2026-04-24 14:25:37 +02:00

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>