/* D524 SYSTEMIC Yacine 30avr - applies on ALL HTML pages */ /* Rule 1: dark theme inheritance */ html.dark, body.dark, [class*="dark-mode"], [class*="dark-theme"] { background: #0a0a0f !important; color: #e8e6e3 !important; } /* Rule 2: never gray-800 on dark bg */ [style*="background:#0a0e1a"] [style*="color:#1f2937"], [style*="background:#0f172a"] [style*="color:#1f2937"], [style*="background:#111827"] [style*="color:#1f2937"], [style*="background-color:#0a0e1a"] [style*="color:#1f2937"], [style*="background-color:#0f172a"] [style*="color:#1f2937"], [style*="background-color:#111827"] [style*="color:#1f2937"] { color: #e2e8f0 !important; } /* Rule 3: never white on white */ [style*="background:#fff"] [style*="color:#fff"], [style*="background:white"] [style*="color:white"], [style*="background:#ffffff"] [style*="color:#ffffff"] { color: #1f2937 !important; } /* Rule 4: gray-400/500 on light bg → darker */ [style*="background:#fff"] [style*="color:#94a3b8"], [style*="background:#fff"] [style*="color:#9ca3af"], [style*="background:white"] [style*="color:#94a3b8"] { color: #475569 !important; } /* Rule 5: cockpit/admin sections force dark */ .cockpit, .admin-panel, [class*="dispatch"], [class*="dashboard"] { background-color: #0a0a0f; color: #e8e6e3; } .cockpit *:not(button):not(input):not(svg), [class*="dispatch"] *:not(button):not(input):not(svg) { color: inherit; } /* Rule 6: Plan/Commands/Step (wevia-agent pattern) */ .plan, .plan_revised { background: rgba(246,213,114,0.15) !important; padding: 14px 18px; } .plan-list li, .plan-list li * { color: #ffffff !important; } .cmd, .commands-preview { color: #4ecdc4 !important; background: rgba(0,0,0,0.6) !important; } .output { color: #e8e6e3 !important; background: rgba(0,0,0,0.7) !important; } .event-header { color: #f6d572 !important; font-weight: 700 !important; } /* Rule 7: FAQ pattern */ .wr-faq-q span:not(.wr-faq-arrow) { color: #ffffff !important; } .wr-faq-a p { color: #f1f5f9 !important; } /* Rule 8: contact labels visible */ .contact-label, [class*="contact-label"] { color: #ffffff !important; font-weight: 700 !important; } /* Rule 9: cards on dark bg with white-on-white text */ .card * { color: inherit; } /* Rule 10: headers always white in dark contexts */ [class*="bg-gray-9"] h1, [class*="bg-gray-9"] h2, [class*="bg-gray-9"] h3, [class*="bg-slate-9"] h1, [class*="bg-slate-9"] h2, [class*="bg-slate-9"] h3, [class*="bg-zinc-9"] h1, [class*="bg-zinc-9"] h2 { color: #ffffff !important; } /* D551 - Smart contrast fix systémique 1. CSS patterns: containers avec bg dark connu → text light forcé 2. Couvre header/topbar/sections dark sur pages mode JOUR */ /* === MODE JOUR : containers dark inline → text light === */ html:not(.dark) [style*="background:#0a0e1a"], html:not(.dark) [style*="background:#0f172a"], html:not(.dark) [style*="background:#111827"], html:not(.dark) [style*="background:#1e293b"], html:not(.dark) [style*="background:#0c1018"], html:not(.dark) [style*="background:#080a10"], html:not(.dark) [style*="background:#14193"], html:not(.dark) [style*="background:#020617"], html:not(.dark) [style*="background-color:#0a0e1a"], html:not(.dark) [style*="background-color:#0f172a"], html:not(.dark) [style*="background-color:#111827"], html:not(.dark) [style*="background-color:#1e293b"], html:not(.dark) [style*="background-color:#0c1018"], html:not(.dark) [style*="background-color:rgb(15"], html:not(.dark) [style*="background-color:rgb(8,"], html:not(.dark) [style*="background-color:rgb(10,"], html:not(.dark) [style*="background-color:rgb(20,"], html:not(.dark) [style*="background-color:rgba(8,"], html:not(.dark) [style*="background-color:rgba(10,"], html:not(.dark) [style*="background-color:rgba(15,"], html:not(.dark) [style*="background:rgba(8,"], html:not(.dark) [style*="background:rgba(15,"] { color: #f1f5f9 !important; } /* Cascade : children inherit light text */ html:not(.dark) [style*="background:#0a0e1a"] *, html:not(.dark) [style*="background:#0f172a"] *, html:not(.dark) [style*="background:#111827"] *, html:not(.dark) [style*="background:#1e293b"] *, html:not(.dark) [style*="background-color:#0a0e1a"] *, html:not(.dark) [style*="background-color:#0f172a"] *, html:not(.dark) [style*="background-color:#111827"] *, html:not(.dark) [style*="background-color:#1e293b"] *, html:not(.dark) [style*="background:rgba(8,"] *, html:not(.dark) [style*="background:rgba(15,"] *, html:not(.dark) [style*="background-color:rgba(8,"] *, html:not(.dark) [style*="background-color:rgba(15,"] * { color: #f1f5f9 !important; } /* Tailwind dark bg classes */ html:not(.dark) .bg-slate-900, html:not(.dark) .bg-slate-800, html:not(.dark) .bg-gray-900, html:not(.dark) .bg-gray-800, html:not(.dark) .bg-zinc-900, html:not(.dark) .bg-neutral-900, html:not(.dark) .bg-stone-900, html:not(.dark) .bg-black { color: #f1f5f9 !important; } html:not(.dark) .bg-slate-900 *, html:not(.dark) .bg-slate-800 *, html:not(.dark) .bg-gray-900 *, html:not(.dark) .bg-gray-800 * { color: #f1f5f9 !important; } /* Text-white classes preserved */ html:not(.dark) .text-white { color: #ffffff !important; } html:not(.dark) .text-white\/80 { color: rgba(255,255,255,0.8) !important; } html:not(.dark) .text-white\/60 { color: rgba(255,255,255,0.6) !important; } /* Inverse: containers blanc/cream avec texte qui était hardcoded blanc */ html:not(.dark) [style*="background:#fff"] [style*="color:#fff"], html:not(.dark) [style*="background:#ffffff"] [style*="color:#ffffff"], html:not(.dark) [style*="background:white"] [style*="color:white"] { color: #1f2937 !important; } /* D552 - Enhanced contrast fix - patterns supplémentaires + runtime amélioré */ /* === LIGHT TEXT classes hardcoded sur bg cream/blanc === */ html:not(.dark) .text-zinc-50, html:not(.dark) .text-zinc-100, html:not(.dark) .text-zinc-200, html:not(.dark) .text-slate-50, html:not(.dark) .text-slate-100, html:not(.dark) .text-slate-200, html:not(.dark) .text-gray-50, html:not(.dark) .text-gray-100, html:not(.dark) .text-gray-200 { color: #1f2937 !important; } /* === Dark BG variants supplémentaires === */ html:not(.dark) [style*="background:#0c1018"] *, html:not(.dark) [style*="background:#0e111c"] *, html:not(.dark) [style*="background:#141933"] *, html:not(.dark) [style*="background:#0d1117"] *, html:not(.dark) [style*="background-color:#141933"] *, html:not(.dark) [style*="background-color:#0d1117"] *, html:not(.dark) [style*="background:rgb(20,"] *, html:not(.dark) [style*="background:rgb(30,"] *, html:not(.dark) [style*="background-color:rgb(20,"] *, html:not(.dark) [style*="background-color:rgb(30,"] *, html:not(.dark) [style*="background:rgba(14,"] *, html:not(.dark) [style*="background:rgba(20,"] *, html:not(.dark) [style*="background:rgba(30,"] *, html:not(.dark) [style*="background:rgba(10,10,15"] *, html:not(.dark) [style*="background-color:rgba(14,"] *, html:not(.dark) [style*="background-color:rgba(20,"] *, html:not(.dark) [style*="background-color:rgba(30,"] * { color: #f1f5f9 !important; } /* === .stat / .phase / .input-group .composer-row classes communes === */ html:not(.dark) .stat, html:not(.dark) .phase, html:not(.dark) .phase-header, html:not(.dark) .input-group:not(.dark), html:not(.dark) .composer-row, html:not(.dark) .topbar, html:not(.dark) .nav-links, html:not(.dark) .links { /* If bg is dark via inline style, force text light */ } /* === Conteneurs avec .dark suffix === */ html:not(.dark) [class*="-dark"] *, html:not(.dark) [class*="dark-"]:not(.dark) * { color: inherit !important; } /* D553 - Surgical patterns for known dashboard structures */ /* === Common dashboard stat/phase/composer classes with dark bg === */ html:not(.dark) .stat, html:not(.dark) .stat *, html:not(.dark) .phase, html:not(.dark) .phase *, html:not(.dark) .phase-header, html:not(.dark) .phase-header *, html:not(.dark) .composer-row, html:not(.dark) .composer-row *, html:not(.dark) .input-group, html:not(.dark) .input-group *, html:not(.dark) .nav-links, html:not(.dark) .nav-links *, html:not(.dark) .links, html:not(.dark) .links *, html:not(.dark) .topbar:not(.bg-white), html:not(.dark) .topbar:not(.bg-white) *, html:not(.dark) .d490-stat-item, html:not(.dark) .d490-stat-item *, html:not(.dark) .d491-plan-cta, html:not(.dark) .d491-plan-cta * { color: #f1f5f9 !important; } /* Override if these have light bg explicitly */ html:not(.dark) .stat[style*="background:#fff"], html:not(.dark) .stat[style*="background:white"], html:not(.dark) .stat[style*="background-color:#fff"] { color: #1f2937 !important; } /* Light text classes hardcoded sur bg light → force dark */ html:not(.dark) .text-zinc-50, html:not(.dark) .text-zinc-100, html:not(.dark) .text-zinc-200, html:not(.dark) .text-slate-50, html:not(.dark) .text-slate-100, html:not(.dark) .text-slate-200, html:not(.dark) .text-gray-50, html:not(.dark) .text-gray-100, html:not(.dark) .text-gray-200 { color: #1f2937 !important; } /* But preserve inside actual dark containers */ html:not(.dark) .stat .text-zinc-100, html:not(.dark) .stat .text-slate-100, html:not(.dark) [class*="dark"] .text-zinc-100, html:not(.dark) [style*="background:#0a"] .text-zinc-100, html:not(.dark) [style*="background:#0f"] .text-zinc-100, html:not(.dark) [style*="background:#11"] .text-zinc-100 { color: #f1f5f9 !important; } /* === Variants of dark backgrounds === */ html:not(.dark) [style*="background:rgb(15,"] *, html:not(.dark) [style*="background:rgb(20,"] *, html:not(.dark) [style*="background:rgb(30,"] *, html:not(.dark) [style*="background-color:rgb(15,"] *, html:not(.dark) [style*="background-color:rgb(20,"] *, html:not(.dark) [style*="background-color:rgb(30,"] *, html:not(.dark) [style*="background:rgba(8,"] *, html:not(.dark) [style*="background:rgba(10,"] *, html:not(.dark) [style*="background:rgba(14,"] *, html:not(.dark) [style*="background:rgba(15,"] *, html:not(.dark) [style*="background:rgba(20,"] *, html:not(.dark) [style*="background:rgba(30,"] *, html:not(.dark) [style*="background-color:rgba(8,"] *, html:not(.dark) [style*="background-color:rgba(10,"] *, html:not(.dark) [style*="background-color:rgba(14,"] *, html:not(.dark) [style*="background-color:rgba(15,"] *, html:not(.dark) [style*="background-color:rgba(20,"] *, html:not(.dark) [style*="background-color:rgba(30,"] * { color: #f1f5f9 !important; } /* D555 - Désactive TOUTES animations infinite platform-wide Préserve uniquement les status dots intentionnels (3-4 classes connues) */ /* === Force toutes animations one-shot === */ * { animation-iteration-count: 1 !important; animation-fill-mode: forwards !important; } /* === Whitelist : status dots qui DOIVENT pulser intentionnellement === */ .live-dot, .pulse-dot, .status-pulse, .pulse-only, [class="pulse-dot"], [class="live-dot"], .pulse-indicator, .dot-pulse { animation-iteration-count: infinite !important; } /* === Kill spécifique des animations longues qui font respirer la page === */ * { animation-duration: 0s !important; } .live-dot, .pulse-dot, .status-pulse, .pulse-only, .pulse-indicator, .dot-pulse { animation-duration: 2s !important; } /* === Override fade-in/slide-up: instant (no animation needed) === */ [class*="fade-in"], [class*="fadeIn"], [class*="fade-up"], [class*="fadeUp"], [class*="slide-up"], [class*="slideUp"], [class*="enter-"], [class*="reveal"], [class*="card-fade"], [class*="organic"] { animation: none !important; opacity: 1 !important; transform: none !important; } /* === Disable hover transforms qui peuvent paraître pulser === */ [style*="transform: scale"]:not(:hover) { transform: none !important; } :root { --wtp-bg-light: #F5F0EB; --wtp-text-light: #1A1A2E; --wtp-accent-light: #2563EB; --wtp-surface-light: #FFFFFF; --wtp-muted-light: #6B6B7B; --wtp-bg-dark: #1A1A2E; --wtp-text-dark: #E0E0E0; --wtp-accent-dark: #60A5FA; --wtp-surface-dark: #252540; --wtp-muted-dark: #A0A0B0; } html[data-theme='light'], body[data-theme='light'] { --bg-primary: var(--wtp-bg-light); --text-primary: var(--wtp-text-light); --accent-primary: var(--wtp-accent-light); --surface-primary: var(--wtp-surface-light); --text-muted: var(--wtp-muted-light); background-color: var(--wtp-bg-light) !important; color: var(--wtp-text-light) !important; } html[data-theme='dark'], body[data-theme='dark'] { --bg-primary: var(--wtp-bg-dark); --text-primary: var(--wtp-text-dark); --accent-primary: var(--wtp-accent-dark); --surface-primary: var(--wtp-surface-dark); --text-muted: var(--wtp-muted-dark); background-color: var(--wtp-bg-dark) !important; color: var(--wtp-text-dark) !important; } html[data-theme='light'] body, html[data-theme='dark'] body { background-color: var(--bg-primary) !important; color: var(--text-primary) !important; } html[data-theme='light'] div, html[data-theme='light'] section, html[data-theme='light'] article, html[data-theme='dark'] div, html[data-theme='dark'] section, html[data-theme='dark'] article { background-color: transparent; }

Framework WEVAL 4D

Une approche structurée en 4 phases, enrichie par l'IA, qui a fait ses preuves sur 200+ projets. Chaque phase est conçue pour maximiser le ROI tout en minimisant les risques.

D1
Phase 1 — 2 à 4 semaines

🔍 Diagnostic

Audit complet de votre SI, processus et maturité digitale. Nous cartographions l'existant, identifions les quick wins à fort impact, et quantifions le potentiel de transformation avec des métriques précises.

Notre IA WEVIA analyse automatiquement vos architectures et génère des schémas de diagnostic en temps réel, accélérant cette phase de 40% par rapport aux méthodes traditionnelles.

Audit SI 360° Cartographie applicative Benchmark sectoriel Quick wins identifiés Score de maturité digitale
D2
Phase 2 — 3 à 6 semaines

📐 Design

Construction d'une roadmap sur-mesure alignée avec vos objectifs business. Sélection des solutions optimales (build vs buy), architecture cible, cadrage budget-planning, et modèle de gouvernance projet.

Nous utilisons des frameworks éprouvés (TOGAF, SAFe, ITIL) adaptés au contexte marocain et africain, avec une attention particulière à la souveraineté des données et à la conformité réglementaire locale.

Roadmap 12-24 mois Architecture cible Business case chiffré Gouvernance projet Plan de gestion des risques
D3
Phase 3 — 2 à 6 mois

🚀 Delivery

Exécution agile par sprints de 2-3 semaines, avec des démonstrations régulières et une implication continue de vos équipes. Tests automatisés, intégration continue, et recette collaborative à chaque itération.

Notre équipe combine consultants stratégiques et ingénieurs techniques pour garantir que la vision business se traduit fidèlement en solution technique. Un Chef de Projet dédié assure le suivi quotidien.

Sprints agiles Tests automatisés CI/CD pipeline Recette continue Documentation technique
D4
Phase 4 — Continu

🛡️ Durabilité

Formation de vos équipes, conduite du changement, support continu et monitoring des KPIs. Nous ne disparaissons pas après le go-live : optimisation post-déploiement garantie pendant 6 mois.

Un tableau de bord de suivi est mis à disposition pour mesurer l'adoption, la performance et le ROI réel vs. prévisionnel. Nos consultants restent disponibles pour des ajustements stratégiques.

Formation key users Change management Support N1/N2/N3 Dashboard KPIs Optimisation continue

Ce qui nous différencie

🧠

IA Intégrée

WEVIA, notre IA propriétaire, accélère chaque phase : diagnostic automatisé, génération de schémas, analyse prédictive.

🌍

Expertise Locale

Connaissance du tissu économique marocain et africain. Conformité Loi 09-08 et réglementations locales intégrée nativement.

Souveraineté First

Solutions open-source et multi-cloud en priorité. Pas de dépendance à un fournisseur unique. Cloud souverain pour l'IA.

Prêt à transformer votre entreprise ?

Commençons par un diagnostic gratuit de 30 minutes pour évaluer votre maturité digitale.

📅 Réserver mon diagnostic

© 2026 WEVAL Consulting | Études de cas | Blog | WEVIA IA