/* Pozycja listy produktow - wspolny wyglad dla wszystkich list sortymentu.
 *
 * Zastepuje style wpisywane wprost w atrybuty style= w szablonach:
 *   templates/sortiment/sortimentItem_v1.html      (8 plikow: katalog, wyszukiwarka, oferty)
 *   templates/sortiment/sortimentItem_v2.html      (lista zyczen + panel autorow)
 *   templates/sortiment/sortimentItem_gratis.html  (artykuly darmowe)
 *
 * Dzieki temu, ze szablony operuja teraz klasami, nie trzeba niczego
 * nadpisywac przez !important ani zakotwiczac regul w identyfikatorach
 * pojedynczych stron.
 *
 * Paleta jak w koszyku, kasie i stronach konta:
 *   akcent #4E5461   ramka #d9d9d9   separator #ececec
 *   tlo hover #fafafa   tekst mocny #222   promien 2px   Arial
 *
 * Plik jest czystym ASCII - strony sa w ISO-8859-1.
 *
 * UWAGA: reguly responsywne sa CELOWO na koncu pliku. Media query NIE
 * podnosi specyficznosci, wiec regula o rownej specyficznosci umieszczona
 * PO bloku @media wygrywa na kazdej szerokosci.
 */

/* Tlo, zebra i podswietlenie pozycji.
 *
 * Wczesniej pochodzily z js/api-front/index.css, z regul zakotwiczonych
 * w klasie SpootlightInit (i wymuszanych przez !important). Ta sama klasa
 * podpinala jednak pod najechanie opozniony podglad produktu - popup
 * przykrywal pozycje i nie dalo sie dosiegnac panelu ze szczegolami oceny.
 * Klasa zostala z list usunieta, wiec wyglad przejmuje ten arkusz.
 * Wartosci sa przepisane jeden do jednego, zeby listy wygladaly tak samo
 * jak strona glowna i katalog.
 */
#content .sortItem {
    background: #fff;
    border-bottom: 1px solid rgba(0,0,0,.05);
    position: relative;
    line-height: 1.5;
}

#content .sortItem:nth-of-type(even) { background: #f8f9fb; }

#content .sortItem:hover,
#content .sortItem:nth-of-type(even):hover {
    background: #eef0fb;
    box-shadow: inset 3px 0 0 #6366f1;
}

/* Ostatnia pozycja bez kreski. Dwa warianty, bo na czesci list kazda
 * pozycja siedzi we wlasnym opakowaniu i :last-child trafia wtedy
 * w kazda z nich. */
#content .sortItem:last-child,
#content > *:last-child > .sortItem:last-child { border-bottom: 0; }

#content .sortItem {
    display: flex;
    flex-wrap: wrap;
    align-items: flex-start;
    gap: 12px;
    box-sizing: border-box;
    padding: 12px 6px;
    font-family: Arial, Helvetica, sans-serif;
}

/* =====================================================================
 * KOLUMNA OBRAZKA
 * Bylo: width:23% albo 130px w atrybucie style, do tego float:left.
 * ===================================================================== */
#content .sortItem__media {
    position: relative;
    flex: 0 0 auto;
    width: 190px;
    max-width: 34%;
}

#content .sortItem__media a { display: block; text-decoration: none; }

/* Kadr o STALEJ wysokosci.
 *
 * Zdjecia produktow maja rozne proporcje. Dopoki znacznik <img> mial wpisane
 * na sztywno width/height, wszystkie byly zgniatane do jednego prostokata.
 * Po zdjeciu tych atrybutow kazda pozycja dostala wysokosc wynikajaca
 * z wlasnego zdjecia - lista "skakala" przy przewijaniu, a podmiana zdjecia
 * paskiem miniatur przesuwala cala reszte pozycji w dol albo w gore.
 *
 * Kadr ma teraz stala wysokosc, a zdjecie WYPELNIA go w calosci
 * (object-fit: cover) - puste pasy po bokach wygladaly na niedorobione.
 * Cena: przy proporcjach innych niz kadr brzegi zdjecia sa przycinane.
 *
 * Proporcje kadru: 16:10. Wysokosc w px to zapas dla starych przegladarek
 * (190 / 1.6 = 119); wspolczesne dostaja aspect-ratio na koncu pliku,
 * ktore trzyma proporcje takze przy kolumnie zwezonej przez max-width. */
#content .sortItem__media > a {
    height: 119px;
    background: #f7f7f8;
    border: 1px solid #e0e0e0;
    border-radius: 3px;
}

#content .sortItem__media > a > img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    /* ramke przejal kadr wyzej - na samym obrazku bylaby druga kreska */
    border: 0;
    border-radius: 0;
}

/* Delikatny efekt na zdjeciu. Skala 1.02 i cien pojawiaja sie po najechaniu
 * na CALA pozycje, nie na samo zdjecie - kursor idacy do przycisku nie gasi
 * wtedy podswietlenia. Kadr przycina powiekszenie, wiec sasiednie pozycje
 * nie drgaja. */
#content .sortItem__media > a {
    overflow: hidden;
    border-radius: 3px;
}

#content .sortItem__media > a > img {
    transition: transform 180ms ease, box-shadow 180ms ease;
}

#content .sortItem:hover .sortItem__media > a > img {
    transform: scale(1.02);
    box-shadow: 0 2px 10px rgba(0, 0, 0, 0.10);
}

/* Tylko zdjecie produktu, ktore szablon wstawia w <a>.
 * Plakietki bestseller/premiumline sa rodzenstwem tego <a>, maja
 * width="40" i position:absolute (include/tabs/sortiment.css) - regula
 * "width:100%" na wszystkich obrazkach w kolumnie rozdymala je
 * do pelnej szerokosci. */
#content .sortItem__media > a > img { display: block; }

/* naklejki bestseller / premiumline pozycjonowane sa absolutnie
   wzgledem kolumny obrazka - stad position:relative wyzej */

/* =====================================================================
 * ZNACZNIK "GEKAUFT" (produkt juz kupiony)
 *
 * Bylo (do 2026-08-18): mala pigulka 10px na polprzezroczystym bordzie
 * rgba(90,12,12,.88) w prawym gornym rogu kadru. Klienci jej NIE ZAUWAZALI
 * - ciemna czerwien na ciemnym zdjeciu modelu nie odcina sie od tla,
 * a gorny rog to miejsce, w ktore wzrok przy czytaniu listy nie zaglada.
 *
 * Jest: PELNY PASEK przyklejony do DOLNEJ krawedzi zdjecia. Zajmuje cala
 * szerokosc kadru, wiec ma stala, przewidywalna pozycje niezalezna od
 * tresci zdjecia, a dol kadru to zwykle podloze/cien - nie zaslania modelu
 * (ten stoi na srodku). Kolor pelny #c62828, bez przezroczystosci, ten sam
 * odcien co znacznik z css/style_new.css uzywany na pozostalych stronach.
 *
 * Ten sam pasek dostaje KARTA PRODUKTU (program_detail_new.php, .ArtThumb).
 * Siedziala tam wstazka /img/misc/gekauft_180.png z 2012 roku - inny ksztalt,
 * inny odcien i inne miejsce niz na listach, wiec klient widzial dwa rozne
 * oznaczenia tego samego stanu. Arkusz jest wczytywany na kazdej stronie
 * (index.php, poza pakietem dist/sklep.css), wiec karta go widzi.
 *
 * Rog LEWY/PRAWY nie gra juz roli, bo pasek idzie przez cala szerokosc.
 * Naklejki bestseller i premiumline sa przyklejone do GORNEJ krawedzi
 * (include/tabs/sortiment.css, top:-4px), wiec sie nie nakladaja.
 *
 * Regula musi byc wyzej specyficzna niz ta z style_new.css (jedna klasa),
 * stad zakotwiczenie w #content .sortItem / #content .sortTile.
 * ===================================================================== */

/* Kadr zdjecia staje sie ukladem odniesienia dla paska.
 *
 * WAZNE: bez tego pasek liczylby "dol" od .sortItem__media, ktore siega
 * PONIZEJ zdjecia - pod kadrem stoi jeszcze pasek miniatur (.sortItem__thumbs).
 * Pasek "GEKAUFT" wyladowalby wtedy pod miniaturami zamiast na zdjeciu.
 * Przy okazji overflow:hidden kadru zaczyna go przycinac, wiec zaokraglone
 * rogi ramki obcinaja pasek rowno. */
#content .sortItem__media > a,
#content .sortTile__media > a { position: relative; }

#content .sortItem .gekauft,
#content .sortTile .gekauft,
#content .ArtThumb .gekauft {
    position: absolute;
    right: 0;
    bottom: 0;
    left: 0;
    top: auto;
    z-index: 2;
    display: block;
    box-sizing: border-box;
    width: auto;
    margin: 0;
    padding: 4px 6px;
    border: 0;
    border-radius: 0;
    background: #c62828;
    color: #fff;
    font-family: Arial, Helvetica, sans-serif;
    font-size: 12px;
    font-weight: bold;
    line-height: 1.25;
    letter-spacing: 0.08em;
    text-align: center;
    text-transform: uppercase;
    white-space: nowrap;
    overflow: hidden;
    /* cien odcina pasek od jasnego zdjecia - bez niego bialy piasek albo
     * niebo pod spodem zlewaly sie z krawedzia */
    box-shadow: 0 -2px 6px rgba(0, 0, 0, 0.30);
}

/* Ptaszek przed napisem. Zapisany escape'em CSS (U+2713), zeby plik
 * zostal czystym ASCII - strony sklepu ida w ISO-8859-1 i realny znak
 * UTF-8 wpisany tutaj wyszedlby jako krzaki. */
#content .sortItem .gekauft:before,
#content .sortTile .gekauft:before,
#content .ArtThumb .gekauft:before { content: "\2713\00a0"; font-weight: bold; }

/* --- karta produktu: ten sam pasek, wieksza skala ---
 *
 * Zdjecie na karcie ma 320px szerokosci (listy: 190px), wiec napis 12px
 * wygladalby na nim na zgubiony. Kadrem jest <div style="position:relative">,
 * ktory program_detail_new.php drukuje wokol kazdego z wariantow zdjecia
 * (m_pic1..m_pic5, przelaczanych skryptem).
 */
#content .ArtThumb td > div {
    /* inline-block, nie blok: kadr ma sie zwezic DO ZDJECIA. Jako blok
     * rozciagal sie na cala szerokosc komorki tabeli, ktora bywa szersza
     * niz zdjecie - pasek wystawal wtedy poza obrazek na biale tlo. */
    display: inline-block;
    /* <a> ze zdjeciem jest elementem liniowym, wiec pod obrazkiem zostawal
     * kilkupikselowy pas na "ogonki" liter. Pasek przyklejony do bottom:0
     * wisial przez to PONIZEJ zdjecia. */
    line-height: 0;
}

#content .ArtThumb .gekauft {
    padding: 6px 8px;
    font-size: 14px;
    line-height: 1.2;
}

/* =====================================================================
 * PRZYCISKI "DOWNLOAD" I "PROBIEREN" - wyrownanie do reszty przyciskow
 *
 * showDownloadButton() i showInfoAndButtons() w includes/functions/products.inc.php
 * maja galaz drukujaca te dwa przyciski jako <button class="download-button">,
 * a wszystkie sasiednie akcje jako <a class="button_style_5 Btn">.
 *
 * UWAGA - ta galaz jest DZIS NIEOSIAGALNA. Wlacza ja $SP_NEW_DOWNLOAD, a
 * includes/config.php ustawia ja tylko w warunku
 * if($_SERVER['REMOTE_ADDR']=='109.207.102.532') - "532" nie jest poprawnym
 * oktetem, wiec warunek nigdy nie jest prawdziwy i w praktyce oba przyciski
 * wychodza jako <a>. Regula zostaje jako zabezpieczenie na wypadek wlaczenia
 * flagi; sama z siebie niczego dzis nie zmienia.
 *
 * Reguly z css/style_new.css nie moga ich zlapac, bo sa zapisane jako
 * .button_style_5:link / .Btn:link - pseudoklasa :link pasuje WYLACZNIE do
 * odnosnika z href. Przycisk <button> zostawal wiec surowy, szary, w
 * czcionce systemowej i o innej wysokosci niz sasiedzi - stad "nierowny".
 * Dopisanie mu klas nic by nie dalo, z tego samego powodu.
 *
 * Ponizej powtorzony wyglad sasiada (tlo #4E5461, bialy tekst, padding
 * 6px 15px, margines 5px) plus wyzerowanie tego, co przegladarka narzuca
 * elementowi <button>.
 *
 * Rozmiar pisma to 12px, a NIE 13.3333px z .button_style_5. Odnosniki
 * dostaja go z reguly "#content a:link, #content a:visited { font-size:9pt }"
 * (css/style_new.css) - identyfikator w selektorze bije dwie klasy, wiec
 * to ona rozstrzyga. Przycisk <button> nie jest odnosnikiem i ta regula go
 * nie dotyczy; bez jawnego 12px byl o 0.7px wyzszy od sasiadow.
 *
 * Strony z wlasnym wygladem tego przycisku - "Meine gekauften Modelle"
 * (css/meine-modelle.css) i strona pobierania (css/strona-pobierania.css) -
 * maja selektory bardziej szczegolowe i wygrywaja; marginesu obie zeruja
 * u siebie, zeby ta regula ich nie ruszyla.
 *
 * Dlaczego w TYM arkuszu: css/sortiment.css index.php wczytuje na kazdej
 * stronie i jest POZA pakietem dist/sklep.css, wiec zmiana nie wymaga
 * przebudowy pakietu ani wdrazania go razem ze znacznikami.
 * ===================================================================== */
#content button.download-button {
    display: inline-block;
    box-sizing: border-box;
    max-width: 250px;
    margin: 5px;
    padding: 6px 15px;
    border: 1px solid #CCCCCC;
    border-radius: 0;
    background: #4E5461;
    color: #FFF;
    /* skrot font ustawia takze line-height na "normal" - dokladnie tak,
       jak wychodzi u sasiedniego odnosnika */
    font: 12px Arial, Helvetica, sans-serif;
    letter-spacing: normal;
    word-spacing: normal;
    text-align: center;
    text-indent: 0;
    text-shadow: none;
    text-transform: none;
    /* <button> dziedziczy wyglad kontrolki systemowej - bez tego w czesci
     * przegladarek zostaje zaokraglenie i gradient spod naszego tla */
    -webkit-appearance: none;
    -moz-appearance: none;
    appearance: none;
    cursor: pointer;
}

#content button.download-button:hover {
    border: 1px solid #ADADAD;
    background: #6d0019;
    color: #FFF;
}

/* =====================================================================
 * PRZYCISKI AKCJI NA KARCIE PRODUKTU
 *
 * Objaw: przyciski stoja nierowno. Dla artykulu juz kupionego karta pokazuje
 * TRZY grupy i kazda byla wyrownana inaczej:
 *   - ikony (Wunschzettel, Artikel empfehlen) - <span style="float:left">
 *   - "Download"  - <div style="clear:both; text-align:right">
 *   - "Probieren" - <div style="clear:both; text-align:left; margin-top:10px">
 * (znaczniki: showInfoAndButtons w includes/functions/products.inc.php).
 * clear:both lamalo kazda grupe do wlasnego wiersza, a przeciwne text-align
 * rozrzucalo je na obie strony kolumny.
 *
 * Tu: oba przyciski trzymaja WSPOLNA prawa krawedz - te sama, co cena nad
 * nimi - i maja rowna szerokosc, wiec tworza jedna kolumne. Ikony zostaja
 * po lewej, bo to akcje drugoplanowe.
 *
 * Uchwytem jest klasa kartaAkcje na komorce, ktora program_detail_new.php
 * drukuje wokol wyniku showInfoAndButtons (dwa miejsca: glowna karta
 * i ramka artykulow dodatkowych). Reguly celuja WYLACZNIE w ta komorke,
 * wiec listy sortymentu (.sortItem__actions, uklad elastyczny) zostaja
 * nietkniete.
 *
 * !important jest tu konieczne: text-align, clear i margin-top siedza
 * w atrybutach style= poszczegolnych <div>, a atrybut bije arkusz.
 * ===================================================================== */
#content td.kartaAkcje > div {
    clear: none !important;
    display: inline-block;
    vertical-align: middle;
    margin-top: 0 !important;
    text-align: right !important;
}

/* Rowna szerokosc obu przyciskow. "Download" jest szerszy od "Probieren"
 * o ikone strzalki (padding-left 34px z reguly a[id^="downlButton_"] nizej),
 * wiec bez tego jeden wystawalby spod drugiego. */
#content td.kartaAkcje > div > a {
    box-sizing: border-box;
    min-width: 150px;
}

/* =====================================================================
 * PASEK MINIATUR DODATKOWYCH ZDJEC
 *
 * Znaczniki generuje SP_ListaMiniatur (includes/functions/products.inc.php):
 *   .sortItem__thumbs > button.sortItem__thumb > img
 * Pasek siedzi w kolumnie obrazka, POD zdjeciem glownym. Skrypt dopina
 * klase is-active do miniatury aktualnie pokazanej w duzym kadrze.
 *
 * Naklejek bestseller/premiumline pasek nie dotyka - one sa przyklejone
 * do gornej krawedzi kolumny (top:-4px), a pasek wisi pod zdjeciem.
 * ===================================================================== */
#content .sortItem__thumbs {
    display: flex;
    /* BEZ zawijania: miniatury dziela miedzy siebie dokladnie szerokosc
     * kadru wyzej, wiec ostatnia konczy sie rowno z prawa krawedzia
     * zdjecia glownego. Przy sztywnych 38px pasek konczyl sie 26px przed
     * krawedzia i kolumna wygladala na krzywo.
     * Poziomy pasek przewijania w tak waskim slupku bylby nie do trafienia
     * mysza, a na dotyku kradlby gest przewijania listy - stad nowrap
     * i dzielenie szerokosci zamiast przewijania. */
    flex-wrap: nowrap;
    gap: 4px;
    margin-top: 6px;
}

/* Zerowanie domyslnego wygladu <button>. Bez tego przegladarka doklada
 * wlasne tlo, ramke 3D i padding - miniatura przestaje byc kwadratem
 * i pasek rozjezdza sie na kazdej przegladarce inaczej.
 * -webkit-appearance:none zdejmuje natywny wyglad przycisku w Safari/iOS,
 * gdzie sam reset tla i ramki nie wystarcza. */
#content .sortItem__thumb {
    box-sizing: border-box;
    display: block;
    /* rowny podzial szerokosci kolumny; min-width:0 jest konieczne,
     * bo domyslnie element flex nie kurczy sie ponizej swojej tresci */
    flex: 1 1 0;
    min-width: 0;
    width: auto;
    height: 36px;
    padding: 0;
    border: 1px solid #d9d9d9;
    border-radius: 2px;
    background: none;
    /* zabezpieczenie dla przegladarek bez object-fit: nieprzyciety
     * obrazek zostaje w kwadracie zamiast rozpychac pasek */
    overflow: hidden;
    cursor: pointer;
    -webkit-appearance: none;
    appearance: none;
    transition: border-color 140ms ease;
}

/* Kadr wypelnia caly kwadrat. Regula z sekcji wyzej celuje w
 * ".sortItem__media > a > img", wiec zdjecia w przyciskach sa poza nia
 * i musza dostac wlasne wymiary. */
#content .sortItem__thumb img {
    display: block;
    width: 100%;
    height: 100%;
    margin: 0;
    border: 0;
    object-fit: cover;
}

/* Najechanie i miniatura przypieta - ta sama ramka w kolorze akcentu.
 * Zmienia sie WYLACZNIE kolor ramki (nie jej grubosc), zeby kwadrat
 * nie drgal i nie przesuwal sasiednich miniatur. */
#content .sortItem__thumb:hover,
#content .sortItem__thumb.is-active {
    border-color: #4E5461;
}

/* =====================================================================
 * KOLUMNA TRESCI
 * ===================================================================== */
#content .sortItem__body {
    flex: 1 1 260px;
    min-width: 0;
    display: flex;
    flex-wrap: wrap;
    gap: 4px 14px;
}

#content .sortItem__title {
    flex: 1 1 100%;
    margin: 0 0 2px;
}

/* Nazwa produktu - 15 px zamiast 14. Najwazniejszy tekst pozycji nie moze byc
   tylko o 1 px wiekszy od danych technicznych pod nim; po podniesieniu tamtych
   do 13 px roznica bylaby zadna.
   KOLORU tu nie ustawiamy: style_new.css ma ".HeaderProduct:link { color:#333
   !important }" i kazda wartosc podana tutaj i tak zostalaby zignorowana.
   #333 daje 12,6:1, wiec nie ma o co walczyc - a dopisywanie drugiego
   !important tylko po to, zeby zmienic odcien o wlos, zostawiloby po sobie
   gorszy balagan niz ten jeden px roznicy. */
#content .sortItem__title a,
#content a.HeaderProduct {
    font-size: 15px;
    font-weight: bold;
    text-decoration: none;
    line-height: 1.3;
}

#content .sortItem__title a:hover,
#content a.HeaderProduct:hover { text-decoration: underline; }

/* --- ocena produktu ---
 * Ocena stala wczesniej POD MINIATURA. Gwiazdki maja w votes/votes.css
 * sztywne width:72px, licznik ok. 31px - razem ponad 105px, a kolumna
 * miniatury ma na telefonie mniej. Blok wychodzil poza kolumne i nachodzil
 * na dane produktu. Dlatego ocena jest teraz w kolumnie tresci, w osobnym
 * wierszu pod tytulem - tam ma cala szerokosc pozycji.
 *
 * votes/votes.css ustawia obie plakietki na float:right z marginesami
 * dobranymi pod stary uklad oparty na floatach - kasujemy to.
 * Ruszamy WYLACZNIE te dwa elementy. Pierwsza proba ustawiala display:flex
 * na wszystkich dzieciach .votes - i ujawnila ukryty panel ze szczegolowa
 * ocena ("Vorbild im Gesamteindruck"), ktory nachodzil na tekst pozycji. */
#content .sortItem__vote {
    flex: 1 1 100%;
    margin: 1px 0 3px;
    line-height: 1;
}

/* Produkt bez glosow nie ma podsumowania - wtedy zostaje samo opakowanie
 * z ukrytym panelem, ktore nie ma powodu zajmowac wiersza. */
#content .sortItem__vote .votes:not(:has(.rateSum)) { display: none; }

/* Kontenerem jest znacznik aggregateRating, bo to on bezposrednio zawiera
 * obie plakietki. Ukryte znaczniki schema.org maja display:none w atrybucie
 * style, wiec pozostaja ukryte mimo ustawienia kontenera na flex. */
#content .sortItem__vote [itemprop="aggregateRating"] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 5px;
}

#content .sortItem__vote .VoteStarsSuma,
#content .sortItem__vote .VoteCountSuma {
    float: none;
    flex: 0 0 auto;
    margin: 0;
    top: auto;
    right: auto;
}

/* gwiazdki przed licznikiem - w znacznikach licznik jest pierwszy */
#content .sortItem__vote .VoteStarsSuma { order: 1; }
#content .sortItem__vote .VoteCountSuma { order: 2; }

/* --- dane produktu --- */
/* =====================================================================
 * CZYTELNOSC DANYCH PRODUKTU - ZMIANA Z 2026-08-07
 *
 * Bylo 11 px. To najgestszy blok tekstu na liscie (numer zamowienia, autor,
 * data udostepnienia, rozmiar pliku) i jednoczesnie najdrobniejszy - a niesie
 * dane, ktore klient faktycznie porownuje miedzy pozycjami. 13 px czyta sie
 * bez wytezania wzroku, a wysokosc wiersza listy rosnie o kilka pikseli.
 *
 * Kolor #565959 zamiast #666: 7,1:1 zamiast 5,7:1. Oba mieszcza sie w normie,
 * ale przy tak drobnym tekscie zapas jest wart tej jednej cyfry - i jest to
 * ten sam odcien, co w cenowce, wiec karta ma jedna szarosc zamiast trzech.
 * ===================================================================== */
#content .sortItem__meta {
    flex: 1 1 200px;
    min-width: 0;
    font-size: 13px;
    line-height: 1.6;
    color: #565959;
}

#content .sortItem__meta > div { min-width: 0; overflow-wrap: break-word; }

/* Adnotacja "Fuer aktuelle Version ab EEP N".
 *
 * W kodzie PHP siedzi ona w <font color='red'>, powtorzonym w kilkunastu
 * miejscach products.inc.php (po jednym na wersje EEP). Czysta czerwien daje
 * na bieli 4,0:1 - ponizej normy 4,5:1 dla drobnego tekstu. Zamiast przepisywac
 * kilkanascie linii PHP, nadpisujemy kolor tutaj: firmowe #960001 daje 9,1:1
 * i jest to ta sama czerwien, ktorej sklep uzywa do obnizek, wiec strona ma
 * jeden czerwony, a nie dwa podobne.
 *
 * Selektor po atrybucie, bo znacznik <font> nie ma klasy. */
#content .sortItem__meta font[color="red"],
#content .sortTile__meta font[color="red"] {
    color: #960001;
    font-weight: bold;
}

/* --- cena --- */
#content .sortItem__price {
    flex: 0 0 auto;
    margin-left: auto;
    text-align: right;
    white-space: nowrap;
}

/* Wyglad samej ceny definiuje css/cena.css - tu tylko rozmiar dopasowany
 * do kolumny listy. Klasy .preis i .preis_start zniknely z wyjscia razem
 * z przebudowa SHOWPREIS(). */
/* Kwota jest na liscie zakupowej informacja pierwszego rzedu - ma sie
   czytac bez skupiania wzroku. Grosze i waluta sa w cena.css podane w em
   (0.5em i 0.6em), wiec skaluja sie razem z ta wartoscia same. */
#content .sortItem__price .cena { font-size: 32px; }

/* Odstep kwoty od prawej krawedzi pozycji.
 *
 * Cena konczyla sie 6px od krawedzi (samo padding pozycji), a przycisk pod
 * nia stoi 11px - 6px paddingu plus wlasny margines 5px z button_style_5.
 * Kwota byla wiec i ciasno przy brzegu, i nie w jednej linii pionowej
 * z przyciskiem. Te 5px wyrownuje oba do wspolnej prawej krawedzi. */
#content .sortItem__price { padding-right: 5px; box-sizing: border-box; }

/* NOTA O VAT NIE MOZE DECYDOWAC O SZEROKOSCI KOLUMNY CENY (2026-08-08).
 *
 * Objaw: w wersji ANGIELSKIEJ cala cenowka spadala pod dane produktu,
 * zamiast stac po ich prawej. Po niemiecku bylo dobrze - i dlatego bledu
 * nie widac, dopoki sie nie przelaczy jezyka.
 *
 * Przyczyna: kolumna ceny jest "flex: 0 0 auto", wiec jej szerokosc bazowa
 * to max-content - czyli szerokosc NAJSZERSZEGO potomka. Najszerszy nie jest
 * tu wcale kwota (88px), tylko nota o VAT: dziedziczy z tej kolumny
 * "white-space: nowrap" i liczy sie jako jedna dluga linia. A nota idzie
 * z tab_sprache ($v_incl_mwst), wiec jej dlugosc zalezy od jezyka. Zmierzone
 * na /1035-eep-locomotives szerokosci CALEJ kolumny ceny:
 *
 *   DE "Preis incl. der geltenden MwSt."             -> 157px
 *   FR "Le prix incluent la TVA applicable."         -> 169px
 *   EN "Price is displayed incl. any applicable VAT" -> 209px
 *
 * Wiersz ma 200px bazy danych produktu + 14px odstepu, a kolumna tresci
 * najwyzej 400px - czyli na cene zostaje 186px. Niemiecki miescil sie z
 * zapasem 29px, francuski lamal sie ponizej okna ~1030px, a angielski nie
 * miescil sie NIGDY, przy zadnej szerokosci okna.
 *
 * Zapas nie moze zalezec od tlumaczenia, dlatego nota lamie sie teraz jak
 * zwykly tekst i dostaje sztywny sufit szerokosci. Kolumna ceny ma odtad
 * 145px w KAZDYM jezyku, z zapasem 41px. Nota schodzi do dwoch linii we
 * wszystkich trzech jezykach (to tekst drugoplanowy - moze), a nowe
 * tlumaczenie dowolnej dlugosci najwyzej doda kolejna linie; ukladu wiersza
 * juz nie ruszy.
 *
 * Znacznik sklada products.inc.php (~1850) jako <div class="cenaVat">.
 * Wariant po atrybucie stylu jest w selektorze dla starszych odslon tego
 * kodu - do 2026-08-07 nota szla jako <div style="...font-size:9px">, a
 * dev potrafi sie na taka wersje cofnac. Uwaga na rozroznienie: koloru i
 * rozmiaru arkusz w tamtym wariancie nadpisac NIE MOZE (styl w atrybucie
 * wygrywa), ale white-space i max-width w atrybucie nie wystepuja i dzialaja
 * normalnie. */
#content .sortItem__price > .cenaVat,
#content .sortItem__price > div[style*="font-size:9px"] {
    white-space: normal;
    max-width: 140px;
    /* blok wezszy od kolumny stanalby przy jej LEWEJ krawedzi - kwota
       i przycisk koszyka sa przy prawej, wiec nota ma isc za nimi */
    margin-left: auto;
}

/* =====================================================================
 * AKCJE
 * ===================================================================== */
#content .sortItem__actions {
    flex: 1 1 100%;
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: flex-end;
    gap: 6px;
    margin-top: 2px;
}

/* ikona listy zyczen / obserwowanych ma zostac po lewej */
#content .sortItem__actions > span:first-child { margin-right: auto; }

/* Przyciski w rzedzie akcji stoja na jednej wysokosci.
 *
 * Objaw: na liscie "Probieren" siedzialo 5px nizej niz "Download".
 *
 * Przyczyna: showInfoAndButtons (includes/functions/products.inc.php) daje
 * kazdemu przyciskowi wlasne opakowanie <div>, a opakowaniu "Probieren"
 * dopisuje w atrybucie style= margin-top:10px. Oba <div> sa elementami
 * elastycznymi tego rzedu, wiec ten margines po prostu spycha jeden nizej.
 * Same przyciski sa identyczne - zmierzone po 28px wysokosci i 12px pisma;
 * roznily sie tylko polozeniem.
 *
 * !important, bo margines siedzi w atrybucie style=, a ten bije arkusz.
 * align-items:center wyzej dorownuje reszte.
 *
 * Kafelka (.sortTile__actions) to NIE dotyczy - tam przyciski stoja jeden
 * pod drugim na pelnej szerokosci i ten odstep jest na miejscu. */
#content .sortItem__actions > div { margin-top: 0 !important; }

/* Wspolny kafelek dla wszystkich ikon pozycji: przycisku listy zyczen
 * i plakietki "edytowalne napisy". Wczesniej plakietka byla golym obrazkiem
 * 25px, a przycisk obrazkiem 20px w ramce - stad wrazenie dwoch roznych
 * zestawow ikon. Teraz oba maja to samo pudelko 32x32 i ten sam rysunek
 * 18px w srodku; rozni je tylko to, ze w przycisk da sie kliknac. */
#content .itemIco {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    box-sizing: border-box;
    width: 32px;
    height: 32px;
    padding: 0;
    border: 1px solid #e0e0e0;
    border-radius: 3px;
    background: #fff;
    text-decoration: none;
    vertical-align: middle;
}

#content .itemIco img { display: block; width: 18px; height: 18px; margin: 0; border: 0; }

/* plakietka informacyjna - nie jest klikalna */
#content .itemIco--info { background: #fafafa; border-color: #ececec; cursor: default; }

/* przycisk listy zyczen */
#content a.itemIco--btn { transition: border-color 140ms ease, background-color 140ms ease; }
#content a.itemIco--btn:hover { border-color: #c9a0a0; background: #fdf6f6; }

/* ---------------------------------------------------------------------
 * RAMKA WARUNKU ZAKUPU ("Setzt voraus den Kauf ...")
 *
 * Znaczniki (includes/functions/products.inc.php):
 *   <div class="ramkaUwaga">
 *     <img class="ramkaUwaga__ico" ...><span class="ramkaUwaga__txt">...</span>
 *   </div>
 * Wariant .ramkaUwaga--cena niesie informacje o nizszej cenie.
 *
 * Ramka lezy w .sortItem__actions, ktory ma justify-content:flex-end.
 * Bez flex:1 1 100% zachowywalaby sie jak kolejny przycisk i zostala
 * dosunieta do prawej krawedzi pozycji.
 *
 * order:-1 jest tu dlatego, ze ramka to INFORMACJA O WARUNKU ZAKUPU,
 * a nie kolejny przycisk - ma stac NAD calym rzedem przyciskow. PHP
 * sklada ja razem z przyciskami, wiec w znacznikach potrafi wypasc
 * miedzy nimi; order wyciaga ja na wlasny wiersz na gorze.
 *
 * width:100% nadpisuje width:130px z css/style_new.css i css/style2.css -
 * tamta sztywna szerokosc jest z ramki w koszyku i tu ucinala tekst.
 * --------------------------------------------------------------------- */
#content .sortItem .ramkaUwaga {
    box-sizing: border-box;
    flex: 1 1 100%;
    order: -1;
    width: 100%;
    /* Ikona i tekst jako DWIE KOLUMNY. Poprzednia wersja miala na obrazku
     * align="absmiddle" - tekst oplywal ikone schodkowo i druga linia
     * wracala pod nia. Flex daje tekstowi wlasna, rowna kolumne. */
    display: flex;
    align-items: flex-start;
    gap: 8px;
    margin: 0 0 4px;
    padding: 9px 11px;
    border: 1px solid #e2d4b7;
    border-radius: 3px;
    background: #fdf9ef;
    font-size: 12px;
    line-height: 1.45;
    color: #6b5a2e;
    text-align: left;
}

/* Ikona trzyma swoj rozmiar - flex:0 0 auto, bo domyslne flex-shrink:1
 * zgniotloby ja w pasek, gdy lista numerow artykulow jest dluga. */
#content .sortItem .ramkaUwaga__ico {
    flex: 0 0 auto;
    display: block;
    width: 22px;
    height: 22px;
    margin: 0;
    border: 0;
}

/* Ten sam bezpiecznik dla obrazka BEZ klasy. Panele autorow i anlagenbauer
 * (showInfoAndButtons_AUTOREN / _ANLAGEN w products.inc.php) skladaja ramke
 * po staremu, samym <img align="absmiddle">. Kiedy ich wynik trafi w
 * .sortItem, ramka i tak dostaje display:flex z reguly wyzej - bez tego
 * ikona jako element flex zostalaby sciesniona przez dlugi tekst. */
#content .sortItem .ramkaUwaga > img { flex: 0 0 auto; }

/* min-width:0 zdejmuje domyslne min-width:auto elementu flex - bez tego
 * dlugi, nielamliwy numer artykulu rozpycha ramke poza szerokosc pozycji
 * zamiast sie zlamac. */
#content .sortItem .ramkaUwaga__txt {
    flex: 1 1 auto;
    min-width: 0;
    overflow-wrap: break-word;
    word-wrap: break-word;
}

/* Wariant "nizsza cena" - to nie ostrzezenie, tylko dobra wiadomosc,
 * wiec chlodna zielen zamiast piaskowego zoltego ostrzezenia. */
#content .sortItem .ramkaUwaga--cena {
    border-color: #cfe0d6;
    background: #f4f9f6;
    color: #3f5b49;
}

/* Numery artykulow. Legacy .SP_Link_1 ma na kazdym stanie #069 z twardym
 * podkresleniem - w kolorowej ramce robilo to trzeci kolor w jednym
 * zdaniu. Zostaje akcent arkusza, podkreslenie wchodzi na najechanie.
 * overflow-wrap powtorzone na linku, bo numery bywaja podane ciagiem
 * ("V10NMS70011 und V10NMS70012 und ...") i musza sie lamac. */
#content .sortItem .ramkaUwaga a.SP_Link_1,
#content .sortItem .ramkaUwaga a.SP_Link_1:link,
#content .sortItem .ramkaUwaga a.SP_Link_1:visited {
    color: #4E5461;
    font-weight: bold;
    text-decoration: none;
    overflow-wrap: break-word;
    word-wrap: break-word;
}

#content .sortItem .ramkaUwaga a.SP_Link_1:hover,
#content .sortItem .ramkaUwaga a.SP_Link_1:active {
    color: #4E5461;
    text-decoration: underline;
}

/* =====================================================================
 * STRONICOWANIE
 *
 * CELOWO BEZ REGUL. Paginacja ma juz komplet stylow w
 * include/tabs/sortiment.css (.Paging, .pagingNumer, .pagingNumerActive).
 * Dolozenie tu wlasnych regul zakotwiczonych w #content dawalo im wyzsza
 * specyficznosc i rozjezdzalo stronicowanie na wszystkich listach - mimo
 * ze tamten arkusz laduje sie pozniej.
 * ===================================================================== */

/* =====================================================================
 * NAGLOWEK LISTY (uzywany przez liste zyczen)
 * ===================================================================== */
#content .sortHead {
    background: #5b5b5b;
    color: #fff;
    font-size: 14px;
    font-weight: bold;
    font-family: Arial, Helvetica, sans-serif;
    padding: 7px 10px;
    border-radius: 2px 2px 0 0;
}

#content .sortHead span { font-weight: normal; font-size: 12px; opacity: 0.85; }

#content .sortBody {
    box-sizing: border-box;
    border: 1px solid #d9d9d9;
    border-top: 0;
    border-radius: 0 0 2px 2px;
    padding: 4px 10px 10px;
}

/* =====================================================================
 * WIDOK KAFELKOWY ("trzy w rzedzie")
 *
 * Szablon: templates/sortiment/sortimentItem_vertical.html
 * Kontener <div class="sortGrid"> otwiera shop_sortiment_all.php wokol petli.
 *
 * Bylo: kafelki plywaly (float:left, sztywne 170px), a rzedy dzielil licznik
 * wstawiajacy co trzeci element rozdzielacz clear:both. Kafelki w rzedzie
 * mialy przez to rozne wysokosci, tytul byl przycinany na sztywno w polowie
 * wyrazu, a ocena lezala na zdjeciu.
 *
 * Siatka CSS wyrownuje wysokosci w rzedzie sama, a auto-fill dobiera liczbe
 * kolumn do szerokosci - na telefonie wychodza dwie zamiast sztywnych trzech.
 * ===================================================================== */
#content .sortGrid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(190px, 1fr));
    gap: 10px;
    align-items: stretch;
}

#content .sortGrid .sortItem { display: none; }   /* zabezpieczenie na wypadek zmieszania szablonow */

#content .sortTile {
    display: flex;
    flex-direction: column;
    box-sizing: border-box;
    padding: 10px;
    border: 1px solid #e6e6e6;
    border-radius: 3px;
    background: #fff;
    font-family: Arial, Helvetica, sans-serif;
    transition: border-color 140ms ease, box-shadow 140ms ease;
}

#content .sortTile:hover {
    border-color: #cfd2dd;
    box-shadow: 0 2px 12px rgba(0, 0, 0, 0.08);
}

/* --- zdjecie: staly kadr, zeby kafelki nie skakaly --- */
#content .sortTile__media {
    position: relative;
    margin: 0 0 8px;
}

#content .sortTile__media > a {
    display: block;
    height: 130px;
    overflow: hidden;
    border-radius: 2px;
    background: #f7f7f8;
    border: 1px solid #ececec;
}

#content .sortTile__media > a > img {
    display: block;
    width: 100%;
    height: 100%;
    /* cover jak na liscie - kadr wypelniony, bez pustych pasow */
    object-fit: cover;
    border: 0;
}

/* --- ocena POD zdjeciem, nie na nim --- */
#content .sortTile__vote { min-height: 18px; margin: 0 0 4px; }

/* --- tytul: dokladnie dwie linie, lamane po wyrazach --- */
#content .sortTile__title { margin: 0 0 6px; }

#content .sortTile__title a {
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
    font-size: 13px;
    font-weight: bold;
    line-height: 1.35;
    color: #222;
    text-decoration: none;
    overflow-wrap: break-word;
}

#content .sortTile__title a:hover { text-decoration: underline; }

#content .sortTile__ico:empty { display: none; }
#content .sortTile__ico { margin: 0 0 6px; }

/* Cena dosunieta do dolu kafelka: margin-top:auto zjada wolna przestrzen,
   dzieki czemu ceny i przyciski stoja w rzedzie na tej samej wysokosci
   niezaleznie od dlugosci tytulu. */
#content .sortTile__price {
    margin-top: auto;
    padding-top: 6px;
    text-align: right;
}

/* W kafelku kwota stoi pod tytulem i konkuruje z nim o uwage - stad
   mniejsza niz na liscie, ale i tak podniesiona z 22px. */
#content .sortTile__price .cena { font-size: 28px; }

#content .sortTile__actions {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 6px;
    margin-top: 8px;
}

/* glowny przycisk zajmuje cala szerokosc kafelka */
#content .sortTile__actions a:not(.itemIco),
#content .sortTile__actions button.download-button {
    flex: 1 1 100%;
    box-sizing: border-box;
    text-align: center;
}

/* Sam powyzszy zapis NIE wystarcza. Przycisk glowny ("Download",
 * "In den Einkaufswagen") jest wypisywany w opakowaniu:
 *     <div style="margin-left:0px; text-align:right;"><a class="Btn">...</a></div>
 * czyli elementem elastycznym jest ten <div>, a nie link - flex na linku
 * nie ma na czym zadzialac i przycisk zostawal szerokosci swojego tekstu.
 * Rozciagamy wiec opakowanie, a link w srodku dostaje pelna szerokosc.
 *
 * Ikony siedza w <span style="float:left"> - w kontenerze elastycznym float
 * jest pomijany, wiec span zachowuje sie poprawnie sam z siebie; pilnujemy
 * tylko, zeby sie nie kurczyl. */
#content .sortTile__actions > span {
    flex: 0 0 auto;
}

#content .sortTile__actions > div {
    flex: 1 1 100%;
    min-width: 0;
}

#content .sortTile__actions > div > a {
    display: block;
    width: 100%;
    box-sizing: border-box;
    text-align: center;
}

/* <br/> po przycisku bylby w kontenerze elastycznym osobnym elementem */
#content .sortTile__actions > div > br {
    display: none;
}

/* =====================================================================
 * REGULY RESPONSYWNE - CELOWO NA KONCU PLIKU
 * Viewport ma initial-scale=0.6, wiec telefon 390px renderuje uklad
 * ~650px. Dlatego prog to 700px, nie 480px.
 * ===================================================================== */
@media only screen and (max-width: 700px) {
    /* Obrazek i tresc zostaja OBOK SIEBIE.
     * Wczesniej kolumna tresci dostawala flex:1 1 100% i spadala pod
     * miniature - przy duzej czcionce jedna pozycja zajmowala pol ekranu
     * i lista wymagala mnostwa przewijania. */
    /* Odstep boczny wiekszy niz na desktopie, bo liczy sie przez skale 0.6:
     * 6px ukladu to na ekranie telefonu 3.6px - tresc praktycznie dotykala
     * krawedzi. 14px daje okolo 8.4px, a cena i przycisk (ktore maja jeszcze
     * wlasne 5px) stoja wtedy okolo 11px od brzegu. */
    #content .sortItem {
        gap: 10px;
        padding: 10px 14px;
        align-items: flex-start;
    }

    /* Zdjecie na telefonie.
     *
     * UWAGA na przelicznik: viewport ma initial-scale=0.6, wiec kazda wartosc
     * w pikselach ukladu jest na ekranie telefonu o 40% MNIEJSZA. Poprzednie
     * 140x104 to fizycznie okolo 84x62px - z modelu nie dalo sie nic odczytac,
     * a to zdjecie jest tu najwazniejsza informacja o towarze.
     * 200x150 daje na ekranie okolo 120x90px. */
    #content .sortItem__media { width: 200px; max-width: 46%; }

    /* kadr 16:10 do szerszej kolumny (200 / 1.6 = 125) */
    #content .sortItem__media > a { height: 125px; }

    /* Mniejsze miniatury: w kolumnie 140px cztery kwadraty po 38px
     * spadaly do drugiego rzedu i pozycja listy rosla o cala linie.
     * Po 30px mieszcza sie w jednym rzedzie i wysokosc pozycji zostaje. */
    #content .sortItem__thumbs { gap: 3px; margin-top: 5px; }
    /* szerokosc nadal dzielona po rowno - miniatury maja konczyc sie rowno
     * z kadrem takze na telefonie; zmienia sie tylko wysokosc */
    #content .sortItem__thumb { width: auto; height: 28px; }

    #content .sortItem__body {
        flex: 1 1 0;
        min-width: 0;
        gap: 2px 10px;
    }

    /* dane produktu ciasniej - to najdluzszy blok w pozycji. Ciasniej robi
       tu INTERLINIA, nie rozmiar liter: na telefonie czytelnosc jest jeszcze
       wazniejsza niz na pulpicie, wiec 13 px zostaje. */
    #content .sortItem__meta {
        flex: 1 1 100%;
        font-size: 13px;
        line-height: 1.45;
    }

    /* Cena we wlasnym wierszu (dane produktu zajmuja cala szerokosc), ale
     * wyrownana do PRAWEJ - laduje wtedy tuz nad przyciskiem koszyka, ktory
     * stoi przy prawej krawedzi. Przy wyrownaniu do lewej kwota uciekala na
     * przeciwlegly koniec pozycji i gubila zwiazek z przyciskiem.
     * Odstep od danych produktu - bez niego etykieta "Ihr Preis" kleila sie
     * do ostatniej linii bloku z numerem i rozmiarem pliku. */
    #content .sortItem__price {
        flex: 1 1 100%;
        margin-left: 0;
        text-align: right;
        margin-top: 8px;
    }

    #content .sortItem__price .cenaBox { text-align: right; }

    /* Cena po tym samym przeliczniku 0.6: 23px ukladu to na ekranie okolo
     * 14px, czyli mniej niz tekst opisu. Na liscie zakupowej kwota ma byc
     * odczytywalna bez skupiania wzroku. 34px daje okolo 20px na ekranie. */
    #content .sortItem__price .cena { font-size: 34px; }
    #content .sortItem__price .cena__gr { font-size: 19px; }
    #content .sortItem__price .cena__wal { font-size: 22px; }
    #content .sortItem__price .cenaBox__etykieta { font-size: 13px; }

    /* cena przekreslona i etykieta obnizki skaluja sie razem z kwota */
    #content .sortItem__price .cenaStara { font-size: 16px; }
    #content .sortItem__price .cenaBox__rabat { font-size: 14px; }

    /* nota o MwSt zabiera cala linie przy kazdej pozycji */
    #content .sortItem__price div[style*="font-size:9px"] { display: none; }

    /* =================================================================
     * CELE DOTYKOWE
     *
     * Przycisk koszyka mial 28px wysokosci. Viewport ma initial-scale=0.6,
     * wiec 28px ukladu to okolo 17px na ekranie telefonu - grubo ponizej
     * 44px, ktore przyjelo sie jako minimum dla palca. Trafienie wymagalo
     * celowania, a to jest GLOWNY przycisk zakupowy na liscie.
     * ================================================================= */
    #content .sortItem__actions a:not(.itemIco),
    #content .sortItem__actions button.download-button {
        box-sizing: border-box;
        min-height: 44px;
        display: inline-flex;
        align-items: center;
        justify-content: center;
        padding: 0 14px;
        font-size: 14px;
        line-height: 1.2;
    }

    #content .itemIco { width: 40px; height: 40px; }
    #content .itemIco img { width: 20px; height: 20px; }

    /* =================================================================
     * TYTUL - najwyzej dwie linie
     *
     * Nazwy produktow potrafia miec ponad 100 znakow ("Les Wagons Couvert
     * - Die gedeckten Gueterwagen - GABS 50 - SET 2 - OBB - ...") i zajmowaly
     * cztery linie, spychajac cene i przycisk pod krawedz ekranu. Pelna nazwa
     * zostaje w atrybucie title odnosnika i na karcie produktu.
     * ================================================================= */
    #content .sortItem__title a {
        display: -webkit-box;
        -webkit-line-clamp: 2;
        -webkit-box-orient: vertical;
        overflow: hidden;
    }

    /* =================================================================
     * MNIEJ DANYCH DRUGORZEDNYCH
     *
     * Na telefonie o zakupie decyduja zdjecie, nazwa, ocena, cena i wersja
     * EEP. Numer katalogowy, data udostepnienia i rozmiar pliku zajmowaly
     * trzy z osmiu linii pozycji, a sa potrzebne dopiero na karcie produktu.
     * Po ich ukryciu na ekran wchodzi okolo pieciu pozycji zamiast trzech.
     *
     * Wiersze maja WLASNE KLASY, a nie numery porzadkowe: szablon dla
     * artykulow darmowych nie zawiera wiersza z wersja EEP, wiec numeracja
     * jest w nim przesunieta i :nth-child ukrywalby nie te dane.
     * ================================================================= */
    #content .sortItem__meta .mNr,
    #content .sortItem__meta .mData,
    #content .sortItem__meta .mPlik { display: none; }

    /* Akcje pod calym blokiem, przycisk na pelna szerokosc.
     *
     * align-items:center jest tu konieczne: ikony siedza w <span>, a przycisk
     * w <div> o innej wysokosci (przycisk ma min-height 44px na palec, ikony
     * 40px). Bez wyrownania oba pudelka lezaly na roznej wysokosci - ikona
     * koszyka wypadala o kilka pikseli nizej niz reszta rzedu. */
    #content .sortItem__actions {
        justify-content: space-between;
        align-items: center;
        gap: 8px;
        margin-top: 6px;
    }

    /* oba pudelka rzedu maja te sama wysokosc, wiec nic sie nie przesuwa */
    #content .sortItem__actions > span,
    #content .sortItem__actions > div {
        display: flex;
        align-items: center;
        min-height: 44px;
    }

    #content .sortItem__actions a.button_style_5,
    #content .sortItem__actions button.download-button {
        flex: 1 1 auto;
        min-width: 0;
        text-align: center;
    }

    /* Ramka warunku zakupu ciasniej - na waskim ekranie zajmuje cala
     * szerokosc pozycji i przy desktopowych odstepach zjadala tyle
     * miejsca, co same przyciski. */
    #content .sortItem .ramkaUwaga {
        gap: 6px;
        margin-bottom: 3px;
        padding: 6px 8px;
        font-size: 11px;
    }

    #content .sortItem .ramkaUwaga__ico { width: 18px; height: 18px; }

}


/* =====================================================================
 * PRZYCISK POBIERANIA - ODROZNIONY OD KOSZYKA
 *
 * "Download" i "In den Einkaufswagen" to dwie rozne akcje, a wygladaly
 * identycznie - ten sam szary przycisk button_style_5. Pobranie dostaje
 * zielony akcent i strzalke, zeby dalo sie je rozroznic jednym spojrzeniem,
 * takze na liscie pelnej patchy i aktualizacji, gdzie wszystkie pozycje
 * maja cene 0,00 i tylko ten przycisk je rozniczkuje.
 *
 * Uchwytem jest przedrostek identyfikatora (id="downlButton_<ID>") nadawany
 * w products.inc.php - nie trzeba ruszac PHP.
 *
 * Zielen #2e7d32 jest juz uzywana w sklepie (okienko odstapienia), wiec nie
 * wprowadzamy nowego koloru do palety.
 *
 * Ikona jest wpisana jako data: URI - jeden plik mniej do pobrania i nie ma
 * jak sie rozjechac ze sciezka. */
/* Dwa rodzaje pobrania, dwa rozne uchwyty:
 *   - kupione/patche: <a id="downlButton_<ID>"> (products.inc.php ~528)
 *   - gratisy:        <a href="/dskript_aktion_gratis.php?..."> BEZ id (~776)
 * Gratis nie ma identyfikatora, wiec lapiemy go po adresie - jest stabilny
 * i nie trzeba ruszac PHP. */
#content a[id^="downlButton_"],
#content a[href*="dskript_aktion_gratis"] {
    background-color: #2e7d32 !important;
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23fff' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 3v11'/%3E%3Cpath d='M7.5 10l4.5 4.5 4.5-4.5'/%3E%3Cpath d='M4.5 20h15'/%3E%3C/svg%3E") !important;
    background-repeat: no-repeat !important;
    background-position: 12px center !important;
    background-size: 16px 16px !important;
    padding-left: 34px !important;
    border-color: #2e7d32 !important;
}

#content a[id^="downlButton_"]:hover,
#content a[href*="dskript_aktion_gratis"]:hover {
    background-color: #256428 !important;
    border-color: #256428 !important;
}

/* Znacznik zdjecia, ktore nie miesci sie w pasku miniatur pozycji, ale ma
   byc dostepne w okienku galerii. Nie pobiera zadnego obrazka - niesie sam
   adres w data-src. */
.sortItem__thumbUkryty { display: none; }

/* =====================================================================
 * PROPORCJE KADRU ZDJECIA: 16:10
 *
 * Wysokosci w px wyzej (119 / 125 / 130) sa tylko zapasem dla starych
 * przegladarek i zgadzaja sie z proporcja przy PELNEJ szerokosci kolumny.
 * Kolumna bywa jednak wezsza (max-width w procentach) - wtedy sztywna
 * wysokosc psula proporcje. aspect-ratio trzyma 16:10 przy kazdej
 * szerokosci. Blok stoi na KONCU pliku, zeby height:auto wygralo takze
 * z wysokoscia z bloku mobilnego (rowna specyficznosc - decyduje
 * kolejnosc). */
@supports (aspect-ratio: 16 / 10) {
    #content .sortItem__media > a,
    #content .sortTile__media > a {
        height: auto;
        aspect-ratio: 16 / 10;
    }
}
