phase46 doctrine 184 inject 19 pages PRIO4 business - 146 pages UX total
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled

19 pages PRIO4 business enrichies:
- gws-setup v63-send-queue l99-fullscreen v78-real-wire weval-portal
- ethica-country crm-audit infra-tour infra-tour-2s-5c-blade
- partners-emails onboarding-em arsenal-offline ultimate-quality
- wevia-demo-autonomous linkedin-automation-v96 blade-install
- solutions oss-catalog wtp

Cumul session:
- 146 pages UX doctrine 60 (127 + 19)
- 32 tags Opus
- 29 doctrines vault (146-184)

Handler robuste 75+ pages consecutives ZERO regression.
NR 153/153 invariant.
This commit is contained in:
Opus
2026-04-24 14:27:55 +02:00
parent 2e392f5759
commit 177feddb04
19 changed files with 1077 additions and 13 deletions

View File

@@ -26,7 +26,46 @@ h1,.header-title,.main-title,.hub-title,.page-title{background-image:linear-grad
/* Doctrine zero chevauchement - hide common offenders */
.opus-x-btn,.toggle-top-right-btn,.fab-corner{display:none!important}
/* === end WEVIA Gemini Rolling v2 batch === */
</style></head>
</style><!-- DOCTRINE-60-UX-ENRICH direct-inject-20260424-142737 -->
<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><h1>WEVADS Arsenal — Offline Mode</h1><p>Offline fallback page when WEVADS Arsenal is unreachable. Use arsenal-login for live access.</p><div class="links">
<a href="/wevia-master.html">WEVIA Master</a>
<a href="/agents-archi.html">Agents 3D</a>
@@ -96,4 +135,21 @@ h1,.header-title,.main-title,.hub-title,.page-title{background-image:linear-grad
<script src="/api/a11y-auto-enhancer.js" defer></script>
<!-- WTP_UDOCK_V1 (Opus 21-avr t34final) --><script src="/wtp-unified-dock.js" defer></script>
<script src="/opus-antioverlap-doctrine.js?v=1776776094" defer></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>

View File

@@ -28,7 +28,46 @@ h1,.header-title,.main-title,.hub-title,.page-title{background-image:linear-grad
/* Doctrine zero chevauchement - hide common offenders */
.opus-x-btn,.toggle-top-right-btn,.fab-corner{display:none!important}
/* === end WEVIA Gemini Rolling v2 batch === */
</style></head><body>
</style><!-- DOCTRINE-60-UX-ENRICH direct-inject-20260424-142737 -->
<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>
<div class="card">
<h1>🛰 WEVAL Sentinel Agent v2.1</h1>
<p>Self-healing agent avec watchdog automatique.<br>Télécharge, installe et lance en un clic.</p>
@@ -112,4 +151,21 @@ fetch('/api/blade-api.php?action=status&k=BLADE2026').then(r=>r.text().then(t=>{
<script src="/api/a11y-auto-enhancer.js" defer></script>
<!-- WTP_UDOCK_V1 (Opus 21-avr t34final) --><script src="/wtp-unified-dock.js" defer></script>
<script src="/opus-antioverlap-doctrine.js?v=1776776094" defer></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>

View File

@@ -10,7 +10,46 @@ h1{color:#6ba3ff;border-bottom:2px solid #1e3a8a;padding-bottom:8px}
a{color:#6ba3ff}
.badge{padding:4px 8px;border-radius:4px;font-size:11px;font-weight:bold}
.ok{background:#10b981}.warn{background:#f59e0b}
</style></head>
</style><!-- DOCTRINE-60-UX-ENRICH direct-inject-20260424-142732 -->
<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>
<h1>💼 CRM Audit · Opus5 VERIFY</h1>
<p>Consolide <a href="/api/opus5-crm-audit.php">/api/opus5-crm-audit.php</a> — volume CRM vs attendu. Doctrine 53.</p>
@@ -124,4 +163,21 @@ fetch('/api/crm-audit-live.php').then(r=>r.json()).then(d=>{
<script src="/api/a11y-auto-enhancer.js" defer></script>
<!-- WTP_UDOCK_V1 (Opus 21-avr t34final) --><script src="/wtp-unified-dock.js" defer></script>
<script src="/opus-antioverlap-doctrine.js?v=1776776094" defer></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>

View File

@@ -9,7 +9,46 @@ h1{color:#6ba3ff;border-bottom:2px solid #1e3a8a;padding-bottom:8px}
.num{font-size:36px;font-weight:bold;color:#6ba3ff}.lbl{color:#9ca8d3;font-size:12px;text-transform:uppercase}
.flag{font-size:48px}
a{color:#6ba3ff}
</style></head>
</style><!-- DOCTRINE-60-UX-ENRICH direct-inject-20260424-142732 -->
<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>
<h1>🏥 Ethica · HCPs par pays (live)</h1>
<p>Visualisation de <a href="/api/ethica-country-api.php">/api/ethica-country-api.php</a> · Doctrine 53.</p>
@@ -109,4 +148,21 @@ fetch('/api/ethica-country-api.php?country=all').then(r=>r.json()).then(d=>{
<script src="/api/a11y-auto-enhancer.js" defer></script>
<!-- WTP_UDOCK_V1 (Opus 21-avr t34final) --><script src="/wtp-unified-dock.js" defer></script>
<script src="/opus-antioverlap-doctrine.js?v=1776776094" defer></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>

View File

@@ -1,5 +1,44 @@
<!DOCTYPE html><html lang="fr"><head><meta charset="UTF-8"><title>GWS OAuth Setup</title><meta name="viewport" content="width=device-width,initial-scale=1">
<style>*{margin:0;padding:0;box-sizing:border-box}body{font-family:system-ui;background:#0a0e1a;color:#c8d0e0;padding:40px}h1{font-size:1.8em;color:#818cf8;margin-bottom:32px;text-align:center}.step{background:#111827;border:1px solid #1e293b;border-radius:12px;padding:24px;margin-bottom:16px;max-width:700px;margin-left:auto;margin-right:auto}.step h2{color:#34d399;font-size:1em;margin-bottom:8px}code{background:#0d1117;padding:4px 8px;border-radius:4px;font-size:.85em;color:#818cf8}a{color:#60a5fa}</style></head><body>
<style>*{margin:0;padding:0;box-sizing:border-box}body{font-family:system-ui;background:#0a0e1a;color:#c8d0e0;padding:40px}h1{font-size:1.8em;color:#818cf8;margin-bottom:32px;text-align:center}.step{background:#111827;border:1px solid #1e293b;border-radius:12px;padding:24px;margin-bottom:16px;max-width:700px;margin-left:auto;margin-right:auto}.step h2{color:#34d399;font-size:1em;margin-bottom:8px}code{background:#0d1117;padding:4px 8px;border-radius:4px;font-size:.85em;color:#818cf8}a{color:#60a5fa}</style><!-- DOCTRINE-60-UX-ENRICH direct-inject-20260424-142732 -->
<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>
<h1>GWS OAuth Setup &mdash; Step 5/5</h1>
<div class="step"><h2>Step A &mdash; Consent Screen</h2><a href="https://console.cloud.google.com/apis/credentials/consent" target="_blank">&rarr; Ouvrir Consent Screen</a><br>User Type: <b>External</b> &rarr; Create &rarr; App Name: <code>weval-gws</code> &rarr; Save through all screens</div>
<div class="step"><h2>Step B &mdash; Create OAuth Client</h2><a href="https://console.cloud.google.com/apis/credentials" target="_blank">&rarr; Ouvrir Credentials</a><br><b>Create Credentials</b> &rarr; <b>OAuth client ID</b> &rarr; Type: <b>Desktop app</b> &rarr; Create</div>
@@ -74,4 +113,21 @@
<script src="/api/a11y-auto-enhancer.js" defer></script>
<!-- WTP_UDOCK_V1 (Opus 21-avr t34final) --><script src="/wtp-unified-dock.js" defer></script>
<script src="/opus-antioverlap-doctrine.js?v=1776776094" defer></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>

View File

@@ -14,7 +14,46 @@ body{margin:0;background:#0a0e1a;color:#e2e8f0;font-family:-apple-system,Nunito,
.metric .l{color:#94a3b8}.metric .v{color:#fff;font-weight:600}
.v.ok{color:#22c55e}.v.warn{color:#f59e0b}.v.crit{color:#ef4444}
.timestamp{color:#64748b;font-size:11px;text-align:right;margin-top:15px}
</style></head>
</style><!-- DOCTRINE-60-UX-ENRICH direct-inject-20260424-142733 -->
<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>
<div class="header">
<h1>🗺️ INFRA TOUR · 2 Serveurs + 5 Clouds FREE + Blade</h1>
@@ -118,4 +157,21 @@ body{margin:0;background:#0a0e1a;color:#e2e8f0;font-family:-apple-system,Nunito,
<script src="/api/a11y-auto-enhancer.js" defer></script>
<!-- WTP_UDOCK_V1 (Opus 21-avr t34final) --><script src="/wtp-unified-dock.js" defer></script>
<script src="/opus-antioverlap-doctrine.js?v=1776776094" defer></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>

View File

@@ -14,7 +14,46 @@ body{margin:0;background:#0a0e1a;color:#e2e8f0;font-family:-apple-system,Nunito,
.metric .l{color:#94a3b8}.metric .v{color:#fff;font-weight:600}
.v.ok{color:#22c55e}.v.warn{color:#f59e0b}.v.crit{color:#ef4444}
.timestamp{color:#64748b;font-size:11px;text-align:right;margin-top:15px}
</style></head>
</style><!-- DOCTRINE-60-UX-ENRICH direct-inject-20260424-142732 -->
<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>
<div class="header">
<h1>🗺️ INFRA TOUR · 2 Serveurs + 5 Clouds FREE + Blade</h1>
@@ -118,4 +157,21 @@ body{margin:0;background:#0a0e1a;color:#e2e8f0;font-family:-apple-system,Nunito,
<script src="/api/a11y-auto-enhancer.js" defer></script>
<!-- WTP_UDOCK_V1 (Opus 21-avr t34final) --><script src="/wtp-unified-dock.js" defer></script>
<script src="/opus-antioverlap-doctrine.js?v=1776776094" defer></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>

View File

@@ -19,6 +19,45 @@ body{background:#0f172a;font-family:Inter,system-ui,sans-serif;overflow:hidden}
.right{margin-left:auto;display:flex;gap:6px;align-items:center}
.status{color:#22c55e;font-size:10px;font-weight:700}
iframe{position:fixed;top:40px;left:0;right:0;bottom:0;width:100%;height:calc(100vh - 40px);border:none}
</style>
<!-- DOCTRINE-60-UX-ENRICH direct-inject-20260424-142732 -->
<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>
@@ -114,5 +153,22 @@ a.classList.add('active');
<script src="/api/a11y-auto-enhancer.js" defer></script>
<!-- WTP_UDOCK_V1 (Opus 21-avr t34final) --><script src="/wtp-unified-dock.js" defer></script>
<script src="/opus-antioverlap-doctrine.js?v=1776776094" defer></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>

View File

@@ -40,7 +40,46 @@ body{background:var(--bg);color:var(--fg);font-family:'SF Pro Display',system-ui
.spnr{display:inline-block;width:12px;height:12px;border:2px solid var(--gold);border-top:2px solid transparent;border-radius:50%;animation:sp 1s linear infinite;vertical-align:middle}
@keyframes sp{to{transform:rotate(360deg)}}
.loading{text-align:center;color:var(--t2);padding:30px;font-size:13px}
</style></head><body>
</style><!-- DOCTRINE-60-UX-ENRICH direct-inject-20260424-142737 -->
<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>
<div class="hdr">
<div>
@@ -171,4 +210,21 @@ setInterval(loadStats,30000);
<script src="/api/a11y-auto-enhancer.js" defer></script>
<!-- WTP_UDOCK_V1 (Opus 21-avr t34final) --><script src="/wtp-unified-dock.js" defer></script>
<script src="/opus-antioverlap-doctrine.js?v=1776776094" defer></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>

View File

@@ -20,7 +20,46 @@ h1{color:#a5b4fc}
.plan-name{font-weight:700;margin-bottom:6px}
.plan-price{color:#22d3ee;font-size:1.2rem;margin:8px 0}
.plan-features{color:#94a3b8;font-size:.75rem;text-align:left;margin-top:10px}
</style></head>
</style><!-- DOCTRINE-60-UX-ENRICH direct-inject-20260424-142736 -->
<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><div class="container">
<h1>🚀 Onboarding EM WEVAL</h1>
<div class="steps">
@@ -132,4 +171,21 @@ function submit(){
<script src="/api/a11y-auto-enhancer.js" defer></script>
<!-- WTP_UDOCK_V1 (Opus 21-avr t34final) --><script src="/wtp-unified-dock.js" defer></script>
<script src="/opus-antioverlap-doctrine.js?v=1776776094" defer></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>

View File

@@ -47,7 +47,46 @@ h1{font-family:'Orbitron',sans-serif;font-weight:900;
.footer{margin-top:30px;padding:14px;text-align:center;color:#64748b;font-size:0.8rem;
border-top:1px solid rgba(100,116,139,0.15)}
.footer a{color:#10b981;text-decoration:none;margin:0 8px}
</style></head><body>
</style><!-- DOCTRINE-60-UX-ENRICH direct-inject-20260424-142737 -->
<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>
<div class="container">
<h1>🧬 OSS Catalog · Consolidated</h1>
<p class="subtitle">Catalogue des open-source tools clonés et intégrés · 206 tools dans 13 catégories (MEGA v14) · Source unique : /api/oss-registry.json</p>
@@ -176,4 +215,21 @@ fetch('/api/oss-registry.json', {cache:'no-store'})
<!-- WTP_UDOCK_V1 (Opus session v13) -->
<script src="/wtp-unified-dock.js" defer></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>

View File

@@ -24,7 +24,46 @@ h2{color:#c084fc;margin-top:28px}
.stat .n{font-size:28px;color:#6ba3ff;font-weight:bold}
.stat .l{font-size:11px;color:#9ca8d3;text-transform:uppercase}
a{color:#6ba3ff}
</style></head>
</style><!-- DOCTRINE-60-UX-ENRICH direct-inject-20260424-142733 -->
<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>
<div class="container">
@@ -149,4 +188,21 @@ load();
<script src="/api/a11y-auto-enhancer.js" defer></script>
<!-- WTP_UDOCK_V1 (Opus 21-avr t34final) --><script src="/wtp-unified-dock.js" defer></script>
<script src="/opus-antioverlap-doctrine.js?v=1776776094" defer></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>

View File

@@ -35,6 +35,45 @@ footer{padding:40px 32px;border-top:1px solid var(--bd);text-align:center;color:
.footer-links{display:flex;gap:24px;justify-content:center;flex-wrap:wrap;margin-bottom:16px;font-size:14px}
.footer-links a{color:var(--t2)}
.footer-links a:hover{color:var(--cy)}
</style>
<!-- DOCTRINE-60-UX-ENRICH direct-inject-20260424-142737 -->
<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>
@@ -168,5 +207,22 @@ footer{padding:40px 32px;border-top:1px solid var(--bd);text-align:center;color:
<div>© 2026 WEVAL Consulting · Casablanca · Paris · Montréal</div>
</footer>
<script src="/opus-antioverlap-doctrine.js?v=1776776094" defer></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>

View File

@@ -1,4 +1,43 @@
<!DOCTYPE html><html lang="fr"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0"><title>WEVAL Ultimate Quality</title><link href="https://fonts.googleapis.com/css2?family=Space+Mono:wght@400;700&family=Outfit:wght@300;400;500;600;700;800&display=swap" rel="stylesheet"><style>:root{--bg:#080b12;--s:rgba(255,255,255,.03);--b:rgba(255,255,255,.06);--t:#94a3b8;--w:#f1f5f9;--a:#6366f1;--g:#22c55e;--r:#ef4444;--R:12px}*{margin:0;padding:0;box-sizing:border-box}body{font-family:"Outfit",system-ui,sans-serif;background:var(--bg);color:var(--t);font-size:14px}.wrap{max-width:900px;margin:0 auto;padding:2rem 4%}.hero{text-align:center;padding:2rem 0}h1{font-size:2rem;font-weight:800;color:var(--w)}h1 em{font-style:normal}.stats{display:flex;gap:1rem;justify-content:center;flex-wrap:wrap;margin:1.5rem 0}.stat{background:var(--s);border:1px solid var(--b);border-radius:var(--R);padding:.8rem 1.5rem;text-align:center}.sn{font-family:"Space Mono";font-size:1.8rem;font-weight:700}.sl{font-size:.65rem;text-transform:uppercase;letter-spacing:.05em;margin-top:.2rem}.btn{display:inline-flex;align-items:center;gap:8px;background:var(--a);color:#fff;border:none;padding:14px 36px;border-radius:var(--R);font-family:inherit;font-size:1rem;font-weight:700;cursor:pointer}.btn:disabled{opacity:.5}.spin{display:none;width:16px;height:16px;border:2px solid rgba(255,255,255,.3);border-top:2px solid #fff;border-radius:50%;animation:sp .8s linear infinite}.loading .spin{display:inline-block}.loading .play{display:none}@keyframes sp{to{transform:rotate(360deg)}}.out{margin-top:1.5rem;display:none}.out.show{display:block}.t{display:flex;justify-content:space-between;padding:.3rem .6rem;border-radius:6px;font-size:.8rem;margin:1px 0}.t.pass{background:rgba(34,197,94,.05)}.t.fail{background:rgba(239,68,68,.08)}.t .d{color:#64748b;font-size:.72rem;font-family:"Space Mono"}footer{text-align:center;padding:1.5rem;font-size:.75rem;color:#475569;border-top:1px solid var(--b);margin-top:2rem}footer a{color:var(--a);text-decoration:none}</style></head><body><div class="wrap"><div class="hero"><h1>WEVAL Ultimate <em id="sigma">Quality</em></h1><p style="margin-top:.5rem;font-size:.85rem">48 tests · Infra + WEVIA + S95 + Pages + Security + Ethica + External</p></div><div class="stats"><div class="stat"><div class="sn" style="color:var(--a)" id="sTotal"></div><div class="sl">Tests</div></div><div class="stat"><div class="sn" style="color:var(--g)" id="sPass"></div><div class="sl">Pass</div></div><div class="stat"><div class="sn" style="color:var(--r)" id="sFail"></div><div class="sl">Fail</div></div><div class="stat"><div class="sn" id="sSigma"></div><div class="sl">Sigma</div></div><div class="stat"><div class="sn" style="color:var(--w)" id="sTime"></div><div class="sl">ms</div></div></div><div style="text-align:center"><button class="btn" id="btn" onclick="run()"><span class="play"></span><span class="spin"></span> Lancer les tests</button></div><div class="out" id="out"></div></div><footer>© 2026 <a href="/">WEVAL</a> · <a href="/nonreg.html">NonReg 67</a> · <a href="/trust-center.html">Trust</a> · <a href="/products/workspace.html">62 Produits</a></footer><script>async function run(){var b=document.getElementById("btn"),o=document.getElementById("out");b.classList.add("loading");b.disabled=true;o.className="out show";o.innerHTML="<p style=\"text-align:center;padding:2rem\">Tests en cours...</p>";try{var r=await fetch("/api/ultimate-quality.php?k=WEVADS2026");var d=await r.json();document.getElementById("sTotal").textContent=d.total;document.getElementById("sPass").textContent=d.pass;document.getElementById("sFail").textContent=d.fail;document.getElementById("sTime").textContent=d.elapsed_ms;var sig=d.sigma==="6"?"6σ":d.pass+"/"+d.total;document.getElementById("sSigma").textContent=sig;document.getElementById("sSigma").style.color=d.fail===0?"var(--g)":"var(--r)";document.getElementById("sigma").textContent=d.fail===0?"6σ":"Quality";document.getElementById("sigma").style.color=d.fail===0?"var(--g)":"var(--r)";var h="";d.tests.forEach(function(t){var ic=t.s==="pass"?"✓":"✗";var cl=t.s==="pass"?"color:var(--g)":"color:var(--r)";h+="<div class=\"t "+t.s+"\"><span><span style=\""+cl+";margin-right:6px\">"+ic+"</span>"+t.n+"</span><span class=\"d\">"+t.d+"</span></div>"});o.innerHTML=h}catch(e){o.innerHTML="<p style=\"color:var(--r)\">Erreur: "+e.message+"</p>"}b.classList.remove("loading");b.disabled=false}</script>
<!DOCTYPE html><html lang="fr"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0"><title>WEVAL Ultimate Quality</title><link href="https://fonts.googleapis.com/css2?family=Space+Mono:wght@400;700&family=Outfit:wght@300;400;500;600;700;800&display=swap" rel="stylesheet"><style>:root{--bg:#080b12;--s:rgba(255,255,255,.03);--b:rgba(255,255,255,.06);--t:#94a3b8;--w:#f1f5f9;--a:#6366f1;--g:#22c55e;--r:#ef4444;--R:12px}*{margin:0;padding:0;box-sizing:border-box}body{font-family:"Outfit",system-ui,sans-serif;background:var(--bg);color:var(--t);font-size:14px}.wrap{max-width:900px;margin:0 auto;padding:2rem 4%}.hero{text-align:center;padding:2rem 0}h1{font-size:2rem;font-weight:800;color:var(--w)}h1 em{font-style:normal}.stats{display:flex;gap:1rem;justify-content:center;flex-wrap:wrap;margin:1.5rem 0}.stat{background:var(--s);border:1px solid var(--b);border-radius:var(--R);padding:.8rem 1.5rem;text-align:center}.sn{font-family:"Space Mono";font-size:1.8rem;font-weight:700}.sl{font-size:.65rem;text-transform:uppercase;letter-spacing:.05em;margin-top:.2rem}.btn{display:inline-flex;align-items:center;gap:8px;background:var(--a);color:#fff;border:none;padding:14px 36px;border-radius:var(--R);font-family:inherit;font-size:1rem;font-weight:700;cursor:pointer}.btn:disabled{opacity:.5}.spin{display:none;width:16px;height:16px;border:2px solid rgba(255,255,255,.3);border-top:2px solid #fff;border-radius:50%;animation:sp .8s linear infinite}.loading .spin{display:inline-block}.loading .play{display:none}@keyframes sp{to{transform:rotate(360deg)}}.out{margin-top:1.5rem;display:none}.out.show{display:block}.t{display:flex;justify-content:space-between;padding:.3rem .6rem;border-radius:6px;font-size:.8rem;margin:1px 0}.t.pass{background:rgba(34,197,94,.05)}.t.fail{background:rgba(239,68,68,.08)}.t .d{color:#64748b;font-size:.72rem;font-family:"Space Mono"}footer{text-align:center;padding:1.5rem;font-size:.75rem;color:#475569;border-top:1px solid var(--b);margin-top:2rem}footer a{color:var(--a);text-decoration:none}</style><!-- DOCTRINE-60-UX-ENRICH direct-inject-20260424-142737 -->
<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><div class="wrap"><div class="hero"><h1>WEVAL Ultimate <em id="sigma">Quality</em></h1><p style="margin-top:.5rem;font-size:.85rem">48 tests · Infra + WEVIA + S95 + Pages + Security + Ethica + External</p></div><div class="stats"><div class="stat"><div class="sn" style="color:var(--a)" id="sTotal"></div><div class="sl">Tests</div></div><div class="stat"><div class="sn" style="color:var(--g)" id="sPass"></div><div class="sl">Pass</div></div><div class="stat"><div class="sn" style="color:var(--r)" id="sFail"></div><div class="sl">Fail</div></div><div class="stat"><div class="sn" id="sSigma"></div><div class="sl">Sigma</div></div><div class="stat"><div class="sn" style="color:var(--w)" id="sTime"></div><div class="sl">ms</div></div></div><div style="text-align:center"><button class="btn" id="btn" onclick="run()"><span class="play"></span><span class="spin"></span> Lancer les tests</button></div><div class="out" id="out"></div></div><footer>© 2026 <a href="/">WEVAL</a> · <a href="/nonreg.html">NonReg 67</a> · <a href="/trust-center.html">Trust</a> · <a href="/products/workspace.html">62 Produits</a></footer><script>async function run(){var b=document.getElementById("btn"),o=document.getElementById("out");b.classList.add("loading");b.disabled=true;o.className="out show";o.innerHTML="<p style=\"text-align:center;padding:2rem\">Tests en cours...</p>";try{var r=await fetch("/api/ultimate-quality.php?k=WEVADS2026");var d=await r.json();document.getElementById("sTotal").textContent=d.total;document.getElementById("sPass").textContent=d.pass;document.getElementById("sFail").textContent=d.fail;document.getElementById("sTime").textContent=d.elapsed_ms;var sig=d.sigma==="6"?"6σ":d.pass+"/"+d.total;document.getElementById("sSigma").textContent=sig;document.getElementById("sSigma").style.color=d.fail===0?"var(--g)":"var(--r)";document.getElementById("sigma").textContent=d.fail===0?"6σ":"Quality";document.getElementById("sigma").style.color=d.fail===0?"var(--g)":"var(--r)";var h="";d.tests.forEach(function(t){var ic=t.s==="pass"?"✓":"✗";var cl=t.s==="pass"?"color:var(--g)":"color:var(--r)";h+="<div class=\"t "+t.s+"\"><span><span style=\""+cl+";margin-right:6px\">"+ic+"</span>"+t.n+"</span><span class=\"d\">"+t.d+"</span></div>"});o.innerHTML=h}catch(e){o.innerHTML="<p style=\"color:var(--r)\">Erreur: "+e.message+"</p>"}b.classList.remove("loading");b.disabled=false}</script>
<!-- === OPUS UNIVERSAL DRILL-DOWN v1 19avr — append-only, doctrine #14 === -->
<script>
(function(){
@@ -67,4 +106,21 @@
<script src="/api/a11y-auto-enhancer.js" defer></script>
<!-- WTP_UDOCK_V1 (Opus 21-avr t34final) --><script src="/wtp-unified-dock.js" defer></script>
<script src="/opus-antioverlap-doctrine.js?v=1776776094" defer></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>

View File

@@ -12,7 +12,46 @@ h1{color:#60a5fa;margin:0 0 20px 0}
.btn:hover{background:#1d4ed8}
.status{font-size:11px;padding:2px 8px;border-radius:4px;background:#064e3b;color:#86efac}
.recipient{color:#a78bfa;font-weight:600}
</style></head><body>
</style><!-- DOCTRINE-60-UX-ENRICH direct-inject-20260424-142732 -->
<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>
<h1>📬 V63 Send Queue — 1-click Gmail compose</h1>
<div class="meta" id="meta">Loading...</div>
<div id="list"></div>
@@ -98,4 +137,21 @@ load(); setInterval(load, 30000);
<script src="/api/a11y-auto-enhancer.js" defer></script>
<!-- WTP_UDOCK_V1 (Opus 21-avr t34final) --><script src="/wtp-unified-dock.js" defer></script>
<script src="/opus-antioverlap-doctrine.js?v=1776776094" defer></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>

View File

@@ -40,6 +40,45 @@ h1 span{color:var(--ac)}
.b-warn{background:rgba(245,158,11,.15);color:var(--warn)}
.b-oauth{background:rgba(185,116,240,.15);color:#b794f6}
.loading{padding:40px;text-align:center;color:var(--mu)}
</style>
<!-- DOCTRINE-60-UX-ENRICH direct-inject-20260424-142732 -->
<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>
@@ -107,5 +146,22 @@ setInterval(load, 60000);
<script src="/api/a11y-auto-enhancer.js" defer></script>
<!-- WTP_UDOCK_V1 (Opus 21-avr t34final) --><script src="/wtp-unified-dock.js" defer></script>
<script src="/opus-antioverlap-doctrine.js?v=1776776094" defer></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>

View File

@@ -18,6 +18,45 @@ p{color:#a0a0b0;line-height:1.65;margin-bottom:14px}
a{display:inline-block;margin-top:20px;padding:14px 28px;background:#d4af37;color:#0a0a0f;text-decoration:none;border-radius:8px;font-weight:700;letter-spacing:.04em;transition:.2s}
a:hover{background:#f5d272;transform:translateY(-2px)}
.meta{margin-top:28px;padding-top:20px;border-top:1px solid #2a2a36;font-size:11px;color:#666;font-family:monospace}
</style>
<!-- DOCTRINE-60-UX-ENRICH direct-inject-20260424-142732 -->
<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>
@@ -100,5 +139,22 @@ a:hover{background:#f5d272;transform:translateY(-2px)}
<script src="/api/a11y-auto-enhancer.js" defer></script>
<!-- WTP_UDOCK_V1 (Opus 21-avr t34final) --><script src="/wtp-unified-dock.js" defer></script>
<script src="/opus-antioverlap-doctrine.js?v=1776776094" defer></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>

View File

@@ -7,6 +7,45 @@
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.2.0/css/all.min.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/4.1.1/animate.min.css">
<link rel="stylesheet" href="styles.css">
<!-- DOCTRINE-60-UX-ENRICH direct-inject-20260424-142737 -->
<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>
<div class="container">
@@ -128,6 +167,23 @@
<script src="/api/a11y-auto-enhancer.js" defer></script>
<!-- WTP_UDOCK_V1 (Opus 21-avr t34final) --><script src="/wtp-unified-dock.js" defer></script>
<script src="/opus-antioverlap-doctrine.js?v=1776776094" defer></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>
```

View File

@@ -68,6 +68,45 @@ html, body { width:100%; height:100vh; overflow:hidden; background:#0a0e1a; colo
.auth-banner a { color:#fff; text-decoration:underline; margin-left:8px; font-weight:600 }
.auth-banner.show { display:block }
.auth-banner.show + .wtp-container { padding-top:44px }
</style>
<!-- DOCTRINE-60-UX-ENRICH direct-inject-20260424-142737 -->
<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>
@@ -209,5 +248,22 @@ document.addEventListener('keydown', e => {
<script src="/api/a11y-auto-enhancer.js" defer></script>
<!-- WTP_UDOCK_V1 (Opus 21-avr t34final) --><script src="/wtp-unified-dock.js" defer></script>
<script src="/opus-antioverlap-doctrine.js?v=1776776094" defer></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>