/* 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; }
22 clients accompagnés dans leur transformation digitale. IA souveraine, Cloud, Marketing Digital, SAP — des cas concrets avec impact quantifié.
Déploiement d'une plateforme de marketing digital multi-canal pour les professionnels de santé. Ciblage HCP, consentement RGPD, analytics temps réel.
Migration Cloud et intégration SAP S/4HANA pour la division propulsion. Optimisation des processus achats et supply chain.
Audit cybersécurité et mise en conformité RGPD des systèmes d'information voyageurs. Tests de pénétration et recommandations.
Transformation digitale et déploiement d'une plateforme IA pour l'optimisation des processus industriels et la maintenance prédictive.
Intégration Cloud souverain et migration des systèmes de reporting réglementaire. Conformité Bâle III et automatisation.
Stratégie marketing digital omnicanal et déploiement de campagnes automatisées pour les marchés Maghreb et Afrique.
Déploiement ERP SAP et intégration des flux logistiques pour les opérations Afrique du Nord. Formation équipes locales.
Audit de sécurité des infrastructures IT et recommandations d'architecture Cloud souverain. Classification et chiffrement.
Plateforme B2B multi-canal pour la communication avec 50 000+ professionnels de santé. Email, SMS, consentement.
Discutons de vos enjeux. Audit gratuit et proposition sous 48h.
Réserver un audit →