/* Wybór pojazdu — Marka → Model → Rok.
   Wygląd przeniesiony 1:1 z poprzedniej wersji na select2: złoto #C4A677, wysokość
   44 px, zaokrąglenie 10 px, obwódka 2 px. ⚠️ Poprzedni arkusz miał `!important`
   w każdej regule, bo walczył z domyślnym stylem biblioteki. Bez biblioteki nie ma
   z czym walczyć — dlatego tu nie ma ani jednego. */

/* ⛔ PALETA MUSI STAĆ NA OBU KORZENIACH. Zmienne CSS dziedziczą się po drzewie DOM,
   a panel z listą mieszka w `<body>` — czyli POZA `.dyn-cat`. Zadeklarowana tylko na
   module zmienna po prostu tam nie istnieje: `background: var(--dc-zloto)` staje się
   nieprawidłowe i spada do `transparent`, a `color:#fff` (literał) zostaje.
   Objaw był taki: wybrana pozycja listy — biały tekst na białym tle. */
/* ⛔ MODUŁ NIE MOŻE MIEĆ WYMUSZONEJ SZEROKOŚCI.
   `.dyn-cat` jest elementem elastycznym w `.grid-item` Journala, więc domyślnie
   dopasowuje się do treści — i TYLKO dlatego ustawienie „Horizontal Align" z opcji
   kolumny ma co przesuwać. Nadanie mu `width:100%` (próbowałem, żeby zadziałało
   zapytanie kontenerowe) rozdymało moduł z 625 do 1360 px i wyrównanie przestawało
   działać: element wypełniający kolumnę nie ma jak być w niej wyrównany.
   ⛔ ALE SZEROKOŚCI NIE MOŻNA TEŻ ZOSTAWIĆ ZAWIJANIU. To błędne koło: szerokość
   modułu wynika z tego, ile pól zmieściło się w rzędzie, a to — z szerokości modułu.
   Zmierzone: moduł ustalał się na 625 px, pola rozciągały się do sufitu 280 px
   i trzecie zawijało do drugiego rzędu, choć miejsca w kolumnie było 1360 px.
   Dlatego szerokość podajemy WPROST, wyliczoną z liczby pól (`--dc-pol` wstawia
   szablon). `max-width: 100%` zostawia zawijanie tam, gdzie kolumna jest wąska.

   ⚠️ 250 px, a nie 208 px liczone z najdłuższej DZISIEJSZEJ etykiety. Katalog rośnie,
   nazwy modeli bywają długie (`NINJA 1000SX | ZX1002` to 21 znaków), a w kolumnie jest
   1360 px miejsca — nie ma powodu ciąć w obrys tego, co akurat mamy w bazie. */
.dyn-cat {
  width: calc(var(--dc-pol, 3) * 250px + (var(--dc-pol, 3) - 1) * 10px);
  max-width: 100%;
}

.dyn-cat,
.dyn-cat-panel {
  --dc-zloto: #C4A677;
  --dc-obwodka: #e0e0e0;
  --dc-tekst: #333;
  --dc-zastepnik: #999;
}

.dyn-cat-tytul { margin: 0 0 10px; font-size: 16px; font-weight: 600; color: var(--dc-tekst); }

.dyn-cat-form { display: flex; flex-wrap: wrap; gap: 10px; align-items: flex-start; }

/* ⚠️ Pola dopasowują się DO TREŚCI, do 250 px — tak jak w pierwowzorze
   (`display:inline-block; max-width:250px`). Wymuszenie równej szerokości wygląda
   porządniej na papierze, ale „1993" zajmuje wtedy tyle co „CB1000F HORNET"
   i cztery pola przestają się mieścić w rzędzie (zmierzone: kontener ma 471 px).
   `position:relative` zostaje dla nakładki wskaźnika ładowania. */
/* ⚠️ SZEROKOŚĆ BAZOWA 208 px NIE JEST Z SUFITU. Tyle zajmuje najdłuższa etykieta
   („--- Select a Model ---" to 160 px tekstu plus wcięcia). Trzy pola po tyle dają
   644 px i to jest naturalna szerokość całego modułu tam, gdzie jest miejsce.
   Gdy miejsca brakuje — kafel „Models Guide" ma 340 px — pola zawijają się same,
   bez zapytań o szerokość. Równe szerokości bierze się stąd, że wszystkie mają tę
   samą bazę i ten sam współczynnik rozciągania.
   `position:relative` zostaje dla nakładki wskaźnika ładowania. */
/* ⚠️ Bez sufitu szerokości. Odkąd moduł ma szerokość podaną wprost, w rzędzie i tak
   wychodzi 208 px na pole, a przy zawinięciu pole ma WYPEŁNIĆ kolumnę — sufit
   zostawiał wtedy 16 px pustego z prawej. */
.dyn-cat-pole { position: relative; flex: 1 1 250px; min-width: 0; }

/* Natywna lista zostaje w przepływie (nadaje polu wysokość i niesie stan formularza),
   ale szerokość rozdziela już flex — patrz reguła wyżej. Przycisk leży na niej. */

/* ⛔ Natywna lista ZOSTAJE w drzewie (niesie stan, działa bez skryptu), ale schodzi
   z oczu. `display:none` byłby tu błędem: pole bez układu bywa pomijane przy
   przywracaniu stanu formularza i przy autouzupełnianiu. */
/* ---- lista PRZED wzbogaceniem przez skrypt ----
   ⛔ TA REGUŁA ISTNIEJE, BO STAN NIEWZBOGACONY TEŻ MUSI MIEĆ WYGLĄD. Natywny `<select>`
      nie miał wcześniej ŻADNEJ reguły — ubranie dostawał dopiero wtedy, gdy skrypt dopisał
      mu `dyn-cat-natywna`, a ta go CHOWA. Skutki były dwa i oba realne:
        - klient z wyłączonym JavaScriptem dostawał surowy element zamiast kontrolki;
        - zanim skrypt wystartował, w miejscu kontrolki stała lista z domyślną strzałką
          przeglądarki (zgłoszone 21.08.2026 przy dławieniu łącza do 3G).

   ⛔ MIEJSCE TEJ REGUŁY TO ARKUSZ, NIE SZABLON. Pierwsza wersja poprawki wstawiała te
      style do szablonu, bo Lightning odracza arkusz. To było budowanie komponentu wokół
      wady warstwy dostarczania: bez Lightninga arkusz przychodzi blokująco i wstawka jest
      zbędnym nadmiarem oraz źródłem rozjazdu (te same reguły w dwóch plikach).
      Sklep ma działać poprawnie NIEZALEŻNIE od tego, co stoi przed OpenCartem.

   ⛔ `!important` bije JOURNALA, nie Lightninga. Journal narzuca wszystkim `select`
      własną obwódkę, tło, wypełnienie, rozmiar pisma i strzałkę w `background-image`,
      i robi to z `!important` — sama waga selektora nie wystarcza. Ten sam mechanizm
      i to samo lekarstwo co przy `strong` w `stylesheet/md_strony.css`.

   ⚠️ Wygląd celowo IDENTYCZNY z `.dyn-cat-przycisk` poniżej, ze strzałką rysowaną tłem.
      Kontrolka, którą skrypt stawia na tym miejscu, ma wyglądać jak zamiana bez ruchu —
      nie jak podmiana jednego elementu na drugi. Zmieniasz jedno, zmień drugie. */
.dyn-cat-lista {
  -webkit-appearance: none !important; -moz-appearance: none !important; appearance: none !important;
  display: block; width: 100%; height: 44px !important; margin: 0;
  padding: 0 40px 0 16px !important; font: inherit; font-size: 15px !important; font-weight: 500;
  color: var(--dc-tekst) !important; border: 2px solid var(--dc-obwodka) !important;
  border-radius: 10px !important; box-sizing: border-box;
  background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 8'%3E%3Cpath d='M1 1l5 5 5-5' fill='none' stroke='%23666' stroke-width='1.6'/%3E%3C/svg%3E") no-repeat right 14px center/12px 8px,
    linear-gradient(to bottom, #fff, #f8f9fa) !important;
}

.dyn-cat-natywna {
  display: block; width: 100%; height: 44px; margin: 0;
  padding: 0 40px 0 16px; font: inherit; font-size: 15px; font-weight: 500;
  border: 2px solid transparent; border-radius: 10px; box-sizing: border-box;
  visibility: hidden;
}

.dyn-cat-przycisk {
  position: absolute; inset: 0;
  display: flex; align-items: center; justify-content: space-between; gap: 8px;
  padding: 0 12px 0 16px;
  background: linear-gradient(to bottom, #fff, #f8f9fa);
  border: 2px solid var(--dc-obwodka); border-radius: 10px;
  font: inherit; font-size: 15px; font-weight: 500; color: var(--dc-tekst);
  text-align: left; cursor: pointer; transition: border-color .25s, box-shadow .25s;
}

.dyn-cat-przycisk:hover:not(:disabled) { border-color: var(--dc-zloto); box-shadow: 0 4px 12px rgba(196,166,119,.25); }
.dyn-cat-przycisk[aria-expanded="true"] { border-color: var(--dc-zloto); box-shadow: 0 0 0 3px rgba(196,166,119,.2); }
.dyn-cat-przycisk:focus-visible { outline: 2px solid var(--dc-zloto); outline-offset: 2px; }
.dyn-cat-przycisk:disabled { opacity: .55; cursor: default; background: #f5f5f5; }
.dyn-cat-przycisk.is-pusty .dyn-cat-wartosc { color: var(--dc-zastepnik); }

.dyn-cat-wartosc { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

.dyn-cat-strzalka { flex: 0 0 auto; width: 12px; height: 8px; fill: none; stroke: #666; stroke-width: 1.6; }

/* ---- rozwinięta lista ---- */

/* ⛔ Panel żyje w `<body>` i stoi na współrzędnych OKNA — pozycję wylicza skrypt.
   Powód w komentarzu przy `document.body.appendChild()`: siatka Journala ma własny
   kontekst nakładania i panel zostawiony w środku ginął pod treścią następnego wiersza. */
.dyn-cat-panel {
  position: fixed; z-index: 9999;
  background: #fff; border: 2px solid var(--dc-zloto); border-radius: 10px;
  box-shadow: 0 10px 40px rgba(0,0,0,.15); overflow: hidden;
}

.dyn-cat-panel[hidden] { display: none; }

.dyn-cat-szukajka { position: relative; padding: 8px; border-bottom: 1px solid #f0ece4; }
.dyn-cat-szukajka[hidden] { display: none; }

.dyn-cat-lupa {
  position: absolute; left: 20px; top: 50%; width: 15px; height: 15px; margin-top: -7px;
  fill: none; stroke: var(--dc-zastepnik); stroke-width: 1.6; stroke-linecap: round; pointer-events: none;
}

/* ⚠️ 16 px to nie estetyka: przy mniejszej czcionce iOS przybliża całą stronę,
   gdy tylko dotkniesz pola. */
.dyn-cat-szukaj {
  width: 100%; height: 38px; padding: 0 12px 0 34px; font: inherit; font-size: 16px;
  border: 1px solid var(--dc-obwodka); border-radius: 8px; background: #fff;
  color: var(--dc-tekst); box-sizing: border-box;
}

.dyn-cat-szukaj::placeholder { color: var(--dc-zastepnik); }
.dyn-cat-szukaj:focus { outline: 0; border-color: var(--dc-zloto); box-shadow: 0 0 0 3px rgba(196,166,119,.18); }
.dyn-cat-szukaj:focus + .dyn-cat-lupa, .dyn-cat-szukajka:focus-within .dyn-cat-lupa { stroke: var(--dc-zloto); }

.dyn-cat-opcje { max-height: 280px; overflow-y: auto; overscroll-behavior: contain; }

.dyn-cat-opcja {
  padding: 11px 16px; font-size: 15px; color: var(--dc-tekst); cursor: pointer;
  border-bottom: 1px solid #f2f2f2;
}

.dyn-cat-opcja:last-child { border-bottom: 0; }
.dyn-cat-opcja[hidden] { display: none; }
/* ⚠️ TRZY STANY, TRZY ZNACZENIA — i żaden nie może udawać drugiego:
     • `:hover` / `.is-aktywna` — „tu wskazujesz". Ten sam wygląd dla myszy i klawiatury,
       bo to ta sama informacja, tylko podana innym urządzeniem.
     • `[aria-selected]` — „to jest wybrane". Musi wygrywać z wskazaniem, dlatego stoi
       niżej w arkuszu przy równej sile selektora.
     • wskazanie NA wybranym — ciemniejsze złoto, żeby dało się je odróżnić. */
.dyn-cat-opcja:hover,
.dyn-cat-opcja.is-aktywna { background: #f5f0e8; color: #8B7355; }

.dyn-cat-opcja[aria-selected="true"] { background: var(--dc-zloto); color: #fff; font-weight: 600; }

.dyn-cat-opcja[aria-selected="true"]:hover,
.dyn-cat-opcja[aria-selected="true"].is-aktywna { background: #b3925f; color: #fff; }

.dyn-cat-pusto { margin: 0; padding: 14px 16px; font-size: 14px; color: var(--dc-zastepnik); }
.dyn-cat-pusto[hidden] { display: none; }

.dyn-cat-go {
  height: 44px; padding: 0 20px; border: 0; border-radius: 10px;
  background: var(--dc-zloto); color: #fff; font: inherit; font-weight: 600; cursor: pointer;
}

/* ---- wskaźnik ładowania ----
   ⚠️ To jest kod PRZENIESIONY z poprzedniej wersji modułu, nie z select2: te toczące
   się kropki napisaliście sami. Zmienił się tylko element, względem którego stoją. */

.dyn-cat-pole.is-laduje::after {
  content: ""; position: absolute; z-index: 5;
  top: 2px; left: 2px; right: 40px; bottom: 2px;
  background: rgba(255,255,255,.92); border-radius: 8px 0 0 8px; pointer-events: none;
}

.dyn-cat-pole.is-laduje::before {
  content: ""; position: absolute; z-index: 6;
  top: 50%; left: 26px; width: 8px; height: 8px; margin-top: -4px;
  border-radius: 50%; color: var(--dc-zloto);
  animation: dynCatKropki 1.5s linear infinite;
}

@keyframes dynCatKropki {
  0%   { box-shadow: 0 0 rgba(196,166,119,0), 0 0 rgba(196,166,119,0), 0 0 rgba(196,166,119,0); }
  25%  { box-shadow: 14px 0 var(--dc-zloto), 0 0 rgba(196,166,119,0), 0 0 rgba(196,166,119,0); }
  50%  { box-shadow: 14px 0 var(--dc-zloto), 28px 0 var(--dc-zloto), 0 0 rgba(196,166,119,0); }
  75%  { box-shadow: 14px 0 var(--dc-zloto), 28px 0 var(--dc-zloto), 42px 0 var(--dc-zloto); }
  100% { box-shadow: 56px 0 rgba(196,166,119,0), 56px 0 rgba(196,166,119,0), 56px 0 rgba(196,166,119,0); }
}

@media (prefers-reduced-motion: reduce) {
  .dyn-cat-pole.is-laduje::before { animation: none; box-shadow: 14px 0 var(--dc-zloto), 28px 0 var(--dc-zloto); }
  .dyn-cat-przycisk { transition: none; }
}

/* Na telefonie pola idą na pełną szerokość — zawijanie samo w sobie dałoby jedno pod
   drugim, ale bez sufitu 280 px wyglądałyby na wyrwane z rzędu. */
@media (max-width: 720px) {
  .dyn-cat-form { gap: 8px; }
  .dyn-cat-pole { flex: 1 1 100%; }
}
