diff --git a/ALL_1_QUICK.png b/ALL_1_QUICK.png new file mode 100644 index 000000000..b391840bd Binary files /dev/null and b/ALL_1_QUICK.png differ diff --git a/ALL_2_MERMAID.png b/ALL_2_MERMAID.png new file mode 100644 index 000000000..262e862a5 Binary files /dev/null and b/ALL_2_MERMAID.png differ diff --git a/ALL_3_LOGO.png b/ALL_3_LOGO.png new file mode 100644 index 000000000..53e842f4c Binary files /dev/null and b/ALL_3_LOGO.png differ diff --git a/ALL_4_SWOT.png b/ALL_4_SWOT.png new file mode 100644 index 000000000..ab7d5a2cd Binary files /dev/null and b/ALL_4_SWOT.png differ diff --git a/FINAL_LOGO.png b/FINAL_LOGO.png new file mode 100644 index 000000000..5776632d2 Binary files /dev/null and b/FINAL_LOGO.png differ diff --git a/LANG_DARIJA.png b/LANG_DARIJA.png new file mode 100644 index 000000000..43be007ec Binary files /dev/null and b/LANG_DARIJA.png differ diff --git a/LANG_EN.png b/LANG_EN.png new file mode 100644 index 000000000..27f7beffd Binary files /dev/null and b/LANG_EN.png differ diff --git a/LANG_ES.png b/LANG_ES.png new file mode 100644 index 000000000..610cc429c Binary files /dev/null and b/LANG_ES.png differ diff --git a/LANG_FR.png b/LANG_FR.png new file mode 100644 index 000000000..d76df8a46 Binary files /dev/null and b/LANG_FR.png differ diff --git a/NOLANG_DARIJA.png b/NOLANG_DARIJA.png new file mode 100644 index 000000000..8aa0187fe Binary files /dev/null and b/NOLANG_DARIJA.png differ diff --git a/PROOF_DEEP.png b/PROOF_DEEP.png new file mode 100644 index 000000000..1d0093bb0 Binary files /dev/null and b/PROOF_DEEP.png differ diff --git a/PROOF_FAST.png b/PROOF_FAST.png new file mode 100644 index 000000000..a4f7097e2 Binary files /dev/null and b/PROOF_FAST.png differ diff --git a/PROOF_LOGO.png b/PROOF_LOGO.png new file mode 100644 index 000000000..5abee070a Binary files /dev/null and b/PROOF_LOGO.png differ diff --git a/PROOF_MERMAID.png b/PROOF_MERMAID.png new file mode 100644 index 000000000..7218869fa Binary files /dev/null and b/PROOF_MERMAID.png differ diff --git a/api/weval-ia-fast.php b/api/weval-ia-fast.php index 3c79f3303..3e3c56ab6 100644 --- a/api/weval-ia-fast.php +++ b/api/weval-ia-fast.php @@ -9,6 +9,97 @@ $in = json_decode(file_get_contents('php://input'), true) ?: []; $msg = trim($in['message'] ?? ''); if (strlen($msg) < 2) { die(json_encode(['error'=>'message required'])); } +// Auto-detect language from message or use provided lang +$detectedLang = strtolower(trim($in['lang'] ?? 'fr')); +$langInstructions = [ + 'fr' => 'Reponds en francais.', + 'en' => 'Respond in English.', + 'es' => 'Responde en espanol.', + 'de' => 'Antworte auf Deutsch.', + 'it' => 'Rispondi in italiano.', + 'pt' => 'Responda em portugues.', + 'ar' => 'اجب بالعربية.', + 'darija' => 'Jawb b darija maghribiya, kteb b l7orouf latinia (franco-arabe). Exemple: wach, kifash, labas, etc.', + 'zh' => '用中文回答。', + 'ru' => 'Отвечай по-русски.', + 'tr' => 'Turkce cevap ver.', + 'ja' => '日本語で答えてください。', + 'ko' => '한국어로 대답하세요.', + 'hi' => 'हिंदी में जवाब दो।' +]; +$langPrompt = $langInstructions[$detectedLang] ?? $langInstructions['fr']; + + + +// ═══ INTELLIGENCE AUGMENTÉE: SearXNG + Qdrant RAG ═══ + +// --- SearXNG Web Search (for current info queries) --- +$webContext = ''; +if (preg_match('/(actualite|news|recent|prix|cours|meteo|score|election|dernier|nouveau|2026|2025|tendance|marche|bourse)/iu', $msg)) { + $sq = urlencode(mb_substr($msg, 0, 100)); + $sch = curl_init("http://localhost:8080/search?q={$sq}&format=json&categories=general&language=fr"); + curl_setopt_array($sch, [CURLOPT_RETURNTRANSFER=>true, CURLOPT_TIMEOUT=>4, CURLOPT_CONNECTTIMEOUT=>2]); + $sr = curl_exec($sch); curl_close($sch); + if ($sr) { + $sd = json_decode($sr, true); + $results = array_slice($sd['results'] ?? [], 0, 3); + foreach ($results as $r) { + $webContext .= "- " . ($r['title'] ?? '') . ": " . mb_substr($r['content'] ?? '', 0, 150) . "\n"; + } + } +} + +// --- Qdrant RAG (for WEVAL/consulting specific queries) --- +$kbContext = ''; +if (preg_match('/(weval|wevia|consulting|erp|sap|vistex|ethica|hcp|pharma|cloud|cyber|notre|nos|votre)/iu', $msg)) { + // Simple keyword search via Qdrant scroll (no embedding needed for keyword match) + $qBody = json_encode(['limit'=>3, 'with_payload'=>true, 'filter'=>['should'=>[['key'=>'text','match'=>['text'=>mb_substr($msg,0,50)]]]]]); + $qch = curl_init("http://localhost:6333/collections/wevia_kb/points/scroll"); + curl_setopt_array($qch, [CURLOPT_POST=>true, CURLOPT_RETURNTRANSFER=>true, CURLOPT_TIMEOUT=>3, CURLOPT_CONNECTTIMEOUT=>1, CURLOPT_HTTPHEADER=>['Content-Type: application/json'], CURLOPT_POSTFIELDS=>$qBody]); + $qr = curl_exec($qch); curl_close($qch); + if ($qr) { + $qd = json_decode($qr, true); + foreach (($qd['result']['points'] ?? []) as $pt) { + $kbContext .= mb_substr($pt['payload']['text'] ?? '', 0, 200) . "\n"; + } + } +} + +// --- Augment system prompt with context --- +$augment = ''; +if ($webContext) $augment .= "\nINFO WEB RECENTE:\n{$webContext}"; +if ($kbContext) $augment .= "\nBASE DE CONNAISSANCES WEVAL:\n{$kbContext}"; + +// Logo shortcut — route to local qwen3:8b for better SVG +if (preg_match('/(logo|logos|genere.*logo|cree.*logo|design.*logo|branding)/i', $msg)) { + $logoSys = "Tu es un designer de logos expert. Quand on te demande un logo, tu generes UNIQUEMENT du code SVG dans des blocs ```svg. Chaque logo doit etre un SVG complet avec viewBox=\"0 0 200 200\", des formes geometriques modernes, des degrades (linearGradient), du texte stylise, et des couleurs professionnelles. Genere 2 logos differents. AUCUN texte descriptif, UNIQUEMENT du SVG."; + $logoBody = json_encode([ + 'model' => 'qwen3:8b', + 'messages' => [ + ['role' => 'system', 'content' => $logoSys], + ['role' => 'user', 'content' => mb_substr($msg, 0, 500)] + ], + 'stream' => false, 'think' => false, + 'options' => ['num_predict' => 1200, 'temperature' => 0.8] + ]); + $ch = curl_init('http://127.0.0.1:11434/api/chat'); + curl_setopt_array($ch, [ + CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, + CURLOPT_TIMEOUT => 30, CURLOPT_CONNECTTIMEOUT => 3, + CURLOPT_HTTPHEADER => ['Content-Type: application/json'], + CURLOPT_POSTFIELDS => $logoBody + ]); + $r = curl_exec($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); + if ($code == 200 && $r) { + $d = json_decode($r, true); + $t = trim($d['message']['content'] ?? ''); + if (strlen($t) > 50 && stripos($t, ' $t, 'provider' => 'WEVIA Engine (qwen3:8b)', 'sources' => []])); + } + } + // Fallback to cloud providers below if local fails +} + // Image shortcut if (preg_match('/(image|photo|visuel|genere.*image|futuris)/i', $msg)) { // Extract meaningful keywords (skip stopwords) @@ -21,10 +112,11 @@ if (preg_match('/(image|photo|visuel|genere.*image|futuris)/i', $msg)) { die(json_encode(['response'=>"Image generee avec succes\n\n![Image]($imgUrl)",'provider'=>'WEVIA IA','sources'=>[]])); } + // ═══ PROVIDER CHAIN: Groq → Cerebras → S151 granite4 ═══ require_once '/opt/wevads/vault/credentials.php'; -$sys = "Tu es WEVIA, assistant IA souverain de WEVAL Consulting. Reponds en francais, utile et professionnel. Specialise en consulting digital, ERP, IA, cybersecurite. SCHEMAS: Quand on te demande un schema, diagramme, architecture, processus, ishikawa, flowchart ou mermaid, tu DOIS generer du code mermaid valide dans un bloc ```mermaid. Utilise graph TD ou graph LR. JAMAIS de liste a la place. Les noeuds: labels simples sans accents ni apostrophes. LOGOS: Quand on te demande un logo, genere 4 concepts. Pour CHAQUE: titre en gras, description (typo, couleurs HEX, style, usage) puis un bloc ```svg viewBox='0 0 200 200' elabore avec linearGradient, formes multiples (circle rect path polygon), texte stylise bold. Styles: Monogramme, Icone, Wordmark, Badge. JAMAIS un simple cercle avec 2 lettres."; -$body = [["role"=>"system","content"=>$sys],["role"=>"user","content"=>mb_substr($msg,0,2000)]]; +$sys = "Tu es WEVIA, intelligence artificielle de WEVAL Consulting (Casablanca). Direct, professionnel, concret. Specialiste: ERP/SAP, Cloud, IA, cybersecurite, email marketing, pharma Maghreb. REGLES: 1)Va droit au but, pas de filler phrases. 2)Quantifie plutot que qualifier. 3)Si incertain, dis-le. SCHEMAS: Quand on demande un schema/diagramme/flowchart/mermaid, tu DOIS generer un bloc ```mermaid avec graph TD ou LR. Labels simples sans accents. JAMAIS de liste a la place. LOGOS: Quand on demande un logo, tu DOIS generer du SVG dans un bloc ```svg. Vrai logo vectoriel avec formes geometriques, degrades, et texte. JAMAIS de description textuelle. CODE: Bloc ```python ou ```php etc. avec syntaxe correcte. " . $langPrompt; +$body = [["role"=>"system","content"=>$sys . $augment],["role"=>"user","content"=>mb_substr($msg,0,2000)]]; $resp = ''; $provider = ''; // Adaptive max_tokens: logos/schemas need more space @@ -81,7 +173,29 @@ if (!$resp) { } } -// ── 4. S151 GRANITE4 (CPU sovereign fallback) ── +// ── 4. S204 LOCAL (weval-brain sovereign) ── +if (!$resp) { + $ch = curl_init('http://127.0.0.1:11434/api/chat'); + curl_setopt_array($ch, [ + CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, + CURLOPT_TIMEOUT => 15, CURLOPT_CONNECTTIMEOUT => 2, + CURLOPT_HTTPHEADER => ['Content-Type: application/json'], + CURLOPT_POSTFIELDS => json_encode([ + 'model' => 'weval-brain', + 'messages' => [['role'=>'system','content'=>$sys],['role'=>'user','content'=>mb_substr($msg,0,2000)]], + 'stream' => false, 'think' => false, + 'options' => ['num_predict'=>500,'temperature'=>0.7] + ]) + ]); + $r = curl_exec($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); + if ($code == 200 && $r) { + $d = json_decode($r, true); + $t = trim($d['message']['content'] ?? ''); + if (strlen($t) > 20) { $resp = $t; $provider = 'WEVIA Brain (sovereign)'; } + } +} + +// ── 5. S151 GRANITE4 (CPU sovereign fallback) ── if (!$resp) { $ch = curl_init('http://151.80.235.110:11434/api/chat'); curl_setopt_array($ch, [ @@ -89,7 +203,7 @@ if (!$resp) { CURLOPT_TIMEOUT => 10, CURLOPT_CONNECTTIMEOUT => 3, CURLOPT_HTTPHEADER => ['Content-Type: application/json'], CURLOPT_POSTFIELDS => json_encode([ - 'model' => 'granite4', + 'model' => 'qwen3:4b', 'messages' => [['role'=>'system','content'=>$sys],['role'=>'user','content'=>mb_substr($msg,0,2000)]], 'stream' => false, 'think' => false, 'options' => ['num_predict'=>300,'temperature'=>0.7] @@ -105,4 +219,5 @@ if (!$resp) { if (!$resp) { $resp = 'Service temporairement indisponible, veuillez reessayer.'; $provider = 'WEVIA IA'; } -die(json_encode(['response'=>$resp,'provider'=>$provider,'mode'=>$in['mode']??'deep','sources'=>[]])); +$src = []; if ($webContext) $src[] = 'SearXNG'; if ($kbContext) $src[] = 'Qdrant KB'; +die(json_encode(['response'=>$resp,'provider'=>$provider,'mode'=>$in['mode']??'deep','sources'=>$src,'used_web'=>!!$webContext,'used_kb'=>!!$kbContext])); diff --git a/api/weval-ia-fast.php.GOLD b/api/weval-ia-fast.php.GOLD index c6cb27bcf..23dd22de1 100644 --- a/api/weval-ia-fast.php.GOLD +++ b/api/weval-ia-fast.php.GOLD @@ -21,19 +21,24 @@ if (preg_match('/(image|photo|visuel|genere.*image|futuris)/i', $msg)) { die(json_encode(['response'=>"Image generee avec succes\n\n![Image]($imgUrl)",'provider'=>'WEVIA IA','sources'=>[]])); } + // ═══ PROVIDER CHAIN: Groq → Cerebras → S151 granite4 ═══ require_once '/opt/wevads/vault/credentials.php'; -$sys = "Tu es WEVIA, assistant IA souverain de WEVAL Consulting. Reponds en francais, utile et professionnel. Specialise en consulting digital, ERP, IA, cybersecurite. Quand on te demande un schema, diagramme, architecture, processus, ishikawa, ou mermaid, tu DOIS generer du code mermaid valide dans un bloc ```mermaid. Utilise graph TD ou graph LR. Ne fais PAS de liste numerotee a la place du diagramme."; +$sys = "Tu es WEVIA, assistant IA souverain de WEVAL Consulting (Casablanca). Direct, structure, actionable. Specialise en consulting digital, ERP/SAP, IA, cybersecurite. SCHEMAS: Pour tout schema/diagramme/architecture/processus/mermaid, genere du code mermaid valide dans un bloc ```mermaid (graph TD/LR). Labels sans accents ni apostrophes. JAMAIS de liste a la place. LOGOS: Pour tout logo, genere du SVG dans un bloc ```svg. Vrai logo vectoriel avec formes geometriques et texte. JAMAIS de description textuelle. CODE: Pour tout code, utilise des blocs ``` avec le langage. Sois concis, quantifie, propose des actions concretes."; $body = [["role"=>"system","content"=>$sys],["role"=>"user","content"=>mb_substr($msg,0,2000)]]; $resp = ''; $provider = ''; +// Adaptive max_tokens: logos/schemas need more space +$isRich = preg_match('/(logo|schema|mermaid|diagramme|architecture|svg|flowchart|swot|analyse)/i', $msg); +$maxTok = $isRich ? 2000 : 800; + // ── 1. GROQ (llama-3.3-70b, ~1-3s) ── $ch = curl_init('https://api.groq.com/openai/v1/chat/completions'); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 8, CURLOPT_CONNECTTIMEOUT => 2, CURLOPT_HTTPHEADER => ['Content-Type: application/json', 'Authorization: Bearer '.GROQ_KEY], - CURLOPT_POSTFIELDS => json_encode(['model'=>'llama-3.3-70b-versatile','messages'=>$body,'max_tokens'=>800,'temperature'=>0.7]) + CURLOPT_POSTFIELDS => json_encode(['model'=>'llama-3.3-70b-versatile','messages'=>$body,'max_tokens'=>$maxTok,'temperature'=>0.7]) ]); $r = curl_exec($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($code == 200 && $r) { @@ -50,7 +55,7 @@ if (!$resp) { CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 6, CURLOPT_CONNECTTIMEOUT => 2, CURLOPT_HTTPHEADER => ['Content-Type: application/json', 'Authorization: Bearer '.$ck], - CURLOPT_POSTFIELDS => json_encode(['model'=>'qwen-3-235b-a22b-instruct-2507','messages'=>$body,'max_tokens'=>800,'temperature'=>0.7]) + CURLOPT_POSTFIELDS => json_encode(['model'=>'qwen-3-235b-a22b-instruct-2507','messages'=>$body,'max_tokens'=>$maxTok,'temperature'=>0.7]) ]); $r = curl_exec($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($code == 200 && $r) { @@ -67,7 +72,7 @@ if (!$resp) { CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 6, CURLOPT_CONNECTTIMEOUT => 2, CURLOPT_HTTPHEADER => ['Content-Type: application/json', 'Authorization: Bearer '.SAMBANOVA_KEY], - CURLOPT_POSTFIELDS => json_encode(['model'=>'Meta-Llama-3.3-70B-Instruct','messages'=>$body,'max_tokens'=>800]) + CURLOPT_POSTFIELDS => json_encode(['model'=>'Meta-Llama-3.3-70B-Instruct','messages'=>$body,'max_tokens'=>$maxTok]) ]); $r = curl_exec($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($code == 200 && $r) { diff --git a/products/cloudcost.html b/products/cloudcost.html index f786400ff..d535511c4 100644 --- a/products/cloudcost.html +++ b/products/cloudcost.html @@ -21,7 +21,7 @@ -
Cloud Cost Optimisation — Multi-provider

CloudCost — Optimisation Couts Cloud

Analysez et optimisez vos dépenses cloud. AWS, Azure, GCP, OVH, Scaleway — identifiez les economies et éliminéz le gaspillage.

40%
Economies moyennes
5+
Providers
< 1h
Premier audit
Fonctionnalités

Tout ce dont vous avez besoin

CloudCost combiné IA et expertise pour automatiser vos taches.
💰

Cost Analysis

Analyse détaillée des dépenses par service, region et équipe.

📊

Dashboard

Vue consolidee multi-provider : AWS, Azure, GCP, OVH, Scaleway.

🔍

Waste Detection

Détection automatique des ressources inutilisees ou surdimensionnees.

📈

Recommandations

Recommandations IA pour Reserved Instances, Spot, rightsizing.

🔔

Alertes Budget

Alertes en temps réel si les dépenses depassent les seuils definis.

📋

Rapports FinOps

Rapports mensuels FinOps avec ROI des optimisations appliquees.

👥

Cost Allocation

Attribution des coûts par équipe, projet et environnement.

📅

Forecasting

Previsions de dépenses sur 3-12 mois avec scenarios.

Auto-Optimize

Arret automatique des ressources dev/staging hors heures ouvrables.

Comment ca marche

Simple comme 1-2-3-4

1

Connectez vos comptes

AWS, Azure, GCP, OVH — connexion read-only securisee.

2

Analyse

Scan complet des dépenses et detection du gaspillage.

3

Recommandations

Plan d'optimisation avec economies estimees.

4

Optimisez

Appliquez les recommandations et suivez les economies.

Tarifs

Un plan pour chaque besoin

Starter
Gratuit
  • 1 provider
  • Dashboard basique
  • Alertes budget
  • Recommandations manuelles
Commencer
Pro
149EUR/mois
  • 5 providers
  • Waste detection
  • Auto-optimize
  • Rapports FinOps
  • Forecasting
  • Support prioritaire
Commencer
Enterprise
Sur mesure
  • Providers illimités
  • API complete
  • Custom rules
  • Multi-org
  • Account manager
  • SLA
Nous contacter
+
Cloud Cost Optimisation — Multi-provider

CloudCost — Optimisation Couts Cloud

Analysez et optimisez vos dépenses cloud. AWS, Azure, GCP, OVH, Scaleway, Huawei Cloud — identifiez les economies et éliminéz le gaspillage.

40%
Economies moyennes
5+
Providers
< 1h
Premier audit
Fonctionnalités

Tout ce dont vous avez besoin

CloudCost combiné IA et expertise pour automatiser vos taches.
💰

Cost Analysis

Analyse détaillée des dépenses par service, region et équipe.

📊

Dashboard

Vue consolidee multi-provider : AWS, Azure, GCP, OVH, Scaleway, Huawei Cloud.

🔍

Waste Detection

Détection automatique des ressources inutilisees ou surdimensionnees.

📈

Recommandations

Recommandations IA pour Reserved Instances, Spot, rightsizing.

🔔

Alertes Budget

Alertes en temps réel si les dépenses depassent les seuils definis.

📋

Rapports FinOps

Rapports mensuels FinOps avec ROI des optimisations appliquees.

👥

Cost Allocation

Attribution des coûts par équipe, projet et environnement.

📅

Forecasting

Previsions de dépenses sur 3-12 mois avec scenarios.

Auto-Optimize

Arret automatique des ressources dev/staging hors heures ouvrables.

Comment ca marche

Simple comme 1-2-3-4

1

Connectez vos comptes

AWS, Azure, GCP, OVH — connexion read-only securisee.

2

Analyse

Scan complet des dépenses et detection du gaspillage.

3

Recommandations

Plan d'optimisation avec economies estimees.

4

Optimisez

Appliquez les recommandations et suivez les economies.

Tarifs

Un plan pour chaque besoin

Starter
Gratuit
  • 1 provider
  • Dashboard basique
  • Alertes budget
  • Recommandations manuelles
Commencer
Pro
149EUR/mois
  • 5 providers
  • Waste detection
  • Auto-optimize
  • Rapports FinOps
  • Forecasting
  • Support prioritaire
Commencer
Enterprise
Sur mesure
  • Providers illimités
  • API complete
  • Custom rules
  • Multi-org
  • Account manager
  • SLA
Nous contacter

⚡ Optimisation — Demo Live

@@ -39,9 +39,9 @@ async function dm_cloudcost(){ }catch(e){o.innerHTML="Erreur: "+e.message} } -

Prêt à essayer CloudCost ?

Testez gratuitement.

Essayer maintenant
Essayer

Testez CloudCost

Posez votre question.

CloudCost

Optimisation Couts Cloud

Bienvenue sur CloudCost

Analysez et optimisez vos dépenses cloud. AWS, Azure, GCP, OVH, Scaleway — identifiez les economies et éliminéz le gaspillage.

+

Prêt à essayer CloudCost ?

Testez gratuitement.

Essayer maintenant
Essayer

Testez CloudCost

Posez votre question.

CloudCost

Optimisation Couts Cloud

Bienvenue sur CloudCost

Analysez et optimisez vos dépenses cloud. AWS, Azure, GCP, OVH, Scaleway, Huawei Cloud — identifiez les economies et éliminéz le gaspillage.

-
44 produits SaaS
Cloud souverain
API REST
RGPD conforme
France · Maroc · États-Unis · International
+
44 produits SaaS
Cloud souverain
API REST
RGPD conforme
France · Maroc · États-Unis · International

Demander un accès

@@ -71,4 +71,18 @@ function weviaProgress(container,startMs){ return {el:el,stop:function(){clearInterval(iv);bar.style.width='100%';txt.textContent='Termine!';}}; } + +
+
+Huawei Cloud +

Partenaire Huawei Cloud

+

WEVAL Consulting est revendeur officiel Huawei Cloud pour le Maghreb. ECS, GPU, Object Storage, CDN — tarifs négociés et support dédié en français.

+
+
61
Resellers actifs
+
3
Pays couverts
+
15%
Remise partenaire
+
+Commander Huawei Cloud +
+
\ No newline at end of file diff --git a/products/workspace.html b/products/workspace.html index d43a03d55..d4a2c6580 100644 --- a/products/workspace.html +++ b/products/workspace.html @@ -332,6 +332,65 @@ function go(page){ // SET IFRAME SRC — simple, direct, no conditions $('frameView').src=mod[1]+(mod[1].includes('?')?'&':'?')+'_t='+Date.now(); + +// Dark-mode injection for product iframes +$('frameView').addEventListener('load', function(){ + try { + var doc = this.contentDocument || this.contentWindow.document; + if (!doc) return; + var s = doc.createElement('style'); + s.textContent = ` + .in-iframe { background: #0b0d14 !important; color: #e2e8f0 !important; } + .in-iframe body { background: #0b0d14 !important; color: #e2e8f0 !important; } + .in-iframe section { background: transparent !important; } + .in-iframe .hero { background: transparent !important; } + .in-iframe h1, .in-iframe h2, .in-iframe h3 { color: #f1f5f9 !important; } + .in-iframe p, .in-iframe li, .in-iframe span { color: #94a3b8 !important; } + .in-iframe b, .in-iframe strong { color: #e2e8f0 !important; } + .in-iframe em { color: #d4a843 !important; } + .in-iframe .badge { background: rgba(212,168,67,.1) !important; color: #d4a843 !important; border: 1px solid rgba(212,168,67,.2) !important; } + .in-iframe input, .in-iframe textarea, .in-iframe select { background: #111827 !important; color: #e2e8f0 !important; border-color: #1e293b !important; } + .in-iframe .plan-card, .in-iframe .pricing-card, .in-iframe .tier-card, .in-iframe [class*="plan"], .in-iframe [class*="tier"], .in-iframe [class*="pricing"] { + background: linear-gradient(135deg, #111827, #0f172a) !important; + border: 1px solid #1e293b !important; + color: #e2e8f0 !important; + border-radius: 16px !important; + } + .in-iframe .feat, .in-iframe .feature, .in-iframe [class*="feat"] { + background: linear-gradient(135deg, #111827, #0f172a) !important; + border: 1px solid #1e293b !important; + border-radius: 12px !important; + } + .in-iframe .btn-p, .in-iframe .cta-btn, .in-iframe [class*="btn-p"] { + background: linear-gradient(135deg, #d4a843, #b8942e) !important; + color: #0a0d13 !important; + border: none !important; + border-radius: 12px !important; + font-weight: 700 !important; + } + .in-iframe .btn-o, .in-iframe [class*="btn-o"], .in-iframe [class*="btn-n"] { + background: transparent !important; + color: #94a3b8 !important; + border: 1px solid #334155 !important; + border-radius: 12px !important; + } + .in-iframe .stat-v, .in-iframe .stat b { color: #d4a843 !important; } + .in-iframe .stat-l, .in-iframe .stat small { color: #64748b !important; } + .in-iframe .stat { background: rgba(255,255,255,.03) !important; border: 1px solid #1e293b !important; border-radius: 12px !important; } + .in-iframe a { color: #60a5fa !important; } + .in-iframe code, .in-iframe pre { background: #1e293b !important; color: #e2e8f0 !important; } + .in-iframe hr { border-color: #1e293b !important; } + .in-iframe table { border-color: #1e293b !important; } + .in-iframe th { background: #111827 !important; color: #94a3b8 !important; border-color: #1e293b !important; } + .in-iframe td { border-color: #1e293b !important; color: #e2e8f0 !important; } + .in-iframe tr:hover { background: rgba(129,140,248,.05) !important; } + .in-iframe ::placeholder { color: #475569 !important; } + .in-iframe .sub { color: #64748b !important; } + `; + doc.head.appendChild(s); + } catch(e) {} +}); + } // HOME DASHBOARD