/* La Tournée — site : compte (Supabase) + abonnement (Stripe). Contenu Premium servi par API. */
const { useState, useEffect, useRef } = React;
/* ============================================================
PARDY — jeu de soirée
3 niveaux (Soft / Hot / Extrême) sur Action ou Vérité, Je n'ai jamais,
Tu préfères. PMU & Imposteur restent en version unique.
Hot + Extrême = contenu premium (paywall).
============================================================ */
const C = {
bg: "#0A0418", bg2: "#140A24", surface: "#1C0F30", surface2: "#271542",
line: "#34204C", text: "#F5EFE8", muted: "#A99CBC",
pink: "#FF3D8E", green: "#2FD673", cyan: "#37C3FF", purple: "#9A5BFF", amber: "#FF9F1C",
hot: "#FF2E83", extreme: "#E11D48",
};
const DISPLAY = "'Syne', sans-serif";
const BODY = "'Outfit', sans-serif";
let LANG = "fr";
const t = (fr, en) => (LANG === "en" ? en : fr);
const GAME_I18N = {
av: { name: "Truth or Dare", tag: "The classic that escalates" },
tp: { name: "Would You Rather", tag: "The dilemma that divides" },
jnj: { name: "Never Have I Ever", tag: "Confessions come out" },
qp: { name: "Who's Most Likely To", tag: "Most pointed-at takes a penalty" },
pmu: { name: "Horse Race", tag: "The PMU race" },
riv: { name: "The River", tag: "Higher, lower, red or black" },
imp: { name: "Impostor", tag: "A liar among you" },
};
const CONTACT_EMAIL = "support.pardy@gmail.com";
const mailto = (subject, body) => { window.location.href = "mailto:" + CONTACT_EMAIL + "?subject=" + encodeURIComponent(subject) + "&body=" + encodeURIComponent(body); };
const LEVELS = {
soft: { label: "Soft", badge: null, color: C.text },
hot: { label: "Hot", badge: "HOT", color: C.hot },
extreme: { label: "Extrême", badge: "EXTRÊME", color: C.extreme },
};
// jeux concernés par les niveaux
const LEVELLED = ["av", "jnj", "tp", "qp"];
const GAMES = [
{ id: "av", name: "Action ou Vérité", tag: "Le classique qui dérape", emoji: "🎯", color: C.pink, levelled: true, img: "assets/images/jeu-action-ou-verite.png" },
{ id: "tp", name: "Tu préfères", tag: "Le dilemme qui divise", emoji: "⚖️", color: C.amber, levelled: true, img: "assets/images/jeu-tu-preferes.png" },
{ id: "jnj", name: "Je n'ai jamais", tag: "Les confessions tombent", emoji: "🙊", color: C.cyan, levelled: true, img: "assets/images/jeu-je-nai-jamais.png" },
{ id: "qp", name: "Qui pourrait", tag: "Le plus désigné prend une pénalité", emoji: "👉", color: "#FF6B4A", levelled: true, img: "assets/images/jeu-qui-pourrait.png" },
{ id: "pmu", name: "PMU", tag: "La course de chevaux", emoji: "🐎", color: C.green, levelled: false, img: "assets/images/jeu-pmu.png" },
{ id: "riv", name: "Rivière", tag: "Plus, moins, rouge ou noir", emoji: "🌊", color: "#17C3B2", levelled: false, img: "assets/images/jeu-riviere.png" },
{ id: "imp", name: "Imposteur", tag: "Un menteur parmi vous", emoji: "🕵️", color: C.purple, levelled: false, img: "assets/images/jeu-imposteur.png" },
];
function Ic({ name, size = 20, color = "currentColor", sw = 1.8, fill = "none", style }) {
const P = {
flame: ,
burst: ,
lock: ,
bolt: ,
chat: ,
globe: ,
gem: ,
restore: ,
star: ,
bulb: ,
mail: ,
user: ,
};
return ;
}
/* ====================== CONTENUS ====================== */
/* ---------- ACTION OU VÉRITÉ ---------- */
const AV = {
soft: {
verites: [
"Quelle est la dernière chose un peu honteuse que tu as faite ?",
"Quel est le plus gros mensonge que tu as raconté à tes parents ?",
"Quelle appli tu caches en premier quand on regarde ton téléphone ?",
"Quel est ton talent le plus inutile ?",
"Quelle est la chose la plus chère achetée sur un coup de tête ?",
"Quel surnom détestes-tu qu'on te donne ?",
"Quelle est ta plus grosse honte au lycée ?",
"Quel est le dernier truc bizarre que tu as cherché sur internet ?",
"Combien de temps tu tiens sans ton téléphone, vraiment ?",
"Quelle est la rumeur la plus folle qui a couru sur toi ?",
"Quel est ton pire souvenir de soirée ?",
"Quelle habitude bizarre tu as quand tu es seul ?",
"Quel est le plus gros bobard dit pour impressionner quelqu'un ?",
"Quelle est la chose la plus enfantine que tu fais encore ?",
"Quel est ton plaisir coupable musical ?",
"As-tu déjà fait semblant d'être malade, et pourquoi ?",
"C'est quoi la dernière fois où tu as pleuré, et pourquoi ?",
"Quel est le truc le plus radin que tu aies fait ?",
"Quelle est ta plus grande peur irrationnelle ?",
"Quel compliment t'a le plus marqué dans ta vie ?",
"Qui est la dernière personne que tu as stalkée en ligne ?",
"Quel est ton pire rendez-vous galant ?",
"Quelle est la chose la plus folle sur ta liste de rêves ?",
"Quel mensonge tu répètes le plus souvent ?",
"Quelle est la dernière fois où tu as eu honte en public ?",
"Si tu pouvais effacer un souvenir, lequel ?",
"Quel défaut tu assumes le moins ?",
"Quelle est la chose la plus impulsive que tu aies faite ?",
"Quel est ton souvenir le plus gênant d'école ?",
"Quelle est la dépense la plus inutile de ton mois ?",
"Quel est le pire cadeau que tu aies reçu ?",
"Quelle est ta plus grande fierté secrète ?",
],
actions: [
"Imite ton prof le plus relou.",
"Fais deviner un animal en le mimant, interdiction de parler.",
"Parle uniquement en chantant jusqu'à ton prochain tour.",
"Fais l'imitation la plus convaincante d'un autre joueur.",
"Raconte une blague : si personne ne rit, prends une pénalité.",
"Mime ton réveil un lundi matin.",
"Fais 10 secondes de ta meilleure danse ridicule.",
"Prends l'accent de ton choix jusqu'à ton prochain tour.",
"Fais un compliment sincère à chaque personne du cercle.",
"Imite un influenceur connu pendant 15 secondes.",
"Mime un sport sans dire lequel, le groupe devine.",
"Invente un slogan de pub pour la personne à ta droite.",
"Fais semblant d'être un présentateur météo en pleine tempête.",
"Parle comme un robot jusqu'à ton prochain tour.",
"Fais le bruitage d'un film d'action pendant 15 secondes.",
"Goûte un aliment choisi par le groupe les yeux fermés et devine ce que c'est.",
"Fais ta plus belle grimace et tiens-la 10 secondes.",
"Imite la démarche de quelqu'un du groupe, on doit deviner qui.",
"Chante Joyeux anniversaire façon chanteur d'opéra.",
"Raconte ta journée comme si c'était un film d'horreur.",
"Fais semblant de gagner un award et remercie tout le monde en pleurant.",
"Tente de lécher ton coude, oui essaie vraiment.",
"Traverse la pièce en marche arrière en te commentant comme un GPS.",
"Fais une pub télé pour un objet posé devant toi.",
],
},
hot: { verites: [], actions: [] },
extreme: { verites: [], actions: [] },
};
/* ---------- JE N'AI JAMAIS ---------- */
const JNJ_POOLS = {
soft: [
"séché un cours pour dormir.",
"envoyé un message à la mauvaise personne.",
"fait semblant d'être malade pour éviter un truc.",
"pleuré devant un film d'animation.",
"chanté à tue-tête sous la douche.",
"stalké un ex sur les réseaux.",
"menti sur mon âge.",
"mangé un truc tombé par terre.",
"oublié le prénom de quelqu'un en pleine conversation.",
"fait semblant de connaître une chanson.",
"dormi pendant un film au cinéma.",
"ri à un moment totalement inapproprié.",
"fait semblant de répondre au téléphone pour éviter quelqu'un.",
"oublié l'anniversaire d'un proche.",
"gardé un objet emprunté beaucoup trop longtemps.",
"fait croire que j'avais lu un livre.",
"pris un selfie plus de vingt fois pour LE bon.",
"fait semblant d'aimer un cadeau.",
"ri tout seul en repensant à un truc en public.",
"porté un vêtement deux jours de suite sans le laver.",
"menti pour ne pas aller à une soirée.",
"fait semblant de comprendre une blague.",
"googlé mon propre nom.",
"mangé le dernier truc en cachette.",
"regardé une série entière en une nuit.",
"perdu mes clés ou mon téléphone en soirée.",
"liké une vieille photo par accident.",
"raconté une histoire en l'exagérant énormément.",
"fait un détour pour éviter quelqu'un.",
"fait semblant de bosser quand le chef passait.",
"dansé seul dans ma chambre.",
"promis que j'arrivais sans même être prêt.",
"envoyé un vocal de cinq minutes que personne n'a écouté.",
"oublié où j'avais garé.",
"ri d'une blague que je n'avais pas comprise.",
"abandonné une série en plein milieu.",
"zappé tous les snooze de mon réveil.",
"mangé au lit.",
"parlé tout seul à voix haute.",
"cherché mon téléphone alors qu'il était dans ma main.",
"fait semblant d'écouter en pensant à autre chose.",
"recraché discrètement un truc pas bon dans une serviette.",
"fait semblant d'avoir vu un film célèbre.",
"applaudi au mauvais moment.",
"trébuché en pensant que personne ne regardait.",
"oublié de répondre à un message pendant des jours.",
"chanté faux exprès pour faire rire.",
"fait la sieste au lieu de réviser.",
"menti sur le fait d'avoir fini un travail.",
"mis un like puis regretté direct.",
"fait semblant d'aimer un plat pour ne pas vexer.",
"évité quelqu'un en faisant semblant de téléphoner.",
],
hot: [],
extreme: [],
};
/* ---------- TU PRÉFÈRES ---------- */
const TP = {
soft: [
{ a: "Pouvoir voler", b: "Être invisible" },
{ a: "Vivre sans musique", b: "Vivre sans films" },
{ a: "Avoir toujours trop chaud", b: "Avoir toujours trop froid" },
{ a: "Ne plus jamais manger de fromage", b: "Ne plus jamais manger de chocolat" },
{ a: "Une semaine sans téléphone", b: "Un mois sans télé" },
{ a: "Gagner au loto mais perdre tes amis", b: "Rester comme aujourd'hui" },
{ a: "Parler toutes les langues", b: "Parler à tous les animaux" },
{ a: "Être célèbre mais détesté", b: "Inconnu mais adoré" },
{ a: "Manger seulement salé à vie", b: "Manger seulement sucré à vie" },
{ a: "Voyager dans le passé", b: "Voyager dans le futur" },
{ a: "Ne plus jamais mentir", b: "Ne plus jamais jurer" },
{ a: "Une mémoire parfaite", b: "Un sommeil parfait" },
{ a: "Vivre à la montagne", b: "Vivre au bord de la mer" },
{ a: "Travailler la nuit", b: "Te lever à 5h chaque jour" },
{ a: "Lire dans les pensées", b: "Voir l'avenir" },
{ a: "Ne plus jamais tomber malade", b: "Ne plus jamais te blesser" },
{ a: "Un million tout de suite", b: "Cinq mille par mois à vie" },
{ a: "Être le plus drôle de la pièce", b: "Être le plus intelligent" },
{ a: "Perdre la vue un jour", b: "Perdre l'ouïe une semaine" },
{ a: "Ton plat préféré tous les jours", b: "Ne jamais remanger le même plat" },
{ a: "Vivre sans réseaux sociaux", b: "Vivre sans café ni thé" },
{ a: "Pouvoir te téléporter", b: "Pouvoir arrêter le temps" },
{ a: "Être toujours en retard", b: "Être toujours trop en avance" },
{ a: "Ne plus jamais faire la vaisselle", b: "Ne plus jamais faire ton lit" },
{ a: "Tout savoir sans rien pouvoir dire", b: "Ne rien savoir mais être heureux" },
{ a: "Vacances illimitées sans argent", b: "Beaucoup d'argent sans vacances" },
{ a: "Bloqué 2h dans un ascenseur", b: "Marcher 2h sous la pluie" },
{ a: "Ne plus jamais avoir mal aux pieds", b: "Ne plus jamais avoir faim" },
{ a: "Vivre dans une grande ville", b: "Vivre à la campagne" },
{ a: "Connaître la date de ta mort", b: "Ne jamais rien savoir" },
{ a: "Un robot qui fait tout", b: "Un clone de toi" },
{ a: "Ne plus jamais te perdre", b: "Ne plus jamais oublier un prénom" },
{ a: "Toujours bien coiffé", b: "Toujours des habits impeccables" },
{ a: "Manger épicé à chaque repas", b: "Manger fade à chaque repas" },
{ a: "Respirer sous l'eau", b: "Voler une minute par jour" },
{ a: "Ne plus jamais faire la queue", b: "Ne plus jamais être en retard" },
{ a: "Un animal qui parle", b: "Une plante magique" },
{ a: "Vivre 200 ans en forme", b: "Vivre 80 ans parfaitement heureux" },
{ a: "Très riche mais ennuyeux", b: "Fauché mais passionnant" },
{ a: "Plus jamais de bouchons", b: "Toujours une place de parking" },
{ a: "Tout réussir sans effort", b: "Galérer mais être fier" },
{ a: "Le dernier téléphone à vie", b: "Des voyages gratuits à vie" },
{ a: "Ne plus jamais transpirer", b: "Ne plus jamais avoir froid" },
{ a: "Ami avec une star", b: "En couple avec quelqu'un de parfait mais lambda" },
{ a: "Manger sans grossir", b: "Dormir sans jamais être fatigué" },
{ a: "Une aventure folle par an", b: "Une vie tranquille et sûre" },
{ a: "Plus jamais de pub", b: "Plus jamais de spam" },
{ a: "Une voiture de rêve", b: "Une maison de rêve" },
{ a: "Toujours de bonne humeur", b: "Toujours en pleine forme" },
{ a: "Manger gratuitement partout", b: "Voyager gratuitement partout" },
{ a: "Avoir un super pouvoir au hasard", b: "Choisir un pouvoir nul mais utile" },
{ a: "Refaire ta journée d'hier", b: "Sauter directement à demain" },
],
hot: [],
extreme: [],
};
/* ---------- IMPOSTEUR (version unique) ---------- */
const IMP_CATS = {
"Lieux": ["la plage", "l'aéroport", "l'hôpital", "le supermarché", "la salle de sport", "la piscine", "le cinéma", "le château", "le métro", "la bibliothèque", "le camping", "la boîte de nuit"],
"Nourriture": ["la pizza", "les sushis", "le burger", "la raclette", "les pâtes", "le kebab", "la crêpe", "le couscous", "la tarte", "les frites", "la soupe", "le croissant"],
"Films & séries": ["Harry Potter", "Titanic", "Star Wars", "Le Roi Lion", "Friends", "Game of Thrones", "Spider-Man", "La Casa de Papel", "Avatar", "Intouchables", "Squid Game", "Le Seigneur des Anneaux"],
"Sport": ["le football", "le tennis", "la natation", "le basket", "la boxe", "le ski", "le rugby", "l'escalade", "le golf", "le judo", "le surf", "le cyclisme"],
"Animaux": ["le pingouin", "le requin", "le kangourou", "le hérisson", "le dauphin", "le caméléon", "la chauve-souris", "le paresseux", "le flamant rose", "le loup", "la pieuvre", "le panda"],
"Métiers": ["le pompier", "le boulanger", "le pilote", "le dentiste", "le journaliste", "le jardinier", "le coiffeur", "l'astronaute", "le serveur", "le vétérinaire", "le DJ", "le facteur"],
"Objets": ["le parapluie", "la télécommande", "la bougie", "le tournevis", "l'aspirateur", "le miroir", "la valise", "le réveil", "la guitare", "le casque", "le ballon", "la lampe"],
};
/* ====================== UTILS ====================== */
const shuffle = (a) => { const r = [...a]; for (let i = r.length - 1; i > 0; i--) { const j = Math.floor(Math.random() * (i + 1)); [r[i], r[j]] = [r[j], r[i]]; } return r; };
const pick = (a) => a[Math.floor(Math.random() * a.length)];
/* ====================== UI ====================== */
function Btn({ children, onClick, color = C.text, bg = C.surface, full, style, disabled }) {
return (
);
}
function TopBar({ title, color, onBack, level }) {
const lv = LEVELS[level];
return (
{title}
{lv && lv.badge && {lv.badge}}
);
}
const cardChoice = (color) => ({ display: "flex", flexDirection: "column", alignItems: "center", gap: 8, background: C.surface, border: `1.5px solid ${color}`, borderRadius: 22, padding: "30px 20px", color: C.text, cursor: "pointer", WebkitTapHighlightColor: "transparent" });
/* ====================== ACTION OU VÉRITÉ ====================== */
const AV_EN = {
soft: {
verites: [
"What's the last slightly embarrassing thing you did?",
"What's the biggest lie you ever told your parents?",
"Which app do you hide first when someone looks at your phone?",
"What's your most useless talent?",
"What's the most expensive thing you bought on impulse?",
"What nickname do you hate being called?",
"What's your biggest embarrassment from high school?",
"What's the last weird thing you searched online?",
"How long can you really go without your phone?",
"What's the wildest rumor that ever spread about you?",
"What's your worst party memory?",
"What's a weird habit you have when you're alone?",
"What's the biggest lie you told to impress someone?",
"What's the most childish thing you still do?",
"What's your guilty pleasure song?",
"Have you ever faked being sick, and why?",
"When's the last time you cried, and why?",
"What's the cheapest thing you've ever done?",
"What's your biggest irrational fear?",
"What compliment has stuck with you the most?",
"Who's the last person you stalked online?",
"What's your worst date ever?",
"What's the craziest thing on your bucket list?",
"What's the lie you tell most often?",
"When's the last time you embarrassed yourself in public?",
"If you could erase one memory, which one?",
"What flaw do you accept the least?",
"What's the most impulsive thing you've done?",
"What's your most embarrassing school memory?",
"What's the most useless purchase of your month?",
"What's the worst gift you've ever received?",
"What's your secret source of pride?",
],
actions: [
"Imitate your most annoying teacher.",
"Mime an animal for the group to guess, no talking.",
"Only speak by singing until your next turn.",
"Do your most convincing impression of another player.",
"Tell a joke: if nobody laughs, take a penalty.",
"Mime waking up on a Monday morning.",
"Do 10 seconds of your most ridiculous dance.",
"Pick an accent and keep it until your next turn.",
"Give a sincere compliment to everyone in the circle.",
"Imitate a famous influencer for 15 seconds.",
"Mime a sport without naming it, the group guesses.",
"Invent an ad slogan for the person on your right.",
"Pretend to be a weather presenter during a huge storm.",
"Talk like a robot until your next turn.",
"Do the sound effects of an action movie for 15 seconds.",
"Taste a food chosen by the group with your eyes closed and guess it.",
"Make your best silly face and hold it for 10 seconds.",
"Copy the walk of someone in the group, others guess who.",
"Sing Happy Birthday like an opera singer.",
"Narrate your day as if it were a horror movie.",
"Pretend to win an award and tearfully thank everyone.",
"Try to lick your own elbow, yes really try.",
"Walk backwards across the room narrating yourself like a GPS.",
"Do a TV commercial for an object in front of you.",
],
},
hot: { verites: [], actions: [] },
extreme: { verites: [], actions: [] },
};
const TP_EN = {
soft: [
{ a: "never use social media again", b: "never watch series or movies again" },
{ a: "be able to fly", b: "be invisible" },
{ a: "always be 10 minutes late", b: "always be 20 minutes early" },
{ a: "have free travel for life", b: "have free food for life" },
{ a: "read minds", b: "see one week into the future" },
{ a: "live without music", b: "live without video" },
{ a: "be a famous actor", b: "be a famous singer" },
{ a: "never feel cold again", b: "never feel too hot again" },
{ a: "only whisper", b: "only shout" },
{ a: "lose all your photos", b: "lose all your messages" },
{ a: "speak every language", b: "play every instrument" },
{ a: "have a rewind button for life", b: "have a pause button for life" },
{ a: "always tell the truth", b: "always have to lie" },
{ a: "live by the sea", b: "live in the mountains" },
{ a: "never wait in line again", b: "never hit traffic again" },
{ a: "have a personal chef", b: "have a personal driver" },
{ a: "be the funniest in the room", b: "be the smartest in the room" },
{ a: "only eat sweet food", b: "only eat salty food" },
{ a: "teleport anywhere", b: "time travel" },
{ a: "have super strength", b: "have super speed" },
{ a: "never have homework or chores", b: "never have to sleep" },
{ a: "win the lottery once", b: "get a smaller bonus every month for life" },
{ a: "be famous", b: "be rich but unknown" },
{ a: "control fire", b: "control water" },
{ a: "always know when someone lies", b: "always get away with your own lies" },
{ a: "have a dog that talks", b: "have a cat that does your taxes" },
{ a: "relive your best day", b: "skip your worst day" },
{ a: "never use a phone again", b: "never use a computer again" },
{ a: "be able to talk to animals", b: "speak every human language" },
{ a: "have unlimited books", b: "have unlimited games" },
{ a: "eat only pizza for a year", b: "eat only sushi for a year" },
{ a: "be the hero of a movie", b: "be the villain of a movie" },
{ a: "always have perfect hair", b: "always have perfect skin" },
{ a: "live in the past", b: "live in the future" },
{ a: "never lose your keys again", b: "never lose your phone again" },
{ a: "be amazing at sports", b: "be amazing at music" },
{ a: "have a year off with pay", b: "retire five years early" },
{ a: "only travel by plane", b: "only travel by boat" },
{ a: "never be bored again", b: "never be tired again" },
{ a: "have a photographic memory", b: "be able to forget on command" },
{ a: "be slightly famous forever", b: "be very famous for one year" },
{ a: "live without coffee", b: "live without dessert" },
{ a: "always know the right thing to say", b: "always know what people are thinking" },
{ a: "be able to breathe underwater", b: "be able to survive in space" },
{ a: "have a personal stylist", b: "have a personal trainer" },
{ a: "win every argument", b: "never argue again" },
{ a: "have free concert tickets for life", b: "have free plane tickets for life" },
{ a: "be able to heal others", b: "be able to heal yourself instantly" },
{ a: "live one big adventure", b: "live a thousand small good days" },
{ a: "always have a clean house", b: "always have a full fridge" },
{ a: "be the best cook among friends", b: "be the best dancer among friends" },
{ a: "know your future", b: "change one thing in your past" },
],
hot: [],
extreme: [],
};
const JNJ_EN = {
soft: [
"skipped school or work to do nothing",
"lied about my age",
"fallen asleep in a movie theater",
"sent a text to the wrong person",
"forgotten someone's name right after meeting them",
"binged a whole series in one day",
"eaten food off the floor",
"pretended to be sick to avoid plans",
"sung karaoke completely sober",
"cried at a cartoon",
"lost a silly bet",
"gone a full day without my phone",
"talked to myself out loud in public",
"tripped in front of a crowd",
"laughed at the worst possible moment",
"stalked someone online for an hour",
"kept a borrowed book way too long",
"danced when no one was watching",
"eaten dessert before dinner",
"ignored an alarm and overslept",
"gotten lost in my own city",
"forgotten my own password",
"worn the same outfit two days in a row",
"pretended to understand something I didn't",
"lied about reading a book",
"fallen for an obvious prank",
"made a playlist for someone",
"reread my own old messages",
"googled my own name",
"laughed so hard I snorted",
"faked a phone call to avoid someone",
"eaten an entire pizza alone",
"cried over a song",
"stayed up all night for no reason",
"gotten a nickname I hated",
"embarrassed myself at a party",
"forgotten a friend's birthday",
"practiced what to say before a call",
"won an argument I was actually wrong about",
"pretended to like a gift",
"gotten caught talking about someone",
"failed a viral dance challenge",
"fallen asleep on public transport",
"spent too much on something useless",
"laughed at my own joke before finishing it",
"worn my clothes inside out all day",
"lied about my plans just to stay home",
"gotten a song stuck in my head for days",
"taken a nap I didn't mean to take",
"said 'you too' at the wrong time",
"replied to the wrong group chat",
"ghosted a conversation out of laziness",
],
hot: [],
extreme: [],
};
const QP_EN = {
soft: [
"fall asleep first at a party",
"text back the slowest",
"lose their phone tonight",
"start a dance floor",
"cry at a movie",
"forget a name two seconds after meeting someone",
"show up late to everything",
"take the most photos tonight",
"eat the last slice without asking",
"tell the same story twice",
"get lost even with GPS",
"win a trivia game",
"laugh at the wrong moment",
"start a group chat no one asked for",
"spend all their cash on snacks",
"fall for an obvious prank",
"talk their way out of a ticket",
"become famous one day",
"adopt ten pets",
"move abroad on a whim",
"sing in the shower the loudest",
"binge a whole series overnight",
"forget their own birthday",
"trip on a flat surface",
"become a millionaire",
"give the best advice",
"start an argument over nothing",
"reply to a text three days later",
"plan the best trip",
"get caught daydreaming",
"always be the designated driver",
"take the longest to get ready",
"send a meme at 3am",
"be the first to say they're hungry",
"last the longest without their phone",
"befriend a stranger instantly",
"overpack for a weekend trip",
"lose every game tonight",
"be the mom of the friend group",
"start a business someday",
"get emotional over a song",
"be the last to leave the party",
"forget where they parked",
"pick the worst movie to watch",
"always be down for food",
"take the best selfies",
"fall asleep during a meeting",
"be the funniest in the room",
"keep a secret the best",
"get distracted mid-sentence",
"accidentally like an old photo while scrolling",
"talk to pets like they understand",
],
hot: [],
extreme: [],
};
function poolEN(en, fr, level) { const e = en[level]; if (LANG === "en" && e && e.length) return e; return fr[level]; }
function bankAV(level) { const e = AV_EN[level]; if (LANG === "en" && e && e.verites && e.verites.length) return e; return AV[level]; }
function LevelSelector({ level, premium, onChoose }) {
const modes = [
{ k: "soft", label: t("Soft","Soft"), ic: null, on: C.text, fg: C.bg },
{ k: "hot", label: t("Hot","Hot"), ic: "flame", on: C.hot, fg: "#fff" },
{ k: "extreme", label: t("Extrême","Extreme"), ic: "burst", on: C.extreme, fg: "#fff" },
];
return (
{t("Réservé aux adultes (18+). Contenu flirt, drague et sexe, entre adultes consentants.","Adults only (18+). Flirty and sexual content, between consenting adults.")}
);
}
/* ---------- QUI POURRAIT ---------- */
const QP_HOT = [];
const QP_EXTREME = [];
const QP_POOLS = {
soft: [
"prendre une douche à 4h du matin sans raison.",
"oublier son propre anniversaire.",
"manger une pizza entière tout seul.",
"se perdre dans sa propre ville.",
"tomber amoureux en vacances.",
"envoyer un message à son ex à 3h du matin.",
"devenir célèbre sur les réseaux.",
"pleurer devant une publicité.",
"oublier où il a garé la voiture.",
"danser sur une table en soirée.",
"parler à un inconnu dans la rue.",
"abandonner après cinq minutes de sport.",
"finir la soirée en kebab.",
"dormir pendant un concert.",
"perdre son téléphone ce soir.",
"se mettre à chanter sans prévenir.",
"rater son réveil demain matin.",
"raconter sa vie à un chauffeur de taxi.",
"adopter dix chats.",
"se disputer pour le choix d'une série.",
"oublier de répondre pendant trois jours.",
"rougir pour un rien.",
"prendre le micro au karaoké en premier.",
"casser quelque chose ce soir.",
"commander le plat le plus bizarre du menu.",
"se faire avoir par une arnaque.",
"tomber en marchant tout droit.",
"rester scotché à son téléphone toute la soirée.",
"organiser un voyage sur un coup de tête.",
"rire au pire moment.",
"oublier un prénom juste après l'avoir entendu.",
"faire la sieste n'importe où.",
"se vexer pour une blague.",
"finir par payer pour tout le groupe.",
"se relever la nuit pour manger.",
"raconter trois fois la même histoire.",
"pleurer de rire sans pouvoir s'arrêter.",
"perdre un pari ridicule.",
"se mettre en retard pour un selfie.",
"croire à un poisson d'avril énorme.",
"tout oublier après deux verres.",
"draguer le distributeur de billets.",
"chanter sous la douche à plein volume.",
"se filmer en train de danser seul.",
"oublier ses clés à l'intérieur.",
"parler tout seul dans la rue.",
"manger le dernier morceau sans demander.",
"s'endormir devant un film d'action.",
"envoyer un vocal interminable.",
"refaire toute la déco un dimanche soir.",
"se perdre dans un supermarché.",
"rire à sa propre blague avant de la finir.",
],
hot: QP_HOT,
extreme: QP_EXTREME,
};
function QuiPourrait({ level, premium, onChooseLevel, onBack }) {
const pool = poolEN(QP_EN, QP_POOLS, level);
const [order, setOrder] = useState(() => shuffle(pool));
const [i, setI] = useState(0);
useEffect(() => { setOrder(shuffle(pool)); setI(0); }, [level]);
const next = () => setI((x) => (x + 1) % order.length);
const prev = () => setI((x) => (x - 1 + order.length) % order.length);
const reshuffle = () => { setOrder(shuffle(pool)); setI(0); };
return (
{t("QUI POURRAIT...","WHO'S MOST LIKELY TO...")}
{order[i]}
{t("À 3, tout le monde pointe du doigt. La personne la plus désignée prend une pénalité","On 3, everyone points. The most pointed-at takes a penalty")} · {i + 1}/{order.length}
{t("Chaque joueur mise des pénalités sur un cheval, puis valide sa mise. À la case 4, chaque cheval a une couleur de péage tirée au hasard (différente de la sienne). Quand une couleur est piochée, son cheval avance et tout cheval bloqué au péage dont le péage est cette couleur le franchit. Un cheval bloqué au péage qui pioche sa propre couleur recule d'une case, et ses parieurs prennent 1 pénalité. La course va jusqu'à l'arrivée des 3 premiers. 1er : distribue le double, 2e : distribue sa mise, 3e : prend sa mise, 4e : prend le double.","Each player bets penalties on a horse, then confirms their bet. At space 4, each horse gets a random toll color (different from its own). When a color is drawn, its horse moves forward and any horse stuck at the toll whose toll is that color clears it. A horse stuck at the toll that draws its own color moves back one space, and its bettors take 1 penalty. The race runs until the first 3 finish. 1st: hands out double, 2nd: hands out their bet, 3rd: takes their bet, 4th: takes double.")}
{players.length === 0 ? (
{t("Aucun joueur ajouté. Partie rapide : chacun choisit son cheval et sa mise à voix haute.","No players added. Quick game: everyone picks their horse and bet out loud.")}
);
}
function ResultPMU({ players, bets, order }) {
const place = ["1er", "2e", "3e", "4e"];
if (players.length === 0) {
const w = SUITS.find((x) => x.k === order[0]);
return
Classement : {order.map((k, i) => place[i] + " " + SUITS.find((s) => s.k === k).sym).join(" · ")}. Le 1er distribue le double de sa mise, le 2e distribue sa mise, le 3e prend sa mise, le dernier prend le double.
{t("Chacun reçoit un mot ; l'imposteur en a un voisin du même thème (ex. arbre / fleur). À chaque manche, tout le monde donne un mot lié au sien, puis on vote. L'éliminé est révélé. Les imposteurs gagnent dès que les civils sont en nombre égal ou inférieur aux imposteurs.","Everyone gets a word; the impostor gets a neighboring word from the same theme (e.g. tree / flower). Each round, everyone says a word linked to theirs, then you vote. The eliminated player is revealed. The impostors win as soon as the civilians are equal to or fewer than the impostors.")}
{!enough ? (
{t("Il faut au moins","You need at least")} {t("3 joueurs","3 players")} ({players.length} {t("pour l'instant).","so far).")}
{t("Passe le téléphone à","Pass the phone to")} {rl.name}
{shown && { if (isLast) startRound(); else { setStep((s) => s + 1); setShown(false); } }}>{isLast ? t("Tout le monde a vu →","Everyone has seen →") : t("J'ai vu, masquer","Seen it, hide")}}
);
}
if (phase === "round") {
const last = speaker >= order.length - 1;
return (
Manche {manche} · {alive.length} joueurs en jeu
{t("ORDRE DE PASSAGE","SPEAKING ORDER")}
{order.map((name, i) => (
{i + 1}
{name}{i === speaker && {t("à toi de donner un mot","your turn to give a word")}}{i < speaker && ✓}
))}
{!last ? (
setSpeaker((s) => s + 1)}>{t("Joueur suivant →","Next player →")}
) : (
{t("Tout le monde a parlé · Voter ⏱","Everyone has spoken · Vote ⏱")}
)}
{t("Le meneur tient le téléphone et peut voir les cartes en secret pour bluffer. Qui se trompe prend autant de pénalités que de cartes retournées.","The leader holds the phone and can secretly see the cards to bluff. Whoever is wrong takes as many penalties as cards flipped.")}
{deck.map((c, i) => ())}
{status === "play" && (
Carte {target + 1} sur 6
{type === "hl" ? `${t("Plus, égal ou moins que","Higher, equal or lower than")} ${prev.l} ${prev.s} ?` : t("Rouge ou Noir ?","Red or Black?")}
);
}
function Intro({ onClose, onSubscribe }) {
const IC = {
flame: ,
grid: ,
refresh: ,
check: ,
};
const feats = [
["flame", t("736 questions Hot & Extr\u00eame d\u00e9verrouill\u00e9es", "736 Hot & Extreme questions unlocked")],
["grid", t("Tous les jeux et tous les niveaux", "Every game and every level")],
["refresh", t("De nouvelles mises \u00e0 jour r\u00e9guli\u00e8rement", "New updates regularly")],
["check", t("Sans engagement, r\u00e9siliable \u00e0 tout moment", "No commitment, cancel anytime")],
];
return (