/* global React, Eyebrow */ const { useState } = React; // ── Mettre à false pour révéler les têtes d'affiche ────────────────────── const FEATURED_HIDDEN = true; // mettre false pour révéler R2 et Leto const STAGES = [ { id: "all", label: "Tout le programme", color: "#ffc23d" }, { id: "main", label: "Main Stage", color: "#ff5e3a" }, ]; const ARTISTS = [ { name: "R2", role: "Concert · Tête d'affiche", stage: "main", time: "21:00", featured: true, bg: "bg-1", text: "dark-text", img: "assets/headliner-1.jpeg", imgPos: "center 65%", bio: "Rappeur français né en 2004 en Essonne, R2 (Rayann Mondésir Kipre) s'impose en un temps record comme l'une des révélations du rap français. Son style mêle Drill, Jersey et Trap avec une énergie brute et une touche mélodique qui le démarquent. Révélé en 2023 avec Pastille Bleue, il enchaîne les sorties marquantes avant de frapper fort en 2025 avec Ruinart — numéro 1 du Top 50 Spotify France — et son album 7/7. Sélectionné parmi les \"11 rappeurs à suivre\" de Booska-P, il est signé chez Blue Sky et 360 OTG." }, { name: "Leto", role: "DJ · À découvrir", stage: "main", time: "22:00", featured: true, bg: "bg-8", text: "light-text", img: "assets/surprise-guest.jpeg", imgPos: "center 20%", bio: "Né à Paris dans une famille d'origine congolaise, Leto (Henoc Bofenda) grandit Porte de Saint-Ouen dans le 17ème. Il co-fonde le duo PSO Thug en 2014 avant de se lancer en solo chez Warner (Rec. 118). Trap$tar en 2018 pose ses bases, mais c'est 100 Visages en 2020 — certifié platine — qui le propulse au sommet, notamment grâce au hit Macaroni avec Ninho. Son album 17% en 2021, également certifié platine, confirme son statut de valeur sûre du rap FR." }, { name: "DJ Iccy", role: "Live · Chant", stage: "main", time: "11:00", bg: "bg-6", text: "light-text", img: "assets/vocaliste.jpeg", imgPos: "center 15%", bio: "Trap, Rap, Underground, FR & US", instagram: "https://www.instagram.com/iccyccx?igsh=MXF2cDlqYjB0azJkbA==" }, { name: "DJ Nelsao", role: "DJ · House", stage: "main", time: "12:30", bg: "bg-4", text: "dark-text", img: "assets/pool-selector.jpeg", imgPos: "center 25%", bio: "BAILE FUNK, TRAP, RAP, UNDERGROUND, R&B", instagram: "https://www.instagram.com/nelsao.wav?igsh=dXFiZzg1bmh5azI=" }, { name: "DJ Ash", role: "DJ Set · Open", stage: "main", time: "14:00", bg: "bg-7", text: "dark-text", img: "assets/sunrise-b2b.jpeg", imgPos: "center 20%", bio: "AFRO HOUSE, RAP, HOUSEHOLIC CERTIFIED", instagram: "https://www.instagram.com/dj.ash?igsh=cHM4d3ZxeHgyZHFz" }, { name: "DJ Karlson",role: "Concert · Indé FR", stage: "main", time: "15:30", bg: "bg-5", text: "dark-text", img: "assets/local-hero.jpeg", imgPos: "center 20%", bio: "HOUSE, AFRO VIBES", instagram: "https://www.instagram.com/karlson_1?igsh=aXYyajZ2bDhjdzlv" }, { name: "DJ M-ADD", role: "DJ · Coucher de soleil",stage: "main",time: "17:00", bg: "bg-3", text: "dark-text", img: "assets/sunset-dj.jpeg", bio: "PRODUCER PROGRESSIVE / AFROHOUSE", instagram: "https://www.instagram.com/maddmusic?igsh=MWZkZ3Boem11NTBwZw==" }, { name: "DJ Milane", role: "Concert live", stage: "main", time: "19:15", semi: true, bg: "bg-2", text: "light-text", img: "assets/live-act.jpeg", bio: "DJ et producteur français actif sous son propre label Milane Meritte Production, DJ Milane s'est fait remarquer dans la sphère rap en collaborant avec le rappeur Landy sur le titre Rolling Stones, sorti en 2026. Très présent sur TikTok via son compte @dj_milane_replay, il y développe sa visibilité et partage ses productions rap/hip-hop. Un artiste en pleine ascension sur la scène urbaine française.", instagram: "https://www.instagram.com/milanemeritte?igsh=YW1leDl3b2tza25k" }, ]; function PageLineup() { const [stage, setStage] = useState("all"); const filtered = stage === "all" ? ARTISTS : ARTISTS.filter((a) => a.stage === stage); return (

Line·up.

Une main stage. De 11h à 23h. Mise à jour à venir.

{STAGES.map((s) => ( ))}
{/* Têtes d'affiche */}
{filtered.filter(a => a.featured).map((a, i) => ( ))}
{/* Autres artistes */}
{filtered.filter(a => !a.featured).map((a, i) => ( ))}
Programme par horaires

Plan de la journée.

Slots indicatifs. Programme final mis à jour 48h avant le festival.

{[ { t: "11h00", n: "Ouverture des portes · Pool open", c: "#ffc23d", opening: true }, { t: "11h – 12h30", n: "DJ Iccy", c: "#ff5e3a" }, { t: "12h30 – 14h", n: "DJ Nelsao", c: "#ff5e3a" }, { t: "14h – 15h30", n: "DJ Ash", c: "#ff5e3a" }, { t: "15h30 – 17h", n: "DJ Karlson", c: "#ff5e3a" }, { t: "17h – 18h30", n: "DJ M-ADD", c: "#ff5e3a" }, { t: "18h30 – 19h15", n: "???", c: "#ff5e3a", hidden: true }, { t: "19h15 – 21h", n: "DJ Milane", c: "#ff5e3a" }, { t: "21h", n: "???", c: "#ff5e3a", hidden: true }, { t: "22h", n: "À venir", c: "#6dd5ff", tba: true }, ].map((r, i) => (
{r.t}
{r.hidden && FEATURED_HIDDEN ? (
⭐ À venir
) : r.tba ? (
{r.n}
) : (
{r.n}
)}
Main Stage
))}
); } function ArtistCard({ name, role, stage, time, featured, semi, bg, text, img, imgPos, bio, instagram }) { const [showBio, setShowBio] = useState(false); const stageObj = STAGES.find((s) => s.id === stage); const hasPhoto = !!img; const isHidden = FEATURED_HIDDEN && !!featured; const hasBio = hasPhoto && !!bio && !isHidden; return (
hasBio && setShowBio(!showBio)} style={{ cursor: hasBio ? "pointer" : "default" }} >
{hasPhoto && ( Artiste )}
{stageObj?.label}
{!isHidden && !hasPhoto && (
À venir
)} {!isHidden && hasBio && !showBio && (
BIO
)} {showBio && (
{/* Barre colorée en haut */}
{/* Label BIOGRAPHIE */}
Biographie
{/* Nom artiste */}
{name}
{/* Séparateur */}
{/* Texte bio */}
{bio}
{/* Lien Instagram */} {instagram && ( e.stopPropagation()} style={{ display: "flex", alignItems: "center", gap: 8, marginTop: 12, flexShrink: 0, background: "linear-gradient(135deg, #833ab4, #fd1d1d, #fcb045)", border: "none", borderRadius: 8, padding: "9px 14px", color: "#fff", fontSize: 12, fontWeight: 700, fontFamily: "var(--font-mono)", letterSpacing: "0.08em", textDecoration: "none", cursor: "pointer", }} > @{instagram.split('/').filter(Boolean).pop().split('?')[0]} )} {/* Bouton fermer */}
)} {/* Bannière "À venir" */} {isHidden && (
À venir
)}
{isHidden ? (
) : (
{name}
)}
); } Object.assign(window, { PageLineup });