Logo Pastebin.fr
Pastebin

Retrouvez, créez et partagez vos snippets en temps réel.

Roaster

import React, { useState, useMemo } from 'react';
import { Music, MapPin, Users, BookOpen, Disc, ExternalLink, Search, Menu, X, PlayCircle, Youtube } from 'lucide-react';

// --- DATA SOURCE ---
// This data is generated from the CSV parser output
const ARTIST_DATA = [
  {
    "id": 1,
    "name": "ANEMOS",
    "genre": "Organic, photosynthesis-inspired ambient.",
    "location": "Rhodes, Greece",
    "members": "2\n\nThanos Valaoris: Field recordings, modular synthesis, \"plant-noise\" captures, producer.\nElara Klee: Acoustic guitar, flute, ethereal vocal textures.",
    "story": "A collaboration between a Greek sound ecologist and a German multi-instrumentalist. They record in botanical gardens and on remote coastlines, using bio-sensors to transform the electrical resistance of leaves into ambient melodies.",
    "links": {
      "spotify": "https://open.spotify.com/intl-fr/artist/0BcGY8LTztyx9vY7vTddcf?si=W_JMiWRsTLaTfcqEgi88Yw",
      "youtube": "https://www.youtube.com/@Anemosssss"
    },
    "releases": [
      { "title": "Deepwave", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Terra Flora", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Membrane", "format": "Album", "year": "2026", "status": "Sent to stores" }
    ]
  },
  {
    "id": 2,
    "name": "ATAY",
    "genre": "Authentic Gnawa project. Guembri, qraqeb, bendir, trance-inducing.",
    "location": "Essaouira, Morocco",
    "members": "3 (The Brotherhood)\n\nMaâlem Driss Mansouri: Guembri (bass lute), lead vocals, spiritual leader.\nHamza Belkhayat: Qraqeb (iron castanets), backing vocals, percussion.\nZaid Al-Fassi: Bendir (frame drum) and atmospheric textures.",
    "story": "A traditional Gnawa family collective. Their music is recorded in a single take in a room saturated with incense, capturing the trance-like state of \"Lilas\" (ceremonies) with a raw, high-fidelity grain.",
    "links": {
      "spotify": "https://open.spotify.com/intl-fr/artist/2LwDd215e0fdBaC00PCvLf?si=FnEBSvZVQM-gby0PZFLosQ",
      "youtube": "https://www.youtube.com/@atayband"
    },
    "releases": [
      { "title": "Atlas Gnawa", "format": "Album", "year": "2025", "status": "Sent to stores" }
    ]
  },
  {
    "id": 3,
    "name": "CALM PIANO NIGHTS",
    "genre": "Felt piano, nocturnal stillness, rain/candlelight vibes, minimalist.",
    "location": "Stockholm, Sweden",
    "members": "1 (Solo)\n\nLukas Sjöberg: Felt piano, prepared piano techniques.",
    "story": "A former classical conservatory dropout who installed his upright piano in a basement studio. He uses vintage wool felt between the hammers and strings to dampen the sound, focusing on the mechanical noises of the keyboard to create total intimacy.",
    "links": {
      "spotify": "https://open.spotify.com/intl-fr/artist/608LWQshncoA5O6D1PbPRu?si=JQXJ6f_fQyKrl2gdAqRNAw",
      "youtube": "https://www.youtube.com/@CalmPianoNights"
    },
    "releases": [
      { "title": "Anxiety Rain", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Gentle Dusk Therapy", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Serenity Under Storms", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Where Tension Fades", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Moonlit Melodies", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "In Stillness", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "A Moment of Harmony", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "In the Key of Sleep", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Lantern Lake", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Glass Garden Nocturne", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Quiet Remedy", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Reverie", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Aurora Melodies", "format": "Album", "year": "2026", "status": "In review" },
      { "title": "Notes from a Quiet Room", "format": "Album", "year": "2026", "status": "Sent to stores" }
    ]
  },
  {
    "id": 4,
    "name": "CARAVAN JAZZ",
    "genre": "Spiritual jazz, raw, analog, baritone sax, brushed drums.",
    "location": "US",
    "members": "4 (The Quartet jazz old men)\n\nMiles Sterling: Baritone saxophone, flute.\nJuno Vane: Upright bass.\nKofi Mensah: Brushed drums, percussion.\nEzra Finch: Rhodes piano, Hammond organ.",
    "story": "A spiritual jazz group born from late-night jam sessions in East London. They specialize in \"Lounge Noir\": music for rainy streets and jazz bars at 3 AM.",
    "links": {
      "spotify": "https://open.spotify.com/intl-fr/artist/3CWABwiGF79MCCiAwjKlhH?si=TnqJ5uXWSK2iJ2jNqk2jjA",
      "youtube": "https://www.youtube.com/@jazzycaravan"
    },
    "releases": [
      { "title": "The Caravan Sessions", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Lilac Confessions", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Hymn for the Loneliest", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Letters from the Basement", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Glass Wings", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Tesseract Caravan", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Silent Avalanche", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Opaline Path", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Cracked Prism", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Cellophane Skies", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Heavy Light", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Static Empathy", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Shadow Drift", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Horizon Lines", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Desert Serenade", "format": "Album", "year": "2026", "status": "Sent to stores" }
    ]
  },
  {
    "id": 5,
    "name": "CHEAP FLIGHTS TO NOWHERE",
    "genre": "Psychedelic Rock, Neo-Psychedelia, Indie Rock, Slacker-pop, jangly, ironic, surf-rock, 'recorded at 2am' energy.",
    "location": "Silver Lake, Los Angeles, CA",
    "members": "6\n\nJax Miller: Vocals, saturated surf guitar.\nBones Malone: Analog synthesizers.\nSkylar West: Lo-fi drums, percussion.\nFinn Holloway: 12-string rhythmic guitar.\nLuna Ray: Bass, backing vocals.\nLeo Cruz: Lead guitar, reverb tanks.",
    "story": "Recorded almost exclusively on a Tascam 388 in Jax's garage. Their sound is ironic, sun-drenched, and intentionally dusty, capturing the energy of a surf-rock session at 2 AM on the California coast.",
    "links": {
      "spotify": "https://open.spotify.com/intl-fr/artist/67aaBYK0mgArhxrUTrHGKv?si=VtJxAg2jTS2FHTpzNaLN8Q",
      "youtube": "https://www.youtube.com/@CheapFlightsToNowhere"
    },
    "releases": [
      { "title": "Giraffe Out Of Water", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Cat Life", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Fishing Expedition", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Manicure Man", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Quantum Love", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "In Praise of Anesthesiologists", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Steak of Mind", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Bigger Is Better", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Exotica", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Mango Maps", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "My Generation", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Raspberry Cake", "format": "Album", "year": "2025", "status": "Sent to stores" }
    ]
  },
  {
    "id": 6,
    "name": "CHILLTENDO",
    "genre": "8-bit/Lo-fi, imaginary console soundtracks, cozy gaming nostalgia.",
    "location": "Osaka, Japan",
    "members": "1 (Solo)\n\nKenji Sato: Gameboy DMG-01, trackers, lo-fi samplers.",
    "story": "A former video game sound designer who creates soundtracks for imaginary consoles. He uses authentic 8-bit hardware mixed with modern lo-fi hip-hop aesthetics.",
    "links": {
      "spotify": "https://open.spotify.com/intl-fr/artist/04segnySVZTBO0t9Sl7A0O?si=ZxEXFenZRYS2pJugXM1lkg",
      "youtube": "https://www.youtube.com/@Chilltendo"
    },
    "releases": [
      { "title": "Gameboy Advance : The Sims : Bustin' Out OST", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Alchemical Dawn", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Alchemical Dusk", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Lost in Time : Ocarina of Chill", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Requiem for the Moon : the Mask of Chill", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Imaginary Console : Vol. 1", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Imaginary Console : Vol. 2", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Mask Society - Miami Lo-fi", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Cartridge Memories - Gold Silver Crystal", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Skybound Blade: Cloud Isles", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Imaginary Console : Vol. 3", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Leaf Cap Legend: Forest Folk", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Golden Iris: Agent Protocol", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Blockscape: Sundown Overworld", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "City of Lights : Z", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Imaginary Console : Vol. 4", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Imaginary Console : Vol. 5", "format": "Album", "year": "2026", "status": "In review" }
    ]
  },
  {
    "id": 7,
    "name": "CROISIÈRE",
    "genre": "Riviera-sleek, French electro-chanson.",
    "location": "Nice, France",
    "members": "3 (Principal + Guests)\n\nJulien Roux: Production, synths, composition.\nLéa Valmont: Lead vocals (smooth voice).\nMarcello Bianchi: Hybrid drums (electro-acoustic).",
    "story": "Inspired by the 1960s French Riviera. Julien creates \"sleek-pop\": music that sounds like a yacht party on the Mediterranean, blending modern French electro with the elegance of classic chanson.",
    "links": {
      "spotify": "https://open.spotify.com/intl-fr/artist/6LH1TYsF7q4sZ7AqFQYXF6?si=1yduSouUSCOrJsPWqVFuHg",
      "youtube": "https://www.youtube.com/@StudioCroisi%C3%A8re"
    },
    "releases": [
      { "title": "Amour artificiel", "format": "Single", "year": "2025", "status": "Sent to stores" },
      { "title": "Nouveau Luxe", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Terasse Vue Mer", "format": "Album", "year": "2026", "status": "Sent to stores" }
    ]
  },
  {
    "id": 8,
    "name": "DADDY BOOGIE",
    "genre": "Disco × Motown × electro swing energy. Four-on-the-floor.",
    "location": "New York City, NY",
    "members": "4 (The Funk Unit)\n\nDominic \"Daddy\" Santoro: Bandleader, slap bass.\nLexi Love: Lead vocals, tambourine.\nRichie Rico: Trumpet, horn arrangements.\nPatrick \"Smooth P\" Washington: Keyboards, talkbox.",
    "story": "A high-energy disco revival group. They record live-to-tape to capture the \"four-on-the-floor\" energy of the Motown era with a modern electro-swing twist.",
    "links": {
      "spotify": "https://open.spotify.com/intl-fr/artist/7juK5JKqFKiiwL2ehEqwjU?si=CxEgQn4nQ8OVRAj5_ebYjw",
      "youtube": "https://www.youtube.com/@DaddyBoogie"
    },
    "releases": [
      { "title": "Stay on the Floor", "format": "Album", "year": "2025", "status": "Sent to stores" }
    ]
  },
  {
    "id": 9,
    "name": "DEFAULT MOOD",
    "genre": "Spoken-word experimental electronic, cinematic, intimate.",
    "location": "Bristol, UK",
    "members": "2 (Couple Duo)\n\nArlo Thorne: Spoken word, poetry, sound design.\nSienna Thorne: Granular synthesis, foley art, electronic textures.",
    "story": "A couple of experimental artists who record poetry in public spaces (train stations, parks, empty churches) to build cinematic soundscapes around the natural acoustics of the locations.",
    "links": {
      "spotify": "https://open.spotify.com/intl-fr/artist/26aKUmFxbCK0TK03mWbyQj?si=9ODhaj-uSVe_2JHxBXf_lw",
      "youtube": "https://www.youtube.com/@default-mood"
    },
    "releases": [
      { "title": "A Rose in Space", "format": "Album", "year": "2025", "status": "Sent to stores" }
    ]
  },
  {
    "id": 10,
    "name": "DIRT",
    "genre": "Indie grunge, raw 90s revival. Dirty guitars, heavy dynamics.",
    "location": "Seattle, WA",
    "members": "4 (The Grunge Revival)\n\nCaleb Cross: Vocals, rhythmic guitar.\nNate Reed: Lead guitar (heavy fuzz).\nMaya Jaxon: Bass.\nCrash Thompson: Heavy drums.",
    "story": "Pure 90s revival. They refuse digital plugins, opting for vintage tube amps and cracked cymbals to maintain a \"dirty\" sound faithful to the legacy of Alice in Chains and Nirvana.",
    "links": {
      "spotify": "https://open.spotify.com/intl-fr/artist/5Tf7ZRYVjaD8kBv1zBYJD4?si=6g_esbUySwSD3HH8TAJq6A",
      "youtube": "https://www.youtube.com/@Dirt-Band"
    },
    "releases": [
      { "title": "Sins and Secrets", "format": "Album", "year": "2025", "status": "Sent to stores" }
    ]
  },
  {
    "id": 11,
    "name": "ETHERLOOM",
    "genre": "Math-rock (melodic). Bright twin clean guitars, odd meters.",
    "location": "Austin, TX",
    "members": "3 (The Math Trio)\n\nLiam Park: Guitares (tapping), clean tones.\nSasha Volkov: Technical drums, complex percussion.\nRiley Brooks: Bass (clean & melodic).",
    "story": "Melodic and luminous math-rock. They focus on the \"Calculus of Clouds\": complex rhythms that remain light and airy, recorded in high-ceilinged rooms to capture a natural shimmer.",
    "links": {
      "spotify": "https://open.spotify.com/intl-fr/artist/2NS0OM3mHUZl9MPeUUC4Of?si=jsy58amHRnimZIPy59vCkA",
      "youtube": "https://www.youtube.com/@Etherloom-Band"
    },
    "releases": [
      { "title": "Mare Siderum", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Calculus of Clouds", "format": "Album", "year": "2026", "status": "In review" }
    ]
  },
  {
    "id": 12,
    "name": "FONK",
    "genre": "Electro-funk, talkbox, DX7 chords, late-night sensual grooves.",
    "location": "Paris, France",
    "members": "3 (The French Touch)\n\nMarc Valois: Talkbox, DX7, production.\nGilles Fontaine: Slap bass.\nNoémie Beaumont: Vocals and synthesizers.",
    "story": "A love letter to 80s electro-funk. They use the \"Kiss Compressor,\" a custom-built rack unit that gives their tracks a sensual late-night pumping effect.",
    "links": {
      "spotify": "https://open.spotify.com/intl-fr/artist/79JQ9chfLtJxIZxQ93UYFG?si=kjq5EIclQuKEw5M4lVVfUw",
      "youtube": "https://www.youtube.com/@fonkofficiel"
    },
    "releases": [
      { "title": "Beta Funk", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Analog Seduction", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Kiss Compressor", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "The Light", "format": "Album", "year": "2026", "status": "" }
    ]
  },
  {
    "id": 13,
    "name": "GOA",
    "genre": "Ritualistic psytrance, mythic themes (Athena/Satan), high-tech ritual.",
    "location": "Germany",
    "members": "1 (The Shaman)\n\nZiv Astra-Cohen: Production, ritualistic percussion.",
    "story": "High-tech ritual music. Each album is dedicated to a deity, using ancient mantras sampled and processed through psytrance structures to create a mystic dance energy.",
    "links": {
      "spotify": "https://open.spotify.com/intl-fr/artist/1gSJg24KmqcqGLM8LdIYqd?si=Xi9izW1jRBWylEloBr8iDA",
      "youtube": "https://www.youtube.com/@GOAdj"
    },
    "releases": [
      { "title": "GOA", "format": "Album", "year": "2024", "status": "Sent to stores" },
      { "title": "Orbitando", "format": "Album", "year": "2024", "status": "Sent to stores" },
      { "title": "Psytrance", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Eastern Druid", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Terraform", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Allah", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Yhwh", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Jesus", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Thor", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Brahma", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Ahura Mazda", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Tao", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Viracocha", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Satan", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Waheguru", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Amma", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Athena", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "RA", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Shiva", "format": "Album", "year": "2026", "status": "Sent to stores" }
    ]
  },
  {
    "id": 14,
    "name": "GOOD MORNING TAPES",
    "genre": "Dawn ambient lo-fi, tape hiss,chill beats, lo-fi, morning sketches.",
    "location": "Vancouver, Canada",
    "members": "4 (Collective)\n\nSam Low: Tape loops, SP-404, Rhodes.\nMiles Dubois: Ambient synths.\nSarah Kinsley: Electric guitar (ambient swells).\nOliver Reed: Lo-fi rhythms.",
    "story": "Morning sketches recorded as the sun rises. The group uses worn-out cassettes to record \"dawn ambient,\" rich in hiss and perfect for a gentle wake-up.",
    "links": {
      "spotify": "https://open.spotify.com/intl-fr/artist/7xePsnfXkcl17U0zdfHP8M?si=btngK_oPQ0egySS2OPNb3w",
      "youtube": "https://www.youtube.com/@goodmorningtapes"
    },
    "releases": [
      { "title": "Morning I", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Morning II", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Morning III", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Night I", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Morning IV", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Night II", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Morning V", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Morning VI", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Morning VII", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Good Morning Playlist : Vol 1", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Good Morning Playlist : Vol 2", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Morning VIII", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Night III", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Good Morning Playlist, Vol. 3", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Morning IX", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Good Morning Playlist : Vol 4", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Good Morning Playlist : Vol 5", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Morning X", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Good Morning Playlist : Vol 6", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Night IV", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Morning XI", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Good Morning Playlist : Vol 7", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Morning XII", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Good Morning Playlist : Vol 8", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Morning XIII", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Good Morning Playlist : Vol 9", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Morning XIV", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Good Morning Playlist : Vol 10", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Morning XV", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Night V", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Good Morning Playlist : Vol 11", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Morning XVI", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Good Morning Playlist : Vol 12", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Morning XVII", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Good Morning Playlist : Vol 13", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Morning XVIII", "format": "Album", "year": "2026", "status": "Sent to stores" },
      { "title": "Good Morning Playlist : Vol 14", "format": "Album", "year": "2026", "status": "Sent to stores" },
      { "title": "Night VI", "format": "Album", "year": "2026", "status": "Sent to stores" },
      { "title": "Morning XIX", "format": "Album", "year": "2026", "status": "In review" }
    ]
  },
  {
    "id": 15,
    "name": "LAGOS AFROHEAT",
    "genre": "Afrobeats / Afrobeat party project; Amapiano-friendly.",
    "location": "Lagos, Nigeria",
    "members": "1 (Producer) + Guests\n\nEmeka Okafor: Production, vocals.",
    "story": "The pulse of modern Nigeria. Emeka blends Amapiano log-drums with traditional Afrobeats rhythms, bridging the gap between Lagos street culture and London clubs.",
    "links": {
      "spotify": "https://open.spotify.com/intl-fr/artist/11CYrJJWTeEYC4ryVZoGtQ?si=HcDCtijXSbuu2FiwQD8-QQ",
      "youtube": "https://www.youtube.com/@LagosAfroHeat"
    },
    "releases": [
      { "title": "Summer Afrobeats : Vol 1", "format": "Single", "year": "2025", "status": "Sent to stores" },
      { "title": "Lagos to London", "format": "Album", "year": "2026", "status": "Sent to stores" }
    ]
  },
  {
    "id": 16,
    "name": "LILT",
    "genre": "Shoegaze. Gauzy stereo glide guitars, soft vocals.",
    "location": "Portland, OR",
    "members": "4 (The Shoegazers)\n\nSophie Gray: Vocals, guitar drenched in reverb.\nFinn O'Connell: Lead guitar (stereo glide).\nChloe Marsden: Bass.\nAris Thorne: Drums.",
    "story": "A vaporous wall of sound. Masters of the pedalboard, they create dream-pop where the vocals are just buried enough to feel like a distant memory.",
    "links": {
      "spotify": "https://open.spotify.com/intl-fr/artist/0nzJIQW2bhE2aNy6bSmX40?si=CPUHFVAFQFOD6yXVChR4nw",
      "youtube": "https://www.youtube.com/@Lilt-Band"
    },
    "releases": [
      { "title": "Bliss", "format": "Album", "year": "2025", "status": "Sent to stores" }
    ]
  },
  {
    "id": 17,
    "name": "LUMARA",
    "genre": "Dark trap-pop, 'dollcorpse' aesthetic, haunted vocals, cinematic.",
    "location": "France",
    "members": "1 (Solo)\n\nAdèle Parmentier: Vocals, production, \"noir\" soundscapes.",
    "story": "Haunted and dark trap-pop. Recorded in a supposedly haunted studio in the French Quarter, her music blends cinematic soul with heavy dub-influenced bass.",
    "links": {
      "spotify": "https://open.spotify.com/intl-fr/artist/6i9QStVQpIoKlBl62IKX2v?si=YqO69USbTDit9ZJwehGShg",
      "youtube": "https://www.youtube.com/@Lumara-Music"
    },
    "releases": [
      { "title": "Lumara", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Dollcorpse", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Earth", "format": "Album", "year": "2026", "status": "Sent to stores" }
    ]
  },
  {
    "id": 18,
    "name": "LYMPHATICS",
    "genre": "Elemental ambient, 'Genomic/Aqua' themes, modular synthesis, liquid textures.",
    "location": "Manchester, UK",
    "members": "4 (The Lab)\n\nDr. Felix Thorne: Guitars, organ.\nNurse Jasmine Reed: Bass, synths.\nWilliam \"Patient\" Hayes: Percussion.\nDr. Aris Vance: Sound design, oscillators.",
    "story": "Space-rock with an anatomical obsession. Their albums bear the names of physiological processes, creating a \"visceral\" psychedelic rock that feels like a journey through the human nervous system.",
    "links": {
      "spotify": "https://open.spotify.com/intl-fr/artist/4CO1bCrwP8FvAIYlytS79p?si=Ymu_OVeORI-OlQCdccPg1g",
      "youtube": "https://www.youtube.com/@lymphaticsband"
    },
    "releases": [
      { "title": "Appendicitis", "format": "Album", "year": "2024", "status": "Sent to stores" },
      { "title": "Dawn of a New Day", "format": "Album", "year": "2024", "status": "Sent to stores" },
      { "title": "Quest Of Time", "format": "Album", "year": "2024", "status": "Sent to stores" },
      { "title": "Goomba Grooves", "format": "Album", "year": "2024", "status": "Sent to stores" },
      { "title": "Pipe Dreams", "format": "Single", "year": "2024", "status": "Sent to stores" },
      { "title": "Hybrid Love", "format": "Album", "year": "2024", "status": "Sent to stores" },
      { "title": "Neuroflora", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Pyrophylaciorum", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Somatopause", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Mucosal Garden", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Aqua", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Appendagitis", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Genomic", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Lost Appendix", "format": "Album", "year": "2026", "status": "In review" }
    ]
  },
  {
    "id": 19,
    "name": "NAAFIRI",
    "genre": "Laid-back instrumental psych-funk with Egyptian/North-African modal color.",
    "location": "Cairo, Egypt",
    "members": "4 (The Collective)\n\nMustafa Safi: Electric Saz, Oud.\nLeyla Tarek: Vocals.\nDemir Celik: Psych-funk bass.\nSelim Kassem: Darbuka, drums.",
    "story": "Relaxed psych-funk using Egyptian modal scales. They create a \"desert-funk\" that evokes a 70s bazaar meeting a modern psychedelic dream.",
    "links": {
      "spotify": "https://open.spotify.com/intl-fr/artist/06AL9xvo7sbvnDtzMscERN?si=eEh3MngsTWe3G26CLMh04Q",
      "youtube": "https://www.youtube.com/@Naafiriband"
    },
    "releases": [
      { "title": "Sand of Time", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Oracle", "format": "Album", "year": "2025", "status": "Sent to stores" }
    ]
  },
  {
    "id": 20,
    "name": "PHONK GODZ",
    "genre": "Drift Phonk, Brazjlian phonk, brazilian funk, montagen, aura music, chill phonk",
    "location": "Germany",
    "members": "2 (The Bro Producers)\n\nLukas Void-Hager: Dark/Drift Phonk production.\nStefan Pulse-Hager: Brazilian Phonk rhythms, montage.",
    "story": "Two German brothers obsessed with global Phonk culture. They merge European technical precision with the raw energy of Brazilian funk and Memphis rap.",
    "links": {
      "spotify": "https://open.spotify.com/intl-fr/artist/0Is5JnMQGxek9GwQV4Zh0L?si=SEHJhFLrSvaSpaI6P3fYDg",
      "youtube": "https://www.youtube.com/@PhonkGodzz"
    },
    "releases": [
      { "title": "Começo", "format": "Ep", "year": "2025", "status": "Sent to stores" },
      { "title": "Mossiba", "format": "Ep", "year": "2025", "status": "Sent to stores" },
      { "title": "Sativa", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Jacinthe's Phonky Battle", "format": "Ep", "year": "2025", "status": "Sent to stores" },
      { "title": "D R I F T R A G E", "format": "Ep", "year": "2025", "status": "Sent to stores" },
      { "title": "B R A K E F A I L U R E", "format": "Ep", "year": "2025", "status": "Sent to stores" },
      { "title": "T O T A L E D", "format": "Ep", "year": "2025", "status": "Sent to stores" },
      { "title": "G A P P E D", "format": "Ep", "year": "2025", "status": "Sent to stores" },
      { "title": "N O P L A T E S", "format": "Ep", "year": "2025", "status": "Sent to stores" },
      { "title": "B L U R", "format": "Ep", "year": "2025", "status": "Sent to stores" },
      { "title": "Gym Godz", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "P a R a L L a X", "format": "Ep", "year": "2025", "status": "Sent to stores" },
      { "title": "S L O W M O T I O N", "format": "Ep", "year": "2025", "status": "Sent to stores" },
      { "title": "H E A D O N", "format": "Ep", "year": "2025", "status": "Sent to stores" },
      { "title": "R O L L C a G E", "format": "Ep", "year": "2025", "status": "Sent to stores" },
      { "title": "B R A K I N G Z O N E", "format": "Ep", "year": "2025", "status": "Sent to stores" },
      { "title": "S L I C K S", "format": "Ep", "year": "2025", "status": "Sent to stores" },
      { "title": "B L U E S M O K E", "format": "Ep", "year": "2025", "status": "Sent to stores" },
      { "title": "D E A T H W I S H", "format": "Ep", "year": "2025", "status": "Sent to stores" },
      { "title": "W I D E B O D Y", "format": "Ep", "year": "2025", "status": "Sent to stores" },
      { "title": "L E F T B E H I N D", "format": "Ep", "year": "2025", "status": "Sent to stores" },
      { "title": "P A T H E T I C", "format": "Ep", "year": "2025", "status": "Sent to stores" },
      { "title": "A P A T H Y", "format": "Ep", "year": "2025", "status": "Sent to stores" },
      { "title": "B O R I N G", "format": "Ep", "year": "2025", "status": "Sent to stores" },
      { "title": "N O R E A C T I O N", "format": "Ep", "year": "2025", "status": "Sent to stores" },
      { "title": "T R Y A G A I N", "format": "Ep", "year": "2025", "status": "Sent to stores" },
      { "title": "Lift Godz", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "U N I M P R E S S E D", "format": "Ep", "year": "2025", "status": "Sent to stores" },
      { "title": "D I S A P P E A R", "format": "Ep", "year": "2025", "status": "Sent to stores" },
      { "title": "Just a Memory", "format": "Ep", "year": "2025", "status": "Sent to stores" },
      { "title": "L O W L I F E", "format": "Ep", "year": "2025", "status": "Sent to stores" },
      { "title": "S I L E N T C I T Y", "format": "Ep", "year": "2025", "status": "Sent to stores" },
      { "title": "Montagem Do Capeta", "format": "Ep", "year": "2025", "status": "Sent to stores" },
      { "title": "R E W I N D", "format": "Ep", "year": "2025", "status": "Sent to stores" },
      { "title": "Sequência Do Maldito", "format": "Ep", "year": "2026", "status": "Sent to stores" },
      { "title": "Montagem De Puta", "format": "Ep", "year": "2026", "status": "Sent to stores" },
      { "title": "T I M E F L I E S", "format": "Ep", "year": "2026", "status": "Sent to stores" },
      { "title": "Submundo Do Professor", "format": "Ep", "year": "2026", "status": "Sent to stores" },
      { "title": "S T A T I C N O I S E", "format": "Ep", "year": "2026", "status": "Sent to stores" },
      { "title": "Mandelão Profano", "format": "Ep", "year": "2026", "status": "Sent to stores" },
      { "title": "N O S T A L G I A", "format": "Ep", "year": "2026", "status": "Sent to stores" },
      { "title": "E J E C T", "format": "Ep", "year": "2026", "status": "Sent to stores" },
      { "title": "Montagem Do Jingle Bell", "format": "Ep", "year": "2026", "status": "Sent to stores" },
      { "title": "B L I Z Z a R D", "format": "Ep", "year": "2026", "status": "In review" },
      { "title": "Bruxaria Tóxica", "format": "Ep", "year": "2026", "status": "Sent to stores" },
      { "title": "K R A M P U S", "format": "Ep", "year": "2026", "status": "Sent to stores" },
      { "title": "Automotivo Sangue", "format": "Ep", "year": "2026", "status": "Sent to stores" },
      { "title": "Maldito Velho", "format": "Ep", "year": "2026", "status": "Sent to stores" },
      { "title": "Montagem Fugada", "format": "Ep", "year": "2026", "status": "Sent to stores" },
      { "title": "Máscara Maldita", "format": "Ep", "year": "2026", "status": "In review" },
      { "title": "Malandragem", "format": "Ep", "year": "2026", "status": "In review" },
      { "title": "Qanun Funk", "format": "Ep", "year": "2026", "status": "In review" },
      { "title": "Tô Doidona", "format": "Ep", "year": "2026", "status": "Sent to stores" },
      { "title": "Gozolândia", "format": "Ep", "year": "2026", "status": "Sent to stores" },
      { "title": "Flex Godz", "format": "Album", "year": "2026", "status": "In review" }
    ]
  },
  {
    "id": 21,
    "name": "RAW TYPE BEATS",
    "genre": "rap instrumentals, MPC-driven, dusty boom-bap, unpolished grit, tape-saturated.",
    "location": "Oakland, CA",
    "members": "5 (The Architect)\n\nK-Raw (Khalid Reed): Production, MPC-3000 expert.\nAndre \"Smoke\" Burton: Sound design, drum programming.\nDerrick \"Cut\" Jones: Scratching, turntablism.\nJay-V (Jason Vaughn): Vinyl sampling.\nMitch Miller: Sound engineer (analog tape expert).",
    "story": "Dusty boom-bap recorded on high-end analog gear. This is \"Street Syntax\": beats designed for rappers who prioritize lyricism and the raw energy of the West Coast.",
    "links": {
      "spotify": "https://open.spotify.com/intl-fr/artist/1Wq42TNzXSQ4cEWn1Opwhi?si=rVr13wNoT4eIfEpkaBbzPQ",
      "youtube": "https://www.youtube.com/@RawTypeBeats"
    },
    "releases": [
      { "title": "Beats to Rap on : Vol. 1", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Beats to Rap on : Vol. 2", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Beats to Rap On: Vol. 3", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Hoodstrumentals", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Beats to Rap on : Vol. 4", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Street Syntax", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Beats to Rap on : Vol. 5", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Rap Tactics", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Tape Ghosts", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Beats to Rap on : Vol. 6", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Analog Archives", "format": "Album", "year": "2025", "status": "Sent to stores" }
    ]
  },
  {
    "id": 22,
    "name": "REDEMPTION DUB",
    "genre": "Peaceful lo-fi reggae. One-drop drum patterns, spring reverb.",
    "location": "Kingston, Jamaica",
    "members": "1 (The Dub-Master, Age 68)\n\nJah Roots Solomon: Bass, percussion, console mixing.",
    "story": "A dub veteran who refuses to go digital. At 68, he records on a 70s console, focusing on the \"One-drop\" rhythm and the warmth of spring reverbs.",
    "links": {
      "spotify": "https://open.spotify.com/intl-fr/artist/0rmaKbVstYT39el3j9SgDx?si=GqnAro3vQLeoKvKT6mZZPw",
      "youtube": "https://www.youtube.com/@RedemptionDub"
    },
    "releases": [
      { "title": "Distant Vibes", "format": "Album", "year": "2025", "status": "Sent to stores" }
    ]
  },
  {
    "id": 23,
    "name": "RODEO COUNTY",
    "genre": "Cowboy-style country. Road-trip narratives, acoustic feel.",
    "location": "Nashville, TN",
    "members": "2 (The Outlaws)\n\nHank Miller: Lead vocals, acoustic guitar.\nClementine Moss: Fiddle, backing vocals.",
    "story": "Travel tales for modern cowboys. They play \"backroad country\": raw, acoustic, and deeply rooted in Southern US storytelling.",
    "links": {
      "spotify": "https://open.spotify.com/intl-fr/artist/5k3V3ERVAS7Zj0I7yZNpcu?si=poLgJnEMS-S5bNLldxOvaQ",
      "youtube": "https://www.youtube.com/@RodeoCounty"
    },
    "releases": [
      { "title": "Two Weeks of Backroads", "format": "Album", "year": "2025", "status": "Sent to stores" }
    ]
  },
  {
    "id": 24,
    "name": "ROYAL BLUES BROTHERS",
    "genre": "Raw, live harmonica blues, train-whistle shuffles, whiskey blues, blues.",
    "location": "Chicago / Mississippi Delta",
    "members": "2 (The Blues Duo)\n\nBilly Royal: Harmonica, vocals.\nJaxson Royal: Electric guitar (BB King style).",
    "story": "Raw, whiskey-soaked blues. They record in a single take, often in roadside bars or on outdoor porches, to capture the essence of the \"Delta Blues Reserve.\"",
    "links": {
      "spotify": "https://open.spotify.com/intl-fr/artist/0GiPHryXy7yvDub4HuYTCt?si=oB0q9c1lRg64_jxreT9vhg",
      "youtube": "https://www.youtube.com/@RoyalBluesBrothers"
    },
    "releases": [
      { "title": "Cold Gin", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Train Back Home", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Delta Blues Reserve", "format": "Album", "year": "2026", "status": "Sent to stores" }
    ]
  },
  {
    "id": 25,
    "name": "SAFFRON",
    "genre": "Anatolian rock, electric bağlama, desert-funk.",
    "location": "Tehran / London",
    "members": "6 (The Saffron)\n\nAzar Mansouri: Electric Bağlama (Saz), production.\nNavid Rezai: Desert-funk percussion, synths.\nDarya Niknam: Lead vocals.\nReza Sharifi: Bass.\nKaveh Yazdani: Additional percussion (Tombak).\nSara Hamidi: Nay flute.",
    "story": "A fusion of Anatolian rock and modern desert-funk. They bring Middle Eastern modal colors to the Western club scene for a sonic journey titled \"Tehran at 2 AM.\"",
    "links": {
      "spotify": "https://open.spotify.com/intl-fr/artist/4z6OfRrIcHfumY7ioxJx51?si=sTOKCEkzRQyWEEnhPTbzNQ",
      "youtube": "https://www.youtube.com/@Saffron_band"
    },
    "releases": [
      { "title": "Her Nefeste", "format": "Album", "year": "2024", "status": "Sent to stores" },
      { "title": "Ufuk", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "B'khour", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Tehran at 2Am", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Yeni Baştan", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Aşkımız", "format": "Album", "year": "2025", "status": "Sent to stores" }
    ]
  },
  {
    "id": 26,
    "name": "SAUVAGERIE FINE",
    "genre": "French trap/rap collective, dark and syncopated. Heavy 808s.",
    "location": "Marseille, France",
    "members": "3 (Marseille Collective)\n\nKenzo Belkacem: Rapper / Producer.\nSofiane Amara: Rapper.\nInès Ziani: Vocals / Rap.",
    "story": "A raw and unfiltered Marseille rap/trap collective. They represent the \"Marée Noire\" (Black Tide) of Marseille's streets: aggression, assumed vulgarity, and radical trap energy.",
    "links": {
      "spotify": "https://open.spotify.com/intl-fr/artist/5LLesKJKDU3SgXYkbJlFAB?si=omgtZxkfRsGKz--DN5Elkw",
      "youtube": "https://www.youtube.com/@SauvagerieFine"
    },
    "releases": [
      { "title": "Marée noire", "format": "Album", "year": "2025", "status": "Sent to stores" }
    ]
  },
  {
    "id": 27,
    "name": "SILK BREAKS",
    "genre": "Drum n bass",
    "location": "Bristol, UK",
    "members": "1 (Solo)\n\nBenji \"Silk\" Harrison: Production, jungle breakbeat science.",
    "story": "Atmospheric Drum n' Bass. Benji specializes in \"liquid rollers\": silky D&B blending ultra-fast breaks with lush jazz textures.",
    "links": {
      "spotify": "https://open.spotify.com/intl-fr/artist/2kQNFF6BmTncS0F3ThbAbp?si=5uNlvN1ATnubUQYlgmeC0w",
      "youtube": "https://www.youtube.com/@SilkBreaks"
    },
    "releases": [
      { "title": "Jungle", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Rollers", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Atmospheric", "format": "Album", "year": "2025", "status": "Sent to stores" }
    ]
  },
  {
    "id": 28,
    "name": "SIN TESTIGOS",
    "genre": "Latin urbano × corridos tumbados × reggaetón-pop. Borderlands mood.",
    "location": "Culiacán, Mexico",
    "members": "3 (The Corridos Trio)\n\nMateo Estrada: Lead vocals, 12-string guitar (Requinto).\nPaco Morales: Bass (Tuba / Tololoche).\nElena Silva: Rhythmic guitar, backing vocals.",
    "story": "\"Without Witnesses.\" They play modern Corridos mixed with Latin Trap themes. It's the sound of the street: fast guitars, urban storytelling, and an underground reputation.",
    "links": {
      "spotify": "https://open.spotify.com/intl-fr/artist/3dehJMWdT6bhz3sYtQJmPL?si=JbtcGW6HSuG_Y2GOvjimyg",
      "youtube": "https://www.youtube.com/@Sin-Testigos"
    },
    "releases": [
      { "title": "No Lo Digas Fuerte", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Solitaria", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Tierra De Nadie", "format": "Album", "year": "2026", "status": "In review" }
    ]
  },
  {
    "id": 29,
    "name": "TWOSTEP TAPES",
    "genre": "2-step UK Garage with sample-based/white-label ethos.",
    "location": "London, UK",
    "members": "2 (Duo)\n\nArchie Grant: Production, 2-step garage.\nJoey Bishop: MC / Additional vocals, drum programming.",
    "story": "Dedicated to the soul of UK Garage on acetate. Archie cuts his own dubplates and uses 90s samplers to get that specific shuffle that defined the London underground.",
    "links": {
      "spotify": "https://open.spotify.com/intl-fr/artist/6Jj3Y3oKGaxBtNJQJjObV1?si=c_rqU0neST2qYmyPKKhzHg",
      "youtube": "https://www.youtube.com/@TwoStepTapes"
    },
    "releases": [
      { "title": "The Charm", "format": "Album", "year": "2025", "status": "Sent to stores" },
      { "title": "Acetate Soul", "format": "Album", "year": "2026", "status": "In review" }
    ]
  }
];

export default function App() {
  const [selectedArtist, setSelectedArtist] = useState(ARTIST_DATA[0]);
  const [searchTerm, setSearchTerm] = useState('');
  const [isSidebarOpen, setIsSidebarOpen] = useState(true);
  const [activeTab, setActiveTab] = useState('bio'); // bio, discography

  // Filter artists
  const filteredArtists = useMemo(() => {
    return ARTIST_DATA.filter(artist => 
      artist.name.toLowerCase().includes(searchTerm.toLowerCase())
    );
  }, [searchTerm]);

  const toggleSidebar = () => setIsSidebarOpen(!isSidebarOpen);

  return (
    <div className="flex h-screen bg-neutral-900 text-neutral-100 font-sans overflow-hidden">
      
      {/* SIDEBAR */}
      <div 
        className={`${isSidebarOpen ? 'w-80' : 'w-0'} transition-all duration-300 bg-neutral-950 border-r border-neutral-800 flex flex-col relative`}
      >
        <div className="p-4 border-b border-neutral-800 flex items-center justify-between">
          <div className="font-bold text-xl tracking-tighter flex items-center gap-2">
            <Disc className="w-6 h-6 text-emerald-500" />
            <span>ROSTER</span>
          </div>
        </div>

        {/* Search */}
        <div className="p-4">
          <div className="relative">
            <Search className="w-4 h-4 absolute left-3 top-3 text-neutral-500" />
            <input 
              type="text" 
              placeholder="Filter artists..." 
              value={searchTerm}
              onChange={(e) => setSearchTerm(e.target.value)}
              className="w-full bg-neutral-900 border border-neutral-800 rounded-full py-2 pl-10 pr-4 text-sm focus:outline-none focus:border-emerald-500 transition-colors"
            />
          </div>
        </div>

        {/* Artist List */}
        <div className="flex-1 overflow-y-auto scrollbar-thin scrollbar-thumb-neutral-800">
          {filteredArtists.map(artist => (
            <button
              key={artist.id}
              onClick={() => {
                setSelectedArtist(artist);
                // On mobile we might want to close sidebar, keeping it open for now
              }}
              className={`w-full text-left px-6 py-4 border-b border-neutral-900 hover:bg-neutral-900 transition-colors flex flex-col gap-1 group ${
                selectedArtist.id === artist.id ? 'bg-neutral-900 border-l-4 border-l-emerald-500 pl-5' : 'pl-6'
              }`}
            >
              <span className={`font-medium truncate ${selectedArtist.id === artist.id ? 'text-emerald-400' : 'text-neutral-300 group-hover:text-white'}`}>
                {artist.name}
              </span>
              <span className="text-xs text-neutral-500 truncate">{artist.location}</span>
            </button>
          ))}
          
          {filteredArtists.length === 0 && (
            <div className="p-8 text-center text-neutral-600 text-sm">
              No artists found.
            </div>
          )}
        </div>
      </div>

      {/* MAIN CONTENT */}
      <div className="flex-1 flex flex-col min-w-0 bg-neutral-900">
        
        {/* Mobile Sidebar Toggle (Visible only when sidebar is closed or on mobile logic if implemented) */}
        {!isSidebarOpen && (
           <button 
             onClick={toggleSidebar}
             className="absolute top-4 left-4 z-20 p-2 bg-neutral-800 rounded-md hover:bg-neutral-700"
           >
             <Menu className="w-5 h-5" />
           </button>
        )}

        {/* Header */}
        <header className="h-64 relative shrink-0">
          <div className="absolute inset-0 bg-gradient-to-b from-neutral-800 to-neutral-900 z-0">
             {/* Abstract pattern or image could go here */}
             <div className="w-full h-full opacity-10 bg-[radial-gradient(ellipse_at_top,_var(--tw-gradient-stops))] from-emerald-900 via-neutral-900 to-neutral-900"></div>
          </div>
          
          <div className="relative z-10 h-full flex flex-col justify-end p-8 pb-6">
            <div className="flex items-center gap-2 mb-2">
               {isSidebarOpen && (
                <button onClick={toggleSidebar} className="mr-2 text-neutral-400 hover:text-white">
                  <Menu className="w-5 h-5" />
                </button>
               )}
               <span className="px-2 py-0.5 rounded text-[10px] font-bold tracking-wider uppercase bg-emerald-500/10 text-emerald-400 border border-emerald-500/20">
                 {selectedArtist.releases.length} Releases
               </span>
               <span className="flex items-center gap-1 text-xs text-neutral-400">
                 <MapPin className="w-3 h-3" /> {selectedArtist.location}
               </span>
            </div>
            
            <h1 className="text-5xl md:text-7xl font-black tracking-tighter text-white mb-2">
              {selectedArtist.name}
            </h1>
            
            <p className="text-neutral-400 max-w-2xl text-sm md:text-base font-light">
              {selectedArtist.genre}
            </p>
          </div>
        </header>

        {/* Toolbar / Tabs */}
        <div className="px-8 border-b border-neutral-800 flex items-center justify-between bg-neutral-900 sticky top-0 z-10">
          <div className="flex gap-6">
            <button 
              onClick={() => setActiveTab('bio')}
              className={`py-4 text-sm font-medium border-b-2 transition-colors flex items-center gap-2 ${activeTab === 'bio' ? 'border-emerald-500 text-white' : 'border-transparent text-neutral-500 hover:text-neutral-300'}`}
            >
              <BookOpen className="w-4 h-4" /> Biography
            </button>
            <button 
              onClick={() => setActiveTab('discography')}
              className={`py-4 text-sm font-medium border-b-2 transition-colors flex items-center gap-2 ${activeTab === 'discography' ? 'border-emerald-500 text-white' : 'border-transparent text-neutral-500 hover:text-neutral-300'}`}
            >
              <Music className="w-4 h-4" /> Discography
            </button>
          </div>

          <div className="flex items-center gap-2">
            {selectedArtist.links.spotify && (
              <a 
                href={selectedArtist.links.spotify} 
                target="_blank" 
                rel="noreferrer"
                className="p-2 hover:bg-neutral-800 rounded-full text-[#1DB954] transition-colors"
                title="Open Spotify"
              >
                <PlayCircle className="w-6 h-6" />
              </a>
            )}
            {selectedArtist.links.youtube && (
              <a 
                href={selectedArtist.links.youtube} 
                target="_blank" 
                rel="noreferrer"
                className="p-2 hover:bg-neutral-800 rounded-full text-[#FF0000] transition-colors"
                title="Open YouTube"
              >
                <Youtube className="w-6 h-6" />
              </a>
            )}
          </div>
        </div>

        {/* Content Area */}
        <div className="flex-1 overflow-y-auto p-8">
          
          {activeTab === 'bio' && (
            <div className="max-w-4xl animate-in fade-in slide-in-from-bottom-4 duration-500">
              <div className="grid md:grid-cols-3 gap-8">
                {/* Main Story */}
                <div className="md:col-span-2 space-y-6">
                  <h3 className="text-lg font-bold text-white flex items-center gap-2">
                    The Story
                  </h3>
                  <div className="prose prose-invert prose-sm text-neutral-300 leading-relaxed whitespace-pre-line">
                    {selectedArtist.story}
                  </div>
                </div>

                {/* Side Panel: Members */}
                <div className="bg-neutral-950 p-6 rounded-lg border border-neutral-800 h-fit">
                  <h3 className="text-sm font-bold text-neutral-400 uppercase tracking-widest mb-4 flex items-center gap-2">
                    <Users className="w-4 h-4" /> Personnel
                  </h3>
                  <div className="text-sm text-neutral-300 whitespace-pre-line leading-relaxed">
                    {selectedArtist.members}
                  </div>
                </div>
              </div>
            </div>
          )}

          {activeTab === 'discography' && (
            <div className="max-w-5xl animate-in fade-in slide-in-from-bottom-4 duration-500">
              <div className="overflow-hidden rounded-lg border border-neutral-800">
                <table className="w-full text-left text-sm">
                  <thead className="bg-neutral-950 text-neutral-400 uppercase tracking-wider text-xs">
                    <tr>
                      <th className="px-6 py-4 font-medium">Title</th>
                      <th className="px-6 py-4 font-medium">Format</th>
                      <th className="px-6 py-4 font-medium">Year</th>
                      <th className="px-6 py-4 font-medium text-right">Status</th>
                    </tr>
                  </thead>
                  <tbody className="divide-y divide-neutral-800 bg-neutral-900/50">
                    {selectedArtist.releases.map((release, idx) => (
                      <tr key={idx} className="hover:bg-neutral-800/50 transition-colors group">
                        <td className="px-6 py-4 font-medium text-white group-hover:text-emerald-400 transition-colors">
                          {release.title}
                        </td>
                        <td className="px-6 py-4 text-neutral-400">
                          <span className={`px-2 py-1 rounded text-[10px] uppercase font-bold border ${
                            release.format === 'Album' 
                              ? 'bg-purple-500/10 text-purple-400 border-purple-500/20' 
                              : release.format === 'Single' 
                              ? 'bg-blue-500/10 text-blue-400 border-blue-500/20'
                              : 'bg-orange-500/10 text-orange-400 border-orange-500/20'
                          }`}>
                            {release.format}
                          </span>
                        </td>
                        <td className="px-6 py-4 text-neutral-400 font-mono">
                          {release.year}
                        </td>
                        <td className="px-6 py-4 text-right">
                          <span className={`inline-flex items-center px-2 py-0.5 rounded text-xs font-medium ${
                            release.status === 'Sent to stores' 
                              ? 'text-emerald-400' 
                              : 'text-amber-400'
                          }`}>
                            {release.status === 'Sent to stores' ? '● Live' : '○ In Review'}
                          </span>
                        </td>
                      </tr>
                    ))}
                    {selectedArtist.releases.length === 0 && (
                      <tr>
                        <td colSpan={4} className="px-6 py-8 text-center text-neutral-500 italic">
                          No releases found in the catalog.
                        </td>
                      </tr>
                    )}
                  </tbody>
                </table>
              </div>
            </div>
          )}
        </div>
      </div>
    </div>
  );
}

Créé il y a 6 jours.

Rechercher un Pastebin

Aucun paste trouvé.