/* global React, useTweaks, TweaksPanel, TweakSection, TweakSlider, TweakText */
const { useState, useEffect, useRef } = React;

const PHONE_TEL = "+4500000000";

const ArrowCta = () => (
  <svg viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" strokeWidth="1.8" strokeLinecap="round" strokeLinejoin="round">
    <path d="M5 19L19 5 M19 5H8 M19 5V16" />
  </svg>
);

const PhoneIcon = ({ size = 16 }) => (
  <svg viewBox="0 0 24 24" width={size} height={size} fill="none" stroke="currentColor" strokeWidth="1.8" strokeLinecap="round" strokeLinejoin="round" style={{flex: "0 0 auto"}}>
    <path d="M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72c.13.96.37 1.9.72 2.81a2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45c.91.35 1.85.59 2.81.72A2 2 0 0 1 22 16.92z" />
  </svg>
);

const LogoMark = ({ size = 24, color = "oklch(0.88 0.20 128)" }) => (
  <svg viewBox="0 0 24 24" width={size} height={size} fill="none">
    <path d="M12 4C8 8.5 5.5 12 5.5 16C5.5 19.5 8.5 22 12 22C15.5 22 18.5 19.5 18.5 16C18.5 12 15.5 8.5 12 4Z" fill={color}/>
    <circle cx="12" cy="17" r="2" fill="var(--paper)"/>
  </svg>
);
const SKY = "oklch(0.78 0.13 230)";

const CheckIcon = () => (
  <svg viewBox="0 0 13 13" fill="none" stroke="currentColor" strokeWidth="2.2" strokeLinecap="round" strokeLinejoin="round">
    <path d="M2 7L5 10L11 3" />
  </svg>
);

const FoamDrip = () => (
  <svg
    viewBox="0 0 1200 120"
    preserveAspectRatio="none"
    style={{
      position: "absolute",
      bottom: 0,
      left: 0,
      width: "100%",
      height: "50px",
      transform: "translateY(99%)",
      zIndex: 10,
      pointerEvents: "none"
    }}
  >
    <path d="M0,0 V46.29 c47.79,22.2,103.59,32.17,158,28,70.36-5.37,136.33-33.31,206.8-37.5C438.64,32.43,512.34,53.67,583,72.05 c69.27,18,138.3,24.88,209.4,13.08,36.15-6,69.85-17.84,104.45-29.34C989.49,25,1113-14.29,1200,52.47V0Z" opacity=".4" fill="var(--accent)" />
    <path d="M0,0 V15.81C13,36.92,27.64,56.86,47.69,72.05,99.41,111.27,165,111,224.58,91.58c31.15-10.15,60.09-26.07,89.67-39.8,40.92-19,84.73-46,130.83-49.67,36.26-2.85,70.9,9.42,98.6,31.56,31.77,25.39,62.32,62,103.63,73,40.44,10.79,81.35-6.69,119.13-24.28s75.16-39,116.92-43.05c59.73-5.85,113.28,22.88,168.9,38.84,30.2,8.66,59,6.17,87.09-7.5,22.43-10.89,48-26.93,60.65-49.24V0Z" opacity=".7" fill="var(--accent)" />
    <path d="M0,0 V5.63C149.93,59,314.09,71.32,475.83,42.57c43-7.64,84.23-20.12,127.61-26.46,59-8.63,112.48,12.24,165.56,35.4C827.93,77.22,886,95.24,951.2,90c86.53-7,172.46-45.71,248.8-84.81V0Z" fill="var(--accent)" />
    <circle cx="80" cy="95" r="6" fill="var(--accent)" opacity=".9" />
    <circle cx="100" cy="110" r="3" fill="var(--accent)" opacity=".9" />
    <circle cx="280" cy="85" r="8" fill="var(--accent)" opacity=".9" />
    <circle cx="580" cy="105" r="10" fill="var(--accent)" opacity=".9" />
    <circle cx="610" cy="115" r="4" fill="var(--accent)" opacity=".9" />
    <circle cx="830" cy="90" r="6" fill="var(--accent)" opacity=".9" />
    <circle cx="1050" cy="80" r="12" fill="var(--accent)" opacity=".9" />
    <circle cx="1075" cy="100" r="5" fill="var(--accent)" opacity=".9" />
  </svg>
);

/* HEADER */
function Header({ phone, navigate, onNavToSection }) {
  const [scrolled, setScrolled] = useState(false);
  const [menuOpen, setMenuOpen] = useState(false);

  useEffect(() => {
    const onScroll = () => setScrolled(window.scrollY > 24);
    window.addEventListener("scroll", onScroll, { passive: true });
    onScroll();
    return () => window.removeEventListener("scroll", onScroll);
  }, []);

  const handleNav = (e, id) => {
    e.preventDefault();
    setMenuOpen(false);
    if (onNavToSection) onNavToSection(id);
  };

  return (
    <header className={`nav ${scrolled ? "scrolled" : ""} ${menuOpen ? "menu-open" : ""}`}>
      <div className="wrap nav-inner">
        <a href="#top" className="logo" onClick={(e) => handleNav(e, "top")}>
          <span className="logo-mark"><LogoMark size={24} color={SKY} /></span>
          <span className="logo-text">[FIRMANAVN]<span className="dot">.</span></span>
        </a>

        <button className="mobile-menu-btn" onClick={() => setMenuOpen(!menuOpen)} aria-label="Toggle menu">
          {menuOpen ? (
            <svg viewBox="0 0 24 24" width="24" height="24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
              <line x1="18" y1="6" x2="6" y2="18"></line>
              <line x1="6" y1="6" x2="18" y2="18"></line>
            </svg>
          ) : (
            <svg viewBox="0 0 24 24" width="24" height="24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
              <line x1="3" y1="12" x2="21" y2="12"></line>
              <line x1="3" y1="6" x2="21" y2="6"></line>
              <line x1="3" y1="18" x2="21" y2="18"></line>
            </svg>
          )}
        </button>

        <nav className={`nav-links ${menuOpen ? "open" : ""}`}>
          <a href="#ydelser" onClick={(e) => handleNav(e, "ydelser")}>Ydelser</a>
          <a href="#prisberegner" onClick={(e) => handleNav(e, "prisberegner")}>Prisberegner</a>
          <a href="#om-os" onClick={(e) => handleNav(e, "om-os")}>Om os</a>
          <a href="#blog" onClick={(e) => handleNav(e, "blog")}>Blog</a>
          
          <div className={`mobile-only-ctas ${menuOpen ? "open" : ""}`}>
            <a href="#prisberegner" className="btn btn-ghost btn-sm" onClick={(e) => handleNav(e, "prisberegner")}>Beregn pris</a>
            <a href={`tel:${PHONE_TEL}`} className="btn btn-primary btn-sm">
              <PhoneIcon />
              {phone}
            </a>
          </div>
        </nav>

        <div className="nav-cta">
          <a href="#prisberegner" className="btn btn-ghost btn-sm" onClick={(e) => handleNav(e, "prisberegner")}>Beregn pris</a>
          <a href={`tel:${PHONE_TEL}`} className="btn btn-primary btn-sm">
            <PhoneIcon />
            {phone}
          </a>
        </div>
      </div>
    </header>
  );
}

/* TICKER */
function Ticker() {
  const items = [
    "Mobil bilvask København",
    "Vi kommer til din dør",
    "Indvendig rengøring",
    "Professionel bilklargøring",
    "Genbrugsvand. Biologisk nedbrydeligt.",
    "Hjemme eller på arbejde",
  ];
  const all = [...items, ...items, ...items];
  return (
    <div className="ticker">
      <div className="ticker-track">
        {all.map((t, i) => (
          <span key={i} className="ticker-item">
            <span className="dot" />{t}
          </span>
        ))}
      </div>
    </div>
  );
}

/* HERO */
function Hero({ phone }) {
  return (
    <section className="hero" id="top" style={{ position: "relative" }}>
      <div className="wrap">
        <div className="hero-eyebrow-row">
          <div className="hero-eyebrow">
            <span className="live"><span className="pulse-dot" /> Online nu</span>
            <span>Mobil bilvask i København</span>
          </div>
          <div className="hero-meta">
            <span>Færdig på 90 min</span>
            <span>[KØBENHAVN_OMRÅDE]</span>
            <span>Vi kommer til dig</span>
          </div>
        </div>

        <div className="hero-grid">
          <div>
            <h1 className="hero-headline">
              Bilvask <span className="underline">leveret</span><br/>
              til <span className="accent">din dør.</span>
            </h1>
            <p className="hero-sub">
              Vi vasker din bil, hvor du er. Hjemme. På arbejde. På 90 minutter.
              Du laver det, du har lyst til. Vi laver bilen ren.
            </p>
            <div className="hero-ctas">
              <a href={`tel:${PHONE_TEL}`} className="btn btn-dark btn-lg">
                <PhoneIcon />
                Ring {phone}
              </a>
              <a href="#prisberegner" className="btn btn-ghost btn-lg">
                Beregn pris
                <ArrowCta />
              </a>
            </div>
            <div className="hero-trust-row">
              <div className="ht-item">
                <span className="ico"><CheckIcon /></span>
                <span>Vi kommer til dig</span>
              </div>
              <div className="ht-item">
                <span className="ico"><CheckIcon /></span>
                <span>Færdig på 90 min</span>
              </div>
              <div className="ht-item">
                <span className="ico"><CheckIcon /></span>
                <span>Tilfreds eller gratis</span>
              </div>
            </div>
          </div>

          <div className="hero-image-wrap">
            <img src="assets/hero.jpg" alt="Mobil bilvask i København" />
            <div className="hero-image-overlay" />
            <div className="hero-tag-tl">
              <span className="pulse-dot" style={{background: "var(--accent-deep)"}} />
              Næste ledige tid: i morgen kl. 09:00
            </div>
            <div className="hero-card-bl">
            <div className="icon"><LogoMark size={22} color={SKY} /></div>
              <div className="text">
                <strong>Mobil Bilvask</strong>
                <span>Ud + ind, færdig på 45 min</span>
              </div>
              <div className="price">
                299 kr
                <small>fra</small>
              </div>
            </div>
          </div>
        </div>
      </div>
      <FoamDrip />
    </section>
  );
}

/* SERVICES */
function Services() {
  return (
    <section className="services" id="ydelser">
      <div className="wrap">
        <div className="section-head">
          <div>
            <div className="section-tag">Ydelser</div>
            <h2 className="section-h">
              Vælg din pakke. Vi gør resten <span className="accent">for dig.</span>
            </h2>
          </div>
          <p className="lede">
            Fra hurtig håndvask til komplet detail. Vi kommer til din adresse i [KØBENHAVN_OMRÅDE]
            med eget vand, strøm og udstyr. Du behøver ikke at gøre noget.
          </p>
        </div>

        <div className="bento">
          <div className="bento-card bc-feature dark">
            <img src="assets/picture.jpg" alt="Mobil Bilvask" style={{ position: "absolute", inset: 0, width: "100%", height: "100%", objectFit: "cover", opacity: 0.35, pointerEvents: "none" }} />
            <div style={{ position: "relative", zIndex: 1, display: "flex", flexDirection: "column", flex: 1 }}>
              <span className="num">N°01 · Mest valgte</span>
              <h3>Mobil<br/>Bilvask</h3>
              <p className="desc">
                Skånsom håndvask udvendigt. Fælge og dæk renset. Ruder afsprittet.
                En hurtig støvsugning oveni. Vi kommer til døren, hjemme eller på arbejde.
              </p>
              <div className="meta">
                <span>45 min. Alle bilstørrelser.</span>
                <span className="price">fra 299 kr</span>
              </div>
            </div>
            <a href="#prisberegner" className="arrow-cta" aria-label="Beregn pris"><ArrowCta /></a>
          </div>

          <div className="bento-card bc-half">
            <span className="num">N°02</span>
            <h3>Indvendig<br/>klargøring</h3>
            <p className="desc">Støvsugning. Aftørring af alle flader. Pudsning af ruder.</p>
            <div className="meta">
              <span>60 min</span>
              <span className="price">fra 449 kr</span>
            </div>
            <a href="#prisberegner" className="arrow-cta" aria-label="Beregn pris"><ArrowCta /></a>
          </div>

          <div className="bento-card bc-img" style={{ padding: 0, overflow: "hidden" }}>
            <img src="assets/detail.jpg" alt="Premium bilvask detail" style={{ width: "100%", height: "100%", objectFit: "cover" }} />
          </div>

          <div className="bento-card bc-wide accent">
            <span className="num">N°03</span>
            <h3>Premium klargøring</h3>
            <p className="desc">
              Komplet ud og ind. Sealer på lakken. Læderpleje og motorrumsrens. Alt på én gang.
            </p>
            <div className="meta">
              <span>120 min. Ud + ind.</span>
              <span className="price">fra 999 kr</span>
            </div>
            <a href="#prisberegner" className="arrow-cta" aria-label="Beregn pris"><ArrowCta /></a>
          </div>

          <div className="bento-card bc-wide">
            <span className="num">N°04</span>
            <h3>Luksus Detail</h3>
            <p className="desc">
              Lakrens, polering, keramisk forsegling, læder og tekstil.
              Showroom-finish, hjemme i indkørslen.
            </p>
            <div className="meta">
              <span>4 til 6 timer. Efter aftale.</span>
              <span className="price">fra 2.499 kr</span>
            </div>
            <a href="#prisberegner" className="arrow-cta" aria-label="Beregn pris"><ArrowCta /></a>
          </div>
        </div>
      </div>
    </section>
  );
}

/* PROCESS */
function Process() {
  const steps = [
    { n: "01", t: "Du ringer", d: "Eller bruger prisberegneren. 30 sekunder. Ingen formular." },
    { n: "02", t: "Vi planlægger", d: "Tid, adresse, bil. Hjemme eller på arbejde i [KØBENHAVN_OMRÅDE]." },
    { n: "03", t: "Vi kommer", d: "Eget vand, strøm og udstyr. Du fortsætter din dag." },
    { n: "04", t: "Du betaler", d: "Kun hvis du er glad. Tilfredshedsgaranti. Ellers ingen regning." },
  ];
  return (
    <section className="process">
      <div className="wrap">
        <div className="section-head">
          <div>
            <div className="section-tag">Sådan foregår det</div>
            <h2 className="section-h">
              Fire skridt. <span className="accent">Nul besvær.</span>
            </h2>
          </div>
          <p className="lede">
            Ingen vaskehaller. Ingen ventetid. Ingen apps. Bare et opkald og en ren bil.
          </p>
        </div>
        <div className="process-track">
          {steps.map((s) => (
            <div key={s.n} className="proc-step">
              <div className="num">{s.n}</div>
              <h4>{s.t}</h4>
              <p>{s.d}</p>
            </div>
          ))}
        </div>
      </div>
    </section>
  );
}

/* CALCULATOR */
const CAR_SIZES = [
  { id: "lille", label: "Lille", desc: "Polo. 500.", mult: 0.85 },
  { id: "mellem", label: "Mellem", desc: "Golf. A4.", mult: 1.0 },
  { id: "stor", label: "Stor\u00a0/\u00a0SUV", desc: "X5. Tiguan.", mult: 1.25 },
];
const SERVICE_LEVELS = [
  { id: "basis", label: "Basis Vask", desc: "Udvendig håndvask", base: 299 },
  { id: "indvendig", label: "Indvendig Klargøring", desc: "Støvsug + ruder", base: 449 },
  { id: "premium", label: "Premium Klargøring", desc: "Ud + ind + sealer", base: 999 },
  { id: "luksus", label: "Luksus Detail", desc: "Polering + forsegling", base: 2499 },
];
const ADDONS = [
  { id: "lader", label: "Læderpleje", price: 199 },
  { id: "motor", label: "Motorrumsrens", price: 249 },
  { id: "lugt", label: "Lugtfjernelse (ozon)", price: 349 },
];

function useAnimatedNumber(target, duration = 500) {
  const [value, setValue] = useState(target);
  const fromRef = useRef(target);
  const startRef = useRef(0);
  const rafRef = useRef(0);
  useEffect(() => {
    fromRef.current = value;
    startRef.current = performance.now();
    cancelAnimationFrame(rafRef.current);
    const tick = (now) => {
      const t = Math.min(1, (now - startRef.current) / duration);
      const eased = 1 - Math.pow(1 - t, 3);
      const v = Math.round(fromRef.current + (target - fromRef.current) * eased);
      setValue(v);
      if (t < 1) rafRef.current = requestAnimationFrame(tick);
    };
    rafRef.current = requestAnimationFrame(tick);
    return () => cancelAnimationFrame(rafRef.current);
  }, [target]);
  return value;
}

function Calculator({ phone }) {
  const [size, setSize] = useState("mellem");
  const [level, setLevel] = useState("indvendig");
  const [addons, setAddons] = useState({});

  const baseObj = SERVICE_LEVELS.find((s) => s.id === level);
  const sizeObj = CAR_SIZES.find((c) => c.id === size);
  const basePrice = Math.round(baseObj.base * sizeObj.mult);
  const addonsTotal = ADDONS.reduce((sum, a) => addons[a.id] ? sum + a.price : sum, 0);
  const total = basePrice + addonsTotal;
  const animated = useAnimatedNumber(total, 480);

  const toggleAddon = (id) => setAddons((a) => ({ ...a, [id]: !a[id] }));

  return (
    <section className="calc" id="prisberegner">
      <div className="wrap">
        <div className="section-head">
          <div>
            <div className="section-tag">Prisberegner. 30 sek.</div>
            <h2 className="section-h">
              Få din pris <span className="accent">uden at ringe.</span>
            </h2>
          </div>
          <p className="lede">
            Vælg bilstørrelse og service, så ser du prisen med det samme. Ring bagefter for at booke.
          </p>
        </div>

        <div className="calc-card">
          <div className="calc-form">
            <div className="calc-step">
              <div className="step-h">
                <h4>Hvor stor er din bil?</h4>
                <span className="step-num">01 / 03</span>
              </div>
              <div className="pill-row">
                {CAR_SIZES.map((c) => (
                  <button key={c.id} className={`pill ${size === c.id ? "active" : ""}`} onClick={() => setSize(c.id)}>
                    {c.label}
                    <span className="sub">{c.desc}</span>
                  </button>
                ))}
              </div>
            </div>

            <div className="calc-step">
              <div className="step-h">
                <h4>Hvilken service?</h4>
                <span className="step-num">02 / 03</span>
              </div>
              <div className="level-row">
                {SERVICE_LEVELS.map((s) => (
                  <div key={s.id} className={`level ${level === s.id ? "active" : ""}`} onClick={() => setLevel(s.id)}>
                    <span className="name">{s.label}</span>
                    <span className="desc">{s.desc}. fra {s.base} kr.</span>
                  </div>
                ))}
              </div>
            </div>

            <div className="calc-step">
              <div className="step-h">
                <h4>Tilvalg (valgfrit)</h4>
                <span className="step-num">03 / 03</span>
              </div>
              <div className="addons">
                {ADDONS.map((a) => (
                  <div key={a.id} className={`addon ${addons[a.id] ? "on" : ""}`} onClick={() => toggleAddon(a.id)}>
                    <div className="left">
                      <div className="box">{addons[a.id] ? "✓" : ""}</div>
                      <span>{a.label}</span>
                    </div>
                    <span className="price">+ {a.price} kr</span>
                  </div>
                ))}
              </div>
            </div>
          </div>

          <div className="calc-side">
            <div className="price-display">
              <div className="lbl">Din pris. Inkl. moms.</div>
              <h3 className="price-num">
                <span>{animated.toLocaleString("da-DK")}</span>
                <span className="currency">kr</span>
              </h3>
              <div className="breakdown">
                <div className="pb-row">
                  <span>{baseObj.label}, {sizeObj.label.replace(/\u00a0/g, " ").toLowerCase()} bil</span>
                  <span>{basePrice.toLocaleString("da-DK")} kr</span>
                </div>
                {ADDONS.filter(a => addons[a.id]).map((a) => (
                  <div className="pb-row" key={a.id}>
                    <span>+ {a.label}</span>
                    <span>{a.price} kr</span>
                  </div>
                ))}
                <div className="pb-row total">
                  <span>I alt</span>
                  <span>{total.toLocaleString("da-DK")} kr</span>
                </div>
              </div>
            </div>

            <div style={{flex: 1}} />

            <div className="calc-cta">
              <a href={`tel:${PHONE_TEL}`} className="btn btn-dark btn-lg">
                <PhoneIcon />
                Ring {phone} for at booke
              </a>
              <div className="calc-fineprint">
                Ingen binding. Tilfredshedsgaranti. [KØBENHAVN_OMRÅDE].
              </div>
            </div>
          </div>
        </div>
      </div>
    </section>
  );
}

/* ABOUT */
function About() {
  return (
    <section className="about" id="om-os">
      <div className="wrap about-grid">
        <div className="about-media" style={{ overflow: "hidden" }}>
          <img src="assets/team.jpg" alt="Vaska teamet" style={{ width: "100%", height: "100%", objectFit: "cover" }} />
        </div>
        <div className="about-content">
          <div className="section-tag">Om os. København.</div>
          <p className="about-quote">
            Det skulle være <span className="accent">nemmere</span> at have en ren bil i byen.
          </p>
          <p>
            Vi startede [FIRMANAVN], fordi vi var trætte af at bruge lørdag formiddag i kø ved en vaskehal.
            Ingen apps. Ingen abonnement. Bare professionel bilklargøring leveret til døren i [KØBENHAVN_OMRÅDE].
          </p>
          <p className="muted">
            Biologisk nedbrydelige produkter. Genbrugsvand i lukkede systemer. Fuldt forsikret.
            Et fast hold. Samme håndværk hver gang.
          </p>
          <div className="about-stats">
            <div className="stat-item">
              <div className="num">90<span className="accent">′</span></div>
              <div className="lbl">Gns. tid pr. bil</div>
            </div>
            <div className="stat-item">
              <div className="num">100<span className="accent">%</span></div>
              <div className="lbl">Tilfredshedsgaranti</div>
            </div>
            <div className="stat-item">
              <div className="num">0<span className="accent">L</span></div>
              <div className="lbl">Spildt vand</div>
            </div>
          </div>
        </div>
      </div>
    </section>
  );
}

/* BLOG */
const POSTS = [
  {
    cat: "Guide", date: "Apr 2026", read: "4 min",
    title: "Hvorfor mobil bilvask er fremtiden i København",
    excerpt: "Trafik, parkering og tid er knappe ressourcer i byen. Sådan vinder du dem alle tilbage.",
    img: "assets/guide.jpg",
  },
  {
    cat: "Tips", date: "Mar 2026", read: "6 min",
    title: "5 tips til at holde din bil ren mellem vaske i [KØBENHAVN_OMRÅDE]",
    excerpt: "Pollen, salt, måger. Sådan beskytter du lakken og holder kabinen frisk længere.",
    img: "assets/tips.jpg",
  },
];

function Blog() {
  return (
    <section className="blog" id="blog">
      <div className="wrap">
        <div className="section-head">
          <div>
            <div className="section-tag">Blog</div>
            <h2 className="section-h">
              Tips fra dem <span className="accent">der vasker.</span>
            </h2>
          </div>
          <p className="lede">
            Korte guides og biltips fra København. Skrevet af håndværkere, ikke marketing.
          </p>
        </div>
        <div className="blog-grid">
          {POSTS.map((p, i) => (
            <article key={i} className="blog-card">
              <div className="blog-img" style={{ overflow: "hidden" }}>
                <img src={p.img} alt={p.title} style={{ width: "100%", height: "100%", objectFit: "cover" }} />
              </div>
              <div className="blog-body">
                <div className="blog-meta">
                  <span>{p.cat}</span><span>·</span>
                  <span>{p.date}</span><span>·</span>
                  <span>{p.read}</span>
                </div>
                <h3>{p.title}</h3>
                <p>{p.excerpt}</p>
                <span className="blog-link">Læs artiklen <ArrowCta /></span>
              </div>
            </article>
          ))}
        </div>
      </div>
    </section>
  );
}

/* FINAL CTA */
function FinalCTA({ phone }) {
  return (
    <section className="final-cta">
      <div className="final-cta-eyebrow">Klar til en ren bil?</div>
      <h2>
        Bare <span className="accent">ring.</span>
      </h2>
      <a href={`tel:${PHONE_TEL}`} className="final-phone">
        <PhoneIcon />
        {phone}
      </a>
    </section>
  );
}

/* FOOTER */
function Footer({ phone }) {
  return (
    <footer>
      <div className="wrap">
        <div className="ft-mega">
          ren bil. <span className="accent">nemt.</span>
        </div>
        <div className="ft-grid">
          <div className="ft-col">
            <a href="#top" className="logo" style={{marginBottom: 16}}>
              <span className="logo-mark"><LogoMark size={22} color={SKY} /></span>
              <span className="logo-text">[FIRMANAVN]<span className="dot">.</span></span>
            </a>
            <p style={{maxWidth: 320, marginTop: 20}}>
              Professionel mobil bilvask og bilklargøring i København.
              Vi kommer til dig i [KØBENHAVN_OMRÅDE], hjemme eller på arbejde.
            </p>
          </div>
          <div className="ft-col">
            <h5>Ydelser</h5>
            <a href="#ydelser">Mobil bilvask</a>
            <a href="#ydelser">Indvendig klargøring</a>
            <a href="#ydelser">Premium klargøring</a>
            <a href="#ydelser">Luksus detail</a>
          </div>
          <div className="ft-col">
            <h5>Selskab</h5>
            <a href="#om-os">Om os</a>
            <a href="#blog">Blog</a>
            <a href="#prisberegner">Prisberegner</a>
          </div>
          <div className="ft-col">
            <h5>Kontakt</h5>
            <a href={`tel:${PHONE_TEL}`}>{phone}</a>
            <a href="mailto:[EMAIL]">[EMAIL]</a>
            <p>[ADRESSE]<br/>[KØBENHAVN_OMRÅDE]</p>
          </div>
        </div>
        <div className="ft-bottom">
          <span>© 2026 [FIRMANAVN]. CVR [CVR_NUMMER].</span>
          <span>
            <a href="#">Handelsbetingelser</a>{"  ·  "}
            <a href="#">Privatliv</a>{"  ·  "}
            <a href="#">Cookies</a>
          </span>
        </div>
      </div>
    </footer>
  );
}

/* COOKIE BANNER */
function CookieBanner({ navigate }) {
  const [show, setShow] = useState(false);

  useEffect(() => {
    const consent = localStorage.getItem("vaska_cookie_consent");
    if (!consent) setShow(true);
  }, []);

  const handleConsent = (level) => {
    localStorage.setItem("vaska_cookie_consent", level);
    setShow(false);
  };

  if (!show) return null;

  return (
    <div style={{
      position: "fixed", bottom: 0, left: 0, right: 0, zIndex: 9999,
      background: "#121822", color: "#fff", padding: "24px",
      display: "flex", flexWrap: "wrap", gap: "24px", alignItems: "center", justifyContent: "space-between",
      boxShadow: "0 -10px 40px rgba(0,0,0,0.15)", borderTop: "1px solid rgba(255,255,255,0.1)"
    }}>
      <div style={{ flex: "1 1 300px", fontSize: "0.95rem", lineHeight: 1.5, maxWidth: "800px" }}>
        <h4 style={{ marginBottom: "8px", fontSize: "1.1rem", fontWeight: 600 }}>Vi bruger cookies</h4>
        <p style={{ color: "rgba(255,255,255,0.7)", margin: 0 }}>
          Vi og vores partnere bruger cookies for at sikre, at vores hjemmeside fungerer korrekt (nødvendige), 
          samt for at analysere trafik og tilpasse markedsføring (valgfrie). Du kan altid ændre dit samtykke. Læs mere i vores{" "}
          <a href="#" onClick={(e) => { e.preventDefault(); navigate("legal", "Cookies"); }} style={{ color: "#fff", textDecoration: "underline", textUnderlineOffset: 4 }}>cookiepolitik</a>.
        </p>
      </div>
      <div style={{ display: "flex", gap: "12px", flexWrap: "wrap" }}>
        <button className="btn btn-ghost" style={{ color: "#fff", borderColor: "rgba(255,255,255,0.3)" }} onClick={() => handleConsent("necessary")}>Kun nødvendige</button>
        <button className="btn btn-primary" onClick={() => handleConsent("all")}>Accepter alle</button>
      </div>
    </div>
  );
}

/* PAGE VIEWS */
function ArticleView({ post, onBack }) {
  if (!post) return null;
  return (
    <section className="page-view wrap">
      <button onClick={onBack} className="btn btn-ghost btn-sm" style={{marginBottom: 32}}>
        ← Tilbage
      </button>
      <div className="blog-meta" style={{marginBottom: 16}}>
        <span>{post.cat}</span><span>·</span>
        <span>{post.date}</span><span>·</span>
        <span>{post.read}</span>
      </div>
      <h1>{post.title}</h1>
      <div style={{width: "100%", height: "45vh", overflow: "hidden", borderRadius: 16, marginBottom: 40}}>
        <img src={post.img} alt={post.title} style={{width: "100%", height: "100%", objectFit: "cover"}} />
      </div>
      <div style={{maxWidth: 680, margin: "0 auto", fontSize: "1.1rem", lineHeight: 1.8}}>
        <p className="lede" style={{fontSize: "1.25rem", fontWeight: 500, marginBottom: 32}}>{post.excerpt}</p>
        <p style={{marginBottom: 24}}>
          [ARTIKEL_INDHOLD_AFSNIT_1] Dette er en placeholder-tekst til demo-brug for din klient. 
          Her vil det fulde indhold af din artikel om <strong>{post.title.toLowerCase()}</strong> i [KØBENHAVN_OMRÅDE] stå.
        </p>
        <h3 style={{marginTop: 40, marginBottom: 16}}>Vigtigheden af professionel klargøring</h3>
        <p style={{marginBottom: 24}}>
          [ARTIKEL_INDHOLD_AFSNIT_2] Nullam in dui mauris. Vivamus hendrerit arcu sed erat molestie vehicula. Sed auctor neque eu tellus rhoncus ut eleifend nibh porttitor.
        </p>
        <p style={{marginBottom: 24}}>
          [ARTIKEL_INDHOLD_AFSNIT_3] Donec sit amet aliquet quam, a congue sem. Maecenas tristique est sed lectus elementum pulvinar.
        </p>
      </div>
    </section>
  );
}

function CareerView() {
  return (
    <section className="page-view wrap">
      <div className="section-head">
        <div className="section-tag">Karriere</div>
        <h1>Bliv en del af <span className="accent">holdet.</span></h1>
        <p className="lede">
          Vi leder altid efter dedikerede folk til at levere byens bedste bilvask i [KØBENHAVN_OMRÅDE].
        </p>
      </div>
      <div style={{display: "grid", gridTemplateColumns: "repeat(auto-fit, minmax(300px, 1fr))", gap: 24, marginTop: 40}}>
        <div className="bento-card bc-half dark">
          <h3 style={{marginBottom: 16}}>Mobil Klargøringsekspert</h3>
          <p className="desc" style={{marginBottom: 24}}>
            [KARRIERE_BESKRIVELSE_1] Er du detaljeorienteret og elsker du biler? Vi søger en udadvendt person til at køre vores mobile vaskeenheder.
          </p>
          <div className="meta" style={{marginBottom: 24}}>
            <span>Fuldtid · [KØBENHAVN_OMRÅDE]</span>
          </div>
          <button className="btn btn-primary btn-sm">Ansøg nu</button>
        </div>
        <div className="bento-card bc-half">
          <h3 style={{marginBottom: 16}}>Uopfordret ansøgning</h3>
          <p className="desc" style={{marginBottom: 24}}>
            [KARRIERE_BESKRIVELSE_2] Mener du, at du passer ind i teamet, men vi har ikke den rette stilling åben lige nu? Send os en mail med din ansøgning.
          </p>
          <div className="meta" style={{marginBottom: 24}}>
            <span>Fleksibel · [KØBENHAVN_OMRÅDE]</span>
          </div>
          <button className="btn btn-dark btn-sm">Send mail</button>
        </div>
      </div>
    </section>
  );
}

function LegalView({ title }) {
  return (
    <section className="page-view wrap" style={{ maxWidth: 800 }}>
      <h1>{title}</h1>
      <div style={{ fontSize: "1rem", lineHeight: 1.8 }}>
        <p style={{ marginBottom: 24, color: "var(--fg-muted)" }}>Sidst opdateret: [DATO]</p>
        <h3 style={{ marginTop: 32, marginBottom: 16 }}>1. Generelle oplysninger</h3>
        <p style={{ marginBottom: 24 }}>
          Dette er en placeholder for <strong>{title}</strong>. Her vil du indsætte de juridisk gældende betingelser for din virksomhed.
        </p>
        <p style={{ marginBottom: 24 }}>
          Virksomhed: [FIRMANAVN]<br />
          CVR: [CVR_NUMMER]<br />
          Adresse: [ADRESSE], [KØBENHAVN_OMRÅDE]<br />
          E-mail: [EMAIL]
        </p>
        <h3 style={{ marginTop: 32, marginBottom: 16 }}>2. [JURIDISK_PUNKT]</h3>
        <p style={{ marginBottom: 24 }}>
          [JURIDISK_TEKST_1] Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam in dui mauris. Vivamus hendrerit arcu sed erat molestie vehicula.
        </p>
        <h3 style={{ marginTop: 32, marginBottom: 16 }}>3. [JURIDISK_PUNKT]</h3>
        <p style={{ marginBottom: 24 }}>
          [JURIDISK_TEKST_2] Sed auctor neque eu tellus rhoncus ut eleifend nibh porttitor. Ut in nulla enim. Phasellus molestie magna non est bibendum non venenatis nisl tempor.
        </p>
      </div>
    </section>
  );
}

/* TWEAKS */
function Tweaks({ onChange }) {
  const defaults = JSON.parse(document.getElementById("tweak-defaults").textContent.replace(/\/\*EDITMODE-(BEGIN|END)\*\//g, ""));
  const [tweaks, setTweak] = useTweaks(defaults);

  useEffect(() => {
    const root = document.documentElement;
    const hue = tweaks.accentHue;
    const c = tweaks.accentChroma;
    root.style.setProperty("--accent", `oklch(0.88 ${c} ${hue})`);
    root.style.setProperty("--accent-deep", `oklch(0.68 ${Math.min(c * 1.1, 0.25)} ${hue})`);
    const inkL = c > 0.05 ? 0.18 : 0.16;
    root.style.setProperty("--accent-ink", `oklch(${inkL} ${Math.min(c * 0.4, 0.06)} ${hue})`);
    onChange?.(tweaks);
  }, [tweaks.accentHue, tweaks.accentChroma, tweaks.phoneNumber]);

  return (
    <TweaksPanel title="Tweaks">
      <TweakSection label="Accent">
        <TweakSlider label="Hue" value={tweaks.accentHue} min={0} max={360} step={1}
          onChange={(v) => setTweak("accentHue", v)} />
        <TweakSlider label="Chroma" value={tweaks.accentChroma} min={0} max={0.3} step={0.01}
          onChange={(v) => setTweak("accentChroma", v)} />
        <div style={{display: "grid", gridTemplateColumns: "repeat(5,1fr)", gap: 6, marginTop: 8}}>
          {[
            {label: "Lime", h: 128, c: 0.20},
            {label: "Cyan", h: 200, c: 0.18},
            {label: "Sky", h: 235, c: 0.16},
            {label: "Korall", h: 30, c: 0.20},
            {label: "Sand", h: 70, c: 0.12},
          ].map((p) => (
            <button key={p.label}
              onClick={() => { setTweak("accentHue", p.h); setTweak("accentChroma", p.c); }}
              style={{ padding: "10px 4px", borderRadius: 8, border: "1px solid #ddd",
                background: `oklch(0.86 ${p.c} ${p.h})`, color: "#222",
                fontSize: 11, cursor: "pointer", fontWeight: 600 }}
            >{p.label}</button>
          ))}
        </div>
      </TweakSection>
      <TweakSection label="Kontakt">
        <TweakText label="Telefonnummer" value={tweaks.phoneNumber}
          onChange={(v) => setTweak("phoneNumber", v)} />
      </TweakSection>
    </TweaksPanel>
  );
}

/* APP */
function App() {
  const defaults = JSON.parse(document.getElementById("tweak-defaults").textContent.replace(/\/\*EDITMODE-(BEGIN|END)\*\//g, ""));
  const [phone, setPhone] = useState(defaults.phoneNumber);
  const [view, setView] = useState({ page: "home", data: null });

  const navigate = (page, data = null) => {
    setView({ page, data });
    window.scrollTo(0, 0);
  };

  const navToSection = (id) => {
    if (view.page !== "home") {
      navigate("home");
      setTimeout(() => {
        const el = document.getElementById(id);
        if (el) el.scrollIntoView({ behavior: "smooth" });
      }, 100);
    } else {
      const el = document.getElementById(id);
      if (el) el.scrollIntoView({ behavior: "smooth" });
    }
  };

  return (
    <>
      <style>{`
        body {
          background-color: #090E14 !important;
        }
        .page-view {
          padding-top: 140px;
          padding-bottom: 80px;
          min-height: 80vh;
        }
        .page-view h1 {
          font-size: clamp(2.5rem, 6vw, 4rem);
          letter-spacing: -0.03em;
          margin-bottom: 24px;
          line-height: 1.1;
        }
        @keyframes fadeIn {
          from { opacity: 0; transform: translateY(12px); }
          to { opacity: 1; transform: translateY(0); }
        }
        .fade-in {
          animation: fadeIn 0.4s cubic-bezier(0.16, 1, 0.3, 1) forwards;
        }

        /* MOBILE OPTIMIZATIONS */
        .mobile-menu-btn { display: none; background: none; border: none; cursor: pointer; color: inherit; padding: 4px; margin-left: auto; }
        .mobile-only-ctas { display: none; }
        
        @media (max-width: 768px) {
          .nav-inner { flex-wrap: wrap; }
          .nav-cta { display: none; }
          .mobile-menu-btn { display: block; }
          .nav.menu-open { background: #090E14 !important; height: 100vh !important; overflow-y: auto; border-bottom: none; }
          .nav-links { display: none; width: 100%; flex-direction: column; padding: 32px 0 64px 0; gap: 24px; border-top: 1px solid rgba(255,255,255,0.1); margin-top: 16px; font-size: 1.25rem; }
          .nav-links.open { display: flex; }
          .mobile-only-ctas { display: flex; flex-direction: column; margin-top: 16px; gap: 12px; }
          .mobile-only-ctas .btn { width: 100%; justify-content: center; }
          
          .hero-headline { font-size: 2.5rem !important; }
          .hero-eyebrow-row { flex-direction: column; align-items: flex-start !important; gap: 12px; }
          .hero-grid { grid-template-columns: 1fr !important; gap: 40px !important; }
          .hero-ctas { flex-direction: column; }
          .hero-ctas .btn { width: 100%; justify-content: center; }
          .hero-trust-row { flex-direction: column; align-items: flex-start !important; gap: 12px; }
          
          .hero-tag-tl { top: 12px !important; left: 12px !important; right: auto !important; max-width: calc(100% - 24px); font-size: 0.75rem !important; padding: 8px 12px !important; }
          .hero-card-bl { bottom: 12px !important; left: 12px !important; right: 12px !important; width: auto !important; }

          .bento { grid-template-columns: 1fr !important; }
          .bento-card { grid-column: span 1 !important; }
          
          .process-track { flex-direction: column !important; gap: 24px; }
          
          .calc-card { flex-direction: column !important; }
          .calc-side { margin-top: 32px; }
          
          .about-grid, .blog-grid, .ft-grid { grid-template-columns: 1fr !important; gap: 32px; }
          .ft-bottom { flex-direction: column; align-items: flex-start !important; gap: 16px; }
          .section-h { font-size: 2rem !important; line-height: 1.15; }
          .section-head { margin-bottom: 32px !important; }
          .lede { font-size: 1.1rem !important; }
        }
      `}</style>
      <Header phone={phone} navigate={navigate} onNavToSection={navToSection} />
      
      <div key={view.page} className="fade-in">
        {view.page === "home" && (
          <>
            <Hero phone={phone} />
            <Ticker />
            <Services />
            <Process />
            <Calculator phone={phone} />
            <About />
            <Blog navigate={navigate} />
            <FinalCTA phone={phone} />
          </>
        )}

        {view.page === "article" && <ArticleView post={view.data} onBack={() => navigate("home")} />}
        {view.page === "legal" && <LegalView title={view.data} />}
        {view.page === "career" && <CareerView />}
      </div>

      <Footer phone={phone} navigate={navigate} onNavToSection={navToSection} />
      <CookieBanner navigate={navigate} />
      <Tweaks onChange={(t) => setPhone(t.phoneNumber)} />
    </>
  );
}

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