244 lines
18 KiB
PHP
244 lines
18 KiB
PHP
<?php header("Content-Type: text/html; charset=UTF-8"); ?>
|
|
<!DOCTYPE html>
|
|
<html lang="fr"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1">
|
|
<title>WEVIA Avatar Picker</title>
|
|
<style>
|
|
*{margin:0;padding:0;box-sizing:border-box}
|
|
body{background:#050a18;color:#e2e8f0;font-family:system-ui,sans-serif;display:flex;height:100vh;overflow:hidden}
|
|
.panel{height:100vh;overflow-y:auto;padding:12px}
|
|
.left{width:58%;border-right:1px solid rgba(6,182,212,.2)}
|
|
.right{width:42%}
|
|
h2{font-size:14px;padding:8px 0;position:sticky;top:0;background:#050a18;z-index:10}
|
|
.avatars{display:flex;flex-wrap:wrap;gap:3px;padding:4px 0}
|
|
.av{width:66px;height:80px;border-radius:8px;cursor:pointer;border:2px solid transparent;background:#0f1629;transition:.15s;display:flex;flex-direction:column;align-items:center;padding:2px}
|
|
.av:hover{border-color:#06b6d4;transform:scale(1.1)}
|
|
.av.picked{opacity:.15}
|
|
.av.sel{border-color:#ffd700;box-shadow:0 0 12px rgba(255,215,0,.3)}
|
|
.av img{width:58px;height:58px;border-radius:6px;object-fit:cover;background:#1a2035}
|
|
.av span{font-size:5.5px;color:#94a3b8;text-align:center;margin-top:1px;max-width:62px;overflow:hidden;white-space:nowrap}
|
|
.agents{display:flex;flex-direction:column;gap:6px}
|
|
.ag{display:flex;align-items:center;gap:8px;padding:8px;border-radius:8px;background:#0f1629;border:1px solid rgba(255,255,255,.06);cursor:pointer}
|
|
.ag:hover{border-color:rgba(6,182,212,.3)}
|
|
.slot{width:48px;height:48px;border-radius:8px;border:2px dashed rgba(255,255,255,.15);display:flex;align-items:center;justify-content:center;font-size:18px;color:#475569;background:#0a0f1e;flex-shrink:0}
|
|
.slot.f{border:2px solid #ffd700}
|
|
.slot img{width:100%;height:100%;border-radius:6px}
|
|
.nm{font-weight:800;font-size:12px}
|
|
.rl{font-size:9px;color:#64748b}
|
|
.pk{margin-left:auto;font-size:8px;color:#ffd700;background:rgba(255,215,0,.1);padding:2px 6px;border-radius:4px}
|
|
.x{font-size:8px;color:#ef4444;cursor:pointer;padding:2px 6px;margin-left:4px}
|
|
.tl{font-size:10px;font-weight:800;letter-spacing:3px;padding:8px 0 2px}
|
|
.src{font-size:12px;color:#06b6d4;font-weight:700;padding:10px 0 4px;border-bottom:1px solid rgba(6,182,212,.15);margin-top:12px}
|
|
.cnt{font-size:11px;color:#ffd700;float:right}
|
|
.copy{position:fixed;bottom:12px;right:12px;padding:10px 24px;border:none;border-radius:8px;background:linear-gradient(135deg,#06b6d4,#8b5cf6);color:#fff;font-weight:700;font-size:13px;cursor:pointer;z-index:99}
|
|
.bar{padding:6px 12px;background:#0a0f1e;border-bottom:1px solid rgba(255,215,0,.15);font-size:10px;color:#94a3b8;display:flex;gap:4px;flex-wrap:wrap;align-items:center;position:sticky;top:32px;z-index:9}
|
|
.tag{display:inline-flex;align-items:center;gap:3px;background:rgba(255,215,0,.08);border:1px solid rgba(255,215,0,.2);border-radius:5px;padding:1px 5px;font-size:8px;color:#ffd700}
|
|
.tag img{width:14px;height:14px;border-radius:3px}
|
|
</style></head><body>
|
|
<div class="panel left">
|
|
<h2>🎨 AVATARS <span style="color:#4ade80;font-size:9px;background:rgba(74,222,128,.1);padding:2px 6px;border-radius:4px">● LIVE</span> <span class="cnt" id="avC"></span></h2>
|
|
<div id="AL"></div>
|
|
</div>
|
|
<div class="panel right">
|
|
<h2>🤖 30 AGENTS + 44 CRONS <span class="cnt" id="agC">0/30</span></h2>
|
|
<div id="bar" class="bar" style="display:none"></div>
|
|
<div class="agents" id="AG"></div>
|
|
</div>
|
|
<button class="copy" onclick="doCopy()">📋 Copier mes choix</button>
|
|
<script>
|
|
var S=[];
|
|
// === DICEBEAR ADVENTURER — 200 seeds ===
|
|
["joy","sunny","happy","bliss","glee","merry","bright","cheery","spark","charm",
|
|
"sweet","vivid","jolly","warm","glow","fresh","bloom","dream","hope","grace",
|
|
"luna","aria","felix","nora","maya","zara","leo","kai","mira","eden",
|
|
"sage","ruby","jade","ivy","nova","sky","finn","zoe","cleo","orion",
|
|
"iris","lila","theo","emma","adam","sara","omar","yuki","hana","rumi",
|
|
"amara","kenji","nia","soren","esme","rafael","indigo","sienna","milan","kira",
|
|
"dante","elara","jasper","lyra","rowan","stella","river","aurora","phoenix","atlas",
|
|
"pearl","ember","coral","hazel","wren","onyx","aspen","cedar","lake","rain",
|
|
"smile-1","smile-2","smile-3","smile-4","smile-5","smile-6","smile-7","smile-8","smile-9","smile-10",
|
|
"happy-1","happy-2","happy-3","happy-4","happy-5","happy-6","happy-7","happy-8","happy-9","happy-10",
|
|
"angel","blossom","breeze","candy","cookie","daisy","dolly","fawn","flower","honey",
|
|
"jewel","kiss","love","melody","muffin","peach","pixie","poppy","rose","sugar",
|
|
"sunshine","velvet","bambi","cherry","cloud","fairy","feather","frost","glitter","harmony",
|
|
"jasmine","lavender","lily","lotus","maple","misty","ocean","olive","orchid","petal",
|
|
"phoebe","plum","rainbow","serene","tulip","willow","winter","amber","breezy","bubbly",
|
|
"cheerful","cozy","cuddly","dainty","darling","delicate","fluffy","gentle","giggly","golden",
|
|
"graceful","heavenly","joyful","lovable","magical","peaceful","playful","precious","radiant","silky",
|
|
"snowy","sparkle","sunny-day","tender","twinkle","vibrant","whimsy","zingy","blissful","breezy-2",
|
|
"charming","dazzle","enchant","festive","gleeful","hearty","jubilant","kindly","lively","mirthful",
|
|
"nirvana","optimist","peppy","quirky","rapture","serene-2","tickled","upbeat","vivacious","wonderful"].forEach(function(n){
|
|
S.push({u:"https://api.dicebear.com/9.x/adventurer/svg?seed="+n,l:n,s:"👤 DiceBear Adventurer"});
|
|
});
|
|
// === ROBOHASH ROBOTS — 150 seeds ===
|
|
["alpha-prime","beta-core","gamma-shield","delta-brain","epsilon-heart","zeta-smile","eta-spark","theta-glow",
|
|
"iota-beam","kappa-nova","lambda-star","mu-pulse","nu-wave","xi-flash","omicron-blaze","pi-radiant",
|
|
"rho-bright","sigma-happy","tau-sunny","upsilon-warm","phi-joy","chi-gleam","psi-shine","omega-gold",
|
|
"cyber-ace","mech-hero","nano-buddy","quantum-pal","fusion-friend","spark-mate","blitz-champ","nexus-ally",
|
|
"vortex-guard","helix-scout","turbo-dash","nitro-boost","pixel-pop","chrome-grin","steel-wink","iron-cheer",
|
|
"copper-smile","silver-beam","gold-star","titanium-joy","cobalt-wave","ruby-flash","emerald-glow","sapphire-spark",
|
|
"diamond-shine","plasma-burst","neon-flare","laser-point","sonic-rush","photon-zip","electron-buzz","proton-hum",
|
|
"neutron-spin","quark-hop","gluon-skip","boson-leap","meson-dart","muon-fly","tachyon-zoom","graviton-soar",
|
|
"ai-helper","bot-friend","droid-pal","robo-mate","auto-buddy","smart-ally","clever-bot","wise-machine",
|
|
"gentle-mech","kind-android","loyal-cyborg","brave-automaton","swift-golem","keen-construct","apt-device","nimble-unit",
|
|
"azure-bot","crimson-mech","violet-droid","teal-android","amber-cyborg","jade-golem","coral-unit","ivory-bot",
|
|
"scarlet-mech","indigo-droid","magenta-ai","ochre-bot","periwinkle-mech","chartreuse-droid","mauve-android","taupe-cyborg",
|
|
"happy-bot-1","happy-bot-2","happy-bot-3","happy-bot-4","happy-bot-5","happy-bot-6","happy-bot-7","happy-bot-8",
|
|
"smile-robot-1","smile-robot-2","smile-robot-3","smile-robot-4","smile-robot-5","smile-robot-6","smile-robot-7","smile-robot-8",
|
|
"joy-mech-1","joy-mech-2","joy-mech-3","joy-mech-4","joy-mech-5","joy-mech-6","joy-mech-7","joy-mech-8",
|
|
"cute-bot-1","cute-bot-2","cute-bot-3","cute-bot-4","cute-bot-5","cute-bot-6","cute-bot-7","cute-bot-8",
|
|
"friendly-1","friendly-2","friendly-3","friendly-4","friendly-5","friendly-6","friendly-7","friendly-8",
|
|
"sunny-bot-1","sunny-bot-2","sunny-bot-3","sunny-bot-4","sunny-bot-5","sunny-bot-6","sunny-bot-7","sunny-bot-8",
|
|
"bright-mech-1","bright-mech-2","bright-mech-3","bright-mech-4"].forEach(function(n){
|
|
S.push({u:"https://robohash.org/"+n+"?set=set1&size=200x200",l:n,s:"🤖 RoboHash Robots"});
|
|
});
|
|
|
|
|
|
// === DICEBEAR BIG SMILE (souriant) ===
|
|
["grin-1","grin-2","grin-3","grin-4","grin-5","laugh-1","laugh-2","laugh-3","laugh-4","laugh-5",
|
|
"beam-1","beam-2","beam-3","beam-4","beam-5","cheer-1","cheer-2","cheer-3","cheer-4","cheer-5",
|
|
"smile-a","smile-b","smile-c","smile-d","smile-e","happy-a","happy-b","happy-c","happy-d","happy-e"].forEach(function(n){
|
|
S.push({u:"https://api.dicebear.com/9.x/big-smile/svg?seed="+n,l:n,s:"😄 Big Smile"});
|
|
});
|
|
// === DICEBEAR AVATAAARS ===
|
|
["alex","jordan","casey","morgan","taylor","quinn","riley","avery","blake","cameron",
|
|
"dakota","emery","frankie","harley","jamie","kendall","logan","peyton","reese","skyler",
|
|
"drew","sage-a","eden-a","river-a","phoenix-a","rowan-a","charlie","parker","hayden","finley"].forEach(function(n){
|
|
S.push({u:"https://api.dicebear.com/9.x/avataaars/svg?seed="+n,l:n,s:"🧑 Avataaars"});
|
|
});
|
|
// === DICEBEAR BOTTTS (robots design) ===
|
|
["alpha-b","beta-b","gamma-b","delta-b","epsilon-b","zeta-b","eta-b","theta-b","iota-b","kappa-b",
|
|
"servo-1","servo-2","servo-3","servo-4","servo-5","chip-1","chip-2","chip-3","chip-4","chip-5",
|
|
"circuit-1","circuit-2","circuit-3","circuit-4","circuit-5","wire-1","wire-2","wire-3","wire-4","wire-5"].forEach(function(n){
|
|
S.push({u:"https://api.dicebear.com/9.x/bottts/svg?seed="+n,l:n,s:"🔩 Bottts Robots"});
|
|
});
|
|
// === DICEBEAR LORELEI ===
|
|
["rose-l","lily-l","iris-l","daisy-l","violet-l","jasmine-l","orchid-l","lotus-l","ivy-l","fern-l",
|
|
"aurora-l","stella-l","luna-l","nova-l","celeste-l","dawn-l","dusk-l","ember-l","frost-l","rain-l"].forEach(function(n){
|
|
S.push({u:"https://api.dicebear.com/9.x/lorelei/svg?seed="+n,l:n,s:"🎨 Lorelei"});
|
|
});
|
|
// === DICEBEAR FUN EMOJI ===
|
|
["fun-a","fun-b","fun-c","fun-d","fun-e","fun-f","fun-g","fun-h","fun-i","fun-j",
|
|
"joy-e","happy-e1","smile-e1","grin-e","laugh-e","wink-e","cool-e","love-e","star-e","fire-e"].forEach(function(n){
|
|
S.push({u:"https://api.dicebear.com/9.x/fun-emoji/svg?seed="+n,l:n,s:"😜 Fun Emoji"});
|
|
});
|
|
// === DICEBEAR NOTIONISTS ===
|
|
["notion-1","notion-2","notion-3","notion-4","notion-5","notion-6","notion-7","notion-8","notion-9","notion-10",
|
|
"draw-1","draw-2","draw-3","draw-4","draw-5","draw-6","draw-7","draw-8","draw-9","draw-10"].forEach(function(n){
|
|
S.push({u:"https://api.dicebear.com/9.x/notionists/svg?seed="+n,l:n,s:"✏️ Notionists"});
|
|
});
|
|
// === DICEBEAR PIXEL ART ===
|
|
["pixel-a","pixel-b","pixel-c","pixel-d","pixel-e","pixel-f","pixel-g","pixel-h","pixel-i","pixel-j",
|
|
"retro-1","retro-2","retro-3","retro-4","retro-5","retro-6","retro-7","retro-8","retro-9","retro-10"].forEach(function(n){
|
|
S.push({u:"https://api.dicebear.com/9.x/pixel-art/svg?seed="+n,l:n,s:"👾 Pixel Art"});
|
|
});
|
|
// === ROBOHASH MONSTERS ===
|
|
["happy-m1","happy-m2","happy-m3","happy-m4","happy-m5","fun-m1","fun-m2","fun-m3","fun-m4","fun-m5",
|
|
"cute-m1","cute-m2","cute-m3","cute-m4","cute-m5","smile-m1","smile-m2","smile-m3","smile-m4","smile-m5"].forEach(function(n){
|
|
S.push({u:"https://robohash.org/"+n+"?set=set2&size=200x200",l:n,s:"👾 RoboHash Monsters"});
|
|
});
|
|
// === ROBOHASH HEADS ===
|
|
["head-a","head-b","head-c","head-d","head-e","head-f","head-g","head-h","head-i","head-j",
|
|
"cyber-h1","cyber-h2","cyber-h3","cyber-h4","cyber-h5","neon-h1","neon-h2","neon-h3","neon-h4","neon-h5"].forEach(function(n){
|
|
S.push({u:"https://robohash.org/"+n+"?set=set3&size=200x200",l:n,s:"🤖 RoboHash Heads"});
|
|
});
|
|
// === ROBOHASH CATS ===
|
|
["kitty-1","kitty-2","kitty-3","kitty-4","kitty-5","kitty-6","kitty-7","kitty-8","kitty-9","kitty-10",
|
|
"cat-a","cat-b","cat-c","cat-d","cat-e","cat-f","cat-g","cat-h","cat-i","cat-j"].forEach(function(n){
|
|
S.push({u:"https://robohash.org/"+n+"?set=set4&size=200x200",l:n,s:"🐱 RoboHash Cats"});
|
|
});
|
|
|
|
var AG=[
|
|
{n:"WEVIA Master",t:"STRATÉGIE",c:"#06b6d4",r:"Head of AI"},
|
|
{n:"Director",t:"DIRECTION",c:"#8b5cf6",r:"Cerveau autonome"},
|
|
{n:"Master Router",t:"DIRECTION",c:"#8b5cf6",r:"46 routes"},
|
|
{n:"Consensus",t:"DIRECTION",c:"#8b5cf6",r:"Vote multi-provider"},
|
|
{n:"Dispatcher",t:"DIRECTION",c:"#8b5cf6",r:"Moteur routes"},
|
|
{n:"MiroFish",t:"DIRECTION",c:"#8b5cf6",r:"WePredict"},
|
|
{n:"Blade",t:"DIRECTION",c:"#8b5cf6",r:"Desktop agent"},
|
|
{n:"DeerFlow",t:"DIRECTION",c:"#8b5cf6",r:"Deep research"},
|
|
{n:"AutoFix",t:"DIRECTION",c:"#8b5cf6",r:"Docker heal"},
|
|
{n:"Fiability",t:"DIRECTION",c:"#8b5cf6",r:"Santé URLs"},
|
|
{n:"DevOps",t:"TACTIQUE",c:"#f59e0b",r:"CI/CD"},
|
|
{n:"Ethica",t:"TACTIQUE",c:"#f59e0b",r:"Pharma 132K"},
|
|
{n:"Security",t:"TACTIQUE",c:"#f59e0b",r:"CVE+SSL"},
|
|
{n:"Monitor",t:"TACTIQUE",c:"#f59e0b",r:"Uptime 24/7"},
|
|
{n:"NonReg",t:"TACTIQUE",c:"#f59e0b",r:"151/153"},
|
|
{n:"WEVCODE",t:"TACTIQUE",c:"#f59e0b",r:"Code IA"},
|
|
{n:"L99 Pilot",t:"TACTIQUE",c:"#f59e0b",r:"Qualité"},
|
|
{n:"Scraper",t:"TACTIQUE",c:"#f59e0b",r:"DabaDoc"},
|
|
{n:"ArchScan",t:"TACTIQUE",c:"#f59e0b",r:"Topologie"},
|
|
{n:"CrowdSec",t:"TACTIQUE",c:"#f59e0b",r:"IDS/IPS"},
|
|
{n:"Fail2Ban",t:"TACTIQUE",c:"#f59e0b",r:"SSH protect"},
|
|
{n:"Registry",t:"TACTIQUE",c:"#f59e0b",r:"626 pages"},
|
|
{n:"Ollama",t:"EXÉCUTION",c:"#ef4444",r:"LLM LOCAL"},
|
|
{n:"Groq",t:"EXÉCUTION",c:"#ef4444",r:"<200ms"},
|
|
{n:"Cerebras",t:"EXÉCUTION",c:"#ef4444",r:"Qwen-3"},
|
|
{n:"SambaNova",t:"EXÉCUTION",c:"#ef4444",r:"Llama"},
|
|
{n:"Paperclip",t:"EXÉCUTION",c:"#ef4444",r:"669 agents"},
|
|
{n:"Sentinel",t:"EXÉCUTION",c:"#ef4444",r:"Relais S95"},
|
|
{n:"Docker",t:"EXÉCUTION",c:"#ef4444",r:"16 containers"},
|
|
{n:"PMTA",t:"EXÉCUTION",c:"#ef4444",r:"Port 25 sacré"},
|
|
{n:"MiroFish Start",t:"CRONS",c:"#4ade80",r:"*/10 · mirofish-start.sh"},
|
|
{n:"Paperclip Start",t:"CRONS",c:"#4ade80",r:"*/10 · paperclip-start.sh"},
|
|
{n:"L99 Alive",t:"CRONS",c:"#4ade80",r:"*/10 · l99-alive.py"},
|
|
{n:"State Updater",t:"CRONS",c:"#4ade80",r:"*/10 · l99-state-updater.py"},
|
|
{n:"DeerFlow Start",t:"CRONS",c:"#4ade80",r:"*/15 · deerflow-start.sh"},
|
|
{n:"Director Cron",t:"CRONS",c:"#4ade80",r:"*/15 · wevia-director-cron.sh"},
|
|
{n:"L99 Pipeline",t:"CRONS",c:"#4ade80",r:"*/15 · l99-pipeline.py"},
|
|
{n:"Blade Orchestrator",t:"CRONS",c:"#4ade80",r:"*/30 · blade-orchestrator.sh"},
|
|
{n:"NonReg Monitor",t:"CRONS",c:"#4ade80",r:"*/30 · director-nonreg-monitor.sh"},
|
|
{n:"RAG Ingest",t:"CRONS",c:"#4ade80",r:"*/30 · wevia-rag-ingest.sh"},
|
|
{n:"Infra Guardian",t:"CRONS",c:"#4ade80",r:"*/5 · infra-guardian.sh"},
|
|
{n:"Port Protection",t:"CRONS",c:"#4ade80",r:"*/5 · port-protection.php"},
|
|
{n:"WEVIA Autonomous",t:"CRONS",c:"#4ade80",r:"*/5 · wevia-master-autonomous.php"},
|
|
{n:"Blade Watchdog",t:"CRONS",c:"#4ade80",r:"*/5 · blade-watchdog.php"},
|
|
{n:"Fiability Engine",t:"CRONS",c:"#4ade80",r:"hourly · wevia-fiability-engine.php"},
|
|
{n:"GODMODE v2",t:"CRONS",c:"#4ade80",r:"2h · run-godmode-v2.sh"},
|
|
{n:"UX Agent",t:"CRONS",c:"#4ade80",r:"2h · ux-agent-cron.sh"},
|
|
{n:"L99 Analyze",t:"CRONS",c:"#4ade80",r:"2h · l99-analyze-all.py"},
|
|
{n:"AutoLearn",t:"CRONS",c:"#4ade80",r:"2h · wevia-autolearn.py"},
|
|
{n:"Auto Delist",t:"CRONS",c:"#4ade80",r:"4h · auto-delist.sh"},
|
|
{n:"Functional Test",t:"CRONS",c:"#4ade80",r:"4h · l99-functional-test.py"},
|
|
{n:"Disk Monitor",t:"CRONS",c:"#4ade80",r:"6h · disk-monitor.sh"},
|
|
{n:"Enterprise Sync",t:"CRONS",c:"#4ade80",r:"6h · enterprise-model-sync.py"},
|
|
{n:"L99 Quality",t:"CRONS",c:"#4ade80",r:"6h · l99-quality.py"},
|
|
{n:"Ollama Check",t:"CRONS",c:"#4ade80",r:"6h · ollama health"},
|
|
{n:"Auth Scanner",t:"CRONS",c:"#4ade80",r:"6h · auth-sovereign-scanner.sh"},
|
|
{n:"B2B Cron",t:"CRONS",c:"#4ade80",r:"4x/day · weval-b2b-cron.sh"},
|
|
{n:"NonReg 18h",t:"CRONS",c:"#4ade80",r:"daily · nonreg-master.py"},
|
|
{n:"Qdrant Backup",t:"CRONS",c:"#4ade80",r:"3h daily · qdrant-backup.sh"},
|
|
{n:"DeerFlow Cleanup",t:"CRONS",c:"#4ade80",r:"3h daily · deer-flow cleanup"},
|
|
{n:"Baselines Weekly",t:"CRONS",c:"#4ade80",r:"weekly · baselines.js"},
|
|
{n:"Claude Sync",t:"CRONS",c:"#4ade80",r:"4h daily · cron_claude_sync.sh"},
|
|
{n:"Certbot Renew",t:"CRONS",c:"#4ade80",r:"weekly · certbot renew"},
|
|
{n:"Ethica Auto",t:"CRONS",c:"#4ade80",r:"5h daily · ethica-autonomous.sh"},
|
|
{n:"AI Benchmark",t:"CRONS",c:"#4ade80",r:"5h daily · ai-benchmark-daily.sh"},
|
|
{n:"NonReg 6h",t:"CRONS",c:"#4ade80",r:"6h daily · nonreg-master.py"},
|
|
{n:"WEVIA Life",t:"CRONS",c:"#4ade80",r:"7h daily · wevialife-cron.sh"},
|
|
{n:"Daily Brief",t:"CRONS",c:"#4ade80",r:"7h daily · weval-daily-brief.py"},
|
|
{n:"Health Check",t:"CRONS",c:"#4ade80",r:"8h daily · weval-health-check.sh"},
|
|
{n:"OSS Trending",t:"CRONS",c:"#4ade80",r:"4:10 daily · oss-trending-gen.py"},
|
|
{n:"AI Gap Discovery",t:"CRONS",c:"#4ade80",r:"5:30 daily · ai-gap-discovery.py"},
|
|
{n:"AI Improvement",t:"CRONS",c:"#4ade80",r:"6:30 daily · ai-improvement-engine.py"},
|
|
{n:"Embed Service",t:"CRONS",c:"#4ade80",r:"@reboot · wevia-embed-service.py"},
|
|
{n:"State Update 3h",t:"CRONS",c:"#4ade80",r:"3h daily · l99-state-updater.py"},
|
|
|
|
];
|
|
var P={},sel=null;
|
|
function rAv(){var h="",by={},used={};for(var k in P)used[P[k]]=1;S.forEach(function(s,i){if(!by[s.s])by[s.s]=[];by[s.s].push({s:s,i:i})});var t=0;for(var src in by){t+=by[src].length;h+='<div class="src">'+src+' ('+by[src].length+')</div><div class="avatars">';by[src].forEach(function(it){var u=used[it.s.u],se=sel&&sel.u===it.s.u;h+='<div class="av'+(u?' picked':'')+(se?' sel':'')+'" onclick="selA('+it.i+')"><img src="'+it.s.u+'" loading="lazy" onerror="this.parentElement.style.display=\'none\'"><span>'+it.s.l+'</span></div>';});h+='</div>';}document.getElementById("AL").innerHTML=h;document.getElementById("avC").textContent=t+" avatars";}
|
|
function rAg(){var h="",lt="",n=Object.keys(P).length;AG.forEach(function(a){if(a.t!==lt){lt=a.t;h+='<div class="tl" style="color:'+a.c+'">'+a.t+'</div>';}var p=P[a.n];h+='<div class="ag" onclick="asgn(\''+a.n.replace(/'/g,"\\'")+'\')">';h+='<div class="slot'+(p?' f':'')+'">'+( p?'<img src="'+p+'">':'?')+'</div>';h+='<div><div class="nm" style="color:'+a.c+'">'+a.n+'</div><div class="rl">'+a.r+'</div></div>';if(p)h+='<span class="pk">✓</span><span class="x" onclick="event.stopPropagation();clr(\''+a.n.replace(/'/g,"\\'")+'\')">✕</span>';h+='</div>';});document.getElementById("AG").innerHTML=h;document.getElementById("agC").textContent=n+"/30";var b=document.getElementById("bar");if(n>0){b.style.display="flex";var bh="<b style='color:#ffd700'>"+n+"</b> ";for(var k in P)bh+='<span class="tag"><img src="'+P[k]+'">'+k+'</span> ';b.innerHTML=bh;}else b.style.display="none";}
|
|
function selA(i){sel=S[i];rAv();}
|
|
function asgn(n){if(sel){P[n]=sel.u;sel=null;rAv();rAg();saveToServer();}}
|
|
function clr(n){delete P[n];rAv();rAg();saveToServer();}
|
|
function doCopy(){var t="";for(var k in P)t+=k+": "+P[k]+"\n";navigator.clipboard&&navigator.clipboard.writeText(t);alert(Object.keys(P).length+" choix!\n\n"+t);}
|
|
|
|
function saveToServer(){
|
|
fetch('/api/agent-avatars.php',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify(P)}).then(function(r){return r.json()}).then(function(d){
|
|
var btn=document.querySelector('.copy');btn.textContent='✅ Sauvegardé ('+Object.keys(P).length+')';setTimeout(function(){btn.textContent='📋 Copier mes choix'},2000);
|
|
}).catch(function(e){console.log('save error',e)});}
|
|
function loadFromServer(){fetch('/api/agent-avatars.php').then(function(r){return r.json()}).then(function(d){if(d&&typeof d==='object'){P=d;rAv();rAg();}}).catch(function(){});}
|
|
|
|
loadFromServer();
|
|
rAv();rAg();
|
|
</script></body></html>
|