/* ============================================================
   § 1 · DESIGN TOKENS & CSS CUSTOM PROPERTIES
============================================================ */
:root {
    /* Color Palette */
    --c-black:         #080808;
    --c-black-pure:    #000000;
    --c-charcoal-deep: #0d0d0d;
    --c-charcoal:      #141414;
    --c-charcoal-mid:  #1a1a1a;
    --c-charcoal-light:#232323;
    --c-gold:          #c2a04e;
    --c-gold-bright:   #d4b565;
    --c-gold-dim:      rgba(194,160,78,.10);
    --c-gold-border:   rgba(194,160,78,.18);
    --c-gold-glow:     rgba(194,160,78,.04);
    --c-white:         #ede9df;
    --c-white-70:      rgba(237,233,223,.70);
    --c-white-50:      rgba(237,233,223,.50);
    --c-white-30:      rgba(237,233,223,.30);
    --c-white-15:      rgba(237,233,223,.15);
    --c-white-08:      rgba(237,233,223,.08);
    --c-white-04:      rgba(237,233,223,.04);

    /* Typography */
    --ff-display: 'Bebas Neue', sans-serif;
    --ff-serif:   'Cormorant Garamond', serif;
    --ff-body:    'Inter', sans-serif;

    /* Easing */
    --ease-smooth:  cubic-bezier(.25,.46,.45,.94);
    --ease-out:     cubic-bezier(.16,1,.3,1);
    --t-fast:  .25s;
    --t-med:   .5s;
    --t-slow:  .85s;

    /* Layout */
    --container:   1300px;
    --gutter:      clamp(1.25rem,4vw,4rem);
    --section-y:   clamp(4rem,8vw,9rem);
}

/* ============================================================
   § 2 · RESET & BASE
============================================================ */
*, *::before, *::after { margin:0; padding:0; box-sizing:border-box; }
html { scroll-behavior:smooth; overflow-x:hidden; font-size:16px; }
body {
    font-family: var(--ff-body);
    background:  var(--c-black);
    color:       var(--c-white);
    overflow-x:  hidden;
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
    line-height: 1.6;
}
::selection { background:var(--c-gold); color:var(--c-black); }
::-webkit-scrollbar       { width:4px; }
::-webkit-scrollbar-track  { background:var(--c-black); }
::-webkit-scrollbar-thumb  { background:var(--c-gold); border-radius:2px; }
img, video { max-width:100%; display:block; }
a    { text-decoration:none; color:inherit; }
ul   { list-style:none; }
button { cursor:pointer; border:none; background:none; font-family:inherit; }

/* ============================================================
   § 3 · LAYOUT UTILITIES
============================================================ */
.container {
    width:100%; max-width:var(--container);
    margin:0 auto;
    padding-left:var(--gutter); padding-right:var(--gutter);
}
.section-pad { padding-top:var(--section-y); padding-bottom:var(--section-y); }
.sep {
    width:100%; height:1px;
    background:linear-gradient(to right,transparent,var(--c-gold-border),transparent);
}

/* ============================================================
   § 4 · TYPOGRAPHY UTILITIES
============================================================ */
.u-label {
    display:block; font-family:var(--ff-body);
    font-size:.6rem; font-weight:400;
    letter-spacing:.42rem; text-transform:uppercase;
    color:var(--c-gold); margin-bottom:.7rem;
}
.u-divider {
    width:42px; height:1px;
    background:var(--c-gold); opacity:.5; margin-bottom:1.6rem;
}
.u-title {
    font-family:var(--ff-display);
    font-size:clamp(2.2rem,4.5vw,3.8rem);
    letter-spacing:.1rem; line-height:1;
    color:var(--c-white); margin-bottom:.3rem;
}
.u-subtitle {
    font-family:var(--ff-serif);
    font-size:clamp(.9rem,1.4vw,1.15rem);
    font-style:italic; font-weight:300;
    color:var(--c-white-50); margin-bottom:3rem;
}

/* ============================================================
   § 5 · BUTTON COMPONENTS
============================================================ */
.btn {
    display:inline-flex; align-items:center; justify-content:center;
    padding:.8rem 1.9rem;
    font-family:var(--ff-body); font-size:.58rem; font-weight:400;
    letter-spacing:.26rem; text-transform:uppercase;
    transition:all var(--t-med) var(--ease-smooth);
    white-space:nowrap;
}
.btn--gold  { border:1px solid var(--c-gold-border); color:var(--c-gold); }
.btn--gold:hover  { background:var(--c-gold); color:var(--c-black); border-color:var(--c-gold); }
.btn--ghost { border:1px solid var(--c-white-15); color:var(--c-white-50); }
.btn--ghost:hover { border-color:var(--c-white-70); color:var(--c-white); }

/* ============================================================
   § 6 · CINEMATIC VISUAL SLOT COMPONENT
============================================================ */
.vis-slot {
    position:relative; width:100%; height:100%; overflow:hidden;
}
.vis-slot img,
.vis-slot video {
    position:absolute; inset:0;
    width:100%; height:100%; object-fit:cover; z-index:2;
}
.vis-art  { position:absolute; inset:0; z-index:1; }
.vis-slot::after {
    content:''; position:absolute; inset:0; z-index:3;
    pointer-events:none; opacity:.055;
    background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 512 512' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
}

/* ============================================================
   § 7 · CSS ART BACKGROUNDS
============================================================ */
.art--hero { background:linear-gradient(170deg,#0a0a0a 0%,#111 35%,#0e0e0e 70%,#080808 100%); }
.art--hero::before {
    content:''; position:absolute; inset:0;
    background:
        radial-gradient(ellipse 60% 80% at 62% 85%,rgba(194,160,78,.07) 0%,transparent 60%),
        radial-gradient(ellipse 40% 60% at 58% 50%,rgba(194,160,78,.04) 0%,transparent 55%),
        radial-gradient(ellipse 20% 80% at 55% 100%,rgba(194,160,78,.12) 0%,transparent 40%);
    animation:artHeroPulse 8s ease-in-out infinite alternate;
}
@keyframes artHeroPulse { 0%{opacity:.6} 100%{opacity:1} }
.art--hero::after {
    content:''; position:absolute;
    bottom:0; left:50%; transform:translateX(-50%);
    width:clamp(160px,28vw,320px); height:clamp(280px,55vh,580px);
    background:linear-gradient(to top,rgba(194,160,78,.05) 0%,transparent 70%);
    mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 400'%3E%3Cellipse cx='100' cy='90' rx='42' ry='52'/%3E%3Cpath d='M38 400 Q30 260 60 210 Q80 185 100 180 Q120 185 140 210 Q170 260 162 400Z'/%3E%3C/svg%3E");
    -webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 400'%3E%3Cellipse cx='100' cy='90' rx='42' ry='52'/%3E%3Cpath d='M38 400 Q30 260 60 210 Q80 185 100 180 Q120 185 140 210 Q170 260 162 400Z'/%3E%3C/svg%3E");
    mask-size:contain; mask-repeat:no-repeat; mask-position:bottom center;
    -webkit-mask-size:contain; -webkit-mask-repeat:no-repeat; -webkit-mask-position:bottom center;
    filter:blur(2px);
}
.art--about { background:linear-gradient(145deg,#0c0c0c 0%,#181410 50%,#0a0a0a 100%); }
.art--about::before {
    content:''; position:absolute; inset:0;
    background:
        radial-gradient(ellipse 80% 60% at 30% 30%,rgba(194,160,78,.06) 0%,transparent 55%),
        radial-gradient(ellipse 50% 80% at 70% 90%,rgba(194,160,78,.04) 0%,transparent 50%),
        linear-gradient(180deg,transparent 0%,rgba(10,8,5,.6) 100%);
}
.art--about::after {
    content:''; position:absolute; top:10%; left:20%;
    width:3px; height:70%;
    background:linear-gradient(to bottom,transparent,rgba(194,160,78,.15),transparent);
    filter:blur(4px);
}
.art--cover-warm { background:linear-gradient(135deg,#0e0c0a 0%,#1a1208 40%,#0c0c0e 100%); }
.art--cover-warm::before {
    content:''; position:absolute; inset:0;
    background:
        radial-gradient(ellipse 70% 70% at 40% 60%,rgba(194,160,78,.09) 0%,transparent 55%),
        radial-gradient(ellipse 40% 40% at 80% 20%,rgba(194,160,78,.05) 0%,transparent 45%);
    animation:coverPulse 6s ease-in-out infinite alternate;
}
.art--cover-cool { background:linear-gradient(145deg,#0a0c10 0%,#0e1018 50%,#080808 100%); }
.art--cover-cool::before {
    content:''; position:absolute; inset:0;
    background:
        radial-gradient(ellipse 60% 80% at 60% 40%,rgba(100,120,180,.06) 0%,transparent 55%),
        radial-gradient(ellipse 80% 50% at 20% 80%,rgba(194,160,78,.04) 0%,transparent 50%);
    animation:coverPulse 7s ease-in-out infinite alternate;
}
.art--cover-deep { background:linear-gradient(160deg,#0c0e0c 0%,#101410 50%,#0a0a0a 100%); }
.art--cover-deep::before {
    content:''; position:absolute; inset:0;
    background:
        radial-gradient(ellipse 50% 90% at 50% 30%,rgba(194,160,78,.05) 0%,transparent 55%),
        radial-gradient(ellipse 90% 40% at 50% 100%,rgba(194,160,78,.07) 0%,transparent 50%);
    animation:coverPulse 8s ease-in-out infinite alternate;
}
.art--cover-dusk { background:linear-gradient(150deg,#0e0a0c 0%,#14090e 50%,#0a0808 100%); }
.art--cover-dusk::before {
    content:''; position:absolute; inset:0;
    background:
        radial-gradient(ellipse 65% 65% at 55% 45%,rgba(160,94,130,.07) 0%,transparent 55%),
        radial-gradient(ellipse 45% 70% at 25% 85%,rgba(194,160,78,.05) 0%,transparent 50%);
    animation:coverPulse 9s ease-in-out infinite alternate;
}
@keyframes coverPulse { 0%{opacity:.5} 100%{opacity:1} }
.art--g1{background:linear-gradient(135deg,#0a0a0a 0%,#161210 60%,#0e0c0a 100%);}
.art--g1::before{content:'';position:absolute;inset:0;background:radial-gradient(ellipse 60% 70% at 55% 60%,rgba(194,160,78,.08) 0%,transparent 55%),linear-gradient(to top,rgba(10,8,5,.5) 0%,transparent 50%);}
.art--g2{background:linear-gradient(160deg,#0c0c0e 0%,#101014 100%);}
.art--g2::before{content:'';position:absolute;inset:0;background:radial-gradient(ellipse 40% 60% at 45% 40%,rgba(194,160,78,.06) 0%,transparent 50%),radial-gradient(ellipse 80% 30% at 50% 100%,rgba(194,160,78,.05) 0%,transparent 45%);}
.art--g3{background:linear-gradient(180deg,#0e0c0a 0%,#141210 100%);}
.art--g3::before{content:'';position:absolute;inset:0;background:linear-gradient(135deg,rgba(194,160,78,.04) 0%,transparent 50%,rgba(194,160,78,.03) 100%);}
.art--g4{background:linear-gradient(145deg,#0a0e0a 0%,#0e120e 100%);}
.art--g4::before{content:'';position:absolute;inset:0;background:radial-gradient(ellipse 70% 70% at 50% 50%,rgba(194,160,78,.05) 0%,transparent 55%);}
.art--g5{background:linear-gradient(160deg,#0e0a0a 0%,#140e0e 100%);}
.art--g5::before{content:'';position:absolute;inset:0;background:radial-gradient(ellipse 50% 80% at 30% 70%,rgba(194,160,78,.06) 0%,transparent 50%);}
.art--g6{background:linear-gradient(135deg,#0c0c0a 0%,#161612 100%);}
.art--g6::before{content:'';position:absolute;inset:0;background:radial-gradient(ellipse 80% 50% at 60% 50%,rgba(194,160,78,.05) 0%,transparent 55%);}

.art-label {
    position:absolute; bottom:0; left:0; right:0; z-index:4;
    padding:3rem 1.2rem 1rem;
    background:linear-gradient(to top,rgba(8,8,8,.8) 0%,transparent 100%);
    opacity:0; transition:opacity var(--t-med);
}
.art-label span {
    font-size:.5rem; letter-spacing:.22rem;
    text-transform:uppercase; color:var(--c-gold);
}
.light-beam {
    position:absolute; pointer-events:none; z-index:2;
    background:linear-gradient(to bottom,transparent,rgba(194,160,78,.04),transparent);
    width:1px; filter:blur(3px);
}

/* ============================================================
   § 8 · PRELOADER
============================================================ */
.preloader {
    position:fixed; inset:0;
    background:var(--c-black-pure); z-index:99999;
    display:flex; flex-direction:column;
    align-items:center; justify-content:center;
    transition:opacity 1s ease .5s, visibility 1s ease .5s;
}
.preloader.is-done { opacity:0; visibility:hidden; pointer-events:none; }
.preloader__name {
    font-family:var(--ff-display);
    font-size:clamp(2rem,5vw,3.5rem);
    letter-spacing:1.5rem; color:var(--c-gold);
    animation:plBreathe 2s ease-in-out infinite;
}
.preloader__bar {
    width:40px; height:1px; background:var(--c-gold);
    margin-top:1.5rem;
    animation:plBar 2s ease-in-out infinite;
}
@keyframes plBreathe { 0%,100%{opacity:.2} 50%{opacity:1} }
@keyframes plBar     { 0%,100%{width:40px;opacity:.3} 50%{width:90px;opacity:1} }

/* ============================================================
   § 9 · NAVIGATION
============================================================ */
.nav {
    position:fixed; top:0; left:0; width:100%; z-index:9000;
    padding:1.4rem var(--gutter);
    display:flex; align-items:center; justify-content:space-between;
    transition:all var(--t-med) var(--ease-smooth);
}
.nav.is-scrolled {
    padding-top:.9rem; padding-bottom:.9rem;
    background:rgba(8,8,8,.95);
    backdrop-filter:blur(30px); -webkit-backdrop-filter:blur(30px);
    border-bottom:1px solid var(--c-white-04);
}
.nav__logo {
    font-family:var(--ff-display); font-size:1.3rem;
    letter-spacing:.5rem; color:var(--c-gold);
    transition:opacity var(--t-fast);
}
.nav__logo:hover { opacity:.6; }
.nav__menu { display:flex; gap:2.5rem; }
.nav__link {
    font-size:.6rem; font-weight:300;
    letter-spacing:.2rem; text-transform:uppercase;
    color:var(--c-white-50); position:relative;
    transition:color var(--t-fast);
}
.nav__link::after {
    content:''; position:absolute; bottom:-4px; left:0;
    width:0; height:1px; background:var(--c-gold);
    transition:width var(--t-med) var(--ease-smooth);
}
.nav__link:hover { color:var(--c-gold); }
.nav__link:hover::after { width:100%; }
.nav__burger {
    display:none; flex-direction:column;
    gap:5px; padding:4px; z-index:9001;
}
.nav__burger span {
    display:block; width:24px; height:1px; background:var(--c-gold);
    transition:all var(--t-med) var(--ease-smooth); transform-origin:center;
}
.nav__burger.is-open span:nth-child(1) { transform:rotate(45deg) translate(4px,4px); }
.nav__burger.is-open span:nth-child(2) { opacity:0; }
.nav__burger.is-open span:nth-child(3) { transform:rotate(-45deg) translate(4px,-4px); }

.mobile-menu {
    position:fixed; inset:0;
    background:rgba(8,8,8,.98); backdrop-filter:blur(40px);
    z-index:8999;
    display:flex; flex-direction:column;
    align-items:center; justify-content:center; gap:1.8rem;
    opacity:0; visibility:hidden;
    transition:all var(--t-med) ease;
}
.mobile-menu.is-open { opacity:1; visibility:visible; }
.mobile-menu a {
    font-family:var(--ff-display); font-size:2rem;
    letter-spacing:.5rem; color:var(--c-white);
    transition:color var(--t-fast);
}
.mobile-menu a:hover { color:var(--c-gold); }

/* ============================================================
   § 10 · HERO SECTION
============================================================ */
.hero {
    position:relative; width:100%; height:100vh; min-height:600px;
    display:flex; align-items:center; justify-content:center;
    overflow:hidden; text-align:center;
}
.hero__bg { position:absolute; inset:0; z-index:0; }
.hero__bg .vis-slot { opacity:.8; }
.hero__gradient {
    position:absolute; inset:0; z-index:2;
    background:linear-gradient(to bottom,
        rgba(8,8,8,.5) 0%, rgba(8,8,8,.1) 30%,
        rgba(8,8,8,.2) 65%, rgba(8,8,8,.96) 100%);
}
.hero__content {
    position:relative; z-index:3;
    display:flex; flex-direction:column; align-items:center;
    padding:0 var(--gutter); max-width:820px;
    opacity:0; animation:heroReveal 1.4s var(--ease-out) forwards;
}
@keyframes heroReveal {
    from { opacity:0; transform:translateY(30px); }
    to   { opacity:1; transform:translateY(0); }
}
.hero__topline {
    width:1px; height:45px;
    background:linear-gradient(to bottom,transparent,var(--c-gold));
    margin-bottom:1.8rem; opacity:.5;
}
.hero__name {
    font-family:var(--ff-display);
    font-size:clamp(3rem,9vw,7.5rem);
    letter-spacing:clamp(.6rem,2.5vw,2rem);
    line-height:.85; color:var(--c-white); margin-bottom:.5rem;
}
.hero__tagline {
    font-family:var(--ff-serif);
    font-size:clamp(.85rem,1.5vw,1.1rem);
    font-style:italic; font-weight:300;
    color:var(--c-gold); letter-spacing:.1rem; margin-bottom:.8rem;
}
.hero__roles {
    font-size:clamp(.48rem,.85vw,.62rem); font-weight:300;
    letter-spacing:.3rem; text-transform:uppercase;
    color:var(--c-white-50); margin-bottom:2.5rem;
}
.hero__roles span { color:rgba(237,233,223,.2); margin:0 .05rem; }
.hero__actions { display:flex; gap:.7rem; flex-wrap:wrap; justify-content:center; }
.hero__eq {
    position:absolute; bottom:2.5rem; left:50%; transform:translateX(-50%);
    z-index:4; display:flex; align-items:flex-end; gap:3px; height:22px; opacity:.18;
}
.eq-bar {
    width:1.5px; background:var(--c-gold); border-radius:1px;
    animation:eqPulse var(--eq-speed,1s) ease-in-out infinite;
    animation-delay:var(--eq-delay,0s);
}
@keyframes eqPulse { 0%,100%{height:2px} 50%{height:var(--eq-height,14px)} }
.hero__scroll {
    position:absolute; bottom:1.8rem; right:var(--gutter);
    z-index:4; display:flex; flex-direction:column; align-items:center; gap:.4rem;
}
.hero__scroll-text {
    writing-mode:vertical-rl; font-size:.5rem;
    letter-spacing:.18rem; text-transform:uppercase; color:var(--c-white-30);
}
.hero__scroll-line {
    width:1px; height:28px; background:var(--c-gold); opacity:.5;
    animation:scrollPulse 2.5s ease-in-out infinite;
}
@keyframes scrollPulse { 0%,100%{height:12px;opacity:.25} 50%{height:28px;opacity:.7} }

/* ============================================================
   § 11 · ABOUT SECTION
============================================================ */
.about { background:var(--c-black); }
.about__grid {
    display:grid; grid-template-columns:.85fr 1.15fr;
    gap:clamp(2rem,5vw,5rem); align-items:center;
}
.about__image-wrapper { position:relative; }
.about__frame {
    width:100%; aspect-ratio:3/4; position:relative;
    border:1px solid var(--c-white-04);
}
.about__corner {
    position:absolute; width:55px; height:55px; opacity:.35;
}
.about__corner--tl { top:-12px; left:-12px; border-top:1px solid var(--c-gold); border-left:1px solid var(--c-gold); }
.about__corner--br { bottom:-12px; right:-12px; border-bottom:1px solid var(--c-gold); border-right:1px solid var(--c-gold); }
.about__heading {
    font-family:var(--ff-serif);
    font-size:clamp(1.5rem,2.8vw,2.5rem);
    font-weight:300; line-height:1.2; color:var(--c-white); margin-bottom:1.5rem;
}
.about__text {
    font-size:.88rem; line-height:2;
    color:var(--c-white-50); font-weight:300; margin-bottom:.8rem;
}
.skill-tags { display:flex; flex-wrap:wrap; gap:.5rem; margin-top:2rem; }
.skill-tag {
    padding:.38rem .95rem;
    border:1px solid var(--c-gold-border);
    font-size:.52rem; letter-spacing:.18rem; text-transform:uppercase;
    color:var(--c-gold); transition:all var(--t-fast);
}
.skill-tag:hover { background:var(--c-gold-dim); border-color:var(--c-gold); }

/* ============================================================
   § 12 · RELEASES / MUSIC SECTION
============================================================ */
.releases { background:var(--c-charcoal-deep); }
.release-list { display:flex; flex-direction:column; gap:5rem; }
.release-card {
    display:grid; grid-template-columns:1fr 1.2fr;
    gap:clamp(1.5rem,4vw,4rem); align-items:center;
    opacity:0; transform:translateY(25px);
    transition:all var(--t-slow) var(--ease-smooth);
}
.release-card.is-visible { opacity:1; transform:translateY(0); }
.release-card:nth-child(even) { direction:rtl; }
.release-card:nth-child(even) > * { direction:ltr; }
.release-card__cover { position:relative; width:100%; aspect-ratio:1; overflow:hidden; }
.release-card__cover .vis-slot { transition:transform .7s var(--ease-smooth); }
.release-card:hover .release-card__cover .vis-slot { transform:scale(1.04); }
.release-card__play {
    position:absolute; top:50%; left:50%;
    transform:translate(-50%,-50%);
    width:50px; height:50px; border-radius:50%;
    border:1px solid var(--c-gold-border); background:rgba(8,8,8,.4);
    display:flex; align-items:center; justify-content:center;
    z-index:5; transition:all var(--t-med) var(--ease-smooth);
    cursor:pointer;
}
.release-card:hover .release-card__play {
    background:var(--c-gold); border-color:var(--c-gold);
    transform:translate(-50%,-50%) scale(1.1);
}
.release-card__play-icon {
    width:0; height:0; border-style:solid;
    border-width:6px 0 6px 10px;
    border-color:transparent transparent transparent var(--c-gold);
    margin-left:2px; transition:border-color var(--t-fast);
}
.release-card:hover .release-card__play-icon {
    border-color:transparent transparent transparent var(--c-black);
}
.release-card__watermark {
    position:absolute; bottom:1.2rem; left:1.2rem;
    font-family:var(--ff-serif); font-size:1rem;
    font-style:italic; font-weight:300; letter-spacing:.12rem;
    color:rgba(194,160,78,.12); pointer-events:none; z-index:4;
}
.release-card__badge {
    position:absolute; top:1rem; right:1rem;
    padding:.25rem .7rem;
    border:1px solid var(--c-gold-border);
    font-family:var(--ff-body); font-size:.42rem;
    letter-spacing:.18rem; text-transform:uppercase;
    color:var(--c-gold); background:rgba(8,8,8,.6); z-index:5;
}
.release-card__type {
    font-size:.5rem; letter-spacing:.3rem; text-transform:uppercase;
    color:var(--c-gold); font-weight:300; margin-bottom:.5rem;
}
.release-card__title {
    font-family:var(--ff-serif);
    font-size:clamp(1.6rem,2.8vw,2.5rem);
    font-weight:400; letter-spacing:.04rem; line-height:1.15;
    color:var(--c-white); margin-bottom:.5rem;
    transition:color var(--t-fast); text-transform:none;
}
.release-card:hover .release-card__title { color:var(--c-gold); }
.release-card__date {
    font-size:.52rem; letter-spacing:.15rem;
    color:var(--c-white-30); margin-bottom:.8rem; text-transform:uppercase;
}
.release-card__desc {
    font-family:var(--ff-serif); font-size:.97rem; line-height:1.75;
    color:var(--c-white-50); font-weight:300; margin-bottom:1.4rem;
}
.release-card__platforms { display:flex; gap:.5rem; flex-wrap:wrap; }
.platform-link {
    padding:.45rem 1rem; border:1px solid var(--c-white-08);
    font-family:var(--ff-body); font-size:.5rem;
    letter-spacing:.16rem; text-transform:uppercase;
    color:var(--c-white-50); transition:all var(--t-fast); display:inline-block;
}
.platform-link:hover { border-color:var(--c-gold); color:var(--c-gold); }
.release-card__wave { display:flex; align-items:center; gap:2px; height:20px; margin-top:1rem; opacity:.15; }
.wave-bar { width:1.5px; background:var(--c-gold); border-radius:1px; }

/* ============================================================
   § 13 · VISUALS / GALLERY SECTION
============================================================ */
.visuals { background:var(--c-black); }
.gallery-grid {
    display:grid;
    grid-template-columns:repeat(12,1fr);
    grid-auto-rows:220px; gap:.9rem;
}
.gallery-item { position:relative; overflow:hidden; cursor:pointer; }
.gallery-item:nth-child(1) { grid-column:1/8; grid-row:1/3; }
.gallery-item:nth-child(2) { grid-column:8/13; grid-row:1/2; }
.gallery-item:nth-child(3) { grid-column:8/13; grid-row:2/3; }
.gallery-item:nth-child(4) { grid-column:1/5; grid-row:3/4; }
.gallery-item:nth-child(5) { grid-column:5/9; grid-row:3/4; }
.gallery-item:nth-child(6) { grid-column:9/13; grid-row:3/4; }
.gallery-item:nth-child(n+7) { grid-column:span 4; }
.gallery-item .vis-slot { transition:transform .65s var(--ease-smooth); }
.gallery-item:hover .vis-slot { transform:scale(1.06); }
.gallery-item:hover .art-label { opacity:1; }

/* ============================================================
   § 14 · AUDIO EXPERIENCE SECTION
============================================================ */
.audio-exp { background:var(--c-charcoal-deep); }
.audio-exp__inner { display:flex; flex-direction:column; align-items:center; text-align:center; }
.audio-exp__list {
    display:flex; flex-wrap:wrap; justify-content:center;
    gap:clamp(3rem,6vw,6rem); margin-top:3rem; width:100%;
}
.audio-exp__item {
    display:flex; flex-direction:column; align-items:center; text-align:center;
}
.audio-exp__item .u-title {
    font-size:clamp(1.4rem, 2.5vw, 2rem); letter-spacing:0.15rem; margin-bottom:0.2rem;
}
.audio-exp__item .u-subtitle {
    margin-bottom:1.5rem; font-size:0.9rem;
}
.audio-exp__wave { display:flex; align-items:center; justify-content:center; gap:2px; height:45px; opacity:.15; }
.ambient-bar {
    width:1.5px; background:var(--c-gold); border-radius:1px;
    animation:ambientPulse var(--ab-speed,1.5s) ease-in-out infinite;
    animation-delay:var(--ab-delay,0s);
}
@keyframes ambientPulse { 0%,100%{height:2px} 50%{height:var(--ab-height,18px)} }
.audio-exp__orb {
    width:120px; height:120px; border-radius:50%;
    border:1px solid var(--c-gold-border);
    display:flex; align-items:center; justify-content:center;
    margin:2rem 0 1.2rem; cursor:pointer; position:relative;
    transition:all var(--t-med);
}
.audio-exp__orb::before,
.audio-exp__orb::after {
    content:''; position:absolute; border-radius:50%;
    border:1px solid rgba(194,160,78,.05); pointer-events:none;
}
.audio-exp__orb::before { width:165px; height:165px; animation:orbPulse 4s ease-in-out infinite; }
.audio-exp__orb::after  { width:210px; height:210px; animation:orbPulse 4s ease-in-out infinite .7s; }
@keyframes orbPulse { 0%,100%{transform:scale(1);opacity:1} 50%{transform:scale(1.05);opacity:.3} }
.audio-exp__orb:hover { border-color:var(--c-gold); box-shadow:0 0 60px rgba(194,160,78,.08); }
.audio-exp__icon { font-family:var(--ff-display); font-size:.85rem; letter-spacing:.2rem; color:var(--c-gold); }
.audio-exp__hint { font-size:.5rem; letter-spacing:.35rem; text-transform:uppercase; color:var(--c-white-30); }

/* ============================================================
   § 15 · SOCIAL SECTION
============================================================ */
.social { background:var(--c-black); }
.social__inner { text-align:center; }
.social__grid { display:flex; justify-content:center; flex-wrap:wrap; gap:.8rem; }
.social-card {
    display:flex; flex-direction:column; align-items:center; gap:.55rem;
    padding:1.4rem 1.1rem; border:1px solid var(--c-white-04);
    min-width:95px; position:relative; overflow:hidden;
    transition:all var(--t-med) var(--ease-smooth);
}
.social-card::before {
    content:''; position:absolute; bottom:0; left:0;
    width:100%; height:0; background:var(--c-gold-dim);
    transition:height var(--t-med);
}
.social-card:hover { border-color:var(--c-gold-border); transform:translateY(-3px); }
.social-card:hover::before { height:100%; }
.social-card__icon { position:relative; z-index:1; }
.social-card__icon svg { width:18px; height:18px; fill:var(--c-white-30); transition:fill var(--t-fast); }
.social-card:hover .social-card__icon svg { fill:var(--c-gold); }
.social-card__name {
    font-size:.46rem; letter-spacing:.2rem; text-transform:uppercase;
    color:var(--c-white-30); transition:color var(--t-fast); position:relative; z-index:1;
}
.social-card:hover .social-card__name { color:var(--c-gold); }

/* ============================================================
   § 16 · CONTACT SECTION
============================================================ */
.contact { background:var(--c-charcoal-deep); position:relative; overflow:hidden; }
.contact__ambient {
    position:absolute; inset:0; pointer-events:none;
    background:
        radial-gradient(ellipse at 50% 0%,rgba(194,160,78,.03) 0%,transparent 50%),
        radial-gradient(ellipse at 50% 100%,rgba(194,160,78,.02) 0%,transparent 40%);
}
.contact__inner {
    position:relative; z-index:1;
    display:flex; flex-direction:column; align-items:center; text-align:center;
}
.contact__heading {
    font-family:var(--ff-serif);
    font-size:clamp(1.6rem,3.5vw,2.8rem);
    font-weight:300; line-height:1.25; color:var(--c-white); margin-bottom:1.4rem;
}
.contact__desc {
    max-width:520px;
    font-family:var(--ff-serif); font-size:clamp(.88rem,1.3vw,1.05rem);
    font-weight:300; font-style:italic; line-height:1.9;
    color:var(--c-white-50); margin-bottom:2.5rem;
}
.contact__services { display:flex; flex-wrap:wrap; justify-content:center; gap:.6rem; margin-bottom:3rem; max-width:620px; }
.service-pill {
    padding:.55rem 1.4rem; border:1px solid var(--c-gold-border);
    font-family:var(--ff-body); font-size:.5rem; font-weight:400;
    letter-spacing:.22rem; text-transform:uppercase; color:var(--c-gold);
    transition:all var(--t-med) var(--ease-smooth); position:relative; overflow:hidden;
}
.service-pill::before {
    content:''; position:absolute; inset:0; background:var(--c-gold);
    transform:scaleX(0); transform-origin:left;
    transition:transform var(--t-med) var(--ease-smooth); z-index:0;
}
.service-pill span { position:relative; z-index:1; transition:color var(--t-med); }
.service-pill:hover::before { transform:scaleX(1); }
.service-pill:hover span { color:var(--c-black); }
.contact__divider { width:50px; height:1px; background:var(--c-gold); opacity:.3; margin-bottom:3rem; }
.contact__form-wrap { width:100%; max-width:560px; }

.form { display:flex; flex-direction:column; gap:1.6rem; }
.form__field { position:relative; }
.form__input,
.form__select,
.form__textarea {
    width:100%; padding:1rem 0;
    background:transparent; border:none;
    border-bottom:1px solid var(--c-white-08);
    color:var(--c-white); font-family:var(--ff-body);
    font-size:.82rem; font-weight:300; letter-spacing:.03rem;
    outline:none; transition:border-color var(--t-med) var(--ease-smooth);
    -webkit-appearance:none; appearance:none;
}
.form__select {
    cursor:pointer;
    background-image:url("data:image/svg+xml,%3Csvg width='10' height='6' viewBox='0 0 10 6' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M1 1l4 4 4-4' stroke='%23c2a04e' stroke-width='1' fill='none'/%3E%3C/svg%3E");
    background-repeat:no-repeat; background-position:right .2rem center; padding-right:1.5rem;
}
.form__select option { background:var(--c-charcoal); color:var(--c-white); }
.form__textarea { resize:vertical; min-height:100px; }
.form__input:focus,
.form__select:focus,
.form__textarea:focus { border-bottom-color:var(--c-gold); }
.form__label {
    position:absolute; top:1rem; left:0;
    font-size:.58rem; letter-spacing:.16rem; text-transform:uppercase;
    color:var(--c-white-30); pointer-events:none;
    transition:all var(--t-med) var(--ease-smooth);
}
.form__input:focus ~ .form__label,
.form__input:not(:placeholder-shown) ~ .form__label,
.form__textarea:focus ~ .form__label,
.form__textarea:not(:placeholder-shown) ~ .form__label {
    top:-.7rem; font-size:.45rem; color:var(--c-gold);
}

.form__reveal {
    overflow:hidden; max-height:0; opacity:0;
    transform:translateY(-6px); margin-top:0;
    transition:max-height .5s var(--ease-smooth), opacity .4s var(--ease-smooth),
                transform .4s var(--ease-smooth), margin .4s var(--ease-smooth);
}
.form__reveal.is-open { max-height:120px; opacity:1; transform:translateY(0); margin-top:1.2rem; }
.form__reveal .form__input { border-bottom-color:rgba(194,160,78,.12); }
.form__reveal .form__input:focus { border-bottom-color:var(--c-gold); }
.form__reveal .form__label { color:rgba(194,160,78,.5); }
.form__reveal .form__input:focus ~ .form__label,
.form__reveal .form__input:not(:placeholder-shown) ~ .form__label {
    top:-.7rem; font-size:.45rem; color:var(--c-gold);
}

.form__submit-wrap { display:flex; justify-content:center; margin-top:.5rem; }
.form__submit {
    padding:.9rem 2.8rem; border:1px solid var(--c-gold-border);
    background:transparent;
    font-family:var(--ff-body); font-size:.58rem; font-weight:400;
    letter-spacing:.3rem; text-transform:uppercase; color:var(--c-gold);
    cursor:pointer; transition:all var(--t-med) var(--ease-smooth);
    position:relative; overflow:hidden; min-width:200px;
}
.form__submit::before {
    content:''; position:absolute; inset:0; background:var(--c-gold);
    transform:scaleY(0); transform-origin:bottom;
    transition:transform var(--t-med) var(--ease-smooth); z-index:0;
}
.form__submit-text {
    position:relative; z-index:1; transition:color var(--t-med);
    display:flex; align-items:center; justify-content:center; gap:.5rem;
}
.form__submit:hover::before { transform:scaleY(1); }
.form__submit:hover .form__submit-text { color:var(--c-black); }
.form__submit:disabled { opacity:.5; pointer-events:none; }
.form__spinner {
    width:12px; height:12px; border-radius:50%;
    border:1px solid rgba(194,160,78,.3); border-top-color:var(--c-gold);
    animation:spin .8s linear infinite; display:none;
}
.form__submit.is-loading .form__spinner { display:block; }
.form__submit.is-loading .form__submit-label { display:none; }
@keyframes spin { to { transform:rotate(360deg); } }

.form-success {
    display:none; flex-direction:column; align-items:center;
    text-align:center; gap:1rem; padding:2.5rem 0;
    animation:successReveal .8s var(--ease-out) forwards;
}
.form-success.is-shown { display:flex; }
@keyframes successReveal {
    from { opacity:0; transform:translateY(15px); }
    to   { opacity:1; transform:translateY(0); }
}
.form-success__icon {
    width:50px; height:50px; border-radius:50%;
    border:1px solid var(--c-gold);
    display:flex; align-items:center; justify-content:center;
}
.form-success__icon svg { width:22px; height:22px; stroke:var(--c-gold); fill:none; stroke-width:2; }
.form-success__title { font-family:var(--ff-serif); font-size:1.2rem; font-weight:400; color:var(--c-gold); }
.form-success__text { font-size:.8rem; font-weight:300; color:var(--c-white-50); line-height:1.7; }

.form-error {
    display:none; align-items:center; justify-content:center;
    gap:.6rem; margin-top:1rem; padding:.75rem 1.2rem;
    border:1px solid rgba(200,80,80,.2); background:rgba(200,80,80,.04);
}
.form-error.is-shown { display:flex; }
.form-error__icon { color:rgba(220,100,100,.7); font-size:.85rem; flex-shrink:0; }
.form-error__text { font-size:.58rem; letter-spacing:.08rem; color:rgba(237,233,223,.5); text-align:left; line-height:1.5; }

.contact__email-block { margin-top:2.8rem; display:flex; flex-direction:column; align-items:center; gap:.8rem; }
.contact__email-label { font-size:.5rem; letter-spacing:.4rem; text-transform:uppercase; color:var(--c-white-30); }
.contact__email-link {
    display:inline-flex; align-items:center; gap:.7rem; padding:.7rem 1.6rem;
    border:1px solid var(--c-gold-border); color:var(--c-gold-bright);
    font-family:var(--ff-body); font-size:clamp(.75rem,1.2vw,.88rem);
    font-weight:300; letter-spacing:.08rem;
    transition:all var(--t-med) var(--ease-smooth);
    position:relative; overflow:hidden; cursor:pointer;
}
.contact__email-link::before {
    content:''; position:absolute; inset:0; background:var(--c-gold-dim);
    transform:scaleX(0); transform-origin:left;
    transition:transform var(--t-med) var(--ease-smooth);
}
.contact__email-link:hover { border-color:var(--c-gold); color:var(--c-white); box-shadow:0 0 30px rgba(194,160,78,.06); transform:translateY(-1px); }
.contact__email-link:hover::before { transform:scaleX(1); }
.contact__email-icon { position:relative; z-index:1; display:flex; align-items:center; opacity:.6; transition:opacity var(--t-fast); flex-shrink:0; }
.contact__email-link:hover .contact__email-icon { opacity:1; }
.contact__email-icon svg { width:14px; height:14px; stroke:currentColor; fill:none; stroke-width:1.5; }
.contact__email-text { position:relative; z-index:1; }

/* ============================================================
   § 17 · FOOTER
============================================================ */
.footer { background:var(--c-black); padding:3rem var(--gutter); text-align:center; }
.footer__logo { font-family:var(--ff-display); font-size:1.1rem; letter-spacing:.6rem; color:var(--c-gold); opacity:.4; margin-bottom:.8rem; }
.footer__copy { font-size:.55rem; letter-spacing:.2rem; color:rgba(237,233,223,.15); text-transform:uppercase; }

/* ============================================================
   § 18 · SCROLL REVEAL ANIMATION
============================================================ */
.reveal {
    opacity:0; transform:translateY(22px);
    transition:all var(--t-slow) var(--ease-smooth);
}
.reveal.is-visible { opacity:1; transform:translateY(0); }
.reveal--d1 { transition-delay:.1s; }
.reveal--d2 { transition-delay:.2s; }
.reveal--d3 { transition-delay:.3s; }
.reveal--d4 { transition-delay:.4s; }
.reveal--d5 { transition-delay:.5s; }

/* ============================================================
   § 19 · AMBIENT PARTICLES
============================================================ */
.particles {
    position:fixed; inset:0;
    pointer-events:none; z-index:0; overflow:hidden;
}
.particle {
    position:absolute; background:var(--c-gold); border-radius:50%;
    opacity:0; animation:particleDrift var(--p-speed,20s) linear infinite;
    animation-delay:var(--p-delay,0s);
}
@keyframes particleDrift {
    0%   { opacity:0; transform:translateY(100vh) scale(.4); }
    6%   { opacity:.18; }
    94%  { opacity:.05; }
    100% { opacity:0; transform:translateY(-5vh) scale(1); }
}

/* ============================================================
   § 20 · RESPONSIVE STYLES
============================================================ */
@media (max-width:1100px) {
    .gallery-grid {
        grid-template-columns:1fr 1fr;
        grid-auto-rows:240px;
    }
    .gallery-item:nth-child(n) {
        grid-column:auto; grid-row:auto;
    }
}

@media (max-width:900px) {
    .about__grid { grid-template-columns:1fr; gap:2.5rem; }
    .about__frame { max-width:380px; margin:0 auto; }
    .release-card { grid-template-columns:1fr; gap:1.5rem; }
    .release-card:nth-child(even) { direction:ltr; }
    .release-card__cover { max-width:420px; margin:0 auto; width:100%; }
}

@media (max-width:768px) {
    .nav__menu { display:none; }
    .nav__burger { display:flex; }
    .hero__actions { flex-direction:column; align-items:center; width:100%; }
    .hero__actions .btn { width:100%; max-width:240px; }
    .hero__scroll { display:none; }
    .gallery-grid { grid-template-columns:1fr 1fr; grid-auto-rows:180px; gap:.6rem; }
    .social__grid { gap:.6rem; }
    .social-card { min-width:78px; padding:1.1rem .8rem; }
    .contact__services { gap:.4rem; }
    .service-pill { padding:.45rem 1rem; font-size:.47rem; }
    .release-card__title { font-size:clamp(1.4rem,5vw,2rem); }
}

@media (max-width:520px) {
    .hero__name { font-size:clamp(2.4rem,13vw,3.2rem); letter-spacing:clamp(.4rem,2vw,1rem); }
    .hero__roles { letter-spacing:.18rem; }
    .skill-tags { justify-content:center; }
    .release-card__platforms { justify-content:center; }
    .gallery-grid { grid-template-columns:1fr; grid-auto-rows:200px; }
    .contact__heading { font-size:clamp(1.4rem,5vw,1.8rem); }
    .contact__services { flex-direction:column; align-items:center; }
    .service-pill { width:100%; max-width:260px; text-align:center; }
    .contact__email-link { font-size:.7rem; }
}
    </style>
</head>
<body>

    <div class="preloader" id="preloader">
        <div class="preloader__name" id="preloaderName">TOUFIK</div>
        <div class="preloader__bar"></div>
    </div>

    <div class="particles" id="particles"></div>

    <nav class="nav" id="nav" role="navigation" aria-label="Main navigation">
        <a href="#hero" class="nav__logo" id="navLogo">TOUFIK</a>
        <ul class="nav__menu">
            <li><a href="#about"    class="nav__link">About</a></li>
            <li><a href="#releases" class="nav__link">Music</a></li>
            <li><a href="#visuals"  class="nav__link">Visuals</a></li>
            <li><a href="#social"   class="nav__link">Connect</a></li>
            <li><a href="#contact"  class="nav__link">Contact</a></li>
        </ul>
        <button class="nav__burger" id="burger" aria-label="Toggle mobile menu" aria-expanded="false">
            <span></span><span></span><span></span>
        </button>
    </nav>

    <div class="mobile-menu" id="mobileMenu" role="dialog" aria-modal="true">
        <a href="#about">About</a>
        <a href="#releases">Music</a>
        <a href="#visuals">Visuals</a>
        <a href="#social">Connect</a>
        <a href="#contact">Contact</a>
    </div>

    <section class="hero" id="hero" aria-label="Hero">
        <div class="hero__bg">
            <div class="vis-slot" id="heroMedia">
                </div>
        </div>
        <div class="hero__gradient"></div>

        <div class="hero__content">
            <div class="hero__topline"></div>
            <h1 class="hero__name"    id="heroName">T O U F I K</h1>
            <p  class="hero__tagline" id="heroTagline">One Man Music Industry</p>
            <p  class="hero__roles">
                Singer <span>•</span> Rapper <span>•</span> Songwriter
                <span>•</span> Producer <span>•</span> Audio Engineer
            </p>
            <div class="hero__actions">
                <a href="#releases" class="btn btn--gold">Explore Music</a>
                <a href="#visuals"  class="btn btn--ghost">Watch Visuals</a>
                <a href="#contact"  class="btn btn--ghost">Contact</a>
            </div>
        </div>

        <div class="hero__eq" id="heroEq" aria-hidden="true"></div>

        <div class="hero__scroll" aria-hidden="true">
            <span class="hero__scroll-text">Scroll</span>
            <div class="hero__scroll-line"></div>
        </div>
    </section>

    <div class="sep"></div>

    <section class="about" id="about">
        <div class="container section-pad">
            <div class="about__grid">
                <div class="about__image-wrapper reveal">
                    <div class="about__frame">
                        <div class="vis-slot" id="aboutPhoto">
                            </div>
                    </div>
                    <div class="about__corner about__corner--tl"></div>
                    <div class="about__corner about__corner--br"></div>
                </div>

                <div>
                    <span class="u-label reveal">The Artist</span>
                    <div  class="u-divider reveal reveal--d1"></div>
                    <h2   class="about__heading reveal reveal--d2">"One Man. Every Role."</h2>
                    <p    class="about__text reveal reveal--d3">
                        I make music the way I feel it — emotional, cinematic, personal, and real.
                    </p>
                    <p    class="about__text reveal reveal--d3">
                        From writing and recording to production, mixing, and visuals, everything is built
                        independently to create a complete artistic experience.
                    </p>
                    <div class="skill-tags reveal reveal--d4" id="skillTags"></div>
                </div>
            </div>
        </div>
    </section>

    <div class="sep"></div>

    <section class="releases" id="releases">
        <div class="container section-pad">
            <div style="text-align:center;">
                <span class="u-label reveal">The Releases</span>
                <div  class="u-divider reveal reveal--d1" style="margin:0 auto 1.6rem;"></div>
                <h2   class="u-title reveal reveal--d2">THE RELEASES</h2>
                <p    class="u-subtitle reveal reveal--d3">"A world behind every sound."</p>
            </div>
            
            <div class="release-list" id="releaseList"></div>
        </div>
    </section>

    <div class="sep"></div>

    <section class="visuals" id="visuals">
        <div class="container section-pad">
            <div style="text-align:center;">
                <span class="u-label reveal">The Visuals</span>
                <div  class="u-divider reveal reveal--d1" style="margin:0 auto 1.6rem;"></div>
                <h2   class="u-title reveal reveal--d2">VISUAL UNIVERSE</h2>
                <p    class="u-subtitle reveal reveal--d3">"Every frame tells a story."</p>
            </div>
            <div class="gallery-grid reveal reveal--d4" id="gallery"></div>
        </div>
    </section>

    <div class="sep"></div>

    <section class="audio-exp" id="audio">
        <div class="container section-pad">
            <div class="audio-exp__inner">
                <span class="u-label reveal">Audio Experience</span>
                <div  class="u-divider reveal reveal--d1" style="margin:0 auto 1.6rem;"></div>
                <h2   class="u-title reveal reveal--d2">FEEL THE SOUND</h2>
                <p    class="u-subtitle reveal reveal--d3">"Close your eyes. Press play."</p>

                <div class="audio-exp__list" id="audioExperienceList"></div>
            </div>
        </div>
    </section>

    <div class="sep"></div>

    <section class="social" id="social">
        <div class="container section-pad">
            <div class="social__inner">
                <span class="u-label reveal">Stay Connected</span>
                <div  class="u-divider reveal reveal--d1" style="margin:0 auto 1.6rem;"></div>
                <h2   class="u-title reveal reveal--d2">FIND THE ERA</h2>
                <p    class="u-subtitle reveal reveal--d3">"Enter the universe."</p>
                <div class="social__grid reveal reveal--d4" id="socialGrid"></div>
            </div>
        </div>
    </section>

    <div class="sep"></div>

    <section class="contact" id="contact">
        <div class="contact__ambient" aria-hidden="true"></div>
        <div class="container section-pad">
            <div class="contact__inner">

                <span class="u-label reveal">Get In Touch</span>
                <div  class="u-divider reveal reveal--d1" style="margin:0 auto 1.6rem;"></div>
                <h2   class="contact__heading reveal reveal--d2">LET'S BUILD SOMETHING REAL.</h2>
                <p    class="contact__desc reveal reveal--d3">
                    Built for emotion, atmosphere, and real connection through sound.<br>
                    Available for vocal work, songwriting, production, and creative collaborations.
                </p>

                <div class="contact__services reveal reveal--d4" id="contactServices"></div>
                <div class="contact__divider reveal reveal--d4"></div>

                <div class="contact__form-wrap reveal reveal--d5">
                    <form class="form" id="contactForm" novalidate>
                        <div class="form__field">
                            <input type="text" class="form__input" id="fName" placeholder=" " required autocomplete="name">
                            <label for="fName" class="form__label">Your Name</label>
                        </div>
                        <div class="form__field">
                            <input type="email" class="form__input" id="fEmail" placeholder=" " required autocomplete="email">
                            <label for="fEmail" class="form__label">Your Email</label>
                        </div>
                        <div class="form__field">
                            <select class="form__select" id="fService" required>
                                <option value="" disabled selected>Select Service</option>
                                <option value="Vocal Performance">Vocal Performance</option>
                                <option value="Rap Vocals">Rap Vocals</option>
                                <option value="Songwriting">Songwriting</option>
                                <option value="Music Production">Music Production</option>
                                <option value="Audio Engineering">Audio Engineering</option>
                                <option value="other">Other</option>
                            </select>
                        </div>
                        <div class="form__reveal" id="serviceReveal">
                            <div class="form__field">
                                <input type="text" class="form__input" id="fServiceCustom" placeholder=" ">
                                <label for="fServiceCustom" class="form__label">Custom Service Request</label>
                            </div>
                        </div>
                        <div class="form__field">
                            <select class="form__select" id="fInquiry" required>
                                <option value="" disabled selected>Select Inquiry Type</option>
                                <option value="Collaboration">Collaboration</option>
                                <option value="Feature Request">Feature Request</option>
                                <option value="Business Inquiry">Business Inquiry</option>
                                <option value="Music Inquiry">Music Inquiry</option>
                                <option value="other">Other</option>
                            </select>
                        </div>
                        <div class="form__reveal" id="inquiryReveal">
                            <div class="form__field">
                                <input type="text" class="form__input" id="fInquiryCustom" placeholder=" ">
                                <label for="fInquiryCustom" class="form__label">Custom Inquiry Type</label>
                            </div>
                        </div>
                        <div class="form__field">
                            <textarea class="form__textarea form__input" id="fMessage" rows="4" placeholder=" " required></textarea>
                            <label for="fMessage" class="form__label">Project Details</label>
                        </div>

                        <div class="form__submit-wrap">
                            <button type="submit" class="form__submit" id="formSubmit">
                                <span class="form__submit-text">
                                    <span class="form__submit-label">Submit Inquiry</span>
                                    <span class="form__spinner"></span>
                                </span>
                            </button>
                        </div>

                        <div class="form-error" id="formError" role="alert">
                            <span class="form-error__icon">⚠</span>
                            <span class="form-error__text" id="formErrorText">Something went wrong. Please try again or email directly.</span>
                        </div>
                    </form>

                    <div class="form-success" id="formSuccess" role="status">
                        <div class="form-success__icon">
                            <svg viewBox="0 0 24 24"><polyline points="20 6 9 17 4 12"/></svg>
                        </div>
                        <div class="form-success__title">Inquiry Sent Successfully</div>
                        <div class="form-success__text">
                            Your inquiry has been sent successfully.<br>
                            TOUFIK will reach out through email soon.
                        </div>
                    </div>
                </div>

                <div class="contact__email-block reveal reveal--d5">
                    <span class="contact__email-label">Or reach out directly</span>
                    <a class="contact__email-link" id="contactEmailLink" href="mailto:contactwithtoufik@gmail.com">
                        <span class="contact__email-icon">
                            <svg viewBox="0 0 24 24">
                                <rect x="2" y="4" width="20" height="16" rx="2"/>
                                <path d="M2 7l10 7 10-7"/>
                            </svg>
                        </span>
                        <span class="contact__email-text" id="contactEmailText">contactwithtoufik@gmail.com</span>
                    </a>
                </div>

            </div>
        </div>
    </section>

    <div class="sep"></div>

    <footer class="footer">
        <div class="footer__logo" id="footerLogo">TOUFIK</div>
        <p class="footer__copy" id="footerCopy">© 2026 TOUFIK — All Rights Reserved</p>
    </footer>

    <script src="https://cdn.jsdelivr.net/npm/@emailjs/browser@4/dist/email.min.js"></script>

    <script>
    /* ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
       DATA: config.js
    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ */
    const SITE_CONFIG = {
        artistName:   'T O U F I K',
        artistSlug:   'TOUFIK',
        tagline:      'One Man Music Industry',
        description:  'Independent artist crafting cinematic emotion through self-engineered sound.',
        year:         '2026',
        contactEmail: 'contactwithtoufik@gmail.com',

        hero: {
            type: 'css',
            path: '', 
            alt:  'TOUFIK'
        },

        aboutPhoto: {
            path: 'assets/images/about-main.jpg',
            alt:  'TOUFIK - About'
        },

        skills: [
            'Cinematic', 'Emotional', 'Producer',
            'Vocalist', 'Songwriter', 'Rapper', 'Self-Engineered'
        ],

        services: [
            'Vocal Performance', 'Rap Vocals', 'Songwriting',
            'Music Production', 'Audio Engineering'
        ],

        socialLinks: [
            {
                name: 'YouTube',
                url:  'https://www.youtube.com/toufikera',
                icon: '<path d="M23.498 6.186a3.016 3.016 0 0 0-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 0 0 .502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 0 0 2.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 0 0 2.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814zM9.545 15.568V8.432L15.818 12l-6.273 3.568z"/>'
            },
            {
                name: 'Facebook',
                url:  'https://www.facebook.com/toufikera',
                icon: '<path d="M24 12.073c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.99 4.388 10.954 10.125 11.854v-8.385H7.078v-3.47h3.047V9.43c0-3.007 1.792-4.669 4.533-4.669 1.312 0 2.686.235 2.686.235v2.953H15.83c-1.491 0-1.956.925-1.956 1.874v2.25h3.328l-.532 3.47h-2.796v8.385C19.612 23.027 24 18.062 24 12.073z"/>'
            },
            {
                name: 'Instagram',
                url:  'https://www.instagram.com/toufik_era',
                icon: '<path d="M12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.266-.057 1.645-.069 4.849-.069zM12 0C8.741 0 8.333.014 7.053.072 2.695.272.273 2.69.073 7.052.014 8.333 0 8.741 0 12c0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98C8.333 23.986 8.741 24 12 24c3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98C15.668.014 15.259 0 12 0zm0 5.838a6.162 6.162 0 1 0 0 12.324 6.162 6.162 0 0 0 0-12.324zM12 16a4 4 0 1 1 0-8 4 4 0 0 1 0 8zm6.406-11.845a1.44 1.44 0 1 0 0 2.881 1.44 1.44 0 0 0 0-2.881z"/>'
            },
            {
                name: 'X',
                url:  'https://www.x.com/toufikera',
                icon: '<path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"/>'
            },
            {
                name: 'Pinterest',
                url:  'https://www.pinterest.com/toufikera',
                icon: '<path d="M12.017 0C5.396 0 .029 5.367.029 11.987c0 5.079 3.158 9.417 7.618 11.162-.105-.949-.199-2.403.041-3.439.219-.937 1.406-5.957 1.406-5.957s-.359-.72-.359-1.781c0-1.668.967-2.914 2.171-2.914 1.023 0 1.518.769 1.518 1.69 0 1.029-.655 2.568-.994 3.995-.283 1.194.599 2.169 1.777 2.169 2.133 0 3.772-2.249 3.772-5.495 0-2.873-2.064-4.882-5.012-4.882-3.414 0-5.418 2.561-5.418 5.207 0 1.031.397 2.138.893 2.738a.36.36 0 0 1 .083.345l-.333 1.36c-.053.22-.174.267-.402.161-1.499-.698-2.436-2.889-2.436-4.649 0-3.785 2.75-7.262 7.929-7.262 4.163 0 7.398 2.967 7.398 6.931 0 4.136-2.607 7.464-6.227 7.464-1.216 0-2.359-.631-2.75-1.378l-.748 2.853c-.271 1.043-1.002 2.35-1.492 3.146C9.57 23.812 10.763 24 12.017 24c6.624 0 11.99-5.367 11.99-11.988C24.007 5.367 18.641 0 12.017 0z"/>'
            },
            {
                name: 'SoundCloud',
                url:  'https://www.soundcloud.com/toufikera',
                icon: '<path d="M1.175 12.225c-.051 0-.094.046-.101.1l-.233 2.154.233 2.105c.007.058.05.098.101.098.05 0 .09-.04.099-.098l.255-2.105-.27-2.154c-.009-.06-.05-.1-.1-.1m-.899.828c-.06 0-.091.037-.104.094L0 14.479l.172 1.282c.013.06.045.094.104.094.057 0 .09-.037.1-.094l.199-1.282-.199-1.332c-.01-.057-.043-.094-.1-.094m1.79-1.065c-.067 0-.12.042-.12.114l-.2 2.377.2 2.283c0 .07.053.115.12.115s.12-.045.12-.115l.227-2.283-.227-2.377c0-.072-.053-.114-.12-.114m.899-.166c-.08 0-.14.05-.14.138l-.18 2.543.18 2.318c0 .09.06.137.14.137s.138-.05.138-.137l.2-2.318-.2-2.543c0-.088-.062-.138-.138-.138m.93-.27c-.09 0-.16.06-.16.157l-.15 2.653.15 2.333c0 .1.07.16.16.16s.16-.06.16-.16l.17-2.333-.17-2.653c0-.097-.07-.157-.16-.157m.94-.098c-.1 0-.18.07-.18.178l-.13 2.593.13 2.338c0 .11.08.178.18.178s.18-.07.18-.178l.15-2.338-.15-2.593c0-.11-.08-.178-.18-.178m1.114-.263c-.11 0-.2.08-.2.196l-.12 2.677.12 2.332c.01.12.09.2.2.2s.2-.08.2-.2l.14-2.332-.14-2.677c0-.116-.09-.196-.2-.196m.87 0c-.12 0-.21.09-.22.21l-.1 2.677.1 2.322c.01.12.1.21.22.21s.21-.09.21-.21l.12-2.322-.12-2.677c-.01-.12-.1-.21-.21-.21m.94-.048c-.13 0-.22.098-.23.226l-.09 2.725.09 2.3c.01.13.1.228.23.228s.22-.098.22-.228l.1-2.3-.1-2.725c-.01-.128-.1-.226-.22-.226m.96-.042c-.14 0-.24.11-.24.243l-.08 2.633.08 2.293c0 .13.1.242.24.242s.24-.11.24-.242l.09-2.293-.09-2.633c0-.133-.1-.243-.24-.243m1.125-.384c-.14 0-.25.12-.26.255l-.05 3.02.05 2.258c.01.14.12.253.26.253s.25-.113.25-.253l.06-2.258-.06-3.02c-.01-.135-.11-.255-.25-.255m.87.193c-.15 0-.27.13-.27.27l-.04 2.556.04 2.24c0 .14.12.27.27.27s.27-.13.27-.27l.04-2.24-.04-2.556c0-.14-.12-.27-.27-.27m1.59-1.227c-.05-.006-.1-.01-.15-.01-.15 0-.29.06-.4.16-.11.1-.17.24-.17.39l-.02 3.24.02 2.204c.01.32.26.56.57.56.15 0 .29-.06.39-.16.1-.1.17-.24.17-.39V14.3l-.01-3.4c-.02-.3-.26-.54-.57-.56m4.77-.608c-.4 0-.78.08-1.13.23-.23-2.61-2.44-4.65-5.13-4.65-.69 0-1.36.14-1.97.39-.23.1-.3.2-.3.39v9.46c0 .2.16.37.36.38h8.17c1.63 0 2.95-1.33 2.95-2.96s-1.32-2.95-2.95-2.95"/>'
            },
            {
                name: 'Audiomack',
                url:  'https://www.audiomack.com/toufikera',
                icon: '<path d="M1.01 14.39c-.55 0-1.01.44-1.01 1.01v2.2c0 .55.44 1.01 1.01 1.01s1.01-.44 1.01-1.01v-2.2c-.01-.57-.46-1.01-1.01-1.01zm3.03-2.19c-.56 0-1.01.44-1.01 1.01v5.57c0 .55.44 1.01 1.01 1.01.55 0 1.01-.44 1.01-1.01v-5.57c-.01-.57-.46-1.01-1.01-1.01zm3.03-1.6c-.56 0-1.01.44-1.01 1.01v8.77c0 .55.44 1.01 1.01 1.01.55 0 1.01-.44 1.01-1.01v-8.77c-.01-.57-.46-1.01-1.01-1.01zm3.03.6c-.56 0-1.01.44-1.01 1.01v7.57c0 .55.44 1.01 1.01 1.01.55 0 1.01-.44 1.01-1.01v-7.57c-.01-.57-.46-1.01-1.01-1.01zm3.03-4c-.56 0-1.01.44-1.01 1.01v14.56c0 .55.44 1.01 1.01 1.01.55 0 1.01-.44 1.01-1.01V8.22c-.01-.57-.46-1.01-1.01-1.01zm3.03 2c-.55 0-1.01.44-1.01 1.01v10.57c0 .55.44 1.01 1.01 1.01.55 0 1.01-.44 1.01-1.01V10.22c-.01-.57-.45-1.01-1.01-1.01zm3.03-3.4c-.55 0-1.01.44-1.01 1.01v16.96c0 .55.44 1.01 1.01 1.01.55 0 1.01-.44 1.01-1.01V6.82c-.01-.57-.46-1.01-1.01-1.01zm2.72 4.1c-.41 0-.71.3-.71.71v9.17c0 .41.3.71.71.71.41 0 .71-.3.71-.71v-9.17a.72.72 0 0 0-.71-.71z"/>'
            }
        ]
    };

    /* ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
       AUDIO EXPERIENCE DATA
    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ */
    const AUDIO_EXPERIENCE = [        {            id: 'farz-3d',            title: 'FARZ 3D',            subtitle: 'Immersive Spatial Audio',            audio: 'assets/audio/farz-3d.mp3'        }    ];

    /* ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
       DATA: releases.js
    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ */
    const RELEASES = [        {            id:          'bas-kyu-nahi',            title:       'Bas Kyu Nahi',            type:        'Single',            date:        '2024',            featured:    true,            description: 'Some feelings stay unfinished no matter how deeply you love.',            audio:       'assets/audio/bas-kyu-nahi.mp3',            cover:       'assets/covers/bas-kyu-nahi-cover.jpg',            thumbnail:   'assets/thumbnails/bas-kyu-nahi-thumb.jpg',            video:       '',            cssFallback: 'css-warm',            platforms: [                { name: 'YouTube',    url: 'https://www.youtube.com/toufikera'    },                { name: 'SoundCloud', url: 'https://www.soundcloud.com/toufikera' },                { name: 'Audiomack',  url: 'https://www.audiomack.com/toufikera'  }            ]
        },
        {
            id:          'hun-bas-tumhari',
            title:       'Hun Bas Tumhari',
            type:        'Single',
            date:        '2024',
            featured:    false,
            description: 'A soft emotional world where love feels personal, loyal, and completely yours.',
            audio:       'assets/audio/hun-bas-tumhari.mp3',
            cover:       'assets/covers/hun-bas-tumhari-cover.jpg',
            thumbnail:   'assets/thumbnails/hun-bas-tumhari-thumb.jpg',
            video:       '',
            cssFallback: 'css-cool',
            platforms: [
                { name: 'YouTube',    url: 'https://www.youtube.com/toufikera'    },
                { name: 'SoundCloud', url: 'https://www.soundcloud.com/toufikera' },
                { name: 'Audiomack',  url: 'https://www.audiomack.com/toufikera'  }
            ]
        },
        {
            id:          'teri-duri',
            title:       'Teri Duri',
            type:        'Single',
            date:        '2024',
            featured:    false,
            description: 'When distance becomes louder than words and memories refuse to fade.',
            audio:       'assets/audio/teri-duri.mp3',
            cover:       'assets/covers/teri-duri-cover.jpg',
            thumbnail:   'assets/thumbnails/teri-duri-thumb.jpg',
            video:       '',
            cssFallback: 'css-deep',
            platforms: [
                { name: 'YouTube',    url: 'https://www.youtube.com/toufikera'    },
                { name: 'SoundCloud', url: 'https://www.soundcloud.com/toufikera' },
                { name: 'Audiomack',  url: 'https://www.audiomack.com/toufikera'  }
            ]
        }
    ];

    /* ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
       DATA: gallery.js
    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ */
    const GALLERY_ITEMS = [        { id:'gal-1', image:'assets/images/visual-1.jpg', label:'', artClass:'art--g1' },        { id:'gal-2', image:'assets/images/visual-2.jpg', label:'', artClass:'art--g2' },        { id:'gal-3', image:'assets/images/visual-3.jpg', label:'', artClass:'art--g3' },        { id:'gal-4', image:'assets/images/visual-4.jpg', label:'', artClass:'art--g4' },        { id:'gal-5', image:'assets/images/visual-5.jpg', label:'', artClass:'art--g5' },        { id:'gal-6', image:'assets/images/visual-6.jpg', label:'', artClass:'art--g6' }    ];

    /* ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
       LOGIC: script.js
    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ */
    (function () {
        'use strict';

        const COVER_MAP = {
            'css-warm': 'art--cover-warm',
            'css-cool': 'art--cover-cool',
            'css-deep': 'art--cover-deep',
            'css-dusk': 'art--cover-dusk'
        };

        const PERF = {
            loaderMs:      2400,
            particleCount: 15,
            eqBarCount:    28,
            ambientBars:   60,
            scrollOffset:  50
        };

        function init() {
            if (typeof emailjs !== 'undefined') {
                emailjs.init({ publicKey: EMAILJS_CONFIG.publicKey });
            }
            
            applyConfig();
            renderReleases();
            renderGallery();
            renderAudioExperience();
            renderSocial();
            
            initPreloader();
            initParticles();
            initNav();
            initSmoothScroll();
            initHeroEq();
            initParallax();
            initContactForm();
            initScrollReveal(); 
        }

        function applyConfig() {
            if (typeof SITE_CONFIG === 'undefined') return;
            const cfg = SITE_CONFIG;

            setEl('pageTitle', `${cfg.artistSlug} — ${cfg.tagline}`);
            const desc = document.getElementById('metaDesc');
            if (desc) desc.content = cfg.description;

            setEl('heroName',     cfg.artistName);
            setEl('heroTagline',  cfg.tagline);
            setEl('navLogo',      cfg.artistSlug);
            setEl('footerLogo',   cfg.artistSlug);
            setEl('preloaderName',cfg.artistSlug);
            setEl('footerCopy',   `© ${cfg.year} ${cfg.artistSlug} — All Rights Reserved`);

            setAttr('contactEmailLink', 'href', `mailto:${cfg.contactEmail}`);
            setEl('contactEmailText', cfg.contactEmail);

            if (cfg.hero) {
                const heroEl = document.getElementById('heroMedia');
                if (heroEl) {
                    let heroInner = `<div class="vis-art ${cfg.hero.cssFallback || 'art--hero'}"></div>`;
                    if (cfg.hero.path) {
                        if (cfg.hero.type === 'video') {
                            heroInner += `<video src="${cfg.hero.path}" autoplay muted loop playsinline aria-hidden="true"></video>`;
                        } else if (cfg.hero.type === 'image') {
                            heroInner += `<img src="${cfg.hero.path}" alt="${cfg.hero.alt}" loading="lazy">`;
                        }
                    }
                    heroEl.innerHTML = heroInner;
                }
            }

            if (cfg.aboutPhoto && cfg.aboutPhoto.path) {
                const aboutEl = document.getElementById('aboutPhoto');
                if (aboutEl) {
                    aboutEl.innerHTML = `
                        <div class="vis-art art--about">
                            <div class="light-beam" style="left:30%;top:0;height:100%;"></div>
                            <div class="light-beam" style="left:65%;top:10%;height:80%;opacity:.5;"></div>
                        </div>
                        <img src="${cfg.aboutPhoto.path}" alt="${cfg.aboutPhoto.alt}" loading="lazy">
                    `;
                }
            }

            const tagsEl = document.getElementById('skillTags');
            if (tagsEl) {
                tagsEl.innerHTML = cfg.skills
                    .map(s => `<span class="skill-tag">${s}</span>`)
                    .join('');
            }

            const svcEl = document.getElementById('contactServices');
            if (svcEl) {
                svcEl.innerHTML = cfg.services
                    .map(s => `<div class="service-pill"><span>${s}</span></div>`)
                    .join('');
            }
        }

        function renderReleases() {
            if (typeof RELEASES === 'undefined') return;
            const list = document.getElementById('releaseList');
            if (!list) return;

            list.innerHTML = RELEASES.map(r => {
                let mediaInner = '';
                if (r.video) {
                    mediaInner = `<video src="${r.video}" poster="${r.thumbnail || r.cover}" autoplay loop muted playsinline></video>`;
                } else if (r.cover) {
                    mediaInner = `<img src="${r.cover}" alt="${r.title}" loading="lazy">`;
                } else {
                    mediaInner = `<div class="vis-art ${COVER_MAP[r.cssFallback] || 'art--cover-warm'}"></div>`;
                }

                const audioTag = r.audio ? `<audio class="release-audio" src="${r.audio}" preload="none"></audio>` : '';
                const platforms = r.platforms ? r.platforms.map(p => `<a href="${p.url}" target="_blank" rel="noopener" class="platform-link">${p.name}</a>`).join('') : '';
                const badge = r.featured ? `<div class="release-card__badge">Featured</div>` : '';

                return `
                <div class="release-card" data-id="${r.id}">
                    <div class="release-card__cover">
                        <div class="vis-slot">${mediaInner}</div>
                        ${badge}
                        <div class="release-card__watermark">${r.title.toLowerCase()}</div>
                        <div class="release-card__play" role="button" aria-label="Play ${r.title}">
                            <div class="release-card__play-icon"></div>
                        </div>
                        ${audioTag}
                    </div>
                    <div class="release-card__info">
                        <div class="release-card__type">${r.type}</div>
                        <h3 class="release-card__title">${r.title}</h3>
                        ${r.date ? `<div class="release-card__date">${r.date}</div>` : ''}
                        <p class="release-card__desc">${r.description}</p>
                        <div class="release-card__platforms">${platforms}</div>
                        <div class="release-card__wave" data-bars="50"></div>
                    </div>
                </div>`;
            }).join('');

            buildWaveforms();
            initCardHovers();
            initAudioPlayback();
        }

        function renderGallery() {
            if (typeof GALLERY_ITEMS === 'undefined') return;
            const grid = document.getElementById('gallery');
            if (!grid) return;

            grid.innerHTML = GALLERY_ITEMS.map(item => {
                const content = item.image
                    ? `<img src="${item.image}" alt="${item.label || 'Visual Experience'}" loading="lazy">`
                    : `<div class="vis-art ${item.artClass || 'art--g1'}"></div>`;
                
                const labelHtml = (item.label && item.label.trim() !== '')
                    ? `<div class="art-label"><span>${item.label}</span></div>`
                    : '';

                return `
                <div class="gallery-item" data-id="${item.id}">
                    <div class="vis-slot">${content}</div>
                    ${labelHtml}
                </div>`;
            }).join('');
        }

        function renderAudioExperience() {
            if (typeof AUDIO_EXPERIENCE === 'undefined') return;
            const list = document.getElementById('audioExperienceList');
            if (!list) return;

            list.innerHTML = AUDIO_EXPERIENCE.map((item, i) => `
                <div class="audio-exp__item reveal reveal--d${(i % 5) + 1}">
                    ${item.title ? `<h3 class="u-title">${item.title}</h3>` : ''}
                    ${item.subtitle ? `<p class="u-subtitle">${item.subtitle}</p>` : ''}
                    <div class="audio-exp__wave ambient-wave-container" data-bars="60" aria-hidden="true"></div>
                    <div class="audio-exp__orb audio-orb-btn" role="button" tabindex="0" aria-label="Play ${item.title}">
                        <span class="audio-exp__icon">▶</span>
                    </div>
                    <span class="audio-exp__hint">Tap to Experience</span>
                    ${item.audio ? `<audio class="ambient-audio-el" src="${item.audio}" preload="none"></audio>` : ''}
                </div>
            `).join('');

            document.querySelectorAll('.ambient-wave-container:not([data-built])').forEach(container => {
                const count = parseInt(container.dataset.bars) || 60;
                for (let i = 0; i < count; i++) {
                    const bar = document.createElement('div');
                    bar.className = 'ambient-bar';
                    bar.style.setProperty('--ab-height', (3 + Math.random() * 35) + 'px');
                    bar.style.setProperty('--ab-speed',  (1 + Math.random() * 2.5) + 's');
                    bar.style.setProperty('--ab-delay',  (Math.random() * 2) + 's');
                    container.appendChild(bar);
                }
                container.dataset.built = '1';
            });

            document.querySelectorAll('.audio-exp__item').forEach(item => {
                const orb = item.querySelector('.audio-orb-btn');
                const icon = orb.querySelector('.audio-exp__icon');
                const audioEl = item.querySelector('.ambient-audio-el');

                if (!orb || !audioEl) return;

                const toggle = () => {
                    pauseAllAudioExcept(audioEl);

                    if (audioEl.paused) {
                        audioEl.play().catch(e => console.error("Audio playback failed:", e));
                        icon.textContent = '❚❚';
                        orb.style.borderColor = 'var(--c-gold)';
                        orb.style.boxShadow = '0 0 60px rgba(194,160,78,.1)';
                    } else {
                        audioEl.pause();
                        icon.textContent = '▶';
                        orb.style.borderColor = '';
                        orb.style.boxShadow = '';
                    }
                };

                orb.addEventListener('click', toggle);
                orb.addEventListener('keydown', e => { if (e.key === 'Enter' || e.key === ' ') toggle(); });
                
                audioEl.addEventListener('ended', () => {
                    icon.textContent = '▶';
                    orb.style.borderColor = '';
                    orb.style.boxShadow = '';
                });
            });
        }

        function renderSocial() {
            if (typeof SITE_CONFIG === 'undefined') return;
            const grid = document.getElementById('socialGrid');
            if (!grid) return;
            grid.innerHTML = SITE_CONFIG.socialLinks.map(s => `
                <a href="${s.url}" target="_blank" rel="noopener" class="social-card">
                    <div class="social-card__icon">
                        <svg viewBox="0 0 24 24" aria-label="${s.name}">${s.icon}</svg>
                    </div>
                    <span class="social-card__name">${s.name}</span>
                </a>`
            ).join('');
        }

        function pauseAllAudioExcept(exceptAudio) {
            document.querySelectorAll('audio').forEach(a => {
                if (a !== exceptAudio) {
                    a.pause();
                    
                    const relIcon = a.parentElement.querySelector('.release-card__play-icon');
                    if (relIcon) {
                        relIcon.style.borderStyle = 'solid';
                        relIcon.style.borderWidth = '6px 0 6px 10px';
                        relIcon.style.height = '0';
                        relIcon.style.marginLeft = '2px';
                    }

                    const ambIcon = a.parentElement.querySelector('.audio-exp__icon');
                    const ambOrb = a.parentElement.querySelector('.audio-orb-btn');
                    if (ambIcon) ambIcon.textContent = '▶';
                    if (ambOrb) {
                        ambOrb.style.borderColor = '';
                        ambOrb.style.boxShadow = '';
                    }
                }
            });
        }

        function buildWaveforms() {
            document.querySelectorAll('.release-card__wave:not([data-built])').forEach(container => {
                const count = parseInt(container.dataset.bars) || 45;
                for (let i = 0; i < count; i++) {
                    const bar = document.createElement('div');
                    bar.className = 'wave-bar';
                    bar.style.height = (2 + Math.random() * 18) + 'px';
                    container.appendChild(bar);
                }
                container.dataset.built = '1';
            });
        }

        function initCardHovers() {
            document.querySelectorAll('.release-card:not([data-hover])').forEach(card => {
                card.addEventListener('mouseenter', () => {
                    card.querySelectorAll('.wave-bar').forEach(b => {
                        b.style.transition = 'height .3s ease';
                        b.style.height = (2 + Math.random() * 20) + 'px';
                    });
                });
                card.addEventListener('mouseleave', () => {
                    card.querySelectorAll('.wave-bar').forEach(b => {
                        b.style.height = (2 + Math.random() * 10) + 'px';
                    });
                });
                card.dataset.hover = '1';
            });
        }

        function initAudioPlayback() {
            document.querySelectorAll('.release-card').forEach(card => {
                const playBtn = card.querySelector('.release-card__play');
                const audioEl = card.querySelector('.release-audio');
                const playIcon = card.querySelector('.release-card__play-icon');

                if (!playBtn || !audioEl) return;

                playBtn.addEventListener('click', () => {
                    pauseAllAudioExcept(audioEl);

                    if (audioEl.paused) {
                        audioEl.play().catch(e => console.error("Audio playback failed:", e));
                        playIcon.style.borderStyle = 'double';
                        playIcon.style.borderWidth = '0px 0px 0px 10px';
                        playIcon.style.height = '12px';
                        playIcon.style.marginLeft = '0';
                    } else {
                        audioEl.pause();
                        playIcon.style.borderStyle = 'solid';
                        playIcon.style.borderWidth = '6px 0 6px 10px';
                        playIcon.style.height = '0';
                        playIcon.style.marginLeft = '2px';
                    }
                });

                audioEl.addEventListener('ended', () => {
                    playIcon.style.borderStyle = 'solid';
                    playIcon.style.borderWidth = '6px 0 6px 10px';
                    playIcon.style.height = '0';
                    playIcon.style.marginLeft = '2px';
                });
            });
        }

        function initPreloader() {
            window.addEventListener('load', () => {
                setTimeout(() => {
                    const loader = document.getElementById('preloader');
                    if (loader) loader.classList.add('is-done');
                }, PERF.loaderMs);
            });
        }

        function initParticles() {
            const layer = document.getElementById('particles');
            if (!layer) return;
            for (let i = 0; i < PERF.particleCount; i++) {
                const p   = document.createElement('div');
                p.className = 'particle';
                const sz  = 1 + Math.random() * 1.5;
                Object.assign(p.style, {
                    left:   Math.random() * 100 + '%',
                    width:  sz + 'px',
                    height: sz + 'px',
                    '--p-speed': (18 + Math.random() * 24) + 's',
                    '--p-delay': (Math.random() * 18) + 's'
                });
                layer.appendChild(p);
            }
        }

        function initNav() {
            const nav     = document.getElementById('nav');
            const burger  = document.getElementById('burger');
            const mobileM = document.getElementById('mobileMenu');

            window.addEventListener('scroll', () => {
                if (nav) nav.classList.toggle('is-scrolled', window.scrollY > PERF.scrollOffset);
            }, { passive: true });

            if (burger && mobileM) {
                burger.addEventListener('click', () => {
                    const isOpen = burger.classList.toggle('is-open');
                    mobileM.classList.toggle('is-open', isOpen);
                    burger.setAttribute('aria-expanded', String(isOpen));
                    document.body.style.overflow = isOpen ? 'hidden' : '';
                });

                mobileM.querySelectorAll('a').forEach(a => {
                    a.addEventListener('click', () => {
                        burger.classList.remove('is-open');
                        mobileM.classList.remove('is-open');
                        burger.setAttribute('aria-expanded', 'false');
                        document.body.style.overflow = '';
                    });
                });
            }
        }

        function initSmoothScroll() {
            document.querySelectorAll('a[href^="#"]').forEach(a => {
                a.addEventListener('click', e => {
                    e.preventDefault();
                    const target = document.querySelector(a.getAttribute('href'));
                    if (target) target.scrollIntoView({ behavior: 'smooth', block: 'start' });
                });
            });
        }

        function initHeroEq() {
            const container = document.getElementById('heroEq');
            if (!container) return;
            for (let i = 0; i < PERF.eqBarCount; i++) {
                const bar = document.createElement('div');
                bar.className = 'eq-bar';
                bar.style.setProperty('--eq-delay',  (Math.random() * 2) + 's');
                bar.style.setProperty('--eq-speed',  (.6 + Math.random() * .7) + 's');
                bar.style.setProperty('--eq-height', (4 + Math.random() * 14) + 'px');
                container.appendChild(bar);
            }
        }

        function initParallax() {
            const heroBg = document.querySelector('.hero__bg');
            if (!heroBg) return;
            window.addEventListener('scroll', () => {
                const y = window.scrollY;
                if (y < window.innerHeight) {
                    heroBg.style.transform = `translateY(${y * .08}px)`;
                }
            }, { passive: true });
        }

        let scrollObserver = null;
        function initScrollReveal() {
            if (!scrollObserver) {
                scrollObserver = new IntersectionObserver(entries => {
                    entries.forEach(e => {
                        if (e.isIntersecting) {
                            e.target.classList.add('is-visible');
                            scrollObserver.unobserve(e.target);
                        }
                    });
                }, { threshold: .07, rootMargin: '0px 0px -30px 0px' });
            }
            document.querySelectorAll('.reveal:not([data-observed]), .release-card:not([data-observed]), .gallery-item:not([data-observed]), .audio-exp__item:not([data-observed])')
                .forEach(el => {
                    scrollObserver.observe(el);
                    el.dataset.observed = '1';
                    el.classList.add('reveal');
                });
        }

        function initContactForm() {
            const form          = document.getElementById('contactForm');
            const successEl     = document.getElementById('formSuccess');
            const errorEl       = document.getElementById('formError');
            const errorTextEl   = document.getElementById('formErrorText');
            const submitBtn     = document.getElementById('formSubmit');

            const fService      = document.getElementById('fService');
            const fInquiry      = document.getElementById('fInquiry');
            const serviceReveal = document.getElementById('serviceReveal');
            const inquiryReveal = document.getElementById('inquiryReveal');
            const fServiceCustom= document.getElementById('fServiceCustom');
            const fInquiryCustom= document.getElementById('fInquiryCustom');

            function handleReveal(selectEl, revealEl, customInput) {
                const isOther = selectEl.value === 'other';
                revealEl.classList.toggle('is-open', isOther);
                customInput.required = isOther;
                if (!isOther) customInput.value = '';
                if (isOther) setTimeout(() => customInput.focus(), 380);
            }
            
            if (fService && fInquiry) {
                fService.addEventListener('change', () => handleReveal(fService, serviceReveal, fServiceCustom));
                fInquiry.addEventListener('change', () => handleReveal(fInquiry, inquiryReveal, fInquiryCustom));
            }

            function setLoading(on) {
                submitBtn.classList.toggle('is-loading', on);
                submitBtn.disabled = on;
            }
            function showError(msg) {
                errorTextEl.textContent = msg || 'Something went wrong. Please email directly.';
                errorEl.classList.add('is-shown');
                setTimeout(() => errorEl.classList.remove('is-shown'), 8000);
            }
            function showSuccess() {
                form.style.display = 'none';
                successEl.classList.add('is-shown');
            }

            if (!form) return;

            form.addEventListener('submit', async (e) => {
                e.preventDefault();
                errorEl.classList.remove('is-shown');

                const name    = document.getElementById('fName').value.trim();
                const email   = document.getElementById('fEmail').value.trim();
                const svc     = fService.value;
                const inq     = fInquiry.value;
                const svcCust = fServiceCustom.value.trim();
                const inqCust = fInquiryCustom.value.trim();
                const message = document.getElementById('fMessage').value.trim();

                if (!name)  { showError('Please enter your name.'); return; }
                if (!email || !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
                    showError('Please enter a valid email address.'); return;
                }
                if (!svc)  { showError('Please select a service.'); return; }
                if (svc === 'other' && !svcCust) { showError('Please describe your custom service.'); return; }
                if (!inq)  { showError('Please select an inquiry type.'); return; }
                if (inq === 'other' && !inqCust) { showError('Please describe your custom inquiry type.'); return; }
                if (!message) { showError('Please describe your project.'); return; }

                const finalService = svc === 'other' ? svcCust : svc;
                const finalInquiry = inq === 'other' ? inqCust : inq;

                setLoading(true);

                try {
                    const res = await emailjs.send(
                        EMAILJS_CONFIG.serviceId,
                        EMAILJS_CONFIG.templateId,
                        {
                            from_name:      name,
                            from_email:     email,
                            service_type:   finalService,
                            inquiry_type:   finalInquiry,
                            custom_service: svc === 'other' ? svcCust : '',
                            custom_inquiry: inq === 'other' ? inqCust : '',
                            message:        message
                        }
                    );

                    if (res.status === 200) {
                        showSuccess();
                    } else {
                        setLoading(false);
                        showError(`Delivery failed (${res.status}). Please email directly.`);
                    }
                } catch (err) {
                    setLoading(false);
                    showError(err?.text ? `Error: ${err.text}` : 'Could not send. Please email directly.');
                    console.error('[EmailJS]', err);
                }
            });
        }

        function setEl(id, text) {
            const el = document.getElementById(id);
            if (el) el.textContent = text;
        }
        function setAttr(id, attr, value) {
            const el = document.getElementById(id);
            if (el) el.setAttribute(attr, value);
        }

        if (document.readyState === 'loading') {
            document.addEventListener('DOMContentLoaded', init);
        } else {
            init();
        }

    })();
    </script>
</body>
</html>
