Files
XIP/maquettes/chat/v3.svg
Kerboul cfa2eadec9
Some checks failed
Deploy XIP / deploy (push) Failing after 37s
feat: conformite enonce - explorer, favoris, stats perso, tests, slots
Fonctionnel
- Backend messages : GET /api/messages/:id (detail) + recherche (q),
  pagination par curseur (before/limit) avec enveloppe { items, nextCursor,
  hasMore } ; le flux temps reel garde l'ancien format quand aucun parametre.
- Explorer (/explorer) : catalogue distant, recherche debouncee + annulable
  (AbortController), filtre, defilement infini, etat garde (keep-alive).
- Details par id : /message/:id et /shop/p/:id (consomment route.params).
- Favoris (/favoris) : liste perso persistee en localStorage, notation
  (note/rating/statut) via modale, refletee partout (bouton favori).
- Mes stats (/mes-stats) : agregats derives des favoris (note moyenne, top
  pays/auteurs, statuts), auto-mis a jour, route gardee si liste vide.
- Routeur : pages secondaires en lazy-load + repli, garde beforeEnter.

Technique
- Slots : PrefSection (slot defaut + slot nomme) enveloppe les 5 sections
  "Mes Persos" ; Modal (Teleport + slots).
- v-model custom : SearchBox (defineModel + debounce).
- Directive custom : v-click-outside.
- Tests Vitest : 25 tests (etat, fonctions, composants), ~86% du code metier.
- Retrait d'Ionic (inutilise). Script typecheck backend ; tsconfig @types/bun.
- Correctif type : garde stockLimit nullable dans l'achat (catalog.ts).
- README complet (URL, stack, run, tests, secrets, deploiement, mention IA).
2026-05-31 23:59:34 +02:00

240 lines
16 KiB
XML

<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1280 720" width="1280" height="720">
<defs>
<style>
.mono { font-family: 'Courier New', Courier, monospace; }
.sans { font-family: Arial, Helvetica, sans-serif; }
.msg { font-family: Arial, Helvetica, sans-serif; font-size: 13px; fill: #c0c0c0; }
.ts { font-family: 'Courier New', Courier, monospace; font-size: 10px; fill: #303030; }
</style>
<!-- Filtres de glow colorés -->
<filter id="blur-cyan" x="-40%" y="-40%" width="180%" height="180%">
<feGaussianBlur stdDeviation="4"/>
</filter>
<filter id="blur-magenta" x="-40%" y="-40%" width="180%" height="180%">
<feGaussianBlur stdDeviation="4"/>
</filter>
<filter id="blur-green" x="-40%" y="-40%" width="180%" height="180%">
<feGaussianBlur stdDeviation="4"/>
</filter>
<filter id="blur-orange" x="-40%" y="-40%" width="180%" height="180%">
<feGaussianBlur stdDeviation="3"/>
</filter>
<filter id="blur-title" x="-20%" y="-20%" width="140%" height="140%">
<feGaussianBlur stdDeviation="6"/>
</filter>
</defs>
<!-- ══ FOND ══ -->
<rect width="1280" height="720" fill="#080808"/>
<!-- Légère teinte violacée en fond -->
<rect width="1280" height="720" fill="url(#bg-grad)" opacity="0.4"/>
<defs>
<linearGradient id="bg-grad" x1="0" y1="0" x2="1" y2="1">
<stop offset="0%" stop-color="#0a0a14"/>
<stop offset="100%" stop-color="#0a080e"/>
</linearGradient>
</defs>
<!-- ══════════════════════════════
BANDE PUB GAUCHE
══════════════════════════════ -->
<rect x="0" y="0" width="130" height="720" fill="#0c0c10" stroke="#1a1a22" stroke-width="1"/>
<text x="65" y="14" fill="#2a2a38" text-anchor="middle" class="sans" font-size="8">PUBLICITÉ</text>
<!-- Ad 1 -->
<rect x="4" y="20" width="122" height="188" fill="#121218" stroke="#1e1e2a" rx="3"/>
<rect x="4" y="20" width="122" height="52" fill="#161620" rx="3"/>
<text x="65" y="42" fill="#4444aa" text-anchor="middle" class="sans" font-size="13" font-weight="bold" filter="url(#blur-cyan)" opacity="0.5">NOVA</text>
<text x="65" y="42" fill="#5555cc" text-anchor="middle" class="sans" font-size="13" font-weight="bold">NOVA</text>
<text x="65" y="59" fill="#383870" text-anchor="middle" class="sans" font-size="9">STORE 2026</text>
<rect x="14" y="80" width="102" height="62" fill="#0e0e16" rx="2"/>
<text x="65" y="115" fill="#3a3a88" text-anchor="middle" class="sans" font-size="24">&#128722;</text>
<text x="65" y="163" fill="#3a3a88" text-anchor="middle" class="sans" font-size="10">DÉCOUVRIR</text>
<text x="65" y="196" fill="#282840" text-anchor="middle" class="sans" font-size="8">nova-store.io</text>
<!-- Ad 2 -->
<rect x="4" y="216" width="122" height="188" fill="#121218" stroke="#1e1e2a" rx="3"/>
<rect x="4" y="216" width="122" height="52" fill="#101614" rx="3"/>
<text x="65" y="238" fill="#225533" text-anchor="middle" class="sans" font-size="11" font-weight="bold" filter="url(#blur-green)" opacity="0.5">APEX GEAR</text>
<text x="65" y="238" fill="#33aa55" text-anchor="middle" class="sans" font-size="11" font-weight="bold">APEX GEAR</text>
<text x="65" y="254" fill="#225533" text-anchor="middle" class="sans" font-size="9">Gaming Setup</text>
<rect x="14" y="276" width="102" height="62" fill="#0e160e" rx="2"/>
<text x="65" y="311" fill="#33aa55" text-anchor="middle" class="sans" font-size="24">&#127918;</text>
<text x="65" y="358" fill="#33aa55" text-anchor="middle" class="sans" font-size="10">ACHETER</text>
<text x="65" y="392" fill="#225533" text-anchor="middle" class="sans" font-size="8">apex-gear.com</text>
<!-- Ad 3 -->
<rect x="4" y="412" width="122" height="188" fill="#121218" stroke="#1e1e2a" rx="3"/>
<rect x="4" y="412" width="122" height="52" fill="#16101a" rx="3"/>
<text x="65" y="434" fill="#6622aa" text-anchor="middle" class="sans" font-size="11" font-weight="bold" filter="url(#blur-magenta)" opacity="0.5">SHIELDVPN</text>
<text x="65" y="434" fill="#9944dd" text-anchor="middle" class="sans" font-size="11" font-weight="bold">SHIELDVPN</text>
<text x="65" y="450" fill="#552288" text-anchor="middle" class="sans" font-size="9">Sécurité totale</text>
<rect x="14" y="472" width="102" height="62" fill="#110e16" rx="2"/>
<text x="65" y="507" fill="#9944dd" text-anchor="middle" class="sans" font-size="24">&#128274;</text>
<text x="65" y="554" fill="#9944dd" text-anchor="middle" class="sans" font-size="10">ESSAI GRATUIT</text>
<text x="65" y="588" fill="#441877" text-anchor="middle" class="sans" font-size="8">shieldvpn.net</text>
<!-- ══════════════════════════════
TOGGLE MENU DROIT
══════════════════════════════ -->
<rect x="1245" y="0" width="35" height="720" fill="#0c0c10" stroke="#1a1a22" stroke-width="1"/>
<line x1="1253" y1="18" x2="1272" y2="18" stroke="#3a3a55" stroke-width="2" stroke-linecap="round"/>
<line x1="1253" y1="26" x2="1272" y2="26" stroke="#3a3a55" stroke-width="2" stroke-linecap="round"/>
<line x1="1253" y1="34" x2="1272" y2="34" stroke="#3a3a55" stroke-width="2" stroke-linecap="round"/>
<!-- ══════════════════════════════
ZONE CHAT
══════════════════════════════ -->
<rect x="130" y="0" width="1115" height="720" fill="#090910"/>
<!-- ── EN-TÊTE ── -->
<rect x="130" y="0" width="1115" height="52" fill="#0e0e16" stroke="#1a1a26" stroke-width="1"/>
<!-- Titre avec glow -->
<text x="158" y="26" fill="#00ccff" class="sans" font-size="18" font-weight="bold" filter="url(#blur-cyan)" opacity="0.7">XIP</text>
<text x="158" y="26" fill="#00eeff" class="sans" font-size="18" font-weight="bold">XIP</text>
<text x="198" y="22" fill="#aaaacc" class="sans" font-size="14" font-weight="bold">Chat</text>
<circle cx="214" cy="37" r="5" fill="#002200"/>
<circle cx="214" cy="37" r="3" fill="#00ff44" filter="url(#blur-green)" opacity="0.9"/>
<circle cx="214" cy="37" r="2" fill="#00ff88"/>
<text x="226" y="42" fill="#33ff66" class="sans" font-size="11">312 connectés</text>
<rect x="1050" y="14" width="95" height="24" fill="#131320" stroke="#222233" rx="12"/>
<text x="1097" y="30" fill="#5555aa" text-anchor="middle" class="sans" font-size="10"># général</text>
<line x1="130" y1="52" x2="1245" y2="52" stroke="#1a1a2a" stroke-width="1"/>
<!-- ── MESSAGES ── -->
<!-- 1: 192.168.1.45 (gris normal) -->
<text x="155" y="76" fill="#666688" class="mono" font-size="12" font-weight="bold">192.168.1.45</text>
<text x="277" y="76" class="ts">17:42</text>
<text x="155" y="93" class="msg">Salut tout le monde !</text>
<line x1="155" y1="102" x2="1230" y2="102" stroke="#141420" stroke-width="1"/>
<!-- 2: 172.16.254.1 (CYAN) -->
<text x="155" y="119" fill="#00aacc" class="mono" font-size="12" font-weight="bold" filter="url(#blur-cyan)" opacity="0.7">172.16.254.1</text>
<text x="155" y="119" fill="#00ddff" class="mono" font-size="12" font-weight="bold">172.16.254.1</text>
<text x="271" y="119" class="ts">17:43</text>
<text x="155" y="136" class="msg">Vous avez vu les nouvelles du shop ce soir ?</text>
<line x1="155" y1="145" x2="1230" y2="145" stroke="#141420" stroke-width="1"/>
<!-- 3: 10.0.0.187 (gris normal) -->
<text x="155" y="162" fill="#666688" class="mono" font-size="12" font-weight="bold">10.0.0.187</text>
<text x="253" y="162" class="ts">17:43</text>
<text x="155" y="179" class="msg">Ouais j'ai check, les prix sont vraiment corrects</text>
<line x1="155" y1="188" x2="1230" y2="188" stroke="#141420" stroke-width="1"/>
<!-- 4: 203.0.113.42 (ORANGE) -->
<text x="155" y="205" fill="#cc5500" class="mono" font-size="12" font-weight="bold" filter="url(#blur-orange)" opacity="0.8">203.0.113.42</text>
<text x="155" y="205" fill="#ff8844" class="mono" font-size="12" font-weight="bold">203.0.113.42</text>
<text x="275" y="205" class="ts">17:44</text>
<text x="155" y="222" class="msg">lol ça spam trop ce soir</text>
<line x1="155" y1="231" x2="1230" y2="231" stroke="#141420" stroke-width="1"/>
<!-- 5: 10.10.10.99 (MAGENTA) -->
<text x="155" y="248" fill="#aa0088" class="mono" font-size="12" font-weight="bold" filter="url(#blur-magenta)" opacity="0.8">10.10.10.99</text>
<text x="155" y="248" fill="#ff00cc" class="mono" font-size="12" font-weight="bold">10.10.10.99</text>
<text x="255" y="248" class="ts">17:44</text>
<text x="155" y="265" class="msg">@203.0.113.42 t'as raison mais c'est le fun quand même</text>
<line x1="155" y1="274" x2="1230" y2="274" stroke="#141420" stroke-width="1"/>
<!-- 6: 192.168.1.1 (gris) -->
<text x="155" y="291" fill="#666688" class="mono" font-size="12" font-weight="bold">192.168.1.1</text>
<text x="252" y="291" class="ts">17:45</text>
<text x="155" y="308" class="msg">Le chat est bien actif ce soir, j'aime ça</text>
<line x1="155" y1="317" x2="1230" y2="317" stroke="#141420" stroke-width="1"/>
<!-- 7: 172.31.0.5 (VERT) -->
<text x="155" y="334" fill="#008844" class="mono" font-size="12" font-weight="bold" filter="url(#blur-green)" opacity="0.8">172.31.0.5</text>
<text x="155" y="334" fill="#00ee77" class="mono" font-size="12" font-weight="bold">172.31.0.5</text>
<text x="247" y="334" class="ts">17:45</text>
<text x="155" y="351" class="msg">Le drop de demain va être chaud 🔥 j'ai les infos du shop</text>
<line x1="155" y1="360" x2="1230" y2="360" stroke="#141420" stroke-width="1"/>
<!-- 8: 10.0.0.253 (gris) -->
<text x="155" y="377" fill="#666688" class="mono" font-size="12" font-weight="bold">10.0.0.253</text>
<text x="252" y="377" class="ts">17:46</text>
<text x="155" y="394" class="msg">Quelqu'un sait configurer le stream ?</text>
<line x1="155" y1="403" x2="1230" y2="403" stroke="#141420" stroke-width="1"/>
<!-- 9: 192.168.1.45 (gris) -->
<text x="155" y="420" fill="#666688" class="mono" font-size="12" font-weight="bold">192.168.1.45</text>
<text x="277" y="420" class="ts">17:46</text>
<text x="155" y="437" class="msg">Vérife dans Paramètres &#x2192; onglet Diffusion</text>
<line x1="155" y1="446" x2="1230" y2="446" stroke="#141420" stroke-width="1"/>
<!-- 10: 172.16.254.1 (CYAN again) -->
<text x="155" y="463" fill="#00aacc" class="mono" font-size="12" font-weight="bold" filter="url(#blur-cyan)" opacity="0.6">172.16.254.1</text>
<text x="155" y="463" fill="#00ddff" class="mono" font-size="12" font-weight="bold">172.16.254.1</text>
<text x="271" y="463" class="ts">17:47</text>
<text x="155" y="480" class="msg">Sérieux ? T'as accès aux infos du shop ?</text>
<line x1="155" y1="489" x2="1230" y2="489" stroke="#141420" stroke-width="1"/>
<!-- 11: 10.10.10.99 (MAGENTA) -->
<text x="155" y="506" fill="#aa0088" class="mono" font-size="12" font-weight="bold" filter="url(#blur-magenta)" opacity="0.7">10.10.10.99</text>
<text x="155" y="506" fill="#ff00cc" class="mono" font-size="12" font-weight="bold">10.10.10.99</text>
<text x="255" y="506" class="ts">17:47</text>
<text x="155" y="523" class="msg">Pas accès direct mais j'ai des sources 😏</text>
<line x1="155" y1="532" x2="1230" y2="532" stroke="#141420" stroke-width="1"/>
<!-- 12: 203.0.113.42 (ORANGE) -->
<text x="155" y="549" fill="#cc5500" class="mono" font-size="12" font-weight="bold" filter="url(#blur-orange)" opacity="0.7">203.0.113.42</text>
<text x="155" y="549" fill="#ff8844" class="mono" font-size="12" font-weight="bold">203.0.113.42</text>
<text x="275" y="549" class="ts">17:48</text>
<text x="155" y="566" class="msg">Quel canal pour les annonces du shop ?</text>
<!-- ══ PUB GAMBLING NÉON (droite, lumineux) ══ -->
<defs>
<filter id="glow-rb" x="-40%" y="-40%" width="180%" height="180%">
<feGaussianBlur stdDeviation="5"/>
</filter>
<filter id="glow-gd" x="-40%" y="-40%" width="180%" height="180%">
<feGaussianBlur stdDeviation="5"/>
</filter>
</defs>
<!-- Fond + bordure néon rouge -->
<rect x="966" y="162" width="248" height="258" fill="#100400"/>
<rect x="966" y="162" width="248" height="258" fill="none" stroke="#ff2200" stroke-width="3" rx="6" filter="url(#glow-rb)" opacity="0.9"/>
<rect x="966" y="162" width="248" height="258" fill="none" stroke="#ff4422" stroke-width="1.5" rx="6"/>
<!-- Header rouge -->
<rect x="966" y="162" width="248" height="54" fill="#1a0400" rx="6"/>
<text x="1090" y="186" fill="#aa2200" text-anchor="middle" class="sans" font-size="15" font-weight="bold" filter="url(#glow-rb)" opacity="0.9">&#9824; CASINO LUCKY &#9824;</text>
<text x="1090" y="186" fill="#ff5533" text-anchor="middle" class="sans" font-size="15" font-weight="bold">&#9824; CASINO LUCKY &#9824;</text>
<text x="1090" y="204" fill="#882200" text-anchor="middle" class="sans" font-size="9" letter-spacing="2">OFFRE EXCLUSIVE</text>
<line x1="966" y1="216" x2="1214" y2="216" stroke="#440000" stroke-width="1"/>
<!-- +200% or néon -->
<text x="1090" y="262" fill="#996600" text-anchor="middle" class="sans" font-size="32" font-weight="bold" filter="url(#glow-gd)" opacity="0.9">+200%</text>
<text x="1090" y="262" fill="#ffdd00" text-anchor="middle" class="sans" font-size="32" font-weight="bold">+200%</text>
<text x="1090" y="282" fill="#cc6600" text-anchor="middle" class="sans" font-size="11">sur votre 1er dépôt &#x2022; 500&#x20AC; max</text>
<!-- 7 7 7 néon -->
<text x="980" y="336" fill="#ff8800" class="sans" font-size="26" filter="url(#glow-rb)" opacity="0.6">&#9830;</text>
<text x="980" y="336" fill="#ffaa44" class="sans" font-size="26">&#9830;</text>
<text x="1030" y="338" fill="#ffdd00" class="sans" font-size="30" font-weight="bold" filter="url(#glow-gd)" opacity="0.6">7</text>
<text x="1030" y="338" fill="#ffffff" class="sans" font-size="30" font-weight="bold">7</text>
<text x="1070" y="338" fill="#ffdd00" class="sans" font-size="30" font-weight="bold" filter="url(#glow-gd)" opacity="0.6">7</text>
<text x="1070" y="338" fill="#ffffff" class="sans" font-size="30" font-weight="bold">7</text>
<text x="1110" y="338" fill="#ffdd00" class="sans" font-size="30" font-weight="bold" filter="url(#glow-gd)" opacity="0.6">7</text>
<text x="1110" y="338" fill="#ffffff" class="sans" font-size="30" font-weight="bold">7</text>
<text x="1156" y="336" fill="#ff8800" class="sans" font-size="26" filter="url(#glow-rb)" opacity="0.6">&#9824;</text>
<text x="1156" y="336" fill="#ffaa44" class="sans" font-size="26">&#9824;</text>
<!-- CTA néon rouge -->
<rect x="976" y="349" width="228" height="38" fill="#220000" rx="19"/>
<rect x="976" y="349" width="228" height="38" fill="none" stroke="#ff2200" stroke-width="1.5" rx="19" filter="url(#glow-rb)" opacity="0.8"/>
<text x="1090" y="373" fill="#aa2200" text-anchor="middle" class="sans" font-size="13" font-weight="bold" filter="url(#glow-rb)" opacity="0.7">JOUER MAINTENANT &#x2192;</text>
<text x="1090" y="373" fill="#ff4422" text-anchor="middle" class="sans" font-size="13" font-weight="bold">JOUER MAINTENANT &#x2192;</text>
<!-- Disclaimer -->
<text x="1090" y="411" fill="#440000" text-anchor="middle" class="sans" font-size="7">18+ &#x2022; Jeu responsable &#x2022; casino-lucky.bet</text>
<!-- SCROLLBAR -->
<rect x="1229" y="52" width="8" height="598" fill="#080810" stroke="#141420" stroke-width="1"/>
<rect x="1230" y="390" width="6" height="140" fill="#252535" rx="3"/>
<!-- ── ZONE DE SAISIE ── -->
<rect x="130" y="650" width="1115" height="70" fill="#0e0e16" stroke="#1a1a26" stroke-width="1"/>
<rect x="178" y="661" width="927" height="47" fill="#141420" stroke="#222234" stroke-width="1" rx="23"/>
<text x="228" y="690" fill="#2a2a44" class="sans" font-size="13">Entrez un message...</text>
<!-- Bouton envoi avec glow cyan -->
<circle cx="1151" cy="684" r="21" fill="#00223a" stroke="#004466" stroke-width="1"/>
<circle cx="1151" cy="684" r="21" fill="#004488" filter="url(#blur-cyan)" opacity="0.4"/>
<polygon points="1143,679 1158,684 1143,689 1147,684" fill="#00ddff"/>
</svg>