{{template "base/head" .}}
<style>
/* skillfactor landing — Factorial design language (DM Sans, #FF355E, pills, 16px cards) */
.sf-page { font-family: "DM Sans", -apple-system, "Segoe UI", Helvetica, Arial, sans-serif; color: #25253d; background: #fff; }
.sf-wrap { max-width: 1160px; margin: 0 auto; padding: 0 24px; }
.sf-eyebrow { display: inline-block; font-size: 13px; font-weight: 700; letter-spacing: .12em; text-transform: uppercase; color: #ff355e; margin-bottom: 18px; }
.sf-h1 { font-size: 60px; line-height: 1.05; font-weight: 700; letter-spacing: -0.02em; margin: 0 0 22px; color: #25253d; }
.sf-h1 em { font-style: normal; color: #ff355e; }
.sf-h2 { font-size: 38px; line-height: 1.15; font-weight: 700; letter-spacing: -0.01em; margin: 0 0 14px; color: #25253d; }
.sf-lead { font-size: 19px; line-height: 1.55; color: #515164; max-width: 560px; margin: 0 0 30px; }
.sf-sub { font-size: 17px; line-height: 1.6; color: #515164; max-width: 640px; margin: 0 0 34px; }
.sf-btn { display: inline-flex; align-items: center; gap: 8px; border-radius: 9999px; padding: 13px 26px; font-size: 16px; font-weight: 500; text-decoration: none; transition: background .15s ease, color .15s ease; }
.sf-btn-primary { background: #ff355e; color: #fff !important; }
.sf-btn-primary:hover { background: #e51943; }
.sf-btn-ghost { background: #fff; color: #25253d !important; box-shadow: inset 0 0 0 1px #dededf; }
.sf-btn-ghost:hover { background: #f4f4f5; }
.sf-btn-white { background: #fff; color: #e51943 !important; }
.sf-btn-white:hover { background: #ffe0e6; }
.sf-tlink { color: #007c85 !important; font-weight: 500; text-decoration: none; }
.sf-tlink:hover { color: #00565c !important; }

/* Hero */
.sf-hero { padding: 84px 0 56px; }
.sf-hero-grid { display: grid; grid-template-columns: 1.05fr .95fr; gap: 56px; align-items: center; }
.sf-cta-row { display: flex; gap: 14px; flex-wrap: wrap; align-items: center; }

/* Dark package card (from the pitch) */
.sf-code-card { background: #25253d; border-radius: 20px; padding: 30px 34px; color: #eef0f4; box-shadow: 0 24px 60px rgba(37,37,61,.22); position: relative; }
.sf-code-card .sf-code-label { font-size: 11px; letter-spacing: .18em; color: #8a8a99; margin-bottom: 16px; text-transform: uppercase; }
.sf-code-card pre { margin: 0; font: 15px/1.75 ui-monospace, SFMono-Regular, Consolas, monospace; color: #eef0f4; background: none; white-space: pre; }
.sf-code-card pre b { color: #ff6682; font-weight: 600; }
.sf-code-card pre i { color: #63d3db; font-style: normal; }
.sf-chip { position: absolute; background: #fff; border-radius: 9999px; padding: 9px 16px; font-size: 14px; font-weight: 700; color: #25253d; box-shadow: 0 10px 28px rgba(37,37,61,.16); }
.sf-chip small { display: block; font-size: 11px; font-weight: 500; color: #8a8a99; }
.sf-chip-1 { top: -18px; right: 26px; }
.sf-chip-2 { bottom: -22px; left: -28px; }
.sf-chip-3 { top: 46%; right: -30px; }
.sf-chip em { font-style: normal; color: #ff355e; }

/* Stats band */
.sf-stats { display: grid; grid-template-columns: repeat(4, 1fr); gap: 18px; padding: 34px 0 8px; }
.sf-stat { text-align: center; padding: 18px 10px; }
.sf-stat b { display: block; font-size: 34px; font-weight: 700; color: #25253d; letter-spacing: -0.02em; }
.sf-stat span { font-size: 14px; color: #515164; }

/* Sections */
.sf-section { padding: 76px 0; }
.sf-section-gray { background: #f4f4f5; border-radius: 28px; }
.sf-center { text-align: center; }
.sf-center .sf-sub { margin-left: auto; margin-right: auto; }

/* Formula */
.sf-formula { display: grid; grid-template-columns: 1fr auto 1fr auto 1fr; gap: 14px; align-items: stretch; margin: 40px 0 20px; }
.sf-fcard { background: #fff; border: 1px solid #ececee; border-radius: 16px; padding: 26px; }
.sf-fcard h3 { margin: 0 0 8px; font-size: 19px; color: #ff355e; font-weight: 700; }
.sf-fcard p { margin: 0; font-size: 15px; line-height: 1.55; color: #515164; }
.sf-fop { align-self: center; font-size: 34px; font-weight: 700; color: #ff355e; }
.sf-fresult { margin-top: 6px; background: #ff355e; color: #fff; border-radius: 16px; padding: 20px 26px; text-align: center; font-size: 19px; font-weight: 700; }

/* Feature cards */
.sf-features { display: grid; grid-template-columns: repeat(4, 1fr); gap: 18px; margin-top: 40px; }
.sf-feat { background: #fff; border: 1px solid #ececee; border-radius: 16px; padding: 26px; }
.sf-feat .sf-ico { width: 44px; height: 44px; border-radius: 12px; display: flex; align-items: center; justify-content: center; font-size: 20px; margin-bottom: 16px; background: #fff0f3; }
.sf-feat h3 { margin: 0 0 8px; font-size: 17px; font-weight: 700; color: #25253d; }
.sf-feat p { margin: 0; font-size: 14.5px; line-height: 1.55; color: #515164; }

/* Layer model */
.sf-layers-grid { display: grid; grid-template-columns: 1.3fr .7fr; gap: 26px; margin-top: 40px; align-items: start; }
.sf-layer { color: #fff; border-radius: 14px; padding: 18px 24px; display: flex; justify-content: space-between; align-items: baseline; gap: 18px; margin-bottom: 12px; }
.sf-layer b { font-size: 18px; }
.sf-layer span { font-size: 14.5px; opacity: .92; text-align: right; }
.sf-gate { background: #fff0f3; border-radius: 16px; padding: 26px; }
.sf-gate h3 { margin: 0 0 14px; font-size: 18px; color: #25253d; }
.sf-gate ul { margin: 0; padding: 0; list-style: none; }
.sf-gate li { font-size: 14.5px; color: #515164; line-height: 1.5; padding: 7px 0 7px 30px; position: relative; }
.sf-gate li::before { content: "✓"; position: absolute; left: 0; top: 7px; width: 20px; height: 20px; border-radius: 50%; background: #ff355e; color: #fff; font-size: 12px; display: flex; align-items: center; justify-content: center; }

/* Pipeline steps */
.sf-steps { margin-top: 40px; }
.sf-step { display: grid; grid-template-columns: 64px 220px 1fr; gap: 18px; align-items: center; background: #fff; border: 1px solid #ececee; border-radius: 16px; padding: 18px 24px; margin-bottom: 12px; }
.sf-step .sf-num { font-size: 22px; font-weight: 700; color: #ff355e; }
.sf-step b { font-size: 17px; color: #25253d; }
.sf-step span { font-size: 14.5px; color: #515164; }

/* CTA band */
.sf-cta-band { background: linear-gradient(120deg, #ff355e, #e51943); border-radius: 28px; color: #fff; text-align: center; padding: 70px 40px; }
.sf-cta-band h2 { font-size: 40px; font-weight: 700; letter-spacing: -0.01em; margin: 0 0 12px; color: #fff; }
.sf-cta-band p { font-size: 18px; opacity: .95; margin: 0 auto 30px; max-width: 560px; }

.sf-footnote { padding: 34px 0 60px; font-size: 12.5px; color: #8a8a99; text-align: center; }

/* --- Motion: Einstieg, Scroll-Reveals, Float, Donut --- */
@keyframes sf-rise { from { opacity: 0; transform: translateY(26px); } to { opacity: 1; transform: none; } }
.sf-hero .sf-eyebrow { animation: sf-rise .6s ease both; }
.sf-hero .sf-h1 { animation: sf-rise .7s .08s ease both; }
.sf-hero .sf-lead { animation: sf-rise .7s .16s ease both; }
.sf-hero .sf-cta-row { animation: sf-rise .7s .24s ease both; }
.sf-hero .sf-code-card { animation: sf-rise .8s .2s ease both; }

.sf-reveal { opacity: 0; transform: translateY(26px); transition: opacity .7s ease, transform .7s ease; }
.sf-reveal.sf-in { opacity: 1; transform: none; }
.sf-features .sf-feat:nth-child(2), .sf-formula .sf-fcard:nth-child(3) { transition-delay: .1s; }
.sf-features .sf-feat:nth-child(3), .sf-formula .sf-fcard:nth-child(5) { transition-delay: .2s; }
.sf-features .sf-feat:nth-child(4) { transition-delay: .3s; }

@keyframes sf-float { 0%, 100% { margin-top: 0; } 50% { margin-top: -9px; } }
.sf-chip-1 { animation: sf-float 5s ease-in-out infinite; }
.sf-chip-2 { animation: sf-float 6s 1.2s ease-in-out infinite; }
.sf-chip-3 { animation: sf-float 5.5s .6s ease-in-out infinite; }

.sf-feat, .sf-fcard, .sf-step { transition: transform .25s ease, box-shadow .25s ease, opacity .7s ease; }
.sf-feat:hover, .sf-fcard:hover, .sf-step:hover { transform: translateY(-4px); box-shadow: 0 16px 40px rgba(37,37,61,.10); }

/* Provenienz-Donut */
.sf-prov-grid { display: grid; grid-template-columns: .9fr 1.1fr; gap: 56px; align-items: center; margin-top: 44px; }
.sf-donut-wrap { position: relative; width: 340px; max-width: 100%; margin: 0 auto; }
.sf-donut { width: 100%; height: auto; transform: rotate(-90deg); }
.sf-donut circle { fill: none; stroke-width: 26; stroke-dasharray: 0 100; transition: stroke-dasharray 1.3s cubic-bezier(.6,.1,.3,1); }
.sf-in .sf-donut circle { stroke-dasharray: var(--seg); }
.sf-donut-center { position: absolute; inset: 0; display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: center; }
.sf-donut-center b { font-size: 28px; color: #25253d; }
.sf-donut-center span { font-size: 13px; color: #8a8a99; max-width: 140px; }
.sf-legend { list-style: none; margin: 0; padding: 0; }
.sf-legend li { display: flex; align-items: baseline; gap: 12px; padding: 12px 0; border-bottom: 1px solid #ececee; }
.sf-legend .sf-dot { width: 14px; height: 14px; border-radius: 4px; flex: none; transform: translateY(2px); }
.sf-legend b { font-size: 16px; color: #25253d; }
.sf-legend .sf-pct { margin-left: auto; font-size: 18px; font-weight: 700; color: #25253d; }
.sf-legend p { margin: 2px 0 0; font-size: 13.5px; color: #515164; }

@media (max-width: 1000px) {
  .sf-h1 { font-size: 42px; }
  .sf-hero-grid { grid-template-columns: 1fr; }
  .sf-stats, .sf-features { grid-template-columns: repeat(2, 1fr); }
  .sf-formula { grid-template-columns: 1fr; }
  .sf-fop { text-align: center; }
  .sf-layers-grid { grid-template-columns: 1fr; }
  .sf-step { grid-template-columns: 48px 1fr; }
  .sf-step span { grid-column: 2; }
}
</style>

<div role="main" aria-label="skillfactor" class="page-content home sf-page">

  <!-- Hero -->
  <section class="sf-hero">
    <div class="sf-wrap sf-hero-grid">
      <div>
        <span class="sf-eyebrow">The Occupational Skill Layer</span>
        <h1 class="sf-h1">AI with <em>work experience.</em></h1>
        <p class="sf-lead">A standard agent knows nothing about recruiting, accounting or project work.
        skillfactor compiles public occupation data, real job ads and expert knowledge into a
        ready-to-use skill per profession — a git-native library that gets better with every project.</p>
        <div class="sf-cta-row">
          <a class="sf-btn sf-btn-primary" href="{{AppSubUrl}}/skills-core">Explore the skill catalog</a>
          <a class="sf-btn sf-btn-ghost" href="#sf-formula">How it works</a>
        </div>
      </div>
      <div>
        <div class="sf-code-card">
          <div class="sf-code-label">Skill package</div>
          <pre><b>recruiter/</b>
 ├─ SKILL.md
 ├─ references/
 │   ├─ usecases.md
 │   ├─ intake.md
 │   ├─ quality.md
 │   └─ tools.md  <i>← 54% ATS</i>
 ├─ glossary · literature
 └─ evals/</pre>
          <div class="sf-chip sf-chip-1">ATS <em>54%</em><small>from 101 real job ads</small></div>
          <div class="sf-chip sf-chip-2">100 occupations<small>in the catalog — refreshed monthly</small></div>
          <div class="sf-chip sf-chip-3">candidate sourcing <em>48%</em><small>market evidence</small></div>
        </div>
      </div>
    </div>
  </section>

  <!-- Stats band -->
  <section>
    <div class="sf-wrap sf-stats sf-reveal">
      <div class="sf-stat"><b data-count="3039">0</b><span>ESCO occupations as foundation</span></div>
      <div class="sf-stat"><b data-count="126051">0</b><span>occupation-to-skill relations</span></div>
      <div class="sf-stat"><b data-count="100">0</b><span>ready-to-use skill packages</span></div>
      <div class="sf-stat"><b data-count="101">0</b><span>real job ads in the evidence store</span></div>
    </div>
  </section>

  <!-- Formula -->
  <section class="sf-section" id="sf-formula">
    <div class="sf-wrap">
      <div class="sf-center">
        <span class="sf-eyebrow">The formula</span>
        <h2 class="sf-h2">Public occupation knowledge becomes a skill</h2>
        <p class="sf-sub">Occupational knowledge belongs to nobody — so nobody maintains it.
        skillfactor changes that: three sources, one compilation, versioned in git.</p>
      </div>
      <div class="sf-formula sf-reveal">
        <div class="sf-fcard"><h3>Occupation taxonomies</h3><p>3,000+ occupations from ESCO &amp; O*NET — public, standardized, multilingual. Joined via the official crosswalk.</p></div>
        <div class="sf-fop">+</div>
        <div class="sf-fcard"><h3>Job ads</h3><p>Current skill requirements from global job platforms — weighted market evidence with percentages and an as-of date.</p></div>
        <div class="sf-fop">+</div>
        <div class="sf-fcard"><h3>Expert knowledge</h3><p>Best practices from literature and the web — as glossary, use cases, intake questions and quality criteria.</p></div>
      </div>
      <div class="sf-fresult sf-reveal">= AI compiles them into the ready-to-use skill for the profession</div>
    </div>
  </section>

  <!-- Data provenance -->
  <section class="sf-section" id="sf-provenance" style="padding-top: 20px;">
    <div class="sf-wrap">
      <div class="sf-center">
        <span class="sf-eyebrow">Data provenance</span>
        <h2 class="sf-h2">Every item knows where it comes from</h2>
        <p class="sf-sub">After compilation, each package reports its source mix.
        This is the fully enriched <a class="sf-tlink" href="{{AppSubUrl}}/skills-core/recruitment-consultant/src/branch/main/PROVENANCE.md">recruiter package</a> —
        every repo carries the same breakdown as <code>PROVENANCE.md</code> with a rendered chart.</p>
      </div>
      <div class="sf-prov-grid sf-reveal" id="sf-prov" data-manifest="{{AppSubUrl}}/skills-core/recruitment-consultant/raw/branch/main/manifest.json">
        <div class="sf-donut-wrap">
          <svg class="sf-donut" viewBox="0 0 200 200" aria-label="Content sources of the recruiter package">
            <circle cx="100" cy="100" r="80" pathLength="100" stroke="#ff355e" data-cat="jobads" style="--seg: 53.1 46.9;" stroke-dashoffset="0"></circle>
            <circle cx="100" cy="100" r="80" pathLength="100" stroke="#25253d" data-cat="onet" style="--seg: 30.7 69.3;" stroke-dashoffset="-53.1"></circle>
            <circle cx="100" cy="100" r="80" pathLength="100" stroke="#007c85" data-cat="wiki_ai" style="--seg: 10 90;" stroke-dashoffset="-83.8"></circle>
            <circle cx="100" cy="100" r="80" pathLength="100" stroke="#ffb3bf" data-cat="esco" style="--seg: 6.1 93.9;" stroke-dashoffset="-93.8"></circle>
          </svg>
          <div class="sf-donut-center"><b data-prov-total>719</b><span>content items in the recruiter package</span></div>
        </div>
        <ul class="sf-legend">
          <li><span class="sf-dot" style="background:#ff355e;"></span><span><b>Job boards — market evidence</b><p>Full market report from real job ads (JSearch API): ranked requirements with share, seniority distribution, title variants — extracted facts only, aggregated live.</p></span><span class="sf-pct" data-pct="jobads">53%</span></li>
          <li><span class="sf-dot" style="background:#25253d;"></span><span><b>O*NET — tasks &amp; tools</b><p>Task statements, work activities and software from the U.S. occupation database.</p></span><span class="sf-pct" data-pct="onet">31%</span></li>
          <li><span class="sf-dot" style="background:#007c85;"></span><span><b>Wikipedia &amp; AI expert curation</b><p>Glossary, literature, use cases, intake questions, quality criteria and evals — AI-curated with cited web sources.</p></span><span class="sf-pct" data-pct="wiki_ai">10%</span></li>
          <li><span class="sf-dot" style="background:#ffb3bf;"></span><span><b>ESCO — occupation &amp; competences</b><p>The European profile: essential and optional competences per occupation.</p></span><span class="sf-pct" data-pct="esco">6%</span></li>
        </ul>
      </div>
      <p class="sf-center" style="margin-top:26px; font-size:14px; color:#8a8a99;">Numbers load live from the package manifest. Library-wide, taxonomies still dominate — enrichment rolls out occupation by occupation, ~30 per month.
      <a class="sf-tlink" href="{{AppSubUrl}}/skills-core/marketplace">See the library-wide chart&nbsp;→</a></p>
    </div>
  </section>

  <!-- One agent per employee -->
  <section class="sf-section">
    <div class="sf-wrap sf-section-gray" style="padding: 64px 48px;">
      <div class="sf-center">
        <span class="sf-eyebrow">The product</span>
        <h2 class="sf-h2">One agent per employee — preloaded with the profession</h2>
        <p class="sf-sub">The agent knows the job from day one — the employee makes it their own.
        A sparring partner that gets better every day and never quits.</p>
      </div>
      <div class="sf-features sf-reveal">
        <div class="sf-feat"><div class="sf-ico">🏭</div><h3>Preloaded</h3><p>Starts with the skill profile of the profession — from ESCO, O*NET and market data.</p></div>
        <div class="sf-feat"><div class="sf-ico">📂</div><h3>Knows the day-to-day</h3><p>Mails, chats, documents, meeting transcripts — the personal work context, every day.</p></div>
        <div class="sf-feat"><div class="sf-ico">🎓</div><h3>Grows with you</h3><p>Every task and every correction improves it; hidden abilities surface in the skill graph.</p></div>
        <div class="sf-feat"><div class="sf-ico">🔒</div><h3>Stays in the company</h3><p>Knowledge stays with the role — even when the person leaves. The role never forgets.</p></div>
      </div>
    </div>
  </section>

  <!-- Layer model -->
  <section class="sf-section">
    <div class="sf-wrap">
      <div class="sf-center">
        <span class="sf-eyebrow">Safe sharing</span>
        <h2 class="sf-h2">Private stays private. Public knowledge grows.</h2>
      </div>
      <div class="sf-layers-grid sf-reveal">
        <div>
          <div class="sf-layer" style="background:#ff355e;"><b>Community</b><span>shared knowledge of all customers — public</span></div>
          <div class="sf-layer" style="background:#e51943;"><b>Company</b><span>the company&#39;s processes and standards — private</span></div>
          <div class="sf-layer" style="background:#b30d32;"><b>Role</b><span>the position&#39;s memory — survives staff changes</span></div>
          <div class="sf-layer" style="background:#800622;"><b>Person</b><span>personal style — owned by the employee</span></div>
        </div>
        <div class="sf-gate">
          <h3>Every boundary is a gate</h3>
          <ul>
            <li>Scan for personal data and secrets (<code>sanitize.yml</code>)</li>
            <li>Anonymization — knowledge travels, names don&#39;t</li>
            <li>Structural eval against the profession&#39;s test cases (<code>eval.yml</code>)</li>
            <li>Human approval — via pull request</li>
          </ul>
          <p style="margin:16px 0 0; font-size:14px;"><a class="sf-tlink" href="{{AppSubUrl}}/skills-community/recruitment-consultant/pulls/1">See it live: tenant PR with sanitization diff&nbsp;→</a></p>
        </div>
      </div>
    </div>
  </section>

  <!-- Pipeline -->
  <section class="sf-section" style="padding-top: 20px;">
    <div class="sf-wrap">
      <div class="sf-center">
        <span class="sf-eyebrow">From occupation database to colleague</span>
        <h2 class="sf-h2">Refreshed monthly — skills follow the market</h2>
      </div>
      <div class="sf-steps sf-reveal">
        <div class="sf-step"><div class="sf-num">01</div><b>Sources</b><span>ESCO · O*NET · job boards · Wikipedia · literature</span></div>
        <div class="sf-step"><div class="sf-num">02</div><b>Evidence store</b><span>requirements from real job ads — weighted by frequency, on Microsoft SQL Server</span></div>
        <div class="sf-step"><div class="sf-num">03</div><b>Generator</b><span>builds skill packages: tasks · intake questions · quality criteria · evals</span></div>
        <div class="sf-step"><div class="sf-num">04</div><b>Marketplace</b><span>git library — publishing via reviewed pull requests</span></div>
        <div class="sf-step"><div class="sf-num">05</div><b>Runtime</b><span>every employee agent loads its profession&#39;s profile</span></div>
      </div>
      <p class="sf-center" style="margin-top:26px;"><a class="sf-tlink" href="{{AppSubUrl}}/skills-core/marketplace">Visit the marketplace with machine-readable index&nbsp;→</a></p>
    </div>
  </section>

  <!-- CTA -->
  <section class="sf-section" style="padding-top: 8px;">
    <div class="sf-wrap">
      <div class="sf-cta-band sf-reveal">
        <h2>The role never forgets.</h2>
        <p>100 professions are ready — from the production-depth recruiter to the ICT architect.
        Every skill is a repo, every release a reviewed pull request.</p>
        <div class="sf-cta-row" style="justify-content:center;">
          <a class="sf-btn sf-btn-white" href="{{AppSubUrl}}/skills-core/recruitment-consultant">View the recruiter skill</a>
          <a class="sf-btn" style="box-shadow:inset 0 0 0 1px rgba(255,255,255,.7); background:transparent; color:#fff !important;" href="{{AppSubUrl}}/explore/repos">All repositories</a>
        </div>
      </div>
    </div>
  </section>

  <div class="sf-footnote sf-wrap">
    skillfactor — concept &amp; prototype: Robert Binsack. Includes information from the O*NET database (USDOL/ETA, CC BY 4.0)
    and ESCO (© European Union) — not endorsed by USDOL/ETA or the European Commission.
  </div>
</div>
<script>
// Scroll-Reveals + Count-up (IntersectionObserver; Donut-Segmente animieren via .sf-in)
(function () {
  var io = new IntersectionObserver(function (entries) {
    entries.forEach(function (e) {
      if (!e.isIntersecting) return;
      e.target.classList.add("sf-in");
      e.target.querySelectorAll("[data-count]").forEach(function (el) {
        if (el.dataset.done) return;
        el.dataset.done = "1";
        var target = parseInt(el.dataset.count, 10), t0 = null;
        function step(ts) {
          if (!t0) t0 = ts;
          var p = Math.min((ts - t0) / 1400, 1);
          var eased = 1 - Math.pow(1 - p, 3);
          el.textContent = Math.round(target * eased).toLocaleString("en-US");
          if (p < 1) requestAnimationFrame(step);
        }
        requestAnimationFrame(step);
      });
      io.unobserve(e.target);
    });
  }, { threshold: 0.25 });
  document.querySelectorAll(".sf-reveal").forEach(function (el) { io.observe(el); });

  // Donut live aus dem Repo-Manifest speisen (Fallback: eingebettete Werte)
  var prov = document.getElementById("sf-prov");
  if (prov && window.fetch) {
    fetch(prov.dataset.manifest).then(function (r) { return r.json(); }).then(function (m) {
      var p = m.provenance || {};
      var share = p.share_percent || {}, items = p.items || {};
      var order = ["jobads", "onet", "wiki_ai", "esco"], off = 0, total = 0;
      order.forEach(function (cat) {
        var v = Number(share[cat] || 0);
        var c = prov.querySelector('circle[data-cat="' + cat + '"]');
        if (c) {
          c.style.setProperty("--seg", v + " " + (100 - v));
          c.setAttribute("stroke-dashoffset", String(-off));
        }
        var pct = prov.querySelector('[data-pct="' + cat + '"]');
        if (pct) pct.textContent = Math.round(v) + "%";
        off += v;
        total += Number(items[cat] || 0);
      });
      var t = prov.querySelector("[data-prov-total]");
      if (t && total) t.textContent = total.toLocaleString("en-US");
    }).catch(function () { /* Fallback-Werte bleiben stehen */ });
  }
})();
</script>
{{template "base/footer" .}}
