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>
);
}