:root {
    /* Tokeny przebudowane 2026-08-31 (druga fala, dyrektywa "SaaS/AI w
       stylu Linear/Vercel/Raycast" -- redesign, nie tylko retusz). Stare
       nazwy zmiennych (--background-color/--cyan-color/--violet-color/
       --glass-bg/--glass-border/--link-color) ZOSTAJA -- czyta je kazda
       podstrona portalu (asset-factory/, portable-animator/, cloud-
       architecture/, company/team.html, legal/*.html), ktore NIE sa w
       zakresie tej przebudowy (tylko index.html). Zmiana WARTOSCI tych
       zmiennych automatycznie unowocześnia karty/tla na WSZYSTKICH
       podstronach bez dotykania ich HTML -- to jest zamierzone. */
    --background-color: #080b11;
    --background-color-2: #0d111a;
    --cyan-color: #22d3ee;
    --violet-color: #a78bfa;
    --glass-bg: rgba(15, 23, 42, 0.6);
    --glass-border: rgba(255, 255, 255, 0.08);
    --glass-border-hover: rgba(255, 255, 255, 0.16);
    --link-color: #94a3b8;
    --radius-card: 16px;
    /* CIENIE JAKO ZMIENNE -- dodane 2026-09-04. Wartosci byly do tej pory
       wpisywane wprost w pieciu regulach, wiec "delikatny cien na kartach"
       oznaczalby piec osobnych edycji i pewny rozjazd przy szostej. */
    --shadow-card: 0 2px 6px rgba(0, 0, 0, 0.28), 0 10px 28px -18px rgba(0, 0, 0, 0.65);
    --shadow-card-hover: 0 4px 10px rgba(0, 0, 0, 0.34), 0 18px 42px -20px rgba(0, 0, 0, 0.75);
    /* Rytm pionowy sekcji -- jedna wartosc zamiast stylow liniowych
       rozsypanych po podstronach (34px tu, 24px tam). */
    --rytm-sekcji: 34px;
    --text-primary: #e6e9f0;
    --text-secondary: rgba(230, 233, 240, 0.72);
    --text-tertiary: rgba(230, 233, 240, 0.5);

    /* Stos systemowy -- ZERO CDN (test_portal_zero_cdn.py). "Inter" w
       liscie to WYLACZNIE nazwa fallbacku: aktywuje sie tylko jesli
       przegladarka/OS ma juz lokalnie zainstalowana czcionke o tej
       nazwie -- zero @font-face, zero @import, zero polaczenia
       sieciowego. Dokladnie stos podany w dyrektywie operatora. */
    --font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Inter", sans-serif;
    --font-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;
}

/* ===========================================================================
   MODEL PUDELKOWY: `border-box` GLOBALNIE -- 2026-09-04.
   ===========================================================================
   Ten arkusz mial dokladnie ten sam brak co `ui/static/css/panel.css`: slowo
   `box-sizing` nie wystepowalo w nim ani razu, wiec obowiazywal domyslny
   `content-box`. Objaw zglosil operator na ekranie generowania (panel), ale
   przyczyna jest wspolna dla obu arkuszy -- kazdy element z `width: 100%`
   ORAZ wypelnieniem albo obramowaniem jest przy `content-box` szerszy od
   swojego rodzica o sume wypelnienia i obramowania.

   Naprawiamy w OBU arkuszach naraz, a nie tylko tam, gdzie usterka zostala
   zauwazona -- inaczej portal czekalby na wlasne, osobne zgloszenie tego
   samego bledu. Na waskim ekranie taki element wypycha strone w bok i
   powoduje poziome przewijanie calego serwisu.
   =========================================================================== */
*,
*::before,
*::after {
  box-sizing: border-box;
}


/* Tlo SaaS/AI (przebudowane 2026-08-31, druga fala): koniec jaskrawej,
   animowanej siatki inzynierskiej (byla: powtarzalny linear-gradient +
   canvas particle-network w scifi_grid_bg.js) -- zastapione dwiema
   subtelnymi, statycznymi poswiatami radialnymi (cyan/purple) za hero,
   na plaskim, bardzo ciemnym tle. Zero obrazu/CDN -- czysty CSS gradient,
   test_portal_zero_cdn.py bez zmian w wymaganiach. */
body {
    font-family: var(--font-sans);
    -webkit-font-smoothing: antialiased;
    background-color: var(--background-color);
    background-image:
        radial-gradient(760px 480px at 18% -8%, rgba(34, 211, 238, 0.14), transparent 62%),
        radial-gradient(640px 420px at 86% 4%, rgba(167, 139, 250, 0.12), transparent 60%),
        linear-gradient(180deg, var(--background-color) 0%, var(--background-color-2) 100%);
    background-attachment: fixed;
    margin: 0;
    padding: 0;
    color: var(--text-primary);
    line-height: 1.6;
}

code, pre, kbd, samp, .mono, .tag-chip {
    font-family: var(--font-mono);
}

/* Hierarchia typograficzna 32/24/18px (dyrektywa operatora, druga fala) --
   nagłówki wąsko śledzone (letter-spacing: -0.02em), monospace zarezerwowany
   wyłącznie dla tagów/kodu (regula juz obowiazuje przez selektor code/pre
   powyzej). */
h1, h2, h3, h4 {
    font-family: var(--font-sans);
    letter-spacing: -0.02em;
    font-weight: 700;
    color: var(--text-primary);
    margin: 0 0 0.5em;
}
h1 { font-size: 2rem;    /* 32px */ line-height: 1.2; }
h2 { font-size: 1.5rem;  /* 24px */ line-height: 1.28; }
h3 { font-size: 1.125rem; /* 18px */ line-height: 1.35; font-weight: 600; }
h4 { font-size: 1rem; font-weight: 600; letter-spacing: -0.01em; }

p { color: var(--text-secondary); }

/* Zero domyslnych niebieskich linkow przegladarki -- dotyczy tez linkow BEZ
   wlasnej klasy (np. w tresci prawnej legal/*.html), nie tylko nawigacji. */
a {
    color: var(--link-color);
}
a:hover {
    color: var(--cyan-color);
}

.hud-panel {
    background-color: rgba(255, 255, 255, 0.1);
    backdrop-filter: blur(10px);
    border-radius: 10px;
    clip-path: polygon(0 10px, 10px 0, calc(100% - 10px) 0, 100% 10px, 100% calc(100% - 10px), calc(100% - 10px) 100%, 10px 100%, 0 calc(100% - 10px));
    padding: 20px;
    margin: 20px;
}

@keyframes pulse {
    0%, 100% {
        transform: scale(1);
    }
    50% {
        transform: scale(1.05);
    }
}

.accent-element {
    animation: pulse 2s infinite;
    color: var(--cyan-color);
}

.status-tag {
    background-color: var(--violet-color);
    color: white;
    padding: 5px 10px;
    border-radius: 5px;
    display: inline-block;
    margin-right: 5px;
}

.card-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
    gap: 20px;
    padding: 20px;
}

.card {
    background-color: rgba(255, 255, 255, 0.1);
    backdrop-filter: blur(10px);
    border-radius: 10px;
    overflow: hidden;
    transition: transform 0.2s;
}

.card:hover {
    transform: scale(1.05);
}

.card img {
    max-width: 100%;
    height: auto;
    display: block;
}

.card .caption {
    padding: 10px;
    background-color: rgba(0, 0, 0, 0.5);
    color: white;
    text-align: center;
}

/* Navbar szklany -- zaostrzony 2026-08-31 (druga fala): cieńsza linia,
   mniejszy tekst, ten sam jezyk co reszta redesignu. Sticky, zeby kotwice
   #asset-factory/... byly osiagalne z kazdego miejsca strony. Uzywa TYLKO
   lokalnych wlasciwosci CSS -- zero zaleznosci sieciowej
   (test_portal_zero_cdn.py). */
.site-nav {
    position: sticky;
    top: 0;
    z-index: 50;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 16px;
    padding: 14px 28px;
    background-color: rgba(8, 11, 17, 0.78);
    backdrop-filter: blur(12px);
    -webkit-backdrop-filter: blur(12px);
    border-bottom: 1px solid var(--glass-border);
}

.site-nav .brand {
    color: var(--text-primary);
    font-weight: 700;
    letter-spacing: -0.01em;
    text-decoration: none;
    white-space: nowrap;
    font-size: 0.95rem;
}
.site-nav .brand span { color: var(--cyan-color); }

.site-nav ul {
    display: flex;
    flex-wrap: wrap;
    gap: 4px 18px;
    list-style: none;
    margin: 0;
    padding: 0;
}

.site-nav a {
    color: rgba(255, 255, 255, 0.65);
    text-decoration: none;
    font-size: 0.85rem;
}
.site-nav a:hover { color: var(--cyan-color); }

.nav-cta {
    background-color: var(--cyan-color);
    color: #061016 !important;
    font-weight: 600;
    font-size: 0.85rem;
    padding: 8px 16px;
    border-radius: 8px;
    white-space: nowrap;
}
.nav-cta:hover { color: #061016 !important; opacity: 0.88; }

/* Przycisk hamburgera -- UKRYTY na szerokich ekranach, pokazywany dopiero
   w media query ponizej 768px. Trzy kreski rysowane czystym CSS (trzy
   <i>), zero ikonografii z zewnatrz (test_portal_zero_cdn.py). */
.nav-toggle {
    display: none;
    align-items: center;
    justify-content: center;
    width: 40px;
    height: 40px;
    padding: 0;
    border: 1px solid var(--glass-border);
    border-radius: 9px;
    background: rgba(255, 255, 255, 0.03);
    cursor: pointer;
}
.nav-toggle:hover { border-color: var(--glass-border-hover); }
.nav-toggle-bars {
    display: flex;
    flex-direction: column;
    gap: 4px;
    width: 18px;
}
.nav-toggle-bars i {
    display: block;
    height: 2px;
    border-radius: 2px;
    background: var(--text-primary);
}

/* ------------------------------------------------------------------ */
/* HERO -- przebudowany 2026-08-31 (druga fala): headline + jedno zdanie
   podglowka + dwa CTA (podstawowy neonowy cyan / drugorzedny konturowy).
   .hero sam w sobie zostaje UZYWANY TEZ przez podstrony (asset-factory,
   portable-animator, cloud-architecture) z samym <h1>+.page-lead -- reguly
   ponizej musza dzialac dla obu przypadkow, wiec .hero-actions/.hero-sub
   sa DODATKIEM, nie wymogiem. */
.hero {
    padding: 64px 28px 20px;
    max-width: 880px;
    margin: 0 auto;
    text-align: left;
}
.hero h1 {
    font-size: clamp(1.75rem, 1.4rem + 1.4vw, 2.5rem);
    max-width: 20ch;
}
.hero-sub {
    max-width: 62ch;
    color: var(--text-secondary);
    font-size: 1.05rem;
}
.hero-eyebrow {
    display: inline-block;
    font-family: var(--font-mono);
    font-size: 0.72rem;
    letter-spacing: 0.06em;
    text-transform: uppercase;
    color: var(--cyan-color);
    background: rgba(34, 211, 238, 0.1);
    border: 1px solid rgba(34, 211, 238, 0.28);
    border-radius: 999px;
    padding: 4px 12px;
    margin-bottom: 18px;
}
.hero-actions {
    display: flex;
    flex-wrap: wrap;
    gap: 12px;
    margin-top: 24px;
}
.hero-actions a {
    padding: 11px 22px;
    border-radius: 10px;
    text-decoration: none;
    font-weight: 600;
    font-size: 0.92rem;
    transition: opacity 0.15s ease, background-color 0.15s ease, border-color 0.15s ease;
}
.hero-actions .primary {
    background-color: var(--cyan-color);
    color: #061016;
    box-shadow: 0 0 0 1px rgba(34, 211, 238, 0.4), 0 8px 24px -8px rgba(34, 211, 238, 0.5);
}
.hero-actions .primary:hover { opacity: 0.9; color: #061016; }
.hero-actions .secondary {
    border: 1px solid var(--glass-border);
    color: var(--text-primary);
    background: rgba(255, 255, 255, 0.02);
}
.hero-actions .secondary:hover { border-color: var(--glass-border-hover); color: var(--text-primary); }

/* Sekcja jako kontener -- eyebrow + naglowek + lead, wspoldzielone przez
   pillar-section/tabs-section ponizej. */
.section-head {
    max-width: 640px;
    margin: 0 0 28px;
}
.section-eyebrow {
    display: block;
    font-family: var(--font-mono);
    font-size: 0.72rem;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: var(--text-tertiary);
    margin-bottom: 8px;
}

/* ------------------------------------------------------------------ */
/* KARTY FILAROWE v2 (2026-08-31, druga fala) -- dwie wyeksponowane karty
   (Asset Factory / Portable Animator), specyfikacja doslowna: tlo
   rgba(15,23,42,0.6) (== --glass-bg, zeby jeden token karmil wszystkie
   karty w calym portalu), blur(12px), border-radius: 16px, subtelny
   hover. Trzeci, dawny filar "AIOS Core & Orchestrator" NIE zniknal --
   jego tresc przeniesiona do zakladki "Core Engine" w sekcji technicznej
   (accordion/tabs ponizej), zgodnie z dyrektywa "sekcja techniczna w
   zakladkach zamiast sciany tekstu". */
.pillar-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
    gap: 22px;
    margin-top: 8px;
}
.pillar-card {
    background: var(--glass-bg);
    border: 1px solid var(--glass-border);
    backdrop-filter: blur(12px);
    -webkit-backdrop-filter: blur(12px);
    border-radius: var(--radius-card);
    padding: 26px;
    transition: transform 0.18s ease, border-color 0.18s ease, box-shadow 0.18s ease;
}
.pillar-card:hover {
    transform: translateY(-3px);
    border-color: var(--glass-border-hover);
    box-shadow: 0 16px 40px -20px rgba(0, 0, 0, 0.6);
}
.pillar-card h2 { margin-top: 0; font-size: 1.3rem; }
.pillar-card > p { margin-top: 6px; }
.pillar-card ul.pillar-points {
    list-style: none;
    margin: 14px 0 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: 6px;
}
.pillar-card ul.pillar-points li {
    padding-left: 1.1em;
    position: relative;
    color: var(--text-secondary);
    font-size: 0.92rem;
}
.pillar-card ul.pillar-points li::before {
    content: "▸";
    position: absolute;
    left: 0;
    color: var(--cyan-color);
}

/* Odznaka statusu (LIVE PRODUCT / R&D / CORE ENGINE / INFRA) -- zostaje z
   poprzedniej iteracji, jezyk kolorystyczny bez zmian (recenzent grantu juz
   sie z nim zapoznal w poprzednich turach tej samej sesji). */
.pillar-status {
    display: inline-block;
    font-family: var(--font-mono);
    font-size: 0.68rem;
    font-weight: 700;
    letter-spacing: 0.05em;
    text-transform: uppercase;
    padding: 3px 9px;
    border-radius: 5px;
    margin-bottom: 12px;
}
.pillar-status.live { background-color: rgba(34, 211, 238, 0.16); color: var(--cyan-color); border: 1px solid rgba(34, 211, 238, 0.4); }
.pillar-status.rd { background-color: rgba(167, 139, 250, 0.18); color: #c4b5fd; border: 1px solid rgba(167, 139, 250, 0.45); }
.pillar-status.infra { background-color: rgba(255, 255, 255, 0.12); color: rgba(255,255,255,0.8); border: 1px solid rgba(255, 255, 255, 0.25); }
.pillar-status.core { background-color: rgba(59, 130, 246, 0.18); color: #93c5fd; border: 1px solid rgba(59, 130, 246, 0.45); }

/* Chipy tagow (2026-08-31, druga fala) -- np. "PBR Textures", "Scene DAG".
   Monospace, celowo -- to jest DOKLADNIE ta kategoria tresci ("tagi/kod"),
   dla ktorej dyrektywa operatora rezerwuje monospace, w odroznieniu od
   naglowkow/prozy (sans-serif). */
.tag-row {
    display: flex;
    flex-wrap: wrap;
    gap: 6px;
    margin: 4px 0 14px;
}
.tag-chip {
    font-size: 0.7rem;
    letter-spacing: 0.02em;
    padding: 3px 9px;
    border-radius: 999px;
    border: 1px solid rgba(255, 255, 255, 0.14);
    color: rgba(255, 255, 255, 0.75);
    background: rgba(255, 255, 255, 0.04);
    white-space: nowrap;
}

/* Pasek dwoch przyciskow na karcie filarowej: "Zobacz szczegoly projektu"
   (otwiera modal) + "Product Hunt" (placeholder/wylaczony -- patrz
   .ph-placeholder ponizej, zero aktywnego linku do nieistniejacego
   listingu, decyzja operatora 2026-08-31). */
.pillar-actions {
    display: flex;
    flex-wrap: wrap;
    gap: 10px;
    margin-top: 18px;
}
.pillar-actions button.pillar-cta-btn {
    font: inherit;
    cursor: pointer;
}

/* Przycisk "Product Hunt" -- CELOWO wizualnie wygaszony (opacity, kursor
   not-allowed, brak href/onclick). Operator, 2026-08-31: "POMIŃ aktywne
   linki. Czysty placeholder albo wyłączony przycisk do czasu oficjalnego
   launchu." Zweryfikowano grepem calego repo PRZED ta zmiana -- zero
   realnego listingu Product Hunt dla ktoregokolwiek produktu AIOS (jedyne
   wzmianki: opcja platformy w kompozytorze Social Hub, wpis w skrzynce-
   probce, i notatka planistyczna w apps/portable_animator/DYSTRYBUCJA.md
   opisujaca zgloszenie jako REczna czynnosc do zrobienia W PRZYSZLOSCI,
   nie fakt dokonany). */
.ph-placeholder {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 8px 16px;
    border-radius: 8px;
    border: 1px dashed rgba(255, 255, 255, 0.2);
    color: var(--text-tertiary);
    font-weight: 600;
    font-size: 0.85rem;
    cursor: not-allowed;
    user-select: none;
}

/* ------------------------------------------------------------------ */
/* ODZNAKI DYSTRYBUCJI (2026-09-01, dyrektywa operatora "portal bez
   overclaimow", punkt A2: "Fab, Itch.io i Product Hunt -> nieklikalne
   badge'y statusu ... Zero zmyslonych adresow").

   UWAGA MERYTORYCZNA (zgloszona operatorowi w raporcie, NIE zaimplementowana
   doslownie): przyklad tresci z dyrektywy -- "Asset Pack 01 -- Available on
   Fab / Itch.io" -- sam bylby overclaimem, bo NIC nie jest dzis
   opublikowane na zadnej z tych platform. Zweryfikowane przed napisaniem
   tego bloku:
     - Fab: docs/FAZA_G_PLAN_PUBLIKACJA_FAB_2026-07-25.md to PLAN krokow
       ("Status: PLAN do wykonania PO wydaniu V1"), nie wykonanie.
     - itch.io: apps/portable_animator/DYSTRYBUCJA.md par. "Stan obecny"
       wprost: "Zadnego builda --onedir faktycznie jeszcze wgranego na
       itch.io (repo nie ma sladu wczesniejszej publikacji tego modulu)";
       strona projektu na itch.io jeszcze nie istnieje.
     - apps/asset_factory/publish_queue.json: wszystkie wpisy maja
       status "rejected", `published_at: null` -- zero publikacji.
   Dlatego tresc odznak mowi "Planned", nie "Available". Odznaka jest
   <span>, nie <a> -- brak href, brak kursora wskazujacego, brak
   nawigacji; aria-disabled dla czytnikow ekranu. */
.dist-badges {
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
    margin-top: 14px;
}
.dist-badge {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 5px 12px;
    border-radius: 999px;
    border: 1px dashed rgba(255, 255, 255, 0.18);
    background: rgba(255, 255, 255, 0.03);
    color: var(--text-tertiary);
    font-family: var(--font-mono);
    font-size: 0.72rem;
    letter-spacing: 0.02em;
    cursor: default;
    user-select: none;
    white-space: nowrap;
}
.dist-badge::before {
    content: "○";
    font-size: 0.7em;
    opacity: 0.7;
}

/* ------------------------------------------------------------------ */
/* SEKCJA "SYSTEM W DZIALANIU" (2026-09-01, dyrektywa operatora punkt A3).
   Trzy realne zrzuty dzialajacego panelu: ui_web_panel.png,
   ui_task_queue.png, ui_finops.png w ui/site/assets/img/.

   DLACZEGO background-image, A NIE <img src>: operator zazadal wprost, zeby
   struktura "dzialala sensownie takze zanim pliki sie pojawia -- ale bez
   napisu 'w przygotowaniu'". Znacznik <img> ze wskazaniem na nieistniejacy
   plik pokazuje w przegladarce IKONE ZEPSUTEGO OBRAZKA (a w niektorych
   przegladarkach dodatkowo tekst alt na jej tle) -- czyli dokladnie ten
   sygnal "Under Construction", ktory Google traktuje jako powod odrzucenia.
   `background-image` na brakujacy plik po prostu SIE NIE MALUJE: zostaje
   czyste, ciemne tlo ramki z podpisem pod spodem, ktore czyta sie jak
   celowo zaprojektowany, opisany panel referencyjny, a nie jak bledny
   zasob. Zero JavaScriptu, zero `onerror`, zero fallbackowej grafiki do
   utrzymania.

   Dostepnosc: kontener ma role="img" + aria-label, wiec czytnik ekranu
   dostaje opis mimo braku <img alt>. Podpis (<figcaption>) opisuje CO
   ROBI dana czesc systemu -- niesie tresc niezaleznie od tego, czy PNG
   jest juz na dysku, wiec sekcja nigdy nie jest pusta semantycznie.

   PODMIANA ZRZUTOW = JEDEN KROK: wrzucic trzy pliki PNG o dokladnie tych
   nazwach do ui/site/assets/img/. Zero zmian w HTML/CSS. */
.in-action {
    margin-top: 12px;
}
.in-action-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
    gap: 20px;
    margin: 0;
}
.in-action figure {
    margin: 0;
    border: 1px solid var(--glass-border);
    border-radius: 14px;
    background: var(--glass-bg);
    overflow: hidden;
}
/* Pasek "chrome" okna -- trzy kropki + etykieta trasy. To NIE udaje paska
   przegladarki z prawdziwym URL-em: pokazuje realna, lokalna trase panelu
   (np. localhost:8000/#pulpit), ktora kazdy moze sam odtworzyc po
   uruchomieniu demo. */
.in-action .shot-chrome {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 9px 14px;
    border-bottom: 1px solid var(--glass-border);
    background: rgba(255, 255, 255, 0.03);
}
.in-action .shot-dots {
    display: inline-flex;
    gap: 5px;
    flex: 0 0 auto;
}
.in-action .shot-dots i {
    width: 9px;
    height: 9px;
    border-radius: 50%;
    background: rgba(255, 255, 255, 0.16);
}
.in-action .shot-route {
    font-family: var(--font-mono);
    font-size: 0.72rem;
    color: var(--text-tertiary);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
/* Odznaka "sample output" w pasku okna. ISTNIEJE PO TO, ZEBY NIE KLAMAC:
   zawartosc ponizej jest RENDEROWANA przez te strone, a nie zrzutem
   ekranu panelu. Bez tej odznaki okno z paskiem "localhost:8000" i
   konsola w srodku czyta sie jak dowod dzialania systemu -- a jest
   ilustracja FORMATU wyjscia. */
.in-action .shot-sample {
    margin-left: auto;
    flex: 0 0 auto;
    font-family: var(--font-mono);
    font-size: 0.6rem;
    letter-spacing: 0.06em;
    text-transform: uppercase;
    color: var(--text-tertiary);
    border: 1px solid var(--glass-border);
    border-radius: 999px;
    padding: 1px 8px;
    white-space: nowrap;
}

/* Wlasciwy obszar podgladu.
   HISTORIA (2026-09-01): do tego dnia byly to TRZY PUSTE DIVY z
   `background-image` wskazujacym na `ui_web_panel.png`, `ui_task_queue.png`
   i `ui_finops.png` -- pliki, ktore nigdy nie trafily do repo. Efektem
   byly trzy czarne prostokaty: konstrukcja mialaby sens, gdyby PNG mialy
   sie pojawic, ale przez caly czas nie pojawily sie i strona pokazywala
   recenzentowi puste okna.
   Zastapione TRESCIA RENDEROWANA W HTML/CSS: zero plikow graficznych do
   podlozenia, zero zaleznosci sieciowej, skaluje sie na kazdym ekranie i
   da sie zaznaczyc/skopiowac. `aspect-ratio` zostaje, zeby siatka nie
   skakala. */
.in-action .shot-frame {
    aspect-ratio: 16 / 10;
    background-color: #05080f;
    overflow: hidden;
    position: relative;
}
.in-action .term {
    height: 100%;
    margin: 0;
    padding: 12px 14px;
    overflow: hidden;
    font-family: var(--font-mono);
    /* clamp() zamiast media query: podglad siedzi w siatce auto-fit, wiec
       jego szerokosc nie wynika wprost z szerokosci ekranu. */
    font-size: clamp(0.52rem, 1.05vw, 0.72rem);
    line-height: 1.65;
    color: #cbd5e1;
    white-space: pre;
    tab-size: 2;
}
.in-action .term .row {
    display: block;
    overflow: hidden;
    text-overflow: ellipsis;
}
/* Tokeny podswietlania skladni. Nazwy sa SEMANTYCZNE (co to znaczy), nie
   kolorystyczne (jak wyglada) -- zmiana palety nie wymaga wtedy dotykania
   HTML. */
.in-action .term .t-prompt { color: #22d3ee; }
.in-action .term .t-cmd    { color: #e6e9f0; }
.in-action .term .t-key    { color: #94a3b8; }
.in-action .term .t-ok     { color: #34d399; }
.in-action .term .t-warn   { color: #fbbf24; }
.in-action .term .t-num    { color: #a78bfa; }
.in-action .term .t-str    { color: #7dd3fc; }
.in-action .term .t-dim    { color: #64748b; }
.in-action .term .t-head   { color: #f0885f; }
.in-action .term svg { display: block; width: 100%; height: auto; margin-top: 4px; }
.in-action figcaption {
    padding: 14px 16px 16px;
    border-top: 1px solid var(--glass-border);
}
.in-action figcaption strong {
    display: block;
    color: var(--text-primary);
    font-size: 0.95rem;
    margin-bottom: 5px;
}
.in-action figcaption span {
    color: var(--text-secondary);
    font-size: 0.86rem;
    line-height: 1.5;
}

/* Przycisk "View ArtStation Portfolio ->" / "Zobacz szczegóły projektu" --
   konturowy (secondary), zeby nie konkurowal z .nav-cta. */
.pillar-cta {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 8px 16px;
    border: 1px solid rgba(34, 211, 238, 0.4);
    border-radius: 8px;
    background: rgba(34, 211, 238, 0.06);
    color: var(--cyan-color) !important;
    font-weight: 600;
    font-size: 0.85rem;
    text-decoration: none;
}
.pillar-cta:hover {
    background-color: rgba(34, 211, 238, 0.14);
    color: var(--cyan-color) !important;
    border-color: rgba(34, 211, 238, 0.6);
}

/* Miniatura produktu wewnatrz karty -- zamaskowana (maska/gradient +
   overflow: hidden na kontenerze), NIGDY pelnoszerokosciowy hero. */
.pillar-thumb {
    width: 100%;
    height: 160px;
    object-fit: cover;
    border-radius: 10px;
    margin-bottom: 16px;
    display: block;
    -webkit-mask-image: linear-gradient(to bottom, black 70%, transparent 100%);
    mask-image: linear-gradient(to bottom, black 70%, transparent 100%);
}
/* Wariant miniatury dla Portable Animator -- nie ma zdjec produktowych (R&D,
   zero wygenerowanych "gotowych" scen do pokazania uczciwie jako produkt),
   wiec podglad to ZMNIEJSZONY fragment tego samego diagramu Scene DAG co w
   modalu/podstronie, nie zdjecie. */
.pillar-thumb-svg {
    width: 100%;
    height: 160px;
    border-radius: 10px;
    margin-bottom: 16px;
    overflow: hidden;
    background: #0b0e14;
    border: 1px solid var(--glass-border);
}
.pillar-thumb-svg svg { display: block; width: 100%; height: 100%; }

/* ------------------------------------------------------------------ */
/* MODAL "Zobacz szczegoly projektu" (2026-08-31, druga fala) -- zero
   frameworka, ~30 linii JS w index.html (toggle klasy .is-open + Escape).
   Tresc: opis, architektura potoku, zrzuty/diagram -- wg specyfikacji
   dyrektywy. */
.project-modal {
    position: fixed;
    inset: 0;
    z-index: 100;
    display: none;
    align-items: flex-start;
    justify-content: center;
    padding: 6vh 20px;
    overflow-y: auto;
}
.project-modal.is-open { display: flex; }
.project-modal .modal-backdrop {
    position: fixed;
    inset: 0;
    background: rgba(3, 5, 9, 0.72);
    backdrop-filter: blur(3px);
    -webkit-backdrop-filter: blur(3px);
}
.project-modal .modal-panel {
    position: relative;
    z-index: 1;
    width: min(760px, 100%);
    background: #0b1120;
    border: 1px solid var(--glass-border-hover);
    border-radius: var(--radius-card);
    padding: 30px 32px 32px;
    box-shadow: 0 30px 80px -20px rgba(0, 0, 0, 0.7);
}
.project-modal .modal-close {
    position: absolute;
    top: 18px;
    right: 18px;
    width: 32px;
    height: 32px;
    border-radius: 8px;
    border: 1px solid var(--glass-border);
    background: rgba(255, 255, 255, 0.04);
    color: var(--text-secondary);
    font-size: 1.1rem;
    line-height: 1;
    cursor: pointer;
}
.project-modal .modal-close:hover { color: var(--text-primary); border-color: var(--glass-border-hover); }
.project-modal h3 {
    font-family: var(--font-mono);
    font-size: 0.72rem;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: var(--cyan-color);
    margin: 22px 0 10px;
}
.project-modal h3:first-of-type { margin-top: 4px; }
.project-modal .modal-shots {
    display: flex;
    flex-wrap: wrap;
    gap: 12px;
    margin-top: 10px;
}
.project-modal .modal-shots img {
    height: 96px;
    border-radius: 8px;
    border: 1px solid var(--glass-border);
}
.project-modal .modal-svg-wrap {
    border-radius: 10px;
    overflow: hidden;
    border: 1px solid var(--glass-border);
    margin-top: 10px;
}
.project-modal ol, .project-modal ul { color: var(--text-secondary); padding-left: 1.2em; }
.project-modal ol li, .project-modal ul li { margin-bottom: 4px; }

/* ------------------------------------------------------------------ */
/* ZAKLADKI (2026-08-31, druga fala) -- "Execution Tiers / Core Engine /
   Roadmap" zamiast trzech oddzielnych, zawsze-rozwinietych sekcji. Zero
   frameworka: input[type=radio] ukryty + label jako przycisk + CSS
   :checked -- dziala bez JS (przydatne, jesli JS sie nie zaladuje), ale
   maly skrypt w index.html dodaje tez obsluge klawiatury/aria (patrz
   tam). */
.tabs-section {
    margin-top: 8px;
}
.tabs-nav {
    display: flex;
    flex-wrap: wrap;
    gap: 6px;
    border-bottom: 1px solid var(--glass-border);
    margin-bottom: 24px;
}
.tabs-nav button {
    font: inherit;
    font-family: var(--font-sans);
    font-weight: 600;
    font-size: 0.88rem;
    color: var(--text-tertiary);
    background: transparent;
    border: none;
    border-bottom: 2px solid transparent;
    padding: 10px 4px;
    margin-right: 22px;
    cursor: pointer;
    transition: color 0.15s ease, border-color 0.15s ease;
}
.tabs-nav button:hover { color: var(--text-primary); }
.tabs-nav button.is-active {
    color: var(--text-primary);
    border-bottom-color: var(--cyan-color);
}
.tab-panel { display: none; }
.tab-panel.is-active { display: block; }

/* Podzial LIVE / ROADMAP -- zostaje jako komponent (uzywany WEWNATRZ
   zakladki "Core Engine" teraz, nie jako wlasna, oddzielna sekcja na
   stronie). */
.live-roadmap-split {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
    gap: 20px;
    margin-top: 20px;
}
.split-card {
    background: var(--glass-bg);
    border: 1px solid var(--glass-border);
    backdrop-filter: blur(12px);
    -webkit-backdrop-filter: blur(12px);
    border-radius: var(--radius-card);
    padding: 24px;
}
.split-card.live { border-color: rgba(34, 211, 238, 0.3); }
.split-card.roadmap { border-color: rgba(167, 139, 250, 0.35); }
.split-badge {
    display: inline-block;
    font-family: var(--font-mono);
    font-size: 0.72rem;
    font-weight: 700;
    letter-spacing: 0.05em;
    text-transform: uppercase;
    padding: 4px 11px;
    border-radius: 5px;
    margin-bottom: 14px;
}
.split-badge.live { background-color: rgba(34, 211, 238, 0.16); color: var(--cyan-color); border: 1px solid rgba(34, 211, 238, 0.4); }
.split-badge.roadmap { background-color: rgba(167, 139, 250, 0.18); color: #c4b5fd; border: 1px solid rgba(167, 139, 250, 0.45); }
.split-card ul {
    margin: 0;
    padding-left: 1.2em;
    color: var(--text-secondary);
    display: flex;
    flex-direction: column;
    gap: 8px;
}
.split-card .split-note {
    margin-top: 12px;
    font-size: 0.82em;
    color: var(--text-tertiary);
}

.grant-infra ul { padding-left: 1.2em; color: var(--text-secondary); }
.grant-infra { margin-top: 20px; }

/* Linki zespolu -- realne, aktywne. */
.profile-links {
    display: flex;
    flex-wrap: wrap;
    gap: 14px;
    margin: 10px 0;
}
.profile-links a {
    color: var(--cyan-color);
    text-decoration: none;
    border: 1px solid rgba(34, 211, 238, 0.35);
    border-radius: 6px;
    padding: 5px 12px;
    font-size: 0.9em;
}
.profile-links a:hover { background-color: rgba(34, 211, 238, 0.12); }

/* USUNIETE 2026-09-04: reguly klasy `.link-niedostepny` (placeholder
   nawigacji z plakietka "W budowie"). Elementy uzywajace tej klasy zostaly
   wyciete z szesciu podstron -- decyzja operatora po zobaczeniu ich na zywej
   stronie. Sam styl usuwam RAZEM z nimi, a nie zostawiam "na wszelki
   wypadek": dopoki regula istnieje, dopisanie takiego elementu na nowej
   podstronie wyglada na wspierany wzorzec, a nie na pomylke. Pilnuje tego
   core/tests/test_portal_plakietki_wip_2026_09_01.py, ktory z bramki
   "kazdy placeholder ma plakietke" zostal odwrocony na "zaden placeholder
   nie ma prawa wrocic". */

/* Sekcje "Core Engine" / "Roadmapa" / "FinOps" -- teraz zyja WEWNATRZ
   panelow zakladek (.tab-panel), ale zostaja jako komponenty tresci samej w
   sobie (rowniez uzywane poza zakladkami na innych podstronach poprzez
   .finops-tiers/.finops-tier-grid). */
.core-engine, .roadmap, .finops-tiers, .tiers {
    padding: 0;
}

.core-engine h2, .roadmap h2, .finops-tiers h2, .tiers h2 {
    color: var(--cyan-color);
    font-size: 1.05rem;
    font-family: var(--font-mono);
    letter-spacing: 0.02em;
    text-transform: uppercase;
}

.core-engine-lead {
    color: var(--text-secondary);
    max-width: 60ch;
}

.core-engine-grid, .finops-tier-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
    gap: 18px;
    margin-top: 16px;
}

.core-engine-grid article, .finops-tier-grid article {
    background: var(--glass-bg);
    border: 1px solid var(--glass-border);
    backdrop-filter: blur(12px);
    -webkit-backdrop-filter: blur(12px);
    border-radius: var(--radius-card);
    padding: 20px;
    transition: border-color 0.15s ease;
}
.core-engine-grid article:hover, .finops-tier-grid article:hover { border-color: var(--glass-border-hover); }

.tier-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
    gap: 18px;
    margin-top: 16px;
}
.tier-card {
    background: var(--glass-bg);
    border: 1px solid var(--glass-border);
    backdrop-filter: blur(12px);
    -webkit-backdrop-filter: blur(12px);
    border-radius: var(--radius-card);
    padding: 24px;
    transition: border-color 0.15s ease;
}
.tier-card:hover { border-color: var(--glass-border-hover); }
.tier-card .tier-label {
    display: inline-block;
    font-family: var(--font-mono);
    font-size: 0.68rem;
    font-weight: 700;
    letter-spacing: 0.05em;
    text-transform: uppercase;
    padding: 3px 9px;
    border-radius: 5px;
    margin-bottom: 10px;
    background-color: rgba(255, 255, 255, 0.08);
    color: rgba(255, 255, 255, 0.85);
    border: 1px solid rgba(255, 255, 255, 0.2);
}
.tier-card h3 { margin: 0 0 8px; color: var(--text-primary); }
.tier-card ul { margin: 10px 0 0; padding-left: 1.2em; color: var(--text-secondary); }
.tier-card .tier-note {
    margin-top: 10px;
    font-size: 0.82em;
    color: var(--text-tertiary);
}

.core-engine-grid h3, .finops-tier-grid h3 {
    margin-top: 0;
    color: var(--violet-color);
}

.roadmap-columns {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
    gap: 28px;
    margin-top: 16px;
}

.roadmap-column h3 {
    color: var(--violet-color);
    border-bottom: 1px solid var(--glass-border);
    padding-bottom: 6px;
}

.roadmap-column h4 {
    color: var(--text-tertiary);
    font-family: var(--font-mono);
    font-size: 0.72rem;
    text-transform: uppercase;
    letter-spacing: 0.06em;
    margin-bottom: 6px;
}

.roadmap-column ul {
    margin-top: 0;
    padding-left: 1.2em;
    color: var(--text-secondary);
}

/* Widoczne ostrzezenie "do uzupelnienia". */
.do-uzupelnienia {
    margin: 20px;
    padding: 15px 20px;
    border: 2px dashed #f5a623;
    border-radius: 8px;
    background-color: rgba(245, 166, 35, 0.08);
}

.do-uzupelnienia h2 {
    color: #f5a623;
    margin-top: 0;
    font-family: var(--font-sans);
    text-transform: none;
}

/* Karta prawna (privacy.html, terms.html). */
.legal-card {
    max-width: 760px;
    margin: 30px auto;
    background: var(--glass-bg);
    border: 1px solid var(--glass-border);
    backdrop-filter: blur(12px);
    -webkit-backdrop-filter: blur(12px);
    border-radius: var(--radius-card);
    padding: 32px 36px;
}
.legal-card h1 {
    margin-top: 0;
    color: var(--text-primary);
}
.legal-card section {
    margin: 22px 0;
}
.legal-card section h2 {
    color: var(--cyan-color);
    font-size: 1.1em;
    text-transform: none;
    font-family: var(--font-sans);
}
.legal-card section h1 {
    margin-top: 0;
    color: var(--cyan-color);
    font-size: 1.1em;
}

/* Podstrony produktowe (asset-factory, portable-animator, cloud-
   architecture). */
.page-lead {
    max-width: 68ch;
    color: var(--text-secondary);
}
main > h1, .page-content h1 {
    padding: 0 28px;
}
main > section, .page-content {
    padding: 20px 28px;
    margin: 10px 0;
}

/* Galeria tekstur (asset-factory). */
.texture-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
    gap: 18px;
    margin-top: 15px;
}
.texture-item {
    background: var(--glass-bg);
    border: 1px solid var(--glass-border);
    backdrop-filter: blur(12px);
    -webkit-backdrop-filter: blur(12px);
    border-radius: var(--radius-card);
    padding: 12px;
    overflow: hidden;
    transition: border-color 0.15s ease;
}
.texture-item:hover { border-color: var(--glass-border-hover); }
.texture-item img {
    width: 100%;
    height: 160px;
    object-fit: cover;
    border-radius: 8px;
    display: block;
    -webkit-mask-image: linear-gradient(to bottom, black 75%, transparent 100%);
    mask-image: linear-gradient(to bottom, black 75%, transparent 100%);
}
.texture-item p {
    margin: 10px 0 0;
    font-size: 0.85em;
    color: var(--text-tertiary);
}

.unity-images {
    display: flex;
    flex-wrap: wrap;
    gap: 18px;
    margin-top: 15px;
}
.unity-images img {
    max-height: 180px;
    border-radius: 10px;
    border: 1px solid var(--glass-border);
    background: var(--glass-bg);
    padding: 8px;
}

.pipeline ol {
    color: var(--text-secondary);
    line-height: 1.6;
}

@media (max-width: 768px) {
    .hud-panel {
        padding: 15px;
        margin: 15px;
    }

    .card-grid {
        grid-template-columns: 1fr;
    }

    .card {
        border-radius: 5px;
    }

    .core-engine-grid, .finops-tier-grid, .roadmap-columns {
        grid-template-columns: 1fr;
    }

    .core-engine, .roadmap, .finops-tiers {
        margin: 10px;
        padding: 15px;
    }

    .hero { padding: 44px 20px 12px; }
    .tabs-nav { gap: 4px 16px; }

    /* ---------------------------------------------------------------- */
    /* RWD v2 (2026-09-01, dyrektywa operatora A4). Stan PRZED ta zmiana:
       JEDNA media query w calym portalu, obejmujaca 6 selektorow --
       nawigacja, karty filarowe, siatka zrzutow, modale, tabele i typografia
       nie mialy zadnej obslugi maleego ekranu. Ponizej dopelnienie.        */

    /* NAWIGACJA -- hamburger. `.nav-js` dokladane przez site_nav.js:
       bez JS menu zostaje rozwiniete (uzyteczne), zamiast schowane bez
       mozliwosci otwarcia. Patrz uzasadnienie w naglowku site_nav.js. */
    .site-nav {
        flex-wrap: wrap;
        padding: 12px 18px;
        gap: 10px;
    }
    .nav-toggle { display: inline-flex; }
    .site-nav .brand { margin-right: auto; }
    .site-nav.nav-js ul { display: none; }
    .site-nav.nav-js.nav-otwarte ul { display: flex; }
    .site-nav ul {
        order: 3;
        flex-basis: 100%;
        flex-direction: column;
        gap: 2px;
        padding: 6px 0 2px;
        border-top: 1px solid var(--glass-border);
    }
    .site-nav ul li { width: 100%; }
    .site-nav ul a {
        display: block;
        padding: 10px 4px;
        font-size: 0.95rem;   /* cel dotykowy, nie 0.85rem jak na desktopie */
    }
    .nav-cta { order: 2; }

    /* Drugi, starszy pasek nawigacji (<header><nav>) obecny na podstronach
       -- rozklada sie na kilka linii zamiast wychodzic poza ekran. */
    header nav ul {
        flex-wrap: wrap;
        gap: 6px 14px;
    }

    /* SIATKI -- wszystkie na jedna kolumne. minmax(320px, 1fr) w
       auto-fit NIE schodzi ponizej 320px, wiec na ekranie 360px karta
       wystawala poza viewport razem z pozioma przewijarka. */
    .pillar-grid,
    .in-action-grid,
    .tier-grid,
    .roadmap-columns,
    .modal-shots {
        grid-template-columns: 1fr;
    }

    /* KARTY FILAROWE -- ciasniejszy padding, miniatura nie dominuje ekranu. */
    .pillar-card { padding: 18px 16px; }
    .pillar-thumb, .pillar-thumb-svg { max-height: 190px; }
    .pillar-actions, .dist-badges { gap: 8px; }
    .pillar-actions .pillar-cta-btn { width: 100%; }

    /* MODALE -- na telefonie panel ma zajmowac prawie caly ekran i
       przewijac sie samodzielnie, zamiast byc waskim oknem w oknie. */
    .project-modal .modal-panel {
        width: calc(100% - 20px);
        max-height: calc(100vh - 40px);
        padding: 20px 16px;
    }
    .modal-svg-wrap {
        overflow-x: auto;   /* diagram SVG DAG jest szeroki -- przewijamy
                               go poziomo ZAMIAST skalowac do nieczytelnosci */
        -webkit-overflow-scrolling: touch;
    }

    /* HERO/TYPOGRAFIA -- h1 juz uzywa clamp(), ale podglowek i CTA nie. */
    .hero-sub { font-size: 0.98rem; }
    .hero-actions { gap: 10px; }
    .hero-actions a { flex: 1 1 auto; text-align: center; }

    /* STOPKA -- linki foundera lamia sie zamiast wymuszac przewijanie. */
    footer p { word-break: break-word; }
}

/* ------------------------------------------------------------------ */
/* ODZNAKA PRODUCT HUNT W STOPCE (Modul I.2, 2026-09-01).

   SPAN, NIE LINK -- decyzja, nie niedorobka. Operator nie dostarczyl
   adresu strony "upcoming" na Product Hunt; zmyslenie slugu daloby
   recenzentowi MARTWY ODNOSNIK, czyli sygnal gorszy niz brak odznaki
   (CLAUDE.md par.10: brak potwierdzenia = pytanie do operatora, nie
   zgadywanie). Dokladnie ta sama technika, co odznaki dystrybucji
   (.dist-badge): brak href, kursor domyslny, aria-disabled dla czytnikow
   ekranu. Podmiana na <a href> to jeden krok, gdy adres bedzie znany --
   wtedy `cursor` i `pointer-events` sa jedynym, co wymaga zmiany.

   Kolor pomaranczowy jest kolorem marki Product Hunt i jest tu uzyty
   swiadomie, zeby odznaka byla rozpoznawalna jednym spojrzeniem -- ale bez
   logotypu: logotyp wymagalby pliku graficznego, a kazdy zewnetrzny zasob
   lamie zasade zero-CDN portalu. */
.footer-badges {
    display: flex;
    justify-content: center;
    flex-wrap: wrap;
    gap: 10px;
    margin: 10px 0;
}
.ph-badge {
    display: inline-flex;
    align-items: center;
    gap: 7px;
    padding: 5px 14px;
    border-radius: 999px;
    border: 1px solid rgba(218, 85, 47, 0.55);
    background: rgba(218, 85, 47, 0.10);
    color: #f0885f;
    font-family: var(--font-mono);
    font-size: 0.72rem;
    letter-spacing: 0.04em;
    cursor: default;
    user-select: none;
    white-space: nowrap;
}
.ph-badge::before {
    content: "P";
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 15px;
    height: 15px;
    border-radius: 50%;
    border: 1px solid rgba(218, 85, 47, 0.7);
    font-size: 0.62rem;
    font-weight: 700;
    line-height: 1;
}

/* ------------------------------------------------------------------ */
/* GALERIA ASSET FACTORY + LIGHTBOX (2026-09-01).

   Miniatury byly male i ciemne, a jedyna informacja o rozdzielczosci byla
   deklaracja pod obrazkiem, ktorej nie dalo sie sprawdzic bez otwierania
   pliku w nowej karcie. Kafelki sa wieksze, a klikniecie otwiera podglad w
   pelnej rozdzielczosci (ui/site/assets/js/lightbox.js -- czysty JS, zero
   bibliotek).

   `object-fit: cover` na stalym `aspect-ratio`: tekstury sa kwadratowe, a
   key-arty Unity nie -- bez tego siatka rwalaby sie na kazdym wierszu. */
.texture-grid, .unity-images {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
    gap: 18px;
    margin-top: 16px;
    margin-bottom: var(--rytm-sekcji);
}
/* KARTA Z OBRAZEM -- wspolny komponent (2026-09-04, zgloszenie operatora:
   "biale miniatury wygladaja surowo na ciemnym tle").
   Uzywana w TRZECH miejscach: galeria tekstur Asset Factory, zrzuty ekranu
   Portable Animatora i grafiki Unity. Zmiana jest tutaj, a nie na jednej
   podstronie, wiec wszystkie trzy wygladaja tak samo -- i beda wygladac tak
   samo takze wtedy, gdy dojdzie czwarte miejsce.

   `padding` wokol obrazu jest tu istotny, nie ozdobny: bez niego jasny zrzut
   ekranu dotykal krawedzi karty i zlewal sie z ciemnym tlem strony w ostra,
   przypadkowa granice. Passe-partout daje obrazowi oprawe. */
.texture-item {
    margin: 0;
    border: 1px solid var(--glass-border);
    border-radius: var(--radius-card);
    background: var(--glass-bg);
    box-shadow: var(--shadow-card);
    padding: 10px;
    overflow: hidden;
    transition: border-color 0.18s ease, transform 0.18s ease, box-shadow 0.18s ease;
}
.texture-item:hover, .texture-item:focus-within {
    border-color: var(--glass-border-hover);
    transform: translateY(-2px);
    box-shadow: var(--shadow-card-hover);
}
.texture-item img, .unity-images img {
    display: block;
    width: 100%;
    aspect-ratio: 1 / 1;
    object-fit: cover;
    background: #05080f;
    border-radius: 10px;
    border: 1px solid var(--glass-border);
    cursor: zoom-in;
}

/* WARIANT: ZRZUT INTERFEJSU. To NIE jest wyjatek dla jednej strony, tylko
   inny rodzaj tresci w tym samym komponencie. Tekstura jest kafelkiem i
   `cover` jest dla niej wlasciwe -- przyciecie niczego nie gubi. Zrzut
   ekranu przyciety do kwadratu traci polowe interfejsu, czyli dokladnie to,
   co ma pokazac. Stad `contain` i proporcja zblizona do okna aplikacji. */
.texture-item--zrzut img {
    aspect-ratio: 16 / 10;
    object-fit: contain;
    background: #0a0e17;
}
.unity-images img { aspect-ratio: 3 / 2; }
.texture-item img:focus-visible, .unity-images img:focus-visible {
    outline: 2px solid var(--cyan-color);
    outline-offset: 2px;
}
.texture-item figcaption, .texture-item p {
    margin: 0;
    padding: 10px 2px 2px;
    font-size: 0.82rem;
    color: var(--text-secondary);
}
.texture-item .tex-meta {
    display: block;
    margin-top: 4px;
    font-family: var(--font-mono);
    font-size: 0.68rem;
    color: var(--text-tertiary);
}

/* Nakladka podgladu. `hidden` na elemencie wystarcza za caly stan --
   zero klasy "is-open" do zsynchronizowania z atrybutem. */
.lb-nakladka[hidden] { display: none; }
.lb-nakladka {
    position: fixed;
    inset: 0;
    z-index: 200;
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 8px;
    padding: 24px;
    background: rgba(3, 5, 10, 0.92);
    backdrop-filter: blur(6px);
    -webkit-backdrop-filter: blur(6px);
}
/* Strona pod nakladka nie moze sie przewijac -- inaczej kolko myszy
   przesuwa tresc, ktorej i tak nie widac. */
html[data-lb-otwarty="tak"] { overflow: hidden; }
.lb-ramka {
    display: flex;
    flex-direction: column;
    max-width: min(1100px, 92vw);
    max-height: 88vh;
}
.lb-obraz {
    display: block;
    max-width: 100%;
    max-height: 78vh;
    width: auto;
    height: auto;
    border-radius: 10px;
    border: 1px solid var(--glass-border);
    background: #05080f;
    object-fit: contain;
}
.lb-stopka {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 16px;
    padding-top: 10px;
    font-size: 0.82rem;
    color: var(--text-secondary);
}
.lb-licznik {
    font-family: var(--font-mono);
    font-size: 0.72rem;
    color: var(--text-tertiary);
    white-space: nowrap;
}
.lb-zamknij, .lb-nawigacja {
    flex: 0 0 auto;
    border: 1px solid var(--glass-border);
    border-radius: 10px;
    background: rgba(255, 255, 255, 0.05);
    color: var(--text-primary);
    cursor: pointer;
    line-height: 1;
}
.lb-nawigacja {
    width: 44px;
    height: 44px;
    font-size: 1.6rem;
}
.lb-zamknij {
    position: absolute;
    top: 18px;
    right: 18px;
    width: 40px;
    height: 40px;
    font-size: 1rem;
}
.lb-zamknij:hover, .lb-nawigacja:hover { border-color: var(--glass-border-hover); }
.lb-zamknij:focus-visible, .lb-nawigacja:focus-visible {
    outline: 2px solid var(--cyan-color);
    outline-offset: 2px;
}
.lb-nawigacja[hidden] { display: none; }

@media (max-width: 640px) {
    .lb-nakladka { padding: 12px; gap: 4px; }
    .lb-nawigacja { width: 36px; height: 36px; font-size: 1.3rem; }
}
@media (prefers-reduced-motion: reduce) {
    .texture-item { transition: none; }
    .texture-item:hover, .texture-item:focus-within { transform: none; }
}

/* ------------------------------------------------------------------ */
/* PRZELACZNIK JEZYKOW (pill-switch EN / PL / 日本語), 2026-09-01.

   Siedzi w pasku nawigacji, PRZED przyciskiem CTA. Zawartosc buduje
   ui/site/assets/js/lang_switch.js z listy `AiosI18n.JEZYKI_ZNANE` --
   w HTML jest tylko pusty pojemnik, wiec dopisanie czwartego jezyka nie
   wymaga dotykania siedmiu podstron.

   Stan aktywnego jezyka jest w atrybucie `data-aktywny`, nie w klasie i
   nie w tresci przycisku: tresc to nazwa jezyka i nie moze byc nosnikiem
   stanu (ta sama zasada, co w panelu po commicie 74). */
.lang-switch {
    display: inline-flex;
    align-items: center;
    gap: 2px;
    padding: 2px;
    border: 1px solid var(--glass-border);
    border-radius: 999px;
    background: rgba(255, 255, 255, 0.03);
    flex: 0 0 auto;
}
.lang-switch[hidden] { display: none; }
.lang-pill {
    border: 0;
    background: transparent;
    color: rgba(255, 255, 255, 0.6);
    font-family: var(--font-mono);
    font-size: 0.7rem;
    letter-spacing: 0.04em;
    line-height: 1;
    padding: 5px 9px;
    border-radius: 999px;
    cursor: pointer;
    white-space: nowrap;
}
.lang-pill:hover { color: var(--text-primary); }
.lang-pill[data-aktywny="tak"] {
    background: rgba(34, 211, 238, 0.16);
    color: var(--cyan-color);
}
.lang-pill:focus-visible {
    outline: 2px solid var(--cyan-color);
    outline-offset: 1px;
}

@media (max-width: 768px) {
    /* W ukladzie mobilnym navbar zwija linki do hamburgera; przelacznik
       ZOSTAJE widoczny -- wybor jezyka jest pierwsza rzecza, ktorej szuka
       ktos, kto trafil na strone w niewlasciwym jezyku. */
    .lang-pill { padding: 4px 7px; font-size: 0.66rem; }
}
