@charset "UTF-8";

/* ===== EDYTOR DRZEWA ROZMOWY (komponenty/scenariusze_edytor.php) ===== */
/* Kolory WYŁĄCZNIE z palety aplikacji (--bg-soft, --testo, --primary…) - zmierzone w podglądzie 2026-09-15: zmienna --bg
   nie istnieje, więc klocki wyszły białe z jasnym tekstem w ciemnej konsoli. Odcienie robi color-mix z --testo (jasny
   w ciemnym motywie, ciemny w jasnym), więc kontrast trzyma się w obu. */
.se { --se-linia: color-mix(in srgb, var(--testo) 14%, transparent);
      --se-tlo: color-mix(in srgb, var(--bg-soft) 82%, var(--testo) 4%);        /* kanwa */
      --se-pasek: color-mix(in srgb, var(--bg-soft) 92%, var(--testo) 8%);     /* paski, paleta, panel JSON */
      --se-karta: var(--bg-soft);                                                /* klocek */
      --se-pole: color-mix(in srgb, var(--bg-soft) 88%, var(--testo) 12%);      /* pola w klocku */
      display: flex; flex-direction: column; height: 700px; margin-top: 10px; border: 1px solid var(--se-linia); border-radius: 14px;
      overflow: hidden; background: var(--se-tlo); color: var(--testo); font-size: 0.86rem; }
.se [hidden] { display: none !important; }   /* atrybut hidden przegrywał z .se-json { display:flex } */
.se-gora { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 8px 12px; border-bottom: 1px solid var(--se-linia); flex-wrap: wrap; background: var(--se-pasek); }
.se-gora-l { display: flex; align-items: center; gap: 8px; }
.se-gora-p { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.se-podpis { color: var(--muted-light); font-size: 0.78rem; }
.se-wybor { display: inline-flex; align-items: center; gap: 6px; color: var(--muted-light); font-size: 0.8rem; }
.se-wybor select, .se-btn { font: inherit; font-size: 0.8rem; padding: 5px 10px; border-radius: 8px; border: 1px solid var(--se-linia); background: var(--se-pole); color: var(--testo); cursor: pointer; }
.se-btn:hover { border-color: var(--primary); color: var(--primary); }
.se-btn.wl { background: var(--primary); color: var(--na-akcencie, #fff); border-color: var(--primary); }
.se-btn .ico { margin: 0 2px 0 0; }
/* Formularz w ramie edytora: własny pasek pod narzędziami, z własnym przewijaniem. Sufit wysokości jest
   po to, żeby długi opis nie zjadł kanwy - reszta doczytuje się kółkiem wewnątrz tego paska. */
.se-meta { flex: none; max-height: 38vh; overflow: auto; padding: 10px 12px; border-bottom: 1px solid var(--se-linia);
  background: var(--se-pasek); }
.se-meta[hidden] { display: none !important; }
.se.se-meta-zwiniety .se-meta { display: none; }
.se-cialo-glowne { display: flex; flex: 1; min-height: 0; }
/* min-height: 0 - bez tego paleta (flex item z min-height:auto) nie schodzi ponizej wysokosci swojej
   TRESCI i podpiera caly wiersz: zmierzone 556 px, przez co kanwa nie miescila sie w oknie po wsadzeniu
   formularza do ramy. Paleta ma wlasne przewijanie, wiec kurczenie niczego nie ucina. */
.se-paleta { width: 205px; flex: none; min-height: 0; border-right: 1px solid var(--se-linia); padding: 10px; display: flex; flex-direction: column; gap: 8px; background: var(--se-pasek); overflow: auto; }
.se-paleta-tytul { font-size: 0.7rem; letter-spacing: 0.1em; text-transform: uppercase; color: var(--muted-light); }
.se-klocek { display: flex; align-items: center; gap: 8px; padding: 9px 10px; border-radius: 10px; border: 1px dashed var(--se-linia); cursor: grab; user-select: none; background: var(--se-karta); }
.se-klocek:hover { border-style: solid; border-color: var(--primary); }
.se-klocek:active { cursor: grabbing; }
/* KOLOR I KSZTAŁT NA TYP KLOCKA (Alek 2026-09-16: „różne kolory i kształty dla różnych typów bloków, to musi być
   intuicyjne i przyjemne"). Jeden token --se-k na typ steruje WSZYSTKIM naraz: nagłówkiem, obwódką, kółkiem ikony,
   portami i kolorem krawędzi wychodzącej - więc klocek, jego wtyczka w palecie i strzałka pod nim zawsze mówią tym
   samym kolorem. Kształt jest drugim sygnałem, dla tych, którzy kolorów nie rozróżniają: dymek z ogonkiem (bot),
   ścięty narożnik od strony mikrofonu (uczeń), zaokrąglona meta z szachownicą (koniec), pigułka (start). */
.se-klocek-ai { --se-k: var(--primary); } .se-klocek-uczen { --se-k: var(--verde); } .se-klocek-koniec { --se-k: #d9a400; } .se-klocek-opis { --se-k: #8b5cf6; }
.se-klocek .ico { color: #fff; background: var(--se-k, var(--primary)); width: 22px; height: 22px; border-radius: 50%; display: inline-flex; align-items: center; justify-content: center; font-size: 0.72rem; flex: none; }
.se-klocek-ai { border-radius: 12px 12px 12px 4px; }
.se-klocek-uczen { border-radius: 4px 12px 12px 12px; }
/* ZDANIE NA PAMIĘĆ (2026-09-28): kształt klocka ucznia (ścięty narożnik od strony mikrofonu), bo to uczeń mówi, ale własny morski
   kolor: w drzewie widać od razu, gdzie uczeń ćwiczy całe zdanie, a gdzie odpowiada rozmówcy. W trybie prostym zostaje w palecie,
   w przeciwieństwie do „Uczeń mówi”: to jest klocek dla każdego autora. */
.se-klocek-pamiec { --se-k: #0d9488; border-radius: 4px 12px 12px 12px; }
/* „Odpowiedź swobodna" (2026-10-02): malinowy, żeby nie mylił się z zielonym „Uczeń mówi" (tam jest wzór do powiedzenia) ani ze złotym
   „Koniec poziomu"; ścięty róg po stronie ucznia, bo to nadal jego wypowiedź. */
.se-klocek-swobodna { --se-k: #d6336c; border-radius: 4px 12px 12px 12px; }
.se-klocek-koniec { border-radius: 12px 12px 18px 18px; }
.se-klocek-opis { border-radius: 12px 3px 12px 12px; }
.se-klocek:hover { border-color: var(--se-k, var(--primary)); background: color-mix(in srgb, var(--se-k, var(--primary)) 10%, var(--se-karta)); }
.se-paleta-pomoc { margin-top: auto; font-size: 0.74rem; line-height: 1.4; color: var(--muted-light); }
/* PYTANIE OTWARTE (2026-09-25): poradnik, przyciski wstawiające klamry i podgląd pod polami. */
.se-poradnik-btn { display: flex; align-items: center; gap: 4px; text-align: left; line-height: 1.25; }
.se-poradnik { position: absolute; top: 12px; right: 12px; z-index: 40; width: min(460px, calc(100% - 24px)); max-height: calc(100% - 24px);
  overflow: auto; box-sizing: border-box; padding: 14px 16px 12px; border-radius: 14px; border: 1px solid var(--se-linia);
  background: var(--se-pasek); color: var(--testo); box-shadow: 0 16px 44px rgba(0, 0, 0, .28); font-size: 0.8rem; line-height: 1.45; cursor: auto; }
.se-poradnik p { margin: 6px 0 8px; }
.se-poradnik ol { margin: 10px 0 8px; padding-left: 20px; display: flex; flex-direction: column; gap: 7px; }
.se-poradnik code { font: 0.78rem/1.3 Consolas, monospace; padding: 1px 5px; border-radius: 5px; background: var(--se-pole); white-space: nowrap; }
.se-poradnik-tytul { font-size: 0.95rem; font-weight: 800; padding-right: 26px; }
.se-poradnik-zamknij { position: absolute; top: 8px; right: 8px; width: 28px; height: 28px; border-radius: 999px; border: 0; background: none; color: var(--muted-light); cursor: pointer; }
.se-poradnik-zamknij:hover { color: var(--testo); background: var(--se-pole); }
.se-pr-rozmowa { display: flex; flex-direction: column; gap: 6px; }
.se-pr { display: flex; flex-direction: column; gap: 3px; padding: 7px 10px; border-radius: 10px; border: 1px solid var(--se-linia); background: var(--se-karta); }
.se-pr-bot { border-left: 3px solid color-mix(in srgb, #3b82f6 70%, var(--testo)); margin-right: 36px; }
.se-pr-uczen { border-left: 3px solid var(--primary); margin-left: 36px; }
.se-pr-kto { font-size: 0.64rem; letter-spacing: 0.05em; text-transform: uppercase; color: var(--muted-light); }
.se-pr-efekt { font-size: 0.76rem; color: var(--muted-light); }
.se-pr-wybor, .se-pr-klawisz { font-style: normal; font-weight: 700; padding: 0 6px; border-radius: 999px; border: 1.5px dashed var(--primary); color: var(--primary); white-space: nowrap; }
.se-poradnik-zasady { font-size: 0.72rem; color: var(--muted-light); border-top: 1px dashed var(--se-linia); padding-top: 7px; }
.se-miejsce-rzad, .se-wstaw-rzad { display: flex; align-items: center; gap: 5px; }
.se-miejsce-btn { color: var(--primary); border-color: color-mix(in srgb, var(--primary) 45%, var(--se-linia)); font-weight: 700; }
.se-wstaw { font: inherit; font-size: 0.74rem; padding: 2px 6px; border-radius: 6px; border: 1px dashed color-mix(in srgb, var(--primary) 55%, var(--se-linia)); background: var(--se-pole); color: var(--primary); cursor: pointer; max-width: 100%; }
.se-miejsce-podglad { font-size: 0.72rem; line-height: 1.35; color: var(--muted-light); padding: 0 2px; }
.se-miejsce-podglad.uwaga { color: var(--rosso, #d9534f); }
.se-galaz .se-miejsce-podglad { grid-column: 2 / -1; }
/* Przełącznik trybu - dwie pigułki w jednej ramce, bo to jeden wybór, a nie dwa niezależne przyciski. */
.se-tryby { display: inline-flex; border: 1px solid var(--se-linia); border-radius: 9px; overflow: hidden; }
.se-tryb { font: inherit; font-size: 0.78rem; padding: 5px 11px; border: 0; background: var(--se-pole); color: var(--muted-light); cursor: pointer; }
.se-tryb + .se-tryb { border-left: 1px solid var(--se-linia); }
.se-tryb.wl { background: var(--primary); color: var(--na-akcencie, #fff); }
/* Zwijana sekcja „Zacznij od pomysłu": przy pustej kanwie otwarta (to wtedy pierwszy ruch), przy gotowej
   rozmowie zwinięta do jednej linijki, żeby nie kusiła wyrzuceniem cudzej pracy. */
/* Flaga przy przetlumaczonym zdaniu - maly znak, ma podpisywac, a nie konkurowac z tekstem. */
.se-tl-flaga { display: inline-flex; align-items: center; vertical-align: -2px; margin-right: 5px; }
.se-tl-flaga svg, .se-tl-flaga img { display: block; border-radius: 2px; }
.se-ai-nowa { margin: 0 0 4px; }
.se-ai-nowa > summary { cursor: pointer; list-style: none; font-size: 0.66rem; letter-spacing: 0.1em;
  text-transform: uppercase; color: var(--grigio); padding: 4px 0; }
.se-ai-nowa > summary::-webkit-details-marker { display: none; }
.se-ai-nowa > summary::before { content: '＋ '; }
.se-ai-nowa[open] > summary { color: var(--primary); }
/* Panel „Zacznij od pomysłu" - pierwsza rzecz w palecie, bo jest pierwszym ruchem przy pustej kanwie. */
.se-ai { display: flex; flex-direction: column; gap: 6px; padding-bottom: 10px; margin-bottom: 2px; border-bottom: 1px dashed var(--se-linia); }
.se-ai textarea { font: inherit; font-size: 0.78rem; resize: vertical; border-radius: 9px; border: 1px solid var(--se-linia); background: var(--se-pole); color: var(--testo); padding: 6px 8px; }
.se-ai textarea:focus { outline: none; border-color: var(--primary); }
.se-ai-zakres { display: flex; align-items: center; gap: 5px; font-size: 0.74rem; color: var(--muted-light); }
.se-ai-zakres select { font: inherit; font-size: 0.76rem; padding: 4px 5px; border-radius: 7px; border: 1px solid var(--se-linia); background: var(--se-pole); color: var(--testo); }
.se-ai-zakres select:focus { outline: none; border-color: var(--primary); }
.se-ai-zakres input { width: 46px; font: inherit; font-size: 0.76rem; padding: 4px 5px; border-radius: 7px;
  border: 1px solid var(--se-linia); background: var(--se-pole); color: var(--testo); }
.se-ai-zakres input:focus { outline: none; border-color: var(--primary); }
.se-ai-btn { justify-content: center; }
.se-ai-btn[disabled] { opacity: .6; cursor: default; }
.se-ai-stan { min-height: 1em; line-height: 1.35; }
/* „+" pod nieprzyłączonym portem: jedno kliknięcie dokłada następny klocek i od razu go łączy. To ono zdejmuje
   z układania drzewa wymóg celowania w kółka - przeciąganie zostaje dla tych, którzy chcą połączyć dwa istniejące. */
.se-plus { position: absolute; top: 20px; left: 50%; transform: translateX(-50%); width: 20px; height: 20px; line-height: 1;
  border-radius: 50%; border: 1px dashed var(--se-k, var(--primary)); background: var(--se-karta); color: var(--se-k, var(--primary));
  font: inherit; font-size: 0.86rem; cursor: pointer; padding: 0; display: flex; align-items: center; justify-content: center; }
.se-plus:hover { background: var(--se-k, var(--primary)); color: var(--na-akcencie, #fff); border-style: solid; }
/* TRYB PROSTY: chowamy pola, których przy pierwszej rozmowie nikt nie wypełnia. Wartości zostają w modelu -
   przełączenie na „Zaawansowane" pokazuje je z powrotem nietknięte. */
.se-prosto .se-ai-pole-instrukcja, .se-prosto .se-pole-blad, .se-prosto .se-intencja, .se-prosto .se-naglowek code { display: none !important; }
.se-prosto .se-galaz { grid-template-columns: 20px 1fr 26px 20px 20px; }
.se-prosto .se-klocek-uczen { display: none; }   /* uczeń zaczyna rozmowę - rzadki przypadek, zostaje w trybie pełnym */
/* Wprowadzenie ma jedno duże pole - w trybie prostym chowamy tylko to, czego i tak nie wypełnia. */
.se-opis .se-cialo textarea { min-height: 96px; }
/* „Uczeń widzi i słyszy to: w języku ucznia / w języku nauki” (2026-10-06). Pigułka z dwoma przyciskami w barwie klocka,
   ciemniejszy fiolet pod białym napisem (#6d28d9: 7 : 1, zwykły #8b5cf6 miał 4,2 : 1). */
.se-jezyk-opisu { display: flex; flex-direction: column; gap: 4px; }
.se-seg { display: flex; gap: 3px; padding: 3px; border-radius: 999px; background: var(--bg-soft); border: 1px solid var(--border-warm-soft); }
.se-seg button { flex: 1 1 0; min-height: 30px; border: 0; border-radius: 999px; background: none; color: var(--testo); font: inherit;
  font-size: 0.78rem; font-weight: 700; cursor: pointer; }
.se-seg button.wl { background: #6d28d9; color: #fff; }
.se-seg button:focus-visible { outline: 2px solid #6d28d9; outline-offset: 2px; }
/* Kanwa: kropkowana siatka przesuwa się i skaluje razem ze światem (background-position/size z ustawTransform). */
.se-kanwa { position: relative; flex: 1; min-width: 0; overflow: hidden; cursor: grab; touch-action: none;
            background-color: var(--se-tlo); background-image: radial-gradient(color-mix(in srgb, var(--testo) 22%, transparent) 1.2px, transparent 1.3px); background-size: 22px 22px; }
.se-kanwa:active { cursor: grabbing; }
.se-swiat { position: absolute; left: 0; top: 0; transform-origin: 0 0; }
.se-krawedzie { position: absolute; left: 0; top: 0; width: 1px; height: 1px; overflow: visible; pointer-events: none; }
/* Krawędź bierze kolor KLOCKA, z którego wychodzi - widać wtedy z daleka, czyja to odpowiedź prowadzi dalej. */
.se-krawedz { fill: none; stroke: color-mix(in srgb, var(--testo) 45%, transparent); stroke-width: 2.8; pointer-events: stroke; cursor: pointer; }
/* NIEWIDZIALNY PAS DO LAPANIA (Alek: „ciezko w to trafic kursorem, gdy chce usunac recznie"). Pole trafienia
   rowna sie GRUBOSCI KRESKI, wiec w 2,8 px trzeba bylo celowac. Ta sama sciezka, tylko grubsza i przezroczysta,
   lapie klikniecie; wyglad zostaje bez zmian. Musi bic :hover, stad wlasna regula z tym samym stanem. */
.se-krawedz.se-kr-lap, .se-krawedz.se-kr-lap:hover { stroke: transparent; stroke-width: 20; }
.se-krawedz.se-kr-ai { stroke: color-mix(in srgb, var(--primary) 70%, transparent); }
.se-krawedz.se-kr-uczen { stroke: color-mix(in srgb, var(--verde) 75%, transparent); }
.se-krawedz.se-kr-swobodna { stroke: color-mix(in srgb, #d6336c 70%, transparent); }
.se-krawedz:hover { stroke: var(--primary); stroke-width: 3; }
.se-krawedz.zaznaczona { stroke: var(--primary); stroke-width: 3.2; }
.se-krawedz.se-tymczasowa { stroke: var(--primary); stroke-dasharray: 6 5; pointer-events: none; }
/* Przycisk przy zaznaczonej krawedzi. [hidden] z !important, bo klasa ustawia display - ta sama pulapka,
   co przy okladce rozmowy i panelu JSON. */
.se-kraw-akcja { position: absolute; display: flex; transform: translate(-50%, -50%); z-index: 6; }
.se-kraw-akcja[hidden] { display: none !important; }
.se-kraw-akcja button { display: inline-flex; align-items: center; gap: 5px; font: inherit; font-size: 0.72rem;
  font-weight: 600; padding: 4px 10px; border-radius: 999px; cursor: pointer; white-space: nowrap;
  color: #fff; background: var(--rosso, #d9534f); border: 1.5px solid rgba(255,255,255,.55);
  box-shadow: 0 3px 10px rgba(0,0,0,.25); }
.se-kraw-akcja button:hover { filter: brightness(1.08); }
.se-kraw-akcja .ico { margin: 0; font-size: 0.72rem; }
.se-grot { fill: color-mix(in srgb, var(--testo) 45%, transparent); }
.se-wezly { position: absolute; left: 0; top: 0; }
.se-wezel { --se-k: var(--primary); position: absolute; width: 300px; background: var(--se-karta); border: 1.5px solid color-mix(in srgb, var(--se-k) 38%, var(--se-linia)); border-radius: 14px;
             box-shadow: 0 6px 18px rgba(0,0,0,.18); cursor: default; transition: box-shadow .15s, border-color .15s; }
.se-wezel:hover { box-shadow: 0 10px 26px rgba(0,0,0,.22); }
.se-wezel.zaznaczony { border-color: var(--se-k); box-shadow: 0 0 0 3px color-mix(in srgb, var(--se-k) 28%, transparent), 0 6px 18px rgba(0,0,0,.1); }
.se-wezel.se-blad { --se-k: var(--rosso, #d9534f); border-color: var(--rosso, #d9534f); }
/* Kształty. Bot = dymek (ogonek pod nagłówkiem), uczeń = ścięty narożnik od strony portu wejściowego,
   koniec = zaokrąglona meta z szachownicą, start = pigułka. */
.se-wezel.se-ai { --se-k: var(--primary); border-radius: 14px 14px 14px 5px; }
.se-wezel.se-uczen { --se-k: var(--verde); border-radius: 5px 14px 14px 14px; }
.se-wezel.se-pamiec { --se-k: #0d9488; border-radius: 5px 14px 14px 14px; }
.se-wezel.se-swobodna { --se-k: #d6336c; border-radius: 5px 14px 14px 14px; }
.se-wezel.se-koniec { --se-k: #d9a400; width: 270px; border-radius: 14px 14px 22px 22px; padding-bottom: 8px; }
/* „Bot opis" = kartka z zagiętym rogiem. Fiolet, bo to jedyny klocek, w którym nikt nie mówi do mikrofonu -
   ani pytanie rozmówcy, ani odpowiedź ucznia, tylko wprowadzenie do sceny. */
.se-wezel.se-opis { --se-k: #8b5cf6; width: 330px; border-radius: 14px 2px 14px 14px; }
.se-opis .se-naglowek { border-radius: 12px 0 0 0; }
.se-opis::before { content: ''; position: absolute; right: 0; top: 0; width: 16px; height: 16px;
  background: linear-gradient(225deg, var(--se-tlo) 50%, color-mix(in srgb, var(--se-k) 30%, var(--se-karta)) 50%); }
.se-wezel.se-start { --se-k: var(--grigio); width: 240px; border-radius: 22px; }
/* Ogonek dymka bota: trójkąt w kolorze nagłówka, przyklejony pod jego lewym rogiem. */
.se-ai .se-naglowek::after { content: ''; position: absolute; left: 14px; bottom: -7px; width: 0; height: 0;
  border: 7px solid transparent; border-top-color: color-mix(in srgb, var(--se-k) 22%, var(--se-karta)); border-bottom: 0; }
.se-ai .se-naglowek { position: relative; }
/* Meta: szachownica na dolnej krawędzi klocka końcowego - to samo, co na mecie wyścigu. */
.se-koniec::after { content: ''; position: absolute; left: 14px; right: 14px; bottom: 3px; height: 6px; border-radius: 3px; opacity: .55;
  background: repeating-conic-gradient(var(--se-k) 0% 25%, transparent 0% 50%) 0 0 / 6px 6px; }
.se-naglowek { display: flex; align-items: center; gap: 7px; padding: 8px 10px; border-bottom: 1px solid var(--se-linia); border-radius: 12px 12px 0 0; cursor: grab; user-select: none; font-weight: 600; font-size: 0.82rem; }
.se-naglowek:active { cursor: grabbing; }
.se-naglowek code { margin-left: auto; font-size: 0.7rem; color: var(--muted-light); font-weight: 400; }
.se-wezel .se-naglowek { background: color-mix(in srgb, var(--se-k) 16%, transparent); color: color-mix(in srgb, var(--se-k) 72%, var(--testo)); }
.se-wezel .se-naglowek .ico { color: #fff; background: var(--se-k); width: 21px; height: 21px; border-radius: 50%;
  display: inline-flex; align-items: center; justify-content: center; font-size: 0.7rem; flex: none; }
.se-uczen .se-naglowek, .se-pamiec .se-naglowek, .se-swobodna .se-naglowek { border-radius: 4px 12px 0 0; }
.se-pamiec-kroki { margin: 2px 0 0; padding-left: 18px; font-size: 0.74rem; line-height: 1.4; color: var(--muted-light); }
.se-start .se-naglowek { border-radius: 21px 21px 0 0; }
.se-usun { margin-left: 4px; background: none; border: none; color: var(--muted-light); cursor: pointer; padding: 0 2px; font-size: 1rem; line-height: 1; }
.se-usun:hover { color: var(--rosso, #d9534f); }
.se-cialo { padding: 7px 10px 3px; display: flex; flex-direction: column; gap: 5px; }
.se-start-cialo { font-size: 0.78rem; color: var(--muted-light); line-height: 1.4; }
.se-pole { display: flex; flex-direction: column; gap: 1px; }
.se-etykieta { font-size: 0.64rem; letter-spacing: 0.04em; text-transform: uppercase; color: var(--muted-light); }
.se-wezel input, .se-wezel textarea { font: inherit; font-size: 0.82rem; width: 100%; box-sizing: border-box; padding: 4px 7px; border-radius: 7px; border: 1px solid var(--se-linia); background: var(--se-pole); color: var(--testo); }
.se-wezel textarea { resize: vertical; min-height: 40px; field-sizing: content; }
.se-wezel input:focus, .se-wezel textarea:focus { outline: none; border-color: var(--primary); }
.se-tl { font-size: 0.76rem; color: var(--muted-light); padding: 1px 2px 0; }
.se-tl span { display: inline-block; font-size: 0.62rem; text-transform: uppercase; letter-spacing: 0.06em; margin-right: 5px; padding: 0 4px; border-radius: 4px; background: var(--se-linia); }
.se-galezie { display: flex; flex-direction: column; gap: 5px; padding-top: 4px; border-top: 1px dashed var(--se-linia); }
.se-galaz { display: grid; grid-template-columns: 20px 1fr 78px 26px 20px 20px; gap: 5px; align-items: center; }
/* Gałąź ukryta: kreskowana obwódka wzoru i przygaszony numer - na pierwszy rzut oka widać, że to objazd,
   a nie odpowiedź do przećwiczenia. Sama treść zostaje normalnie edytowalna. */
.se-galaz.ukryta input[data-pole="galaz-wzor"] { border-style: dashed; opacity: .75; }
.se-galaz.ukryta .se-galaz-nr { background: var(--se-linia); color: var(--grigio); }
.se-galaz .se-oko.wl { color: var(--primary); }
.se-galaz .se-tl { grid-column: 2 / -1; }
.se-galaz-nr { display: inline-flex; align-items: center; justify-content: center; width: 20px; height: 20px; border-radius: 50%; background: var(--primary); color: var(--na-akcencie, #fff); font-size: 0.7rem; font-weight: 700; }
.se-intencja { font-size: 0.74rem !important; }
.se-mini { font: inherit; font-size: 0.74rem; background: none; border: 1px solid var(--se-linia); border-radius: 6px; color: var(--muted-light); cursor: pointer; padding: 2px 6px; }
.se-mini:hover { color: var(--primary); border-color: var(--primary); }
.se-dodaj { align-self: flex-start; }
.se-info { font-size: 0.74rem; color: var(--muted-light); line-height: 1.35; }
/* Porty: wejście na górnej krawędzi, wyjścia na dolnej - jedno na gałąź (A, B, C, D) albo jedno „dalej". */
.se-port { display: inline-block; width: 16px; height: 16px; border-radius: 50%; background: var(--se-karta); border: 3px solid color-mix(in srgb, var(--testo) 45%, transparent); box-sizing: border-box; }
.se-port-we { position: absolute; left: 50%; top: -9px; margin-left: -8px; pointer-events: none; }
.se-porty { display: flex; justify-content: space-evenly; padding: 6px 10px 0; height: 22px; }
.se-port-wy { position: relative; top: 4px; cursor: crosshair; }
/* Niewidzialny obszar chwytu wokół portu: przy 55% powiększenia samo kółko ma 9 px i chwyt trafiał w kanwę (przesuwał widok
   zamiast łączyć - zmierzone w podglądzie 2026-09-15). */
.se-port-wy::after { content: ''; position: absolute; inset: -10px; border-radius: 50%; }
.se-port-wy:hover { transform: scale(1.25); }
.se-port-wy:hover, .se-port-wy.polaczony { border-color: var(--se-k); }
.se-port-wy.polaczony { background: var(--se-k); }
.se-port-wy i { position: absolute; top: -17px; left: 50%; transform: translateX(-50%); font-style: normal; font-size: 0.62rem; letter-spacing: 0.05em; text-transform: uppercase; color: var(--muted-light); white-space: nowrap; pointer-events: none; }
.se-znak { position: absolute; right: 12px; top: 10px; height: 18px; width: auto; opacity: .5; pointer-events: none; user-select: none; }
.se-stopka { position: absolute; left: 50%; transform: translateX(-50%); bottom: 8px; font-size: 0.68rem; letter-spacing: .04em;
  color: var(--muted-light); opacity: .75; pointer-events: none; user-select: none; }
@media (max-width: 900px) { .se-znak { height: 14px; } .se-stopka { font-size: 0.62rem; } }
.se-zoom { position: absolute; right: 10px; bottom: 8px; font-size: 0.72rem; color: var(--muted-light); background: var(--se-pasek); padding: 2px 6px; border-radius: 6px; }
.se-json { width: 340px; flex: none; border-left: 1px solid var(--se-linia); display: flex; flex-direction: column; padding: 10px; gap: 6px; background: var(--se-pasek); }
.se-json-tytul { font-weight: 600; font-size: 0.8rem; display: flex; gap: 8px; align-items: baseline; }
.se-json textarea { flex: 1; font: 0.74rem/1.35 Consolas, monospace; border: 1px solid var(--se-linia); border-radius: 8px; padding: 8px; background: var(--se-pole); color: var(--testo); resize: none; }
.se-json-akcje { display: flex; align-items: center; gap: 8px; }
.se-bledy { padding: 8px 12px; border-top: 1px solid var(--se-linia); font-size: 0.8rem; max-height: 140px; overflow: auto; white-space: pre-line; }
.se-bledy.ok { color: var(--verde); } .se-bledy.zle { color: var(--rosso, #d9534f); }
/* PEŁNY EKRAN (Alek 2026-09-16: „dodaj opcję full screen również w układaniu kanwy"). Dwie drogi, bo Fullscreen API
   bywa zablokowane (iframe bez allow="fullscreen", odmowa przeglądarki): natywna przez requestFullscreen, a gdy
   rzuci - klasa .se-pelny, czyli zwykła warstwa na całym oknie. Obie dają ten sam wynik: kanwa na cały ekran.
   height:100% zamiast stałych 700px, bo w obu trybach wysokość daje rodzic (ekran albo warstwa). */
.se:fullscreen, .se.se-pelny { height: 100%; border-radius: 0; border: 0; margin: 0; }
.se.se-pelny { position: fixed; inset: 0; z-index: 4000; }
.se:fullscreen .se-kanwa, .se.se-pelny .se-kanwa { min-height: 0; }
@media (max-width: 900px) { .se-paleta { width: 150px; } .se-paleta-pomoc { display: none; } .se-json { width: 240px; } }
