/* =========================================================================
   GALERIA - listing albumów (media/galeria.php) i strona albumu (media/album.php)

   Zakresy: .gallery-hub (lista) i .album-view / .album-hero (album).
   Wszystkie kolory idą przez zmienne --gl-*, dzięki czemu tryb ciemny
   sprowadza się do podmiany kilkunastu wartości w css/dark-theme.css,
   a nie do przepisywania całego pliku.

   ZŁOTO. Wszędzie, gdzie pojawia się złoty akcent, jest to klubowy gradient
   #AE802F -> #FFEFA7, a nie płaski #d4af37. Elementy tekstowe dostają klasę
   .gold-sweep, tła klasę .gold-sweep-bg - obie łapie js/gold-sweep-engine.js
   (ma MutationObserver, więc karty dorenderowane z JS też dostają przelot).
   Nowego wariantu efektu tu NIE definiujemy: jedno źródło prawdy siedzi
   w css/style.css i tam zostaje.

   PUŁAPKA, o którą już się potknęliśmy w innych miejscach: js/script.js
   dokleja klasę .touch-friendly do KAŻDEGO <a> i <button> na stronie,
   a fixes.css daje jej padding 12px i minimum 44x44 px. Filtry, kropki
   i przyciski powiększenia muszą to jawnie zerować - inaczej rozjeżdżają się
   na kilkanaście pikseli w bok.
   ========================================================================= */

.gallery-hub,
.album-view,
.album-hero,
.gl-facebook {
    --gl-navy: #1a2332;
    --gl-blue: #1E3A8A;
    --gl-blue-soft: #1a4c8b;
    --gl-gold: #AE802F;
    --gl-gold-light: #FFEFA7;
    --gl-bg: #f5f7fa;
    --gl-surface: #ffffff;
    --gl-surface-alt: #f8fafc;
    --gl-text: #1f2937;
    --gl-text-muted: #6b7280;
    --gl-border: #e5e7eb;
    --gl-shadow-sm: 0 1px 3px rgba(15, 23, 42, .06), 0 1px 2px rgba(15, 23, 42, .04);
    --gl-shadow-md: 0 8px 24px rgba(15, 23, 42, .09);
    --gl-shadow-lg: 0 18px 44px rgba(15, 23, 42, .16);
    --gl-radius: 14px;
}

.gallery-hub {
    background: var(--gl-bg);
    padding: 2.5rem 0 3.5rem;
    color: var(--gl-text);
}

/* PUŁAPKA NR 2, tym razem z css/style.css (linia 49):

       a:not(.btn):hover { background: linear-gradient(...); background-clip: text;
                           -webkit-text-fill-color: transparent; }

   Reguła była pisana pod pojedyncze linki w zdaniu i sama w sobie działa dobrze.
   Problem zaczyna się, gdy w <a> owinięta jest cała karta: wtedy KAŻDY tekst
   w środku dostaje przezroczyste wypełnienie ze złotym gradientem pod spodem.
   Tytuł i opis robią się złote, a napisy leżące na kolorowej plakietce
   ("Sparing", "59 zdjęć") znikają zupełnie - widać przez nie tło plakietki.

   Zerujemy to dla wszystkich linków w galerii i ich potomków. Ten sam zabieg
   robi już css/statystyki.css i css/player-profile.css - tam kafelki też są
   linkami. Elementy z klasą .gold-sweep wyłączamy z resetu, bo dla nich
   przezroczyste wypełnienie jest całym sensem efektu. */
.gallery-hub a,
.gallery-hub a:hover,
.gallery-hub a:focus,
.gallery-hub a *:not(.gold-sweep),
.gallery-hub a:hover *:not(.gold-sweep),
.gallery-hub a:focus *:not(.gold-sweep),
.album-view a,
.album-view a:hover,
.album-view a:focus,
.album-view a *:not(.gold-sweep),
.album-view a:hover *:not(.gold-sweep),
.album-view a:focus *:not(.gold-sweep),
.album-hero a,
.album-hero a:hover,
.album-hero a *,
.album-hero a:hover * {
    -webkit-text-fill-color: currentColor;
}

/* Zerowanie pułapki .touch-friendly - patrz komentarz na górze pliku. */
.gallery-hub .gl-chip.touch-friendly,
.gallery-hub .gl-search-clear.touch-friendly,
.gallery-hub .gl-card-link.touch-friendly,
.gallery-hub .gl-hero-link.touch-friendly,
.album-view .album-item-link.touch-friendly,
.album-view .gl-card-link.touch-friendly,
.album-hero .gl-tag.touch-friendly,
.album-lightbox .album-lb-tool.touch-friendly,
.album-lightbox .album-lb-nav.touch-friendly,
.album-lightbox .album-lb-close.touch-friendly {
    min-width: 0;
    min-height: 0;
    padding: revert;
}

/* ---------------------------------------------------------------
   Liczby nad listą
   --------------------------------------------------------------- */

.gl-stats {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
    gap: .75rem;
    margin-bottom: 2rem;
}

.gl-stat {
    background: var(--gl-surface);
    border: 1px solid var(--gl-border);
    border-radius: var(--gl-radius);
    padding: 1rem .75rem;
    text-align: center;
    box-shadow: var(--gl-shadow-sm);
    position: relative;
    overflow: hidden;
}

/* Złota kreska nad kaflem.
   Celowo ::after, a nie ::before: js/gold-sweep-engine.js w trybie
   "divider-after" wstrzykuje gradient wyłącznie do pseudoelementu ::after
   (przez zmienną --gs-div). Kafel ma w HTML atrybut data-gold-divider-after,
   więc kreska dostaje ten sam wielo-flarowy przelot co reszta strony,
   a poniższy gradient jest wersją zapasową, gdy skrypt się nie uruchomi
   (np. przy włączonym "ogranicz animacje"). */
.gl-stat::after {
    content: '';
    position: absolute;
    inset: 0 0 auto 0;
    height: 3px;
    background: linear-gradient(90deg, var(--gl-gold), var(--gl-gold-light), var(--gl-gold));
}

.gl-stat-value {
    display: block;
    font-size: 1.7rem;
    font-weight: 800;
    line-height: 1.1;
    color: var(--gl-navy);
}

.gl-stat-label {
    display: block;
    margin-top: .2rem;
    font-size: .8rem;
    text-transform: uppercase;
    letter-spacing: .04em;
    color: var(--gl-text-muted);
}

/* ---------------------------------------------------------------
   Album wyróżniony
   --------------------------------------------------------------- */

.gl-hero {
    margin-bottom: 2.25rem;
}

.gl-hero-link {
    display: grid;
    grid-template-columns: minmax(0, 1.35fr) minmax(0, 1fr);
    background: var(--gl-surface);
    border: 1px solid var(--gl-border);
    border-radius: var(--gl-radius);
    overflow: hidden;
    box-shadow: var(--gl-shadow-md);
    text-decoration: none;
    color: inherit;
    transition: box-shadow .25s ease, transform .25s ease;
}

.gl-hero-link:hover {
    box-shadow: var(--gl-shadow-lg);
    transform: translateY(-3px);
}

.gl-hero-media {
    position: relative;
    min-height: 300px;
    background: #dfe3e8;
}

.gl-hero-media img {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
    display: block;
}

.gl-hero-body {
    padding: 1.75rem;
    display: flex;
    flex-direction: column;
    justify-content: center;
    gap: .7rem;
}

/* Plakietka wyróżnienia: klubowe złoto w tle + granatowy napis,
   dokładnie jak przycisk akceptacji cookies. Klasa .gold-sweep-bg
   dokłada przelot światła obsługiwany przez silnik. */
.gl-hero-badge {
    align-self: flex-start;
    display: inline-block;
    padding: .28rem .8rem;
    border-radius: 999px;
    font-size: .72rem;
    font-weight: 800;
    letter-spacing: .06em;
    text-transform: uppercase;
    color: var(--gl-navy);
    background: linear-gradient(110deg, var(--gl-gold) 0%, var(--gl-gold-light) 50%, var(--gl-gold) 100%);
}

.gl-hero-body h2 {
    margin: 0;
    font-size: clamp(1.35rem, 2.4vw, 1.85rem);
    line-height: 1.25;
    color: var(--gl-navy);
}

.gl-hero-meta {
    display: flex;
    flex-wrap: wrap;
    gap: .35rem 1.1rem;
    margin: 0;
    font-size: .88rem;
    color: var(--gl-text-muted);
}

.gl-hero-meta i {
    color: var(--gl-gold);
    margin-right: .3rem;
}

.gl-hero-desc {
    margin: 0;
    color: var(--gl-text-muted);
    line-height: 1.6;
}

.gl-hero-cta {
    display: inline-flex;
    align-items: center;
    gap: .5rem;
    font-weight: 700;
    color: var(--gl-blue-soft);
}

.gl-hero-cta i {
    transition: transform .2s ease;
}

.gl-hero-link:hover .gl-hero-cta i {
    transform: translateX(4px);
}

/* ---------------------------------------------------------------
   Filtry
   --------------------------------------------------------------- */

.gl-filters {
    background: var(--gl-surface);
    border: 1px solid var(--gl-border);
    border-radius: var(--gl-radius);
    padding: 1.1rem 1.25rem;
    margin-bottom: 1.75rem;
    box-shadow: var(--gl-shadow-sm);
    display: grid;
    gap: .9rem;
}

.gl-search {
    position: relative;
    display: flex;
    align-items: center;
}

.gl-search > i {
    position: absolute;
    left: .9rem;
    color: var(--gl-text-muted);
    pointer-events: none;
}

.gl-search input {
    width: 100%;
    padding: .7rem 2.6rem;
    border: 1px solid var(--gl-border);
    border-radius: 999px;
    font: inherit;
    font-size: .95rem;
    color: var(--gl-text);
    background: var(--gl-surface-alt);
    transition: border-color .2s, box-shadow .2s;
}

.gl-search input:focus {
    outline: none;
    border-color: var(--gl-blue-soft);
    box-shadow: 0 0 0 3px rgba(26, 76, 139, .15);
    background: var(--gl-surface);
}

.gl-search-clear {
    position: absolute;
    right: .55rem;
    border: 0;
    background: transparent;
    color: var(--gl-text-muted);
    cursor: pointer;
    width: 1.9rem;
    height: 1.9rem;
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
}

.gl-search-clear:hover {
    background: var(--gl-border);
    color: var(--gl-text);
}

.gl-chips {
    display: flex;
    flex-wrap: wrap;
    gap: .4rem;
}

.gl-chip {
    --gl-chip: var(--gl-blue-soft);
    display: inline-flex;
    align-items: center;
    gap: .4rem;
    padding: .42rem .85rem;
    border: 1px solid var(--gl-border);
    border-radius: 999px;
    background: var(--gl-surface);
    color: var(--gl-text-muted);
    font: inherit;
    font-size: .85rem;
    font-weight: 600;
    cursor: pointer;
    transition: background .18s, color .18s, border-color .18s, transform .18s;
}

.gl-chip i {
    color: var(--gl-chip);
    font-size: .82rem;
}

.gl-chip em {
    font-style: normal;
    font-size: .72rem;
    font-weight: 700;
    background: var(--gl-border);
    color: var(--gl-text-muted);
    border-radius: 999px;
    padding: .05rem .4rem;
}

.gl-chip:hover {
    border-color: var(--gl-chip);
    color: var(--gl-text);
    transform: translateY(-1px);
}

.gl-chip.is-active {
    background: var(--gl-chip);
    border-color: var(--gl-chip);
    color: #fff;
}

.gl-chip.is-active i {
    color: #fff;
}

.gl-chip.is-active em {
    background: rgba(255, 255, 255, .25);
    color: #fff;
}

.gl-selects {
    display: flex;
    flex-wrap: wrap;
    gap: 1rem;
}

.gl-select {
    display: flex;
    align-items: center;
    gap: .5rem;
    font-size: .85rem;
    color: var(--gl-text-muted);
}

.gl-select select {
    padding: .4rem .7rem;
    border: 1px solid var(--gl-border);
    border-radius: 8px;
    background: var(--gl-surface);
    color: var(--gl-text);
    font: inherit;
    font-size: .85rem;
    cursor: pointer;
}

.gl-result-info {
    margin: 0;
    font-size: .84rem;
    color: var(--gl-text-muted);
}

/* ---------------------------------------------------------------
   Siatka albumów
   --------------------------------------------------------------- */

.gl-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(290px, 1fr));
    gap: 1.25rem;
}

.gl-card {
    background: var(--gl-surface);
    border: 1px solid var(--gl-border);
    border-radius: var(--gl-radius);
    overflow: hidden;
    box-shadow: var(--gl-shadow-sm);
    transition: box-shadow .25s ease, transform .25s ease;
}

.gl-card:hover {
    box-shadow: var(--gl-shadow-md);
    transform: translateY(-4px);
}

.gl-card[hidden] {
    display: none;
}

.gl-card-link {
    display: flex;
    flex-direction: column;
    height: 100%;
    text-decoration: none;
    color: inherit;
}

.gl-card-media {
    position: relative;
    aspect-ratio: 4 / 3;
    background: #dfe3e8;
    overflow: hidden;
}

.gl-card-media img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    display: block;
    transition: transform .45s ease;
}

.gl-card:hover .gl-card-media img {
    transform: scale(1.05);
}

.gl-card-count {
    position: absolute;
    left: .6rem;
    bottom: .6rem;
    display: inline-flex;
    align-items: center;
    gap: .35rem;
    background: rgba(26, 35, 50, .85);
    color: #fff;
    font-size: .74rem;
    font-weight: 600;
    padding: .25rem .6rem;
    border-radius: 999px;
    backdrop-filter: blur(4px);
}

/* Plakietka "Archiwalne" - stonowana celowo. Ma tłumaczyć niższą jakość,
   a nie krzyczeć o niej i odciągać uwagę od zdjęcia. */
.gl-card-archive {
    position: absolute;
    right: .6rem;
    bottom: .6rem;
    display: inline-flex;
    align-items: center;
    gap: .3rem;
    background: rgba(26, 35, 50, .7);
    color: rgba(255, 255, 255, .88);
    font-size: .68rem;
    font-weight: 600;
    letter-spacing: .02em;
    padding: .22rem .55rem;
    border-radius: 999px;
    border: 1px solid rgba(255, 255, 255, .18);
    backdrop-filter: blur(4px);
    cursor: help;
}

.gl-card-archive i {
    font-size: .64rem;
    opacity: .85;
}

/* Przypięty album ma plakietkę w tym samym rogu co archiwalny -
   przy obu naraz przesuwamy pinezkę w górę, żeby się nie nakładały. */
.gl-card-pin {
    position: absolute;
    right: .6rem;
    top: .6rem;
    width: 1.85rem;
    height: 1.85rem;
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: 50%;
    font-size: .72rem;
    color: var(--gl-navy);
    background: linear-gradient(110deg, var(--gl-gold) 0%, var(--gl-gold-light) 50%, var(--gl-gold) 100%);
}

.gl-card-body {
    padding: .95rem 1.05rem 1.15rem;
    display: flex;
    flex-direction: column;
    gap: .5rem;
    flex: 1;
}

.gl-card-body h3 {
    margin: 0;
    font-size: 1.06rem;
    line-height: 1.35;
    color: var(--gl-navy);
}

.gl-card-date {
    margin: 0;
    font-size: .82rem;
    color: var(--gl-text-muted);
}

.gl-card-date i {
    color: var(--gl-gold);
    margin-right: .3rem;
}

.gl-card-desc {
    margin: 0;
    font-size: .87rem;
    line-height: 1.55;
    color: var(--gl-text-muted);
}

.gl-card-cta {
    margin-top: auto;
    padding-top: .3rem;
    font-size: .87rem;
    font-weight: 700;
    color: var(--gl-blue-soft);
    display: inline-flex;
    align-items: center;
    gap: .4rem;
}

.gl-card-cta i {
    transition: transform .2s ease;
}

.gl-card:hover .gl-card-cta i {
    transform: translateX(4px);
}

/* Plakietki kategorii - kolor przychodzi z panelu przez --gl-chip. */
.gl-tags {
    display: flex;
    flex-wrap: wrap;
    gap: .3rem;
}

.gl-tag {
    --gl-chip: var(--gl-blue-soft);
    display: inline-flex;
    align-items: center;
    gap: .3rem;
    font-size: .71rem;
    font-weight: 700;
    letter-spacing: .01em;
    padding: .16rem .55rem;
    border-radius: 999px;
    color: var(--gl-chip);
    background: color-mix(in srgb, var(--gl-chip) 12%, white);
    border: 1px solid color-mix(in srgb, var(--gl-chip) 28%, white);
    text-decoration: none;
}

.gl-tags--onDark .gl-tag {
    color: #fff;
    background: color-mix(in srgb, var(--gl-chip) 72%, transparent);
    border-color: color-mix(in srgb, var(--gl-chip) 85%, white);
    backdrop-filter: blur(4px);
}

.gl-tags--onDark .gl-tag:hover {
    background: var(--gl-chip);
}

/* ---------------------------------------------------------------
   Pokaż więcej / brak wyników / stan pusty
   --------------------------------------------------------------- */

.gl-more-wrap {
    display: flex;
    justify-content: center;
    margin-top: 2rem;
}

.gl-more {
    display: inline-flex;
    align-items: center;
    gap: .6rem;
    padding: .8rem 2rem;
    border: 0;
    border-radius: 999px;
    background: linear-gradient(135deg, var(--gl-blue), var(--gl-blue-soft));
    color: #fff;
    font: inherit;
    font-weight: 700;
    cursor: pointer;
    box-shadow: var(--gl-shadow-sm);
    transition: transform .2s, box-shadow .2s;
}

.gl-more:hover {
    transform: translateY(-2px);
    box-shadow: var(--gl-shadow-md);
}

.gl-no-results {
    text-align: center;
    padding: 2.5rem 1rem;
    color: var(--gl-text-muted);
}

.gl-no-results i {
    display: block;
    font-size: 2.2rem;
    margin-bottom: .6rem;
    color: var(--gl-border);
}

.gl-empty-state {
    text-align: center;
    padding: 4rem 1.5rem;
    background: var(--gl-surface);
    border: 1px dashed var(--gl-border);
    border-radius: var(--gl-radius);
}

.gl-empty-state i {
    font-size: 3rem;
    color: var(--gl-gold);
    margin-bottom: 1rem;
    display: block;
}

.gl-empty-state h2 {
    margin: 0 0 .5rem;
    color: var(--gl-navy);
}

.gl-empty-state p {
    margin: 0;
    color: var(--gl-text-muted);
}

/* ---------------------------------------------------------------
   Sekcja Facebooka
   --------------------------------------------------------------- */

.gl-facebook {
    padding: 3rem 0;
    background: var(--gl-surface);
    border-top: 1px solid var(--gl-border);
}

.gl-facebook-head {
    text-align: center;
    margin-bottom: 1.75rem;
}

.gl-facebook-head h2 {
    margin: 0 0 .4rem;
    color: var(--gl-navy);
}

.gl-facebook-head p {
    margin: 0;
    color: var(--gl-text-muted);
}

.gl-facebook-feed {
    max-width: 100%;
    overflow: hidden;
    border-radius: var(--gl-radius);
}

/* =========================================================================
   STRONA ALBUMU
   ========================================================================= */

.gl-preview-bar {
    background: linear-gradient(110deg, var(--gl-gold, #AE802F), var(--gl-gold-light, #FFEFA7), var(--gl-gold, #AE802F));
    color: #1a2332;
    padding: .65rem 0;
    font-size: .9rem;
    font-weight: 600;
}

.gl-preview-bar a {
    color: #1a2332;
    text-decoration: underline;
    margin-left: .5rem;
}

.album-hero {
    position: relative;
    padding: 3rem 0 2.5rem;
    color: #fff;
    overflow: hidden;
    background: var(--gl-navy);
}

/* Okładka jako tło. Rozmycie i przyciemnienie, bo pod spodem idzie tekst,
   a zdjęcie z meczu bywa jasne i kontrast spadłby poniżej czytelności. */
.album-hero-bg {
    position: absolute;
    inset: -30px;
    background-size: cover;
    background-position: center;
    filter: blur(18px) brightness(.42) saturate(1.1);
    transform: scale(1.08);
}

.album-hero::after {
    content: '';
    position: absolute;
    inset: 0;
    background: linear-gradient(180deg, rgba(26, 35, 50, .55) 0%, rgba(26, 35, 50, .82) 100%);
}

.album-hero-inner {
    position: relative;
    z-index: 2;
}

.album-hero h1 {
    margin: .75rem 0 .6rem;
    font-size: clamp(1.6rem, 4vw, 2.6rem);
    line-height: 1.2;
    color: #fff;
}

.breadcrumbs--onDark a,
.breadcrumbs--onDark span {
    color: rgba(255, 255, 255, .82);
}

.breadcrumbs--onDark a:hover {
    color: #FFEFA7;
}

.album-meta {
    display: flex;
    flex-wrap: wrap;
    gap: .4rem 1.4rem;
    list-style: none;
    margin: 0;
    padding: 0;
    font-size: .92rem;
    color: rgba(255, 255, 255, .85);
}

.album-meta i {
    margin-right: .4rem;
    color: var(--gl-gold-light);
}

.album-view {
    background: var(--gl-bg);
    padding: 2rem 0 3.5rem;
    color: var(--gl-text);
}

.album-toolbar {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 1rem;
    flex-wrap: wrap;
    margin-bottom: 1.5rem;
}

.album-back {
    display: inline-flex;
    align-items: center;
    gap: .5rem;
    color: var(--gl-blue-soft);
    font-weight: 600;
    text-decoration: none;
}

.album-back:hover {
    text-decoration: underline;
}

.album-tools {
    display: flex;
    gap: .5rem;
    flex-wrap: wrap;
}

.album-tool {
    display: inline-flex;
    align-items: center;
    gap: .45rem;
    padding: .5rem 1rem;
    border: 1px solid var(--gl-border);
    border-radius: 999px;
    background: var(--gl-surface);
    color: var(--gl-text);
    font: inherit;
    font-size: .88rem;
    font-weight: 600;
    cursor: pointer;
    transition: border-color .2s, color .2s, transform .2s;
}

.album-tool:hover {
    border-color: var(--gl-gold);
    color: var(--gl-gold);
    transform: translateY(-1px);
}

.album-desc {
    background: var(--gl-surface);
    border: 1px solid var(--gl-border);
    border-left: 4px solid var(--gl-gold);
    border-radius: var(--gl-radius);
    padding: 1.1rem 1.35rem;
    margin-bottom: 1.75rem;
    line-height: 1.7;
    color: var(--gl-text);
}

/* Wyjaśnienie niższej jakości starszych albumów */
.album-archive-note {
    display: flex;
    align-items: flex-start;
    gap: .85rem;
    background: var(--gl-surface-alt);
    border: 1px solid var(--gl-border);
    border-left: 4px solid var(--gl-gold);
    border-radius: var(--gl-radius);
    padding: .9rem 1.1rem;
    margin-bottom: 1.75rem;
}

.album-archive-note > i {
    flex-shrink: 0;
    font-size: 1.15rem;
    margin-top: .1rem;
    color: var(--gl-gold);
}

.album-archive-note p {
    margin: 0;
    font-size: .9rem;
    line-height: 1.6;
    color: var(--gl-text-muted);
}

.album-archive-note strong {
    color: var(--gl-text);
}

/* Link w środku zdania - bez tego .touch-friendly z js/script.js zrobiłby
   mu 12 px odstępu i widoczną dziurę przed kropką. */
.album-archive-note a,
.album-archive-note a.touch-friendly {
    color: var(--gl-blue-soft);
    font-weight: 600;
    text-decoration: underline;
    min-width: 0;
    min-height: 0;
    padding: 0;
    display: inline;
}

/* ---------------------------------------------------------------
   Siatka zdjęć - trzy układy do wyboru w panelu
   --------------------------------------------------------------- */

.album-item {
    margin: 0;
    position: relative;
    border-radius: 10px;
    overflow: hidden;
    background: #dfe3e8;
    box-shadow: var(--gl-shadow-sm);
}

.album-item-link {
    display: block;
    position: relative;
    line-height: 0;
}

.album-item img {
    width: 100%;
    height: auto;
    display: block;
    transition: transform .4s ease;
}

.album-item:hover img {
    transform: scale(1.04);
}

.album-item-zoom {
    position: absolute;
    inset: 0;
    display: flex;
    align-items: center;
    justify-content: center;
    background: rgba(26, 35, 50, .45);
    color: #fff;
    font-size: 1.4rem;
    opacity: 0;
    transition: opacity .25s ease;
}

.album-item:hover .album-item-zoom,
.album-item-link:focus-visible .album-item-zoom {
    opacity: 1;
}

.album-item figcaption {
    position: absolute;
    left: 0;
    right: 0;
    bottom: 0;
    padding: 1.6rem .75rem .6rem;
    background: linear-gradient(180deg, transparent, rgba(26, 35, 50, .88));
    color: #fff;
    font-size: .82rem;
    line-height: 1.4;
    opacity: 0;
    transform: translateY(6px);
    transition: opacity .25s ease, transform .25s ease;
}

.album-item:hover figcaption {
    opacity: 1;
    transform: translateY(0);
}

/* Mozaika - kolumny CSS zachowują oryginalne proporcje zdjęć.
   break-inside zapobiega rozcięciu kafelka między kolumnami. */
.album-grid--masonry {
    column-count: 3;
    column-gap: 1rem;
}

.album-grid--masonry .album-item {
    break-inside: avoid;
    margin-bottom: 1rem;
    display: inline-block;
    width: 100%;
}

/* Siatka - równe kafelki, wszystko przycięte do 4:3. */
.album-grid--grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(230px, 1fr));
    gap: 1rem;
}

.album-grid--grid .album-item {
    aspect-ratio: 4 / 3;
}

.album-grid--grid .album-item img {
    width: 100%;
    height: 100%;
    object-fit: cover;
}

.album-grid--grid .album-item--wide {
    grid-column: span 2;
    aspect-ratio: 8 / 3;
}

/* Wyrównane rzędy. flex-grow proporcjonalny do kształtu zdjęcia sprawia,
   że rząd wypełnia szerokość, a wszystkie kadry mają tę samą wysokość. */
.album-grid--justified {
    display: flex;
    flex-wrap: wrap;
    gap: .6rem;
}

.album-grid--justified .album-item {
    flex-grow: calc(var(--gl-ratio) * 100);
    flex-basis: calc(var(--gl-ratio) * 220px);
    height: 220px;
}

.album-grid--justified .album-item img {
    width: 100%;
    height: 100%;
    object-fit: cover;
}

/* Ostatni rząd nie ma czego dopychać - bez tego jedno zdjęcie rozciągałoby
   się na całą szerokość ekranu. */
.album-grid--justified::after {
    content: '';
    flex-grow: 999999;
}

.album-others {
    margin-top: 3rem;
}

.album-others h2 {
    margin: 0 0 1.25rem;
    color: var(--gl-navy);
    font-size: 1.5rem;
}

/* ---------------------------------------------------------------
   Powiększenie (lightbox)
   --------------------------------------------------------------- */

.album-lightbox {
    position: fixed;
    inset: 0;
    z-index: 10000;
    /* Rozmycie, a nie samo przyciemnienie: przy niemal czarnym tle jasny tytuł
       strony i tak prześwitywał i konkurował ze zdjęciem. Rozmyte tło przestaje
       być czytelne, więc oko zostaje na zdjęciu. Przeglądarki bez backdrop-filter
       dostają samo przyciemnienie i nic się nie psuje. */
    background: rgba(10, 14, 22, .96);
    backdrop-filter: blur(10px);
    -webkit-backdrop-filter: blur(10px);
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 3.5rem 1rem 5rem;
    opacity: 0;
    transition: opacity .25s ease;
}

.album-lightbox.is-open {
    opacity: 1;
}

.album-lightbox[hidden] {
    display: none;
}

.album-lb-stage {
    margin: 0;
    max-width: 100%;
    max-height: 100%;
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: .75rem;
}

.album-lb-stage img {
    max-width: 100%;
    max-height: calc(100vh - 10rem);
    width: auto;
    height: auto;
    object-fit: contain;
    border-radius: 6px;
    box-shadow: 0 20px 60px rgba(0, 0, 0, .6);
}

.album-lb-stage figcaption {
    color: rgba(255, 255, 255, .9);
    font-size: .92rem;
    text-align: center;
    display: flex;
    align-items: center;
    gap: .75rem;
    flex-wrap: wrap;
    justify-content: center;
}

.album-lb-counter {
    font-size: .82rem;
    font-weight: 700;
    color: #1a2332;
    background: linear-gradient(110deg, #AE802F 0%, #FFEFA7 50%, #AE802F 100%);
    padding: .12rem .6rem;
    border-radius: 999px;
    white-space: nowrap;
}

.album-lb-close,
.album-lb-nav,
.album-lb-tool {
    position: absolute;
    display: flex;
    align-items: center;
    justify-content: center;
    border: 1px solid rgba(255, 255, 255, .2);
    background: rgba(255, 255, 255, .08);
    color: #fff;
    cursor: pointer;
    border-radius: 50%;
    backdrop-filter: blur(6px);
    transition: background .2s, border-color .2s, transform .2s;
    text-decoration: none;
}

.album-lb-close:hover,
.album-lb-nav:hover,
.album-lb-tool:hover {
    background: rgba(255, 255, 255, .18);
    border-color: #FFEFA7;
    color: #FFEFA7;
}

.album-lb-close {
    top: 1rem;
    right: 1rem;
    width: 2.75rem;
    height: 2.75rem;
    font-size: 1.15rem;
}

.album-lb-nav {
    top: 50%;
    transform: translateY(-50%);
    width: 3.1rem;
    height: 3.1rem;
    font-size: 1.15rem;
}

.album-lb-nav:hover {
    transform: translateY(-50%) scale(1.06);
}

.album-lb-prev { left: 1rem; }
.album-lb-next { right: 1rem; }

.album-lb-tools {
    position: absolute;
    bottom: 1.25rem;
    left: 50%;
    transform: translateX(-50%);
    display: flex;
    gap: .6rem;
}

.album-lb-tool {
    position: static;
    width: 2.6rem;
    height: 2.6rem;
    font-size: .95rem;
}

.album-lightbox.is-playing .album-lb-tool#album-lb-play {
    background: linear-gradient(110deg, #AE802F 0%, #FFEFA7 50%, #AE802F 100%);
    border-color: #FFEFA7;
    color: #1a2332;
}

/* Blokada przewijania strony pod otwartym powiększeniem. */
body.album-lb-open {
    overflow: hidden;
}

/* ---------------------------------------------------------------
   Wąskie ekrany
   --------------------------------------------------------------- */

@media (max-width: 992px) {
    .gl-hero-link {
        grid-template-columns: 1fr;
    }

    .gl-hero-media {
        min-height: 220px;
        aspect-ratio: 16 / 9;
    }

    .album-grid--masonry {
        column-count: 2;
    }
}

@media (max-width: 600px) {
    .gallery-hub {
        padding: 1.5rem 0 2.5rem;
    }

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

    .gl-stats {
        grid-template-columns: repeat(2, 1fr);
    }

    .gl-stat-value {
        font-size: 1.4rem;
    }

    .gl-selects {
        flex-direction: column;
        align-items: stretch;
        gap: .5rem;
    }

    .gl-select {
        justify-content: space-between;
    }

    .album-grid--masonry {
        column-count: 1;
    }

    .album-grid--justified .album-item {
        height: 160px;
    }

    .album-lb-nav {
        width: 2.5rem;
        height: 2.5rem;
    }

    .album-lb-prev { left: .4rem; }
    .album-lb-next { right: .4rem; }

    .album-lb-stage img {
        max-height: calc(100vh - 12rem);
    }
}

/* ---------------------------------------------------------------
   Mniej ruchu
   --------------------------------------------------------------- */

@media (prefers-reduced-motion: reduce) {
    .gl-card,
    .gl-card-media img,
    .gl-hero-link,
    .album-item img,
    .album-item figcaption,
    .album-item-zoom,
    .gl-chip,
    .gl-more,
    .album-tool {
        transition: none;
    }

    .gl-card:hover,
    .gl-hero-link:hover,
    .gl-more:hover,
    .album-tool:hover {
        transform: none;
    }

    .gl-card:hover .gl-card-media img,
    .album-item:hover img {
        transform: none;
    }
}
