// Main portfolio app — brutalist/bold, 3 variants, PL/EN, dark/light, live GitHub
const { useState, useEffect, useRef, useMemo } = React;

const DEFAULTS = /*EDITMODE-BEGIN*/{
  "variant": "mono",
  "lang": "pl",
  "dark": false
}/*EDITMODE-END*/;

// ============================================================================
// REPO MODAL (private repos detail view)
// ============================================================================
function RepoModal({ repo, lang, t, onClose }) {
  const shots = repo.screenshots || [];
  const [idx, setIdx] = useState(0);
  const [lightbox, setLightbox] = useState(false);
  const lightboxRef = useRef(false);
  lightboxRef.current = lightbox;

  useEffect(() => {
    const prev = document.body.style.overflow;
    document.body.style.overflow = "hidden";
    const onKey = (e) => {
      if (e.key === "Escape") { if (lightboxRef.current) setLightbox(false); else onClose(); }
      if (e.key === "ArrowRight" && shots.length > 1) setIdx(i => (i + 1) % shots.length);
      if (e.key === "ArrowLeft"  && shots.length > 1) setIdx(i => (i - 1 + shots.length) % shots.length);
    };
    window.addEventListener("keydown", onKey);
    return () => {
      document.body.style.overflow = prev;
      window.removeEventListener("keydown", onKey);
    };
  }, [onClose, shots.length]);

  return (
    <>
      <div className="pf-modal-overlay" onClick={onClose}>
        <div className="pf-modal-panel" onClick={(e) => e.stopPropagation()}>
          <div className="pf-modal-header">
            <div className="pf-modal-header-left">
              <span className="pf-private-badge">{t.private_label}</span>
              <span className="pf-modal-year">{repo.year}</span>
            </div>
            <button className="pf-modal-close" onClick={onClose} aria-label={t.close}>
              <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" width="18" height="18">
                <path d="M18 6L6 18M6 6l12 12"/>
              </svg>
            </button>
          </div>
          <div className="pf-modal-body">
            <h2 className="pf-modal-title">{repo.name}</h2>

            <p className="pf-modal-desc">{repo.desc[lang]}</p>
            <div className="pf-modal-stack">
              {repo.stack.map((s, i) => <span key={i} className="pf-skill-chip">{s}</span>)}
            </div>

            <div className="pf-modal-gallery">
              {shots.length > 0 ? (
                <>
                  <div className="pf-modal-screenshot pf-modal-screenshot-zoomable" onClick={() => setLightbox(true)}>
                    <img src={shots[idx]} alt={`${repo.name} ${idx + 1}`}/>
                    <div className="pf-modal-zoom-hint">
                      <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" width="20" height="20"><path d="M15 3h6v6M9 21H3v-6M21 3l-7 7M3 21l7-7"/></svg>
                    </div>
                  </div>
                  {shots.length > 1 && (
                    <div className="pf-modal-gallery-nav">
                      <button className="pf-gallery-btn" onClick={() => setIdx(i => (i - 1 + shots.length) % shots.length)}>
                        <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" width="16" height="16"><path d="M15 18l-6-6 6-6"/></svg>
                      </button>
                      <span className="pf-gallery-counter">{idx + 1} / {shots.length}</span>
                      <button className="pf-gallery-btn" onClick={() => setIdx(i => (i + 1) % shots.length)}>
                        <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" width="16" height="16"><path d="M9 18l6-6-6-6"/></svg>
                      </button>
                      <div className="pf-gallery-dots">
                        {shots.map((_, i) => (
                          <button key={i} className={`pf-gallery-dot ${i === idx ? "active" : ""}`} onClick={() => setIdx(i)}/>
                        ))}
                      </div>
                    </div>
                  )}
                </>
              ) : (
                <div className="pf-modal-screenshot">
                  <div className="pf-modal-screenshot-placeholder">
                    <Icon.github width="36" height="36"/>
                    <span>{t.screenshot_placeholder}</span>
                  </div>
                </div>
              )}
            </div>
          </div>
        </div>
      </div>

      {lightbox && (
        <div className="pf-lightbox" onClick={() => setLightbox(false)}>
          <button className="pf-lightbox-close" onClick={() => setLightbox(false)} aria-label={t.close}>
            <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" width="20" height="20"><path d="M18 6L6 18M6 6l12 12"/></svg>
          </button>
          {shots.length > 1 && (
            <>
              <button className="pf-lightbox-nav pf-lightbox-prev" onClick={(e) => { e.stopPropagation(); setIdx(i => (i - 1 + shots.length) % shots.length); }}>
                <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" width="24" height="24"><path d="M15 18l-6-6 6-6"/></svg>
              </button>
              <button className="pf-lightbox-nav pf-lightbox-next" onClick={(e) => { e.stopPropagation(); setIdx(i => (i + 1) % shots.length); }}>
                <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" width="24" height="24"><path d="M9 18l6-6-6-6"/></svg>
              </button>
            </>
          )}
          <img src={shots[idx]} alt={`${repo.name} ${idx + 1}`} onClick={(e) => e.stopPropagation()}/>
          {shots.length > 1 && (
            <div className="pf-lightbox-counter">{idx + 1} / {shots.length}</div>
          )}
        </div>
      )}
    </>
  );
}

// ============================================================================
// GITHUB LIVE DATA HOOK
// ============================================================================
function useGithubRepos(username) {
  const [repos, setRepos] = useState(null);
  const [error, setError] = useState(null);

  useEffect(() => {
    let cancelled = false;
    fetch(`https://api.github.com/users/${username}/repos?sort=updated&per_page=12`)
      .then(r => r.ok ? r.json() : Promise.reject(r.status))
      .then(data => {
        if (cancelled) return;
        const filtered = (data || [])
          .filter(r => !r.fork)
          .sort((a, b) => (b.stargazers_count - a.stargazers_count) || (new Date(b.updated_at) - new Date(a.updated_at)));
        setRepos(filtered);
      })
      .catch(e => !cancelled && setError(String(e)));
    return () => { cancelled = true; };
  }, [username]);

  return { repos, error };
}

// ============================================================================
// ICONS (minimal, monoline, brutalist)
// ============================================================================
const Icon = {
  arrow: (p) => <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" {...p}><path d="M5 12h14M13 5l7 7-7 7"/></svg>,
  arrowUp: (p) => <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" {...p}><path d="M7 17L17 7M8 7h9v9"/></svg>,
  github: (p) => <svg viewBox="0 0 24 24" fill="currentColor" {...p}><path d="M12 2C6.48 2 2 6.58 2 12.22c0 4.51 2.87 8.34 6.84 9.69.5.09.68-.22.68-.48v-1.69c-2.78.61-3.37-1.35-3.37-1.35-.45-1.17-1.11-1.48-1.11-1.48-.91-.63.07-.62.07-.62 1 .07 1.53 1.05 1.53 1.05.89 1.55 2.34 1.1 2.91.84.09-.66.35-1.1.63-1.36-2.22-.26-4.56-1.13-4.56-5.03 0-1.11.39-2.02 1.03-2.73-.1-.26-.45-1.29.1-2.69 0 0 .84-.27 2.75 1.04A9.38 9.38 0 0112 6.84c.85 0 1.71.12 2.51.34 1.91-1.31 2.75-1.04 2.75-1.04.55 1.4.2 2.43.1 2.69.64.71 1.03 1.62 1.03 2.73 0 3.91-2.34 4.77-4.57 5.02.36.32.68.94.68 1.9v2.81c0 .27.18.58.69.48A10.02 10.02 0 0022 12.22C22 6.58 17.52 2 12 2z"/></svg>,
  linkedin: (p) => <svg viewBox="0 0 24 24" fill="currentColor" {...p}><path d="M19 3a2 2 0 012 2v14a2 2 0 01-2 2H5a2 2 0 01-2-2V5a2 2 0 012-2h14zM8.34 18V10H5.67v8h2.67zM7 8.7a1.55 1.55 0 10.02-3.1 1.55 1.55 0 00-.02 3.1zM18.34 18v-4.57c0-2.47-1.32-3.63-3.08-3.63-1.42 0-2.05.78-2.4 1.33V10h-2.67v8h2.67v-4.47c0-.24.02-.48.09-.65.19-.48.63-.98 1.37-.98.96 0 1.35.73 1.35 1.81V18h2.67z"/></svg>,
  mail: (p) => <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" {...p}><rect x="3" y="5" width="18" height="14" rx="1"/><path d="M3 7l9 7 9-7"/></svg>,
  star: (p) => <svg viewBox="0 0 24 24" fill="currentColor" {...p}><path d="M12 2l2.9 6.9L22 10l-5.5 4.8L18 22l-6-3.8L6 22l1.5-7.2L2 10l7.1-1.1L12 2z"/></svg>,
  fork: (p) => <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" {...p}><circle cx="6" cy="6" r="2"/><circle cx="18" cy="6" r="2"/><circle cx="12" cy="18" r="2"/><path d="M6 8v3a2 2 0 002 2h8a2 2 0 002-2V8M12 13v3"/></svg>,
  download: (p) => <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" {...p}><path d="M12 3v12m0 0l-5-5m5 5l5-5M5 21h14"/></svg>,
  sun: (p) => <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" {...p}><circle cx="12" cy="12" r="4"/><path d="M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M4.93 19.07l1.41-1.41M17.66 6.34l1.41-1.41"/></svg>,
  moon: (p) => <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" {...p}><path d="M21 12.79A9 9 0 1111.21 3 7 7 0 0021 12.79z"/></svg>,
  dot: (p) => <svg viewBox="0 0 8 8" fill="currentColor" {...p}><circle cx="4" cy="4" r="3"/></svg>,
};

// ============================================================================
// HEADER / NAV
// ============================================================================
function Header({ lang, setLang, dark, setDark, variant, t, D }) {
  return (
    <header className="pf-header">
      <div className="pf-header-inner">
        <a href="#top" className="pf-logo">
          <span className="pf-logo-mark">WC</span>
          <span className="pf-logo-dot"></span>
        </a>
        <nav className="pf-nav">
          <a href="#experience">{t.nav_experience}</a>
          <a href="#projects">{t.nav_projects}</a>
          <a href="#skills">{t.nav_skills}</a>
          <a href="#contact">{t.nav_contact}</a>
        </nav>
        <div className="pf-header-actions">
          <button className="pf-lang" onClick={() => setLang(lang === "pl" ? "en" : "pl")} aria-label="Toggle language">
            <span className={lang === "pl" ? "on" : ""}>PL</span>
            <span className="sep">/</span>
            <span className={lang === "en" ? "on" : ""}>EN</span>
          </button>
          <button className="pf-theme" onClick={() => setDark(!dark)} aria-label="Toggle theme">
            {dark ? <Icon.sun width="18" height="18"/> : <Icon.moon width="18" height="18"/>}
          </button>
        </div>
      </div>
    </header>
  );
}

// ============================================================================
// HERO
// ============================================================================
function Hero({ lang, t, D, variant }) {
  return (
    <section className="pf-hero" id="top">
      <div className="pf-hero-meta">
        <span className="pf-meta-row"><Icon.dot width="8" height="8" className="pulse"/> {t.available} · {t.based_in}</span>
        <span className="pf-meta-row">{D.yearsExperience}+ {lang === "pl" ? "lat w IT" : "years in IT"}</span>
      </div>

      <div className="pf-hero-main">
        <div className="pf-hero-text">
          <h1 className="pf-hero-title">
            <span className="pf-line">{D.name.split(" ")[0]}</span>
            <span className="pf-line pf-line-alt">{D.name.split(" ")[1]}<span className="pf-period">.</span></span>
          </h1>
          <div className="pf-hero-role">
            <span className="pf-slash">//</span> {D.role[lang]}
          </div>
          <p className="pf-hero-tagline">
            {D.tagline[lang].map((line, i) => (
              <span key={i} className="pf-tagline-line">{line}</span>
            ))}
          </p>
          <p className="pf-hero-intro">
            {D.intro[lang].split("\n").map((line, i) => (
              <span key={i}>{line}{i < D.intro[lang].split("\n").length - 1 && <><br/><br/></>}</span>
            ))}
          </p>

          <div className="pf-hero-ctas">
            <a href={D.linkedin} target="_blank" rel="noopener" className="pf-btn pf-btn-primary">
              <Icon.linkedin width="18" height="18"/>
              <span>LinkedIn</span>
              <Icon.arrowUp width="14" height="14" className="pf-btn-arrow"/>
            </a>
            <a href={D.github} target="_blank" rel="noopener" className="pf-btn">
              <Icon.github width="18" height="18"/>
              <span>GitHub</span>
              <Icon.arrowUp width="14" height="14" className="pf-btn-arrow"/>
            </a>
            <a href={`mailto:${D.email}`} className="pf-btn">
              <Icon.mail width="18" height="18"/>
              <span>{D.email}</span>
            </a>
          </div>
        </div>

        <div className="pf-hero-photo">
          <div className="pf-photo-frame">
            <img src={D.photo} alt={D.name} />
            <div className="pf-photo-label">
              <div className="pf-photo-label-row">
                <span>WALDEMAR CHROBOK</span>
                <span>/ PORTRAIT</span>
              </div>
              <div className="pf-photo-label-row sub">
                <span>KATOWICE · 2026</span>
                <span>N°{D.yearsExperience}</span>
              </div>
            </div>
          </div>
        </div>
      </div>

      <div className="pf-stats">
        {D.stats.map((s, i) => (
          <div key={i} className="pf-stat">
            <div className="pf-stat-n">{s.n}</div>
            <div className="pf-stat-l">{s.l[lang]}</div>
          </div>
        ))}
      </div>

      <div className="pf-scroll-indicator">
        <span>{t.scroll}</span>
        <span className="pf-scroll-line"></span>
      </div>
    </section>
  );
}

// ============================================================================
// EXPERIENCE SECTION
// ============================================================================
function Experience({ lang, t, D }) {
  return (
    <section className="pf-section" id="experience">
      <div className="pf-section-header">
        <div className="pf-section-tag">{t.section_01}</div>
        <h2 className="pf-section-title">{t.experience_title}</h2>
        <p className="pf-section-sub">{t.experience_sub}</p>
      </div>

      <div className="pf-timeline">
        {D.experience.map((job, i) => {
          if (job.roles) {
            return (
              <article key={i} className="pf-job pf-job-group">
                <div className="pf-job-period">
                  <div className="pf-job-dates">{job.totalPeriod[lang]}</div>
                  <div className="pf-job-duration">{job.totalDuration[lang]}</div>
                </div>
                <div className="pf-job-body">
                  <h3 className="pf-job-company">{job.company}</h3>
                  <div className="pf-job-subroles">
                    {job.roles.map((r, j) => (
                      <div key={j} className="pf-job-subrole">
                        <div className="pf-job-subrole-track">
                          <div className="pf-job-subrole-dot"/>
                          {j < job.roles.length - 1 && <div className="pf-job-subrole-line"/>}
                        </div>
                        <div className="pf-job-subrole-body">
                          <div className="pf-job-role">{r.role[lang]}</div>
                          <div className="pf-job-loc">{r.period[lang]} · {r.duration[lang]} · {r.location}</div>
                          <p className="pf-job-desc">{r.desc[lang]}</p>
                          <div className="pf-job-tags">
                            {r.tags.map((tag, k) => <span key={k} className="pf-tag">{tag}</span>)}
                          </div>
                        </div>
                      </div>
                    ))}
                  </div>
                </div>
              </article>
            );
          }
          return (
            <article key={i} className={`pf-job ${job.featured ? "pf-job-featured" : ""}`}>
              <div className="pf-job-period">
                <div className="pf-job-dates">{job.period[lang]}</div>
                <div className="pf-job-duration">{job.duration[lang]}</div>
              </div>
              <div className="pf-job-body">
                <div className="pf-job-head">
                  <h3 className="pf-job-company">{job.company}</h3>
                  {job.featured && <span className="pf-job-badge">{lang === "pl" ? "WŁASNA FIRMA" : "OWN COMPANY"}</span>}
                </div>
                <div className="pf-job-role">{job.role[lang]}</div>
                <div className="pf-job-loc">{job.location}</div>
                <p className="pf-job-desc">{job.desc[lang]}</p>
                <div className="pf-job-tags">
                  {job.tags.map((tag, j) => <span key={j} className="pf-tag">{tag}</span>)}
                </div>
              </div>
            </article>
          );
        })}
      </div>
    </section>
  );
}

// ============================================================================
// PROJECTS SECTION
// ============================================================================
function Projects({ lang, t, D }) {
  return (
    <section className="pf-section pf-section-projects" id="projects">
      <div className="pf-section-header">
        <div className="pf-section-tag">{t.section_02}</div>
        <h2 className="pf-section-title">{t.projects_title}</h2>
        <p className="pf-section-sub">{t.projects_sub}</p>
      </div>

      <div className="pf-projects-grid">
        {D.projects.map((p, i) => (
          <article key={i} className={`pf-project pf-project-${p.size}`}>
            <div className="pf-project-head">
              <div className="pf-project-num">{String(i + 1).padStart(2, "0")}</div>
              <div className="pf-project-status">
                <span className="pf-project-dot"></span>
                {p.status[lang]}
              </div>
            </div>
            <div className="pf-project-body">
              <h3 className="pf-project-title">{p.title}</h3>
              <div className="pf-project-sub">{p.subtitle[lang]}</div>
              <p className="pf-project-desc">{p.desc[lang]}</p>
            </div>
            <div className="pf-project-foot">
              <div className="pf-project-stack">
                {p.stack.map((s, j) => <span key={j} className="pf-tag pf-tag-sm">{s}</span>)}
              </div>
              <div className="pf-project-year">{p.year}</div>
            </div>
          </article>
        ))}
      </div>
    </section>
  );
}

// ============================================================================
// SKILLS SECTION
// ============================================================================
function Skills({ lang, t, D }) {
  return (
    <section className="pf-section pf-section-skills" id="skills">
      <div className="pf-section-header">
        <div className="pf-section-tag">{t.section_03}</div>
        <h2 className="pf-section-title">{t.skills_title}</h2>
        <p className="pf-section-sub">{t.skills_sub}</p>
      </div>

      <div className="pf-skills-grid">
        {D.skillGroups.map((g, i) => (
          <div key={i} className="pf-skill-group">
            <div className="pf-skill-head">
              <span className="pf-skill-num">{String(i + 1).padStart(2, "0")}</span>
              <h3 className="pf-skill-title">{g.title[lang]}</h3>
            </div>
            <div className="pf-skill-items">
              {g.items.map((item, j) => (
                <span key={j} className="pf-skill-chip">{item}</span>
              ))}
            </div>
          </div>
        ))}
      </div>
    </section>
  );
}

// ============================================================================
// GITHUB SECTION (LIVE)
// ============================================================================
function GithubSection({ lang, t, D }) {
  const { repos, error } = useGithubRepos(D.githubUser);
  const [selectedRepo, setSelectedRepo] = useState(null);

  return (
    <section className="pf-section pf-section-github" id="github">
      <div className="pf-section-header">
        <div className="pf-section-tag">{t.section_04}</div>
        <div className="pf-section-title-row">
          <h2 className="pf-section-title">{t.github_title}</h2>
          <a href={D.github} target="_blank" rel="noopener" className="pf-section-link">
            @{D.githubUser} <Icon.arrowUp width="14" height="14"/>
          </a>
        </div>
        <p className="pf-section-sub">{t.github_sub}</p>
      </div>

      {/* PRIVATE REPOS */}
      <div className="pf-repos-divider">
        <span className="pf-repos-divider-label">{t.private_label}</span>
        <span className="pf-repos-divider-line"></span>
        <span className="pf-repos-divider-sub">{t.private_repos_sub}</span>
      </div>
      <div className="pf-repos">
        {D.privateRepos.map((repo, i) => (
          <button key={repo.id} className="pf-repo pf-repo-private" onClick={() => setSelectedRepo(repo)}>
            <div className="pf-repo-num">{String(i + 1).padStart(2, "0")}</div>
            <div className="pf-repo-body">
              <div className="pf-repo-name-row">
                <div className="pf-repo-name">{repo.name}</div>
                <span className="pf-private-badge">{t.private_label}</span>
              </div>
              <p className="pf-repo-desc">{repo.shortDesc[lang]}</p>
              <div className="pf-repo-meta">
                {repo.stack.slice(0, 3).map((s, j) => (
                  <span key={j} className="pf-repo-lang">{s}</span>
                ))}
                <span>{repo.year}</span>
              </div>
            </div>
            <Icon.arrowUp width="16" height="16" className="pf-repo-arrow"/>
          </button>
        ))}
      </div>

      {/* PUBLIC REPOS */}
      <div className="pf-repos-divider pf-repos-divider-public">
        <span className="pf-repos-divider-label">{t.public_repos_label}</span>
        <span className="pf-repos-divider-line"></span>
        <span className="pf-repos-divider-sub">{t.public_repos_sub}</span>
      </div>

      {!repos && !error && (
        <div className="pf-github-loading">
          <div className="pf-loader"></div>
          <span>{t.loading}</span>
        </div>
      )}

      {error && (
        <div className="pf-github-error">
          <span>⚠</span> {lang === "pl" ? "Nie udało się załadować repozytoriów." : "Couldn't load repositories."}
          <a href={D.github} target="_blank" rel="noopener">{t.view_on_github} →</a>
        </div>
      )}

      {repos && repos.length === 0 && (
        <div className="pf-github-empty">{t.no_repos}</div>
      )}

      {repos && repos.length > 0 && (
        <div className="pf-repos">
          {repos.filter(r => !(D.githubExclude || []).includes(r.name)).slice(0, 8).map((r, i) => (
            <a key={r.id} href={r.html_url} target="_blank" rel="noopener" className="pf-repo">
              <div className="pf-repo-num">{String(i + 1).padStart(2, "0")}</div>
              <div className="pf-repo-body">
                <div className="pf-repo-name">{r.name}</div>
                <p className="pf-repo-desc">{r.description || (lang === "pl" ? "Bez opisu" : "No description")}</p>
                <div className="pf-repo-meta">
                  {r.language && <span className="pf-repo-lang">{r.language}</span>}
                  <span><Icon.star width="12" height="12"/> {r.stargazers_count}</span>
                  <span><Icon.fork width="12" height="12"/> {r.forks_count}</span>
                </div>
              </div>
              <Icon.arrowUp width="16" height="16" className="pf-repo-arrow"/>
            </a>
          ))}
        </div>
      )}

      {selectedRepo && (
        <RepoModal repo={selectedRepo} lang={lang} t={t} onClose={() => setSelectedRepo(null)}/>
      )}
    </section>
  );
}

// ============================================================================
// CONTACT / FOOTER
// ============================================================================
function Contact({ lang, t, D }) {
  return (
    <section className="pf-section pf-section-contact" id="contact">
      <div className="pf-contact-inner">
        <div className="pf-section-tag">{t.section_05}</div>
        <h2 className="pf-contact-title">{t.lets_talk}<span className="pf-period">.</span></h2>
        <p className="pf-contact-sub">{t.lets_talk_sub}</p>

        <div className="pf-contact-grid">
          <a href={`mailto:${D.email}`} className="pf-contact-card">
            <div className="pf-contact-label">EMAIL</div>
            <div className="pf-contact-value">{D.email}</div>
            <Icon.arrow width="20" height="20" className="pf-contact-arrow"/>
          </a>
          <a href={D.linkedin} target="_blank" rel="noopener" className="pf-contact-card">
            <div className="pf-contact-label">LINKEDIN</div>
            <div className="pf-contact-value">/in/waldemarchrobok</div>
            <Icon.arrow width="20" height="20" className="pf-contact-arrow"/>
          </a>
          <a href={D.github} target="_blank" rel="noopener" className="pf-contact-card">
            <div className="pf-contact-label">GITHUB</div>
            <div className="pf-contact-value">@{D.githubUser}</div>
            <Icon.arrow width="20" height="20" className="pf-contact-arrow"/>
          </a>
          <a href="#" onClick={(e) => { e.preventDefault(); window.print(); }} className="pf-contact-card pf-contact-cv">
            <div className="pf-contact-label">CV</div>
            <div className="pf-contact-value">{t.cta_cv}</div>
            <Icon.download width="20" height="20" className="pf-contact-arrow"/>
          </a>
        </div>
      </div>

      <footer className="pf-footer">
        <div className="pf-footer-row">
          <span>© 2026 {D.name}</span>
          <span>{D.location}</span>
          <span>v1.0</span>
        </div>
        <div className="pf-footer-big">{D.name.toUpperCase()}</div>
      </footer>
    </section>
  );
}

// ============================================================================
// ROOT APP
// ============================================================================
function App() {
  const [tweaks, _setTweak] = useTweaks(DEFAULTS);
  const setTweaks = (partial) => Object.entries(partial).forEach(([k, v]) => _setTweak(k, v));
  const { variant, lang, dark } = tweaks;
  const D = window.PORTFOLIO_DATA;
  const t = D.t[lang];

  // apply variant + theme via data attrs
  useEffect(() => {
    document.documentElement.setAttribute("data-variant", variant);
    document.documentElement.setAttribute("data-theme", dark ? "dark" : "light");
  }, [variant, dark]);

  return (
    <div className="pf-root">
      <Header
        lang={lang}
        setLang={(l) => setTweaks({ lang: l })}
        dark={dark}
        setDark={(d) => setTweaks({ dark: d })}
        variant={variant}
        t={t}
        D={D}
      />
      <main>
        <Hero lang={lang} t={t} D={D} variant={variant} />
        <Experience lang={lang} t={t} D={D} />
        <Projects lang={lang} t={t} D={D} />
        <Skills lang={lang} t={t} D={D} />
        <GithubSection lang={lang} t={t} D={D} />
        <Contact lang={lang} t={t} D={D} />
      </main>

      <TweaksPanel title="Tweaks">
        <TweakSection title={lang === "pl" ? "Wariant wizualny" : "Visual variant"}>
          <TweakRadio
            label={lang === "pl" ? "Styl" : "Style"}
            value={variant}
            options={[
              { value: "mono", label: "A · Mono/Yellow" },
              { value: "editorial", label: "B · Editorial/Red" },
              { value: "techno", label: "C · Dark Techno" },
            ]}
            onChange={(v) => setTweaks({ variant: v })}
          />
        </TweakSection>
        <TweakSection title={lang === "pl" ? "Język i motyw" : "Language & theme"}>
          <TweakRadio
            label={lang === "pl" ? "Język" : "Language"}
            value={lang}
            options={[
              { value: "pl", label: "Polski" },
              { value: "en", label: "English" },
            ]}
            onChange={(v) => setTweaks({ lang: v })}
          />
          <TweakToggle
            label={lang === "pl" ? "Tryb ciemny" : "Dark mode"}
            value={dark}
            onChange={(v) => setTweaks({ dark: v })}
          />
        </TweakSection>
      </TweaksPanel>
    </div>
  );
}

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