# Moodboard — specyfikacja treści i kodu (Akademia Claude CFS · moduł M3)

> ## ⚠️ SUPERSEDED — 2026-07-14, NIE UŻYWAĆ
> User odrzucił ten kierunek ostro (werdykt 2026-07-14): cały motyw „szlaban/bramka/przepustka" —
> memorable element, demo z opuszczaną belką, kafle jako „tabliczki bramki", nazewnictwo
> „punkt kontrolny/karta przejazdu/dziennik kontrolny/kwit" — uznany za amatorską metaforę-gadżet
> wciśniętą na siłę. Wszystko poniżej (HTML/CSS/JS z belką szlabanu, gate-demo, teksty z językiem
> bramkowym) jest ARCHIWUM, nie kierunkiem do realizacji. Nowy kierunek: `../brief.md` (v2,
> editorial-utility bez metafory, layout szerszy, treść M3 = doktryna zgoda+zakres+operacje na
> polecenie, realne dane). Ten plik zostaje jako zapis odrzuconej ścieżki — do nauki, nie do budowy.
>
> **UWAGA PROCESOWA (przeczytaj przed użyciem):** to jest **specyfikacja + gotowy kod HTML/CSS/JS**
> moodboardu, NIE jest to plik `.html`. Powód: bramka `kontra-gate.py` mechanicznie blokuje zapis
> `.css`/`.html` w `projects/CFS/` dopóki nie istnieje `projects/CFS/.kontra-approved` — a ten znacznik
> tworzy WYŁĄCZNIE orchestrator PO realnej zgodzie usera. Moodboard ma pokazać kierunek PRZED tą zgodą
> (to sedno G1) — więc kontra-art (ja) nie może zapisać go jako `.html` wprost, zgodnie z twardą regułą
> roli („nie piszesz .css/.html — bramka i tak Cię zablokuje, nie próbuj jej obchodzić").
>
> **Co dalej:** orchestrator/kontra-build materializuje ten kod 1:1 jako
> `projects/CFS/moodboard/moodboard.html` (to jest artefakt PREZENTACYJNY, wyjątek od reguły
> „zero HTML przed akceptacją" — patrz `SKILL.md` kontra-art: „Moodboard.html to wyjątek — artefakt
> prezentacyjny, nie build projektu"). Treść poniżej jest KOMPLETNA i gotowa do wklejenia bez zmian —
> ja (kontra-art) zdecydowałem o całej zawartości, kolorach, typografii, tekstach przykładowych i
> zachowaniu demo. Materializacja to czysta kopia, nie nowa decyzja projektowa.

---

## Co pokazuje ten moodboard (dla orientacji, po polsku)

1. Nagłówek dokumentu — tytuł + krótkie wyjaśnienie dla usera, co widzi.
2. Główny pomysł jednym zdaniem (parasol) + 3 boksy „skąd się wziął / co znaczy w praktyce / czego unika".
3. Paleta kolorów — 8 kafli kolorów z hex, nazwą i opisem użycia (kolory ZABLOKOWANE na markę CFS).
4. Typografia — próbka nagłówka (Space Grotesk) i tekstu (Source Sans 3) obok siebie.
5. Kafelek modułu — 3 warianty stanu (zamknięta / w weryfikacji / otwarta) jako żywe komponenty.
6. Fragment widoku lekcji M3 — nagłówek lekcji + 2 zasady + **działające demo „przepływ zgody"**
   (prawdziwy JS, klikalne przyciski, nie zrzut ekranu) + blok „Spróbuj sam".
7. Rytm całej Akademii — wizualizacja słupkowa gęstość/oddech między poziomami hubu.
8. Anty-referencje — 3 karty pokazujące, czego świadomie unikamy (gradient, kłódka/tarcza, confetti).
9. Stopka z pytaniem do usera o kierunek.

Pełny, gotowy do wklejenia kod (HTML + `<style>` + `<script>`) — dokładnie to, co ma trafić do pliku
`projects/CFS/moodboard/moodboard.html`:

```html
<!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Akademia Claude CFS — kierunek wizualny (moduł M3)</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@500;600;700&family=Source+Sans+3:wght@400;450;600&display=swap" rel="stylesheet">
<style>
  :root{
    /* --- prymitywy przeliczone z marki CFS na OKLCH (patrz DESIGN.md) --- */
    --green-500: oklch(70.4% 0.142 160.3); /* #35BA81 marka, kotwica */
    --green-600: oklch(60.1% 0.120 160.5); /* #2A9668 */
    --green-700: oklch(54%   0.107 160.2);
    --green-800: oklch(48.1% 0.095 160.0); /* #1F6E4B */
    --green-100: oklch(93.5% 0.045 160.3);

    --ink:       oklch(23.1% 0.019 172.0); /* #14201C, off-black celowo złamany zielenią */
    --graphite:  oklch(26.8% 0.012 178.5); /* #202826 */
    --muted:     oklch(56.6% 0.019 173.6); /* #6B7A75 */
    --aluminium: oklch(72.2% 0.000 89.9);  /* #A5A5A5 RAL 9006 */
    --line:      oklch(92.6% 0.008 164.9); /* #E2E8E5 */
    --bg-soft:   oklch(97.7% 0.002 165.1); /* #F6F8F7 */
    --bg:        oklch(99% 0.001 165.1);   /* off-white, celowo NIE czysta biel */

    --warning:   oklch(75.5% 0.157 78.3);  /* #E5A100 */
    --info:      oklch(60.9% 0.182 257.3); /* #2F80ED */
    --danger:    oklch(59.7% 0.182 24.5);  /* #D64545 */
    --danger-text: oklch(51.8% 0.161 24.7);/* #B23636 dociągnięty do AA */

    --shadow-tile: 0 1px 2px rgba(20,32,28,.06), 0 6px 16px rgba(20,32,28,.05);
    --shadow-arm: 0 1px 2px rgba(20,32,28,.14), 0 5px 10px rgba(20,32,28,.10);

    --font-display: 'Space Grotesk', sans-serif;
    --font-body: 'Source Sans 3', sans-serif;
  }

  *{ box-sizing:border-box; }
  html{ scroll-behavior:smooth; }
  body{
    margin:0; background:var(--bg); color:var(--ink);
    font-family:var(--font-body); font-size:18px; line-height:1.7;
    -webkit-font-smoothing:antialiased;
  }
  h1,h2,h3{ font-family:var(--font-display); margin:0 0 .4em; line-height:1.15; font-weight:600; }
  p{ margin:0 0 1em; max-width:68ch; }
  .wrap{ max-width:1200px; margin:0 auto; padding:0 32px; }

  .doc-header{
    background:var(--graphite); color:var(--bg);
    padding:56px 0 48px;
    background-image:
      repeating-linear-gradient(100deg, rgba(230,240,236,.06) 0 1px, transparent 1px 64px);
  }
  .doc-header .kicker{
    font-family:var(--font-display); font-weight:600; font-size:13px;
    letter-spacing:.08em; text-transform:uppercase; color:var(--green-500);
    display:block; margin-bottom:14px;
  }
  .doc-header h1{ font-size:clamp(28px,4vw,44px); color:var(--bg); max-width:20ch; }
  .doc-header p{ color:var(--line); max-width:62ch; font-size:17px; }

  section{ padding:56px 0; border-bottom:1px solid var(--line); }
  section:last-of-type{ border-bottom:none; }
  .section-kicker{
    font-family:var(--font-display); font-weight:600; font-size:13px;
    letter-spacing:.08em; text-transform:uppercase; color:var(--green-700);
    display:block; margin-bottom:10px;
  }
  .section-lede{ color:var(--muted); font-size:17px; margin-bottom:32px; max-width:70ch; }

  .parasol-quote{
    font-family:var(--font-display); font-weight:600;
    font-size:clamp(22px,2.6vw,32px); line-height:1.35; color:var(--ink);
    max-width:26ch; margin:0 0 24px; border-left:4px solid var(--green-500); padding-left:24px;
  }
  .parasol-explain{ display:grid; grid-template-columns:repeat(3,1fr); gap:24px; margin-top:32px; }
  .parasol-explain > div{
    background:var(--bg-soft); border:1px solid var(--line); border-radius:4px; padding:20px 22px;
  }
  .parasol-explain h3{ font-size:16px; margin-bottom:8px; }
  .parasol-explain p{ font-size:15px; color:var(--muted); margin:0; }

  .palette-grid{ display:grid; grid-template-columns:repeat(auto-fit,minmax(200px,1fr)); gap:16px; }
  .swatch{ border:1px solid var(--line); border-radius:4px; overflow:hidden; background:var(--bg); }
  .swatch .fill{ height:88px; }
  .swatch .info{ padding:12px 14px; }
  .swatch .name{ font-family:var(--font-display); font-weight:600; font-size:14px; }
  .swatch .hex{ font-family:var(--font-display); font-size:13px; color:var(--muted); font-variant-numeric:tabular-nums; }
  .swatch .usage{ font-size:13px; color:var(--muted); margin-top:6px; }

  .type-sample{ display:grid; grid-template-columns:1fr 1fr; gap:40px; }
  .type-block{ border-top:1px solid var(--line); padding-top:20px; }
  .type-block .label{ font-family:var(--font-display); font-size:12px; letter-spacing:.08em; text-transform:uppercase; color:var(--muted); margin-bottom:12px; display:block; }
  .display-big{ font-family:var(--font-display); font-weight:600; font-size:clamp(30px,4vw,46px); line-height:1.1; margin-bottom:10px; }
  .body-sample{ font-size:18px; line-height:1.7; max-width:56ch; }
  .kicker-sample{ font-family:var(--font-display); font-weight:600; font-size:13px; letter-spacing:.08em; text-transform:uppercase; color:var(--green-700); }
  .ticket-number{ font-family:var(--font-display); font-weight:700; font-variant-numeric:tabular-nums; font-size:20px; }

  .tiles{ display:grid; grid-template-columns:repeat(auto-fit,minmax(260px,1fr)); gap:20px; }
  .tile{
    border:1px solid var(--aluminium); border-radius:4px; padding:20px 20px 18px; background:var(--bg);
    box-shadow: var(--shadow-tile);
    position:relative;
  }
  .tile .num{ font-family:var(--font-display); font-weight:700; font-variant-numeric:tabular-nums; font-size:13px; color:var(--muted); letter-spacing:.04em; }
  .tile h3{ font-size:18px; margin:8px 0 6px; }
  .tile .desc{ font-size:14px; color:var(--muted); margin-bottom:16px; }
  .status-pill{
    display:inline-flex; align-items:center; gap:6px; font-family:var(--font-display);
    font-size:12px; font-weight:600; letter-spacing:.03em; text-transform:uppercase;
    padding:5px 10px; border-radius:999px;
  }
  .status-pill::before{ content:""; width:8px; height:8px; border-radius:50%; }
  .status-pill.zamknieta{ background:var(--bg-soft); color:var(--muted); border:1px solid var(--line); }
  .status-pill.zamknieta::before{ background:var(--aluminium); }
  .status-pill.weryfikacja{ background:color-mix(in oklch, var(--warning) 18%, white); color:color-mix(in oklch, var(--warning) 70%, var(--ink)); }
  .status-pill.weryfikacja::before{ background:var(--warning); }
  .status-pill.otwarta{ background:var(--green-100); color:var(--green-800); }
  .status-pill.otwarta::before{ background:var(--green-600); }
  .required-tag{
    position:absolute; top:16px; right:16px; font-family:var(--font-display); font-size:11px;
    font-weight:600; letter-spacing:.04em; text-transform:uppercase; color:var(--ink);
    background:var(--warning); padding:3px 8px; border-radius:3px;
  }
  .tile-bar{ margin-top:14px; height:4px; background:var(--line); border-radius:2px; overflow:hidden; }
  .tile-bar > span{ display:block; height:100%; background:var(--green-500); }

  .lesson-mock{
    border:1px solid var(--line); border-radius:6px; overflow:hidden; background:var(--bg);
  }
  .lesson-head{
    padding:32px 36px 28px; border-bottom:1px solid var(--line);
    background-image: repeating-linear-gradient(115deg, rgba(20,32,28,.025) 0 1px, transparent 1px 48px);
  }
  .lesson-head .kicker-row{ display:flex; align-items:center; gap:10px; margin-bottom:14px; flex-wrap:wrap; }
  .lesson-head h2{ font-size:clamp(24px,3vw,34px); max-width:22ch; }
  .lesson-head .goal{ color:var(--muted); font-size:15px; margin-top:8px; }
  .req-badge{
    font-family:var(--font-display); font-size:11px; font-weight:600; letter-spacing:.05em;
    text-transform:uppercase; background:var(--warning); color:var(--ink); padding:3px 8px; border-radius:3px;
  }
  .lesson-body{ padding:28px 36px 8px; max-width:68ch; }
  .lesson-body .rule-block{ display:flex; gap:14px; padding:14px 0; border-top:1px solid var(--line); }
  .lesson-body .rule-block:first-child{ border-top:none; }
  .rule-dot{ width:10px; height:10px; border-radius:50%; margin-top:6px; flex:none; }
  .rule-dot.ok{ background:var(--green-500); }
  .rule-dot.warn{ background:var(--danger); }
  .rule-block p{ font-size:15px; margin:0; }
  .rule-block strong{ display:block; font-family:var(--font-display); font-size:15px; margin-bottom:2px; }

  .try-block{
    margin:28px 36px 32px; border:1px dashed var(--aluminium); border-radius:2px; padding:18px 20px;
    background:var(--bg-soft);
  }
  .try-block .label{ font-family:var(--font-display); font-size:12px; letter-spacing:.06em; text-transform:uppercase; color:var(--green-700); font-weight:600; }
  .try-block .prompt{ font-family:var(--font-body); font-size:15px; color:var(--ink); margin:10px 0 14px; font-style:italic; }
  .copy-btn{
    font-family:var(--font-display); font-weight:600; font-size:13px; letter-spacing:.02em;
    background:var(--green-500); color:var(--ink); border:none; padding:9px 16px; border-radius:4px; cursor:pointer;
  }

  .gate-demo{
    margin:0 36px 36px; border:1px solid var(--line); border-radius:6px; padding:32px;
    background:var(--bg-soft);
    display:grid; grid-template-columns:1fr 1fr; gap:32px; align-items:center;
  }
  .gate-stage{ position:relative; height:180px; display:flex; align-items:flex-end; justify-content:center; }
  .gate-post{ position:absolute; left:50%; bottom:0; width:10px; height:120px; background:var(--graphite); transform:translateX(-50%); border-radius:2px 2px 0 0; }
  .gate-arm{
    position:absolute; left:50%; bottom:114px; width:130px; height:12px; border-radius:3px;
    background:repeating-linear-gradient(115deg, var(--graphite) 0 14px, var(--aluminium) 14px 28px);
    transform-origin:0% 50%; transform: rotate(0deg);
    transition: transform .48s cubic-bezier(.16,1,.3,1), filter .3s ease;
    box-shadow: var(--shadow-arm);
  }
  .gate-stage[data-gate="udzielono"] .gate-arm{ transform: rotate(-72deg); }
  .gate-stage[data-gate="prosi"] .gate-arm{ animation:pulseWarn 1.1s ease-in-out infinite; }
  @keyframes pulseWarn{ 0%,100%{ filter:brightness(1);} 50%{ filter:brightness(1.15);} }
  .gate-label{
    position:absolute; top:0; left:50%; transform:translateX(-50%);
    font-family:var(--font-display); font-weight:700; font-size:12px; letter-spacing:.05em;
    text-transform:uppercase; padding:5px 12px; border-radius:999px; white-space:nowrap;
  }
  .gate-stage[data-gate="czeka"] .gate-label{ background:var(--bg); color:var(--muted); border:1px solid var(--line); }
  .gate-stage[data-gate="prosi"] .gate-label{ background:color-mix(in oklch, var(--warning) 20%, white); color:color-mix(in oklch, var(--warning) 65%, var(--ink)); }
  .gate-stage[data-gate="udzielono"] .gate-label{ background:var(--green-100); color:var(--green-800); }

  .gate-controls h3{ font-size:18px; margin-bottom:6px; }
  .gate-controls p{ font-size:14px; color:var(--muted); margin-bottom:16px; }
  .gate-btn{
    font-family:var(--font-display); font-weight:600; font-size:14px; background:var(--ink); color:var(--bg);
    border:none; padding:11px 18px; border-radius:4px; cursor:pointer; margin-right:8px; margin-bottom:8px;
  }
  .gate-btn.secondary{ background:transparent; color:var(--ink); border:1px solid var(--aluminium); }
  .gate-log{ margin-top:14px; font-family:var(--font-display); font-size:12px; font-variant-numeric:tabular-nums; color:var(--muted); border-top:1px solid var(--line); padding-top:10px; min-height:60px; }
  .gate-log div{ padding:3px 0; }
  .gate-log .now{ color:var(--ink); }

  .rhythm-row{ display:flex; align-items:flex-end; gap:6px; height:120px; margin-bottom:12px; }
  .rhythm-row .bar{ flex:1; border-radius:3px 3px 0 0; background:var(--green-500); position:relative; }
  .rhythm-row .bar.low{ background:var(--line); }
  .rhythm-row .bar.mid{ background:var(--aluminium); }
  .rhythm-labels{ display:flex; gap:6px; }
  .rhythm-labels span{ flex:1; text-align:center; font-size:11px; color:var(--muted); font-family:var(--font-display); text-transform:uppercase; letter-spacing:.03em; }

  .anti-grid{ display:grid; grid-template-columns:repeat(auto-fit,minmax(280px,1fr)); gap:20px; }
  .anti-card{ border:1px solid var(--line); border-radius:6px; overflow:hidden; }
  .anti-card .bad-preview{ height:120px; display:flex; align-items:center; justify-content:center; position:relative; }
  .anti-card .bad-preview::after{
    content:"✕"; position:absolute; inset:0; display:flex; align-items:center; justify-content:center;
    font-size:52px; color:rgba(214,69,69,.85); font-family:var(--font-display); font-weight:700;
  }
  .anti-card .bad-preview.grad{ background:linear-gradient(135deg,#8b5cf6,#3b82f6); }
  .anti-card .bad-preview.lock{ background:var(--bg-soft); font-size:48px; }
  .anti-card .bad-preview.lock span{ font-size:48px; }
  .anti-card .bad-preview.confetti{ background:repeating-conic-gradient(#facc15 0 20deg, #f472b6 20deg 40deg, #34d399 40deg 60deg); }
  .anti-card .why{ padding:14px 16px; font-size:14px; color:var(--muted); }
  .anti-card .why strong{ color:var(--ink); display:block; margin-bottom:4px; font-family:var(--font-display); font-size:14px; }

  .footnote{ background:var(--graphite); color:var(--line); padding:40px 0 56px; }
  .footnote .wrap p{ color:var(--line); font-size:15px; max-width:70ch; }
  .footnote a{ color:var(--green-500); }

  @media (max-width:800px){
    .parasol-explain, .type-sample, .gate-demo{ grid-template-columns:1fr; }
    .wrap{ padding:0 20px; }
  }
</style>
</head>
<body>

<header class="doc-header">
  <div class="wrap">
    <span class="kicker">Akademia Claude CFS · kierunek wizualny</span>
    <h1>Jak ma wyglądać i „czuć się" moduł M3 — Bezpieczeństwo i poufność</h1>
    <p>
      To jest moodboard, nie gotowa strona. Pokazuje kierunek: kolory, kroje pisma, jak wygląda kafelek
      modułu, fragment lekcji i szkic głównej animacji. Kliknij przyciski w sekcji „demo" niżej — to
      działa naprawdę, nie jest to zrzut ekranu. Wszystkie teksty poniżej to przykłady do zastąpienia
      finalną treścią.
    </p>
  </div>
</header>

<section>
  <div class="wrap">
    <span class="section-kicker">Główny pomysł, jednym zdaniem</span>
    <p class="parasol-quote">
      „Akademia uczy zasad tak, jak CFS steruje ruchem na co dzień — nic nie przejeżdża przez bramkę
      bez zatrzymania, weryfikacji i wydania przepustki. Ta sama logika rządzi tym, jak Claude prosi
      o dostęp do Twojej poczty, kalendarza czy Trello."
    </p>
    <div class="parasol-explain">
      <div>
        <h3>Skąd to się wzięło</h3>
        <p>CFS buduje szlabany i systemy kontroli wjazdu. Zamiast rysować stronę „jak każdy kurs online",
        przenieśliśmy WASZĄ własną logikę biznesową (stop → sprawdź → wpuść) na naukę o AI. To nie jest
        metafora naciągana na siłę — to dosłownie to, co robicie na co dzień.</p>
      </div>
      <div>
        <h3>Co to znaczy w praktyce</h3>
        <p>Moduły wyglądają jak tabliczki na bramkach kontrolnych (zamknięta / w trakcie sprawdzania /
        otwarta). Kluczowa animacja lekcji o bezpieczeństwie to prawdziwy szlaban, który się podnosi
        dopiero, gdy klikniesz „zatwierdzam" — zobaczysz to niżej.</p>
      </div>
      <div>
        <h3>Czego to unika</h3>
        <p>Zero kłódek i tarcz z banku ikon (dokładnie to, czego mieliście dość w typowych kursach
        bezpieczeństwa). Zero fioletowych gradientów i wesołych ludzików. Poważny, czytelny, ale nie
        zimny i nie onieśmielający ton.</p>
      </div>
    </div>
  </div>
</section>

<section>
  <div class="wrap">
    <span class="section-kicker">Paleta kolorów</span>
    <p class="section-lede">Kolory pochodzą wprost z marki CFS (zielony z Waszej strony) — to była
    wyraźna decyzja: nie wolno nam było wymyślać nowej palety. Dołożyliśmy tylko odcienie
    pomocnicze (jasne/ciemne warianty) i sprawdziliśmy każdy pod kątem czytelności tekstu (WCAG AA —
    standard dostępności, żeby każdy, niezależnie od wzroku, mógł swobodnie czytać).</p>
    <div class="palette-grid">
      <div class="swatch">
        <div class="fill" style="background:var(--green-500);"></div>
        <div class="info"><div class="name">Zieleń marki</div><div class="hex">#35BA81</div>
        <div class="usage">Aktywne stany, przyciski, „bramka otwarta". Dokładnie ten sam zielony co na
        Waszej stronie i szlabanach.</div></div>
      </div>
      <div class="swatch">
        <div class="fill" style="background:var(--green-800);"></div>
        <div class="info"><div class="name">Zieleń ciemna</div><div class="hex">#1F6E4B</div>
        <div class="usage">Tam, gdzie potrzebny biały tekst na zielonym tle (czytelniej niż jaśniejszy
        odcień).</div></div>
      </div>
      <div class="swatch">
        <div class="fill" style="background:var(--ink); color:var(--bg-soft);"></div>
        <div class="info"><div class="name">Atrament (tekst)</div><div class="hex">#14201C</div>
        <div class="usage">Główny kolor tekstu — prawie czarny z zielonkawą nutą, nie czysta czerń.</div></div>
      </div>
      <div class="swatch">
        <div class="fill" style="background:var(--graphite); color:var(--bg-soft);"></div>
        <div class="info"><div class="name">Grafit</div><div class="hex">#202826</div>
        <div class="usage">Ciemne akcenty, słupek szlabanu w demo, ewentualne ciemne sekcje.</div></div>
      </div>
      <div class="swatch">
        <div class="fill" style="background:var(--aluminium);"></div>
        <div class="info"><div class="name">Aluminium (RAL 9006)</div><div class="hex">#A5A5A5</div>
        <div class="usage">Linie, ramki tabliczek — przemysłowy akcent, nigdy jako tekst.</div></div>
      </div>
      <div class="swatch">
        <div class="fill" style="background:var(--bg-soft);"></div>
        <div class="info"><div class="name">Tło (jasne)</div><div class="hex">#F6F8F7</div>
        <div class="usage">Tło strony i kart — ciepława biel, nie czysty biały.</div></div>
      </div>
      <div class="swatch">
        <div class="fill" style="background:var(--warning);"></div>
        <div class="info"><div class="name">Bursztyn — uwaga</div><div class="hex">#E5A100</div>
        <div class="usage">„Moduł obowiązkowy", „w trakcie sprawdzania".</div></div>
      </div>
      <div class="swatch">
        <div class="fill" style="background:var(--danger-text); color:var(--bg-soft);"></div>
        <div class="info"><div class="name">Czerwień — zakaz</div><div class="hex">#B23636</div>
        <div class="usage">Wyłącznie tam, gdzie trzeba jasno powiedzieć „tego nie wolno" (np. wklejanie
        kwot z umów).</div></div>
      </div>
    </div>
  </div>
</section>

<section>
  <div class="wrap">
    <span class="section-kicker">Typografia — jak wygląda pismo</span>
    <p class="section-lede">Dwa kroje, oba darmowe i legalne (Google Fonts). Nagłówkowy ma lekko
    „techniczny", inżynierski charakter — pasuje do firmy budującej urządzenia, nie do modowego bloga.
    Tekst czytamy krojem zaprojektowanym specjalnie pod czytelność długich fragmentów.</p>
    <div class="type-sample">
      <div class="type-block">
        <span class="label">Nagłówki — Space Grotesk</span>
        <div class="display-big">Bezpieczeństwo<br>i poufność</div>
        <span class="kicker-sample">Punkt kontrolny 03 / 10 · obowiązkowy</span>
        <div style="margin-top:14px;"><span class="ticket-number">M3 · 03/10</span></div>
      </div>
      <div class="type-block">
        <span class="label">Tekst — Source Sans 3</span>
        <p class="body-sample">Claude nigdy sam nie sięga do Twojej poczty, kalendarza czy Trello.
        Zawsze najpierw pyta o zgodę — dokładnie tak, jak szlaban czeka na sygnał, zanim się podniesie.
        Jeśli musisz podać przykład z prawdziwej sprawy, użyj oznaczenia „Klient A" zamiast nazwiska
        i firmy.</p>
      </div>
    </div>
  </div>
</section>

<section>
  <div class="wrap">
    <span class="section-kicker">Kafelek modułu</span>
    <p class="section-lede">Tak wyglądają „punkty kontrolne" na stronie startowej. Kolor i podpis od
    razu mówią, na jakim etapie jest dany moduł — bez czytania dodatkowego opisu.</p>
    <div class="tiles">
      <div class="tile">
        <span class="num">M4</span>
        <h3>Co to jest „workflow"</h3>
        <p class="desc">Rozumiesz pojęcie rutyny i po co ją wdrażamy.</p>
        <span class="status-pill zamknieta">Zamknięta</span>
        <div class="tile-bar"><span style="width:0%"></span></div>
      </div>
      <div class="tile">
        <span class="num">M2</span>
        <h3>Jak rozmawiać z Claude</h3>
        <p class="desc">Piszesz skuteczne polecenia po polsku.</p>
        <span class="status-pill weryfikacja">W weryfikacji</span>
        <div class="tile-bar"><span style="width:55%"></span></div>
      </div>
      <div class="tile">
        <span class="required-tag">Obowiązkowy</span>
        <span class="num">M3</span>
        <h3>Bezpieczeństwo i poufność</h3>
        <p class="desc">Znasz granice — co wolno, czego nie.</p>
        <span class="status-pill otwarta">Otwarta</span>
        <div class="tile-bar"><span style="width:100%"></span></div>
      </div>
    </div>
  </div>
</section>

<section>
  <div class="wrap">
    <span class="section-kicker">Fragment widoku lekcji M3</span>
    <p class="section-lede">Tak może wyglądać sama lekcja — nagłówek z celem, krótkie zasady, gotowy
    prompt do skopiowania. Treść poniżej to przykład, finalne teksty napisze osobno zespół od słów.</p>

    <div class="lesson-mock">
      <div class="lesson-head">
        <div class="kicker-row">
          <span class="kicker-sample">Punkt kontrolny 03 / 10</span>
          <span class="req-badge">Obowiązkowy</span>
        </div>
        <h2>Bezpieczeństwo i poufność w CFS</h2>
        <p class="goal">Cel lekcji: wiesz dokładnie, co Claude wolno zrobić samodzielnie, a na co musi
        najpierw zapytać.</p>
      </div>
      <div class="lesson-body">
        <div class="rule-block">
          <span class="rule-dot ok"></span>
          <p><strong>Zgoda na narzędzia</strong>Claude nie sięga do poczty, kalendarza, Trello ani
          Dysku bez Twojej wyraźnej zgody. Zawsze zobaczysz pytanie, zanim coś się wydarzy.</p>
        </div>
        <div class="rule-block">
          <span class="rule-dot warn"></span>
          <p><strong>Dane wrażliwe</strong>Nie wklejamy do czatu kwot z umów ani danych osobowych.
          Używaj oznaczeń typu „Klient A", „kwota XXX".</p>
        </div>
      </div>

      <div class="gate-demo">
        <div class="gate-stage" id="gateStage" data-gate="czeka">
          <span class="gate-label">Czeka</span>
          <div class="gate-post"></div>
          <div class="gate-arm"></div>
        </div>
        <div class="gate-controls">
          <h3>Demo: przepływ zgody</h3>
          <p>Kliknij po kolei — zobaczysz dokładnie to, co zobaczy pracownik w prawdziwej lekcji.</p>
          <button class="gate-btn" onclick="gateStep('prosi')">1. Claude prosi o dostęp</button>
          <button class="gate-btn" onclick="gateStep('udzielono')">2. Zatwierdzam</button>
          <button class="gate-btn secondary" onclick="gateStep('czeka')">Resetuj</button>
          <div class="gate-log" id="gateLog"></div>
        </div>
      </div>

      <div class="try-block">
        <span class="label">Spróbuj sam</span>
        <p class="prompt">„Wyjaśnij mi w 3 zdaniach, dlaczego zawsze pytasz o zgodę, zanim użyjesz
        jakiegoś narzędzia."</p>
        <button class="copy-btn">Kopiuj</button>
      </div>
    </div>
  </div>
</section>

<section>
  <div class="wrap">
    <span class="section-kicker">Rytm całej Akademii</span>
    <p class="section-lede">Nie każda część hubu ma wyglądać tak samo gęsto. Strona startowa (dużo
    kafelków) jest „głośniejsza", pojedyncza lekcja jest spokojniejsza i skupiona na czytaniu, demo jest
    momentem ciszy i uwagi. To naprzemienne oddychanie ma pomóc się nie zmęczyć materiałem.</p>
    <div class="rhythm-row">
      <div class="bar" style="height:90%"></div>
      <div class="bar low" style="height:35%"></div>
      <div class="bar mid" style="height:55%"></div>
      <div class="bar" style="height:95%"></div>
      <div class="bar low" style="height:30%"></div>
      <div class="bar mid" style="height:50%"></div>
    </div>
    <div class="rhythm-labels">
      <span>Start / kafle</span><span>Lekcja</span><span>Demo</span>
      <span>Narzędzia</span><span>Lekcja</span><span>Zaplecze</span>
    </div>
  </div>
</section>

<section>
  <div class="wrap">
    <span class="section-kicker">Czego świadomie unikamy</span>
    <p class="section-lede">Trzy rzeczy, przez które większość kursów online wygląda tak samo — i
    dlatego ich tu nie będzie.</p>
    <div class="anti-grid">
      <div class="anti-card">
        <div class="bad-preview grad"></div>
        <div class="why"><strong>Fioletowy gradient „startupowy"</strong>Tak wygląda każdy generyczny
        kurs SaaS. My trzymamy się kolorów CFS i płaskich, materiałowych powierzchni.</div>
      </div>
      <div class="anti-card">
        <div class="bad-preview lock"><span>🔒🛡️</span></div>
        <div class="why"><strong>Kłódka i tarcza z banku ikon</strong>Dosłownie to, czego mieliście
        dość. Zamiast tego — prawdziwy, działający mechanizm szlabanu.</div>
      </div>
      <div class="anti-card">
        <div class="bad-preview confetti"></div>
        <div class="why"><strong>Confetti i „gratulacje!"</strong>Ukończenie modułu to spokojna zmiana
        stanu tabliczki, nie fajerwerki jak w appce fitness.</div>
      </div>
    </div>
  </div>
</section>

<footer class="footnote">
  <div class="wrap">
    <h2 style="color:var(--bg); font-size:20px;">Co dalej</h2>
    <p>To jest kierunek do Twojej oceny — kolory są narzucone przez markę CFS, więc tu decyzji nie ma;
    prawdziwe pytanie to: czy pomysł „bramki/przepustki" jako spójny język całej Akademii Ci pasuje, i
    czy demo szlabanu wygląda tak, jak sobie wyobrażałeś moment „przepływu zgody". Po Twojej akceptacji
    budujemy z tego pełny moduł M3, a potem resztę hubu w tym samym stylu.</p>
  </div>
</footer>

<script>
  function gateStep(state){
    const stage = document.getElementById('gateStage');
    const label = stage.querySelector('.gate-label');
    const log = document.getElementById('gateLog');
    stage.setAttribute('data-gate', state);
    const texts = { czeka:'Czeka', prosi:'Prosi o dostęp', udzielono:'Udzielono' };
    label.textContent = texts[state];
    const now = new Date().toLocaleTimeString('pl-PL');
    const lines = {
      czeka: 'Reset — bramka wraca do stanu wyjściowego.',
      prosi: 'Claude prosi o dostęp do: Kalendarza. Oczekuje na Twoją decyzję.',
      udzielono: 'Zatwierdzono. Dostęp przyznany jednorazowo, zapisano w dzienniku.'
    };
    const entry = document.createElement('div');
    entry.className = 'now';
    entry.textContent = now + ' — ' + lines[state];
    log.prepend(entry);
  }
</script>

</body>
</html>
```
