/**
 * docenki-theme.css — Docenki.pl / Gratsly.com
 * Design system: LIGHT (Warm Social) + DARK (Premium Gratitude)
 *
 * Wartości wyciągnięte WPROST z style-tile.html — bez zmian.
 * Komponenty używają WYŁĄCZNIE var(--*). Zero hardcoded kolorów.
 *
 * Fonty (wklej do <head>):
 * <link rel="preconnect" href="https://fonts.googleapis.com">
 * <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
 * <link href="https://fonts.googleapis.com/css2?family=Cormorant+Garamond:wght@300;400
 *   &family=DM+Sans:opsz,wght@9..40,400;9..40,700&display=swap" rel="stylesheet">
 */

/* =====================================================
   IMPORT FONTÓW
   ===================================================== */
@import url('https://fonts.googleapis.com/css2?family=Cormorant+Garamond:wght@300;400&family=DM+Sans:opsz,wght@9..40,400;9..40,700&display=swap');

/* =====================================================
   :root — LIGHT MODE (Warm Social — domyślny)
   ===================================================== */
:root {

  /* --- Kolory --- */
  --color-primary:        #E8725C;   /* coral — główne CTA, linki, aktywne elementy */
  --color-accent:         #F5A962;   /* apricot — hover, tagi, wtórne akcenty */
  --color-reward:         #E8B84D;   /* soft gold — TYLKO momenty nagrody, rangi */
  --color-text-primary:   #2D1B2E;   /* dark plum */
  --color-text-secondary: #8B7355;   /* cocoa — etykiety, podpisy, placeholder */
  --color-bg-main:        linear-gradient(160deg, #FFF8F0 0%, #FFE8D6 50%, #FDDDE6 100%);
  --color-bg-card:        #FFFAF5;
  --color-bg-elevated:    #FFFDF9;
  --color-border:         rgba(232,114,92,0.15);
  --color-error:          #C0392B;   /* dopasowany do warm palette */
  --color-success:        #27AE60;   /* dopasowany do warm palette */

  /* --- Zmienne wewnętrzne — przyciski (nie używaj w komponentach bezpośrednio) --- */
  --_btn-primary-bg:      var(--color-primary);
  --_btn-primary-color:   #fff;
  --_btn-primary-shadow:  0 6px 20px rgba(232,114,92,0.35);
  --_btn-ghost-border:    var(--color-primary);
  --_btn-ghost-color:     var(--color-primary);
  --_btn-disabled-bg:     var(--color-primary);
  --_btn-disabled-color:  rgba(255,255,255,0.45);

  /* --- Zmienne wewnętrzne — karty / modal --- */
  --_card-backdrop:       none;
  --_card-bg-modal:       var(--color-bg-card);
  --_modal-backdrop-bg:   rgba(45,27,46,0.55);
  --_modal-transform:     translateY(30%);

  /* --- Zmienne wewnętrzne — input --- */
  --_input-bg:            rgba(255,248,240,0.9);
  --_input-border:        1.5px solid rgba(232,114,92,0.25);

  /* --- Typografia --- */
  --font-heading:           'DM Sans', system-ui, sans-serif;
  --font-body:              'DM Sans', system-ui, sans-serif;
  --font-weight-heading:    700;
  --font-weight-body:       400;
  --font-size-h1:           24px;
  --font-size-h2:           19px;    /* modal-title, badge-name */
  --font-size-h3:           17px;    /* badge-revealed-name */
  --font-size-body:         15px;
  --font-size-small:        13px;
  --font-size-caption:      11px;    /* status bar, micro labels */
  --line-height-heading:    1.2;
  --line-height-body:       1.5;
  --letter-spacing-heading: 0em;

  /* --- Spacing (skala 4px) --- */
  --space-2:   2px;
  --space-3:   3px;
  --space-4:   4px;
  --space-5:   5px;
  --space-6:   6px;
  --space-8:   8px;
  --space-10:  10px;
  --space-12:  12px;
  --space-14:  14px;
  --space-16:  16px;
  --space-18:  18px;
  --space-20:  20px;
  --space-24:  24px;
  --space-28:  28px;
  --space-32:  32px;
  --space-48:  48px;
  --space-64:  64px;

  /* --- Radiusy --- */
  --radius-small:   6px;
  --radius-default: 16px;
  --radius-card:    20px;
  --radius-button:  24px;    /* pill — domyślny dla przycisków */
  --radius-pill:    100px;
  --radius-circle:  50%;

  /* Contextual badge defaults */
  --badge-accent:   #F5A962;

  /* --- Cienie --- */
  --shadow-card:         0 8px 32px rgba(232,114,92,0.12);
  --shadow-elevated:     0 16px 48px rgba(232,114,92,0.18), 0 4px 12px rgba(0,0,0,0.06);
  --shadow-btn-hover:    0 6px 20px rgba(0,0,0,0.22);

  /* --- Animacje --- */
  --anim-duration-fast:    150ms;
  --anim-duration-normal:  280ms;
  --anim-duration-slow:    400ms;
  --anim-easing-default:   cubic-bezier(0.25, 0.1, 0.25, 1);   /* soft ease */
  --anim-easing-bounce:    cubic-bezier(0.34, 1.56, 0.64, 1);  /* overshoot */
  --anim-easing-dramatic:  cubic-bezier(0.4, 0, 0, 1);         /* dramatyczny ease */

  /* --- Z-index --- */
  --z-base:           1;
  --z-card:           10;
  --z-dropdown:       100;
  --z-modal-backdrop: 500;
  --z-modal:          510;
  --z-toast:          600;
}

/* =====================================================
   [data-theme="dark"] — DARK MODE (Premium Gratitude)
   Nadpisuj TYLKO wartości zmienione względem :root
   ===================================================== */
[data-theme="dark"] {

  /* --- Kolory --- */
  --color-primary:        #F6C94E;              /* champagne gold */
  --color-accent:         #A78BFA;              /* violet */
  --color-reward:         #F6C94E;
  --color-text-primary:   #F0ECFF;              /* warm ivory */
  --color-text-secondary: rgba(220,212,255,0.58);
  --color-bg-main:        #07061A;
  --color-bg-card:        rgba(14,12,38,0.68);
  --color-bg-elevated:    rgba(20,16,48,0.88);
  --color-border:         rgba(255,255,255,0.07);
  --color-error:          #F87171;              /* jasny — czytelny na ciemnym tle */
  --color-success:        #34D399;              /* jasny — czytelny na ciemnym tle */

  /* --- Zmienne wewnętrzne — przyciski --- */
  --_btn-primary-bg:      linear-gradient(135deg, #7C3AED 0%, #9D5FF0 50%, #EC4899 100%);
  --_btn-primary-color:   #fff;
  --_btn-primary-shadow:  0 6px 28px rgba(124,58,237,0.52), 0 2px 8px rgba(0,0,0,0.4);
  --_btn-ghost-border:    #A78BFA;
  --_btn-ghost-color:     #A78BFA;
  --_btn-disabled-bg:     rgba(124,58,237,0.30);
  --_btn-disabled-color:  rgba(255,255,255,0.45);

  /* --- Zmienne wewnętrzne — karty / modal --- */
  --_card-backdrop:       blur(12px) saturate(160%);
  --_card-bg-modal:       rgba(14,12,38,0.88);
  --_modal-backdrop-bg:   rgba(4,3,15,0.88);
  --_modal-transform:     translateY(20px);

  /* --- Zmienne wewnętrzne — input --- */
  --_input-bg:            rgba(255,255,255,0.05);
  --_input-border:        1.5px solid rgba(255,255,255,0.07);

  /* --- Typografia (serif + light weight) --- */
  --font-heading:           'Cormorant Garamond', serif;
  --font-weight-heading:    300;
  --font-size-h1:           26px;
  --font-size-body:         14px;
  --letter-spacing-heading: 0.05em;

  /* --- Radiusy (ostrzejsze w dark) --- */
  --radius-card:    14px;
  --radius-button:  10px;

  /* --- Cienie (glow zamiast tinted shadows) --- */
  --shadow-card:         0 24px 64px rgba(0,0,0,0.55),
                         0 4px 16px rgba(0,0,0,0.35),
                         inset 0 1px 0 rgba(255,255,255,0.06);
  --shadow-elevated:     0 32px 80px rgba(0,0,0,0.65), 0 4px 16px rgba(0,0,0,0.40);
  --shadow-btn-hover:    0 6px 28px rgba(124,58,237,0.52), 0 2px 8px rgba(0,0,0,0.4);

  /* --- Animacje (wolniejsze — ceremonialny rytm) --- */
  --anim-duration-fast:    200ms;
  --anim-duration-normal:  400ms;
  --anim-duration-slow:    700ms;
  --anim-easing-default:   cubic-bezier(0.4, 0, 0, 1);
}

/* =====================================================
   RESET BAZOWY
   ===================================================== */
*, *::before, *::after {
  box-sizing: border-box;
  margin:     0;
  padding:    0;
}

/* =====================================================
   KOMPONENT: .card
   Podstawowy kontener treści.
   Wariant: .card--elevated — wyższy cień.
   ===================================================== */
.card {
  background:     var(--color-bg-card);
  border-radius:  var(--radius-card);
  border:         1px solid var(--color-border);
  box-shadow:     var(--shadow-card);
  padding:        var(--space-16);
  position:       relative;
  contain:        layout style;
  transition:
    background    var(--anim-duration-normal) var(--anim-easing-default),
    border-color  var(--anim-duration-normal);
}

[data-theme="dark"] .card {
  backdrop-filter:         var(--_card-backdrop);
  -webkit-backdrop-filter: var(--_card-backdrop);
}

/* Fallback — brak backdrop-filter (starsze urządzenia) */
@supports not (backdrop-filter: blur(1px)) {
  [data-theme="dark"] .card { background: rgba(14,12,38,0.95); }
}

.card--elevated {
  box-shadow: var(--shadow-elevated);
}

/* =====================================================
   KOMPONENT: .btn
   Hierarchia: .btn-primary > .btn-secondary > .btn-ghost
   Stany: default / hover / active / disabled / loading
   ===================================================== */
.btn {
  display:                     inline-flex;
  align-items:                 center;
  justify-content:             center;
  gap:                         var(--space-8);
  padding:                     13px var(--space-24);
  border:                      none;
  border-radius:               var(--radius-button);
  font-family:                 var(--font-body);
  font-size:                   var(--font-size-body);
  font-weight:                 600;
  cursor:                      pointer;
  width:                       100%;
  position:                    relative;
  touch-action:                manipulation;
  -webkit-tap-highlight-color: transparent;
  overflow:                    hidden;
  transition:
    transform  var(--anim-duration-normal) var(--anim-easing-default),
    opacity    var(--anim-duration-normal);
}

/* Cień przez pseudo-element — nie animujemy box-shadow bezpośrednio */
.btn::after {
  content:       '';
  position:      absolute;
  inset:         0;
  border-radius: inherit;
  box-shadow:    var(--shadow-btn-hover);
  opacity:       0;
  transition:    opacity var(--anim-duration-normal);
  pointer-events: none;
}
.btn:hover::after { opacity: 1; }

/* Primary */
.btn-primary {
  background: var(--_btn-primary-bg);
  color:      var(--_btn-primary-color);
  box-shadow: var(--_btn-primary-shadow);
}
.btn-primary:hover  { transform: scale(1.03); }
.btn-primary:active { transform: scale(0.97); }

/* Primary w dark mode: shimmer sweep zamiast scale */
[data-theme="dark"] .btn-primary::before {
  content:    '';
  position:   absolute;
  top:        0;
  left:       -70%;
  width:      55%;
  height:     100%;
  background: linear-gradient(90deg, transparent, rgba(255,255,255,0.22) 50%, transparent);
  transform:  skewX(-18deg);
  transition: left 0.65s ease;
  pointer-events: none;
}
[data-theme="dark"] .btn-primary:hover::before { left: 120%; }
[data-theme="dark"] .btn-primary:hover  { transform: none; opacity: 0.85; }
[data-theme="dark"] .btn-primary:active { transform: scale(0.97); opacity: 1; }

/* Secondary */
.btn-secondary {
  background: rgba(128,128,128,0.09);
  color:      var(--color-text-secondary);
}
[data-theme="dark"] .btn-secondary {
  background: transparent;
  border:     1.5px solid var(--color-border);
  color:      var(--color-text-secondary);
}
.btn-secondary:hover  { opacity: 0.7; }
.btn-secondary:active { transform: scale(0.97); }

/* Ghost */
.btn-ghost {
  background: transparent;
  border:     2px solid var(--_btn-ghost-border);
  color:      var(--_btn-ghost-color);
}
.btn-ghost:hover  { background: rgba(128,128,128,0.06); }
[data-theme="dark"] .btn-ghost:hover { background: rgba(124,58,237,0.12); }
.btn-ghost:active { transform: scale(0.97); }

/* Disabled */
.btn-disabled {
  background: var(--_btn-disabled-bg);
  color:      var(--_btn-disabled-color);
  opacity:    0.32;
  cursor:     not-allowed;
}
[data-theme="dark"] .btn-disabled { opacity: 1; }

/* Loading — spinner */
.btn-loading {
  background: var(--_btn-primary-bg);
  color:      transparent !important;
  cursor:     wait;
}
.btn-loading::before {
  content:       '';
  position:      absolute;
  width:         18px;
  height:        18px;
  border:        2.5px solid rgba(255,255,255,0.3);
  border-top-color: #fff;
  border-radius: var(--radius-circle);
  animation:     spin 0.65s linear infinite;
  z-index:       2;
}

/* =====================================================
   KOMPONENT: .field-wrap, .input, .input-label
   Float label — unosi się na focus / po wypełnieniu
   ===================================================== */
.field-wrap {
  position:      relative;
  margin-bottom: var(--space-16);
}

.input {
  width:       100%;
  padding:     18px var(--space-16) var(--space-8);
  background:  var(--_input-bg);
  border:      var(--_input-border);
  border-radius: var(--radius-card);
  font-family: var(--font-body);
  font-size:   var(--font-size-body);
  color:       var(--color-text-primary);
  outline:     none;
  transition:  border-color var(--anim-duration-normal);
  -webkit-appearance: none;
}
.input:focus { border-color: var(--color-primary); }

.input-select {
  width: 100%;
  min-height: 48px;
  padding: 0 var(--space-16);
  background: var(--_input-bg);
  border: var(--_input-border);
  border-radius: var(--radius-card);
  font-family: var(--font-body);
  font-size: var(--font-size-body);
  color: var(--color-text-primary);
  outline: none;
  -webkit-appearance: none;
  appearance: none;
}

.input-select:focus {
  border-color: var(--color-primary);
}

.input-select option {
  color: var(--color-text-primary);
  background: var(--color-bg-elevated);
}

.input-label {
  position:         absolute;
  left:             var(--space-16);
  top:              50%;
  transform:        translateY(-50%);
  font-size:        var(--font-size-body);
  color:            var(--color-text-secondary);
  pointer-events:   none;
  transform-origin: left top;
  transition:
    transform  var(--anim-duration-normal) var(--anim-easing-default),
    color      var(--anim-duration-normal);
}
.input:focus          ~ .input-label,
.input:not(:placeholder-shown) ~ .input-label {
  transform: translateY(-140%) scale(0.75);
  color:     var(--color-primary);
}

/* =====================================================
   KOMPONENT: .toggle-switch
   ===================================================== */
.toggle-switch {
  position:    relative;
  width:       50px;
  height:      28px;
  flex-shrink: 0;
}
.toggle-switch input {
  opacity:  0;
  width:    0;
  height:   0;
  position: absolute;
}

.toggle-track {
  position:      absolute;
  inset:         0;
  background:    rgba(128,128,128,0.2);
  border-radius: var(--radius-pill);
  cursor:        pointer;
  transition:    background var(--anim-duration-normal) var(--anim-easing-default);
}
.toggle-switch input:checked + .toggle-track {
  background: var(--color-primary);
}
[data-theme="dark"] .toggle-switch input:checked + .toggle-track {
  background: #7C3AED; /* fioletowy — spójny z btn-primary dark */
}

.toggle-knob {
  position:       absolute;
  top:            4px;
  left:           4px;
  width:          20px;
  height:         20px;
  background:     #fff;
  border-radius:  var(--radius-circle);
  pointer-events: none;
  transition:
    transform  var(--anim-duration-normal) var(--anim-easing-default),
    box-shadow var(--anim-duration-normal);
  will-change: transform;
  display:     flex;
  align-items: center;
  justify-content: center;
}
.toggle-switch input:checked ~ .toggle-knob {
  transform: translateX(22px);
}
[data-theme="dark"] .toggle-knob {
  box-shadow: 0 1px 4px rgba(0,0,0,0.35);
}

/* =====================================================
   KOMPONENT: .checkbox-custom
   ===================================================== */
.checkbox-custom {
  width:          22px;
  height:         22px;
  border-radius:  var(--space-8);
  border:         2px solid var(--color-primary);
  flex-shrink:    0;
  display:        flex;
  align-items:    center;
  justify-content: center;
  cursor:         pointer;
  transition:
    background  var(--anim-duration-normal) var(--anim-easing-default),
    transform   var(--anim-duration-normal) var(--anim-easing-default);
  will-change: transform;
}
.checkbox-custom.checked {
  background: var(--color-primary);
  transform:  scale(1.1);
}
.checkbox-custom .tick {
  opacity:     0;
  transition:  opacity var(--anim-duration-normal);
  color:       #fff;
  font-size:   13px;
  font-weight: 900;
}
[data-theme="dark"] .checkbox-custom .tick { color: #07061A; }
.checkbox-custom.checked .tick { opacity: 1; }

/* =====================================================
   KOMPONENT: .accordion, .accordion-item, .accordion-content
   Expand: grid-template-rows — NIE max-height!
   ===================================================== */
.accordion-item {
  border-bottom: 1px solid var(--color-border);
  contain:       layout style;
}

.accordion-header {
  display:         flex;
  align-items:     center;
  justify-content: space-between;
  width:           100%;
  padding:         var(--space-16) 0;
  border:          none;
  background:      none;
  text-align:      left;
  cursor:          pointer;
  font-family:     var(--font-body);
  font-size:       var(--font-size-body);
  font-weight:     600;
  color:           var(--color-text-primary);
  user-select:     none;
  -webkit-tap-highlight-color: transparent;
}

.accordion-arrow {
  width:           22px;
  height:          22px;
  display:         flex;
  align-items:     center;
  justify-content: center;
  color:           var(--color-text-secondary);
  transition:      transform var(--anim-duration-normal) var(--anim-easing-default);
  will-change:     transform;
  flex-shrink:     0;
}
.accordion-item.open .accordion-arrow { transform: rotate(180deg); }

.accordion-body {
  display:            grid;
  grid-template-rows: 0fr;
  transition:         grid-template-rows var(--anim-duration-normal) var(--anim-easing-default);
  will-change:        grid-template-rows;
}
.accordion-item.open .accordion-body { grid-template-rows: 1fr; }

.accordion-inner { overflow: hidden; }

.accordion-content {
  padding:     0 0 var(--space-16);
  font-size:   var(--font-size-small);
  color:       var(--color-text-secondary);
  line-height: 1.6;
  opacity:     0;
  transition:  opacity var(--anim-duration-normal) 40ms;
}
.accordion-item.open .accordion-content { opacity: 1; }

/* Dark mode: staggered fade dla dzieci */
[data-theme="dark"] .accordion-item.open .accordion-content > * {
  animation: stagger-in var(--anim-duration-normal) var(--anim-easing-default) both;
}
[data-theme="dark"] .accordion-item.open .accordion-content > *:nth-child(2) {
  animation-delay: 70ms;
}
[data-theme="dark"] .accordion-item.open .accordion-content > *:nth-child(3) {
  animation-delay: 140ms;
}

/* =====================================================
   KOMPONENT: .modal-overlay, .modal-backdrop, .modal
   Bottom sheet (domyślnie). Dark mode: centered dialog.
   ===================================================== */
.modal-overlay {
  position:       fixed;
  inset:          0;
  z-index:        var(--z-modal-backdrop);
  display:        flex;
  align-items:    flex-end;
  pointer-events: none;
  opacity:        0;
  transition:     opacity var(--anim-duration-normal);
}
.modal-overlay.open {
  pointer-events: auto;
  opacity:        1;
}

.modal-backdrop {
  position:   absolute;
  inset:      0;
  background: var(--_modal-backdrop-bg);
  cursor:     pointer;
}

.modal {
  position:      relative;
  z-index:       var(--z-modal);
  width:         100%;
  background:    var(--_card-bg-modal);
  border-radius: var(--radius-card) var(--radius-card) 0 0;
  padding:       var(--space-24) var(--space-24) var(--space-32);
  will-change:   transform, opacity;
  transition:
    transform  var(--anim-duration-normal) var(--anim-easing-default),
    opacity    var(--anim-duration-normal) var(--anim-easing-default);
  transform:     var(--_modal-transform);
}
.modal-overlay.open .modal { transform: translateY(0); }

/* Dark mode: centered dialog z glassmorphism */
[data-theme="dark"] .modal-overlay { align-items: center; }
[data-theme="dark"] .modal {
  width:                   calc(100% - var(--space-32));
  border-radius:           var(--radius-card);
  background:              rgba(14,12,38,0.88);
  backdrop-filter:         blur(24px) saturate(160%);
  -webkit-backdrop-filter: blur(24px) saturate(160%);
  border:                  1px solid var(--color-border);
  box-shadow:              var(--shadow-card);
  opacity:                 0;
}
[data-theme="dark"] .modal-overlay.open .modal {
  transform: translateY(0);
  opacity:   1;
}
@supports not (backdrop-filter: blur(1px)) {
  [data-theme="dark"] .modal { background: rgba(10,8,30,0.98); }
}

.modal-title {
  font-family:    var(--font-heading);
  font-weight:    var(--font-weight-heading);
  letter-spacing: var(--letter-spacing-heading);
  font-size:      var(--font-size-h2);
  color:          var(--color-text-primary);
  text-align:     center;
  margin-bottom:  var(--space-8);
}

.modal-body {
  font-size:     var(--font-size-small);
  color:         var(--color-text-secondary);
  text-align:    center;
  margin-bottom: var(--space-24);
  line-height:   var(--line-height-body);
}

/* =====================================================
   KOMPONENT: .toast
   Feedback po akcji. Auto-hide po 3s.
   Light: slide z góry. Dark: fade in centrum ekranu.
   ===================================================== */
.toast {
  position:       fixed;
  top:            var(--space-16);
  left:           var(--space-16);
  right:          var(--space-16);
  z-index:        var(--z-toast);
  padding:        var(--space-12) var(--space-16);
  border-radius:  var(--radius-button);
  font-size:      var(--font-size-small);
  font-weight:    600;
  color:          #fff;
  background:     var(--color-primary);
  opacity:        0;
  pointer-events: none;
  display:        flex;
  align-items:    center;
  gap:            var(--space-8);
  will-change:    transform, opacity;
  transform:      translateY(-120%);
  transition:
    transform  var(--anim-duration-normal) var(--anim-easing-default),
    opacity    var(--anim-duration-normal) var(--anim-easing-default);
}
.toast.toast-visible {
  transform: translateY(0);
  opacity:   1;
}

/* Dark mode: glass toast centrowany — fade bez slide */
[data-theme="dark"] .toast {
  top:                     50%;
  left:                    50%;
  right:                   auto;
  transform:               translate(-50%, -50%) !important;
  width:                   auto;
  white-space:             nowrap;
  background:              rgba(14,12,38,0.88);
  backdrop-filter:         blur(16px) saturate(160%);
  -webkit-backdrop-filter: blur(16px) saturate(160%);
  border:                  1px solid rgba(246,201,78,0.30);
  color:                   var(--color-text-primary);
  border-radius:           var(--radius-button);
  box-shadow:              0 0 20px rgba(246,201,78,0.12), 0 8px 24px rgba(0,0,0,0.4);
  opacity:                 0;
  transition:              opacity var(--anim-duration-normal) var(--anim-easing-default) !important;
}
[data-theme="dark"] .toast.toast-visible { opacity: 1; }

/* =====================================================
   KOMPONENT: .progress-track, .progress-fill
   Pasek postępu rang. Light: gradient primary→accent.
   Dark: gold shimmer.
   ===================================================== */
.progress-track {
  height:        6px;
  background:    rgba(128,128,128,0.12);
  border-radius: var(--radius-pill);
  overflow:      hidden;
}

.progress-fill {
  height:        100%;
  border-radius: var(--radius-pill);
  background:    linear-gradient(90deg, var(--color-primary), var(--color-accent));
  will-change:   transform;
  transition:    transform var(--anim-duration-slow) var(--anim-easing-default);
}

/* Gold shimmer w dark mode */
[data-theme="dark"] .progress-fill {
  background:      linear-gradient(90deg, #C89018, #F6C94E, #FFE08A, #F6C94E, #C89018);
  background-size: 300% 100%;
  animation:       progress-shimmer 2.5s ease-in-out infinite;
  box-shadow:      0 0 10px rgba(246,201,78,0.45);
  border-radius:   var(--radius-pill);
}

/* =====================================================
   KOMPONENT: .badge (karta docenki)
   Najsilniej ostylowany element. Reveal: blur → 0.
   ===================================================== */
.badge {
  background:    var(--color-bg-card);
  border-radius: var(--radius-card);
  border:        1px solid var(--color-border);
  box-shadow:    var(--shadow-card);
  padding:       var(--space-24) var(--space-16) var(--space-16);
  contain:       layout style;
  position:      relative;
  overflow:      hidden;
}

[data-theme="dark"] .badge {
  backdrop-filter:         var(--_card-backdrop);
  -webkit-backdrop-filter: var(--_card-backdrop);
}
@supports not (backdrop-filter: blur(1px)) {
  [data-theme="dark"] .badge { background: rgba(14,12,38,0.95); }
}

.badge-image {
  width:          96px;
  height:         96px;
  border-radius:  var(--space-16);
  background:     linear-gradient(135deg, var(--color-primary), var(--color-accent));
  display:        flex;
  align-items:    center;
  justify-content: center;
  font-size:      42px;
  transition:
    filter     var(--anim-duration-normal) var(--anim-easing-default),
    transform  var(--anim-duration-normal) var(--anim-easing-default),
    opacity    var(--anim-duration-normal) var(--anim-easing-default);
  will-change: filter, transform;
  /* Stan domyślny — zamazany */
  filter:    blur(16px);
  transform: scale(0.95);
}
.badge-image.revealed {
  filter:    blur(0);
  transform: scale(1);
}
[data-theme="dark"] .badge-image {
  filter:    blur(24px);
  transform: scale(0.98);
}

.badge-title {
  font-family:    var(--font-heading);
  font-weight:    var(--font-weight-heading);
  font-size:      var(--font-size-h1);
  letter-spacing: var(--letter-spacing-heading);
  color:          var(--color-text-primary);
  line-height:    var(--line-height-heading);
}

.badge-subtitle {
  font-size:   var(--font-size-small);
  color:       var(--color-text-secondary);
  font-style:  italic;
  margin-top:  var(--space-4);
}

/* =====================================================
   KOMPONENT: .separator
   ===================================================== */
.separator {
  border:     none;
  border-top: 1px solid var(--color-border);
  margin:     var(--space-16) 0;
}

/* =====================================================
   KEYFRAMES
   ===================================================== */

/* Spinner loading */
@keyframes spin {
  to { transform: rotate(360deg); }
}

/* Shimmer paska postępu (dark mode) */
@keyframes progress-shimmer {
  0%, 100% { background-position: 0% 0%; }
  50%       { background-position: 100% 0%; }
}

/* Staggered fade — accordion w dark mode */
@keyframes stagger-in {
  from { opacity: 0; transform: translateY(6px); }
  to   { opacity: 1; transform: translateY(0); }
}

/* Rozbłysk ramki (badge tile selection) */
@keyframes badge-ring {
  0%   { opacity: 0.75; transform: scale(1); }
  100% { opacity: 0;    transform: scale(1.35); }
}

/* Combo: spring + rozbłysk (dark mode badge selection) */
@keyframes badge-spring {
  from { transform: translateY(3px)  scale(0.93); }
  to   { transform: translateY(-3px) scale(1.04); }
}

@keyframes badge-ring-combo {
  0%   { opacity: 0;    transform: scale(1.00); }
  12%  { opacity: 1.0;  transform: scale(1.00); }
  30%  { opacity: 0.2;  transform: scale(1.04); }
  50%  { opacity: 0.85; transform: scale(1.02); }
  72%  { opacity: 0.1;  transform: scale(1.08); }
  100% { opacity: 0;    transform: scale(1.12); }
}

/* =====================================================
   @media (prefers-reduced-motion: reduce)
   Dostępność — wyłącza wszystkie animacje i tranzycje
   ===================================================== */
@media (prefers-reduced-motion: reduce) {
  *,
  *::before,
  *::after {
    transition-duration:       1ms !important;
    animation-duration:        1ms !important;
    animation-iteration-count: 1 !important;
  }
}
