/* global React, ReactDOM */
const { useState, useEffect, useRef, useMemo } = React;

/* ============================================================
   DATA — drawn from the original poster
   ============================================================ */
const WORKSHOPS = [
{ id: "w1", date: "01 JUL", weekday: "Onsdag", time: "17:00 — 19:00", title: "Sy glidelås", host: "Katja Nielsen", price: "750,–", tag: "Kurs", link: "https://relove.hoopla.no/event/1409831992", img: "images/jul-glidelas.jpg" },
{ id: "w2", date: "02 JUL", weekday: "Torsdag", time: "16:00 — 20:00", title: "Maker Night", host: "Drop-in i verkstedet", price: "350,–", note: "Gratis for medlemmer i Maker Club", tag: "Drop-in", img: "images/jul-makernight.jpg" },
{ id: "w3", date: "03 JUL", weekday: "Fredag", time: "17:00 — 20:00", title: "Vennedating: Sip & Sew", host: "Sosial sykveld", price: "750,–", tag: "Event", link: "https://relove.hoopla.no/event/1411670425", img: "images/jul-sipsew.jpg" },
{ id: "w4", date: "04 JUL", weekday: "Lørdag", time: "17:00 — 19:00", title: "Nålefilting", host: "Matilda Høøg", price: "950,–", tag: "Kurs", link: "https://relove.hoopla.no/event/343689238", img: "images/jul-nalefilting.jpg" },
{ id: "w5", date: "06 JUL", weekday: "Mandag", time: "16:00 — 20:00", title: "Reparasjonstreff", host: "Katya Bukhantsova", price: "Gratis", note: "Drop-in", tag: "Gratis", img: "images/jul-reparasjon.jpg" },
{ id: "w6", date: "07 JUL", weekday: "Tirsdag", time: "17:00 — 19:00", title: "Broderiteknikker", host: "Katya Bukhantsova", price: "750,–", tag: "Kurs", link: "https://relove.hoopla.no/event/2017806094", img: "images/jul-broderi.jpg" },
{ id: "w7", date: "08 JUL", weekday: "Onsdag", time: "17:00 — 19:00", title: "Kunsthekling: ringer og buer", host: "Katya Bukhantsova", price: "750,–", tag: "Kurs", link: "https://relove.hoopla.no/event/215383303", img: "images/jul-kunsthekling.jpg" },
{ id: "w8", date: "09 JUL", weekday: "Torsdag", time: "16:00 — 20:00", title: "Maker Night", host: "Drop-in i verkstedet", price: "350,–", note: "Gratis for medlemmer i Maker Club", tag: "Drop-in", img: "images/jul-makernight.jpg" },
{ id: "w9", date: "10 JUL", weekday: "Fredag", time: "17:00 — 20:00", title: "Vennedating: Sip & Sew", host: "Sosial sykveld", price: "750,–", tag: "Event", link: "https://relove.hoopla.no/event/1192711777", img: "images/jul-sipsew2.jpg" },
{ id: "w10", date: "11 JUL", weekday: "Lørdag", time: "17:00 — 19:00", title: "Trykk på tetrapack", host: "Tone Eikholt", price: "750,–", tag: "Kurs", link: "https://relove.hoopla.no/event/163460475", img: "images/jul-trykk.jpg" },
{ id: "w11", date: "14 JUL", weekday: "Tirsdag", time: "17:00 — 19:00", title: "Trykk på tetrapack", host: "Tone Eikholt", price: "750,–", tag: "Kurs", link: "https://relove.hoopla.no/event/942084954", img: "images/jul-trykk.jpg" },
{ id: "w12", date: "15 JUL", weekday: "Onsdag", time: "17:00 — 20:00", title: "Franske sømmer & tote-bag", host: "Katja Nielsen", price: "940,–", tag: "Kurs", link: "https://relove.hoopla.no/event/40268561", img: "images/jul-totebag.jpg" },
{ id: "w13", date: "16 JUL", weekday: "Torsdag", time: "16:00 — 20:00", title: "Maker Night", host: "Drop-in i verkstedet", price: "350,–", note: "Gratis for medlemmer i Maker Club", tag: "Drop-in", img: "images/jul-makernight.jpg" },
{ id: "w14", date: "17 JUL", weekday: "Fredag", time: "17:00 — 20:00", title: "Vennedating: Sip & Sew", host: "Sosial sykveld", price: "750,–", tag: "Event", link: "https://relove.hoopla.no/event/1958438173", img: "images/jul-sipsew.jpg" },
{ id: "w15", date: "18 JUL", weekday: "Lørdag", time: "17:00 — 19:00", title: "Trykk på tetrapack", host: "Tone Eikholt", price: "750,–", tag: "Kurs", link: "https://relove.hoopla.no/event/1606698611", img: "images/jul-trykk.jpg" },
{ id: "w16", date: "21 JUL", weekday: "Tirsdag", time: "17:00 — 19:00", title: "Tekstilillustrasjon og håndsøm", host: "Anna Lubchencko", price: "750,–", tag: "Kurs", link: "https://relove.hoopla.no/event/1545759040", img: "images/jul-tekstil.jpg" },
{ id: "w17", date: "22 JUL", weekday: "Onsdag", time: "17:00 — 20:00", title: "Konstruer og sy sirkelskjørt", host: "Katya Bukhantsova", price: "950,–", tag: "Kurs", link: "https://relove.hoopla.no/event/1924548676", img: "images/jul-sirkelskjort.jpg" },
{ id: "w18", date: "23 JUL", weekday: "Torsdag", time: "16:00 — 20:00", title: "Maker Night", host: "Drop-in i verkstedet", price: "350,–", note: "Gratis for medlemmer i Maker Club", tag: "Drop-in", img: "images/jul-makernight.jpg" },
{ id: "w19", date: "24 JUL", weekday: "Fredag", time: "17:00 — 20:00", title: "Vennedating: Sip & Sew", host: "Sosial sykveld", price: "750,–", tag: "Event", link: "https://relove.hoopla.no/event/1691491900", img: "images/jul-sipsew2.jpg" },
{ id: "w20", date: "25 JUL", weekday: "Lørdag", time: "17:00 — 19:00", title: "Nålefilting", host: "Matilda Høøg", price: "750,–", tag: "Kurs", link: "https://relove.hoopla.no/event/403982470", img: "images/jul-nalefilting.jpg" },
{ id: "w21", date: "28 JUL", weekday: "Tirsdag", time: "17:00 — 19:00", title: "Lær deg håndsøm", host: "Katya Bukhantsova", price: "750,–", tag: "Kurs", link: "https://relove.hoopla.no/event/1627662032", img: "images/jul-handsom.jpg" },
{ id: "w22", date: "29 JUL", weekday: "Onsdag", time: "17:00 — 19:00", title: "Trykk på tetrapack", host: "Tone Eikholt", price: "750,–", tag: "Kurs", link: "https://relove.hoopla.no/event/1238525817", img: "images/jul-trykk.jpg" },
{ id: "w23", date: "30 JUL", weekday: "Torsdag", time: "16:00 — 20:00", title: "Maker Night", host: "Drop-in i verkstedet", price: "350,–", note: "Gratis for medlemmer i Maker Club", tag: "Drop-in", img: "images/jul-makernight.jpg" },
{ id: "w24", date: "31 JUL", weekday: "Fredag", time: "17:00 — 20:00", title: "Vennedating: Sip & Sew", host: "Sosial sykveld", price: "750,–", tag: "Event", link: "https://relove.hoopla.no/event/1691491900", img: "images/jul-sipsew.jpg" }];


const SERVICES = [
{ id: "s1", title: "Reparasjon", desc: "Knapper, hull, ødelagte glidelåser, sliter, slitne sømmer. Ta med i butikken — vi gir pris på flekken.", more: "Knapper, hull, ødelagte glidelåser, slitne sømmer. Ta med - vi gir deg en pris på.", price: "", img: "p5.jpg", color: "#0da959" },
{ id: "s2", title: "Omsøm", desc: "Ta inn, slipp ut, korte ned. Klassisk skredderarbeid på dine egne plagg.", more: "Ta inn, legg opp eller ned. Vi tar tilpassing av bunader.", price: "", img: "p2.jpg", color: "#0da959" },
{ id: "s3", title: "Broderi", desc: "Mono­grammer, logoer, motiv. Vi har en Melco 16-nålers maskin og digitaliserer ditt motiv.", more: "Alt av broderi på plagg. Vi digitaliserer ditt motiv og broderer på en Melco 16-nålers maskin. Stikk innom eller ta kontakt på e-post.", price: "", img: "p6.jpg", color: "#0da959" },
{ id: "s4", title: "Redesign", desc: "Snakk med oss om plagget du elsker men ikke bruker. Vi tegner det om til noe du faktisk vil ha på.", more: "Snakk med oss om plagget du elsker men ikke bruker. Vi tegner det om til noe du faktisk vil ha på.", price: "", img: "p3.jpg", color: "#0da959" },
{ id: "s5", title: "2.hand", desc: "Kuratert utvalg av brukte plagg, materialer og rester — alt klart til nytt liv.", more: "Kuratert utvalg av brukte plagg, materialer og rester — alt klart til nytt liv.", price: "", img: "2hand.jpg", color: "#0da959" },
{ id: "s6", title: "Circular Maker", desc: "Stoff­rester, knapper, glidelåser, garn — gjenbruks­materialer du kan kjøpe på vekt.", more: "DIY-kits, materialepakker og hobbyartikler av gjenbruksmaterialer. Kom innom og se utvalget.", price: "", img: "p1", color: "#0da959" }];


const PICKER_OPTIONS = [
{ q: "Glidelås røket", to: "s1", icon: "⌇" },
{ q: "For stort i livet", to: "s2", icon: "↤↦" },
{ q: "Hull i kneet", to: "s1", icon: "◌" },
{ q: "Vil ha logo / navn på", to: "s3", icon: "✦" },
{ q: "Kjedelig kjole jeg ikke bruker", to: "s4", icon: "↻" },
{ q: "Trenger stoff til prosjekt", to: "s6", icon: "▤" },
{ q: "Knapp falt av", to: "s1", icon: "●" },
{ q: "Vil lære selv", to: null, icon: "✎", workshop: true }];


const STATS = [
{ n: 1284, label: "plagg reparert" },
{ n: 312, label: "kg stoff i materialbanken" },
{ n: 47, label: "kurs holdt" },
{ n: 6, label: "dager til åpning" }];


/* ============================================================
   PRIMITIVES
   ============================================================ */
function Tag({ children, color = "var(--ink)", bg = "transparent", border = true }) {
  return (
    <span style={{
      display: "inline-flex", alignItems: "center", gap: 6,
      padding: "4px 10px", borderRadius: 999,
      fontSize: 11, fontWeight: 600, letterSpacing: 0.6, textTransform: "uppercase",
      color, background: bg,
      border: border ? `1px solid ${color}` : "none",
      whiteSpace: "nowrap"
    }}>{children}</span>);

}

function Dot({ size = 8, color = "var(--green)" }) {
  return <span style={{ display: "inline-block", width: size, height: size, borderRadius: "50%", background: color }} />;
}

/* ============================================================
   ANIMATED HERO ORBS — re-creating the poster's two big circles
   but alive: they breathe, drift, react to mouse
   ============================================================ */
function HeroOrbs({ mouseX, mouseY }) {
  const t = useRef(0);
  const [, force] = useState(0);
  useEffect(() => {
    let raf;
    const tick = () => {t.current += 0.006;force((n) => n + 1);raf = requestAnimationFrame(tick);};
    raf = requestAnimationFrame(tick);
    return () => cancelAnimationFrame(raf);
  }, []);
  const phase = t.current;
  const sway = Math.sin(phase) * 18;
  const sway2 = Math.cos(phase * 0.8) * 12;
  const px = (mouseX - 0.5) * 30;
  const py = (mouseY - 0.5) * 20;

  return (
    <svg viewBox="0 0 1600 1100" style={{ position: "absolute", inset: 0, width: "100%", height: "100%", pointerEvents: "none" }} aria-hidden>
      {/* dark orb (left) — softened so text stays readable */}
      <g transform={`translate(${-180 + sway + px} ${160 + sway2 + py})`}>
        <path
          d="M965,924c-75,124 -198,233 -355,299c-338,142 -705,36 -821,-238c-115,-274 65,-612 402,-754c139,-58 284,-75 413,-55c-99,144 -132,310 -74,456c66,165 232,268 435,292Z"
          fill="#cfc7b3"
          opacity="0.55" />
        
      </g>
      {/* green orb (right) */}
      <g transform={`translate(${340 - sway - px * 0.6} ${160 - sway2 - py * 0.6})`}>
        <path
          d="M965,924c132,16 280,-3 424,-60c365,-145 573,-484 464,-757c-108,-273 -492,-377 -857,-232c-169,67 -305,176 -390,301c185,29 340,132 408,293c62,147 39,312 -49,455Z"
          fill="var(--green)"
          opacity="0.78" />
        
      </g>
      {/* small floating circles like in original */}
      <circle cx={1200 + sway * 2} cy={80 + sway2} r="55" fill="var(--green)" opacity="0.32" />
      <circle cx={150 - sway} cy={620 + sway2 * 1.5} r="42" fill="#cfc7b3" opacity="0.4" />
      <circle cx={1380 + sway2} cy={420 - sway} r="78" fill="#cfc7b3" opacity="0.28" />
    </svg>);

}

/* ============================================================
   HERO
   ============================================================ */
function Hero({ tweaks }) {
  const [mouse, setMouse] = useState({ x: 0.5, y: 0.5 });
  const [tagline, setTagline] = useState(0);
  const taglines = ["Reparasjon.", "Redesign.", "Håndarbeid.", "Kreativitet.", "Fellesskap."];

  useEffect(() => {
    const id = setInterval(() => setTagline((t) => (t + 1) % taglines.length), 1800);
    return () => clearInterval(id);
  }, []);

  const onMove = (e) => {
    const r = e.currentTarget.getBoundingClientRect();
    setMouse({ x: (e.clientX - r.left) / r.width, y: (e.clientY - r.top) / r.height });
  };

  // countdown to opening: 29 May 2026, 17:00
  const [now, setNow] = useState(() => new Date());
  useEffect(() => {const id = setInterval(() => setNow(new Date()), 1000);return () => clearInterval(id);}, []);
  const target = useMemo(() => new Date("2026-05-29T17:00:00+02:00"), []);
  const diff = Math.max(0, target - now);
  const days = Math.floor(diff / 86400000);
  const hours = Math.floor(diff % 86400000 / 3600000);
  const mins = Math.floor(diff % 3600000 / 60000);
  const secs = Math.floor(diff % 60000 / 1000);

  return (
    <section className="hero" onMouseMove={onMove}>
      <HeroOrbs mouseX={mouse.x} mouseY={mouse.y} />

      <div className="hero-grid">
        <div className="hero-left">
          <div className="brand-stack">
            <div className="brand-row">CIRCULAR</div>
            <div className="brand-row">MAKER</div>
            <div className="brand-row">STUDIO</div>
          </div>
          <p className="hero-sub">
            Bærekraftig omstilling i praksis på{" "}
            <span className="addr">Sagene i Oslo</span>.
            2.hand, broderitjenester, kurs og samlinger.
          </p>
          <div className="hero-ctas">
            <a href="#schedule" className="btn btn-primary">Se kurs &amp; events</a>
            <a href="#services" className="btn btn-ghost">Tjenester →</a>
          </div>
        </div>

        <div className="hero-right">
          <div className="rotating-tag">
            <span className="tag-static">Vi driver med</span>
            <span className="tag-rotator">
              {taglines.map((t, i) =>
              <span key={t} className={"tag-word " + (i === tagline ? "is-active" : "")}>{t}</span>
              )}
            </span>
          </div>
        </div>
      </div>

      <NavStrip />
    </section>);

}

function NavStrip() {
  return (
    <div className="navstrip">
      <div className="nav-logo">
        <span className="nav-dot" /> CIRCULAR MAKER STUDIO
      </div>
      <nav className="nav-links">
        <a href="#schedule">Kurs &amp; events</a>
        <a href="#services">Tjenester</a>
        <a href="#klubben">Maker Club</a>
        <a href="#partners">Partnere</a>
        <a href="#visit">Besøk</a>
      </nav>
    </div>);

}

/* ============================================================
   MARQUEE — values
   ============================================================ */
function Marquee() {
  const items = [
  "Reparasjon", "•", "Redesign", "•", "Håndarbeid", "•", "Kreativitet", "•", "Fellesskap",
  "•", "2.hand", "•", "Broderi", "•", "Materialbank", "•", "Reparasjonscafé"];

  return (
    <div className="marquee" aria-hidden>
      <div className="marquee-track">
        {[...items, ...items, ...items].map((it, i) =>
        <span key={i} className={it === "•" ? "m-dot" : "m-word"}>{it}</span>
        )}
      </div>
    </div>);

}

/* ============================================================
   STATS BAR (animated count up)
   ============================================================ */
function Counter({ to, duration = 1400 }) {
  const [v, setV] = useState(0);
  const ref = useRef();
  const started = useRef(false);
  useEffect(() => {
    const obs = new IntersectionObserver((entries) => {
      entries.forEach((e) => {
        if (e.isIntersecting && !started.current) {
          started.current = true;
          const t0 = performance.now();
          const step = (t) => {
            const p = Math.min(1, (t - t0) / duration);
            setV(Math.round(to * (1 - Math.pow(1 - p, 3))));
            if (p < 1) requestAnimationFrame(step);
          };
          requestAnimationFrame(step);
        }
      });
    }, { threshold: 0.5 });
    if (ref.current) obs.observe(ref.current);
    return () => obs.disconnect();
  }, [to]);
  return <span ref={ref}>{v.toLocaleString("nb-NO")}</span>;
}

function StatsBar() {
  return (
    <section className="stats">
      {STATS.map((s) =>
      <div key={s.label} className="stat">
          <div className="stat-n"><Counter to={s.n} /></div>
          <div className="stat-l">{s.label}</div>
        </div>
      )}
    </section>);

}

/* ============================================================
   SCHEDULE — interactive workshop list
   ============================================================ */
function Schedule() {
  const [filter, setFilter] = useState("Alle");
  const [hover, setHover] = useState(null);
  const tags = ["Alle", "Kurs", "Drop-in", "Gratis", "Event"];
  const list = filter === "Alle" ? WORKSHOPS : WORKSHOPS.filter((w) => w.tag === filter);

  return (
    <section className="schedule" id="schedule">
      <header className="section-head">
        <div>
          <div className="eyebrow"><Dot /> Kurs &amp; events</div>
          <h2>Hva skjer i juli</h2>
        </div>
        <div className="filter-pills">
          {tags.map((t) =>
          <button key={t} className={"pill " + (filter === t ? "is-on" : "")} onClick={() => setFilter(t)}>
              {t}
            </button>
          )}
        </div>
      </header>

      <ul className="ws-list">
        {list.map((w) => {
          const isHover = hover === w.id;
          return (
            <li
              key={w.id}
              className={"ws-row " + (isHover ? "is-hover" : "")}
              onMouseEnter={() => setHover(w.id)}
              onMouseLeave={() => setHover(null)}>

              <div className="ws-date">
                <div className="ws-date-day">{w.date.split(" ")[0]}</div>
                <div className="ws-date-mo">{w.date.split(" ")[1]}</div>
                {w.weekday && <div className="ws-date-wd">{w.weekday}</div>}
              </div>
              <div className="ws-time">{w.time}</div>
              <div className="ws-title">
                <div className="ws-tag-line"><Tag>{w.tag}</Tag></div>
                <div className="ws-h">{w.title}</div>
                <div className="ws-host">m/ {w.host}</div>
              </div>
              <div className="ws-spots">
                <div className="ws-price">{w.price}</div>
                {w.note && <div className="ws-price-note">{w.note}</div>}
              </div>
              {w.link ?
                <a
                  className="ws-cta"
                  href={w.link}
                  target="_blank"
                  rel="noopener noreferrer">
                  Påmelding ↗
                </a> :
                <span className="ws-cta is-dropin">
                  {w.tag === "Event" ? "Åpent — møt opp" : "Bare møt opp"}
                </span>
              }
              <div className="ws-hover-img" aria-hidden>
                {w.img ?
                  <img src={w.img} alt="" /> :
                  <div className="ws-hover-empty" style={{ background: w.tag === "Event" ? "var(--coral)" : "var(--paper-2)" }} />
                }
              </div>
            </li>);

        })}
      </ul>
    </section>);

}

/* ============================================================
   PICKER — "What did you bring in?"
   ============================================================ */
function Picker() {
  const [chosen, setChosen] = useState(null);
  const result = chosen ? PICKER_OPTIONS.find((o) => o.q === chosen) : null;
  const matched = result && result.to ? SERVICES.find((s) => s.id === result.to) : null;

  return (
    <section className="picker" id="picker">
      <div className="picker-grid">
        <div className="picker-left">
          <div className="eyebrow"><Dot color="#ff6161" /> Hjelp meg velge</div>
          <h2>Hva har du<br />med deg i dag?</h2>
          <p className="picker-sub">
            Klikk det som ligner mest. Vi viser deg hvilken tjeneste som passer — eller om det finnes et kurs der du kan lære å fikse det selv.
          </p>
        </div>
        <div className="picker-right">
          <div className="picker-options">
            {PICKER_OPTIONS.map((o) =>
            <button
              key={o.q}
              className={"picker-opt " + (chosen === o.q ? "is-on" : "")}
              onClick={() => setChosen(o.q)}>
              
                <span className="picker-icon">{o.icon}</span>
                <span className="picker-q">{o.q}</span>
              </button>
            )}
          </div>

          <div className={"picker-result " + (chosen ? "is-shown" : "")}>
            {matched &&
            <>
                <div className="pr-eyebrow">Vi anbefaler →</div>
                <div className="pr-title">{matched.title}</div>
                <div className="pr-desc">{matched.desc}</div>
                <div className="pr-meta">
                  <span>{matched.price}</span>
                  <a href="#services" className="btn btn-primary btn-sm">Bestill →</a>
                </div>
              </>
            }
            {result && result.workshop &&
            <>
                <div className="pr-eyebrow">Lær det selv →</div>
                <div className="pr-title">Kom på kurs</div>
                <div className="pr-desc">Vi har kurs hver uke der du lærer å reparere og sy om plagg selv. Ingen forkunnskaper.</div>
                <div className="pr-meta">
                  <span>fra 0 kr (drop-in)</span>
                  <a href="#schedule" className="btn btn-primary btn-sm">Se kurs →</a>
                </div>
              </>
            }
          </div>
        </div>
      </div>
    </section>);

}

/* ============================================================
   SERVICES GRID
   ============================================================ */
function Services() {
  const [open, setOpen] = useState(null);
  return (
    <section className="services" id="services">
      <header className="section-head">
        <div>
          <div className="eyebrow"><Dot /> Tjenester</div>
          <h2>Det vi gjør, hver dag</h2>
        </div>
        <p className="section-lede">Stikk innom på Maridalsveien 154 — eller bestill på forhånd.

        </p>
      </header>

      <div className="svc-grid">
        {SERVICES.map((s, i) =>
        <article
          key={s.id}
          className={"svc-card " + (open === s.id ? "is-open" : "")}
          onClick={() => setOpen(open === s.id ? null : s.id)}
          style={{ "--i": i }}>
          
            <div className="svc-img">
              <img src={s.img.includes(".") ? `images/${s.img}` : `images/${s.img}.${s.img === "p1" ? "jpg" : "png"}`} alt="" />
            </div>
            <div className="svc-body">
              <div className="svc-head">
                <h3>{s.title}</h3>
                <span className="svc-price">{s.price}</span>
              </div>
              <div className="svc-more">
                <button type="button" className="svc-more-btn" onClick={(e) => e.stopPropagation()}>
                  <span>Mer info</span>
                  <span className="svc-more-icon">+</span>
                </button>
                <div className="svc-more-text">
                  <p>{s.more}</p>
                </div>
              </div>
            </div>
          </article>
        )}
      </div>
    </section>);

}

/* ============================================================
   MAKER KLUBBEN
   ============================================================ */
function Klubben() {
  const [tab, setTab] = useState("nights");

  const benefits = [
    { icon: "✦", t: "Gratis Maker Nights", d: "Alle torsdager kl. 16–20 — fri tilgang for medlemmer." },
    { icon: "%", t: "20 % rabatt på kurs", d: "Rabattkoden sendes sammen med faktura for medlemskapet og gjelder alle mini-kurs og workshops." },
    { icon: "◐", t: "Førvisninger", d: "Invitasjoner til medlemskvelder og spesielle arrangementer." },
    { icon: "↻", t: "Bruk verkstedet jevnlig", d: "Utvikle ferdighetene over tid i et fast fellesskap." },
  ];

  return (
    <section className="klubben" id="klubben">
      <div className="kl-bg" aria-hidden>
        <div className="kl-orb kl-orb-a" />
        <div className="kl-orb kl-orb-b" />
      </div>

      <div className="kl-inner">
        <div className="kl-head">
          <div className="eyebrow"><Dot color="var(--coral)" /> Maker Club</div>
          <h2>Skap, reparer<br/>og jobb med egne<br/><em>prosjekter.</em></h2>
          <p className="kl-lede">
            Et åpent verksted og et kreativt fellesskap. Lån utstyr, få veiledning,
            og bli en del av miljøet — drop-in eller som medlem.
          </p>
        </div>

        <div className="kl-tabs" role="tablist">
          <button role="tab" className={"kl-tab " + (tab === "nights" ? "is-on" : "")} onClick={() => setTab("nights")}>
            <span className="kl-tab-n">01</span>
            <span className="kl-tab-l">Maker Nights</span>
            <span className="kl-tab-s">Drop-in · 350,–</span>
          </button>
          <button role="tab" className={"kl-tab " + (tab === "club" ? "is-on" : "")} onClick={() => setTab("club")}>
            <span className="kl-tab-n">02</span>
            <span className="kl-tab-l">Medlemskap</span>
            <span className="kl-tab-s">Fast tilgang &amp; rabatter</span>
          </button>
        </div>

        {tab === "nights" && (
          <div className="kl-panel">
            <div className="kl-panel-main">
              <h3>Drop-in Maker Nights</h3>
              <p>
                En åpen kveld der du jobber med dine egne sy- og redesign­prosjekter i verkstedet vårt.
                Reparer favoritt­plagget, test nye ideer, eller bare ta en kreativ pause i hverdagen —
                vi gir deg plass, utstyr og et inspirerende miljø.
              </p>
              <ul className="kl-list">
                <li><span className="kl-bullet">→</span> Tilgang til symaskiner og syutstyr</li>
                <li><span className="kl-bullet">→</span> Sosialt og kreativt arbeids­fellesskap</li>
                <li><span className="kl-bullet">→</span> Mulighet for veiledning på egne prosjekter</li>
              </ul>
            </div>
            <aside className="kl-meta">
              <div className="kl-meta-row"><span>Når</span><b>Torsdager 16:00–20:00</b></div>
              <div className="kl-meta-row"><span>Påmelding</span><b>Ingen — bare møt opp</b></div>
              <div className="kl-meta-row"><span>Pris</span><b>350,– per kveld</b></div>
              <div className="kl-meta-row"><span>Medlemmer</span><b style={{color:"var(--green)"}}>Gratis</b></div>
              <a href="#visit" className="btn btn-primary kl-btn">Stikk innom →</a>
            </aside>
          </div>
        )}

        {tab === "club" && (
          <div className="kl-panel">
            <div className="kl-panel-main">
              <h3>Bli medlem i Maker Club</h3>
              <p>
                For deg som vil bruke verkstedet jevnlig og utvikle ferdighetene dine
                over tid. Medlemskap gir både fri tilgang og rabatter — pluss invitasjoner
                til arrangementer som ikke er åpne for alle.
              </p>
              <div className="kl-benefits">
                {benefits.map(b => (
                  <div key={b.t} className="kl-benefit">
                    <span className="kl-benefit-icon">{b.icon}</span>
                    <div>
                      <div className="kl-benefit-t">{b.t}</div>
                      <div className="kl-benefit-d">{b.d}</div>
                    </div>
                  </div>
                ))}
              </div>
            </div>
            <aside className="kl-meta">
              <div className="kl-meta-row"><span>Pris</span><b>350,– per måned</b></div>
              <div className="kl-meta-row"><span>Binding</span><b>Ingen — si opp når som helst</b></div>
              <div className="kl-meta-row"><span>For hvem</span><b>Faste brukere av verkstedet</b></div>
              <div className="kl-meta-row"><span>Innmelding</span><b>Via e-post</b></div>
              <a href="mailto:kontakt@relove.info?subject=Maker%20Club" className="btn btn-primary kl-btn">Ta kontakt →</a>
              <div className="kl-meta-note">Fornyes månedlig. Rabattkode for kurs sendes sammen med faktura.</div>
            </aside>
          </div>
        )}
      </div>
    </section>
  );
}

/* ============================================================
   PARTNERS / VISIT / FOOTER
   ============================================================ */
function Partners() {
  return (
    <section className="partners" id="partners">
      <div className="partners-inner">
        <div className="eyebrow"><Dot color="#fff" /> I sirkel med</div>
        <h2>Drevet av RELOVE & Re//Lab</h2>
        <p>
          Circular Maker Studio er et samarbeid mellom <a href="https://www.relove.info/" target="_blank" rel="noopener">Relove</a> og <a href="https://www.relab.no/" target="_blank" rel="noopener">Re//Lab</a> — to organisasjoner som jobber med å forlenge livet til klærne dine.
        </p>
        <div className="partner-logos">
          <a className="logo-card logo-card-light" href="https://www.relove.info/" target="_blank" rel="noopener noreferrer">
            <div className="logo-img">
              <img src="images/logo-relove.png" alt="Relove" />
            </div>
            <div className="logo-tag">Sosial entreprenør</div>
          </a>
          <a className="logo-card logo-card-dark" href="https://www.relab.no/" target="_blank" rel="noopener noreferrer">
            <div className="logo-img logo-img-relab">
              <img src="images/logo-relab.png" alt="Re//Lab" />
            </div>
            <div className="logo-tag">Tekstil-laboratorium</div>
          </a>
        </div>
      </div>
    </section>);

}

function Visit() {
  return (
    <section className="visit" id="visit">
      <div className="visit-grid">
        <div className="visit-left">
          <div className="eyebrow"><Dot /> Besøk oss</div>
          <h2>Maridalsveien 154</h2>
          <p>0461 Oslo </p>
          <dl className="hours">
            <div><dt>Tirsdag</dt><dd>10:00 — 16:00</dd></div>
            <div><dt>Onsdag</dt><dd>10:00 — 16:00</dd></div>
            <div><dt>Torsdag</dt><dd>10:00 — 20:00</dd></div>
            <div><dt>Lørdag</dt><dd>12:00 — 16:00</dd></div>
            <div><dt>Andre dager</dt><dd>Stengt</dd></div>
          </dl>
          <div className="contact">
            <a href="mailto:kontakt@relove.info">kontakt@relove.info</a>
            <a href="tel:+4798442960">+47 984 42 960</a>
          </div>
        </div>
        <div className="visit-right">
          <a
            className="map-mock"
            href="https://www.google.com/maps/search/?api=1&query=Maridalsveien+154+Oslo"
            target="_blank"
            rel="noopener noreferrer"
            aria-label="Åpne i Google Maps">
            <iframe
              title="Kart over Maridalsveien 154, Oslo"
              src="https://www.google.com/maps?q=Maridalsveien+154,+Oslo&output=embed"
              loading="lazy"
              referrerPolicy="no-referrer-when-downgrade"
              allowFullScreen
            />
            <span className="map-badge">
              <span className="map-pin" />
              Åpne i Google Maps ↗
            </span>
          </a>
        </div>
      </div>
    </section>);

}

function Footer() {
  return (
    <footer className="foot">
      <div className="foot-row">
        <div className="foot-brand">
          <div className="foot-logo">CIRCULAR<br />MAKER<br />STUDIO</div>
          <div className="foot-circle"><span /><span /></div>
        </div>
        <div className="foot-cols">
          <div>
            <h4>Studio</h4>
            <a href="#services">Tjenester</a>
            <a href="#schedule">Kurs &amp; events</a>
            <a href="#visit">Besøk</a>
          </div>
          <div>
            <h4>Partnere</h4>
            <a href="https://www.relove.info/" target="_blank" rel="noopener">Relove</a>
            <a href="https://www.relab.no/" target="_blank" rel="noopener">Re//Lab</a>
          </div>
        </div>
      </div>
      <div className="foot-base">
        <span>© 2026 Circular Maker Studio</span>
        <span>Maridalsveien 154 · 0461 Oslo</span>
        <span></span>
      </div>
    </footer>);

}

/* ============================================================
   APP
   ============================================================ */
const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
  "accent": "#0da959",
  "coral": "#ff6161",
  "paper": "#f5f3ee",
  "fontMode": "Editorial",
  "denser": false
} /*EDITMODE-END*/;

function App() {
  const [t, setT] = useTweaks(TWEAK_DEFAULTS);

  // apply tweak vars
  useEffect(() => {
    const r = document.documentElement;
    r.style.setProperty("--green", t.accent);
    r.style.setProperty("--coral", t.coral);
    r.style.setProperty("--paper", t.paper);
    r.style.setProperty("--font-display", t.fontMode === "Editorial" ?
    `"Fraunces", "Times New Roman", serif` :
    t.fontMode === "Grotesk" ?
    `"Space Grotesk", "Helvetica Neue", sans-serif` :
    `"Bebas Neue", Impact, sans-serif`);
    r.style.setProperty("--density", t.denser ? "0.85" : "1");
  }, [t]);

  return (
    <>
      <Hero tweaks={t} />
      <Marquee />
      <Schedule />
      <Services />
      <Klubben />
      <Partners />
      <Visit />
      <Footer />

      <TweaksPanel title="Tweaks">
        <TweakSection title="Palette">
          <TweakColor
            label="Accent"
            value={t.accent}
            options={["#0da959", "#1a3d2f", "#d97757", "#2b5fdb", "#111111"]}
            onChange={(v) => setT("accent", v)} />
          
          <TweakColor
            label="Coral / fun"
            value={t.coral}
            options={["#ff6161", "#ffb800", "#ff7ac6", "#9a6cff", "#0da959"]}
            onChange={(v) => setT("coral", v)} />
          
          <TweakColor
            label="Paper"
            value={t.paper}
            options={["#f5f3ee", "#f6efe2", "#ffffff", "#ecead8", "#1a1a18"]}
            onChange={(v) => setT("paper", v)} />
          
        </TweakSection>
        <TweakSection title="Type">
          <TweakRadio
            label="Display font"
            value={t.fontMode}
            options={["Editorial", "Grotesk", "Display"]}
            onChange={(v) => setT("fontMode", v)} />
          
          <TweakToggle label="Denser layout" value={t.denser} onChange={(v) => setT("denser", v)} />
        </TweakSection>
      </TweaksPanel>
    </>);

}

ReactDOM.createRoot(document.getElementById("root")).render(<App />);