/* ============================================================
   digitalaxy.eu — arkusz stylów
   Odwzorowanie projektu „Digitalaxy Terminal.dc.html".
   Kolejność: font → zmienne motywu → elementy wspólne → sekcje.
   ============================================================ */

/* ——— Font self-hosted (zero zapytań do Google) ——————————— */
@font-face {
  font-family: 'IBM Plex Mono'; font-style: normal; font-weight: 300; font-display: swap;
  src: url("../fonts/ibm-plex-mono-latin-300.4df7c29820aa.woff2") format('woff2');
  unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
}
@font-face {
  font-family: 'IBM Plex Mono'; font-style: normal; font-weight: 300; font-display: swap;
  src: url("../fonts/ibm-plex-mono-latin-ext-300.d44aa37f6809.woff2") format('woff2');
  unicode-range: U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;
}
@font-face {
  font-family: 'IBM Plex Mono'; font-style: normal; font-weight: 400; font-display: swap;
  src: url("../fonts/ibm-plex-mono-latin-400.79936b18df9f.woff2") format('woff2');
  unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
}
@font-face {
  font-family: 'IBM Plex Mono'; font-style: normal; font-weight: 400; font-display: swap;
  src: url("../fonts/ibm-plex-mono-latin-ext-400.8450d5944de2.woff2") format('woff2');
  unicode-range: U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;
}

/* ——— Motyw ————————————————————————————————————————————————
   Klasa na <html> ustawiana skryptem w <head> PRZED renderem,
   dzięki czemu strona nie mruga jasnym tłem przy motywie nocnym.  */
:root, html.dx-noc {
  --bg: #0c0c0c; --ink: #e6e5e1; --dim: #8a8a86; --faint: #5d5d59; --line: #232323;
}
html.dx-dzien {
  --bg: #f7f6f3; --ink: #1a1a18; --dim: #6b6b66; --faint: #a3a29a; --line: #e2e0da;
}

/* ——— Układ ————————————————————————————————————————————————
   Cała treść siedzi w jednym kontenerze `.dx-tresc` wyśrodkowanym przez
   margin-inline: auto — linie oddzielające sekcje kończą się razem z nim.
   Bloki wewnątrz sekcji (drzewo, czat, formularz) rozpinają się na pełną
   szerokość kontenera; gdyby trzymały własne wąskie max-width, strona
   sprawiałaby wrażenie dosuniętej do lewej.
   Nawigacja i stopka zostają na całą szerokość okna, ale ich zawartość
   trzyma tę samą oś dzięki --dx-luz: na wąskim ekranie wygrywa stały
   odstęp od krawędzi, na szerokim — połowa tego, co zostaje poza kolumną. */
:root {
  --dx-margines: clamp(18px, 4vw, 48px);
  --dx-szerokosc: 880px;
  --dx-luz: max(var(--dx-margines), (100% - var(--dx-szerokosc)) / 2);
}

/* ——— Podstawy ————————————————————————————————————————————— */
*, *::before, *::after { box-sizing: border-box; }

body {
  margin: 0;
  min-height: 100vh;
  background: var(--bg);
  color: var(--ink);
  font: 400 14px/1.6 'IBM Plex Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
  transition: background .4s, color .4s;
}

a { color: inherit; text-decoration: none; }
a:hover { opacity: .65; }
::placeholder { color: inherit; opacity: .45; }

@keyframes dx-blink { 0%,49% { opacity: 1; } 50%,100% { opacity: 0; } }

/* Szanuj ustawienie „ogranicz animacje" w systemie. */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after { animation: none !important; transition: none !important; }
}

/* Widoczny obrys przy nawigacji klawiaturą — bez tego strona jest
   nieużywalna dla osób nieużywających myszy. */
:focus-visible { outline: 2px solid var(--ink); outline-offset: 2px; }

.dx-tylko-dla-czytnika {
  position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
}

/* ——— Wspólne ————————————————————————————————————————————— */
/* Cała treść strony siedzi w jednym kontenerze wyśrodkowanym przez
   margin-inline: auto. Linie oddzielające sekcje kończą się razem z nim. */
.dx-tresc { max-width: var(--dx-szerokosc); margin-inline: auto; }

.dx-sekcja {
  padding: clamp(40px, 7vh, 64px) var(--dx-margines);
  border-bottom: 1px solid var(--line);
}
.dx-prompt { font-size: 14px; color: var(--faint); margin-bottom: 24px; }
.dx-prompt--ciasny { margin-bottom: 8px; }
.dx-wstep {
  margin: 0 0 20px;
  font-size: 13px; line-height: 1.7;
  color: var(--dim);
}

.dx-przycisk {
  display: inline-flex; align-items: center;
  min-height: 44px; padding: 10px 20px;
  border: 1px solid var(--ink); background: transparent; color: var(--ink);
  font: 400 14px 'IBM Plex Mono', monospace; cursor: pointer;
  transition: background .2s, color .2s;
}
.dx-przycisk:hover { background: var(--ink); color: var(--bg); }
.dx-przycisk[disabled] { border-color: var(--faint); color: var(--faint); cursor: not-allowed; }
.dx-przycisk[disabled]:hover { background: transparent; color: var(--faint); }

.dx-przycisk-tekst {
  min-height: 44px; display: inline-flex; align-items: center;
  padding: 0; border: 0; background: none; color: var(--ink);
  font: 400 13px 'IBM Plex Mono', monospace; cursor: pointer;
}
.dx-przycisk-tekst:hover { opacity: .65; }

/* ——— Nawigacja ——————————————————————————————————————————— */
.dx-nav {
  position: sticky; top: 0; z-index: 10;
  display: flex; flex-wrap: wrap; justify-content: space-between; align-items: center;
  gap: 6px 24px;
  padding: 14px var(--dx-luz);
  border-bottom: 1px solid var(--line);
  background: var(--bg); transition: background .4s;
}
.dx-nav__marka { display: flex; align-items: center; gap: 12px; }
/* Obrot logo po najechaniu siedzi w dx.js (Web Animations API), nie tutaj.
   Powod: ma sie krecic tak dlugo, jak trwa hover, a po zjechaniu kursorem
   wyhamowac w prawo do pozycji wyjsciowej — ani transition, ani zwykla
   animacja CSS tego nie zrobia, bo nie umieja dokonczyc ruchu w te sama
   strone z aktualnego kata. dx.js pilnuje tez „ogranicz animacje". */
.dx-nav__marka img { width: 24px; height: 24px; display: block; }
.dx-nav__sciezka { font-size: 13px; color: var(--dim); }
/* Tekst marki ma zachowywac sie dokladnie jak pozycje menu: na hover
   ROSNIE kontrast (--ink), zamiast przygasac przez globalne
   a:hover { opacity: .65 }. Zdjecie tej przezroczystosci z calego
   odnosnika zalatwia przy okazji drugi warunek — obrazek logo nie
   zmienia odcienia, hover ma go tylko obracac. */
.dx-nav__marka:hover { opacity: 1; }
.dx-nav__marka:hover .dx-nav__sciezka { color: var(--ink); }
.dx-nav__linki {
  display: flex; flex-wrap: wrap; justify-content: flex-end; align-items: center;
  gap: 0 clamp(12px, 2.5vw, 26px);
  font-size: 13px; color: var(--dim);
}
.dx-nav__linki a { min-height: 44px; display: inline-flex; align-items: center; }
.dx-nav__linki a:hover { color: var(--ink); opacity: 1; }

/* Logo zależne od motywu — bez JavaScriptu, samym CSS-em. */
html.dx-dzien .dx-logo--noc,
html.dx-noc   .dx-logo--dzien { display: none; }

/* ——— Nagłówek (manifest) ————————————————————————————————— */
.dx-hero {
  padding: clamp(72px, 14vh, 140px) var(--dx-margines) clamp(48px, 8vh, 80px);
  border-bottom: 1px solid var(--line);
}
.dx-hero h1 {
  margin: 20px 0 0;
  font-weight: 300; font-size: clamp(28px, 4.5vw, 56px); line-height: 1.25;
  letter-spacing: -.01em; max-width: 1000px;
}
.dx-kursor {
  display: inline-block; width: .46em; height: .92em;
  background: var(--ink); margin-left: .25em; vertical-align: -0.1em;
  animation: dx-blink 1.1s step-end infinite;
}
.dx-hero p {
  margin: 32px 0 0;
  font-size: clamp(13px, 1.6vw, 15px); line-height: 1.8;
  color: var(--dim);
}

/* ——— Zakres ——————————————————————————————————————————————— */
.dx-drzewo { display: flex; flex-direction: column; gap: 2px; }
.dx-drzewo__wiersz {
  display: flex; flex-wrap: wrap; gap: 0 8px;
  padding: 10px 8px; margin: 0 -8px;
  font-size: clamp(13px, 1.6vw, 15px); line-height: 1.5;
}
.dx-drzewo__wiersz:hover { background: var(--line); }
.dx-drzewo__galaz { color: var(--faint); width: 48px; flex: none; }
.dx-drzewo__nazwa { width: 300px; flex: none; }
.dx-drzewo__opis { color: var(--dim); }
/* Opis dociagniety do prawej krawedzi — wiersz rozpina sie na cala szerokosc
   kontenera, jak kolumny w `ls -l`. Ponizej 720 px wiersz i tak sie zawija,
   wiec tam zostaje przy nazwie. */
@media (min-width: 720px) { .dx-drzewo__opis { margin-left: auto; } }

/* ——— Projekty (za flagą) ————————————————————————————————— */
.dx-projekty { display: flex; flex-wrap: wrap; gap: 20px; }
.dx-projekty__kafel {
  flex: 1 1 260px; padding: 36px 24px;
  border: 1px dashed var(--faint);
  font-size: 13px; line-height: 1.7; color: var(--faint);
}

/* ——— Czat ————————————————————————————————————————————————— */
.dx-czat { border: 1px solid var(--line); }
.dx-czat__okno {
  min-height: 96px; max-height: 320px; overflow-y: auto;
  padding: 18px; display: flex; flex-direction: column; gap: 12px;
  font-size: 13.5px; line-height: 1.7;
}
.dx-czat__wiersz { display: flex; gap: 10px; }
.dx-czat__znacznik { color: var(--faint); flex: none; }
.dx-czat__tekst { color: var(--dim); white-space: pre-wrap; }
.dx-czat__wejscie {
  display: flex; gap: 10px; align-items: center;
  border-top: 1px solid var(--line); padding: 10px 18px;
}
.dx-czat__wejscie input {
  flex: 1; min-width: 0; min-height: 24px; padding: 10px 0;
  background: transparent; border: 0; outline: none;
  font: 400 14px 'IBM Plex Mono', monospace; color: var(--ink);
}
.dx-czat__wejscie input[disabled] { color: var(--faint); cursor: not-allowed; }
.dx-nota {
  margin: 16px 0 0;
  font-size: 11.5px; line-height: 1.7; color: var(--faint);
}
.dx-nota a { text-decoration: underline; }

/* ——— Kontakt ————————————————————————————————————————————— */
.dx-formularz {
  display: flex; flex-direction: column; gap: 18px;
  max-width: 560px; font-size: 14px;
}
.dx-pole { display: flex; flex-wrap: wrap; gap: 6px 12px; align-items: baseline; }
.dx-pole__etykieta { width: 110px; flex: none; color: var(--dim); }
.dx-pole input, .dx-pole textarea {
  flex: 1; min-width: 200px; min-height: 28px; padding: 8px 0;
  background: transparent; border: 0; border-bottom: 1px solid var(--faint);
  outline: none; color: var(--ink);
  font: 400 14px/1.6 'IBM Plex Mono', monospace;
}
.dx-pole textarea { resize: vertical; }
.dx-pole input:focus, .dx-pole textarea:focus { border-bottom-color: var(--ink); }
.dx-zgoda {
  display: flex; gap: 12px; align-items: flex-start;
  font-size: 11.5px; line-height: 1.6; color: var(--faint); cursor: pointer;
}
.dx-zgoda input { margin-top: 2px; accent-color: var(--ink); }
.dx-zgoda a { text-decoration: underline; }
.dx-pulapka { position: absolute; left: -9999px; width: 1px; height: 1px; opacity: 0; }
.dx-status { font-size: 12.5px; line-height: 1.7; color: var(--dim); }

/* ——— Komunikaty i błędy formularza ——————————————————————
   Paleta jest monochromatyczna, więc błędu nie sygnalizujemy kolorem —
   sygnałem jest tekst i pogrubiona krawędź pola. Kolor sam w sobie i tak
   nie wystarcza: nie zobaczy go ani czytnik ekranu, ani osoba
   nierozróżniająca barw. */
.dx-komunikat {
  margin: 0 0 22px; padding: 12px 16px; max-width: 560px;
  border-left: 2px solid var(--ink);
  font-size: 13px; line-height: 1.7; color: var(--dim);
}
.dx-komunikat--blad { border-left-color: var(--faint); }
.dx-blad { margin: -8px 0 0; font-size: 12px; line-height: 1.6; color: var(--ink); }
.dx-pole--zle input, .dx-pole--zle textarea { border-bottom-width: 2px; border-bottom-color: var(--ink); }

/* ——— Baner cookies ————————————————————————————————————————— */
.dx-cookies {
  position: fixed; left: clamp(12px, 3vw, 32px); bottom: clamp(12px, 3vw, 32px); z-index: 20;
  width: min(430px, calc(100vw - 24px));
  padding: 18px 20px;
  background: var(--bg); border: 1px solid var(--faint);
  box-shadow: 0 8px 32px rgba(0,0,0,.35);
  font-size: 12.5px; line-height: 1.75;
}
.dx-cookies[hidden] { display: none; }
.dx-cookies__gora {
  display: flex; justify-content: space-between; align-items: baseline;
  gap: 12px; margin-bottom: 10px; color: var(--faint);
}
.dx-cookies__tresc { margin: 0 0 6px; color: var(--dim); }
.dx-cookies__szczegoly { margin: 0 0 14px; font-size: 11.5px; color: var(--faint); }
.dx-cookies__szczegoly a { text-decoration: underline; }
.dx-cookies__akcje { display: flex; flex-wrap: wrap; gap: 12px; }
.dx-cookies .dx-przycisk { padding: 9px 16px; min-height: 40px; font-size: 12.5px; }

/* ——— Stopka ——————————————————————————————————————————————— */
.dx-stopka {
  display: flex; flex-wrap: wrap; align-items: center; gap: 8px 32px; justify-content: space-between;
  padding: 18px var(--dx-luz);
  font-size: 12px; color: var(--faint);
}
.dx-stopka__linki { display: flex; align-items: center; gap: 16px; }
/* Przycisk „cookies" ma 44 px wysokosci (cel dotykowy). Bez tego sasiednie
   odnosniki rozciagaja sie do jego wysokosci i ich tekst siada u gory —
   przycisk wygladal wtedy, jakby stal linie nizej. */
.dx-stopka__linki a { min-height: 44px; display: inline-flex; align-items: center; }
.dx-stopka__linki button { font-size: 12px; color: var(--faint); }
.dx-stopka__linki button:hover, .dx-stopka a:hover { color: var(--dim); opacity: 1; }

/* ——— Dokumenty ————————————————————————————————————————————— */
.dx-dokument {
  max-width: 840px; margin-inline: auto;
  padding: clamp(48px, 9vh, 88px) var(--dx-margines) clamp(32px, 6vh, 56px);
  font-size: 13.5px; line-height: 1.85;
}
.dx-dokument h1 { margin: 20px 0 4px; font-weight: 300; font-size: clamp(24px, 3vw, 34px); line-height: 1.3; }
.dx-dokument h2 { margin: 32px 0 10px; font-weight: 400; font-size: 17px; }
.dx-dokument p { margin: 0; color: var(--dim); }
.dx-dokument__wersja { margin: 0 0 36px; font-size: 12px; color: var(--faint); }
.dx-dokument strong { color: var(--ink); font-weight: 400; }
.dx-dokument a { text-decoration: underline; }
.dx-rozdzielacz { max-width: 840px; margin-inline: auto; border-top: 1px solid var(--line); }
